@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 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../../src/utils/pagination/pagination.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Provides a utility class for parsing CSV strings.
|
|
3
|
+
* Wraps the `papaparse` peer dependency (lazy-loaded on first use) and strips
|
|
4
|
+
* optional `<think>...</think>` blocks that LLMs sometimes prepend to structured
|
|
5
|
+
* output before parsing. Handles CJS/ESM interop for the `papaparse` module.
|
|
6
|
+
*
|
|
7
|
+
* Peer dependency: `papaparse` — install with `bun add papaparse`.
|
|
8
|
+
* @module src/utils/parsing/csvParser
|
|
9
|
+
*/
|
|
10
|
+
import type Papa from 'papaparse';
|
|
11
|
+
import { type RequestContext } from '../../utils/internal/requestContext.js';
|
|
12
|
+
/**
|
|
13
|
+
* Utility class for parsing CSV strings.
|
|
14
|
+
*
|
|
15
|
+
* Lazily loads `papaparse` on first use (peer dependency — install with `bun add papaparse`).
|
|
16
|
+
* Handles CJS/ESM interop for the `papaparse` module automatically. Handles optional
|
|
17
|
+
* `<think>...</think>` blocks that some LLMs prepend to structured output; the block's
|
|
18
|
+
* content is logged at debug level and stripped before parsing.
|
|
19
|
+
*/
|
|
20
|
+
export declare class CsvParser {
|
|
21
|
+
/**
|
|
22
|
+
* Parses a CSV string into a `Papa.ParseResult`.
|
|
23
|
+
*
|
|
24
|
+
* This method is async because `papaparse` is loaded lazily on first call.
|
|
25
|
+
* If the input begins with a `<think>...</think>` block, that block is stripped
|
|
26
|
+
* and its content logged before parsing the remainder. Parse options (delimiter,
|
|
27
|
+
* headers, etc.) are forwarded directly to `Papa.parse()`.
|
|
28
|
+
*
|
|
29
|
+
* If `papaparse` reports any parse errors in `result.errors`, an `McpError` is thrown
|
|
30
|
+
* with all error messages joined and the raw `errors` array attached as context.
|
|
31
|
+
*
|
|
32
|
+
* @template T - The type of each parsed row. Defaults to `unknown`.
|
|
33
|
+
* @param csvString - The CSV string to parse. May be prefixed with a `<think>` block.
|
|
34
|
+
* @param options - Optional `Papa.ParseConfig` forwarded directly to `Papa.parse()`.
|
|
35
|
+
* Common options: `header` (boolean), `delimiter` (string), `dynamicTyping` (boolean).
|
|
36
|
+
* @param context - Optional request context for correlated logging and error metadata.
|
|
37
|
+
* @returns A promise resolving to `Papa.ParseResult<T>` containing `data`, `errors`, and `meta`.
|
|
38
|
+
* @throws {McpError} With code `ConfigurationError` if `papaparse` is not installed.
|
|
39
|
+
* @throws {McpError} With code `ValidationError` if the string is empty after stripping
|
|
40
|
+
* the `<think>` block, or if `papaparse` reports parse errors.
|
|
41
|
+
* @example
|
|
42
|
+
* ```typescript
|
|
43
|
+
* import { csvParser } from '../../utils/parsing/csvParser.js';
|
|
44
|
+
*
|
|
45
|
+
* // Parse with header row — rows typed as objects
|
|
46
|
+
* const result = await csvParser.parse<{ name: string; age: string }>(
|
|
47
|
+
* 'name,age\nAlice,30\nBob,25',
|
|
48
|
+
* { header: true },
|
|
49
|
+
* );
|
|
50
|
+
* console.log(result.data[0].name); // 'Alice'
|
|
51
|
+
*
|
|
52
|
+
* // LLM output with a <think> preamble
|
|
53
|
+
* const fromLlm = await csvParser.parse('<think>reasoning</think>\na,b\n1,2', { header: true });
|
|
54
|
+
* console.log(fromLlm.data[0]); // { a: '1', b: '2' }
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
parse<T = unknown>(csvString: string, options?: Papa.ParseConfig, context?: RequestContext): Promise<Papa.ParseResult<T>>;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Singleton instance of {@link CsvParser}.
|
|
61
|
+
*
|
|
62
|
+
* Prefer this over constructing a new `CsvParser` directly. Lazily loads `papaparse`
|
|
63
|
+
* on first call, so there is no startup cost if CSV parsing is never used.
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```typescript
|
|
67
|
+
* import { csvParser } from '../../utils/parsing/csvParser.js';
|
|
68
|
+
*
|
|
69
|
+
* // Parse with header row
|
|
70
|
+
* const result = await csvParser.parse<{ a: string; b: string }>('a,b\n1,2', { header: true });
|
|
71
|
+
* console.log(result.data[0]); // { a: '1', b: '2' }
|
|
72
|
+
*
|
|
73
|
+
* // With request context for correlated logging
|
|
74
|
+
* import { requestContextService } from '../../utils/internal/requestContext.js';
|
|
75
|
+
* const ctx = requestContextService.createRequestContext({ operation: 'importData' });
|
|
76
|
+
* const imported = await csvParser.parse(rawCsv, { header: true, dynamicTyping: true }, ctx);
|
|
77
|
+
*
|
|
78
|
+
* // Strips LLM <think> preamble automatically
|
|
79
|
+
* const fromLlm = await csvParser.parse('<think>let me think</think>\na,b\n1,2', { header: true });
|
|
80
|
+
* console.log(fromLlm.data[0]); // { a: '1', b: '2' }
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
export declare const csvParser: CsvParser;
|
|
84
|
+
//# sourceMappingURL=csvParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csvParser.d.ts","sourceRoot":"","sources":["../../../src/utils/parsing/csvParser.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAIlC,OAAO,EAAE,KAAK,cAAc,EAAyB,MAAM,oCAAoC,CAAC;AAkBhG;;;;;;;GAOG;AACH,qBAAa,SAAS;IACpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAmCG;IACG,KAAK,CAAC,CAAC,GAAG,OAAO,EACrB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,IAAI,CAAC,WAAW,EAC1B,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;CA+DhC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,SAAS,WAAkB,CAAC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { JsonRpcErrorCode, McpError } from '../../types-global/errors.js';
|
|
2
|
+
import { logger } from '../../utils/internal/logger.js';
|
|
3
|
+
import { requestContextService } from '../../utils/internal/requestContext.js';
|
|
4
|
+
import { thinkBlockRegex } from './thinkBlock.js';
|
|
5
|
+
let _papa;
|
|
6
|
+
async function getPapa() {
|
|
7
|
+
if (!_papa) {
|
|
8
|
+
const mod = await import('papaparse').catch(() => {
|
|
9
|
+
throw new McpError(JsonRpcErrorCode.ConfigurationError, 'Install "papaparse" to use CSV parsing: bun add papaparse');
|
|
10
|
+
});
|
|
11
|
+
// Handle CJS/ESM interop — papaparse uses `export =`
|
|
12
|
+
_papa = ('default' in mod ? mod.default : mod);
|
|
13
|
+
}
|
|
14
|
+
return _papa;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Utility class for parsing CSV strings.
|
|
18
|
+
*
|
|
19
|
+
* Lazily loads `papaparse` on first use (peer dependency — install with `bun add papaparse`).
|
|
20
|
+
* Handles CJS/ESM interop for the `papaparse` module automatically. Handles optional
|
|
21
|
+
* `<think>...</think>` blocks that some LLMs prepend to structured output; the block's
|
|
22
|
+
* content is logged at debug level and stripped before parsing.
|
|
23
|
+
*/
|
|
24
|
+
export class CsvParser {
|
|
25
|
+
/**
|
|
26
|
+
* Parses a CSV string into a `Papa.ParseResult`.
|
|
27
|
+
*
|
|
28
|
+
* This method is async because `papaparse` is loaded lazily on first call.
|
|
29
|
+
* If the input begins with a `<think>...</think>` block, that block is stripped
|
|
30
|
+
* and its content logged before parsing the remainder. Parse options (delimiter,
|
|
31
|
+
* headers, etc.) are forwarded directly to `Papa.parse()`.
|
|
32
|
+
*
|
|
33
|
+
* If `papaparse` reports any parse errors in `result.errors`, an `McpError` is thrown
|
|
34
|
+
* with all error messages joined and the raw `errors` array attached as context.
|
|
35
|
+
*
|
|
36
|
+
* @template T - The type of each parsed row. Defaults to `unknown`.
|
|
37
|
+
* @param csvString - The CSV string to parse. May be prefixed with a `<think>` block.
|
|
38
|
+
* @param options - Optional `Papa.ParseConfig` forwarded directly to `Papa.parse()`.
|
|
39
|
+
* Common options: `header` (boolean), `delimiter` (string), `dynamicTyping` (boolean).
|
|
40
|
+
* @param context - Optional request context for correlated logging and error metadata.
|
|
41
|
+
* @returns A promise resolving to `Papa.ParseResult<T>` containing `data`, `errors`, and `meta`.
|
|
42
|
+
* @throws {McpError} With code `ConfigurationError` if `papaparse` is not installed.
|
|
43
|
+
* @throws {McpError} With code `ValidationError` if the string is empty after stripping
|
|
44
|
+
* the `<think>` block, or if `papaparse` reports parse errors.
|
|
45
|
+
* @example
|
|
46
|
+
* ```typescript
|
|
47
|
+
* import { csvParser } from '../../utils/parsing/csvParser.js';
|
|
48
|
+
*
|
|
49
|
+
* // Parse with header row — rows typed as objects
|
|
50
|
+
* const result = await csvParser.parse<{ name: string; age: string }>(
|
|
51
|
+
* 'name,age\nAlice,30\nBob,25',
|
|
52
|
+
* { header: true },
|
|
53
|
+
* );
|
|
54
|
+
* console.log(result.data[0].name); // 'Alice'
|
|
55
|
+
*
|
|
56
|
+
* // LLM output with a <think> preamble
|
|
57
|
+
* const fromLlm = await csvParser.parse('<think>reasoning</think>\na,b\n1,2', { header: true });
|
|
58
|
+
* console.log(fromLlm.data[0]); // { a: '1', b: '2' }
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
async parse(csvString, options, context) {
|
|
62
|
+
let stringToParse = csvString;
|
|
63
|
+
const match = csvString.match(thinkBlockRegex);
|
|
64
|
+
if (match) {
|
|
65
|
+
const thinkContent = match[1]?.trim() ?? '';
|
|
66
|
+
const restOfString = match[2] ?? '';
|
|
67
|
+
const logContext = context ||
|
|
68
|
+
requestContextService.createRequestContext({
|
|
69
|
+
operation: 'CsvParser.thinkBlock',
|
|
70
|
+
});
|
|
71
|
+
if (thinkContent) {
|
|
72
|
+
logger.debug('LLM <think> block detected and logged.', {
|
|
73
|
+
...logContext,
|
|
74
|
+
thinkContent,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
logger.debug('Empty LLM <think> block detected.', logContext);
|
|
79
|
+
}
|
|
80
|
+
stringToParse = restOfString;
|
|
81
|
+
}
|
|
82
|
+
stringToParse = stringToParse.trim();
|
|
83
|
+
if (!stringToParse) {
|
|
84
|
+
throw new McpError(JsonRpcErrorCode.ValidationError, 'CSV string is empty after removing <think> block and trimming.', context);
|
|
85
|
+
}
|
|
86
|
+
const papa = await getPapa();
|
|
87
|
+
const result = papa.parse(stringToParse, options);
|
|
88
|
+
if (result.errors.length > 0) {
|
|
89
|
+
const errorLogContext = context ||
|
|
90
|
+
requestContextService.createRequestContext({
|
|
91
|
+
operation: 'CsvParser.parseError',
|
|
92
|
+
});
|
|
93
|
+
logger.error('Failed to parse CSV content.', {
|
|
94
|
+
...errorLogContext,
|
|
95
|
+
errors: result.errors,
|
|
96
|
+
contentAttempted: stringToParse.substring(0, 200),
|
|
97
|
+
});
|
|
98
|
+
throw new McpError(JsonRpcErrorCode.ValidationError, `Failed to parse CSV: ${result.errors.map((e) => e.message).join(', ')}`, {
|
|
99
|
+
...context,
|
|
100
|
+
errors: result.errors,
|
|
101
|
+
originalContentSample: stringToParse.substring(0, 200) + (stringToParse.length > 200 ? '...' : ''),
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
return result;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Singleton instance of {@link CsvParser}.
|
|
109
|
+
*
|
|
110
|
+
* Prefer this over constructing a new `CsvParser` directly. Lazily loads `papaparse`
|
|
111
|
+
* on first call, so there is no startup cost if CSV parsing is never used.
|
|
112
|
+
*
|
|
113
|
+
* @example
|
|
114
|
+
* ```typescript
|
|
115
|
+
* import { csvParser } from '../../utils/parsing/csvParser.js';
|
|
116
|
+
*
|
|
117
|
+
* // Parse with header row
|
|
118
|
+
* const result = await csvParser.parse<{ a: string; b: string }>('a,b\n1,2', { header: true });
|
|
119
|
+
* console.log(result.data[0]); // { a: '1', b: '2' }
|
|
120
|
+
*
|
|
121
|
+
* // With request context for correlated logging
|
|
122
|
+
* import { requestContextService } from '../../utils/internal/requestContext.js';
|
|
123
|
+
* const ctx = requestContextService.createRequestContext({ operation: 'importData' });
|
|
124
|
+
* const imported = await csvParser.parse(rawCsv, { header: true, dynamicTyping: true }, ctx);
|
|
125
|
+
*
|
|
126
|
+
* // Strips LLM <think> preamble automatically
|
|
127
|
+
* const fromLlm = await csvParser.parse('<think>let me think</think>\na,b\n1,2', { header: true });
|
|
128
|
+
* console.log(fromLlm.data[0]); // { a: '1', b: '2' }
|
|
129
|
+
* ```
|
|
130
|
+
*/
|
|
131
|
+
export const csvParser = new CsvParser();
|
|
132
|
+
//# sourceMappingURL=csvParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csvParser.js","sourceRoot":"","sources":["../../../src/utils/parsing/csvParser.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACpD,OAAO,EAAuB,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAChG,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,IAAI,KAA8B,CAAC;AACnC,KAAK,UAAU,OAAO;IACpB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YAC/C,MAAM,IAAI,QAAQ,CAChB,gBAAgB,CAAC,kBAAkB,EACnC,2DAA2D,CAC5D,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,qDAAqD;QACrD,KAAK,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,CAAC,CAAE,GAAG,CAAC,OAAuB,CAAC,CAAC,CAAC,GAAG,CAAgB,CAAC;IACjF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,OAAO,SAAS;IACpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAmCG;IACH,KAAK,CAAC,KAAK,CACT,SAAiB,EACjB,OAA0B,EAC1B,OAAwB;QAExB,IAAI,aAAa,GAAG,SAAS,CAAC;QAC9B,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAE/C,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YAC5C,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAEpC,MAAM,UAAU,GACd,OAAO;gBACP,qBAAqB,CAAC,oBAAoB,CAAC;oBACzC,SAAS,EAAE,sBAAsB;iBAClC,CAAC,CAAC;YACL,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,CAAC,KAAK,CAAC,wCAAwC,EAAE;oBACrD,GAAG,UAAU;oBACb,YAAY;iBACb,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE,UAAU,CAAC,CAAC;YAChE,CAAC;YACD,aAAa,GAAG,YAAY,CAAC;QAC/B,CAAC;QAED,aAAa,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC;QAErC,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,QAAQ,CAChB,gBAAgB,CAAC,eAAe,EAChC,gEAAgE,EAChE,OAAO,CACR,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAI,aAAa,EAAE,OAAO,CAAC,CAAC;QAErD,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,eAAe,GACnB,OAAO;gBACP,qBAAqB,CAAC,oBAAoB,CAAC;oBACzC,SAAS,EAAE,sBAAsB;iBAClC,CAAC,CAAC;YACL,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE;gBAC3C,GAAG,eAAe;gBAClB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,gBAAgB,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;aAClD,CAAC,CAAC;YAEH,MAAM,IAAI,QAAQ,CAChB,gBAAgB,CAAC,eAAe,EAChC,wBAAwB,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACxE;gBACE,GAAG,OAAO;gBACV,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,qBAAqB,EACnB,aAAa,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;aAC9E,CACF,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Provides utility functions for parsing natural language date strings
|
|
3
|
+
* into Date objects or detailed parsing results using the `chrono-node` library.
|
|
4
|
+
* @module src/utils/parsing/dateParser
|
|
5
|
+
*/
|
|
6
|
+
import type * as chrono from 'chrono-node';
|
|
7
|
+
import type { RequestContext } from '../../utils/internal/requestContext.js';
|
|
8
|
+
/**
|
|
9
|
+
* Parses a natural language date string into a JavaScript `Date` object.
|
|
10
|
+
*
|
|
11
|
+
* Uses `chrono-node`'s `parseDate` with `forwardDate: true` so ambiguous dates
|
|
12
|
+
* (e.g. "next Friday") resolve to the nearest future occurrence. Returns `null`
|
|
13
|
+
* if no date can be extracted from the text.
|
|
14
|
+
*
|
|
15
|
+
* Async due to lazy loading of the `chrono-node` peer dependency
|
|
16
|
+
* (`bun add chrono-node`).
|
|
17
|
+
*
|
|
18
|
+
* @param text - The natural language date string to parse (e.g. `"next Friday at 3pm"`).
|
|
19
|
+
* @param context - `RequestContext` for correlated logging and error metadata.
|
|
20
|
+
* @param refDate - Reference date for relative expressions. Defaults to the current date/time.
|
|
21
|
+
* @returns A `Date` object if a date was found, or `null` if parsing yields no result.
|
|
22
|
+
* @throws {McpError} With `ConfigurationError` if `chrono-node` is not installed.
|
|
23
|
+
* @throws {McpError} With `ParseError` if an unexpected error occurs during parsing.
|
|
24
|
+
*/
|
|
25
|
+
export declare function parseDateString(text: string, context: RequestContext, refDate?: Date): Promise<Date | null>;
|
|
26
|
+
/**
|
|
27
|
+
* Parses a natural language date string and returns detailed `chrono-node` results.
|
|
28
|
+
*
|
|
29
|
+
* Unlike `parseDateString`, this function returns the full `ParsedResult[]` from
|
|
30
|
+
* `chrono-node`, which includes each matched text span, its character index in the
|
|
31
|
+
* input, and parsed date/time components (start, optional end). Useful for
|
|
32
|
+
* multi-date strings or when the original matched text is needed.
|
|
33
|
+
*
|
|
34
|
+
* Uses `chrono-node`'s `parse` with `forwardDate: true`. Returns an empty array
|
|
35
|
+
* if no dates are found.
|
|
36
|
+
*
|
|
37
|
+
* Async due to lazy loading of the `chrono-node` peer dependency
|
|
38
|
+
* (`bun add chrono-node`).
|
|
39
|
+
*
|
|
40
|
+
* @param text - The natural language date string to parse.
|
|
41
|
+
* @param context - `RequestContext` for correlated logging and error metadata.
|
|
42
|
+
* @param refDate - Reference date for relative expressions. Defaults to the current date/time.
|
|
43
|
+
* @returns An array of `chrono.ParsedResult` objects — one per date expression found.
|
|
44
|
+
* Empty array if no dates are present in the text.
|
|
45
|
+
* @throws {McpError} With `ConfigurationError` if `chrono-node` is not installed.
|
|
46
|
+
* @throws {McpError} With `ParseError` if an unexpected error occurs during parsing.
|
|
47
|
+
*/
|
|
48
|
+
export declare function parseDateStringDetailed(text: string, context: RequestContext, refDate?: Date): Promise<chrono.ParsedResult[]>;
|
|
49
|
+
/**
|
|
50
|
+
* Singleton object providing natural language date parsing via `chrono-node`.
|
|
51
|
+
*
|
|
52
|
+
* Both methods are async due to lazy loading of the `chrono-node` peer dependency
|
|
53
|
+
* (`bun add chrono-node`). Use `parseDate` for a simple `Date | null` result and
|
|
54
|
+
* `parse` when you need the full matched-text details.
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```typescript
|
|
58
|
+
* import { dateParser } from '../../utils/parsing/dateParser.js';
|
|
59
|
+
* import { requestContextService } from '../../utils/internal/requestContext.js';
|
|
60
|
+
*
|
|
61
|
+
* const ctx = requestContextService.createRequestContext({ operation: 'myOp' });
|
|
62
|
+
*
|
|
63
|
+
* // Simple Date result
|
|
64
|
+
* const date = await dateParser.parseDate('next Friday at 3pm', ctx);
|
|
65
|
+
* if (date) console.log(date.toISOString());
|
|
66
|
+
*
|
|
67
|
+
* // Detailed results — useful for multi-date strings
|
|
68
|
+
* const results = await dateParser.parse('Meeting on 2024-12-25 and another one tomorrow', ctx);
|
|
69
|
+
* for (const r of results) {
|
|
70
|
+
* console.log(r.text, r.start.date());
|
|
71
|
+
* }
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
export declare const dateParser: {
|
|
75
|
+
/**
|
|
76
|
+
* Parses a natural language date string and returns the full `chrono-node`
|
|
77
|
+
* `ParsedResult[]`, including matched text spans and parsed components.
|
|
78
|
+
*
|
|
79
|
+
* Async due to lazy loading of `chrono-node` (`bun add chrono-node`).
|
|
80
|
+
*
|
|
81
|
+
* @param text - The natural language date string to parse.
|
|
82
|
+
* @param context - `RequestContext` for correlated logging and error metadata.
|
|
83
|
+
* @param refDate - Reference date for relative expressions. Defaults to now.
|
|
84
|
+
* @returns An array of `chrono.ParsedResult` objects; empty if no dates found.
|
|
85
|
+
* @throws {McpError} With `ConfigurationError` if `chrono-node` is not installed.
|
|
86
|
+
* @throws {McpError} With `ParseError` if an unexpected error occurs.
|
|
87
|
+
*/
|
|
88
|
+
parse: typeof parseDateStringDetailed;
|
|
89
|
+
/**
|
|
90
|
+
* Parses a natural language date string into a single JavaScript `Date` object.
|
|
91
|
+
*
|
|
92
|
+
* Async due to lazy loading of `chrono-node` (`bun add chrono-node`).
|
|
93
|
+
*
|
|
94
|
+
* @param text - The natural language date string to parse.
|
|
95
|
+
* @param context - `RequestContext` for correlated logging and error metadata.
|
|
96
|
+
* @param refDate - Reference date for relative expressions. Defaults to now.
|
|
97
|
+
* @returns A `Date` if a date expression was found, or `null` if none was recognized.
|
|
98
|
+
* @throws {McpError} With `ConfigurationError` if `chrono-node` is not installed.
|
|
99
|
+
* @throws {McpError} With `ParseError` if an unexpected error occurs.
|
|
100
|
+
*/
|
|
101
|
+
parseDate: typeof parseDateString;
|
|
102
|
+
};
|
|
103
|
+
//# sourceMappingURL=dateParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dateParser.d.ts","sourceRoot":"","sources":["../../../src/utils/parsing/dateParser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,KAAK,MAAM,MAAM,aAAa,CAAC;AAK3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAazE;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,cAAc,EACvB,OAAO,CAAC,EAAE,IAAI,GACb,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAwBtB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,cAAc,EACvB,OAAO,CAAC,EAAE,IAAI,GACb,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAsBhC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,UAAU;IACrB;;;;;;;;;;;;OAYG;;IAEH;;;;;;;;;;;OAWG;;CAEJ,CAAC"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { JsonRpcErrorCode, McpError } from '../../types-global/errors.js';
|
|
2
|
+
import { ErrorHandler } from '../../utils/internal/error-handler/errorHandler.js';
|
|
3
|
+
import { logger } from '../../utils/internal/logger.js';
|
|
4
|
+
let _chrono;
|
|
5
|
+
async function getChrono() {
|
|
6
|
+
_chrono ??= await import('chrono-node').catch(() => {
|
|
7
|
+
throw new McpError(JsonRpcErrorCode.ConfigurationError, 'Install "chrono-node" to use date parsing: bun add chrono-node');
|
|
8
|
+
});
|
|
9
|
+
return _chrono;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Parses a natural language date string into a JavaScript `Date` object.
|
|
13
|
+
*
|
|
14
|
+
* Uses `chrono-node`'s `parseDate` with `forwardDate: true` so ambiguous dates
|
|
15
|
+
* (e.g. "next Friday") resolve to the nearest future occurrence. Returns `null`
|
|
16
|
+
* if no date can be extracted from the text.
|
|
17
|
+
*
|
|
18
|
+
* Async due to lazy loading of the `chrono-node` peer dependency
|
|
19
|
+
* (`bun add chrono-node`).
|
|
20
|
+
*
|
|
21
|
+
* @param text - The natural language date string to parse (e.g. `"next Friday at 3pm"`).
|
|
22
|
+
* @param context - `RequestContext` for correlated logging and error metadata.
|
|
23
|
+
* @param refDate - Reference date for relative expressions. Defaults to the current date/time.
|
|
24
|
+
* @returns A `Date` object if a date was found, or `null` if parsing yields no result.
|
|
25
|
+
* @throws {McpError} With `ConfigurationError` if `chrono-node` is not installed.
|
|
26
|
+
* @throws {McpError} With `ParseError` if an unexpected error occurs during parsing.
|
|
27
|
+
*/
|
|
28
|
+
export async function parseDateString(text, context, refDate) {
|
|
29
|
+
const operation = 'parseDateString';
|
|
30
|
+
const logContext = { ...context, operation, inputText: text, refDate };
|
|
31
|
+
logger.debug(`Attempting to parse date string: "${text}"`, logContext);
|
|
32
|
+
return await ErrorHandler.tryCatch(async () => {
|
|
33
|
+
const chronoMod = await getChrono();
|
|
34
|
+
const parsedDate = chronoMod.parseDate(text, refDate, { forwardDate: true });
|
|
35
|
+
if (parsedDate) {
|
|
36
|
+
logger.debug(`Successfully parsed "${text}" to ${parsedDate.toISOString()}`, logContext);
|
|
37
|
+
return parsedDate;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
logger.warning(`Failed to parse date string: "${text}"`, logContext);
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}, {
|
|
44
|
+
operation,
|
|
45
|
+
context: logContext,
|
|
46
|
+
input: { text, refDate },
|
|
47
|
+
errorCode: JsonRpcErrorCode.ParseError,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Parses a natural language date string and returns detailed `chrono-node` results.
|
|
52
|
+
*
|
|
53
|
+
* Unlike `parseDateString`, this function returns the full `ParsedResult[]` from
|
|
54
|
+
* `chrono-node`, which includes each matched text span, its character index in the
|
|
55
|
+
* input, and parsed date/time components (start, optional end). Useful for
|
|
56
|
+
* multi-date strings or when the original matched text is needed.
|
|
57
|
+
*
|
|
58
|
+
* Uses `chrono-node`'s `parse` with `forwardDate: true`. Returns an empty array
|
|
59
|
+
* if no dates are found.
|
|
60
|
+
*
|
|
61
|
+
* Async due to lazy loading of the `chrono-node` peer dependency
|
|
62
|
+
* (`bun add chrono-node`).
|
|
63
|
+
*
|
|
64
|
+
* @param text - The natural language date string to parse.
|
|
65
|
+
* @param context - `RequestContext` for correlated logging and error metadata.
|
|
66
|
+
* @param refDate - Reference date for relative expressions. Defaults to the current date/time.
|
|
67
|
+
* @returns An array of `chrono.ParsedResult` objects — one per date expression found.
|
|
68
|
+
* Empty array if no dates are present in the text.
|
|
69
|
+
* @throws {McpError} With `ConfigurationError` if `chrono-node` is not installed.
|
|
70
|
+
* @throws {McpError} With `ParseError` if an unexpected error occurs during parsing.
|
|
71
|
+
*/
|
|
72
|
+
export async function parseDateStringDetailed(text, context, refDate) {
|
|
73
|
+
const operation = 'parseDateStringDetailed';
|
|
74
|
+
const logContext = { ...context, operation, inputText: text, refDate };
|
|
75
|
+
logger.debug(`Attempting detailed parse of date string: "${text}"`, logContext);
|
|
76
|
+
return await ErrorHandler.tryCatch(async () => {
|
|
77
|
+
const chronoMod = await getChrono();
|
|
78
|
+
const results = chronoMod.parse(text, refDate, { forwardDate: true });
|
|
79
|
+
logger.debug(`Detailed parse of "${text}" resulted in ${results.length} result(s)`, logContext);
|
|
80
|
+
return results;
|
|
81
|
+
}, {
|
|
82
|
+
operation,
|
|
83
|
+
context: logContext,
|
|
84
|
+
input: { text, refDate },
|
|
85
|
+
errorCode: JsonRpcErrorCode.ParseError,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Singleton object providing natural language date parsing via `chrono-node`.
|
|
90
|
+
*
|
|
91
|
+
* Both methods are async due to lazy loading of the `chrono-node` peer dependency
|
|
92
|
+
* (`bun add chrono-node`). Use `parseDate` for a simple `Date | null` result and
|
|
93
|
+
* `parse` when you need the full matched-text details.
|
|
94
|
+
*
|
|
95
|
+
* @example
|
|
96
|
+
* ```typescript
|
|
97
|
+
* import { dateParser } from '../../utils/parsing/dateParser.js';
|
|
98
|
+
* import { requestContextService } from '../../utils/internal/requestContext.js';
|
|
99
|
+
*
|
|
100
|
+
* const ctx = requestContextService.createRequestContext({ operation: 'myOp' });
|
|
101
|
+
*
|
|
102
|
+
* // Simple Date result
|
|
103
|
+
* const date = await dateParser.parseDate('next Friday at 3pm', ctx);
|
|
104
|
+
* if (date) console.log(date.toISOString());
|
|
105
|
+
*
|
|
106
|
+
* // Detailed results — useful for multi-date strings
|
|
107
|
+
* const results = await dateParser.parse('Meeting on 2024-12-25 and another one tomorrow', ctx);
|
|
108
|
+
* for (const r of results) {
|
|
109
|
+
* console.log(r.text, r.start.date());
|
|
110
|
+
* }
|
|
111
|
+
* ```
|
|
112
|
+
*/
|
|
113
|
+
export const dateParser = {
|
|
114
|
+
/**
|
|
115
|
+
* Parses a natural language date string and returns the full `chrono-node`
|
|
116
|
+
* `ParsedResult[]`, including matched text spans and parsed components.
|
|
117
|
+
*
|
|
118
|
+
* Async due to lazy loading of `chrono-node` (`bun add chrono-node`).
|
|
119
|
+
*
|
|
120
|
+
* @param text - The natural language date string to parse.
|
|
121
|
+
* @param context - `RequestContext` for correlated logging and error metadata.
|
|
122
|
+
* @param refDate - Reference date for relative expressions. Defaults to now.
|
|
123
|
+
* @returns An array of `chrono.ParsedResult` objects; empty if no dates found.
|
|
124
|
+
* @throws {McpError} With `ConfigurationError` if `chrono-node` is not installed.
|
|
125
|
+
* @throws {McpError} With `ParseError` if an unexpected error occurs.
|
|
126
|
+
*/
|
|
127
|
+
parse: parseDateStringDetailed,
|
|
128
|
+
/**
|
|
129
|
+
* Parses a natural language date string into a single JavaScript `Date` object.
|
|
130
|
+
*
|
|
131
|
+
* Async due to lazy loading of `chrono-node` (`bun add chrono-node`).
|
|
132
|
+
*
|
|
133
|
+
* @param text - The natural language date string to parse.
|
|
134
|
+
* @param context - `RequestContext` for correlated logging and error metadata.
|
|
135
|
+
* @param refDate - Reference date for relative expressions. Defaults to now.
|
|
136
|
+
* @returns A `Date` if a date expression was found, or `null` if none was recognized.
|
|
137
|
+
* @throws {McpError} With `ConfigurationError` if `chrono-node` is not installed.
|
|
138
|
+
* @throws {McpError} With `ParseError` if an unexpected error occurs.
|
|
139
|
+
*/
|
|
140
|
+
parseDate: parseDateString,
|
|
141
|
+
};
|
|
142
|
+
//# sourceMappingURL=dateParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dateParser.js","sourceRoot":"","sources":["../../../src/utils/parsing/dateParser.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,gDAAgD,CAAC;AAC9E,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAGpD,IAAI,OAAiD,CAAC;AACtD,KAAK,UAAU,SAAS;IACtB,OAAO,KAAK,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;QACjD,MAAM,IAAI,QAAQ,CAChB,gBAAgB,CAAC,kBAAkB,EACnC,gEAAgE,CACjE,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAY,EACZ,OAAuB,EACvB,OAAc;IAEd,MAAM,SAAS,GAAG,iBAAiB,CAAC;IACpC,MAAM,UAAU,GAAG,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IACvE,MAAM,CAAC,KAAK,CAAC,qCAAqC,IAAI,GAAG,EAAE,UAAU,CAAC,CAAC;IAEvE,OAAO,MAAM,YAAY,CAAC,QAAQ,CAChC,KAAK,IAAI,EAAE;QACT,MAAM,SAAS,GAAG,MAAM,SAAS,EAAE,CAAC;QACpC,MAAM,UAAU,GAAG,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7E,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,wBAAwB,IAAI,QAAQ,UAAU,CAAC,WAAW,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC;YACzF,OAAO,UAAU,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,OAAO,CAAC,iCAAiC,IAAI,GAAG,EAAE,UAAU,CAAC,CAAC;YACrE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,EACD;QACE,SAAS;QACT,OAAO,EAAE,UAAU;QACnB,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;QACxB,SAAS,EAAE,gBAAgB,CAAC,UAAU;KACvC,CACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,IAAY,EACZ,OAAuB,EACvB,OAAc;IAEd,MAAM,SAAS,GAAG,yBAAyB,CAAC;IAC5C,MAAM,UAAU,GAAG,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IACvE,MAAM,CAAC,KAAK,CAAC,8CAA8C,IAAI,GAAG,EAAE,UAAU,CAAC,CAAC;IAEhF,OAAO,MAAM,YAAY,CAAC,QAAQ,CAChC,KAAK,IAAI,EAAE;QACT,MAAM,SAAS,GAAG,MAAM,SAAS,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QACtE,MAAM,CAAC,KAAK,CACV,sBAAsB,IAAI,iBAAiB,OAAO,CAAC,MAAM,YAAY,EACrE,UAAU,CACX,CAAC;QACF,OAAO,OAAO,CAAC;IACjB,CAAC,EACD;QACE,SAAS;QACT,OAAO,EAAE,UAAU;QACnB,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;QACxB,SAAS,EAAE,gBAAgB,CAAC,UAAU;KACvC,CACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB;;;;;;;;;;;;OAYG;IACH,KAAK,EAAE,uBAAuB;IAC9B;;;;;;;;;;;OAWG;IACH,SAAS,EAAE,eAAe;CAC3B,CAAC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { type RequestContext } from '../../utils/internal/requestContext.js';
|
|
2
|
+
/**
|
|
3
|
+
* Result of parsing markdown with frontmatter.
|
|
4
|
+
* @template T The expected type of the parsed frontmatter object.
|
|
5
|
+
*/
|
|
6
|
+
export interface FrontmatterResult<T = unknown> {
|
|
7
|
+
/**
|
|
8
|
+
* Remaining markdown content after frontmatter extraction.
|
|
9
|
+
* If no frontmatter exists, contains the original markdown.
|
|
10
|
+
*/
|
|
11
|
+
content: string;
|
|
12
|
+
/**
|
|
13
|
+
* Parsed frontmatter object. Empty object if no frontmatter found.
|
|
14
|
+
*/
|
|
15
|
+
frontmatter: T;
|
|
16
|
+
/**
|
|
17
|
+
* Indicates whether frontmatter was found and extracted.
|
|
18
|
+
*/
|
|
19
|
+
hasFrontmatter: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Utility class for extracting and parsing YAML frontmatter from markdown documents.
|
|
23
|
+
* Supports Obsidian-style and Jekyll-style frontmatter (YAML between `---` delimiters).
|
|
24
|
+
* Delegates YAML parsing to {@link yamlParser}.
|
|
25
|
+
*/
|
|
26
|
+
export declare class FrontmatterParser {
|
|
27
|
+
/**
|
|
28
|
+
* Extracts and parses YAML frontmatter from a markdown string.
|
|
29
|
+
*
|
|
30
|
+
* Looks for a `---`-delimited block at the very start of the document. If
|
|
31
|
+
* found, the YAML inside is parsed via {@link yamlParser} and the remaining
|
|
32
|
+
* markdown is returned separately. An empty `---\n---` block is accepted and
|
|
33
|
+
* returns `frontmatter: {}` with `hasFrontmatter: true`. If no frontmatter
|
|
34
|
+
* block is present, the original string is returned unchanged.
|
|
35
|
+
*
|
|
36
|
+
* @template T - The expected shape of the parsed frontmatter object. Defaults to `unknown`.
|
|
37
|
+
* @param markdown - The markdown string that may contain a frontmatter block.
|
|
38
|
+
* @param context - Optional {@link RequestContext} used for correlated logging.
|
|
39
|
+
* @returns A {@link FrontmatterResult} with `frontmatter`, `content`, and `hasFrontmatter`.
|
|
40
|
+
* @throws {McpError} With code `ValidationError` if the YAML content is present but malformed.
|
|
41
|
+
* @example
|
|
42
|
+
* ```typescript
|
|
43
|
+
* import { frontmatterParser } from './frontmatterParser.js';
|
|
44
|
+
*
|
|
45
|
+
* const md = `---\ntitle: Hello\ntags: [a, b]\n---\n\n# Body`;
|
|
46
|
+
* const result = await frontmatterParser.parse<{ title: string; tags: string[] }>(md);
|
|
47
|
+
* // result.frontmatter → { title: 'Hello', tags: ['a', 'b'] }
|
|
48
|
+
* // result.content → '\n# Body'
|
|
49
|
+
* // result.hasFrontmatter → true
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
parse<T = unknown>(markdown: string, context?: RequestContext): Promise<FrontmatterResult<T>>;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Singleton instance of {@link FrontmatterParser}.
|
|
56
|
+
*
|
|
57
|
+
* Use this shared instance to extract and parse YAML frontmatter from markdown
|
|
58
|
+
* documents rather than constructing a new parser per call.
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* ```typescript
|
|
62
|
+
* import { frontmatterParser } from './frontmatterParser.js';
|
|
63
|
+
* import { requestContextService } from '../../utils/internal/requestContext.js';
|
|
64
|
+
*
|
|
65
|
+
* const context = requestContextService.createRequestContext({ operation: 'ParseObsidianNote' });
|
|
66
|
+
*
|
|
67
|
+
* // Markdown with frontmatter
|
|
68
|
+
* const markdown = `---
|
|
69
|
+
* title: My Note
|
|
70
|
+
* tags: [productivity, notes]
|
|
71
|
+
* date: 2025-01-15
|
|
72
|
+
* ---
|
|
73
|
+
*
|
|
74
|
+
* # Note Content
|
|
75
|
+
* This is the actual note.`;
|
|
76
|
+
*
|
|
77
|
+
* const result = await frontmatterParser.parse(markdown, context);
|
|
78
|
+
* console.log(result.frontmatter); // { title: 'My Note', tags: [...], date: '2025-01-15' }
|
|
79
|
+
* console.log(result.content); // '\n# Note Content\nThis is the actual note.'
|
|
80
|
+
* console.log(result.hasFrontmatter); // true
|
|
81
|
+
*
|
|
82
|
+
* // Markdown without frontmatter
|
|
83
|
+
* const plainMarkdown = '# Just Content';
|
|
84
|
+
* const result2 = await frontmatterParser.parse(plainMarkdown, context);
|
|
85
|
+
* console.log(result2.frontmatter); // {}
|
|
86
|
+
* console.log(result2.content); // '# Just Content'
|
|
87
|
+
* console.log(result2.hasFrontmatter); // false
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
export declare const frontmatterParser: FrontmatterParser;
|
|
91
|
+
//# sourceMappingURL=frontmatterParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatterParser.d.ts","sourceRoot":"","sources":["../../../src/utils/parsing/frontmatterParser.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,cAAc,EAAyB,MAAM,oCAAoC,CAAC;AAYhG;;;GAGG;AACH,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,OAAO;IAC5C;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,WAAW,EAAE,CAAC,CAAC;IACf;;OAEG;IACH,cAAc,EAAE,OAAO,CAAC;CACzB;AAED;;;;GAIG;AACH,qBAAa,iBAAiB;IAC5B;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACG,KAAK,CAAC,CAAC,GAAG,OAAO,EACrB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;CA+FjC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,eAAO,MAAM,iBAAiB,mBAA0B,CAAC"}
|