@arabold/docs-mcp-server 1.12.1 → 1.12.3
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/README.md +150 -161
- package/db/migrations/001-add-indexed-at-column.sql +1 -1
- package/dist/{DocumentManagementService-_qCZ1Hi2.js → DocumentManagementService-BupnR1eC.js} +3 -3
- package/dist/{DocumentManagementService-_qCZ1Hi2.js.map → DocumentManagementService-BupnR1eC.js.map} +1 -1
- package/dist/{EmbeddingFactory-BJMbJvje.js → EmbeddingFactory-DZKXkqOe.js} +2 -2
- package/dist/{EmbeddingFactory-BJMbJvje.js.map → EmbeddingFactory-DZKXkqOe.js.map} +1 -1
- package/dist/{FindVersionTool-CH1c3Tyu.js → FindVersionTool-BcnLvjlo.js} +2 -2
- package/dist/{FindVersionTool-CH1c3Tyu.js.map → FindVersionTool-BcnLvjlo.js.map} +1 -1
- package/dist/{RemoveTool-DmB1YJTA.js → RemoveTool-Bqpr8F9m.js} +2 -2
- package/dist/{RemoveTool-DmB1YJTA.js.map → RemoveTool-Bqpr8F9m.js.map} +1 -1
- package/dist/cli.js +3 -3
- package/dist/server.js +3 -3
- package/dist/web.js +2 -2
- package/package.json +1 -1
|
@@ -2,7 +2,7 @@ import { BedrockEmbeddings } from "@langchain/aws";
|
|
|
2
2
|
import { GoogleGenerativeAIEmbeddings } from "@langchain/google-genai";
|
|
3
3
|
import { VertexAIEmbeddings } from "@langchain/google-vertexai";
|
|
4
4
|
import { AzureOpenAIEmbeddings, OpenAIEmbeddings } from "@langchain/openai";
|
|
5
|
-
import { v as DimensionError, w as VECTOR_DIMENSION } from "./DocumentManagementService-
|
|
5
|
+
import { v as DimensionError, w as VECTOR_DIMENSION } from "./DocumentManagementService-BupnR1eC.js";
|
|
6
6
|
import { Embeddings } from "@langchain/core/embeddings";
|
|
7
7
|
class FixedDimensionEmbeddings extends Embeddings {
|
|
8
8
|
constructor(embeddings, targetDimension, providerAndModel, allowTruncate = false) {
|
|
@@ -171,4 +171,4 @@ export {
|
|
|
171
171
|
UnsupportedProviderError,
|
|
172
172
|
createEmbeddingModel
|
|
173
173
|
};
|
|
174
|
-
//# sourceMappingURL=EmbeddingFactory-
|
|
174
|
+
//# sourceMappingURL=EmbeddingFactory-DZKXkqOe.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmbeddingFactory-BJMbJvje.js","sources":["../src/store/embeddings/FixedDimensionEmbeddings.ts","../src/store/embeddings/EmbeddingFactory.ts"],"sourcesContent":["import { Embeddings } from \"@langchain/core/embeddings\";\nimport { DimensionError } from \"../errors\";\n\n/**\n * Wrapper around an Embeddings implementation that ensures vectors have a fixed dimension.\n * - If a vector's dimension is greater than the target and truncation is allowed,\n * the vector is truncated (e.g., for models that support MRL - Matryoshka\n * Representation Learning).\n * - If a vector's dimension is greater than the target and truncation is not\n * allowed, a DimensionError is thrown.\n * - If a vector's dimension is less than the target, it is padded with zeros.\n */\nexport class FixedDimensionEmbeddings extends Embeddings {\n private provider: string;\n private model: string;\n\n constructor(\n private readonly embeddings: Embeddings,\n private readonly targetDimension: number,\n providerAndModel: string,\n private readonly allowTruncate: boolean = false,\n ) {\n super({});\n // Parse provider and model from string (e.g., \"gemini:embedding-001\" or just \"text-embedding-3-small\")\n const [providerOrModel, modelName] = providerAndModel.split(\":\");\n this.provider = modelName ? providerOrModel : \"openai\"; // Default to openai if no provider specified\n this.model = modelName || providerOrModel;\n }\n\n /**\n * Normalize a vector to the target dimension by truncating (for MRL models) or padding.\n * @throws {DimensionError} If vector is too large and provider doesn't support MRL\n */\n private normalizeVector(vector: number[]): number[] {\n const dimension = vector.length;\n\n if (dimension > this.targetDimension) {\n // If truncation is allowed (e.g., for MRL models like Gemini), truncate the vector\n if (this.allowTruncate) {\n return vector.slice(0, this.targetDimension);\n }\n // Otherwise, throw an error\n throw new DimensionError(\n `${this.provider}:${this.model}`,\n dimension,\n this.targetDimension,\n );\n }\n\n if (dimension < this.targetDimension) {\n // Pad with zeros to reach target dimension\n return [...vector, ...new Array(this.targetDimension - dimension).fill(0)];\n }\n\n return vector;\n }\n\n async embedQuery(text: string): Promise<number[]> {\n const vector = await this.embeddings.embedQuery(text);\n return this.normalizeVector(vector);\n }\n\n async embedDocuments(documents: string[]): Promise<number[][]> {\n const vectors = await this.embeddings.embedDocuments(documents);\n return vectors.map((vector) => this.normalizeVector(vector));\n }\n}\n","import { BedrockEmbeddings } from \"@langchain/aws\";\nimport type { Embeddings } from \"@langchain/core/embeddings\";\nimport { GoogleGenerativeAIEmbeddings } from \"@langchain/google-genai\";\nimport { VertexAIEmbeddings } from \"@langchain/google-vertexai\";\nimport {\n AzureOpenAIEmbeddings,\n type ClientOptions,\n OpenAIEmbeddings,\n type OpenAIEmbeddingsParams,\n} from \"@langchain/openai\";\nimport { VECTOR_DIMENSION } from \"../types\";\nimport { FixedDimensionEmbeddings } from \"./FixedDimensionEmbeddings\";\n\n/**\n * Supported embedding model providers. Each provider requires specific environment\n * variables to be set for API access.\n */\nexport type EmbeddingProvider = \"openai\" | \"vertex\" | \"gemini\" | \"aws\" | \"microsoft\";\n\n/**\n * Error thrown when an invalid or unsupported embedding provider is specified.\n */\nexport class UnsupportedProviderError extends Error {\n constructor(provider: string) {\n super(`Unsupported embedding provider: ${provider}`);\n this.name = \"UnsupportedProviderError\";\n }\n}\n\n/**\n * Error thrown when there's an issue with the model configuration or missing environment variables.\n */\nexport class ModelConfigurationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ModelConfigurationError\";\n }\n}\n\n/**\n * Creates an embedding model instance based on the specified provider and model name.\n * The provider and model name should be specified in the format \"provider:model_name\"\n * (e.g., \"google:text-embedding-004\"). If no provider is specified (i.e., just \"model_name\"),\n * OpenAI is used as the default provider.\n *\n * Environment variables required per provider:\n * - OpenAI: OPENAI_API_KEY (and optionally OPENAI_API_BASE, OPENAI_ORG_ID)\n * - Google Cloud Vertex AI: GOOGLE_APPLICATION_CREDENTIALS (path to service account JSON)\n * - Google GenAI (Gemini): GOOGLE_API_KEY\n * - AWS: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION (or BEDROCK_AWS_REGION)\n * - Microsoft: AZURE_OPENAI_API_KEY, AZURE_OPENAI_API_INSTANCE_NAME, AZURE_OPENAI_API_DEPLOYMENT_NAME, AZURE_OPENAI_API_VERSION\n *\n * @param providerAndModel - The provider and model name in the format \"provider:model_name\"\n * or just \"model_name\" for OpenAI models.\n * @returns A configured instance of the appropriate Embeddings implementation.\n * @throws {UnsupportedProviderError} If an unsupported provider is specified.\n * @throws {ModelConfigurationError} If there's an issue with the model configuration.\n */\nexport function createEmbeddingModel(providerAndModel: string): Embeddings {\n // Parse provider and model name\n const [providerOrModel, modelName] = providerAndModel.split(\":\");\n const provider = modelName ? (providerOrModel as EmbeddingProvider) : \"openai\";\n const model = modelName || providerOrModel;\n\n // Default configuration for each provider\n const baseConfig = { stripNewLines: true };\n\n switch (provider) {\n case \"openai\": {\n const config: Partial<OpenAIEmbeddingsParams> & { configuration?: ClientOptions } =\n {\n ...baseConfig,\n modelName: model,\n batchSize: 512, // OpenAI supports large batches\n };\n // Add custom base URL if specified\n const baseURL = process.env.OPENAI_API_BASE;\n if (baseURL) {\n config.configuration = { baseURL };\n }\n return new OpenAIEmbeddings(config);\n }\n\n case \"vertex\": {\n if (!process.env.GOOGLE_APPLICATION_CREDENTIALS) {\n throw new ModelConfigurationError(\n \"GOOGLE_APPLICATION_CREDENTIALS environment variable is required for Google Cloud Vertex AI\",\n );\n }\n return new VertexAIEmbeddings({\n ...baseConfig,\n model: model, // e.g., \"text-embedding-004\"\n });\n }\n\n case \"gemini\": {\n if (!process.env.GOOGLE_API_KEY) {\n throw new ModelConfigurationError(\n \"GOOGLE_API_KEY environment variable is required for Google AI (Gemini)\",\n );\n }\n // Create base embeddings and wrap with FixedDimensionEmbeddings since Gemini\n // supports MRL (Matryoshka Representation Learning) for safe truncation\n const baseEmbeddings = new GoogleGenerativeAIEmbeddings({\n ...baseConfig,\n apiKey: process.env.GOOGLE_API_KEY,\n model: model, // e.g., \"gemini-embedding-exp-03-07\"\n });\n return new FixedDimensionEmbeddings(\n baseEmbeddings,\n VECTOR_DIMENSION,\n providerAndModel,\n true,\n );\n }\n\n case \"aws\": {\n // For AWS, model should be the full Bedrock model ID\n const region = process.env.BEDROCK_AWS_REGION || process.env.AWS_REGION;\n if (!region) {\n throw new ModelConfigurationError(\n \"BEDROCK_AWS_REGION or AWS_REGION environment variable is required for AWS Bedrock\",\n );\n }\n if (!process.env.AWS_ACCESS_KEY_ID || !process.env.AWS_SECRET_ACCESS_KEY) {\n throw new ModelConfigurationError(\n \"AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY environment variables are required for AWS Bedrock\",\n );\n }\n\n return new BedrockEmbeddings({\n ...baseConfig,\n model: model, // e.g., \"amazon.titan-embed-text-v1\"\n region,\n credentials: {\n accessKeyId: process.env.AWS_ACCESS_KEY_ID,\n secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,\n sessionToken: process.env.AWS_SESSION_TOKEN,\n },\n });\n }\n\n case \"microsoft\": {\n // For Azure, model name corresponds to the deployment name\n if (!process.env.AZURE_OPENAI_API_KEY) {\n throw new ModelConfigurationError(\n \"AZURE_OPENAI_API_KEY environment variable is required for Azure OpenAI\",\n );\n }\n if (!process.env.AZURE_OPENAI_API_INSTANCE_NAME) {\n throw new ModelConfigurationError(\n \"AZURE_OPENAI_API_INSTANCE_NAME environment variable is required for Azure OpenAI\",\n );\n }\n if (!process.env.AZURE_OPENAI_API_DEPLOYMENT_NAME) {\n throw new ModelConfigurationError(\n \"AZURE_OPENAI_API_DEPLOYMENT_NAME environment variable is required for Azure OpenAI\",\n );\n }\n if (!process.env.AZURE_OPENAI_API_VERSION) {\n throw new ModelConfigurationError(\n \"AZURE_OPENAI_API_VERSION environment variable is required for Azure OpenAI\",\n );\n }\n\n return new AzureOpenAIEmbeddings({\n ...baseConfig,\n azureOpenAIApiKey: process.env.AZURE_OPENAI_API_KEY,\n azureOpenAIApiInstanceName: process.env.AZURE_OPENAI_API_INSTANCE_NAME,\n azureOpenAIApiDeploymentName: process.env.AZURE_OPENAI_API_DEPLOYMENT_NAME,\n azureOpenAIApiVersion: process.env.AZURE_OPENAI_API_VERSION,\n deploymentName: model,\n });\n }\n\n default:\n throw new UnsupportedProviderError(provider);\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EmbeddingFactory-DZKXkqOe.js","sources":["../src/store/embeddings/FixedDimensionEmbeddings.ts","../src/store/embeddings/EmbeddingFactory.ts"],"sourcesContent":["import { Embeddings } from \"@langchain/core/embeddings\";\nimport { DimensionError } from \"../errors\";\n\n/**\n * Wrapper around an Embeddings implementation that ensures vectors have a fixed dimension.\n * - If a vector's dimension is greater than the target and truncation is allowed,\n * the vector is truncated (e.g., for models that support MRL - Matryoshka\n * Representation Learning).\n * - If a vector's dimension is greater than the target and truncation is not\n * allowed, a DimensionError is thrown.\n * - If a vector's dimension is less than the target, it is padded with zeros.\n */\nexport class FixedDimensionEmbeddings extends Embeddings {\n private provider: string;\n private model: string;\n\n constructor(\n private readonly embeddings: Embeddings,\n private readonly targetDimension: number,\n providerAndModel: string,\n private readonly allowTruncate: boolean = false,\n ) {\n super({});\n // Parse provider and model from string (e.g., \"gemini:embedding-001\" or just \"text-embedding-3-small\")\n const [providerOrModel, modelName] = providerAndModel.split(\":\");\n this.provider = modelName ? providerOrModel : \"openai\"; // Default to openai if no provider specified\n this.model = modelName || providerOrModel;\n }\n\n /**\n * Normalize a vector to the target dimension by truncating (for MRL models) or padding.\n * @throws {DimensionError} If vector is too large and provider doesn't support MRL\n */\n private normalizeVector(vector: number[]): number[] {\n const dimension = vector.length;\n\n if (dimension > this.targetDimension) {\n // If truncation is allowed (e.g., for MRL models like Gemini), truncate the vector\n if (this.allowTruncate) {\n return vector.slice(0, this.targetDimension);\n }\n // Otherwise, throw an error\n throw new DimensionError(\n `${this.provider}:${this.model}`,\n dimension,\n this.targetDimension,\n );\n }\n\n if (dimension < this.targetDimension) {\n // Pad with zeros to reach target dimension\n return [...vector, ...new Array(this.targetDimension - dimension).fill(0)];\n }\n\n return vector;\n }\n\n async embedQuery(text: string): Promise<number[]> {\n const vector = await this.embeddings.embedQuery(text);\n return this.normalizeVector(vector);\n }\n\n async embedDocuments(documents: string[]): Promise<number[][]> {\n const vectors = await this.embeddings.embedDocuments(documents);\n return vectors.map((vector) => this.normalizeVector(vector));\n }\n}\n","import { BedrockEmbeddings } from \"@langchain/aws\";\nimport type { Embeddings } from \"@langchain/core/embeddings\";\nimport { GoogleGenerativeAIEmbeddings } from \"@langchain/google-genai\";\nimport { VertexAIEmbeddings } from \"@langchain/google-vertexai\";\nimport {\n AzureOpenAIEmbeddings,\n type ClientOptions,\n OpenAIEmbeddings,\n type OpenAIEmbeddingsParams,\n} from \"@langchain/openai\";\nimport { VECTOR_DIMENSION } from \"../types\";\nimport { FixedDimensionEmbeddings } from \"./FixedDimensionEmbeddings\";\n\n/**\n * Supported embedding model providers. Each provider requires specific environment\n * variables to be set for API access.\n */\nexport type EmbeddingProvider = \"openai\" | \"vertex\" | \"gemini\" | \"aws\" | \"microsoft\";\n\n/**\n * Error thrown when an invalid or unsupported embedding provider is specified.\n */\nexport class UnsupportedProviderError extends Error {\n constructor(provider: string) {\n super(`Unsupported embedding provider: ${provider}`);\n this.name = \"UnsupportedProviderError\";\n }\n}\n\n/**\n * Error thrown when there's an issue with the model configuration or missing environment variables.\n */\nexport class ModelConfigurationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ModelConfigurationError\";\n }\n}\n\n/**\n * Creates an embedding model instance based on the specified provider and model name.\n * The provider and model name should be specified in the format \"provider:model_name\"\n * (e.g., \"google:text-embedding-004\"). If no provider is specified (i.e., just \"model_name\"),\n * OpenAI is used as the default provider.\n *\n * Environment variables required per provider:\n * - OpenAI: OPENAI_API_KEY (and optionally OPENAI_API_BASE, OPENAI_ORG_ID)\n * - Google Cloud Vertex AI: GOOGLE_APPLICATION_CREDENTIALS (path to service account JSON)\n * - Google GenAI (Gemini): GOOGLE_API_KEY\n * - AWS: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION (or BEDROCK_AWS_REGION)\n * - Microsoft: AZURE_OPENAI_API_KEY, AZURE_OPENAI_API_INSTANCE_NAME, AZURE_OPENAI_API_DEPLOYMENT_NAME, AZURE_OPENAI_API_VERSION\n *\n * @param providerAndModel - The provider and model name in the format \"provider:model_name\"\n * or just \"model_name\" for OpenAI models.\n * @returns A configured instance of the appropriate Embeddings implementation.\n * @throws {UnsupportedProviderError} If an unsupported provider is specified.\n * @throws {ModelConfigurationError} If there's an issue with the model configuration.\n */\nexport function createEmbeddingModel(providerAndModel: string): Embeddings {\n // Parse provider and model name\n const [providerOrModel, modelName] = providerAndModel.split(\":\");\n const provider = modelName ? (providerOrModel as EmbeddingProvider) : \"openai\";\n const model = modelName || providerOrModel;\n\n // Default configuration for each provider\n const baseConfig = { stripNewLines: true };\n\n switch (provider) {\n case \"openai\": {\n const config: Partial<OpenAIEmbeddingsParams> & { configuration?: ClientOptions } =\n {\n ...baseConfig,\n modelName: model,\n batchSize: 512, // OpenAI supports large batches\n };\n // Add custom base URL if specified\n const baseURL = process.env.OPENAI_API_BASE;\n if (baseURL) {\n config.configuration = { baseURL };\n }\n return new OpenAIEmbeddings(config);\n }\n\n case \"vertex\": {\n if (!process.env.GOOGLE_APPLICATION_CREDENTIALS) {\n throw new ModelConfigurationError(\n \"GOOGLE_APPLICATION_CREDENTIALS environment variable is required for Google Cloud Vertex AI\",\n );\n }\n return new VertexAIEmbeddings({\n ...baseConfig,\n model: model, // e.g., \"text-embedding-004\"\n });\n }\n\n case \"gemini\": {\n if (!process.env.GOOGLE_API_KEY) {\n throw new ModelConfigurationError(\n \"GOOGLE_API_KEY environment variable is required for Google AI (Gemini)\",\n );\n }\n // Create base embeddings and wrap with FixedDimensionEmbeddings since Gemini\n // supports MRL (Matryoshka Representation Learning) for safe truncation\n const baseEmbeddings = new GoogleGenerativeAIEmbeddings({\n ...baseConfig,\n apiKey: process.env.GOOGLE_API_KEY,\n model: model, // e.g., \"gemini-embedding-exp-03-07\"\n });\n return new FixedDimensionEmbeddings(\n baseEmbeddings,\n VECTOR_DIMENSION,\n providerAndModel,\n true,\n );\n }\n\n case \"aws\": {\n // For AWS, model should be the full Bedrock model ID\n const region = process.env.BEDROCK_AWS_REGION || process.env.AWS_REGION;\n if (!region) {\n throw new ModelConfigurationError(\n \"BEDROCK_AWS_REGION or AWS_REGION environment variable is required for AWS Bedrock\",\n );\n }\n if (!process.env.AWS_ACCESS_KEY_ID || !process.env.AWS_SECRET_ACCESS_KEY) {\n throw new ModelConfigurationError(\n \"AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY environment variables are required for AWS Bedrock\",\n );\n }\n\n return new BedrockEmbeddings({\n ...baseConfig,\n model: model, // e.g., \"amazon.titan-embed-text-v1\"\n region,\n credentials: {\n accessKeyId: process.env.AWS_ACCESS_KEY_ID,\n secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,\n sessionToken: process.env.AWS_SESSION_TOKEN,\n },\n });\n }\n\n case \"microsoft\": {\n // For Azure, model name corresponds to the deployment name\n if (!process.env.AZURE_OPENAI_API_KEY) {\n throw new ModelConfigurationError(\n \"AZURE_OPENAI_API_KEY environment variable is required for Azure OpenAI\",\n );\n }\n if (!process.env.AZURE_OPENAI_API_INSTANCE_NAME) {\n throw new ModelConfigurationError(\n \"AZURE_OPENAI_API_INSTANCE_NAME environment variable is required for Azure OpenAI\",\n );\n }\n if (!process.env.AZURE_OPENAI_API_DEPLOYMENT_NAME) {\n throw new ModelConfigurationError(\n \"AZURE_OPENAI_API_DEPLOYMENT_NAME environment variable is required for Azure OpenAI\",\n );\n }\n if (!process.env.AZURE_OPENAI_API_VERSION) {\n throw new ModelConfigurationError(\n \"AZURE_OPENAI_API_VERSION environment variable is required for Azure OpenAI\",\n );\n }\n\n return new AzureOpenAIEmbeddings({\n ...baseConfig,\n azureOpenAIApiKey: process.env.AZURE_OPENAI_API_KEY,\n azureOpenAIApiInstanceName: process.env.AZURE_OPENAI_API_INSTANCE_NAME,\n azureOpenAIApiDeploymentName: process.env.AZURE_OPENAI_API_DEPLOYMENT_NAME,\n azureOpenAIApiVersion: process.env.AZURE_OPENAI_API_VERSION,\n deploymentName: model,\n });\n }\n\n default:\n throw new UnsupportedProviderError(provider);\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { j as ScrapeMode, T as ToolError, l as logger, k as HtmlPlaywrightMiddleware, m as HtmlCheerioParserMiddleware, n as HtmlMetadataExtractorMiddleware, o as HtmlSanitizerMiddleware, p as HtmlToMarkdownMiddleware, C as ContentProcessingPipeline, M as MarkdownMetadataExtractorMiddleware, q as ScraperError, V as VersionNotFoundError } from "./DocumentManagementService-
|
|
1
|
+
import { j as ScrapeMode, T as ToolError, l as logger, k as HtmlPlaywrightMiddleware, m as HtmlCheerioParserMiddleware, n as HtmlMetadataExtractorMiddleware, o as HtmlSanitizerMiddleware, p as HtmlToMarkdownMiddleware, C as ContentProcessingPipeline, M as MarkdownMetadataExtractorMiddleware, q as ScraperError, V as VersionNotFoundError } from "./DocumentManagementService-BupnR1eC.js";
|
|
2
2
|
import "node:vm";
|
|
3
3
|
import "jsdom";
|
|
4
4
|
class FetchUrlTool {
|
|
@@ -167,4 +167,4 @@ export {
|
|
|
167
167
|
FetchUrlTool as F,
|
|
168
168
|
FindVersionTool as a
|
|
169
169
|
};
|
|
170
|
-
//# sourceMappingURL=FindVersionTool-
|
|
170
|
+
//# sourceMappingURL=FindVersionTool-BcnLvjlo.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FindVersionTool-CH1c3Tyu.js","sources":["../src/tools/FetchUrlTool.ts","../src/tools/FindVersionTool.ts"],"sourcesContent":["import type {\n ContentFetcher,\n FileFetcher,\n HttpFetcher,\n RawContent,\n} from \"../scraper/fetcher\";\nimport { ContentProcessingPipeline } from \"../scraper/middleware/ContentProcessorPipeline\";\nimport {\n HtmlCheerioParserMiddleware,\n HtmlMetadataExtractorMiddleware,\n HtmlPlaywrightMiddleware,\n HtmlSanitizerMiddleware,\n HtmlToMarkdownMiddleware,\n MarkdownMetadataExtractorMiddleware,\n} from \"../scraper/middleware/components\";\nimport type { ContentProcessorMiddleware } from \"../scraper/middleware/types\";\nimport type { ContentProcessingContext } from \"../scraper/middleware/types\";\nimport { ScrapeMode, type ScraperOptions } from \"../scraper/types\";\nimport { ScraperError } from \"../utils/errors\";\nimport { logger } from \"../utils/logger\";\nimport { ToolError } from \"./errors\";\n\nexport interface FetchUrlToolOptions {\n /**\n * The URL to fetch and convert to markdown.\n * Must be a valid HTTP/HTTPS URL or file:// URL.\n */\n url: string;\n\n /**\n * Whether to follow HTTP redirects.\n * @default true\n */\n followRedirects?: boolean;\n\n /**\n * Determines the HTML processing strategy.\n * - 'fetch': Use a simple DOM parser (faster, less JS support).\n * - 'playwright': Use a headless browser (slower, full JS support).\n * - 'auto': Automatically select the best strategy (currently defaults to 'playwright').\n * @default ScrapeMode.Auto\n */\n scrapeMode?: ScrapeMode;\n}\n\n/**\n * Tool for fetching a single URL and converting its content to Markdown.\n * Unlike scrape_docs, this tool only processes one page without crawling\n * or storing the content.\n *\n * Supports both HTTP/HTTPS URLs and local file URLs (file://).\n */\nexport class FetchUrlTool {\n /**\n * Collection of fetchers that will be tried in order for a given URL.\n */\n private readonly fetchers: ContentFetcher[];\n\n constructor(httpFetcher: HttpFetcher, fileFetcher: FileFetcher) {\n // Removed processor dependency\n this.fetchers = [httpFetcher, fileFetcher];\n }\n\n /**\n * Fetches content from a URL and converts it to Markdown.\n * Supports both HTTP/HTTPS URLs and local file URLs (file://).\n * @returns The processed Markdown content\n * @throws {ToolError} If fetching or processing fails\n */\n async execute(options: FetchUrlToolOptions): Promise<string> {\n const { url, scrapeMode = ScrapeMode.Auto } = options; // Destructure scrapeMode with enum default\n\n // Check all fetchers first (helpful for testing and future extensions)\n const canFetchResults = this.fetchers.map((f) => f.canFetch(url));\n\n // Find an appropriate fetcher for this URL\n const fetcherIndex = canFetchResults.findIndex((result) => result === true);\n if (fetcherIndex === -1) {\n throw new ToolError(\n `Invalid URL: ${url}. Must be an HTTP/HTTPS URL or a file:// URL.`,\n this.constructor.name,\n );\n }\n\n const fetcher = this.fetchers[fetcherIndex];\n\n // Instantiate Playwright middleware locally for this execution\n const playwrightMiddleware = new HtmlPlaywrightMiddleware();\n\n try {\n // Fetch the content\n logger.info(`📡 Fetching ${url}...`);\n const rawContent: RawContent = await fetcher.fetch(url, {\n followRedirects: options.followRedirects ?? true,\n maxRetries: 3, // Keep retries for fetching\n });\n\n // --- Start Middleware Pipeline ---\n logger.info(\"🔄 Processing content...\");\n const initialContext: ContentProcessingContext = {\n content: rawContent.content,\n contentType: rawContent.mimeType,\n source: rawContent.source,\n metadata: {},\n links: [], // Links not needed for this tool's output\n errors: [],\n fetcher,\n // Create a minimal ScraperOptions object for the context\n options: {\n url: url, // Use the input URL\n library: \"\", // Not applicable for this tool\n version: \"\", // Use empty string instead of undefined\n // Default other options as needed by middleware\n maxDepth: 0,\n maxPages: 1,\n maxConcurrency: 1,\n scope: \"subpages\", // Default, though not used for single page fetch\n followRedirects: options.followRedirects ?? true,\n excludeSelectors: undefined, // Not currently configurable via this tool\n ignoreErrors: false,\n scrapeMode: scrapeMode, // Pass the scrapeMode\n } satisfies ScraperOptions,\n };\n\n let pipeline: ContentProcessingPipeline;\n if (initialContext.contentType.startsWith(\"text/html\")) {\n // Construct HTML pipeline similar to WebScraperStrategy\n const htmlPipelineSteps: ContentProcessorMiddleware[] = [\n playwrightMiddleware, // Use the instantiated middleware\n new HtmlCheerioParserMiddleware(), // Always runs after content is finalized\n new HtmlMetadataExtractorMiddleware(), // Keep for potential future use\n // No Link Extractor needed for this tool\n new HtmlSanitizerMiddleware(), // Element remover\n new HtmlToMarkdownMiddleware(),\n ];\n pipeline = new ContentProcessingPipeline(htmlPipelineSteps);\n } else if (\n initialContext.contentType === \"text/markdown\" ||\n initialContext.contentType === \"text/plain\"\n ) {\n pipeline = new ContentProcessingPipeline([\n new MarkdownMetadataExtractorMiddleware(), // Extract title (though not used)\n // No further processing needed for Markdown/Plain text for this tool\n ]);\n } else {\n // If content type is not HTML or Markdown/Plain, return raw content as string\n logger.warn(\n `Unsupported content type \"${initialContext.contentType}\" for ${url}. Returning raw content.`,\n );\n const contentString =\n typeof rawContent.content === \"string\"\n ? rawContent.content\n : Buffer.from(rawContent.content).toString(\"utf-8\");\n return contentString;\n }\n\n const finalContext = await pipeline.run(initialContext);\n // --- End Middleware Pipeline ---\n\n // Log any processing errors\n for (const err of finalContext.errors) {\n logger.warn(`Processing error for ${url}: ${err.message}`);\n }\n\n if (typeof finalContext.content !== \"string\" || !finalContext.content.trim()) {\n throw new ToolError(\n `Processing resulted in empty content for ${url}`,\n this.constructor.name,\n );\n }\n\n logger.info(`✅ Successfully processed ${url}`);\n return finalContext.content; // Return the final processed content string\n } catch (error) {\n // Handle fetch errors and pipeline errors\n if (error instanceof ScraperError || error instanceof ToolError) {\n throw new ToolError(\n `Failed to fetch or process URL: ${error.message}`,\n this.constructor.name,\n );\n }\n throw new ToolError(\n `Failed to fetch or process URL: ${error instanceof Error ? error.message : String(error)}`,\n this.constructor.name,\n );\n } finally {\n // Ensure the browser is closed after execution\n await playwrightMiddleware.closeBrowser();\n }\n }\n}\n","import type { DocumentManagementService } from \"../store\";\nimport { logger } from \"../utils/logger\";\nimport { VersionNotFoundError } from \"./errors\";\n\nexport interface FindVersionToolOptions {\n library: string;\n targetVersion?: string;\n}\n\n/**\n * Tool for finding the best matching version of a library in the store.\n * Supports exact version matches and X-Range patterns (e.g., '5.x', '5.2.x').\n */\nexport class FindVersionTool {\n private docService: DocumentManagementService;\n\n constructor(docService: DocumentManagementService) {\n this.docService = docService;\n }\n\n /**\n * Executes the tool to find the best matching version and checks for unversioned docs.\n * @returns A descriptive string indicating the best match and unversioned status, or an error message.\n */\n async execute(options: FindVersionToolOptions): Promise<string> {\n const { library, targetVersion } = options;\n const targetVersionString = targetVersion ? `@${targetVersion}` : \"\";\n\n try {\n const { bestMatch, hasUnversioned } = await this.docService.findBestVersion(\n library,\n targetVersion,\n );\n\n let message = \"\";\n if (bestMatch) {\n message = `Best match: ${bestMatch}.`;\n if (hasUnversioned) {\n message += \" Unversioned docs also available.\";\n }\n } else if (hasUnversioned) {\n message = `No matching version found for ${library}${targetVersionString}, but unversioned docs exist.`;\n } else {\n // This case should ideally be caught by VersionNotFoundError below,\n // but added for completeness.\n message = `No matching version or unversioned documents found for ${library}${targetVersionString}.`;\n }\n return message;\n } catch (error) {\n if (error instanceof VersionNotFoundError) {\n // This error is thrown when no semver versions AND no unversioned docs exist.\n logger.info(`ℹ️ Version not found: ${error.message}`);\n return `No matching version or unversioned documents found for ${library}${targetVersionString}. Available: ${\n error.availableVersions.length > 0\n ? error.availableVersions.map((v) => v.version).join(\", \")\n : \"None\"\n }.`;\n }\n // Re-throw unexpected errors\n logger.error(\n `❌ Error finding version for ${library}${targetVersionString}: ${error instanceof Error ? error.message : error}`,\n );\n throw error;\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FindVersionTool-BcnLvjlo.js","sources":["../src/tools/FetchUrlTool.ts","../src/tools/FindVersionTool.ts"],"sourcesContent":["import type {\n ContentFetcher,\n FileFetcher,\n HttpFetcher,\n RawContent,\n} from \"../scraper/fetcher\";\nimport { ContentProcessingPipeline } from \"../scraper/middleware/ContentProcessorPipeline\";\nimport {\n HtmlCheerioParserMiddleware,\n HtmlMetadataExtractorMiddleware,\n HtmlPlaywrightMiddleware,\n HtmlSanitizerMiddleware,\n HtmlToMarkdownMiddleware,\n MarkdownMetadataExtractorMiddleware,\n} from \"../scraper/middleware/components\";\nimport type { ContentProcessorMiddleware } from \"../scraper/middleware/types\";\nimport type { ContentProcessingContext } from \"../scraper/middleware/types\";\nimport { ScrapeMode, type ScraperOptions } from \"../scraper/types\";\nimport { ScraperError } from \"../utils/errors\";\nimport { logger } from \"../utils/logger\";\nimport { ToolError } from \"./errors\";\n\nexport interface FetchUrlToolOptions {\n /**\n * The URL to fetch and convert to markdown.\n * Must be a valid HTTP/HTTPS URL or file:// URL.\n */\n url: string;\n\n /**\n * Whether to follow HTTP redirects.\n * @default true\n */\n followRedirects?: boolean;\n\n /**\n * Determines the HTML processing strategy.\n * - 'fetch': Use a simple DOM parser (faster, less JS support).\n * - 'playwright': Use a headless browser (slower, full JS support).\n * - 'auto': Automatically select the best strategy (currently defaults to 'playwright').\n * @default ScrapeMode.Auto\n */\n scrapeMode?: ScrapeMode;\n}\n\n/**\n * Tool for fetching a single URL and converting its content to Markdown.\n * Unlike scrape_docs, this tool only processes one page without crawling\n * or storing the content.\n *\n * Supports both HTTP/HTTPS URLs and local file URLs (file://).\n */\nexport class FetchUrlTool {\n /**\n * Collection of fetchers that will be tried in order for a given URL.\n */\n private readonly fetchers: ContentFetcher[];\n\n constructor(httpFetcher: HttpFetcher, fileFetcher: FileFetcher) {\n // Removed processor dependency\n this.fetchers = [httpFetcher, fileFetcher];\n }\n\n /**\n * Fetches content from a URL and converts it to Markdown.\n * Supports both HTTP/HTTPS URLs and local file URLs (file://).\n * @returns The processed Markdown content\n * @throws {ToolError} If fetching or processing fails\n */\n async execute(options: FetchUrlToolOptions): Promise<string> {\n const { url, scrapeMode = ScrapeMode.Auto } = options; // Destructure scrapeMode with enum default\n\n // Check all fetchers first (helpful for testing and future extensions)\n const canFetchResults = this.fetchers.map((f) => f.canFetch(url));\n\n // Find an appropriate fetcher for this URL\n const fetcherIndex = canFetchResults.findIndex((result) => result === true);\n if (fetcherIndex === -1) {\n throw new ToolError(\n `Invalid URL: ${url}. Must be an HTTP/HTTPS URL or a file:// URL.`,\n this.constructor.name,\n );\n }\n\n const fetcher = this.fetchers[fetcherIndex];\n\n // Instantiate Playwright middleware locally for this execution\n const playwrightMiddleware = new HtmlPlaywrightMiddleware();\n\n try {\n // Fetch the content\n logger.info(`📡 Fetching ${url}...`);\n const rawContent: RawContent = await fetcher.fetch(url, {\n followRedirects: options.followRedirects ?? true,\n maxRetries: 3, // Keep retries for fetching\n });\n\n // --- Start Middleware Pipeline ---\n logger.info(\"🔄 Processing content...\");\n const initialContext: ContentProcessingContext = {\n content: rawContent.content,\n contentType: rawContent.mimeType,\n source: rawContent.source,\n metadata: {},\n links: [], // Links not needed for this tool's output\n errors: [],\n fetcher,\n // Create a minimal ScraperOptions object for the context\n options: {\n url: url, // Use the input URL\n library: \"\", // Not applicable for this tool\n version: \"\", // Use empty string instead of undefined\n // Default other options as needed by middleware\n maxDepth: 0,\n maxPages: 1,\n maxConcurrency: 1,\n scope: \"subpages\", // Default, though not used for single page fetch\n followRedirects: options.followRedirects ?? true,\n excludeSelectors: undefined, // Not currently configurable via this tool\n ignoreErrors: false,\n scrapeMode: scrapeMode, // Pass the scrapeMode\n } satisfies ScraperOptions,\n };\n\n let pipeline: ContentProcessingPipeline;\n if (initialContext.contentType.startsWith(\"text/html\")) {\n // Construct HTML pipeline similar to WebScraperStrategy\n const htmlPipelineSteps: ContentProcessorMiddleware[] = [\n playwrightMiddleware, // Use the instantiated middleware\n new HtmlCheerioParserMiddleware(), // Always runs after content is finalized\n new HtmlMetadataExtractorMiddleware(), // Keep for potential future use\n // No Link Extractor needed for this tool\n new HtmlSanitizerMiddleware(), // Element remover\n new HtmlToMarkdownMiddleware(),\n ];\n pipeline = new ContentProcessingPipeline(htmlPipelineSteps);\n } else if (\n initialContext.contentType === \"text/markdown\" ||\n initialContext.contentType === \"text/plain\"\n ) {\n pipeline = new ContentProcessingPipeline([\n new MarkdownMetadataExtractorMiddleware(), // Extract title (though not used)\n // No further processing needed for Markdown/Plain text for this tool\n ]);\n } else {\n // If content type is not HTML or Markdown/Plain, return raw content as string\n logger.warn(\n `Unsupported content type \"${initialContext.contentType}\" for ${url}. Returning raw content.`,\n );\n const contentString =\n typeof rawContent.content === \"string\"\n ? rawContent.content\n : Buffer.from(rawContent.content).toString(\"utf-8\");\n return contentString;\n }\n\n const finalContext = await pipeline.run(initialContext);\n // --- End Middleware Pipeline ---\n\n // Log any processing errors\n for (const err of finalContext.errors) {\n logger.warn(`Processing error for ${url}: ${err.message}`);\n }\n\n if (typeof finalContext.content !== \"string\" || !finalContext.content.trim()) {\n throw new ToolError(\n `Processing resulted in empty content for ${url}`,\n this.constructor.name,\n );\n }\n\n logger.info(`✅ Successfully processed ${url}`);\n return finalContext.content; // Return the final processed content string\n } catch (error) {\n // Handle fetch errors and pipeline errors\n if (error instanceof ScraperError || error instanceof ToolError) {\n throw new ToolError(\n `Failed to fetch or process URL: ${error.message}`,\n this.constructor.name,\n );\n }\n throw new ToolError(\n `Failed to fetch or process URL: ${error instanceof Error ? error.message : String(error)}`,\n this.constructor.name,\n );\n } finally {\n // Ensure the browser is closed after execution\n await playwrightMiddleware.closeBrowser();\n }\n }\n}\n","import type { DocumentManagementService } from \"../store\";\nimport { logger } from \"../utils/logger\";\nimport { VersionNotFoundError } from \"./errors\";\n\nexport interface FindVersionToolOptions {\n library: string;\n targetVersion?: string;\n}\n\n/**\n * Tool for finding the best matching version of a library in the store.\n * Supports exact version matches and X-Range patterns (e.g., '5.x', '5.2.x').\n */\nexport class FindVersionTool {\n private docService: DocumentManagementService;\n\n constructor(docService: DocumentManagementService) {\n this.docService = docService;\n }\n\n /**\n * Executes the tool to find the best matching version and checks for unversioned docs.\n * @returns A descriptive string indicating the best match and unversioned status, or an error message.\n */\n async execute(options: FindVersionToolOptions): Promise<string> {\n const { library, targetVersion } = options;\n const targetVersionString = targetVersion ? `@${targetVersion}` : \"\";\n\n try {\n const { bestMatch, hasUnversioned } = await this.docService.findBestVersion(\n library,\n targetVersion,\n );\n\n let message = \"\";\n if (bestMatch) {\n message = `Best match: ${bestMatch}.`;\n if (hasUnversioned) {\n message += \" Unversioned docs also available.\";\n }\n } else if (hasUnversioned) {\n message = `No matching version found for ${library}${targetVersionString}, but unversioned docs exist.`;\n } else {\n // This case should ideally be caught by VersionNotFoundError below,\n // but added for completeness.\n message = `No matching version or unversioned documents found for ${library}${targetVersionString}.`;\n }\n return message;\n } catch (error) {\n if (error instanceof VersionNotFoundError) {\n // This error is thrown when no semver versions AND no unversioned docs exist.\n logger.info(`ℹ️ Version not found: ${error.message}`);\n return `No matching version or unversioned documents found for ${library}${targetVersionString}. Available: ${\n error.availableVersions.length > 0\n ? error.availableVersions.map((v) => v.version).join(\", \")\n : \"None\"\n }.`;\n }\n // Re-throw unexpected errors\n logger.error(\n `❌ Error finding version for ${library}${targetVersionString}: ${error instanceof Error ? error.message : error}`,\n );\n throw error;\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { l as logger, T as ToolError } from "./DocumentManagementService-
|
|
1
|
+
import { l as logger, T as ToolError } from "./DocumentManagementService-BupnR1eC.js";
|
|
2
2
|
class ListJobsTool {
|
|
3
3
|
manager;
|
|
4
4
|
// Change property name and type
|
|
@@ -62,4 +62,4 @@ export {
|
|
|
62
62
|
ListJobsTool as L,
|
|
63
63
|
RemoveTool as R
|
|
64
64
|
};
|
|
65
|
-
//# sourceMappingURL=RemoveTool-
|
|
65
|
+
//# sourceMappingURL=RemoveTool-Bqpr8F9m.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RemoveTool-
|
|
1
|
+
{"version":3,"file":"RemoveTool-Bqpr8F9m.js","sources":["../src/tools/ListJobsTool.ts","../src/tools/RemoveTool.ts"],"sourcesContent":["import type { PipelineManager } from \"../pipeline/PipelineManager\";\nimport type { PipelineJob, PipelineJobStatus } from \"../pipeline/types\";\nimport type { JobInfo } from \"./GetJobInfoTool\"; // Import JobInfo\n\n/**\n * Input parameters for the ListJobsTool.\n */\nexport interface ListJobsInput {\n /** Optional status to filter jobs by. */\n status?: PipelineJobStatus;\n}\n\n/**\n * Response structure for the ListJobsTool.\n */\nexport interface ListJobsToolResponse {\n jobs: JobInfo[];\n}\n\n/**\n * Tool for listing pipeline jobs managed by the PipelineManager.\n * Allows filtering jobs by their status.\n */\nexport class ListJobsTool {\n private manager: PipelineManager; // Change property name and type\n\n /**\n * Creates an instance of ListJobsTool.\n * @param manager The PipelineManager instance.\n */\n constructor(manager: PipelineManager) {\n // Change constructor parameter\n this.manager = manager;\n }\n\n /**\n * Executes the tool to retrieve a list of pipeline jobs.\n * @param input - The input parameters, optionally including a status filter.\n * @returns A promise that resolves with the list of simplified job objects.\n * @throws {PipelineStateError} If the pipeline manager is somehow unavailable.\n */\n async execute(input: ListJobsInput): Promise<ListJobsToolResponse> {\n const jobs = await this.manager.getJobs(input.status);\n\n // Transform jobs into simplified objects\n const simplifiedJobs: JobInfo[] = jobs.map(\n (job: PipelineJob): JobInfo => ({\n id: job.id,\n library: job.library,\n version: job.version,\n status: job.status,\n createdAt: job.createdAt.toISOString(),\n startedAt: job.startedAt?.toISOString() ?? null,\n finishedAt: job.finishedAt?.toISOString() ?? null,\n error: job.error?.message ?? null,\n }),\n );\n\n return { jobs: simplifiedJobs };\n }\n}\n","import type { DocumentManagementService } from \"../store\";\nimport { logger } from \"../utils/logger\";\nimport { ToolError } from \"./errors\";\n\n/**\n * Represents the arguments for the remove_docs tool.\n * The MCP server should validate the input against RemoveToolInputSchema before calling execute.\n */\nexport interface RemoveToolArgs {\n library: string;\n version?: string;\n}\n\n/**\n * Tool to remove indexed documentation for a specific library version.\n * This class provides the core logic, intended to be called by the McpServer.\n */\nexport class RemoveTool {\n constructor(private readonly documentManagementService: DocumentManagementService) {}\n\n /**\n * Executes the tool to remove the specified library version documents.\n * Assumes args have been validated by the caller (McpServer) against inputSchema.\n * Returns a simple success message or throws an error.\n */\n async execute(args: RemoveToolArgs): Promise<{ message: string }> {\n const { library, version } = args;\n\n logger.info(\n `Removing library: ${library}${version ? `, version: ${version}` : \" (unversioned)\"}`,\n );\n\n try {\n // Core logic: Call the document management service\n await this.documentManagementService.removeAllDocuments(library, version);\n\n const message = `Successfully removed documents for ${library}${version ? `@${version}` : \" (unversioned)\"}.`;\n logger.info(message);\n // Return a simple success object, the McpServer will format the final response\n return { message };\n } catch (error) {\n const errorMessage = `Failed to remove documents for ${library}${version ? `@${version}` : \" (unversioned)\"}: ${error instanceof Error ? error.message : String(error)}`;\n logger.error(`Error removing library: ${errorMessage}`);\n // Re-throw the error for the McpServer to handle and format\n throw new ToolError(errorMessage, this.constructor.name);\n }\n }\n}\n"],"names":[],"mappings":";AAuBO,MAAM,aAAa;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMR,YAAY,SAA0B;AAEpC,SAAK,UAAU;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASjB,MAAM,QAAQ,OAAqD;AACjE,UAAM,OAAO,MAAM,KAAK,QAAQ,QAAQ,MAAM,MAAM;AAGpD,UAAM,iBAA4B,KAAK;AAAA,MACrC,CAAC,SAA+B;AAAA,QAC9B,IAAI,IAAI;AAAA,QACR,SAAS,IAAI;AAAA,QACb,SAAS,IAAI;AAAA,QACb,QAAQ,IAAI;AAAA,QACZ,WAAW,IAAI,UAAU,YAAY;AAAA,QACrC,WAAW,IAAI,WAAW,YAAiB,KAAA;AAAA,QAC3C,YAAY,IAAI,YAAY,YAAiB,KAAA;AAAA,QAC7C,OAAO,IAAI,OAAO,WAAW;AAAA,MAC/B;AAAA,IACF;AAEO,WAAA,EAAE,MAAM,eAAe;AAAA,EAAA;AAElC;AC3CO,MAAM,WAAW;AAAA,EACtB,YAA6B,2BAAsD;AAAtD,SAAA,4BAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO7B,MAAM,QAAQ,MAAoD;AAC1D,UAAA,EAAE,SAAS,QAAA,IAAY;AAEtB,WAAA;AAAA,MACL,qBAAqB,OAAO,GAAG,UAAU,cAAc,OAAO,KAAK,gBAAgB;AAAA,IACrF;AAEI,QAAA;AAEF,YAAM,KAAK,0BAA0B,mBAAmB,SAAS,OAAO;AAElE,YAAA,UAAU,sCAAsC,OAAO,GAAG,UAAU,IAAI,OAAO,KAAK,gBAAgB;AAC1G,aAAO,KAAK,OAAO;AAEnB,aAAO,EAAE,QAAQ;AAAA,aACV,OAAO;AACd,YAAM,eAAe,kCAAkC,OAAO,GAAG,UAAU,IAAI,OAAO,KAAK,gBAAgB,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAC/J,aAAA,MAAM,2BAA2B,YAAY,EAAE;AAEtD,YAAM,IAAI,UAAU,cAAc,KAAK,YAAY,IAAI;AAAA,IAAA;AAAA,EACzD;AAEJ;"}
|
package/dist/cli.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import "dotenv/config";
|
|
3
3
|
import { Command } from "commander";
|
|
4
|
-
import { D as DocumentManagementService, a as PipelineManager, H as HttpFetcher, F as FileFetcher, S as SearchTool, e as ScrapeTool, f as ListLibrariesTool, c as DEFAULT_MAX_PAGES, b as DEFAULT_MAX_DEPTH, i as DEFAULT_MAX_CONCURRENCY, j as ScrapeMode, s as setLogLevel, d as LogLevel } from "./DocumentManagementService-
|
|
4
|
+
import { D as DocumentManagementService, a as PipelineManager, H as HttpFetcher, F as FileFetcher, S as SearchTool, e as ScrapeTool, f as ListLibrariesTool, c as DEFAULT_MAX_PAGES, b as DEFAULT_MAX_DEPTH, i as DEFAULT_MAX_CONCURRENCY, j as ScrapeMode, s as setLogLevel, d as LogLevel } from "./DocumentManagementService-BupnR1eC.js";
|
|
5
5
|
import "semver";
|
|
6
|
-
import { F as FetchUrlTool, a as FindVersionTool } from "./FindVersionTool-
|
|
6
|
+
import { F as FetchUrlTool, a as FindVersionTool } from "./FindVersionTool-BcnLvjlo.js";
|
|
7
7
|
const name = "@arabold/docs-mcp-server";
|
|
8
|
-
const version = "1.12.
|
|
8
|
+
const version = "1.12.2";
|
|
9
9
|
const description = "MCP server for fetching and searching documentation";
|
|
10
10
|
const type = "module";
|
|
11
11
|
const bin = { "docs-server": "dist/server.js", "docs-cli": "dist/cli.js", "docs-web": "dist/web.js" };
|
package/dist/server.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import "dotenv/config";
|
|
3
3
|
import { program } from "commander";
|
|
4
|
-
import { l as logger, P as PipelineJobStatus, D as DocumentManagementService, a as PipelineManager, b as DEFAULT_MAX_DEPTH, c as DEFAULT_MAX_PAGES, L as LibraryNotFoundError, V as VersionNotFoundError, s as setLogLevel, d as LogLevel, H as HttpFetcher, F as FileFetcher, S as SearchTool, e as ScrapeTool, f as ListLibrariesTool, g as DEFAULT_PROTOCOL, h as DEFAULT_HTTP_PORT } from "./DocumentManagementService-
|
|
4
|
+
import { l as logger, P as PipelineJobStatus, D as DocumentManagementService, a as PipelineManager, b as DEFAULT_MAX_DEPTH, c as DEFAULT_MAX_PAGES, L as LibraryNotFoundError, V as VersionNotFoundError, s as setLogLevel, d as LogLevel, H as HttpFetcher, F as FileFetcher, S as SearchTool, e as ScrapeTool, f as ListLibrariesTool, g as DEFAULT_PROTOCOL, h as DEFAULT_HTTP_PORT } from "./DocumentManagementService-BupnR1eC.js";
|
|
5
5
|
import * as http from "node:http";
|
|
6
6
|
import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
|
|
7
7
|
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
@@ -15,8 +15,8 @@ import "@joplin/turndown-plugin-gfm";
|
|
|
15
15
|
import "turndown";
|
|
16
16
|
import "semver";
|
|
17
17
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
18
|
-
import { F as FetchUrlTool, a as FindVersionTool } from "./FindVersionTool-
|
|
19
|
-
import { R as RemoveTool, L as ListJobsTool } from "./RemoveTool-
|
|
18
|
+
import { F as FetchUrlTool, a as FindVersionTool } from "./FindVersionTool-BcnLvjlo.js";
|
|
19
|
+
import { R as RemoveTool, L as ListJobsTool } from "./RemoveTool-Bqpr8F9m.js";
|
|
20
20
|
class CancelJobTool {
|
|
21
21
|
manager;
|
|
22
22
|
/**
|
package/dist/web.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import "dotenv/config";
|
|
3
3
|
import { program } from "commander";
|
|
4
|
-
import { P as PipelineJobStatus, j as ScrapeMode, l as logger, r as createJSDOM, D as DocumentManagementService, a as PipelineManager, t as getProjectRoot, e as ScrapeTool, f as ListLibrariesTool, S as SearchTool, u as DEFAULT_WEB_PORT } from "./DocumentManagementService-
|
|
4
|
+
import { P as PipelineJobStatus, j as ScrapeMode, l as logger, r as createJSDOM, D as DocumentManagementService, a as PipelineManager, t as getProjectRoot, e as ScrapeTool, f as ListLibrariesTool, S as SearchTool, u as DEFAULT_WEB_PORT } from "./DocumentManagementService-BupnR1eC.js";
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
import formBody from "@fastify/formbody";
|
|
7
7
|
import fastifyStatic from "@fastify/static";
|
|
@@ -13,7 +13,7 @@ import "jsdom";
|
|
|
13
13
|
import "playwright";
|
|
14
14
|
import "@joplin/turndown-plugin-gfm";
|
|
15
15
|
import "turndown";
|
|
16
|
-
import { L as ListJobsTool, R as RemoveTool } from "./RemoveTool-
|
|
16
|
+
import { L as ListJobsTool, R as RemoveTool } from "./RemoveTool-Bqpr8F9m.js";
|
|
17
17
|
import { jsxs, jsx, Fragment } from "@kitajs/html/jsx-runtime";
|
|
18
18
|
import { unified } from "unified";
|
|
19
19
|
import remarkParse from "remark-parse";
|