@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.
- package/.github/ISSUE_TEMPLATE/bug_report.md +38 -38
- package/.github/ISSUE_TEMPLATE/feature_request.md +20 -20
- package/.github/release.yml +76 -0
- package/.github/workflows/ci.yml +75 -0
- package/.github/workflows/release.yml +103 -0
- package/.gitmodules +3 -3
- package/README.md +326 -280
- package/README_CN.md +325 -279
- package/dist/agents.d.ts.map +1 -1
- package/dist/agents.js +7 -3
- package/dist/agents.js.map +1 -1
- package/dist/ai-client/factory.d.ts +40 -0
- package/dist/ai-client/factory.d.ts.map +1 -0
- package/dist/ai-client/factory.js +100 -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 +406 -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 +290 -0
- package/dist/ai-client/providers/openai.js.map +1 -0
- package/dist/ai-client/providers/remote.d.ts +110 -0
- package/dist/ai-client/providers/remote.d.ts.map +1 -0
- package/dist/ai-client/providers/remote.js +352 -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 +274 -0
- package/dist/ai-client/types.d.ts.map +1 -0
- package/dist/ai-client/types.js +90 -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 +164 -174
- 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 +53 -32
- package/dist/cancellation.js.map +1 -1
- package/dist/checkpoint.d.ts +2 -1
- package/dist/checkpoint.d.ts.map +1 -1
- package/dist/checkpoint.js +39 -6
- package/dist/checkpoint.js.map +1 -1
- package/dist/cli.js +742 -29
- 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 +82 -18
- package/dist/context-compressor.d.ts.map +1 -1
- package/dist/context-compressor.js +718 -154
- package/dist/context-compressor.js.map +1 -1
- package/dist/conversation.d.ts +1 -1
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +8 -7
- package/dist/conversation.js.map +1 -1
- package/dist/gui-subagent/action-parser/actionParser.d.ts.map +1 -1
- package/dist/gui-subagent/action-parser/actionParser.js +6 -4
- package/dist/gui-subagent/action-parser/actionParser.js.map +1 -1
- package/dist/gui-subagent/agent/gui-agent.d.ts +39 -2
- package/dist/gui-subagent/agent/gui-agent.d.ts.map +1 -1
- package/dist/gui-subagent/agent/gui-agent.js +189 -74
- package/dist/gui-subagent/agent/gui-agent.js.map +1 -1
- package/dist/gui-subagent/index.d.ts +23 -1
- package/dist/gui-subagent/index.d.ts.map +1 -1
- package/dist/gui-subagent/index.js +6 -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 +31 -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 +8 -5
- package/dist/input-processor.js.map +1 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +1 -1
- package/dist/logger.js.map +1 -1
- package/dist/mcp.d.ts +7 -1
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +157 -49
- package/dist/mcp.js.map +1 -1
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +3 -3
- package/dist/memory.js.map +1 -1
- package/dist/output-util.d.ts +27 -0
- package/dist/output-util.d.ts.map +1 -0
- package/dist/output-util.js +74 -0
- package/dist/output-util.js.map +1 -0
- package/dist/retry.js +1 -1
- package/dist/retry.js.map +1 -1
- package/dist/ripgrep.d.ts +29 -0
- package/dist/ripgrep.d.ts.map +1 -0
- package/dist/ripgrep.js +294 -0
- package/dist/ripgrep.js.map +1 -0
- package/dist/sdk-output-adapter.d.ts +34 -1
- package/dist/sdk-output-adapter.d.ts.map +1 -1
- package/dist/sdk-output-adapter.js +67 -2
- package/dist/sdk-output-adapter.js.map +1 -1
- package/dist/sdk-session.d.ts.map +1 -1
- package/dist/sdk-session.js +2 -0
- package/dist/sdk-session.js.map +1 -1
- package/dist/session-manager.js +3 -3
- package/dist/session-manager.js.map +1 -1
- package/dist/session.d.ts +116 -6
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +1416 -448
- 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 +126 -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 +8 -2
- package/dist/skill-invoker.d.ts.map +1 -1
- package/dist/skill-invoker.js +36 -15
- 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 +51 -48
- 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 +341 -0
- package/dist/skill-manager.js.map +1 -0
- package/dist/slash-commands.d.ts +39 -2
- package/dist/slash-commands.d.ts.map +1 -1
- package/dist/slash-commands.js +934 -305
- package/dist/slash-commands.js.map +1 -1
- package/dist/smart-approval.d.ts +20 -1
- package/dist/smart-approval.d.ts.map +1 -1
- package/dist/smart-approval.js +125 -56
- 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 +86 -36
- 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/theme.d.ts.map +1 -1
- package/dist/theme.js +8 -7
- package/dist/theme.js.map +1 -1
- package/dist/tools.d.ts +38 -7
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +1249 -617
- 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 +84 -9
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +49 -0
- package/dist/types.js.map +1 -1
- package/dist/update.d.ts.map +1 -1
- package/dist/update.js +28 -36
- 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 +61 -49
- 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 +440 -439
- package/find-skills/SKILL.md +133 -0
- package/package.json +91 -90
- package/scripts/install-ripgrep.js +241 -0
- package/src/agents.ts +7 -3
- package/src/ai-client/factory.ts +116 -0
- package/src/ai-client/index.ts +61 -0
- package/src/ai-client/providers/anthropic.ts +475 -0
- package/src/ai-client/providers/openai.ts +348 -0
- package/src/ai-client/providers/remote.ts +439 -0
- package/src/ai-client/registry.ts +97 -0
- package/src/ai-client/types.ts +364 -0
- package/src/ai-client-factory.ts +204 -0
- package/src/auth.ts +661 -614
- package/src/cancellation.ts +202 -176
- package/src/checkpoint.ts +255 -219
- package/src/cli.ts +1523 -743
- package/src/config.ts +341 -297
- package/src/context-compressor.ts +987 -290
- package/src/conversation.ts +290 -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 +1234 -1089
- package/src/gui-subagent/agent/index.ts +5 -5
- package/src/gui-subagent/index.ts +185 -163
- package/src/gui-subagent/operator/base-operator.ts +244 -245
- package/src/gui-subagent/operator/computer-operator.ts +541 -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 +8 -5
- package/src/logger.ts +436 -438
- package/src/mcp.ts +793 -682
- package/src/memory.ts +343 -344
- package/src/output-util.ts +80 -0
- package/src/retry.ts +1 -1
- package/src/ripgrep.ts +370 -0
- package/src/sdk-output-adapter.ts +842 -0
- package/src/sdk-session.ts +62 -0
- package/src/session-manager.ts +308 -308
- package/src/session.ts +1775 -573
- package/src/shell.ts +134 -0
- package/src/skill-installer.ts +518 -0
- package/src/skill-invoker.ts +959 -935
- package/src/skill-loader.ts +501 -496
- package/src/skill-manager.ts +385 -0
- package/src/slash-commands.ts +2189 -1389
- package/src/smart-approval.ts +193 -74
- package/src/system-prompt-generator.ts +91 -36
- package/src/terminal.ts +96 -0
- package/src/theme.ts +739 -738
- package/src/tools.ts +1790 -931
- package/src/truncate.ts +173 -0
- package/src/types.ts +337 -198
- package/src/update.ts +33 -40
- package/src/workflow.ts +521 -508
- package/test/cli-launch.test.ts +279 -0
- package/tsconfig.json +22 -22
- package/vitest.config.ts +21 -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-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/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/{.eslintrc.js → .eslintrc.cjs} +0 -0
package/src/skill-invoker.ts
CHANGED
|
@@ -1,935 +1,959 @@
|
|
|
1
|
-
import fs from 'fs/promises';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import os from 'os';
|
|
4
|
-
import { getSkillLoader, SkillInfo, SkillLoader } from './skill-loader.js';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
//
|
|
105
|
-
//
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
*
|
|
110
|
-
* @
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
const
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
*
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
const
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
*
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
*
|
|
174
|
-
* @param
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
*
|
|
206
|
-
* @
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
*
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
const
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
if (bytes < 1024
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
//
|
|
253
|
-
//
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
.replace(
|
|
262
|
-
.replace(
|
|
263
|
-
.
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
*
|
|
269
|
-
* @param
|
|
270
|
-
* @param
|
|
271
|
-
* @
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
const
|
|
276
|
-
|
|
277
|
-
let
|
|
278
|
-
let
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
const
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
const
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
//
|
|
334
|
-
//
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
//
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
//
|
|
341
|
-
//
|
|
342
|
-
//
|
|
343
|
-
//
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
//
|
|
347
|
-
//
|
|
348
|
-
//
|
|
349
|
-
//
|
|
350
|
-
// '
|
|
351
|
-
// '
|
|
352
|
-
//
|
|
353
|
-
//
|
|
354
|
-
//
|
|
355
|
-
//
|
|
356
|
-
//
|
|
357
|
-
//
|
|
358
|
-
//
|
|
359
|
-
// '
|
|
360
|
-
//
|
|
361
|
-
//
|
|
362
|
-
//
|
|
363
|
-
//
|
|
364
|
-
//
|
|
365
|
-
//
|
|
366
|
-
//
|
|
367
|
-
// '
|
|
368
|
-
// '
|
|
369
|
-
//
|
|
370
|
-
//
|
|
371
|
-
//
|
|
372
|
-
//
|
|
373
|
-
//
|
|
374
|
-
//
|
|
375
|
-
//
|
|
376
|
-
// 'excel
|
|
377
|
-
//
|
|
378
|
-
//
|
|
379
|
-
//
|
|
380
|
-
//
|
|
381
|
-
//
|
|
382
|
-
//
|
|
383
|
-
//
|
|
384
|
-
// '
|
|
385
|
-
// '
|
|
386
|
-
//
|
|
387
|
-
//
|
|
388
|
-
//
|
|
389
|
-
//
|
|
390
|
-
//
|
|
391
|
-
//
|
|
392
|
-
//
|
|
393
|
-
// '
|
|
394
|
-
//
|
|
395
|
-
//
|
|
396
|
-
//
|
|
397
|
-
//
|
|
398
|
-
//
|
|
399
|
-
//
|
|
400
|
-
//
|
|
401
|
-
// '
|
|
402
|
-
//
|
|
403
|
-
//
|
|
404
|
-
//
|
|
405
|
-
//
|
|
406
|
-
//
|
|
407
|
-
//
|
|
408
|
-
//
|
|
409
|
-
// '
|
|
410
|
-
//
|
|
411
|
-
//
|
|
412
|
-
//
|
|
413
|
-
//
|
|
414
|
-
//
|
|
415
|
-
//
|
|
416
|
-
//
|
|
417
|
-
// '
|
|
418
|
-
//
|
|
419
|
-
//
|
|
420
|
-
//
|
|
421
|
-
//
|
|
422
|
-
//
|
|
423
|
-
//
|
|
424
|
-
//
|
|
425
|
-
// '
|
|
426
|
-
//
|
|
427
|
-
//
|
|
428
|
-
//
|
|
429
|
-
//
|
|
430
|
-
//
|
|
431
|
-
//
|
|
432
|
-
//
|
|
433
|
-
// '
|
|
434
|
-
//
|
|
435
|
-
//
|
|
436
|
-
//
|
|
437
|
-
//
|
|
438
|
-
//
|
|
439
|
-
//
|
|
440
|
-
//
|
|
441
|
-
//
|
|
442
|
-
//
|
|
443
|
-
//
|
|
444
|
-
//
|
|
445
|
-
//
|
|
446
|
-
//
|
|
447
|
-
//
|
|
448
|
-
// 'mcp
|
|
449
|
-
//
|
|
450
|
-
//
|
|
451
|
-
//
|
|
452
|
-
//
|
|
453
|
-
//
|
|
454
|
-
//
|
|
455
|
-
//
|
|
456
|
-
// '
|
|
457
|
-
//
|
|
458
|
-
//
|
|
459
|
-
//
|
|
460
|
-
//
|
|
461
|
-
//
|
|
462
|
-
//
|
|
463
|
-
//
|
|
464
|
-
// '
|
|
465
|
-
//
|
|
466
|
-
//
|
|
467
|
-
//
|
|
468
|
-
//
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
//
|
|
472
|
-
//
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
private
|
|
477
|
-
private
|
|
478
|
-
private
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
const
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
*
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
if
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
const
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
const
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
skill.
|
|
530
|
-
skill.
|
|
531
|
-
skill.
|
|
532
|
-
skill.
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
const
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
for
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
*
|
|
565
|
-
*
|
|
566
|
-
*/
|
|
567
|
-
async
|
|
568
|
-
//
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
}
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
*
|
|
646
|
-
*/
|
|
647
|
-
async
|
|
648
|
-
if (!result.workspaceDir) {
|
|
649
|
-
return
|
|
650
|
-
}
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
if (
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
}
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
}
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
` -
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
}
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
):
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
1
|
+
import fs from 'fs/promises';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
import { getSkillLoader, SkillInfo, SkillLoader } from './skill-loader.js';
|
|
5
|
+
import { ExecutionMode } from './types.js';
|
|
6
|
+
import { getConfigManager } from './config.js';
|
|
7
|
+
|
|
8
|
+
// Re-export SkillInfo for other modules
|
|
9
|
+
export type { SkillInfo };
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Track skill execution history for tracking failures
|
|
13
|
+
*/
|
|
14
|
+
export class SkillExecutionHistory {
|
|
15
|
+
private history: Map<string, number> = new Map();
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Get failure count for a task
|
|
19
|
+
*/
|
|
20
|
+
getFailureCount(taskKey: string): number {
|
|
21
|
+
return this.history.get(taskKey) || 0;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Increment failure count for a task
|
|
26
|
+
*/
|
|
27
|
+
incrementFailure(taskKey: string): number {
|
|
28
|
+
const count = this.getFailureCount(taskKey) + 1;
|
|
29
|
+
this.history.set(taskKey, count);
|
|
30
|
+
return count;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Reset failure count for a task (e.g., after success)
|
|
35
|
+
*/
|
|
36
|
+
reset(taskKey: string): void {
|
|
37
|
+
this.history.delete(taskKey);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Check if threshold reached
|
|
42
|
+
*/
|
|
43
|
+
shouldUseFallback(taskKey: string, threshold: number = 2): boolean {
|
|
44
|
+
return this.getFailureCount(taskKey) >= threshold;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Singleton execution history
|
|
49
|
+
const executionHistory = new SkillExecutionHistory();
|
|
50
|
+
|
|
51
|
+
export function getExecutionHistory(): SkillExecutionHistory {
|
|
52
|
+
return executionHistory;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export interface SkillExecutionParams {
|
|
56
|
+
skillId: string;
|
|
57
|
+
taskDescription: string;
|
|
58
|
+
inputFile?: string;
|
|
59
|
+
outputFile?: string;
|
|
60
|
+
options?: Record<string, any>;
|
|
61
|
+
/** Task ID for workspace directory naming */
|
|
62
|
+
taskId?: string;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Execution step interface - tells Agent what to do next
|
|
67
|
+
*/
|
|
68
|
+
export interface ExecutionStep {
|
|
69
|
+
step: number;
|
|
70
|
+
action: string;
|
|
71
|
+
description: string;
|
|
72
|
+
command?: string;
|
|
73
|
+
file?: string;
|
|
74
|
+
reason: string;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Skill execution result - contains guidance and next actions
|
|
79
|
+
*/
|
|
80
|
+
export interface SkillExecutionResult {
|
|
81
|
+
success: boolean;
|
|
82
|
+
output?: string;
|
|
83
|
+
error?: string;
|
|
84
|
+
files?: string[];
|
|
85
|
+
/** Tells Agent what to do next */
|
|
86
|
+
nextSteps?: ExecutionStep[];
|
|
87
|
+
/** Skill type for determining if manual execution is needed */
|
|
88
|
+
requiresManualExecution?: boolean;
|
|
89
|
+
/** Workspace directory used, for cleanup */
|
|
90
|
+
workspaceDir?: string;
|
|
91
|
+
/** Files to preserve (relative paths), skipped during cleanup */
|
|
92
|
+
preserveFiles?: string[];
|
|
93
|
+
/** Skill directory path - for dependency management and file operations */
|
|
94
|
+
skillPath?: string;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export interface SkillMatcherResult {
|
|
98
|
+
skill: SkillInfo;
|
|
99
|
+
confidence: number;
|
|
100
|
+
matchedKeywords: string[];
|
|
101
|
+
category: string;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// ============================================================
|
|
105
|
+
// Workspace Utility Functions
|
|
106
|
+
// ============================================================
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Get workspace directory path
|
|
110
|
+
* @param taskId Task ID for creating unique workspace directory
|
|
111
|
+
* @returns Absolute path to workspace directory
|
|
112
|
+
*/
|
|
113
|
+
export function getWorkspaceDir(taskId: string): string {
|
|
114
|
+
// Try to get from config first
|
|
115
|
+
try {
|
|
116
|
+
const configManager = getConfigManager();
|
|
117
|
+
const config = configManager.getSettings?.();
|
|
118
|
+
if (config?.workspacePath) {
|
|
119
|
+
return path.join(config.workspacePath, taskId);
|
|
120
|
+
}
|
|
121
|
+
} catch {
|
|
122
|
+
// Config not available, use default
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Default to ~/.xagent/workspace
|
|
126
|
+
return path.join(os.homedir(), '.xagent', 'workspace', taskId);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Get base workspace directory (without task-id)
|
|
131
|
+
*/
|
|
132
|
+
export function getBaseWorkspaceDir(): string {
|
|
133
|
+
try {
|
|
134
|
+
const configManager = getConfigManager();
|
|
135
|
+
const config = configManager.getSettings?.();
|
|
136
|
+
if (config?.workspacePath) {
|
|
137
|
+
return config.workspacePath;
|
|
138
|
+
}
|
|
139
|
+
} catch {
|
|
140
|
+
// Config not available, use default
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return path.join(os.homedir(), '.xagent', 'workspace');
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Get workspace directory description for AI
|
|
148
|
+
* Returns the actual workspace path from config, or default path
|
|
149
|
+
*/
|
|
150
|
+
export function getWorkspaceDescription(): string {
|
|
151
|
+
try {
|
|
152
|
+
const configManager = getConfigManager();
|
|
153
|
+
const config = configManager.getSettings?.();
|
|
154
|
+
if (config?.workspacePath) {
|
|
155
|
+
return config.workspacePath;
|
|
156
|
+
}
|
|
157
|
+
} catch {
|
|
158
|
+
// Config not available, use default
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
return path.join(os.homedir(), '.xagent', 'workspace');
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Ensure workspace directory exists
|
|
166
|
+
* @param workspaceDir Workspace directory path
|
|
167
|
+
*/
|
|
168
|
+
export async function ensureWorkspaceDir(workspaceDir: string): Promise<void> {
|
|
169
|
+
await fs.mkdir(workspaceDir, { recursive: true });
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Clean up workspace directory
|
|
174
|
+
* @param workspaceDir Workspace directory path
|
|
175
|
+
* @param preserveFiles Files to preserve (relative paths)
|
|
176
|
+
*/
|
|
177
|
+
export async function cleanupWorkspace(workspaceDir: string, preserveFiles: string[] = []): Promise<void> {
|
|
178
|
+
try {
|
|
179
|
+
const entries = await fs.readdir(workspaceDir, { withFileTypes: true });
|
|
180
|
+
|
|
181
|
+
for (const entry of entries) {
|
|
182
|
+
const fullPath = path.join(workspaceDir, entry.name);
|
|
183
|
+
|
|
184
|
+
// Skip files to preserve
|
|
185
|
+
if (preserveFiles.includes(entry.name)) {
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
if (entry.isDirectory()) {
|
|
190
|
+
// Recursively delete subdirectories
|
|
191
|
+
await fs.rm(fullPath, { recursive: true, force: true });
|
|
192
|
+
} else {
|
|
193
|
+
// Delete files
|
|
194
|
+
await fs.unlink(fullPath);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
} catch (error: any) {
|
|
198
|
+
if (error.code !== 'ENOENT') {
|
|
199
|
+
console.warn(`Workspace cleanup failed: ${error.message}`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Determine if workspace should be auto-cleaned based on ExecutionMode
|
|
206
|
+
* @param executionMode Execution mode
|
|
207
|
+
* @returns Whether auto-cleanup should happen
|
|
208
|
+
*/
|
|
209
|
+
export function shouldAutoCleanup(executionMode: ExecutionMode): boolean {
|
|
210
|
+
// YOLO mode: fully automatic, clean up directly
|
|
211
|
+
if (executionMode === ExecutionMode.YOLO) {
|
|
212
|
+
return true;
|
|
213
|
+
}
|
|
214
|
+
// Other modes require user confirmation
|
|
215
|
+
return false;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Generate cleanup prompt message
|
|
220
|
+
* @param workspaceDir Workspace directory path
|
|
221
|
+
*/
|
|
222
|
+
export async function getCleanupInfo(workspaceDir: string): Promise<{ files: string[]; totalSize: string }> {
|
|
223
|
+
try {
|
|
224
|
+
const entries = await fs.readdir(workspaceDir, { withFileTypes: true });
|
|
225
|
+
const files: string[] = [];
|
|
226
|
+
|
|
227
|
+
for (const entry of entries) {
|
|
228
|
+
files.push(entry.name);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// Calculate total size
|
|
232
|
+
let totalSize = 0;
|
|
233
|
+
for (const entry of entries) {
|
|
234
|
+
if (entry.isFile()) {
|
|
235
|
+
const stats = await fs.stat(path.join(workspaceDir, entry.name));
|
|
236
|
+
totalSize += stats.size;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
const formatSize = (bytes: number): string => {
|
|
241
|
+
if (bytes < 1024) return `${bytes} B`;
|
|
242
|
+
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(2)} KB`;
|
|
243
|
+
return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;
|
|
244
|
+
};
|
|
245
|
+
|
|
246
|
+
return { files, totalSize: formatSize(totalSize) };
|
|
247
|
+
} catch {
|
|
248
|
+
return { files: [], totalSize: '0 B' };
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// ============================================================
|
|
253
|
+
// Shared Content Extraction Utilities
|
|
254
|
+
// ============================================================
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Remove Markdown formatting (bold, italic, etc.)
|
|
258
|
+
*/
|
|
259
|
+
export function stripMarkdown(text: string): string {
|
|
260
|
+
return text
|
|
261
|
+
.replace(/\*\*(.+?)\*\*/g, '$1') // Remove bold **
|
|
262
|
+
.replace(/\*(.+?)\*/g, '$1') // Remove italic *
|
|
263
|
+
.replace(/`(.+?)`/g, '$1') // Remove inline code `
|
|
264
|
+
.trim();
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Extract content related to keywords (for SKILL.md content matching)
|
|
269
|
+
* @param content SKILL.md full content
|
|
270
|
+
* @param keywords Keyword list
|
|
271
|
+
* @param maxLength Maximum return length
|
|
272
|
+
* @returns Extracted relevant content
|
|
273
|
+
*/
|
|
274
|
+
export function extractContent(content: string, keywords: string[], maxLength: number = 5000): string {
|
|
275
|
+
const lines = content.split('\n');
|
|
276
|
+
const relevantLines: string[] = [];
|
|
277
|
+
let inRelevantSection = false;
|
|
278
|
+
let sectionDepth = 0;
|
|
279
|
+
let found = false;
|
|
280
|
+
|
|
281
|
+
for (let i = 0; i < lines.length; i++) {
|
|
282
|
+
const line = lines[i];
|
|
283
|
+
|
|
284
|
+
// Detect headings
|
|
285
|
+
if (line.match(/^#{1,6}\s/)) {
|
|
286
|
+
const strippedLine = stripMarkdown(line);
|
|
287
|
+
const lowerLine = strippedLine.toLowerCase();
|
|
288
|
+
|
|
289
|
+
// Check if contains keywords
|
|
290
|
+
const hasKeyword = keywords.some(kw => lowerLine.includes(kw.toLowerCase()));
|
|
291
|
+
|
|
292
|
+
if (hasKeyword) {
|
|
293
|
+
inRelevantSection = true;
|
|
294
|
+
found = true;
|
|
295
|
+
sectionDepth = line.match(/^(#+)/)?.[1].length || 1;
|
|
296
|
+
} else if (inRelevantSection) {
|
|
297
|
+
// Check if same level or higher heading (end current section)
|
|
298
|
+
const currentDepth = line.match(/^(#+)/)?.[1].length || 1;
|
|
299
|
+
if (currentDepth <= sectionDepth) {
|
|
300
|
+
inRelevantSection = false;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
if (inRelevantSection || found) {
|
|
306
|
+
relevantLines.push(line);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
// Limit content length
|
|
310
|
+
if (relevantLines.join('\n').length > maxLength) {
|
|
311
|
+
relevantLines.push('\n...(content truncated for brevity)...');
|
|
312
|
+
break;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
if (relevantLines.length > 0) {
|
|
317
|
+
return relevantLines.join('\n').trim();
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// If still not found, return first 100 lines
|
|
321
|
+
return lines.slice(0, 100).join('\n').trim() + '\n\n...(See SKILL.md for full instructions)';
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/**
|
|
325
|
+
* Read SKILL.md and extract relevant content based on task
|
|
326
|
+
*/
|
|
327
|
+
export async function readSkillContent(skillPath: string, keywords: string[], maxLength: number = 5000): Promise<string> {
|
|
328
|
+
const skillMdPath = path.join(skillPath, 'SKILL.md');
|
|
329
|
+
const content = await fs.readFile(skillMdPath, 'utf-8');
|
|
330
|
+
return extractContent(content, keywords, maxLength);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
// ============================================================
|
|
334
|
+
// SKILL Trigger Keywords Mapping
|
|
335
|
+
// ============================================================
|
|
336
|
+
|
|
337
|
+
// NOTE: SKILL_TRIGGERS is disabled for experiment purposes.
|
|
338
|
+
// Let the LLM decide which skill to use based on system prompt information.
|
|
339
|
+
|
|
340
|
+
// interface SkillTrigger {
|
|
341
|
+
// skillId: string;
|
|
342
|
+
// keywords: string[];
|
|
343
|
+
// category: string;
|
|
344
|
+
// }
|
|
345
|
+
|
|
346
|
+
// export const SKILL_TRIGGERS: Record<string, SkillTrigger> = {
|
|
347
|
+
// docx: {
|
|
348
|
+
// skillId: 'docx',
|
|
349
|
+
// keywords: [
|
|
350
|
+
// 'word document', 'docx', 'microsoft word', 'create word', 'edit word',
|
|
351
|
+
// 'create .docx', '.docx file', 'word file', 'document creation',
|
|
352
|
+
// 'word editing', 'tracked changes', 'comments'
|
|
353
|
+
// ],
|
|
354
|
+
// category: 'Document Processing'
|
|
355
|
+
// },
|
|
356
|
+
// pdf: {
|
|
357
|
+
// skillId: 'pdf',
|
|
358
|
+
// keywords: [
|
|
359
|
+
// 'pdf', 'create pdf', 'edit pdf', 'pdf document', 'pdf file',
|
|
360
|
+
// 'extract pdf', 'merge pdf', 'split pdf', 'pdf form', 'manipulate pdf'
|
|
361
|
+
// ],
|
|
362
|
+
// category: 'Document Processing'
|
|
363
|
+
// },
|
|
364
|
+
// pptx: {
|
|
365
|
+
// skillId: 'pptx',
|
|
366
|
+
// keywords: [
|
|
367
|
+
// 'powerpoint', 'ppt', 'pptx', 'presentation', 'slide',
|
|
368
|
+
// 'create presentation', 'edit powerpoint', 'create slides',
|
|
369
|
+
// 'powerpoint file', 'presentation file'
|
|
370
|
+
// ],
|
|
371
|
+
// category: 'Document Processing'
|
|
372
|
+
// },
|
|
373
|
+
// xlsx: {
|
|
374
|
+
// skillId: 'xlsx',
|
|
375
|
+
// keywords: [
|
|
376
|
+
// 'excel', 'spreadsheet', 'xlsx', 'create excel', 'edit spreadsheet',
|
|
377
|
+
// 'excel file', 'spreadsheet file', 'formulas', 'data analysis'
|
|
378
|
+
// ],
|
|
379
|
+
// category: 'Spreadsheet & Data'
|
|
380
|
+
// },
|
|
381
|
+
// frontend_design: {
|
|
382
|
+
// skillId: 'frontend-design',
|
|
383
|
+
// keywords: [
|
|
384
|
+
// 'web page', 'website', 'web app', 'frontend', 'ui', 'user interface',
|
|
385
|
+
// 'create website', 'build website', 'web component', 'html css',
|
|
386
|
+
// 'landing page', 'dashboard', 'react', 'vue', 'web interface'
|
|
387
|
+
// ],
|
|
388
|
+
// category: 'Frontend & Web Development'
|
|
389
|
+
// },
|
|
390
|
+
// web_artifacts_builder: {
|
|
391
|
+
// skillId: 'web-artifacts-builder',
|
|
392
|
+
// keywords: [
|
|
393
|
+
// 'complex react', 'react artifact', 'stateful artifact', 'routing',
|
|
394
|
+
// 'web artifact', 'interactive artifact', 'web-based tool'
|
|
395
|
+
// ],
|
|
396
|
+
// category: 'Frontend & Web Development'
|
|
397
|
+
// },
|
|
398
|
+
// webapp_testing: {
|
|
399
|
+
// skillId: 'webapp-testing',
|
|
400
|
+
// keywords: [
|
|
401
|
+
// 'test web', 'web testing', 'browser test', 'playwright', 'e2e test',
|
|
402
|
+
// 'frontend test', 'capture screenshot', 'verify web'
|
|
403
|
+
// ],
|
|
404
|
+
// category: 'Frontend & Web Development'
|
|
405
|
+
// },
|
|
406
|
+
// canvas_design: {
|
|
407
|
+
// skillId: 'canvas-design',
|
|
408
|
+
// keywords: [
|
|
409
|
+
// 'poster', 'artwork', 'visual art', 'canvas', 'design art',
|
|
410
|
+
// 'create poster', 'create artwork', 'visual design', 'graphic art'
|
|
411
|
+
// ],
|
|
412
|
+
// category: 'Visual & Creative Design'
|
|
413
|
+
// },
|
|
414
|
+
// algorithmic_art: {
|
|
415
|
+
// skillId: 'algorithmic-art',
|
|
416
|
+
// keywords: [
|
|
417
|
+
// 'generative art', 'algorithmic art', 'p5.js', 'particle system',
|
|
418
|
+
// 'flow field', 'creative coding', 'code art'
|
|
419
|
+
// ],
|
|
420
|
+
// category: 'Visual & Creative Design'
|
|
421
|
+
// },
|
|
422
|
+
// theme_factory: {
|
|
423
|
+
// skillId: 'theme-factory',
|
|
424
|
+
// keywords: [
|
|
425
|
+
// 'theme', 'color scheme', 'font theme', 'styling theme',
|
|
426
|
+
// 'consistent theme', 'apply theme', 'theme colors'
|
|
427
|
+
// ],
|
|
428
|
+
// category: 'Visual & Creative Design'
|
|
429
|
+
// },
|
|
430
|
+
// brand_guidelines: {
|
|
431
|
+
// skillId: 'brand-guidelines',
|
|
432
|
+
// keywords: [
|
|
433
|
+
// 'brand colors', 'brand guidelines', 'anthropic brand',
|
|
434
|
+
// 'official brand', 'brand styling'
|
|
435
|
+
// ],
|
|
436
|
+
// category: 'Visual & Creative Design'
|
|
437
|
+
// },
|
|
438
|
+
// slack_gif_creator: {
|
|
439
|
+
// skillId: 'slack-gif-creator',
|
|
440
|
+
// keywords: [
|
|
441
|
+
// 'slack gif', 'animated gif', 'gif for slack', 'slack animation'
|
|
442
|
+
// ],
|
|
443
|
+
// category: 'Visual & Creative Design'
|
|
444
|
+
// },
|
|
445
|
+
// mcp_builder: {
|
|
446
|
+
// skillId: 'mcp-builder',
|
|
447
|
+
// keywords: [
|
|
448
|
+
// 'mcp server', 'model context protocol', 'create mcp',
|
|
449
|
+
// 'mcp integration', 'external api integration'
|
|
450
|
+
// ],
|
|
451
|
+
// category: 'Development & Integration'
|
|
452
|
+
// },
|
|
453
|
+
// skill_creator: {
|
|
454
|
+
// skillId: 'skill-creator',
|
|
455
|
+
// keywords: [
|
|
456
|
+
// 'create skill', 'new skill', 'skill development',
|
|
457
|
+
// 'extend capabilities', 'custom skill'
|
|
458
|
+
// ],
|
|
459
|
+
// category: 'Development & Integration'
|
|
460
|
+
// },
|
|
461
|
+
// doc_coauthoring: {
|
|
462
|
+
// skillId: 'doc-coauthoring',
|
|
463
|
+
// keywords: [
|
|
464
|
+
// 'documentation', 'technical docs', 'write documentation',
|
|
465
|
+
// 'coauthor', 'doc writing', 'technical writing'
|
|
466
|
+
// ],
|
|
467
|
+
// category: 'Communication & Documentation'
|
|
468
|
+
// }
|
|
469
|
+
// };
|
|
470
|
+
|
|
471
|
+
// ============================================================
|
|
472
|
+
// SkillInvoker Main Class
|
|
473
|
+
// ============================================================
|
|
474
|
+
|
|
475
|
+
export class SkillInvoker {
|
|
476
|
+
private skillLoader: SkillLoader;
|
|
477
|
+
private initialized: boolean = false;
|
|
478
|
+
private skillCache: Map<string, SkillInfo> = new Map(); // Stores metadata only
|
|
479
|
+
// private skillContentCache: Map<string, string> = new Map(); // Stores full SKILL.md content - UNUSED
|
|
480
|
+
|
|
481
|
+
constructor(skillLoader?: SkillLoader) {
|
|
482
|
+
this.skillLoader = skillLoader || getSkillLoader();
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
async initialize(): Promise<void> {
|
|
486
|
+
if (this.initialized) return;
|
|
487
|
+
|
|
488
|
+
// Use discoverSkills to only discover directories without loading full content
|
|
489
|
+
const skillIds = await this.skillLoader.discoverSkills();
|
|
490
|
+
|
|
491
|
+
// Create minimal SkillInfo objects with metadata only
|
|
492
|
+
for (const skillId of skillIds) {
|
|
493
|
+
const skillPath = this.skillLoader.getSkillDirectory?.(skillId) || '';
|
|
494
|
+
const skillInfo: SkillInfo = {
|
|
495
|
+
id: skillId,
|
|
496
|
+
name: skillId,
|
|
497
|
+
description: '', // Will be loaded lazily
|
|
498
|
+
license: 'Unknown',
|
|
499
|
+
version: '1.0.0',
|
|
500
|
+
author: 'Anonymous',
|
|
501
|
+
category: '',
|
|
502
|
+
markdown: '', // Full content loaded lazily
|
|
503
|
+
skillsPath: skillPath
|
|
504
|
+
};
|
|
505
|
+
this.skillCache.set(skillId, skillInfo);
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
this.initialized = true;
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
/**
|
|
512
|
+
* Load skill metadata (name, description, category) from SKILL.md frontmatter
|
|
513
|
+
* This is called lazily when skill details are needed
|
|
514
|
+
*/
|
|
515
|
+
async loadSkillMetadata(skillId: string): Promise<void> {
|
|
516
|
+
const skill = this.skillCache.get(skillId);
|
|
517
|
+
if (!skill) return;
|
|
518
|
+
|
|
519
|
+
// Check if metadata already loaded
|
|
520
|
+
if (skill.description && skill.category) return;
|
|
521
|
+
|
|
522
|
+
const skillPath = skill.skillsPath;
|
|
523
|
+
const skillMdPath = path.join(skillPath, 'SKILL.md');
|
|
524
|
+
|
|
525
|
+
try {
|
|
526
|
+
const content = await fs.readFile(skillMdPath, 'utf-8');
|
|
527
|
+
const parsed = this.skillLoader.parseSkillMarkdown(content);
|
|
528
|
+
|
|
529
|
+
skill.name = parsed.name || skillId;
|
|
530
|
+
skill.description = parsed.description || '';
|
|
531
|
+
skill.license = parsed.license || 'Unknown';
|
|
532
|
+
skill.version = parsed.version || '1.0.0';
|
|
533
|
+
skill.author = parsed.author || 'Anonymous';
|
|
534
|
+
|
|
535
|
+
// Extract category from path
|
|
536
|
+
const pathParts = skillPath.split(path.sep);
|
|
537
|
+
const skillsIndex = pathParts.findIndex(p => p === 'skills');
|
|
538
|
+
if (skillsIndex >= 0 && pathParts.length > skillsIndex + 1) {
|
|
539
|
+
skill.category = pathParts[skillsIndex + 1];
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
skill.markdown = content; // Now we have the full content
|
|
543
|
+
// this.skillContentCache.set(skillId, content); // UNUSED
|
|
544
|
+
} catch (error) {
|
|
545
|
+
console.warn(`[SkillInvoker] Failed to load metadata for skill ${skillId}:`, error);
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
/**
|
|
550
|
+
* Get list of all available skills (with metadata)
|
|
551
|
+
*/
|
|
552
|
+
async listAvailableSkills(): Promise<SkillInfo[]> {
|
|
553
|
+
await this.initialize();
|
|
554
|
+
|
|
555
|
+
// Load metadata for all skills if not already loaded
|
|
556
|
+
for (const skillId of this.skillCache.keys()) {
|
|
557
|
+
await this.loadSkillMetadata(skillId);
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
return Array.from(this.skillCache.values());
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
/**
|
|
564
|
+
* Reload all skills (e.g., after adding/removing a skill via CLI)
|
|
565
|
+
* Clears the cache and re-discovers all skills
|
|
566
|
+
*/
|
|
567
|
+
async reload(): Promise<void> {
|
|
568
|
+
// Reset initialization state to allow re-discovery
|
|
569
|
+
this.initialized = false;
|
|
570
|
+
this.skillCache.clear();
|
|
571
|
+
|
|
572
|
+
// Re-initialize
|
|
573
|
+
await this.initialize();
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
/**
|
|
577
|
+
* Match the most relevant skill based on user input
|
|
578
|
+
* NOTE: SKILL_TRIGGERS disabled. Let LLM decide based on system prompt.
|
|
579
|
+
* Returns null to indicate no explicit match - LLM should use its own judgment.
|
|
580
|
+
*/
|
|
581
|
+
async matchSkill(_userInput: string): Promise<SkillMatcherResult | null> {
|
|
582
|
+
// SKILL_TRIGGERS is disabled for experiment purposes.
|
|
583
|
+
// The LLM should decide which skill to use based on system prompt information.
|
|
584
|
+
return null;
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
/**
|
|
588
|
+
* Get skill details
|
|
589
|
+
*/
|
|
590
|
+
async getSkillDetails(skillId: string): Promise<SkillInfo | null> {
|
|
591
|
+
await this.initialize();
|
|
592
|
+
return this.skillLoader.getSkill(skillId) || null;
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
/**
|
|
596
|
+
* Execute skill
|
|
597
|
+
*/
|
|
598
|
+
async executeSkill(params: SkillExecutionParams): Promise<SkillExecutionResult> {
|
|
599
|
+
// Ensure initialized
|
|
600
|
+
await this.initialize();
|
|
601
|
+
|
|
602
|
+
// Load skill metadata if not already loaded
|
|
603
|
+
await this.loadSkillMetadata(params.skillId);
|
|
604
|
+
|
|
605
|
+
const skill = this.skillCache.get(params.skillId);
|
|
606
|
+
|
|
607
|
+
if (!skill) {
|
|
608
|
+
return {
|
|
609
|
+
success: false,
|
|
610
|
+
error: `Skill not found: ${params.skillId}`
|
|
611
|
+
};
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
// Generate task ID (if not provided)
|
|
615
|
+
const taskId = params.taskId || `${params.skillId}-${Date.now()}`;
|
|
616
|
+
|
|
617
|
+
try {
|
|
618
|
+
// Execute based on skillId
|
|
619
|
+
const executor = this.getSkillExecutor(skill.id);
|
|
620
|
+
const result = await executor.execute(skill, { ...params, taskId });
|
|
621
|
+
|
|
622
|
+
// Add skillPath and workspaceDir to result (delay creation until actually needed)
|
|
623
|
+
if (result.success) {
|
|
624
|
+
// Get skillPath directly from skillDirectories (more reliable)
|
|
625
|
+
result.skillPath = this.skillLoader.getSkillDirectory?.(params.skillId) || skill.skillsPath || '';
|
|
626
|
+
if (result.nextSteps && result.nextSteps.length > 0) {
|
|
627
|
+
result.workspaceDir = getWorkspaceDir(taskId);
|
|
628
|
+
// Don't pre-create workspace - only create when actually used by LLM
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
return result;
|
|
633
|
+
} catch (error: any) {
|
|
634
|
+
return {
|
|
635
|
+
success: false,
|
|
636
|
+
error: error.message
|
|
637
|
+
};
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
/**
|
|
642
|
+
* Clean up workspace based on execution result
|
|
643
|
+
* @param result Skill execution result
|
|
644
|
+
* @param executionMode Execution mode
|
|
645
|
+
* @returns Whether cleanup was performed
|
|
646
|
+
*/
|
|
647
|
+
async cleanupAfterExecution(result: SkillExecutionResult, executionMode: ExecutionMode): Promise<boolean> {
|
|
648
|
+
if (!result.workspaceDir) {
|
|
649
|
+
return false;
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
// YOLO mode: auto cleanup
|
|
653
|
+
if (executionMode === ExecutionMode.YOLO) {
|
|
654
|
+
await cleanupWorkspace(result.workspaceDir, result.preserveFiles || []);
|
|
655
|
+
return true;
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
// Other modes: don't auto cleanup, let user decide
|
|
659
|
+
return false;
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
/**
|
|
663
|
+
* Get cleanup prompt (for asking user)
|
|
664
|
+
*/
|
|
665
|
+
async getCleanupPrompt(result: SkillExecutionResult): Promise<string | null> {
|
|
666
|
+
if (!result.workspaceDir) {
|
|
667
|
+
return null;
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
const info = await getCleanupInfo(result.workspaceDir);
|
|
671
|
+
if (info.files.length === 0) {
|
|
672
|
+
return null;
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
return `Task completed! Workspace directory contains the following files:\n` +
|
|
676
|
+
`📁 ${result.workspaceDir}\n` +
|
|
677
|
+
`Files: ${info.files.join(', ')}\n` +
|
|
678
|
+
`Size: ${info.totalSize}\n\n` +
|
|
679
|
+
`Do you want to clean up these temporary files?`;
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
/**
|
|
683
|
+
* Get executor for skill
|
|
684
|
+
* Unified dynamic approach - all skills use GenericSkillExecutor
|
|
685
|
+
*/
|
|
686
|
+
private getSkillExecutor(_skillId: string): SkillExecutor {
|
|
687
|
+
return new GenericSkillExecutor();
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
// ============================================================================
|
|
691
|
+
// Remote Mode Tool Support Methods
|
|
692
|
+
// ============================================================================
|
|
693
|
+
|
|
694
|
+
/**
|
|
695
|
+
* Check if it's a Skill tool
|
|
696
|
+
* Used for remote mode tool execution
|
|
697
|
+
*/
|
|
698
|
+
isSkillTool(toolName: string): boolean {
|
|
699
|
+
// Check if it's a skill ID in cache
|
|
700
|
+
return this.skillCache.has(toolName);
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
/**
|
|
704
|
+
* Get all Skill definitions (for syncing to remote server)
|
|
705
|
+
* NOTE: triggers field is empty since SKILL_TRIGGERS is disabled
|
|
706
|
+
*/
|
|
707
|
+
getAllSkillDefinitions(): Array<{
|
|
708
|
+
id: string;
|
|
709
|
+
name: string;
|
|
710
|
+
description: string;
|
|
711
|
+
category: string;
|
|
712
|
+
triggers: string[];
|
|
713
|
+
}> {
|
|
714
|
+
const definitions: Array<{
|
|
715
|
+
id: string;
|
|
716
|
+
name: string;
|
|
717
|
+
description: string;
|
|
718
|
+
category: string;
|
|
719
|
+
triggers: string[];
|
|
720
|
+
}> = [];
|
|
721
|
+
|
|
722
|
+
for (const skill of this.skillCache.values()) {
|
|
723
|
+
definitions.push({
|
|
724
|
+
id: skill.id,
|
|
725
|
+
name: skill.name,
|
|
726
|
+
description: skill.description,
|
|
727
|
+
category: skill.category,
|
|
728
|
+
triggers: [] // SKILL_TRIGGERS disabled - LLM decides based on description
|
|
729
|
+
});
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
return definitions;
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
/**
|
|
736
|
+
* Execute Skill tool (for remote mode tool execution)
|
|
737
|
+
* @param toolName - Tool name (skillId)
|
|
738
|
+
* @param params - Tool parameters
|
|
739
|
+
* @returns Execution result
|
|
740
|
+
*/
|
|
741
|
+
async executeSkillTool(
|
|
742
|
+
toolName: string,
|
|
743
|
+
params: Record<string, any>
|
|
744
|
+
): Promise<{ success: boolean; result?: any; error?: string }> {
|
|
745
|
+
// Check if skill exists in cache
|
|
746
|
+
if (!this.skillCache.has(toolName)) {
|
|
747
|
+
return { success: false, error: `Skill not found: ${toolName}` };
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
try {
|
|
751
|
+
const result = await this.executeSkill({
|
|
752
|
+
skillId: toolName,
|
|
753
|
+
taskDescription: params.taskDescription || params.description || '',
|
|
754
|
+
inputFile: params.inputFile,
|
|
755
|
+
outputFile: params.outputFile,
|
|
756
|
+
options: params.options || {}
|
|
757
|
+
});
|
|
758
|
+
|
|
759
|
+
return { success: result.success, result };
|
|
760
|
+
} catch (error: any) {
|
|
761
|
+
return { success: false, error: error.message };
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
/**
|
|
766
|
+
* Get all available Skill ID list
|
|
767
|
+
* NOTE: SKILL_TRIGGERS disabled - return all skill IDs from cache
|
|
768
|
+
*/
|
|
769
|
+
getAvailableSkillIds(): string[] {
|
|
770
|
+
return Array.from(this.skillCache.keys());
|
|
771
|
+
}
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
// ============================================================
|
|
775
|
+
// Skill Executor Interface and Implementation
|
|
776
|
+
// ============================================================
|
|
777
|
+
|
|
778
|
+
interface SkillExecutor {
|
|
779
|
+
execute(skill: SkillInfo, params: SkillExecutionParams): Promise<SkillExecutionResult>;
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
/**
|
|
783
|
+
* Generic Skill Executor - Unified dynamic approach for all skills
|
|
784
|
+
*/
|
|
785
|
+
class GenericSkillExecutor implements SkillExecutor {
|
|
786
|
+
async execute(skill: SkillInfo, params: SkillExecutionParams): Promise<SkillExecutionResult> {
|
|
787
|
+
const outputMessages: string[] = [];
|
|
788
|
+
const files: string[] = [];
|
|
789
|
+
const nextSteps: ExecutionStep[] = [];
|
|
790
|
+
|
|
791
|
+
outputMessages.push(`## ${skill.name} Skill - Execution Guide\n`);
|
|
792
|
+
outputMessages.push(`**Task**: ${params.taskDescription}\n`);
|
|
793
|
+
|
|
794
|
+
try {
|
|
795
|
+
// Generate task ID
|
|
796
|
+
const taskId = params.taskId || `${skill.id}-${Date.now()}`;
|
|
797
|
+
|
|
798
|
+
// Read complete skill documentation
|
|
799
|
+
const skillPath = skill.skillsPath;
|
|
800
|
+
const skillMdPath = path.join(skillPath, 'SKILL.md');
|
|
801
|
+
files.push(skillMdPath);
|
|
802
|
+
|
|
803
|
+
// Read SKILL.md content
|
|
804
|
+
const skillContent = await fs.readFile(skillMdPath, 'utf-8');
|
|
805
|
+
|
|
806
|
+
// Extract relevant content based on task type and generate execution steps
|
|
807
|
+
const taskContent = await this.extractRelevantContent(skill, params, skillContent, nextSteps, taskId);
|
|
808
|
+
outputMessages.push(taskContent);
|
|
809
|
+
|
|
810
|
+
// Add input/output files to list if they exist
|
|
811
|
+
if (params.inputFile) files.push(params.inputFile);
|
|
812
|
+
if (params.outputFile) files.push(params.outputFile);
|
|
813
|
+
|
|
814
|
+
return {
|
|
815
|
+
success: true,
|
|
816
|
+
output: outputMessages.join('\n'),
|
|
817
|
+
files: files,
|
|
818
|
+
nextSteps: nextSteps,
|
|
819
|
+
requiresManualExecution: true
|
|
820
|
+
};
|
|
821
|
+
} catch (error: any) {
|
|
822
|
+
return {
|
|
823
|
+
success: false,
|
|
824
|
+
error: error.message
|
|
825
|
+
};
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
/**
|
|
830
|
+
* Extract relevant skill content dynamically
|
|
831
|
+
*/
|
|
832
|
+
private async extractRelevantContent(
|
|
833
|
+
skill: SkillInfo,
|
|
834
|
+
params: SkillExecutionParams,
|
|
835
|
+
fullContent: string,
|
|
836
|
+
nextSteps: ExecutionStep[],
|
|
837
|
+
taskId: string
|
|
838
|
+
): Promise<string> {
|
|
839
|
+
const workspaceBase = getWorkspaceDescription();
|
|
840
|
+
const taskWorkspace = `${workspaceBase}/${taskId}`;
|
|
841
|
+
|
|
842
|
+
// Dynamically discover files in skill directory
|
|
843
|
+
const skillPath = skill.skillsPath;
|
|
844
|
+
let allFiles: string[] = [];
|
|
845
|
+
|
|
846
|
+
try {
|
|
847
|
+
const entries = await fs.readdir(skillPath, { withFileTypes: true });
|
|
848
|
+
for (const entry of entries) {
|
|
849
|
+
const fullPath = path.join(skillPath, entry.name);
|
|
850
|
+
if (entry.isFile()) {
|
|
851
|
+
allFiles.push(fullPath);
|
|
852
|
+
} else if (entry.isDirectory()) {
|
|
853
|
+
// Recursively list files in subdirectories (limited depth)
|
|
854
|
+
const subEntries = await fs.readdir(fullPath, { withFileTypes: true });
|
|
855
|
+
for (const subEntry of subEntries) {
|
|
856
|
+
if (subEntry.isFile()) {
|
|
857
|
+
allFiles.push(path.join(fullPath, subEntry.name));
|
|
858
|
+
}
|
|
859
|
+
}
|
|
860
|
+
}
|
|
861
|
+
}
|
|
862
|
+
} catch {
|
|
863
|
+
// Fallback to just SKILL.md if directory can't be read
|
|
864
|
+
allFiles = [path.join(skillPath, 'SKILL.md')];
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
// Step 1: Read SKILL.md first
|
|
868
|
+
const skillMdPathOnly = path.join(skillPath, 'SKILL.md');
|
|
869
|
+
nextSteps.push({
|
|
870
|
+
step: 1,
|
|
871
|
+
action: 'Read SKILL.md to understand the skill workflow',
|
|
872
|
+
description: `Read: ${skillMdPathOnly}`,
|
|
873
|
+
reason: 'Understand the skill workflow and best practices from the main documentation'
|
|
874
|
+
});
|
|
875
|
+
|
|
876
|
+
// Step 2: Explore skill directory and read reference files if needed (optional)
|
|
877
|
+
nextSteps.push({
|
|
878
|
+
step: 2,
|
|
879
|
+
action: 'Explore skill directory and read reference files (if needed)',
|
|
880
|
+
description: `Explore: ${skillPath}`,
|
|
881
|
+
reason: 'Discover available reference files and read them based on SKILL.md guidance'
|
|
882
|
+
});
|
|
883
|
+
|
|
884
|
+
nextSteps.push({
|
|
885
|
+
step: 3,
|
|
886
|
+
action: 'Analyze documentation, verify data/content completeness, and design approach',
|
|
887
|
+
description: `For content creation: ensure all info/materials collected. For info retrieval: ensure all required data retrieved. Then design execution plan for: ${taskWorkspace}`,
|
|
888
|
+
reason: 'Review requirements, verify data/content completeness, fill gaps if needed, then plan execution based on the documentation'
|
|
889
|
+
});
|
|
890
|
+
|
|
891
|
+
nextSteps.push({
|
|
892
|
+
step: 4,
|
|
893
|
+
action: 'Execute your plan',
|
|
894
|
+
description: 'Create workspace, write code, run scripts, verify output',
|
|
895
|
+
reason: 'Execute the task using your own understanding'
|
|
896
|
+
});
|
|
897
|
+
|
|
898
|
+
return `### Skill Execution\n\n` +
|
|
899
|
+
`**Your task**: ${params.taskDescription}\n\n` +
|
|
900
|
+
`**Step 1**: Read SKILL.md to understand the skill workflow\n` +
|
|
901
|
+
` - read_file: ${skillMdPathOnly}\n\n` +
|
|
902
|
+
`**Step 2**: Explore skill directory and read reference files (if needed)\n` +
|
|
903
|
+
` - ListDirectory(path="${skillPath}")\n` +
|
|
904
|
+
` - read_file relevant .md and script files as needed\n\n` +
|
|
905
|
+
`Then analyze the documentation and create your own execution plan.\n\n` +
|
|
906
|
+
`**Workspace**: \`${taskWorkspace}\`\n\n` +
|
|
907
|
+
`**⚠️ Windows Path Execution**: Use absolute paths, NOT \`cd && command\`:\n` +
|
|
908
|
+
` - ✅ Correct: \`node "${taskWorkspace}/script.js"\`\n` +
|
|
909
|
+
` - ❌ Wrong: \`cd "${taskWorkspace}" && node script.js\` (fails in PowerShell 5.1)\n` +
|
|
910
|
+
` - ✅ Correct: \`python "${taskWorkspace}/script.py"\`\n\n` +
|
|
911
|
+
`**📦 Dependency Management**:\n` +
|
|
912
|
+
` - Use \`skillPath\` parameter to install dependencies to skill's node_modules (persists across invocations)\n` +
|
|
913
|
+
` - ✅ Correct: Bash(command="npm install <package>", skillPath="${skillPath}")\n` +
|
|
914
|
+
` - ✅ Correct: Bash(command="npm install", skillPath="${skillPath}")\n` +
|
|
915
|
+
` - Dependencies are saved to: <userSkillsPath>/<skillName>/node_modules\n` +
|
|
916
|
+
` - 💡 Tip: Install once, reuse forever - no need to reinstall on each call!\n` +
|
|
917
|
+
` - After install, scripts can use require() directly with NODE_PATH auto-set\n` +
|
|
918
|
+
` - NODE_PATH precedence: skill's node_modules > xAgent's node_modules\n` +
|
|
919
|
+
` - Manual execution (Windows): set "NODE_PATH=${skillPath}/node_modules;<xAgentPath>/node_modules" && node script.js\n` +
|
|
920
|
+
` - Manual execution (Linux/Mac): NODE_PATH=${skillPath}/node_modules:${process.cwd()}/node_modules node script.js\n` +
|
|
921
|
+
` - ⚠️ If skillPath approach fails (module not found errors): Install directly in workspace\n` +
|
|
922
|
+
` Priority: skill's node_modules > workspace's node_modules > xAgent's node_modules\n\n` +
|
|
923
|
+
`**🧹 Cleanup**: Delete all intermediate/temporary files when task completes:\n` +
|
|
924
|
+
` - Remove: all files generated during the task\n` +
|
|
925
|
+
` - Keep: Only the final output file (output.pptx/docx/xlsx/pdf or other file format required by user)\n` +
|
|
926
|
+
` - ⚠️ If user needs to check results or make adjustments: RETAIN intermediate/temporary files for debugging\n\n` +
|
|
927
|
+
`**Instructions**: read_file the documentation, understand the API, and create your own execution plan.\n` +
|
|
928
|
+
`**If you encounter issues**: Explain what went wrong and suggest a different approach.\n`;
|
|
929
|
+
}
|
|
930
|
+
}
|
|
931
|
+
// ============================================================
|
|
932
|
+
// ============================================================
|
|
933
|
+
|
|
934
|
+
/**
|
|
935
|
+
* Execute skill - LLM analyzes SKILL.md and generates its own steps
|
|
936
|
+
* @param skill Skill to execute
|
|
937
|
+
* @param params Execution parameters
|
|
938
|
+
* @returns Execution result with guidance
|
|
939
|
+
*/
|
|
940
|
+
export async function executeSkill(
|
|
941
|
+
skill: SkillInfo,
|
|
942
|
+
params: SkillExecutionParams
|
|
943
|
+
): Promise<SkillExecutionResult> {
|
|
944
|
+
const executor = new GenericSkillExecutor();
|
|
945
|
+
return executor.execute(skill, params);
|
|
946
|
+
}
|
|
947
|
+
|
|
948
|
+
// ============================================================
|
|
949
|
+
// Singleton Instance and Exports
|
|
950
|
+
// ============================================================
|
|
951
|
+
|
|
952
|
+
let skillInvokerInstance: SkillInvoker | null = null;
|
|
953
|
+
|
|
954
|
+
export function getSkillInvoker(): SkillInvoker {
|
|
955
|
+
if (!skillInvokerInstance) {
|
|
956
|
+
skillInvokerInstance = new SkillInvoker();
|
|
957
|
+
}
|
|
958
|
+
return skillInvokerInstance;
|
|
959
|
+
}
|