thorbit-kb-mcp 0.2.7 → 0.2.9
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/dist/bin/thorbit-kb-mcp.cjs +709 -66
- package/dist/bin/thorbit-kb-mcp.cjs.map +1 -1
- package/dist/bin/thorbit-kb-mcp.js +714 -66
- package/dist/bin/thorbit-kb-mcp.js.map +1 -1
- package/dist/index.cjs +789 -102
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5049 -15
- package/dist/index.d.ts +5049 -15
- package/dist/index.js +781 -102
- package/dist/index.js.map +1 -1
- package/package.json +5 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../bin/thorbit-kb-mcp.ts","../../src/thorbit-kb-api-client.ts","../../src/thorbit-kb-mcp-env.ts","../../src/thorbit-kb-mcp-server.ts","../../src/thorbit-kb-mcp-response-formatters.ts","../../src/thorbit-kb-mcp-tool-schemas.ts"],"sourcesContent":["import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { ThorbitKnowledgeBaseApiClient } from '../src/thorbit-kb-api-client.js'\nimport { resolveThorbitKbMcpEnv } from '../src/thorbit-kb-mcp-env.js'\nimport { buildThorbitKnowledgeBaseMcpServer } from '../src/thorbit-kb-mcp-server.js'\n\nasync function main() {\n const env = resolveThorbitKbMcpEnv()\n const client = new ThorbitKnowledgeBaseApiClient(env)\n const server = buildThorbitKnowledgeBaseMcpServer(client)\n await server.connect(new StdioServerTransport())\n}\n\nmain().catch(error => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`)\n process.exit(1)\n})\n","import type { ThorbitKnowledgeBaseMcpToolName } from './thorbit-kb-mcp-tool-names.js'\n\nexport type ThorbitKnowledgeBaseMcpEnvelope =\n | {\n ok: true\n result: unknown\n warnings?: string[]\n requestId: string\n usage?: Record<string, unknown>\n }\n | {\n ok: false\n error: {\n code: string\n message: string\n details?: unknown\n }\n requestId: string\n }\n\nexport class ThorbitKnowledgeBaseApiClient {\n private readonly baseUrl: string\n private readonly apiKey: string\n\n constructor(options: { baseUrl: string; apiKey: string }) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, '')\n this.apiKey = options.apiKey\n }\n\n async callTool(toolName: ThorbitKnowledgeBaseMcpToolName, input: unknown): Promise<ThorbitKnowledgeBaseMcpEnvelope> {\n const response = await fetch(`${this.baseUrl}/api/v1/mcp/knowledge-base/${toolName}`, {\n method: 'POST',\n headers: {\n 'x-thorbit-api-key': this.apiKey,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(input ?? {}),\n })\n\n const body = await response.json().catch(() => null) as ThorbitKnowledgeBaseMcpEnvelope | null\n if (body && typeof body === 'object' && 'ok' in body) return body\n\n return {\n ok: false,\n requestId: 'unavailable',\n error: {\n code: response.ok ? 'invalid_response' : `http_${response.status}`,\n message: response.ok ? 'Thorbit returned an invalid MCP response' : `Thorbit API request failed with HTTP ${response.status}`,\n },\n }\n }\n}\n","import { readFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\n\nexport type ThorbitKbMcpEnv = {\n apiKey: string\n baseUrl: string\n}\n\nfunction readApiKeyFile(): string | undefined {\n const explicitPath = process.env.THORBIT_KB_MCP_KEY_PATH?.trim()\n const paths = [explicitPath, join(homedir(), '.thorbit-kb-mcp-key')].filter(Boolean) as string[]\n for (const path of paths) {\n try {\n const value = readFileSync(path, 'utf8').trim()\n if (value) return value\n } catch {\n continue\n }\n }\n return undefined\n}\n\nexport function resolveThorbitKbMcpEnv(): ThorbitKbMcpEnv {\n const apiKey = (\n process.env.THORBIT_API_KEY ||\n process.env.THORBIT_MCP_API_KEY ||\n process.env.THORBIT_KB_MCP_API_KEY ||\n readApiKeyFile()\n )?.trim()\n\n if (!apiKey) {\n throw new Error('THORBIT_API_KEY, THORBIT_MCP_API_KEY, or ~/.thorbit-kb-mcp-key is required')\n }\n\n return {\n apiKey,\n baseUrl: (process.env.THORBIT_BASE_URL || process.env.THORBIT_KB_MCP_BASE_URL || 'https://thorbit.ai').trim(),\n }\n}\n","import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { ToolAnnotations } from '@modelcontextprotocol/sdk/types.js'\nimport type { ZodRawShape } from 'zod'\nimport type { ThorbitKnowledgeBaseApiClient, ThorbitKnowledgeBaseMcpEnvelope } from './thorbit-kb-api-client.js'\nimport { formatThorbitKbMcpToolResult } from './thorbit-kb-mcp-response-formatters.js'\nimport {\n ThorbitKbAskInputSchema,\n ThorbitKbCreateInputSchema,\n ThorbitKbIngestSiteInputSchema,\n ThorbitKbIngestTextInputSchema,\n ThorbitKbIngestUrlInputSchema,\n ThorbitKbIngestYoutubeInputSchema,\n ThorbitKbListInputSchema,\n ThorbitKbSearchInputSchema,\n ThorbitKbSourceStatusInputSchema,\n} from './thorbit-kb-mcp-tool-schemas.js'\nimport type { ThorbitKnowledgeBaseMcpToolName } from './thorbit-kb-mcp-tool-names.js'\n\nconst VERSION = '0.2.7'\n\ntype ThorbitKbToolConfig<InputArgs extends ZodRawShape> = {\n title: string\n description: string\n inputSchema: InputArgs\n annotations: ToolAnnotations\n}\n\nfunction readOnlyAnnotations(title: string, idempotent = true) {\n return {\n title,\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: idempotent,\n openWorldHint: false,\n }\n}\n\nfunction ingestAnnotations(title: string, openWorldHint: boolean) {\n return {\n title,\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint,\n }\n}\n\nexport type ThorbitKbCallTool = (\n toolName: ThorbitKnowledgeBaseMcpToolName,\n input: unknown,\n) => Promise<ThorbitKnowledgeBaseMcpEnvelope>\n\nexport type BuildThorbitKnowledgeBaseMcpServerOptions =\n | ThorbitKnowledgeBaseApiClient\n | { callTool: ThorbitKbCallTool }\n\nexport function buildThorbitKnowledgeBaseMcpServer(options: BuildThorbitKnowledgeBaseMcpServerOptions): McpServer {\n const callTool: ThorbitKbCallTool = (toolName, input) => options.callTool(toolName, input)\n const server = new McpServer({ name: 'thorbit-kb-mcp', version: VERSION })\n\n server.registerResource(\n 'knowledge-bases',\n 'thorbit-kb://knowledge-bases',\n {\n title: 'Thorbit Knowledge Bases',\n description: 'Knowledge bases visible to this Thorbit MCP API key.',\n mimeType: 'application/json',\n },\n async (uri) => {\n const envelope = await callTool('thorbit_kb_list', {})\n return { contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify(envelope, null, 2) }] }\n },\n )\n\n server.registerResource(\n 'source-status',\n new ResourceTemplate('thorbit-kb://sources/{sourcePublicId}', { list: undefined }),\n {\n title: 'Thorbit KB Source Status',\n description: 'Status and metadata for one Thorbit knowledge-base source.',\n mimeType: 'application/json',\n },\n async (uri, variables) => {\n const sourcePublicId = Array.isArray(variables.sourcePublicId) ? variables.sourcePublicId[0] : variables.sourcePublicId\n const envelope = await callTool('thorbit_kb_source_status', { sourcePublicIds: [String(sourcePublicId)] })\n return { contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify(envelope, null, 2) }] }\n },\n )\n\n function registerTool<T extends ThorbitKnowledgeBaseMcpToolName>(\n toolName: T,\n config: ThorbitKbToolConfig<ZodRawShape>,\n ): void {\n server.registerTool(toolName, config, async (input) => {\n const envelope = await callTool(toolName, input)\n return formatThorbitKbMcpToolResult(toolName, envelope)\n })\n }\n\n registerTool('thorbit_kb_create', {\n title: 'Create Thorbit Knowledge Base',\n description: 'Create a new Thorbit vector-backed knowledge base for MCP ingestion, smart RAG search, citations, and entity extraction.',\n inputSchema: ThorbitKbCreateInputSchema,\n annotations: ingestAnnotations('Create Thorbit Knowledge Base', false),\n })\n\n registerTool('thorbit_kb_list', {\n title: 'List Thorbit Knowledge Bases',\n description: 'List Thorbit knowledge bases visible to this API key. Use before ingestion/search when the target KB public ID is unknown.',\n inputSchema: ThorbitKbListInputSchema,\n annotations: readOnlyAnnotations('List Thorbit Knowledge Bases'),\n })\n\n registerTool('thorbit_kb_source_status', {\n title: 'Read Thorbit KB Source Status',\n description: 'Poll ingestion status for source public IDs returned by Thorbit KB ingestion tools.',\n inputSchema: ThorbitKbSourceStatusInputSchema,\n annotations: readOnlyAnnotations('Read Thorbit KB Source Status'),\n })\n\n registerTool('thorbit_kb_ingest_url', {\n title: 'Ingest URL Into Thorbit KB',\n description: 'Extract one public URL through MCP Scraper, clean the content, submit it to Thorbit, and vectorize it into the selected knowledge base.',\n inputSchema: ThorbitKbIngestUrlInputSchema,\n annotations: ingestAnnotations('Ingest URL Into Thorbit KB', true),\n })\n\n registerTool('thorbit_kb_ingest_site', {\n title: 'Ingest Website Into Thorbit KB',\n description: 'Map a website through MCP Scraper, extract selected pages, submit each page to Thorbit, and vectorize them into the selected knowledge base.',\n inputSchema: ThorbitKbIngestSiteInputSchema,\n annotations: ingestAnnotations('Ingest Website Into Thorbit KB', true),\n })\n\n registerTool('thorbit_kb_ingest_youtube', {\n title: 'Ingest YouTube Into Thorbit KB',\n description: 'Transcribe a YouTube video through MCP Scraper, preserve timestamp chunks when available, and vectorize the transcript into Thorbit KB.',\n inputSchema: ThorbitKbIngestYoutubeInputSchema,\n annotations: ingestAnnotations('Ingest YouTube Into Thorbit KB', true),\n })\n\n registerTool('thorbit_kb_ingest_text', {\n title: 'Ingest Text Into Thorbit KB',\n description: 'Submit provided text or Markdown directly to Thorbit and vectorize it into the selected knowledge base.',\n inputSchema: ThorbitKbIngestTextInputSchema,\n annotations: ingestAnnotations('Ingest Text Into Thorbit KB', false),\n })\n\n registerTool('thorbit_kb_search', {\n title: 'Search Thorbit Knowledge Base',\n description: 'Search Thorbit KB content with citation-ready chunks. Use when the user needs source-backed snippets or evidence.',\n inputSchema: ThorbitKbSearchInputSchema,\n annotations: readOnlyAnnotations('Search Thorbit Knowledge Base'),\n })\n\n registerTool('thorbit_kb_ask', {\n title: 'Ask Thorbit Knowledge Base',\n description: 'Answer a question using only retrieved Thorbit KB context. Returns answer, citations, sufficiency, and retrieval strategy metadata.',\n inputSchema: ThorbitKbAskInputSchema,\n annotations: readOnlyAnnotations('Ask Thorbit Knowledge Base', false),\n })\n\n return server\n}\n","import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js'\nimport type { ThorbitKnowledgeBaseMcpEnvelope } from './thorbit-kb-api-client.js'\nimport type { ThorbitKnowledgeBaseMcpToolName } from './thorbit-kb-mcp-tool-names.js'\n\nfunction summarizeResult(toolName: ThorbitKnowledgeBaseMcpToolName, result: unknown): string {\n if (toolName === 'thorbit_kb_create' && result && typeof result === 'object' && 'knowledgeBase' in result) {\n const kb = result.knowledgeBase as { name?: unknown; publicId?: unknown }\n return `Created Thorbit knowledge base ${String(kb.name ?? kb.publicId ?? '')}.`\n }\n if (toolName === 'thorbit_kb_list' && result && typeof result === 'object' && 'knowledgeBases' in result) {\n const count = Array.isArray(result.knowledgeBases) ? result.knowledgeBases.length : 0\n return `Found ${count} Thorbit knowledge base${count === 1 ? '' : 's'}.`\n }\n if (toolName.startsWith('thorbit_kb_ingest')) return 'Knowledge-base ingestion completed. Check structuredContent for source receipts.'\n if (toolName === 'thorbit_kb_source_status') return 'Source status returned. Check structuredContent for details.'\n if (toolName === 'thorbit_kb_search') return 'Knowledge-base search completed. Check structuredContent for results and citations.'\n if (toolName === 'thorbit_kb_ask') return 'Knowledge-base answer generated. Check structuredContent for citations and strategy.'\n return 'Thorbit knowledge-base tool completed.'\n}\n\nexport function formatThorbitKbMcpToolResult(\n toolName: ThorbitKnowledgeBaseMcpToolName,\n envelope: ThorbitKnowledgeBaseMcpEnvelope,\n): CallToolResult {\n if (!envelope.ok) {\n return {\n isError: true,\n content: [{\n type: 'text',\n text: `${envelope.error.code}: ${envelope.error.message}`,\n }],\n structuredContent: envelope,\n }\n }\n\n return {\n content: [{\n type: 'text',\n text: summarizeResult(toolName, envelope.result),\n }],\n structuredContent: envelope.result as Record<string, unknown>,\n }\n}\n","import { z } from 'zod'\n\nconst MetadataSchema = z.record(z.string(), z.unknown())\n\nexport const ThorbitKbCreateInputSchema = {\n name: z.string().min(1).max(255).describe('Name for the new Thorbit knowledge base.'),\n description: z.string().max(2000).optional().describe('Optional description for the new knowledge base.'),\n projectPublicId: z.string().min(1).optional().describe('Optional Thorbit project public ID. Omit to create an org-level knowledge base.'),\n folder: z.string().min(1).max(128).optional().describe('Optional organizational folder, such as research or domains.'),\n}\n\nexport const ThorbitKbListInputSchema = {\n projectPublicId: z.string().min(1).optional().describe('Optional Thorbit project public ID used to narrow knowledge-base listing.'),\n includeGlobal: z.boolean().default(true).describe('Include org-level/global knowledge bases. Default true.'),\n limit: z.number().int().min(1).max(100).default(50).describe('Maximum knowledge bases to return.'),\n}\n\nexport const ThorbitKbSourceStatusInputSchema = {\n sourcePublicIds: z.array(z.string().min(1)).min(1).max(100).describe('Source public IDs returned by Thorbit KB ingestion tools.'),\n}\n\nexport const ThorbitKbIngestUrlInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n url: z.string().url().describe('Public URL to extract through MCP Scraper and ingest into Thorbit.'),\n title: z.string().min(1).max(512).optional().describe('Optional title override. Provider title is used when omitted.'),\n mode: z.enum(['append']).default('append').describe('Append a new source version. Refresh mode is intentionally not enabled in V1.'),\n maxCharacters: z.number().int().min(500).max(500000).optional().describe('Optional cap before chunking/vectorization.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on the KB source.'),\n}\n\nexport const ThorbitKbIngestSiteInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n startUrl: z.string().url().describe('Website start URL. Thorbit maps URLs through MCP Scraper, then ingests selected pages.'),\n includePatterns: z.array(z.string().min(1)).max(20).optional().describe('Optional regex or substring patterns that a mapped URL must match.'),\n excludePatterns: z.array(z.string().min(1)).max(20).optional().describe('Optional regex or substring patterns that remove mapped URLs.'),\n maxPages: z.number().int().min(1).max(100).default(25).describe('Maximum pages to ingest. Default 25, hard cap 100.'),\n mode: z.enum(['append']).default('append').describe('Append source versions. Refresh mode is intentionally not enabled in V1.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on each KB source.'),\n}\n\nexport const ThorbitKbIngestYoutubeInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n videoUrl: z.string().url().describe('YouTube video URL. Thorbit transcribes through MCP Scraper and vectorizes transcript chunks.'),\n title: z.string().min(1).max(512).optional().describe('Optional title override.'),\n mode: z.enum(['append']).default('append').describe('Append a new source version.'),\n preserveTimestamps: z.boolean().default(true).describe('Store transcript timestamps on chunks when MCP Scraper returns them.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on the KB source.'),\n}\n\nexport const ThorbitKbIngestTextInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n title: z.string().min(1).max(512).describe('Source title shown in KB citations.'),\n content: z.string().min(1).max(500000).describe('Text or Markdown to chunk, embed, and ingest.'),\n sourceUrl: z.string().url().optional().describe('Optional canonical source URL for citations.'),\n sourceType: z.enum(['manual', 'note', 'markdown']).default('manual').describe('Caller-facing source type. Thorbit stores note/markdown as manual sources in V1.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on the KB source.'),\n}\n\nexport const ThorbitKbSearchInputSchema = {\n query: z.string().min(1).max(4000).describe('Search query. Use the user question or a focused retrieval query.'),\n knowledgeBasePublicId: z.string().min(1).optional().describe('Optional target KB. Omit to search visible KBs.'),\n projectPublicId: z.string().min(1).optional().describe('Optional project scope when no KB is specified.'),\n limit: z.number().int().min(1).max(20).default(5).describe('Maximum chunks to return.'),\n includeEntities: z.boolean().default(false).describe('Reserved for entity-rich responses.'),\n searchMode: z.enum(['smart', 'hybrid']).default('smart').describe('smart uses Thorbit intent/rerank retrieval; hybrid uses ANN plus FTS.'),\n}\n\nexport const ThorbitKbAskInputSchema = {\n question: z.string().min(1).max(8000).describe('Question to answer using Thorbit KB context only.'),\n knowledgeBasePublicId: z.string().min(1).optional().describe('Optional target KB. Omit to answer over visible KBs.'),\n projectPublicId: z.string().min(1).optional().describe('Optional project scope when no KB is specified.'),\n answerStyle: z.enum(['concise', 'detailed', 'extractive']).default('concise').describe('Use extractive to return source excerpts without an LLM answer.'),\n limit: z.number().int().min(1).max(20).default(8).describe('Maximum retrieved chunks used for the answer.'),\n requireCitations: z.boolean().default(true).describe('Keep true for grounded answers with citation arrays.'),\n}\n\nexport const ThorbitKnowledgeBaseMcpToolInputSchemas = {\n thorbit_kb_create: ThorbitKbCreateInputSchema,\n thorbit_kb_list: ThorbitKbListInputSchema,\n thorbit_kb_source_status: ThorbitKbSourceStatusInputSchema,\n thorbit_kb_ingest_url: ThorbitKbIngestUrlInputSchema,\n thorbit_kb_ingest_site: ThorbitKbIngestSiteInputSchema,\n thorbit_kb_ingest_youtube: ThorbitKbIngestYoutubeInputSchema,\n thorbit_kb_ingest_text: ThorbitKbIngestTextInputSchema,\n thorbit_kb_search: ThorbitKbSearchInputSchema,\n thorbit_kb_ask: ThorbitKbAskInputSchema,\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../bin/thorbit-kb-mcp.ts","../../src/thorbit-kb-api-client.ts","../../src/thorbit-kb-mcp-env.ts","../../src/thorbit-kb-mcp-server.ts","../../src/thorbit-kb-mcp-tool-schemas.ts","../../src/thorbit-kb-mcp-response-formatters.ts"],"sourcesContent":["import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { ThorbitKnowledgeBaseApiClient } from '../src/thorbit-kb-api-client.js'\nimport { resolveThorbitKbMcpEnv } from '../src/thorbit-kb-mcp-env.js'\nimport { buildThorbitKnowledgeBaseMcpServer } from '../src/thorbit-kb-mcp-server.js'\n\nasync function main() {\n const env = resolveThorbitKbMcpEnv()\n const client = new ThorbitKnowledgeBaseApiClient(env)\n const server = buildThorbitKnowledgeBaseMcpServer(client)\n await server.connect(new StdioServerTransport())\n}\n\nmain().catch(error => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`)\n process.exit(1)\n})\n","import type { ThorbitKnowledgeBaseMcpToolName } from './thorbit-kb-mcp-tool-names.js'\n\nexport type ThorbitKnowledgeBaseMcpEnvelope =\n | {\n ok: true\n result: unknown\n warnings?: string[]\n requestId: string\n usage?: Record<string, unknown>\n }\n | {\n ok: false\n error: {\n code: string\n message: string\n details?: unknown\n }\n requestId: string\n }\n\nexport class ThorbitKnowledgeBaseApiClient {\n private readonly baseUrl: string\n private readonly apiKey: string\n\n constructor(options: { baseUrl: string; apiKey: string }) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, '')\n this.apiKey = options.apiKey\n }\n\n async callTool(toolName: ThorbitKnowledgeBaseMcpToolName, input: unknown): Promise<ThorbitKnowledgeBaseMcpEnvelope> {\n const response = await fetch(`${this.baseUrl}/api/v1/mcp/knowledge-base/${toolName}`, {\n method: 'POST',\n headers: {\n 'x-thorbit-api-key': this.apiKey,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(input ?? {}),\n })\n\n const body = await response.json().catch(() => null) as ThorbitKnowledgeBaseMcpEnvelope | null\n if (body && typeof body === 'object' && 'ok' in body) return body\n\n return {\n ok: false,\n requestId: 'unavailable',\n error: {\n code: response.ok ? 'invalid_response' : `http_${response.status}`,\n message: response.ok ? 'Thorbit returned an invalid MCP response' : `Thorbit API request failed with HTTP ${response.status}`,\n },\n }\n }\n}\n","import { readFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\n\nexport type ThorbitKbMcpEnv = {\n apiKey: string\n baseUrl: string\n}\n\nfunction readApiKeyFile(): string | undefined {\n const explicitPath = process.env.THORBIT_KB_MCP_KEY_PATH?.trim()\n const paths = [explicitPath, join(homedir(), '.thorbit-kb-mcp-key')].filter(Boolean) as string[]\n for (const path of paths) {\n try {\n const value = readFileSync(path, 'utf8').trim()\n if (value) return value\n } catch {\n continue\n }\n }\n return undefined\n}\n\nexport function resolveThorbitKbMcpEnv(): ThorbitKbMcpEnv {\n const apiKey = (\n process.env.THORBIT_API_KEY ||\n process.env.THORBIT_MCP_API_KEY ||\n process.env.THORBIT_KB_MCP_API_KEY ||\n readApiKeyFile()\n )?.trim()\n\n if (!apiKey) {\n throw new Error('THORBIT_API_KEY, THORBIT_MCP_API_KEY, or ~/.thorbit-kb-mcp-key is required')\n }\n\n return {\n apiKey,\n baseUrl: (process.env.THORBIT_BASE_URL || process.env.THORBIT_KB_MCP_BASE_URL || 'https://thorbit.ai').trim(),\n }\n}\n","import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { ToolAnnotations } from '@modelcontextprotocol/sdk/types.js'\nimport {\n ThorbitMcpToolQualityMetadataSchema,\n type IThorbitMcpToolRegistrar,\n type ThorbitMcpHostedEnvelope,\n type ThorbitMcpToolQualityMetadata,\n} from 'thorbit-mcp-core'\nimport type { ZodRawShape, ZodTypeAny } from 'zod'\nimport type {\n ThorbitKnowledgeBaseApiClient,\n ThorbitKnowledgeBaseMcpEnvelope,\n} from './thorbit-kb-api-client.js'\nimport { formatThorbitKbMcpToolResult } from './thorbit-kb-mcp-response-formatters.js'\nimport {\n ThorbitKbAskInputSchema,\n ThorbitKbCreateInputSchema,\n ThorbitKbIngestSiteInputSchema,\n ThorbitKbIngestTextInputSchema,\n ThorbitKbIngestUrlInputSchema,\n ThorbitKbIngestYoutubeInputSchema,\n ThorbitKbListInputSchema,\n ThorbitKbSearchInputSchema,\n ThorbitKbSourceStatusInputSchema,\n ThorbitKnowledgeBaseMcpToolOutputSchemas,\n} from './thorbit-kb-mcp-tool-schemas.js'\nimport {\n ThorbitKnowledgeBaseMcpToolNames,\n type ThorbitKnowledgeBaseMcpToolName,\n} from './thorbit-kb-mcp-tool-names.js'\n\nconst VERSION = '0.2.9'\n\ntype ThorbitKbToolConfig<InputArgs extends ZodRawShape> = {\n title: string\n description: string\n inputSchema: InputArgs\n outputSchema: ZodTypeAny\n annotations: ToolAnnotations\n quality: ThorbitMcpToolQualityMetadata\n}\n\nfunction readOnlyAnnotations(\n title: string,\n idempotent = true,\n openWorldHint = false,\n) {\n return {\n title,\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: idempotent,\n openWorldHint,\n }\n}\n\nfunction ingestAnnotations(title: string, openWorldHint: boolean) {\n return {\n title,\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint,\n }\n}\n\nfunction defineKnowledgeBaseQuality(\n quality: Omit<ThorbitMcpToolQualityMetadata, 'productId'>,\n): ThorbitMcpToolQualityMetadata {\n return ThorbitMcpToolQualityMetadataSchema.parse({ productId: 'kb', ...quality })\n}\n\nconst KNOWLEDGE_BASE_TOOL_QUALITY = {\n thorbit_kb_create: defineKnowledgeBaseQuality({\n requiredScopes: ['knowledge_base:ingest'],\n whenToUse: ['Use to create a new caller-organization or project Knowledge Base.'],\n avoidWhen: ['Avoid when a suitable Knowledge Base already exists; list first.'],\n userPhrases: ['create a knowledge base', 'make a RAG library', 'start a KB'],\n costSummary: 'Low-cost durable Knowledge Base record creation.',\n resultMode: 'inline',\n nextTools: ['thorbit_kb_ingest_url', 'thorbit_kb_ingest_text'],\n sideEffects: ['Creates a durable caller-organization Knowledge Base.'],\n }),\n thorbit_kb_list: defineKnowledgeBaseQuality({\n requiredScopes: ['knowledge_base:read'],\n whenToUse: ['Use to find a visible Knowledge Base public ID before ingestion or retrieval.'],\n avoidWhen: ['Avoid when the exact Knowledge Base public ID is already known.'],\n userPhrases: ['list knowledge bases', 'find my KB', 'show RAG libraries'],\n costSummary: 'Low-cost caller-organization database read.',\n resultMode: 'paginated',\n nextTools: ['thorbit_kb_search', 'thorbit_kb_ask'],\n sideEffects: [],\n }),\n thorbit_kb_source_status: defineKnowledgeBaseQuality({\n requiredScopes: ['knowledge_base:read'],\n whenToUse: ['Use to poll one provider-backed source receipt returned by ingestion.'],\n avoidWhen: ['Avoid for retrieving chunks or synthesizing an answer.'],\n userPhrases: ['check ingest status', 'is this source ready', 'poll KB source'],\n costSummary: 'Low-cost caller-organization source status read.',\n resultMode: 'async',\n nextTools: ['thorbit_kb_search', 'thorbit_kb_ask'],\n sideEffects: [],\n }),\n thorbit_kb_ingest_url: defineKnowledgeBaseQuality({\n requiredScopes: ['knowledge_base:ingest'],\n whenToUse: ['Use to extract and ingest one public URL into a known Knowledge Base.'],\n avoidWhen: ['Avoid for whole websites, YouTube videos, or content already in hand.'],\n userPhrases: ['ingest this URL', 'add this page to the KB', 'vectorize this web page'],\n costSummary: 'External MCP Scraper extraction plus durable chunking and vectorization.',\n resultMode: 'async',\n nextTools: ['thorbit_kb_source_status'],\n sideEffects: ['Creates an append-only durable Knowledge Base source and chunks.'],\n }),\n thorbit_kb_ingest_site: defineKnowledgeBaseQuality({\n requiredScopes: ['knowledge_base:ingest'],\n whenToUse: ['Use to map and ingest a bounded set of pages from one website.'],\n avoidWhen: ['Avoid for one known URL, which is cheaper through URL ingestion.'],\n userPhrases: ['ingest this website', 'crawl pages into the KB', 'build a KB from this site'],\n costSummary: 'Bounded MCP Scraper mapping and extraction plus durable vectorization per page.',\n resultMode: 'async',\n nextTools: ['thorbit_kb_source_status'],\n sideEffects: ['Creates append-only Knowledge Base sources and chunks for accepted pages.'],\n }),\n thorbit_kb_ingest_youtube: defineKnowledgeBaseQuality({\n requiredScopes: ['knowledge_base:ingest'],\n whenToUse: ['Use to transcribe and ingest one YouTube video into a known Knowledge Base.'],\n avoidWhen: ['Avoid for web pages or caller-supplied text.'],\n userPhrases: ['ingest this YouTube video', 'add this transcript to the KB', 'vectorize this video'],\n costSummary: 'External transcription plus durable chunking and vectorization.',\n resultMode: 'async',\n nextTools: ['thorbit_kb_source_status'],\n sideEffects: ['Creates an append-only durable transcript source and chunks.'],\n }),\n thorbit_kb_ingest_text: defineKnowledgeBaseQuality({\n requiredScopes: ['knowledge_base:ingest'],\n whenToUse: ['Use to ingest text or Markdown already supplied by the caller.'],\n avoidWhen: ['Avoid when Thorbit must fetch a URL, website, or YouTube transcript.'],\n userPhrases: ['ingest this text', 'add these notes to the KB', 'vectorize this Markdown'],\n costSummary: 'Durable chunking and vectorization without external scraping.',\n resultMode: 'async',\n nextTools: ['thorbit_kb_source_status'],\n sideEffects: ['Creates an append-only durable Knowledge Base source and chunks.'],\n }),\n thorbit_kb_search: defineKnowledgeBaseQuality({\n requiredScopes: ['knowledge_base:read'],\n whenToUse: ['Use to retrieve bounded citation-ready chunks without answer synthesis.'],\n avoidWhen: ['Avoid when the caller wants a direct grounded answer.'],\n userPhrases: ['search the KB', 'retrieve source chunks', 'find citation evidence'],\n costSummary: 'Bounded vector or hybrid retrieval and optional reranking.',\n resultMode: 'inline',\n nextTools: ['thorbit_kb_ask'],\n sideEffects: [],\n }),\n thorbit_kb_ask: defineKnowledgeBaseQuality({\n requiredScopes: ['knowledge_base:read', 'knowledge_base:ask'],\n whenToUse: ['Use to synthesize a direct answer grounded in bounded Knowledge Base citations.'],\n avoidWhen: ['Avoid when raw retrieved passages are required for caller-side reasoning.'],\n userPhrases: ['ask the knowledge base', 'answer from my KB', 'give me a cited answer'],\n costSummary: 'Bounded retrieval plus potentially metered model answer generation.',\n resultMode: 'inline',\n nextTools: ['thorbit_kb_search'],\n sideEffects: [],\n }),\n} as const satisfies Record<ThorbitKnowledgeBaseMcpToolName, ThorbitMcpToolQualityMetadata>\n\nexport const SERVER_INSTRUCTIONS = [\n 'Thorbit Knowledge Base MCP. Vector-backed knowledge bases for ingestion, smart RAG search, and grounded Q&A with citations. This server is a thin client, authenticated and metered against your Thorbit MCP API key.',\n '',\n '## Set up a knowledge base',\n '- New knowledge base -> **thorbit_kb_create**. Org-level by default; pass projectPublicId to scope it to one project.',\n '- Find an existing one\\'s public ID -> **thorbit_kb_list** (needed before ingesting/searching if you don\\'t already have it).',\n '',\n '## Ingest content',\n '- One web page -> **thorbit_kb_ingest_url** (MCP Scraper extract, up to 500,000 chars before chunking).',\n '- A whole site (mapped + filtered by include/excludePatterns) -> **thorbit_kb_ingest_site** (up to 100 pages, default 25).',\n '- A YouTube video (transcribed, timestamps preserved by default) -> **thorbit_kb_ingest_youtube**.',\n '- Raw text/Markdown you already have -> **thorbit_kb_ingest_text** (no scraping needed).',\n '- All ingestion is append-only in this version — there\\'s no refresh/re-ingest mode; re-ingesting a URL adds a new source version rather than replacing the old one.',\n '- Check on an ingest\\'s progress -> **thorbit_kb_source_status** with the sourcePublicIds it returned.',\n '',\n '## Query a knowledge base',\n '- Need citation-ready chunks yourself, not a synthesized answer -> **thorbit_kb_search**.',\n '- Need a direct answer grounded in retrieved context -> **thorbit_kb_ask** (set answerStyle:\"extractive\" for source excerpts without an LLM-written answer). Use thorbit_kb_search instead when you want the raw chunks to reason over yourself.',\n].join('\\n')\n\nexport type ThorbitKbCallTool = (\n toolName: ThorbitKnowledgeBaseMcpToolName,\n input: unknown,\n) => Promise<ThorbitKnowledgeBaseMcpEnvelope | ThorbitMcpHostedEnvelope>\n\nexport type BuildThorbitKnowledgeBaseMcpServerOptions =\n | ThorbitKnowledgeBaseApiClient\n | { callTool: ThorbitKbCallTool }\n\nfunction registerThorbitKnowledgeBaseResources(\n server: McpServer,\n callTool: ThorbitKbCallTool,\n): void {\n server.registerResource(\n 'knowledge-bases',\n 'thorbit-kb://knowledge-bases',\n {\n title: 'Thorbit Knowledge Bases',\n description: 'Knowledge bases visible to this Thorbit MCP API key.',\n mimeType: 'application/json',\n },\n async (uri) => {\n const envelope = await callTool('thorbit_kb_list', {})\n return { contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify(envelope, null, 2) }] }\n },\n )\n\n server.registerResource(\n 'source-status',\n new ResourceTemplate('thorbit-kb://sources/{sourcePublicId}', { list: undefined }),\n {\n title: 'Thorbit KB Source Status',\n description: 'Status and metadata for one Thorbit knowledge-base source.',\n mimeType: 'application/json',\n },\n async (uri, variables) => {\n const sourcePublicId = Array.isArray(variables.sourcePublicId)\n ? variables.sourcePublicId[0]\n : variables.sourcePublicId\n const envelope = await callTool('thorbit_kb_source_status', {\n sourcePublicIds: [String(sourcePublicId)],\n })\n return { contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify(envelope, null, 2) }] }\n },\n )\n}\n\nexport function registerThorbitKnowledgeBaseMcpTools(\n server: McpServer,\n callTool: ThorbitKbCallTool,\n): void {\n function registerTool<T extends ThorbitKnowledgeBaseMcpToolName>(\n toolName: T,\n config: ThorbitKbToolConfig<ZodRawShape>,\n ): void {\n server.registerTool(toolName, {\n title: config.title,\n description: config.description,\n inputSchema: config.inputSchema,\n outputSchema: config.outputSchema,\n annotations: config.annotations,\n _meta: { thorbit: config.quality },\n }, async input => formatThorbitKbMcpToolResult(\n toolName,\n await callTool(toolName, input),\n input,\n ))\n }\n\n registerTool('thorbit_kb_create', {\n title: 'Create Thorbit Knowledge Base',\n description: 'Create a new vector-backed knowledge base for ingestion, RAG search, and grounded Q&A. Org-level by default; pass projectPublicId to scope it to one project. Use thorbit_kb_list first if you\\'re not sure whether a suitable knowledge base already exists.',\n inputSchema: ThorbitKbCreateInputSchema,\n outputSchema: ThorbitKnowledgeBaseMcpToolOutputSchemas.thorbit_kb_create,\n annotations: ingestAnnotations('Create Thorbit Knowledge Base', false),\n quality: KNOWLEDGE_BASE_TOOL_QUALITY.thorbit_kb_create,\n })\n\n registerTool('thorbit_kb_list', {\n title: 'List Thorbit Knowledge Bases',\n description: 'List knowledge bases visible to this API key, org-level and project-scoped. Use before ingestion/search when you don\\'t already have the target knowledgeBasePublicId — every ingest tool needs one (search/ask can omit it to query all visible KBs instead).',\n inputSchema: ThorbitKbListInputSchema,\n outputSchema: ThorbitKnowledgeBaseMcpToolOutputSchemas.thorbit_kb_list,\n annotations: readOnlyAnnotations('List Thorbit Knowledge Bases'),\n quality: KNOWLEDGE_BASE_TOOL_QUALITY.thorbit_kb_list,\n })\n\n registerTool('thorbit_kb_source_status', {\n title: 'Read Thorbit KB Source Status',\n description: 'Poll ingestion status for a source public ID returned by a thorbit_kb_ingest_* tool. Returns the real source state, progress, safe error, and updated time; continue polling until ready or failed, then use thorbit_kb_search or thorbit_kb_ask.',\n inputSchema: ThorbitKbSourceStatusInputSchema,\n outputSchema: ThorbitKnowledgeBaseMcpToolOutputSchemas.thorbit_kb_source_status,\n annotations: readOnlyAnnotations('Read Thorbit KB Source Status'),\n quality: KNOWLEDGE_BASE_TOOL_QUALITY.thorbit_kb_source_status,\n })\n\n registerTool('thorbit_kb_ingest_url', {\n title: 'Ingest URL Into Thorbit KB',\n description: 'Extract ONE public URL through MCP Scraper, clean it, and vectorize it into a knowledge base (up to 500,000 chars before chunking). For a whole site instead of one page, use thorbit_kb_ingest_site. Append-only: re-ingesting adds a new source version. Returns a real source receipt and thorbit_kb_source_status follow-up.',\n inputSchema: ThorbitKbIngestUrlInputSchema,\n outputSchema: ThorbitKnowledgeBaseMcpToolOutputSchemas.thorbit_kb_ingest_url,\n annotations: ingestAnnotations('Ingest URL Into Thorbit KB', true),\n quality: KNOWLEDGE_BASE_TOOL_QUALITY.thorbit_kb_ingest_url,\n })\n\n registerTool('thorbit_kb_ingest_site', {\n title: 'Ingest Website Into Thorbit KB',\n description: 'Map a website through MCP Scraper, extract selected pages (up to 100, default 25), and vectorize them. For one known page, use thorbit_kb_ingest_url because it is cheaper and faster. The exact public receipt succeeds only when Phoenix supplies one unambiguous source; multi-source provider batches fail closed rather than hiding source IDs.',\n inputSchema: ThorbitKbIngestSiteInputSchema,\n outputSchema: ThorbitKnowledgeBaseMcpToolOutputSchemas.thorbit_kb_ingest_site,\n annotations: ingestAnnotations('Ingest Website Into Thorbit KB', true),\n quality: KNOWLEDGE_BASE_TOOL_QUALITY.thorbit_kb_ingest_site,\n })\n\n registerTool('thorbit_kb_ingest_youtube', {\n title: 'Ingest YouTube Into Thorbit KB',\n description: 'Transcribe one YouTube video through MCP Scraper and vectorize the transcript, preserving timestamp chunks by default. For web pages or raw text, use thorbit_kb_ingest_url or thorbit_kb_ingest_text. Returns the real source receipt and a thorbit_kb_source_status follow-up.',\n inputSchema: ThorbitKbIngestYoutubeInputSchema,\n outputSchema: ThorbitKnowledgeBaseMcpToolOutputSchemas.thorbit_kb_ingest_youtube,\n annotations: ingestAnnotations('Ingest YouTube Into Thorbit KB', true),\n quality: KNOWLEDGE_BASE_TOOL_QUALITY.thorbit_kb_ingest_youtube,\n })\n\n registerTool('thorbit_kb_ingest_text', {\n title: 'Ingest Text Into Thorbit KB',\n description: 'Submit bounded text or Markdown already in hand directly into a knowledge base with no scraping. Use thorbit_kb_ingest_url when content must be fetched. Returns the real source receipt and a thorbit_kb_source_status follow-up after durable chunking and vectorization.',\n inputSchema: ThorbitKbIngestTextInputSchema,\n outputSchema: ThorbitKnowledgeBaseMcpToolOutputSchemas.thorbit_kb_ingest_text,\n annotations: ingestAnnotations('Ingest Text Into Thorbit KB', false),\n quality: KNOWLEDGE_BASE_TOOL_QUALITY.thorbit_kb_ingest_text,\n })\n\n registerTool('thorbit_kb_search', {\n title: 'Search Thorbit Knowledge Base',\n description: 'Search visible knowledge-base content and return at most 50 bounded, scored chunks plus bounded provider citations, without synthesizing an answer. Use thorbit_kb_ask for a direct grounded response. Omit knowledgeBasePublicId to search visible KBs.',\n inputSchema: ThorbitKbSearchInputSchema,\n outputSchema: ThorbitKnowledgeBaseMcpToolOutputSchemas.thorbit_kb_search,\n annotations: readOnlyAnnotations('Search Thorbit Knowledge Base', true, true),\n quality: KNOWLEDGE_BASE_TOOL_QUALITY.thorbit_kb_search,\n })\n\n registerTool('thorbit_kb_ask', {\n title: 'Ask Thorbit Knowledge Base',\n description: 'Answer a question using only retrieved Knowledge Base context and return a bounded answer, citations, follow-ups, and nullable real model ID. Use extractive style for excerpts; use thorbit_kb_search for raw scored chunks. This may invoke a metered answer model.',\n inputSchema: ThorbitKbAskInputSchema,\n outputSchema: ThorbitKnowledgeBaseMcpToolOutputSchemas.thorbit_kb_ask,\n annotations: readOnlyAnnotations('Ask Thorbit Knowledge Base', false, true),\n quality: KNOWLEDGE_BASE_TOOL_QUALITY.thorbit_kb_ask,\n })\n}\n\nexport class ThorbitKnowledgeBaseMcpToolRegistrar\n implements IThorbitMcpToolRegistrar<ThorbitKnowledgeBaseMcpToolName>\n{\n readonly productId = 'kb' as const\n readonly toolNames = ThorbitKnowledgeBaseMcpToolNames\n\n registerTools(\n server: McpServer,\n callTool: (\n toolName: ThorbitKnowledgeBaseMcpToolName,\n input: unknown,\n ) => Promise<ThorbitMcpHostedEnvelope>,\n ): void {\n registerThorbitKnowledgeBaseMcpTools(server, callTool)\n }\n}\n\nexport function buildThorbitKnowledgeBaseMcpServer(\n options: BuildThorbitKnowledgeBaseMcpServerOptions,\n): McpServer {\n const callTool: ThorbitKbCallTool = (toolName, input) => options.callTool(toolName, input)\n const server = new McpServer(\n { name: 'thorbit-kb-mcp', version: VERSION },\n { instructions: SERVER_INSTRUCTIONS },\n )\n\n registerThorbitKnowledgeBaseResources(server, callTool)\n registerThorbitKnowledgeBaseMcpTools(server, callTool)\n return server\n}\n","import {\n createThorbitMcpStructuredResultSchema,\n JsonValueSchema,\n} from 'thorbit-mcp-core'\nimport { z } from 'zod'\nimport type { ThorbitKnowledgeBaseMcpToolName } from './thorbit-kb-mcp-tool-names.js'\n\nconst MetadataSchema = z.record(JsonValueSchema)\n\nexport const ThorbitKbCreateInputSchema = {\n name: z.string().min(1).max(255).describe('Name for the new Thorbit knowledge base.'),\n description: z.string().max(2000).optional().describe('Optional description for the new knowledge base.'),\n projectPublicId: z.string().min(1).optional().describe('Optional Thorbit project public ID. Omit to create an org-level knowledge base.'),\n folder: z.string().min(1).max(128).optional().describe('Optional organizational folder, such as research or domains.'),\n}\n\nexport const ThorbitKbListInputSchema = {\n projectPublicId: z.string().min(1).optional().describe('Optional Thorbit project public ID used to narrow knowledge-base listing.'),\n includeGlobal: z.boolean().default(true).describe('Include org-level/global knowledge bases. Default true.'),\n limit: z.number().int().min(1).max(100).default(50).describe('Maximum knowledge bases to return.'),\n}\n\nexport const ThorbitKbSourceStatusInputSchema = {\n sourcePublicIds: z.array(z.string().min(1)).min(1).max(100).describe('Source public IDs returned by Thorbit KB ingestion tools.'),\n}\n\nexport const ThorbitKbIngestUrlInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n url: z.string().url().describe('Public URL to extract through MCP Scraper and ingest into Thorbit.'),\n title: z.string().min(1).max(512).optional().describe('Optional title override. Provider title is used when omitted.'),\n mode: z.enum(['append']).default('append').describe('Append a new source version. Refresh mode is intentionally not enabled in V1.'),\n maxCharacters: z.number().int().min(500).max(500000).optional().describe('Optional cap before chunking/vectorization.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on the KB source.'),\n}\n\nexport const ThorbitKbIngestSiteInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n startUrl: z.string().url().describe('Website start URL. Thorbit maps URLs through MCP Scraper, then ingests selected pages.'),\n includePatterns: z.array(z.string().min(1)).max(20).optional().describe('Optional regex or substring patterns that a mapped URL must match.'),\n excludePatterns: z.array(z.string().min(1)).max(20).optional().describe('Optional regex or substring patterns that remove mapped URLs.'),\n maxPages: z.number().int().min(1).max(100).default(25).describe('Maximum pages to ingest. Default 25, hard cap 100.'),\n mode: z.enum(['append']).default('append').describe('Append source versions. Refresh mode is intentionally not enabled in V1.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on each KB source.'),\n}\n\nexport const ThorbitKbIngestYoutubeInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n videoUrl: z.string().url().describe('YouTube video URL. Thorbit transcribes through MCP Scraper and vectorizes transcript chunks.'),\n title: z.string().min(1).max(512).optional().describe('Optional title override.'),\n mode: z.enum(['append']).default('append').describe('Append a new source version.'),\n preserveTimestamps: z.boolean().default(true).describe('Store transcript timestamps on chunks when MCP Scraper returns them.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on the KB source.'),\n}\n\nexport const ThorbitKbIngestTextInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n title: z.string().min(1).max(512).describe('Source title shown in KB citations.'),\n content: z.string().min(1).max(500000).describe('Text or Markdown to chunk, embed, and ingest.'),\n sourceUrl: z.string().url().optional().describe('Optional canonical source URL for citations.'),\n sourceType: z.enum(['manual', 'note', 'markdown']).default('manual').describe('Caller-facing source type. Thorbit stores note/markdown as manual sources in V1.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on the KB source.'),\n}\n\nexport const ThorbitKbSearchInputSchema = {\n query: z.string().min(1).max(4000).describe('Search query. Use the user question or a focused retrieval query.'),\n knowledgeBasePublicId: z.string().min(1).optional().describe('Optional target KB. Omit to search visible KBs.'),\n projectPublicId: z.string().min(1).optional().describe('Optional project scope when no KB is specified.'),\n limit: z.number().int().min(1).max(20).default(5).describe('Maximum chunks to return.'),\n includeEntities: z.boolean().default(false).describe('Reserved for entity-rich responses.'),\n searchMode: z.enum(['smart', 'hybrid']).default('smart').describe('smart uses Thorbit intent/rerank retrieval; hybrid uses ANN plus FTS.'),\n}\n\nexport const ThorbitKbAskInputSchema = {\n question: z.string().min(1).max(8000).describe('Question to answer using Thorbit KB context only.'),\n knowledgeBasePublicId: z.string().min(1).optional().describe('Optional target KB. Omit to answer over visible KBs.'),\n projectPublicId: z.string().min(1).optional().describe('Optional project scope when no KB is specified.'),\n answerStyle: z.enum(['concise', 'detailed', 'extractive']).default('concise').describe('Use extractive to return source excerpts without an LLM answer.'),\n limit: z.number().int().min(1).max(20).default(8).describe('Maximum retrieved chunks used for the answer.'),\n requireCitations: z.boolean().default(true).describe('Keep true for grounded answers with citation arrays.'),\n}\n\nexport const ThorbitKnowledgeBaseMcpToolInputSchemas = {\n thorbit_kb_create: ThorbitKbCreateInputSchema,\n thorbit_kb_list: ThorbitKbListInputSchema,\n thorbit_kb_source_status: ThorbitKbSourceStatusInputSchema,\n thorbit_kb_ingest_url: ThorbitKbIngestUrlInputSchema,\n thorbit_kb_ingest_site: ThorbitKbIngestSiteInputSchema,\n thorbit_kb_ingest_youtube: ThorbitKbIngestYoutubeInputSchema,\n thorbit_kb_ingest_text: ThorbitKbIngestTextInputSchema,\n thorbit_kb_search: ThorbitKbSearchInputSchema,\n thorbit_kb_ask: ThorbitKbAskInputSchema,\n} satisfies Record<ThorbitKnowledgeBaseMcpToolName, z.ZodRawShape>\n\nconst ThorbitKnowledgeBasePublicIdSchema = z.string().min(1).max(128)\nconst ThorbitKnowledgeBaseStatusSchema = z.string().min(1).max(64)\nconst ThorbitKnowledgeBaseSourceTypeSchema = z.string().min(1).max(64)\nconst ThorbitKnowledgeBaseSourceStatusSchema = z.enum([\n 'pending',\n 'processing',\n 'ready',\n 'failed',\n])\n\nexport const ThorbitKnowledgeBaseResultSchema = z.object({\n knowledgeBasePublicId: ThorbitKnowledgeBasePublicIdSchema,\n name: z.string().min(1).max(255),\n status: ThorbitKnowledgeBaseStatusSchema,\n createdAt: z.string().datetime(),\n updatedAt: z.string().datetime(),\n}).strict()\n\nexport const ThorbitKnowledgeBaseListResultSchema = z.object({\n knowledgeBases: z.array(ThorbitKnowledgeBaseResultSchema).max(100),\n nextCursor: z.string().min(1).max(512).nullable(),\n}).strict()\n\nexport const ThorbitKnowledgeBaseSourceStatusResultSchema = z.object({\n knowledgeBasePublicId: ThorbitKnowledgeBasePublicIdSchema,\n sourcePublicId: ThorbitKnowledgeBasePublicIdSchema,\n sourceType: ThorbitKnowledgeBaseSourceTypeSchema,\n status: ThorbitKnowledgeBaseSourceStatusSchema,\n progressPercent: z.number().finite().min(0).max(100),\n error: z.string().min(1).max(4_000).nullable(),\n updatedAt: z.string().datetime(),\n}).strict()\n\nconst ThorbitKnowledgeBaseSourceStatusPollInputSchema = z.object({\n sourcePublicIds: z.array(ThorbitKnowledgeBasePublicIdSchema).min(1).max(100),\n}).strict()\n\nexport const ThorbitKnowledgeBaseIngestResultSchema = z.object({\n knowledgeBasePublicId: ThorbitKnowledgeBasePublicIdSchema,\n sourcePublicId: ThorbitKnowledgeBasePublicIdSchema,\n sourceType: ThorbitKnowledgeBaseSourceTypeSchema,\n status: ThorbitKnowledgeBaseSourceStatusSchema,\n pollToolName: z.literal('thorbit_kb_source_status'),\n pollInput: ThorbitKnowledgeBaseSourceStatusPollInputSchema,\n}).strict()\n\nexport const ThorbitKnowledgeBaseCitationSchema = z.object({\n index: z.number().int().positive().max(10_000),\n chunkPublicId: ThorbitKnowledgeBasePublicIdSchema,\n sourcePublicId: ThorbitKnowledgeBasePublicIdSchema.nullable(),\n sourceTitle: z.string().min(1).max(1_000),\n sourceType: ThorbitKnowledgeBaseSourceTypeSchema,\n sourceUrl: z.string().url().max(2_048).nullable(),\n chunkIndex: z.number().int().nonnegative().max(10_000_000).nullable(),\n timestampStart: z.number().finite().nonnegative().max(10_000_000).nullable(),\n excerpt: z.string().max(10_000),\n}).strict()\n\nconst ThorbitKnowledgeBaseSearchMatchSchema = z.object({\n chunkPublicId: ThorbitKnowledgeBasePublicIdSchema,\n text: z.string().max(50_000),\n score: z.number().finite().min(0).max(1),\n}).strict()\n\nexport const ThorbitKnowledgeBaseSearchResultSchema = z.object({\n query: z.string().min(1).max(4_000),\n results: z.array(ThorbitKnowledgeBaseSearchMatchSchema).max(50),\n citations: z.array(ThorbitKnowledgeBaseCitationSchema).max(50),\n}).strict()\n\nexport const ThorbitKnowledgeBaseAnswerResultSchema = z.object({\n answer: z.string().max(500_000),\n citations: z.array(ThorbitKnowledgeBaseCitationSchema).max(50),\n followUps: z.array(z.string().min(1).max(8_000)).max(20),\n modelId: z.string().min(1).max(255).nullable(),\n}).strict()\n\nexport const ThorbitKnowledgeBaseMcpToolResultSchemas = {\n thorbit_kb_create: ThorbitKnowledgeBaseResultSchema,\n thorbit_kb_list: ThorbitKnowledgeBaseListResultSchema,\n thorbit_kb_source_status: ThorbitKnowledgeBaseSourceStatusResultSchema,\n thorbit_kb_ingest_url: ThorbitKnowledgeBaseIngestResultSchema,\n thorbit_kb_ingest_site: ThorbitKnowledgeBaseIngestResultSchema,\n thorbit_kb_ingest_youtube: ThorbitKnowledgeBaseIngestResultSchema,\n thorbit_kb_ingest_text: ThorbitKnowledgeBaseIngestResultSchema,\n thorbit_kb_search: ThorbitKnowledgeBaseSearchResultSchema,\n thorbit_kb_ask: ThorbitKnowledgeBaseAnswerResultSchema,\n} satisfies Record<ThorbitKnowledgeBaseMcpToolName, z.AnyZodObject>\n\nfunction createThorbitKnowledgeBaseMcpOutputContract<\n TResultSchema extends z.AnyZodObject,\n>(resultSchema: TResultSchema) {\n const strictSchema = createThorbitMcpStructuredResultSchema(resultSchema)\n const successShape = strictSchema.options[0].shape\n const errorShape = strictSchema.options[1].shape\n\n // The MCP SDK advertises root object schemas. Returned values are also\n // parsed through the exact success/error union in the formatter.\n const advertisedSchema = z.object({\n ok: z.boolean(),\n toolName: successShape.toolName,\n requestId: successShape.requestId,\n summary: successShape.summary.optional(),\n result: resultSchema.optional(),\n artifacts: successShape.artifacts.optional(),\n next: successShape.next,\n warnings: successShape.warnings.optional(),\n usage: successShape.usage.optional(),\n error: errorShape.error.optional(),\n }).strict()\n\n return { strictSchema, advertisedSchema }\n}\n\nconst thorbitKnowledgeBaseOutputContracts = {\n thorbit_kb_create: createThorbitKnowledgeBaseMcpOutputContract(ThorbitKnowledgeBaseResultSchema),\n thorbit_kb_list: createThorbitKnowledgeBaseMcpOutputContract(ThorbitKnowledgeBaseListResultSchema),\n thorbit_kb_source_status: createThorbitKnowledgeBaseMcpOutputContract(ThorbitKnowledgeBaseSourceStatusResultSchema),\n thorbit_kb_ingest_url: createThorbitKnowledgeBaseMcpOutputContract(ThorbitKnowledgeBaseIngestResultSchema),\n thorbit_kb_ingest_site: createThorbitKnowledgeBaseMcpOutputContract(ThorbitKnowledgeBaseIngestResultSchema),\n thorbit_kb_ingest_youtube: createThorbitKnowledgeBaseMcpOutputContract(ThorbitKnowledgeBaseIngestResultSchema),\n thorbit_kb_ingest_text: createThorbitKnowledgeBaseMcpOutputContract(ThorbitKnowledgeBaseIngestResultSchema),\n thorbit_kb_search: createThorbitKnowledgeBaseMcpOutputContract(ThorbitKnowledgeBaseSearchResultSchema),\n thorbit_kb_ask: createThorbitKnowledgeBaseMcpOutputContract(ThorbitKnowledgeBaseAnswerResultSchema),\n} satisfies Record<ThorbitKnowledgeBaseMcpToolName, {\n strictSchema: z.ZodTypeAny\n advertisedSchema: z.AnyZodObject\n}>\n\nexport const ThorbitKnowledgeBaseMcpToolStrictOutputSchemas = {\n thorbit_kb_create: thorbitKnowledgeBaseOutputContracts.thorbit_kb_create.strictSchema,\n thorbit_kb_list: thorbitKnowledgeBaseOutputContracts.thorbit_kb_list.strictSchema,\n thorbit_kb_source_status: thorbitKnowledgeBaseOutputContracts.thorbit_kb_source_status.strictSchema,\n thorbit_kb_ingest_url: thorbitKnowledgeBaseOutputContracts.thorbit_kb_ingest_url.strictSchema,\n thorbit_kb_ingest_site: thorbitKnowledgeBaseOutputContracts.thorbit_kb_ingest_site.strictSchema,\n thorbit_kb_ingest_youtube: thorbitKnowledgeBaseOutputContracts.thorbit_kb_ingest_youtube.strictSchema,\n thorbit_kb_ingest_text: thorbitKnowledgeBaseOutputContracts.thorbit_kb_ingest_text.strictSchema,\n thorbit_kb_search: thorbitKnowledgeBaseOutputContracts.thorbit_kb_search.strictSchema,\n thorbit_kb_ask: thorbitKnowledgeBaseOutputContracts.thorbit_kb_ask.strictSchema,\n} satisfies Record<ThorbitKnowledgeBaseMcpToolName, z.ZodTypeAny>\n\nexport const ThorbitKnowledgeBaseMcpToolOutputSchemas = {\n thorbit_kb_create: thorbitKnowledgeBaseOutputContracts.thorbit_kb_create.advertisedSchema,\n thorbit_kb_list: thorbitKnowledgeBaseOutputContracts.thorbit_kb_list.advertisedSchema,\n thorbit_kb_source_status: thorbitKnowledgeBaseOutputContracts.thorbit_kb_source_status.advertisedSchema,\n thorbit_kb_ingest_url: thorbitKnowledgeBaseOutputContracts.thorbit_kb_ingest_url.advertisedSchema,\n thorbit_kb_ingest_site: thorbitKnowledgeBaseOutputContracts.thorbit_kb_ingest_site.advertisedSchema,\n thorbit_kb_ingest_youtube: thorbitKnowledgeBaseOutputContracts.thorbit_kb_ingest_youtube.advertisedSchema,\n thorbit_kb_ingest_text: thorbitKnowledgeBaseOutputContracts.thorbit_kb_ingest_text.advertisedSchema,\n thorbit_kb_search: thorbitKnowledgeBaseOutputContracts.thorbit_kb_search.advertisedSchema,\n thorbit_kb_ask: thorbitKnowledgeBaseOutputContracts.thorbit_kb_ask.advertisedSchema,\n} satisfies Record<ThorbitKnowledgeBaseMcpToolName, z.AnyZodObject>\n","import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js'\nimport type { ThorbitMcpHostedEnvelope } from 'thorbit-mcp-core'\nimport type { ThorbitKnowledgeBaseMcpEnvelope } from './thorbit-kb-api-client.js'\nimport {\n ThorbitKnowledgeBaseMcpToolStrictOutputSchemas,\n} from './thorbit-kb-mcp-tool-schemas'\nimport type { ThorbitKnowledgeBaseMcpToolName } from './thorbit-kb-mcp-tool-names.js'\n\ntype ThorbitKnowledgeBaseFormatterEnvelope =\n | ThorbitKnowledgeBaseMcpEnvelope\n | ThorbitMcpHostedEnvelope\ntype JsonRecord = Record<string, unknown>\n\nconst PUBLIC_ERROR_CODES = new Set([\n 'unauthorized',\n 'forbidden',\n 'payment_required',\n 'not_found',\n 'validation_error',\n 'provider_error',\n 'rate_limited',\n 'conflict',\n 'internal_error',\n])\nconst SENSITIVE_DETAIL_KEY = /(?:authorization|cookie|credential|password|secret|token|api.?key|private.?key)/i\nconst CREDENTIAL_TEXT = /(?:Bearer\\s+[^\\s,;]+|\\b(?:sk|pk|key|token|thbt)[_-][A-Za-z0-9._-]{6,}\\b|\\bAIza[A-Za-z0-9_-]{20,}\\b)/gi\nconst SAFE_METADATA_IDENTIFIER = /^[A-Za-z0-9._/:-]+$/\nconst CREDENTIAL_METADATA = /(?:\\b(?:Bearer|Basic|Digest)\\s+\\S+|\\b(?:authorization|api[\\s_-]?key|token|secret)\\s*[:=]|\\b[a-z][a-z0-9+.-]*:\\/\\/[^/@\\s]+@|\\b(?:sk|pk|rk|key|token|thbt)[_-][A-Za-z0-9._-]{6,}\\b|\\bAIza[A-Za-z0-9_-]{20,}\\b|\\b(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{20,}\\b|\\bgithub_pat_[A-Za-z0-9_]{20,}\\b|\\bxox[baprs]-[A-Za-z0-9-]{10,}\\b|\\b(?:AKIA|ASIA)[A-Z0-9]{16}\\b)/i\nconst IDEMPOTENT_READ_TOOLS = new Set<ThorbitKnowledgeBaseMcpToolName>([\n 'thorbit_kb_list',\n 'thorbit_kb_source_status',\n 'thorbit_kb_search',\n])\n\nfunction asRecord(value: unknown): JsonRecord | null {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? value as JsonRecord\n : null\n}\n\nfunction safeText(value: unknown, fallback: string, maxLength = 4_000): string {\n if (typeof value !== 'string' || value.trim().length === 0) return fallback\n return value.trim().slice(0, maxLength).replace(CREDENTIAL_TEXT, '[redacted]')\n}\n\nfunction safeDetails(value: unknown, depth = 0, active = new WeakSet<object>()): unknown {\n if (depth > 4) return '[detail depth omitted]'\n if (typeof value === 'string') return safeText(value, '[empty detail]')\n if (typeof value === 'number' || typeof value === 'boolean' || value === null) return value\n if (Array.isArray(value)) return value.slice(0, 25).map(item => safeDetails(item, depth + 1, active))\n if (!value || typeof value !== 'object') return undefined\n if (active.has(value)) return '[cyclic detail omitted]'\n\n active.add(value)\n try {\n const output: JsonRecord = {}\n for (const [key, detail] of Object.entries(value).slice(0, 40)) {\n output[key] = SENSITIVE_DETAIL_KEY.test(key)\n ? '[redacted]'\n : safeDetails(detail, depth + 1, active)\n }\n return output\n } catch {\n return '[unavailable detail]'\n } finally {\n active.delete(value)\n }\n}\n\nfunction requiredString(record: JsonRecord, key: string): string {\n const value = record[key]\n if (typeof value !== 'string' || value.trim().length === 0) {\n throw new TypeError(`Knowledge Base result is missing ${key}`)\n }\n return value.trim()\n}\n\nfunction optionalString(record: JsonRecord, key: string): string | null {\n const value = record[key]\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : null\n}\n\nfunction safeMetadataIdentifier(value: unknown, maxLength = 255): string | null {\n if (typeof value !== 'string') return null\n const candidate = value.trim()\n if (\n candidate.length === 0\n || candidate.length > maxLength\n || !SAFE_METADATA_IDENTIFIER.test(candidate)\n || CREDENTIAL_METADATA.test(candidate)\n ) return null\n return candidate\n}\n\nfunction requiredDateTime(record: JsonRecord, key: string): string {\n const value = requiredString(record, key)\n if (Number.isNaN(Date.parse(value))) {\n throw new TypeError(`Knowledge Base result has an invalid ${key}`)\n }\n return value\n}\n\nfunction requiredNumber(record: JsonRecord, key: string): number {\n const value = record[key]\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw new TypeError(`Knowledge Base result is missing ${key}`)\n }\n return value\n}\n\nfunction normalizeSourceStatus(value: unknown): 'pending' | 'processing' | 'ready' | 'failed' {\n switch (value) {\n case 'pending':\n case 'processing':\n case 'ready':\n case 'failed':\n return value\n default:\n throw new TypeError(`Unsupported Knowledge Base source status: ${String(value)}`)\n }\n}\n\nfunction normalizeKnowledgeBase(value: unknown) {\n const record = asRecord(value)\n if (!record) throw new TypeError('Knowledge Base record must be an object')\n return {\n knowledgeBasePublicId: optionalString(record, 'knowledgeBasePublicId')\n ?? requiredString(record, 'publicId'),\n name: requiredString(record, 'name'),\n status: requiredString(record, 'status'),\n createdAt: requiredDateTime(record, 'createdAt'),\n updatedAt: requiredDateTime(record, 'updatedAt'),\n }\n}\n\nfunction normalizeCitation(value: unknown) {\n const citation = asRecord(value)\n if (!citation) throw new TypeError('Knowledge Base citation must be an object')\n const sourceUrl = optionalString(citation, 'sourceUrl')\n const rawChunkIndex = citation.chunkIndex\n const rawTimestampStart = citation.timestampStart\n\n return {\n index: requiredNumber(citation, 'index'),\n chunkPublicId: requiredString(citation, 'chunkPublicId'),\n sourcePublicId: optionalString(citation, 'sourcePublicId'),\n sourceTitle: requiredString(citation, 'sourceTitle'),\n sourceType: requiredString(citation, 'sourceType'),\n sourceUrl,\n chunkIndex: typeof rawChunkIndex === 'number' && Number.isFinite(rawChunkIndex)\n ? rawChunkIndex\n : null,\n timestampStart: typeof rawTimestampStart === 'number' && Number.isFinite(rawTimestampStart)\n ? rawTimestampStart\n : null,\n excerpt: typeof citation.excerpt === 'string'\n ? citation.excerpt.slice(0, 10_000)\n : '',\n }\n}\n\nfunction normalizeCitationList(value: unknown) {\n if (!Array.isArray(value)) {\n throw new TypeError('Knowledge Base result is missing citations')\n }\n return value.slice(0, 50).map(normalizeCitation)\n}\n\nfunction normalizeIngestReceipt(result: JsonRecord) {\n let receipt = result\n const wrappedReceipt = asRecord(result.receipt)\n if (wrappedReceipt) {\n receipt = wrappedReceipt\n } else if (Array.isArray(result.receipts)) {\n if (result.receipts.length !== 1) {\n throw new TypeError('The exact Knowledge Base ingest contract requires one provider source receipt')\n }\n const onlyReceipt = asRecord(result.receipts[0])\n if (!onlyReceipt) throw new TypeError('Knowledge Base ingest receipt must be an object')\n receipt = onlyReceipt\n }\n\n const sourcePublicId = requiredString(receipt, 'sourcePublicId')\n return {\n knowledgeBasePublicId: requiredString(receipt, 'knowledgeBasePublicId'),\n sourcePublicId,\n sourceType: requiredString(receipt, 'sourceType'),\n status: normalizeSourceStatus(receipt.status),\n pollToolName: 'thorbit_kb_source_status' as const,\n pollInput: { sourcePublicIds: [sourcePublicId] },\n }\n}\n\nfunction normalizeSuccessResult(\n toolName: ThorbitKnowledgeBaseMcpToolName,\n value: unknown,\n envelopeUsage?: unknown,\n): unknown {\n const result = asRecord(value)\n if (!result) throw new TypeError('Knowledge Base result must be an object')\n\n switch (toolName) {\n case 'thorbit_kb_create':\n return normalizeKnowledgeBase(asRecord(result.knowledgeBase) ?? result)\n case 'thorbit_kb_list': {\n if (!Array.isArray(result.knowledgeBases)) {\n throw new TypeError('Knowledge Base list is missing knowledgeBases')\n }\n return {\n knowledgeBases: result.knowledgeBases.slice(0, 100).map(normalizeKnowledgeBase),\n nextCursor: optionalString(result, 'nextCursor'),\n }\n }\n case 'thorbit_kb_source_status': {\n let source = result\n if (Array.isArray(result.sources)) {\n if (result.sources.length !== 1) {\n throw new TypeError('The exact Knowledge Base source-status contract requires one provider source')\n }\n const onlySource = asRecord(result.sources[0])\n if (!onlySource) throw new TypeError('Knowledge Base source status must be an object')\n source = onlySource\n }\n const rawError = optionalString(source, 'error') ?? optionalString(source, 'errorMessage')\n return {\n knowledgeBasePublicId: requiredString(source, 'knowledgeBasePublicId'),\n sourcePublicId: requiredString(source, 'sourcePublicId'),\n sourceType: requiredString(source, 'sourceType'),\n status: normalizeSourceStatus(source.status),\n progressPercent: requiredNumber(source, 'progressPercent'),\n error: rawError ? rawError.slice(0, 4_000) : null,\n updatedAt: requiredDateTime(source, 'updatedAt'),\n }\n }\n case 'thorbit_kb_ingest_url':\n case 'thorbit_kb_ingest_site':\n case 'thorbit_kb_ingest_youtube':\n case 'thorbit_kb_ingest_text':\n return normalizeIngestReceipt(result)\n case 'thorbit_kb_search': {\n if (!Array.isArray(result.results)) {\n throw new TypeError('Knowledge Base search is missing results')\n }\n return {\n query: requiredString(result, 'query'),\n results: result.results.slice(0, 50).map(value => {\n const match = asRecord(value)\n if (!match) throw new TypeError('Knowledge Base search match must be an object')\n const text = typeof match.text === 'string'\n ? match.text\n : requiredString(match, 'content')\n return {\n chunkPublicId: requiredString(match, 'chunkPublicId'),\n text: text.slice(0, 50_000),\n score: requiredNumber(match, 'score'),\n }\n }),\n citations: normalizeCitationList(result.citations),\n }\n }\n case 'thorbit_kb_ask': {\n const sufficiency = asRecord(result.sufficiency)\n const followUpValue = Array.isArray(result.followUps)\n ? result.followUps\n : sufficiency?.followUpSuggestions\n const followUps = Array.isArray(followUpValue)\n ? followUpValue\n .filter((item): item is string => typeof item === 'string' && item.trim().length > 0)\n .map(item => item.trim().slice(0, 8_000))\n .slice(0, 20)\n : []\n const usage = asRecord(envelopeUsage)\n const explicitModelId = optionalString(result, 'modelId')\n return {\n answer: requiredString(result, 'answer').slice(0, 500_000),\n citations: normalizeCitationList(result.citations),\n followUps,\n modelId: explicitModelId !== null\n ? safeMetadataIdentifier(explicitModelId)\n : safeMetadataIdentifier(usage?.modelId),\n }\n }\n }\n}\n\nfunction normalizeUsage(value: unknown): JsonRecord | undefined {\n const usage = asRecord(value)\n if (!usage) return undefined\n const output: JsonRecord = {}\n for (const key of ['creditsConsumed', 'estimatedUsd'] as const) {\n const candidate = usage[key]\n if (typeof candidate === 'number' && Number.isFinite(candidate) && candidate >= 0) {\n output[key] = candidate\n }\n }\n for (const key of ['inputTokens', 'outputTokens'] as const) {\n const candidate = usage[key]\n if (typeof candidate === 'number' && Number.isInteger(candidate) && candidate >= 0) {\n output[key] = candidate\n }\n }\n for (const key of ['provider', 'modelId'] as const) {\n const candidate = safeMetadataIdentifier(usage[key])\n if (candidate !== null) output[key] = candidate\n }\n return Object.keys(output).length > 0 ? output : undefined\n}\n\nfunction successNextActions(toolName: ThorbitKnowledgeBaseMcpToolName, result: unknown) {\n const record = asRecord(result)\n if (!record) return []\n\n if (toolName.startsWith('thorbit_kb_ingest_')) {\n return [{\n toolName: 'thorbit_kb_source_status',\n reason: 'Check the real provider-backed source status after ingestion.',\n input: record.pollInput as JsonRecord,\n }]\n }\n if (toolName === 'thorbit_kb_source_status') {\n if (record.status === 'pending' || record.status === 'processing') {\n return [{\n toolName: 'thorbit_kb_source_status',\n reason: 'Poll this source until it is ready or failed.',\n input: { sourcePublicIds: [record.sourcePublicId] },\n }]\n }\n if (record.status === 'ready') {\n return [\n {\n toolName: 'thorbit_kb_search',\n reason: 'Retrieve bounded citation-ready chunks from the ready knowledge base.',\n input: { knowledgeBasePublicId: record.knowledgeBasePublicId },\n },\n {\n toolName: 'thorbit_kb_ask',\n reason: 'Ask a grounded question against the ready knowledge base.',\n input: { knowledgeBasePublicId: record.knowledgeBasePublicId },\n },\n ]\n }\n }\n if (toolName === 'thorbit_kb_search') {\n return [{\n toolName: 'thorbit_kb_ask',\n reason: 'Synthesize a grounded answer when the retrieved chunks are sufficient.',\n input: { question: record.query },\n }]\n }\n return []\n}\n\nfunction normalizedErrorCode(code: string): string {\n if (PUBLIC_ERROR_CODES.has(code)) return code\n if (code === 'ingestion_error' || code === 'invalid_response' || code.startsWith('http_')) {\n return 'provider_error'\n }\n return 'internal_error'\n}\n\nfunction errorRecovery(\n toolName: ThorbitKnowledgeBaseMcpToolName,\n code: string,\n): {\n retryable: boolean\n next: Array<{ toolName: ThorbitKnowledgeBaseMcpToolName; reason: string }>\n} {\n const transient = code === 'provider_error' || code === 'rate_limited' || code === 'internal_error'\n if (!transient || !IDEMPOTENT_READ_TOOLS.has(toolName)) {\n return { retryable: false, next: [] }\n }\n\n return {\n retryable: true,\n next: [{\n toolName,\n reason: code === 'rate_limited'\n ? 'Retry this idempotent read after the rate limit resets.'\n : 'Retry this idempotent read after the transient service issue is resolved.',\n }],\n }\n}\n\nfunction projectionErrorDetails(error: unknown): JsonRecord {\n const issueRecord = asRecord(error)\n const issues = Array.isArray(issueRecord?.issues)\n ? issueRecord.issues.slice(0, 25).map(issue => {\n const issueValue = asRecord(issue)\n return {\n path: Array.isArray(issueValue?.path) ? issueValue.path.map(String).join('.') : '',\n code: typeof issueValue?.code === 'string' ? issueValue.code : 'invalid_result',\n }\n })\n : []\n return {\n reason: 'Hosted result did not satisfy the exact public Knowledge Base result contract.',\n ...(issues.length > 0 ? { schemaIssues: issues } : {}),\n }\n}\n\nfunction successSummary(toolName: ThorbitKnowledgeBaseMcpToolName, result: unknown): string {\n const record = asRecord(result)\n switch (toolName) {\n case 'thorbit_kb_create':\n return `Created Thorbit knowledge base ${String(record?.name ?? '')}.`\n case 'thorbit_kb_list':\n return `Found ${Array.isArray(record?.knowledgeBases) ? record.knowledgeBases.length : 0} Thorbit knowledge bases.`\n case 'thorbit_kb_source_status':\n return `Knowledge Base source ${String(record?.sourcePublicId ?? '')} is ${String(record?.status ?? 'unknown')}.`\n case 'thorbit_kb_ingest_url':\n case 'thorbit_kb_ingest_site':\n case 'thorbit_kb_ingest_youtube':\n case 'thorbit_kb_ingest_text':\n return `Knowledge Base source ${String(record?.sourcePublicId ?? '')} was accepted with status ${String(record?.status ?? 'unknown')}.`\n case 'thorbit_kb_search':\n return `Retrieved ${Array.isArray(record?.results) ? record.results.length : 0} bounded Knowledge Base chunks with citations.`\n case 'thorbit_kb_ask':\n return `Generated a grounded Knowledge Base answer with ${Array.isArray(record?.citations) ? record.citations.length : 0} citations.`\n }\n}\n\nexport function formatThorbitKbMcpToolResult(\n toolName: ThorbitKnowledgeBaseMcpToolName,\n envelope: ThorbitKnowledgeBaseFormatterEnvelope,\n _requestInput?: unknown,\n): CallToolResult {\n const requestId = safeText(envelope.requestId, 'unavailable', 256)\n const outputSchema = ThorbitKnowledgeBaseMcpToolStrictOutputSchemas[toolName]\n\n if (!envelope.ok) {\n const code = normalizedErrorCode(envelope.error.code)\n const message = safeText(envelope.error.message, 'Knowledge Base operation failed.')\n const recovery = errorRecovery(toolName, code)\n const structuredContent = outputSchema.parse({\n ok: false,\n toolName,\n requestId,\n error: {\n code,\n message,\n retryable: recovery.retryable,\n ...(envelope.error.details !== undefined\n ? { details: safeDetails(envelope.error.details) }\n : {}),\n },\n next: recovery.next,\n }) as JsonRecord\n return {\n content: [{ type: 'text', text: `${message} Request ID: ${requestId}.` }],\n structuredContent,\n isError: true,\n }\n }\n\n try {\n const result = normalizeSuccessResult(toolName, envelope.result, envelope.usage)\n const summary = successSummary(toolName, result)\n const usage = normalizeUsage(envelope.usage)\n const structuredContent = outputSchema.parse({\n ok: true,\n toolName,\n requestId,\n summary,\n result,\n artifacts: [],\n next: successNextActions(toolName, result),\n warnings: (envelope.warnings ?? []).map(warning => safeText(warning, 'Hosted warning')),\n ...(usage ? { usage } : {}),\n }) as JsonRecord\n return {\n content: [{ type: 'text', text: summary }],\n structuredContent,\n isError: false,\n }\n } catch (error) {\n const message = 'Thorbit completed the Knowledge Base operation, but its hosted result could not be projected to the exact public contract.'\n const structuredContent = outputSchema.parse({\n ok: false,\n toolName,\n requestId,\n error: {\n code: 'provider_error',\n message,\n retryable: false,\n details: projectionErrorDetails(error),\n },\n next: [],\n }) as JsonRecord\n return {\n content: [{ type: 'text', text: `${message} Request ID: ${requestId}.` }],\n structuredContent,\n isError: true,\n }\n }\n}\n"],"mappings":"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","names":["import_thorbit_mcp_core","value"]}
|