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