@xagent-ai/cli 1.2.2 → 1.3.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 (568) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +38 -38
  2. package/.github/ISSUE_TEMPLATE/feature_request.md +20 -20
  3. package/.github/workflows/ci.yml +72 -0
  4. package/.github/workflows/release.yml +109 -0
  5. package/.gitmodules +3 -3
  6. package/README.md +326 -280
  7. package/README_CN.md +325 -279
  8. package/dist/ai-client/factory.d.ts +52 -0
  9. package/dist/ai-client/factory.d.ts.map +1 -0
  10. package/dist/ai-client/factory.js +132 -0
  11. package/dist/ai-client/factory.js.map +1 -0
  12. package/dist/ai-client/index.d.ts +20 -0
  13. package/dist/ai-client/index.d.ts.map +1 -0
  14. package/dist/ai-client/index.js +49 -0
  15. package/dist/ai-client/index.js.map +1 -0
  16. package/dist/ai-client/providers/anthropic.d.ts +57 -0
  17. package/dist/ai-client/providers/anthropic.d.ts.map +1 -0
  18. package/dist/ai-client/providers/anthropic.js +400 -0
  19. package/dist/ai-client/providers/anthropic.js.map +1 -0
  20. package/dist/ai-client/providers/openai.d.ts +57 -0
  21. package/dist/ai-client/providers/openai.d.ts.map +1 -0
  22. package/dist/ai-client/providers/openai.js +286 -0
  23. package/dist/ai-client/providers/openai.js.map +1 -0
  24. package/dist/ai-client/providers/remote.d.ts +111 -0
  25. package/dist/ai-client/providers/remote.d.ts.map +1 -0
  26. package/dist/ai-client/providers/remote.js +351 -0
  27. package/dist/ai-client/providers/remote.js.map +1 -0
  28. package/dist/ai-client/registry.d.ts +51 -0
  29. package/dist/ai-client/registry.d.ts.map +1 -0
  30. package/dist/ai-client/registry.js +81 -0
  31. package/dist/ai-client/registry.js.map +1 -0
  32. package/dist/ai-client/types.d.ts +260 -0
  33. package/dist/ai-client/types.d.ts.map +1 -0
  34. package/dist/ai-client/types.js +73 -0
  35. package/dist/ai-client/types.js.map +1 -0
  36. package/dist/ai-client-factory.d.ts +62 -0
  37. package/dist/ai-client-factory.d.ts.map +1 -0
  38. package/dist/ai-client-factory.js +157 -0
  39. package/dist/ai-client-factory.js.map +1 -0
  40. package/dist/auth.d.ts +23 -1
  41. package/dist/auth.d.ts.map +1 -1
  42. package/dist/auth.js +160 -168
  43. package/dist/auth.js.map +1 -1
  44. package/dist/cancellation.d.ts +5 -4
  45. package/dist/cancellation.d.ts.map +1 -1
  46. package/dist/cancellation.js +55 -32
  47. package/dist/cancellation.js.map +1 -1
  48. package/dist/checkpoint.d.ts +1 -1
  49. package/dist/checkpoint.d.ts.map +1 -1
  50. package/dist/checkpoint.js +2 -2
  51. package/dist/checkpoint.js.map +1 -1
  52. package/dist/cli.js +626 -13
  53. package/dist/cli.js.map +1 -1
  54. package/dist/config.d.ts +10 -4
  55. package/dist/config.d.ts.map +1 -1
  56. package/dist/config.js +62 -25
  57. package/dist/config.js.map +1 -1
  58. package/dist/context-compressor.d.ts +81 -16
  59. package/dist/context-compressor.d.ts.map +1 -1
  60. package/dist/context-compressor.js +712 -153
  61. package/dist/context-compressor.js.map +1 -1
  62. package/dist/gui-subagent/action-parser/actionParser.d.ts.map +1 -1
  63. package/dist/gui-subagent/action-parser/actionParser.js +4 -2
  64. package/dist/gui-subagent/action-parser/actionParser.js.map +1 -1
  65. package/dist/gui-subagent/agent/gui-agent.d.ts +29 -2
  66. package/dist/gui-subagent/agent/gui-agent.d.ts.map +1 -1
  67. package/dist/gui-subagent/agent/gui-agent.js +87 -45
  68. package/dist/gui-subagent/agent/gui-agent.js.map +1 -1
  69. package/dist/gui-subagent/index.d.ts +16 -1
  70. package/dist/gui-subagent/index.d.ts.map +1 -1
  71. package/dist/gui-subagent/index.js +4 -0
  72. package/dist/gui-subagent/index.js.map +1 -1
  73. package/dist/gui-subagent/operator/base-operator.d.ts.map +1 -1
  74. package/dist/gui-subagent/operator/base-operator.js +0 -1
  75. package/dist/gui-subagent/operator/base-operator.js.map +1 -1
  76. package/dist/gui-subagent/operator/computer-operator.d.ts.map +1 -1
  77. package/dist/gui-subagent/operator/computer-operator.js +29 -8
  78. package/dist/gui-subagent/operator/computer-operator.js.map +1 -1
  79. package/dist/gui-subagent/types/actions.d.ts +1 -1
  80. package/dist/gui-subagent/types/actions.d.ts.map +1 -1
  81. package/dist/gui-subagent/types/actions.js +0 -1
  82. package/dist/gui-subagent/types/actions.js.map +1 -1
  83. package/dist/gui-subagent/types/operator.d.ts +1 -1
  84. package/dist/gui-subagent/types/operator.d.ts.map +1 -1
  85. package/dist/index.d.ts +1 -2
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +1 -2
  88. package/dist/index.js.map +1 -1
  89. package/dist/input-processor.d.ts.map +1 -1
  90. package/dist/input-processor.js +6 -3
  91. package/dist/input-processor.js.map +1 -1
  92. package/dist/mcp.d.ts +5 -0
  93. package/dist/mcp.d.ts.map +1 -1
  94. package/dist/mcp.js +81 -35
  95. package/dist/mcp.js.map +1 -1
  96. package/dist/ripgrep.d.ts +29 -0
  97. package/dist/ripgrep.d.ts.map +1 -0
  98. package/dist/ripgrep.js +292 -0
  99. package/dist/ripgrep.js.map +1 -0
  100. package/dist/session.d.ts +23 -7
  101. package/dist/session.d.ts.map +1 -1
  102. package/dist/session.js +624 -243
  103. package/dist/session.js.map +1 -1
  104. package/dist/shell.d.ts +33 -0
  105. package/dist/shell.d.ts.map +1 -0
  106. package/dist/shell.js +125 -0
  107. package/dist/shell.js.map +1 -0
  108. package/dist/skill-installer.d.ts +38 -0
  109. package/dist/skill-installer.d.ts.map +1 -0
  110. package/dist/skill-installer.js +447 -0
  111. package/dist/skill-installer.js.map +1 -0
  112. package/dist/skill-invoker.d.ts +7 -1
  113. package/dist/skill-invoker.d.ts.map +1 -1
  114. package/dist/skill-invoker.js +34 -13
  115. package/dist/skill-invoker.js.map +1 -1
  116. package/dist/skill-loader.d.ts +8 -3
  117. package/dist/skill-loader.d.ts.map +1 -1
  118. package/dist/skill-loader.js +46 -44
  119. package/dist/skill-loader.js.map +1 -1
  120. package/dist/skill-manager.d.ts +85 -0
  121. package/dist/skill-manager.d.ts.map +1 -0
  122. package/dist/skill-manager.js +340 -0
  123. package/dist/skill-manager.js.map +1 -0
  124. package/dist/slash-commands.d.ts +38 -1
  125. package/dist/slash-commands.d.ts.map +1 -1
  126. package/dist/slash-commands.js +912 -296
  127. package/dist/slash-commands.js.map +1 -1
  128. package/dist/smart-approval.d.ts.map +1 -1
  129. package/dist/smart-approval.js +67 -55
  130. package/dist/smart-approval.js.map +1 -1
  131. package/dist/system-prompt-generator.d.ts +6 -0
  132. package/dist/system-prompt-generator.d.ts.map +1 -1
  133. package/dist/system-prompt-generator.js +84 -34
  134. package/dist/system-prompt-generator.js.map +1 -1
  135. package/dist/terminal.d.ts +28 -0
  136. package/dist/terminal.d.ts.map +1 -0
  137. package/dist/terminal.js +82 -0
  138. package/dist/terminal.js.map +1 -0
  139. package/dist/tools.d.ts +23 -7
  140. package/dist/tools.d.ts.map +1 -1
  141. package/dist/tools.js +797 -437
  142. package/dist/tools.js.map +1 -1
  143. package/dist/truncate.d.ts +55 -0
  144. package/dist/truncate.d.ts.map +1 -0
  145. package/dist/truncate.js +130 -0
  146. package/dist/truncate.js.map +1 -0
  147. package/dist/types.d.ts +27 -9
  148. package/dist/types.d.ts.map +1 -1
  149. package/dist/update.d.ts.map +1 -1
  150. package/dist/update.js +17 -28
  151. package/dist/update.js.map +1 -1
  152. package/dist/workflow.d.ts +5 -1
  153. package/dist/workflow.d.ts.map +1 -1
  154. package/dist/workflow.js +60 -47
  155. package/dist/workflow.js.map +1 -1
  156. package/docs/architecture/mcp-integration-guide.md +304 -194
  157. package/docs/architecture/overview.md +169 -169
  158. package/docs/architecture/tool-system-design.md +134 -134
  159. package/docs/cli/commands.md +349 -238
  160. package/docs/smart-mode.md +281 -281
  161. package/docs/third-party-models.md +439 -439
  162. package/find-skills/SKILL.md +133 -0
  163. package/package.json +89 -90
  164. package/scripts/install-ripgrep.js +241 -0
  165. package/src/ai-client/factory.ts +151 -0
  166. package/src/ai-client/index.ts +61 -0
  167. package/src/ai-client/providers/anthropic.ts +466 -0
  168. package/src/ai-client/providers/openai.ts +342 -0
  169. package/src/ai-client/providers/remote.ts +436 -0
  170. package/src/ai-client/registry.ts +97 -0
  171. package/src/ai-client/types.ts +345 -0
  172. package/src/ai-client-factory.ts +204 -0
  173. package/src/auth.ts +663 -614
  174. package/src/cancellation.ts +205 -176
  175. package/src/checkpoint.ts +219 -219
  176. package/src/cli.ts +1406 -743
  177. package/src/config.ts +341 -297
  178. package/src/context-compressor.ts +982 -290
  179. package/src/conversation.ts +288 -288
  180. package/src/gui-subagent/action-parser/actionParser.ts +318 -315
  181. package/src/gui-subagent/action-parser/constants.ts +14 -14
  182. package/src/gui-subagent/action-parser/index.ts +8 -8
  183. package/src/gui-subagent/action-parser/types.ts +31 -31
  184. package/src/gui-subagent/agent/gui-agent.ts +1151 -1089
  185. package/src/gui-subagent/agent/index.ts +5 -5
  186. package/src/gui-subagent/index.ts +177 -163
  187. package/src/gui-subagent/operator/base-operator.ts +244 -245
  188. package/src/gui-subagent/operator/computer-operator.ts +540 -520
  189. package/src/gui-subagent/operator/index.ts +6 -6
  190. package/src/gui-subagent/types/actions.ts +260 -262
  191. package/src/gui-subagent/types/index.ts +6 -6
  192. package/src/gui-subagent/types/operator.ts +106 -106
  193. package/src/gui-subagent/utils.ts +51 -51
  194. package/src/index.ts +17 -18
  195. package/src/input-processor.ts +6 -3
  196. package/src/logger.ts +438 -438
  197. package/src/mcp.ts +730 -682
  198. package/src/memory.ts +344 -344
  199. package/src/ripgrep.ts +368 -0
  200. package/src/session-manager.ts +308 -308
  201. package/src/session.ts +948 -386
  202. package/src/shell.ts +133 -0
  203. package/src/skill-installer.ts +518 -0
  204. package/src/skill-invoker.ts +960 -935
  205. package/src/skill-loader.ts +501 -496
  206. package/src/skill-manager.ts +384 -0
  207. package/src/slash-commands.ts +2181 -1389
  208. package/src/smart-approval.ts +117 -73
  209. package/src/system-prompt-generator.ts +89 -34
  210. package/src/terminal.ts +96 -0
  211. package/src/theme.ts +738 -738
  212. package/src/tools.ts +1336 -773
  213. package/src/truncate.ts +173 -0
  214. package/src/types.ts +219 -198
  215. package/src/update.ts +22 -32
  216. package/src/workflow.ts +523 -508
  217. package/tsconfig.json +22 -22
  218. package/vitest.config.ts +19 -19
  219. package/dist/ai-client.d.ts +0 -86
  220. package/dist/ai-client.d.ts.map +0 -1
  221. package/dist/ai-client.js +0 -1372
  222. package/dist/ai-client.js.map +0 -1
  223. package/dist/gui-subagent/operator/browser-operator.d.ts +0 -36
  224. package/dist/gui-subagent/operator/browser-operator.d.ts.map +0 -1
  225. package/dist/gui-subagent/operator/browser-operator.js +0 -306
  226. package/dist/gui-subagent/operator/browser-operator.js.map +0 -1
  227. package/dist/gui-subagent/operator/desktop-operator.d.ts +0 -55
  228. package/dist/gui-subagent/operator/desktop-operator.d.ts.map +0 -1
  229. package/dist/gui-subagent/operator/desktop-operator.js +0 -527
  230. package/dist/gui-subagent/operator/desktop-operator.js.map +0 -1
  231. package/dist/hook.d.ts +0 -73
  232. package/dist/hook.d.ts.map +0 -1
  233. package/dist/hook.js +0 -156
  234. package/dist/hook.js.map +0 -1
  235. package/dist/input-history.d.ts +0 -24
  236. package/dist/input-history.d.ts.map +0 -1
  237. package/dist/input-history.js +0 -94
  238. package/dist/input-history.js.map +0 -1
  239. package/dist/keyboard-manager.d.ts +0 -151
  240. package/dist/keyboard-manager.d.ts.map +0 -1
  241. package/dist/keyboard-manager.js +0 -396
  242. package/dist/keyboard-manager.js.map +0 -1
  243. package/dist/print-system-prompt.d.ts +0 -2
  244. package/dist/print-system-prompt.d.ts.map +0 -1
  245. package/dist/print-system-prompt.js +0 -40
  246. package/dist/print-system-prompt.js.map +0 -1
  247. package/dist/remote-ai-client.d.ts +0 -104
  248. package/dist/remote-ai-client.d.ts.map +0 -1
  249. package/dist/remote-ai-client.js +0 -552
  250. package/dist/remote-ai-client.js.map +0 -1
  251. package/dist/sdk-output-adapter.d.ts +0 -232
  252. package/dist/sdk-output-adapter.d.ts.map +0 -1
  253. package/dist/sdk-output-adapter.js +0 -636
  254. package/dist/sdk-output-adapter.js.map +0 -1
  255. package/dist/sdk-session-v2.d.ts +0 -13
  256. package/dist/sdk-session-v2.d.ts.map +0 -1
  257. package/dist/sdk-session-v2.js +0 -46
  258. package/dist/sdk-session-v2.js.map +0 -1
  259. package/dist/sdk-session.d.ts +0 -13
  260. package/dist/sdk-session.d.ts.map +0 -1
  261. package/dist/sdk-session.js +0 -48
  262. package/dist/sdk-session.js.map +0 -1
  263. package/dist/test-boundary-conditions.d.ts.map +0 -1
  264. package/dist/test-boundary-conditions.js.map +0 -1
  265. package/dist/test-cancellation-fix.d.ts.map +0 -1
  266. package/dist/test-cancellation-fix.js.map +0 -1
  267. package/dist/test-input-history.d.ts.map +0 -1
  268. package/dist/test-input-history.js.map +0 -1
  269. package/dist/test-interaction-flow.d.ts.map +0 -1
  270. package/dist/test-interaction-flow.js.map +0 -1
  271. package/dist/test-quick.d.ts.map +0 -1
  272. package/dist/test-quick.js.map +0 -1
  273. package/dist/test-user-interaction.d.ts.map +0 -1
  274. package/dist/test-user-interaction.js.map +0 -1
  275. package/dist/tools/edit-diff.d.ts +0 -32
  276. package/dist/tools/edit-diff.d.ts.map +0 -1
  277. package/dist/tools/edit-diff.js +0 -185
  278. package/dist/tools/edit-diff.js.map +0 -1
  279. package/dist/tools/edit.d.ts +0 -11
  280. package/dist/tools/edit.d.ts.map +0 -1
  281. package/dist/tools/edit.js +0 -129
  282. package/dist/tools/edit.js.map +0 -1
  283. package/dist/unified-session.d.ts +0 -42
  284. package/dist/unified-session.d.ts.map +0 -1
  285. package/dist/unified-session.js +0 -271
  286. package/dist/unified-session.js.map +0 -1
  287. package/skills/.claude-plugin/marketplace.json +0 -45
  288. package/skills/README.md +0 -94
  289. package/skills/THIRD_PARTY_NOTICES.md +0 -405
  290. package/skills/skills/algorithmic-art/LICENSE.txt +0 -202
  291. package/skills/skills/algorithmic-art/SKILL.md +0 -405
  292. package/skills/skills/algorithmic-art/templates/generator_template.js +0 -223
  293. package/skills/skills/algorithmic-art/templates/viewer.html +0 -599
  294. package/skills/skills/brand-guidelines/LICENSE.txt +0 -202
  295. package/skills/skills/brand-guidelines/SKILL.md +0 -73
  296. package/skills/skills/canvas-design/LICENSE.txt +0 -202
  297. package/skills/skills/canvas-design/SKILL.md +0 -130
  298. package/skills/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +0 -93
  299. package/skills/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  300. package/skills/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  301. package/skills/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +0 -93
  302. package/skills/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  303. package/skills/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +0 -93
  304. package/skills/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  305. package/skills/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  306. package/skills/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +0 -93
  307. package/skills/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  308. package/skills/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  309. package/skills/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  310. package/skills/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +0 -93
  311. package/skills/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  312. package/skills/skills/canvas-design/canvas-fonts/DMMono-OFL.txt +0 -93
  313. package/skills/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  314. package/skills/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +0 -94
  315. package/skills/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  316. package/skills/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  317. package/skills/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +0 -93
  318. package/skills/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  319. package/skills/skills/canvas-design/canvas-fonts/Gloock-OFL.txt +0 -93
  320. package/skills/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  321. package/skills/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  322. package/skills/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +0 -93
  323. package/skills/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  324. package/skills/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  325. package/skills/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  326. package/skills/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  327. package/skills/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  328. package/skills/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  329. package/skills/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  330. package/skills/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  331. package/skills/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +0 -93
  332. package/skills/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  333. package/skills/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  334. package/skills/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  335. package/skills/skills/canvas-design/canvas-fonts/Italiana-OFL.txt +0 -93
  336. package/skills/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  337. package/skills/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  338. package/skills/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +0 -93
  339. package/skills/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  340. package/skills/skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  341. package/skills/skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  342. package/skills/skills/canvas-design/canvas-fonts/Jura-OFL.txt +0 -93
  343. package/skills/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +0 -93
  344. package/skills/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  345. package/skills/skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  346. package/skills/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  347. package/skills/skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  348. package/skills/skills/canvas-design/canvas-fonts/Lora-OFL.txt +0 -93
  349. package/skills/skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  350. package/skills/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  351. package/skills/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +0 -93
  352. package/skills/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  353. package/skills/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +0 -93
  354. package/skills/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  355. package/skills/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  356. package/skills/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +0 -93
  357. package/skills/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  358. package/skills/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  359. package/skills/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +0 -93
  360. package/skills/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +0 -93
  361. package/skills/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  362. package/skills/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  363. package/skills/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +0 -93
  364. package/skills/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  365. package/skills/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +0 -93
  366. package/skills/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  367. package/skills/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  368. package/skills/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +0 -93
  369. package/skills/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  370. package/skills/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +0 -93
  371. package/skills/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  372. package/skills/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  373. package/skills/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  374. package/skills/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  375. package/skills/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +0 -93
  376. package/skills/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  377. package/skills/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +0 -93
  378. package/skills/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
  379. package/skills/skills/doc-coauthoring/SKILL.md +0 -375
  380. package/skills/skills/docx/LICENSE.txt +0 -30
  381. package/skills/skills/docx/SKILL.md +0 -197
  382. package/skills/skills/docx/docx-js.md +0 -350
  383. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
  384. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
  385. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
  386. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
  387. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
  388. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
  389. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
  390. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
  391. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
  392. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
  393. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
  394. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
  395. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
  396. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
  397. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
  398. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
  399. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
  400. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
  401. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
  402. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
  403. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
  404. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
  405. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
  406. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
  407. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
  408. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
  409. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
  410. package/skills/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
  411. package/skills/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
  412. package/skills/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
  413. package/skills/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
  414. package/skills/skills/docx/ooxml/schemas/mce/mc.xsd +0 -75
  415. package/skills/skills/docx/ooxml/schemas/microsoft/wml-2010.xsd +0 -560
  416. package/skills/skills/docx/ooxml/schemas/microsoft/wml-2012.xsd +0 -67
  417. package/skills/skills/docx/ooxml/schemas/microsoft/wml-2018.xsd +0 -14
  418. package/skills/skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +0 -20
  419. package/skills/skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +0 -13
  420. package/skills/skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
  421. package/skills/skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +0 -8
  422. package/skills/skills/docx/ooxml/scripts/pack.py +0 -159
  423. package/skills/skills/docx/ooxml/scripts/unpack.py +0 -29
  424. package/skills/skills/docx/ooxml/scripts/validate.py +0 -69
  425. package/skills/skills/docx/ooxml/scripts/validation/__init__.py +0 -15
  426. package/skills/skills/docx/ooxml/scripts/validation/base.py +0 -951
  427. package/skills/skills/docx/ooxml/scripts/validation/docx.py +0 -274
  428. package/skills/skills/docx/ooxml/scripts/validation/pptx.py +0 -315
  429. package/skills/skills/docx/ooxml/scripts/validation/redlining.py +0 -279
  430. package/skills/skills/docx/ooxml.md +0 -610
  431. package/skills/skills/docx/scripts/__init__.py +0 -1
  432. package/skills/skills/docx/scripts/document.py +0 -1276
  433. package/skills/skills/docx/scripts/templates/comments.xml +0 -3
  434. package/skills/skills/docx/scripts/templates/commentsExtended.xml +0 -3
  435. package/skills/skills/docx/scripts/templates/commentsExtensible.xml +0 -3
  436. package/skills/skills/docx/scripts/templates/commentsIds.xml +0 -3
  437. package/skills/skills/docx/scripts/templates/people.xml +0 -3
  438. package/skills/skills/docx/scripts/utilities.py +0 -374
  439. package/skills/skills/frontend-design/LICENSE.txt +0 -177
  440. package/skills/skills/frontend-design/SKILL.md +0 -42
  441. package/skills/skills/internal-comms/LICENSE.txt +0 -202
  442. package/skills/skills/internal-comms/SKILL.md +0 -32
  443. package/skills/skills/internal-comms/examples/3p-updates.md +0 -47
  444. package/skills/skills/internal-comms/examples/company-newsletter.md +0 -65
  445. package/skills/skills/internal-comms/examples/faq-answers.md +0 -30
  446. package/skills/skills/internal-comms/examples/general-comms.md +0 -16
  447. package/skills/skills/mcp-builder/LICENSE.txt +0 -202
  448. package/skills/skills/mcp-builder/SKILL.md +0 -236
  449. package/skills/skills/mcp-builder/reference/evaluation.md +0 -602
  450. package/skills/skills/mcp-builder/reference/mcp_best_practices.md +0 -249
  451. package/skills/skills/mcp-builder/reference/node_mcp_server.md +0 -970
  452. package/skills/skills/mcp-builder/reference/python_mcp_server.md +0 -719
  453. package/skills/skills/mcp-builder/scripts/connections.py +0 -151
  454. package/skills/skills/mcp-builder/scripts/evaluation.py +0 -373
  455. package/skills/skills/mcp-builder/scripts/example_evaluation.xml +0 -22
  456. package/skills/skills/mcp-builder/scripts/requirements.txt +0 -2
  457. package/skills/skills/pdf/LICENSE.txt +0 -30
  458. package/skills/skills/pdf/SKILL.md +0 -294
  459. package/skills/skills/pdf/forms.md +0 -205
  460. package/skills/skills/pdf/reference.md +0 -612
  461. package/skills/skills/pdf/scripts/check_bounding_boxes.py +0 -70
  462. package/skills/skills/pdf/scripts/check_bounding_boxes_test.py +0 -226
  463. package/skills/skills/pdf/scripts/check_fillable_fields.py +0 -12
  464. package/skills/skills/pdf/scripts/convert_pdf_to_images.py +0 -35
  465. package/skills/skills/pdf/scripts/create_validation_image.py +0 -41
  466. package/skills/skills/pdf/scripts/extract_form_field_info.py +0 -152
  467. package/skills/skills/pdf/scripts/fill_fillable_fields.py +0 -114
  468. package/skills/skills/pdf/scripts/fill_pdf_form_with_annotations.py +0 -108
  469. package/skills/skills/pptx/LICENSE.txt +0 -30
  470. package/skills/skills/pptx/SKILL.md +0 -484
  471. package/skills/skills/pptx/html2pptx.md +0 -625
  472. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
  473. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
  474. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
  475. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
  476. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
  477. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
  478. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
  479. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
  480. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
  481. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
  482. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
  483. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
  484. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
  485. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
  486. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
  487. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
  488. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
  489. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
  490. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
  491. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
  492. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
  493. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
  494. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
  495. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
  496. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
  497. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
  498. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
  499. package/skills/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
  500. package/skills/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
  501. package/skills/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
  502. package/skills/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
  503. package/skills/skills/pptx/ooxml/schemas/mce/mc.xsd +0 -75
  504. package/skills/skills/pptx/ooxml/schemas/microsoft/wml-2010.xsd +0 -560
  505. package/skills/skills/pptx/ooxml/schemas/microsoft/wml-2012.xsd +0 -67
  506. package/skills/skills/pptx/ooxml/schemas/microsoft/wml-2018.xsd +0 -14
  507. package/skills/skills/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +0 -20
  508. package/skills/skills/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +0 -13
  509. package/skills/skills/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
  510. package/skills/skills/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +0 -8
  511. package/skills/skills/pptx/ooxml/scripts/pack.py +0 -159
  512. package/skills/skills/pptx/ooxml/scripts/unpack.py +0 -29
  513. package/skills/skills/pptx/ooxml/scripts/validate.py +0 -69
  514. package/skills/skills/pptx/ooxml/scripts/validation/__init__.py +0 -15
  515. package/skills/skills/pptx/ooxml/scripts/validation/base.py +0 -951
  516. package/skills/skills/pptx/ooxml/scripts/validation/docx.py +0 -274
  517. package/skills/skills/pptx/ooxml/scripts/validation/pptx.py +0 -315
  518. package/skills/skills/pptx/ooxml/scripts/validation/redlining.py +0 -279
  519. package/skills/skills/pptx/ooxml.md +0 -427
  520. package/skills/skills/pptx/scripts/html2pptx.js +0 -979
  521. package/skills/skills/pptx/scripts/inventory.py +0 -1020
  522. package/skills/skills/pptx/scripts/rearrange.py +0 -231
  523. package/skills/skills/pptx/scripts/replace.py +0 -385
  524. package/skills/skills/pptx/scripts/thumbnail.py +0 -450
  525. package/skills/skills/skill-creator/LICENSE.txt +0 -202
  526. package/skills/skills/skill-creator/SKILL.md +0 -356
  527. package/skills/skills/skill-creator/references/output-patterns.md +0 -82
  528. package/skills/skills/skill-creator/references/workflows.md +0 -28
  529. package/skills/skills/skill-creator/scripts/init_skill.py +0 -303
  530. package/skills/skills/skill-creator/scripts/package_skill.py +0 -110
  531. package/skills/skills/skill-creator/scripts/quick_validate.py +0 -95
  532. package/skills/skills/slack-gif-creator/LICENSE.txt +0 -202
  533. package/skills/skills/slack-gif-creator/SKILL.md +0 -254
  534. package/skills/skills/slack-gif-creator/core/easing.py +0 -234
  535. package/skills/skills/slack-gif-creator/core/frame_composer.py +0 -176
  536. package/skills/skills/slack-gif-creator/core/gif_builder.py +0 -269
  537. package/skills/skills/slack-gif-creator/core/validators.py +0 -136
  538. package/skills/skills/slack-gif-creator/requirements.txt +0 -4
  539. package/skills/skills/theme-factory/LICENSE.txt +0 -202
  540. package/skills/skills/theme-factory/SKILL.md +0 -59
  541. package/skills/skills/theme-factory/theme-showcase.pdf +0 -0
  542. package/skills/skills/theme-factory/themes/arctic-frost.md +0 -19
  543. package/skills/skills/theme-factory/themes/botanical-garden.md +0 -19
  544. package/skills/skills/theme-factory/themes/desert-rose.md +0 -19
  545. package/skills/skills/theme-factory/themes/forest-canopy.md +0 -19
  546. package/skills/skills/theme-factory/themes/golden-hour.md +0 -19
  547. package/skills/skills/theme-factory/themes/midnight-galaxy.md +0 -19
  548. package/skills/skills/theme-factory/themes/modern-minimalist.md +0 -19
  549. package/skills/skills/theme-factory/themes/ocean-depths.md +0 -19
  550. package/skills/skills/theme-factory/themes/sunset-boulevard.md +0 -19
  551. package/skills/skills/theme-factory/themes/tech-innovation.md +0 -19
  552. package/skills/skills/web-artifacts-builder/LICENSE.txt +0 -202
  553. package/skills/skills/web-artifacts-builder/SKILL.md +0 -74
  554. package/skills/skills/web-artifacts-builder/scripts/bundle-artifact.sh +0 -54
  555. package/skills/skills/web-artifacts-builder/scripts/init-artifact.sh +0 -322
  556. package/skills/skills/webapp-testing/LICENSE.txt +0 -202
  557. package/skills/skills/webapp-testing/SKILL.md +0 -96
  558. package/skills/skills/webapp-testing/examples/console_logging.py +0 -35
  559. package/skills/skills/webapp-testing/examples/element_discovery.py +0 -40
  560. package/skills/skills/webapp-testing/examples/static_html_automation.py +0 -33
  561. package/skills/skills/webapp-testing/scripts/with_server.py +0 -106
  562. package/skills/skills/xlsx/LICENSE.txt +0 -30
  563. package/skills/skills/xlsx/SKILL.md +0 -289
  564. package/skills/skills/xlsx/recalc.py +0 -178
  565. package/skills/spec/agent-skills-spec.md +0 -3
  566. package/skills/template/SKILL.md +0 -6
  567. package/src/ai-client.ts +0 -1560
  568. package/src/remote-ai-client.ts +0 -664
package/dist/cli.js CHANGED
@@ -1,8 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import { Command } from 'commander';
3
+ import { confirm } from '@clack/prompts';
3
4
  import { startInteractiveSession } from './session.js';
4
5
  import { getConfigManager } from './config.js';
5
6
  import { AuthService, selectAuthType } from './auth.js';
7
+ import { AuthType } from './types.js';
8
+ import { fetchDefaultModels } from './ai-client/providers/remote.js';
6
9
  import { getAgentManager } from './agents.js';
7
10
  import { getMCPManager } from './mcp.js';
8
11
  import { getLogger, setConfigProvider } from './logger.js';
@@ -15,6 +18,23 @@ import { fileURLToPath } from 'url';
15
18
  // Get current directory
16
19
  const __filename = fileURLToPath(import.meta.url);
17
20
  const __dirname = dirname(__filename);
21
+ // State file for skill updates (used to notify running xAgent)
22
+ const SKILL_STATE_FILE = '.skill-state.json';
23
+ function getSkillStateFilePath(userSkillsPath) {
24
+ return path.join(userSkillsPath, SKILL_STATE_FILE);
25
+ }
26
+ async function notifySkillUpdate(userSkillsPath) {
27
+ try {
28
+ const stateFilePath = getSkillStateFilePath(userSkillsPath);
29
+ const timestamp = Date.now();
30
+ const state = { lastSkillUpdate: timestamp };
31
+ await fs.writeFile(stateFilePath, JSON.stringify(state, null, 2), 'utf-8');
32
+ console.log(colors.textMuted(' ℹ️ Skills updated for running xAgent sessions'));
33
+ }
34
+ catch (error) {
35
+ // Silent fail - notification is optional
36
+ }
37
+ }
18
38
  // Read package.json
19
39
  const packageJsonPath = join(__dirname, '../package.json');
20
40
  const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
@@ -82,12 +102,39 @@ function formatError(error) {
82
102
  suggestion: 'The configuration file may be corrupted. Please check the file content.'
83
103
  };
84
104
  }
105
+ // User cancellation - no suggestion needed
106
+ if (errorMessage.includes('cancelled by user') || errorMessage.includes('Operation cancelled')) {
107
+ return {
108
+ message: 'Operation cancelled',
109
+ suggestion: ''
110
+ };
111
+ }
85
112
  // Default friendly message
86
113
  return {
87
114
  message: 'An error occurred',
88
115
  suggestion: 'Please try again. If the problem persists, check your configuration.'
89
116
  };
90
117
  }
118
+ /**
119
+ * Recursively copy a directory
120
+ */
121
+ async function copyDirectory(src, dest) {
122
+ const entries = await fs.readdir(src, { withFileTypes: true });
123
+ await fs.mkdir(dest, { recursive: true });
124
+ for (const entry of entries) {
125
+ // Skip node_modules to keep dependencies isolated
126
+ // if (entry.name === 'node_modules') continue;
127
+ const srcPath = path.join(src, entry.name);
128
+ const destPath = path.join(dest, entry.name);
129
+ if (entry.isDirectory()) {
130
+ await copyDirectory(srcPath, destPath);
131
+ }
132
+ else if (entry.isFile()) {
133
+ await fs.copyFile(srcPath, destPath);
134
+ }
135
+ // Skip symbolic links for simplicity
136
+ }
137
+ }
91
138
  program
92
139
  .name('xagent')
93
140
  .description('AI-powered command-line assistant')
@@ -111,7 +158,7 @@ program
111
158
  process.exit(1);
112
159
  }
113
160
  configManager.setApprovalMode(options.approvalMode);
114
- await configManager.save('global');
161
+ configManager.save('global');
115
162
  console.log('');
116
163
  console.log(colors.success(`✅ Approval mode set to: ${options.approvalMode}`));
117
164
  console.log('');
@@ -130,16 +177,48 @@ program
130
177
  const authType = await selectAuthType();
131
178
  const configManager = getConfigManager();
132
179
  configManager.set('selectedAuthType', authType);
180
+ // Get xagentApiBaseUrl from config (respects XAGENT_BASE_URL env var)
181
+ const config = configManager.getAuthConfig();
133
182
  const authService = new AuthService({
134
183
  type: authType,
135
184
  apiKey: '',
136
185
  baseUrl: '',
137
- modelName: ''
186
+ modelName: '',
187
+ xagentApiBaseUrl: config.xagentApiBaseUrl
138
188
  });
139
189
  const success = await authService.authenticate();
140
190
  if (success) {
141
191
  const authConfig = authService.getAuthConfig();
142
- await configManager.setAuthConfig(authConfig);
192
+ // Clear modelName for remote mode
193
+ if (authType === AuthType.OAUTH_XAGENT) {
194
+ authConfig.modelName = '';
195
+ }
196
+ configManager.setAuthConfig(authConfig);
197
+ // Set default remote model settings if not already set
198
+ if (authType === AuthType.OAUTH_XAGENT) {
199
+ const webBaseUrl = authConfig.xagentApiBaseUrl || 'https://www.xagent-colife.net';
200
+ let defaultLlmName = '';
201
+ let defaultVlmName = '';
202
+ try {
203
+ console.log(colors.textMuted(' Fetching default models from remote server...'));
204
+ const defaults = await fetchDefaultModels(authConfig.apiKey || '', webBaseUrl);
205
+ if (defaults.llm?.name) {
206
+ defaultLlmName = defaults.llm.name;
207
+ console.log(colors.textMuted(` Default LLM: ${defaults.llm.displayName || defaultLlmName}`));
208
+ }
209
+ if (defaults.vlm?.name) {
210
+ defaultVlmName = defaults.vlm.name;
211
+ console.log(colors.textMuted(` Default VLM: ${defaults.vlm.displayName || defaultVlmName}`));
212
+ }
213
+ }
214
+ catch (error) {
215
+ console.log(colors.textMuted(` ⚠️ Failed to fetch default models: ${error.message}`));
216
+ console.log(colors.textMuted(' ⚠️ Use /model command to select models manually.'));
217
+ }
218
+ configManager.set('remote_llmModelName', defaultLlmName);
219
+ configManager.set('remote_vlmModelName', defaultVlmName);
220
+ configManager.save('global');
221
+ }
143
222
  console.log('');
144
223
  console.log(colors.success('Authentication configured successfully!'));
145
224
  console.log(colors.textMuted('You can now run "xagent start" to begin'));
@@ -215,9 +294,16 @@ program
215
294
  .command('mcp')
216
295
  .description('Add, list, or remove MCP servers')
217
296
  .option('-l, --list', 'List all MCP servers')
218
- .option('-a, --add <name>', 'Add a new MCP server')
297
+ .option('-a, --add [name]', 'Add a new MCP server (interactive if no name provided)')
219
298
  .option('-r, --remove <name>', 'Remove an MCP server')
220
299
  .option('--scope <scope>', 'Scope (global or project)', 'global')
300
+ .option('-t, --transport <type>', 'Transport type: stdio, http')
301
+ .option('-c, --command <cmd>', 'Command for stdio transport')
302
+ .option('--args <args>', 'Arguments for stdio transport (comma-separated)')
303
+ .option('-u, --url <url>', 'URL for HTTP transport')
304
+ .option('-k, --token <token>', 'Authentication token (Bearer)')
305
+ .option('--header <headers>', 'Custom headers (can be used multiple times)')
306
+ .option('-y, --yes', 'Skip confirmation')
221
307
  .action(async (options) => {
222
308
  const configManager = getConfigManager(process.cwd());
223
309
  const mcpManager = getMCPManager();
@@ -226,7 +312,7 @@ program
226
312
  if (servers.length === 0) {
227
313
  console.log('');
228
314
  console.log(colors.warning('No MCP servers configured'));
229
- console.log(colors.textMuted('Use /mcp add in interactive mode to add servers'));
315
+ console.log(colors.textMuted('Use "xagent mcp --add" to add servers'));
230
316
  console.log('');
231
317
  }
232
318
  else {
@@ -245,18 +331,271 @@ program
245
331
  });
246
332
  }
247
333
  }
248
- else if (options.add) {
249
- console.log('');
250
- console.log(colors.warning('MCP server addition not implemented yet'));
251
- console.log(colors.textMuted('Use /mcp add in interactive mode'));
252
- console.log('');
334
+ else if (options.add !== undefined) {
335
+ // Check if running in non-interactive mode (transport and required params provided)
336
+ const hasTransport = options.transport;
337
+ const hasCommand = options.command;
338
+ const hasUrl = options.url;
339
+ const isNonInteractive = hasTransport && (hasCommand || hasUrl);
340
+ if (isNonInteractive) {
341
+ // Non-interactive mode: use command line arguments
342
+ const name = options.add || `mcp-${options.transport}-${Date.now().toString(36)}`;
343
+ const transport = options.transport;
344
+ const config = {
345
+ transport: transport,
346
+ };
347
+ if (transport === 'stdio') {
348
+ if (!options.command) {
349
+ console.log('');
350
+ console.log(colors.error('Error: --command is required for stdio transport'));
351
+ console.log('');
352
+ process.exit(1);
353
+ }
354
+ config.command = options.command;
355
+ if (options.args) {
356
+ config.args = options.args.split(',').map((a) => a.trim());
357
+ }
358
+ }
359
+ else if (transport === 'http') {
360
+ if (!options.url) {
361
+ console.log('');
362
+ console.log(colors.error('Error: --url is required for http transport'));
363
+ console.log('');
364
+ process.exit(1);
365
+ }
366
+ config.url = options.url;
367
+ if (options.token) {
368
+ config.authToken = options.token;
369
+ }
370
+ // Handle multiple --header flags
371
+ if (options.header) {
372
+ const headers = {};
373
+ const headerArray = Array.isArray(options.header) ? options.header : [options.header];
374
+ for (const h of headerArray) {
375
+ const colonIndex = h.indexOf(':');
376
+ if (colonIndex > 0) {
377
+ const key = h.substring(0, colonIndex).trim();
378
+ const value = h.substring(colonIndex + 1).trim();
379
+ headers[key] = value;
380
+ }
381
+ }
382
+ if (Object.keys(headers).length > 0) {
383
+ config.headers = headers;
384
+ }
385
+ }
386
+ }
387
+ else {
388
+ console.log('');
389
+ console.log(colors.error(`Error: Unknown transport type: ${transport}`));
390
+ console.log(colors.textMuted('Valid types: stdio, http'));
391
+ console.log('');
392
+ process.exit(1);
393
+ }
394
+ // Skip confirmation in non-interactive mode
395
+ if (!options.yes) {
396
+ console.log('');
397
+ console.log(colors.textMuted('Server configuration:'));
398
+ console.log(` ${colors.primaryBright('Name:')} ${name}`);
399
+ console.log(` ${colors.primaryBright('Transport:')} ${config.transport}`);
400
+ if (config.command) {
401
+ console.log(` ${colors.primaryBright('Command:')} ${config.command} ${(config.args || []).join(' ')}`);
402
+ }
403
+ if (config.url) {
404
+ console.log(` ${colors.primaryBright('URL:')} ${config.url}`);
405
+ if (config.authToken) {
406
+ console.log(` ${colors.primaryBright('Token:')} [hidden]`);
407
+ }
408
+ }
409
+ console.log('');
410
+ }
411
+ try {
412
+ // Save to config
413
+ configManager.addMcpServer(name, config);
414
+ configManager.save(options.scope);
415
+ // Register with MCP manager
416
+ mcpManager.registerServer(name, config);
417
+ // Try to connect
418
+ let connected = false;
419
+ try {
420
+ await mcpManager.connectServer(name);
421
+ connected = true;
422
+ }
423
+ catch (error) {
424
+ console.log(colors.textMuted(` ⚠️ Connection failed: ${error.message}`));
425
+ console.log(colors.textMuted(' The server is saved but not connected.'));
426
+ }
427
+ if (connected) {
428
+ console.log('');
429
+ console.log(colors.success(`✅ MCP server '${name}' added and connected successfully`));
430
+ }
431
+ else {
432
+ console.log('');
433
+ console.log(colors.success(`✅ MCP server '${name}' added successfully`));
434
+ }
435
+ console.log('');
436
+ }
437
+ catch (error) {
438
+ console.log('');
439
+ console.log(colors.error(`Failed to add MCP server: ${error.message}`));
440
+ console.log('');
441
+ }
442
+ }
443
+ else {
444
+ // Interactive mode
445
+ const { text, select, confirm } = await import('@clack/prompts');
446
+ const separator = icons.separator.repeat(40);
447
+ console.log('');
448
+ console.log(colors.primaryBright(`${icons.tool} Add MCP Server`));
449
+ console.log(colors.border(separator));
450
+ console.log('');
451
+ // Step 1: Enter server name
452
+ let name = options.add;
453
+ if (!name) {
454
+ name = await text({
455
+ message: 'Enter MCP server name:',
456
+ validate: (value) => {
457
+ if (!value || !value.trim()) {
458
+ return 'Server name is required';
459
+ }
460
+ if (!/^[a-zA-Z0-9_-]+$/.test(value)) {
461
+ return 'Server name must contain only alphanumeric characters, hyphens, and underscores';
462
+ }
463
+ return undefined;
464
+ },
465
+ });
466
+ }
467
+ // Step 2: Select transport type
468
+ const transport = await select({
469
+ message: 'Select transport type:',
470
+ options: [
471
+ { value: 'stdio', label: 'Stdio (stdin/stdout)' },
472
+ { value: 'http', label: 'HTTP (Streamable HTTP)' },
473
+ ],
474
+ });
475
+ if (typeof transport === 'symbol') {
476
+ console.log('');
477
+ console.log(colors.textMuted('Cancelled'));
478
+ console.log('');
479
+ return;
480
+ }
481
+ const config = {
482
+ transport: transport,
483
+ };
484
+ if (transport === 'stdio') {
485
+ // Step 3: Enter command
486
+ config.command = await text({
487
+ message: 'Enter command (for stdio transport):',
488
+ validate: (value) => value && value.trim() ? undefined : 'Command is required',
489
+ });
490
+ // Step 4: Enter arguments
491
+ const argsInput = await text({
492
+ message: 'Enter arguments (comma-separated, for stdio transport):',
493
+ defaultValue: '',
494
+ });
495
+ if (argsInput.trim()) {
496
+ config.args = argsInput.split(',').map((a) => a.trim());
497
+ }
498
+ }
499
+ else {
500
+ // Step 3: Enter URL
501
+ let url = '';
502
+ while (!url) {
503
+ url = await text({
504
+ message: 'Enter server URL (for HTTP transport):',
505
+ validate: (value) => {
506
+ if (!value || !value.trim()) {
507
+ return 'URL is required';
508
+ }
509
+ try {
510
+ new URL(value);
511
+ return undefined;
512
+ }
513
+ catch {
514
+ return 'Invalid URL format (e.g., https://example.com)';
515
+ }
516
+ },
517
+ });
518
+ }
519
+ config.url = url;
520
+ // Step 4: Enter auth token (optional)
521
+ config.authToken = await text({
522
+ message: 'Enter Bearer token (optional):',
523
+ defaultValue: '',
524
+ });
525
+ // Step 5: Enter custom headers (optional)
526
+ const headersInput = await text({
527
+ message: 'Enter custom headers as JSON (optional):',
528
+ defaultValue: '',
529
+ });
530
+ if (headersInput.trim()) {
531
+ try {
532
+ config.headers = JSON.parse(headersInput);
533
+ }
534
+ catch {
535
+ // Ignore invalid JSON
536
+ }
537
+ }
538
+ }
539
+ // Step 6: Confirm and save
540
+ console.log('');
541
+ console.log(colors.textMuted('Server configuration:'));
542
+ console.log(` ${colors.primaryBright('Name:')} ${name}`);
543
+ console.log(` ${colors.primaryBright('Transport:')} ${config.transport}`);
544
+ if (config.command) {
545
+ console.log(` ${colors.primaryBright('Command:')} ${config.command} ${(config.args || []).join(' ')}`);
546
+ }
547
+ if (config.url) {
548
+ console.log(` ${colors.primaryBright('URL:')} ${config.url}`);
549
+ }
550
+ console.log('');
551
+ const shouldSave = await confirm({
552
+ message: 'Save this MCP server configuration?',
553
+ });
554
+ if (typeof shouldSave === 'symbol' || !shouldSave) {
555
+ console.log('');
556
+ console.log(colors.textMuted('Cancelled'));
557
+ console.log('');
558
+ return;
559
+ }
560
+ try {
561
+ // Save to config
562
+ configManager.addMcpServer(name, config);
563
+ configManager.save(options.scope);
564
+ // Register with MCP manager
565
+ mcpManager.registerServer(name, config);
566
+ // Try to connect
567
+ let connected = false;
568
+ try {
569
+ await mcpManager.connectServer(name);
570
+ connected = true;
571
+ }
572
+ catch (error) {
573
+ console.log(colors.textMuted(` ⚠️ Connection failed: ${error.message}`));
574
+ console.log(colors.textMuted(' The server is saved but not connected. Use "/mcp refresh" in interactive mode to retry.'));
575
+ }
576
+ if (connected) {
577
+ console.log('');
578
+ console.log(colors.success(`✅ MCP server '${name}' added and connected successfully`));
579
+ }
580
+ else {
581
+ console.log('');
582
+ console.log(colors.success(`✅ MCP server '${name}' added successfully (not connected)`));
583
+ }
584
+ console.log('');
585
+ }
586
+ catch (error) {
587
+ console.log('');
588
+ console.log(colors.error(`Failed to add MCP server: ${error.message}`));
589
+ console.log('');
590
+ }
591
+ }
253
592
  }
254
593
  else if (options.remove) {
255
594
  try {
256
595
  mcpManager.disconnectServer(options.remove);
257
596
  const mcpServers = configManager.getMcpServers();
258
597
  delete mcpServers[options.remove];
259
- await configManager.save(options.scope);
598
+ configManager.save(options.scope);
260
599
  console.log('');
261
600
  console.log(colors.success(`MCP server ${options.remove} removed successfully`));
262
601
  console.log('');
@@ -273,6 +612,23 @@ program
273
612
  console.log('');
274
613
  console.log(colors.warning('Please specify an action: --list, --add, or --remove'));
275
614
  console.log('');
615
+ console.log(colors.textMuted('Usage:'));
616
+ console.log(` ${colors.primaryBright('xagent mcp --list')} ${colors.textMuted('| List all MCP servers')}`);
617
+ console.log(` ${colors.primaryBright('xagent mcp --add')} ${colors.textMuted('| Add MCP server (interactive)')}`);
618
+ console.log('');
619
+ console.log(colors.textMuted('Non-interactive examples:'));
620
+ console.log(` ${colors.primaryBright('xagent mcp --add -t stdio -c "npx" --args "-y,@modelcontextprotocol/server-github"')}`);
621
+ console.log(` ${colors.primaryBright('xagent mcp --add -t http -u "https://example.com/mcp" -k "token"')}`);
622
+ console.log('');
623
+ console.log(colors.textMuted('Options:'));
624
+ console.log(` ${colors.primaryBright('-t, --transport')} ${colors.textMuted('Transport: stdio or http')}`);
625
+ console.log(` ${colors.primaryBright('-c, --command')} ${colors.textMuted('Command for stdio transport')}`);
626
+ console.log(` ${colors.primaryBright('--args')} ${colors.textMuted('Arguments (comma-separated)')}`);
627
+ console.log(` ${colors.primaryBright('-u, --url')} ${colors.textMuted('URL for HTTP transport')}`);
628
+ console.log(` ${colors.primaryBright('-k, --token')} ${colors.textMuted('Bearer authentication token')}`);
629
+ console.log(` ${colors.primaryBright('--header')} ${colors.textMuted('Custom header (key:value)')}`);
630
+ console.log(` ${colors.primaryBright('-y, --yes')} ${colors.textMuted('Skip confirmation')}`);
631
+ console.log('');
276
632
  }
277
633
  });
278
634
  program
@@ -370,6 +726,213 @@ program
370
726
  console.log('');
371
727
  }
372
728
  });
729
+ program
730
+ .command('skill')
731
+ .description('Manage skills')
732
+ .option('-l, --list', 'List all installed user skills')
733
+ .option('--add <source>', 'Install a skill (auto-detects local path or remote URL)')
734
+ .option('-r, --remove <skill-id>', 'Remove a user-installed skill')
735
+ .action(async (options) => {
736
+ const { getConfigManager } = await import('./config.js');
737
+ const configManager = getConfigManager();
738
+ const { promises: fs } = await import('fs');
739
+ const pathModule = await import('path');
740
+ const { exec, spawn } = await import('child_process');
741
+ const { promisify } = await import('util');
742
+ const os = await import('os');
743
+ const execAsync = promisify(exec);
744
+ const userSkillsPath = configManager.getUserSkillsPath() || pathModule.join(os.homedir(), '.xagent', 'skills');
745
+ const userNodeModulesPath = configManager.getUserNodeModulesPath() || pathModule.join(os.homedir(), '.xagent', 'node_modules');
746
+ if (options.add) {
747
+ const separator = icons.separator.repeat(40);
748
+ console.log('');
749
+ console.log(colors.primaryBright(`${icons.tool} Install Skill`));
750
+ console.log(colors.border(separator));
751
+ console.log('');
752
+ const source = options.add.trim();
753
+ const { installSkill } = await import('./skill-installer.js');
754
+ const { parseSource } = await import('./skill-installer.js');
755
+ // Auto-detect if source is local or remote
756
+ const parsed = parseSource(source);
757
+ const isLocal = parsed.type === 'local';
758
+ if (isLocal) {
759
+ // Local installation
760
+ const sourcePath = pathModule.resolve(source);
761
+ const skillName = pathModule.basename(sourcePath);
762
+ const destPath = pathModule.join(userSkillsPath, skillName);
763
+ try {
764
+ // Check if source exists
765
+ await fs.access(sourcePath);
766
+ // Check if SKILL.md exists
767
+ const skillMdPath = pathModule.join(sourcePath, 'SKILL.md');
768
+ try {
769
+ await fs.access(skillMdPath);
770
+ }
771
+ catch {
772
+ console.log(colors.error(`SKILL.md not found in ${sourcePath}`));
773
+ console.log(colors.textMuted('Each skill must have a SKILL.md file'));
774
+ console.log('');
775
+ process.exit(1);
776
+ }
777
+ // Check if skill already exists in user skills path
778
+ try {
779
+ await fs.access(destPath);
780
+ console.log(colors.warning(`Skill "${skillName}" already installed`));
781
+ console.log(colors.textMuted(`Use "xagent skill -r ${skillName}" to remove it first`));
782
+ console.log('');
783
+ process.exit(1);
784
+ }
785
+ catch {
786
+ // Doesn't exist, proceed
787
+ }
788
+ // Ensure user skills directory exists
789
+ await fs.mkdir(userSkillsPath, { recursive: true });
790
+ // Copy the skill
791
+ await copyDirectory(sourcePath, destPath);
792
+ console.log('');
793
+ console.log(colors.success(`✅ Skill "${skillName}" installed successfully`));
794
+ console.log(colors.textMuted(` Location: ${destPath}`));
795
+ console.log(colors.textMuted(` Type: Local`));
796
+ console.log('');
797
+ // Notify running xAgent to update system prompt
798
+ await notifySkillUpdate(userSkillsPath);
799
+ console.log('');
800
+ }
801
+ catch (error) {
802
+ const { message, suggestion } = formatError(error);
803
+ console.log(colors.error(`Failed to install skill: ${message}`));
804
+ console.log(colors.textMuted(suggestion));
805
+ console.log('');
806
+ process.exit(1);
807
+ }
808
+ }
809
+ else {
810
+ // Remote installation
811
+ console.log(colors.textMuted(` Source: ${source}`));
812
+ console.log(colors.textMuted(` Type: Remote`));
813
+ console.log('');
814
+ try {
815
+ const result = await installSkill(source);
816
+ if (result.success) {
817
+ console.log(colors.success(`✅ Skill "${result.skillName}" installed successfully`));
818
+ console.log(colors.textMuted(` Location: ${result.skillPath}`));
819
+ console.log('');
820
+ // Notify running xAgent to update system prompt
821
+ await notifySkillUpdate(userSkillsPath);
822
+ console.log(colors.textMuted('Note: Run "xagent start" to use the new skill'));
823
+ console.log('');
824
+ }
825
+ else {
826
+ console.log(colors.error(`Failed to install skill: ${result.error}`));
827
+ console.log('');
828
+ process.exit(1);
829
+ }
830
+ }
831
+ catch (error) {
832
+ const { message, suggestion } = formatError(error);
833
+ console.log(colors.error(`Failed to install skill: ${message}`));
834
+ console.log(colors.textMuted(suggestion));
835
+ console.log('');
836
+ process.exit(1);
837
+ }
838
+ }
839
+ }
840
+ else if (options.list) {
841
+ const separator = icons.separator.repeat(40);
842
+ console.log('');
843
+ console.log(colors.primaryBright(`${icons.tool} Skills`));
844
+ console.log(colors.border(separator));
845
+ console.log('');
846
+ try {
847
+ const entries = await fs.readdir(userSkillsPath, { withFileTypes: true });
848
+ const skills = entries.filter(e => e.isDirectory());
849
+ if (skills.length === 0) {
850
+ console.log(colors.textMuted('No user skills installed'));
851
+ console.log('');
852
+ return;
853
+ }
854
+ for (const skill of skills) {
855
+ const skillPath = path.join(userSkillsPath, skill.name);
856
+ const skillMdPath = path.join(skillPath, 'SKILL.md');
857
+ try {
858
+ const content = await fs.readFile(skillMdPath, 'utf-8');
859
+ // Simple parsing for name and description
860
+ const nameMatch = content.match(/^name:\s*(.+)$/m);
861
+ const descMatch = content.match(/^description:\s*(.+)$/m);
862
+ const name = nameMatch ? nameMatch[1].trim() : skill.name;
863
+ const description = descMatch ? descMatch[1].trim() : 'No description';
864
+ console.log(` ${colors.primaryBright(`• ${name}`)}`);
865
+ console.log(` ${colors.textDim(` ${description}`)}`);
866
+ console.log('');
867
+ }
868
+ catch {
869
+ console.log(` ${colors.primaryBright(`• ${skill.name}`)}`);
870
+ console.log(` ${colors.textDim(` (Missing SKILL.md)`)}`);
871
+ console.log('');
872
+ }
873
+ }
874
+ console.log(colors.textMuted(`Skills directory: ${userSkillsPath}`));
875
+ console.log('');
876
+ }
877
+ catch (error) {
878
+ console.log(colors.textMuted('No user skills installed'));
879
+ console.log('');
880
+ }
881
+ }
882
+ else if (options.remove) {
883
+ const skillPath = path.join(userSkillsPath, options.remove);
884
+ // Protect find-skills from deletion
885
+ if (options.remove === 'find-skills') {
886
+ console.log('');
887
+ console.log(colors.error(`Cannot remove protected skill: find-skills`));
888
+ console.log(colors.textMuted('find-skills is a built-in skill that helps you discover and install other skills.'));
889
+ console.log('');
890
+ process.exit(1);
891
+ }
892
+ try {
893
+ await fs.access(skillPath);
894
+ // Verify it's in user skills path (not built-in)
895
+ if (!skillPath.startsWith(userSkillsPath)) {
896
+ console.log('');
897
+ console.log(colors.error(`Cannot remove skill outside user directory: ${options.remove}`));
898
+ console.log('');
899
+ process.exit(1);
900
+ }
901
+ // Remove the skill directory
902
+ await fs.rm(skillPath, { recursive: true, force: true });
903
+ console.log('');
904
+ console.log(colors.success(`✅ Skill ${options.remove} removed successfully`));
905
+ console.log('');
906
+ // Notify running xAgent to update system prompt
907
+ await notifySkillUpdate(userSkillsPath);
908
+ console.log('');
909
+ }
910
+ catch (error) {
911
+ console.log('');
912
+ console.log(colors.error(`Skill not found: ${options.remove}`));
913
+ console.log('');
914
+ process.exit(1);
915
+ }
916
+ }
917
+ else {
918
+ // Show help
919
+ console.log('');
920
+ console.log(colors.textMuted('Usage:'));
921
+ console.log(` ${colors.primaryBright('xagent skill -l')} ${colors.textDim('| List all skills')}`);
922
+ console.log(` ${colors.primaryBright('xagent skill --add <source>')} ${colors.textDim('| Install skill (auto-detects local or remote)')}`);
923
+ console.log(` ${colors.primaryBright('xagent skill -r <name>')} ${colors.textDim('| Remove a skill')}`);
924
+ console.log('');
925
+ console.log(colors.textMuted('Examples:'));
926
+ console.log(` ${colors.primaryBright('xagent skill --add ./my-skill')} ${colors.textDim('| Install from local path')}`);
927
+ console.log(` ${colors.primaryBright('xagent skill --add owner/repo')} ${colors.textDim('| Install from GitHub')}`);
928
+ console.log(` ${colors.primaryBright('xagent skill --add https://github.com/owner/repo')}`);
929
+ console.log(` ${colors.primaryBright('xagent skill --add https://docs.example.com/skill.md')}`);
930
+ console.log('');
931
+ console.log(colors.textMuted('To install a new skill, use the interactive command:'));
932
+ console.log(` ${colors.primaryBright('/skill add')}`);
933
+ console.log('');
934
+ }
935
+ });
373
936
  program
374
937
  .command('version')
375
938
  .description('Display version and check for updates')
@@ -433,11 +996,14 @@ program
433
996
  console.log('');
434
997
  }
435
998
  const { createGUISubAgent } = await import('./gui-subagent/index.js');
999
+ // Create ref for tracking first VLM call across loop iterations
1000
+ const isFirstVlmCallRef = { current: true };
436
1001
  // Create remoteVlmCaller for remote mode (uses full messages for consistent behavior)
437
1002
  let remoteVlmCaller;
438
1003
  if (!isLocalMode && authConfig.baseUrl) {
439
1004
  const remoteBaseUrl = `${authConfig.baseUrl}/api/agent/vlm`;
440
- remoteVlmCaller = async (messages, _systemPrompt) => {
1005
+ remoteVlmCaller = async (messages, _systemPrompt, _taskId, isFirstVlmCallRef) => {
1006
+ const status = isFirstVlmCallRef.current ? 'begin' : 'continue';
441
1007
  const response = await fetch(remoteBaseUrl, {
442
1008
  method: 'POST',
443
1009
  headers: {
@@ -445,7 +1011,9 @@ program
445
1011
  'Authorization': `Bearer ${authConfig.apiKey || ''}`,
446
1012
  },
447
1013
  body: JSON.stringify({
448
- messages
1014
+ messages,
1015
+ taskId: _taskId,
1016
+ status
449
1017
  }),
450
1018
  });
451
1019
  if (!response.ok) {
@@ -453,6 +1021,8 @@ program
453
1021
  throw new Error(`Remote VLM error: ${response.status} - ${errorText}`);
454
1022
  }
455
1023
  const result = await response.json();
1024
+ // Update ref after call so subsequent calls use 'continue'
1025
+ isFirstVlmCallRef.current = false;
456
1026
  return result.response || result.content || result.message || '';
457
1027
  };
458
1028
  }
@@ -461,6 +1031,7 @@ program
461
1031
  model: isLocalMode ? modelName : undefined,
462
1032
  modelBaseUrl: isLocalMode ? baseUrl : undefined,
463
1033
  modelApiKey: isLocalMode ? apiKey : undefined,
1034
+ isFirstVlmCallRef,
464
1035
  remoteVlmCaller,
465
1036
  isLocalMode,
466
1037
  });
@@ -670,6 +1241,48 @@ program
670
1241
  console.log('');
671
1242
  }
672
1243
  });
1244
+ program
1245
+ .command('update')
1246
+ .description('Check for updates and update xAgent CLI')
1247
+ .action(async () => {
1248
+ const separator = icons.separator.repeat(40);
1249
+ console.log('');
1250
+ console.log(colors.primaryBright(`${icons.rocket} Update Check`));
1251
+ console.log(colors.border(separator));
1252
+ console.log('');
1253
+ try {
1254
+ const { getUpdateManager } = await import('./update.js');
1255
+ const updateManager = getUpdateManager();
1256
+ const versionInfo = await updateManager.checkForUpdates();
1257
+ console.log(` ${icons.info} ${colors.textMuted('Current version:')} ${colors.primaryBright(versionInfo.currentVersion)}`);
1258
+ console.log(` ${icons.code} ${colors.textMuted('Latest version:')} ${colors.primaryBright(versionInfo.latestVersion)}`);
1259
+ console.log('');
1260
+ if (versionInfo.updateAvailable) {
1261
+ console.log(colors.success(` 📦 A new version is available!`));
1262
+ console.log('');
1263
+ if (versionInfo.releaseNotes) {
1264
+ console.log(colors.textMuted(' Release Notes:'));
1265
+ console.log(colors.textDim(` ${versionInfo.releaseNotes}`));
1266
+ console.log('');
1267
+ }
1268
+ const shouldUpdate = await confirm({
1269
+ message: 'Do you want to update now?',
1270
+ });
1271
+ if (shouldUpdate === true) {
1272
+ console.log('');
1273
+ await updateManager.autoUpdate();
1274
+ }
1275
+ }
1276
+ else {
1277
+ console.log(colors.success(` ✅ You are using the latest version`));
1278
+ console.log('');
1279
+ }
1280
+ }
1281
+ catch (error) {
1282
+ console.log(colors.error(` ❌ Failed to check for updates: ${error.message}`));
1283
+ console.log('');
1284
+ }
1285
+ });
673
1286
  program.parse(process.argv);
674
1287
  if (!process.argv.slice(2).length) {
675
1288
  program.outputHelp();