@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/src/workflow.ts CHANGED
@@ -1,508 +1,523 @@
1
- import fs from 'fs/promises';
2
- import fsSync from 'fs';
3
- import path from 'path';
4
- import os from 'os';
5
- import axios from 'axios';
6
- import { AgentConfig, MCPServerConfig } from './types.js';
7
- import { SkillLoader, getSkillLoader } from './skill-loader.js';
8
- import { getConfigManager } from './config.js';
9
-
10
- export interface WorkflowConfig {
11
- id: string;
12
- name: string;
13
- description: string;
14
- version: string;
15
- author: string;
16
- agents: AgentConfig[];
17
- commands: Record<string, string>;
18
- mcpServers: Record<string, MCPServerConfig>;
19
- xagentMd: string;
20
- files: Record<string, string>;
21
- }
22
-
23
- export class WorkflowManager {
24
- private globalWorkflowsPath: string;
25
- private projectWorkflowsPath: string;
26
- private installedWorkflows: Map<string, WorkflowConfig> = new Map();
27
-
28
- constructor(projectRoot?: string) {
29
- this.globalWorkflowsPath = path.join(os.homedir(), '.xagent', 'workflows');
30
- this.projectWorkflowsPath = projectRoot
31
- ? path.join(projectRoot, '.xagent', 'workflows')
32
- : '';
33
- }
34
-
35
- async loadWorkflows(): Promise<void> {
36
- await this.loadWorkflowsFromDirectory(this.globalWorkflowsPath, 'global');
37
-
38
- if (this.projectWorkflowsPath) {
39
- await this.loadWorkflowsFromDirectory(this.projectWorkflowsPath, 'project');
40
- }
41
-
42
- // Load skills from the skills folder
43
- await this.loadSkills();
44
- }
45
-
46
- private async findSkillsPath(): Promise<string | null> {
47
- // First, try to get from config
48
- const configManager = getConfigManager();
49
- const configuredPath = configManager.getSkillsPath();
50
-
51
- if (configuredPath) {
52
- return configuredPath;
53
- }
54
-
55
- // Fallback: auto-detect relative to script location
56
- const scriptDir = path.dirname(process.argv[1]);
57
- const possiblePaths = [
58
- path.join(scriptDir, '..', 'skills', 'skills'),
59
- path.join(scriptDir, '..', '..', 'skills', 'skills'),
60
- path.join(scriptDir, 'skills', 'skills'),
61
- path.join(scriptDir, '..', '..', '..', 'skills', 'skills'),
62
- path.join(process.cwd(), 'skills', 'skills')
63
- ];
64
-
65
- for (const p of possiblePaths) {
66
- try {
67
- const resolvedPath = path.resolve(p);
68
- const stat = await fs.stat(resolvedPath);
69
- if (stat.isDirectory()) {
70
- return resolvedPath;
71
- }
72
- } catch {
73
- continue;
74
- }
75
- }
76
-
77
- return null;
78
- }
79
-
80
- async loadSkills(): Promise<void> {
81
- try {
82
- const skillsPath = await this.findSkillsPath();
83
- if (!skillsPath) return;
84
-
85
- const skillLoader = getSkillLoader({ skillsRootPath: skillsPath });
86
- await skillLoader.loadAllSkills();
87
-
88
- const workflows = await skillLoader.convertAllToWorkflows();
89
- for (const workflow of workflows) {
90
- this.installedWorkflows.set(workflow.id, workflow);
91
- }
92
-
93
- if (workflows.length > 0) {
94
- console.log(`✅ Loaded ${workflows.length} skills from skills folder`);
95
- }
96
- } catch (error) {
97
- // Skills folder is optional, so we silently ignore errors
98
- }
99
- }
100
-
101
- private async loadWorkflowsFromDirectory(dirPath: string, scope: 'global' | 'project'): Promise<void> {
102
- try {
103
- const files = await fs.readdir(dirPath);
104
-
105
- for (const file of files) {
106
- if (file.endsWith('.json')) {
107
- const filePath = path.join(dirPath, file);
108
- const content = await fs.readFile(filePath, 'utf-8');
109
- const workflow: WorkflowConfig = JSON.parse(content);
110
- workflow.id = file.replace('.json', '');
111
- this.installedWorkflows.set(workflow.id, workflow);
112
- }
113
- }
114
- } catch (error) {
115
- if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {
116
- console.error(`Failed to load workflows from ${dirPath}:`, error);
117
- }
118
- }
119
- }
120
-
121
- async addWorkflow(workflowId: string, scope: 'global' | 'project' = 'project'): Promise<void> {
122
- const workflowsPath = scope === 'global' ? this.globalWorkflowsPath : this.projectWorkflowsPath;
123
-
124
- if (!workflowsPath) {
125
- throw new Error('Project workflows path not set');
126
- }
127
-
128
- console.log(`Downloading workflow: ${workflowId}`);
129
-
130
- try {
131
- const workflowData = await this.downloadWorkflow(workflowId);
132
-
133
- await fs.mkdir(workflowsPath, { recursive: true });
134
-
135
- const workflowPath = path.join(workflowsPath, `${workflowId}.json`);
136
- await fs.writeFile(workflowPath, JSON.stringify(workflowData, null, 2), 'utf-8');
137
-
138
- await this.installWorkflowFiles(workflowData, scope);
139
- await this.installWorkflowAgents(workflowData, scope);
140
- await this.installWorkflowMcpServers(workflowData, scope);
141
-
142
- this.installedWorkflows.set(workflowId, workflowData);
143
-
144
- console.log(`✅ Workflow ${workflowData.name} installed successfully!`);
145
- } catch (error: any) {
146
- console.error(`❌ Failed to install workflow: ${error.message}`);
147
- throw error;
148
- }
149
- }
150
-
151
- private async downloadWorkflow(workflowId: string): Promise<WorkflowConfig> {
152
- const marketplaceUrl = `https://platform.xagent.cn/api/workflows/${workflowId}`;
153
-
154
- try {
155
- const response = await axios.get(marketplaceUrl, {
156
- timeout: 30000
157
- });
158
-
159
- return response.data;
160
- } catch (error) {
161
- console.error('Failed to download workflow from marketplace');
162
- throw new Error('Workflow download failed. Please check your network connection.');
163
- }
164
- }
165
-
166
- private async installWorkflowFiles(workflow: WorkflowConfig, scope: 'global' | 'project'): Promise<void> {
167
- if (!workflow.files || Object.keys(workflow.files).length === 0) {
168
- return;
169
- }
170
-
171
- const baseDir = scope === 'global'
172
- ? this.globalWorkflowsPath
173
- : path.dirname(this.projectWorkflowsPath);
174
-
175
- for (const [filePath, content] of Object.entries(workflow.files)) {
176
- const fullPath = path.join(baseDir, filePath);
177
- const dir = path.dirname(fullPath);
178
-
179
- await fs.mkdir(dir, { recursive: true });
180
- await fs.writeFile(fullPath, content, 'utf-8');
181
- }
182
-
183
- console.log(`✅ Installed ${Object.keys(workflow.files).length} workflow files`);
184
- }
185
-
186
- private async installWorkflowAgents(workflow: WorkflowConfig, scope: 'global' | 'project'): Promise<void> {
187
- if (!workflow.agents || workflow.agents.length === 0) {
188
- return;
189
- }
190
-
191
- const { getAgentManager } = await import('./agents.js');
192
- const agentManager = getAgentManager(
193
- scope === 'project' ? path.dirname(this.projectWorkflowsPath) : undefined
194
- );
195
-
196
- for (const agent of workflow.agents) {
197
- try {
198
- await agentManager.addAgent(agent, scope);
199
- } catch (error: any) {
200
- console.warn(`Failed to install agent ${agent.agentType}: ${error.message}`);
201
- }
202
- }
203
-
204
- console.log(`✅ Installed ${workflow.agents.length} agents`);
205
- }
206
-
207
- private async installWorkflowMcpServers(workflow: WorkflowConfig, scope: 'global' | 'project'): Promise<void> {
208
- if (!workflow.mcpServers || Object.keys(workflow.mcpServers).length === 0) {
209
- return;
210
- }
211
-
212
- const { getConfigManager } = await import('./config.js');
213
- const configManager = getConfigManager(
214
- scope === 'project' ? path.dirname(this.projectWorkflowsPath) : undefined
215
- );
216
-
217
- for (const [name, config] of Object.entries(workflow.mcpServers)) {
218
- try {
219
- configManager.addMcpServer(name, config);
220
- } catch (error: any) {
221
- console.warn(`Failed to install MCP server ${name}: ${error.message}`);
222
- }
223
- }
224
-
225
- await configManager.save(scope);
226
- console.log(`✅ Installed ${Object.keys(workflow.mcpServers).length} MCP servers`);
227
- }
228
-
229
- async removeWorkflow(workflowId: string, scope: 'global' | 'project' = 'project'): Promise<void> {
230
- const workflowsPath = scope === 'global' ? this.globalWorkflowsPath : this.projectWorkflowsPath;
231
-
232
- if (!workflowsPath) {
233
- throw new Error('Project workflows path not set');
234
- }
235
-
236
- const workflow = this.installedWorkflows.get(workflowId);
237
-
238
- if (!workflow) {
239
- throw new Error(`Workflow not found: ${workflowId}`);
240
- }
241
-
242
- try {
243
- const workflowPath = path.join(workflowsPath, `${workflowId}.json`);
244
- await fs.unlink(workflowPath);
245
-
246
- await this.removeWorkflowFiles(workflow, scope);
247
- await this.removeWorkflowAgents(workflow, scope);
248
- await this.removeWorkflowMcpServers(workflow, scope);
249
-
250
- this.installedWorkflows.delete(workflowId);
251
-
252
- console.log(`✅ Workflow ${workflow.name} removed successfully!`);
253
- } catch (error: any) {
254
- console.error(`❌ Failed to remove workflow: ${error.message}`);
255
- throw error;
256
- }
257
- }
258
-
259
- private async removeWorkflowFiles(workflow: WorkflowConfig, scope: 'global' | 'project'): Promise<void> {
260
- if (!workflow.files || Object.keys(workflow.files).length === 0) {
261
- return;
262
- }
263
-
264
- const baseDir = scope === 'global'
265
- ? this.globalWorkflowsPath
266
- : path.dirname(this.projectWorkflowsPath);
267
-
268
- for (const filePath of Object.keys(workflow.files)) {
269
- const fullPath = path.join(baseDir, filePath);
270
-
271
- try {
272
- await fs.unlink(fullPath);
273
- } catch (error) {
274
- console.warn(`Failed to remove file ${filePath}: ${error}`);
275
- }
276
- }
277
- }
278
-
279
- private async removeWorkflowAgents(workflow: WorkflowConfig, scope: 'global' | 'project'): Promise<void> {
280
- if (!workflow.agents || workflow.agents.length === 0) {
281
- return;
282
- }
283
-
284
- const { getAgentManager } = await import('./agents.js');
285
- const agentManager = getAgentManager(
286
- scope === 'project' ? path.dirname(this.projectWorkflowsPath) : undefined
287
- );
288
-
289
- for (const agent of workflow.agents) {
290
- try {
291
- await agentManager.removeAgent(agent.agentType, scope);
292
- } catch (error: any) {
293
- console.warn(`Failed to remove agent ${agent.agentType}: ${error.message}`);
294
- }
295
- }
296
- }
297
-
298
- private async removeWorkflowMcpServers(workflow: WorkflowConfig, scope: 'global' | 'project'): Promise<void> {
299
- if (!workflow.mcpServers || Object.keys(workflow.mcpServers).length === 0) {
300
- return;
301
- }
302
-
303
- const { getConfigManager } = await import('./config.js');
304
- const configManager = getConfigManager(
305
- scope === 'project' ? path.dirname(this.projectWorkflowsPath) : undefined
306
- );
307
-
308
- for (const name of Object.keys(workflow.mcpServers)) {
309
- try {
310
- configManager.removeMcpServer(name);
311
- } catch (error: any) {
312
- console.warn(`Failed to remove MCP server ${name}: ${error.message}`);
313
- }
314
- }
315
-
316
- await configManager.save(scope);
317
- }
318
-
319
- listWorkflows(): WorkflowConfig[] {
320
- return Array.from(this.installedWorkflows.values());
321
- }
322
-
323
- async listSkills(): Promise<{ id: string; name: string; description: string; category: string }[]> {
324
- try {
325
- const skillsPath = await this.findSkillsPath();
326
- if (!skillsPath) return [];
327
-
328
- const skillLoader = getSkillLoader({ skillsRootPath: skillsPath });
329
- const skills = await skillLoader.loadAllSkills();
330
-
331
- return skills.map(skill => ({
332
- id: skill.id,
333
- name: skill.name,
334
- description: skill.description,
335
- category: skill.category
336
- }));
337
- } catch (error) {
338
- console.error('Failed to list skills:', error);
339
- return [];
340
- }
341
- }
342
-
343
- getWorkflow(workflowId: string): WorkflowConfig | undefined {
344
- return this.installedWorkflows.get(workflowId);
345
- }
346
-
347
- async getSkillDetails(skillId: string): Promise<{ id: string; name: string; description: string; content: string; category: string } | null> {
348
- try {
349
- const skillsPath = await this.findSkillsPath();
350
- if (!skillsPath) return null;
351
-
352
- const skillLoader = getSkillLoader({ skillsRootPath: skillsPath });
353
-
354
- // Reload skills to ensure we have the latest
355
- await skillLoader.loadAllSkills();
356
-
357
- const skill = skillLoader.getSkill(skillId);
358
- if (!skill) return null;
359
-
360
- return {
361
- id: skill.id,
362
- name: skill.name,
363
- description: skill.description,
364
- content: skill.markdown,
365
- category: skill.category
366
- };
367
- } catch (error) {
368
- console.error(`Failed to get skill details for ${skillId}:`, error);
369
- return null;
370
- }
371
- }
372
-
373
- async listOnlineWorkflows(): Promise<WorkflowConfig[]> {
374
- try {
375
- const marketplaceUrl = 'https://platform.xagent.cn/api/workflows';
376
- const response = await axios.get(marketplaceUrl, {
377
- timeout: 30000
378
- });
379
-
380
- return response.data.workflows || [];
381
- } catch (error) {
382
- console.error('Failed to fetch online workflows');
383
- return [];
384
- }
385
- }
386
-
387
- async searchWorkflows(query: string): Promise<WorkflowConfig[]> {
388
- const onlineWorkflows = await this.listOnlineWorkflows();
389
-
390
- const lowerQuery = query.toLowerCase();
391
-
392
- return onlineWorkflows.filter(workflow =>
393
- workflow.name.toLowerCase().includes(lowerQuery) ||
394
- workflow.description.toLowerCase().includes(lowerQuery) ||
395
- workflow.id.toLowerCase().includes(lowerQuery)
396
- );
397
- }
398
-
399
- async executeWorkflow(workflowId: string, input: string): Promise<void> {
400
- const workflow = this.getWorkflow(workflowId);
401
-
402
- if (!workflow) {
403
- throw new Error(`Workflow not found: ${workflowId}`);
404
- }
405
-
406
- console.log(`Executing workflow: ${workflow.name}`);
407
- console.log(`Description: ${workflow.description}\n`);
408
-
409
- if (workflow.commands && Object.keys(workflow.commands).length > 0) {
410
- console.log('Available commands:');
411
- Object.entries(workflow.commands).forEach(([name, description]) => {
412
- console.log(` /${name} - ${description}`);
413
- });
414
- console.log();
415
- }
416
-
417
- const { SlashCommandHandler } = await import('./slash-commands.js');
418
- const slashHandler = new SlashCommandHandler();
419
-
420
- const commandMatch = input.match(/^\/(\w+)(?:\s+(.*))?$/);
421
-
422
- if (commandMatch) {
423
- const [, command, args] = commandMatch;
424
-
425
- if (workflow.commands[command]) {
426
- await slashHandler.handleCommand(`/${command} ${args || ''}`);
427
- } else {
428
- console.log(`Unknown workflow command: /${command}`);
429
- }
430
- } else {
431
- const { InteractiveSession } = await import('./session.js');
432
- const session = new InteractiveSession();
433
- await session.processUserMessage(input);
434
- }
435
- }
436
-
437
- async createWorkflowPackage(projectRoot: string): Promise<Buffer> {
438
- const workflowId = path.basename(projectRoot);
439
- const workflowConfigPath = path.join(projectRoot, '.xagent', 'workflow.json');
440
-
441
- let workflowConfig: WorkflowConfig;
442
-
443
- try {
444
- const content = await fs.readFile(workflowConfigPath, 'utf-8');
445
- workflowConfig = JSON.parse(content);
446
- } catch (error) {
447
- throw new Error('workflow.json not found. Please create it first.');
448
- }
449
-
450
- const { getAgentManager } = await import('./agents.js');
451
- const agentManager = getAgentManager(projectRoot);
452
- await agentManager.loadAgents();
453
-
454
- const agents = agentManager.getAllAgents();
455
- workflowConfig.agents = agents;
456
-
457
- const { getConfigManager } = await import('./config.js');
458
- const configManager = getConfigManager(projectRoot);
459
- workflowConfig.mcpServers = configManager.getMcpServers();
460
-
461
- const { getMemoryManager } = await import('./memory.js');
462
- const memoryManager = getMemoryManager(projectRoot);
463
- const xagentMd = await memoryManager.loadMemory();
464
- workflowConfig.xagentMd = xagentMd;
465
-
466
- const archiverModule = await import('archiver');
467
- const archiver = archiverModule.default;
468
- const streamModule = await import('stream');
469
- const globModule = await import('glob');
470
-
471
- const archive = archiver('zip', { zlib: { level: 9 } });
472
- const chunks: Buffer[] = [];
473
-
474
- const glob = globModule.glob;
475
- const files = await glob('**/*', {
476
- cwd: projectRoot,
477
- ignore: ['node_modules/**', '.git/**', 'dist/**', 'build/**', '.xagent/**']
478
- });
479
-
480
- return new Promise((resolve, reject) => {
481
- archive.on('data', (chunk: Buffer) => chunks.push(chunk));
482
- archive.on('end', () => resolve(Buffer.concat(chunks)));
483
- archive.on('error', reject);
484
-
485
- const readable = streamModule.Readable.from([]);
486
- archive.pipe(readable as any);
487
-
488
- archive.append(JSON.stringify(workflowConfig, null, 2), { name: 'workflow.json' });
489
-
490
- for (const file of files) {
491
- const filePath = path.join(projectRoot, file);
492
- archive.file(filePath, { name: file });
493
- }
494
-
495
- archive.finalize();
496
- });
497
- }
498
- }
499
-
500
- let workflowManagerInstance: WorkflowManager | null = null;
501
-
502
- export function getWorkflowManager(projectRoot?: string): WorkflowManager {
503
- if (!workflowManagerInstance || projectRoot) {
504
- workflowManagerInstance = new WorkflowManager(projectRoot);
505
- workflowManagerInstance.loadWorkflows();
506
- }
507
- return workflowManagerInstance;
508
- }
1
+ import fs from 'fs/promises';
2
+ import fsSync from 'fs';
3
+ import path from 'path';
4
+ import os from 'os';
5
+ import axios from 'axios';
6
+ import { AgentConfig, MCPServerConfig } from './types.js';
7
+ import { SkillLoader, getSkillLoader } from './skill-loader.js';
8
+ import { getConfigManager } from './config.js';
9
+
10
+ export interface WorkflowConfig {
11
+ id: string;
12
+ name: string;
13
+ description: string;
14
+ version: string;
15
+ author: string;
16
+ agents: AgentConfig[];
17
+ commands: Record<string, string>;
18
+ mcpServers: Record<string, MCPServerConfig>;
19
+ xagentMd: string;
20
+ files: Record<string, string>;
21
+ }
22
+
23
+ export class WorkflowManager {
24
+ private globalWorkflowsPath: string;
25
+ private projectWorkflowsPath: string;
26
+ private installedWorkflows: Map<string, WorkflowConfig> = new Map();
27
+
28
+ constructor(projectRoot?: string) {
29
+ this.globalWorkflowsPath = path.join(os.homedir(), '.xagent', 'workflows');
30
+ this.projectWorkflowsPath = projectRoot
31
+ ? path.join(projectRoot, '.xagent', 'workflows')
32
+ : '';
33
+ }
34
+
35
+ async loadWorkflows(): Promise<void> {
36
+ await this.loadWorkflowsFromDirectory(this.globalWorkflowsPath, 'global');
37
+
38
+ if (this.projectWorkflowsPath) {
39
+ await this.loadWorkflowsFromDirectory(this.projectWorkflowsPath, 'project');
40
+ }
41
+
42
+ // Load skills from the skills folder
43
+ await this.loadSkills();
44
+ }
45
+
46
+ async loadSkills(): Promise<void> {
47
+ try {
48
+ // All skills are loaded from user directory (~/.xagent/skills)
49
+ // Built-in skills are copied to user directory during initialization (see session.ts)
50
+ const configManager = getConfigManager();
51
+ const skillsPath = configManager.getUserSkillsPath();
52
+
53
+ if (!skillsPath) {
54
+ return;
55
+ }
56
+
57
+ // Verify the path exists before loading
58
+ try {
59
+ await fs.access(skillsPath);
60
+ } catch {
61
+ // User skills directory doesn't exist yet (first run)
62
+ return;
63
+ }
64
+
65
+ const skillLoader = getSkillLoader({ userSkillsRootPath: skillsPath });
66
+ await skillLoader.loadAllSkills();
67
+
68
+ const workflows = await skillLoader.convertAllToWorkflows();
69
+ for (const workflow of workflows) {
70
+ this.installedWorkflows.set(workflow.id, workflow);
71
+ }
72
+
73
+ if (workflows.length > 0) {
74
+ console.log(`✅ Loaded ${workflows.length} skills from skills folder`);
75
+ }
76
+ } catch (error) {
77
+ console.warn(`[workflow] Failed to load skills: ${error instanceof Error ? error.message : String(error)}`);
78
+ }
79
+ }
80
+
81
+ private async loadWorkflowsFromDirectory(dirPath: string, scope: 'global' | 'project'): Promise<void> {
82
+ try {
83
+ const files = await fs.readdir(dirPath);
84
+
85
+ for (const file of files) {
86
+ if (file.endsWith('.json')) {
87
+ const filePath = path.join(dirPath, file);
88
+ const content = await fs.readFile(filePath, 'utf-8');
89
+ const workflow: WorkflowConfig = JSON.parse(content);
90
+ workflow.id = file.replace('.json', '');
91
+ this.installedWorkflows.set(workflow.id, workflow);
92
+ }
93
+ }
94
+ } catch (error) {
95
+ if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {
96
+ console.error(`[workflow] Failed to load workflows from ${dirPath}: ${error instanceof Error ? error.message : String(error)}`);
97
+ }
98
+ }
99
+ }
100
+
101
+ /**
102
+ * Validate workflow ID format - only allow alphanumeric, hyphens, and underscores
103
+ * @returns validation error message, or null if valid
104
+ */
105
+ private validateWorkflowId(workflowId: string): string | null {
106
+ if (!workflowId || typeof workflowId !== 'string' || !workflowId.trim()) {
107
+ return 'Workflow ID is required';
108
+ }
109
+ if (!/^[a-zA-Z0-9_-]+$/.test(workflowId)) {
110
+ return 'Workflow ID must contain only alphanumeric characters, hyphens, and underscores';
111
+ }
112
+ return null;
113
+ }
114
+
115
+ async addWorkflow(workflowId: string, scope: 'global' | 'project' = 'project'): Promise<void> {
116
+ const validationError = this.validateWorkflowId(workflowId);
117
+ if (validationError) {
118
+ throw new Error(validationError);
119
+ }
120
+
121
+ const workflowsPath = scope === 'global' ? this.globalWorkflowsPath : this.projectWorkflowsPath;
122
+
123
+ if (!workflowsPath) {
124
+ throw new Error('Project workflows path not set');
125
+ }
126
+
127
+ console.log(`Downloading workflow: ${workflowId}`);
128
+
129
+ try {
130
+ const workflowData = await this.downloadWorkflow(workflowId);
131
+
132
+ await fs.mkdir(workflowsPath, { recursive: true });
133
+
134
+ const workflowPath = path.join(workflowsPath, `${workflowId}.json`);
135
+ await fs.writeFile(workflowPath, JSON.stringify(workflowData, null, 2), 'utf-8');
136
+
137
+ await this.installWorkflowFiles(workflowData, scope);
138
+ await this.installWorkflowAgents(workflowData, scope);
139
+ await this.installWorkflowMcpServers(workflowData, scope);
140
+
141
+ this.installedWorkflows.set(workflowId, workflowData);
142
+
143
+ console.log(`✅ Workflow ${workflowData.name} installed successfully!`);
144
+ } catch (error: any) {
145
+ console.error(`❌ Failed to install workflow: ${error.message}`);
146
+ throw error;
147
+ }
148
+ }
149
+
150
+ private async downloadWorkflow(workflowId: string): Promise<WorkflowConfig> {
151
+ const marketplaceUrl = `https://platform.xagent.cn/api/workflows/${workflowId}`;
152
+
153
+ try {
154
+ const response = await axios.get(marketplaceUrl, {
155
+ timeout: 30000
156
+ });
157
+
158
+ return response.data;
159
+ } catch (error) {
160
+ const errorMsg = error instanceof Error ? error.message : String(error);
161
+ console.error(`[workflow] Failed to download workflow ${workflowId}: ${errorMsg}`);
162
+ throw new Error(`Workflow download failed: ${errorMsg}`);
163
+ }
164
+ }
165
+
166
+ private async installWorkflowFiles(workflow: WorkflowConfig, scope: 'global' | 'project'): Promise<void> {
167
+ if (!workflow.files || Object.keys(workflow.files).length === 0) {
168
+ return;
169
+ }
170
+
171
+ const baseDir = scope === 'global'
172
+ ? this.globalWorkflowsPath
173
+ : path.dirname(this.projectWorkflowsPath);
174
+
175
+ for (const [filePath, content] of Object.entries(workflow.files)) {
176
+ const fullPath = path.join(baseDir, filePath);
177
+ const dir = path.dirname(fullPath);
178
+
179
+ await fs.mkdir(dir, { recursive: true });
180
+ await fs.writeFile(fullPath, content, 'utf-8');
181
+ }
182
+
183
+ console.log(`✅ Installed ${Object.keys(workflow.files).length} workflow files`);
184
+ }
185
+
186
+ private async installWorkflowAgents(workflow: WorkflowConfig, scope: 'global' | 'project'): Promise<void> {
187
+ if (!workflow.agents || workflow.agents.length === 0) {
188
+ return;
189
+ }
190
+
191
+ const { getAgentManager } = await import('./agents.js');
192
+ const agentManager = getAgentManager(
193
+ scope === 'project' ? path.dirname(this.projectWorkflowsPath) : undefined
194
+ );
195
+
196
+ for (const agent of workflow.agents) {
197
+ try {
198
+ await agentManager.addAgent(agent, scope);
199
+ } catch (error: any) {
200
+ console.warn(`Failed to install agent ${agent.agentType}: ${error.message}`);
201
+ }
202
+ }
203
+
204
+ console.log(`✅ Installed ${workflow.agents.length} agents`);
205
+ }
206
+
207
+ private async installWorkflowMcpServers(workflow: WorkflowConfig, scope: 'global' | 'project'): Promise<void> {
208
+ if (!workflow.mcpServers || Object.keys(workflow.mcpServers).length === 0) {
209
+ return;
210
+ }
211
+
212
+ const { getConfigManager } = await import('./config.js');
213
+ const configManager = getConfigManager(
214
+ scope === 'project' ? path.dirname(this.projectWorkflowsPath) : undefined
215
+ );
216
+
217
+ for (const [name, config] of Object.entries(workflow.mcpServers)) {
218
+ try {
219
+ configManager.addMcpServer(name, config);
220
+ } catch (error: any) {
221
+ console.warn(`Failed to install MCP server ${name}: ${error.message}`);
222
+ }
223
+ }
224
+
225
+ configManager.save(scope);
226
+ console.log(`✅ Installed ${Object.keys(workflow.mcpServers).length} MCP servers`);
227
+ }
228
+
229
+ async removeWorkflow(workflowId: string, scope: 'global' | 'project' = 'project'): Promise<void> {
230
+ const validationError = this.validateWorkflowId(workflowId);
231
+ if (validationError) {
232
+ throw new Error(validationError);
233
+ }
234
+
235
+ const workflowsPath = scope === 'global' ? this.globalWorkflowsPath : this.projectWorkflowsPath;
236
+
237
+ if (!workflowsPath) {
238
+ throw new Error('Project workflows path not set');
239
+ }
240
+
241
+ const workflow = this.installedWorkflows.get(workflowId);
242
+
243
+ if (!workflow) {
244
+ throw new Error(`Workflow not found: ${workflowId}`);
245
+ }
246
+
247
+ try {
248
+ const workflowPath = path.join(workflowsPath, `${workflowId}.json`);
249
+ await fs.unlink(workflowPath);
250
+
251
+ await this.removeWorkflowFiles(workflow, scope);
252
+ await this.removeWorkflowAgents(workflow, scope);
253
+ await this.removeWorkflowMcpServers(workflow, scope);
254
+
255
+ this.installedWorkflows.delete(workflowId);
256
+
257
+ console.log(`✅ Workflow ${workflow.name} removed successfully!`);
258
+ } catch (error: any) {
259
+ console.error(`❌ Failed to remove workflow: ${error.message}`);
260
+ throw error;
261
+ }
262
+ }
263
+
264
+ private async removeWorkflowFiles(workflow: WorkflowConfig, scope: 'global' | 'project'): Promise<void> {
265
+ if (!workflow.files || Object.keys(workflow.files).length === 0) {
266
+ return;
267
+ }
268
+
269
+ const baseDir = scope === 'global'
270
+ ? this.globalWorkflowsPath
271
+ : path.dirname(this.projectWorkflowsPath);
272
+
273
+ for (const filePath of Object.keys(workflow.files)) {
274
+ const fullPath = path.join(baseDir, filePath);
275
+
276
+ try {
277
+ await fs.unlink(fullPath);
278
+ } catch (error) {
279
+ console.warn(`[workflow] Failed to remove file ${filePath}: ${error instanceof Error ? error.message : String(error)}`);
280
+ }
281
+ }
282
+ }
283
+
284
+ private async removeWorkflowAgents(workflow: WorkflowConfig, scope: 'global' | 'project'): Promise<void> {
285
+ if (!workflow.agents || workflow.agents.length === 0) {
286
+ return;
287
+ }
288
+
289
+ const { getAgentManager } = await import('./agents.js');
290
+ const agentManager = getAgentManager(
291
+ scope === 'project' ? path.dirname(this.projectWorkflowsPath) : undefined
292
+ );
293
+
294
+ for (const agent of workflow.agents) {
295
+ try {
296
+ await agentManager.removeAgent(agent.agentType, scope);
297
+ } catch (error: any) {
298
+ console.warn(`Failed to remove agent ${agent.agentType}: ${error.message}`);
299
+ }
300
+ }
301
+ }
302
+
303
+ private async removeWorkflowMcpServers(workflow: WorkflowConfig, scope: 'global' | 'project'): Promise<void> {
304
+ if (!workflow.mcpServers || Object.keys(workflow.mcpServers).length === 0) {
305
+ return;
306
+ }
307
+
308
+ const { getConfigManager } = await import('./config.js');
309
+ const configManager = getConfigManager(
310
+ scope === 'project' ? path.dirname(this.projectWorkflowsPath) : undefined
311
+ );
312
+
313
+ for (const name of Object.keys(workflow.mcpServers)) {
314
+ try {
315
+ configManager.removeMcpServer(name);
316
+ } catch (error: any) {
317
+ console.warn(`Failed to remove MCP server ${name}: ${error.message}`);
318
+ }
319
+ }
320
+
321
+ configManager.save(scope);
322
+ }
323
+
324
+ listWorkflows(): WorkflowConfig[] {
325
+ return Array.from(this.installedWorkflows.values());
326
+ }
327
+
328
+ async listSkills(): Promise<{ id: string; name: string; description: string; category: string }[]> {
329
+ try {
330
+ // Always use user skills directory - built-in skills are copied there on init
331
+ const configManager = getConfigManager();
332
+ const skillsPath = configManager.getUserSkillsPath();
333
+ if (!skillsPath) return [];
334
+
335
+ const skillLoader = getSkillLoader();
336
+ const skills = await skillLoader.loadAllSkills();
337
+
338
+ return skills.map(skill => ({
339
+ id: skill.id,
340
+ name: skill.name,
341
+ description: skill.description,
342
+ category: skill.category
343
+ }));
344
+ } catch (error) {
345
+ console.error(`[workflow] Failed to list skills: ${error instanceof Error ? error.message : String(error)}`);
346
+ return [];
347
+ }
348
+ }
349
+
350
+ getWorkflow(workflowId: string): WorkflowConfig | undefined {
351
+ return this.installedWorkflows.get(workflowId);
352
+ }
353
+
354
+ async getSkillDetails(skillId: string): Promise<{ id: string; name: string; description: string; content: string; category: string } | null> {
355
+ try {
356
+ // Always use user skills directory - built-in skills are copied there on init
357
+ const configManager = getConfigManager();
358
+ const skillsPath = configManager.getUserSkillsPath();
359
+ if (!skillsPath) return null;
360
+
361
+ const skillLoader = getSkillLoader();
362
+
363
+ // Reload skills to ensure we have the latest
364
+ await skillLoader.loadAllSkills();
365
+
366
+ const skill = skillLoader.getSkill(skillId);
367
+ if (!skill) return null;
368
+
369
+ return {
370
+ id: skill.id,
371
+ name: skill.name,
372
+ description: skill.description,
373
+ content: skill.markdown,
374
+ category: skill.category
375
+ };
376
+ } catch (error) {
377
+ console.error(`[workflow] Failed to get skill details for ${skillId}: ${error instanceof Error ? error.message : String(error)}`);
378
+ return null;
379
+ }
380
+ }
381
+
382
+ async listOnlineWorkflows(): Promise<WorkflowConfig[]> {
383
+ try {
384
+ const marketplaceUrl = 'https://platform.xagent.cn/api/workflows';
385
+ const response = await axios.get(marketplaceUrl, {
386
+ timeout: 30000
387
+ });
388
+
389
+ return response.data.workflows || [];
390
+ } catch (error) {
391
+ console.error(`[workflow] Failed to fetch online workflows: ${error instanceof Error ? error.message : String(error)}`);
392
+ return [];
393
+ }
394
+ }
395
+
396
+ async searchWorkflows(query: string): Promise<WorkflowConfig[]> {
397
+ const onlineWorkflows = await this.listOnlineWorkflows();
398
+
399
+ const lowerQuery = query.toLowerCase();
400
+
401
+ return onlineWorkflows.filter(workflow =>
402
+ workflow.name.toLowerCase().includes(lowerQuery) ||
403
+ workflow.description.toLowerCase().includes(lowerQuery) ||
404
+ workflow.id.toLowerCase().includes(lowerQuery)
405
+ );
406
+ }
407
+
408
+ async executeWorkflow(workflowId: string, input: string): Promise<void> {
409
+ const validationError = this.validateWorkflowId(workflowId);
410
+ if (validationError) {
411
+ throw new Error(validationError);
412
+ }
413
+
414
+ const workflow = this.getWorkflow(workflowId);
415
+
416
+ if (!workflow) {
417
+ throw new Error(`Workflow not found: ${workflowId}`);
418
+ }
419
+
420
+ console.log(`Executing workflow: ${workflow.name}`);
421
+ console.log(`Description: ${workflow.description}\n`);
422
+
423
+ if (workflow.commands && Object.keys(workflow.commands).length > 0) {
424
+ console.log('Available commands:');
425
+ Object.entries(workflow.commands).forEach(([name, description]) => {
426
+ console.log(` /${name} - ${description}`);
427
+ });
428
+ console.log();
429
+ }
430
+
431
+ const { SlashCommandHandler } = await import('./slash-commands.js');
432
+ const slashHandler = new SlashCommandHandler();
433
+
434
+ const commandMatch = input.match(/^\/(\w+)(?:\s+(.*))?$/);
435
+
436
+ if (commandMatch) {
437
+ const [, command, args] = commandMatch;
438
+
439
+ if (workflow.commands[command]) {
440
+ await slashHandler.handleCommand(`/${command} ${args || ''}`);
441
+ } else {
442
+ console.log(`Unknown workflow command: /${command}`);
443
+ }
444
+ } else {
445
+ const { InteractiveSession } = await import('./session.js');
446
+ const session = new InteractiveSession();
447
+ await session.processUserMessage(input);
448
+ }
449
+ }
450
+
451
+ async createWorkflowPackage(projectRoot: string): Promise<Buffer> {
452
+ const workflowId = path.basename(projectRoot);
453
+ const workflowConfigPath = path.join(projectRoot, '.xagent', 'workflow.json');
454
+
455
+ let workflowConfig: WorkflowConfig;
456
+
457
+ try {
458
+ const content = await fs.readFile(workflowConfigPath, 'utf-8');
459
+ workflowConfig = JSON.parse(content);
460
+ } catch (error) {
461
+ const errorMsg = error instanceof Error ? error.message : String(error);
462
+ throw new Error(`Failed to read workflow.json: ${errorMsg}. Please ensure the file exists and is valid JSON.`);
463
+ }
464
+
465
+ const { getAgentManager } = await import('./agents.js');
466
+ const agentManager = getAgentManager(projectRoot);
467
+ await agentManager.loadAgents();
468
+
469
+ const agents = agentManager.getAllAgents();
470
+ workflowConfig.agents = agents;
471
+
472
+ const { getConfigManager } = await import('./config.js');
473
+ const configManager = getConfigManager(projectRoot);
474
+ workflowConfig.mcpServers = configManager.getMcpServers();
475
+
476
+ const { getMemoryManager } = await import('./memory.js');
477
+ const memoryManager = getMemoryManager(projectRoot);
478
+ const xagentMd = await memoryManager.loadMemory();
479
+ workflowConfig.xagentMd = xagentMd;
480
+
481
+ const archiverModule = await import('archiver');
482
+ const archiver = archiverModule.default;
483
+ const streamModule = await import('stream');
484
+ const globModule = await import('glob');
485
+
486
+ const archive = archiver('zip', { zlib: { level: 9 } });
487
+ const chunks: Buffer[] = [];
488
+
489
+ const glob = globModule.glob;
490
+ const files = await glob('**/*', {
491
+ cwd: projectRoot,
492
+ ignore: ['node_modules/**', '.git/**', 'dist/**', 'build/**', '.xagent/**']
493
+ });
494
+
495
+ return new Promise((resolve, reject) => {
496
+ archive.on('data', (chunk: Buffer) => chunks.push(chunk));
497
+ archive.on('end', () => resolve(Buffer.concat(chunks)));
498
+ archive.on('error', reject);
499
+
500
+ const readable = streamModule.Readable.from([]);
501
+ archive.pipe(readable as any);
502
+
503
+ archive.append(JSON.stringify(workflowConfig, null, 2), { name: 'workflow.json' });
504
+
505
+ for (const file of files) {
506
+ const filePath = path.join(projectRoot, file);
507
+ archive.file(filePath, { name: file });
508
+ }
509
+
510
+ archive.finalize();
511
+ });
512
+ }
513
+ }
514
+
515
+ let workflowManagerInstance: WorkflowManager | null = null;
516
+
517
+ export function getWorkflowManager(projectRoot?: string): WorkflowManager {
518
+ if (!workflowManagerInstance || projectRoot) {
519
+ workflowManagerInstance = new WorkflowManager(projectRoot);
520
+ workflowManagerInstance.loadWorkflows();
521
+ }
522
+ return workflowManagerInstance;
523
+ }