@cyanheads/mcp-ts-core 0.1.0-beta.12
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/CLAUDE.md +583 -0
- package/LICENSE +201 -0
- package/README.md +287 -0
- package/biome.json +103 -0
- package/dist/app.d.ts +82 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +222 -0
- package/dist/app.js.map +1 -0
- package/dist/cli/init.d.ts +8 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +161 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/config/index.d.ts +349 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +464 -0
- package/dist/config/index.js.map +1 -0
- package/dist/context.d.ts +119 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +144 -0
- package/dist/context.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server/prompts/prompt-registration.d.ts +33 -0
- package/dist/mcp-server/prompts/prompt-registration.d.ts.map +1 -0
- package/dist/mcp-server/prompts/prompt-registration.js +91 -0
- package/dist/mcp-server/prompts/prompt-registration.js.map +1 -0
- package/dist/mcp-server/prompts/utils/newPromptDefinition.d.ts +49 -0
- package/dist/mcp-server/prompts/utils/newPromptDefinition.d.ts.map +1 -0
- package/dist/mcp-server/prompts/utils/newPromptDefinition.js +39 -0
- package/dist/mcp-server/prompts/utils/newPromptDefinition.js.map +1 -0
- package/dist/mcp-server/prompts/utils/promptDefinition.d.ts +37 -0
- package/dist/mcp-server/prompts/utils/promptDefinition.d.ts.map +1 -0
- package/dist/mcp-server/prompts/utils/promptDefinition.js +2 -0
- package/dist/mcp-server/prompts/utils/promptDefinition.js.map +1 -0
- package/dist/mcp-server/resources/resource-registration.d.ts +27 -0
- package/dist/mcp-server/resources/resource-registration.d.ts.map +1 -0
- package/dist/mcp-server/resources/resource-registration.js +85 -0
- package/dist/mcp-server/resources/resource-registration.js.map +1 -0
- package/dist/mcp-server/resources/utils/newResourceDefinition.d.ts +84 -0
- package/dist/mcp-server/resources/utils/newResourceDefinition.d.ts.map +1 -0
- package/dist/mcp-server/resources/utils/newResourceDefinition.js +40 -0
- package/dist/mcp-server/resources/utils/newResourceDefinition.js.map +1 -0
- package/dist/mcp-server/resources/utils/newResourceHandlerFactory.d.ts +32 -0
- package/dist/mcp-server/resources/utils/newResourceHandlerFactory.d.ts.map +1 -0
- package/dist/mcp-server/resources/utils/newResourceHandlerFactory.js +103 -0
- package/dist/mcp-server/resources/utils/newResourceHandlerFactory.js.map +1 -0
- package/dist/mcp-server/resources/utils/resourceDefinition.d.ts +94 -0
- package/dist/mcp-server/resources/utils/resourceDefinition.d.ts.map +1 -0
- package/dist/mcp-server/resources/utils/resourceDefinition.js +2 -0
- package/dist/mcp-server/resources/utils/resourceDefinition.js.map +1 -0
- package/dist/mcp-server/resources/utils/resourceHandlerFactory.d.ts +14 -0
- package/dist/mcp-server/resources/utils/resourceHandlerFactory.d.ts.map +1 -0
- package/dist/mcp-server/resources/utils/resourceHandlerFactory.js +111 -0
- package/dist/mcp-server/resources/utils/resourceHandlerFactory.js.map +1 -0
- package/dist/mcp-server/roots/roots-registration.d.ts +22 -0
- package/dist/mcp-server/roots/roots-registration.d.ts.map +1 -0
- package/dist/mcp-server/roots/roots-registration.js +25 -0
- package/dist/mcp-server/roots/roots-registration.js.map +1 -0
- package/dist/mcp-server/server.d.ts +34 -0
- package/dist/mcp-server/server.d.ts.map +1 -0
- package/dist/mcp-server/server.js +62 -0
- package/dist/mcp-server/server.js.map +1 -0
- package/dist/mcp-server/tasks/core/sessionAwareTaskStore.d.ts +42 -0
- package/dist/mcp-server/tasks/core/sessionAwareTaskStore.d.ts.map +1 -0
- package/dist/mcp-server/tasks/core/sessionAwareTaskStore.js +70 -0
- package/dist/mcp-server/tasks/core/sessionAwareTaskStore.js.map +1 -0
- package/dist/mcp-server/tasks/core/storageBackedTaskStore.d.ts +109 -0
- package/dist/mcp-server/tasks/core/storageBackedTaskStore.d.ts.map +1 -0
- package/dist/mcp-server/tasks/core/storageBackedTaskStore.js +209 -0
- package/dist/mcp-server/tasks/core/storageBackedTaskStore.js.map +1 -0
- package/dist/mcp-server/tasks/core/taskManager.d.ts +103 -0
- package/dist/mcp-server/tasks/core/taskManager.d.ts.map +1 -0
- package/dist/mcp-server/tasks/core/taskManager.js +144 -0
- package/dist/mcp-server/tasks/core/taskManager.js.map +1 -0
- package/dist/mcp-server/tasks/core/taskTypes.d.ts +11 -0
- package/dist/mcp-server/tasks/core/taskTypes.d.ts.map +1 -0
- package/dist/mcp-server/tasks/core/taskTypes.js +13 -0
- package/dist/mcp-server/tasks/core/taskTypes.js.map +1 -0
- package/dist/mcp-server/tasks/utils/taskToolDefinition.d.ts +108 -0
- package/dist/mcp-server/tasks/utils/taskToolDefinition.d.ts.map +1 -0
- package/dist/mcp-server/tasks/utils/taskToolDefinition.js +14 -0
- package/dist/mcp-server/tasks/utils/taskToolDefinition.js.map +1 -0
- package/dist/mcp-server/tools/tool-registration.d.ts +49 -0
- package/dist/mcp-server/tools/tool-registration.d.ts.map +1 -0
- package/dist/mcp-server/tools/tool-registration.js +269 -0
- package/dist/mcp-server/tools/tool-registration.js.map +1 -0
- package/dist/mcp-server/tools/utils/newToolDefinition.d.ts +73 -0
- package/dist/mcp-server/tools/utils/newToolDefinition.d.ts.map +1 -0
- package/dist/mcp-server/tools/utils/newToolDefinition.js +45 -0
- package/dist/mcp-server/tools/utils/newToolDefinition.js.map +1 -0
- package/dist/mcp-server/tools/utils/newToolHandlerFactory.d.ts +33 -0
- package/dist/mcp-server/tools/utils/newToolHandlerFactory.d.ts.map +1 -0
- package/dist/mcp-server/tools/utils/newToolHandlerFactory.js +107 -0
- package/dist/mcp-server/tools/utils/newToolHandlerFactory.js.map +1 -0
- package/dist/mcp-server/tools/utils/toolDefinition.d.ts +118 -0
- package/dist/mcp-server/tools/utils/toolDefinition.d.ts.map +1 -0
- package/dist/mcp-server/tools/utils/toolDefinition.js +2 -0
- package/dist/mcp-server/tools/utils/toolDefinition.js.map +1 -0
- package/dist/mcp-server/tools/utils/toolHandlerFactory.d.ts +34 -0
- package/dist/mcp-server/tools/utils/toolHandlerFactory.d.ts.map +1 -0
- package/dist/mcp-server/tools/utils/toolHandlerFactory.js +68 -0
- package/dist/mcp-server/tools/utils/toolHandlerFactory.js.map +1 -0
- package/dist/mcp-server/transports/ITransport.d.ts +15 -0
- package/dist/mcp-server/transports/ITransport.d.ts.map +1 -0
- package/dist/mcp-server/transports/ITransport.js +2 -0
- package/dist/mcp-server/transports/ITransport.js.map +1 -0
- package/dist/mcp-server/transports/auth/authFactory.d.ts +11 -0
- package/dist/mcp-server/transports/auth/authFactory.d.ts.map +1 -0
- package/dist/mcp-server/transports/auth/authFactory.js +43 -0
- package/dist/mcp-server/transports/auth/authFactory.js.map +1 -0
- package/dist/mcp-server/transports/auth/authMiddleware.d.ts +24 -0
- package/dist/mcp-server/transports/auth/authMiddleware.d.ts.map +1 -0
- package/dist/mcp-server/transports/auth/authMiddleware.js +69 -0
- package/dist/mcp-server/transports/auth/authMiddleware.js.map +1 -0
- package/dist/mcp-server/transports/auth/lib/authContext.d.ts +34 -0
- package/dist/mcp-server/transports/auth/lib/authContext.d.ts.map +1 -0
- package/dist/mcp-server/transports/auth/lib/authContext.js +25 -0
- package/dist/mcp-server/transports/auth/lib/authContext.js.map +1 -0
- package/dist/mcp-server/transports/auth/lib/authTypes.d.ts +19 -0
- package/dist/mcp-server/transports/auth/lib/authTypes.d.ts.map +1 -0
- package/dist/mcp-server/transports/auth/lib/authTypes.js +2 -0
- package/dist/mcp-server/transports/auth/lib/authTypes.js.map +1 -0
- package/dist/mcp-server/transports/auth/lib/authUtils.d.ts +18 -0
- package/dist/mcp-server/transports/auth/lib/authUtils.d.ts.map +1 -0
- package/dist/mcp-server/transports/auth/lib/authUtils.js +64 -0
- package/dist/mcp-server/transports/auth/lib/authUtils.js.map +1 -0
- package/dist/mcp-server/transports/auth/lib/checkScopes.d.ts +25 -0
- package/dist/mcp-server/transports/auth/lib/checkScopes.d.ts.map +1 -0
- package/dist/mcp-server/transports/auth/lib/checkScopes.js +34 -0
- package/dist/mcp-server/transports/auth/lib/checkScopes.js.map +1 -0
- package/dist/mcp-server/transports/auth/lib/claimParser.d.ts +34 -0
- package/dist/mcp-server/transports/auth/lib/claimParser.d.ts.map +1 -0
- package/dist/mcp-server/transports/auth/lib/claimParser.js +58 -0
- package/dist/mcp-server/transports/auth/lib/claimParser.js.map +1 -0
- package/dist/mcp-server/transports/auth/lib/withAuth.d.ts +25 -0
- package/dist/mcp-server/transports/auth/lib/withAuth.d.ts.map +1 -0
- package/dist/mcp-server/transports/auth/lib/withAuth.js +30 -0
- package/dist/mcp-server/transports/auth/lib/withAuth.js.map +1 -0
- package/dist/mcp-server/transports/auth/strategies/authStrategy.d.ts +18 -0
- package/dist/mcp-server/transports/auth/strategies/authStrategy.d.ts.map +1 -0
- package/dist/mcp-server/transports/auth/strategies/authStrategy.js +2 -0
- package/dist/mcp-server/transports/auth/strategies/authStrategy.js.map +1 -0
- package/dist/mcp-server/transports/auth/strategies/jwtStrategy.d.ts +14 -0
- package/dist/mcp-server/transports/auth/strategies/jwtStrategy.d.ts.map +1 -0
- package/dist/mcp-server/transports/auth/strategies/jwtStrategy.js +86 -0
- package/dist/mcp-server/transports/auth/strategies/jwtStrategy.js.map +1 -0
- package/dist/mcp-server/transports/auth/strategies/oauthStrategy.d.ts +14 -0
- package/dist/mcp-server/transports/auth/strategies/oauthStrategy.d.ts.map +1 -0
- package/dist/mcp-server/transports/auth/strategies/oauthStrategy.js +113 -0
- package/dist/mcp-server/transports/auth/strategies/oauthStrategy.js.map +1 -0
- package/dist/mcp-server/transports/http/httpErrorHandler.d.ts +25 -0
- package/dist/mcp-server/transports/http/httpErrorHandler.d.ts.map +1 -0
- package/dist/mcp-server/transports/http/httpErrorHandler.js +112 -0
- package/dist/mcp-server/transports/http/httpErrorHandler.js.map +1 -0
- package/dist/mcp-server/transports/http/httpTransport.d.ts +47 -0
- package/dist/mcp-server/transports/http/httpTransport.d.ts.map +1 -0
- package/dist/mcp-server/transports/http/httpTransport.js +396 -0
- package/dist/mcp-server/transports/http/httpTransport.js.map +1 -0
- package/dist/mcp-server/transports/http/httpTypes.d.ts +17 -0
- package/dist/mcp-server/transports/http/httpTypes.d.ts.map +1 -0
- package/dist/mcp-server/transports/http/httpTypes.js +2 -0
- package/dist/mcp-server/transports/http/httpTypes.js.map +1 -0
- package/dist/mcp-server/transports/http/protectedResourceMetadata.d.ts +21 -0
- package/dist/mcp-server/transports/http/protectedResourceMetadata.d.ts.map +1 -0
- package/dist/mcp-server/transports/http/protectedResourceMetadata.js +44 -0
- package/dist/mcp-server/transports/http/protectedResourceMetadata.js.map +1 -0
- package/dist/mcp-server/transports/http/sessionIdUtils.d.ts +33 -0
- package/dist/mcp-server/transports/http/sessionIdUtils.d.ts.map +1 -0
- package/dist/mcp-server/transports/http/sessionIdUtils.js +54 -0
- package/dist/mcp-server/transports/http/sessionIdUtils.js.map +1 -0
- package/dist/mcp-server/transports/http/sessionStore.d.ts +87 -0
- package/dist/mcp-server/transports/http/sessionStore.d.ts.map +1 -0
- package/dist/mcp-server/transports/http/sessionStore.js +209 -0
- package/dist/mcp-server/transports/http/sessionStore.js.map +1 -0
- package/dist/mcp-server/transports/manager.d.ts +22 -0
- package/dist/mcp-server/transports/manager.d.ts.map +1 -0
- package/dist/mcp-server/transports/manager.js +62 -0
- package/dist/mcp-server/transports/manager.js.map +1 -0
- package/dist/mcp-server/transports/stdio/stdioTransport.d.ts +44 -0
- package/dist/mcp-server/transports/stdio/stdioTransport.d.ts.map +1 -0
- package/dist/mcp-server/transports/stdio/stdioTransport.js +63 -0
- package/dist/mcp-server/transports/stdio/stdioTransport.js.map +1 -0
- package/dist/services/graph/core/GraphService.d.ts +205 -0
- package/dist/services/graph/core/GraphService.d.ts.map +1 -0
- package/dist/services/graph/core/GraphService.js +231 -0
- package/dist/services/graph/core/GraphService.js.map +1 -0
- package/dist/services/graph/core/IGraphProvider.d.ts +295 -0
- package/dist/services/graph/core/IGraphProvider.d.ts.map +1 -0
- package/dist/services/graph/core/IGraphProvider.js +8 -0
- package/dist/services/graph/core/IGraphProvider.js.map +1 -0
- package/dist/services/graph/types.d.ts +107 -0
- package/dist/services/graph/types.d.ts.map +1 -0
- package/dist/services/graph/types.js +8 -0
- package/dist/services/graph/types.js.map +1 -0
- package/dist/services/llm/core/ILlmProvider.d.ts +86 -0
- package/dist/services/llm/core/ILlmProvider.d.ts.map +1 -0
- package/dist/services/llm/core/ILlmProvider.js +2 -0
- package/dist/services/llm/core/ILlmProvider.js.map +1 -0
- package/dist/services/llm/providers/openrouter.provider.d.ts +187 -0
- package/dist/services/llm/providers/openrouter.provider.d.ts.map +1 -0
- package/dist/services/llm/providers/openrouter.provider.js +302 -0
- package/dist/services/llm/providers/openrouter.provider.js.map +1 -0
- package/dist/services/llm/types.d.ts +16 -0
- package/dist/services/llm/types.d.ts.map +1 -0
- package/dist/services/llm/types.js +9 -0
- package/dist/services/llm/types.js.map +1 -0
- package/dist/services/speech/core/ISpeechProvider.d.ts +92 -0
- package/dist/services/speech/core/ISpeechProvider.d.ts.map +1 -0
- package/dist/services/speech/core/ISpeechProvider.js +34 -0
- package/dist/services/speech/core/ISpeechProvider.js.map +1 -0
- package/dist/services/speech/core/SpeechService.d.ts +87 -0
- package/dist/services/speech/core/SpeechService.d.ts.map +1 -0
- package/dist/services/speech/core/SpeechService.js +135 -0
- package/dist/services/speech/core/SpeechService.js.map +1 -0
- package/dist/services/speech/providers/elevenlabs.provider.d.ts +77 -0
- package/dist/services/speech/providers/elevenlabs.provider.d.ts.map +1 -0
- package/dist/services/speech/providers/elevenlabs.provider.js +199 -0
- package/dist/services/speech/providers/elevenlabs.provider.js.map +1 -0
- package/dist/services/speech/providers/whisper.provider.d.ts +94 -0
- package/dist/services/speech/providers/whisper.provider.d.ts.map +1 -0
- package/dist/services/speech/providers/whisper.provider.js +240 -0
- package/dist/services/speech/providers/whisper.provider.js.map +1 -0
- package/dist/services/speech/types.d.ts +173 -0
- package/dist/services/speech/types.d.ts.map +1 -0
- package/dist/services/speech/types.js +8 -0
- package/dist/services/speech/types.js.map +1 -0
- package/dist/storage/core/IStorageProvider.d.ts +159 -0
- package/dist/storage/core/IStorageProvider.d.ts.map +1 -0
- package/dist/storage/core/IStorageProvider.js +2 -0
- package/dist/storage/core/IStorageProvider.js.map +1 -0
- package/dist/storage/core/StorageService.d.ts +22 -0
- package/dist/storage/core/StorageService.d.ts.map +1 -0
- package/dist/storage/core/StorageService.js +151 -0
- package/dist/storage/core/StorageService.js.map +1 -0
- package/dist/storage/core/storageFactory.d.ts +66 -0
- package/dist/storage/core/storageFactory.d.ts.map +1 -0
- package/dist/storage/core/storageFactory.js +122 -0
- package/dist/storage/core/storageFactory.js.map +1 -0
- package/dist/storage/core/storageValidation.d.ts +77 -0
- package/dist/storage/core/storageValidation.d.ts.map +1 -0
- package/dist/storage/core/storageValidation.js +303 -0
- package/dist/storage/core/storageValidation.js.map +1 -0
- package/dist/storage/providers/cloudflare/d1Provider.d.ts +94 -0
- package/dist/storage/providers/cloudflare/d1Provider.d.ts.map +1 -0
- package/dist/storage/providers/cloudflare/d1Provider.js +347 -0
- package/dist/storage/providers/cloudflare/d1Provider.js.map +1 -0
- package/dist/storage/providers/cloudflare/kvProvider.d.ts +21 -0
- package/dist/storage/providers/cloudflare/kvProvider.d.ts.map +1 -0
- package/dist/storage/providers/cloudflare/kvProvider.js +183 -0
- package/dist/storage/providers/cloudflare/kvProvider.js.map +1 -0
- package/dist/storage/providers/cloudflare/r2Provider.d.ts +28 -0
- package/dist/storage/providers/cloudflare/r2Provider.d.ts.map +1 -0
- package/dist/storage/providers/cloudflare/r2Provider.js +222 -0
- package/dist/storage/providers/cloudflare/r2Provider.js.map +1 -0
- package/dist/storage/providers/fileSystem/fileSystemProvider.d.ts +20 -0
- package/dist/storage/providers/fileSystem/fileSystemProvider.d.ts.map +1 -0
- package/dist/storage/providers/fileSystem/fileSystemProvider.js +282 -0
- package/dist/storage/providers/fileSystem/fileSystemProvider.js.map +1 -0
- package/dist/storage/providers/inMemory/inMemoryProvider.d.ts +21 -0
- package/dist/storage/providers/inMemory/inMemoryProvider.d.ts.map +1 -0
- package/dist/storage/providers/inMemory/inMemoryProvider.js +139 -0
- package/dist/storage/providers/inMemory/inMemoryProvider.js.map +1 -0
- package/dist/storage/providers/supabase/supabase.types.d.ts +49 -0
- package/dist/storage/providers/supabase/supabase.types.d.ts.map +1 -0
- package/dist/storage/providers/supabase/supabase.types.js +8 -0
- package/dist/storage/providers/supabase/supabase.types.js.map +1 -0
- package/dist/storage/providers/supabase/supabaseProvider.d.ts +24 -0
- package/dist/storage/providers/supabase/supabaseProvider.d.ts.map +1 -0
- package/dist/storage/providers/supabase/supabaseProvider.js +209 -0
- package/dist/storage/providers/supabase/supabaseProvider.js.map +1 -0
- package/dist/testing/index.d.ts +53 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +132 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/types-global/errors.d.ts +83 -0
- package/dist/types-global/errors.d.ts.map +1 -0
- package/dist/types-global/errors.js +113 -0
- package/dist/types-global/errors.js.map +1 -0
- package/dist/utils/formatting/diffFormatter.d.ts +227 -0
- package/dist/utils/formatting/diffFormatter.d.ts.map +1 -0
- package/dist/utils/formatting/diffFormatter.js +369 -0
- package/dist/utils/formatting/diffFormatter.js.map +1 -0
- package/dist/utils/formatting/index.d.ts +9 -0
- package/dist/utils/formatting/index.d.ts.map +1 -0
- package/dist/utils/formatting/index.js +9 -0
- package/dist/utils/formatting/index.js.map +1 -0
- package/dist/utils/formatting/markdownBuilder.d.ts +543 -0
- package/dist/utils/formatting/markdownBuilder.d.ts.map +1 -0
- package/dist/utils/formatting/markdownBuilder.js +674 -0
- package/dist/utils/formatting/markdownBuilder.js.map +1 -0
- package/dist/utils/formatting/tableFormatter.d.ts +261 -0
- package/dist/utils/formatting/tableFormatter.d.ts.map +1 -0
- package/dist/utils/formatting/tableFormatter.js +456 -0
- package/dist/utils/formatting/tableFormatter.js.map +1 -0
- package/dist/utils/formatting/treeFormatter.d.ts +344 -0
- package/dist/utils/formatting/treeFormatter.d.ts.map +1 -0
- package/dist/utils/formatting/treeFormatter.js +400 -0
- package/dist/utils/formatting/treeFormatter.js.map +1 -0
- package/dist/utils/internal/encoding.d.ts +42 -0
- package/dist/utils/internal/encoding.d.ts.map +1 -0
- package/dist/utils/internal/encoding.js +87 -0
- package/dist/utils/internal/encoding.js.map +1 -0
- package/dist/utils/internal/error-handler/errorHandler.d.ts +140 -0
- package/dist/utils/internal/error-handler/errorHandler.d.ts.map +1 -0
- package/dist/utils/internal/error-handler/errorHandler.js +318 -0
- package/dist/utils/internal/error-handler/errorHandler.js.map +1 -0
- package/dist/utils/internal/error-handler/helpers.d.ts +98 -0
- package/dist/utils/internal/error-handler/helpers.d.ts.map +1 -0
- package/dist/utils/internal/error-handler/helpers.js +214 -0
- package/dist/utils/internal/error-handler/helpers.js.map +1 -0
- package/dist/utils/internal/error-handler/mappings.d.ts +85 -0
- package/dist/utils/internal/error-handler/mappings.d.ts.map +1 -0
- package/dist/utils/internal/error-handler/mappings.js +234 -0
- package/dist/utils/internal/error-handler/mappings.js.map +1 -0
- package/dist/utils/internal/error-handler/types.d.ts +160 -0
- package/dist/utils/internal/error-handler/types.d.ts.map +1 -0
- package/dist/utils/internal/error-handler/types.js +6 -0
- package/dist/utils/internal/error-handler/types.js.map +1 -0
- package/dist/utils/internal/health.d.ts +60 -0
- package/dist/utils/internal/health.d.ts.map +1 -0
- package/dist/utils/internal/health.js +46 -0
- package/dist/utils/internal/health.js.map +1 -0
- package/dist/utils/internal/logger.d.ts +300 -0
- package/dist/utils/internal/logger.d.ts.map +1 -0
- package/dist/utils/internal/logger.js +573 -0
- package/dist/utils/internal/logger.js.map +1 -0
- package/dist/utils/internal/performance.d.ts +78 -0
- package/dist/utils/internal/performance.d.ts.map +1 -0
- package/dist/utils/internal/performance.js +227 -0
- package/dist/utils/internal/performance.js.map +1 -0
- package/dist/utils/internal/requestContext.d.ts +200 -0
- package/dist/utils/internal/requestContext.d.ts.map +1 -0
- package/dist/utils/internal/requestContext.js +163 -0
- package/dist/utils/internal/requestContext.js.map +1 -0
- package/dist/utils/internal/runtime.d.ts +49 -0
- package/dist/utils/internal/runtime.d.ts.map +1 -0
- package/dist/utils/internal/runtime.js +90 -0
- package/dist/utils/internal/runtime.js.map +1 -0
- package/dist/utils/internal/startupBanner.d.ts +23 -0
- package/dist/utils/internal/startupBanner.d.ts.map +1 -0
- package/dist/utils/internal/startupBanner.js +34 -0
- package/dist/utils/internal/startupBanner.js.map +1 -0
- package/dist/utils/metrics/tokenCounter.d.ts +97 -0
- package/dist/utils/metrics/tokenCounter.d.ts.map +1 -0
- package/dist/utils/metrics/tokenCounter.js +162 -0
- package/dist/utils/metrics/tokenCounter.js.map +1 -0
- package/dist/utils/network/fetchWithTimeout.d.ts +91 -0
- package/dist/utils/network/fetchWithTimeout.d.ts.map +1 -0
- package/dist/utils/network/fetchWithTimeout.js +305 -0
- package/dist/utils/network/fetchWithTimeout.js.map +1 -0
- package/dist/utils/pagination/pagination.d.ts +157 -0
- package/dist/utils/pagination/pagination.d.ts.map +1 -0
- package/dist/utils/pagination/pagination.js +191 -0
- package/dist/utils/pagination/pagination.js.map +1 -0
- package/dist/utils/parsing/csvParser.d.ts +84 -0
- package/dist/utils/parsing/csvParser.d.ts.map +1 -0
- package/dist/utils/parsing/csvParser.js +132 -0
- package/dist/utils/parsing/csvParser.js.map +1 -0
- package/dist/utils/parsing/dateParser.d.ts +103 -0
- package/dist/utils/parsing/dateParser.d.ts.map +1 -0
- package/dist/utils/parsing/dateParser.js +142 -0
- package/dist/utils/parsing/dateParser.js.map +1 -0
- package/dist/utils/parsing/frontmatterParser.d.ts +91 -0
- package/dist/utils/parsing/frontmatterParser.d.ts.map +1 -0
- package/dist/utils/parsing/frontmatterParser.js +163 -0
- package/dist/utils/parsing/frontmatterParser.js.map +1 -0
- package/dist/utils/parsing/index.d.ts +15 -0
- package/dist/utils/parsing/index.d.ts.map +1 -0
- package/dist/utils/parsing/index.js +15 -0
- package/dist/utils/parsing/index.js.map +1 -0
- package/dist/utils/parsing/jsonParser.d.ts +115 -0
- package/dist/utils/parsing/jsonParser.d.ts.map +1 -0
- package/dist/utils/parsing/jsonParser.js +177 -0
- package/dist/utils/parsing/jsonParser.js.map +1 -0
- package/dist/utils/parsing/pdfParser.d.ts +563 -0
- package/dist/utils/parsing/pdfParser.d.ts.map +1 -0
- package/dist/utils/parsing/pdfParser.js +775 -0
- package/dist/utils/parsing/pdfParser.js.map +1 -0
- package/dist/utils/parsing/thinkBlock.d.ts +31 -0
- package/dist/utils/parsing/thinkBlock.d.ts.map +1 -0
- package/dist/utils/parsing/thinkBlock.js +31 -0
- package/dist/utils/parsing/thinkBlock.js.map +1 -0
- package/dist/utils/parsing/xmlParser.d.ts +69 -0
- package/dist/utils/parsing/xmlParser.d.ts.map +1 -0
- package/dist/utils/parsing/xmlParser.js +140 -0
- package/dist/utils/parsing/xmlParser.js.map +1 -0
- package/dist/utils/parsing/yamlParser.d.ts +64 -0
- package/dist/utils/parsing/yamlParser.d.ts.map +1 -0
- package/dist/utils/parsing/yamlParser.js +129 -0
- package/dist/utils/parsing/yamlParser.js.map +1 -0
- package/dist/utils/scheduling/scheduler.d.ts +174 -0
- package/dist/utils/scheduling/scheduler.d.ts.map +1 -0
- package/dist/utils/scheduling/scheduler.js +248 -0
- package/dist/utils/scheduling/scheduler.js.map +1 -0
- package/dist/utils/security/idGenerator.d.ts +189 -0
- package/dist/utils/security/idGenerator.d.ts.map +1 -0
- package/dist/utils/security/idGenerator.js +301 -0
- package/dist/utils/security/idGenerator.js.map +1 -0
- package/dist/utils/security/index.d.ts +8 -0
- package/dist/utils/security/index.d.ts.map +1 -0
- package/dist/utils/security/index.js +8 -0
- package/dist/utils/security/index.js.map +1 -0
- package/dist/utils/security/rateLimiter.d.ts +171 -0
- package/dist/utils/security/rateLimiter.d.ts.map +1 -0
- package/dist/utils/security/rateLimiter.js +294 -0
- package/dist/utils/security/rateLimiter.js.map +1 -0
- package/dist/utils/security/sanitization.d.ts +430 -0
- package/dist/utils/security/sanitization.d.ts.map +1 -0
- package/dist/utils/security/sanitization.js +759 -0
- package/dist/utils/security/sanitization.js.map +1 -0
- package/dist/utils/telemetry/index.d.ts +12 -0
- package/dist/utils/telemetry/index.d.ts.map +1 -0
- package/dist/utils/telemetry/index.js +12 -0
- package/dist/utils/telemetry/index.js.map +1 -0
- package/dist/utils/telemetry/instrumentation.d.ts +62 -0
- package/dist/utils/telemetry/instrumentation.d.ts.map +1 -0
- package/dist/utils/telemetry/instrumentation.js +223 -0
- package/dist/utils/telemetry/instrumentation.js.map +1 -0
- package/dist/utils/telemetry/metrics.d.ts +170 -0
- package/dist/utils/telemetry/metrics.d.ts.map +1 -0
- package/dist/utils/telemetry/metrics.js +205 -0
- package/dist/utils/telemetry/metrics.js.map +1 -0
- package/dist/utils/telemetry/semconv.d.ts +147 -0
- package/dist/utils/telemetry/semconv.d.ts.map +1 -0
- package/dist/utils/telemetry/semconv.js +159 -0
- package/dist/utils/telemetry/semconv.js.map +1 -0
- package/dist/utils/telemetry/trace.d.ts +141 -0
- package/dist/utils/telemetry/trace.d.ts.map +1 -0
- package/dist/utils/telemetry/trace.js +193 -0
- package/dist/utils/telemetry/trace.js.map +1 -0
- package/dist/utils/types/guards.d.ts +209 -0
- package/dist/utils/types/guards.d.ts.map +1 -0
- package/dist/utils/types/guards.js +229 -0
- package/dist/utils/types/guards.js.map +1 -0
- package/dist/utils/types/index.d.ts +6 -0
- package/dist/utils/types/index.d.ts.map +1 -0
- package/dist/utils/types/index.js +6 -0
- package/dist/utils/types/index.js.map +1 -0
- package/dist/worker.d.ts +59 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +216 -0
- package/dist/worker.js.map +1 -0
- package/package.json +377 -0
- package/skills/README.md +38 -0
- package/skills/add-export/SKILL.md +49 -0
- package/skills/add-prompt/SKILL.md +97 -0
- package/skills/add-provider/SKILL.md +53 -0
- package/skills/add-resource/SKILL.md +107 -0
- package/skills/add-service/SKILL.md +113 -0
- package/skills/add-tool/SKILL.md +110 -0
- package/skills/api-auth/SKILL.md +173 -0
- package/skills/api-config/SKILL.md +68 -0
- package/skills/api-context/SKILL.md +321 -0
- package/skills/api-errors/SKILL.md +146 -0
- package/skills/api-services/SKILL.md +24 -0
- package/skills/api-services/references/graph.md +124 -0
- package/skills/api-services/references/llm.md +46 -0
- package/skills/api-services/references/speech.md +72 -0
- package/skills/api-testing/SKILL.md +263 -0
- package/skills/api-utils/SKILL.md +106 -0
- package/skills/api-utils/references/formatting.md +237 -0
- package/skills/api-utils/references/parsing.md +263 -0
- package/skills/api-utils/references/security.md +226 -0
- package/skills/api-workers/SKILL.md +165 -0
- package/skills/devcheck/SKILL.md +31 -0
- package/skills/maintenance/SKILL.md +52 -0
- package/skills/migrate-mcp-ts-template/SKILL.md +131 -0
- package/skills/release/SKILL.md +67 -0
- package/skills/setup/SKILL.md +89 -0
- package/skills/walkthrough-init/SKILL.md +50 -0
- package/templates/.env.example +17 -0
- package/templates/AGENTS.md +113 -0
- package/templates/CLAUDE.md +113 -0
- package/templates/_tsconfig.json +33 -0
- package/templates/biome.template.json +43 -0
- package/templates/package.json +26 -0
- package/templates/src/index.ts +16 -0
- package/templates/src/mcp-server/prompts/definitions/echo.prompt.ts +19 -0
- package/templates/src/mcp-server/resources/definitions/echo.resource.ts +30 -0
- package/templates/src/mcp-server/tools/definitions/echo.tool.ts +24 -0
- package/templates/vitest.config.ts +12 -0
- package/tsconfig.base.json +44 -0
- package/vitest.config.base.ts +38 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Core interface definition for speech service providers.
|
|
3
|
+
* Provides the contract for Text-to-Speech (TTS) and Speech-to-Text (STT) operations.
|
|
4
|
+
* @module src/services/speech/core/ISpeechProvider
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Type guard — returns `true` if the provider supports text-to-speech synthesis.
|
|
8
|
+
*
|
|
9
|
+
* @param provider - Any `ISpeechProvider` instance.
|
|
10
|
+
* @returns `true` when `provider.supportsTTS` is set, narrowing the type for callers.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* if (supportsTTS(provider)) {
|
|
14
|
+
* const result = await provider.textToSpeech({ text: 'Hello' });
|
|
15
|
+
* }
|
|
16
|
+
*/
|
|
17
|
+
export function supportsTTS(provider) {
|
|
18
|
+
return provider.supportsTTS;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Type guard — returns `true` if the provider supports speech-to-text transcription.
|
|
22
|
+
*
|
|
23
|
+
* @param provider - Any `ISpeechProvider` instance.
|
|
24
|
+
* @returns `true` when `provider.supportsSTT` is set, narrowing the type for callers.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* if (supportsSTT(provider)) {
|
|
28
|
+
* const result = await provider.speechToText({ audio: buffer });
|
|
29
|
+
* }
|
|
30
|
+
*/
|
|
31
|
+
export function supportsSTT(provider) {
|
|
32
|
+
return provider.supportsSTT;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=ISpeechProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ISpeechProvider.js","sourceRoot":"","sources":["../../../../src/services/speech/core/ISpeechProvider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA8EH;;;;;;;;;;GAUG;AACH,MAAM,UAAU,WAAW,CAAC,QAAyB;IACnD,OAAO,QAAQ,CAAC,WAAW,CAAC;AAC9B,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,WAAW,CAAC,QAAyB;IACnD,OAAO,QAAQ,CAAC,WAAW,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Speech service orchestrator.
|
|
3
|
+
* Manages independent TTS and STT provider instances, allowing different providers
|
|
4
|
+
* to be used for each capability (e.g., ElevenLabs for TTS and Whisper for STT).
|
|
5
|
+
* @module src/services/speech/core/SpeechService
|
|
6
|
+
*/
|
|
7
|
+
import type { SpeechProviderConfig } from '../types.js';
|
|
8
|
+
import type { ISpeechProvider } from './ISpeechProvider.js';
|
|
9
|
+
/**
|
|
10
|
+
* Factory function that instantiates a concrete {@link ISpeechProvider} from a config object.
|
|
11
|
+
* Performs an exhaustive switch over `config.provider` so TypeScript enforces handling
|
|
12
|
+
* of every declared variant at compile time.
|
|
13
|
+
*
|
|
14
|
+
* @param config - Provider configuration including the `provider` discriminant, API key,
|
|
15
|
+
* base URL, default voice/model IDs, and timeout.
|
|
16
|
+
* @returns A fully constructed provider instance ready for use.
|
|
17
|
+
* @throws {McpError} With `InvalidParams` for the `'mock'` provider (not yet implemented)
|
|
18
|
+
* or for any unrecognized provider string.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* const tts = createSpeechProvider({ provider: 'elevenlabs', apiKey: process.env.ELEVEN_KEY });
|
|
22
|
+
*/
|
|
23
|
+
export declare function createSpeechProvider(config: SpeechProviderConfig): ISpeechProvider;
|
|
24
|
+
/**
|
|
25
|
+
* Orchestrates TTS and STT operations across independently configured providers.
|
|
26
|
+
* Each capability (TTS, STT) can be backed by a different provider; either or both
|
|
27
|
+
* may be absent if only one capability is needed.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* const speech = new SpeechService(
|
|
31
|
+
* { provider: 'elevenlabs', apiKey: process.env.ELEVEN_KEY },
|
|
32
|
+
* { provider: 'openai-whisper', apiKey: process.env.OPENAI_KEY },
|
|
33
|
+
* );
|
|
34
|
+
* const { tts, stt } = await speech.healthCheck();
|
|
35
|
+
*/
|
|
36
|
+
export declare class SpeechService {
|
|
37
|
+
private ttsProvider?;
|
|
38
|
+
private sttProvider?;
|
|
39
|
+
/**
|
|
40
|
+
* Construct a SpeechService with optional TTS and STT providers.
|
|
41
|
+
* Providers are instantiated via {@link createSpeechProvider}. If a provider's declared
|
|
42
|
+
* capability does not match its config slot (e.g., a TTS-only provider passed as
|
|
43
|
+
* `sttConfig`), a warning is logged but no error is thrown.
|
|
44
|
+
*
|
|
45
|
+
* @param ttsConfig - Config for the text-to-speech provider. Omit if TTS is not needed.
|
|
46
|
+
* @param sttConfig - Config for the speech-to-text provider. Omit if STT is not needed.
|
|
47
|
+
*/
|
|
48
|
+
constructor(ttsConfig?: SpeechProviderConfig, sttConfig?: SpeechProviderConfig);
|
|
49
|
+
/**
|
|
50
|
+
* Return the configured TTS provider.
|
|
51
|
+
*
|
|
52
|
+
* @returns The active {@link ISpeechProvider} for text-to-speech.
|
|
53
|
+
* @throws {McpError} With `InvalidRequest` if no TTS provider was configured.
|
|
54
|
+
*/
|
|
55
|
+
getTTSProvider(): ISpeechProvider;
|
|
56
|
+
/**
|
|
57
|
+
* Return the configured STT provider.
|
|
58
|
+
*
|
|
59
|
+
* @returns The active {@link ISpeechProvider} for speech-to-text.
|
|
60
|
+
* @throws {McpError} With `InvalidRequest` if no STT provider was configured.
|
|
61
|
+
*/
|
|
62
|
+
getSTTProvider(): ISpeechProvider;
|
|
63
|
+
/**
|
|
64
|
+
* Returns `true` if a TTS provider is configured and declares `supportsTTS`.
|
|
65
|
+
*
|
|
66
|
+
* @returns `true` when TTS synthesis is available, `false` otherwise.
|
|
67
|
+
*/
|
|
68
|
+
hasTTS(): boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Returns `true` if an STT provider is configured and declares `supportsSTT`.
|
|
71
|
+
*
|
|
72
|
+
* @returns `true` when speech transcription is available, `false` otherwise.
|
|
73
|
+
*/
|
|
74
|
+
hasSTT(): boolean;
|
|
75
|
+
/**
|
|
76
|
+
* Run health checks against all configured providers in parallel.
|
|
77
|
+
* Providers that are not configured report `false` without making any network call.
|
|
78
|
+
*
|
|
79
|
+
* @returns Object with `tts` and `stt` boolean fields indicating provider health.
|
|
80
|
+
* Never rejects — individual provider errors are caught internally.
|
|
81
|
+
*/
|
|
82
|
+
healthCheck(): Promise<{
|
|
83
|
+
tts: boolean;
|
|
84
|
+
stt: boolean;
|
|
85
|
+
}>;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=SpeechService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpeechService.d.ts","sourceRoot":"","sources":["../../../../src/services/speech/core/SpeechService.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,oBAAoB,GAAG,eAAe,CAqBlF;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,WAAW,CAAC,CAAkB;IACtC,OAAO,CAAC,WAAW,CAAC,CAAkB;IAEtC;;;;;;;;OAQG;gBACS,SAAS,CAAC,EAAE,oBAAoB,EAAE,SAAS,CAAC,EAAE,oBAAoB;IAoB9E;;;;;OAKG;IACH,cAAc,IAAI,eAAe;IAOjC;;;;;OAKG;IACH,cAAc,IAAI,eAAe;IAOjC;;;;OAIG;IACH,MAAM,IAAI,OAAO;IAIjB;;;;OAIG;IACH,MAAM,IAAI,OAAO;IAIjB;;;;;;OAMG;IACG,WAAW,IAAI,OAAO,CAAC;QAC3B,GAAG,EAAE,OAAO,CAAC;QACb,GAAG,EAAE,OAAO,CAAC;KACd,CAAC;CASH"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Speech service orchestrator.
|
|
3
|
+
* Manages independent TTS and STT provider instances, allowing different providers
|
|
4
|
+
* to be used for each capability (e.g., ElevenLabs for TTS and Whisper for STT).
|
|
5
|
+
* @module src/services/speech/core/SpeechService
|
|
6
|
+
*/
|
|
7
|
+
import { JsonRpcErrorCode, McpError } from '../../../types-global/errors.js';
|
|
8
|
+
import { logger } from '../../../utils/internal/logger.js';
|
|
9
|
+
import { ElevenLabsProvider } from '../providers/elevenlabs.provider.js';
|
|
10
|
+
import { WhisperProvider } from '../providers/whisper.provider.js';
|
|
11
|
+
/**
|
|
12
|
+
* Factory function that instantiates a concrete {@link ISpeechProvider} from a config object.
|
|
13
|
+
* Performs an exhaustive switch over `config.provider` so TypeScript enforces handling
|
|
14
|
+
* of every declared variant at compile time.
|
|
15
|
+
*
|
|
16
|
+
* @param config - Provider configuration including the `provider` discriminant, API key,
|
|
17
|
+
* base URL, default voice/model IDs, and timeout.
|
|
18
|
+
* @returns A fully constructed provider instance ready for use.
|
|
19
|
+
* @throws {McpError} With `InvalidParams` for the `'mock'` provider (not yet implemented)
|
|
20
|
+
* or for any unrecognized provider string.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* const tts = createSpeechProvider({ provider: 'elevenlabs', apiKey: process.env.ELEVEN_KEY });
|
|
24
|
+
*/
|
|
25
|
+
export function createSpeechProvider(config) {
|
|
26
|
+
logger.debug(`Creating speech provider: ${config.provider}`);
|
|
27
|
+
switch (config.provider) {
|
|
28
|
+
case 'elevenlabs':
|
|
29
|
+
return new ElevenLabsProvider(config);
|
|
30
|
+
case 'openai-whisper':
|
|
31
|
+
return new WhisperProvider(config);
|
|
32
|
+
case 'mock':
|
|
33
|
+
throw new McpError(JsonRpcErrorCode.InvalidParams, 'Mock provider not yet implemented');
|
|
34
|
+
default: {
|
|
35
|
+
const _exhaustive = config.provider;
|
|
36
|
+
throw new McpError(JsonRpcErrorCode.InvalidParams, `Unknown speech provider: ${String(_exhaustive)}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Orchestrates TTS and STT operations across independently configured providers.
|
|
42
|
+
* Each capability (TTS, STT) can be backed by a different provider; either or both
|
|
43
|
+
* may be absent if only one capability is needed.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* const speech = new SpeechService(
|
|
47
|
+
* { provider: 'elevenlabs', apiKey: process.env.ELEVEN_KEY },
|
|
48
|
+
* { provider: 'openai-whisper', apiKey: process.env.OPENAI_KEY },
|
|
49
|
+
* );
|
|
50
|
+
* const { tts, stt } = await speech.healthCheck();
|
|
51
|
+
*/
|
|
52
|
+
export class SpeechService {
|
|
53
|
+
ttsProvider;
|
|
54
|
+
sttProvider;
|
|
55
|
+
/**
|
|
56
|
+
* Construct a SpeechService with optional TTS and STT providers.
|
|
57
|
+
* Providers are instantiated via {@link createSpeechProvider}. If a provider's declared
|
|
58
|
+
* capability does not match its config slot (e.g., a TTS-only provider passed as
|
|
59
|
+
* `sttConfig`), a warning is logged but no error is thrown.
|
|
60
|
+
*
|
|
61
|
+
* @param ttsConfig - Config for the text-to-speech provider. Omit if TTS is not needed.
|
|
62
|
+
* @param sttConfig - Config for the speech-to-text provider. Omit if STT is not needed.
|
|
63
|
+
*/
|
|
64
|
+
constructor(ttsConfig, sttConfig) {
|
|
65
|
+
if (ttsConfig) {
|
|
66
|
+
this.ttsProvider = createSpeechProvider(ttsConfig);
|
|
67
|
+
if (!this.ttsProvider.supportsTTS) {
|
|
68
|
+
logger.warning(`TTS provider ${ttsConfig.provider} does not support text-to-speech`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (sttConfig) {
|
|
72
|
+
this.sttProvider = createSpeechProvider(sttConfig);
|
|
73
|
+
if (!this.sttProvider.supportsSTT) {
|
|
74
|
+
logger.warning(`STT provider ${sttConfig.provider} does not support speech-to-text`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
logger.info(`Speech service initialized: TTS=${this.ttsProvider?.name ?? 'none'}, STT=${this.sttProvider?.name ?? 'none'}`);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Return the configured TTS provider.
|
|
81
|
+
*
|
|
82
|
+
* @returns The active {@link ISpeechProvider} for text-to-speech.
|
|
83
|
+
* @throws {McpError} With `InvalidRequest` if no TTS provider was configured.
|
|
84
|
+
*/
|
|
85
|
+
getTTSProvider() {
|
|
86
|
+
if (!this.ttsProvider) {
|
|
87
|
+
throw new McpError(JsonRpcErrorCode.InvalidRequest, 'No TTS provider configured');
|
|
88
|
+
}
|
|
89
|
+
return this.ttsProvider;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Return the configured STT provider.
|
|
93
|
+
*
|
|
94
|
+
* @returns The active {@link ISpeechProvider} for speech-to-text.
|
|
95
|
+
* @throws {McpError} With `InvalidRequest` if no STT provider was configured.
|
|
96
|
+
*/
|
|
97
|
+
getSTTProvider() {
|
|
98
|
+
if (!this.sttProvider) {
|
|
99
|
+
throw new McpError(JsonRpcErrorCode.InvalidRequest, 'No STT provider configured');
|
|
100
|
+
}
|
|
101
|
+
return this.sttProvider;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Returns `true` if a TTS provider is configured and declares `supportsTTS`.
|
|
105
|
+
*
|
|
106
|
+
* @returns `true` when TTS synthesis is available, `false` otherwise.
|
|
107
|
+
*/
|
|
108
|
+
hasTTS() {
|
|
109
|
+
return this.ttsProvider?.supportsTTS ?? false;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Returns `true` if an STT provider is configured and declares `supportsSTT`.
|
|
113
|
+
*
|
|
114
|
+
* @returns `true` when speech transcription is available, `false` otherwise.
|
|
115
|
+
*/
|
|
116
|
+
hasSTT() {
|
|
117
|
+
return this.sttProvider?.supportsSTT ?? false;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Run health checks against all configured providers in parallel.
|
|
121
|
+
* Providers that are not configured report `false` without making any network call.
|
|
122
|
+
*
|
|
123
|
+
* @returns Object with `tts` and `stt` boolean fields indicating provider health.
|
|
124
|
+
* Never rejects — individual provider errors are caught internally.
|
|
125
|
+
*/
|
|
126
|
+
async healthCheck() {
|
|
127
|
+
const ttsHealth = this.ttsProvider ? await this.ttsProvider.healthCheck() : false;
|
|
128
|
+
const sttHealth = this.sttProvider ? await this.sttProvider.healthCheck() : false;
|
|
129
|
+
return {
|
|
130
|
+
tts: ttsHealth,
|
|
131
|
+
stt: sttHealth,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=SpeechService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpeechService.js","sourceRoot":"","sources":["../../../../src/services/speech/core/SpeechService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview ElevenLabs text-to-speech provider implementation.
|
|
3
|
+
* Wraps the ElevenLabs v1 REST API to provide TTS synthesis and voice listing.
|
|
4
|
+
* STT is not supported by ElevenLabs and will throw `MethodNotFound`.
|
|
5
|
+
* @module src/services/speech/providers/elevenlabs.provider
|
|
6
|
+
*/
|
|
7
|
+
import type { ISpeechProvider } from '../core/ISpeechProvider.js';
|
|
8
|
+
import type { SpeechProviderConfig, SpeechToTextOptions, SpeechToTextResult, TextToSpeechOptions, TextToSpeechResult, Voice } from '../types.js';
|
|
9
|
+
/**
|
|
10
|
+
* ElevenLabs TTS provider.
|
|
11
|
+
* Implements {@link ISpeechProvider} for text-to-speech only (`supportsTTS = true`,
|
|
12
|
+
* `supportsSTT = false`). Calls the ElevenLabs v1 REST API using `fetchWithTimeout`.
|
|
13
|
+
*
|
|
14
|
+
* Default voice: `EXAVITQu4vr4xnSDxMaL` (Bella)
|
|
15
|
+
* Default model: `eleven_monolingual_v1`
|
|
16
|
+
* Default timeout: 30 000 ms
|
|
17
|
+
*/
|
|
18
|
+
export declare class ElevenLabsProvider implements ISpeechProvider {
|
|
19
|
+
readonly name = "elevenlabs";
|
|
20
|
+
readonly supportsTTS = true;
|
|
21
|
+
readonly supportsSTT = false;
|
|
22
|
+
private readonly apiKey;
|
|
23
|
+
private readonly baseUrl;
|
|
24
|
+
private readonly defaultVoiceId;
|
|
25
|
+
private readonly defaultModelId;
|
|
26
|
+
private readonly timeout;
|
|
27
|
+
/**
|
|
28
|
+
* Construct an ElevenLabsProvider.
|
|
29
|
+
*
|
|
30
|
+
* @param config - Provider configuration. `config.apiKey` is required; all other
|
|
31
|
+
* fields fall back to ElevenLabs defaults.
|
|
32
|
+
* @throws {McpError} With `InvalidParams` if `config.apiKey` is absent.
|
|
33
|
+
*/
|
|
34
|
+
constructor(config: SpeechProviderConfig);
|
|
35
|
+
/**
|
|
36
|
+
* Synthesize speech from text using the ElevenLabs text-to-speech API.
|
|
37
|
+
* Posts to `POST /text-to-speech/{voiceId}` and returns the raw MP3 audio as a Buffer.
|
|
38
|
+
* Voice settings (stability, similarity_boost, style) are merged from `options.voice`
|
|
39
|
+
* with provider defaults. Text is validated for non-empty and ≤ 5 000 characters.
|
|
40
|
+
*
|
|
41
|
+
* @param options - TTS options. `options.text` is required. `options.voice.voiceId`
|
|
42
|
+
* overrides the provider default voice; `options.modelId` overrides the default model.
|
|
43
|
+
* @returns Resolved {@link TextToSpeechResult} with `audio` as a `Buffer`, `format` of
|
|
44
|
+
* `'mp3'`, `characterCount` equal to `options.text.length`, and `metadata` containing
|
|
45
|
+
* `voiceId`, `modelId`, and `provider`.
|
|
46
|
+
* @throws {McpError} With `InvalidParams` for empty text or text > 5 000 chars.
|
|
47
|
+
* @throws {McpError} With `InternalError` if the ElevenLabs API call fails.
|
|
48
|
+
*/
|
|
49
|
+
textToSpeech(options: TextToSpeechOptions): Promise<TextToSpeechResult>;
|
|
50
|
+
/**
|
|
51
|
+
* Not supported — ElevenLabs is a TTS-only provider.
|
|
52
|
+
*
|
|
53
|
+
* @param _options - Unused.
|
|
54
|
+
* @throws {McpError} Always, with `MethodNotFound`.
|
|
55
|
+
*/
|
|
56
|
+
speechToText(_options: SpeechToTextOptions): Promise<SpeechToTextResult>;
|
|
57
|
+
/**
|
|
58
|
+
* Fetch all voices available in the authenticated ElevenLabs account.
|
|
59
|
+
* Calls `GET /voices` and maps the API response to the canonical {@link Voice} shape,
|
|
60
|
+
* extracting gender from the `labels.gender` field when present.
|
|
61
|
+
*
|
|
62
|
+
* @returns Resolved array of {@link Voice} objects. The array may be empty if the
|
|
63
|
+
* account has no voices configured.
|
|
64
|
+
* @throws {McpError} With `InternalError` if the ElevenLabs API call fails.
|
|
65
|
+
*/
|
|
66
|
+
getVoices(): Promise<Voice[]>;
|
|
67
|
+
/**
|
|
68
|
+
* Verify ElevenLabs API connectivity by attempting to fetch the voice list.
|
|
69
|
+
* A successful `getVoices()` call indicates the API key is valid and the service
|
|
70
|
+
* is reachable.
|
|
71
|
+
*
|
|
72
|
+
* @returns `true` if `getVoices()` resolves without error, `false` otherwise.
|
|
73
|
+
* Never rejects.
|
|
74
|
+
*/
|
|
75
|
+
healthCheck(): Promise<boolean>;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=elevenlabs.provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elevenlabs.provider.d.ts","sourceRoot":"","sources":["../../../../src/services/speech/providers/elevenlabs.provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EACV,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,KAAK,EACN,MAAM,aAAa,CAAC;AAsBrB;;;;;;;;GAQG;AACH,qBAAa,kBAAmB,YAAW,eAAe;IACxD,SAAgB,IAAI,gBAAgB;IACpC,SAAgB,WAAW,QAAQ;IACnC,SAAgB,WAAW,SAAS;IAEpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAEjC;;;;;;OAMG;gBACS,MAAM,EAAE,oBAAoB;IAgBxC;;;;;;;;;;;;;OAaG;IACG,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAqF7E;;;;;OAKG;IACH,YAAY,CAAC,QAAQ,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAOxE;;;;;;;;OAQG;IACG,SAAS,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAsDnC;;;;;;;OAOG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAiBtC"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview ElevenLabs text-to-speech provider implementation.
|
|
3
|
+
* Wraps the ElevenLabs v1 REST API to provide TTS synthesis and voice listing.
|
|
4
|
+
* STT is not supported by ElevenLabs and will throw `MethodNotFound`.
|
|
5
|
+
* @module src/services/speech/providers/elevenlabs.provider
|
|
6
|
+
*/
|
|
7
|
+
import { JsonRpcErrorCode, McpError } from '../../../types-global/errors.js';
|
|
8
|
+
import { logger } from '../../../utils/internal/logger.js';
|
|
9
|
+
import { requestContextService } from '../../../utils/internal/requestContext.js';
|
|
10
|
+
import { fetchWithTimeout } from '../../../utils/network/fetchWithTimeout.js';
|
|
11
|
+
/**
|
|
12
|
+
* ElevenLabs TTS provider.
|
|
13
|
+
* Implements {@link ISpeechProvider} for text-to-speech only (`supportsTTS = true`,
|
|
14
|
+
* `supportsSTT = false`). Calls the ElevenLabs v1 REST API using `fetchWithTimeout`.
|
|
15
|
+
*
|
|
16
|
+
* Default voice: `EXAVITQu4vr4xnSDxMaL` (Bella)
|
|
17
|
+
* Default model: `eleven_monolingual_v1`
|
|
18
|
+
* Default timeout: 30 000 ms
|
|
19
|
+
*/
|
|
20
|
+
export class ElevenLabsProvider {
|
|
21
|
+
name = 'elevenlabs';
|
|
22
|
+
supportsTTS = true;
|
|
23
|
+
supportsSTT = false;
|
|
24
|
+
apiKey;
|
|
25
|
+
baseUrl;
|
|
26
|
+
defaultVoiceId;
|
|
27
|
+
defaultModelId;
|
|
28
|
+
timeout;
|
|
29
|
+
/**
|
|
30
|
+
* Construct an ElevenLabsProvider.
|
|
31
|
+
*
|
|
32
|
+
* @param config - Provider configuration. `config.apiKey` is required; all other
|
|
33
|
+
* fields fall back to ElevenLabs defaults.
|
|
34
|
+
* @throws {McpError} With `InvalidParams` if `config.apiKey` is absent.
|
|
35
|
+
*/
|
|
36
|
+
constructor(config) {
|
|
37
|
+
if (!config.apiKey) {
|
|
38
|
+
throw new McpError(JsonRpcErrorCode.InvalidParams, 'ElevenLabs API key is required');
|
|
39
|
+
}
|
|
40
|
+
this.apiKey = config.apiKey;
|
|
41
|
+
this.baseUrl = config.baseUrl ?? 'https://api.elevenlabs.io/v1';
|
|
42
|
+
this.defaultVoiceId = config.defaultVoiceId ?? 'EXAVITQu4vr4xnSDxMaL'; // Default: Bella
|
|
43
|
+
this.defaultModelId = config.defaultModelId ?? 'eleven_monolingual_v1';
|
|
44
|
+
this.timeout = config.timeout ?? 30000;
|
|
45
|
+
logger.info(`ElevenLabs TTS provider initialized: ${this.baseUrl}, voice=${this.defaultVoiceId}`);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Synthesize speech from text using the ElevenLabs text-to-speech API.
|
|
49
|
+
* Posts to `POST /text-to-speech/{voiceId}` and returns the raw MP3 audio as a Buffer.
|
|
50
|
+
* Voice settings (stability, similarity_boost, style) are merged from `options.voice`
|
|
51
|
+
* with provider defaults. Text is validated for non-empty and ≤ 5 000 characters.
|
|
52
|
+
*
|
|
53
|
+
* @param options - TTS options. `options.text` is required. `options.voice.voiceId`
|
|
54
|
+
* overrides the provider default voice; `options.modelId` overrides the default model.
|
|
55
|
+
* @returns Resolved {@link TextToSpeechResult} with `audio` as a `Buffer`, `format` of
|
|
56
|
+
* `'mp3'`, `characterCount` equal to `options.text.length`, and `metadata` containing
|
|
57
|
+
* `voiceId`, `modelId`, and `provider`.
|
|
58
|
+
* @throws {McpError} With `InvalidParams` for empty text or text > 5 000 chars.
|
|
59
|
+
* @throws {McpError} With `InternalError` if the ElevenLabs API call fails.
|
|
60
|
+
*/
|
|
61
|
+
async textToSpeech(options) {
|
|
62
|
+
const context = requestContextService.createRequestContext({
|
|
63
|
+
operation: 'elevenlabs-tts',
|
|
64
|
+
...(options.context ?? {}),
|
|
65
|
+
});
|
|
66
|
+
const voiceId = options.voice?.voiceId ?? this.defaultVoiceId;
|
|
67
|
+
const modelId = options.modelId ?? this.defaultModelId;
|
|
68
|
+
logger.debug('Converting text to speech with ElevenLabs', context);
|
|
69
|
+
if (!options.text || options.text.trim().length === 0) {
|
|
70
|
+
throw new McpError(JsonRpcErrorCode.InvalidParams, 'Text cannot be empty', context);
|
|
71
|
+
}
|
|
72
|
+
if (options.text.length > 5000) {
|
|
73
|
+
throw new McpError(JsonRpcErrorCode.InvalidParams, 'Text exceeds maximum length of 5000 characters', context);
|
|
74
|
+
}
|
|
75
|
+
const url = `${this.baseUrl}/text-to-speech/${voiceId}`;
|
|
76
|
+
// Build voice settings
|
|
77
|
+
const voiceSettings = {
|
|
78
|
+
stability: options.voice?.stability ?? 0.5,
|
|
79
|
+
similarity_boost: options.voice?.similarityBoost ?? 0.75,
|
|
80
|
+
style: options.voice?.style ?? 0.0,
|
|
81
|
+
use_speaker_boost: true,
|
|
82
|
+
};
|
|
83
|
+
const requestBody = {
|
|
84
|
+
text: options.text,
|
|
85
|
+
model_id: modelId,
|
|
86
|
+
voice_settings: voiceSettings,
|
|
87
|
+
};
|
|
88
|
+
try {
|
|
89
|
+
const response = await fetchWithTimeout(url, this.timeout, context, {
|
|
90
|
+
method: 'POST',
|
|
91
|
+
headers: {
|
|
92
|
+
'Content-Type': 'application/json',
|
|
93
|
+
'xi-api-key': this.apiKey,
|
|
94
|
+
},
|
|
95
|
+
body: JSON.stringify(requestBody),
|
|
96
|
+
});
|
|
97
|
+
// fetchWithTimeout already throws McpError on non-ok responses
|
|
98
|
+
const audioBuffer = Buffer.from(await response.arrayBuffer());
|
|
99
|
+
logger.info(`Text-to-speech conversion successful (voice=${voiceId}, ${audioBuffer.length} bytes)`, context);
|
|
100
|
+
return {
|
|
101
|
+
audio: audioBuffer,
|
|
102
|
+
format: 'mp3',
|
|
103
|
+
characterCount: options.text.length,
|
|
104
|
+
metadata: {
|
|
105
|
+
voiceId,
|
|
106
|
+
modelId,
|
|
107
|
+
provider: this.name,
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
if (error instanceof McpError) {
|
|
113
|
+
throw error;
|
|
114
|
+
}
|
|
115
|
+
logger.error('Failed to convert text to speech', error instanceof Error ? error : new Error(String(error)), context);
|
|
116
|
+
throw new McpError(JsonRpcErrorCode.InternalError, `Failed to convert text to speech: ${error instanceof Error ? error.message : 'Unknown error'}`, context);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Not supported — ElevenLabs is a TTS-only provider.
|
|
121
|
+
*
|
|
122
|
+
* @param _options - Unused.
|
|
123
|
+
* @throws {McpError} Always, with `MethodNotFound`.
|
|
124
|
+
*/
|
|
125
|
+
speechToText(_options) {
|
|
126
|
+
throw new McpError(JsonRpcErrorCode.MethodNotFound, 'Speech-to-text is not supported by ElevenLabs provider');
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Fetch all voices available in the authenticated ElevenLabs account.
|
|
130
|
+
* Calls `GET /voices` and maps the API response to the canonical {@link Voice} shape,
|
|
131
|
+
* extracting gender from the `labels.gender` field when present.
|
|
132
|
+
*
|
|
133
|
+
* @returns Resolved array of {@link Voice} objects. The array may be empty if the
|
|
134
|
+
* account has no voices configured.
|
|
135
|
+
* @throws {McpError} With `InternalError` if the ElevenLabs API call fails.
|
|
136
|
+
*/
|
|
137
|
+
async getVoices() {
|
|
138
|
+
const context = requestContextService.createRequestContext({
|
|
139
|
+
operation: 'elevenlabs-getVoices',
|
|
140
|
+
});
|
|
141
|
+
logger.debug('Fetching available voices from ElevenLabs', context);
|
|
142
|
+
const url = `${this.baseUrl}/voices`;
|
|
143
|
+
try {
|
|
144
|
+
const response = await fetchWithTimeout(url, this.timeout, context, {
|
|
145
|
+
method: 'GET',
|
|
146
|
+
headers: {
|
|
147
|
+
'xi-api-key': this.apiKey,
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
// fetchWithTimeout already throws McpError on non-ok responses
|
|
151
|
+
const data = (await response.json());
|
|
152
|
+
const voices = data.voices.map((v) => ({
|
|
153
|
+
id: v.voice_id,
|
|
154
|
+
name: v.name,
|
|
155
|
+
...(v.description !== undefined && { description: v.description }),
|
|
156
|
+
...(v.category !== undefined && { category: v.category }),
|
|
157
|
+
...(v.preview_url !== undefined && { previewUrl: v.preview_url }),
|
|
158
|
+
...(v.labels?.gender !== undefined && {
|
|
159
|
+
gender: v.labels.gender,
|
|
160
|
+
}),
|
|
161
|
+
metadata: {
|
|
162
|
+
labels: v.labels,
|
|
163
|
+
},
|
|
164
|
+
}));
|
|
165
|
+
logger.info(`Successfully fetched ${voices.length} voices`, context);
|
|
166
|
+
return voices;
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
if (error instanceof McpError) {
|
|
170
|
+
throw error;
|
|
171
|
+
}
|
|
172
|
+
logger.error('Failed to fetch voices', error instanceof Error ? error : new Error(String(error)), context);
|
|
173
|
+
throw new McpError(JsonRpcErrorCode.InternalError, `Failed to fetch voices: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Verify ElevenLabs API connectivity by attempting to fetch the voice list.
|
|
178
|
+
* A successful `getVoices()` call indicates the API key is valid and the service
|
|
179
|
+
* is reachable.
|
|
180
|
+
*
|
|
181
|
+
* @returns `true` if `getVoices()` resolves without error, `false` otherwise.
|
|
182
|
+
* Never rejects.
|
|
183
|
+
*/
|
|
184
|
+
async healthCheck() {
|
|
185
|
+
try {
|
|
186
|
+
// Simple health check: try to fetch voices
|
|
187
|
+
await this.getVoices();
|
|
188
|
+
return true;
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
const context = requestContextService.createRequestContext({
|
|
192
|
+
operation: 'elevenlabs-healthCheck',
|
|
193
|
+
});
|
|
194
|
+
logger.error('ElevenLabs health check failed', error instanceof Error ? error : new Error(String(error)), context);
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=elevenlabs.provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elevenlabs.provider.js","sourceRoot":"","sources":["../../../../src/services/speech/providers/elevenlabs.provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview OpenAI Whisper speech-to-text provider implementation.
|
|
3
|
+
* Wraps the OpenAI audio transcriptions API (`POST /audio/transcriptions`) to provide
|
|
4
|
+
* STT transcription in multiple languages. TTS is not supported and will throw `MethodNotFound`.
|
|
5
|
+
* Audio is submitted as multipart `FormData`; the 25 MB Whisper file-size limit is enforced
|
|
6
|
+
* before the network call.
|
|
7
|
+
* @module src/services/speech/providers/whisper.provider
|
|
8
|
+
*/
|
|
9
|
+
import type { ISpeechProvider } from '../core/ISpeechProvider.js';
|
|
10
|
+
import type { SpeechProviderConfig, SpeechToTextOptions, SpeechToTextResult, TextToSpeechOptions, TextToSpeechResult, Voice } from '../types.js';
|
|
11
|
+
/**
|
|
12
|
+
* OpenAI Whisper STT provider.
|
|
13
|
+
* Implements {@link ISpeechProvider} for speech-to-text only (`supportsSTT = true`,
|
|
14
|
+
* `supportsTTS = false`). Submits audio to the OpenAI transcriptions endpoint via
|
|
15
|
+
* multipart form upload using `fetchWithTimeout`.
|
|
16
|
+
*
|
|
17
|
+
* Default model: `whisper-1`
|
|
18
|
+
* Default timeout: 60 000 ms (audio processing is slower than typical API calls)
|
|
19
|
+
* Maximum audio size: 25 MB (enforced locally before the network call)
|
|
20
|
+
*/
|
|
21
|
+
export declare class WhisperProvider implements ISpeechProvider {
|
|
22
|
+
readonly name = "openai-whisper";
|
|
23
|
+
readonly supportsTTS = false;
|
|
24
|
+
readonly supportsSTT = true;
|
|
25
|
+
private readonly apiKey;
|
|
26
|
+
private readonly baseUrl;
|
|
27
|
+
private readonly defaultModelId;
|
|
28
|
+
private readonly timeout;
|
|
29
|
+
/**
|
|
30
|
+
* Construct a WhisperProvider.
|
|
31
|
+
*
|
|
32
|
+
* @param config - Provider configuration. `config.apiKey` is required; other fields
|
|
33
|
+
* fall back to OpenAI API defaults.
|
|
34
|
+
* @throws {McpError} With `InvalidParams` if `config.apiKey` is absent.
|
|
35
|
+
*/
|
|
36
|
+
constructor(config: SpeechProviderConfig);
|
|
37
|
+
/**
|
|
38
|
+
* Not supported — Whisper is an STT-only provider.
|
|
39
|
+
*
|
|
40
|
+
* @param _options - Unused.
|
|
41
|
+
* @throws {McpError} Always, with `MethodNotFound`.
|
|
42
|
+
*/
|
|
43
|
+
textToSpeech(_options: TextToSpeechOptions): Promise<TextToSpeechResult>;
|
|
44
|
+
/**
|
|
45
|
+
* Transcribe audio to text using the OpenAI Whisper API.
|
|
46
|
+
* Audio may be provided as a raw `Buffer` or a base64-encoded string. The data is
|
|
47
|
+
* submitted to `POST /audio/transcriptions` as multipart `FormData`. When
|
|
48
|
+
* `options.timestamps` is `true`, the request uses `verbose_json` format and requests
|
|
49
|
+
* word-level granularity, populating `result.words`.
|
|
50
|
+
*
|
|
51
|
+
* @param options - Transcription options. `options.audio` is required. Optional fields:
|
|
52
|
+
* `format` (determines MIME type/filename), `language` (ISO-639-1 hint),
|
|
53
|
+
* `modelId` (overrides provider default), `prompt` (style guide), `temperature`,
|
|
54
|
+
* and `timestamps` (enables word-level output).
|
|
55
|
+
* @returns Resolved {@link SpeechToTextResult} with `text`, optional `language`,
|
|
56
|
+
* `duration`, `words` (if timestamps were requested), and `metadata` containing
|
|
57
|
+
* `modelId`, `provider`, and `task`.
|
|
58
|
+
* @throws {McpError} With `InvalidParams` for missing audio, invalid base64, or audio > 25 MB.
|
|
59
|
+
* @throws {McpError} With `InternalError` if the Whisper API call fails.
|
|
60
|
+
*/
|
|
61
|
+
speechToText(options: SpeechToTextOptions): Promise<SpeechToTextResult>;
|
|
62
|
+
/**
|
|
63
|
+
* Not applicable — Whisper is an STT-only provider with no voice concept.
|
|
64
|
+
*
|
|
65
|
+
* @throws {McpError} Always, with `MethodNotFound`.
|
|
66
|
+
*/
|
|
67
|
+
getVoices(): Promise<Voice[]>;
|
|
68
|
+
/**
|
|
69
|
+
* Verify OpenAI API connectivity by fetching the models list (`GET /models`).
|
|
70
|
+
* Uses a 5-second timeout regardless of the provider's configured `timeout`,
|
|
71
|
+
* to keep health checks lightweight.
|
|
72
|
+
*
|
|
73
|
+
* @returns `true` if the models endpoint responds with HTTP 200, `false` otherwise.
|
|
74
|
+
* Never rejects.
|
|
75
|
+
*/
|
|
76
|
+
healthCheck(): Promise<boolean>;
|
|
77
|
+
/**
|
|
78
|
+
* Map an {@link AudioFormat} string to a file extension for the multipart upload filename.
|
|
79
|
+
* Defaults to `'mp3'` for unrecognized or absent formats.
|
|
80
|
+
*
|
|
81
|
+
* @param format - Audio format string (e.g., `'wav'`, `'ogg'`).
|
|
82
|
+
* @returns File extension without leading dot (e.g., `'wav'`).
|
|
83
|
+
*/
|
|
84
|
+
private getFileExtension;
|
|
85
|
+
/**
|
|
86
|
+
* Map an {@link AudioFormat} string to the corresponding MIME type for the `Blob`
|
|
87
|
+
* used in the multipart upload. Defaults to `'audio/mpeg'` for unrecognized formats.
|
|
88
|
+
*
|
|
89
|
+
* @param format - Audio format string (e.g., `'wav'`, `'ogg'`).
|
|
90
|
+
* @returns MIME type string (e.g., `'audio/wav'`).
|
|
91
|
+
*/
|
|
92
|
+
private getMimeType;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=whisper.provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whisper.provider.d.ts","sourceRoot":"","sources":["../../../../src/services/speech/providers/whisper.provider.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EACV,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,KAAK,EAEN,MAAM,aAAa,CAAC;AAmBrB;;;;;;;;;GASG;AACH,qBAAa,eAAgB,YAAW,eAAe;IACrD,SAAgB,IAAI,oBAAoB;IACxC,SAAgB,WAAW,SAAS;IACpC,SAAgB,WAAW,QAAQ;IAEnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAEjC;;;;;;OAMG;gBACS,MAAM,EAAE,oBAAoB;IAexC;;;;;OAKG;IACH,YAAY,CAAC,QAAQ,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAOxE;;;;;;;;;;;;;;;;OAgBG;IACG,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAwH7E;;;;OAIG;IACH,SAAS,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAO7B;;;;;;;OAOG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IA2BrC;;;;;;OAMG;IACH,OAAO,CAAC,gBAAgB;IAaxB;;;;;;OAMG;IACH,OAAO,CAAC,WAAW;CAYpB"}
|