@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,347 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { EventLogger, SilentLogger, WingmanLogger, createEventLogger, createLogger, createLoggerFromConfig } from "../logger.js";
|
|
3
|
+
function _define_property(obj, key, value) {
|
|
4
|
+
if (key in obj) Object.defineProperty(obj, key, {
|
|
5
|
+
value: value,
|
|
6
|
+
enumerable: true,
|
|
7
|
+
configurable: true,
|
|
8
|
+
writable: true
|
|
9
|
+
});
|
|
10
|
+
else obj[key] = value;
|
|
11
|
+
return obj;
|
|
12
|
+
}
|
|
13
|
+
class MockWriteStream {
|
|
14
|
+
write(chunk) {
|
|
15
|
+
this.data += chunk;
|
|
16
|
+
}
|
|
17
|
+
constructor(){
|
|
18
|
+
_define_property(this, "data", "");
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
describe("Logger System", ()=>{
|
|
22
|
+
describe("WingmanLogger", ()=>{
|
|
23
|
+
let mockStream;
|
|
24
|
+
beforeEach(()=>{
|
|
25
|
+
mockStream = new MockWriteStream();
|
|
26
|
+
});
|
|
27
|
+
describe("Log level filtering", ()=>{
|
|
28
|
+
it("should only log messages at or above configured level", ()=>{
|
|
29
|
+
const logger = new WingmanLogger("warn", mockStream);
|
|
30
|
+
logger.debug("debug message");
|
|
31
|
+
logger.info("info message");
|
|
32
|
+
logger.warn("warn message");
|
|
33
|
+
logger.error("error message");
|
|
34
|
+
expect(mockStream.data).not.toContain("debug message");
|
|
35
|
+
expect(mockStream.data).not.toContain("info message");
|
|
36
|
+
expect(mockStream.data).toContain("warn message");
|
|
37
|
+
expect(mockStream.data).toContain("error message");
|
|
38
|
+
});
|
|
39
|
+
it("should log all messages when level is debug", ()=>{
|
|
40
|
+
const logger = new WingmanLogger("debug", mockStream);
|
|
41
|
+
logger.debug("debug message");
|
|
42
|
+
logger.info("info message");
|
|
43
|
+
logger.warn("warn message");
|
|
44
|
+
logger.error("error message");
|
|
45
|
+
expect(mockStream.data).toContain("debug message");
|
|
46
|
+
expect(mockStream.data).toContain("info message");
|
|
47
|
+
expect(mockStream.data).toContain("warn message");
|
|
48
|
+
expect(mockStream.data).toContain("error message");
|
|
49
|
+
});
|
|
50
|
+
it("should not log any messages when level is silent", ()=>{
|
|
51
|
+
const logger = new WingmanLogger("silent", mockStream);
|
|
52
|
+
logger.debug("debug message");
|
|
53
|
+
logger.info("info message");
|
|
54
|
+
logger.warn("warn message");
|
|
55
|
+
logger.error("error message");
|
|
56
|
+
expect(mockStream.data).toBe("");
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
describe("Log formatting", ()=>{
|
|
60
|
+
it("should include timestamp and level in log output", ()=>{
|
|
61
|
+
const logger = new WingmanLogger("info", mockStream);
|
|
62
|
+
logger.info("test message");
|
|
63
|
+
expect(mockStream.data).toMatch(/\[\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/);
|
|
64
|
+
expect(mockStream.data).toContain("[INFO]");
|
|
65
|
+
expect(mockStream.data).toContain("test message");
|
|
66
|
+
});
|
|
67
|
+
it("should serialize additional arguments as JSON", ()=>{
|
|
68
|
+
const logger = new WingmanLogger("info", mockStream);
|
|
69
|
+
logger.info("test message", {
|
|
70
|
+
key: "value"
|
|
71
|
+
}, [
|
|
72
|
+
1,
|
|
73
|
+
2,
|
|
74
|
+
3
|
|
75
|
+
]);
|
|
76
|
+
expect(mockStream.data).toContain("test message");
|
|
77
|
+
expect(mockStream.data).toContain('"key"');
|
|
78
|
+
expect(mockStream.data).toContain('"value"');
|
|
79
|
+
});
|
|
80
|
+
it("should serialize error arguments with message and stack", ()=>{
|
|
81
|
+
const logger = new WingmanLogger("info", mockStream);
|
|
82
|
+
const err = new Error("boom");
|
|
83
|
+
logger.error("test error", err);
|
|
84
|
+
expect(mockStream.data).toContain("test error");
|
|
85
|
+
expect(mockStream.data).toContain('"message"');
|
|
86
|
+
expect(mockStream.data).toContain("boom");
|
|
87
|
+
});
|
|
88
|
+
it("should not include args when none provided", ()=>{
|
|
89
|
+
const logger = new WingmanLogger("info", mockStream);
|
|
90
|
+
logger.info("test message");
|
|
91
|
+
const lines = mockStream.data.split("\n");
|
|
92
|
+
expect(lines.filter((l)=>l.trim()).length).toBe(1);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
describe("Log levels", ()=>{
|
|
96
|
+
it("should have debug method", ()=>{
|
|
97
|
+
const logger = new WingmanLogger("debug", mockStream);
|
|
98
|
+
expect(logger.debug).toBeDefined();
|
|
99
|
+
expect(typeof logger.debug).toBe("function");
|
|
100
|
+
});
|
|
101
|
+
it("should have info method", ()=>{
|
|
102
|
+
const logger = new WingmanLogger("info", mockStream);
|
|
103
|
+
expect(logger.info).toBeDefined();
|
|
104
|
+
expect(typeof logger.info).toBe("function");
|
|
105
|
+
});
|
|
106
|
+
it("should have warn method", ()=>{
|
|
107
|
+
const logger = new WingmanLogger("warn", mockStream);
|
|
108
|
+
expect(logger.warn).toBeDefined();
|
|
109
|
+
expect(typeof logger.warn).toBe("function");
|
|
110
|
+
});
|
|
111
|
+
it("should have error method", ()=>{
|
|
112
|
+
const logger = new WingmanLogger("error", mockStream);
|
|
113
|
+
expect(logger.error).toBeDefined();
|
|
114
|
+
expect(typeof logger.error).toBe("function");
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
describe("SilentLogger", ()=>{
|
|
119
|
+
it("should not log any messages", ()=>{
|
|
120
|
+
const logger = new SilentLogger();
|
|
121
|
+
const consoleSpy = vi.spyOn(console, "log");
|
|
122
|
+
logger.debug();
|
|
123
|
+
logger.info();
|
|
124
|
+
logger.warn();
|
|
125
|
+
logger.error();
|
|
126
|
+
expect(consoleSpy).not.toHaveBeenCalled();
|
|
127
|
+
consoleSpy.mockRestore();
|
|
128
|
+
});
|
|
129
|
+
it("should have all required logger methods", ()=>{
|
|
130
|
+
const logger = new SilentLogger();
|
|
131
|
+
expect(logger.debug).toBeDefined();
|
|
132
|
+
expect(logger.info).toBeDefined();
|
|
133
|
+
expect(logger.warn).toBeDefined();
|
|
134
|
+
expect(logger.error).toBeDefined();
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
describe("EventLogger", ()=>{
|
|
138
|
+
let mockCallback;
|
|
139
|
+
beforeEach(()=>{
|
|
140
|
+
mockCallback = vi.fn();
|
|
141
|
+
});
|
|
142
|
+
describe("Event emission", ()=>{
|
|
143
|
+
it("should emit log events with correct structure", ()=>{
|
|
144
|
+
const logger = new EventLogger(mockCallback, "info");
|
|
145
|
+
logger.info("test message");
|
|
146
|
+
expect(mockCallback).toHaveBeenCalledTimes(1);
|
|
147
|
+
expect(mockCallback).toHaveBeenCalledWith({
|
|
148
|
+
level: "info",
|
|
149
|
+
message: "test message",
|
|
150
|
+
timestamp: expect.stringMatching(/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/),
|
|
151
|
+
args: void 0
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
it("should include args in events when provided", ()=>{
|
|
155
|
+
const logger = new EventLogger(mockCallback, "info");
|
|
156
|
+
const testArgs = [
|
|
157
|
+
{
|
|
158
|
+
key: "value"
|
|
159
|
+
},
|
|
160
|
+
[
|
|
161
|
+
1,
|
|
162
|
+
2,
|
|
163
|
+
3
|
|
164
|
+
]
|
|
165
|
+
];
|
|
166
|
+
logger.info("test message", ...testArgs);
|
|
167
|
+
expect(mockCallback).toHaveBeenCalledWith({
|
|
168
|
+
level: "info",
|
|
169
|
+
message: "test message",
|
|
170
|
+
timestamp: expect.any(String),
|
|
171
|
+
args: testArgs
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
describe("Level filtering", ()=>{
|
|
176
|
+
it("should respect log level filtering", ()=>{
|
|
177
|
+
const logger = new EventLogger(mockCallback, "warn");
|
|
178
|
+
logger.debug("debug");
|
|
179
|
+
logger.info("info");
|
|
180
|
+
logger.warn("warn");
|
|
181
|
+
logger.error("error");
|
|
182
|
+
expect(mockCallback).toHaveBeenCalledTimes(2);
|
|
183
|
+
expect(mockCallback).toHaveBeenCalledWith(expect.objectContaining({
|
|
184
|
+
level: "warn"
|
|
185
|
+
}));
|
|
186
|
+
expect(mockCallback).toHaveBeenCalledWith(expect.objectContaining({
|
|
187
|
+
level: "error"
|
|
188
|
+
}));
|
|
189
|
+
});
|
|
190
|
+
it("should not emit events when level is silent", ()=>{
|
|
191
|
+
const logger = new EventLogger(mockCallback, "silent");
|
|
192
|
+
logger.debug("debug");
|
|
193
|
+
logger.info("info");
|
|
194
|
+
logger.warn("warn");
|
|
195
|
+
logger.error("error");
|
|
196
|
+
expect(mockCallback).not.toHaveBeenCalled();
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
describe("All log levels", ()=>{
|
|
200
|
+
it("should handle debug level", ()=>{
|
|
201
|
+
const logger = new EventLogger(mockCallback, "debug");
|
|
202
|
+
logger.debug("debug message");
|
|
203
|
+
expect(mockCallback).toHaveBeenCalledWith(expect.objectContaining({
|
|
204
|
+
level: "debug",
|
|
205
|
+
message: "debug message"
|
|
206
|
+
}));
|
|
207
|
+
});
|
|
208
|
+
it("should handle info level", ()=>{
|
|
209
|
+
const logger = new EventLogger(mockCallback, "info");
|
|
210
|
+
logger.info("info message");
|
|
211
|
+
expect(mockCallback).toHaveBeenCalledWith(expect.objectContaining({
|
|
212
|
+
level: "info",
|
|
213
|
+
message: "info message"
|
|
214
|
+
}));
|
|
215
|
+
});
|
|
216
|
+
it("should handle warn level", ()=>{
|
|
217
|
+
const logger = new EventLogger(mockCallback, "info");
|
|
218
|
+
logger.warn("warn message");
|
|
219
|
+
expect(mockCallback).toHaveBeenCalledWith(expect.objectContaining({
|
|
220
|
+
level: "warn",
|
|
221
|
+
message: "warn message"
|
|
222
|
+
}));
|
|
223
|
+
});
|
|
224
|
+
it("should handle error level", ()=>{
|
|
225
|
+
const logger = new EventLogger(mockCallback, "info");
|
|
226
|
+
logger.error("error message");
|
|
227
|
+
expect(mockCallback).toHaveBeenCalledWith(expect.objectContaining({
|
|
228
|
+
level: "error",
|
|
229
|
+
message: "error message"
|
|
230
|
+
}));
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
describe("Factory functions", ()=>{
|
|
235
|
+
describe("createLogger", ()=>{
|
|
236
|
+
const originalEnv = process.env.WINGMAN_LOG_LEVEL;
|
|
237
|
+
afterEach(()=>{
|
|
238
|
+
process.env.WINGMAN_LOG_LEVEL = originalEnv;
|
|
239
|
+
});
|
|
240
|
+
it("should create WingmanLogger by default", ()=>{
|
|
241
|
+
const logger = createLogger("info");
|
|
242
|
+
expect(logger).toBeInstanceOf(WingmanLogger);
|
|
243
|
+
});
|
|
244
|
+
it("should create SilentLogger when level is silent", ()=>{
|
|
245
|
+
const logger = createLogger("silent");
|
|
246
|
+
expect(logger).toBeInstanceOf(SilentLogger);
|
|
247
|
+
});
|
|
248
|
+
it("should use WINGMAN_LOG_LEVEL env var when no level provided", ()=>{
|
|
249
|
+
process.env.WINGMAN_LOG_LEVEL = "debug";
|
|
250
|
+
const logger = createLogger();
|
|
251
|
+
expect(logger).toBeInstanceOf(WingmanLogger);
|
|
252
|
+
});
|
|
253
|
+
it("should default to info level when env var not set", ()=>{
|
|
254
|
+
delete process.env.WINGMAN_LOG_LEVEL;
|
|
255
|
+
const logger = createLogger();
|
|
256
|
+
expect(logger).toBeInstanceOf(WingmanLogger);
|
|
257
|
+
});
|
|
258
|
+
});
|
|
259
|
+
describe("createEventLogger", ()=>{
|
|
260
|
+
it("should create EventLogger with callback", ()=>{
|
|
261
|
+
const callback = vi.fn();
|
|
262
|
+
const logger = createEventLogger(callback, "info");
|
|
263
|
+
expect(logger).toBeInstanceOf(EventLogger);
|
|
264
|
+
});
|
|
265
|
+
it("should create EventLogger with default info level", ()=>{
|
|
266
|
+
const callback = vi.fn();
|
|
267
|
+
const logger = createEventLogger(callback);
|
|
268
|
+
logger.info("test");
|
|
269
|
+
expect(callback).toHaveBeenCalledWith(expect.objectContaining({
|
|
270
|
+
level: "info"
|
|
271
|
+
}));
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
describe("createLoggerFromConfig", ()=>{
|
|
275
|
+
it("should create logger from serializable config", ()=>{
|
|
276
|
+
const logger = createLoggerFromConfig({
|
|
277
|
+
level: "debug"
|
|
278
|
+
});
|
|
279
|
+
expect(logger).toBeInstanceOf(WingmanLogger);
|
|
280
|
+
});
|
|
281
|
+
it("should create silent logger from silent config", ()=>{
|
|
282
|
+
const logger = createLoggerFromConfig({
|
|
283
|
+
level: "silent"
|
|
284
|
+
});
|
|
285
|
+
expect(logger).toBeInstanceOf(SilentLogger);
|
|
286
|
+
});
|
|
287
|
+
});
|
|
288
|
+
});
|
|
289
|
+
describe("Log level hierarchy", ()=>{
|
|
290
|
+
it("should respect level hierarchy: debug < info < warn < error", ()=>{
|
|
291
|
+
const testCases = [
|
|
292
|
+
{
|
|
293
|
+
level: "debug",
|
|
294
|
+
shouldLog: {
|
|
295
|
+
debug: true,
|
|
296
|
+
info: true,
|
|
297
|
+
warn: true,
|
|
298
|
+
error: true
|
|
299
|
+
}
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
level: "info",
|
|
303
|
+
shouldLog: {
|
|
304
|
+
debug: false,
|
|
305
|
+
info: true,
|
|
306
|
+
warn: true,
|
|
307
|
+
error: true
|
|
308
|
+
}
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
level: "warn",
|
|
312
|
+
shouldLog: {
|
|
313
|
+
debug: false,
|
|
314
|
+
info: false,
|
|
315
|
+
warn: true,
|
|
316
|
+
error: true
|
|
317
|
+
}
|
|
318
|
+
},
|
|
319
|
+
{
|
|
320
|
+
level: "error",
|
|
321
|
+
shouldLog: {
|
|
322
|
+
debug: false,
|
|
323
|
+
info: false,
|
|
324
|
+
warn: false,
|
|
325
|
+
error: true
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
];
|
|
329
|
+
for (const testCase of testCases){
|
|
330
|
+
const callback = vi.fn();
|
|
331
|
+
const logger = new EventLogger(callback, testCase.level);
|
|
332
|
+
logger.debug("debug");
|
|
333
|
+
logger.info("info");
|
|
334
|
+
logger.warn("warn");
|
|
335
|
+
logger.error("error");
|
|
336
|
+
const debugCalls = callback.mock.calls.filter(([event])=>"debug" === event.level).length;
|
|
337
|
+
const infoCalls = callback.mock.calls.filter(([event])=>"info" === event.level).length;
|
|
338
|
+
const warnCalls = callback.mock.calls.filter(([event])=>"warn" === event.level).length;
|
|
339
|
+
const errorCalls = callback.mock.calls.filter(([event])=>"error" === event.level).length;
|
|
340
|
+
expect(debugCalls).toBe(testCase.shouldLog.debug ? 1 : 0);
|
|
341
|
+
expect(infoCalls).toBe(testCase.shouldLog.info ? 1 : 0);
|
|
342
|
+
expect(warnCalls).toBe(testCase.shouldLog.warn ? 1 : 0);
|
|
343
|
+
expect(errorCalls).toBe(testCase.shouldLog.error ? 1 : 0);
|
|
344
|
+
}
|
|
345
|
+
});
|
|
346
|
+
});
|
|
347
|
+
});
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_exports__ = {};
|
|
3
|
+
const external_vitest_namespaceObject = require("vitest");
|
|
4
|
+
const media_compat_cjs_namespaceObject = require("../agent/middleware/media-compat.cjs");
|
|
5
|
+
async function runBeforeAgent(middleware, input) {
|
|
6
|
+
const beforeAgent = "function" == typeof middleware.beforeAgent ? middleware.beforeAgent : middleware.beforeAgent?.hook;
|
|
7
|
+
if (!beforeAgent) throw new Error("beforeAgent hook not configured");
|
|
8
|
+
return await beforeAgent(input, {});
|
|
9
|
+
}
|
|
10
|
+
(0, external_vitest_namespaceObject.describe)("mediaCompatibilityMiddleware", ()=>{
|
|
11
|
+
(0, external_vitest_namespaceObject.it)("strips audio blocks for Anthropic models and preserves other blocks", async ()=>{
|
|
12
|
+
const middleware = (0, media_compat_cjs_namespaceObject.mediaCompatibilityMiddleware)({
|
|
13
|
+
model: {
|
|
14
|
+
constructor: {
|
|
15
|
+
name: "ChatAnthropic"
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
const input = {
|
|
20
|
+
messages: [
|
|
21
|
+
{
|
|
22
|
+
content: [
|
|
23
|
+
{
|
|
24
|
+
type: "text",
|
|
25
|
+
text: "Hello"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
type: "audio",
|
|
29
|
+
source_type: "base64",
|
|
30
|
+
data: "abc"
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
}
|
|
34
|
+
]
|
|
35
|
+
};
|
|
36
|
+
const result = await runBeforeAgent(middleware, input);
|
|
37
|
+
const content = result.messages[0]?.content;
|
|
38
|
+
(0, external_vitest_namespaceObject.expect)(Array.isArray(content)).toBe(true);
|
|
39
|
+
(0, external_vitest_namespaceObject.expect)(content).toHaveLength(1);
|
|
40
|
+
(0, external_vitest_namespaceObject.expect)(content[0]?.type).toBe("text");
|
|
41
|
+
});
|
|
42
|
+
(0, external_vitest_namespaceObject.it)("replaces content with a placeholder when only audio blocks remain", async ()=>{
|
|
43
|
+
const middleware = (0, media_compat_cjs_namespaceObject.mediaCompatibilityMiddleware)({
|
|
44
|
+
model: {
|
|
45
|
+
constructor: {
|
|
46
|
+
name: "ChatAnthropic"
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
const input = {
|
|
51
|
+
messages: [
|
|
52
|
+
{
|
|
53
|
+
content: [
|
|
54
|
+
{
|
|
55
|
+
type: "audio_url",
|
|
56
|
+
audio_url: {
|
|
57
|
+
url: "https://x/y"
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
]
|
|
63
|
+
};
|
|
64
|
+
const result = await runBeforeAgent(middleware, input);
|
|
65
|
+
const content = result.messages[0]?.content;
|
|
66
|
+
(0, external_vitest_namespaceObject.expect)(typeof content).toBe("string");
|
|
67
|
+
(0, external_vitest_namespaceObject.expect)(content).toContain("Audio omitted");
|
|
68
|
+
});
|
|
69
|
+
(0, external_vitest_namespaceObject.it)("leaves audio blocks untouched for non-Anthropic models", async ()=>{
|
|
70
|
+
const middleware = (0, media_compat_cjs_namespaceObject.mediaCompatibilityMiddleware)({
|
|
71
|
+
model: {
|
|
72
|
+
constructor: {
|
|
73
|
+
name: "ChatOpenAI"
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
const input = {
|
|
78
|
+
messages: [
|
|
79
|
+
{
|
|
80
|
+
content: [
|
|
81
|
+
{
|
|
82
|
+
type: "text",
|
|
83
|
+
text: "Hello"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
type: "input_audio",
|
|
87
|
+
input_audio: {
|
|
88
|
+
data: "abc",
|
|
89
|
+
format: "wav"
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
]
|
|
95
|
+
};
|
|
96
|
+
const result = await runBeforeAgent(middleware, input);
|
|
97
|
+
const content = result.messages[0]?.content;
|
|
98
|
+
(0, external_vitest_namespaceObject.expect)(Array.isArray(content)).toBe(true);
|
|
99
|
+
(0, external_vitest_namespaceObject.expect)(content).toHaveLength(2);
|
|
100
|
+
(0, external_vitest_namespaceObject.expect)(content[1]?.type).toBe("input_audio");
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
for(var __rspack_i in __webpack_exports__)exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
104
|
+
Object.defineProperty(exports, '__esModule', {
|
|
105
|
+
value: true
|
|
106
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { mediaCompatibilityMiddleware } from "../agent/middleware/media-compat.js";
|
|
3
|
+
async function runBeforeAgent(middleware, input) {
|
|
4
|
+
const beforeAgent = "function" == typeof middleware.beforeAgent ? middleware.beforeAgent : middleware.beforeAgent?.hook;
|
|
5
|
+
if (!beforeAgent) throw new Error("beforeAgent hook not configured");
|
|
6
|
+
return await beforeAgent(input, {});
|
|
7
|
+
}
|
|
8
|
+
describe("mediaCompatibilityMiddleware", ()=>{
|
|
9
|
+
it("strips audio blocks for Anthropic models and preserves other blocks", async ()=>{
|
|
10
|
+
const middleware = mediaCompatibilityMiddleware({
|
|
11
|
+
model: {
|
|
12
|
+
constructor: {
|
|
13
|
+
name: "ChatAnthropic"
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
const input = {
|
|
18
|
+
messages: [
|
|
19
|
+
{
|
|
20
|
+
content: [
|
|
21
|
+
{
|
|
22
|
+
type: "text",
|
|
23
|
+
text: "Hello"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
type: "audio",
|
|
27
|
+
source_type: "base64",
|
|
28
|
+
data: "abc"
|
|
29
|
+
}
|
|
30
|
+
]
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
};
|
|
34
|
+
const result = await runBeforeAgent(middleware, input);
|
|
35
|
+
const content = result.messages[0]?.content;
|
|
36
|
+
expect(Array.isArray(content)).toBe(true);
|
|
37
|
+
expect(content).toHaveLength(1);
|
|
38
|
+
expect(content[0]?.type).toBe("text");
|
|
39
|
+
});
|
|
40
|
+
it("replaces content with a placeholder when only audio blocks remain", async ()=>{
|
|
41
|
+
const middleware = mediaCompatibilityMiddleware({
|
|
42
|
+
model: {
|
|
43
|
+
constructor: {
|
|
44
|
+
name: "ChatAnthropic"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
const input = {
|
|
49
|
+
messages: [
|
|
50
|
+
{
|
|
51
|
+
content: [
|
|
52
|
+
{
|
|
53
|
+
type: "audio_url",
|
|
54
|
+
audio_url: {
|
|
55
|
+
url: "https://x/y"
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
]
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
};
|
|
62
|
+
const result = await runBeforeAgent(middleware, input);
|
|
63
|
+
const content = result.messages[0]?.content;
|
|
64
|
+
expect(typeof content).toBe("string");
|
|
65
|
+
expect(content).toContain("Audio omitted");
|
|
66
|
+
});
|
|
67
|
+
it("leaves audio blocks untouched for non-Anthropic models", async ()=>{
|
|
68
|
+
const middleware = mediaCompatibilityMiddleware({
|
|
69
|
+
model: {
|
|
70
|
+
constructor: {
|
|
71
|
+
name: "ChatOpenAI"
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
const input = {
|
|
76
|
+
messages: [
|
|
77
|
+
{
|
|
78
|
+
content: [
|
|
79
|
+
{
|
|
80
|
+
type: "text",
|
|
81
|
+
text: "Hello"
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
type: "input_audio",
|
|
85
|
+
input_audio: {
|
|
86
|
+
data: "abc",
|
|
87
|
+
format: "wav"
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
]
|
|
91
|
+
}
|
|
92
|
+
]
|
|
93
|
+
};
|
|
94
|
+
const result = await runBeforeAgent(middleware, input);
|
|
95
|
+
const content = result.messages[0]?.content;
|
|
96
|
+
expect(Array.isArray(content)).toBe(true);
|
|
97
|
+
expect(content).toHaveLength(2);
|
|
98
|
+
expect(content[1]?.type).toBe("input_audio");
|
|
99
|
+
});
|
|
100
|
+
});
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_exports__ = {};
|
|
3
|
+
const external_vitest_namespaceObject = require("vitest");
|
|
4
|
+
const routines_cjs_namespaceObject = require("../gateway/http/routines.cjs");
|
|
5
|
+
const external_node_fs_namespaceObject = require("node:fs");
|
|
6
|
+
const external_node_os_namespaceObject = require("node:os");
|
|
7
|
+
const external_node_path_namespaceObject = require("node:path");
|
|
8
|
+
const isBunRuntime = void 0 !== globalThis.Bun;
|
|
9
|
+
const describeIfBun = isBunRuntime ? external_vitest_namespaceObject.describe : external_vitest_namespaceObject.describe.skip;
|
|
10
|
+
describeIfBun("routines API", ()=>{
|
|
11
|
+
let tempDir;
|
|
12
|
+
(0, external_vitest_namespaceObject.beforeEach)(()=>{
|
|
13
|
+
tempDir = (0, external_node_fs_namespaceObject.mkdtempSync)((0, external_node_path_namespaceObject.join)((0, external_node_os_namespaceObject.tmpdir)(), "wingman-routines-"));
|
|
14
|
+
const agentDir = (0, external_node_path_namespaceObject.join)(tempDir, "agents", "main");
|
|
15
|
+
(0, external_node_fs_namespaceObject.mkdirSync)(agentDir, {
|
|
16
|
+
recursive: true
|
|
17
|
+
});
|
|
18
|
+
(0, external_node_fs_namespaceObject.writeFileSync)((0, external_node_path_namespaceObject.join)(agentDir, "agent.json"), JSON.stringify({
|
|
19
|
+
name: "main",
|
|
20
|
+
description: "Main agent",
|
|
21
|
+
systemPrompt: "You are the main agent"
|
|
22
|
+
}, null, 2));
|
|
23
|
+
});
|
|
24
|
+
(0, external_vitest_namespaceObject.afterEach)(()=>{
|
|
25
|
+
(0, external_node_fs_namespaceObject.rmSync)(tempDir, {
|
|
26
|
+
recursive: true,
|
|
27
|
+
force: true
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
(0, external_vitest_namespaceObject.it)("creates, lists, and deletes routines", async ()=>{
|
|
31
|
+
const ctx = {
|
|
32
|
+
configDir: tempDir,
|
|
33
|
+
workspace: tempDir,
|
|
34
|
+
getWingmanConfig: ()=>({}),
|
|
35
|
+
getSessionManager: async ()=>{
|
|
36
|
+
throw new Error("SessionManager not used in this test");
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
const store = (0, routines_cjs_namespaceObject.createRoutineStore)(()=>tempDir);
|
|
40
|
+
const createReq = new Request("http://localhost/api/routines", {
|
|
41
|
+
method: "POST",
|
|
42
|
+
headers: {
|
|
43
|
+
"Content-Type": "application/json"
|
|
44
|
+
},
|
|
45
|
+
body: JSON.stringify({
|
|
46
|
+
name: "Daily Check-in",
|
|
47
|
+
agentId: "main",
|
|
48
|
+
cron: "0 9 * * *",
|
|
49
|
+
prompt: "Summarize today's tasks.",
|
|
50
|
+
enabled: true
|
|
51
|
+
})
|
|
52
|
+
});
|
|
53
|
+
const createRes = await (0, routines_cjs_namespaceObject.handleRoutinesApi)(ctx, store, createReq, new URL(createReq.url));
|
|
54
|
+
(0, external_vitest_namespaceObject.expect)(createRes).not.toBeNull();
|
|
55
|
+
(0, external_vitest_namespaceObject.expect)(createRes?.ok).toBe(true);
|
|
56
|
+
const created = await createRes.json();
|
|
57
|
+
(0, external_vitest_namespaceObject.expect)(created.id).toMatch(/^routine-/);
|
|
58
|
+
const listReq = new Request("http://localhost/api/routines", {
|
|
59
|
+
method: "GET"
|
|
60
|
+
});
|
|
61
|
+
const listRes = await (0, routines_cjs_namespaceObject.handleRoutinesApi)(ctx, store, listReq, new URL(listReq.url));
|
|
62
|
+
(0, external_vitest_namespaceObject.expect)(listRes).not.toBeNull();
|
|
63
|
+
const list = await listRes.json();
|
|
64
|
+
(0, external_vitest_namespaceObject.expect)(list).toHaveLength(1);
|
|
65
|
+
(0, external_vitest_namespaceObject.expect)(list[0].id).toBe(created.id);
|
|
66
|
+
const deleteReq = new Request(`http://localhost/api/routines/${encodeURIComponent(created.id)}`, {
|
|
67
|
+
method: "DELETE"
|
|
68
|
+
});
|
|
69
|
+
const deleteRes = await (0, routines_cjs_namespaceObject.handleRoutinesApi)(ctx, store, deleteReq, new URL(deleteReq.url));
|
|
70
|
+
(0, external_vitest_namespaceObject.expect)(deleteRes).not.toBeNull();
|
|
71
|
+
(0, external_vitest_namespaceObject.expect)(deleteRes?.ok).toBe(true);
|
|
72
|
+
const listResAfter = await (0, routines_cjs_namespaceObject.handleRoutinesApi)(ctx, store, listReq, new URL(listReq.url));
|
|
73
|
+
const listAfter = await listResAfter.json();
|
|
74
|
+
(0, external_vitest_namespaceObject.expect)(listAfter).toHaveLength(0);
|
|
75
|
+
});
|
|
76
|
+
(0, external_vitest_namespaceObject.it)("rejects invalid cron expressions", async ()=>{
|
|
77
|
+
const ctx = {
|
|
78
|
+
configDir: tempDir,
|
|
79
|
+
workspace: tempDir,
|
|
80
|
+
getWingmanConfig: ()=>({}),
|
|
81
|
+
getSessionManager: async ()=>{
|
|
82
|
+
throw new Error("SessionManager not used in this test");
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
const store = (0, routines_cjs_namespaceObject.createRoutineStore)(()=>tempDir);
|
|
86
|
+
const createReq = new Request("http://localhost/api/routines", {
|
|
87
|
+
method: "POST",
|
|
88
|
+
headers: {
|
|
89
|
+
"Content-Type": "application/json"
|
|
90
|
+
},
|
|
91
|
+
body: JSON.stringify({
|
|
92
|
+
name: "Invalid Cron",
|
|
93
|
+
agentId: "main",
|
|
94
|
+
cron: "bad cron",
|
|
95
|
+
prompt: "Hello",
|
|
96
|
+
enabled: true
|
|
97
|
+
})
|
|
98
|
+
});
|
|
99
|
+
const createRes = await (0, routines_cjs_namespaceObject.handleRoutinesApi)(ctx, store, createReq, new URL(createReq.url));
|
|
100
|
+
(0, external_vitest_namespaceObject.expect)(createRes).not.toBeNull();
|
|
101
|
+
(0, external_vitest_namespaceObject.expect)(createRes?.status).toBe(400);
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
for(var __rspack_i in __webpack_exports__)exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
105
|
+
Object.defineProperty(exports, '__esModule', {
|
|
106
|
+
value: true
|
|
107
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|