@xagent-ai/cli 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (537) hide show
  1. package/.eslintrc.js +25 -0
  2. package/.gitmodules +3 -0
  3. package/.prettierrc.json +8 -0
  4. package/CONTRIBUTING.md +167 -0
  5. package/LICENSE +21 -0
  6. package/README.md +280 -0
  7. package/README_CN.md +280 -0
  8. package/dist/agents.d.ts +21 -0
  9. package/dist/agents.d.ts.map +1 -0
  10. package/dist/agents.js +463 -0
  11. package/dist/agents.js.map +1 -0
  12. package/dist/ai-client.d.ts +83 -0
  13. package/dist/ai-client.d.ts.map +1 -0
  14. package/dist/ai-client.js +1280 -0
  15. package/dist/ai-client.js.map +1 -0
  16. package/dist/auth.d.ts +25 -0
  17. package/dist/auth.d.ts.map +1 -0
  18. package/dist/auth.js +573 -0
  19. package/dist/auth.js.map +1 -0
  20. package/dist/cancellation.d.ts +46 -0
  21. package/dist/cancellation.d.ts.map +1 -0
  22. package/dist/cancellation.js +154 -0
  23. package/dist/cancellation.js.map +1 -0
  24. package/dist/checkpoint.d.ts +28 -0
  25. package/dist/checkpoint.d.ts.map +1 -0
  26. package/dist/checkpoint.js +186 -0
  27. package/dist/checkpoint.js.map +1 -0
  28. package/dist/cli.d.ts +3 -0
  29. package/dist/cli.d.ts.map +1 -0
  30. package/dist/cli.js +364 -0
  31. package/dist/cli.js.map +1 -0
  32. package/dist/config.d.ts +49 -0
  33. package/dist/config.d.ts.map +1 -0
  34. package/dist/config.js +205 -0
  35. package/dist/config.js.map +1 -0
  36. package/dist/context-compressor.d.ts +51 -0
  37. package/dist/context-compressor.d.ts.map +1 -0
  38. package/dist/context-compressor.js +231 -0
  39. package/dist/context-compressor.js.map +1 -0
  40. package/dist/conversation.d.ts +34 -0
  41. package/dist/conversation.d.ts.map +1 -0
  42. package/dist/conversation.js +221 -0
  43. package/dist/conversation.js.map +1 -0
  44. package/dist/gui-subagent/action-parser/actionParser.d.ts +19 -0
  45. package/dist/gui-subagent/action-parser/actionParser.d.ts.map +1 -0
  46. package/dist/gui-subagent/action-parser/actionParser.js +203 -0
  47. package/dist/gui-subagent/action-parser/actionParser.js.map +1 -0
  48. package/dist/gui-subagent/action-parser/constants.d.ts +8 -0
  49. package/dist/gui-subagent/action-parser/constants.d.ts.map +1 -0
  50. package/dist/gui-subagent/action-parser/constants.js +12 -0
  51. package/dist/gui-subagent/action-parser/constants.js.map +1 -0
  52. package/dist/gui-subagent/action-parser/index.d.ts +3 -0
  53. package/dist/gui-subagent/action-parser/index.d.ts.map +1 -0
  54. package/dist/gui-subagent/action-parser/index.js +6 -0
  55. package/dist/gui-subagent/action-parser/index.js.map +1 -0
  56. package/dist/gui-subagent/action-parser/types.d.ts +24 -0
  57. package/dist/gui-subagent/action-parser/types.d.ts.map +1 -0
  58. package/dist/gui-subagent/action-parser/types.js +12 -0
  59. package/dist/gui-subagent/action-parser/types.js.map +1 -0
  60. package/dist/gui-subagent/agent/gui-agent.d.ts +126 -0
  61. package/dist/gui-subagent/agent/gui-agent.d.ts.map +1 -0
  62. package/dist/gui-subagent/agent/gui-agent.js +820 -0
  63. package/dist/gui-subagent/agent/gui-agent.js.map +1 -0
  64. package/dist/gui-subagent/agent/index.d.ts +5 -0
  65. package/dist/gui-subagent/agent/index.d.ts.map +1 -0
  66. package/dist/gui-subagent/agent/index.js +5 -0
  67. package/dist/gui-subagent/agent/index.js.map +1 -0
  68. package/dist/gui-subagent/index.d.ts +43 -0
  69. package/dist/gui-subagent/index.d.ts.map +1 -0
  70. package/dist/gui-subagent/index.js +96 -0
  71. package/dist/gui-subagent/index.js.map +1 -0
  72. package/dist/gui-subagent/operator/base-operator.d.ts +108 -0
  73. package/dist/gui-subagent/operator/base-operator.d.ts.map +1 -0
  74. package/dist/gui-subagent/operator/base-operator.js +172 -0
  75. package/dist/gui-subagent/operator/base-operator.js.map +1 -0
  76. package/dist/gui-subagent/operator/browser-operator.d.ts +36 -0
  77. package/dist/gui-subagent/operator/browser-operator.d.ts.map +1 -0
  78. package/dist/gui-subagent/operator/browser-operator.js +306 -0
  79. package/dist/gui-subagent/operator/browser-operator.js.map +1 -0
  80. package/dist/gui-subagent/operator/computer-operator.d.ts +31 -0
  81. package/dist/gui-subagent/operator/computer-operator.d.ts.map +1 -0
  82. package/dist/gui-subagent/operator/computer-operator.js +441 -0
  83. package/dist/gui-subagent/operator/computer-operator.js.map +1 -0
  84. package/dist/gui-subagent/operator/desktop-operator.d.ts +55 -0
  85. package/dist/gui-subagent/operator/desktop-operator.d.ts.map +1 -0
  86. package/dist/gui-subagent/operator/desktop-operator.js +527 -0
  87. package/dist/gui-subagent/operator/desktop-operator.js.map +1 -0
  88. package/dist/gui-subagent/operator/index.d.ts +7 -0
  89. package/dist/gui-subagent/operator/index.d.ts.map +1 -0
  90. package/dist/gui-subagent/operator/index.js +6 -0
  91. package/dist/gui-subagent/operator/index.js.map +1 -0
  92. package/dist/gui-subagent/types/actions.d.ts +108 -0
  93. package/dist/gui-subagent/types/actions.d.ts.map +1 -0
  94. package/dist/gui-subagent/types/actions.js +39 -0
  95. package/dist/gui-subagent/types/actions.js.map +1 -0
  96. package/dist/gui-subagent/types/index.d.ts +6 -0
  97. package/dist/gui-subagent/types/index.d.ts.map +1 -0
  98. package/dist/gui-subagent/types/index.js +6 -0
  99. package/dist/gui-subagent/types/index.js.map +1 -0
  100. package/dist/gui-subagent/types/operator.d.ts +95 -0
  101. package/dist/gui-subagent/types/operator.d.ts.map +1 -0
  102. package/dist/gui-subagent/types/operator.js +16 -0
  103. package/dist/gui-subagent/types/operator.js.map +1 -0
  104. package/dist/gui-subagent/utils.d.ts +19 -0
  105. package/dist/gui-subagent/utils.d.ts.map +1 -0
  106. package/dist/gui-subagent/utils.js +42 -0
  107. package/dist/gui-subagent/utils.js.map +1 -0
  108. package/dist/hook.d.ts +73 -0
  109. package/dist/hook.d.ts.map +1 -0
  110. package/dist/hook.js +156 -0
  111. package/dist/hook.js.map +1 -0
  112. package/dist/index.d.ts +19 -0
  113. package/dist/index.d.ts.map +1 -0
  114. package/dist/index.js +19 -0
  115. package/dist/index.js.map +1 -0
  116. package/dist/input-history.d.ts +24 -0
  117. package/dist/input-history.d.ts.map +1 -0
  118. package/dist/input-history.js +94 -0
  119. package/dist/input-history.js.map +1 -0
  120. package/dist/input-processor.d.ts +31 -0
  121. package/dist/input-processor.d.ts.map +1 -0
  122. package/dist/input-processor.js +233 -0
  123. package/dist/input-processor.js.map +1 -0
  124. package/dist/keyboard-manager.d.ts +151 -0
  125. package/dist/keyboard-manager.d.ts.map +1 -0
  126. package/dist/keyboard-manager.js +396 -0
  127. package/dist/keyboard-manager.js.map +1 -0
  128. package/dist/logger.d.ts +75 -0
  129. package/dist/logger.d.ts.map +1 -0
  130. package/dist/logger.js +339 -0
  131. package/dist/logger.js.map +1 -0
  132. package/dist/mcp.d.ts +57 -0
  133. package/dist/mcp.d.ts.map +1 -0
  134. package/dist/mcp.js +483 -0
  135. package/dist/mcp.js.map +1 -0
  136. package/dist/memory.d.ts +25 -0
  137. package/dist/memory.d.ts.map +1 -0
  138. package/dist/memory.js +250 -0
  139. package/dist/memory.js.map +1 -0
  140. package/dist/print-system-prompt.d.ts +2 -0
  141. package/dist/print-system-prompt.d.ts.map +1 -0
  142. package/dist/print-system-prompt.js +40 -0
  143. package/dist/print-system-prompt.js.map +1 -0
  144. package/dist/session-manager.d.ts +41 -0
  145. package/dist/session-manager.d.ts.map +1 -0
  146. package/dist/session-manager.js +234 -0
  147. package/dist/session-manager.js.map +1 -0
  148. package/dist/session.d.ts +77 -0
  149. package/dist/session.d.ts.map +1 -0
  150. package/dist/session.js +1081 -0
  151. package/dist/session.js.map +1 -0
  152. package/dist/skill-invoker.d.ts +177 -0
  153. package/dist/skill-invoker.d.ts.map +1 -0
  154. package/dist/skill-invoker.js +1643 -0
  155. package/dist/skill-invoker.js.map +1 -0
  156. package/dist/skill-loader.d.ts +76 -0
  157. package/dist/skill-loader.d.ts.map +1 -0
  158. package/dist/skill-loader.js +407 -0
  159. package/dist/skill-loader.js.map +1 -0
  160. package/dist/slash-commands.d.ts +60 -0
  161. package/dist/slash-commands.d.ts.map +1 -0
  162. package/dist/slash-commands.js +1021 -0
  163. package/dist/slash-commands.js.map +1 -0
  164. package/dist/smart-approval.d.ts +137 -0
  165. package/dist/smart-approval.d.ts.map +1 -0
  166. package/dist/smart-approval.js +512 -0
  167. package/dist/smart-approval.js.map +1 -0
  168. package/dist/system-prompt-generator.d.ts +35 -0
  169. package/dist/system-prompt-generator.d.ts.map +1 -0
  170. package/dist/system-prompt-generator.js +729 -0
  171. package/dist/system-prompt-generator.js.map +1 -0
  172. package/dist/test-boundary-conditions.d.ts.map +1 -0
  173. package/dist/test-boundary-conditions.js.map +1 -0
  174. package/dist/test-cancellation-fix.d.ts.map +1 -0
  175. package/dist/test-cancellation-fix.js.map +1 -0
  176. package/dist/test-input-history.d.ts.map +1 -0
  177. package/dist/test-input-history.js.map +1 -0
  178. package/dist/test-interaction-flow.d.ts.map +1 -0
  179. package/dist/test-interaction-flow.js.map +1 -0
  180. package/dist/test-quick.d.ts.map +1 -0
  181. package/dist/test-quick.js.map +1 -0
  182. package/dist/test-user-interaction.d.ts.map +1 -0
  183. package/dist/test-user-interaction.js.map +1 -0
  184. package/dist/theme.d.ts +353 -0
  185. package/dist/theme.d.ts.map +1 -0
  186. package/dist/theme.js +383 -0
  187. package/dist/theme.js.map +1 -0
  188. package/dist/tools.d.ts +373 -0
  189. package/dist/tools.d.ts.map +1 -0
  190. package/dist/tools.js +2906 -0
  191. package/dist/tools.js.map +1 -0
  192. package/dist/types.d.ts +180 -0
  193. package/dist/types.d.ts.map +1 -0
  194. package/dist/types.js +23 -0
  195. package/dist/types.js.map +1 -0
  196. package/dist/unified-session.d.ts +42 -0
  197. package/dist/unified-session.d.ts.map +1 -0
  198. package/dist/unified-session.js +271 -0
  199. package/dist/unified-session.js.map +1 -0
  200. package/dist/update.d.ts +30 -0
  201. package/dist/update.d.ts.map +1 -0
  202. package/dist/update.js +211 -0
  203. package/dist/update.js.map +1 -0
  204. package/dist/workflow.d.ts +53 -0
  205. package/dist/workflow.d.ts.map +1 -0
  206. package/dist/workflow.js +405 -0
  207. package/dist/workflow.js.map +1 -0
  208. package/docs/architecture/mcp-integration-guide.md +131 -0
  209. package/docs/architecture/overview.md +93 -0
  210. package/docs/architecture/tool-system-design.md +89 -0
  211. package/docs/cli/commands.md +189 -0
  212. package/docs/smart-mode.md +257 -0
  213. package/docs/third-party-models.md +449 -0
  214. package/package.json +85 -0
  215. package/scripts/init-skills-path.js +58 -0
  216. package/skills/.claude-plugin/marketplace.json +45 -0
  217. package/skills/README.md +94 -0
  218. package/skills/THIRD_PARTY_NOTICES.md +405 -0
  219. package/skills/skills/algorithmic-art/LICENSE.txt +202 -0
  220. package/skills/skills/algorithmic-art/SKILL.md +405 -0
  221. package/skills/skills/algorithmic-art/templates/generator_template.js +223 -0
  222. package/skills/skills/algorithmic-art/templates/viewer.html +599 -0
  223. package/skills/skills/brand-guidelines/LICENSE.txt +202 -0
  224. package/skills/skills/brand-guidelines/SKILL.md +73 -0
  225. package/skills/skills/canvas-design/LICENSE.txt +202 -0
  226. package/skills/skills/canvas-design/SKILL.md +130 -0
  227. package/skills/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
  228. package/skills/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  229. package/skills/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  230. package/skills/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
  231. package/skills/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  232. package/skills/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
  233. package/skills/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  234. package/skills/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  235. package/skills/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
  236. package/skills/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  237. package/skills/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  238. package/skills/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  239. package/skills/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
  240. package/skills/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  241. package/skills/skills/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
  242. package/skills/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  243. package/skills/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
  244. package/skills/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  245. package/skills/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  246. package/skills/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
  247. package/skills/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  248. package/skills/skills/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
  249. package/skills/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  250. package/skills/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  251. package/skills/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
  252. package/skills/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  253. package/skills/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  254. package/skills/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  255. package/skills/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  256. package/skills/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  257. package/skills/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  258. package/skills/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  259. package/skills/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  260. package/skills/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
  261. package/skills/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  262. package/skills/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  263. package/skills/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  264. package/skills/skills/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
  265. package/skills/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  266. package/skills/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  267. package/skills/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
  268. package/skills/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  269. package/skills/skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  270. package/skills/skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  271. package/skills/skills/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
  272. package/skills/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
  273. package/skills/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  274. package/skills/skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  275. package/skills/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  276. package/skills/skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  277. package/skills/skills/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
  278. package/skills/skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  279. package/skills/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  280. package/skills/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
  281. package/skills/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  282. package/skills/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
  283. package/skills/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  284. package/skills/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  285. package/skills/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
  286. package/skills/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  287. package/skills/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  288. package/skills/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
  289. package/skills/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
  290. package/skills/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  291. package/skills/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  292. package/skills/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
  293. package/skills/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  294. package/skills/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
  295. package/skills/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  296. package/skills/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  297. package/skills/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
  298. package/skills/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  299. package/skills/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
  300. package/skills/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  301. package/skills/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  302. package/skills/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  303. package/skills/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  304. package/skills/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
  305. package/skills/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  306. package/skills/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
  307. package/skills/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
  308. package/skills/skills/doc-coauthoring/SKILL.md +375 -0
  309. package/skills/skills/docx/LICENSE.txt +30 -0
  310. package/skills/skills/docx/SKILL.md +197 -0
  311. package/skills/skills/docx/docx-js.md +350 -0
  312. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  313. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  314. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  315. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  316. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  317. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  318. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  319. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  320. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  321. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  322. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  323. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  324. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  325. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  326. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  327. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  328. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  329. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  330. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  331. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  332. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  333. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  334. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  335. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  336. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  337. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  338. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  339. package/skills/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  340. package/skills/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  341. package/skills/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  342. package/skills/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  343. package/skills/skills/docx/ooxml/schemas/mce/mc.xsd +75 -0
  344. package/skills/skills/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  345. package/skills/skills/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  346. package/skills/skills/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  347. package/skills/skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  348. package/skills/skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  349. package/skills/skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  350. package/skills/skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  351. package/skills/skills/docx/ooxml/scripts/pack.py +159 -0
  352. package/skills/skills/docx/ooxml/scripts/unpack.py +29 -0
  353. package/skills/skills/docx/ooxml/scripts/validate.py +69 -0
  354. package/skills/skills/docx/ooxml/scripts/validation/__init__.py +15 -0
  355. package/skills/skills/docx/ooxml/scripts/validation/base.py +951 -0
  356. package/skills/skills/docx/ooxml/scripts/validation/docx.py +274 -0
  357. package/skills/skills/docx/ooxml/scripts/validation/pptx.py +315 -0
  358. package/skills/skills/docx/ooxml/scripts/validation/redlining.py +279 -0
  359. package/skills/skills/docx/ooxml.md +610 -0
  360. package/skills/skills/docx/scripts/__init__.py +1 -0
  361. package/skills/skills/docx/scripts/document.py +1276 -0
  362. package/skills/skills/docx/scripts/templates/comments.xml +3 -0
  363. package/skills/skills/docx/scripts/templates/commentsExtended.xml +3 -0
  364. package/skills/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
  365. package/skills/skills/docx/scripts/templates/commentsIds.xml +3 -0
  366. package/skills/skills/docx/scripts/templates/people.xml +3 -0
  367. package/skills/skills/docx/scripts/utilities.py +374 -0
  368. package/skills/skills/frontend-design/LICENSE.txt +177 -0
  369. package/skills/skills/frontend-design/SKILL.md +42 -0
  370. package/skills/skills/internal-comms/LICENSE.txt +202 -0
  371. package/skills/skills/internal-comms/SKILL.md +32 -0
  372. package/skills/skills/internal-comms/examples/3p-updates.md +47 -0
  373. package/skills/skills/internal-comms/examples/company-newsletter.md +65 -0
  374. package/skills/skills/internal-comms/examples/faq-answers.md +30 -0
  375. package/skills/skills/internal-comms/examples/general-comms.md +16 -0
  376. package/skills/skills/mcp-builder/LICENSE.txt +202 -0
  377. package/skills/skills/mcp-builder/SKILL.md +236 -0
  378. package/skills/skills/mcp-builder/reference/evaluation.md +602 -0
  379. package/skills/skills/mcp-builder/reference/mcp_best_practices.md +249 -0
  380. package/skills/skills/mcp-builder/reference/node_mcp_server.md +970 -0
  381. package/skills/skills/mcp-builder/reference/python_mcp_server.md +719 -0
  382. package/skills/skills/mcp-builder/scripts/connections.py +151 -0
  383. package/skills/skills/mcp-builder/scripts/evaluation.py +373 -0
  384. package/skills/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
  385. package/skills/skills/mcp-builder/scripts/requirements.txt +2 -0
  386. package/skills/skills/pdf/LICENSE.txt +30 -0
  387. package/skills/skills/pdf/SKILL.md +294 -0
  388. package/skills/skills/pdf/forms.md +205 -0
  389. package/skills/skills/pdf/reference.md +612 -0
  390. package/skills/skills/pdf/scripts/check_bounding_boxes.py +70 -0
  391. package/skills/skills/pdf/scripts/check_bounding_boxes_test.py +226 -0
  392. package/skills/skills/pdf/scripts/check_fillable_fields.py +12 -0
  393. package/skills/skills/pdf/scripts/convert_pdf_to_images.py +35 -0
  394. package/skills/skills/pdf/scripts/create_validation_image.py +41 -0
  395. package/skills/skills/pdf/scripts/extract_form_field_info.py +152 -0
  396. package/skills/skills/pdf/scripts/fill_fillable_fields.py +114 -0
  397. package/skills/skills/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
  398. package/skills/skills/pptx/LICENSE.txt +30 -0
  399. package/skills/skills/pptx/SKILL.md +484 -0
  400. package/skills/skills/pptx/html2pptx.md +625 -0
  401. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  402. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  403. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  404. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  405. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  406. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  407. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  408. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  409. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  410. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  411. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  412. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  413. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  414. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  415. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  416. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  417. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  418. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  419. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  420. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  421. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  422. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  423. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  424. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  425. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  426. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  427. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  428. package/skills/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  429. package/skills/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  430. package/skills/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  431. package/skills/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  432. package/skills/skills/pptx/ooxml/schemas/mce/mc.xsd +75 -0
  433. package/skills/skills/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  434. package/skills/skills/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  435. package/skills/skills/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  436. package/skills/skills/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  437. package/skills/skills/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  438. package/skills/skills/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  439. package/skills/skills/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  440. package/skills/skills/pptx/ooxml/scripts/pack.py +159 -0
  441. package/skills/skills/pptx/ooxml/scripts/unpack.py +29 -0
  442. package/skills/skills/pptx/ooxml/scripts/validate.py +69 -0
  443. package/skills/skills/pptx/ooxml/scripts/validation/__init__.py +15 -0
  444. package/skills/skills/pptx/ooxml/scripts/validation/base.py +951 -0
  445. package/skills/skills/pptx/ooxml/scripts/validation/docx.py +274 -0
  446. package/skills/skills/pptx/ooxml/scripts/validation/pptx.py +315 -0
  447. package/skills/skills/pptx/ooxml/scripts/validation/redlining.py +279 -0
  448. package/skills/skills/pptx/ooxml.md +427 -0
  449. package/skills/skills/pptx/scripts/html2pptx.js +979 -0
  450. package/skills/skills/pptx/scripts/inventory.py +1020 -0
  451. package/skills/skills/pptx/scripts/rearrange.py +231 -0
  452. package/skills/skills/pptx/scripts/replace.py +385 -0
  453. package/skills/skills/pptx/scripts/thumbnail.py +450 -0
  454. package/skills/skills/skill-creator/LICENSE.txt +202 -0
  455. package/skills/skills/skill-creator/SKILL.md +356 -0
  456. package/skills/skills/skill-creator/references/output-patterns.md +82 -0
  457. package/skills/skills/skill-creator/references/workflows.md +28 -0
  458. package/skills/skills/skill-creator/scripts/init_skill.py +303 -0
  459. package/skills/skills/skill-creator/scripts/package_skill.py +110 -0
  460. package/skills/skills/skill-creator/scripts/quick_validate.py +95 -0
  461. package/skills/skills/slack-gif-creator/LICENSE.txt +202 -0
  462. package/skills/skills/slack-gif-creator/SKILL.md +254 -0
  463. package/skills/skills/slack-gif-creator/core/easing.py +234 -0
  464. package/skills/skills/slack-gif-creator/core/frame_composer.py +176 -0
  465. package/skills/skills/slack-gif-creator/core/gif_builder.py +269 -0
  466. package/skills/skills/slack-gif-creator/core/validators.py +136 -0
  467. package/skills/skills/slack-gif-creator/requirements.txt +4 -0
  468. package/skills/skills/theme-factory/LICENSE.txt +202 -0
  469. package/skills/skills/theme-factory/SKILL.md +59 -0
  470. package/skills/skills/theme-factory/theme-showcase.pdf +0 -0
  471. package/skills/skills/theme-factory/themes/arctic-frost.md +19 -0
  472. package/skills/skills/theme-factory/themes/botanical-garden.md +19 -0
  473. package/skills/skills/theme-factory/themes/desert-rose.md +19 -0
  474. package/skills/skills/theme-factory/themes/forest-canopy.md +19 -0
  475. package/skills/skills/theme-factory/themes/golden-hour.md +19 -0
  476. package/skills/skills/theme-factory/themes/midnight-galaxy.md +19 -0
  477. package/skills/skills/theme-factory/themes/modern-minimalist.md +19 -0
  478. package/skills/skills/theme-factory/themes/ocean-depths.md +19 -0
  479. package/skills/skills/theme-factory/themes/sunset-boulevard.md +19 -0
  480. package/skills/skills/theme-factory/themes/tech-innovation.md +19 -0
  481. package/skills/skills/web-artifacts-builder/LICENSE.txt +202 -0
  482. package/skills/skills/web-artifacts-builder/SKILL.md +74 -0
  483. package/skills/skills/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
  484. package/skills/skills/web-artifacts-builder/scripts/init-artifact.sh +322 -0
  485. package/skills/skills/webapp-testing/LICENSE.txt +202 -0
  486. package/skills/skills/webapp-testing/SKILL.md +96 -0
  487. package/skills/skills/webapp-testing/examples/console_logging.py +35 -0
  488. package/skills/skills/webapp-testing/examples/element_discovery.py +40 -0
  489. package/skills/skills/webapp-testing/examples/static_html_automation.py +33 -0
  490. package/skills/skills/webapp-testing/scripts/with_server.py +106 -0
  491. package/skills/skills/xlsx/LICENSE.txt +30 -0
  492. package/skills/skills/xlsx/SKILL.md +289 -0
  493. package/skills/skills/xlsx/recalc.py +178 -0
  494. package/skills/spec/agent-skills-spec.md +3 -0
  495. package/skills/template/SKILL.md +6 -0
  496. package/src/agents.ts +504 -0
  497. package/src/ai-client.ts +1456 -0
  498. package/src/auth.ts +648 -0
  499. package/src/cancellation.ts +176 -0
  500. package/src/checkpoint.ts +219 -0
  501. package/src/cli.ts +384 -0
  502. package/src/config.ts +248 -0
  503. package/src/context-compressor.ts +290 -0
  504. package/src/conversation.ts +288 -0
  505. package/src/gui-subagent/action-parser/actionParser.ts +312 -0
  506. package/src/gui-subagent/action-parser/constants.ts +12 -0
  507. package/src/gui-subagent/action-parser/index.ts +6 -0
  508. package/src/gui-subagent/action-parser/types.ts +31 -0
  509. package/src/gui-subagent/agent/gui-agent.ts +982 -0
  510. package/src/gui-subagent/agent/index.ts +5 -0
  511. package/src/gui-subagent/index.ts +139 -0
  512. package/src/gui-subagent/operator/base-operator.ts +246 -0
  513. package/src/gui-subagent/operator/computer-operator.ts +520 -0
  514. package/src/gui-subagent/operator/index.ts +7 -0
  515. package/src/gui-subagent/types/actions.ts +263 -0
  516. package/src/gui-subagent/types/index.ts +6 -0
  517. package/src/gui-subagent/types/operator.ts +106 -0
  518. package/src/gui-subagent/utils.ts +51 -0
  519. package/src/index.ts +18 -0
  520. package/src/input-processor.ts +282 -0
  521. package/src/logger.ts +438 -0
  522. package/src/mcp.ts +563 -0
  523. package/src/memory.ts +303 -0
  524. package/src/session-manager.ts +308 -0
  525. package/src/session.ts +1280 -0
  526. package/src/skill-invoker.ts +1888 -0
  527. package/src/skill-loader.ts +476 -0
  528. package/src/slash-commands.ts +1150 -0
  529. package/src/smart-approval.ts +595 -0
  530. package/src/system-prompt-generator.ts +786 -0
  531. package/src/theme.ts +455 -0
  532. package/src/tools.ts +3398 -0
  533. package/src/types.ts +198 -0
  534. package/src/update.ts +270 -0
  535. package/src/workflow.ts +508 -0
  536. package/tsconfig.json +22 -0
  537. package/vitest.config.ts +19 -0
@@ -0,0 +1,1150 @@
1
+ import inquirer from 'inquirer';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import { ExecutionMode, ChatMessage, InputType, ToolCall, Checkpoint, AgentConfig, CompressionConfig } from './types.js';
5
+ import { AIClient, Message, detectThinkingKeywords, getThinkingTokens } from './ai-client.js';
6
+ import { getToolRegistry } from './tools.js';
7
+ import { getAgentManager } from './agents.js';
8
+ import { getMemoryManager, MemoryFile } from './memory.js';
9
+ import { getMCPManager, MCPServer } from './mcp.js';
10
+ import { getCheckpointManager } from './checkpoint.js';
11
+ import { getConfigManager, ConfigManager } from './config.js';
12
+ import { getLogger } from './logger.js';
13
+ import { getContextCompressor, ContextCompressor, CompressionResult } from './context-compressor.js';
14
+ import { getConversationManager, ConversationManager } from './conversation.js';
15
+ import { icons, colors } from './theme.js';
16
+ import { SystemPromptGenerator } from './system-prompt-generator.js';
17
+
18
+ const logger = getLogger();
19
+
20
+ export class SlashCommandHandler {
21
+ private configManager: ConfigManager;
22
+ private agentManager: any;
23
+ private memoryManager: any;
24
+ private mcpManager: any;
25
+ private checkpointManager: any;
26
+ private contextCompressor: ContextCompressor;
27
+ private conversationManager: ConversationManager;
28
+ private conversationHistory: ChatMessage[] = [];
29
+ private onClearCallback: (() => void) | null = null;
30
+ private onSystemPromptUpdate: (() => Promise<void>) | null = null;
31
+
32
+ constructor() {
33
+ this.configManager = getConfigManager(process.cwd());
34
+ this.agentManager = getAgentManager(process.cwd());
35
+ this.memoryManager = getMemoryManager(process.cwd());
36
+ this.mcpManager = getMCPManager();
37
+ this.checkpointManager = getCheckpointManager(process.cwd());
38
+ this.contextCompressor = getContextCompressor();
39
+ this.conversationManager = getConversationManager();
40
+ }
41
+
42
+ /**
43
+ * č®¾ē½®ęø…é™¤åÆ¹čÆēš„å›žč°ƒå‡½ę•°
44
+ */
45
+ setClearCallback(callback: () => void): void {
46
+ this.onClearCallback = callback;
47
+ }
48
+
49
+ /**
50
+ * č®¾ē½®ē³»ē»Ÿęē¤ŗę›“ę–°ēš„å›žč°ƒå‡½ę•°
51
+ */
52
+ setSystemPromptUpdateCallback(callback: () => Promise<void>): void {
53
+ this.onSystemPromptUpdate = callback;
54
+ }
55
+
56
+ /**
57
+ * Set current conversation history (includes all user/assistant/tool messages)
58
+ */
59
+ setConversationHistory(messages: ChatMessage[]): void {
60
+ this.conversationHistory = messages;
61
+ }
62
+
63
+ async handleCommand(input: string): Promise<boolean> {
64
+ if (!input.startsWith('/')) {
65
+ return false;
66
+ }
67
+
68
+ const [command, ...args] = input.slice(1).split(' ');
69
+
70
+ switch (command.toLowerCase()) {
71
+ case 'help':
72
+ await this.showHelp();
73
+ break;
74
+ case 'init':
75
+ await this.handleInit();
76
+ break;
77
+ case 'clear':
78
+ await this.handleClear();
79
+ break;
80
+ case 'exit':
81
+ case 'quit':
82
+ await this.handleExit();
83
+ break;
84
+ case 'auth':
85
+ await this.handleAuth();
86
+ break;
87
+ case 'mode':
88
+ await this.handleMode(args);
89
+ break;
90
+ case 'think':
91
+ await this.handleThink(args);
92
+ break;
93
+ case 'agents':
94
+ await this.handleAgents(args);
95
+ break;
96
+ case 'mcp':
97
+ await this.handleMcp(args);
98
+ break;
99
+ case 'memory':
100
+ await this.handleMemory(args);
101
+ break;
102
+ case 'restore':
103
+ await this.handleRestore(args);
104
+ break;
105
+ case 'tools':
106
+ await this.handleToolsVerbose(args);
107
+ break;
108
+ case 'stats':
109
+ await this.handleStats();
110
+ break;
111
+ case 'theme':
112
+ await this.handleTheme();
113
+ break;
114
+ case 'language':
115
+ await this.handleLanguage();
116
+ break;
117
+ case 'about':
118
+ await this.handleAbout();
119
+ break;
120
+ case 'compress':
121
+ await this.handleCompress(args);
122
+ break;
123
+ default:
124
+ logger.warn(`Unknown command: /${command}`, 'Type /help for available commands');
125
+ }
126
+
127
+ return true;
128
+ }
129
+
130
+ private async showHelp(): Promise<void> {
131
+ const separator = icons.separator.repeat(Math.min(60, process.stdout.columns || 80));
132
+
133
+ console.log('');
134
+ console.log(colors.primaryBright('╔════════════════════════════════════════════════════════════╗'));
135
+ console.log(colors.primaryBright('ā•‘') + ' '.repeat(56) + colors.primaryBright('ā•‘'));
136
+ console.log(' '.repeat(14) + colors.gradient('šŸ“š XAGENT CLI Help') + ' '.repeat(31) + colors.primaryBright('ā•‘'));
137
+ console.log(colors.primaryBright('ā•‘') + ' '.repeat(56) + colors.primaryBright('ā•‘'));
138
+ console.log(colors.primaryBright('ā•šā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•'));
139
+ console.log('');
140
+
141
+ // Shortcuts
142
+ console.log(colors.accent('Shortcuts'));
143
+ console.log(colors.border(separator));
144
+ console.log('');
145
+ console.log(colors.textDim(` ${colors.accent('!')} - ${colors.textMuted('Enter bash mode')}`));
146
+ console.log(colors.textDim(` ${colors.accent('/')} - ${colors.textMuted('Commands')}`));
147
+ console.log(colors.textDim(` ${colors.accent('@')} - ${colors.textMuted('File paths')}`));
148
+ console.log('');
149
+
150
+ // Basic Commands
151
+ this.showHelpCategory('Basic Commands', [
152
+ {
153
+ cmd: '/help [command]',
154
+ desc: 'Show help information',
155
+ detail: 'View all available commands or detailed description of specific command',
156
+ example: '/help\n/help mode'
157
+ },
158
+ {
159
+ cmd: '/clear',
160
+ desc: 'Clear conversation history',
161
+ detail: 'Clear all conversation records of current session, start new conversation',
162
+ example: '/clear'
163
+ },
164
+ {
165
+ cmd: '/exit',
166
+ desc: 'Exit program',
167
+ detail: 'Safely exit XAGENT CLI',
168
+ example: '/exit'
169
+ }
170
+ ]);
171
+
172
+ // Project Management
173
+ this.showHelpCategory('Project Management', [
174
+ {
175
+ cmd: '/init',
176
+ desc: 'Initialize project context',
177
+ detail: 'Create XAGENT.md file in current directory, used to store project context information',
178
+ example: '/init'
179
+ },
180
+ {
181
+ cmd: '/memory [show|add|refresh]',
182
+ desc: 'Manage project memory',
183
+ detail: 'View, add or refresh project memory information',
184
+ example: '/memory show\n/memory add "Project uses TypeScript"'
185
+ }
186
+ ]);
187
+
188
+ // Authentication & Configuration
189
+ this.showHelpCategory('Authentication & Configuration', [
190
+ {
191
+ cmd: '/auth',
192
+ desc: 'Configure authentication information',
193
+ detail: 'Change or view current authentication configuration',
194
+ example: '/auth'
195
+ },
196
+ {
197
+ cmd: '/mode [mode]',
198
+ desc: 'Switch approval mode',
199
+ detail: 'Switch security approval mode for tool execution',
200
+ example: '/mode\n/mode smart\n/mode yolo',
201
+ modes: [
202
+ 'yolo - Execute all operations without restriction',
203
+ 'accept_edits - Automatically accept edit operations',
204
+ 'plan - Plan before executing',
205
+ 'default - Safe execution, requires confirmation',
206
+ 'smart - Smart approval (recommended)'
207
+ ]
208
+ },
209
+ {
210
+ cmd: '/think [on|off|display]',
211
+ desc: 'Control thinking mode',
212
+ detail: 'Enable/disable AI thinking process display',
213
+ example: '/think on\n/think off\n/think display compact'
214
+ },
215
+ {
216
+ cmd: '/language [zh|en]',
217
+ desc: 'Switch language',
218
+ detail: 'Switch between Chinese and English interface',
219
+ example: '/language zh\n/language en'
220
+ },
221
+ {
222
+ cmd: '/theme',
223
+ desc: 'Switch theme',
224
+ detail: 'Change UI theme style',
225
+ example: '/theme'
226
+ }
227
+ ]);
228
+
229
+ // Feature Extensions
230
+ this.showHelpCategory('Feature Extensions', [
231
+ {
232
+ cmd: '/agents [list|online|install|remove]',
233
+ desc: 'Manage sub-agents',
234
+ detail: 'View, install or remove specialized AI sub-agents',
235
+ example: '/agents list\n/agents online\n/agents install explore-agent'
236
+ },
237
+ {
238
+ cmd: '/mcp [list|add|remove|refresh]',
239
+ desc: 'Manage MCP servers',
240
+ detail: 'Manage Model Context Protocol servers',
241
+ example: '/mcp list\n/mcp add server-name'
242
+ },
243
+ {
244
+ cmd: '/tools [verbose|simple]',
245
+ desc: 'Manage tool display',
246
+ detail: 'View available tools or switch tool call display mode',
247
+ example: '/tools\n/tools verbose\n/tools simple'
248
+ }
249
+ ]);
250
+
251
+ // Advanced Features
252
+ this.showHelpCategory('Advanced Features', [
253
+ {
254
+ cmd: '/restore',
255
+ desc: 'Restore from checkpoint',
256
+ detail: 'Restore conversation state from historical checkpoints',
257
+ example: '/restore'
258
+ },
259
+ {
260
+ cmd: '/compress [on|off|max_message|max_token|exec]',
261
+ desc: 'Manage context compression',
262
+ detail: 'Configure compression settings or execute compression manually',
263
+ example: '/compress\n/compress exec\n/compress on\n/compress max_message 50\n/compress max_token 1500000'
264
+ },
265
+ {
266
+ cmd: '/stats',
267
+ desc: 'Show session statistics',
268
+ detail: 'View statistics information of current session',
269
+ example: '/stats'
270
+ },
271
+ {
272
+ cmd: '/about',
273
+ desc: 'Show version information',
274
+ detail: 'View version and related information of XAGENT CLI',
275
+ example: '/about'
276
+ }
277
+ ]);
278
+
279
+ // Keyboard Shortcuts
280
+ console.log('');
281
+ console.log(colors.border(separator));
282
+ console.log(colors.primaryBright('Keyboard Shortcuts'));
283
+ console.log(colors.border(separator));
284
+ console.log('');
285
+ console.log(colors.textMuted(' ESC - Cancel current operation'));
286
+ console.log(colors.textMuted(' Ctrl+C - Exit program'));
287
+ console.log('');
288
+ }
289
+
290
+ private showHelpCategory(title: string, commands: Array<{
291
+ cmd: string;
292
+ desc: string;
293
+ detail: string;
294
+ example: string;
295
+ modes?: string[];
296
+ }>): void {
297
+ const separator = icons.separator.repeat(Math.min(60, process.stdout.columns || 80));
298
+
299
+ console.log('');
300
+ console.log(colors.border(separator));
301
+ console.log(colors.primaryBright(title));
302
+ console.log(colors.border(separator));
303
+ console.log('');
304
+
305
+ commands.forEach(cmd => {
306
+ console.log(colors.primaryBright(` ${cmd.cmd}`));
307
+ console.log(colors.textDim(` ${cmd.desc}`));
308
+ console.log(colors.textMuted(` ${cmd.detail}`));
309
+
310
+ if (cmd.modes) {
311
+ console.log(colors.textDim(` Available modes:`));
312
+ cmd.modes.forEach(mode => {
313
+ console.log(colors.textDim(` • ${mode}`));
314
+ });
315
+ }
316
+
317
+ console.log(colors.accent(` Examples:`));
318
+ cmd.example.split('\n').forEach(ex => {
319
+ console.log(colors.codeText(` ${ex}`));
320
+ });
321
+ console.log('');
322
+ });
323
+ }
324
+
325
+ private async handleInit(): Promise<void> {
326
+ const spinner = ora('Initializing project...').start();
327
+
328
+ try {
329
+ await this.memoryManager.initializeProject(process.cwd());
330
+ spinner.succeed('Project initialized successfully');
331
+ } catch (error: any) {
332
+ spinner.fail(`Initialization failed: ${error.message}`);
333
+ }
334
+ }
335
+
336
+ private async handleClear(): Promise<void> {
337
+ // ęø…ē©ŗęœ¬åœ°åÆ¹čÆåŽ†å²
338
+ this.conversationHistory = [];
339
+
340
+ // 清空 ConversationManager äø­ēš„å½“å‰åÆ¹čÆ
341
+ await this.conversationManager.clearCurrentConversation();
342
+
343
+ // č°ƒē”Øå›žč°ƒé€šēŸ„ InteractiveSession ęø…ē©ŗåÆ¹čÆ
344
+ if (this.onClearCallback) {
345
+ this.onClearCallback();
346
+ }
347
+
348
+ logger.success('Conversation history cleared', 'Start a new conversation');
349
+ }
350
+
351
+ private async handleExit(): Promise<void> {
352
+ logger.info('Goodbye!', 'Thank you for using xAgent CLI');
353
+ process.exit(0);
354
+ }
355
+
356
+ private async handleAuth(): Promise<void> {
357
+ logger.section('Authentication Management');
358
+
359
+ const { action } = await inquirer.prompt([
360
+ {
361
+ type: 'list',
362
+ name: 'action',
363
+ message: 'Select action:',
364
+ choices: [
365
+ { name: 'Change authentication method', value: 'change' },
366
+ { name: 'Show current auth config', value: 'show' },
367
+ { name: 'Back', value: 'back' }
368
+ ]
369
+ }
370
+ ]);
371
+
372
+ if (action === 'back') {
373
+ return;
374
+ }
375
+
376
+ if (action === 'show') {
377
+ const authConfig = this.configManager.getAuthConfig();
378
+ logger.subsection('Current Authentication Configuration');
379
+ console.log(JSON.stringify(authConfig, null, 2));
380
+ } else if (action === 'change') {
381
+ const { selectAuthType } = await inquirer.prompt([
382
+ {
383
+ type: 'confirm',
384
+ name: 'selectAuthType',
385
+ message: 'Do you want to change authentication type?',
386
+ default: false
387
+ }
388
+ ]);
389
+
390
+ if (selectAuthType) {
391
+ logger.warn('Please restart xAgent CLI and run /auth again', 'Authentication changes require restart');
392
+ }
393
+ }
394
+ }
395
+
396
+ private async handleMode(args: string[]): Promise<void> {
397
+ const modes = Object.values(ExecutionMode);
398
+ const currentMode = this.configManager.getApprovalMode() || this.configManager.getExecutionMode();
399
+
400
+ if (args.length > 0) {
401
+ const newMode = args[0].toLowerCase();
402
+ if (modes.includes(newMode as ExecutionMode)) {
403
+ this.configManager.setApprovalMode(newMode as ExecutionMode);
404
+ await this.configManager.save('global');
405
+ console.log(chalk.green(`āœ… Approval mode changed to: ${newMode}`));
406
+ } else {
407
+ console.log(chalk.red(`āŒ Invalid mode: ${newMode}`));
408
+ console.log(chalk.gray(`Available modes: ${modes.join(', ')}`));
409
+ }
410
+ } else {
411
+ console.log(chalk.cyan('\nšŸŽÆ Approval Modes:\n'));
412
+ console.log(` Current: ${chalk.green(currentMode)}\n`);
413
+
414
+ const descriptions = [
415
+ { mode: 'yolo', desc: 'Execute commands without confirmation' },
416
+ { mode: 'accept_edits', desc: 'Accept all edits automatically' },
417
+ { mode: 'plan', desc: 'Plan before executing' },
418
+ { mode: 'default', desc: 'Safe execution with confirmations' },
419
+ { mode: 'smart', desc: 'Smart approval with intelligent security checks' }
420
+ ];
421
+
422
+ descriptions.forEach(({ mode, desc }) => {
423
+ const current = mode === currentMode ? chalk.green(' [current]') : '';
424
+ console.log(` ${chalk.yellow(mode)}${current}`);
425
+ console.log(` ${chalk.gray(desc)}`);
426
+ });
427
+
428
+ console.log();
429
+ }
430
+ }
431
+
432
+ private async handleThink(args: string[]): Promise<void> {
433
+ const thinkingConfig = this.configManager.getThinkingConfig();
434
+
435
+ if (args.length > 0) {
436
+ const action = args[0].toLowerCase();
437
+
438
+ if (action === 'on' || action === 'true' || action === '1') {
439
+ thinkingConfig.enabled = true;
440
+ this.configManager.setThinkingConfig(thinkingConfig);
441
+ await this.configManager.save('global');
442
+ console.log(chalk.green('āœ… Thinking mode enabled'));
443
+ } else if (action === 'off' || action === 'false' || action === '0') {
444
+ thinkingConfig.enabled = false;
445
+ this.configManager.setThinkingConfig(thinkingConfig);
446
+ await this.configManager.save('global');
447
+ console.log(chalk.green('āœ… Thinking mode disabled'));
448
+ } else if (action === 'display' && args[1]) {
449
+ const displayMode = args[1].toLowerCase();
450
+ const validModes = ['full', 'compact', 'indicator'];
451
+
452
+ if (validModes.includes(displayMode)) {
453
+ thinkingConfig.displayMode = displayMode as 'full' | 'compact' | 'indicator';
454
+ thinkingConfig.enabled = true; // Auto-enable when setting display mode
455
+ this.configManager.setThinkingConfig(thinkingConfig);
456
+ await this.configManager.save('global');
457
+ console.log(chalk.green(`āœ… Thinking display mode set to: ${displayMode}`));
458
+ } else {
459
+ console.log(chalk.red(`āŒ Invalid display mode: ${displayMode}`));
460
+ console.log(chalk.gray(`Valid modes: ${validModes.join(', ')}`));
461
+ }
462
+ } else {
463
+ console.log(chalk.red(`āŒ Invalid action: ${action}`));
464
+ console.log(chalk.gray('Usage: /think [on|off|display <mode>]'));
465
+ }
466
+ } else {
467
+ console.log(chalk.cyan('\n🧠 Thinking Mode:\n'));
468
+ console.log(` Status: ${thinkingConfig.enabled ? chalk.green('Enabled') : chalk.red('Disabled')}`);
469
+ console.log(` Mode: ${chalk.yellow(thinkingConfig.mode)}`);
470
+ console.log(` Display: ${chalk.yellow(thinkingConfig.displayMode)}\n`);
471
+
472
+ console.log(chalk.gray('Usage:'));
473
+ console.log(chalk.gray(' /think on - Enable thinking mode'));
474
+ console.log(chalk.gray(' /think off - Disable thinking mode'));
475
+ console.log(chalk.gray(' /think display full - Show full thinking process'));
476
+ console.log(chalk.gray(' /think display compact - Show compact thinking (500 chars)'));
477
+ console.log(chalk.gray(' /think display indicator - Show only indicator'));
478
+ console.log();
479
+ }
480
+ }
481
+
482
+ private async handleAgents(args: string[]): Promise<void> {
483
+ const action = args[0] || 'list';
484
+
485
+ switch (action) {
486
+ case 'list':
487
+ await this.listAgents();
488
+ break;
489
+ case 'online':
490
+ logger.warn('Online marketplace not implemented yet', 'Check back later for updates');
491
+ break;
492
+ case 'install':
493
+ logger.warn('Agent installation wizard not implemented yet', 'Use /agents install in interactive mode');
494
+ break;
495
+ case 'remove':
496
+ logger.warn('Agent removal not implemented yet', 'Use /agents remove in interactive mode');
497
+ break;
498
+ default:
499
+ logger.warn(`Unknown agents action: ${action}`, 'Use /agents list to see available actions');
500
+ }
501
+ }
502
+
503
+ private async listAgents(): Promise<void> {
504
+ const agents = this.agentManager.getAllAgents();
505
+
506
+ if (agents.length === 0) {
507
+ logger.warn('No agents configured', 'Use /agents install to add agents');
508
+ return;
509
+ }
510
+
511
+ logger.section('Available Agents');
512
+
513
+ agents.forEach((agent: AgentConfig) => {
514
+ const color = agent.color || '#FFFFFF';
515
+ logger.info(` ${chalk.hex(color)(agent.name || agent.agentType)}`);
516
+ logger.info(` Type: ${agent.agentType}`);
517
+ logger.info(` ${agent.whenToUse}`);
518
+ });
519
+ }
520
+
521
+ private async handleMcp(args: string[]): Promise<void> {
522
+ const action = args[0] || 'list';
523
+
524
+ switch (action) {
525
+ case 'list':
526
+ await this.listMcpServers();
527
+ break;
528
+ case 'add':
529
+ if (args[1]) {
530
+ // Non-interactive mode: use command line arguments
531
+ await this.addMcpServerInteractive(args[1]);
532
+ } else {
533
+ // Interactive mode
534
+ await this.addMcpServerInteractive();
535
+ }
536
+ break;
537
+ case 'remove':
538
+ if (args[1]) {
539
+ // Non-interactive mode
540
+ await this.removeMcpServer(args[1]);
541
+ } else {
542
+ // Interactive mode
543
+ await this.removeMcpServerInteractive();
544
+ }
545
+ break;
546
+ case 'refresh':
547
+ await this.refreshMcpServers();
548
+ break;
549
+ default:
550
+ logger.warn(`Unknown MCP action: ${action}`, 'Use /mcp list to see available actions');
551
+ }
552
+ }
553
+
554
+ private async listMcpServers(): Promise<void> {
555
+ const serverConfigs = this.mcpManager.getAllServerConfigs();
556
+
557
+ if (serverConfigs.length === 0) {
558
+ logger.section('MCP Servers');
559
+ logger.warn('No MCP servers configured');
560
+ logger.info('Use /mcp add to add a new MCP server');
561
+ return;
562
+ }
563
+
564
+ logger.section('MCP Servers');
565
+
566
+ serverConfigs.forEach(({ name: serverName, config: serverConfig }: { name: string; config: any }) => {
567
+ const server = this.mcpManager.getServer(serverName);
568
+ const isConnected = server?.isServerConnected() || false;
569
+ const status = isConnected ? chalk.green('āœ“ Connected') : chalk.red('āœ— Disconnected');
570
+ const tools = server?.getToolNames() || [];
571
+ const transport = serverConfig?.transport || serverConfig?.type || 'unknown';
572
+ const command = serverConfig?.command ? `${serverConfig.command} ${(serverConfig.args || []).join(' ')}` : serverConfig?.url || 'N/A';
573
+
574
+ console.log('');
575
+ console.log(` ${chalk.cyan(serverName)} ${status}`);
576
+ console.log(` Transport: ${transport}`);
577
+ console.log(` Command: ${command}`);
578
+ console.log(` Tools: ${isConnected ? tools.length : 'N/A'} (${isConnected ? tools.join(', ') : 'wait for connection'})`);
579
+ });
580
+
581
+ console.log('');
582
+ logger.info(`Total: ${serverConfigs.length} server(s)`);
583
+ }
584
+
585
+ private async addMcpServerInteractive(serverName?: string): Promise<void> {
586
+ const { name, command, args: serverArgs, transport, url, authToken, headers } = await inquirer.prompt([
587
+ {
588
+ type: 'input',
589
+ name: 'name',
590
+ message: 'Enter MCP server name:',
591
+ default: serverName,
592
+ validate: (input: string) => {
593
+ if (!input.trim()) {
594
+ return 'Server name is required';
595
+ }
596
+ const servers = this.mcpManager.getAllServers();
597
+ if (servers.some((s: MCPServer) => (s as any).config?.name === input)) {
598
+ return 'Server with this name already exists';
599
+ }
600
+ return true;
601
+ }
602
+ },
603
+ {
604
+ type: 'list',
605
+ name: 'transport',
606
+ message: 'Select transport type:',
607
+ choices: [
608
+ { name: 'Stdio (stdin/stdout)', value: 'stdio' },
609
+ { name: 'HTTP/SSE', value: 'sse' },
610
+ { name: 'HTTP (POST)', value: 'http' }
611
+ ],
612
+ default: 'stdio'
613
+ },
614
+ {
615
+ type: 'input',
616
+ name: 'command',
617
+ message: 'Enter command (for stdio transport):',
618
+ when: (answers: any) => answers.transport === 'stdio',
619
+ validate: (input: string) => input.trim() ? true : 'Command is required'
620
+ },
621
+ {
622
+ type: 'input',
623
+ name: 'args',
624
+ message: 'Enter arguments (comma-separated, for stdio transport):',
625
+ when: (answers: any) => answers.transport === 'stdio',
626
+ filter: (input: string) => input ? input.split(',').map((a: string) => a.trim()) : []
627
+ },
628
+ {
629
+ type: 'input',
630
+ name: 'url',
631
+ message: 'Enter server URL (for HTTP/SSE/HTTP transport):',
632
+ when: (answers: any) => answers.transport === 'sse' || answers.transport === 'http',
633
+ validate: (input: string) => input.trim() ? true : 'URL is required'
634
+ },
635
+ {
636
+ type: 'password',
637
+ name: 'authToken',
638
+ message: 'Enter authentication token (optional):',
639
+ when: (answers: any) => answers.transport === 'sse' || answers.transport === 'http'
640
+ },
641
+ {
642
+ type: 'input',
643
+ name: 'headers',
644
+ message: 'Enter custom headers as JSON (optional, e.g., {"Authorization": "Bearer token"}):',
645
+ when: (answers: any) => answers.transport === 'sse' || answers.transport === 'http',
646
+ filter: (input: string) => {
647
+ if (!input.trim()) return undefined;
648
+ try {
649
+ return JSON.parse(input);
650
+ } catch {
651
+ return undefined;
652
+ }
653
+ }
654
+ }
655
+ ]);
656
+
657
+ const config: any = {
658
+ transport: transport as 'stdio' | 'sse' | 'http'
659
+ };
660
+
661
+ if (transport === 'stdio') {
662
+ config.command = command;
663
+ if (serverArgs && serverArgs.length > 0) {
664
+ config.args = serverArgs;
665
+ }
666
+ } else {
667
+ config.url = url;
668
+ if (authToken) {
669
+ config.authToken = authToken;
670
+ }
671
+ if (headers) {
672
+ config.headers = headers;
673
+ }
674
+ }
675
+
676
+ try {
677
+ // Save to config file
678
+ this.configManager.addMcpServer(name, config);
679
+ await this.configManager.save('global');
680
+
681
+ // Register to MCP Manager
682
+ this.mcpManager.registerServer(name, config);
683
+
684
+ // Connect to server (with error handling)
685
+ let connected = false;
686
+ try {
687
+ await this.mcpManager.connectServer(name);
688
+ connected = true;
689
+ } catch (error: any) {
690
+ // Connection failed - cleanup
691
+ this.mcpManager.disconnectServer(name);
692
+ this.configManager.removeMcpServer(name);
693
+ await this.configManager.save('global');
694
+ throw new Error(`Connection failed: ${error.message}`);
695
+ }
696
+
697
+ // Register MCP tools with simple names
698
+ const allMcpTools = this.mcpManager.getAllTools();
699
+ const toolRegistry = getToolRegistry();
700
+ toolRegistry.registerMCPTools(allMcpTools);
701
+
702
+ // Update system prompt to include new MCP tools
703
+ if (this.onSystemPromptUpdate) {
704
+ await this.onSystemPromptUpdate();
705
+ }
706
+
707
+ console.log(chalk.green(`āœ… MCP server '${name}' added and connected successfully`));
708
+ } catch (error: any) {
709
+ console.log(chalk.red(`āŒ Failed to add MCP server: ${error.message}`));
710
+ }
711
+ }
712
+
713
+ private async removeMcpServerInteractive(): Promise<void> {
714
+ const servers = this.mcpManager.getAllServers();
715
+
716
+ if (servers.length === 0) {
717
+ logger.warn('No MCP servers configured', 'Use /mcp add to add servers');
718
+ return;
719
+ }
720
+
721
+ const serverNames = servers.map((s: MCPServer) => {
722
+ const tools = s.getToolNames();
723
+ const status = s.isServerConnected() ? 'āœ“' : 'āœ—';
724
+ return {
725
+ name: `${status} ${(s as any).config?.name || 'unknown'} (${tools.length} tools)`,
726
+ value: (s as any).config?.name
727
+ };
728
+ });
729
+
730
+ const { serverName } = await inquirer.prompt([
731
+ {
732
+ type: 'list',
733
+ name: 'serverName',
734
+ message: 'Select MCP server to remove:',
735
+ choices: serverNames
736
+ }
737
+ ]);
738
+
739
+ await this.removeMcpServer(serverName);
740
+ }
741
+
742
+ private async removeMcpServer(serverName: string): Promise<void> {
743
+ try {
744
+ // Get server info before disconnecting to notify LLM
745
+ const server = this.mcpManager.getServer(serverName);
746
+ const removedTools = server ? server.getToolNames() : [];
747
+ const removedToolNames = removedTools.map((t: string) => `${serverName}__${t}`).join(', ');
748
+
749
+ // Disconnect
750
+ this.mcpManager.disconnectServer(serverName);
751
+
752
+ // Unregister MCP tools for this server
753
+ const toolRegistry = getToolRegistry();
754
+ toolRegistry.unregisterMCPTools(serverName);
755
+
756
+ // Remove from config
757
+ this.configManager.removeMcpServer(serverName);
758
+ await this.configManager.save('global');
759
+
760
+ // Update system prompt to reflect removed MCP tools
761
+ if (this.onSystemPromptUpdate) {
762
+ await this.onSystemPromptUpdate();
763
+ }
764
+
765
+ console.log(chalk.green(`āœ… MCP server '${serverName}' removed successfully`));
766
+ } catch (error: any) {
767
+ console.log(chalk.red(`āŒ Failed to remove MCP server: ${error.message}`));
768
+ }
769
+ }
770
+
771
+ private async refreshMcpServers(): Promise<void> {
772
+ const spinner = ora({ text: 'Refreshing MCP servers...', interval: 200 }).start();
773
+
774
+ try {
775
+ // Disconnect all existing connections
776
+ this.mcpManager.disconnectAllServers();
777
+
778
+ // Reconnect all servers
779
+ await this.mcpManager.connectAllServers();
780
+
781
+ spinner.succeed('MCP servers refreshed successfully');
782
+
783
+ // Show current server status
784
+ await this.listMcpServers();
785
+ } catch (error: any) {
786
+ spinner.fail(`Failed to refresh MCP servers: ${error.message}`);
787
+ }
788
+ }
789
+
790
+ private async handleMemory(args: string[]): Promise<void> {
791
+ const action = args[0] || 'show';
792
+
793
+ switch (action) {
794
+ case 'show':
795
+ await this.showMemory();
796
+ break;
797
+ case 'add':
798
+ logger.warn('Memory addition not implemented yet', 'Use /memory add in interactive mode');
799
+ break;
800
+ case 'refresh':
801
+ logger.warn('Memory refresh not implemented yet', 'Check back later for updates');
802
+ break;
803
+ default:
804
+ logger.warn(`Unknown memory action: ${action}`, 'Use /memory show to see available actions');
805
+ }
806
+ }
807
+
808
+ private async showMemory(): Promise<void> {
809
+ const memoryFiles = this.memoryManager.getMemoryFiles();
810
+
811
+ if (memoryFiles.length === 0) {
812
+ logger.warn('No memory files loaded', 'Use /init to initialize project context');
813
+ return;
814
+ }
815
+
816
+ logger.section('Memory Files');
817
+
818
+ memoryFiles.forEach((file: MemoryFile) => {
819
+ const level = file.level === 'global' ? chalk.blue('[global]') :
820
+ file.level === 'project' ? chalk.green('[project]') :
821
+ chalk.yellow('[subdirectory]');
822
+ logger.info(` ${level} ${file.path}`);
823
+ });
824
+ }
825
+
826
+ private async addMemory(): Promise<void> {
827
+ const { entry } = await inquirer.prompt([
828
+ {
829
+ type: 'editor',
830
+ name: 'entry',
831
+ message: 'Enter memory entry (opens editor):'
832
+ }
833
+ ]);
834
+
835
+ if (entry && entry.trim()) {
836
+ await this.memoryManager.addMemoryEntry(entry.trim());
837
+ console.log(chalk.green('āœ… Memory entry added'));
838
+ }
839
+ }
840
+
841
+ private async refreshMemory(): Promise<void> {
842
+ const spinner = ora({ text: 'Refreshing memory...', interval: 200 }).start();
843
+
844
+ try {
845
+ await this.memoryManager.loadMemory();
846
+ spinner.succeed('Memory refreshed successfully');
847
+ } catch (error: any) {
848
+ spinner.fail(`Failed to refresh memory: ${error.message}`);
849
+ }
850
+ }
851
+
852
+ private async handleRestore(args: string[]): Promise<void> {
853
+ if (!this.checkpointManager.isEnabled()) {
854
+ logger.warn('Checkpointing is not enabled', 'Enable it with /mode or in settings');
855
+ return;
856
+ }
857
+
858
+ const checkpoints = this.checkpointManager.listCheckpoints();
859
+
860
+ if (checkpoints.length === 0) {
861
+ logger.warn('No checkpoints available', 'Create checkpoints during your session');
862
+ return;
863
+ }
864
+
865
+ if (args.length > 0) {
866
+ const checkpointId = args[0];
867
+ try {
868
+ await this.checkpointManager.restoreCheckpoint(checkpointId);
869
+ logger.success(`Checkpoint ${checkpointId} restored successfully!`);
870
+ } catch (error: any) {
871
+ logger.error(error.message, 'Check if checkpoint ID is valid');
872
+ }
873
+ } else {
874
+ const choices = checkpoints.map((cp: Checkpoint) => ({
875
+ name: `${new Date(cp.timestamp).toLocaleString()} - ${cp.description}`,
876
+ value: cp.id
877
+ }));
878
+
879
+ const { checkpointId } = await inquirer.prompt([
880
+ {
881
+ type: 'list',
882
+ name: 'checkpointId',
883
+ message: 'Select checkpoint to restore:',
884
+ choices
885
+ }
886
+ ]);
887
+
888
+ try {
889
+ await this.checkpointManager.restoreCheckpoint(checkpointId);
890
+ logger.success(`Checkpoint ${checkpointId} restored successfully!`);
891
+ } catch (error: any) {
892
+ logger.error(error.message, 'Check if checkpoint ID is valid');
893
+ }
894
+ }
895
+ }
896
+
897
+ private async handleTools(): Promise<void> {
898
+ const toolRegistry = getToolRegistry();
899
+ const tools = toolRegistry.getAll();
900
+
901
+ logger.section('Available Tools');
902
+
903
+ tools.forEach(tool => {
904
+ logger.info(` ${tool.name}`);
905
+ logger.info(` ${tool.description}`);
906
+ });
907
+
908
+ console.log('');
909
+ const currentSetting = this.configManager.get('showToolDetails') ? 'verbose' : 'simple';
910
+ logger.info(`Current tool display mode: ${currentSetting}`);
911
+ logger.info('Use /tools verbose to switch to verbose mode');
912
+ logger.info('Use /tools simple to switch to simple mode');
913
+ }
914
+
915
+ private async handleToolsVerbose(args: string[]): Promise<void> {
916
+ if (args.length === 0) {
917
+ const currentSetting = this.configManager.get('showToolDetails') ? 'verbose' : 'simple';
918
+ logger.info(`Current tool display mode: ${currentSetting}`);
919
+ return;
920
+ }
921
+
922
+ const mode = args[0].toLowerCase();
923
+
924
+ if (mode === 'verbose' || mode === 'detail' || mode === 'true' || mode === 'on') {
925
+ this.configManager.set('showToolDetails', true);
926
+ await this.configManager.save('global');
927
+ logger.success('Tool display mode switched to verbose mode', 'Will show complete tool call information');
928
+ } else if (mode === 'simple' || mode === 'concise' || mode === 'false' || mode === 'off') {
929
+ this.configManager.set('showToolDetails', false);
930
+ await this.configManager.save('global');
931
+ logger.success('Tool display mode switched to simple mode', 'Only show tool execution status');
932
+ } else {
933
+ logger.warn('Invalid mode', 'Use verbose or simple');
934
+ }
935
+ }
936
+
937
+ private async handleStats(): Promise<void> {
938
+ logger.section('Session Statistics');
939
+ logger.info(` Execution Mode: ${this.configManager.getExecutionMode()}`);
940
+ logger.info(` Language: ${this.configManager.getLanguage()}`);
941
+ logger.info(` Checkpointing: ${this.checkpointManager.isEnabled() ? 'Enabled' : 'Disabled'}`);
942
+ logger.info(` MCP Servers: ${this.mcpManager.getAllServers().length}`);
943
+ logger.info(` Agents: ${this.agentManager.getAllAgents().length}`);
944
+ }
945
+
946
+ private async handleTheme(): Promise<void> {
947
+ logger.warn('Theme switching not implemented yet', 'Check back later for updates');
948
+ }
949
+
950
+ private async handleLanguage(): Promise<void> {
951
+ const { language } = await inquirer.prompt([
952
+ {
953
+ type: 'list',
954
+ name: 'language',
955
+ message: 'Select language:',
956
+ choices: [
957
+ { name: 'Chinese', value: 'zh' },
958
+ { name: 'English', value: 'en' }
959
+ ]
960
+ }
961
+ ]);
962
+
963
+ this.configManager.setLanguage(language);
964
+ logger.success(`Language changed to: ${language === 'zh' ? 'Chinese' : 'English'}`, 'Restart CLI to apply changes');
965
+ }
966
+
967
+ private async handleAbout(): Promise<void> {
968
+ logger.section('xAgent CLI');
969
+ logger.info('Version: 1.0.0');
970
+ logger.info('A powerful AI-powered command-line assistant');
971
+ logger.blank();
972
+ logger.link('Documentation', 'https://platform.xagent.cn/');
973
+ logger.link('GitHub', 'https://github.com/xagent-ai/xagent-cli');
974
+ }
975
+
976
+ private async handleCompress(args: string[]): Promise<void> {
977
+ const config = this.configManager.getContextCompressionConfig();
978
+
979
+ // If there are arguments, process config or execute
980
+ if (args.length > 0) {
981
+ const action = args[0].toLowerCase();
982
+
983
+ if (action === 'exec' || action === 'run' || action === 'now') {
984
+ await this.executeCompression(config);
985
+ return;
986
+ }
987
+
988
+ await this.setCompressConfig(args);
989
+ return;
990
+ }
991
+
992
+ // Display current configuration
993
+ console.log(chalk.cyan('\nšŸ“¦ Context Compression:\n'));
994
+
995
+ console.log(` Status: ${config.enabled ? chalk.green('Enabled') : chalk.red('Disabled')}`);
996
+ console.log(` Max Messages: ${chalk.yellow(config.maxMessages.toString())}`);
997
+ console.log(` Max Tokens: ${chalk.yellow(config.maxContextSize.toString())}`);
998
+
999
+ console.log('');
1000
+ console.log(chalk.gray('Usage:'));
1001
+ console.log(chalk.gray(' /compress - Show current configuration'));
1002
+ console.log(chalk.gray(' /compress exec - Execute compression now'));
1003
+ console.log(chalk.gray(' /compress on|off - Enable/disable compression'));
1004
+ console.log(chalk.gray(' /compress max_message <n> - Set max messages before compression'));
1005
+ console.log(chalk.gray(' /compress max_token <n> - Set max tokens before compression'));
1006
+ console.log('');
1007
+ }
1008
+
1009
+ private async executeCompression(config: CompressionConfig): Promise<void> {
1010
+ const messages = this.conversationHistory;
1011
+
1012
+ if (!messages || messages.length === 0) {
1013
+ console.log(chalk.yellow('āš ļø No conversation to compress'));
1014
+ return;
1015
+ }
1016
+
1017
+ const { needsCompression, reason } = this.contextCompressor.needsCompression(
1018
+ messages,
1019
+ config
1020
+ );
1021
+
1022
+ if (!needsCompression) {
1023
+ console.log(chalk.green('āœ… No compression needed'));
1024
+ console.log(chalk.gray(` ${reason}`));
1025
+ return;
1026
+ }
1027
+
1028
+ console.log(chalk.cyan('\nšŸš€ Executing context compression...\n'));
1029
+
1030
+ const spinner = ora({
1031
+ text: 'Compressing context...',
1032
+ spinner: 'dots',
1033
+ color: 'cyan'
1034
+ }).start();
1035
+
1036
+ try {
1037
+ const result: CompressionResult = await this.contextCompressor.compressContext(
1038
+ messages,
1039
+ 'You are a helpful AI assistant.',
1040
+ config
1041
+ );
1042
+
1043
+ spinner.succeed(chalk.green('āœ… Compression complete'));
1044
+
1045
+ console.log('');
1046
+ console.log(` ${chalk.cyan('Original:')} ${chalk.yellow(result.originalMessageCount.toString())} messages (${result.originalSize} chars)`);
1047
+ console.log(` ${chalk.cyan('Compressed:')} ${chalk.yellow(result.compressedMessageCount.toString())} messages (${result.compressedSize} chars)`);
1048
+ console.log(` ${chalk.cyan('Reduction:')} ${chalk.green(Math.round((1 - result.compressedSize / result.originalSize) * 100) + '%')}`);
1049
+ console.log(` ${chalk.cyan('Method:')} ${chalk.yellow(result.compressionMethod)}`);
1050
+
1051
+ console.log('');
1052
+ console.log(chalk.gray('Use /clear to start a new conversation, or continue chatting to see the compressed summary.'));
1053
+ console.log('');
1054
+ } catch (error: any) {
1055
+ spinner.fail(chalk.red('Compression failed'));
1056
+ console.log(chalk.red(` ${error.message}`));
1057
+ }
1058
+ }
1059
+
1060
+ private async setCompressConfig(args: string[]): Promise<void> {
1061
+ const config = this.configManager.getContextCompressionConfig();
1062
+ const action = args[0].toLowerCase();
1063
+
1064
+ switch (action) {
1065
+ case 'on':
1066
+ config.enabled = true;
1067
+ this.configManager.setContextCompressionConfig(config);
1068
+ await this.configManager.save('global');
1069
+ console.log(chalk.green('āœ… Context compression enabled'));
1070
+ break;
1071
+
1072
+ case 'off':
1073
+ config.enabled = false;
1074
+ this.configManager.setContextCompressionConfig(config);
1075
+ await this.configManager.save('global');
1076
+ console.log(chalk.green('āœ… Context compression disabled'));
1077
+ break;
1078
+
1079
+ case 'max_message':
1080
+ if (args[1]) {
1081
+ const maxMessages = parseInt(args[1], 10);
1082
+ if (isNaN(maxMessages) || maxMessages < 1) {
1083
+ console.log(chalk.red('āŒ Invalid value for max_message. Must be a positive number.'));
1084
+ return;
1085
+ }
1086
+ config.maxMessages = maxMessages;
1087
+ this.configManager.setContextCompressionConfig(config);
1088
+ await this.configManager.save('global');
1089
+ console.log(chalk.green(`āœ… Max messages set to: ${maxMessages}`));
1090
+ } else {
1091
+ console.log(chalk.gray('Usage: /compress max_message <number>'));
1092
+ }
1093
+ break;
1094
+
1095
+ case 'max_token':
1096
+ if (args[1]) {
1097
+ const maxContextSize = parseInt(args[1], 10);
1098
+ if (isNaN(maxContextSize) || maxContextSize < 1000) {
1099
+ console.log(chalk.red('āŒ Invalid value for max_token. Must be at least 1000.'));
1100
+ return;
1101
+ }
1102
+ config.maxContextSize = maxContextSize;
1103
+ this.configManager.setContextCompressionConfig(config);
1104
+ await this.configManager.save('global');
1105
+ console.log(chalk.green(`āœ… Max tokens set to: ${maxContextSize}`));
1106
+ } else {
1107
+ console.log(chalk.gray('Usage: /compress max_token <number>'));
1108
+ }
1109
+ break;
1110
+
1111
+ default:
1112
+ console.log(chalk.red(`āŒ Unknown action: ${action}`));
1113
+ console.log(chalk.gray('Available actions: on, off, max_message, max_token, exec'));
1114
+ }
1115
+ }
1116
+ }
1117
+
1118
+ export function parseInput(input: string): InputType[] {
1119
+ const inputs: InputType[] = [];
1120
+ let remaining = input;
1121
+
1122
+ const fileRefRegex = /@([^\s]+)/g;
1123
+ let match;
1124
+ while ((match = fileRefRegex.exec(remaining)) !== null) {
1125
+ const filePath = match[1];
1126
+ const beforeMatch = remaining.substring(0, match.index);
1127
+ const afterMatch = remaining.substring(match.index + match[0].length);
1128
+
1129
+ if (beforeMatch.trim()) {
1130
+ inputs.push({ type: 'text', content: beforeMatch.trim() });
1131
+ }
1132
+
1133
+ inputs.push({ type: 'file', content: filePath });
1134
+ remaining = afterMatch;
1135
+ }
1136
+
1137
+ if (remaining.trim()) {
1138
+ if (remaining.startsWith('!')) {
1139
+ inputs.push({ type: 'command', content: remaining.slice(1).trim() });
1140
+ } else {
1141
+ inputs.push({ type: 'text', content: remaining.trim() });
1142
+ }
1143
+ }
1144
+
1145
+ return inputs;
1146
+ }
1147
+
1148
+ export function detectImageInput(input: string): boolean {
1149
+ return input.includes('[Pasted image') || input.includes('<image');
1150
+ }