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