@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,240 @@
|
|
|
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 { JsonRpcErrorCode, McpError } from '../../../types-global/errors.js';
|
|
10
|
+
import { logger } from '../../../utils/internal/logger.js';
|
|
11
|
+
import { requestContextService } from '../../../utils/internal/requestContext.js';
|
|
12
|
+
import { fetchWithTimeout } from '../../../utils/network/fetchWithTimeout.js';
|
|
13
|
+
/**
|
|
14
|
+
* OpenAI Whisper STT provider.
|
|
15
|
+
* Implements {@link ISpeechProvider} for speech-to-text only (`supportsSTT = true`,
|
|
16
|
+
* `supportsTTS = false`). Submits audio to the OpenAI transcriptions endpoint via
|
|
17
|
+
* multipart form upload using `fetchWithTimeout`.
|
|
18
|
+
*
|
|
19
|
+
* Default model: `whisper-1`
|
|
20
|
+
* Default timeout: 60 000 ms (audio processing is slower than typical API calls)
|
|
21
|
+
* Maximum audio size: 25 MB (enforced locally before the network call)
|
|
22
|
+
*/
|
|
23
|
+
export class WhisperProvider {
|
|
24
|
+
name = 'openai-whisper';
|
|
25
|
+
supportsTTS = false;
|
|
26
|
+
supportsSTT = true;
|
|
27
|
+
apiKey;
|
|
28
|
+
baseUrl;
|
|
29
|
+
defaultModelId;
|
|
30
|
+
timeout;
|
|
31
|
+
/**
|
|
32
|
+
* Construct a WhisperProvider.
|
|
33
|
+
*
|
|
34
|
+
* @param config - Provider configuration. `config.apiKey` is required; other fields
|
|
35
|
+
* fall back to OpenAI API defaults.
|
|
36
|
+
* @throws {McpError} With `InvalidParams` if `config.apiKey` is absent.
|
|
37
|
+
*/
|
|
38
|
+
constructor(config) {
|
|
39
|
+
if (!config.apiKey) {
|
|
40
|
+
throw new McpError(JsonRpcErrorCode.InvalidParams, 'OpenAI API key is required');
|
|
41
|
+
}
|
|
42
|
+
this.apiKey = config.apiKey;
|
|
43
|
+
this.baseUrl = config.baseUrl ?? 'https://api.openai.com/v1';
|
|
44
|
+
this.defaultModelId = config.defaultModelId ?? 'whisper-1';
|
|
45
|
+
this.timeout = config.timeout ?? 60000; // Longer timeout for audio processing
|
|
46
|
+
logger.info(`OpenAI Whisper STT provider initialized: ${this.baseUrl}, model=${this.defaultModelId}`);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Not supported — Whisper is an STT-only provider.
|
|
50
|
+
*
|
|
51
|
+
* @param _options - Unused.
|
|
52
|
+
* @throws {McpError} Always, with `MethodNotFound`.
|
|
53
|
+
*/
|
|
54
|
+
textToSpeech(_options) {
|
|
55
|
+
throw new McpError(JsonRpcErrorCode.MethodNotFound, 'Text-to-speech is not supported by Whisper provider');
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Transcribe audio to text using the OpenAI Whisper API.
|
|
59
|
+
* Audio may be provided as a raw `Buffer` or a base64-encoded string. The data is
|
|
60
|
+
* submitted to `POST /audio/transcriptions` as multipart `FormData`. When
|
|
61
|
+
* `options.timestamps` is `true`, the request uses `verbose_json` format and requests
|
|
62
|
+
* word-level granularity, populating `result.words`.
|
|
63
|
+
*
|
|
64
|
+
* @param options - Transcription options. `options.audio` is required. Optional fields:
|
|
65
|
+
* `format` (determines MIME type/filename), `language` (ISO-639-1 hint),
|
|
66
|
+
* `modelId` (overrides provider default), `prompt` (style guide), `temperature`,
|
|
67
|
+
* and `timestamps` (enables word-level output).
|
|
68
|
+
* @returns Resolved {@link SpeechToTextResult} with `text`, optional `language`,
|
|
69
|
+
* `duration`, `words` (if timestamps were requested), and `metadata` containing
|
|
70
|
+
* `modelId`, `provider`, and `task`.
|
|
71
|
+
* @throws {McpError} With `InvalidParams` for missing audio, invalid base64, or audio > 25 MB.
|
|
72
|
+
* @throws {McpError} With `InternalError` if the Whisper API call fails.
|
|
73
|
+
*/
|
|
74
|
+
async speechToText(options) {
|
|
75
|
+
const context = requestContextService.createRequestContext({
|
|
76
|
+
operation: 'whisper-stt',
|
|
77
|
+
...(options.context ?? {}),
|
|
78
|
+
});
|
|
79
|
+
const modelId = options.modelId ?? this.defaultModelId;
|
|
80
|
+
logger.debug('Converting speech to text with Whisper', context);
|
|
81
|
+
// Validate audio input
|
|
82
|
+
if (!options.audio) {
|
|
83
|
+
throw new McpError(JsonRpcErrorCode.InvalidParams, 'Audio data is required', context);
|
|
84
|
+
}
|
|
85
|
+
// Convert audio to Buffer if it's a base64 string
|
|
86
|
+
let audioBuffer;
|
|
87
|
+
if (typeof options.audio === 'string') {
|
|
88
|
+
try {
|
|
89
|
+
audioBuffer = Buffer.from(options.audio, 'base64');
|
|
90
|
+
}
|
|
91
|
+
catch (_error) {
|
|
92
|
+
throw new McpError(JsonRpcErrorCode.InvalidParams, 'Invalid base64 audio data', context);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
audioBuffer = options.audio;
|
|
97
|
+
}
|
|
98
|
+
// Check file size (Whisper has a 25MB limit)
|
|
99
|
+
const maxSize = 25 * 1024 * 1024; // 25MB
|
|
100
|
+
if (audioBuffer.length > maxSize) {
|
|
101
|
+
throw new McpError(JsonRpcErrorCode.InvalidParams, `Audio file exceeds maximum size of 25MB (got ${Math.round(audioBuffer.length / 1024 / 1024)}MB)`, context);
|
|
102
|
+
}
|
|
103
|
+
const url = `${this.baseUrl}/audio/transcriptions`;
|
|
104
|
+
// Build form data
|
|
105
|
+
const formData = new FormData();
|
|
106
|
+
// Determine filename with appropriate extension
|
|
107
|
+
const extension = this.getFileExtension(options.format);
|
|
108
|
+
const blob = new Blob([audioBuffer], {
|
|
109
|
+
type: this.getMimeType(options.format),
|
|
110
|
+
});
|
|
111
|
+
formData.append('file', blob, `audio.${extension}`);
|
|
112
|
+
formData.append('model', modelId);
|
|
113
|
+
if (options.language) {
|
|
114
|
+
formData.append('language', options.language);
|
|
115
|
+
}
|
|
116
|
+
if (options.temperature !== undefined) {
|
|
117
|
+
formData.append('temperature', options.temperature.toString());
|
|
118
|
+
}
|
|
119
|
+
if (options.prompt) {
|
|
120
|
+
formData.append('prompt', options.prompt);
|
|
121
|
+
}
|
|
122
|
+
// Request verbose JSON format to get timestamps and metadata
|
|
123
|
+
formData.append('response_format', options.timestamps ? 'verbose_json' : 'json');
|
|
124
|
+
if (options.timestamps) {
|
|
125
|
+
formData.append('timestamp_granularities[]', 'word');
|
|
126
|
+
}
|
|
127
|
+
try {
|
|
128
|
+
const response = await fetchWithTimeout(url, this.timeout, context, {
|
|
129
|
+
method: 'POST',
|
|
130
|
+
headers: {
|
|
131
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
132
|
+
// Don't set Content-Type - let fetch set it with boundary for FormData
|
|
133
|
+
},
|
|
134
|
+
body: formData,
|
|
135
|
+
});
|
|
136
|
+
// fetchWithTimeout already throws McpError on non-ok responses
|
|
137
|
+
const data = (await response.json());
|
|
138
|
+
// Convert word timestamps if present
|
|
139
|
+
const words = data.words?.map((w) => ({
|
|
140
|
+
word: w.word,
|
|
141
|
+
start: w.start,
|
|
142
|
+
end: w.end,
|
|
143
|
+
}));
|
|
144
|
+
logger.info(`Speech-to-text transcription successful (${data.text.length} chars)`, context);
|
|
145
|
+
return {
|
|
146
|
+
text: data.text,
|
|
147
|
+
...(data.language !== undefined && { language: data.language }),
|
|
148
|
+
...(data.duration !== undefined && { duration: data.duration }),
|
|
149
|
+
...(words !== undefined && { words }),
|
|
150
|
+
metadata: {
|
|
151
|
+
modelId,
|
|
152
|
+
provider: this.name,
|
|
153
|
+
...(data.task !== undefined && { task: data.task }),
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
if (error instanceof McpError) {
|
|
159
|
+
throw error;
|
|
160
|
+
}
|
|
161
|
+
logger.error('Failed to transcribe audio', error instanceof Error ? error : new Error(String(error)), context);
|
|
162
|
+
throw new McpError(JsonRpcErrorCode.InternalError, `Failed to transcribe audio: ${error instanceof Error ? error.message : 'Unknown error'}`, context);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Not applicable — Whisper is an STT-only provider with no voice concept.
|
|
167
|
+
*
|
|
168
|
+
* @throws {McpError} Always, with `MethodNotFound`.
|
|
169
|
+
*/
|
|
170
|
+
getVoices() {
|
|
171
|
+
throw new McpError(JsonRpcErrorCode.MethodNotFound, 'Voice listing is not supported by Whisper provider (STT only)');
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Verify OpenAI API connectivity by fetching the models list (`GET /models`).
|
|
175
|
+
* Uses a 5-second timeout regardless of the provider's configured `timeout`,
|
|
176
|
+
* to keep health checks lightweight.
|
|
177
|
+
*
|
|
178
|
+
* @returns `true` if the models endpoint responds with HTTP 200, `false` otherwise.
|
|
179
|
+
* Never rejects.
|
|
180
|
+
*/
|
|
181
|
+
async healthCheck() {
|
|
182
|
+
try {
|
|
183
|
+
// Simple health check: verify API key by making a models list request
|
|
184
|
+
const context = requestContextService.createRequestContext({
|
|
185
|
+
operation: 'whisper-healthCheck',
|
|
186
|
+
});
|
|
187
|
+
const response = await fetchWithTimeout(`${this.baseUrl}/models`, 5000, context, {
|
|
188
|
+
method: 'GET',
|
|
189
|
+
headers: {
|
|
190
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
191
|
+
},
|
|
192
|
+
});
|
|
193
|
+
return response.ok;
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
const context = requestContextService.createRequestContext({
|
|
197
|
+
operation: 'whisper-healthCheck',
|
|
198
|
+
});
|
|
199
|
+
logger.error('Whisper health check failed', error instanceof Error ? error : new Error(String(error)), context);
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Map an {@link AudioFormat} string to a file extension for the multipart upload filename.
|
|
205
|
+
* Defaults to `'mp3'` for unrecognized or absent formats.
|
|
206
|
+
*
|
|
207
|
+
* @param format - Audio format string (e.g., `'wav'`, `'ogg'`).
|
|
208
|
+
* @returns File extension without leading dot (e.g., `'wav'`).
|
|
209
|
+
*/
|
|
210
|
+
getFileExtension(format) {
|
|
211
|
+
const formatMap = {
|
|
212
|
+
mp3: 'mp3',
|
|
213
|
+
wav: 'wav',
|
|
214
|
+
ogg: 'ogg',
|
|
215
|
+
flac: 'flac',
|
|
216
|
+
webm: 'webm',
|
|
217
|
+
m4a: 'm4a',
|
|
218
|
+
};
|
|
219
|
+
return format && formatMap[format] ? formatMap[format] : 'mp3';
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Map an {@link AudioFormat} string to the corresponding MIME type for the `Blob`
|
|
223
|
+
* used in the multipart upload. Defaults to `'audio/mpeg'` for unrecognized formats.
|
|
224
|
+
*
|
|
225
|
+
* @param format - Audio format string (e.g., `'wav'`, `'ogg'`).
|
|
226
|
+
* @returns MIME type string (e.g., `'audio/wav'`).
|
|
227
|
+
*/
|
|
228
|
+
getMimeType(format) {
|
|
229
|
+
const mimeMap = {
|
|
230
|
+
mp3: 'audio/mpeg',
|
|
231
|
+
wav: 'audio/wav',
|
|
232
|
+
ogg: 'audio/ogg',
|
|
233
|
+
flac: 'audio/flac',
|
|
234
|
+
webm: 'audio/webm',
|
|
235
|
+
m4a: 'audio/mp4',
|
|
236
|
+
};
|
|
237
|
+
return format && mimeMap[format] ? mimeMap[format] : 'audio/mpeg';
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=whisper.provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whisper.provider.js","sourceRoot":"","sources":["../../../../src/services/speech/providers/whisper.provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Type definitions for the Speech service.
|
|
3
|
+
* Provides shared interfaces and types for Text-to-Speech (TTS) and Speech-to-Text (STT)
|
|
4
|
+
* operations across all speech provider implementations.
|
|
5
|
+
* @module src/services/speech/types
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Supported audio formats for speech operations.
|
|
9
|
+
* - `mp3` — MPEG Audio Layer III, widely compatible
|
|
10
|
+
* - `wav` — Waveform Audio, uncompressed PCM
|
|
11
|
+
* - `ogg` — Ogg Vorbis container
|
|
12
|
+
* - `flac` — Free Lossless Audio Codec
|
|
13
|
+
* - `pcm` — Raw pulse-code modulation samples
|
|
14
|
+
* - `webm` — WebM container (typically Opus codec)
|
|
15
|
+
*/
|
|
16
|
+
export type AudioFormat = 'mp3' | 'wav' | 'ogg' | 'flac' | 'pcm' | 'webm';
|
|
17
|
+
/**
|
|
18
|
+
* Voice settings for text-to-speech synthesis.
|
|
19
|
+
*/
|
|
20
|
+
export interface VoiceSettings {
|
|
21
|
+
/** Voice pitch (-20.0 to 20.0, where 0 is normal) */
|
|
22
|
+
pitch?: number;
|
|
23
|
+
/** Similarity boost (0.0 to 1.0, provider-specific) */
|
|
24
|
+
similarityBoost?: number;
|
|
25
|
+
/** Speech rate/speed (0.5 to 2.0, where 1.0 is normal) */
|
|
26
|
+
speed?: number;
|
|
27
|
+
/** Stability setting (0.0 to 1.0, provider-specific) */
|
|
28
|
+
stability?: number;
|
|
29
|
+
/** Style exaggeration (0.0 to 1.0, provider-specific) */
|
|
30
|
+
style?: number;
|
|
31
|
+
/** Voice ID or name (provider-specific) */
|
|
32
|
+
voiceId?: string;
|
|
33
|
+
/** Volume level (0.0 to 1.0) */
|
|
34
|
+
volume?: number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Options for text-to-speech synthesis.
|
|
38
|
+
*/
|
|
39
|
+
export interface TextToSpeechOptions {
|
|
40
|
+
/** Optional context for request tracing */
|
|
41
|
+
context?: {
|
|
42
|
+
requestId?: string;
|
|
43
|
+
traceId?: string;
|
|
44
|
+
tenantId?: string;
|
|
45
|
+
};
|
|
46
|
+
/** Output audio format */
|
|
47
|
+
format?: AudioFormat;
|
|
48
|
+
/** Language code (e.g., 'en-US', 'es-ES') */
|
|
49
|
+
language?: string;
|
|
50
|
+
/** Model ID (provider-specific) */
|
|
51
|
+
modelId?: string;
|
|
52
|
+
/** Text to convert to speech */
|
|
53
|
+
text: string;
|
|
54
|
+
/** Voice settings */
|
|
55
|
+
voice?: VoiceSettings;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Result from text-to-speech synthesis.
|
|
59
|
+
*/
|
|
60
|
+
export interface TextToSpeechResult {
|
|
61
|
+
/** Audio data as Buffer or base64 string */
|
|
62
|
+
audio: Buffer | string;
|
|
63
|
+
/** Character count of input text */
|
|
64
|
+
characterCount: number;
|
|
65
|
+
/** Duration in seconds (if available) */
|
|
66
|
+
duration?: number;
|
|
67
|
+
/** Audio format */
|
|
68
|
+
format: AudioFormat;
|
|
69
|
+
/** Provider-specific metadata */
|
|
70
|
+
metadata?: Record<string, unknown>;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Options for speech-to-text transcription.
|
|
74
|
+
*/
|
|
75
|
+
export interface SpeechToTextOptions {
|
|
76
|
+
/** Audio data as Buffer or base64 string */
|
|
77
|
+
audio: Buffer | string;
|
|
78
|
+
/** Optional context for request tracing */
|
|
79
|
+
context?: {
|
|
80
|
+
requestId?: string;
|
|
81
|
+
traceId?: string;
|
|
82
|
+
tenantId?: string;
|
|
83
|
+
};
|
|
84
|
+
/** Audio format */
|
|
85
|
+
format?: AudioFormat;
|
|
86
|
+
/** Language code hint (e.g., 'en', 'es') */
|
|
87
|
+
language?: string;
|
|
88
|
+
/** Model ID (provider-specific) */
|
|
89
|
+
modelId?: string;
|
|
90
|
+
/** Prompt to guide transcription style */
|
|
91
|
+
prompt?: string;
|
|
92
|
+
/** Temperature for sampling (0.0 to 1.0) */
|
|
93
|
+
temperature?: number;
|
|
94
|
+
/** Enable word-level timestamps */
|
|
95
|
+
timestamps?: boolean;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Word-level timestamp information.
|
|
99
|
+
*/
|
|
100
|
+
export interface WordTimestamp {
|
|
101
|
+
/** Confidence score (0.0 to 1.0) */
|
|
102
|
+
confidence?: number;
|
|
103
|
+
/** End time in seconds */
|
|
104
|
+
end: number;
|
|
105
|
+
/** Start time in seconds */
|
|
106
|
+
start: number;
|
|
107
|
+
/** The word or token */
|
|
108
|
+
word: string;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Result from speech-to-text transcription.
|
|
112
|
+
*/
|
|
113
|
+
export interface SpeechToTextResult {
|
|
114
|
+
/** Overall confidence score (0.0 to 1.0) */
|
|
115
|
+
confidence?: number;
|
|
116
|
+
/** Duration in seconds */
|
|
117
|
+
duration?: number;
|
|
118
|
+
/** Detected language code */
|
|
119
|
+
language?: string;
|
|
120
|
+
/** Provider-specific metadata */
|
|
121
|
+
metadata?: Record<string, unknown>;
|
|
122
|
+
/** Transcribed text */
|
|
123
|
+
text: string;
|
|
124
|
+
/** Word-level timestamps (if requested) */
|
|
125
|
+
words?: WordTimestamp[];
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Available voices from a provider.
|
|
129
|
+
*/
|
|
130
|
+
export interface Voice {
|
|
131
|
+
/** Voice category (e.g., 'premade', 'cloned', 'professional') */
|
|
132
|
+
category?: string;
|
|
133
|
+
/** Voice description */
|
|
134
|
+
description?: string;
|
|
135
|
+
/** Gender (if applicable) */
|
|
136
|
+
gender?: 'male' | 'female' | 'neutral';
|
|
137
|
+
/** Voice ID */
|
|
138
|
+
id: string;
|
|
139
|
+
/** Language codes supported */
|
|
140
|
+
languages?: string[];
|
|
141
|
+
/** Provider-specific metadata */
|
|
142
|
+
metadata?: Record<string, unknown>;
|
|
143
|
+
/** Voice name */
|
|
144
|
+
name: string;
|
|
145
|
+
/** Preview URL (if available) */
|
|
146
|
+
previewUrl?: string;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Configuration for speech service providers.
|
|
150
|
+
* Passed to `createSpeechProvider` to instantiate the appropriate provider.
|
|
151
|
+
*/
|
|
152
|
+
export interface SpeechProviderConfig {
|
|
153
|
+
/** API key for authenticating with the provider's API */
|
|
154
|
+
apiKey?: string;
|
|
155
|
+
/** Base URL override; defaults to the provider's public API endpoint */
|
|
156
|
+
baseUrl?: string;
|
|
157
|
+
/** Default model ID to use when none is specified per-request */
|
|
158
|
+
defaultModelId?: string;
|
|
159
|
+
/** Default voice ID for TTS when none is specified per-request */
|
|
160
|
+
defaultVoiceId?: string;
|
|
161
|
+
/** Additional provider-specific options passed through as-is */
|
|
162
|
+
options?: Record<string, unknown>;
|
|
163
|
+
/**
|
|
164
|
+
* Provider implementation to use.
|
|
165
|
+
* - `'elevenlabs'` — ElevenLabs TTS (no STT)
|
|
166
|
+
* - `'openai-whisper'` — OpenAI Whisper STT (no TTS)
|
|
167
|
+
* - `'mock'` — Not yet implemented; throws on instantiation
|
|
168
|
+
*/
|
|
169
|
+
provider: 'elevenlabs' | 'openai-whisper' | 'mock';
|
|
170
|
+
/** Request timeout in milliseconds (provider defaults vary) */
|
|
171
|
+
timeout?: number;
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/speech/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Type definitions for the Speech service.
|
|
3
|
+
* Provides shared interfaces and types for Text-to-Speech (TTS) and Speech-to-Text (STT)
|
|
4
|
+
* operations across all speech provider implementations.
|
|
5
|
+
* @module src/services/speech/types
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/services/speech/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Defines the core interface for a generic storage provider.
|
|
3
|
+
* This contract ensures that any storage implementation (e.g., in-memory, filesystem, database)
|
|
4
|
+
* can be used interchangeably throughout the application.
|
|
5
|
+
* @module src/storage/core/IStorageProvider
|
|
6
|
+
*/
|
|
7
|
+
import type { RequestContext } from '../../utils/internal/requestContext.js';
|
|
8
|
+
/**
|
|
9
|
+
* Options for storage operations.
|
|
10
|
+
*
|
|
11
|
+
* @property ttl - Time-to-live for the stored item, in seconds. If not provided, the item is stored indefinitely.
|
|
12
|
+
* Provider-specific behaviors:
|
|
13
|
+
* - `in-memory`: TTL enforced by `setTimeout` for proactive deletion.
|
|
14
|
+
* - `filesystem`: TTL stored in a metadata envelope; expired items are filtered on `get()` and `list()`.
|
|
15
|
+
* - `supabase`: TTL managed via an `expires_at` column; expired rows are handled by database queries.
|
|
16
|
+
* - `cloudflare-kv`: TTL is a native feature of the KV store.
|
|
17
|
+
* - `cloudflare-r2`: TTL stored in a metadata envelope; expired items are filtered on `get()`. `list()` does not filter expired items due to performance cost.
|
|
18
|
+
*/
|
|
19
|
+
export interface StorageOptions {
|
|
20
|
+
/**
|
|
21
|
+
* Time-to-live for the stored item, in seconds.
|
|
22
|
+
* If not provided, the item will be stored indefinitely.
|
|
23
|
+
*/
|
|
24
|
+
ttl?: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Options for list operations with pagination support.
|
|
28
|
+
*
|
|
29
|
+
* @property limit - Maximum number of keys to return per page. If not provided, returns all keys.
|
|
30
|
+
* @property cursor - Opaque cursor for pagination. Provider-specific format.
|
|
31
|
+
*/
|
|
32
|
+
export interface ListOptions {
|
|
33
|
+
/**
|
|
34
|
+
* Pagination cursor from a previous list operation.
|
|
35
|
+
* Format is provider-specific (opaque string).
|
|
36
|
+
*/
|
|
37
|
+
cursor?: string;
|
|
38
|
+
/**
|
|
39
|
+
* Maximum number of keys to return. Defaults to provider-specific limit.
|
|
40
|
+
*/
|
|
41
|
+
limit?: number;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Result of a list operation with pagination support.
|
|
45
|
+
*
|
|
46
|
+
* @property keys - Array of matching keys.
|
|
47
|
+
* @property nextCursor - Cursor for the next page, or undefined if no more results.
|
|
48
|
+
*/
|
|
49
|
+
export interface ListResult {
|
|
50
|
+
/**
|
|
51
|
+
* Array of keys matching the prefix.
|
|
52
|
+
*/
|
|
53
|
+
keys: string[];
|
|
54
|
+
/**
|
|
55
|
+
* Cursor for fetching the next page of results.
|
|
56
|
+
* Undefined if there are no more results.
|
|
57
|
+
*/
|
|
58
|
+
nextCursor?: string | undefined;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Defines the contract for a generic storage provider.
|
|
62
|
+
* All methods must be asynchronous and accept a RequestContext for tracing and logging.
|
|
63
|
+
*/
|
|
64
|
+
export interface IStorageProvider {
|
|
65
|
+
/**
|
|
66
|
+
* Clears all keys for a given tenant.
|
|
67
|
+
* WARNING: This is a destructive operation that cannot be undone.
|
|
68
|
+
* Useful for testing or tenant cleanup operations.
|
|
69
|
+
* @param tenantId The unique identifier for the tenant.
|
|
70
|
+
* @param context The request context for logging and tracing.
|
|
71
|
+
* @returns A promise that resolves to the number of keys deleted.
|
|
72
|
+
*/
|
|
73
|
+
clear(tenantId: string, context: RequestContext): Promise<number>;
|
|
74
|
+
/**
|
|
75
|
+
* Deletes a value from the storage.
|
|
76
|
+
* @param key The unique key for the item to delete.
|
|
77
|
+
* @param context The request context for logging and tracing.
|
|
78
|
+
* @returns A promise that resolves to true if the item was deleted, false if not found.
|
|
79
|
+
*/
|
|
80
|
+
delete(tenantId: string, key: string, context: RequestContext): Promise<boolean>;
|
|
81
|
+
/**
|
|
82
|
+
* Deletes multiple keys in a single operation.
|
|
83
|
+
* More efficient than multiple individual delete() calls.
|
|
84
|
+
*
|
|
85
|
+
* Performance characteristics by provider:
|
|
86
|
+
* - Cloudflare KV/R2: Parallel deletes (fast)
|
|
87
|
+
* - Supabase: Single SQL DELETE with IN clause (fast, database-optimized)
|
|
88
|
+
* - In-Memory: Parallel Map deletes (fastest, no I/O)
|
|
89
|
+
* - FileSystem: Parallel file deletes (I/O bound, benefits from concurrency)
|
|
90
|
+
*
|
|
91
|
+
* @param tenantId The unique identifier for the tenant.
|
|
92
|
+
* @param keys Array of keys to delete. Empty array returns 0.
|
|
93
|
+
* @param context The request context for logging and tracing.
|
|
94
|
+
* @returns A promise that resolves to the number of keys successfully deleted.
|
|
95
|
+
*/
|
|
96
|
+
deleteMany(tenantId: string, keys: string[], context: RequestContext): Promise<number>;
|
|
97
|
+
/**
|
|
98
|
+
* Retrieves a value from the storage.
|
|
99
|
+
* @param tenantId The unique identifier for the tenant.
|
|
100
|
+
* @param key The unique key for the item.
|
|
101
|
+
* @param context The request context for logging and tracing.
|
|
102
|
+
* @returns A promise that resolves to the stored value, or null if not found.
|
|
103
|
+
*/
|
|
104
|
+
get<T>(tenantId: string, key: string, context: RequestContext): Promise<T | null>;
|
|
105
|
+
/**
|
|
106
|
+
* Retrieves multiple values from storage in a single operation.
|
|
107
|
+
* More efficient than multiple individual get() calls.
|
|
108
|
+
*
|
|
109
|
+
* Performance characteristics by provider:
|
|
110
|
+
* - Cloudflare KV/R2: Parallel fetches (fast for large batches)
|
|
111
|
+
* - Supabase: Single SQL query with IN clause (fast, database-optimized)
|
|
112
|
+
* - In-Memory: Parallel Map lookups (fastest, no I/O)
|
|
113
|
+
* - FileSystem: Parallel file reads (I/O bound, benefits from concurrency)
|
|
114
|
+
*
|
|
115
|
+
* @param tenantId The unique identifier for the tenant.
|
|
116
|
+
* @param keys Array of keys to retrieve. Empty array returns empty Map.
|
|
117
|
+
* @param context The request context for logging and tracing.
|
|
118
|
+
* @returns A promise that resolves to a Map of key-value pairs. Missing keys are not included.
|
|
119
|
+
*/
|
|
120
|
+
getMany<T>(tenantId: string, keys: string[], context: RequestContext): Promise<Map<string, T>>;
|
|
121
|
+
/**
|
|
122
|
+
* Lists all keys that match a given prefix.
|
|
123
|
+
* Note: This may be an expensive operation on some backends.
|
|
124
|
+
* TTL Behavior: This operation may or may not filter expired keys depending on the provider's capabilities.
|
|
125
|
+
* Refer to `StorageOptions` for provider-specific TTL documentation.
|
|
126
|
+
* @param prefix The prefix to match keys against.
|
|
127
|
+
* @param context The request context for logging and tracing.
|
|
128
|
+
* @param options Optional pagination settings.
|
|
129
|
+
* @returns A promise that resolves to a ListResult with keys and optional pagination cursor.
|
|
130
|
+
*/
|
|
131
|
+
list(tenantId: string, prefix: string, context: RequestContext, options?: ListOptions): Promise<ListResult>;
|
|
132
|
+
/**
|
|
133
|
+
* Stores a value in the storage.
|
|
134
|
+
* @param key The unique key for the item.
|
|
135
|
+
* @param value The value to store. Can be any serializable object.
|
|
136
|
+
* @param context The request context for logging and tracing.
|
|
137
|
+
* @param options Optional settings like TTL.
|
|
138
|
+
* @returns A promise that resolves when the operation is complete.
|
|
139
|
+
*/
|
|
140
|
+
set(tenantId: string, key: string, value: unknown, context: RequestContext, options?: StorageOptions): Promise<void>;
|
|
141
|
+
/**
|
|
142
|
+
* Stores multiple values in a single operation.
|
|
143
|
+
* More efficient than multiple individual set() calls.
|
|
144
|
+
*
|
|
145
|
+
* Performance characteristics by provider:
|
|
146
|
+
* - Cloudflare KV/R2: Parallel writes (fast, eventually consistent)
|
|
147
|
+
* - Supabase: Single SQL batch upsert (fast, immediately consistent)
|
|
148
|
+
* - In-Memory: Parallel Map inserts (fastest, no I/O)
|
|
149
|
+
* - FileSystem: Parallel file writes (I/O bound, benefits from concurrency)
|
|
150
|
+
*
|
|
151
|
+
* @param tenantId The unique identifier for the tenant.
|
|
152
|
+
* @param entries Map of key-value pairs to store. Empty map is a no-op.
|
|
153
|
+
* @param context The request context for logging and tracing.
|
|
154
|
+
* @param options Optional settings like TTL (applied to all entries).
|
|
155
|
+
* @returns A promise that resolves when all operations are complete.
|
|
156
|
+
*/
|
|
157
|
+
setMany(tenantId: string, entries: Map<string, unknown>, context: RequestContext, options?: StorageOptions): Promise<void>;
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=IStorageProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IStorageProvider.d.ts","sourceRoot":"","sources":["../../../src/storage/core/IStorageProvider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE;;;;;;;;;;GAUG;AACH,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,IAAI,EAAE,MAAM,EAAE,CAAC;IACf;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;;;OAOG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAElE;;;;;OAKG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEjF;;;;;;;;;;;;;;OAcG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvF;;;;;;OAMG;IACH,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAElF;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;IAE/F;;;;;;;;;OASG;IACH,IAAI,CACF,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,cAAc,EACvB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,UAAU,CAAC,CAAC;IAEvB;;;;;;;OAOG;IACH,GAAG,CACD,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,cAAc,EACvB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CACL,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,cAAc,EACvB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IStorageProvider.js","sourceRoot":"","sources":["../../../src/storage/core/IStorageProvider.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Provides a singleton service for interacting with the application's storage layer.
|
|
3
|
+
* This service acts as a proxy to the configured storage provider, ensuring a consistent
|
|
4
|
+
* interface for all storage operations throughout the application. It receives its concrete
|
|
5
|
+
* provider via dependency injection.
|
|
6
|
+
* @module src/storage/core/StorageService
|
|
7
|
+
*/
|
|
8
|
+
import type { IStorageProvider, ListOptions, ListResult, StorageOptions } from '../../storage/core/IStorageProvider.js';
|
|
9
|
+
import type { RequestContext } from '../../utils/internal/requestContext.js';
|
|
10
|
+
export declare class StorageService {
|
|
11
|
+
private provider;
|
|
12
|
+
constructor(provider: IStorageProvider);
|
|
13
|
+
get<T>(key: string, context: RequestContext): Promise<T | null>;
|
|
14
|
+
set(key: string, value: unknown, context: RequestContext, options?: StorageOptions): Promise<void>;
|
|
15
|
+
delete(key: string, context: RequestContext): Promise<boolean>;
|
|
16
|
+
list(prefix: string, context: RequestContext, options?: ListOptions): Promise<ListResult>;
|
|
17
|
+
getMany<T>(keys: string[], context: RequestContext): Promise<Map<string, T>>;
|
|
18
|
+
setMany(entries: Map<string, unknown>, context: RequestContext, options?: StorageOptions): Promise<void>;
|
|
19
|
+
deleteMany(keys: string[], context: RequestContext): Promise<number>;
|
|
20
|
+
clear(context: RequestContext): Promise<number>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=StorageService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StorageService.d.ts","sourceRoot":"","sources":["../../../src/storage/core/StorageService.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,WAAW,EACX,UAAU,EACV,cAAc,EACf,MAAM,oCAAoC,CAAC;AAU5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAsCzE,qBAAa,cAAc;IACb,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,gBAAgB;IAK9C,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAc/D,GAAG,CACD,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,cAAc,EACvB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC;IAiBhB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAc9D,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAiBzF,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAiB5E,OAAO,CACL,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,cAAc,EACvB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC;IAoBhB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBpE,KAAK,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;CAWhD"}
|