@wingman-ai/gateway 0.1.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/.wingman/agents/README.md +161 -0
- package/.wingman/agents/coding/agent.md +147 -0
- package/.wingman/agents/coding/implementor.md +56 -0
- package/.wingman/agents/main/agent.md +19 -0
- package/.wingman/agents/researcher/agent.md +62 -0
- package/.wingman/agents/stock-trader/agent.md +223 -0
- package/.wingman/agents/stock-trader/chain-curator.md +24 -0
- package/.wingman/agents/stock-trader/goal-translator.md +42 -0
- package/.wingman/agents/stock-trader/guardrails-veto.md +11 -0
- package/.wingman/agents/stock-trader/path-planner.md +23 -0
- package/.wingman/agents/stock-trader/regime-analyst.md +15 -0
- package/.wingman/agents/stock-trader/risk.md +20 -0
- package/.wingman/agents/stock-trader/selection.md +22 -0
- package/.wingman/agents/stock-trader/strategy-composer.md +38 -0
- package/.wingman/agents/wingman/agent.json +12 -0
- package/bin/wingman +7 -0
- package/dist/agent/config/agentConfig.cjs +95 -0
- package/dist/agent/config/agentConfig.d.ts +187 -0
- package/dist/agent/config/agentConfig.js +52 -0
- package/dist/agent/config/agentLoader.cjs +242 -0
- package/dist/agent/config/agentLoader.d.ts +42 -0
- package/dist/agent/config/agentLoader.js +208 -0
- package/dist/agent/config/mcpClientManager.cjs +168 -0
- package/dist/agent/config/mcpClientManager.d.ts +41 -0
- package/dist/agent/config/mcpClientManager.js +134 -0
- package/dist/agent/config/modelFactory.cjs +175 -0
- package/dist/agent/config/modelFactory.d.ts +33 -0
- package/dist/agent/config/modelFactory.js +141 -0
- package/dist/agent/config/toolRegistry.cjs +111 -0
- package/dist/agent/config/toolRegistry.d.ts +25 -0
- package/dist/agent/config/toolRegistry.js +71 -0
- package/dist/agent/middleware/additional-messages.cjs +60 -0
- package/dist/agent/middleware/additional-messages.d.ts +7 -0
- package/dist/agent/middleware/additional-messages.js +26 -0
- package/dist/agent/middleware/hooks/executor.cjs +137 -0
- package/dist/agent/middleware/hooks/executor.d.ts +52 -0
- package/dist/agent/middleware/hooks/executor.js +103 -0
- package/dist/agent/middleware/hooks/input-builder.cjs +55 -0
- package/dist/agent/middleware/hooks/input-builder.d.ts +15 -0
- package/dist/agent/middleware/hooks/input-builder.js +21 -0
- package/dist/agent/middleware/hooks/matcher.cjs +59 -0
- package/dist/agent/middleware/hooks/matcher.d.ts +27 -0
- package/dist/agent/middleware/hooks/matcher.js +22 -0
- package/dist/agent/middleware/hooks/merger.cjs +54 -0
- package/dist/agent/middleware/hooks/merger.d.ts +18 -0
- package/dist/agent/middleware/hooks/merger.js +20 -0
- package/dist/agent/middleware/hooks/types.cjs +62 -0
- package/dist/agent/middleware/hooks/types.d.ts +82 -0
- package/dist/agent/middleware/hooks/types.js +19 -0
- package/dist/agent/middleware/hooks.cjs +79 -0
- package/dist/agent/middleware/hooks.d.ts +19 -0
- package/dist/agent/middleware/hooks.js +45 -0
- package/dist/agent/middleware/media-compat.cjs +80 -0
- package/dist/agent/middleware/media-compat.d.ts +7 -0
- package/dist/agent/middleware/media-compat.js +46 -0
- package/dist/agent/tests/agentConfig.test.cjs +132 -0
- package/dist/agent/tests/agentConfig.test.d.ts +1 -0
- package/dist/agent/tests/agentConfig.test.js +126 -0
- package/dist/agent/tests/agentLoader.test.cjs +235 -0
- package/dist/agent/tests/agentLoader.test.d.ts +1 -0
- package/dist/agent/tests/agentLoader.test.js +229 -0
- package/dist/agent/tests/modelFactory.test.cjs +114 -0
- package/dist/agent/tests/modelFactory.test.d.ts +1 -0
- package/dist/agent/tests/modelFactory.test.js +108 -0
- package/dist/agent/tests/test-agent-loader.cjs +33 -0
- package/dist/agent/tests/test-agent-loader.d.ts +1 -0
- package/dist/agent/tests/test-agent-loader.js +27 -0
- package/dist/agent/tests/test-subagent-loading.cjs +99 -0
- package/dist/agent/tests/test-subagent-loading.d.ts +1 -0
- package/dist/agent/tests/test-subagent-loading.js +93 -0
- package/dist/agent/tests/toolRegistry.test.cjs +109 -0
- package/dist/agent/tests/toolRegistry.test.d.ts +1 -0
- package/dist/agent/tests/toolRegistry.test.js +103 -0
- package/dist/agent/tools/code_search.cjs +108 -0
- package/dist/agent/tools/code_search.d.ts +24 -0
- package/dist/agent/tools/code_search.js +74 -0
- package/dist/agent/tools/command_execute.cjs +136 -0
- package/dist/agent/tools/command_execute.d.ts +12 -0
- package/dist/agent/tools/command_execute.js +99 -0
- package/dist/agent/tools/git_status.cjs +126 -0
- package/dist/agent/tools/git_status.d.ts +15 -0
- package/dist/agent/tools/git_status.js +92 -0
- package/dist/agent/tools/internet_search.cjs +93 -0
- package/dist/agent/tools/internet_search.d.ts +25 -0
- package/dist/agent/tools/internet_search.js +56 -0
- package/dist/agent/tools/think.cjs +53 -0
- package/dist/agent/tools/think.d.ts +26 -0
- package/dist/agent/tools/think.js +16 -0
- package/dist/agent/tools/web_crawler.cjs +180 -0
- package/dist/agent/tools/web_crawler.d.ts +31 -0
- package/dist/agent/tools/web_crawler.js +143 -0
- package/dist/agent/utils.cjs +54 -0
- package/dist/agent/utils.d.ts +1 -0
- package/dist/agent/utils.js +10 -0
- package/dist/cli/commands/agent.cjs +169 -0
- package/dist/cli/commands/agent.d.ts +15 -0
- package/dist/cli/commands/agent.js +125 -0
- package/dist/cli/commands/gateway.cjs +601 -0
- package/dist/cli/commands/gateway.d.ts +12 -0
- package/dist/cli/commands/gateway.js +567 -0
- package/dist/cli/commands/init.cjs +681 -0
- package/dist/cli/commands/init.d.ts +10 -0
- package/dist/cli/commands/init.js +634 -0
- package/dist/cli/commands/provider.cjs +208 -0
- package/dist/cli/commands/provider.d.ts +5 -0
- package/dist/cli/commands/provider.js +174 -0
- package/dist/cli/commands/skill.cjs +145 -0
- package/dist/cli/commands/skill.d.ts +10 -0
- package/dist/cli/commands/skill.js +111 -0
- package/dist/cli/config/loader.cjs +143 -0
- package/dist/cli/config/loader.d.ts +14 -0
- package/dist/cli/config/loader.js +109 -0
- package/dist/cli/config/schema.cjs +262 -0
- package/dist/cli/config/schema.d.ts +268 -0
- package/dist/cli/config/schema.js +213 -0
- package/dist/cli/core/agentInvoker.cjs +284 -0
- package/dist/cli/core/agentInvoker.d.ts +77 -0
- package/dist/cli/core/agentInvoker.js +247 -0
- package/dist/cli/core/commandHandler.cjs +257 -0
- package/dist/cli/core/commandHandler.d.ts +62 -0
- package/dist/cli/core/commandHandler.js +223 -0
- package/dist/cli/core/database/bunSqliteAdapter.cjs +87 -0
- package/dist/cli/core/database/bunSqliteAdapter.d.ts +34 -0
- package/dist/cli/core/database/bunSqliteAdapter.js +53 -0
- package/dist/cli/core/loggerBridge.cjs +42 -0
- package/dist/cli/core/loggerBridge.d.ts +8 -0
- package/dist/cli/core/loggerBridge.js +8 -0
- package/dist/cli/core/outputManager.cjs +106 -0
- package/dist/cli/core/outputManager.d.ts +43 -0
- package/dist/cli/core/outputManager.js +72 -0
- package/dist/cli/core/sessionManager.cjs +535 -0
- package/dist/cli/core/sessionManager.d.ts +111 -0
- package/dist/cli/core/sessionManager.js +486 -0
- package/dist/cli/core/streamParser.cjs +328 -0
- package/dist/cli/core/streamParser.d.ts +42 -0
- package/dist/cli/core/streamParser.js +288 -0
- package/dist/cli/index.cjs +211 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +205 -0
- package/dist/cli/services/skillRepository.cjs +178 -0
- package/dist/cli/services/skillRepository.d.ts +35 -0
- package/dist/cli/services/skillRepository.js +144 -0
- package/dist/cli/services/skillService.cjs +336 -0
- package/dist/cli/services/skillService.d.ts +48 -0
- package/dist/cli/services/skillService.js +302 -0
- package/dist/cli/types/gateway.cjs +18 -0
- package/dist/cli/types/gateway.d.ts +18 -0
- package/dist/cli/types/gateway.js +0 -0
- package/dist/cli/types/init.cjs +18 -0
- package/dist/cli/types/init.d.ts +13 -0
- package/dist/cli/types/init.js +0 -0
- package/dist/cli/types/provider.cjs +18 -0
- package/dist/cli/types/provider.d.ts +9 -0
- package/dist/cli/types/provider.js +0 -0
- package/dist/cli/types/skill.cjs +18 -0
- package/dist/cli/types/skill.d.ts +71 -0
- package/dist/cli/types/skill.js +0 -0
- package/dist/cli/types.cjs +18 -0
- package/dist/cli/types.d.ts +175 -0
- package/dist/cli/types.js +0 -0
- package/dist/cli/ui/AgentOutput.cjs +82 -0
- package/dist/cli/ui/AgentOutput.d.ts +8 -0
- package/dist/cli/ui/AgentOutput.js +38 -0
- package/dist/cli/ui/App.cjs +285 -0
- package/dist/cli/ui/App.d.ts +6 -0
- package/dist/cli/ui/App.js +241 -0
- package/dist/cli/ui/ErrorDisplay.cjs +65 -0
- package/dist/cli/ui/ErrorDisplay.d.ts +8 -0
- package/dist/cli/ui/ErrorDisplay.js +21 -0
- package/dist/cli/ui/LogDisplay.cjs +74 -0
- package/dist/cli/ui/LogDisplay.d.ts +13 -0
- package/dist/cli/ui/LogDisplay.js +30 -0
- package/dist/cli/ui/SessionListDisplay.cjs +135 -0
- package/dist/cli/ui/SessionListDisplay.d.ts +9 -0
- package/dist/cli/ui/SessionListDisplay.js +91 -0
- package/dist/cli/ui/blockHelpers.cjs +80 -0
- package/dist/cli/ui/blockHelpers.d.ts +21 -0
- package/dist/cli/ui/blockHelpers.js +40 -0
- package/dist/cli/ui/components/ToolCallDisplay.cjs +207 -0
- package/dist/cli/ui/components/ToolCallDisplay.d.ts +7 -0
- package/dist/cli/ui/components/ToolCallDisplay.js +162 -0
- package/dist/cli/ui/components/ToolResultDisplay.cjs +86 -0
- package/dist/cli/ui/components/ToolResultDisplay.d.ts +8 -0
- package/dist/cli/ui/components/ToolResultDisplay.js +42 -0
- package/dist/cli/ui/toolDisplayHelpers.cjs +112 -0
- package/dist/cli/ui/toolDisplayHelpers.d.ts +3 -0
- package/dist/cli/ui/toolDisplayHelpers.js +72 -0
- package/dist/gateway/adapters/discord.cjs +298 -0
- package/dist/gateway/adapters/discord.d.ts +42 -0
- package/dist/gateway/adapters/discord.js +246 -0
- package/dist/gateway/auth.cjs +94 -0
- package/dist/gateway/auth.d.ts +36 -0
- package/dist/gateway/auth.js +60 -0
- package/dist/gateway/broadcast.cjs +131 -0
- package/dist/gateway/broadcast.d.ts +76 -0
- package/dist/gateway/broadcast.js +97 -0
- package/dist/gateway/client.cjs +282 -0
- package/dist/gateway/client.d.ts +141 -0
- package/dist/gateway/client.js +248 -0
- package/dist/gateway/daemon.cjs +195 -0
- package/dist/gateway/daemon.d.ts +67 -0
- package/dist/gateway/daemon.js +161 -0
- package/dist/gateway/discovery/index.cjs +72 -0
- package/dist/gateway/discovery/index.d.ts +3 -0
- package/dist/gateway/discovery/index.js +3 -0
- package/dist/gateway/discovery/mdns.cjs +221 -0
- package/dist/gateway/discovery/mdns.d.ts +37 -0
- package/dist/gateway/discovery/mdns.js +177 -0
- package/dist/gateway/discovery/tailscale.cjs +140 -0
- package/dist/gateway/discovery/tailscale.d.ts +31 -0
- package/dist/gateway/discovery/tailscale.js +106 -0
- package/dist/gateway/discovery/types.cjs +18 -0
- package/dist/gateway/discovery/types.d.ts +41 -0
- package/dist/gateway/discovery/types.js +0 -0
- package/dist/gateway/env.cjs +45 -0
- package/dist/gateway/env.d.ts +2 -0
- package/dist/gateway/env.js +8 -0
- package/dist/gateway/hooks/loader.cjs +137 -0
- package/dist/gateway/hooks/loader.d.ts +10 -0
- package/dist/gateway/hooks/loader.js +103 -0
- package/dist/gateway/hooks/registry.cjs +128 -0
- package/dist/gateway/hooks/registry.d.ts +13 -0
- package/dist/gateway/hooks/registry.js +94 -0
- package/dist/gateway/hooks/types.cjs +58 -0
- package/dist/gateway/hooks/types.d.ts +50 -0
- package/dist/gateway/hooks/types.js +18 -0
- package/dist/gateway/http/agents.cjs +280 -0
- package/dist/gateway/http/agents.d.ts +2 -0
- package/dist/gateway/http/agents.js +246 -0
- package/dist/gateway/http/fs.cjs +81 -0
- package/dist/gateway/http/fs.d.ts +2 -0
- package/dist/gateway/http/fs.js +47 -0
- package/dist/gateway/http/providers.cjs +120 -0
- package/dist/gateway/http/providers.d.ts +2 -0
- package/dist/gateway/http/providers.js +86 -0
- package/dist/gateway/http/routines.cjs +196 -0
- package/dist/gateway/http/routines.d.ts +20 -0
- package/dist/gateway/http/routines.js +159 -0
- package/dist/gateway/http/sessions.cjs +241 -0
- package/dist/gateway/http/sessions.d.ts +2 -0
- package/dist/gateway/http/sessions.js +207 -0
- package/dist/gateway/http/types.cjs +18 -0
- package/dist/gateway/http/types.d.ts +25 -0
- package/dist/gateway/http/types.js +0 -0
- package/dist/gateway/http/voice.cjs +167 -0
- package/dist/gateway/http/voice.d.ts +2 -0
- package/dist/gateway/http/voice.js +133 -0
- package/dist/gateway/http/webhooks.cjs +353 -0
- package/dist/gateway/http/webhooks.d.ts +22 -0
- package/dist/gateway/http/webhooks.js +313 -0
- package/dist/gateway/index.cjs +119 -0
- package/dist/gateway/index.d.ts +8 -0
- package/dist/gateway/index.js +9 -0
- package/dist/gateway/node.cjs +218 -0
- package/dist/gateway/node.d.ts +112 -0
- package/dist/gateway/node.js +184 -0
- package/dist/gateway/router.cjs +85 -0
- package/dist/gateway/router.d.ts +9 -0
- package/dist/gateway/router.js +51 -0
- package/dist/gateway/rpcClient.cjs +152 -0
- package/dist/gateway/rpcClient.d.ts +24 -0
- package/dist/gateway/rpcClient.js +118 -0
- package/dist/gateway/server.cjs +1175 -0
- package/dist/gateway/server.d.ts +185 -0
- package/dist/gateway/server.js +1138 -0
- package/dist/gateway/transport/http.cjs +153 -0
- package/dist/gateway/transport/http.d.ts +25 -0
- package/dist/gateway/transport/http.js +119 -0
- package/dist/gateway/transport/index.cjs +40 -0
- package/dist/gateway/transport/index.d.ts +3 -0
- package/dist/gateway/transport/index.js +3 -0
- package/dist/gateway/transport/types.cjs +18 -0
- package/dist/gateway/transport/types.d.ts +59 -0
- package/dist/gateway/transport/types.js +0 -0
- package/dist/gateway/transport/websocket.cjs +132 -0
- package/dist/gateway/transport/websocket.d.ts +21 -0
- package/dist/gateway/transport/websocket.js +98 -0
- package/dist/gateway/types.cjs +18 -0
- package/dist/gateway/types.d.ts +215 -0
- package/dist/gateway/types.js +0 -0
- package/dist/gateway/validation.cjs +225 -0
- package/dist/gateway/validation.d.ts +157 -0
- package/dist/gateway/validation.js +158 -0
- package/dist/index.cjs +95 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +6 -0
- package/dist/logger.cjs +270 -0
- package/dist/logger.d.ts +54 -0
- package/dist/logger.js +215 -0
- package/dist/providers/copilot.cjs +148 -0
- package/dist/providers/copilot.d.ts +3 -0
- package/dist/providers/copilot.js +114 -0
- package/dist/providers/credentials.cjs +154 -0
- package/dist/providers/credentials.d.ts +26 -0
- package/dist/providers/credentials.js +99 -0
- package/dist/providers/oauth.cjs +279 -0
- package/dist/providers/oauth.d.ts +13 -0
- package/dist/providers/oauth.js +245 -0
- package/dist/providers/registry.cjs +138 -0
- package/dist/providers/registry.d.ts +32 -0
- package/dist/providers/registry.js +98 -0
- package/dist/tests/additionalMessageMiddleware.test.cjs +45 -0
- package/dist/tests/additionalMessageMiddleware.test.d.ts +1 -0
- package/dist/tests/additionalMessageMiddleware.test.js +39 -0
- package/dist/tests/agent-config-voice.test.cjs +25 -0
- package/dist/tests/agent-config-voice.test.d.ts +1 -0
- package/dist/tests/agent-config-voice.test.js +19 -0
- package/dist/tests/agentInvokerAttachments.test.cjs +67 -0
- package/dist/tests/agentInvokerAttachments.test.d.ts +1 -0
- package/dist/tests/agentInvokerAttachments.test.js +61 -0
- package/dist/tests/attachments-utils.test.cjs +46 -0
- package/dist/tests/attachments-utils.test.d.ts +1 -0
- package/dist/tests/attachments-utils.test.js +40 -0
- package/dist/tests/bunSqliteAdapter.test.cjs +265 -0
- package/dist/tests/bunSqliteAdapter.test.d.ts +1 -0
- package/dist/tests/bunSqliteAdapter.test.js +259 -0
- package/dist/tests/candleRange.test.cjs +48 -0
- package/dist/tests/candleRange.test.d.ts +1 -0
- package/dist/tests/candleRange.test.js +42 -0
- package/dist/tests/cli-config-loader.test.cjs +364 -0
- package/dist/tests/cli-config-loader.test.d.ts +1 -0
- package/dist/tests/cli-config-loader.test.js +358 -0
- package/dist/tests/cli-init.test.cjs +82 -0
- package/dist/tests/cli-init.test.d.ts +1 -0
- package/dist/tests/cli-init.test.js +76 -0
- package/dist/tests/discord-adapter.test.cjs +55 -0
- package/dist/tests/discord-adapter.test.d.ts +1 -0
- package/dist/tests/discord-adapter.test.js +49 -0
- package/dist/tests/gateway.test.cjs +319 -0
- package/dist/tests/gateway.test.d.ts +1 -0
- package/dist/tests/gateway.test.js +313 -0
- package/dist/tests/hooks-matcher.test.cjs +309 -0
- package/dist/tests/hooks-matcher.test.d.ts +1 -0
- package/dist/tests/hooks-matcher.test.js +303 -0
- package/dist/tests/hooks-merger.test.cjs +528 -0
- package/dist/tests/hooks-merger.test.d.ts +1 -0
- package/dist/tests/hooks-merger.test.js +522 -0
- package/dist/tests/integration/agent-invocation.integration.test.cjs +264 -0
- package/dist/tests/integration/agent-invocation.integration.test.d.ts +1 -0
- package/dist/tests/integration/agent-invocation.integration.test.js +258 -0
- package/dist/tests/integration/finnhub-candles.integration.test.cjs +98 -0
- package/dist/tests/integration/finnhub-candles.integration.test.d.ts +1 -0
- package/dist/tests/integration/finnhub-candles.integration.test.js +92 -0
- package/dist/tests/logger.test.cjs +353 -0
- package/dist/tests/logger.test.d.ts +1 -0
- package/dist/tests/logger.test.js +347 -0
- package/dist/tests/mediaCompatibilityMiddleware.test.cjs +106 -0
- package/dist/tests/mediaCompatibilityMiddleware.test.d.ts +1 -0
- package/dist/tests/mediaCompatibilityMiddleware.test.js +100 -0
- package/dist/tests/routines-api.test.cjs +107 -0
- package/dist/tests/routines-api.test.d.ts +1 -0
- package/dist/tests/routines-api.test.js +101 -0
- package/dist/tests/sessionMessageAttachments.test.cjs +108 -0
- package/dist/tests/sessionMessageAttachments.test.d.ts +1 -0
- package/dist/tests/sessionMessageAttachments.test.js +102 -0
- package/dist/tests/sessionMessageRole.test.cjs +44 -0
- package/dist/tests/sessionMessageRole.test.d.ts +1 -0
- package/dist/tests/sessionMessageRole.test.js +38 -0
- package/dist/tests/sessionStateMessages.test.cjs +72 -0
- package/dist/tests/sessionStateMessages.test.d.ts +1 -0
- package/dist/tests/sessionStateMessages.test.js +66 -0
- package/dist/tests/sessions-api.test.cjs +68 -0
- package/dist/tests/sessions-api.test.d.ts +1 -0
- package/dist/tests/sessions-api.test.js +62 -0
- package/dist/tests/technicalIndicators.test.cjs +82 -0
- package/dist/tests/technicalIndicators.test.d.ts +1 -0
- package/dist/tests/technicalIndicators.test.js +76 -0
- package/dist/tests/toolDisplayHelpers.test.cjs +43 -0
- package/dist/tests/toolDisplayHelpers.test.d.ts +1 -0
- package/dist/tests/toolDisplayHelpers.test.js +37 -0
- package/dist/tests/voice-config.test.cjs +35 -0
- package/dist/tests/voice-config.test.d.ts +1 -0
- package/dist/tests/voice-config.test.js +29 -0
- package/dist/tests/yahooCandles.test.cjs +111 -0
- package/dist/tests/yahooCandles.test.d.ts +1 -0
- package/dist/tests/yahooCandles.test.js +105 -0
- package/dist/tools/finance/candleRange.cjs +71 -0
- package/dist/tools/finance/candleRange.d.ts +21 -0
- package/dist/tools/finance/candleRange.js +28 -0
- package/dist/tools/finance/optionsAnalytics.cjs +222 -0
- package/dist/tools/finance/optionsAnalytics.d.ts +44 -0
- package/dist/tools/finance/optionsAnalytics.js +188 -0
- package/dist/tools/finance/optionsAnalytics.test.cjs +128 -0
- package/dist/tools/finance/optionsAnalytics.test.d.ts +1 -0
- package/dist/tools/finance/optionsAnalytics.test.js +122 -0
- package/dist/tools/finance/technicalIndicators.cjs +111 -0
- package/dist/tools/finance/technicalIndicators.d.ts +15 -0
- package/dist/tools/finance/technicalIndicators.js +68 -0
- package/dist/tools/finance/yahooCandles.cjs +125 -0
- package/dist/tools/finance/yahooCandles.d.ts +41 -0
- package/dist/tools/finance/yahooCandles.js +85 -0
- package/dist/tools/mcp-finance.cjs +649 -0
- package/dist/tools/mcp-finance.d.ts +1 -0
- package/dist/tools/mcp-finance.js +631 -0
- package/dist/types/agents.cjs +18 -0
- package/dist/types/agents.d.ts +11 -0
- package/dist/types/agents.js +0 -0
- package/dist/types/hooks.cjs +18 -0
- package/dist/types/hooks.d.ts +82 -0
- package/dist/types/hooks.js +0 -0
- package/dist/types/mcp.cjs +86 -0
- package/dist/types/mcp.d.ts +107 -0
- package/dist/types/mcp.js +40 -0
- package/dist/types/voice.cjs +103 -0
- package/dist/types/voice.d.ts +117 -0
- package/dist/types/voice.js +51 -0
- package/dist/utils/attachments.cjs +46 -0
- package/dist/utils/attachments.d.ts +7 -0
- package/dist/utils/attachments.js +12 -0
- package/dist/voice/config.cjs +52 -0
- package/dist/voice/config.d.ts +8 -0
- package/dist/voice/config.js +18 -0
- package/dist/webui/assets/index-BA0HaStz.css +1 -0
- package/dist/webui/assets/index-NHgTZsWN.js +112 -0
- package/dist/webui/assets/wingman_icon-DOy91UEF.webp +0 -0
- package/dist/webui/assets/wingman_logo-Cogyt3qm.webp +0 -0
- package/dist/webui/index.html +19 -0
- package/package.json +130 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { createLogger } from "../../logger.js";
|
|
2
|
+
function _define_property(obj, key, value) {
|
|
3
|
+
if (key in obj) Object.defineProperty(obj, key, {
|
|
4
|
+
value: value,
|
|
5
|
+
enumerable: true,
|
|
6
|
+
configurable: true,
|
|
7
|
+
writable: true
|
|
8
|
+
});
|
|
9
|
+
else obj[key] = value;
|
|
10
|
+
return obj;
|
|
11
|
+
}
|
|
12
|
+
const logger = createLogger();
|
|
13
|
+
class SkillRepository {
|
|
14
|
+
async fetch(path) {
|
|
15
|
+
const url = `${this.baseUrl}${path}`;
|
|
16
|
+
const headers = {
|
|
17
|
+
Accept: "application/vnd.github.v3+json",
|
|
18
|
+
"User-Agent": "wingman-cli"
|
|
19
|
+
};
|
|
20
|
+
if (this.token) headers.Authorization = `Bearer ${this.token}`;
|
|
21
|
+
const response = await fetch(url, {
|
|
22
|
+
headers
|
|
23
|
+
});
|
|
24
|
+
if (!response.ok) {
|
|
25
|
+
if (403 === response.status) {
|
|
26
|
+
const resetTime = response.headers.get("X-RateLimit-Reset");
|
|
27
|
+
const resetDate = resetTime ? new Date(1000 * Number.parseInt(resetTime)) : null;
|
|
28
|
+
throw new Error(`GitHub API rate limit exceeded. ${resetDate ? `Resets at ${resetDate.toLocaleString()}.` : ""} Set GITHUB_TOKEN environment variable for higher limits (5000/hour vs 60/hour).`);
|
|
29
|
+
}
|
|
30
|
+
if (404 === response.status) throw new Error(`Resource not found: ${path}`);
|
|
31
|
+
throw new Error(`GitHub API error: ${response.status} ${response.statusText}`);
|
|
32
|
+
}
|
|
33
|
+
return response.json();
|
|
34
|
+
}
|
|
35
|
+
async listAvailableSkills() {
|
|
36
|
+
try {
|
|
37
|
+
const contents = await this.fetch(`/repos/${this.owner}/${this.repo}/contents/skills`);
|
|
38
|
+
const skills = [];
|
|
39
|
+
for (const item of contents)if ("dir" === item.type) try {
|
|
40
|
+
const metadata = await this.getSkillMetadata(item.name);
|
|
41
|
+
skills.push({
|
|
42
|
+
name: item.name,
|
|
43
|
+
description: metadata.description || "No description",
|
|
44
|
+
path: item.path,
|
|
45
|
+
metadata
|
|
46
|
+
});
|
|
47
|
+
} catch (error) {
|
|
48
|
+
logger.warn(`Could not read skill ${item.name}`, error instanceof Error ? error.message : String(error));
|
|
49
|
+
}
|
|
50
|
+
return skills;
|
|
51
|
+
} catch (error) {
|
|
52
|
+
if (error instanceof Error) throw new Error(`Failed to list skills: ${error.message}`);
|
|
53
|
+
throw error;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async getSkillMetadata(skillName) {
|
|
57
|
+
try {
|
|
58
|
+
const skillMdPath = `/repos/${this.owner}/${this.repo}/contents/skills/${skillName}/SKILL.md`;
|
|
59
|
+
const skillMd = await this.fetch(skillMdPath);
|
|
60
|
+
if ("file" !== skillMd.type || !skillMd.content) throw new Error("SKILL.md not found or invalid");
|
|
61
|
+
const content = Buffer.from(skillMd.content, "base64").toString("utf-8");
|
|
62
|
+
const metadata = this.parseSkillMetadata(content);
|
|
63
|
+
return metadata;
|
|
64
|
+
} catch (error) {
|
|
65
|
+
if (error instanceof Error) throw new Error(`Failed to fetch skill metadata for ${skillName}: ${error.message}`);
|
|
66
|
+
throw error;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
parseSkillMetadata(content) {
|
|
70
|
+
const frontmatterRegex = /^---\s*\n([\s\S]*?)\n---/;
|
|
71
|
+
const match = content.match(frontmatterRegex);
|
|
72
|
+
if (!match) throw new Error("Invalid SKILL.md format: missing YAML frontmatter");
|
|
73
|
+
const frontmatter = match[1];
|
|
74
|
+
const metadata = {
|
|
75
|
+
name: "",
|
|
76
|
+
description: ""
|
|
77
|
+
};
|
|
78
|
+
const lines = frontmatter.split("\n");
|
|
79
|
+
for (const line of lines){
|
|
80
|
+
const colonIndex = line.indexOf(":");
|
|
81
|
+
if (-1 === colonIndex) continue;
|
|
82
|
+
const key = line.substring(0, colonIndex).trim();
|
|
83
|
+
const value = line.substring(colonIndex + 1).trim();
|
|
84
|
+
switch(key){
|
|
85
|
+
case "name":
|
|
86
|
+
metadata.name = value;
|
|
87
|
+
break;
|
|
88
|
+
case "description":
|
|
89
|
+
metadata.description = value;
|
|
90
|
+
break;
|
|
91
|
+
case "license":
|
|
92
|
+
metadata.license = value;
|
|
93
|
+
break;
|
|
94
|
+
case "compatibility":
|
|
95
|
+
metadata.compatibility = value;
|
|
96
|
+
break;
|
|
97
|
+
case "allowed-tools":
|
|
98
|
+
metadata.allowedTools = value;
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (!metadata.name) throw new Error("Invalid SKILL.md: missing required field 'name'");
|
|
103
|
+
if (!metadata.description) throw new Error("Invalid SKILL.md: missing required field 'description'");
|
|
104
|
+
const nameRegex = /^[a-z0-9]+(-[a-z0-9]+)*$/;
|
|
105
|
+
if (!nameRegex.test(metadata.name)) throw new Error(`Invalid skill name '${metadata.name}': must be lowercase alphanumeric with hyphens only`);
|
|
106
|
+
return metadata;
|
|
107
|
+
}
|
|
108
|
+
async downloadSkill(skillName) {
|
|
109
|
+
try {
|
|
110
|
+
const files = new Map();
|
|
111
|
+
await this.downloadDirectory(`skills/${skillName}`, files, skillName);
|
|
112
|
+
return files;
|
|
113
|
+
} catch (error) {
|
|
114
|
+
if (error instanceof Error) throw new Error(`Failed to download skill ${skillName}: ${error.message}`);
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
async downloadDirectory(path, files, skillName) {
|
|
119
|
+
const contents = await this.fetch(`/repos/${this.owner}/${this.repo}/contents/${path}`);
|
|
120
|
+
for (const item of contents)if ("file" === item.type) if (item.content) {
|
|
121
|
+
const content = Buffer.from(item.content, "base64");
|
|
122
|
+
const relativePath = item.path.replace(`skills/${skillName}/`, "");
|
|
123
|
+
files.set(relativePath, content);
|
|
124
|
+
} else {
|
|
125
|
+
const fileData = await this.fetch(item.url.replace(this.baseUrl, ""));
|
|
126
|
+
if (fileData.content && "base64" === fileData.encoding) {
|
|
127
|
+
const content = Buffer.from(fileData.content, "base64");
|
|
128
|
+
const relativePath = item.path.replace(`skills/${skillName}/`, "");
|
|
129
|
+
files.set(relativePath, content);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
else if ("dir" === item.type) await this.downloadDirectory(item.path, files, skillName);
|
|
133
|
+
}
|
|
134
|
+
constructor(options = {}){
|
|
135
|
+
_define_property(this, "baseUrl", "https://api.github.com");
|
|
136
|
+
_define_property(this, "owner", void 0);
|
|
137
|
+
_define_property(this, "repo", void 0);
|
|
138
|
+
_define_property(this, "token", void 0);
|
|
139
|
+
this.owner = options.repositoryOwner || "anthropics";
|
|
140
|
+
this.repo = options.repositoryName || "skills";
|
|
141
|
+
this.token = options.githubToken || process.env.GITHUB_TOKEN || void 0;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
export { SkillRepository };
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
5
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: definition[key]
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
})();
|
|
11
|
+
(()=>{
|
|
12
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
13
|
+
})();
|
|
14
|
+
(()=>{
|
|
15
|
+
__webpack_require__.r = (exports1)=>{
|
|
16
|
+
if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
17
|
+
value: 'Module'
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
20
|
+
value: true
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
})();
|
|
24
|
+
var __webpack_exports__ = {};
|
|
25
|
+
__webpack_require__.r(__webpack_exports__);
|
|
26
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
+
SkillService: ()=>SkillService
|
|
28
|
+
});
|
|
29
|
+
const promises_namespaceObject = require("node:fs/promises");
|
|
30
|
+
const external_node_path_namespaceObject = require("node:path");
|
|
31
|
+
const external_node_readline_promises_namespaceObject = require("node:readline/promises");
|
|
32
|
+
const external_logger_cjs_namespaceObject = require("../../logger.cjs");
|
|
33
|
+
function _define_property(obj, key, value) {
|
|
34
|
+
if (key in obj) Object.defineProperty(obj, key, {
|
|
35
|
+
value: value,
|
|
36
|
+
enumerable: true,
|
|
37
|
+
configurable: true,
|
|
38
|
+
writable: true
|
|
39
|
+
});
|
|
40
|
+
else obj[key] = value;
|
|
41
|
+
return obj;
|
|
42
|
+
}
|
|
43
|
+
class SkillService {
|
|
44
|
+
getSkillsPath() {
|
|
45
|
+
return external_node_path_namespaceObject.join(this.workspace, this.skillsDirectory);
|
|
46
|
+
}
|
|
47
|
+
async browseSkills() {
|
|
48
|
+
try {
|
|
49
|
+
this.logger.info("Fetching available skills from repository...");
|
|
50
|
+
const skills = await this.repository.listAvailableSkills();
|
|
51
|
+
if ("interactive" === this.outputManager.getMode()) {
|
|
52
|
+
console.log("\nAvailable Skills:");
|
|
53
|
+
console.log("=================\n");
|
|
54
|
+
if (0 === skills.length) console.log("No skills found.");
|
|
55
|
+
else {
|
|
56
|
+
for (const skill of skills){
|
|
57
|
+
console.log(` ${skill.name}`);
|
|
58
|
+
console.log(` ${skill.description}`);
|
|
59
|
+
console.log();
|
|
60
|
+
}
|
|
61
|
+
console.log(`\nTo install a skill, run: wingman skill install <skill-name>`);
|
|
62
|
+
}
|
|
63
|
+
} else this.outputManager.emitEvent({
|
|
64
|
+
type: "skill-browse",
|
|
65
|
+
skills: skills.map((s)=>({
|
|
66
|
+
name: s.name,
|
|
67
|
+
description: s.description
|
|
68
|
+
})),
|
|
69
|
+
timestamp: new Date().toISOString()
|
|
70
|
+
});
|
|
71
|
+
} catch (error) {
|
|
72
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
73
|
+
const logFile = (0, external_logger_cjs_namespaceObject.getLogFilePath)();
|
|
74
|
+
this.logger.error(`Failed to browse skills: ${errorMsg}`);
|
|
75
|
+
if ("interactive" === this.outputManager.getMode()) {
|
|
76
|
+
console.error(`\nError: ${errorMsg}`);
|
|
77
|
+
console.error(`Logs: ${logFile}`);
|
|
78
|
+
} else this.outputManager.emitEvent({
|
|
79
|
+
type: "agent-error",
|
|
80
|
+
error: errorMsg,
|
|
81
|
+
logFile,
|
|
82
|
+
timestamp: new Date().toISOString()
|
|
83
|
+
});
|
|
84
|
+
throw error;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
async installSkill(skillName) {
|
|
88
|
+
try {
|
|
89
|
+
const nameRegex = /^[a-z0-9]+(-[a-z0-9]+)*$/;
|
|
90
|
+
if (!nameRegex.test(skillName)) throw new Error(`Invalid skill name '${skillName}': must be lowercase alphanumeric with hyphens only`);
|
|
91
|
+
this.logger.info(`Installing skill: ${skillName}`);
|
|
92
|
+
const skillPath = external_node_path_namespaceObject.join(this.getSkillsPath(), skillName);
|
|
93
|
+
const exists = await this.skillExists(skillName);
|
|
94
|
+
if (exists) if ("interactive" === this.outputManager.getMode()) {
|
|
95
|
+
const shouldOverwrite = await this.promptForOverwrite(skillName);
|
|
96
|
+
if (!shouldOverwrite) return void console.log("\nInstallation cancelled.");
|
|
97
|
+
this.logger.info("Removing existing skill...");
|
|
98
|
+
await promises_namespaceObject.rm(skillPath, {
|
|
99
|
+
recursive: true,
|
|
100
|
+
force: true
|
|
101
|
+
});
|
|
102
|
+
} else throw new Error(`Skill '${skillName}' is already installed.`);
|
|
103
|
+
this.logger.info("Fetching skill metadata...");
|
|
104
|
+
const metadata = await this.repository.getSkillMetadata(skillName);
|
|
105
|
+
if ("interactive" === this.outputManager.getMode()) {
|
|
106
|
+
console.log(`\nInstalling skill: ${metadata.name}`);
|
|
107
|
+
console.log(`Description: ${metadata.description}`);
|
|
108
|
+
} else this.outputManager.emitEvent({
|
|
109
|
+
type: "skill-install-progress",
|
|
110
|
+
skill: skillName,
|
|
111
|
+
status: "downloading",
|
|
112
|
+
timestamp: new Date().toISOString()
|
|
113
|
+
});
|
|
114
|
+
this.logger.info("Downloading skill files...");
|
|
115
|
+
const files = await this.repository.downloadSkill(skillName);
|
|
116
|
+
await promises_namespaceObject.mkdir(this.getSkillsPath(), {
|
|
117
|
+
recursive: true
|
|
118
|
+
});
|
|
119
|
+
await promises_namespaceObject.mkdir(skillPath, {
|
|
120
|
+
recursive: true
|
|
121
|
+
});
|
|
122
|
+
this.logger.info(`Writing ${files.size} files...`);
|
|
123
|
+
for (const [relativePath, content] of files){
|
|
124
|
+
const filePath = external_node_path_namespaceObject.join(skillPath, relativePath);
|
|
125
|
+
const fileDir = external_node_path_namespaceObject.dirname(filePath);
|
|
126
|
+
await promises_namespaceObject.mkdir(fileDir, {
|
|
127
|
+
recursive: true
|
|
128
|
+
});
|
|
129
|
+
await promises_namespaceObject.writeFile(filePath, content);
|
|
130
|
+
}
|
|
131
|
+
await this.validateSkillMd(skillPath);
|
|
132
|
+
if ("interactive" === this.outputManager.getMode()) console.log(`\n✓ Successfully installed skill ${skillName} to ${skillPath}`);
|
|
133
|
+
else this.outputManager.emitEvent({
|
|
134
|
+
type: "skill-install-complete",
|
|
135
|
+
skill: skillName,
|
|
136
|
+
path: skillPath,
|
|
137
|
+
timestamp: new Date().toISOString()
|
|
138
|
+
});
|
|
139
|
+
} catch (error) {
|
|
140
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
141
|
+
const logFile = (0, external_logger_cjs_namespaceObject.getLogFilePath)();
|
|
142
|
+
this.logger.error(`Failed to install skill: ${errorMsg}`);
|
|
143
|
+
if ("interactive" === this.outputManager.getMode()) {
|
|
144
|
+
console.error(`\nError: ${errorMsg}`);
|
|
145
|
+
console.error(`Logs: ${logFile}`);
|
|
146
|
+
} else this.outputManager.emitEvent({
|
|
147
|
+
type: "agent-error",
|
|
148
|
+
error: errorMsg,
|
|
149
|
+
logFile,
|
|
150
|
+
timestamp: new Date().toISOString()
|
|
151
|
+
});
|
|
152
|
+
throw error;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
async listInstalledSkills() {
|
|
156
|
+
try {
|
|
157
|
+
const skillsPath = this.getSkillsPath();
|
|
158
|
+
try {
|
|
159
|
+
await promises_namespaceObject.access(skillsPath);
|
|
160
|
+
} catch {
|
|
161
|
+
if ("interactive" === this.outputManager.getMode()) console.log("\nNo skills installed.");
|
|
162
|
+
else this.outputManager.emitEvent({
|
|
163
|
+
type: "skill-list",
|
|
164
|
+
skills: [],
|
|
165
|
+
timestamp: new Date().toISOString()
|
|
166
|
+
});
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
const entries = await promises_namespaceObject.readdir(skillsPath, {
|
|
170
|
+
withFileTypes: true
|
|
171
|
+
});
|
|
172
|
+
const skillDirs = entries.filter((entry)=>entry.isDirectory());
|
|
173
|
+
if (0 === skillDirs.length) {
|
|
174
|
+
if ("interactive" === this.outputManager.getMode()) console.log("\nNo skills installed.");
|
|
175
|
+
else this.outputManager.emitEvent({
|
|
176
|
+
type: "skill-list",
|
|
177
|
+
skills: [],
|
|
178
|
+
timestamp: new Date().toISOString()
|
|
179
|
+
});
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
const skills = [];
|
|
183
|
+
for (const dir of skillDirs){
|
|
184
|
+
const skillPath = external_node_path_namespaceObject.join(skillsPath, dir.name);
|
|
185
|
+
const skillMdPath = external_node_path_namespaceObject.join(skillPath, "SKILL.md");
|
|
186
|
+
try {
|
|
187
|
+
const content = await promises_namespaceObject.readFile(skillMdPath, "utf-8");
|
|
188
|
+
const metadata = this.parseSkillMetadata(content);
|
|
189
|
+
skills.push({
|
|
190
|
+
name: metadata.name,
|
|
191
|
+
description: metadata.description,
|
|
192
|
+
path: skillPath
|
|
193
|
+
});
|
|
194
|
+
} catch {
|
|
195
|
+
this.logger.warn(`Skipping invalid skill directory: ${dir.name}`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if ("interactive" === this.outputManager.getMode()) {
|
|
199
|
+
console.log("\nInstalled Skills:");
|
|
200
|
+
console.log("=================\n");
|
|
201
|
+
for (const skill of skills){
|
|
202
|
+
console.log(` ${skill.name}`);
|
|
203
|
+
console.log(` ${skill.description}`);
|
|
204
|
+
console.log(` Location: ${skill.path}`);
|
|
205
|
+
console.log();
|
|
206
|
+
}
|
|
207
|
+
} else this.outputManager.emitEvent({
|
|
208
|
+
type: "skill-list",
|
|
209
|
+
skills: skills.map((s)=>({
|
|
210
|
+
name: s.name,
|
|
211
|
+
description: s.description,
|
|
212
|
+
path: s.path
|
|
213
|
+
})),
|
|
214
|
+
timestamp: new Date().toISOString()
|
|
215
|
+
});
|
|
216
|
+
} catch (error) {
|
|
217
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
218
|
+
const logFile = (0, external_logger_cjs_namespaceObject.getLogFilePath)();
|
|
219
|
+
this.logger.error(`Failed to list skills: ${errorMsg}`);
|
|
220
|
+
if ("interactive" === this.outputManager.getMode()) {
|
|
221
|
+
console.error(`\nError: ${errorMsg}`);
|
|
222
|
+
console.error(`Logs: ${logFile}`);
|
|
223
|
+
} else this.outputManager.emitEvent({
|
|
224
|
+
type: "agent-error",
|
|
225
|
+
error: errorMsg,
|
|
226
|
+
logFile,
|
|
227
|
+
timestamp: new Date().toISOString()
|
|
228
|
+
});
|
|
229
|
+
throw error;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
async removeSkill(skillName) {
|
|
233
|
+
try {
|
|
234
|
+
const skillPath = external_node_path_namespaceObject.join(this.getSkillsPath(), skillName);
|
|
235
|
+
const exists = await this.skillExists(skillName);
|
|
236
|
+
if (!exists) throw new Error(`Skill '${skillName}' is not installed.`);
|
|
237
|
+
this.logger.info(`Removing skill: ${skillName}`);
|
|
238
|
+
await promises_namespaceObject.rm(skillPath, {
|
|
239
|
+
recursive: true,
|
|
240
|
+
force: true
|
|
241
|
+
});
|
|
242
|
+
if ("interactive" === this.outputManager.getMode()) console.log(`\n✓ Successfully removed skill ${skillName}`);
|
|
243
|
+
else this.outputManager.emitEvent({
|
|
244
|
+
type: "skill-remove",
|
|
245
|
+
skill: skillName,
|
|
246
|
+
timestamp: new Date().toISOString()
|
|
247
|
+
});
|
|
248
|
+
} catch (error) {
|
|
249
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
250
|
+
const logFile = (0, external_logger_cjs_namespaceObject.getLogFilePath)();
|
|
251
|
+
this.logger.error(`Failed to remove skill: ${errorMsg}`);
|
|
252
|
+
if ("interactive" === this.outputManager.getMode()) {
|
|
253
|
+
console.error(`\nError: ${errorMsg}`);
|
|
254
|
+
console.error(`Logs: ${logFile}`);
|
|
255
|
+
} else this.outputManager.emitEvent({
|
|
256
|
+
type: "agent-error",
|
|
257
|
+
error: errorMsg,
|
|
258
|
+
logFile,
|
|
259
|
+
timestamp: new Date().toISOString()
|
|
260
|
+
});
|
|
261
|
+
throw error;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
async skillExists(skillName) {
|
|
265
|
+
const skillPath = external_node_path_namespaceObject.join(this.getSkillsPath(), skillName);
|
|
266
|
+
try {
|
|
267
|
+
await promises_namespaceObject.access(skillPath);
|
|
268
|
+
return true;
|
|
269
|
+
} catch {
|
|
270
|
+
return false;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
async promptForOverwrite(skillName) {
|
|
274
|
+
const rl = external_node_readline_promises_namespaceObject.createInterface({
|
|
275
|
+
input: process.stdin,
|
|
276
|
+
output: process.stdout
|
|
277
|
+
});
|
|
278
|
+
try {
|
|
279
|
+
const answer = await rl.question(`\nSkill ${skillName} is already installed. Overwrite? (y/N): `);
|
|
280
|
+
return "y" === answer.toLowerCase() || "yes" === answer.toLowerCase();
|
|
281
|
+
} finally{
|
|
282
|
+
rl.close();
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
async validateSkillMd(skillPath) {
|
|
286
|
+
const skillMdPath = external_node_path_namespaceObject.join(skillPath, "SKILL.md");
|
|
287
|
+
try {
|
|
288
|
+
const content = await promises_namespaceObject.readFile(skillMdPath, "utf-8");
|
|
289
|
+
this.parseSkillMetadata(content);
|
|
290
|
+
} catch (error) {
|
|
291
|
+
throw new Error(`Invalid SKILL.md: ${error instanceof Error ? error.message : String(error)}`);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
parseSkillMetadata(content) {
|
|
295
|
+
const frontmatterRegex = /^---\s*\n([\s\S]*?)\n---/;
|
|
296
|
+
const match = content.match(frontmatterRegex);
|
|
297
|
+
if (!match) throw new Error("Invalid SKILL.md format: missing YAML frontmatter");
|
|
298
|
+
const frontmatter = match[1];
|
|
299
|
+
let name = "";
|
|
300
|
+
let description = "";
|
|
301
|
+
const lines = frontmatter.split("\n");
|
|
302
|
+
for (const line of lines){
|
|
303
|
+
const colonIndex = line.indexOf(":");
|
|
304
|
+
if (-1 === colonIndex) continue;
|
|
305
|
+
const key = line.substring(0, colonIndex).trim();
|
|
306
|
+
const value = line.substring(colonIndex + 1).trim();
|
|
307
|
+
if ("name" === key) name = value;
|
|
308
|
+
else if ("description" === key) description = value;
|
|
309
|
+
}
|
|
310
|
+
if (!name) throw new Error("missing required field 'name'");
|
|
311
|
+
if (!description) throw new Error("missing required field 'description'");
|
|
312
|
+
return {
|
|
313
|
+
name,
|
|
314
|
+
description
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
constructor(repository, outputManager, logger, options){
|
|
318
|
+
_define_property(this, "workspace", void 0);
|
|
319
|
+
_define_property(this, "skillsDirectory", void 0);
|
|
320
|
+
_define_property(this, "repository", void 0);
|
|
321
|
+
_define_property(this, "outputManager", void 0);
|
|
322
|
+
_define_property(this, "logger", void 0);
|
|
323
|
+
this.repository = repository;
|
|
324
|
+
this.outputManager = outputManager;
|
|
325
|
+
this.logger = logger;
|
|
326
|
+
this.workspace = options.workspace;
|
|
327
|
+
this.skillsDirectory = options.skillsDirectory || "skills";
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
exports.SkillService = __webpack_exports__.SkillService;
|
|
331
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
332
|
+
"SkillService"
|
|
333
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
334
|
+
Object.defineProperty(exports, '__esModule', {
|
|
335
|
+
value: true
|
|
336
|
+
});
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { SkillServiceOptions } from "../types/skill.js";
|
|
2
|
+
import type { SkillRepository } from "./skillRepository.js";
|
|
3
|
+
import type { OutputManager } from "../core/outputManager.js";
|
|
4
|
+
import { type Logger } from "../../logger.js";
|
|
5
|
+
export declare class SkillService {
|
|
6
|
+
private readonly workspace;
|
|
7
|
+
private readonly skillsDirectory;
|
|
8
|
+
private readonly repository;
|
|
9
|
+
private readonly outputManager;
|
|
10
|
+
private readonly logger;
|
|
11
|
+
constructor(repository: SkillRepository, outputManager: OutputManager, logger: Logger, options: SkillServiceOptions);
|
|
12
|
+
/**
|
|
13
|
+
* Get the absolute path to the skills directory
|
|
14
|
+
*/
|
|
15
|
+
private getSkillsPath;
|
|
16
|
+
/**
|
|
17
|
+
* Browse available skills from the repository
|
|
18
|
+
*/
|
|
19
|
+
browseSkills(): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Install a skill from the repository
|
|
22
|
+
*/
|
|
23
|
+
installSkill(skillName: string): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* List installed skills
|
|
26
|
+
*/
|
|
27
|
+
listInstalledSkills(): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Remove an installed skill
|
|
30
|
+
*/
|
|
31
|
+
removeSkill(skillName: string): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Check if a skill exists locally
|
|
34
|
+
*/
|
|
35
|
+
private skillExists;
|
|
36
|
+
/**
|
|
37
|
+
* Prompt user for overwrite confirmation
|
|
38
|
+
*/
|
|
39
|
+
private promptForOverwrite;
|
|
40
|
+
/**
|
|
41
|
+
* Validate SKILL.md file
|
|
42
|
+
*/
|
|
43
|
+
private validateSkillMd;
|
|
44
|
+
/**
|
|
45
|
+
* Parse SKILL.md metadata (same logic as repository)
|
|
46
|
+
*/
|
|
47
|
+
private parseSkillMetadata;
|
|
48
|
+
}
|