@xagent-ai/cli 1.2.2 → 1.3.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 (602) 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/release.yml +76 -0
  4. package/.github/workflows/ci.yml +75 -0
  5. package/.github/workflows/release.yml +103 -0
  6. package/.gitmodules +3 -3
  7. package/README.md +326 -280
  8. package/README_CN.md +325 -279
  9. package/dist/agents.d.ts.map +1 -1
  10. package/dist/agents.js +7 -3
  11. package/dist/agents.js.map +1 -1
  12. package/dist/ai-client/factory.d.ts +40 -0
  13. package/dist/ai-client/factory.d.ts.map +1 -0
  14. package/dist/ai-client/factory.js +100 -0
  15. package/dist/ai-client/factory.js.map +1 -0
  16. package/dist/ai-client/index.d.ts +20 -0
  17. package/dist/ai-client/index.d.ts.map +1 -0
  18. package/dist/ai-client/index.js +49 -0
  19. package/dist/ai-client/index.js.map +1 -0
  20. package/dist/ai-client/providers/anthropic.d.ts +57 -0
  21. package/dist/ai-client/providers/anthropic.d.ts.map +1 -0
  22. package/dist/ai-client/providers/anthropic.js +406 -0
  23. package/dist/ai-client/providers/anthropic.js.map +1 -0
  24. package/dist/ai-client/providers/openai.d.ts +57 -0
  25. package/dist/ai-client/providers/openai.d.ts.map +1 -0
  26. package/dist/ai-client/providers/openai.js +290 -0
  27. package/dist/ai-client/providers/openai.js.map +1 -0
  28. package/dist/ai-client/providers/remote.d.ts +110 -0
  29. package/dist/ai-client/providers/remote.d.ts.map +1 -0
  30. package/dist/ai-client/providers/remote.js +352 -0
  31. package/dist/ai-client/providers/remote.js.map +1 -0
  32. package/dist/ai-client/registry.d.ts +51 -0
  33. package/dist/ai-client/registry.d.ts.map +1 -0
  34. package/dist/ai-client/registry.js +81 -0
  35. package/dist/ai-client/registry.js.map +1 -0
  36. package/dist/ai-client/types.d.ts +274 -0
  37. package/dist/ai-client/types.d.ts.map +1 -0
  38. package/dist/ai-client/types.js +90 -0
  39. package/dist/ai-client/types.js.map +1 -0
  40. package/dist/ai-client-factory.d.ts +62 -0
  41. package/dist/ai-client-factory.d.ts.map +1 -0
  42. package/dist/ai-client-factory.js +157 -0
  43. package/dist/ai-client-factory.js.map +1 -0
  44. package/dist/auth.d.ts +23 -1
  45. package/dist/auth.d.ts.map +1 -1
  46. package/dist/auth.js +164 -174
  47. package/dist/auth.js.map +1 -1
  48. package/dist/cancellation.d.ts +5 -4
  49. package/dist/cancellation.d.ts.map +1 -1
  50. package/dist/cancellation.js +53 -32
  51. package/dist/cancellation.js.map +1 -1
  52. package/dist/checkpoint.d.ts +2 -1
  53. package/dist/checkpoint.d.ts.map +1 -1
  54. package/dist/checkpoint.js +39 -6
  55. package/dist/checkpoint.js.map +1 -1
  56. package/dist/cli.js +742 -29
  57. package/dist/cli.js.map +1 -1
  58. package/dist/config.d.ts +10 -4
  59. package/dist/config.d.ts.map +1 -1
  60. package/dist/config.js +62 -25
  61. package/dist/config.js.map +1 -1
  62. package/dist/context-compressor.d.ts +82 -18
  63. package/dist/context-compressor.d.ts.map +1 -1
  64. package/dist/context-compressor.js +718 -154
  65. package/dist/context-compressor.js.map +1 -1
  66. package/dist/conversation.d.ts +1 -1
  67. package/dist/conversation.d.ts.map +1 -1
  68. package/dist/conversation.js +8 -7
  69. package/dist/conversation.js.map +1 -1
  70. package/dist/gui-subagent/action-parser/actionParser.d.ts.map +1 -1
  71. package/dist/gui-subagent/action-parser/actionParser.js +6 -4
  72. package/dist/gui-subagent/action-parser/actionParser.js.map +1 -1
  73. package/dist/gui-subagent/agent/gui-agent.d.ts +39 -2
  74. package/dist/gui-subagent/agent/gui-agent.d.ts.map +1 -1
  75. package/dist/gui-subagent/agent/gui-agent.js +189 -74
  76. package/dist/gui-subagent/agent/gui-agent.js.map +1 -1
  77. package/dist/gui-subagent/index.d.ts +23 -1
  78. package/dist/gui-subagent/index.d.ts.map +1 -1
  79. package/dist/gui-subagent/index.js +6 -0
  80. package/dist/gui-subagent/index.js.map +1 -1
  81. package/dist/gui-subagent/operator/base-operator.d.ts.map +1 -1
  82. package/dist/gui-subagent/operator/base-operator.js +0 -1
  83. package/dist/gui-subagent/operator/base-operator.js.map +1 -1
  84. package/dist/gui-subagent/operator/computer-operator.d.ts.map +1 -1
  85. package/dist/gui-subagent/operator/computer-operator.js +31 -8
  86. package/dist/gui-subagent/operator/computer-operator.js.map +1 -1
  87. package/dist/gui-subagent/types/actions.d.ts +1 -1
  88. package/dist/gui-subagent/types/actions.d.ts.map +1 -1
  89. package/dist/gui-subagent/types/actions.js +0 -1
  90. package/dist/gui-subagent/types/actions.js.map +1 -1
  91. package/dist/gui-subagent/types/operator.d.ts +1 -1
  92. package/dist/gui-subagent/types/operator.d.ts.map +1 -1
  93. package/dist/index.d.ts +1 -2
  94. package/dist/index.d.ts.map +1 -1
  95. package/dist/index.js +1 -2
  96. package/dist/index.js.map +1 -1
  97. package/dist/input-processor.d.ts.map +1 -1
  98. package/dist/input-processor.js +8 -5
  99. package/dist/input-processor.js.map +1 -1
  100. package/dist/logger.d.ts.map +1 -1
  101. package/dist/logger.js +1 -1
  102. package/dist/logger.js.map +1 -1
  103. package/dist/mcp.d.ts +7 -1
  104. package/dist/mcp.d.ts.map +1 -1
  105. package/dist/mcp.js +157 -49
  106. package/dist/mcp.js.map +1 -1
  107. package/dist/memory.d.ts.map +1 -1
  108. package/dist/memory.js +3 -3
  109. package/dist/memory.js.map +1 -1
  110. package/dist/output-util.d.ts +27 -0
  111. package/dist/output-util.d.ts.map +1 -0
  112. package/dist/output-util.js +74 -0
  113. package/dist/output-util.js.map +1 -0
  114. package/dist/retry.js +1 -1
  115. package/dist/retry.js.map +1 -1
  116. package/dist/ripgrep.d.ts +29 -0
  117. package/dist/ripgrep.d.ts.map +1 -0
  118. package/dist/ripgrep.js +294 -0
  119. package/dist/ripgrep.js.map +1 -0
  120. package/dist/sdk-output-adapter.d.ts +34 -1
  121. package/dist/sdk-output-adapter.d.ts.map +1 -1
  122. package/dist/sdk-output-adapter.js +67 -2
  123. package/dist/sdk-output-adapter.js.map +1 -1
  124. package/dist/sdk-session.d.ts.map +1 -1
  125. package/dist/sdk-session.js +2 -0
  126. package/dist/sdk-session.js.map +1 -1
  127. package/dist/session-manager.js +3 -3
  128. package/dist/session-manager.js.map +1 -1
  129. package/dist/session.d.ts +116 -6
  130. package/dist/session.d.ts.map +1 -1
  131. package/dist/session.js +1416 -448
  132. package/dist/session.js.map +1 -1
  133. package/dist/shell.d.ts +33 -0
  134. package/dist/shell.d.ts.map +1 -0
  135. package/dist/shell.js +126 -0
  136. package/dist/shell.js.map +1 -0
  137. package/dist/skill-installer.d.ts +38 -0
  138. package/dist/skill-installer.d.ts.map +1 -0
  139. package/dist/skill-installer.js +447 -0
  140. package/dist/skill-installer.js.map +1 -0
  141. package/dist/skill-invoker.d.ts +8 -2
  142. package/dist/skill-invoker.d.ts.map +1 -1
  143. package/dist/skill-invoker.js +36 -15
  144. package/dist/skill-invoker.js.map +1 -1
  145. package/dist/skill-loader.d.ts +8 -3
  146. package/dist/skill-loader.d.ts.map +1 -1
  147. package/dist/skill-loader.js +51 -48
  148. package/dist/skill-loader.js.map +1 -1
  149. package/dist/skill-manager.d.ts +85 -0
  150. package/dist/skill-manager.d.ts.map +1 -0
  151. package/dist/skill-manager.js +341 -0
  152. package/dist/skill-manager.js.map +1 -0
  153. package/dist/slash-commands.d.ts +39 -2
  154. package/dist/slash-commands.d.ts.map +1 -1
  155. package/dist/slash-commands.js +934 -305
  156. package/dist/slash-commands.js.map +1 -1
  157. package/dist/smart-approval.d.ts +20 -1
  158. package/dist/smart-approval.d.ts.map +1 -1
  159. package/dist/smart-approval.js +125 -56
  160. package/dist/smart-approval.js.map +1 -1
  161. package/dist/system-prompt-generator.d.ts +6 -0
  162. package/dist/system-prompt-generator.d.ts.map +1 -1
  163. package/dist/system-prompt-generator.js +86 -36
  164. package/dist/system-prompt-generator.js.map +1 -1
  165. package/dist/terminal.d.ts +28 -0
  166. package/dist/terminal.d.ts.map +1 -0
  167. package/dist/terminal.js +82 -0
  168. package/dist/terminal.js.map +1 -0
  169. package/dist/theme.d.ts.map +1 -1
  170. package/dist/theme.js +8 -7
  171. package/dist/theme.js.map +1 -1
  172. package/dist/tools.d.ts +38 -7
  173. package/dist/tools.d.ts.map +1 -1
  174. package/dist/tools.js +1249 -617
  175. package/dist/tools.js.map +1 -1
  176. package/dist/truncate.d.ts +55 -0
  177. package/dist/truncate.d.ts.map +1 -0
  178. package/dist/truncate.js +130 -0
  179. package/dist/truncate.js.map +1 -0
  180. package/dist/types.d.ts +84 -9
  181. package/dist/types.d.ts.map +1 -1
  182. package/dist/types.js +49 -0
  183. package/dist/types.js.map +1 -1
  184. package/dist/update.d.ts.map +1 -1
  185. package/dist/update.js +28 -36
  186. package/dist/update.js.map +1 -1
  187. package/dist/workflow.d.ts +5 -1
  188. package/dist/workflow.d.ts.map +1 -1
  189. package/dist/workflow.js +61 -49
  190. package/dist/workflow.js.map +1 -1
  191. package/docs/architecture/mcp-integration-guide.md +304 -194
  192. package/docs/architecture/overview.md +169 -169
  193. package/docs/architecture/tool-system-design.md +134 -134
  194. package/docs/cli/commands.md +349 -238
  195. package/docs/smart-mode.md +281 -281
  196. package/docs/third-party-models.md +440 -439
  197. package/find-skills/SKILL.md +133 -0
  198. package/package.json +91 -90
  199. package/scripts/install-ripgrep.js +241 -0
  200. package/src/agents.ts +7 -3
  201. package/src/ai-client/factory.ts +116 -0
  202. package/src/ai-client/index.ts +61 -0
  203. package/src/ai-client/providers/anthropic.ts +475 -0
  204. package/src/ai-client/providers/openai.ts +348 -0
  205. package/src/ai-client/providers/remote.ts +439 -0
  206. package/src/ai-client/registry.ts +97 -0
  207. package/src/ai-client/types.ts +364 -0
  208. package/src/ai-client-factory.ts +204 -0
  209. package/src/auth.ts +661 -614
  210. package/src/cancellation.ts +202 -176
  211. package/src/checkpoint.ts +255 -219
  212. package/src/cli.ts +1523 -743
  213. package/src/config.ts +341 -297
  214. package/src/context-compressor.ts +987 -290
  215. package/src/conversation.ts +290 -288
  216. package/src/gui-subagent/action-parser/actionParser.ts +318 -315
  217. package/src/gui-subagent/action-parser/constants.ts +14 -14
  218. package/src/gui-subagent/action-parser/index.ts +8 -8
  219. package/src/gui-subagent/action-parser/types.ts +31 -31
  220. package/src/gui-subagent/agent/gui-agent.ts +1234 -1089
  221. package/src/gui-subagent/agent/index.ts +5 -5
  222. package/src/gui-subagent/index.ts +185 -163
  223. package/src/gui-subagent/operator/base-operator.ts +244 -245
  224. package/src/gui-subagent/operator/computer-operator.ts +541 -520
  225. package/src/gui-subagent/operator/index.ts +6 -6
  226. package/src/gui-subagent/types/actions.ts +260 -262
  227. package/src/gui-subagent/types/index.ts +6 -6
  228. package/src/gui-subagent/types/operator.ts +106 -106
  229. package/src/gui-subagent/utils.ts +51 -51
  230. package/src/index.ts +17 -18
  231. package/src/input-processor.ts +8 -5
  232. package/src/logger.ts +436 -438
  233. package/src/mcp.ts +793 -682
  234. package/src/memory.ts +343 -344
  235. package/src/output-util.ts +80 -0
  236. package/src/retry.ts +1 -1
  237. package/src/ripgrep.ts +370 -0
  238. package/src/sdk-output-adapter.ts +842 -0
  239. package/src/sdk-session.ts +62 -0
  240. package/src/session-manager.ts +308 -308
  241. package/src/session.ts +1775 -573
  242. package/src/shell.ts +134 -0
  243. package/src/skill-installer.ts +518 -0
  244. package/src/skill-invoker.ts +959 -935
  245. package/src/skill-loader.ts +501 -496
  246. package/src/skill-manager.ts +385 -0
  247. package/src/slash-commands.ts +2189 -1389
  248. package/src/smart-approval.ts +193 -74
  249. package/src/system-prompt-generator.ts +91 -36
  250. package/src/terminal.ts +96 -0
  251. package/src/theme.ts +739 -738
  252. package/src/tools.ts +1790 -931
  253. package/src/truncate.ts +173 -0
  254. package/src/types.ts +337 -198
  255. package/src/update.ts +33 -40
  256. package/src/workflow.ts +521 -508
  257. package/test/cli-launch.test.ts +279 -0
  258. package/tsconfig.json +22 -22
  259. package/vitest.config.ts +21 -19
  260. package/dist/ai-client.d.ts +0 -86
  261. package/dist/ai-client.d.ts.map +0 -1
  262. package/dist/ai-client.js +0 -1372
  263. package/dist/ai-client.js.map +0 -1
  264. package/dist/gui-subagent/operator/browser-operator.d.ts +0 -36
  265. package/dist/gui-subagent/operator/browser-operator.d.ts.map +0 -1
  266. package/dist/gui-subagent/operator/browser-operator.js +0 -306
  267. package/dist/gui-subagent/operator/browser-operator.js.map +0 -1
  268. package/dist/gui-subagent/operator/desktop-operator.d.ts +0 -55
  269. package/dist/gui-subagent/operator/desktop-operator.d.ts.map +0 -1
  270. package/dist/gui-subagent/operator/desktop-operator.js +0 -527
  271. package/dist/gui-subagent/operator/desktop-operator.js.map +0 -1
  272. package/dist/hook.d.ts +0 -73
  273. package/dist/hook.d.ts.map +0 -1
  274. package/dist/hook.js +0 -156
  275. package/dist/hook.js.map +0 -1
  276. package/dist/input-history.d.ts +0 -24
  277. package/dist/input-history.d.ts.map +0 -1
  278. package/dist/input-history.js +0 -94
  279. package/dist/input-history.js.map +0 -1
  280. package/dist/keyboard-manager.d.ts +0 -151
  281. package/dist/keyboard-manager.d.ts.map +0 -1
  282. package/dist/keyboard-manager.js +0 -396
  283. package/dist/keyboard-manager.js.map +0 -1
  284. package/dist/print-system-prompt.d.ts +0 -2
  285. package/dist/print-system-prompt.d.ts.map +0 -1
  286. package/dist/print-system-prompt.js +0 -40
  287. package/dist/print-system-prompt.js.map +0 -1
  288. package/dist/remote-ai-client.d.ts +0 -104
  289. package/dist/remote-ai-client.d.ts.map +0 -1
  290. package/dist/remote-ai-client.js +0 -552
  291. package/dist/remote-ai-client.js.map +0 -1
  292. package/dist/sdk-session-v2.d.ts +0 -13
  293. package/dist/sdk-session-v2.d.ts.map +0 -1
  294. package/dist/sdk-session-v2.js +0 -46
  295. package/dist/sdk-session-v2.js.map +0 -1
  296. package/dist/test-boundary-conditions.d.ts.map +0 -1
  297. package/dist/test-boundary-conditions.js.map +0 -1
  298. package/dist/test-cancellation-fix.d.ts.map +0 -1
  299. package/dist/test-cancellation-fix.js.map +0 -1
  300. package/dist/test-input-history.d.ts.map +0 -1
  301. package/dist/test-input-history.js.map +0 -1
  302. package/dist/test-interaction-flow.d.ts.map +0 -1
  303. package/dist/test-interaction-flow.js.map +0 -1
  304. package/dist/test-quick.d.ts.map +0 -1
  305. package/dist/test-quick.js.map +0 -1
  306. package/dist/test-user-interaction.d.ts.map +0 -1
  307. package/dist/test-user-interaction.js.map +0 -1
  308. package/dist/tools/edit-diff.d.ts +0 -32
  309. package/dist/tools/edit-diff.d.ts.map +0 -1
  310. package/dist/tools/edit-diff.js +0 -185
  311. package/dist/tools/edit-diff.js.map +0 -1
  312. package/dist/tools/edit.d.ts +0 -11
  313. package/dist/tools/edit.d.ts.map +0 -1
  314. package/dist/tools/edit.js +0 -129
  315. package/dist/tools/edit.js.map +0 -1
  316. package/dist/unified-session.d.ts +0 -42
  317. package/dist/unified-session.d.ts.map +0 -1
  318. package/dist/unified-session.js +0 -271
  319. package/dist/unified-session.js.map +0 -1
  320. package/skills/.claude-plugin/marketplace.json +0 -45
  321. package/skills/README.md +0 -94
  322. package/skills/THIRD_PARTY_NOTICES.md +0 -405
  323. package/skills/skills/algorithmic-art/LICENSE.txt +0 -202
  324. package/skills/skills/algorithmic-art/SKILL.md +0 -405
  325. package/skills/skills/algorithmic-art/templates/generator_template.js +0 -223
  326. package/skills/skills/algorithmic-art/templates/viewer.html +0 -599
  327. package/skills/skills/brand-guidelines/LICENSE.txt +0 -202
  328. package/skills/skills/brand-guidelines/SKILL.md +0 -73
  329. package/skills/skills/canvas-design/LICENSE.txt +0 -202
  330. package/skills/skills/canvas-design/SKILL.md +0 -130
  331. package/skills/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +0 -93
  332. package/skills/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  333. package/skills/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  334. package/skills/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +0 -93
  335. package/skills/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  336. package/skills/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +0 -93
  337. package/skills/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  338. package/skills/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  339. package/skills/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +0 -93
  340. package/skills/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  341. package/skills/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  342. package/skills/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  343. package/skills/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +0 -93
  344. package/skills/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  345. package/skills/skills/canvas-design/canvas-fonts/DMMono-OFL.txt +0 -93
  346. package/skills/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  347. package/skills/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +0 -94
  348. package/skills/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  349. package/skills/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  350. package/skills/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +0 -93
  351. package/skills/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  352. package/skills/skills/canvas-design/canvas-fonts/Gloock-OFL.txt +0 -93
  353. package/skills/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  354. package/skills/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  355. package/skills/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +0 -93
  356. package/skills/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  357. package/skills/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  358. package/skills/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  359. package/skills/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  360. package/skills/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  361. package/skills/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  362. package/skills/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  363. package/skills/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  364. package/skills/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +0 -93
  365. package/skills/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  366. package/skills/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  367. package/skills/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  368. package/skills/skills/canvas-design/canvas-fonts/Italiana-OFL.txt +0 -93
  369. package/skills/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  370. package/skills/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  371. package/skills/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +0 -93
  372. package/skills/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  373. package/skills/skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  374. package/skills/skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  375. package/skills/skills/canvas-design/canvas-fonts/Jura-OFL.txt +0 -93
  376. package/skills/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +0 -93
  377. package/skills/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  378. package/skills/skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  379. package/skills/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  380. package/skills/skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  381. package/skills/skills/canvas-design/canvas-fonts/Lora-OFL.txt +0 -93
  382. package/skills/skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  383. package/skills/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  384. package/skills/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +0 -93
  385. package/skills/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  386. package/skills/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +0 -93
  387. package/skills/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  388. package/skills/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  389. package/skills/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +0 -93
  390. package/skills/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  391. package/skills/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  392. package/skills/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +0 -93
  393. package/skills/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +0 -93
  394. package/skills/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  395. package/skills/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  396. package/skills/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +0 -93
  397. package/skills/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  398. package/skills/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +0 -93
  399. package/skills/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  400. package/skills/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  401. package/skills/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +0 -93
  402. package/skills/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  403. package/skills/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +0 -93
  404. package/skills/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  405. package/skills/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  406. package/skills/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  407. package/skills/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  408. package/skills/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +0 -93
  409. package/skills/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  410. package/skills/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +0 -93
  411. package/skills/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
  412. package/skills/skills/doc-coauthoring/SKILL.md +0 -375
  413. package/skills/skills/docx/LICENSE.txt +0 -30
  414. package/skills/skills/docx/SKILL.md +0 -197
  415. package/skills/skills/docx/docx-js.md +0 -350
  416. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
  417. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
  418. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
  419. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
  420. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
  421. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
  422. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
  423. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
  424. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
  425. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
  426. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
  427. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
  428. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
  429. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
  430. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
  431. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
  432. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
  433. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
  434. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
  435. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
  436. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
  437. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
  438. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
  439. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
  440. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
  441. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
  442. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
  443. package/skills/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
  444. package/skills/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
  445. package/skills/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
  446. package/skills/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
  447. package/skills/skills/docx/ooxml/schemas/mce/mc.xsd +0 -75
  448. package/skills/skills/docx/ooxml/schemas/microsoft/wml-2010.xsd +0 -560
  449. package/skills/skills/docx/ooxml/schemas/microsoft/wml-2012.xsd +0 -67
  450. package/skills/skills/docx/ooxml/schemas/microsoft/wml-2018.xsd +0 -14
  451. package/skills/skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +0 -20
  452. package/skills/skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +0 -13
  453. package/skills/skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
  454. package/skills/skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +0 -8
  455. package/skills/skills/docx/ooxml/scripts/pack.py +0 -159
  456. package/skills/skills/docx/ooxml/scripts/unpack.py +0 -29
  457. package/skills/skills/docx/ooxml/scripts/validate.py +0 -69
  458. package/skills/skills/docx/ooxml/scripts/validation/__init__.py +0 -15
  459. package/skills/skills/docx/ooxml/scripts/validation/base.py +0 -951
  460. package/skills/skills/docx/ooxml/scripts/validation/docx.py +0 -274
  461. package/skills/skills/docx/ooxml/scripts/validation/pptx.py +0 -315
  462. package/skills/skills/docx/ooxml/scripts/validation/redlining.py +0 -279
  463. package/skills/skills/docx/ooxml.md +0 -610
  464. package/skills/skills/docx/scripts/__init__.py +0 -1
  465. package/skills/skills/docx/scripts/document.py +0 -1276
  466. package/skills/skills/docx/scripts/templates/comments.xml +0 -3
  467. package/skills/skills/docx/scripts/templates/commentsExtended.xml +0 -3
  468. package/skills/skills/docx/scripts/templates/commentsExtensible.xml +0 -3
  469. package/skills/skills/docx/scripts/templates/commentsIds.xml +0 -3
  470. package/skills/skills/docx/scripts/templates/people.xml +0 -3
  471. package/skills/skills/docx/scripts/utilities.py +0 -374
  472. package/skills/skills/frontend-design/LICENSE.txt +0 -177
  473. package/skills/skills/frontend-design/SKILL.md +0 -42
  474. package/skills/skills/internal-comms/LICENSE.txt +0 -202
  475. package/skills/skills/internal-comms/SKILL.md +0 -32
  476. package/skills/skills/internal-comms/examples/3p-updates.md +0 -47
  477. package/skills/skills/internal-comms/examples/company-newsletter.md +0 -65
  478. package/skills/skills/internal-comms/examples/faq-answers.md +0 -30
  479. package/skills/skills/internal-comms/examples/general-comms.md +0 -16
  480. package/skills/skills/mcp-builder/LICENSE.txt +0 -202
  481. package/skills/skills/mcp-builder/SKILL.md +0 -236
  482. package/skills/skills/mcp-builder/reference/evaluation.md +0 -602
  483. package/skills/skills/mcp-builder/reference/mcp_best_practices.md +0 -249
  484. package/skills/skills/mcp-builder/reference/node_mcp_server.md +0 -970
  485. package/skills/skills/mcp-builder/reference/python_mcp_server.md +0 -719
  486. package/skills/skills/mcp-builder/scripts/connections.py +0 -151
  487. package/skills/skills/mcp-builder/scripts/evaluation.py +0 -373
  488. package/skills/skills/mcp-builder/scripts/example_evaluation.xml +0 -22
  489. package/skills/skills/mcp-builder/scripts/requirements.txt +0 -2
  490. package/skills/skills/pdf/LICENSE.txt +0 -30
  491. package/skills/skills/pdf/SKILL.md +0 -294
  492. package/skills/skills/pdf/forms.md +0 -205
  493. package/skills/skills/pdf/reference.md +0 -612
  494. package/skills/skills/pdf/scripts/check_bounding_boxes.py +0 -70
  495. package/skills/skills/pdf/scripts/check_bounding_boxes_test.py +0 -226
  496. package/skills/skills/pdf/scripts/check_fillable_fields.py +0 -12
  497. package/skills/skills/pdf/scripts/convert_pdf_to_images.py +0 -35
  498. package/skills/skills/pdf/scripts/create_validation_image.py +0 -41
  499. package/skills/skills/pdf/scripts/extract_form_field_info.py +0 -152
  500. package/skills/skills/pdf/scripts/fill_fillable_fields.py +0 -114
  501. package/skills/skills/pdf/scripts/fill_pdf_form_with_annotations.py +0 -108
  502. package/skills/skills/pptx/LICENSE.txt +0 -30
  503. package/skills/skills/pptx/SKILL.md +0 -484
  504. package/skills/skills/pptx/html2pptx.md +0 -625
  505. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
  506. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
  507. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
  508. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
  509. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
  510. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
  511. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
  512. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
  513. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
  514. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
  515. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
  516. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
  517. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
  518. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
  519. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
  520. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
  521. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
  522. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
  523. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
  524. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
  525. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
  526. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
  527. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
  528. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
  529. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
  530. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
  531. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
  532. package/skills/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
  533. package/skills/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
  534. package/skills/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
  535. package/skills/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
  536. package/skills/skills/pptx/ooxml/schemas/mce/mc.xsd +0 -75
  537. package/skills/skills/pptx/ooxml/schemas/microsoft/wml-2010.xsd +0 -560
  538. package/skills/skills/pptx/ooxml/schemas/microsoft/wml-2012.xsd +0 -67
  539. package/skills/skills/pptx/ooxml/schemas/microsoft/wml-2018.xsd +0 -14
  540. package/skills/skills/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +0 -20
  541. package/skills/skills/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +0 -13
  542. package/skills/skills/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
  543. package/skills/skills/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +0 -8
  544. package/skills/skills/pptx/ooxml/scripts/pack.py +0 -159
  545. package/skills/skills/pptx/ooxml/scripts/unpack.py +0 -29
  546. package/skills/skills/pptx/ooxml/scripts/validate.py +0 -69
  547. package/skills/skills/pptx/ooxml/scripts/validation/__init__.py +0 -15
  548. package/skills/skills/pptx/ooxml/scripts/validation/base.py +0 -951
  549. package/skills/skills/pptx/ooxml/scripts/validation/docx.py +0 -274
  550. package/skills/skills/pptx/ooxml/scripts/validation/pptx.py +0 -315
  551. package/skills/skills/pptx/ooxml/scripts/validation/redlining.py +0 -279
  552. package/skills/skills/pptx/ooxml.md +0 -427
  553. package/skills/skills/pptx/scripts/html2pptx.js +0 -979
  554. package/skills/skills/pptx/scripts/inventory.py +0 -1020
  555. package/skills/skills/pptx/scripts/rearrange.py +0 -231
  556. package/skills/skills/pptx/scripts/replace.py +0 -385
  557. package/skills/skills/pptx/scripts/thumbnail.py +0 -450
  558. package/skills/skills/skill-creator/LICENSE.txt +0 -202
  559. package/skills/skills/skill-creator/SKILL.md +0 -356
  560. package/skills/skills/skill-creator/references/output-patterns.md +0 -82
  561. package/skills/skills/skill-creator/references/workflows.md +0 -28
  562. package/skills/skills/skill-creator/scripts/init_skill.py +0 -303
  563. package/skills/skills/skill-creator/scripts/package_skill.py +0 -110
  564. package/skills/skills/skill-creator/scripts/quick_validate.py +0 -95
  565. package/skills/skills/slack-gif-creator/LICENSE.txt +0 -202
  566. package/skills/skills/slack-gif-creator/SKILL.md +0 -254
  567. package/skills/skills/slack-gif-creator/core/easing.py +0 -234
  568. package/skills/skills/slack-gif-creator/core/frame_composer.py +0 -176
  569. package/skills/skills/slack-gif-creator/core/gif_builder.py +0 -269
  570. package/skills/skills/slack-gif-creator/core/validators.py +0 -136
  571. package/skills/skills/slack-gif-creator/requirements.txt +0 -4
  572. package/skills/skills/theme-factory/LICENSE.txt +0 -202
  573. package/skills/skills/theme-factory/SKILL.md +0 -59
  574. package/skills/skills/theme-factory/theme-showcase.pdf +0 -0
  575. package/skills/skills/theme-factory/themes/arctic-frost.md +0 -19
  576. package/skills/skills/theme-factory/themes/botanical-garden.md +0 -19
  577. package/skills/skills/theme-factory/themes/desert-rose.md +0 -19
  578. package/skills/skills/theme-factory/themes/forest-canopy.md +0 -19
  579. package/skills/skills/theme-factory/themes/golden-hour.md +0 -19
  580. package/skills/skills/theme-factory/themes/midnight-galaxy.md +0 -19
  581. package/skills/skills/theme-factory/themes/modern-minimalist.md +0 -19
  582. package/skills/skills/theme-factory/themes/ocean-depths.md +0 -19
  583. package/skills/skills/theme-factory/themes/sunset-boulevard.md +0 -19
  584. package/skills/skills/theme-factory/themes/tech-innovation.md +0 -19
  585. package/skills/skills/web-artifacts-builder/LICENSE.txt +0 -202
  586. package/skills/skills/web-artifacts-builder/SKILL.md +0 -74
  587. package/skills/skills/web-artifacts-builder/scripts/bundle-artifact.sh +0 -54
  588. package/skills/skills/web-artifacts-builder/scripts/init-artifact.sh +0 -322
  589. package/skills/skills/webapp-testing/LICENSE.txt +0 -202
  590. package/skills/skills/webapp-testing/SKILL.md +0 -96
  591. package/skills/skills/webapp-testing/examples/console_logging.py +0 -35
  592. package/skills/skills/webapp-testing/examples/element_discovery.py +0 -40
  593. package/skills/skills/webapp-testing/examples/static_html_automation.py +0 -33
  594. package/skills/skills/webapp-testing/scripts/with_server.py +0 -106
  595. package/skills/skills/xlsx/LICENSE.txt +0 -30
  596. package/skills/skills/xlsx/SKILL.md +0 -289
  597. package/skills/skills/xlsx/recalc.py +0 -178
  598. package/skills/spec/agent-skills-spec.md +0 -3
  599. package/skills/template/SKILL.md +0 -6
  600. package/src/ai-client.ts +0 -1560
  601. package/src/remote-ai-client.ts +0 -664
  602. /package/{.eslintrc.js → .eslintrc.cjs} +0 -0
package/dist/cli.js CHANGED
@@ -1,11 +1,14 @@
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
- import { getLogger, setConfigProvider } from './logger.js';
11
+ import { setConfigProvider } from './logger.js';
9
12
  import { icons, colors } from './theme.js';
10
13
  import { getCancellationManager } from './cancellation.js';
11
14
  import { readFileSync, promises as fs } from 'fs';
@@ -15,10 +18,26 @@ 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 {
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'));
21
- const logger = getLogger();
22
41
  // Initialize CancellationManager early to set up ESC handler
23
42
  getCancellationManager();
24
43
  // Set up config provider for logger to read loggerLevel
@@ -82,12 +101,39 @@ function formatError(error) {
82
101
  suggestion: 'The configuration file may be corrupted. Please check the file content.'
83
102
  };
84
103
  }
104
+ // User cancellation - no suggestion needed
105
+ if (errorMessage.includes('cancelled by user') || errorMessage.includes('Operation cancelled')) {
106
+ return {
107
+ message: 'Operation cancelled',
108
+ suggestion: ''
109
+ };
110
+ }
85
111
  // Default friendly message
86
112
  return {
87
113
  message: 'An error occurred',
88
114
  suggestion: 'Please try again. If the problem persists, check your configuration.'
89
115
  };
90
116
  }
117
+ /**
118
+ * Recursively copy a directory
119
+ */
120
+ async function copyDirectory(src, dest) {
121
+ const entries = await fs.readdir(src, { withFileTypes: true });
122
+ await fs.mkdir(dest, { recursive: true });
123
+ for (const entry of entries) {
124
+ // Skip node_modules to keep dependencies isolated
125
+ // if (entry.name === 'node_modules') continue;
126
+ const srcPath = path.join(src, entry.name);
127
+ const destPath = path.join(dest, entry.name);
128
+ if (entry.isDirectory()) {
129
+ await copyDirectory(srcPath, destPath);
130
+ }
131
+ else if (entry.isFile()) {
132
+ await fs.copyFile(srcPath, destPath);
133
+ }
134
+ // Skip symbolic links for simplicity
135
+ }
136
+ }
91
137
  program
92
138
  .name('xagent')
93
139
  .description('AI-powered command-line assistant')
@@ -97,7 +143,14 @@ program
97
143
  .command('start')
98
144
  .description('Start the xAgent CLI interactive session')
99
145
  .option('--approval-mode <mode>', 'Set approval mode (yolo, accept_edits, plan, default, smart)')
146
+ .option('--sdk', 'Run in SDK mode for programmatic access (stdin/stdout JSON communication)')
100
147
  .action(async (options) => {
148
+ // Check if running in SDK mode
149
+ if (options.sdk || process.env.XAGENT_SDK === 'true') {
150
+ const { startSdkSession } = await import('./sdk-session.js');
151
+ await startSdkSession();
152
+ return;
153
+ }
101
154
  if (options.approvalMode) {
102
155
  const { getConfigManager } = await import('./config.js');
103
156
  const { ExecutionMode } = await import('./types.js');
@@ -111,7 +164,7 @@ program
111
164
  process.exit(1);
112
165
  }
113
166
  configManager.setApprovalMode(options.approvalMode);
114
- await configManager.save('global');
167
+ configManager.save('global');
115
168
  console.log('');
116
169
  console.log(colors.success(`āœ… Approval mode set to: ${options.approvalMode}`));
117
170
  console.log('');
@@ -130,20 +183,53 @@ program
130
183
  const authType = await selectAuthType();
131
184
  const configManager = getConfigManager();
132
185
  configManager.set('selectedAuthType', authType);
186
+ // Get xagentApiBaseUrl from config (respects XAGENT_BASE_URL env var)
187
+ const config = configManager.getAuthConfig();
133
188
  const authService = new AuthService({
134
189
  type: authType,
135
190
  apiKey: '',
136
191
  baseUrl: '',
137
- modelName: ''
192
+ modelName: '',
193
+ xagentApiBaseUrl: config.xagentApiBaseUrl
138
194
  });
139
195
  const success = await authService.authenticate();
140
196
  if (success) {
141
197
  const authConfig = authService.getAuthConfig();
142
- await configManager.setAuthConfig(authConfig);
198
+ // Clear modelName for remote mode
199
+ if (authType === AuthType.OAUTH_XAGENT) {
200
+ authConfig.modelName = '';
201
+ }
202
+ configManager.setAuthConfig(authConfig);
203
+ // Set default remote model settings if not already set
204
+ if (authType === AuthType.OAUTH_XAGENT) {
205
+ const webBaseUrl = authConfig.xagentApiBaseUrl || 'https://www.xagent-colife.net';
206
+ let defaultLlmName = '';
207
+ let defaultVlmName = '';
208
+ try {
209
+ console.log(colors.textMuted(' Fetching default models from remote server...'));
210
+ const defaults = await fetchDefaultModels(authConfig.apiKey || '', webBaseUrl);
211
+ if (defaults.llm?.name) {
212
+ defaultLlmName = defaults.llm.name;
213
+ console.log(colors.textMuted(` Default LLM: ${defaults.llm.displayName || defaultLlmName}`));
214
+ }
215
+ if (defaults.vlm?.name) {
216
+ defaultVlmName = defaults.vlm.name;
217
+ console.log(colors.textMuted(` Default VLM: ${defaults.vlm.displayName || defaultVlmName}`));
218
+ }
219
+ }
220
+ catch (error) {
221
+ console.log(colors.textMuted(` āš ļø Failed to fetch default models: ${error.message}`));
222
+ console.log(colors.textMuted(' āš ļø Use /model command to select models manually.'));
223
+ }
224
+ configManager.set('remote_llmModelName', defaultLlmName);
225
+ configManager.set('remote_vlmModelName', defaultVlmName);
226
+ configManager.save('global');
227
+ }
143
228
  console.log('');
144
229
  console.log(colors.success('Authentication configured successfully!'));
145
230
  console.log(colors.textMuted('You can now run "xagent start" to begin'));
146
231
  console.log('');
232
+ process.exit(0);
147
233
  }
148
234
  else {
149
235
  console.log('');
@@ -183,6 +269,7 @@ program
183
269
  console.log('');
184
270
  });
185
271
  }
272
+ process.exit(0);
186
273
  }
187
274
  else if (options.add) {
188
275
  console.log('');
@@ -213,53 +300,388 @@ program
213
300
  });
214
301
  program
215
302
  .command('mcp')
216
- .description('Add, list, or remove MCP servers')
303
+ .description('Add, list, get, or remove MCP servers')
217
304
  .option('-l, --list', 'List all MCP servers')
218
- .option('-a, --add <name>', 'Add a new MCP server')
305
+ .option('-g, --get <name>', 'Get details of a specific MCP server')
306
+ .option('-a, --add [name]', 'Add a new MCP server (interactive if no name provided)')
219
307
  .option('-r, --remove <name>', 'Remove an MCP server')
220
308
  .option('--scope <scope>', 'Scope (global or project)', 'global')
309
+ .option('-t, --transport <type>', 'Transport type: stdio, http')
310
+ .option('-c, --command <cmd>', 'Command for stdio transport')
311
+ .option('--args <args>', 'Arguments for stdio transport (comma-separated)')
312
+ .option('-u, --url <url>', 'URL for HTTP transport')
313
+ .option('-k, --token <token>', 'Authentication token (Bearer)')
314
+ .option('--header <headers>', 'Custom headers (can be used multiple times)')
315
+ .option('-y, --yes', 'Skip confirmation')
221
316
  .action(async (options) => {
317
+ if (options.help) {
318
+ program.parse(['node', 'mcp', '--help']);
319
+ return;
320
+ }
222
321
  const configManager = getConfigManager(process.cwd());
322
+ configManager.load(); // Load config from file
223
323
  const mcpManager = getMCPManager();
324
+ // Register all MCP servers from config to manager (for --list and --remove)
325
+ const mcpServers = configManager.getMcpServers();
326
+ Object.entries(mcpServers).forEach(([name, config]) => {
327
+ mcpManager.registerServer(name, config);
328
+ });
224
329
  if (options.list) {
225
- const servers = mcpManager.getAllServers();
226
- if (servers.length === 0) {
330
+ const mcpServers = configManager.getMcpServers();
331
+ const serverNames = Object.keys(mcpServers);
332
+ if (serverNames.length === 0) {
227
333
  console.log('');
228
334
  console.log(colors.warning('No MCP servers configured'));
229
- console.log(colors.textMuted('Use /mcp add in interactive mode to add servers'));
335
+ console.log(colors.textMuted('Use "xagent mcp --add" to add servers'));
230
336
  console.log('');
231
337
  }
232
338
  else {
339
+ console.log(colors.textMuted('Connecting to MCP servers...'));
340
+ for (const name of serverNames) {
341
+ try {
342
+ await mcpManager.connectServer(name);
343
+ }
344
+ catch {
345
+ // Connection failed, continue with next server
346
+ }
347
+ }
233
348
  const separator = icons.separator.repeat(40);
234
349
  console.log('');
235
350
  console.log(colors.primaryBright(`${icons.tool} MCP Servers`));
236
351
  console.log(colors.border(separator));
237
352
  console.log('');
238
- servers.forEach((server, index) => {
239
- const connected = server.isServerConnected() ? icons.success : icons.error;
240
- const status = server.isServerConnected() ? colors.success(connected) : colors.error(connected);
241
- const toolNames = server.getToolNames().join(', ');
242
- console.log(` ${status} ${colors.primaryBright(`Server ${index + 1}`)}`);
243
- console.log(` ${colors.textDim(` Tools: ${toolNames}`)}`);
353
+ serverNames.forEach((name) => {
354
+ const server = mcpManager.getServer(name);
355
+ const connected = server?.isServerConnected() ? icons.success : icons.error;
356
+ const status = server?.isServerConnected() ? colors.success(connected) : colors.error(connected);
357
+ const toolNames = server?.getToolNames().join(', ') || '';
358
+ console.log(` ${status} ${colors.primaryBright(name)}`);
359
+ console.log(` ${colors.textDim(`Tools: ${toolNames}`)}`);
244
360
  console.log('');
245
361
  });
246
362
  }
363
+ process.exit(0);
247
364
  }
248
- else if (options.add) {
365
+ else if (options.get) {
366
+ const server = mcpManager.getServer(options.get);
367
+ if (!server) {
368
+ console.log('');
369
+ console.log(colors.error(`MCP server '${options.get}' not found`));
370
+ console.log(colors.textMuted('Use "xagent mcp --list" to see all configured servers'));
371
+ console.log('');
372
+ process.exit(1);
373
+ }
374
+ const config = server.config;
375
+ const isConnected = server.isServerConnected();
376
+ const toolNames = server.getToolNames();
377
+ const tools = server.getTools();
249
378
  console.log('');
250
- console.log(colors.warning('MCP server addition not implemented yet'));
251
- console.log(colors.textMuted('Use /mcp add in interactive mode'));
379
+ console.log(colors.primaryBright(`${icons.tool} MCP Server: ${options.get}`));
380
+ console.log(colors.border(icons.separator.repeat(40)));
252
381
  console.log('');
382
+ console.log(` ${colors.primaryBright('Status:')} ${isConnected ? colors.success('Connected') : colors.error('Disconnected')}`);
383
+ console.log(` ${colors.primaryBright('Transport:')} ${config.transport || 'stdio'}`);
384
+ if (config.url) {
385
+ console.log(` ${colors.primaryBright('URL:')} ${config.url}`);
386
+ }
387
+ if (config.command) {
388
+ console.log(` ${colors.primaryBright('Command:')} ${config.command} ${(config.args || []).join(' ')}`);
389
+ }
390
+ if (config.headers) {
391
+ console.log(` ${colors.primaryBright('Headers:')} ${JSON.stringify(config.headers)}`);
392
+ }
393
+ console.log(` ${colors.primaryBright('Tools:')} ${toolNames.length > 0 ? toolNames.join(', ') : colors.textMuted('(none)')}`);
394
+ if (tools.length > 0) {
395
+ console.log('');
396
+ console.log(colors.textMuted(' Available tools:'));
397
+ tools.forEach((tool) => {
398
+ console.log(` - ${colors.primaryBright(tool.name)}`);
399
+ if (tool.description) {
400
+ console.log(` ${colors.textDim(tool.description.substring(0, 60))}${tool.description.length > 60 ? '...' : ''}`);
401
+ }
402
+ });
403
+ }
404
+ console.log('');
405
+ process.exit(0);
406
+ }
407
+ else if (options.add !== undefined) {
408
+ // Check if running in non-interactive mode (transport and required params provided)
409
+ const hasTransport = options.transport;
410
+ const hasCommand = options.command;
411
+ const hasUrl = options.url;
412
+ const isNonInteractive = hasTransport && (hasCommand || hasUrl);
413
+ if (isNonInteractive) {
414
+ // Non-interactive mode: use command line arguments
415
+ const name = options.add || `mcp-${options.transport}-${Date.now().toString(36)}`;
416
+ const transport = options.transport;
417
+ const config = {
418
+ transport: transport,
419
+ };
420
+ if (transport === 'stdio') {
421
+ if (!options.command) {
422
+ console.log('');
423
+ console.log(colors.error('Error: --command is required for stdio transport'));
424
+ console.log('');
425
+ process.exit(1);
426
+ }
427
+ config.command = options.command;
428
+ if (options.args) {
429
+ config.args = options.args.split(',').map((a) => a.trim());
430
+ }
431
+ }
432
+ else if (transport === 'http') {
433
+ if (!options.url) {
434
+ console.log('');
435
+ console.log(colors.error('Error: --url is required for http transport'));
436
+ console.log('');
437
+ process.exit(1);
438
+ }
439
+ config.url = options.url;
440
+ const headers = {};
441
+ if (options.token) {
442
+ headers['Authorization'] = `Bearer ${options.token}`;
443
+ }
444
+ if (options.header) {
445
+ const headerArray = Array.isArray(options.header) ? options.header : [options.header];
446
+ for (const h of headerArray) {
447
+ const colonIndex = h.indexOf(':');
448
+ if (colonIndex > 0) {
449
+ const key = h.substring(0, colonIndex).trim();
450
+ const value = h.substring(colonIndex + 1).trim();
451
+ headers[key] = value;
452
+ }
453
+ }
454
+ }
455
+ if (Object.keys(headers).length > 0) {
456
+ config.headers = headers;
457
+ }
458
+ }
459
+ else {
460
+ console.log('');
461
+ console.log(colors.error(`Error: Unknown transport type: ${transport}`));
462
+ console.log(colors.textMuted('Valid types: stdio, http'));
463
+ console.log('');
464
+ process.exit(1);
465
+ }
466
+ // Skip confirmation in non-interactive mode
467
+ if (!options.yes) {
468
+ console.log('');
469
+ console.log(colors.textMuted('Server configuration:'));
470
+ console.log(` ${colors.primaryBright('Name:')} ${name}`);
471
+ console.log(` ${colors.primaryBright('Transport:')} ${config.transport}`);
472
+ if (config.command) {
473
+ console.log(` ${colors.primaryBright('Command:')} ${config.command} ${(config.args || []).join(' ')}`);
474
+ }
475
+ if (config.url) {
476
+ console.log(` ${colors.primaryBright('URL:')} ${config.url}`);
477
+ if (config.authToken) {
478
+ console.log(` ${colors.primaryBright('Token:')} [hidden]`);
479
+ }
480
+ }
481
+ console.log('');
482
+ }
483
+ try {
484
+ // Save to config
485
+ configManager.addMcpServer(name, config);
486
+ configManager.save(options.scope);
487
+ // Register with MCP manager
488
+ mcpManager.registerServer(name, config);
489
+ // Try to connect
490
+ let connected = false;
491
+ try {
492
+ await mcpManager.connectServer(name);
493
+ connected = true;
494
+ }
495
+ catch (error) {
496
+ console.log(colors.textMuted(` āš ļø Connection failed: ${error.message}`));
497
+ console.log(colors.textMuted(' The server is saved but not connected.'));
498
+ }
499
+ if (connected) {
500
+ console.log('');
501
+ console.log(colors.success(`āœ… MCP server '${name}' added and connected successfully`));
502
+ }
503
+ else {
504
+ console.log('');
505
+ console.log(colors.success(`āœ… MCP server '${name}' added successfully`));
506
+ }
507
+ console.log('');
508
+ process.exit(0);
509
+ }
510
+ catch (error) {
511
+ console.log('');
512
+ console.log(colors.error(`Failed to add MCP server: ${error.message}`));
513
+ console.log('');
514
+ process.exit(1);
515
+ }
516
+ }
517
+ else {
518
+ // Interactive mode
519
+ const { text, select, confirm } = await import('@clack/prompts');
520
+ const separator = icons.separator.repeat(40);
521
+ console.log('');
522
+ console.log(colors.primaryBright(`${icons.tool} Add MCP Server`));
523
+ console.log(colors.border(separator));
524
+ console.log('');
525
+ // Step 1: Enter server name
526
+ let name = options.add;
527
+ if (!name) {
528
+ name = await text({
529
+ message: 'Enter MCP server name:',
530
+ validate: (value) => {
531
+ if (!value || !value.trim()) {
532
+ return 'Server name is required';
533
+ }
534
+ if (!/^[a-zA-Z0-9_-]+$/.test(value)) {
535
+ return 'Server name must contain only alphanumeric characters, hyphens, and underscores';
536
+ }
537
+ return undefined;
538
+ },
539
+ });
540
+ }
541
+ // Step 2: Select transport type
542
+ const transport = await select({
543
+ message: 'Select transport type:',
544
+ options: [
545
+ { value: 'stdio', label: 'Stdio (stdin/stdout)' },
546
+ { value: 'http', label: 'HTTP (Streamable HTTP)' },
547
+ ],
548
+ });
549
+ if (typeof transport === 'symbol') {
550
+ console.log('');
551
+ console.log(colors.textMuted('Cancelled'));
552
+ console.log('');
553
+ return;
554
+ }
555
+ const config = {
556
+ transport: transport,
557
+ };
558
+ if (transport === 'stdio') {
559
+ // Step 3: Enter command
560
+ config.command = await text({
561
+ message: 'Enter command (for stdio transport):',
562
+ validate: (value) => value && value.trim() ? undefined : 'Command is required',
563
+ });
564
+ // Step 4: Enter arguments
565
+ const argsInput = await text({
566
+ message: 'Enter arguments (comma-separated, for stdio transport):',
567
+ defaultValue: '',
568
+ });
569
+ if (argsInput.trim()) {
570
+ config.args = argsInput.split(',').map((a) => a.trim());
571
+ }
572
+ }
573
+ else {
574
+ // Step 3: Enter URL
575
+ let url = '';
576
+ while (!url) {
577
+ url = await text({
578
+ message: 'Enter server URL (for HTTP transport):',
579
+ validate: (value) => {
580
+ if (!value || !value.trim()) {
581
+ return 'URL is required';
582
+ }
583
+ try {
584
+ new URL(value);
585
+ return undefined;
586
+ }
587
+ catch {
588
+ return 'Invalid URL format (e.g., https://example.com)';
589
+ }
590
+ },
591
+ });
592
+ }
593
+ config.url = url;
594
+ const headers = {};
595
+ // Step 4: Enter auth token (optional)
596
+ const authToken = await text({
597
+ message: 'Enter Bearer token (optional):',
598
+ defaultValue: '',
599
+ });
600
+ if (authToken.trim()) {
601
+ headers['Authorization'] = `Bearer ${authToken}`;
602
+ }
603
+ // Step 5: Enter custom headers (optional)
604
+ const headersInput = await text({
605
+ message: 'Enter custom headers as JSON (optional):',
606
+ defaultValue: '',
607
+ });
608
+ if (headersInput.trim()) {
609
+ try {
610
+ const customHeaders = JSON.parse(headersInput);
611
+ Object.assign(headers, customHeaders);
612
+ }
613
+ catch {
614
+ // Ignore invalid JSON
615
+ }
616
+ }
617
+ if (Object.keys(headers).length > 0) {
618
+ config.headers = headers;
619
+ }
620
+ }
621
+ // Step 6: Confirm and save
622
+ console.log('');
623
+ console.log(colors.textMuted('Server configuration:'));
624
+ console.log(` ${colors.primaryBright('Name:')} ${name}`);
625
+ console.log(` ${colors.primaryBright('Transport:')} ${config.transport}`);
626
+ if (config.command) {
627
+ console.log(` ${colors.primaryBright('Command:')} ${config.command} ${(config.args || []).join(' ')}`);
628
+ }
629
+ if (config.url) {
630
+ console.log(` ${colors.primaryBright('URL:')} ${config.url}`);
631
+ }
632
+ console.log('');
633
+ const shouldSave = await confirm({
634
+ message: 'Save this MCP server configuration?',
635
+ });
636
+ if (typeof shouldSave === 'symbol' || !shouldSave) {
637
+ console.log('');
638
+ console.log(colors.textMuted('Cancelled'));
639
+ console.log('');
640
+ return;
641
+ }
642
+ try {
643
+ // Save to config
644
+ configManager.addMcpServer(name, config);
645
+ configManager.save(options.scope);
646
+ // Register with MCP manager
647
+ mcpManager.registerServer(name, config);
648
+ // Try to connect
649
+ let connected = false;
650
+ try {
651
+ await mcpManager.connectServer(name);
652
+ connected = true;
653
+ }
654
+ catch (error) {
655
+ console.log(colors.textMuted(` āš ļø Connection failed: ${error.message}`));
656
+ console.log(colors.textMuted(' The server is saved but not connected. Use "/mcp refresh" in interactive mode to retry.'));
657
+ }
658
+ if (connected) {
659
+ console.log('');
660
+ console.log(colors.success(`āœ… MCP server '${name}' added and connected successfully`));
661
+ }
662
+ else {
663
+ console.log('');
664
+ console.log(colors.success(`āœ… MCP server '${name}' added successfully (not connected)`));
665
+ }
666
+ console.log('');
667
+ }
668
+ catch (error) {
669
+ console.log('');
670
+ console.log(colors.error(`Failed to add MCP server: ${error.message}`));
671
+ console.log('');
672
+ }
673
+ }
253
674
  }
254
675
  else if (options.remove) {
255
676
  try {
256
677
  mcpManager.disconnectServer(options.remove);
257
678
  const mcpServers = configManager.getMcpServers();
258
679
  delete mcpServers[options.remove];
259
- await configManager.save(options.scope);
680
+ configManager.save(options.scope);
260
681
  console.log('');
261
682
  console.log(colors.success(`MCP server ${options.remove} removed successfully`));
262
683
  console.log('');
684
+ process.exit(0);
263
685
  }
264
686
  catch (error) {
265
687
  const { message, suggestion } = formatError(error);
@@ -267,12 +689,32 @@ program
267
689
  console.log(colors.error(`Failed to remove MCP server: ${message}`));
268
690
  console.log(colors.textMuted(suggestion));
269
691
  console.log('');
692
+ process.exit(1);
270
693
  }
271
694
  }
272
695
  else {
273
696
  console.log('');
274
- console.log(colors.warning('Please specify an action: --list, --add, or --remove'));
697
+ console.log(colors.warning('Please specify an action: --list, --get, --add, or --remove'));
698
+ console.log('');
699
+ console.log(colors.textMuted('Usage:'));
700
+ console.log(` ${colors.primaryBright('xagent mcp --list')} ${colors.textMuted('| List all MCP servers')}`);
701
+ console.log(` ${colors.primaryBright('xagent mcp --get <name>')} ${colors.textMuted('| Get MCP server details')}`);
702
+ console.log(` ${colors.primaryBright('xagent mcp --add')} ${colors.textMuted('| Add MCP server (interactive)')}`);
703
+ console.log('');
704
+ console.log(colors.textMuted('Non-interactive examples:'));
705
+ console.log(` ${colors.primaryBright('xagent mcp --add -t stdio -c "npx" --args "-y,@modelcontextprotocol/server-github"')}`);
706
+ console.log(` ${colors.primaryBright('xagent mcp --add -t http -u "https://example.com/mcp" -k "token"')}`);
275
707
  console.log('');
708
+ console.log(colors.textMuted('Options:'));
709
+ console.log(` ${colors.primaryBright('-t, --transport')} ${colors.textMuted('Transport: stdio or http')}`);
710
+ console.log(` ${colors.primaryBright('-c, --command')} ${colors.textMuted('Command for stdio transport')}`);
711
+ console.log(` ${colors.primaryBright('--args')} ${colors.textMuted('Arguments (comma-separated)')}`);
712
+ console.log(` ${colors.primaryBright('-u, --url')} ${colors.textMuted('URL for HTTP transport')}`);
713
+ console.log(` ${colors.primaryBright('-k, --token')} ${colors.textMuted('Bearer authentication token')}`);
714
+ console.log(` ${colors.primaryBright('--header')} ${colors.textMuted('Custom header (key:value)')}`);
715
+ console.log(` ${colors.primaryBright('-y, --yes')} ${colors.textMuted('Skip confirmation')}`);
716
+ console.log('');
717
+ process.exit(1);
276
718
  }
277
719
  });
278
720
  program
@@ -291,6 +733,7 @@ program
291
733
  console.log(colors.success('Project initialized successfully!'));
292
734
  console.log(colors.textMuted('You can now run "xagent start" to begin'));
293
735
  console.log('');
736
+ process.exit(0);
294
737
  }
295
738
  catch (error) {
296
739
  const { message, suggestion } = formatError(error);
@@ -317,6 +760,7 @@ program
317
760
  console.log(colors.warning('No workflows installed'));
318
761
  console.log(colors.textMuted('Use --add to install workflows from the marketplace'));
319
762
  console.log('');
763
+ process.exit(0);
320
764
  }
321
765
  else {
322
766
  const separator = icons.separator.repeat(40);
@@ -330,6 +774,7 @@ program
330
774
  console.log(` ${colors.textDim(` ${workflow.description}`)}`);
331
775
  console.log('');
332
776
  });
777
+ process.exit(0);
333
778
  }
334
779
  }
335
780
  else if (options.add) {
@@ -338,6 +783,7 @@ program
338
783
  console.log('');
339
784
  console.log(colors.success(`Workflow ${options.add} added successfully!`));
340
785
  console.log('');
786
+ process.exit(0);
341
787
  }
342
788
  catch (error) {
343
789
  const { message, suggestion } = formatError(error);
@@ -354,6 +800,7 @@ program
354
800
  console.log('');
355
801
  console.log(colors.success(`Workflow ${options.remove} removed successfully!`));
356
802
  console.log('');
803
+ process.exit(0);
357
804
  }
358
805
  catch (error) {
359
806
  const { message, suggestion } = formatError(error);
@@ -368,6 +815,219 @@ program
368
815
  console.log('');
369
816
  console.log(colors.warning('Please specify an action: --list, --add, or --remove'));
370
817
  console.log('');
818
+ process.exit(1);
819
+ }
820
+ });
821
+ program
822
+ .command('skill')
823
+ .description('Manage skills')
824
+ .option('-l, --list', 'List all installed user skills')
825
+ .option('--add <source>', 'Install a skill (auto-detects local path or remote URL)')
826
+ .option('-r, --remove <skill-id>', 'Remove a user-installed skill')
827
+ .action(async (options) => {
828
+ const { getConfigManager } = await import('./config.js');
829
+ const configManager = getConfigManager();
830
+ const { promises: fs } = await import('fs');
831
+ const pathModule = await import('path');
832
+ const { exec } = await import('child_process');
833
+ const { promisify } = await import('util');
834
+ const os = await import('os');
835
+ const _execAsync = promisify(exec);
836
+ const userSkillsPath = configManager.getUserSkillsPath() || pathModule.join(os.homedir(), '.xagent', 'skills');
837
+ const _userNodeModulesPath = configManager.getUserNodeModulesPath() || pathModule.join(os.homedir(), '.xagent', 'node_modules');
838
+ if (options.add) {
839
+ const separator = icons.separator.repeat(40);
840
+ console.log('');
841
+ console.log(colors.primaryBright(`${icons.tool} Install Skill`));
842
+ console.log(colors.border(separator));
843
+ console.log('');
844
+ const source = options.add.trim();
845
+ const { installSkill } = await import('./skill-installer.js');
846
+ const { parseSource } = await import('./skill-installer.js');
847
+ // Auto-detect if source is local or remote
848
+ const parsed = parseSource(source);
849
+ const isLocal = parsed.type === 'local';
850
+ if (isLocal) {
851
+ // Local installation
852
+ const sourcePath = pathModule.resolve(source);
853
+ const skillName = pathModule.basename(sourcePath);
854
+ const destPath = pathModule.join(userSkillsPath, skillName);
855
+ try {
856
+ // Check if source exists
857
+ await fs.access(sourcePath);
858
+ // Check if SKILL.md exists
859
+ const skillMdPath = pathModule.join(sourcePath, 'SKILL.md');
860
+ try {
861
+ await fs.access(skillMdPath);
862
+ }
863
+ catch {
864
+ console.log(colors.error(`SKILL.md not found in ${sourcePath}`));
865
+ console.log(colors.textMuted('Each skill must have a SKILL.md file'));
866
+ console.log('');
867
+ process.exit(1);
868
+ }
869
+ // Check if skill already exists in user skills path
870
+ try {
871
+ await fs.access(destPath);
872
+ console.log(colors.warning(`Skill "${skillName}" already installed`));
873
+ console.log(colors.textMuted(`Use "xagent skill -r ${skillName}" to remove it first`));
874
+ console.log('');
875
+ process.exit(1);
876
+ }
877
+ catch {
878
+ // Doesn't exist, proceed
879
+ }
880
+ // Ensure user skills directory exists
881
+ await fs.mkdir(userSkillsPath, { recursive: true });
882
+ // Copy the skill
883
+ await copyDirectory(sourcePath, destPath);
884
+ console.log('');
885
+ console.log(colors.success(`āœ… Skill "${skillName}" installed successfully`));
886
+ console.log(colors.textMuted(` Location: ${destPath}`));
887
+ console.log(colors.textMuted(` Type: Local`));
888
+ console.log('');
889
+ // Notify running xAgent to update system prompt
890
+ await notifySkillUpdate(userSkillsPath);
891
+ console.log('');
892
+ process.exit(0);
893
+ }
894
+ catch (error) {
895
+ const { message, suggestion } = formatError(error);
896
+ console.log(colors.error(`Failed to install skill: ${message}`));
897
+ console.log(colors.textMuted(suggestion));
898
+ console.log('');
899
+ process.exit(1);
900
+ }
901
+ }
902
+ else {
903
+ // Remote installation
904
+ console.log(colors.textMuted(` Source: ${source}`));
905
+ console.log(colors.textMuted(` Type: Remote`));
906
+ console.log('');
907
+ try {
908
+ const result = await installSkill(source);
909
+ if (result.success) {
910
+ console.log(colors.success(`āœ… Skill "${result.skillName}" installed successfully`));
911
+ console.log(colors.textMuted(` Location: ${result.skillPath}`));
912
+ console.log('');
913
+ // Notify running xAgent to update system prompt
914
+ await notifySkillUpdate(userSkillsPath);
915
+ console.log(colors.textMuted('Note: Run "xagent start" to use the new skill'));
916
+ console.log('');
917
+ process.exit(0);
918
+ }
919
+ else {
920
+ console.log(colors.error(`Failed to install skill: ${result.error}`));
921
+ console.log('');
922
+ process.exit(1);
923
+ }
924
+ }
925
+ catch (error) {
926
+ const { message, suggestion } = formatError(error);
927
+ console.log(colors.error(`Failed to install skill: ${message}`));
928
+ console.log(colors.textMuted(suggestion));
929
+ console.log('');
930
+ process.exit(1);
931
+ }
932
+ }
933
+ }
934
+ else if (options.list) {
935
+ const separator = icons.separator.repeat(40);
936
+ console.log('');
937
+ console.log(colors.primaryBright(`${icons.tool} Skills`));
938
+ console.log(colors.border(separator));
939
+ console.log('');
940
+ try {
941
+ const entries = await fs.readdir(userSkillsPath, { withFileTypes: true });
942
+ const skills = entries.filter(e => e.isDirectory());
943
+ if (skills.length === 0) {
944
+ console.log(colors.textMuted('No user skills installed'));
945
+ console.log('');
946
+ return;
947
+ }
948
+ for (const skill of skills) {
949
+ const skillPath = path.join(userSkillsPath, skill.name);
950
+ const skillMdPath = path.join(skillPath, 'SKILL.md');
951
+ try {
952
+ const content = await fs.readFile(skillMdPath, 'utf-8');
953
+ // Simple parsing for name and description
954
+ const nameMatch = content.match(/^name:\s*(.+)$/m);
955
+ const descMatch = content.match(/^description:\s*(.+)$/m);
956
+ const name = nameMatch ? nameMatch[1].trim() : skill.name;
957
+ const description = descMatch ? descMatch[1].trim() : 'No description';
958
+ console.log(` ${colors.primaryBright(`• ${name}`)}`);
959
+ console.log(` ${colors.textDim(` ${description}`)}`);
960
+ console.log('');
961
+ }
962
+ catch {
963
+ console.log(` ${colors.primaryBright(`• ${skill.name}`)}`);
964
+ console.log(` ${colors.textDim(` (Missing SKILL.md)`)}`);
965
+ console.log('');
966
+ }
967
+ }
968
+ console.log(colors.textMuted(`Skills directory: ${userSkillsPath}`));
969
+ console.log('');
970
+ process.exit(0);
971
+ }
972
+ catch {
973
+ console.log(colors.textMuted('No user skills installed'));
974
+ console.log('');
975
+ }
976
+ }
977
+ else if (options.remove) {
978
+ const skillPath = path.join(userSkillsPath, options.remove);
979
+ // Protect find-skills from deletion
980
+ if (options.remove === 'find-skills') {
981
+ console.log('');
982
+ console.log(colors.error(`Cannot remove protected skill: find-skills`));
983
+ console.log(colors.textMuted('find-skills is a built-in skill that helps you discover and install other skills.'));
984
+ console.log('');
985
+ process.exit(1);
986
+ }
987
+ try {
988
+ await fs.access(skillPath);
989
+ // Verify it's in user skills path (not built-in)
990
+ if (!skillPath.startsWith(userSkillsPath)) {
991
+ console.log('');
992
+ console.log(colors.error(`Cannot remove skill outside user directory: ${options.remove}`));
993
+ console.log('');
994
+ process.exit(1);
995
+ }
996
+ // Remove the skill directory
997
+ await fs.rm(skillPath, { recursive: true, force: true });
998
+ console.log('');
999
+ console.log(colors.success(`āœ… Skill ${options.remove} removed successfully`));
1000
+ console.log('');
1001
+ // Notify running xAgent to update system prompt
1002
+ await notifySkillUpdate(userSkillsPath);
1003
+ console.log('');
1004
+ process.exit(0);
1005
+ }
1006
+ catch {
1007
+ console.log('');
1008
+ console.log(colors.error(`Skill not found: ${options.remove}`));
1009
+ console.log('');
1010
+ process.exit(1);
1011
+ }
1012
+ }
1013
+ else {
1014
+ // Show help
1015
+ console.log('');
1016
+ console.log(colors.textMuted('Usage:'));
1017
+ console.log(` ${colors.primaryBright('xagent skill -l')} ${colors.textDim('| List all skills')}`);
1018
+ console.log(` ${colors.primaryBright('xagent skill --add <source>')} ${colors.textDim('| Install skill (auto-detects local or remote)')}`);
1019
+ console.log(` ${colors.primaryBright('xagent skill -r <name>')} ${colors.textDim('| Remove a skill')}`);
1020
+ console.log('');
1021
+ console.log(colors.textMuted('Examples:'));
1022
+ console.log(` ${colors.primaryBright('xagent skill --add ./my-skill')} ${colors.textDim('| Install from local path')}`);
1023
+ console.log(` ${colors.primaryBright('xagent skill --add owner/repo')} ${colors.textDim('| Install from GitHub')}`);
1024
+ console.log(` ${colors.primaryBright('xagent skill --add https://github.com/owner/repo')}`);
1025
+ console.log(` ${colors.primaryBright('xagent skill --add https://docs.example.com/skill.md')}`);
1026
+ console.log('');
1027
+ console.log(colors.textMuted('To install a new skill, use the interactive command:'));
1028
+ console.log(` ${colors.primaryBright('/skill add')}`);
1029
+ console.log('');
1030
+ process.exit(0);
371
1031
  }
372
1032
  });
373
1033
  program
@@ -393,6 +1053,7 @@ program
393
1053
  console.log(` ${colors.primaryBright('šŸ“š Documentation:')} ${colors.primaryBright('https://platform.xagent.cn/cli/')}`);
394
1054
  console.log(` ${colors.primaryBright('šŸ’» GitHub:')} ${colors.primaryBright('https://github.com/xagent-ai/xagent-cli')}`);
395
1055
  console.log('');
1056
+ process.exit(0);
396
1057
  });
397
1058
  program
398
1059
  .command('gui')
@@ -433,11 +1094,14 @@ program
433
1094
  console.log('');
434
1095
  }
435
1096
  const { createGUISubAgent } = await import('./gui-subagent/index.js');
1097
+ // Create ref for tracking first VLM call across loop iterations
1098
+ const isFirstVlmCallRef = { current: true };
436
1099
  // Create remoteVlmCaller for remote mode (uses full messages for consistent behavior)
437
1100
  let remoteVlmCaller;
438
1101
  if (!isLocalMode && authConfig.baseUrl) {
439
1102
  const remoteBaseUrl = `${authConfig.baseUrl}/api/agent/vlm`;
440
- remoteVlmCaller = async (messages, _systemPrompt) => {
1103
+ remoteVlmCaller = async (messages, _systemPrompt, _taskId, isFirstVlmCallRef) => {
1104
+ const status = isFirstVlmCallRef.current ? 'begin' : 'continue';
441
1105
  const response = await fetch(remoteBaseUrl, {
442
1106
  method: 'POST',
443
1107
  headers: {
@@ -445,7 +1109,9 @@ program
445
1109
  'Authorization': `Bearer ${authConfig.apiKey || ''}`,
446
1110
  },
447
1111
  body: JSON.stringify({
448
- messages
1112
+ messages,
1113
+ taskId: _taskId,
1114
+ status
449
1115
  }),
450
1116
  });
451
1117
  if (!response.ok) {
@@ -453,14 +1119,17 @@ program
453
1119
  throw new Error(`Remote VLM error: ${response.status} - ${errorText}`);
454
1120
  }
455
1121
  const result = await response.json();
1122
+ // Update ref after call so subsequent calls use 'continue'
1123
+ isFirstVlmCallRef.current = false;
456
1124
  return result.response || result.content || result.message || '';
457
1125
  };
458
1126
  }
459
- const guiAgent = await createGUISubAgent({
1127
+ const _guiAgent = await createGUISubAgent({
460
1128
  headless: options.headless ?? false,
461
1129
  model: isLocalMode ? modelName : undefined,
462
1130
  modelBaseUrl: isLocalMode ? baseUrl : undefined,
463
1131
  modelApiKey: isLocalMode ? apiKey : undefined,
1132
+ isFirstVlmCallRef,
464
1133
  remoteVlmCaller,
465
1134
  isLocalMode,
466
1135
  });
@@ -524,7 +1193,7 @@ program
524
1193
  if (files.length === 0) {
525
1194
  console.log(colors.textMuted('No memory files found.'));
526
1195
  console.log('');
527
- return;
1196
+ process.exit(0);
528
1197
  }
529
1198
  const globalFile = files.find(f => f === 'global.md');
530
1199
  const projectFiles = files.filter(f => f.startsWith('project_'));
@@ -557,7 +1226,7 @@ program
557
1226
  console.log(colors.textMuted(`Total: ${files.length} memory file(s)`));
558
1227
  console.log('');
559
1228
  }
560
- catch (error) {
1229
+ catch {
561
1230
  console.log(colors.textMuted('No memory files found.'));
562
1231
  console.log('');
563
1232
  }
@@ -573,7 +1242,7 @@ program
573
1242
  if (projectFiles.length === 0) {
574
1243
  console.log(colors.textMuted('No project memories to clean.'));
575
1244
  console.log('');
576
- return;
1245
+ process.exit(0);
577
1246
  }
578
1247
  let cleaned = 0;
579
1248
  for (const file of projectFiles) {
@@ -637,7 +1306,7 @@ program
637
1306
  if (files.length === 0) {
638
1307
  console.log(colors.textMuted('No memory files to clean.'));
639
1308
  console.log('');
640
- return;
1309
+ process.exit(0);
641
1310
  }
642
1311
  let cleaned = 0;
643
1312
  for (const file of files) {
@@ -670,6 +1339,50 @@ program
670
1339
  console.log('');
671
1340
  }
672
1341
  });
1342
+ program
1343
+ .command('update')
1344
+ .description('Check for updates and update xAgent CLI')
1345
+ .action(async () => {
1346
+ const separator = icons.separator.repeat(40);
1347
+ console.log('');
1348
+ console.log(colors.primaryBright(`${icons.rocket} Update Check`));
1349
+ console.log(colors.border(separator));
1350
+ console.log('');
1351
+ try {
1352
+ const { getUpdateManager } = await import('./update.js');
1353
+ const updateManager = getUpdateManager();
1354
+ const versionInfo = await updateManager.checkForUpdates();
1355
+ console.log(` ${icons.info} ${colors.textMuted('Current version:')} ${colors.primaryBright(versionInfo.currentVersion)}`);
1356
+ console.log(` ${icons.code} ${colors.textMuted('Latest version:')} ${colors.primaryBright(versionInfo.latestVersion)}`);
1357
+ console.log('');
1358
+ if (versionInfo.updateAvailable) {
1359
+ console.log(colors.success(` šŸ“¦ A new version is available!`));
1360
+ console.log('');
1361
+ if (versionInfo.releaseNotes) {
1362
+ console.log(colors.textMuted(' Release Notes:'));
1363
+ console.log(colors.textDim(` ${versionInfo.releaseNotes}`));
1364
+ console.log('');
1365
+ }
1366
+ const shouldUpdate = await confirm({
1367
+ message: 'Do you want to update now?',
1368
+ });
1369
+ if (shouldUpdate === true) {
1370
+ console.log('');
1371
+ await updateManager.autoUpdate();
1372
+ process.exit(0);
1373
+ }
1374
+ }
1375
+ else {
1376
+ console.log(colors.success(` āœ… You are using the latest version`));
1377
+ console.log('');
1378
+ process.exit(0);
1379
+ }
1380
+ }
1381
+ catch (error) {
1382
+ console.log(colors.error(` āŒ Failed to check for updates: ${error.message}`));
1383
+ console.log('');
1384
+ }
1385
+ });
673
1386
  program.parse(process.argv);
674
1387
  if (!process.argv.slice(2).length) {
675
1388
  program.outputHelp();
@@ -678,7 +1391,7 @@ if (!process.argv.slice(2).length) {
678
1391
  // Global error handling - prevent crashes from uncaught errors
679
1392
  // ============================================================
680
1393
  // Handle uncaught promise rejections
681
- process.on('unhandledRejection', (reason, promise) => {
1394
+ process.on('unhandledRejection', (reason, _promise) => {
682
1395
  console.error('\nāŒ An unexpected error occurred');
683
1396
  if (reason instanceof Error) {
684
1397
  console.error(` ${reason.message}`);