@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,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Runtime capability detection for multi-environment support.
|
|
3
|
+
* Detects presence of Node features, Web/Workers APIs, and common globals.
|
|
4
|
+
* @module src/utils/internal/runtime
|
|
5
|
+
*/
|
|
6
|
+
// Best-effort static detection without throwing in restricted envs
|
|
7
|
+
const safeHas = (key) => {
|
|
8
|
+
try {
|
|
9
|
+
// @ts-expect-error index access on globalThis
|
|
10
|
+
return typeof globalThis[key] !== 'undefined';
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Safely checks if process.versions.node exists and is a string.
|
|
18
|
+
* Uses try-catch to handle environments where property access might be restricted.
|
|
19
|
+
*/
|
|
20
|
+
const hasNodeVersion = () => {
|
|
21
|
+
try {
|
|
22
|
+
return (typeof process !== 'undefined' &&
|
|
23
|
+
typeof process.versions === 'object' &&
|
|
24
|
+
process.versions !== null &&
|
|
25
|
+
typeof process.versions.node === 'string');
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Safely checks if globalThis.performance.now is a function.
|
|
33
|
+
* Uses try-catch to handle environments where property access might be restricted.
|
|
34
|
+
*/
|
|
35
|
+
const hasPerformanceNowFunction = () => {
|
|
36
|
+
try {
|
|
37
|
+
const perf = globalThis.performance;
|
|
38
|
+
return typeof perf === 'object' && perf !== null && typeof perf.now === 'function';
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
const isNode = hasNodeVersion();
|
|
45
|
+
const isBun = isNode && typeof process?.versions?.bun === 'string';
|
|
46
|
+
const hasProcess = typeof process !== 'undefined';
|
|
47
|
+
const hasBuffer = typeof Buffer !== 'undefined';
|
|
48
|
+
const hasTextEncoder = safeHas('TextEncoder');
|
|
49
|
+
const hasPerformanceNow = hasPerformanceNowFunction();
|
|
50
|
+
/**
|
|
51
|
+
* Safely checks if WorkerGlobalScope exists.
|
|
52
|
+
* Cloudflare Workers and other worker environments expose this.
|
|
53
|
+
*/
|
|
54
|
+
const hasWorkerGlobalScope = () => {
|
|
55
|
+
try {
|
|
56
|
+
return 'WorkerGlobalScope' in globalThis;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
// Cloudflare Workers expose "Web Worker"-like environment (self, caches, fetch, etc.)
|
|
63
|
+
const isWorkerLike = !isNode && hasWorkerGlobalScope();
|
|
64
|
+
const isBrowserLike = !isNode && !isWorkerLike && safeHas('window');
|
|
65
|
+
/**
|
|
66
|
+
* Singleton snapshot of runtime capabilities for the current environment.
|
|
67
|
+
* Computed once at module load; safe to read at any time without async.
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* ```typescript
|
|
71
|
+
* import { runtimeCaps } from './runtime.js';
|
|
72
|
+
*
|
|
73
|
+
* if (runtimeCaps.hasBuffer) {
|
|
74
|
+
* // Node.js / Bun path — use Buffer for encoding
|
|
75
|
+
* } else {
|
|
76
|
+
* // Worker / browser path — use Web APIs
|
|
77
|
+
* }
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
export const runtimeCaps = {
|
|
81
|
+
isNode,
|
|
82
|
+
isBun,
|
|
83
|
+
isWorkerLike,
|
|
84
|
+
isBrowserLike,
|
|
85
|
+
hasProcess,
|
|
86
|
+
hasBuffer,
|
|
87
|
+
hasTextEncoder,
|
|
88
|
+
hasPerformanceNow,
|
|
89
|
+
};
|
|
90
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/utils/internal/runtime.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA8BH,mEAAmE;AACnE,MAAM,OAAO,GAAG,CAAC,GAAW,EAAW,EAAE;IACvC,IAAI,CAAC;QACH,8CAA8C;QAC9C,OAAO,OAAO,UAAU,CAAC,GAAG,CAAC,KAAK,WAAW,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,cAAc,GAAG,GAAY,EAAE;IACnC,IAAI,CAAC;QACH,OAAO,CACL,OAAO,OAAO,KAAK,WAAW;YAC9B,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ;YACpC,OAAO,CAAC,QAAQ,KAAK,IAAI;YACzB,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAC1C,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,yBAAyB,GAAG,GAAY,EAAE;IAC9C,IAAI,CAAC;QACH,MAAM,IAAI,GAAI,UAAkD,CAAC,WAAW,CAAC;QAC7E,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,UAAU,CAAC;IACrF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;AAChC,MAAM,KAAK,GAAG,MAAM,IAAI,OAAO,OAAO,EAAE,QAAQ,EAAE,GAAG,KAAK,QAAQ,CAAC;AACnE,MAAM,UAAU,GAAG,OAAO,OAAO,KAAK,WAAW,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,MAAM,KAAK,WAAW,CAAC;AAChD,MAAM,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AAC9C,MAAM,iBAAiB,GAAG,yBAAyB,EAAE,CAAC;AAEtD;;;GAGG;AACH,MAAM,oBAAoB,GAAG,GAAY,EAAE;IACzC,IAAI,CAAC;QACH,OAAO,mBAAmB,IAAI,UAAU,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAEF,sFAAsF;AACtF,MAAM,YAAY,GAAG,CAAC,MAAM,IAAI,oBAAoB,EAAE,CAAC;AACvD,MAAM,aAAa,GAAG,CAAC,MAAM,IAAI,CAAC,YAAY,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEpE;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,WAAW,GAAwB;IAC9C,MAAM;IACN,KAAK;IACL,YAAY;IACZ,aAAa;IACb,UAAU;IACV,SAAS;IACT,cAAc;IACd,iBAAiB;CAClB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Utility for displaying startup banners in TTY environments.
|
|
3
|
+
* Provides a centralized way to show user-facing messages during server initialization
|
|
4
|
+
* while preventing output pollution in non-interactive environments (CI, pipes, STDIO transport).
|
|
5
|
+
* @module src/utils/internal/startupBanner
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Displays a startup banner message to the console only if running in a TTY environment.
|
|
9
|
+
* This prevents polluting STDIO transport, piped output, or CI/CD logs.
|
|
10
|
+
*
|
|
11
|
+
* In STDIO mode, the banner is written to stderr to avoid polluting stdout, which is
|
|
12
|
+
* reserved for MCP JSON-RPC protocol messages.
|
|
13
|
+
*
|
|
14
|
+
* @param message - The banner message to display
|
|
15
|
+
* @param transportType - The transport type ('stdio' or 'http'). If 'stdio', uses stderr.
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* logStartupBanner('🚀 MCP Server running at: http://localhost:3010', 'http');
|
|
19
|
+
* logStartupBanner('🚀 MCP Server running in STDIO mode', 'stdio');
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export declare function logStartupBanner(message: string, transportType?: 'stdio' | 'http'): void;
|
|
23
|
+
//# sourceMappingURL=startupBanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"startupBanner.d.ts","sourceRoot":"","sources":["../../../src/utils/internal/startupBanner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAUxF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Utility for displaying startup banners in TTY environments.
|
|
3
|
+
* Provides a centralized way to show user-facing messages during server initialization
|
|
4
|
+
* while preventing output pollution in non-interactive environments (CI, pipes, STDIO transport).
|
|
5
|
+
* @module src/utils/internal/startupBanner
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Displays a startup banner message to the console only if running in a TTY environment.
|
|
9
|
+
* This prevents polluting STDIO transport, piped output, or CI/CD logs.
|
|
10
|
+
*
|
|
11
|
+
* In STDIO mode, the banner is written to stderr to avoid polluting stdout, which is
|
|
12
|
+
* reserved for MCP JSON-RPC protocol messages.
|
|
13
|
+
*
|
|
14
|
+
* @param message - The banner message to display
|
|
15
|
+
* @param transportType - The transport type ('stdio' or 'http'). If 'stdio', uses stderr.
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* logStartupBanner('🚀 MCP Server running at: http://localhost:3010', 'http');
|
|
19
|
+
* logStartupBanner('🚀 MCP Server running in STDIO mode', 'stdio');
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export function logStartupBanner(message, transportType) {
|
|
23
|
+
// Guard against environments where process.stdout may not exist (e.g. Cloudflare Workers)
|
|
24
|
+
if (typeof process === 'undefined' || !process.stdout?.isTTY)
|
|
25
|
+
return;
|
|
26
|
+
// In STDIO mode, use stderr to avoid polluting stdout (which is reserved for MCP JSON-RPC)
|
|
27
|
+
if (transportType === 'stdio') {
|
|
28
|
+
console.error(message);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
console.log(message);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=startupBanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"startupBanner.js","sourceRoot":"","sources":["../../../src/utils/internal/startupBanner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,aAAgC;IAChF,0FAA0F;IAC1F,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK;QAAE,OAAO;IAErE,2FAA2F;IAC3F,IAAI,aAAa,KAAK,OAAO,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import type { RequestContext } from '../../utils/internal/requestContext.js';
|
|
2
|
+
/**
|
|
3
|
+
* Minimal chat message shape used for token counting, intentionally provider-agnostic.
|
|
4
|
+
* Covers the common subset of OpenAI-style chat message fields without depending on
|
|
5
|
+
* any specific SDK types.
|
|
6
|
+
*/
|
|
7
|
+
export type ChatMessage = {
|
|
8
|
+
/** The message author role (e.g. `'user'`, `'assistant'`, `'tool'`, `'system'`). */
|
|
9
|
+
role: string;
|
|
10
|
+
/**
|
|
11
|
+
* Message body. Either a plain string, a multi-part content array (e.g. for vision
|
|
12
|
+
* or tool-result messages), or `null` when the assistant emits tool calls with no
|
|
13
|
+
* accompanying text.
|
|
14
|
+
*/
|
|
15
|
+
content: string | Array<{
|
|
16
|
+
type: string;
|
|
17
|
+
text?: string;
|
|
18
|
+
[k: string]: unknown;
|
|
19
|
+
}> | null;
|
|
20
|
+
/** Optional display name; when present, adds `tokensPerName` overhead per model heuristics. */
|
|
21
|
+
name?: string;
|
|
22
|
+
/**
|
|
23
|
+
* Tool calls emitted by an `assistant` message. Only `function`-type calls are counted;
|
|
24
|
+
* the function name and serialized arguments each contribute to the token total.
|
|
25
|
+
*/
|
|
26
|
+
tool_calls?: Array<{
|
|
27
|
+
id?: string;
|
|
28
|
+
type?: string;
|
|
29
|
+
function?: {
|
|
30
|
+
name?: string;
|
|
31
|
+
arguments?: string;
|
|
32
|
+
};
|
|
33
|
+
}> | null;
|
|
34
|
+
/** Tool result correlation ID present on `tool` role messages. Counted as plain text. */
|
|
35
|
+
tool_call_id?: string | null;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Heuristic parameters that control how tokens are estimated for a specific model.
|
|
39
|
+
* Add entries to the internal `HEURISTICS` map to calibrate per-model behavior.
|
|
40
|
+
*/
|
|
41
|
+
export interface ModelHeuristics {
|
|
42
|
+
/** Average number of characters per token. ~4 for English prose on most GPT-family models. */
|
|
43
|
+
charsPerToken: number;
|
|
44
|
+
/**
|
|
45
|
+
* Fixed token overhead added once per call to {@link countChatTokens} to account for the
|
|
46
|
+
* assistant reply primer (`<|im_start|>assistant`).
|
|
47
|
+
*/
|
|
48
|
+
replyPrimer: number;
|
|
49
|
+
/** Fixed token overhead added per message (e.g. role delimiters). Typically 3 for gpt-4o. */
|
|
50
|
+
tokensPerMessage: number;
|
|
51
|
+
/** Extra tokens added when a message includes a `name` field. Typically 1 for gpt-4o. */
|
|
52
|
+
tokensPerName: number;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Estimates the number of tokens in a plain-text string using model-specific character-per-token
|
|
56
|
+
* heuristics. Whitespace is normalized before counting. No external dependencies are required.
|
|
57
|
+
*
|
|
58
|
+
* @param text - The input string to estimate. Empty or whitespace-only strings return `0`.
|
|
59
|
+
* @param context - Optional request context forwarded to the error handler for correlated logging.
|
|
60
|
+
* @param model - Model identifier used to look up heuristics (e.g. `'gpt-4o'`). Falls back to
|
|
61
|
+
* `'gpt-4o'` when omitted or unrecognized.
|
|
62
|
+
* @returns Estimated token count, rounded up to the nearest integer.
|
|
63
|
+
* @throws {McpError} With `InternalError` code if the heuristic calculation fails unexpectedly.
|
|
64
|
+
* @example
|
|
65
|
+
* const tokens = await countTokens('Hello, world!');
|
|
66
|
+
* // Returns approximately 4 (13 chars / 4 charsPerToken, rounded up)
|
|
67
|
+
*/
|
|
68
|
+
export declare function countTokens(text: string, context?: RequestContext, model?: string): Promise<number>;
|
|
69
|
+
/**
|
|
70
|
+
* Estimates the total number of tokens for an array of chat messages using the same
|
|
71
|
+
* heuristics as OpenAI's token-counting cookbook for gpt-4o-family models.
|
|
72
|
+
*
|
|
73
|
+
* Per-message overhead (`tokensPerMessage`) and an assistant reply primer (`replyPrimer`)
|
|
74
|
+
* are added on top of the raw content estimates. Counting logic:
|
|
75
|
+
* - String `content`: normalized character count divided by `charsPerToken`.
|
|
76
|
+
* - Array `content`: only `type: 'text'` parts are counted; other part types emit a warning
|
|
77
|
+
* and are skipped.
|
|
78
|
+
* - `name` field: adds `tokensPerName` plus the name's character-count estimate.
|
|
79
|
+
* - `tool_calls` (assistant role): function name and serialized arguments are counted.
|
|
80
|
+
* - `tool_call_id` (tool role): counted as plain text.
|
|
81
|
+
*
|
|
82
|
+
* @param messages - Ordered array of chat messages to estimate. May be empty (returns
|
|
83
|
+
* `replyPrimer` tokens).
|
|
84
|
+
* @param context - Optional request context forwarded to the error handler for correlated logging.
|
|
85
|
+
* @param model - Model identifier used to look up heuristics (e.g. `'gpt-4o-mini'`). Falls back
|
|
86
|
+
* to `'gpt-4o'` when omitted or unrecognized.
|
|
87
|
+
* @returns Estimated total token count across all messages, including per-message overhead and
|
|
88
|
+
* the reply primer.
|
|
89
|
+
* @throws {McpError} With `InternalError` code if the heuristic calculation fails unexpectedly.
|
|
90
|
+
* @example
|
|
91
|
+
* const tokens = await countChatTokens([
|
|
92
|
+
* { role: 'user', content: 'What is 2 + 2?' },
|
|
93
|
+
* { role: 'assistant', content: 'It is 4.' },
|
|
94
|
+
* ]);
|
|
95
|
+
*/
|
|
96
|
+
export declare function countChatTokens(messages: ReadonlyArray<ChatMessage>, context?: RequestContext, model?: string): Promise<number>;
|
|
97
|
+
//# sourceMappingURL=tokenCounter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenCounter.d.ts","sourceRoot":"","sources":["../../../src/utils/metrics/tokenCounter.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,oFAAoF;IACpF,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;IACtF,+FAA+F;IAC/F,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,UAAU,CAAC,EAAE,KAAK,CAAC;QACjB,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,SAAS,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KAClD,CAAC,GAAG,IAAI,CAAC;IACV,yFAAyF;IACzF,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,8FAA8F;IAC9F,aAAa,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,6FAA6F;IAC7F,gBAAgB,EAAE,MAAM,CAAC;IACzB,yFAAyF;IACzF,aAAa,EAAE,MAAM,CAAC;CACvB;AA2CD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,cAAc,EACxB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAmBjB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,aAAa,CAAC,WAAW,CAAC,EACpC,OAAO,CAAC,EAAE,cAAc,EACxB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAgEjB"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Lightweight, dependency-free token counters with model-configurable heuristics.
|
|
3
|
+
* This avoids native/WASM dependencies (e.g., tiktoken) while providing a stable extension point
|
|
4
|
+
* to adjust per-model tokenization and overhead later.
|
|
5
|
+
* @module src/utils/metrics/tokenCounter
|
|
6
|
+
*/
|
|
7
|
+
import { JsonRpcErrorCode } from '../../types-global/errors.js';
|
|
8
|
+
import { ErrorHandler } from '../../utils/internal/error-handler/errorHandler.js';
|
|
9
|
+
import { logger } from '../../utils/internal/logger.js';
|
|
10
|
+
const DEFAULT_MODEL = 'gpt-4o';
|
|
11
|
+
// Known heuristics; tweak as you calibrate
|
|
12
|
+
const HEURISTICS = {
|
|
13
|
+
'gpt-4o': {
|
|
14
|
+
charsPerToken: 4,
|
|
15
|
+
tokensPerMessage: 3,
|
|
16
|
+
tokensPerName: 1,
|
|
17
|
+
replyPrimer: 3,
|
|
18
|
+
},
|
|
19
|
+
'gpt-4o-mini': {
|
|
20
|
+
charsPerToken: 4,
|
|
21
|
+
tokensPerMessage: 3,
|
|
22
|
+
tokensPerName: 1,
|
|
23
|
+
replyPrimer: 3,
|
|
24
|
+
},
|
|
25
|
+
default: {
|
|
26
|
+
charsPerToken: 4,
|
|
27
|
+
tokensPerMessage: 3,
|
|
28
|
+
tokensPerName: 1,
|
|
29
|
+
replyPrimer: 3,
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
function getModelHeuristics(model) {
|
|
33
|
+
const key = (model ?? DEFAULT_MODEL).toLowerCase();
|
|
34
|
+
const found = HEURISTICS[key];
|
|
35
|
+
return (found ?? HEURISTICS.default);
|
|
36
|
+
}
|
|
37
|
+
function nonEmptyString(s) {
|
|
38
|
+
return typeof s === 'string' && s.length > 0;
|
|
39
|
+
}
|
|
40
|
+
function approxTokenCount(text, charsPerToken) {
|
|
41
|
+
if (!text)
|
|
42
|
+
return 0;
|
|
43
|
+
const normalized = text.replace(/\s+/g, ' ').trim();
|
|
44
|
+
if (!normalized)
|
|
45
|
+
return 0;
|
|
46
|
+
return Math.ceil(normalized.length / Math.max(1, charsPerToken));
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Estimates the number of tokens in a plain-text string using model-specific character-per-token
|
|
50
|
+
* heuristics. Whitespace is normalized before counting. No external dependencies are required.
|
|
51
|
+
*
|
|
52
|
+
* @param text - The input string to estimate. Empty or whitespace-only strings return `0`.
|
|
53
|
+
* @param context - Optional request context forwarded to the error handler for correlated logging.
|
|
54
|
+
* @param model - Model identifier used to look up heuristics (e.g. `'gpt-4o'`). Falls back to
|
|
55
|
+
* `'gpt-4o'` when omitted or unrecognized.
|
|
56
|
+
* @returns Estimated token count, rounded up to the nearest integer.
|
|
57
|
+
* @throws {McpError} With `InternalError` code if the heuristic calculation fails unexpectedly.
|
|
58
|
+
* @example
|
|
59
|
+
* const tokens = await countTokens('Hello, world!');
|
|
60
|
+
* // Returns approximately 4 (13 chars / 4 charsPerToken, rounded up)
|
|
61
|
+
*/
|
|
62
|
+
export async function countTokens(text, context, model) {
|
|
63
|
+
return await ErrorHandler.tryCatch(() => {
|
|
64
|
+
const h = getModelHeuristics(model);
|
|
65
|
+
return approxTokenCount(text ?? '', h.charsPerToken);
|
|
66
|
+
}, {
|
|
67
|
+
operation: 'countTokens',
|
|
68
|
+
...(context && { context }),
|
|
69
|
+
input: {
|
|
70
|
+
textSample: nonEmptyString(text)
|
|
71
|
+
? text.length > 53
|
|
72
|
+
? `${text.slice(0, 50)}...`
|
|
73
|
+
: text
|
|
74
|
+
: '',
|
|
75
|
+
},
|
|
76
|
+
errorCode: JsonRpcErrorCode.InternalError,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Estimates the total number of tokens for an array of chat messages using the same
|
|
81
|
+
* heuristics as OpenAI's token-counting cookbook for gpt-4o-family models.
|
|
82
|
+
*
|
|
83
|
+
* Per-message overhead (`tokensPerMessage`) and an assistant reply primer (`replyPrimer`)
|
|
84
|
+
* are added on top of the raw content estimates. Counting logic:
|
|
85
|
+
* - String `content`: normalized character count divided by `charsPerToken`.
|
|
86
|
+
* - Array `content`: only `type: 'text'` parts are counted; other part types emit a warning
|
|
87
|
+
* and are skipped.
|
|
88
|
+
* - `name` field: adds `tokensPerName` plus the name's character-count estimate.
|
|
89
|
+
* - `tool_calls` (assistant role): function name and serialized arguments are counted.
|
|
90
|
+
* - `tool_call_id` (tool role): counted as plain text.
|
|
91
|
+
*
|
|
92
|
+
* @param messages - Ordered array of chat messages to estimate. May be empty (returns
|
|
93
|
+
* `replyPrimer` tokens).
|
|
94
|
+
* @param context - Optional request context forwarded to the error handler for correlated logging.
|
|
95
|
+
* @param model - Model identifier used to look up heuristics (e.g. `'gpt-4o-mini'`). Falls back
|
|
96
|
+
* to `'gpt-4o'` when omitted or unrecognized.
|
|
97
|
+
* @returns Estimated total token count across all messages, including per-message overhead and
|
|
98
|
+
* the reply primer.
|
|
99
|
+
* @throws {McpError} With `InternalError` code if the heuristic calculation fails unexpectedly.
|
|
100
|
+
* @example
|
|
101
|
+
* const tokens = await countChatTokens([
|
|
102
|
+
* { role: 'user', content: 'What is 2 + 2?' },
|
|
103
|
+
* { role: 'assistant', content: 'It is 4.' },
|
|
104
|
+
* ]);
|
|
105
|
+
*/
|
|
106
|
+
export async function countChatTokens(messages, context, model) {
|
|
107
|
+
return await ErrorHandler.tryCatch(() => {
|
|
108
|
+
const h = getModelHeuristics(model);
|
|
109
|
+
let tokens = 0;
|
|
110
|
+
for (const message of messages) {
|
|
111
|
+
tokens += h.tokensPerMessage;
|
|
112
|
+
// role contribution (very small; approximate as 1)
|
|
113
|
+
tokens += 1;
|
|
114
|
+
// content
|
|
115
|
+
if (typeof message.content === 'string') {
|
|
116
|
+
tokens += approxTokenCount(message.content, h.charsPerToken);
|
|
117
|
+
}
|
|
118
|
+
else if (Array.isArray(message.content)) {
|
|
119
|
+
for (const part of message.content) {
|
|
120
|
+
if (part && part.type === 'text' && nonEmptyString(part.text)) {
|
|
121
|
+
tokens += approxTokenCount(part.text, h.charsPerToken);
|
|
122
|
+
}
|
|
123
|
+
else if (part) {
|
|
124
|
+
logger.warning(`Non-text content part found (type: ${String(part.type)}), token count contribution ignored.`, context);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// optional name
|
|
129
|
+
if (message.name) {
|
|
130
|
+
tokens += h.tokensPerName;
|
|
131
|
+
tokens += approxTokenCount(message.name, h.charsPerToken);
|
|
132
|
+
}
|
|
133
|
+
// assistant tool calls
|
|
134
|
+
if (message.role === 'assistant' && Array.isArray(message.tool_calls)) {
|
|
135
|
+
for (const toolCall of message.tool_calls) {
|
|
136
|
+
if (toolCall?.type === 'function') {
|
|
137
|
+
if (toolCall.function?.name) {
|
|
138
|
+
tokens += approxTokenCount(toolCall.function.name, h.charsPerToken);
|
|
139
|
+
}
|
|
140
|
+
if (toolCall.function?.arguments) {
|
|
141
|
+
tokens += approxTokenCount(toolCall.function.arguments, h.charsPerToken);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// tool message id
|
|
147
|
+
if (message.role === 'tool' && message.tool_call_id) {
|
|
148
|
+
tokens += approxTokenCount(message.tool_call_id, h.charsPerToken);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
tokens += h.replyPrimer;
|
|
152
|
+
return tokens;
|
|
153
|
+
}, {
|
|
154
|
+
operation: 'countChatTokens',
|
|
155
|
+
...(context && { context }),
|
|
156
|
+
input: { messageCount: messages.length },
|
|
157
|
+
errorCode: JsonRpcErrorCode.InternalError,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
// Intentionally no generic helpers; the return above asserts to satisfy
|
|
161
|
+
// TypeScript with noUncheckedIndexedAccess while remaining safe at runtime.
|
|
162
|
+
//# sourceMappingURL=tokenCounter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenCounter.js","sourceRoot":"","sources":["../../../src/utils/metrics/tokenCounter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { RequestContext } from '../../utils/internal/requestContext.js';
|
|
2
|
+
/**
|
|
3
|
+
* Options for the `fetchWithTimeout` utility.
|
|
4
|
+
*
|
|
5
|
+
* Extends the standard `RequestInit` type, omitting `signal` (which is managed
|
|
6
|
+
* internally via `AbortController`) and adding SSRF protection and caller-supplied
|
|
7
|
+
* cancellation options.
|
|
8
|
+
*/
|
|
9
|
+
export interface FetchWithTimeoutOptions extends Omit<RequestInit, 'signal'> {
|
|
10
|
+
/**
|
|
11
|
+
* When `true`, rejects requests to private/reserved IP ranges and localhost.
|
|
12
|
+
*
|
|
13
|
+
* Use this when fetching user-controlled URLs to prevent SSRF attacks against
|
|
14
|
+
* internal services (e.g., cloud metadata endpoints, internal APIs). Covered
|
|
15
|
+
* ranges include RFC 1918, loopback (127.x, ::1), link-local (169.254.x),
|
|
16
|
+
* CGNAT (100.64–127.x), and known internal hostnames (e.g., `metadata.google.internal`).
|
|
17
|
+
*
|
|
18
|
+
* On Node.js, DNS is also resolved and all A/AAAA records are validated against
|
|
19
|
+
* private ranges before the request is sent. On Workers, only string-based
|
|
20
|
+
* hostname/IP checks apply (no DNS API available).
|
|
21
|
+
*
|
|
22
|
+
* When enabled, redirects are followed manually (up to {@link MAX_SSRF_REDIRECTS}
|
|
23
|
+
* hops) with SSRF validation applied to each redirect target.
|
|
24
|
+
*
|
|
25
|
+
* Default: `false` (no restriction).
|
|
26
|
+
*/
|
|
27
|
+
rejectPrivateIPs?: boolean;
|
|
28
|
+
/**
|
|
29
|
+
* An optional external `AbortSignal` (e.g., `ctx.signal` from the request context)
|
|
30
|
+
* to combine with the internal timeout signal. If this signal aborts before the
|
|
31
|
+
* timeout fires, the fetch is cancelled immediately and a `McpError` with code
|
|
32
|
+
* `InternalError` is thrown.
|
|
33
|
+
*/
|
|
34
|
+
signal?: AbortSignal;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Fetches a resource with a configurable timeout and optional SSRF protection.
|
|
38
|
+
*
|
|
39
|
+
* Internally manages an `AbortController` that fires after `timeoutMs`. An optional
|
|
40
|
+
* external `signal` (e.g., `ctx.signal`) can be passed via `options` to support
|
|
41
|
+
* early cancellation by the caller. The two signals are composed — whichever fires
|
|
42
|
+
* first wins.
|
|
43
|
+
*
|
|
44
|
+
* When `options.rejectPrivateIPs` is `true`, the target URL is validated before the
|
|
45
|
+
* request is sent, and all redirects are followed manually with per-hop SSRF checks
|
|
46
|
+
* (up to 5 hops). This mode forces `redirect: 'manual'` on the underlying fetch.
|
|
47
|
+
*
|
|
48
|
+
* Non-2xx responses are treated as errors: the response body is read, logged, and
|
|
49
|
+
* wrapped in a `McpError` with code `ServiceUnavailable`.
|
|
50
|
+
*
|
|
51
|
+
* @param url - The URL to fetch (string or `URL` instance).
|
|
52
|
+
* @param timeoutMs - Maximum duration in milliseconds before the request is aborted.
|
|
53
|
+
* @param context - Request context used for structured logging (requestId, operation, etc.).
|
|
54
|
+
* @param options - Optional fetch configuration extending `RequestInit`.
|
|
55
|
+
* - `rejectPrivateIPs`: Block requests to private/internal IP space (SSRF protection).
|
|
56
|
+
* - `signal`: External `AbortSignal` to cancel the request independently of the timeout.
|
|
57
|
+
* - All other standard `RequestInit` fields (method, headers, body, etc.) are forwarded.
|
|
58
|
+
* @returns A promise resolving to the `Response` object on HTTP 2xx.
|
|
59
|
+
* @throws {McpError} `ValidationError` if the URL targets a private/reserved address
|
|
60
|
+
* and `rejectPrivateIPs` is enabled.
|
|
61
|
+
* @throws {McpError} `Timeout` if the request exceeds `timeoutMs`.
|
|
62
|
+
* @throws {McpError} `InternalError` if the request is cancelled via the external signal.
|
|
63
|
+
* @throws {McpError} `ServiceUnavailable` if the server returns a non-2xx status or a
|
|
64
|
+
* network-level error occurs.
|
|
65
|
+
* @example
|
|
66
|
+
* ```ts
|
|
67
|
+
* // Basic GET with a 5-second timeout
|
|
68
|
+
* const response = await fetchWithTimeout(
|
|
69
|
+
* 'https://api.example.com/data',
|
|
70
|
+
* 5000,
|
|
71
|
+
* ctx,
|
|
72
|
+
* );
|
|
73
|
+
* const data = await response.json();
|
|
74
|
+
*
|
|
75
|
+
* // POST with SSRF protection and caller-cancellable signal
|
|
76
|
+
* const response = await fetchWithTimeout(
|
|
77
|
+
* userProvidedUrl,
|
|
78
|
+
* 10_000,
|
|
79
|
+
* ctx,
|
|
80
|
+
* {
|
|
81
|
+
* method: 'POST',
|
|
82
|
+
* headers: { 'Content-Type': 'application/json' },
|
|
83
|
+
* body: JSON.stringify(payload),
|
|
84
|
+
* rejectPrivateIPs: true,
|
|
85
|
+
* signal: ctx.signal,
|
|
86
|
+
* },
|
|
87
|
+
* );
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
export declare function fetchWithTimeout(url: string | URL, timeoutMs: number, context: RequestContext, options?: FetchWithTimeoutOptions): Promise<Response>;
|
|
91
|
+
//# sourceMappingURL=fetchWithTimeout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetchWithTimeout.d.ts","sourceRoot":"","sources":["../../../src/utils/network/fetchWithTimeout.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAGzE;;;;;;GAMG;AACH,MAAM,WAAW,uBAAwB,SAAQ,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC;IAC1E;;;;;;;;;;;;;;;;OAgBG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;;OAKG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AA+ID;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,GAAG,GAAG,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,cAAc,EACvB,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,QAAQ,CAAC,CA4JnB"}
|