@dasaying/feishu-doc-mcp 1.0.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../package.json","../src/types-global/errors.ts","../src/config/index.ts","../src/utils/internal/runtime.ts","../src/utils/telemetry/instrumentation.ts","../src/mcp-server/transports/auth/lib/authContext.ts","../src/utils/internal/requestContext.ts","../src/utils/types/guards.ts","../src/utils/security/sanitization.ts","../src/utils/internal/logger.ts","../src/utils/internal/error-handler/mappings.ts","../src/utils/internal/error-handler/helpers.ts","../src/utils/internal/error-handler/errorHandler.ts","../src/utils/telemetry/semconv.ts","../src/utils/internal/performance.ts","../src/utils/internal/startupBanner.ts","../src/utils/security/idGenerator.ts","../src/container/tokens.ts","../src/utils/security/rateLimiter.ts","../src/utils/formatting/markdownBuilder.ts","../src/utils/internal/encoding.ts","../src/storage/core/storageValidation.ts","../src/storage/core/StorageService.ts","../src/storage/providers/fileSystem/fileSystemProvider.ts","../src/storage/providers/inMemory/inMemoryProvider.ts","../src/storage/providers/supabase/supabaseProvider.ts","../src/storage/providers/surrealdb/core/queryBuilder.ts","../src/storage/providers/surrealdb/core/transactionManager.ts","../src/storage/providers/surrealdb/kv/surrealKvProvider.ts","../src/storage/providers/cloudflare/r2Provider.ts","../src/storage/providers/cloudflare/kvProvider.ts","../src/storage/providers/cloudflare/d1Provider.ts","../src/storage/core/storageFactory.ts","../src/container/registrations/core.ts","../src/services/feishu/constants.ts","../src/services/feishu/core/FeishuService.ts","../src/services/feishu/providers/markdown-processor.provider.ts","../src/services/feishu/providers/feishu-api.provider.ts","../src/services/feishu/providers/rate-limiter.provider.ts","../src/services/feishu/providers/content-converter.provider.ts","../src/container/registrations/feishu.ts","../src/mcp-server/resources/definitions/index.ts","../src/mcp-server/resources/utils/resourceHandlerFactory.ts","../src/mcp-server/resources/resource-registration.ts","../src/mcp-server/prompts/definitions/index.ts","../src/mcp-server/prompts/prompt-registration.ts","../src/mcp-server/roots/roots-registration.ts","../src/mcp-server/transports/auth/lib/authUtils.ts","../src/mcp-server/transports/auth/lib/withAuth.ts","../src/mcp-server/tools/definitions/feishu-auth-url.tool.ts","../src/mcp-server/tools/definitions/feishu-auth-callback.tool.ts","../src/mcp-server/tools/definitions/feishu-upload-markdown.tool.ts","../src/mcp-server/tools/definitions/feishu-update-document.tool.ts","../src/mcp-server/tools/definitions/feishu-list-folders.tool.ts","../src/mcp-server/tools/definitions/feishu-list-wikis.tool.ts","../src/mcp-server/tools/definitions/feishu-list-wiki-nodes.tool.ts","../src/mcp-server/tools/definitions/feishu-get-user-info.tool.ts","../src/mcp-server/tools/definitions/feishu-set-default-app.tool.ts","../src/mcp-server/tools/definitions/feishu-list-apps.tool.ts","../src/mcp-server/tools/definitions/feishu-batch-upload.tool.ts","../src/mcp-server/tools/definitions/feishu-read-document.tool.ts","../src/mcp-server/tools/definitions/feishu-batch-read-documents.tool.ts","../src/mcp-server/tools/definitions/feishu-read-wiki-recursive.tool.ts","../src/mcp-server/tools/definitions/index.ts","../src/mcp-server/tools/utils/toolHandlerFactory.ts","../src/mcp-server/tasks/core/storageBackedTaskStore.ts","../src/mcp-server/tasks/core/taskManager.ts","../src/mcp-server/tasks/utils/taskToolDefinition.ts","../src/mcp-server/tools/tool-registration.ts","../src/mcp-server/server.ts","../node_modules/pkce-challenge/dist/index.node.js","../node_modules/@hono/mcp/src/auth/helpers/authorize.ts","../node_modules/@hono/mcp/src/auth/helpers/token.ts","../node_modules/@hono/mcp/src/auth/middleware/client-auth.ts","../node_modules/@hono/mcp/src/streaming.ts","../node_modules/@hono/mcp/src/streamable-http.ts","../src/mcp-server/transports/auth/strategies/jwtStrategy.ts","../src/mcp-server/transports/auth/strategies/oauthStrategy.ts","../src/mcp-server/transports/auth/authFactory.ts","../src/mcp-server/transports/auth/authMiddleware.ts","../src/mcp-server/transports/http/httpErrorHandler.ts","../src/mcp-server/transports/http/sessionIdUtils.ts","../src/mcp-server/transports/http/sessionStore.ts","../src/mcp-server/transports/http/httpTransport.ts","../src/mcp-server/transports/http/streamableHttpTransport.ts","../src/mcp-server/transports/hybrid/hybridTransport.ts","../src/mcp-server/transports/stdio/stdioTransport.ts","../src/mcp-server/transports/manager.ts","../src/container/registrations/mcp.ts","../src/container/index.ts","../src/index.ts"],"names":["JsonRpcErrorCode","z","config","authContext","path","isServerless","transportType","fs","require","resolve","trace","SpanStatusCode","cryptoRandomUUID","charset","Logger","logger","url","markdown","StorageService","injectable","inject","DEFAULT_LIST_LIMIT","object","hasR2Bucket","hasKVNamespace","hasD1Database","container","path2","run","Lifecycle","TOOL_NAME","TOOL_TITLE","TOOL_DESCRIPTION","TOOL_ANNOTATIONS","InputSchema","OutputSchema","usedAppId","responseFormatter","path3","fs2","path4","fs3","path5","fs4","result","defaultResponseFormatter","injectAll","McpServer","version: string","contextStash: WeakMap<ReadableStream, Context>","streamId: string | ((stream: SSEStreamingApi) => Promise<string>)","authInfo: AuthInfo | undefined","requestInfo: RequestInfo","messages: JSONRPCMessage[]","#sessionIdGenerator","#standaloneSseStreamId","eventId: string | undefined","streamId","jwtVerify","randomBytes","Hono","cors","html","isPortInUse","http","startHttpServerWithRetry","serve"],"mappings":"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","file":"index.js","sourcesContent":["{\n \"name\": \"@dasaying/feishu-doc-mcp\",\n \"version\": \"1.0.0\",\n \"mcpName\": \"io.github.dasaying/feishu-doc-mcp\",\n \"description\": \"飞书云文档 MCP 服务器 - 支持 Markdown 文档上传、读取和批量操作。Feishu (Lark) Document MCP Server - Support Markdown upload, read and batch operations.\",\n \"main\": \"dist/index.js\",\n \"types\": \"dist/index.d.ts\",\n \"files\": [\n \"dist\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"bin\": {\n \"feishu-doc-mcp\": \"dist/index.js\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n },\n \"./*\": \"./dist/*\"\n },\n \"type\": \"module\",\n \"sideEffects\": false,\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/spelens-gud/feishu-doc-mcp\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/spelens-gud/feishu-doc-mcp/issues\"\n },\n \"homepage\": \"https://github.com/spelens-gud/feishu-doc-mcp#readme\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"build:watch\": \"tsup --watch\",\n \"deploy:dev\": \"MCP_TRANSPORT_TYPE=http npx wrangler dev\",\n \"deploy:prod\": \"MCP_TRANSPORT_TYPE=http npx wrangler deploy\",\n \"start\": \"node ./dist/index.js\",\n \"start:stdio\": \"MCP_TRANSPORT_TYPE=stdio node ./dist/index.js\",\n \"start:http\": \"MCP_TRANSPORT_TYPE=http node ./dist/index.js\",\n \"dev\": \"tsx watch src/index.ts\",\n \"dev:stdio\": \"MCP_LOG_LEVEL=debug MCP_TRANSPORT_TYPE=stdio tsx watch src/index.ts\",\n \"dev:http\": \"MCP_LOG_LEVEL=debug MCP_TRANSPORT_TYPE=http tsx watch src/index.ts\",\n \"devdocs\": \"tsx scripts/devdocs.ts\",\n \"devcheck\": \"tsx scripts/devcheck.ts\",\n \"rebuild\": \"npm run clean && npm run build\",\n \"clean\": \"rimraf dist\",\n \"docs:generate\": \"npx typedoc\",\n \"depcheck\": \"npx depcheck\",\n \"lint\": \"eslint .\",\n \"lint:fix\": \"eslint . --fix\",\n \"typecheck\": \"tsc --noEmit\",\n \"typecheck:scripts\": \"tsc --project tsconfig.scripts.json --noEmit\",\n \"tree\": \"tsx scripts/tree.ts\",\n \"fetch-spec\": \"tsx scripts/fetch-openapi-spec.ts\",\n \"format\": \"prettier --write \\\"**/*.{ts,js,json,md,html,css}\\\"\",\n \"prepare\": \"husky\",\n \"inspector\": \"npx mcp-inspector --config mcp.json --server mcp-ts-template\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"test:coverage\": \"vitest run --coverage\",\n \"coverage:update\": \"tsx scripts/update-coverage.ts\",\n \"coverage:commit\": \"tsx scripts/update-coverage.ts --commit\",\n \"audit\": \"npm audit\",\n \"audit:fix\": \"npm audit fix\",\n \"publish-mcp\": \"tsx scripts/validate-mcp-publish-schema.ts\"\n },\n \"overrides\": {},\n \"devDependencies\": {\n \"@cloudflare/workers-types\": \"^4.20251212.0\",\n \"@eslint/js\": \"^9.39.1\",\n \"@hono/mcp\": \"^0.2.2\",\n \"@types/diff\": \"^8.0.0\",\n \"@types/js-yaml\": \"^4.0.9\",\n \"@types/node\": \"^25.0.1\",\n \"@types/node-cron\": \"^3.0.11\",\n \"@types/papaparse\": \"^5.5.1\",\n \"@types/sanitize-html\": \"^2.16.0\",\n \"@types/validator\": \"13.15.10\",\n \"@vitest/coverage-v8\": \"4.0.15\",\n \"clipboardy\": \"^5.0.1\",\n \"depcheck\": \"^1.4.7\",\n \"diff\": \"^8.0.2\",\n \"eslint\": \"^9.39.1\",\n \"execa\": \"^9.6.1\",\n \"globals\": \"^16.5.0\",\n \"husky\": \"^9.1.7\",\n \"ignore\": \"^7.0.5\",\n \"msw\": \"^2.12.4\",\n \"prettier\": \"^3.7.4\",\n \"repomix\": \"^1.10.1\",\n \"rimraf\": \"^6.0.1\",\n \"tsup\": \"^8.4.0\",\n \"tsx\": \"^4.19.4\",\n \"typedoc\": \"^0.28.15\",\n \"typescript\": \"^5.9.3\",\n \"typescript-eslint\": \"8.49.0\",\n \"vite\": \"7.2.7\",\n \"vite-tsconfig-paths\": \"^5.1.4\",\n \"vitest\": \"^4.0.15\"\n },\n \"keywords\": [\n \"mcp\",\n \"mcp-server\",\n \"model-context-protocol\",\n \"feishu\",\n \"lark\",\n \"feishu-doc\",\n \"lark-doc\",\n \"markdown\",\n \"document\",\n \"wiki\",\n \"knowledge-base\",\n \"oauth\",\n \"typescript\",\n \"ai\",\n \"ai-agent\",\n \"llm\",\n \"claude\",\n \"openai\"\n ],\n \"author\": \"Your Name <your.email@example.com>\",\n \"license\": \"Apache-2.0\",\n \"engines\": {\n \"node\": \">=20.0.0\"\n },\n \"depcheck\": {\n \"ignores\": [\n \"repomix\",\n \"mcp-ts-template\"\n ]\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"dependencies\": {\n \"@hono/node-server\": \"^1.19.7\",\n \"@modelcontextprotocol/sdk\": \"^1.24.3\",\n \"@opentelemetry/api\": \"^1.9.0\",\n \"@opentelemetry/auto-instrumentations-node\": \"^0.67.2\",\n \"@opentelemetry/exporter-metrics-otlp-http\": \"^0.208.0\",\n \"@opentelemetry/exporter-trace-otlp-http\": \"^0.208.0\",\n \"@opentelemetry/instrumentation-pino\": \"^0.55.0\",\n \"@opentelemetry/resources\": \"^2.2.0\",\n \"@opentelemetry/sdk-metrics\": \"^2.2.0\",\n \"@opentelemetry/sdk-node\": \"^0.208.0\",\n \"@opentelemetry/sdk-trace-node\": \"^2.2.0\",\n \"@opentelemetry/semantic-conventions\": \"^1.38.0\",\n \"@supabase/supabase-js\": \"^2.87.1\",\n \"ajv\": \"^8.17.1\",\n \"ajv-formats\": \"^3.0.1\",\n \"axios\": \"^1.13.2\",\n \"chrono-node\": \"^2.9.0\",\n \"dotenv\": \"^17.2.3\",\n \"fast-xml-parser\": \"^5.3.3\",\n \"hono\": \"^4.10.8\",\n \"jose\": \"^6.1.3\",\n \"js-yaml\": \"^4.1.1\",\n \"node-cron\": \"^4.2.1\",\n \"openai\": \"^6.10.0\",\n \"papaparse\": \"^5.5.3\",\n \"partial-json\": \"^0.1.7\",\n \"pdf-lib\": \"^1.17.1\",\n \"pino\": \"^10.1.0\",\n \"pino-pretty\": \"^13.1.3\",\n \"reflect-metadata\": \"^0.2.2\",\n \"sanitize-html\": \"^2.17.0\",\n \"surrealdb\": \"^1.3.2\",\n \"tslib\": \"^2.8.1\",\n \"tsyringe\": \"^4.10.0\",\n \"unpdf\": \"^1.4.0\",\n \"validator\": \"13.15.23\",\n \"zod\": \"^4.1.13\"\n }\n}\n","/**\n * @fileoverview Defines standardized error codes, a custom error class, and related schemas\n * for handling errors within the Model Context Protocol (MCP) server and its components.\n * This module provides a structured way to represent and communicate errors, ensuring\n * consistency and clarity for both server-side operations and client-side error handling.\n * @module src/types-global/errors\n */\nimport { z } from 'zod';\n\n/**\n * Defines JSON-RPC 2.0 error codes, including standard and implementation-defined codes.\n * @see https://www.jsonrpc.org/specification#error_object\n */\nexport enum JsonRpcErrorCode {\n // Standard JSON-RPC 2.0 Errors\n ParseError = -32700,\n InvalidRequest = -32600,\n MethodNotFound = -32601,\n InvalidParams = -32602,\n InternalError = -32603,\n\n // Implementation-defined server-errors (-32000 to -32099)\n ServiceUnavailable = -32000,\n NotFound = -32001,\n Conflict = -32002,\n RateLimited = -32003,\n Timeout = -32004,\n Forbidden = -32005,\n Unauthorized = -32006,\n ValidationError = -32007,\n ConfigurationError = -32008,\n InitializationFailed = -32009,\n DatabaseError = -32010,\n SerializationError = -32070, // Data serialization/deserialization failed\n UnknownError = -32099, // A generic fallback\n}\n\n/**\n * Custom error class for MCP-specific errors, extending the built-in `Error` class.\n * It standardizes error reporting by encapsulating a `JsonRpcErrorCode`, a descriptive\n * human-readable message, and optional structured data for more context.\n *\n * This class is central to error handling within the MCP framework, allowing for\n * consistent error creation and propagation.\n */\nexport class McpError extends Error {\n /**\n * The standardized error code from {@link JsonRpcErrorCode}.\n */\n public code: JsonRpcErrorCode;\n\n /**\n * Optional additional data about the error, conforming to the JSON-RPC 2.0 specification.\n * This can be any structured data that helps in understanding or debugging the error.\n * @see https://www.jsonrpc.org/specification#error_object\n */\n public readonly data?: Record<string, unknown>;\n\n /**\n * Creates an instance of McpError.\n *\n * @param code - The standardized error code that categorizes the error.\n * @param message - A human-readable description of the error.\n * @param data - Optional. A record containing additional structured data about the error.\n */\n constructor(\n code: JsonRpcErrorCode,\n message?: string,\n data?: Record<string, unknown>,\n options?: { cause?: unknown },\n ) {\n super(message, options);\n\n this.code = code;\n if (data) {\n this.data = data;\n }\n this.name = 'McpError';\n\n // Maintain a proper prototype chain.\n Object.setPrototypeOf(this, McpError.prototype);\n\n // Capture the stack trace, excluding the constructor call from it, if available.\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, McpError);\n }\n }\n}\n\n/**\n * Zod schema for validating error objects. This schema can be used for:\n * - Validating error structures when parsing error responses from external services.\n * - Ensuring consistency when creating or handling error objects internally.\n * - Generating TypeScript types for error objects.\n *\n * The schema enforces the presence of a `code` (from {@link JsonRpcErrorCode}) and a `message`,\n * and allows for optional `data`.\n */\nexport const ErrorSchema = z\n .object({\n /**\n * The error code, corresponding to one of the {@link JsonRpcErrorCode} enum values.\n * This field is required and helps in programmatically identifying the error type.\n */\n code: z\n .nativeEnum(JsonRpcErrorCode)\n .describe('Standardized error code from JsonRpcErrorCode enum'),\n /**\n * A human-readable, descriptive message explaining the error.\n * This field is required and provides context to developers or users.\n */\n message: z\n .string()\n .min(1, 'Error message cannot be empty.')\n .describe('Detailed human-readable error message'),\n /**\n * Optional. A record containing additional structured data or context about the error,\n * conforming to the JSON-RPC 2.0 `data` field.\n */\n data: z\n .record(z.string(), z.unknown())\n .optional()\n .describe(\n 'Optional structured data providing more context about the error',\n ),\n })\n .describe(\n 'Schema for validating structured error objects, ensuring consistency in error reporting.',\n );\n\n/**\n * TypeScript type inferred from the {@link ErrorSchema}.\n * This type represents the structure of a validated error object, commonly used\n * for error responses or when passing error information within the application.\n */\nexport type ErrorResponse = z.infer<typeof ErrorSchema>;\n","/**\n * @fileoverview Loads, validates, and exports application configuration.\n * This module centralizes configuration management, sourcing values from\n * environment variables. It uses Zod for schema validation to ensure type safety\n * and correctness of configuration parameters, and is designed to be\n * environment-agnostic (e.g., Node.js, Cloudflare Workers).\n *\n * @module src/config/index\n */\nimport dotenv from 'dotenv';\nimport { z } from 'zod';\n\nimport packageJson from '../../package.json' with { type: 'json' };\nimport { JsonRpcErrorCode, McpError } from '../types-global/errors.js';\n\ntype PackageManifest = {\n name?: string;\n version?: string;\n description?: string;\n};\n\nconst packageManifest = packageJson as PackageManifest;\nconst hasFileSystemAccess =\n typeof process !== 'undefined' &&\n typeof process.versions === 'object' &&\n process.versions !== null &&\n typeof process.versions.node === 'string';\n\n// Suppress dotenv's noisy initial log message as suggested by its output.\ndotenv.config({ quiet: true });\n\n// --- Helper Functions ---\nconst emptyStringAsUndefined = (val: unknown) => {\n if (typeof val === 'string' && val.trim() === '') {\n return undefined;\n }\n return val;\n};\n\n// --- Schema Definition ---\nconst ConfigSchema = z.object({\n // Package information sourced from environment variables\n pkg: z.object({\n name: z.string(),\n version: z.string(),\n description: z.string().optional(),\n }),\n mcpServerName: z.string(), // Will be derived from pkg.name\n mcpServerVersion: z.string(), // Will be derived from pkg.version\n mcpServerDescription: z.string().optional(), // Will be derived from pkg.description\n logLevel: z\n .preprocess(\n (val) => {\n const str = emptyStringAsUndefined(val);\n if (typeof str === 'string') {\n const lower = str.toLowerCase();\n const aliasMap: Record<string, string> = {\n warning: 'warn',\n err: 'error',\n information: 'info',\n };\n return aliasMap[lower] ?? lower;\n }\n return str;\n },\n z.enum(['fatal', 'error', 'warn', 'info', 'debug', 'trace', 'silent']),\n )\n .default('debug'),\n logsPath: z.string().optional(), // Made optional as it's Node-specific\n environment: z\n .preprocess(\n (val) => {\n const str = emptyStringAsUndefined(val);\n if (typeof str === 'string') {\n const lower = str.toLowerCase();\n const aliasMap: Record<string, string> = {\n dev: 'development',\n prod: 'production',\n test: 'testing',\n };\n return aliasMap[lower] ?? lower;\n }\n return str;\n },\n z.enum(['development', 'production', 'testing']),\n )\n .default('development'),\n mcpTransportType: z.preprocess(\n emptyStringAsUndefined,\n z.enum(['stdio', 'http']).default('stdio'),\n ),\n mcpHttpTransportMode: z.preprocess(\n emptyStringAsUndefined,\n z.enum(['streamable', 'sse']).default('sse'),\n ),\n mcpSessionMode: z.preprocess(\n emptyStringAsUndefined,\n z.enum(['stateless', 'stateful', 'auto']).default('auto'),\n ),\n mcpResponseVerbosity: z.preprocess(\n emptyStringAsUndefined,\n z.enum(['minimal', 'standard', 'full']).default('standard'),\n ),\n mcpHttpPort: z.coerce.number().default(3010),\n mcpHttpHost: z.string().default('127.0.0.1'),\n mcpHttpEndpointPath: z.string().default('/mcp'),\n mcpHttpMaxPortRetries: z.coerce.number().default(15),\n mcpHttpPortRetryDelayMs: z.coerce.number().default(50),\n mcpStatefulSessionStaleTimeoutMs: z.coerce.number().default(1_800_000),\n mcpAllowedOrigins: z.array(z.string()).optional(),\n mcpAuthSecretKey: z.string().optional(),\n mcpAuthMode: z.preprocess(\n emptyStringAsUndefined,\n z.enum(['jwt', 'oauth', 'none']).default('none'),\n ),\n oauthIssuerUrl: z.string().url().optional(),\n oauthJwksUri: z.string().url().optional(),\n oauthAudience: z.string().optional(),\n oauthJwksCooldownMs: z.coerce.number().default(300_000), // 5 minutes\n oauthJwksTimeoutMs: z.coerce.number().default(5_000), // 5 seconds\n mcpServerResourceIdentifier: z.string().url().optional(), // RFC 8707 resource indicator\n devMcpClientId: z.string().optional(),\n devMcpScopes: z.array(z.string()).optional(),\n openrouterAppUrl: z.string().default('http://localhost:3000'),\n openrouterAppName: z.string(),\n openrouterApiKey: z.string().optional(),\n llmDefaultModel: z.string().default('google/gemini-2.5-flash-preview-05-20'),\n llmDefaultTemperature: z.coerce.number().optional(),\n llmDefaultTopP: z.coerce.number().optional(),\n llmDefaultMaxTokens: z.coerce.number().optional(),\n llmDefaultTopK: z.coerce.number().optional(),\n llmDefaultMinP: z.coerce.number().optional(),\n oauthProxy: z\n .object({\n authorizationUrl: z.string().url().optional(),\n tokenUrl: z.string().url().optional(),\n revocationUrl: z.string().url().optional(),\n issuerUrl: z.string().url().optional(),\n serviceDocumentationUrl: z.string().url().optional(),\n defaultClientRedirectUris: z.array(z.string()).optional(),\n })\n .optional(),\n supabase: z\n .object({\n url: z.string().url(),\n anonKey: z.string(),\n serviceRoleKey: z.string().optional(),\n })\n .optional(),\n surrealdb: z\n .object({\n url: z.string().url(),\n namespace: z.string(),\n database: z.string(),\n username: z.string().optional(),\n password: z.string().optional(),\n tableName: z.string().default('kv_store'),\n })\n .optional(),\n storage: z.object({\n providerType: z\n .preprocess(\n (val) => {\n const str = emptyStringAsUndefined(val);\n if (typeof str === 'string') {\n const lower = str.toLowerCase();\n const aliasMap: Record<string, string> = {\n mem: 'in-memory',\n fs: 'filesystem',\n };\n return aliasMap[lower] ?? lower;\n }\n return str;\n },\n z.enum([\n 'in-memory',\n 'filesystem',\n 'supabase',\n 'surrealdb',\n 'cloudflare-r2',\n 'cloudflare-kv',\n 'cloudflare-d1',\n ]),\n )\n .default('in-memory'),\n filesystemPath: z.string().default('./.storage'), // This remains, but will only be used if providerType is 'filesystem'\n }),\n // Experimental: Task store configuration\n tasks: z.object({\n storeType: z\n .preprocess(\n (val) => {\n const str = emptyStringAsUndefined(val);\n if (typeof str === 'string') {\n const lower = str.toLowerCase();\n const aliasMap: Record<string, string> = {\n mem: 'in-memory',\n memory: 'in-memory',\n persistent: 'storage',\n };\n return aliasMap[lower] ?? lower;\n }\n return str;\n },\n z.enum(['in-memory', 'storage']),\n )\n .default('in-memory'),\n tenantId: z.string().default('system-tasks'),\n defaultTtlMs: z.coerce.number().nullable().optional(),\n }),\n openTelemetry: z.object({\n enabled: z.coerce.boolean().default(false),\n serviceName: z.string(),\n serviceVersion: z.string(),\n tracesEndpoint: z.string().url().optional(),\n metricsEndpoint: z.string().url().optional(),\n samplingRatio: z.coerce.number().default(1.0),\n logLevel: z\n .preprocess(\n (val) => {\n const str = emptyStringAsUndefined(val);\n if (typeof str === 'string') {\n const lower = str.toLowerCase();\n const aliasMap: Record<string, string> = {\n err: 'ERROR',\n warning: 'WARN',\n information: 'INFO',\n };\n return aliasMap[lower] ?? str.toUpperCase();\n }\n return str;\n },\n z.enum(['NONE', 'ERROR', 'WARN', 'INFO', 'DEBUG', 'VERBOSE', 'ALL']),\n )\n .default('INFO'),\n }),\n speech: z\n .object({\n tts: z\n .object({\n enabled: z.coerce.boolean().default(false),\n provider: z.enum(['elevenlabs']).default('elevenlabs'),\n apiKey: z.string().optional(),\n baseUrl: z.string().url().optional(),\n defaultVoiceId: z.string().optional(),\n defaultModelId: z.string().optional(),\n timeout: z.coerce.number().optional(),\n })\n .optional(),\n stt: z\n .object({\n enabled: z.coerce.boolean().default(false),\n provider: z.enum(['openai-whisper']).default('openai-whisper'),\n apiKey: z.string().optional(),\n baseUrl: z.string().url().optional(),\n defaultModelId: z.string().optional(),\n timeout: z.coerce.number().optional(),\n })\n .optional(),\n })\n .optional(),\n // 飞书服务配置\n feishu: z\n .object({\n /** 默认应用 ID */\n defaultAppId: z.string().optional(),\n /** 默认应用密钥 */\n defaultAppSecret: z.string().optional(),\n /** OAuth 回调地址 */\n oauthCallbackUrl: z.string().url().optional(),\n /** API 基础地址 */\n apiBaseUrl: z.string().url().default('https://open.feishu.cn/open-apis'),\n /** 是否启用频率限制 */\n rateLimitEnabled: z.coerce.boolean().default(true),\n /** 最大重试次数 */\n maxRetries: z.coerce.number().default(3),\n /** 重试延迟(毫秒) */\n retryDelayMs: z.coerce.number().default(1000),\n /** 请求超时(毫秒) */\n requestTimeoutMs: z.coerce.number().default(30000),\n })\n .optional(),\n});\n\n// --- Parsing Logic ---\nconst parseConfig = () => {\n const env = process.env;\n\n const rawConfig = {\n pkg: {\n name: env.PACKAGE_NAME ?? packageManifest.name,\n version: env.PACKAGE_VERSION ?? packageManifest.version,\n description: env.PACKAGE_DESCRIPTION ?? packageManifest.description,\n },\n logLevel: env.MCP_LOG_LEVEL,\n logsPath: env.LOGS_DIR,\n environment: env.NODE_ENV,\n mcpTransportType: env.MCP_TRANSPORT_TYPE,\n mcpHttpTransportMode: env.MCP_HTTP_TRANSPORT_MODE,\n mcpSessionMode: env.MCP_SESSION_MODE,\n mcpResponseVerbosity: env.MCP_RESPONSE_VERBOSITY,\n mcpHttpPort: env.MCP_HTTP_PORT,\n mcpHttpHost: env.MCP_HTTP_HOST,\n mcpHttpEndpointPath: env.MCP_HTTP_ENDPOINT_PATH,\n mcpHttpMaxPortRetries: env.MCP_HTTP_MAX_PORT_RETRIES,\n mcpHttpPortRetryDelayMs: env.MCP_HTTP_PORT_RETRY_DELAY_MS,\n mcpStatefulSessionStaleTimeoutMs: env.MCP_STATEFUL_SESSION_STALE_TIMEOUT_MS,\n mcpAllowedOrigins: env.MCP_ALLOWED_ORIGINS?.split(',')\n .map((o) => o.trim())\n .filter(Boolean),\n mcpAuthSecretKey: env.MCP_AUTH_SECRET_KEY,\n mcpAuthMode: env.MCP_AUTH_MODE,\n oauthIssuerUrl: env.OAUTH_ISSUER_URL,\n oauthJwksUri: env.OAUTH_JWKS_URI,\n oauthAudience: env.OAUTH_AUDIENCE,\n oauthJwksCooldownMs: env.OAUTH_JWKS_COOLDOWN_MS,\n oauthJwksTimeoutMs: env.OAUTH_JWKS_TIMEOUT_MS,\n mcpServerResourceIdentifier: env.MCP_SERVER_RESOURCE_IDENTIFIER,\n devMcpClientId: env.DEV_MCP_CLIENT_ID,\n devMcpScopes: env.DEV_MCP_SCOPES?.split(',').map((s) => s.trim()),\n openrouterAppUrl: env.OPENROUTER_APP_URL,\n openrouterAppName: env.OPENROUTER_APP_NAME,\n openrouterApiKey: env.OPENROUTER_API_KEY,\n llmDefaultModel: env.LLM_DEFAULT_MODEL,\n llmDefaultTemperature: env.LLM_DEFAULT_TEMPERATURE,\n llmDefaultTopP: env.LLM_DEFAULT_TOP_P,\n llmDefaultMaxTokens: env.LLM_DEFAULT_MAX_TOKENS,\n llmDefaultTopK: env.LLM_DEFAULT_TOP_K,\n llmDefaultMinP: env.LLM_DEFAULT_MIN_P,\n oauthProxy:\n env.OAUTH_PROXY_AUTHORIZATION_URL || env.OAUTH_PROXY_TOKEN_URL\n ? {\n authorizationUrl: env.OAUTH_PROXY_AUTHORIZATION_URL,\n tokenUrl: env.OAUTH_PROXY_TOKEN_URL,\n revocationUrl: env.OAUTH_PROXY_REVOCATION_URL,\n issuerUrl: env.OAUTH_PROXY_ISSUER_URL,\n serviceDocumentationUrl: env.OAUTH_PROXY_SERVICE_DOCUMENTATION_URL,\n defaultClientRedirectUris:\n env.OAUTH_PROXY_DEFAULT_CLIENT_REDIRECT_URIS?.split(',')\n .map((uri) => uri.trim())\n .filter(Boolean),\n }\n : undefined,\n supabase:\n env.SUPABASE_URL && env.SUPABASE_ANON_KEY\n ? {\n url: env.SUPABASE_URL,\n anonKey: env.SUPABASE_ANON_KEY,\n serviceRoleKey: env.SUPABASE_SERVICE_ROLE_KEY,\n }\n : undefined,\n surrealdb:\n env.SURREALDB_URL && env.SURREALDB_NAMESPACE && env.SURREALDB_DATABASE\n ? {\n url: env.SURREALDB_URL,\n namespace: env.SURREALDB_NAMESPACE,\n database: env.SURREALDB_DATABASE,\n username: env.SURREALDB_USERNAME,\n password: env.SURREALDB_PASSWORD,\n tableName: env.SURREALDB_TABLE_NAME,\n }\n : undefined,\n storage: {\n providerType: env.STORAGE_PROVIDER_TYPE,\n filesystemPath: env.STORAGE_FILESYSTEM_PATH,\n },\n tasks: {\n storeType: env.TASK_STORE_TYPE,\n tenantId: env.TASK_STORE_TENANT_ID,\n defaultTtlMs: env.TASK_STORE_DEFAULT_TTL_MS,\n },\n openTelemetry: {\n enabled: env.OTEL_ENABLED,\n serviceName: env.OTEL_SERVICE_NAME,\n serviceVersion: env.OTEL_SERVICE_VERSION,\n tracesEndpoint: env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,\n metricsEndpoint: env.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT,\n samplingRatio: env.OTEL_TRACES_SAMPLER_ARG,\n logLevel: env.OTEL_LOG_LEVEL,\n },\n speech:\n env.SPEECH_TTS_ENABLED || env.SPEECH_STT_ENABLED\n ? {\n tts: env.SPEECH_TTS_ENABLED\n ? {\n enabled: env.SPEECH_TTS_ENABLED,\n provider: env.SPEECH_TTS_PROVIDER,\n apiKey: env.SPEECH_TTS_API_KEY,\n baseUrl: env.SPEECH_TTS_BASE_URL,\n defaultVoiceId: env.SPEECH_TTS_DEFAULT_VOICE_ID,\n defaultModelId: env.SPEECH_TTS_DEFAULT_MODEL_ID,\n timeout: env.SPEECH_TTS_TIMEOUT,\n }\n : undefined,\n stt: env.SPEECH_STT_ENABLED\n ? {\n enabled: env.SPEECH_STT_ENABLED,\n provider: env.SPEECH_STT_PROVIDER,\n apiKey: env.SPEECH_STT_API_KEY,\n baseUrl: env.SPEECH_STT_BASE_URL,\n defaultModelId: env.SPEECH_STT_DEFAULT_MODEL_ID,\n timeout: env.SPEECH_STT_TIMEOUT,\n }\n : undefined,\n }\n : undefined,\n // 飞书配置\n feishu:\n env.FEISHU_DEFAULT_APP_ID || env.FEISHU_OAUTH_CALLBACK_URL\n ? {\n defaultAppId: env.FEISHU_DEFAULT_APP_ID,\n defaultAppSecret: env.FEISHU_DEFAULT_APP_SECRET,\n oauthCallbackUrl: env.FEISHU_OAUTH_CALLBACK_URL,\n apiBaseUrl: env.FEISHU_API_BASE_URL,\n rateLimitEnabled: env.FEISHU_RATE_LIMIT_ENABLED,\n maxRetries: env.FEISHU_MAX_RETRIES,\n retryDelayMs: env.FEISHU_RETRY_DELAY_MS,\n requestTimeoutMs: env.FEISHU_REQUEST_TIMEOUT_MS,\n }\n : undefined,\n // The following fields will be derived and are not directly from env\n mcpServerName: env.MCP_SERVER_NAME,\n mcpServerVersion: env.MCP_SERVER_VERSION,\n mcpServerDescription: env.MCP_SERVER_DESCRIPTION,\n };\n\n // Use a temporary schema to parse package info and provide defaults\n const pkgSchema = z.object({\n name: z.string(),\n version: z.string(),\n description: z.string().optional(),\n });\n const parsedPkg = pkgSchema.parse(rawConfig.pkg);\n\n // Now add the derived values to the main rawConfig object to be parsed\n const finalRawConfig = {\n ...rawConfig,\n pkg: parsedPkg,\n logsPath: rawConfig.logsPath ?? (hasFileSystemAccess ? 'logs' : undefined),\n mcpServerName: env.MCP_SERVER_NAME ?? parsedPkg.name,\n mcpServerVersion: env.MCP_SERVER_VERSION ?? parsedPkg.version,\n mcpServerDescription: env.MCP_SERVER_DESCRIPTION ?? parsedPkg.description,\n openTelemetry: {\n ...rawConfig.openTelemetry,\n serviceName: env.OTEL_SERVICE_NAME ?? parsedPkg.name,\n serviceVersion: env.OTEL_SERVICE_VERSION ?? parsedPkg.version,\n },\n openrouterAppName: env.OPENROUTER_APP_NAME ?? parsedPkg.name,\n };\n\n const parsedConfig = ConfigSchema.safeParse(finalRawConfig);\n\n if (!parsedConfig.success) {\n // Keep existing TTY error logging for developer convenience.\n if (process.stdout.isTTY) {\n console.error(\n '❌ Invalid configuration found. Please check your environment variables.',\n parsedConfig.error.flatten().fieldErrors,\n );\n }\n // Throw a specific, typed error instead of exiting.\n throw new McpError(\n JsonRpcErrorCode.ConfigurationError,\n 'Invalid application configuration.',\n {\n validationErrors: parsedConfig.error.flatten().fieldErrors,\n },\n );\n }\n\n return parsedConfig.data;\n};\n\nconst config = parseConfig();\n\n/**\n * Export the runtime configuration, parser, and schema, plus a static AppConfig type.\n */\nexport type AppConfig = z.infer<typeof ConfigSchema>;\n\nexport { config, ConfigSchema, parseConfig };\n","/**\n * @fileoverview Runtime capability detection for multi-environment support.\n * Detects presence of Node features, Web/Workers APIs, and common globals.\n * @module src/utils/internal/runtime\n */\n\nexport interface RuntimeCapabilities {\n isNode: boolean;\n isWorkerLike: boolean;\n isBrowserLike: boolean;\n hasProcess: boolean;\n hasBuffer: boolean;\n hasTextEncoder: boolean;\n hasPerformanceNow: boolean;\n}\n\n// Best-effort static detection without throwing in restricted envs\nconst safeHas = (key: string): boolean => {\n try {\n // @ts-expect-error index access on globalThis\n return typeof globalThis[key] !== 'undefined';\n } catch {\n return false;\n }\n};\n\n/**\n * Safely checks if process.versions.node exists and is a string.\n * Uses try-catch to handle environments where property access might be restricted.\n */\nconst hasNodeVersion = (): boolean => {\n try {\n return (\n typeof process !== 'undefined' &&\n typeof process.versions === 'object' &&\n process.versions !== null &&\n typeof process.versions.node === 'string'\n );\n } catch {\n return false;\n }\n};\n\n/**\n * Safely checks if globalThis.performance.now is a function.\n * Uses try-catch to handle environments where property access might be restricted.\n */\nconst hasPerformanceNowFunction = (): boolean => {\n try {\n const perf = (globalThis as unknown as { performance?: Performance })\n .performance;\n return (\n typeof perf === 'object' &&\n perf !== null &&\n typeof perf.now === 'function'\n );\n } catch {\n return false;\n }\n};\n\nconst isNode = hasNodeVersion();\nconst hasProcess = typeof process !== 'undefined';\nconst hasBuffer = typeof Buffer !== 'undefined';\nconst hasTextEncoder = safeHas('TextEncoder');\nconst hasPerformanceNow = hasPerformanceNowFunction();\n\n/**\n * Safely checks if WorkerGlobalScope exists.\n * Cloudflare Workers and other worker environments expose this.\n */\nconst hasWorkerGlobalScope = (): boolean => {\n try {\n return 'WorkerGlobalScope' in globalThis;\n } catch {\n return false;\n }\n};\n\n// Cloudflare Workers expose \"Web Worker\"-like environment (self, caches, fetch, etc.)\nconst isWorkerLike = !isNode && hasWorkerGlobalScope();\nconst isBrowserLike = !isNode && !isWorkerLike && safeHas('window');\n\nexport const runtimeCaps: RuntimeCapabilities = {\n isNode,\n isWorkerLike,\n isBrowserLike,\n hasProcess,\n hasBuffer,\n hasTextEncoder,\n hasPerformanceNow,\n};\n","/**\n * @fileoverview OpenTelemetry SDK initialization and lifecycle management.\n * Provides runtime-aware initialization with graceful degradation for Worker/Edge environments.\n * Supports both Node.js (full NodeSDK) and serverless runtimes (lightweight telemetry).\n * @module src/utils/telemetry/instrumentation\n */\nimport { config } from '@/config/index.js';\nimport { DiagConsoleLogger, DiagLogLevel, diag } from '@opentelemetry/api';\nimport type { NodeSDK } from '@opentelemetry/sdk-node';\n\nimport { runtimeCaps } from '@/utils/internal/runtime.js';\n\n// Node-specific imports are lazy-loaded to avoid Worker crashes\n// SDK instance is exported for internal access if needed\nexport let sdk: NodeSDK | null = null;\n\n// Initialization state management\nlet isOtelInitialized = false;\nlet initializationPromise: Promise<void> | null = null;\n\n/**\n * Determines if the NodeSDK can be used in the current runtime.\n * Returns false in Worker/Edge environments where Node modules are unavailable.\n */\nfunction canUseNodeSDK(): boolean {\n return (\n runtimeCaps.isNode &&\n typeof process?.versions?.node === 'string' &&\n typeof process.env === 'object'\n );\n}\n\n/**\n * Detects cloud platform and provider for resource attributes.\n * Enriches telemetry with deployment environment metadata.\n *\n * @returns Record of cloud-related resource attributes\n */\nfunction detectCloudResource(): Record<string, string> {\n const attrs: Record<string, string> = {};\n\n // Cloudflare Workers\n if (runtimeCaps.isWorkerLike) {\n attrs['cloud.provider'] = 'cloudflare';\n attrs['cloud.platform'] = 'cloudflare_workers';\n }\n\n // AWS Lambda\n if (typeof process !== 'undefined' && process.env?.AWS_LAMBDA_FUNCTION_NAME) {\n attrs['cloud.provider'] = 'aws';\n attrs['cloud.platform'] = 'aws_lambda';\n if (process.env.AWS_REGION) {\n attrs['cloud.region'] = process.env.AWS_REGION;\n }\n }\n\n // GCP Cloud Functions/Cloud Run\n if (\n typeof process !== 'undefined' &&\n (process.env?.FUNCTION_TARGET || process.env?.K_SERVICE)\n ) {\n attrs['cloud.provider'] = 'gcp';\n attrs['cloud.platform'] = process.env.FUNCTION_TARGET\n ? 'gcp_cloud_functions'\n : 'gcp_cloud_run';\n if (process.env.GCP_REGION) {\n attrs['cloud.region'] = process.env.GCP_REGION;\n }\n }\n\n attrs['deployment.environment.name'] = config.environment;\n\n return attrs;\n}\n\n/**\n * Initializes OpenTelemetry SDK with runtime-appropriate configuration.\n * This function is idempotent and safe to call multiple times.\n * Completes successfully even if telemetry is disabled or runtime is incompatible.\n *\n * @returns Promise that resolves when initialization is complete\n *\n * @example\n * ```typescript\n * // In application entry point (src/index.ts)\n * await initializeOpenTelemetry();\n * ```\n */\nexport async function initializeOpenTelemetry(): Promise<void> {\n // Return existing promise if initialization in progress\n if (initializationPromise) {\n return initializationPromise;\n }\n\n // Already initialized\n if (isOtelInitialized) {\n return;\n }\n\n initializationPromise = (async () => {\n if (!config.openTelemetry.enabled) {\n diag.info('OpenTelemetry disabled via configuration.');\n isOtelInitialized = true;\n return;\n }\n\n if (!canUseNodeSDK()) {\n diag.info(\n 'NodeSDK unavailable in this runtime. Using lightweight telemetry mode.',\n );\n isOtelInitialized = true;\n return;\n }\n\n isOtelInitialized = true;\n\n try {\n // Lazy-load Node-specific modules\n const [\n { getNodeAutoInstrumentations },\n { OTLPMetricExporter },\n { OTLPTraceExporter },\n { PinoInstrumentation },\n { resourceFromAttributes },\n { PeriodicExportingMetricReader },\n { NodeSDK },\n { BatchSpanProcessor, TraceIdRatioBasedSampler },\n { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION },\n ] = await Promise.all([\n import('@opentelemetry/auto-instrumentations-node'),\n import('@opentelemetry/exporter-metrics-otlp-http'),\n import('@opentelemetry/exporter-trace-otlp-http'),\n import('@opentelemetry/instrumentation-pino'),\n import('@opentelemetry/resources'),\n import('@opentelemetry/sdk-metrics'),\n import('@opentelemetry/sdk-node'),\n import('@opentelemetry/sdk-trace-node'),\n import('@opentelemetry/semantic-conventions/incubating'),\n ]);\n\n const otelLogLevelString =\n config.openTelemetry.logLevel.toUpperCase() as keyof typeof DiagLogLevel;\n const otelLogLevel =\n DiagLogLevel[otelLogLevelString] ?? DiagLogLevel.INFO;\n diag.setLogger(new DiagConsoleLogger(), otelLogLevel);\n\n const tracesEndpoint = config.openTelemetry.tracesEndpoint;\n const metricsEndpoint = config.openTelemetry.metricsEndpoint;\n\n if (!tracesEndpoint && !metricsEndpoint) {\n diag.warn(\n 'OTEL_ENABLED is true, but no OTLP endpoint for traces or metrics is configured. OpenTelemetry will not export any telemetry.',\n );\n }\n\n const resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: config.openTelemetry.serviceName,\n [ATTR_SERVICE_VERSION]: config.openTelemetry.serviceVersion,\n ...detectCloudResource(),\n });\n\n const spanProcessors: InstanceType<typeof BatchSpanProcessor>[] = [];\n if (tracesEndpoint) {\n diag.info(\n `Using OTLP exporter for traces, endpoint: ${tracesEndpoint}`,\n );\n const traceExporter = new OTLPTraceExporter({ url: tracesEndpoint });\n spanProcessors.push(new BatchSpanProcessor(traceExporter));\n } else {\n diag.info(\n 'No OTLP traces endpoint configured. Traces will not be exported.',\n );\n }\n\n const metricReader = metricsEndpoint\n ? new PeriodicExportingMetricReader({\n exporter: new OTLPMetricExporter({ url: metricsEndpoint }),\n exportIntervalMillis: 15000,\n })\n : undefined;\n\n sdk = new NodeSDK({\n resource,\n spanProcessors,\n ...(metricReader && { metricReader }),\n sampler: new TraceIdRatioBasedSampler(\n config.openTelemetry.samplingRatio,\n ),\n instrumentations: [\n getNodeAutoInstrumentations({\n '@opentelemetry/instrumentation-http': {\n enabled: true,\n ignoreIncomingRequestHook: (req) => req.url === '/healthz',\n },\n '@opentelemetry/instrumentation-fs': { enabled: false },\n }),\n new PinoInstrumentation({\n logHook: (_span, record) => {\n record['trace_id'] = _span.spanContext().traceId;\n record['span_id'] = _span.spanContext().spanId;\n },\n }),\n ],\n });\n\n sdk.start();\n diag.info(\n `OpenTelemetry NodeSDK initialized for ${config.openTelemetry.serviceName} v${config.openTelemetry.serviceVersion}`,\n );\n } catch (error) {\n diag.error('Error initializing OpenTelemetry', error);\n sdk = null;\n throw error;\n }\n })();\n\n return initializationPromise;\n}\n\n/**\n * Gracefully shuts down the OpenTelemetry SDK with timeout protection.\n * This function is called during the application's shutdown sequence.\n * Prevents hung processes by racing shutdown against a timeout.\n *\n * @param timeoutMs - Maximum time to wait for shutdown in milliseconds (default: 5000)\n * @throws Error if shutdown times out or fails critically\n *\n * @example\n * ```typescript\n * // During application shutdown\n * try {\n * await shutdownOpenTelemetry();\n * } catch (error) {\n * console.error('Failed to shutdown telemetry:', error);\n * }\n * ```\n */\nexport async function shutdownOpenTelemetry(timeoutMs = 5000): Promise<void> {\n if (!sdk) {\n return;\n }\n\n try {\n const shutdownPromise = sdk.shutdown();\n const timeoutPromise = new Promise<never>((_, reject) =>\n setTimeout(\n () => reject(new Error('OpenTelemetry SDK shutdown timeout')),\n timeoutMs,\n ),\n );\n\n await Promise.race([shutdownPromise, timeoutPromise]);\n diag.info('OpenTelemetry SDK terminated successfully.');\n } catch (error) {\n diag.error('Error terminating OpenTelemetry SDK', error);\n throw error; // Propagate for caller handling\n } finally {\n sdk = null;\n isOtelInitialized = false;\n initializationPromise = null;\n }\n}\n","/**\n * @fileoverview Defines the AsyncLocalStorage context for authentication information.\n * This module provides a mechanism to store and retrieve authentication details\n * (like scopes and client ID) across asynchronous operations, making it available\n * from the middleware layer down to the tool and resource handlers without\n * drilling props.\n *\n * @module src/mcp-server/transports/auth/core/authContext\n */\nimport { AsyncLocalStorage } from 'async_hooks';\n\nimport type { AuthInfo } from './authTypes.js';\n\n/**\n * Defines the structure of the store used within the AsyncLocalStorage.\n * It holds the authentication information for the current request context.\n */\ninterface AuthStore {\n authInfo: AuthInfo;\n}\n\n/**\n * An instance of AsyncLocalStorage to hold the authentication context (`AuthStore`).\n * This allows `authInfo` to be accessible throughout the async call chain of a request\n * after being set in the authentication middleware.\n *\n * @example\n * // In middleware:\n * await authContext.run({ authInfo }, next);\n *\n * // In a deeper handler:\n * const store = authContext.getStore();\n * const scopes = store?.authInfo.scopes;\n */\nexport const authContext = new AsyncLocalStorage<AuthStore>();\n","/**\n * @fileoverview Utilities for creating and managing request contexts.\n * A request context is an object carrying a unique ID, timestamp, and other\n * relevant data for logging, tracing, and processing. It supports context\n * propagation for distributed tracing.\n * @module src/utils/internal/requestContext\n */\nimport { trace } from '@opentelemetry/api';\n\nimport { authContext as alsAuthContext } from '@/mcp-server/transports/auth/lib/authContext.js';\nimport type { AuthInfo } from '@/mcp-server/transports/auth/lib/authTypes.js';\nimport { generateRequestContextId } from '@/utils/index.js';\nimport { logger } from '@/utils/internal/logger.js';\n\n/**\n * Defines the structure of the authentication-related context, typically\n * decoded from a JWT.\n *\n * This interface represents the processed authentication data that gets\n * attached to a RequestContext after token verification.\n */\nexport interface AuthContext {\n /** The subject (user) identifier. */\n sub: string;\n /** An array of granted permissions (scopes). */\n scopes: string[];\n /** The client identifier from the token (cid or client_id claim). */\n clientId: string;\n /** The original JWT/OAuth token string. */\n token: string;\n /** Optional tenant identifier for multi-tenancy support. */\n tenantId?: string;\n /** Other properties from the token payload. */\n [key: string]: unknown;\n}\n\n/**\n * Defines the core structure for context information associated with a request or operation.\n * This is fundamental for logging, tracing, and passing operational data.\n */\nexport interface RequestContext {\n /**\n * Unique ID for the context instance.\n * Used for log correlation and request tracing.\n */\n requestId: string;\n\n /**\n * ISO 8601 timestamp indicating when the context was created.\n */\n timestamp: string;\n\n /**\n * The unique identifier for the tenant making the request.\n * This is essential for multi-tenancy and data isolation.\n */\n tenantId?: string;\n\n /**\n * Optional authentication context, present if the request was authenticated.\n */\n auth?: AuthContext;\n\n /**\n * Allows arbitrary key-value pairs for specific context needs.\n * Using `unknown` promotes type-safe access.\n * Consumers must type-check/assert when accessing extended properties.\n */\n [key: string]: unknown;\n}\n\n/**\n * Configuration for the {@link requestContextService}.\n * Allows for future extensibility of service-wide settings.\n */\nexport interface ContextConfig {\n /** Custom configuration properties. Allows for arbitrary key-value pairs. */\n [key: string]: unknown;\n}\n\n/**\n * Represents a broader context for a specific operation or task.\n * It can optionally include a base {@link RequestContext} and other custom properties\n * relevant to the operation.\n */\nexport interface OperationContext {\n /** Optional base request context data, adhering to the `RequestContext` structure. */\n requestContext?: RequestContext;\n\n /** Allows for additional, custom properties specific to the operation. */\n [key: string]: unknown;\n}\n\n/**\n * Parameters for creating a new request context.\n */\nexport interface CreateRequestContextParams {\n /**\n * An optional parent context to inherit properties from, such as `requestId`.\n * This is key for propagating context in distributed systems.\n */\n parentContext?: Record<string, unknown> | RequestContext;\n\n /**\n * An optional record of key-value pairs to be merged into the new context.\n * These will override any properties inherited from the parent context.\n */\n additionalContext?: Record<string, unknown>;\n\n /**\n * A descriptive name for the operation creating this context.\n * Useful for debugging and tracing.\n */\n operation?: string;\n}\n\n/**\n * Singleton-like service object for managing request context operations.\n * @private\n */\nconst requestContextServiceInstance = {\n /**\n * Internal configuration store for the service.\n */\n config: {} as ContextConfig,\n\n /**\n * Configures the request context service with new settings.\n * Merges the provided partial configuration with existing settings.\n *\n * @param config - A partial `ContextConfig` object containing settings to update or add.\n * @returns A shallow copy of the newly updated configuration.\n */\n configure(config: Partial<ContextConfig>): ContextConfig {\n this.config = {\n ...this.config,\n ...config,\n };\n const logContext = this.createRequestContext({\n operation: 'RequestContextService.configure',\n additionalContext: { newConfigState: { ...this.config } },\n });\n logger.debug('RequestContextService configuration updated', logContext);\n return { ...this.config };\n },\n\n /**\n * Retrieves a shallow copy of the current service configuration.\n * This prevents direct mutation of the internal configuration state.\n *\n * @returns A shallow copy of the current `ContextConfig`.\n */\n getConfig(): ContextConfig {\n return { ...this.config };\n },\n\n /**\n * Creates a new {@link RequestContext} instance, supporting context propagation.\n * This function robustly handles two calling patterns:\n * 1. Passing a `CreateRequestContextParams` object: `createRequestContext({ parentContext: ..., additionalContext: ... })`\n * 2. Passing a plain object to be used as the context: `createRequestContext({ userId: '123', operation: '...' })`\n *\n * OpenTelemetry trace and span IDs are automatically injected if an active span exists.\n *\n * @param params - Parameters for creating the context.\n * @returns A new `RequestContext` object.\n */\n createRequestContext(\n params: CreateRequestContextParams | Record<string, unknown> = {},\n ): RequestContext {\n // Destructure known CreateRequestContextParams keys and capture the rest.\n // The 'rest' object will contain all properties that are NOT the special keys,\n // effectively capturing the direct context object when passed.\n const { parentContext, additionalContext, operation, ...rest } =\n params as CreateRequestContextParams;\n\n const inheritedContext =\n parentContext && typeof parentContext === 'object'\n ? { ...parentContext }\n : {};\n\n let inheritedTenantId: string | undefined;\n if (\n inheritedContext &&\n typeof inheritedContext === 'object' &&\n 'tenantId' in inheritedContext &&\n typeof (inheritedContext as { tenantId?: unknown }).tenantId === 'string'\n ) {\n inheritedTenantId = (inheritedContext as { tenantId: string }).tenantId;\n }\n\n const authStore = alsAuthContext.getStore();\n const tenantIdFromAuth = authStore?.authInfo?.tenantId;\n\n const requestId =\n typeof inheritedContext.requestId === 'string' &&\n inheritedContext.requestId\n ? inheritedContext.requestId\n : generateRequestContextId();\n const timestamp = new Date().toISOString();\n\n const restTenantId =\n typeof (rest as { tenantId?: unknown }).tenantId === 'string'\n ? (rest as { tenantId: string }).tenantId\n : undefined;\n\n const additionalTenantId =\n additionalContext &&\n typeof additionalContext === 'object' &&\n typeof (additionalContext as { tenantId?: unknown }).tenantId === 'string'\n ? (additionalContext as { tenantId: string }).tenantId\n : undefined;\n\n const resolvedTenantId =\n additionalTenantId ??\n restTenantId ??\n inheritedTenantId ??\n tenantIdFromAuth;\n\n const context: RequestContext = {\n ...inheritedContext,\n ...rest, // Spread any other properties from the params object\n requestId,\n timestamp,\n ...(resolvedTenantId ? { tenantId: resolvedTenantId } : {}),\n ...(additionalContext && typeof additionalContext === 'object'\n ? additionalContext\n : {}),\n ...(operation && typeof operation === 'string' ? { operation } : {}),\n };\n\n // --- OpenTelemetry Integration ---\n const activeSpan = trace.getActiveSpan();\n if (activeSpan && typeof activeSpan.spanContext === 'function') {\n const spanContext = activeSpan.spanContext();\n if (spanContext) {\n context.traceId = spanContext.traceId;\n context.spanId = spanContext.spanId;\n }\n }\n // --- End OpenTelemetry Integration ---\n\n return context;\n },\n\n /**\n * Creates a new {@link RequestContext} enriched with authentication information.\n * This method populates the context with auth data from a validated token,\n * including tenant ID, client ID, scopes, and subject.\n *\n * The auth info is also propagated to the async-local storage context for\n * downstream access via `authContext.getStore()`.\n *\n * @param authInfo - The validated authentication information from JWT/OAuth token.\n * @param parentContext - Optional parent context to inherit properties from.\n * @returns A new `RequestContext` object with auth information populated.\n *\n * @example\n * ```typescript\n * const authInfo = await jwtStrategy.verify(token);\n * const context = requestContextService.withAuthInfo(authInfo);\n * // context now includes: { requestId, timestamp, tenantId, auth: {...}, ... }\n * ```\n */\n withAuthInfo(\n authInfo: AuthInfo,\n parentContext?: Record<string, unknown> | RequestContext,\n ): RequestContext {\n const baseContext = this.createRequestContext({\n operation: 'withAuthInfo',\n parentContext,\n additionalContext: {\n tenantId: authInfo.tenantId,\n },\n });\n\n // Populate auth property with structured authentication context\n const authContext: AuthContext = {\n sub: authInfo.subject ?? authInfo.clientId,\n scopes: authInfo.scopes,\n clientId: authInfo.clientId,\n token: authInfo.token,\n ...(authInfo.tenantId ? { tenantId: authInfo.tenantId } : {}),\n };\n\n return {\n ...baseContext,\n auth: authContext,\n };\n },\n};\n\n/**\n * Primary export for request context functionalities.\n * This service provides methods to create and manage {@link RequestContext} instances,\n * which are essential for logging, tracing, and correlating operations.\n */\nexport const requestContextService = requestContextServiceInstance;\n","/**\n * @fileoverview Type guard utilities for safe runtime type narrowing.\n * @module utils/types/guards\n *\n * Provides reusable type guards to replace unsafe type assertions throughout the codebase.\n * All guards perform proper runtime validation and narrow TypeScript types safely.\n */\n\n/**\n * Type guard to check if a value is a non-null object.\n *\n * @param value - Value to check\n * @returns True if value is an object (excluding null and arrays)\n *\n * @example\n * ```typescript\n * if (isObject(someValue)) {\n * // someValue is now typed as object\n * console.log(someValue.toString());\n * }\n * ```\n */\nexport function isObject(value: unknown): value is object {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Type guard to check if a value is a record (object with string keys).\n *\n * @param value - Value to check\n * @returns True if value is a Record<string, unknown>\n *\n * @example\n * ```typescript\n * if (isRecord(data)) {\n * // data is now typed as Record<string, unknown>\n * const keys = Object.keys(data);\n * }\n * ```\n */\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return isObject(value);\n}\n\n/**\n * Type guard to check if an object has a specific property.\n *\n * @param obj - Object to check\n * @param key - Property key to look for\n * @returns True if object has the specified property\n *\n * @example\n * ```typescript\n * if (hasProperty(error, 'message')) {\n * // TypeScript now knows error has a 'message' property\n * console.log(error.message);\n * }\n * ```\n */\nexport function hasProperty<K extends PropertyKey>(\n obj: unknown,\n key: K,\n): obj is Record<K, unknown> {\n return isObject(obj) && key in obj;\n}\n\n/**\n * Type guard to check if an object has a property of a specific type.\n *\n * @param obj - Object to check\n * @param key - Property key to look for\n * @param typeGuard - Type guard function for the property value\n * @returns True if object has the property and it matches the type\n *\n * @example\n * ```typescript\n * if (hasPropertyOfType(obj, 'count', (v): v is number => typeof v === 'number')) {\n * // obj.count is now typed as number\n * console.log(obj.count + 1);\n * }\n * ```\n */\nexport function hasPropertyOfType<K extends PropertyKey, T>(\n obj: unknown,\n key: K,\n typeGuard: (value: unknown) => value is T,\n): obj is Record<K, T> {\n return hasProperty(obj, key) && typeGuard(obj[key]);\n}\n\n/**\n * Type guard to check if a value is a string.\n *\n * @param value - Value to check\n * @returns True if value is a string\n */\nexport function isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n\n/**\n * Type guard to check if a value is a number.\n *\n * @param value - Value to check\n * @returns True if value is a number (excluding NaN)\n */\nexport function isNumber(value: unknown): value is number {\n return typeof value === 'number' && !Number.isNaN(value);\n}\n\n/**\n * Type guard to check if an error is an AggregateError.\n *\n * AggregateError contains multiple errors in an 'errors' array property.\n * This guard safely checks for the errors property without unsafe type assertions.\n *\n * @param error - Error to check\n * @returns True if error is an AggregateError with errors array\n *\n * @example\n * ```typescript\n * if (isAggregateError(error)) {\n * // error.errors is now safely typed as unknown[]\n * error.errors.forEach(innerError => console.log(innerError));\n * }\n * ```\n */\nexport function isAggregateError(\n error: unknown,\n): error is Error & { errors: unknown[] } {\n return (\n error instanceof Error &&\n hasProperty(error, 'errors') &&\n Array.isArray(error.errors)\n );\n}\n\n/**\n * Type guard to check if an error has a code property.\n *\n * @param error - Error to check\n * @returns True if error has a code property\n *\n * @example\n * ```typescript\n * if (isErrorWithCode(error)) {\n * console.log(`Error code: ${error.code}`);\n * }\n * ```\n */\nexport function isErrorWithCode(\n error: unknown,\n): error is Error & { code: unknown } {\n return error instanceof Error && hasProperty(error, 'code');\n}\n\n/**\n * Type guard to check if an error has a status property.\n *\n * @param error - Error to check\n * @returns True if error has a status property\n *\n * @example\n * ```typescript\n * if (isErrorWithStatus(error)) {\n * console.log(`HTTP status: ${error.status}`);\n * }\n * ```\n */\nexport function isErrorWithStatus(\n error: unknown,\n): error is Error & { status: unknown } {\n return error instanceof Error && hasProperty(error, 'status');\n}\n\n/**\n * Safely get a property from an object if it exists.\n *\n * @param obj - Object to get property from\n * @param key - Property key\n * @returns Property value or undefined if property doesn't exist\n *\n * @example\n * ```typescript\n * const message = getProperty(error, 'message');\n * // message is typed as unknown\n * ```\n */\nexport function getProperty<K extends PropertyKey>(\n obj: unknown,\n key: K,\n): unknown {\n return hasProperty(obj, key) ? obj[key] : undefined;\n}\n\n/**\n * Safely get a string property from an object.\n *\n * @param obj - Object to get property from\n * @param key - Property key\n * @returns String value or undefined if property doesn't exist or is not a string\n *\n * @example\n * ```typescript\n * const traceId = getStringProperty(context, 'traceId');\n * if (traceId) {\n * // traceId is typed as string\n * console.log(traceId.toUpperCase());\n * }\n * ```\n */\nexport function getStringProperty<K extends PropertyKey>(\n obj: unknown,\n key: K,\n): string | undefined {\n const value = getProperty(obj, key);\n return isString(value) ? value : undefined;\n}\n\n/**\n * Safely get a number property from an object.\n *\n * @param obj - Object to get property from\n * @param key - Property key\n * @returns Number value or undefined if property doesn't exist or is not a number\n */\nexport function getNumberProperty<K extends PropertyKey>(\n obj: unknown,\n key: K,\n): number | undefined {\n const value = getProperty(obj, key);\n return isNumber(value) ? value : undefined;\n}\n","/**\n * @fileoverview Provides a comprehensive `Sanitization` class for various input cleaning and validation tasks.\n * This module includes utilities for sanitizing HTML, strings, URLs, file paths, JSON, numbers,\n * and for redacting sensitive information from data intended for logging.\n * The path sanitization utilities are only available in a Node.js environment.\n * @module src/utils/security/sanitization\n */\nimport sanitizeHtml from 'sanitize-html';\nimport validator from 'validator';\n\nimport { JsonRpcErrorCode, McpError } from '@/types-global/errors.js';\nimport { isRecord } from '@/utils/types/guards.js';\nimport { logger, requestContextService } from '@/utils/index.js';\n\nconst isServerless =\n typeof process === 'undefined' || process.env.IS_SERVERLESS === 'true';\n\n// Dynamically import 'path' only in non-serverless environments\nlet pathModule: typeof import('path') | undefined;\nif (!isServerless) {\n import('path')\n .then((mod) => {\n pathModule = mod.default;\n })\n .catch(() => {\n // This might happen in some bundlers, but we have the guard.\n });\n}\n\n/**\n * Defines options for path sanitization to control how file paths are processed and validated.\n */\nexport interface PathSanitizeOptions {\n /** If provided, restricts sanitized paths to be relative to this directory. */\n rootDir?: string;\n /** If true, normalizes Windows backslashes to POSIX forward slashes. */\n toPosix?: boolean;\n /** If true, absolute paths are permitted (subject to `rootDir`). Default: false. */\n allowAbsolute?: boolean;\n}\n\n/**\n * Contains information about a path sanitization operation.\n */\nexport interface SanitizedPathInfo {\n /** The final sanitized and normalized path string. */\n sanitizedPath: string;\n /** The original path string before any processing. */\n originalInput: string;\n /** True if the input path was absolute after initial normalization. */\n wasAbsolute: boolean;\n /** True if an absolute path was converted to relative due to `allowAbsolute: false`. */\n convertedToRelative: boolean;\n /** The effective options used for sanitization, including defaults. */\n optionsUsed: PathSanitizeOptions;\n}\n\n/**\n * Defines options for context-specific string sanitization.\n */\nexport interface SanitizeStringOptions {\n /** The context in which the string will be used. 'javascript' is disallowed. */\n context?: 'text' | 'html' | 'attribute' | 'url' | 'javascript';\n /** Custom allowed HTML tags if `context` is 'html'. */\n allowedTags?: string[];\n /** Custom allowed HTML attributes if `context` is 'html'. */\n allowedAttributes?: Record<string, string[]>;\n}\n\n/**\n * Configuration options for HTML sanitization, mirroring `sanitize-html` library options.\n */\nexport interface HtmlSanitizeConfig {\n /** An array of allowed HTML tag names. */\n allowedTags?: string[];\n /** Specifies allowed attributes, either globally or per tag. */\n allowedAttributes?: sanitizeHtml.IOptions['allowedAttributes'];\n /** If true, HTML comments are preserved. */\n preserveComments?: boolean;\n /** Custom functions to transform tags during sanitization. */\n transformTags?: sanitizeHtml.IOptions['transformTags'];\n}\n\n/**\n * A singleton class providing various methods for input sanitization.\n * Aims to protect against common vulnerabilities like XSS and path traversal.\n */\nexport class Sanitization {\n /** @private */\n private static instance: Sanitization;\n\n /**\n * Default list of field names considered sensitive for log redaction.\n * Case-insensitive matching is applied.\n * @private\n */\n private sensitiveFields: string[] = [\n 'password',\n 'token',\n 'secret',\n 'apiKey',\n 'credential',\n 'jwt',\n 'ssn',\n 'cvv',\n 'authorization',\n 'cookie',\n 'clientsecret',\n 'client_secret',\n 'private_key',\n 'privatekey',\n ];\n\n /**\n * Default configuration for HTML sanitization.\n * @private\n */\n private defaultHtmlSanitizeConfig: HtmlSanitizeConfig = {\n allowedTags: [\n // === Structure & Sectioning ===\n 'div',\n 'span',\n 'p',\n 'br',\n 'hr',\n 'header',\n 'footer',\n 'nav',\n 'article',\n 'section',\n 'aside',\n // === Headings & Text Content ===\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'strong',\n 'em',\n 'b',\n 'i',\n 'strike',\n 'blockquote',\n // === Code ===\n 'code',\n 'pre',\n // === Lists ===\n 'ul',\n 'ol',\n 'li',\n // === Tables ===\n 'table',\n 'thead',\n 'tbody',\n 'tr',\n 'th',\n 'td',\n // === Media & Links ===\n 'a',\n 'img',\n 'figure',\n 'figcaption',\n ],\n allowedAttributes: {\n a: ['href', 'name', 'target', 'rel', 'title'],\n img: ['src', 'alt', 'title', 'width', 'height', 'loading'],\n // Allow data attributes, class, id, and style on all tags\n '*': ['class', 'id', 'style', 'data-*'],\n // Table-specific attributes\n th: ['scope'],\n td: ['colspan', 'rowspan'],\n },\n preserveComments: true,\n };\n\n /** @private */\n private constructor() {}\n\n /**\n * Retrieves the singleton instance of the `Sanitization` class.\n * @returns The singleton `Sanitization` instance.\n */\n public static getInstance(): Sanitization {\n if (!Sanitization.instance) {\n Sanitization.instance = new Sanitization();\n }\n return Sanitization.instance;\n }\n\n /**\n * Sets or extends the list of sensitive field names for log sanitization.\n * @param fields - An array of field names to add to the sensitive list.\n */\n public setSensitiveFields(fields: string[]): void {\n this.sensitiveFields = [\n ...new Set([\n ...this.sensitiveFields,\n ...fields.map((f) => f.toLowerCase()),\n ]),\n ];\n const logContext = requestContextService.createRequestContext({\n operation: 'Sanitization.setSensitiveFields',\n additionalContext: {\n newSensitiveFieldCount: this.sensitiveFields.length,\n },\n });\n logger.debug(\n 'Updated sensitive fields list for log sanitization',\n logContext,\n );\n }\n\n /**\n * Gets a copy of the current list of sensitive field names.\n * @returns An array of sensitive field names.\n */\n public getSensitiveFields(): string[] {\n return [...this.sensitiveFields];\n }\n\n /**\n * Gets a pino-compliant copy of the current list of sensitive field names.\n * @returns A pino-compliant array of sensitive field names.\n */\n public getSensitivePinoFields(): string[] {\n return this.sensitiveFields.map((field) => field.replace(/[-_]/g, ''));\n }\n\n /**\n * Sanitizes an HTML string by removing potentially malicious tags and attributes.\n * @param input - The HTML string to sanitize.\n * @param config - Optional custom configuration for `sanitize-html`.\n * @returns The sanitized HTML string. Returns an empty string if input is falsy.\n */\n public sanitizeHtml(input: string, config?: HtmlSanitizeConfig): string {\n if (!input) return '';\n const effectiveConfig = {\n allowedTags:\n config?.allowedTags ?? this.defaultHtmlSanitizeConfig.allowedTags,\n allowedAttributes:\n config?.allowedAttributes ??\n this.defaultHtmlSanitizeConfig.allowedAttributes,\n transformTags: config?.transformTags, // Can be undefined\n preserveComments:\n config?.preserveComments ??\n this.defaultHtmlSanitizeConfig.preserveComments,\n };\n\n const options: sanitizeHtml.IOptions = {\n allowedTags: effectiveConfig.allowedTags,\n allowedAttributes: effectiveConfig.allowedAttributes,\n transformTags: effectiveConfig.transformTags,\n };\n\n if (effectiveConfig.preserveComments) {\n // Ensure allowedTags is an array before spreading\n const baseTags = Array.isArray(options.allowedTags)\n ? options.allowedTags\n : [];\n options.allowedTags = [...baseTags, '!--'];\n }\n return sanitizeHtml(input, options);\n }\n\n /**\n * Sanitizes a string based on its intended context (e.g., HTML, URL, text).\n * **Important:** `context: 'javascript'` is disallowed due to security risks.\n *\n * @param input - The string to sanitize.\n * @param options - Options specifying the sanitization context.\n * @returns The sanitized string. Returns an empty string if input is falsy.\n * @throws {McpError} If `options.context` is 'javascript', or URL validation fails.\n */\n public sanitizeString(\n input: string,\n options: SanitizeStringOptions = {},\n ): string {\n if (!input) return '';\n\n const context = options.context ?? 'text';\n\n switch (context) {\n case 'html': {\n const config: HtmlSanitizeConfig = {};\n if (options.allowedTags) {\n config.allowedTags = options.allowedTags;\n }\n if (options.allowedAttributes) {\n config.allowedAttributes = this.convertAttributesFormat(\n options.allowedAttributes,\n );\n }\n return this.sanitizeHtml(input, config);\n }\n case 'attribute':\n return sanitizeHtml(input, { allowedTags: [], allowedAttributes: {} });\n case 'url':\n if (\n !validator.isURL(input, {\n protocols: ['http', 'https'],\n require_protocol: true,\n require_host: true,\n })\n ) {\n logger.warning(\n 'Potentially invalid URL detected during string sanitization (context: url)',\n requestContextService.createRequestContext({\n operation: 'Sanitization.sanitizeString.urlWarning',\n additionalContext: { invalidUrlAttempt: input },\n }),\n );\n return '';\n }\n return validator.trim(input);\n case 'javascript':\n logger.error(\n 'Attempted JavaScript sanitization via sanitizeString, which is disallowed.',\n requestContextService.createRequestContext({\n operation: 'Sanitization.sanitizeString.jsAttempt',\n additionalContext: { inputSnippet: input.substring(0, 50) },\n }),\n );\n throw new McpError(\n JsonRpcErrorCode.ValidationError,\n 'JavaScript sanitization is not supported through sanitizeString due to security risks.',\n );\n case 'text':\n default:\n return sanitizeHtml(input, { allowedTags: [], allowedAttributes: {} });\n }\n }\n\n /**\n * Converts attribute format for `sanitizeHtml`.\n * @param attrs - Attributes in `{ tagName: ['attr1'] }` format.\n * @returns Attributes in `sanitize-html` expected format.\n * @private\n */\n private convertAttributesFormat(\n attrs: Record<string, string[]>,\n ): sanitizeHtml.IOptions['allowedAttributes'] {\n return attrs;\n }\n\n /**\n * Sanitizes a URL string by validating its format and protocol.\n * @param input - The URL string to sanitize.\n * @param allowedProtocols - Array of allowed URL protocols. Default: `['http', 'https']`.\n * @returns The sanitized and trimmed URL string.\n * @throws {McpError} If the URL is invalid or uses a disallowed protocol.\n */\n public sanitizeUrl(\n input: string,\n allowedProtocols: string[] = ['http', 'https'],\n ): string {\n try {\n const trimmedInput = input.trim();\n if (\n !validator.isURL(trimmedInput, {\n protocols: allowedProtocols,\n require_protocol: true,\n require_host: true,\n })\n ) {\n throw new Error('Invalid URL format or protocol not in allowed list.');\n }\n const lowercasedInput = trimmedInput.toLowerCase();\n if (\n lowercasedInput.startsWith('javascript:') ||\n lowercasedInput.startsWith('data:') ||\n lowercasedInput.startsWith('vbscript:')\n ) {\n throw new Error(\n 'Disallowed pseudo-protocol (javascript:, data:, or vbscript:) in URL.',\n );\n }\n return trimmedInput;\n } catch (error: unknown) {\n throw new McpError(\n JsonRpcErrorCode.ValidationError,\n error instanceof Error\n ? error.message\n : 'Invalid or unsafe URL provided.',\n { input },\n );\n }\n }\n\n /**\n * Sanitizes a file path to prevent path traversal and normalize format.\n * This method is only available in a Node.js environment.\n * @param input - The file path string to sanitize.\n * @param options - Options to control sanitization behavior.\n * @returns An object with the sanitized path and sanitization metadata.\n * @throws {McpError} If the path is invalid, unsafe, or method is called in a non-Node.js environment.\n */\n public sanitizePath(\n input: string,\n options: PathSanitizeOptions = {},\n ): SanitizedPathInfo {\n if (isServerless || !pathModule) {\n throw new McpError(\n JsonRpcErrorCode.InternalError,\n 'File-based path sanitization is not supported in this environment.',\n );\n }\n const path = pathModule;\n\n const originalInput = input;\n const resolvedRootDir = options.rootDir\n ? path.resolve(options.rootDir)\n : undefined;\n const effectiveOptions: PathSanitizeOptions = {\n toPosix: options.toPosix ?? false,\n allowAbsolute: options.allowAbsolute ?? false,\n ...(resolvedRootDir && { rootDir: resolvedRootDir }),\n };\n\n let wasAbsoluteInitially = false;\n\n try {\n if (!input || typeof input !== 'string')\n throw new Error('Invalid path input: must be a non-empty string.');\n if (input.includes('\\0'))\n throw new Error('Path contains null byte, which is disallowed.');\n\n let normalized = path.normalize(input);\n wasAbsoluteInitially = path.isAbsolute(normalized);\n\n if (effectiveOptions.toPosix) {\n normalized = normalized.replace(/\\\\/g, '/');\n }\n\n let finalSanitizedPath: string;\n\n if (resolvedRootDir) {\n const fullPath = path.resolve(resolvedRootDir, normalized);\n if (\n !fullPath.startsWith(resolvedRootDir + path.sep) &&\n fullPath !== resolvedRootDir\n ) {\n throw new Error(\n 'Path traversal detected: attempts to escape the defined root directory.',\n );\n }\n finalSanitizedPath = path.relative(resolvedRootDir, fullPath);\n finalSanitizedPath =\n finalSanitizedPath === '' ? '.' : finalSanitizedPath;\n if (\n path.isAbsolute(finalSanitizedPath) &&\n !effectiveOptions.allowAbsolute\n ) {\n throw new Error(\n 'Path resolved to absolute outside root when absolute paths are disallowed.',\n );\n }\n } else {\n if (path.isAbsolute(normalized)) {\n if (!effectiveOptions.allowAbsolute) {\n throw new Error(\n 'Absolute paths are disallowed by current options.',\n );\n } else {\n finalSanitizedPath = normalized;\n }\n } else {\n const resolvedAgainstCwd = path.resolve(normalized);\n const currentWorkingDir = path.resolve('.');\n if (\n !resolvedAgainstCwd.startsWith(currentWorkingDir + path.sep) &&\n resolvedAgainstCwd !== currentWorkingDir\n ) {\n throw new Error(\n 'Relative path traversal detected (escapes current working directory context).',\n );\n }\n finalSanitizedPath = normalized;\n }\n }\n\n return {\n sanitizedPath: finalSanitizedPath,\n originalInput,\n wasAbsolute: wasAbsoluteInitially,\n convertedToRelative:\n wasAbsoluteInitially &&\n !path.isAbsolute(finalSanitizedPath) &&\n !effectiveOptions.allowAbsolute,\n optionsUsed: effectiveOptions,\n };\n } catch (error: unknown) {\n logger.warning(\n 'Path sanitization error',\n requestContextService.createRequestContext({\n operation: 'Sanitization.sanitizePath.error',\n additionalContext: {\n originalPathInput: originalInput,\n pathOptionsUsed: effectiveOptions,\n errorMessage:\n error instanceof Error ? error.message : String(error),\n },\n }),\n );\n throw new McpError(\n JsonRpcErrorCode.ValidationError,\n error instanceof Error\n ? error.message\n : 'Invalid or unsafe path provided.',\n { input: originalInput },\n );\n }\n }\n\n /**\n * Sanitizes a JSON string by parsing it to validate its format.\n * Optionally checks if the JSON string exceeds a maximum allowed size.\n * @template T The expected type of the parsed JSON object. Defaults to `unknown`.\n * @param input - The JSON string to sanitize/validate.\n * @param maxSize - Optional maximum allowed size of the JSON string in bytes.\n * @returns The parsed JavaScript object.\n * @throws {McpError} If input is not a string, too large, or invalid JSON.\n */\n public sanitizeJson<T = unknown>(input: string, maxSize?: number): T {\n try {\n if (typeof input !== 'string')\n throw new Error('Invalid input: expected a JSON string.');\n\n // Cross-environment byte length computation\n const computeBytes = (s: string): number => {\n if (\n typeof Buffer !== 'undefined' &&\n typeof Buffer.byteLength === 'function'\n ) {\n return Buffer.byteLength(s, 'utf8');\n }\n if (typeof TextEncoder !== 'undefined') {\n return new TextEncoder().encode(s).length;\n }\n return s.length;\n };\n\n if (maxSize !== undefined && computeBytes(input) > maxSize) {\n throw new McpError(\n JsonRpcErrorCode.ValidationError,\n `JSON string exceeds maximum allowed size of ${maxSize} bytes.`,\n { actualSize: computeBytes(input), maxSize },\n );\n }\n\n return JSON.parse(input) as T;\n } catch (error: unknown) {\n if (error instanceof McpError) throw error;\n throw new McpError(\n JsonRpcErrorCode.ValidationError,\n error instanceof Error ? error.message : 'Invalid JSON format.',\n {\n inputPreview:\n input.length > 100 ? `${input.substring(0, 100)}...` : input,\n },\n );\n }\n }\n\n /**\n * Validates and sanitizes a numeric input, converting strings to numbers.\n * Clamps the number to `min`/`max` if provided.\n * @param input - The number or string to validate and sanitize.\n * @param min - Minimum allowed value (inclusive).\n * @param max - Maximum allowed value (inclusive).\n * @returns The sanitized (and potentially clamped) number.\n * @throws {McpError} If input is not a valid number, NaN, or Infinity.\n */\n public sanitizeNumber(\n input: number | string,\n min?: number,\n max?: number,\n ): number {\n let value: number;\n if (typeof input === 'string') {\n const trimmedInput = input.trim();\n if (trimmedInput === '' || !validator.isNumeric(trimmedInput)) {\n throw new McpError(\n JsonRpcErrorCode.ValidationError,\n 'Invalid number format: input is empty or not numeric.',\n { input },\n );\n }\n value = parseFloat(trimmedInput);\n } else if (typeof input === 'number') {\n value = input;\n } else {\n throw new McpError(\n JsonRpcErrorCode.ValidationError,\n 'Invalid input type: expected number or string.',\n { input: String(input) },\n );\n }\n\n if (isNaN(value) || !isFinite(value)) {\n throw new McpError(\n JsonRpcErrorCode.ValidationError,\n 'Invalid number value (NaN or Infinity).',\n { input },\n );\n }\n\n let clamped = false;\n const originalValueForLog = value;\n if (min !== undefined && value < min) {\n value = min;\n clamped = true;\n }\n if (max !== undefined && value > max) {\n value = max;\n clamped = true;\n }\n if (clamped) {\n logger.debug(\n 'Number clamped to range.',\n requestContextService.createRequestContext({\n operation: 'Sanitization.sanitizeNumber.clamped',\n additionalContext: {\n originalInput: String(input),\n parsedValue: originalValueForLog,\n minValue: min,\n maxValue: max,\n clampedValue: value,\n },\n }),\n );\n }\n return value;\n }\n\n /**\n * Sanitizes input for logging by redacting sensitive fields.\n * Creates a deep clone and replaces values of fields matching `this.sensitiveFields`\n * (case-insensitive substring match) with \"[REDACTED]\".\n *\n * It uses `structuredClone` if available for a high-fidelity deep clone.\n * If `structuredClone` is not available (e.g., in older Node.js environments),\n * it falls back to `JSON.parse(JSON.stringify(input))`. This fallback has limitations:\n * - `Date` objects are converted to ISO date strings.\n * - `undefined` values within objects are removed.\n * - `Map`, `Set`, `RegExp` objects are converted to empty objects (`{}`).\n * - Functions are removed.\n * - `BigInt` values will throw an error during `JSON.stringify` unless a `toJSON` method is provided.\n * - Circular references will cause `JSON.stringify` to throw an error.\n *\n * @param input - The input data to sanitize for logging.\n * @returns A sanitized (deep cloned) version of the input, safe for logging.\n * Returns original input if not object/array, or \"[Log Sanitization Failed]\" on error.\n */\n public sanitizeForLogging(input: unknown): unknown {\n try {\n if (!input || typeof input !== 'object') return input;\n\n const clonedInput: unknown =\n typeof globalThis.structuredClone === 'function'\n ? globalThis.structuredClone(input)\n : JSON.parse(JSON.stringify(input));\n this.redactSensitiveFields(clonedInput);\n return clonedInput;\n } catch (error: unknown) {\n logger.error(\n 'Error during log sanitization, returning placeholder.',\n requestContextService.createRequestContext({\n operation: 'Sanitization.sanitizeForLogging.error',\n additionalContext: {\n errorMessage:\n error instanceof Error ? error.message : String(error),\n },\n }),\n );\n return '[Log Sanitization Failed]';\n }\n }\n\n /**\n * Recursively redacts sensitive fields in an object or array in place.\n * @param obj - The object or array to redact.\n * @private\n */\n private redactSensitiveFields(obj: unknown): void {\n if (!obj || typeof obj !== 'object') return;\n\n if (Array.isArray(obj)) {\n obj.forEach((item) => this.redactSensitiveFields(item));\n return;\n }\n\n // Type guard ensures obj is a Record<string, unknown>\n if (!isRecord(obj)) return;\n\n const normalize = (str: string): string =>\n str.toLowerCase().replace(/[^a-z0-9]/g, '');\n const normalizedSensitiveSet = new Set(\n this.sensitiveFields.map((f) => normalize(f)).filter(Boolean),\n );\n const wordSensitiveSet = new Set(\n this.sensitiveFields.map((f) => f.toLowerCase()).filter(Boolean),\n );\n\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n const value = obj[key];\n const normalizedKey = normalize(key);\n // Split into words for token-based matching (camelCase, snake_case, kebab-case)\n const keyWords = key\n .replace(/([A-Z])/g, ' $1')\n .toLowerCase()\n .split(/[\\s_-]+/)\n .filter(Boolean);\n\n const isExactSensitive = normalizedSensitiveSet.has(normalizedKey);\n const isWordSensitive = keyWords.some((w) => wordSensitiveSet.has(w));\n const isSensitive = isExactSensitive || isWordSensitive;\n\n if (isSensitive) {\n obj[key] = '[REDACTED]';\n } else if (value && typeof value === 'object') {\n this.redactSensitiveFields(value);\n }\n }\n }\n }\n}\n\n/**\n * Singleton instance of the `Sanitization` class.\n * Use this for all input sanitization tasks.\n */\nexport const sanitization = Sanitization.getInstance();\n\n/**\n * Convenience function calling `sanitization.sanitizeForLogging`.\n * @param input - The input data to sanitize.\n * @returns A sanitized version of the input, safe for logging.\n */\nexport const sanitizeInputForLogging = (input: unknown): unknown =>\n sanitization.sanitizeForLogging(input);\n","/**\n * @fileoverview Pino-backed singleton logger with environment-adaptive output.\n * Implements RFC5424 level mapping, structured context, automatic trace injection via\n * OpenTelemetry, and graceful shutdown. In a serverless environment (like Cloudflare\n * Workers), it uses a lightweight console-based logger.\n * @module src/utils/internal/logger\n */\nimport type { LevelWithSilent, Logger as PinoLogger } from 'pino';\nimport pino from 'pino';\n\nimport { config } from '@/config/index.js';\nimport {\n requestContextService,\n type RequestContext,\n} from '@/utils/internal/requestContext.js';\nimport { sanitization } from '@/utils/security/sanitization.js';\n\nexport type McpLogLevel =\n | 'debug'\n | 'info'\n | 'notice'\n | 'warning'\n | 'error'\n | 'crit'\n | 'alert'\n | 'emerg';\n\nconst mcpToPinoLevel: Record<McpLogLevel, LevelWithSilent> = {\n emerg: 'fatal',\n alert: 'fatal',\n crit: 'error',\n error: 'error',\n warning: 'warn',\n notice: 'info',\n info: 'info',\n debug: 'debug',\n};\n\nconst pinoToMcpLevelSeverity: Record<string, number> = {\n fatal: 0,\n error: 2,\n warn: 4,\n info: 6,\n debug: 7,\n};\n\nconst isServerless =\n typeof process === 'undefined' || process.env.IS_SERVERLESS === 'true';\n\nexport class Logger {\n private static readonly instance: Logger = new Logger();\n private pinoLogger?: PinoLogger;\n private interactionLogger?: PinoLogger | undefined;\n private initialized = false;\n private currentMcpLevel: McpLogLevel = 'info';\n private transportType: 'stdio' | 'http' | undefined;\n\n private rateLimitThreshold = 10;\n private rateLimitWindow = 60000;\n private messageCounts = new Map<\n string,\n { count: number; firstSeen: number }\n >();\n private suppressedMessages = new Map<string, number>();\n private cleanupTimer?: NodeJS.Timeout;\n\n private constructor() {\n // The constructor is now safe to call in a global scope.\n }\n\n public static getInstance(): Logger {\n return Logger.instance;\n }\n\n private async createPinoLogger(\n level: McpLogLevel,\n transportType?: 'stdio' | 'http',\n ): Promise<PinoLogger> {\n const pinoLevel = mcpToPinoLevel[level] || 'info';\n\n const pinoOptions: pino.LoggerOptions = {\n level: pinoLevel,\n base: {\n env: config.environment,\n version: config.mcpServerVersion,\n pid: !isServerless ? process.pid : undefined,\n },\n redact: {\n paths: sanitization.getSensitivePinoFields(),\n censor: '[REDACTED]',\n },\n };\n\n if (isServerless) {\n return pino(pinoOptions);\n }\n\n // Node.js specific transports\n const { default: fs } = await import('fs');\n const { default: path } = await import('path');\n\n const transports: pino.TransportTargetOptions[] = [];\n const isDevelopment = config.environment === 'development';\n const isTest = config.environment === 'testing';\n\n // CRITICAL: STDIO transport MUST NOT output colored logs to stdout.\n // The MCP specification requires clean JSON-RPC on stdout with no ANSI codes.\n // Only use pretty/colored output for HTTP mode or when explicitly debugging.\n // Respect NO_COLOR environment variable (https://no-color.org/)\n const noColorEnv =\n process.env.NO_COLOR === '1' || process.env.FORCE_COLOR === '0';\n const useColoredOutput =\n isDevelopment && transportType !== 'stdio' && !noColorEnv;\n\n if (useColoredOutput && !isServerless) {\n // Try to resolve 'pino-pretty' robustly even when bundled (e.g., Bun/ESM),\n // falling back to JSON stdout if resolution fails.\n try {\n const { createRequire } = await import('node:module');\n const require = createRequire(import.meta.url);\n const prettyTarget = require.resolve('pino-pretty');\n transports.push({\n target: prettyTarget,\n options: { colorize: true, translateTime: 'yyyy-mm-dd HH:MM:ss' },\n });\n } catch (err) {\n // Only log to console if TTY to avoid polluting stderr in STDIO mode\n if (process.stderr?.isTTY) {\n console.warn(\n `[Logger Init] Pretty transport unavailable (${err instanceof Error ? err.message : String(err)}); falling back to stdout JSON.`,\n );\n }\n transports.push({ target: 'pino/file', options: { destination: 1 } });\n }\n } else if (!isTest) {\n // CRITICAL: For STDIO transport, logs MUST go to stderr (fd 2), NOT stdout (fd 1).\n // The MCP specification requires only JSON-RPC messages on stdout.\n // For HTTP transport or production, we also use stderr to avoid polluting stdout.\n transports.push({ target: 'pino/file', options: { destination: 2 } });\n }\n\n if (config.logsPath) {\n try {\n if (!fs.existsSync(config.logsPath)) {\n fs.mkdirSync(config.logsPath, { recursive: true });\n }\n transports.push({\n level: pinoLevel,\n target: 'pino/file',\n options: {\n destination: path.join(config.logsPath, 'combined.log'),\n mkdir: true,\n },\n });\n transports.push({\n level: 'error',\n target: 'pino/file',\n options: {\n destination: path.join(config.logsPath, 'error.log'),\n mkdir: true,\n },\n });\n } catch (err) {\n // Only log to console if TTY to avoid polluting stderr in STDIO mode\n if (process.stderr?.isTTY) {\n console.error(\n `[Logger Init] Failed to configure file logging: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n }\n\n return pino({ ...pinoOptions, transport: { targets: transports } });\n }\n\n private async createInteractionLogger(): Promise<PinoLogger | undefined> {\n if (isServerless || !config.logsPath) return undefined;\n\n const { default: path } = await import('path');\n return pino({\n transport: {\n target: 'pino/file',\n options: {\n destination: path.join(config.logsPath, 'interactions.log'),\n mkdir: true,\n },\n },\n });\n }\n\n public async initialize(\n level: McpLogLevel = 'info',\n transportType?: 'stdio' | 'http',\n ): Promise<void> {\n if (this.initialized) {\n this.warning(\n 'Logger already initialized.',\n requestContextService.createRequestContext({\n operation: 'loggerReinit',\n }),\n );\n return;\n }\n this.currentMcpLevel = level;\n this.transportType = transportType;\n this.pinoLogger = await this.createPinoLogger(level, transportType);\n this.interactionLogger = await this.createInteractionLogger();\n\n // Start the cleanup timer only after initialization and only in Node.js\n if (!isServerless && !this.cleanupTimer) {\n this.cleanupTimer = setInterval(\n () => this.flushSuppressedMessages(),\n this.rateLimitWindow,\n );\n this.cleanupTimer.unref?.();\n }\n\n this.initialized = true;\n this.info(\n `Logger initialized. MCP level: ${level}.`,\n requestContextService.createRequestContext({ operation: 'loggerInit' }),\n );\n }\n\n public setLevel(newLevel: McpLogLevel): void {\n if (!this.pinoLogger || !this.initialized) {\n // Only log to console if TTY to avoid polluting stderr in STDIO mode\n if (process.stderr?.isTTY) {\n console.error('Cannot set level: Logger not initialized.');\n }\n return;\n }\n this.currentMcpLevel = newLevel;\n this.pinoLogger.level = mcpToPinoLevel[newLevel] || 'info';\n this.info(\n `Log level changed to ${newLevel}.`,\n requestContextService.createRequestContext({\n operation: 'loggerSetLevel',\n }),\n );\n }\n\n public async close(): Promise<void> {\n if (!this.initialized) return Promise.resolve();\n this.info(\n 'Logger shutting down.',\n requestContextService.createRequestContext({ operation: 'loggerClose' }),\n );\n if (this.cleanupTimer) clearInterval(this.cleanupTimer);\n this.flushSuppressedMessages();\n\n // Wait for all pending writes to complete\n await Promise.all([\n new Promise<void>((resolve) => {\n if (this.pinoLogger) {\n this.pinoLogger.flush((err) => {\n // Only log to console if TTY AND not in STDIO mode\n // In STDIO mode, stdout is reserved for MCP JSON-RPC, so avoid polluting stderr with shutdown noise\n if (\n err &&\n process.stderr?.isTTY &&\n this.transportType !== 'stdio'\n ) {\n console.error('Error flushing main logger:', err);\n }\n resolve();\n });\n } else {\n resolve();\n }\n }),\n new Promise<void>((resolve) => {\n if (this.interactionLogger) {\n this.interactionLogger.flush((err) => {\n // Only log to console if TTY AND not in STDIO mode\n // In STDIO mode, stdout is reserved for MCP JSON-RPC, so avoid polluting stderr with shutdown noise\n if (\n err &&\n process.stderr?.isTTY &&\n this.transportType !== 'stdio'\n ) {\n console.error('Error flushing interaction logger:', err);\n }\n resolve();\n });\n } else {\n resolve();\n }\n }),\n ]);\n\n this.initialized = false;\n }\n\n public isInitialized(): boolean {\n return this.initialized;\n }\n\n private isRateLimited(message: string): boolean {\n const now = Date.now();\n const entry = this.messageCounts.get(message);\n if (!entry) {\n this.messageCounts.set(message, { count: 1, firstSeen: now });\n return false;\n }\n if (now - entry.firstSeen > this.rateLimitWindow) {\n this.messageCounts.set(message, { count: 1, firstSeen: now });\n return false;\n }\n entry.count++;\n if (entry.count > this.rateLimitThreshold) {\n this.suppressedMessages.set(\n message,\n (this.suppressedMessages.get(message) || 0) + 1,\n );\n return true;\n }\n return false;\n }\n\n private flushSuppressedMessages(): void {\n if (this.suppressedMessages.size === 0) return;\n for (const [message, count] of this.suppressedMessages.entries()) {\n this.warning(\n `Log message suppressed ${count} times due to rate limiting.`,\n requestContextService.createRequestContext({\n operation: 'loggerRateLimitFlush',\n additionalContext: { originalMessage: message },\n }),\n );\n }\n this.suppressedMessages.clear();\n this.messageCounts.clear();\n }\n\n private log(\n level: McpLogLevel,\n msg: string,\n context?: RequestContext,\n error?: Error,\n ): void {\n if (!this.pinoLogger || !this.initialized) return;\n\n const pinoLevel = mcpToPinoLevel[level] || 'info';\n const currentPinoLevel = mcpToPinoLevel[this.currentMcpLevel] || 'info';\n\n const levelSeverity = pinoToMcpLevelSeverity[pinoLevel];\n const currentLevelSeverity = pinoToMcpLevelSeverity[currentPinoLevel];\n\n if (\n typeof levelSeverity === 'number' &&\n typeof currentLevelSeverity === 'number' &&\n levelSeverity > currentLevelSeverity\n ) {\n return;\n }\n\n if (this.isRateLimited(msg)) return;\n\n const logObject: Record<string, unknown> = { ...context };\n if (error) logObject.err = pino.stdSerializers.err(error);\n\n this.pinoLogger[pinoLevel](logObject, msg);\n }\n\n public debug(msg: string, context?: RequestContext): void {\n this.log('debug', msg, context);\n }\n public info(msg: string, context?: RequestContext): void {\n this.log('info', msg, context);\n }\n public notice(msg: string, context?: RequestContext): void {\n this.log('notice', msg, context);\n }\n public warning(msg: string, context?: RequestContext): void {\n this.log('warning', msg, context);\n }\n\n public error(\n msg: string,\n errorOrContext: Error | RequestContext,\n context?: RequestContext,\n ): void {\n const errorObj =\n errorOrContext instanceof Error ? errorOrContext : undefined;\n const actualContext =\n errorOrContext instanceof Error ? context : errorOrContext;\n this.log('error', msg, actualContext, errorObj);\n }\n\n public crit(\n msg: string,\n errorOrContext: Error | RequestContext,\n context?: RequestContext,\n ): void {\n const errorObj =\n errorOrContext instanceof Error ? errorOrContext : undefined;\n const actualContext =\n errorOrContext instanceof Error ? context : errorOrContext;\n this.log('crit', msg, actualContext, errorObj);\n }\n\n public alert(\n msg: string,\n errorOrContext: Error | RequestContext,\n context?: RequestContext,\n ): void {\n const errorObj =\n errorOrContext instanceof Error ? errorOrContext : undefined;\n const actualContext =\n errorOrContext instanceof Error ? context : errorOrContext;\n this.log('alert', msg, actualContext, errorObj);\n }\n\n public emerg(\n msg: string,\n errorOrContext: Error | RequestContext,\n context?: RequestContext,\n ): void {\n const errorObj =\n errorOrContext instanceof Error ? errorOrContext : undefined;\n const actualContext =\n errorOrContext instanceof Error ? context : errorOrContext;\n this.log('emerg', msg, actualContext, errorObj);\n }\n\n public fatal(\n msg: string,\n errorOrContext: Error | RequestContext,\n context?: RequestContext,\n ): void {\n this.emerg(msg, errorOrContext, context);\n }\n\n public logInteraction(\n interactionName: string,\n data: Record<string, unknown>,\n ): void {\n if (!this.interactionLogger) {\n if (!isServerless)\n this.warning(\n 'Interaction logger not available.',\n (data.context || {}) as RequestContext,\n );\n return;\n }\n this.interactionLogger.info({ interactionName, ...data });\n }\n}\n\nexport const logger = Logger.getInstance();\n","/**\n * @fileoverview Shared error classification constants used by the error handler.\n * Enhanced with regex caching for performance and provider-specific error patterns.\n * @module src/utils/internal/error-handler/mappings\n */\n\nimport { JsonRpcErrorCode } from '@/types-global/errors.js';\nimport type { BaseErrorMapping } from './types.js';\n\n/**\n * Compiled regex cache for performance optimization.\n * Prevents repeated regex compilation on every error classification.\n * @private\n */\nconst COMPILED_PATTERN_CACHE = new Map<string, RegExp>();\n\n/**\n * Compiles and caches regex patterns at first use for faster matching.\n * Automatically adds case-insensitive flag and removes global flag for safety.\n * @param pattern - Pattern to compile (string or RegExp)\n * @returns Compiled and cached RegExp instance\n */\nexport function getCompiledPattern(pattern: string | RegExp): RegExp {\n // Create a stable cache key\n const cacheKey =\n pattern instanceof RegExp ? pattern.source + pattern.flags : pattern;\n\n // Return cached pattern if available\n if (COMPILED_PATTERN_CACHE.has(cacheKey)) {\n return COMPILED_PATTERN_CACHE.get(cacheKey)!;\n }\n\n // Compile new pattern\n let compiled: RegExp;\n if (pattern instanceof RegExp) {\n // Remove global flag, ensure case-insensitive\n let flags = pattern.flags.replace('g', '');\n if (!flags.includes('i')) {\n flags += 'i';\n }\n compiled = new RegExp(pattern.source, flags);\n } else {\n compiled = new RegExp(pattern, 'i');\n }\n\n // Cache for future use\n COMPILED_PATTERN_CACHE.set(cacheKey, compiled);\n return compiled;\n}\n\n/**\n * Extended error mapping interface that includes pre-compiled regex pattern.\n * @private\n */\ninterface CompiledErrorMapping extends BaseErrorMapping {\n /** Pre-compiled regex pattern for efficient matching */\n compiledPattern: RegExp;\n}\n\n/**\n * Maps standard JavaScript error constructor names to `JsonRpcErrorCode` values.\n */\nexport const ERROR_TYPE_MAPPINGS: Readonly<Record<string, JsonRpcErrorCode>> = {\n SyntaxError: JsonRpcErrorCode.ValidationError,\n TypeError: JsonRpcErrorCode.ValidationError,\n ReferenceError: JsonRpcErrorCode.InternalError,\n RangeError: JsonRpcErrorCode.ValidationError,\n URIError: JsonRpcErrorCode.ValidationError,\n EvalError: JsonRpcErrorCode.InternalError,\n AggregateError: JsonRpcErrorCode.InternalError,\n};\n\n/**\n * Array of `BaseErrorMapping` rules to classify errors by message/name patterns.\n * Order matters: more specific patterns should precede generic ones.\n */\nexport const COMMON_ERROR_PATTERNS: ReadonlyArray<Readonly<BaseErrorMapping>> =\n [\n {\n pattern:\n /auth|unauthorized|unauthenticated|not.*logged.*in|invalid.*token|expired.*token/i,\n errorCode: JsonRpcErrorCode.Unauthorized,\n },\n {\n pattern: /permission|forbidden|access.*denied|not.*allowed/i,\n errorCode: JsonRpcErrorCode.Forbidden,\n },\n {\n pattern: /not found|missing|no such|doesn't exist|couldn't find/i,\n errorCode: JsonRpcErrorCode.NotFound,\n },\n {\n pattern:\n /invalid|validation|malformed|bad request|wrong format|missing required/i,\n errorCode: JsonRpcErrorCode.ValidationError,\n },\n {\n pattern: /conflict|already exists|duplicate|unique constraint/i,\n errorCode: JsonRpcErrorCode.Conflict,\n },\n {\n pattern: /rate limit|too many requests|throttled/i,\n errorCode: JsonRpcErrorCode.RateLimited,\n },\n {\n pattern: /timeout|timed out|deadline exceeded/i,\n errorCode: JsonRpcErrorCode.Timeout,\n },\n {\n pattern: /abort(ed)?|cancell?ed/i,\n errorCode: JsonRpcErrorCode.Timeout,\n },\n {\n pattern:\n /service unavailable|bad gateway|gateway timeout|upstream error/i,\n errorCode: JsonRpcErrorCode.ServiceUnavailable,\n },\n {\n pattern: /zod|zoderror|schema validation/i,\n errorCode: JsonRpcErrorCode.ValidationError,\n },\n ];\n\n/**\n * Pre-compiled error patterns for performance optimization.\n * These patterns are compiled once at module initialization for faster matching.\n * Use these in performance-critical paths instead of COMMON_ERROR_PATTERNS.\n */\nexport const COMPILED_ERROR_PATTERNS: ReadonlyArray<\n Readonly<CompiledErrorMapping>\n> = COMMON_ERROR_PATTERNS.map((mapping) => ({\n ...mapping,\n compiledPattern: getCompiledPattern(mapping.pattern),\n}));\n\n/**\n * Provider-specific error patterns for external service integration.\n * Covers common error formats from AWS, HTTP status codes, databases, and LLM providers.\n */\nexport const PROVIDER_ERROR_PATTERNS: ReadonlyArray<\n Readonly<BaseErrorMapping>\n> = [\n // AWS Service Errors\n {\n pattern: /ThrottlingException|TooManyRequestsException/i,\n errorCode: JsonRpcErrorCode.RateLimited,\n },\n {\n pattern: /AccessDenied|UnauthorizedOperation/i,\n errorCode: JsonRpcErrorCode.Forbidden,\n },\n {\n pattern: /ResourceNotFoundException/i,\n errorCode: JsonRpcErrorCode.NotFound,\n },\n\n // HTTP Status-based errors\n { pattern: /status code 401/i, errorCode: JsonRpcErrorCode.Unauthorized },\n { pattern: /status code 403/i, errorCode: JsonRpcErrorCode.Forbidden },\n { pattern: /status code 404/i, errorCode: JsonRpcErrorCode.NotFound },\n { pattern: /status code 409/i, errorCode: JsonRpcErrorCode.Conflict },\n { pattern: /status code 429/i, errorCode: JsonRpcErrorCode.RateLimited },\n {\n pattern: /status code 5\\d\\d/i,\n errorCode: JsonRpcErrorCode.ServiceUnavailable,\n },\n\n // Database connection and constraint errors\n {\n pattern: /ECONNREFUSED|connection refused/i,\n errorCode: JsonRpcErrorCode.ServiceUnavailable,\n },\n {\n pattern: /ETIMEDOUT|connection timeout/i,\n errorCode: JsonRpcErrorCode.Timeout,\n },\n {\n pattern: /unique constraint|duplicate key/i,\n errorCode: JsonRpcErrorCode.Conflict,\n },\n {\n pattern: /foreign key constraint/i,\n errorCode: JsonRpcErrorCode.ValidationError,\n },\n\n // Supabase-specific errors\n { pattern: /JWT expired/i, errorCode: JsonRpcErrorCode.Unauthorized },\n {\n pattern: /row level security/i,\n errorCode: JsonRpcErrorCode.Forbidden,\n },\n\n // OpenRouter/LLM provider errors\n {\n pattern: /insufficient_quota|quota exceeded/i,\n errorCode: JsonRpcErrorCode.RateLimited,\n },\n { pattern: /model_not_found/i, errorCode: JsonRpcErrorCode.NotFound },\n {\n pattern: /context_length_exceeded/i,\n errorCode: JsonRpcErrorCode.ValidationError,\n },\n\n // Network errors\n { pattern: /ENOTFOUND|DNS/i, errorCode: JsonRpcErrorCode.ServiceUnavailable },\n {\n pattern: /ECONNRESET|connection reset/i,\n errorCode: JsonRpcErrorCode.ServiceUnavailable,\n },\n];\n\n/**\n * Pre-compiled provider error patterns for performance.\n */\nexport const COMPILED_PROVIDER_PATTERNS: ReadonlyArray<\n Readonly<CompiledErrorMapping>\n> = PROVIDER_ERROR_PATTERNS.map((mapping) => ({\n ...mapping,\n compiledPattern: getCompiledPattern(mapping.pattern),\n}));\n","/**\n * @fileoverview Helper utilities for error inspection and normalization.\n * Enhanced with cause chain extraction and circular reference detection.\n * @module src/utils/internal/error-handler/helpers\n */\n\nimport { McpError } from '@/types-global/errors.js';\nimport { isAggregateError } from '@/utils/types/guards.js';\nimport { getCompiledPattern } from './mappings.js';\n\n/**\n * Creates a \"safe\" RegExp for testing error messages with caching.\n * Ensures case-insensitivity and removes the global flag.\n * Now delegates to the compiled pattern cache for better performance.\n * @param pattern - The string or RegExp pattern.\n * @returns A cached RegExp instance.\n */\nexport function createSafeRegex(pattern: string | RegExp): RegExp {\n return getCompiledPattern(pattern);\n}\n\n/**\n * Retrieves a descriptive name for an error object or value.\n * @param error - The error object or value.\n * @returns A string representing the error's name or type.\n */\nexport function getErrorName(error: unknown): string {\n if (error instanceof Error) {\n return error.name || 'Error';\n }\n if (error === null) {\n return 'NullValueEncountered';\n }\n if (error === undefined) {\n return 'UndefinedValueEncountered';\n }\n if (\n typeof error === 'object' &&\n error !== null &&\n error.constructor &&\n typeof error.constructor.name === 'string' &&\n error.constructor.name !== 'Object'\n ) {\n return `${error.constructor.name}Encountered`;\n }\n return `${typeof error}Encountered`;\n}\n\n/**\n * Extracts a message string from an error object or value.\n * @param error - The error object or value.\n * @returns The error message string.\n */\nexport function getErrorMessage(error: unknown): string {\n try {\n if (error instanceof Error) {\n // AggregateError should surface combined messages succinctly\n if (isAggregateError(error)) {\n const inner = error.errors\n .map((e) => (e instanceof Error ? e.message : String(e)))\n .filter(Boolean)\n .slice(0, 3)\n .join('; ');\n return inner ? `${error.message}: ${inner}` : error.message;\n }\n return error.message;\n }\n if (error === null) {\n return 'Null value encountered as error';\n }\n if (error === undefined) {\n return 'Undefined value encountered as error';\n }\n if (typeof error === 'string') {\n return error;\n }\n if (typeof error === 'number' || typeof error === 'boolean') {\n return String(error);\n }\n if (typeof error === 'bigint') {\n return error.toString();\n }\n if (typeof error === 'function') {\n return `[function ${error.name || 'anonymous'}]`;\n }\n if (typeof error === 'object') {\n try {\n const json = JSON.stringify(error);\n if (json && json !== '{}') return json;\n } catch {\n // fall through\n }\n const ctor = (error as { constructor?: { name?: string } }).constructor\n ?.name;\n return `Non-Error object encountered (constructor: ${ctor || 'Object'})`;\n }\n if (typeof error === 'symbol') {\n return error.toString();\n }\n // c8 ignore next\n return '[unrepresentable error]';\n } catch (conversionError) {\n return `Error converting error to string: ${conversionError instanceof Error ? conversionError.message : 'Unknown conversion error'}`;\n }\n}\n\n/**\n * Represents a node in the error cause chain for structured error analysis.\n */\nexport interface ErrorCauseNode {\n /** Error name/type */\n name: string;\n /** Error message */\n message: string;\n /** Stack trace if available */\n stack?: string;\n /** Depth in the cause chain (0 = original error) */\n depth: number;\n /** Additional data from McpError instances */\n data?: Record<string, unknown>;\n}\n\n/**\n * Extracts the complete error cause chain with circular reference detection.\n * Traverses the error.cause chain up to maxDepth, tracking seen errors to prevent infinite loops.\n * @param error - The error to extract causes from\n * @param maxDepth - Maximum depth to traverse (default: 20)\n * @returns Array of error cause nodes from root to leaf\n *\n * @example\n * ```typescript\n * const chain = extractErrorCauseChain(error);\n * console.log(`Root cause: ${chain[chain.length - 1].message}`);\n * console.log(`Error chain depth: ${chain.length}`);\n * ```\n */\nexport function extractErrorCauseChain(\n error: unknown,\n maxDepth = 20,\n): ErrorCauseNode[] {\n const chain: ErrorCauseNode[] = [];\n const seen = new WeakSet<object>();\n let current = error;\n let depth = 0;\n\n while (current && depth < maxDepth) {\n // Circular reference detection\n if (typeof current === 'object' && current !== null) {\n if (seen.has(current)) {\n chain.push({\n name: 'CircularReference',\n message: 'Circular reference detected in error cause chain',\n depth,\n });\n break;\n }\n seen.add(current);\n }\n\n if (current instanceof Error) {\n const node: ErrorCauseNode = {\n name: current.name,\n message: current.message,\n depth,\n // Only include stack if it exists (exact optional property types)\n ...(current.stack !== undefined ? { stack: current.stack } : {}),\n };\n\n // Extract data from McpError instances\n if (current instanceof McpError && current.data) {\n node.data = current.data;\n }\n\n chain.push(node);\n\n // Continue traversing cause chain\n current = current.cause;\n } else if (typeof current === 'string') {\n chain.push({\n name: 'StringError',\n message: current,\n depth,\n });\n break;\n } else {\n chain.push({\n name: getErrorName(current),\n message: getErrorMessage(current),\n depth,\n });\n break;\n }\n\n depth++;\n }\n\n if (depth >= maxDepth) {\n chain.push({\n name: 'MaxDepthExceeded',\n message: `Error cause chain exceeded maximum depth of ${maxDepth}`,\n depth,\n });\n }\n\n return chain;\n}\n\n/**\n * Serializes an error cause chain to a structured format for logging and monitoring.\n * @param error - The error to serialize\n * @returns Serialized cause chain object with root cause and full chain\n *\n * @example\n * ```typescript\n * const serialized = serializeErrorCauseChain(error);\n * logger.error('Error occurred', {\n * rootCause: serialized.rootCause.message,\n * chainDepth: serialized.totalDepth,\n * });\n * ```\n */\nexport function serializeErrorCauseChain(error: unknown): {\n rootCause: ErrorCauseNode;\n chain: ErrorCauseNode[];\n totalDepth: number;\n} {\n const chain = extractErrorCauseChain(error);\n const rootCause = chain[chain.length - 1] || {\n name: 'Unknown',\n message: 'No error information available',\n depth: 0,\n };\n\n return {\n rootCause,\n chain,\n totalDepth: chain.length,\n };\n}\n","/**\n * @fileoverview Main ErrorHandler implementation with logging and telemetry integration.\n * Enhanced with Result types, breadcrumb tracking, error sanitization, and retry logic.\n * @module src/utils/internal/error-handler/errorHandler\n */\n\nimport { SpanStatusCode, trace } from '@opentelemetry/api';\n\nimport { JsonRpcErrorCode, McpError } from '@/types-global/errors.js';\nimport { generateUUID, sanitizeInputForLogging } from '@/utils/index.js';\nimport { logger } from '@/utils/internal/logger.js';\nimport type { RequestContext } from '@/utils/internal/requestContext.js';\n\nimport {\n COMPILED_ERROR_PATTERNS,\n COMPILED_PROVIDER_PATTERNS,\n ERROR_TYPE_MAPPINGS,\n} from './mappings.js';\nimport {\n createSafeRegex,\n extractErrorCauseChain,\n getErrorMessage,\n getErrorName,\n} from './helpers.js';\nimport type {\n EnhancedErrorContext,\n ErrorHandlerOptions,\n ErrorMapping,\n ErrorRecoveryStrategy,\n Result,\n} from './types.js';\n\n/**\n * A utility class providing static methods for comprehensive error handling.\n */\nexport class ErrorHandler {\n /**\n * Determines an appropriate `JsonRpcErrorCode` for a given error.\n * Checks `McpError` instances, `ERROR_TYPE_MAPPINGS`, and pre-compiled error patterns.\n * Now includes provider-specific patterns for better external service error classification.\n * Defaults to `JsonRpcErrorCode.InternalError`.\n * @param error - The error instance or value to classify.\n * @returns The determined error code.\n */\n public static determineErrorCode(error: unknown): JsonRpcErrorCode {\n if (error instanceof McpError) {\n return error.code;\n }\n\n const errorName = getErrorName(error);\n const errorMessage = getErrorMessage(error);\n\n // Check against standard JavaScript error types\n const mappedFromType = (\n ERROR_TYPE_MAPPINGS as Record<string, JsonRpcErrorCode>\n )[errorName];\n if (mappedFromType) {\n return mappedFromType;\n }\n\n // Check provider-specific patterns first (more specific)\n for (const mapping of COMPILED_PROVIDER_PATTERNS) {\n if (\n mapping.compiledPattern.test(errorMessage) ||\n mapping.compiledPattern.test(errorName)\n ) {\n return mapping.errorCode;\n }\n }\n\n // Then check common error patterns (using pre-compiled patterns for performance)\n for (const mapping of COMPILED_ERROR_PATTERNS) {\n if (\n mapping.compiledPattern.test(errorMessage) ||\n mapping.compiledPattern.test(errorName)\n ) {\n return mapping.errorCode;\n }\n }\n // Special-case common platform errors\n if (\n typeof error === 'object' &&\n error !== null &&\n 'name' in error &&\n (error as { name?: string }).name === 'AbortError'\n ) {\n return JsonRpcErrorCode.Timeout;\n }\n return JsonRpcErrorCode.InternalError;\n }\n\n /**\n * Handles an error with consistent logging and optional transformation.\n * Sanitizes input, determines error code, logs details, and can rethrow.\n * @param error - The error instance or value that occurred.\n * @param options - Configuration for handling the error.\n * @returns The handled (and potentially transformed) error instance.\n */\n public static handleError(\n error: unknown,\n options: ErrorHandlerOptions,\n ): Error {\n // --- OpenTelemetry Integration ---\n const activeSpan = trace.getActiveSpan();\n if (activeSpan) {\n if (error instanceof Error) {\n activeSpan.recordException(error);\n }\n activeSpan.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n }\n // --- End OpenTelemetry Integration ---\n\n const {\n context = {},\n operation,\n input,\n rethrow = false,\n errorCode: explicitErrorCode,\n includeStack = true,\n critical = false,\n errorMapper,\n } = options;\n\n const sanitizedInput =\n input !== undefined ? sanitizeInputForLogging(input) : undefined;\n const originalErrorName = getErrorName(error);\n const originalErrorMessage = getErrorMessage(error);\n const originalStack = error instanceof Error ? error.stack : undefined;\n\n let finalError: Error;\n let loggedErrorCode: JsonRpcErrorCode;\n\n const errorDataSeed =\n error instanceof McpError &&\n typeof error.data === 'object' &&\n error.data !== null\n ? { ...error.data }\n : {};\n\n const consolidatedData: Record<string, unknown> = {\n ...errorDataSeed,\n ...context,\n originalErrorName,\n originalMessage: originalErrorMessage,\n };\n if (\n originalStack &&\n !(error instanceof McpError && error.data?.originalStack)\n ) {\n consolidatedData.originalStack = originalStack;\n }\n\n const cause = error instanceof Error ? error : undefined;\n\n // Extract full cause chain with circular reference detection\n const causeChain = extractErrorCauseChain(error);\n if (causeChain.length > 0) {\n const rootCause = causeChain[causeChain.length - 1];\n if (rootCause) {\n consolidatedData['rootCause'] = {\n name: rootCause.name,\n message: rootCause.message,\n };\n }\n consolidatedData['causeChain'] = causeChain;\n }\n\n // Add breadcrumbs from enhanced context if present\n if (\n context &&\n 'metadata' in context &&\n context.metadata &&\n typeof context.metadata === 'object' &&\n 'breadcrumbs' in context.metadata\n ) {\n consolidatedData['breadcrumbs'] = context.metadata.breadcrumbs;\n }\n\n if (error instanceof McpError) {\n loggedErrorCode = error.code;\n finalError = errorMapper\n ? errorMapper(error)\n : new McpError(error.code, error.message, consolidatedData, {\n cause,\n });\n } else {\n loggedErrorCode =\n explicitErrorCode || ErrorHandler.determineErrorCode(error);\n const message = `Error in ${operation}: ${originalErrorMessage}`;\n finalError = errorMapper\n ? errorMapper(error)\n : new McpError(loggedErrorCode, message, consolidatedData, {\n cause,\n });\n }\n\n if (\n finalError !== error &&\n error instanceof Error &&\n finalError instanceof Error &&\n !finalError.stack &&\n error.stack\n ) {\n finalError.stack = error.stack;\n }\n\n const logRequestId =\n typeof context.requestId === 'string' && context.requestId\n ? context.requestId\n : generateUUID();\n\n const logTimestamp =\n typeof context.timestamp === 'string' && context.timestamp\n ? context.timestamp\n : new Date().toISOString();\n\n const stack =\n finalError instanceof Error ? finalError.stack : originalStack;\n const logContext: RequestContext = {\n requestId: logRequestId,\n timestamp: logTimestamp,\n operation,\n input: sanitizedInput,\n critical,\n errorCode: loggedErrorCode,\n originalErrorType: originalErrorName,\n finalErrorType: getErrorName(finalError),\n ...Object.fromEntries(\n Object.entries(context).filter(\n ([key]) => key !== 'requestId' && key !== 'timestamp',\n ),\n ),\n errorData:\n finalError instanceof McpError && finalError.data\n ? finalError.data\n : consolidatedData,\n ...(includeStack && stack ? { stack } : {}),\n };\n\n logger.error(\n `Error in ${operation}: ${finalError.message || originalErrorMessage}`,\n logContext,\n );\n\n if (rethrow) {\n throw finalError;\n }\n return finalError;\n }\n\n /**\n * Maps an error to a specific error type `T` based on `ErrorMapping` rules.\n * Returns original/default error if no mapping matches.\n * @template T The target error type, extending `Error`.\n * @param error - The error instance or value to map.\n * @param mappings - An array of mapping rules to apply.\n * @param defaultFactory - Optional factory for a default error if no mapping matches.\n * @returns The mapped error of type `T`, or the original/defaulted error.\n */\n public static mapError<T extends Error>(\n error: unknown,\n mappings: ReadonlyArray<ErrorMapping<T>>,\n defaultFactory?: (error: unknown, context?: Record<string, unknown>) => T,\n ): T | Error {\n const errorMessage = getErrorMessage(error);\n const errorName = getErrorName(error);\n\n for (const mapping of mappings) {\n const regex = createSafeRegex(mapping.pattern);\n if (regex.test(errorMessage) || regex.test(errorName)) {\n // c8 ignore next\n return mapping.factory(error, mapping.additionalContext);\n }\n }\n\n if (defaultFactory) {\n return defaultFactory(error);\n }\n return error instanceof Error ? error : new Error(String(error));\n }\n\n /**\n * Formats an error into a consistent object structure for API responses or structured logging.\n * @param error - The error instance or value to format.\n * @returns A structured representation of the error.\n */\n public static formatError(error: unknown): Record<string, unknown> {\n if (error instanceof McpError) {\n return {\n code: error.code,\n message: error.message,\n data:\n typeof error.data === 'object' && error.data !== null\n ? error.data\n : {},\n };\n }\n\n if (error instanceof Error) {\n return {\n code: ErrorHandler.determineErrorCode(error),\n message: error.message,\n data: { errorType: error.name || 'Error' },\n };\n }\n\n return {\n code: JsonRpcErrorCode.UnknownError,\n message: getErrorMessage(error),\n data: { errorType: getErrorName(error) },\n };\n }\n\n /**\n * Safely executes a function (sync or async) and handles errors using `ErrorHandler.handleError`.\n * The error is always rethrown.\n * @template T The expected return type of the function `fn`.\n * @param fn - The function to execute.\n * @param options - Error handling options (excluding `rethrow`).\n * @returns A promise resolving with the result of `fn` if successful.\n * @throws {McpError | Error} The error processed by `ErrorHandler.handleError`.\n */\n public static async tryCatch<T>(\n fn: () => Promise<T> | T,\n options: Omit<ErrorHandlerOptions, 'rethrow'>,\n ): Promise<T> {\n try {\n return await Promise.resolve(fn());\n } catch (caughtError) {\n // ErrorHandler.handleError will return the error to be thrown.\n throw ErrorHandler.handleError(caughtError, {\n ...options,\n rethrow: true,\n });\n }\n }\n\n /**\n * Executes a function and returns a Result type instead of throwing.\n * Enables functional error handling following Railway Oriented Programming pattern.\n * @template T The expected return type\n * @param fn - The function to execute\n * @param options - Error handling options (excluding `rethrow`)\n * @returns Result<T, McpError> - Success or error wrapped in Result type\n *\n * @example\n * ```typescript\n * const result = await ErrorHandler.tryAsResult(\n * () => dangerousOperation(),\n * { operation: 'dangerousOp', context }\n * );\n *\n * if (result.ok) {\n * console.log('Success:', result.value);\n * } else {\n * console.error('Error:', result.error.message);\n * }\n * ```\n */\n public static async tryAsResult<T>(\n fn: () => Promise<T> | T,\n options: Omit<ErrorHandlerOptions, 'rethrow'>,\n ): Promise<Result<T, McpError>> {\n try {\n const value = await Promise.resolve(fn());\n return { ok: true, value };\n } catch (caughtError) {\n const error = ErrorHandler.handleError(caughtError, {\n ...options,\n rethrow: false,\n }) as McpError;\n return { ok: false, error };\n }\n }\n\n /**\n * Helper to map a Result value through a transformation function.\n * @template T Input type\n * @template U Output type\n * @param result - The result to map\n * @param fn - Transformation function\n * @returns Mapped result\n *\n * @example\n * ```typescript\n * const userResult = await getUserById(id);\n * const nameResult = ErrorHandler.mapResult(userResult, user => user.name);\n * ```\n */\n public static mapResult<T, U>(\n result: Result<T, McpError>,\n fn: (value: T) => U,\n ): Result<U, McpError> {\n if (result.ok) {\n try {\n return { ok: true, value: fn(result.value) };\n } catch (error: unknown) {\n return {\n ok: false,\n error: new McpError(\n JsonRpcErrorCode.InternalError,\n `Error mapping result: ${getErrorMessage(error)}`,\n ),\n };\n }\n }\n return result;\n }\n\n /**\n * Helper to chain Result-returning operations (flatMap / bind).\n * @template T Input type\n * @template U Output type\n * @param result - The result to chain\n * @param fn - Function that returns a new Result\n * @returns Chained result\n *\n * @example\n * ```typescript\n * const userResult = await getUserById(id);\n * const postsResult = ErrorHandler.flatMapResult(\n * userResult,\n * user => getPostsByUserId(user.id)\n * );\n * ```\n */\n public static flatMapResult<T, U>(\n result: Result<T, McpError>,\n fn: (value: T) => Result<U, McpError>,\n ): Result<U, McpError> {\n if (result.ok) {\n return fn(result.value);\n }\n return result;\n }\n\n /**\n * Provides a fallback value if Result is an error.\n * @template T Value type\n * @param result - The result to recover from\n * @param fallback - Fallback value or function\n * @returns T value (either success value or fallback)\n *\n * @example\n * ```typescript\n * const user = ErrorHandler.recoverResult(\n * userResult,\n * { id: 'guest', name: 'Guest User' }\n * );\n * ```\n */\n public static recoverResult<T>(\n result: Result<T, McpError>,\n fallback: T | ((error: McpError) => T),\n ): T {\n if (result.ok) {\n return result.value;\n }\n return typeof fallback === 'function'\n ? (fallback as (error: McpError) => T)(result.error)\n : fallback;\n }\n\n /**\n * Adds a breadcrumb to the error context for tracking execution path.\n * @param context - The request context to add breadcrumb to\n * @param operation - Operation name\n * @param additionalData - Optional additional context\n * @returns Updated context with breadcrumb\n *\n * @example\n * ```typescript\n * let context = requestContextService.createRequestContext({ operation: 'initial' });\n * context = ErrorHandler.addBreadcrumb(context as EnhancedErrorContext, 'step1');\n * context = ErrorHandler.addBreadcrumb(context, 'step2', { userId: '123' });\n * ```\n */\n public static addBreadcrumb(\n context: EnhancedErrorContext,\n operation: string,\n additionalData?: Record<string, unknown>,\n ): EnhancedErrorContext {\n const breadcrumbs = context.metadata?.breadcrumbs || [];\n\n breadcrumbs.push({\n timestamp: new Date().toISOString(),\n operation,\n // Only include context if it exists (exact optional property types)\n ...(additionalData !== undefined ? { context: additionalData } : {}),\n });\n\n return {\n ...context,\n metadata: {\n ...context.metadata,\n breadcrumbs,\n },\n };\n }\n\n /**\n * Executes a function with automatic retry logic and exponential backoff.\n * Implements resilience patterns for distributed systems.\n * @template T Return type\n * @param fn - Function to execute\n * @param options - Error handling options\n * @param strategy - Retry strategy configuration\n * @returns Promise resolving to result or throwing after exhausting retries\n *\n * @example\n * ```typescript\n * const strategy = ErrorHandler.createExponentialBackoffStrategy(3);\n * const result = await ErrorHandler.tryCatchWithRetry(\n * () => fetchFromUnreliableAPI(),\n * { operation: 'fetchAPI', context },\n * strategy\n * );\n * ```\n */\n public static async tryCatchWithRetry<T>(\n fn: () => Promise<T> | T,\n options: Omit<ErrorHandlerOptions, 'rethrow'>,\n strategy: ErrorRecoveryStrategy,\n ): Promise<T> {\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= strategy.maxAttempts; attempt++) {\n try {\n return await Promise.resolve(fn());\n } catch (caughtError) {\n lastError =\n caughtError instanceof Error\n ? caughtError\n : new Error(String(caughtError));\n\n if (\n attempt < strategy.maxAttempts &&\n strategy.shouldRetry(lastError, attempt)\n ) {\n const delay = strategy.getRetryDelay(attempt);\n\n const retryContext: RequestContext = {\n ...options.context,\n requestId: (options.context?.requestId as string) || generateUUID(),\n timestamp: new Date().toISOString(),\n operation: options.operation,\n error: lastError.message,\n attempt,\n };\n\n logger.warning(\n `Retry attempt ${attempt}/${strategy.maxAttempts} after ${delay}ms`,\n retryContext,\n );\n\n strategy.onRetry?.(lastError, attempt);\n\n // Wait before retry\n await new Promise((resolve) => setTimeout(resolve, delay));\n } else {\n // Max attempts reached or error not retryable\n throw ErrorHandler.handleError(lastError, {\n ...options,\n rethrow: true,\n context: {\n ...options.context,\n retryAttempts: attempt,\n finalAttempt: true,\n },\n });\n }\n }\n }\n\n // Should never reach here, but TypeScript requires it\n throw ErrorHandler.handleError(lastError!, {\n ...options,\n rethrow: true,\n });\n }\n\n /**\n * Creates a default exponential backoff retry strategy.\n * @param maxAttempts - Maximum retry attempts (default: 3)\n * @param baseDelay - Base delay in ms (default: 1000)\n * @param maxDelay - Maximum delay in ms (default: 30000)\n * @returns ErrorRecoveryStrategy\n *\n * @example\n * ```typescript\n * const strategy = ErrorHandler.createExponentialBackoffStrategy(5, 500, 10000);\n * ```\n */\n public static createExponentialBackoffStrategy(\n maxAttempts = 3,\n baseDelay = 1000,\n maxDelay = 30000,\n ): ErrorRecoveryStrategy {\n return {\n maxAttempts,\n shouldRetry: (error: Error) => {\n // Don't retry on validation errors or unauthorized\n if (error instanceof McpError) {\n const nonRetryableCodes = [\n JsonRpcErrorCode.ValidationError,\n JsonRpcErrorCode.Unauthorized,\n JsonRpcErrorCode.Forbidden,\n JsonRpcErrorCode.NotFound,\n ];\n return !nonRetryableCodes.includes(error.code);\n }\n return true;\n },\n getRetryDelay: (attemptNumber: number) => {\n // Exponential backoff: baseDelay * 2^(attempt - 1) with jitter\n const exponentialDelay = baseDelay * Math.pow(2, attemptNumber - 1);\n const jitter = Math.random() * 0.3 * exponentialDelay; // 30% jitter\n return Math.min(exponentialDelay + jitter, maxDelay);\n },\n };\n }\n}\n","/**\n * @fileoverview Defines local OpenTelemetry semantic convention constants to ensure\n * stability and avoid dependency conflicts with different versions of\n * `@opentelemetry/semantic-conventions`.\n *\n * This module provides both standard OTEL conventions (aligned with 1.37+) and\n * custom MCP-specific attributes for tool execution and resource monitoring.\n *\n * @module src/utils/telemetry/semconv\n */\n\n// ============================================================================\n// Standard OpenTelemetry Semantic Conventions (Stable)\n// ============================================================================\n\n/**\n * Service attributes for identifying the application.\n * @see https://opentelemetry.io/docs/specs/semconv/resource/#service\n */\nexport const ATTR_SERVICE_NAME = 'service.name';\nexport const ATTR_SERVICE_VERSION = 'service.version';\nexport const ATTR_SERVICE_INSTANCE_ID = 'service.instance.id';\n\n/**\n * Deployment environment attributes.\n * @see https://opentelemetry.io/docs/specs/semconv/resource/deployment-environment/\n */\nexport const ATTR_DEPLOYMENT_ENVIRONMENT_NAME = 'deployment.environment.name';\n\n/**\n * Cloud provider and platform attributes.\n * @see https://opentelemetry.io/docs/specs/semconv/resource/cloud/\n */\nexport const ATTR_CLOUD_PROVIDER = 'cloud.provider';\nexport const ATTR_CLOUD_PLATFORM = 'cloud.platform';\nexport const ATTR_CLOUD_REGION = 'cloud.region';\nexport const ATTR_CLOUD_AVAILABILITY_ZONE = 'cloud.availability_zone';\nexport const ATTR_CLOUD_ACCOUNT_ID = 'cloud.account.id';\n\n/**\n * HTTP request and response attributes.\n * @see https://opentelemetry.io/docs/specs/semconv/http/\n */\nexport const ATTR_HTTP_REQUEST_METHOD = 'http.request.method';\nexport const ATTR_HTTP_RESPONSE_STATUS_CODE = 'http.response.status_code';\nexport const ATTR_HTTP_ROUTE = 'http.route';\nexport const ATTR_HTTP_REQUEST_BODY_SIZE = 'http.request.body.size';\nexport const ATTR_HTTP_RESPONSE_BODY_SIZE = 'http.response.body.size';\nexport const ATTR_URL_FULL = 'url.full';\nexport const ATTR_URL_PATH = 'url.path';\nexport const ATTR_URL_QUERY = 'url.query';\nexport const ATTR_URL_SCHEME = 'url.scheme';\n\n/**\n * Error and exception attributes.\n * @see https://opentelemetry.io/docs/specs/semconv/exceptions/\n */\nexport const ATTR_ERROR_TYPE = 'error.type';\nexport const ATTR_EXCEPTION_TYPE = 'exception.type';\nexport const ATTR_EXCEPTION_MESSAGE = 'exception.message';\nexport const ATTR_EXCEPTION_STACKTRACE = 'exception.stacktrace';\n\n/**\n * Code execution attributes (for custom spans).\n * @see https://opentelemetry.io/docs/specs/semconv/general/attributes/\n */\nexport const ATTR_CODE_FUNCTION = 'code.function';\nexport const ATTR_CODE_NAMESPACE = 'code.namespace';\nexport const ATTR_CODE_FILEPATH = 'code.filepath';\nexport const ATTR_CODE_LINENO = 'code.lineno';\n\n/**\n * Network attributes.\n * @see https://opentelemetry.io/docs/specs/semconv/general/attributes/\n */\nexport const ATTR_NETWORK_PEER_ADDRESS = 'network.peer.address';\nexport const ATTR_NETWORK_PEER_PORT = 'network.peer.port';\nexport const ATTR_NETWORK_PROTOCOL_NAME = 'network.protocol.name';\nexport const ATTR_NETWORK_PROTOCOL_VERSION = 'network.protocol.version';\n\n/**\n * User agent attributes.\n */\nexport const ATTR_USER_AGENT_ORIGINAL = 'user_agent.original';\n\n// ============================================================================\n// Custom MCP Tool Execution Attributes\n// ============================================================================\n\n/**\n * MCP tool execution metrics and performance attributes.\n * These are custom attributes specific to MCP tool invocations.\n */\nexport const ATTR_MCP_TOOL_NAME = 'mcp.tool.name';\nexport const ATTR_MCP_TOOL_INPUT_BYTES = 'mcp.tool.input_bytes';\nexport const ATTR_MCP_TOOL_OUTPUT_BYTES = 'mcp.tool.output_bytes';\nexport const ATTR_MCP_TOOL_DURATION_MS = 'mcp.tool.duration_ms';\nexport const ATTR_MCP_TOOL_SUCCESS = 'mcp.tool.success';\nexport const ATTR_MCP_TOOL_ERROR_CODE = 'mcp.tool.error_code';\n\n/**\n * MCP tool memory usage tracking (RSS - Resident Set Size).\n */\nexport const ATTR_MCP_TOOL_MEMORY_RSS_BEFORE =\n 'mcp.tool.memory_rss_bytes.before';\nexport const ATTR_MCP_TOOL_MEMORY_RSS_AFTER = 'mcp.tool.memory_rss_bytes.after';\nexport const ATTR_MCP_TOOL_MEMORY_RSS_DELTA = 'mcp.tool.memory_rss_bytes.delta';\n\n/**\n * MCP tool memory usage tracking (Heap Used).\n */\nexport const ATTR_MCP_TOOL_MEMORY_HEAP_USED_BEFORE =\n 'mcp.tool.memory_heap_used_bytes.before';\nexport const ATTR_MCP_TOOL_MEMORY_HEAP_USED_AFTER =\n 'mcp.tool.memory_heap_used_bytes.after';\nexport const ATTR_MCP_TOOL_MEMORY_HEAP_USED_DELTA =\n 'mcp.tool.memory_heap_used_bytes.delta';\n\n// ============================================================================\n// Custom MCP Resource Attributes\n// ============================================================================\n\n/**\n * MCP resource execution attributes.\n */\nexport const ATTR_MCP_RESOURCE_URI = 'mcp.resource.uri';\nexport const ATTR_MCP_RESOURCE_MIME_TYPE = 'mcp.resource.mime_type';\nexport const ATTR_MCP_RESOURCE_SIZE_BYTES = 'mcp.resource.size_bytes';\n\n// ============================================================================\n// Custom MCP Request Context Attributes\n// ============================================================================\n\n/**\n * MCP request and operation context attributes.\n */\nexport const ATTR_MCP_REQUEST_ID = 'mcp.request.id';\nexport const ATTR_MCP_OPERATION_NAME = 'mcp.operation.name';\nexport const ATTR_MCP_TENANT_ID = 'mcp.tenant.id';\nexport const ATTR_MCP_CLIENT_ID = 'mcp.client.id';\nexport const ATTR_MCP_SESSION_ID = 'mcp.session.id';\n","/**\n * @fileoverview Performance utility for tool execution with modern observability.\n * Wraps tool logic to measure duration, payload sizes, and memory usage, and\n * records results to OpenTelemetry plus structured logs. No manual spans beyond\n * the single wrapper span here per project guidelines.\n * @module src/utils/internal/performance\n */\nimport { SpanStatusCode, trace } from '@opentelemetry/api';\nimport type { performance as PerfHooksPerformance } from 'perf_hooks';\n\nimport { config } from '@/config/index.js';\nimport { McpError } from '@/types-global/errors.js';\nimport {\n ATTR_CODE_FUNCTION,\n ATTR_CODE_NAMESPACE,\n ATTR_MCP_TOOL_DURATION_MS,\n ATTR_MCP_TOOL_ERROR_CODE,\n ATTR_MCP_TOOL_INPUT_BYTES,\n ATTR_MCP_TOOL_MEMORY_HEAP_USED_AFTER,\n ATTR_MCP_TOOL_MEMORY_HEAP_USED_BEFORE,\n ATTR_MCP_TOOL_MEMORY_HEAP_USED_DELTA,\n ATTR_MCP_TOOL_MEMORY_RSS_AFTER,\n ATTR_MCP_TOOL_MEMORY_RSS_BEFORE,\n ATTR_MCP_TOOL_MEMORY_RSS_DELTA,\n ATTR_MCP_TOOL_OUTPUT_BYTES,\n ATTR_MCP_TOOL_SUCCESS,\n} from '@/utils/telemetry/semconv.js';\nimport { logger } from '@/utils/internal/logger.js';\nimport type { RequestContext } from '@/utils/internal/requestContext.js';\n\n// Environment-aware high-resolution timer\nlet performanceNow: () => number = () => Date.now(); // Fallback\n\n/**\n * Initializes the high-resolution timer based on the environment.\n * In a browser-like environment, it uses `globalThis.performance`.\n * In Node.js, it dynamically imports `perf_hooks`.\n */\n/**\n * Dynamically loads Node's perf_hooks module. Exposed for testing to allow\n * mocking the dynamic import path.\n *\n * @returns The Node.js perf_hooks performance interface promise.\n */\nexport async function loadPerfHooks(): Promise<{\n performance: typeof PerfHooksPerformance;\n}> {\n return import('perf_hooks') as Promise<{\n performance: typeof PerfHooksPerformance;\n }>;\n}\n\nexport async function initializePerformance_Hrt(): Promise<void> {\n // Use a type assertion to safely access `performance` on `globalThis`,\n // which is present in browser-like environments (e.g., Cloudflare Workers)\n // but not in Node.js's default global type.\n const globalWithPerf = globalThis as {\n performance?: { now: () => number };\n };\n\n if (typeof globalWithPerf.performance?.now === 'function') {\n const perf = globalWithPerf.performance;\n performanceNow = () => perf?.now() ?? Date.now();\n } else {\n try {\n const { performance: nodePerformance } = await loadPerfHooks();\n performanceNow = () => nodePerformance.now();\n } catch (_e) {\n performanceNow = () => Date.now();\n logger.warning(\n 'Could not import perf_hooks, falling back to Date.now() for performance timing.',\n );\n }\n }\n}\n\nexport const nowMs = (): number => performanceNow();\n\nconst toBytes = (payload: unknown): number => {\n if (payload == null) return 0;\n try {\n const json = JSON.stringify(payload);\n // Prefer Buffer when available (Node), otherwise TextEncoder (Web/Workers)\n if (\n typeof Buffer !== 'undefined' &&\n typeof Buffer.byteLength === 'function'\n ) {\n const bytes = Buffer.byteLength(json, 'utf8');\n return bytes;\n }\n if (typeof TextEncoder !== 'undefined') {\n return new TextEncoder().encode(json).length;\n }\n return json.length;\n } catch {\n return 0;\n }\n};\n\nexport async function measureToolExecution<T>(\n toolLogicFn: () => Promise<T>,\n context: RequestContext & { toolName: string },\n inputPayload: unknown,\n): Promise<T> {\n const tracer = trace.getTracer(\n config.openTelemetry.serviceName,\n config.openTelemetry.serviceVersion,\n );\n\n const { toolName } = context;\n\n return tracer.startActiveSpan(\n `tool_execution:${toolName}` as const,\n async (span) => {\n // Pre-capture lightweight metrics\n const memBefore =\n typeof process !== 'undefined' &&\n typeof process.memoryUsage === 'function'\n ? process.memoryUsage()\n : ({\n rss: 0,\n heapUsed: 0,\n heapTotal: 0,\n external: 0,\n arrayBuffers: 0,\n } satisfies NodeJS.MemoryUsage);\n const t0 = nowMs();\n\n span.setAttributes({\n [ATTR_CODE_FUNCTION]: toolName,\n [ATTR_CODE_NAMESPACE]: 'mcp-tools',\n [ATTR_MCP_TOOL_INPUT_BYTES]: toBytes(inputPayload),\n [ATTR_MCP_TOOL_MEMORY_RSS_BEFORE]: memBefore.rss,\n [ATTR_MCP_TOOL_MEMORY_HEAP_USED_BEFORE]: memBefore.heapUsed,\n });\n\n let ok = false;\n let errorCode: string | undefined;\n let output: T | undefined;\n\n try {\n const result = await toolLogicFn();\n ok = true;\n output = result;\n span.setStatus({ code: SpanStatusCode.OK });\n span.setAttribute(ATTR_MCP_TOOL_OUTPUT_BYTES, toBytes(output));\n return result;\n } catch (err) {\n if (err instanceof McpError) errorCode = String(err.code);\n else if (err instanceof Error) errorCode = 'UNHANDLED_ERROR';\n else errorCode = 'UNKNOWN_ERROR';\n\n if (err instanceof Error) span.recordException(err);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: err instanceof Error ? err.message : String(err),\n });\n throw err;\n } finally {\n const t1 = nowMs();\n const durationMs = Number((t1 - t0).toFixed(2));\n const memAfter =\n typeof process !== 'undefined' &&\n typeof process.memoryUsage === 'function'\n ? process.memoryUsage()\n : ({\n rss: 0,\n heapUsed: 0,\n heapTotal: 0,\n external: 0,\n arrayBuffers: 0,\n } satisfies NodeJS.MemoryUsage);\n\n const rssDelta = memAfter.rss - memBefore.rss;\n const heapUsedDelta = memAfter.heapUsed - memBefore.heapUsed;\n\n span.setAttributes({\n [ATTR_MCP_TOOL_DURATION_MS]: durationMs,\n [ATTR_MCP_TOOL_SUCCESS]: ok,\n [ATTR_MCP_TOOL_MEMORY_RSS_AFTER]: memAfter.rss,\n [ATTR_MCP_TOOL_MEMORY_HEAP_USED_AFTER]: memAfter.heapUsed,\n [ATTR_MCP_TOOL_MEMORY_RSS_DELTA]: rssDelta,\n [ATTR_MCP_TOOL_MEMORY_HEAP_USED_DELTA]: heapUsedDelta,\n });\n if (errorCode) span.setAttribute(ATTR_MCP_TOOL_ERROR_CODE, errorCode);\n span.end();\n\n logger.info('Tool execution finished.', {\n ...context,\n metrics: {\n durationMs,\n isSuccess: ok,\n errorCode,\n inputBytes: toBytes(inputPayload),\n outputBytes: toBytes(output),\n memory: {\n rss: {\n before: memBefore.rss,\n after: memAfter.rss,\n delta: rssDelta,\n },\n heapUsed: {\n before: memBefore.heapUsed,\n after: memAfter.heapUsed,\n delta: heapUsedDelta,\n },\n },\n },\n });\n }\n },\n );\n}\n","/**\n * @fileoverview Utility for displaying startup banners in TTY environments.\n * Provides a centralized way to show user-facing messages during server initialization\n * while preventing output pollution in non-interactive environments (CI, pipes, STDIO transport).\n * @module src/utils/internal/startupBanner\n */\n\n/**\n * Displays a startup banner message to the console only if running in a TTY environment.\n * This prevents polluting STDIO transport, piped output, or CI/CD logs.\n *\n * In STDIO mode, the banner is written to stderr to avoid polluting stdout, which is\n * reserved for MCP JSON-RPC protocol messages.\n *\n * @param message - The banner message to display\n * @param transportType - The transport type ('stdio' or 'http'). If 'stdio', uses stderr.\n * @example\n * ```typescript\n * logStartupBanner('🚀 MCP Server running at: http://localhost:3010', 'http');\n * logStartupBanner('🚀 MCP Server running in STDIO mode', 'stdio');\n * ```\n */\nexport function logStartupBanner(\n message: string,\n transportType?: 'stdio' | 'http',\n): void {\n if (process.stdout.isTTY) {\n // In STDIO mode, use stderr to avoid polluting stdout (which is reserved for MCP JSON-RPC)\n if (transportType === 'stdio') {\n console.error(message);\n } else {\n console.log(message);\n }\n }\n}\n","/**\n * @fileoverview Provides a utility class `IdGenerator` for creating customizable, prefixed unique identifiers,\n * and a standalone `generateUUID` function for generating standard UUIDs.\n * The `IdGenerator` supports entity-specific prefixes, custom character sets, and lengths.\n *\n * Note: Logging has been removed from this module to prevent circular dependencies\n * with the `requestContextService`, which itself uses `generateUUID` from this module.\n * This was causing `ReferenceError: Cannot access 'generateUUID' before initialization`\n * during application startup.\n * @module src/utils/security/idGenerator\n */\nimport { randomUUID as cryptoRandomUUID, randomBytes } from 'crypto';\n\nimport { JsonRpcErrorCode, McpError } from '@/types-global/errors.js';\n\n// Removed: import { logger, requestContextService } from \"../index.js\";\n\n/**\n * Defines the structure for configuring entity prefixes.\n * Keys are entity type names (e.g., \"project\", \"task\"), and values are their corresponding ID prefixes (e.g., \"PROJ\", \"TASK\").\n */\nexport interface EntityPrefixConfig {\n [key: string]: string;\n}\n\n/**\n * Defines options for customizing ID generation.\n */\nexport interface IdGenerationOptions {\n length?: number;\n separator?: string;\n charset?: string;\n}\n\n/**\n * A generic ID Generator class for creating and managing unique, prefixed identifiers.\n * Allows defining custom prefixes, generating random strings, and validating/normalizing IDs.\n */\nexport class IdGenerator {\n /**\n * Default character set for the random part of the ID.\n * @private\n */\n private static DEFAULT_CHARSET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n /**\n * Default separator character between prefix and random part.\n * @private\n */\n private static DEFAULT_SEPARATOR = '_';\n /**\n * Default length for the random part of the ID.\n * @private\n */\n private static DEFAULT_LENGTH = 6;\n\n /**\n * Stores the mapping of entity types to their prefixes.\n * @private\n */\n private entityPrefixes: EntityPrefixConfig = {};\n /**\n * Stores a reverse mapping from prefixes (case-insensitive) to entity types.\n * @private\n */\n private prefixToEntityType: Record<string, string> = {};\n\n /**\n * Constructs an `IdGenerator` instance.\n * @param entityPrefixes - An initial map of entity types to their prefixes.\n */\n constructor(entityPrefixes: EntityPrefixConfig = {}) {\n // Logging removed to prevent circular dependency with requestContextService.\n this.setEntityPrefixes(entityPrefixes);\n }\n\n /**\n * Sets or updates the entity prefix configuration and rebuilds the internal reverse lookup map.\n * @param entityPrefixes - A map where keys are entity type names and values are their desired ID prefixes.\n */\n public setEntityPrefixes(entityPrefixes: EntityPrefixConfig): void {\n // Logging removed.\n this.entityPrefixes = { ...entityPrefixes };\n\n this.prefixToEntityType = Object.entries(this.entityPrefixes).reduce(\n (acc, [type, prefix]) => {\n acc[prefix.toLowerCase()] = type; // Store lowercase for case-insensitive lookup\n return acc;\n },\n {} as Record<string, string>,\n );\n }\n\n /**\n * Retrieves a copy of the current entity prefix configuration.\n * @returns The current entity prefix configuration.\n */\n public getEntityPrefixes(): EntityPrefixConfig {\n return { ...this.entityPrefixes };\n }\n\n /**\n * Generates a cryptographically secure random string.\n * @param length - The desired length of the random string. Defaults to `IdGenerator.DEFAULT_LENGTH`.\n * @param charset - The character set to use. Defaults to `IdGenerator.DEFAULT_CHARSET`.\n * @returns The generated random string.\n */\n public generateRandomString(\n length: number = IdGenerator.DEFAULT_LENGTH,\n charset: string = IdGenerator.DEFAULT_CHARSET,\n ): string {\n let result = '';\n // Determine the largest multiple of charset.length that is less than or equal to 256\n // This is the threshold for rejection sampling to avoid bias.\n const maxValidByteValue = Math.floor(256 / charset.length) * charset.length;\n\n while (result.length < length) {\n const byteBuffer = randomBytes(1); // Get one random byte\n const byte = byteBuffer[0];\n\n // If the byte is within the valid range (i.e., it won't introduce bias),\n // use it to select a character from the charset. Otherwise, discard and try again.\n if (byte !== undefined && byte < maxValidByteValue) {\n const charIndex = byte % charset.length;\n const char = charset[charIndex];\n if (char) {\n result += char;\n }\n }\n }\n return result;\n }\n\n /**\n * Generates a unique ID, optionally prepended with a prefix.\n * @param prefix - An optional prefix for the ID.\n * @param options - Optional parameters for ID generation (length, separator, charset).\n * @returns A unique identifier string.\n */\n public generate(prefix?: string, options: IdGenerationOptions = {}): string {\n // Logging removed.\n const {\n length = IdGenerator.DEFAULT_LENGTH,\n separator = IdGenerator.DEFAULT_SEPARATOR,\n charset = IdGenerator.DEFAULT_CHARSET,\n } = options;\n\n const randomPart = this.generateRandomString(length, charset);\n const generatedId = prefix\n ? `${prefix}${separator}${randomPart}`\n : randomPart;\n return generatedId;\n }\n\n /**\n * Generates a unique ID for a specified entity type, using its configured prefix.\n * @param entityType - The type of entity (must be registered).\n * @param options - Optional parameters for ID generation.\n * @returns A unique identifier string for the entity (e.g., \"PROJ_A6B3J0\").\n * @throws {McpError} If the `entityType` is not registered.\n */\n public generateForEntity(\n entityType: string,\n options: IdGenerationOptions = {},\n ): string {\n const prefix = this.entityPrefixes[entityType];\n if (!prefix) {\n throw new McpError(\n JsonRpcErrorCode.ValidationError,\n `Unknown entity type: ${entityType}. No prefix registered.`,\n );\n }\n return this.generate(prefix, options);\n }\n\n /**\n * Validates if an ID conforms to the expected format for a specific entity type.\n * @param id - The ID string to validate.\n * @param entityType - The expected entity type of the ID.\n * @param options - Optional parameters used during generation for validation consistency.\n * The `charset` from these options will be used for validation.\n * @returns `true` if the ID is valid, `false` otherwise.\n */\n public isValid(\n id: string,\n entityType: string,\n options: IdGenerationOptions = {},\n ): boolean {\n const prefix = this.entityPrefixes[entityType];\n const {\n length = IdGenerator.DEFAULT_LENGTH,\n separator = IdGenerator.DEFAULT_SEPARATOR,\n charset = IdGenerator.DEFAULT_CHARSET, // Use charset from options or default\n } = options;\n\n if (!prefix) {\n return false;\n }\n\n // Build regex character class from the charset\n // Escape characters that have special meaning inside a regex character class `[]`\n const escapedCharsetForClass = charset.replace(/[[\\]\\\\^-]/g, '\\\\$&');\n const charsetRegexPart = `[${escapedCharsetForClass}]`;\n\n const pattern = new RegExp(\n `^${this.escapeRegex(prefix)}${this.escapeRegex(separator)}${charsetRegexPart}{${length}}$`,\n );\n return pattern.test(id);\n }\n\n /**\n * Escapes special characters in a string for use in a regular expression.\n * @param str - The string to escape.\n * @returns The escaped string.\n * @private\n */\n private escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n\n /**\n * Strips the prefix and separator from an ID string.\n * @param id - The ID string (e.g., \"PROJ_A6B3J0\").\n * @param separator - The separator used in the ID. Defaults to `IdGenerator.DEFAULT_SEPARATOR`.\n * @returns The ID part without the prefix, or the original ID if separator not found.\n */\n public stripPrefix(\n id: string,\n separator: string = IdGenerator.DEFAULT_SEPARATOR,\n ): string {\n const parts = id.split(separator);\n return parts.length > 1 ? parts.slice(1).join(separator) : id; // Handle separators in random part\n }\n\n /**\n * Determines the entity type from an ID string by its prefix (case-insensitive).\n * @param id - The ID string (e.g., \"PROJ_A6B3J0\").\n * @param separator - The separator used in the ID. Defaults to `IdGenerator.DEFAULT_SEPARATOR`.\n * @returns The determined entity type.\n * @throws {McpError} If ID format is invalid or prefix is unknown.\n */\n public getEntityType(\n id: string,\n separator: string = IdGenerator.DEFAULT_SEPARATOR,\n ): string {\n const parts = id.split(separator);\n if (parts.length < 2 || !parts[0]) {\n throw new McpError(\n JsonRpcErrorCode.ValidationError,\n `Invalid ID format: ${id}. Expected format like: PREFIX${separator}RANDOMLPART`,\n );\n }\n\n const prefix = parts[0];\n const entityType = this.prefixToEntityType[prefix.toLowerCase()];\n\n if (!entityType) {\n throw new McpError(\n JsonRpcErrorCode.ValidationError,\n `Unknown entity type for prefix: ${prefix}`,\n );\n }\n return entityType;\n }\n\n /**\n * Normalizes an entity ID to ensure the prefix matches the registered case\n * and the random part is uppercase. Note: This assumes the charset characters\n * have a meaningful uppercase version if case-insensitivity is desired for the random part.\n * For default charset (A-Z0-9), this is fine. For custom charsets, behavior might vary.\n * @param id - The ID to normalize (e.g., \"proj_a6b3j0\").\n * @param separator - The separator used in the ID. Defaults to `IdGenerator.DEFAULT_SEPARATOR`.\n * @returns The normalized ID (e.g., \"PROJ_A6B3J0\").\n * @throws {McpError} If the entity type cannot be determined from the ID.\n */\n public normalize(\n id: string,\n separator: string = IdGenerator.DEFAULT_SEPARATOR,\n ): string {\n const entityType = this.getEntityType(id, separator);\n const registeredPrefix = this.entityPrefixes[entityType];\n const idParts = id.split(separator);\n const randomPart = idParts.slice(1).join(separator);\n\n // Consider if randomPart.toUpperCase() is always correct for custom charsets.\n // For now, maintaining existing behavior.\n return `${registeredPrefix}${separator}${randomPart.toUpperCase()}`;\n }\n}\n\n/**\n * Default singleton instance of the `IdGenerator`.\n * Initialize with `idGenerator.setEntityPrefixes({})` to configure.\n */\nexport const idGenerator = new IdGenerator();\n\n/**\n * Generates a standard Version 4 UUID (Universally Unique Identifier).\n * Uses the Node.js `crypto` module.\n * @returns A new UUID string.\n */\nexport const generateUUID = (): string => {\n return cryptoRandomUUID();\n};\n\n/**\n * Generates a unique 10-character alphanumeric ID with a hyphen in the middle (e.g., `ABCDE-FGHIJ`).\n * This function is specifically for request contexts to provide a shorter, more readable ID.\n * It contains its own random string generation logic to remain self-contained and avoid circular dependencies.\n * @returns A new unique ID string.\n */\nexport const generateRequestContextId = (): string => {\n /**\n * Generates a cryptographically secure random string of a given length from a given charset.\n * @param length The desired length of the string.\n * @param charset The characters to use for generation.\n * @returns The generated random string.\n */\n const generateSecureRandomString = (\n length: number,\n charset: string,\n ): string => {\n let result = '';\n const maxValidByteValue = Math.floor(256 / charset.length) * charset.length;\n\n while (result.length < length) {\n const byteBuffer = randomBytes(1);\n const byte = byteBuffer[0];\n\n if (byte !== undefined && byte < maxValidByteValue) {\n const charIndex = byte % charset.length;\n const char = charset[charIndex];\n if (char) {\n result += char;\n }\n }\n }\n return result;\n };\n\n const charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n const part1 = generateSecureRandomString(5, charset);\n const part2 = generateSecureRandomString(5, charset);\n return `${part1}-${part2}`;\n};\n","/**\n * @fileoverview Defines all dependency injection tokens for the application.\n * This file centralizes the Symbols used for registering and resolving dependencies\n * in the container, breaking circular reference issues.\n * @module src/container/tokens\n */\n\n// Use tokens for non-class dependencies or for multi-injection.\nexport const AppConfig = Symbol('AppConfig');\nexport const Logger = Symbol('Logger');\nexport const StorageService = Symbol('StorageService');\nexport const StorageProvider = Symbol('IStorageProvider');\nexport const ToolDefinitions = Symbol('ToolDefinitions');\nexport const ResourceDefinitions = Symbol('ResourceDefinitions');\nexport const CreateMcpServerInstance = Symbol('CreateMcpServerInstance');\nexport const RateLimiterService = Symbol('RateLimiterService');\nexport const TransportManagerToken = Symbol('TransportManager');\nexport const SupabaseAdminClient = Symbol('SupabaseAdminClient');\nexport const SurrealdbClient = Symbol('SurrealdbClient');\nexport const TaskManagerToken = Symbol('TaskManager');\n\n// Feishu service tokens\nexport const FeishuApiProviderToken = Symbol('FeishuApiProvider');\nexport const FeishuMarkdownProcessorToken = Symbol('FeishuMarkdownProcessor');\nexport const FeishuRateLimiterToken = Symbol('FeishuRateLimiter');\nexport const FeishuContentConverterToken = Symbol('FeishuContentConverter');\nexport const FeishuServiceToken = Symbol('FeishuService');\n","/**\n * @fileoverview Provides a generic `RateLimiter` class for implementing rate limiting logic.\n * It supports configurable time windows, request limits, and automatic cleanup of expired entries.\n * @module src/utils/security/rateLimiter\n */\nimport { trace } from '@opentelemetry/api';\nimport { inject, injectable } from 'tsyringe';\n\nimport { config as ConfigType } from '@/config/index.js';\nimport { AppConfig, Logger } from '@/container/tokens.js';\nimport { JsonRpcErrorCode, McpError } from '@/types-global/errors.js';\nimport {\n type RequestContext,\n logger as LoggerType,\n requestContextService,\n} from '@/utils/index.js';\n\n/**\n * Defines configuration options for the {@link RateLimiter}.\n */\nexport interface RateLimitConfig {\n /** Time window in milliseconds. */\n windowMs: number;\n /** Maximum number of requests allowed in the window. */\n maxRequests: number;\n /** Custom error message template. Can include `{waitTime}` placeholder. */\n errorMessage?: string;\n /** If true, skip rate limiting in development. */\n skipInDevelopment?: boolean;\n /** Optional function to generate a custom key for rate limiting. */\n keyGenerator?: (identifier: string, context?: RequestContext) => string;\n /** How often, in milliseconds, to clean up expired entries. */\n cleanupInterval?: number;\n /** Maximum number of tracked keys. When exceeded, oldest entries are evicted (LRU). Default: 10000 */\n maxTrackedKeys?: number;\n}\n\n/**\n * Represents an individual entry for tracking requests against a rate limit key.\n */\nexport interface RateLimitEntry {\n /** Current request count. */\n count: number;\n /** When the window resets (timestamp in milliseconds). */\n resetTime: number;\n /** Last access timestamp for LRU eviction. */\n lastAccess: number;\n}\n\n@injectable()\nexport class RateLimiter {\n private readonly limits: Map<string, RateLimitEntry>;\n private cleanupTimer: NodeJS.Timeout | null = null;\n private readonly effectiveConfig: RateLimitConfig;\n\n constructor(\n @inject(AppConfig) private config: typeof ConfigType,\n @inject(Logger) private logger: typeof LoggerType,\n ) {\n const defaultConfig: RateLimitConfig = {\n windowMs: 15 * 60 * 1000,\n maxRequests: 100,\n errorMessage:\n 'Rate limit exceeded. Please try again in {waitTime} seconds.',\n skipInDevelopment: false,\n cleanupInterval: 5 * 60 * 1000,\n maxTrackedKeys: 10000,\n };\n this.effectiveConfig = { ...defaultConfig };\n this.limits = new Map();\n this.startCleanupTimer();\n }\n\n /**\n * Evicts the least recently used entry from the limits Map.\n * This prevents unbounded memory growth in high-traffic scenarios.\n * @private\n */\n private evictLRUEntry(): void {\n if (this.limits.size === 0) return;\n\n let oldestKey: string | null = null;\n let oldestTime = Infinity;\n\n // Find the entry with the oldest lastAccess time\n for (const [key, entry] of this.limits.entries()) {\n if (entry.lastAccess < oldestTime) {\n oldestTime = entry.lastAccess;\n oldestKey = key;\n }\n }\n\n if (oldestKey) {\n this.limits.delete(oldestKey);\n const logContext = requestContextService.createRequestContext({\n operation: 'RateLimiter.evictLRUEntry',\n additionalContext: {\n evictedKey: oldestKey,\n remainingEntries: this.limits.size,\n },\n });\n this.logger.debug('Evicted LRU entry from rate limiter', logContext);\n }\n }\n\n private startCleanupTimer(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n }\n const interval = this.effectiveConfig.cleanupInterval;\n if (interval && interval > 0) {\n this.cleanupTimer = setInterval(() => {\n this.cleanupExpiredEntries();\n }, interval);\n if (this.cleanupTimer.unref) {\n this.cleanupTimer.unref();\n }\n }\n }\n\n private cleanupExpiredEntries(): void {\n const now = Date.now();\n let expiredCount = 0;\n for (const [key, entry] of this.limits.entries()) {\n if (now >= entry.resetTime) {\n this.limits.delete(key);\n expiredCount++;\n }\n }\n if (expiredCount > 0) {\n const logContext = requestContextService.createRequestContext({\n operation: 'RateLimiter.cleanupExpiredEntries',\n additionalContext: {\n cleanedCount: expiredCount,\n totalRemainingAfterClean: this.limits.size,\n },\n });\n this.logger.debug(\n `Cleaned up ${expiredCount} expired rate limit entries`,\n logContext,\n );\n }\n }\n\n public configure(config: Partial<RateLimitConfig>): void {\n Object.assign(this.effectiveConfig, config);\n if (config.cleanupInterval !== undefined) {\n this.startCleanupTimer();\n }\n }\n\n public getConfig(): RateLimitConfig {\n return { ...this.effectiveConfig };\n }\n\n public reset(): void {\n this.limits.clear();\n const logContext = requestContextService.createRequestContext({\n operation: 'RateLimiter.reset',\n });\n this.logger.debug('Rate limiter reset, all limits cleared', logContext);\n }\n\n public check(key: string, context?: RequestContext): void {\n const activeSpan = trace.getActiveSpan();\n activeSpan?.setAttribute('mcp.rate_limit.checked', true);\n\n if (\n this.effectiveConfig.skipInDevelopment &&\n this.config.environment === 'development'\n ) {\n activeSpan?.setAttribute('mcp.rate_limit.skipped', 'development');\n return;\n }\n\n const limitKey = this.effectiveConfig.keyGenerator\n ? this.effectiveConfig.keyGenerator(key, context)\n : key;\n activeSpan?.setAttribute('mcp.rate_limit.key', limitKey);\n\n const now = Date.now();\n let entry = this.limits.get(limitKey);\n\n if (!entry || now >= entry.resetTime) {\n // Check if we need to evict an entry before adding a new one\n const maxKeys = this.effectiveConfig.maxTrackedKeys || 10000;\n if (!entry && this.limits.size >= maxKeys) {\n this.evictLRUEntry();\n activeSpan?.addEvent('rate_limit_lru_eviction', {\n 'mcp.rate_limit.size_before_eviction': this.limits.size + 1,\n 'mcp.rate_limit.max_keys': maxKeys,\n });\n }\n\n entry = {\n count: 1,\n resetTime: now + this.effectiveConfig.windowMs,\n lastAccess: now,\n };\n this.limits.set(limitKey, entry);\n } else {\n entry.count++;\n entry.lastAccess = now; // Update LRU timestamp\n }\n\n const remaining = Math.max(\n 0,\n this.effectiveConfig.maxRequests - entry.count,\n );\n activeSpan?.setAttributes({\n 'mcp.rate_limit.limit': this.effectiveConfig.maxRequests,\n 'mcp.rate_limit.count': entry.count,\n 'mcp.rate_limit.remaining': remaining,\n 'mcp.rate_limit.tracked_keys': this.limits.size,\n });\n\n if (entry.count > this.effectiveConfig.maxRequests) {\n const waitTime = Math.ceil((entry.resetTime - now) / 1000);\n const errorMessage = (\n this.effectiveConfig.errorMessage ||\n 'Rate limit exceeded. Please try again in {waitTime} seconds.'\n ).replace('{waitTime}', waitTime.toString());\n\n activeSpan?.addEvent('rate_limit_exceeded', {\n 'mcp.rate_limit.wait_time_seconds': waitTime,\n });\n\n throw new McpError(JsonRpcErrorCode.RateLimited, errorMessage, {\n waitTimeSeconds: waitTime,\n key: limitKey,\n limit: this.effectiveConfig.maxRequests,\n windowMs: this.effectiveConfig.windowMs,\n });\n }\n }\n\n public getStatus(key: string): {\n current: number;\n limit: number;\n remaining: number;\n resetTime: number;\n } | null {\n const entry = this.limits.get(key);\n if (!entry) return null;\n return {\n current: entry.count,\n limit: this.effectiveConfig.maxRequests,\n remaining: Math.max(0, this.effectiveConfig.maxRequests - entry.count),\n resetTime: entry.resetTime,\n };\n }\n\n public dispose(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = null;\n }\n this.limits.clear();\n }\n}\n","/**\n * @fileoverview Markdown builder utility for creating well-structured, semantic markdown content\n * @module utils/formatting/markdownBuilder\n */\n\n/**\n * Utility class for building well-formatted markdown content with consistent structure.\n *\n * This builder provides a fluent API for creating markdown documents with proper\n * spacing, hierarchy, and semantic structure. It helps eliminate string concatenation\n * and ensures consistent formatting across all tool response formatters.\n *\n * @example\n * ```typescript\n * const md = new MarkdownBuilder()\n * .h1('Commit Created Successfully')\n * .keyValue('Commit Hash', 'abc123def')\n * .keyValue('Author', 'John Doe')\n * .section('Files Changed', () => {\n * md.list(['file1.ts', 'file2.ts']);\n * });\n *\n * const markdown = md.build();\n * ```\n */\nexport class MarkdownBuilder {\n private sections: string[] = [];\n\n /**\n * Add a level 1 heading.\n * @param text - The heading text\n * @param emoji - Optional emoji to prepend\n * @returns this builder for chaining\n */\n h1(text: string, emoji?: string): this {\n const prefix = emoji ? `${emoji} ` : '';\n this.sections.push(`# ${prefix}${text}\\n\\n`);\n return this;\n }\n\n /**\n * Add a level 2 heading.\n * @param text - The heading text\n * @param emoji - Optional emoji to prepend\n * @returns this builder for chaining\n */\n h2(text: string, emoji?: string): this {\n const prefix = emoji ? `${emoji} ` : '';\n this.sections.push(`## ${prefix}${text}\\n\\n`);\n return this;\n }\n\n /**\n * Add a level 3 heading.\n * @param text - The heading text\n * @param emoji - Optional emoji to prepend\n * @returns this builder for chaining\n */\n h3(text: string, emoji?: string): this {\n const prefix = emoji ? `${emoji} ` : '';\n this.sections.push(`### ${prefix}${text}\\n\\n`);\n return this;\n }\n\n /**\n * Add a level 4 heading.\n * @param text - The heading text\n * @returns this builder for chaining\n */\n h4(text: string): this {\n this.sections.push(`#### ${text}\\n\\n`);\n return this;\n }\n\n /**\n * Add a bold key-value pair on a single line.\n * @param key - The key (will be bolded)\n * @param value - The value\n * @returns this builder for chaining\n */\n keyValue(key: string, value: string | number | boolean | null): this {\n const displayValue = value === null ? 'null' : String(value);\n this.sections.push(`**${key}:** ${displayValue}\\n`);\n return this;\n }\n\n /**\n * Add a key-value pair without bolding (for less emphasis).\n * @param key - The key\n * @param value - The value\n * @returns this builder for chaining\n */\n keyValuePlain(key: string, value: string | number | boolean | null): this {\n const displayValue = value === null ? 'null' : String(value);\n this.sections.push(`${key}: ${displayValue}\\n`);\n return this;\n }\n\n /**\n * Add a bulleted or numbered list.\n * @param items - Array of items to list\n * @param ordered - If true, creates a numbered list\n * @returns this builder for chaining\n */\n list(items: string[], ordered = false): this {\n if (items.length === 0) return this;\n\n const marker = ordered ? (i: number) => `${i + 1}.` : () => '-';\n this.sections.push(\n items.map((item, i) => `${marker(i)} ${item}`).join('\\n') + '\\n\\n',\n );\n return this;\n }\n\n /**\n * Add a code block with optional language syntax highlighting.\n * @param content - The code content\n * @param language - Optional language identifier (e.g., 'typescript', 'diff', 'json')\n * @returns this builder for chaining\n */\n codeBlock(content: string, language = ''): this {\n this.sections.push(`\\`\\`\\`${language}\\n${content}\\n\\`\\`\\`\\n\\n`);\n return this;\n }\n\n /**\n * Add inline code (backticks).\n * @param code - The code text\n * @returns this builder for chaining\n */\n inlineCode(code: string): this {\n this.sections.push(`\\`${code}\\``);\n return this;\n }\n\n /**\n * Add a paragraph of text.\n * @param text - The paragraph content\n * @returns this builder for chaining\n */\n paragraph(text: string): this {\n this.sections.push(`${text}\\n\\n`);\n return this;\n }\n\n /**\n * Add a blockquote.\n * @param text - The quoted text\n * @returns this builder for chaining\n */\n blockquote(text: string): this {\n const lines = text.split('\\n');\n const quoted = lines.map((line) => `> ${line}`).join('\\n');\n this.sections.push(`${quoted}\\n\\n`);\n return this;\n }\n\n /**\n * Add a horizontal rule.\n * @returns this builder for chaining\n */\n hr(): this {\n this.sections.push('---\\n\\n');\n return this;\n }\n\n /**\n * Add a link.\n * @param text - The link text\n * @param url - The URL\n * @returns this builder for chaining\n */\n link(text: string, url: string): this {\n this.sections.push(`[${text}](${url})`);\n return this;\n }\n\n /**\n * Add a table from structured data.\n * @param headers - Array of column headers\n * @param rows - Array of rows, each row is an array of cell values\n * @returns this builder for chaining\n */\n table(headers: string[], rows: string[][]): this {\n if (headers.length === 0 || rows.length === 0) return this;\n\n // Header row\n this.sections.push(`| ${headers.join(' | ')} |\\n`);\n\n // Separator row\n this.sections.push(`| ${headers.map(() => '---').join(' | ')} |\\n`);\n\n // Data rows\n rows.forEach((row) => {\n this.sections.push(`| ${row.join(' | ')} |\\n`);\n });\n\n this.sections.push('\\n');\n return this;\n }\n\n /**\n * Add a section with a heading and callback for content.\n * This is useful for grouping related content.\n *\n * @example\n * ```typescript\n * md.section('Files Changed', () => {\n * md.list(['file1.ts', 'file2.ts']);\n * });\n * ```\n *\n * @param title - The section heading\n * @param levelOrContent - Heading level (2-4) or callback function\n * @param content - Callback function (if level is provided)\n * @returns this builder for chaining\n */\n section(\n title: string,\n levelOrContent: 2 | 3 | 4 | (() => void),\n content?: () => void,\n ): this {\n const level = typeof levelOrContent === 'function' ? 2 : levelOrContent;\n const callback =\n typeof levelOrContent === 'function' ? levelOrContent : content!;\n switch (level) {\n case 2:\n this.h2(title);\n break;\n case 3:\n this.h3(title);\n break;\n case 4:\n this.h4(title);\n break;\n }\n callback();\n return this;\n }\n\n /**\n * Add a collapsible details section (HTML details/summary).\n * Note: Not all markdown renderers support this.\n *\n * @param summary - The summary text (always visible)\n * @param details - The detailed content (collapsed by default)\n * @returns this builder for chaining\n */\n details(summary: string, details: string): this {\n this.sections.push(`<details>\\n<summary>${summary}</summary>\\n\\n`);\n this.sections.push(`${details}\\n\\n`);\n this.sections.push(`</details>\\n\\n`);\n return this;\n }\n\n /**\n * Add a status/alert box (GitHub/GitLab style).\n * Renders as a highlighted blockquote with an icon.\n *\n * Supported types:\n * - 'note': 📝 Neutral information\n * - 'tip': 💡 Helpful suggestions\n * - 'important': ❗ Critical information\n * - 'warning': ⚠️ Warning/caution\n * - 'caution': 🚨 Danger/destructive action\n *\n * @param type - Alert type\n * @param content - Alert content (can be multi-line)\n * @returns this builder for chaining\n *\n * @example\n * ```typescript\n * md.alert('warning', 'This operation cannot be undone!');\n * // Renders: > [!WARNING]\n * // > This operation cannot be undone!\n * ```\n */\n alert(\n type: 'note' | 'tip' | 'important' | 'warning' | 'caution',\n content: string,\n ): this {\n const typeUpper = type.toUpperCase();\n const lines = content.split('\\n');\n this.sections.push(`> [!${typeUpper}]\\n`);\n lines.forEach((line) => {\n this.sections.push(`> ${line}\\n`);\n });\n this.sections.push('\\n');\n return this;\n }\n\n /**\n * Add a task list with checkboxes (GitHub style).\n *\n * @param items - Array of tasks with checked status\n * @returns this builder for chaining\n *\n * @example\n * ```typescript\n * md.taskList([\n * { checked: true, text: 'Complete setup' },\n * { checked: false, text: 'Run tests' },\n * ]);\n * // Renders: - [x] Complete setup\n * // - [ ] Run tests\n * ```\n */\n taskList(items: Array<{ checked: boolean; text: string }>): this {\n if (items.length === 0) return this;\n\n this.sections.push(\n items\n .map((item) => `- [${item.checked ? 'x' : ' '}] ${item.text}`)\n .join('\\n') + '\\n\\n',\n );\n return this;\n }\n\n /**\n * Add an image with alt text and optional title.\n *\n * @param altText - Alternative text for the image\n * @param url - Image URL\n * @param title - Optional title (shown on hover)\n * @returns this builder for chaining\n *\n * @example\n * ```typescript\n * md.image('Architecture diagram', '/assets/diagram.png', 'System Architecture');\n * // Renders: ![Architecture diagram](/assets/diagram.png \"System Architecture\")\n * ```\n */\n image(altText: string, url: string, title?: string): this {\n const titlePart = title ? ` \"${title}\"` : '';\n this.sections.push(`![${altText}](${url}${titlePart})\\n\\n`);\n return this;\n }\n\n /**\n * Add strikethrough text.\n *\n * @param text - Text to strike through\n * @returns this builder for chaining\n *\n * @example\n * ```typescript\n * md.text('Price: ').strikethrough('$100').text(' $80');\n * // Renders: Price: ~~$100~~ $80\n * ```\n */\n strikethrough(text: string): this {\n this.sections.push(`~~${text}~~`);\n return this;\n }\n\n /**\n * Add a diff-style code block showing additions and deletions.\n * Useful for showing file changes, configuration updates, etc.\n *\n * @param changes - Object with optional additions, deletions, and context lines\n * @returns this builder for chaining\n *\n * @example\n * ```typescript\n * md.diff({\n * additions: ['const newFeature = true;'],\n * deletions: ['const oldFeature = false;'],\n * context: ['// Configuration'],\n * });\n * // Renders as a diff code block with +/- prefixes\n * ```\n */\n diff(changes: {\n additions?: string[];\n deletions?: string[];\n context?: string[];\n }): this {\n const lines: string[] = [];\n\n // Context lines (no prefix)\n if (changes.context) {\n lines.push(...changes.context.map((line) => ` ${line}`));\n }\n\n // Deletions (- prefix)\n if (changes.deletions) {\n lines.push(...changes.deletions.map((line) => `- ${line}`));\n }\n\n // Additions (+ prefix)\n if (changes.additions) {\n lines.push(...changes.additions.map((line) => `+ ${line}`));\n }\n\n if (lines.length > 0) {\n this.codeBlock(lines.join('\\n'), 'diff');\n }\n\n return this;\n }\n\n /**\n * Add a badge/shield (uses shields.io style).\n *\n * @param label - Badge label (left side)\n * @param message - Badge message (right side)\n * @param color - Optional color (e.g., 'green', 'red', 'blue', 'yellow')\n * @returns this builder for chaining\n *\n * @example\n * ```typescript\n * md.badge('build', 'passing', 'green');\n * // Renders: ![build: passing](https://img.shields.io/badge/build-passing-green)\n * ```\n */\n badge(label: string, message: string, color = 'blue'): this {\n const encodedLabel = encodeURIComponent(label);\n const encodedMessage = encodeURIComponent(message);\n const url = `https://img.shields.io/badge/${encodedLabel}-${encodedMessage}-${color}`;\n this.sections.push(`![${label}: ${message}](${url})`);\n return this;\n }\n\n /**\n * Add bold text.\n *\n * @param text - Text to make bold\n * @returns this builder for chaining\n *\n * @example\n * ```typescript\n * md.text('This is ').bold('important').text(' information.');\n * // Renders: This is **important** information.\n * ```\n */\n bold(text: string): this {\n this.sections.push(`**${text}**`);\n return this;\n }\n\n /**\n * Add italic text.\n *\n * @param text - Text to make italic\n * @returns this builder for chaining\n *\n * @example\n * ```typescript\n * md.text('This is ').italic('emphasized').text('.');\n * // Renders: This is *emphasized*.\n * ```\n */\n italic(text: string): this {\n this.sections.push(`*${text}*`);\n return this;\n }\n\n /**\n * Add bold and italic text.\n *\n * @param text - Text to make bold and italic\n * @returns this builder for chaining\n *\n * @example\n * ```typescript\n * md.boldItalic('Very important');\n * // Renders: ***Very important***\n * ```\n */\n boldItalic(text: string): this {\n this.sections.push(`***${text}***`);\n return this;\n }\n\n /**\n * Add raw markdown content directly.\n * Use this for custom formatting not covered by other methods.\n *\n * @param markdown - Raw markdown string\n * @returns this builder for chaining\n */\n raw(markdown: string): this {\n this.sections.push(markdown);\n return this;\n }\n\n /**\n * Add a blank line for spacing.\n * @returns this builder for chaining\n */\n blankLine(): this {\n this.sections.push('\\n');\n return this;\n }\n\n /**\n * Add text without any formatting or line breaks.\n * Useful for inline text that will be followed by other inline elements.\n *\n * @param text - The text to add\n * @returns this builder for chaining\n */\n text(text: string): this {\n this.sections.push(text);\n return this;\n }\n\n /**\n * Conditionally add content based on a predicate.\n *\n * @example\n * ```typescript\n * md.when(files.length > 0, () => {\n * md.h2('Files Changed').list(files);\n * });\n * ```\n *\n * @param condition - If true, execute the callback\n * @param content - Callback function to build conditional content\n * @returns this builder for chaining\n */\n when(condition: boolean, content: () => void): this {\n if (condition) {\n content();\n }\n return this;\n }\n\n /**\n * Build the final markdown string.\n * Trims trailing whitespace and ensures the document ends cleanly.\n *\n * @returns The complete markdown document as a string\n */\n build(): string {\n return this.sections.join('').trim();\n }\n\n /**\n * Reset the builder to start building a new document.\n * @returns this builder for chaining\n */\n reset(): this {\n this.sections = [];\n return this;\n }\n}\n\n/**\n * Helper function to create a MarkdownBuilder instance.\n * Provides a shorter alternative to `new MarkdownBuilder()`.\n *\n * @returns A new MarkdownBuilder instance\n */\nexport function markdown(): MarkdownBuilder {\n return new MarkdownBuilder();\n}\n","/**\n * @fileoverview Provides cross-platform encoding utilities.\n * @module src/utils/internal/encoding\n */\nimport { runtimeCaps } from './runtime.js';\n\n/**\n * Encodes an ArrayBuffer into a base64 string in a cross-platform manner.\n * Prefers Node.js Buffer for performance if available, otherwise uses a\n * standard web API fallback.\n *\n * @param buffer - The ArrayBuffer to encode.\n * @returns The base64-encoded string.\n */\nexport function arrayBufferToBase64(buffer: ArrayBuffer): string {\n if (runtimeCaps.hasBuffer) {\n // Node.js environment\n return Buffer.from(buffer).toString('base64');\n } else {\n // Browser/Worker environment\n let binary = '';\n const bytes = new Uint8Array(buffer);\n const len = bytes.byteLength;\n for (let i = 0; i < len; i++) {\n binary += String.fromCharCode(bytes[i]!);\n }\n return btoa(binary);\n }\n}\n\n/**\n * Encodes a string to base64 in a cross-platform manner.\n * Prefers Node.js Buffer for performance if available, otherwise uses\n * TextEncoder with Web APIs for compatibility with Cloudflare Workers.\n *\n * @param str - The string to encode.\n * @returns The base64-encoded string.\n */\nexport function stringToBase64(str: string): string {\n if (runtimeCaps.hasBuffer) {\n // Node.js environment - most performant\n return Buffer.from(str, 'utf-8').toString('base64');\n } else {\n // Worker/Browser environment - use Web APIs\n const encoder = new TextEncoder();\n const bytes = encoder.encode(str);\n // Create a new ArrayBuffer copy to ensure correct type\n const buffer = new ArrayBuffer(bytes.byteLength);\n new Uint8Array(buffer).set(bytes);\n return arrayBufferToBase64(buffer);\n }\n}\n\n/**\n * Decodes a base64 string to UTF-8 in a cross-platform manner.\n * Prefers Node.js Buffer for performance if available, otherwise uses\n * Web APIs (atob + TextDecoder) for compatibility with Cloudflare Workers.\n *\n * @param base64 - The base64 string to decode.\n * @returns The decoded UTF-8 string.\n * @throws {Error} If the input is not valid base64.\n */\nexport function base64ToString(base64: string): string {\n if (runtimeCaps.hasBuffer) {\n // Node.js environment - most performant\n return Buffer.from(base64, 'base64').toString('utf-8');\n } else {\n // Worker/Browser environment - use Web APIs\n const decoded = atob(base64);\n const decoder = new TextDecoder();\n const bytes = new Uint8Array(decoded.split('').map((c) => c.charCodeAt(0)));\n return decoder.decode(bytes);\n }\n}\n","/**\n * @fileoverview Input validation utilities for storage operations.\n *\n * This module provides centralized validation for all storage inputs to prevent:\n * - Path traversal attacks (via tenant ID, key, and prefix validation)\n * - Resource exhaustion (via length limits and pagination controls)\n * - Injection attacks (via character allowlists)\n * - Cross-tenant data access (via cursor validation with tenant binding)\n *\n * Security Model:\n * - Defense in depth: validation at service layer AND provider layer\n * - Fail closed: invalid input throws McpError, never coerced\n * - Audit trail: all validation failures logged with context\n * - Immutable: validation functions are pure (no side effects)\n *\n * All validation functions are synchronous and throw McpError on failure.\n * Callers should NOT catch validation errors - let them bubble to handlers.\n *\n * @module src/storage/core/storageValidation\n */\nimport { JsonRpcErrorCode, McpError } from '@/types-global/errors.js';\nimport type { RequestContext } from '@/utils/index.js';\nimport { stringToBase64, base64ToString } from '@/utils/internal/encoding.js';\nimport type { StorageOptions, ListOptions } from './IStorageProvider.js';\n\n/**\n * Maximum length for tenant IDs and keys to prevent abuse.\n * These constants are security-critical and must not be modified at runtime.\n *\n * Rationale:\n * - MAX_TENANT_ID_LENGTH (128): Accommodates UUIDs, org slugs, and email-based IDs\n * - MAX_KEY_LENGTH (1024): Balances between deep hierarchies and URL limits\n * - MAX_PREFIX_LENGTH (512): Half of key length, enough for namespace prefixes\n * - MAX_LIST_LIMIT (10000): Prevents memory exhaustion while allowing bulk operations\n */\nconst MAX_TENANT_ID_LENGTH = 128 as const;\nconst MAX_KEY_LENGTH = 1024 as const;\nconst MAX_PREFIX_LENGTH = 512 as const;\n\n/**\n * Maximum page size to prevent memory exhaustion attacks.\n */\nconst MAX_LIST_LIMIT = 10000 as const;\n\n/**\n * Pattern for valid tenant IDs (alphanumeric, hyphens, underscores, dots).\n * More restrictive than key pattern - no slashes allowed to prevent path traversal.\n * Single character: must be alphanumeric.\n * Multiple characters: must start and end with alphanumeric, middle can include ._-\n * @readonly\n */\nconst VALID_TENANT_ID_PATTERN =\n /^[a-zA-Z0-9]$|^[a-zA-Z0-9][a-zA-Z0-9._-]*[a-zA-Z0-9]$/;\n\n/**\n * Pattern for valid keys and prefixes (alphanumeric, hyphens, underscores, dots, slashes).\n * @readonly\n */\nconst VALID_KEY_PATTERN = /^[a-zA-Z0-9_.\\-/]+$/;\n\n/**\n * Validates a tenant ID for storage operations.\n *\n * Security constraints:\n * - Must be non-empty string\n * - Maximum length: 128 characters\n * - Allowed characters: alphanumeric, hyphens, underscores, dots\n * - Cannot contain slashes or path traversal sequences\n * - Cannot start or end with special characters\n *\n * @param tenantId The tenant ID to validate.\n * @param context The request context for error reporting.\n * @throws {McpError} JsonRpcErrorCode.InvalidParams - If tenant ID is not a string, empty, too long, contains invalid characters, or has path traversal sequences.\n */\nexport function validateTenantId(\n tenantId: string,\n context: RequestContext,\n): void {\n if (typeof tenantId !== 'string') {\n throw new McpError(\n JsonRpcErrorCode.InvalidParams,\n 'Tenant ID must be a string.',\n { ...context, tenantId },\n );\n }\n\n const trimmedTenantId = tenantId.trim();\n\n if (trimmedTenantId.length === 0) {\n throw new McpError(\n JsonRpcErrorCode.InvalidParams,\n 'Tenant ID cannot be an empty string.',\n { ...context, tenantId },\n );\n }\n\n if (trimmedTenantId.length > MAX_TENANT_ID_LENGTH) {\n throw new McpError(\n JsonRpcErrorCode.InvalidParams,\n `Tenant ID exceeds maximum length of ${MAX_TENANT_ID_LENGTH} characters.`,\n { ...context, tenantIdLength: trimmedTenantId.length },\n );\n }\n\n if (!VALID_TENANT_ID_PATTERN.test(trimmedTenantId)) {\n throw new McpError(\n JsonRpcErrorCode.InvalidParams,\n 'Tenant ID contains invalid characters. Only alphanumeric characters, hyphens, underscores, and dots are allowed. Must start and end with alphanumeric characters.',\n { ...context, tenantId: trimmedTenantId },\n );\n }\n\n if (trimmedTenantId.includes('..')) {\n throw new McpError(\n JsonRpcErrorCode.InvalidParams,\n 'Tenant ID contains consecutive dots, which are not allowed.',\n { ...context, tenantId: trimmedTenantId },\n );\n }\n\n if (trimmedTenantId.includes('../') || trimmedTenantId.includes('..\\\\')) {\n throw new McpError(\n JsonRpcErrorCode.InvalidParams,\n 'Tenant ID contains path traversal sequences, which are not allowed.',\n { ...context, tenantId: trimmedTenantId },\n );\n }\n}\n\n/**\n * Validates a storage key.\n * @param key The key to validate.\n * @param context The request context for error reporting.\n * @throws {McpError} JsonRpcErrorCode.ValidationError - If key is not a non-empty string, too long, contains invalid characters, or has path traversal sequences.\n */\nexport function validateKey(key: string, context: RequestContext): void {\n if (!key || typeof key !== 'string') {\n throw new McpError(\n JsonRpcErrorCode.ValidationError,\n 'Key must be a non-empty string.',\n { ...context, key },\n );\n }\n\n if (key.length > MAX_KEY_LENGTH) {\n throw new McpError(\n JsonRpcErrorCode.ValidationError,\n `Key exceeds maximum length of ${MAX_KEY_LENGTH} characters.`,\n { ...context, key: key.substring(0, 50) + '...' },\n );\n }\n\n if (!VALID_KEY_PATTERN.test(key)) {\n throw new McpError(\n JsonRpcErrorCode.ValidationError,\n 'Key contains invalid characters. Only alphanumeric, hyphens, underscores, dots, and slashes are allowed.',\n { ...context, key },\n );\n }\n\n if (key.includes('..')) {\n throw new McpError(\n JsonRpcErrorCode.ValidationError,\n 'Key must not contain \"..\" (path traversal attempt).',\n { ...context, key },\n );\n }\n}\n\n/**\n * Validates a prefix for list operations.\n *\n * Security constraints:\n * - Can be empty string (matches all keys within tenant)\n * - Maximum length: 512 characters\n * - No path traversal sequences allowed\n * - Only valid path characters allowed\n *\n * @param prefix The prefix to validate (empty string is valid).\n * @param context The request context for error reporting.\n * @throws {McpError} JsonRpcErrorCode.ValidationError - If prefix is not a string, too long, contains invalid characters, or has path traversal sequences.\n */\nexport function validatePrefix(prefix: string, context: RequestContext): void {\n if (typeof prefix !== 'string') {\n throw new McpError(\n JsonRpcErrorCode.ValidationError,\n 'Prefix must be a string.',\n { ...context, operation: 'validatePrefix', prefix },\n );\n }\n\n // Empty prefix is valid (matches all keys)\n if (prefix === '') {\n return;\n }\n\n if (prefix.length > MAX_PREFIX_LENGTH) {\n throw new McpError(\n JsonRpcErrorCode.ValidationError,\n `Prefix exceeds maximum length of ${MAX_PREFIX_LENGTH} characters.`,\n {\n ...context,\n operation: 'validatePrefix',\n prefix: prefix.substring(0, 50) + '...',\n },\n );\n }\n\n // Only validate pattern if non-empty\n if (!VALID_KEY_PATTERN.test(prefix)) {\n throw new McpError(\n JsonRpcErrorCode.ValidationError,\n 'Prefix contains invalid characters. Only alphanumeric, hyphens, underscores, dots, and slashes are allowed.',\n {\n ...context,\n operation: 'validatePrefix',\n prefix: prefix.length > 50 ? prefix.substring(0, 50) + '...' : prefix,\n },\n );\n }\n\n if (prefix.includes('..')) {\n throw new McpError(\n JsonRpcErrorCode.ValidationError,\n 'Prefix must not contain \"..\" (path traversal attempt).',\n { ...context, operation: 'validatePrefix', prefix },\n );\n }\n}\n\n/**\n * Validates storage options.\n * @param options The storage options to validate.\n * @param context The request context for error reporting.\n * @throws {McpError} JsonRpcErrorCode.ValidationError - If TTL is not a number, negative, or not finite.\n */\nexport function validateStorageOptions(\n options: StorageOptions | undefined,\n context: RequestContext,\n): void {\n if (!options) {\n return;\n }\n\n if (options.ttl !== undefined) {\n if (typeof options.ttl !== 'number') {\n throw new McpError(\n JsonRpcErrorCode.ValidationError,\n 'TTL must be a number (seconds).',\n { ...context, ttl: options.ttl },\n );\n }\n\n if (options.ttl < 0) {\n throw new McpError(\n JsonRpcErrorCode.ValidationError,\n 'TTL must be a non-negative number. Use 0 for immediate expiration.',\n { ...context, ttl: options.ttl },\n );\n }\n\n if (!Number.isFinite(options.ttl)) {\n throw new McpError(\n JsonRpcErrorCode.ValidationError,\n 'TTL must be a finite number.',\n { ...context, ttl: options.ttl },\n );\n }\n }\n}\n\n/**\n * Validates list operation options.\n *\n * Security constraints:\n * - Limit must be positive integer between 1 and 10000\n * - Cursor must be valid base64 string if provided\n * - Prevents memory exhaustion via oversized page requests\n *\n * @param options The list options to validate.\n * @param context The request context for error reporting.\n * @throws {McpError} If the options are invalid.\n */\nexport function validateListOptions(\n options: ListOptions | undefined,\n context: RequestContext,\n): void {\n if (!options) {\n return;\n }\n\n if (options.limit !== undefined) {\n if (typeof options.limit !== 'number') {\n throw new McpError(\n JsonRpcErrorCode.ValidationError,\n 'List limit must be a number.',\n { ...context, operation: 'validateListOptions', limit: options.limit },\n );\n }\n\n if (!Number.isInteger(options.limit)) {\n throw new McpError(\n JsonRpcErrorCode.ValidationError,\n 'List limit must be an integer.',\n { ...context, operation: 'validateListOptions', limit: options.limit },\n );\n }\n\n if (options.limit < 1) {\n throw new McpError(\n JsonRpcErrorCode.ValidationError,\n 'List limit must be at least 1.',\n { ...context, operation: 'validateListOptions', limit: options.limit },\n );\n }\n\n if (options.limit > MAX_LIST_LIMIT) {\n throw new McpError(\n JsonRpcErrorCode.ValidationError,\n `List limit exceeds maximum of ${MAX_LIST_LIMIT}.`,\n { ...context, operation: 'validateListOptions', limit: options.limit },\n );\n }\n\n if (!Number.isFinite(options.limit)) {\n throw new McpError(\n JsonRpcErrorCode.ValidationError,\n 'List limit must be a finite number.',\n { ...context, operation: 'validateListOptions', limit: options.limit },\n );\n }\n }\n\n if (options.cursor !== undefined) {\n if (typeof options.cursor !== 'string') {\n throw new McpError(\n JsonRpcErrorCode.ValidationError,\n 'Cursor must be a string.',\n { ...context, operation: 'validateListOptions' },\n );\n }\n\n if (options.cursor.trim() === '') {\n throw new McpError(\n JsonRpcErrorCode.ValidationError,\n 'Cursor must not be an empty string.',\n { ...context, operation: 'validateListOptions' },\n );\n }\n\n // Basic base64 validation (more thorough check happens in decodeCursor)\n if (!/^[A-Za-z0-9+/=]+$/.test(options.cursor)) {\n throw new McpError(\n JsonRpcErrorCode.ValidationError,\n 'Cursor contains invalid characters for base64.',\n { ...context, operation: 'validateListOptions' },\n );\n }\n }\n}\n\n/**\n * Cursor encoding/decoding utilities for pagination.\n * Cursors are opaque strings that should not be constructed or parsed by clients.\n */\n\ninterface CursorData {\n /** The last key from the previous page */\n k: string;\n /** The tenant ID for validation */\n t: string;\n}\n\n/**\n * Encodes pagination cursor data into an opaque string.\n * Uses runtime-agnostic base64 encoding for Worker compatibility.\n * @param lastKey The last key from the current page.\n * @param tenantId The tenant ID for validation.\n * @returns An opaque cursor string.\n */\nexport function encodeCursor(lastKey: string, tenantId: string): string {\n const data: CursorData = { k: lastKey, t: tenantId };\n return stringToBase64(JSON.stringify(data));\n}\n\n/**\n * Decodes and validates an opaque cursor string.\n * Uses runtime-agnostic base64 decoding for Worker compatibility.\n * @param cursor The cursor string to decode.\n * @param tenantId The expected tenant ID for validation.\n * @param context The request context for error reporting.\n * @returns The last key from the cursor.\n * @throws {McpError} If the cursor is invalid or tampered with.\n */\nexport function decodeCursor(\n cursor: string,\n tenantId: string,\n context: RequestContext,\n): string {\n try {\n const decoded = base64ToString(cursor);\n const data = JSON.parse(decoded) as CursorData;\n\n if (!data || typeof data !== 'object' || !('k' in data) || !('t' in data)) {\n throw new McpError(\n JsonRpcErrorCode.InvalidParams,\n 'Invalid cursor format.',\n { ...context, operation: 'decodeCursor' },\n );\n }\n\n if (data.t !== tenantId) {\n throw new McpError(\n JsonRpcErrorCode.InvalidParams,\n 'Cursor tenant ID mismatch. Cursor may have been tampered with.',\n { ...context, operation: 'decodeCursor' },\n );\n }\n\n return data.k;\n } catch (error: unknown) {\n if (error instanceof McpError) {\n throw error;\n }\n throw new McpError(\n JsonRpcErrorCode.InvalidParams,\n 'Failed to decode cursor. Cursor may be corrupted or invalid.',\n {\n ...context,\n operation: 'decodeCursor',\n rawError: error instanceof Error ? error.stack : String(error),\n },\n );\n }\n}\n","/**\n * @fileoverview Provides a singleton service for interacting with the application's storage layer.\n * This service acts as a proxy to the configured storage provider, ensuring a consistent\n * interface for all storage operations throughout the application. It receives its concrete\n * provider via dependency injection.\n * @module src/storage/core/StorageService\n */\nimport { injectable, inject } from 'tsyringe';\n\nimport { StorageProvider } from '@/container/tokens.js';\nimport { JsonRpcErrorCode, McpError } from '@/types-global/errors.js';\nimport { logger, type RequestContext } from '@/utils/index.js';\nimport type {\n IStorageProvider,\n StorageOptions,\n ListOptions,\n ListResult,\n} from '@/storage/core/IStorageProvider.js';\nimport {\n validateTenantId,\n validateKey,\n validatePrefix,\n validateStorageOptions,\n validateListOptions,\n} from '@/storage/core/storageValidation.js';\n\n/**\n * Validates and returns the tenant ID from the request context.\n *\n * This helper ensures the tenant ID is present in the context and passes\n * validation rules defined in {@link validateTenantId}. All StorageService\n * operations require a valid tenant ID for multi-tenancy isolation.\n *\n * @param context - The request context containing the tenant ID\n * @returns The validated tenant ID (trimmed of whitespace)\n * @throws {McpError} JsonRpcErrorCode.InternalError - If tenant ID is missing (undefined or null)\n * @throws {McpError} JsonRpcErrorCode.InvalidParams - If tenant ID fails validation (from validateTenantId)\n * @internal\n */\nfunction requireTenantId(context: RequestContext): string {\n const tenantId = context.tenantId;\n\n // Check if tenant ID is missing (undefined or null)\n if (tenantId === undefined || tenantId === null) {\n throw new McpError(\n JsonRpcErrorCode.InternalError,\n 'Tenant ID is required for storage operations but was not found in the request context.',\n {\n operation: context.operation || 'StorageService.requireTenantId',\n requestId: context.requestId,\n // Include call stack hint for debugging\n calledFrom: 'StorageService',\n },\n );\n }\n\n // Delegate validation to shared utility\n validateTenantId(tenantId, context);\n\n return tenantId.trim();\n}\n\n@injectable()\nexport class StorageService {\n constructor(@inject(StorageProvider) private provider: IStorageProvider) {\n // Note: Cannot use structured logging in constructor as we don't have RequestContext yet\n // This is logged when the service is first instantiated by the DI container\n }\n\n get<T>(key: string, context: RequestContext): Promise<T | null> {\n const tenantId = requireTenantId(context);\n validateKey(key, context);\n\n logger.debug('[StorageService] get operation', {\n ...context,\n operation: 'StorageService.get',\n tenantId,\n key,\n });\n\n return this.provider.get(tenantId, key, context);\n }\n\n set(\n key: string,\n value: unknown,\n context: RequestContext,\n options?: StorageOptions,\n ): Promise<void> {\n const tenantId = requireTenantId(context);\n validateKey(key, context);\n validateStorageOptions(options, context);\n\n logger.debug('[StorageService] set operation', {\n ...context,\n operation: 'StorageService.set',\n tenantId,\n key,\n hasTTL: options?.ttl !== undefined,\n ttl: options?.ttl,\n });\n\n return this.provider.set(tenantId, key, value, context, options);\n }\n\n delete(key: string, context: RequestContext): Promise<boolean> {\n const tenantId = requireTenantId(context);\n validateKey(key, context);\n\n logger.debug('[StorageService] delete operation', {\n ...context,\n operation: 'StorageService.delete',\n tenantId,\n key,\n });\n\n return this.provider.delete(tenantId, key, context);\n }\n\n list(\n prefix: string,\n context: RequestContext,\n options?: ListOptions,\n ): Promise<ListResult> {\n const tenantId = requireTenantId(context);\n validatePrefix(prefix, context);\n validateListOptions(options, context);\n\n logger.debug('[StorageService] list operation', {\n ...context,\n operation: 'StorageService.list',\n tenantId,\n prefix,\n limit: options?.limit,\n hasCursor: !!options?.cursor,\n });\n\n return this.provider.list(tenantId, prefix, context, options);\n }\n\n getMany<T>(keys: string[], context: RequestContext): Promise<Map<string, T>> {\n const tenantId = requireTenantId(context);\n // Validate all keys\n for (const key of keys) {\n validateKey(key, context);\n }\n\n logger.debug('[StorageService] getMany operation', {\n ...context,\n operation: 'StorageService.getMany',\n tenantId,\n keyCount: keys.length,\n });\n\n return this.provider.getMany(tenantId, keys, context);\n }\n\n setMany(\n entries: Map<string, unknown>,\n context: RequestContext,\n options?: StorageOptions,\n ): Promise<void> {\n const tenantId = requireTenantId(context);\n validateStorageOptions(options, context);\n // Validate all keys\n for (const key of entries.keys()) {\n validateKey(key, context);\n }\n\n logger.debug('[StorageService] setMany operation', {\n ...context,\n operation: 'StorageService.setMany',\n tenantId,\n entryCount: entries.size,\n hasTTL: options?.ttl !== undefined,\n ttl: options?.ttl,\n });\n\n return this.provider.setMany(tenantId, entries, context, options);\n }\n\n deleteMany(keys: string[], context: RequestContext): Promise<number> {\n const tenantId = requireTenantId(context);\n // Validate all keys\n for (const key of keys) {\n validateKey(key, context);\n }\n\n logger.debug('[StorageService] deleteMany operation', {\n ...context,\n operation: 'StorageService.deleteMany',\n tenantId,\n keyCount: keys.length,\n });\n\n return this.provider.deleteMany(tenantId, keys, context);\n }\n\n clear(context: RequestContext): Promise<number> {\n const tenantId = requireTenantId(context);\n\n logger.info('[StorageService] clear operation', {\n ...context,\n operation: 'StorageService.clear',\n tenantId,\n });\n\n return this.provider.clear(tenantId, context);\n }\n}\n","/**\n * @fileoverview A filesystem-based storage provider.\n * Persists data to the local filesystem in a specified directory.\n * Each key-value pair is stored as a separate JSON file.\n *\n * Performance note: List operations with TTL filtering can be slow on large datasets\n * as each file must be read and parsed to check expiration. Consider implementing\n * periodic cleanup jobs for production use with large key counts.\n *\n * @module src/storage/providers/fileSystem/fileSystemProvider\n */\nimport { existsSync, mkdirSync } from 'fs';\nimport { readFile, readdir, rm, writeFile } from 'fs/promises';\nimport path from 'path';\n\nimport type {\n IStorageProvider,\n StorageOptions,\n ListOptions,\n ListResult,\n} from '@/storage/core/IStorageProvider.js';\nimport { JsonRpcErrorCode, McpError } from '@/types-global/errors.js';\nimport {\n encodeCursor,\n decodeCursor,\n} from '@/storage/core/storageValidation.js';\nimport {\n ErrorHandler,\n sanitization,\n type RequestContext,\n} from '@/utils/index.js';\n\nconst DEFAULT_LIST_LIMIT = 1000;\n\ntype FileEnvelope = {\n __mcp: { v: 1; expiresAt?: number };\n value: unknown;\n};\n\nconst FILE_ENVELOPE_VERSION = 1;\n\nexport class FileSystemProvider implements IStorageProvider {\n private readonly storagePath: string;\n\n constructor(storagePath: string) {\n if (!storagePath) {\n throw new McpError(\n JsonRpcErrorCode.ConfigurationError,\n 'FileSystemProvider requires a valid storagePath.',\n );\n }\n this.storagePath = path.resolve(storagePath);\n if (!existsSync(this.storagePath)) {\n mkdirSync(this.storagePath, { recursive: true });\n }\n }\n\n private getTenantPath(tenantId: string): string {\n const sanitizedTenantId = sanitization.sanitizePath(tenantId, {\n toPosix: true,\n }).sanitizedPath;\n if (sanitizedTenantId.includes('/') || sanitizedTenantId.includes('..')) {\n throw new McpError(\n JsonRpcErrorCode.ValidationError,\n 'Invalid tenantId contains path characters.',\n );\n }\n const tenantPath = path.join(this.storagePath, sanitizedTenantId);\n if (!existsSync(tenantPath)) {\n mkdirSync(tenantPath, { recursive: true });\n }\n return tenantPath;\n }\n\n private getFilePath(tenantId: string, key: string): string {\n const tenantPath = this.getTenantPath(tenantId);\n const sanitizedKey = sanitization.sanitizePath(key, {\n rootDir: tenantPath,\n toPosix: true,\n }).sanitizedPath;\n const filePath = path.join(tenantPath, sanitizedKey);\n if (!path.resolve(filePath).startsWith(path.resolve(tenantPath))) {\n throw new McpError(\n JsonRpcErrorCode.ValidationError,\n 'Invalid key results in path traversal attempt.',\n );\n }\n return filePath;\n }\n\n private buildEnvelope(\n value: unknown,\n options?: StorageOptions,\n ): FileEnvelope {\n // Fix: Check for undefined instead of truthy to handle ttl=0 correctly\n const expiresAt =\n options?.ttl !== undefined ? Date.now() + options.ttl * 1000 : undefined;\n return {\n __mcp: {\n v: FILE_ENVELOPE_VERSION,\n ...(expiresAt !== undefined ? { expiresAt } : {}),\n },\n value,\n };\n }\n\n private async parseAndValidate<T>(\n raw: string,\n tenantId: string,\n key: string,\n filePath: string,\n context: RequestContext,\n ): Promise<T | null> {\n try {\n const parsed: unknown = JSON.parse(raw);\n // Envelope-aware parsing\n if (parsed && typeof parsed === 'object' && '__mcp' in parsed) {\n const env = parsed as FileEnvelope;\n const expiresAt = env.__mcp?.expiresAt;\n if (expiresAt && Date.now() > expiresAt) {\n // Expired: best-effort delete and return null\n try {\n await rm(filePath);\n } catch {\n // ignore\n }\n return null;\n }\n return env.value as T;\n }\n // Legacy: return parsed directly\n return parsed as T;\n } catch (error: unknown) {\n throw new McpError(\n JsonRpcErrorCode.SerializationError,\n `Failed to parse stored JSON for key \"${key}\" (tenant \"${tenantId}\").`,\n { ...context, error },\n );\n }\n }\n\n async get<T>(\n tenantId: string,\n key: string,\n context: RequestContext,\n ): Promise<T | null> {\n const filePath = this.getFilePath(tenantId, key);\n return ErrorHandler.tryCatch(\n async () => {\n try {\n const data = await readFile(filePath, 'utf-8');\n return this.parseAndValidate<T>(\n data,\n tenantId,\n key,\n filePath,\n context,\n );\n } catch (error: unknown) {\n if (\n error instanceof Error &&\n 'code' in error &&\n (error as { code: string }).code === 'ENOENT'\n ) {\n return null; // File not found\n }\n throw error; // Re-throw other errors\n }\n },\n {\n operation: 'FileSystemProvider.get',\n context,\n input: { tenantId, key },\n },\n );\n }\n\n async set(\n tenantId: string,\n key: string,\n value: unknown,\n context: RequestContext,\n options?: StorageOptions,\n ): Promise<void> {\n const filePath = this.getFilePath(tenantId, key);\n return ErrorHandler.tryCatch(\n async () => {\n const envelope = this.buildEnvelope(value, options);\n const content = JSON.stringify(envelope, null, 2);\n mkdirSync(path.dirname(filePath), { recursive: true });\n await writeFile(filePath, content, 'utf-8');\n },\n {\n operation: 'FileSystemProvider.set',\n context,\n input: { tenantId, key },\n },\n );\n }\n\n async delete(\n tenantId: string,\n key: string,\n context: RequestContext,\n ): Promise<boolean> {\n const filePath = this.getFilePath(tenantId, key);\n return ErrorHandler.tryCatch(\n async () => {\n try {\n await rm(filePath);\n return true;\n } catch (error: unknown) {\n if (\n error instanceof Error &&\n 'code' in error &&\n (error as { code: string }).code === 'ENOENT'\n ) {\n return false; // File didn't exist\n }\n throw error;\n }\n },\n {\n operation: 'FileSystemProvider.delete',\n context,\n input: { tenantId, key },\n },\n );\n }\n\n private async listFilesRecursively(\n dir: string,\n baseDir: string,\n ): Promise<string[]> {\n const entries = await readdir(dir, { withFileTypes: true });\n const results: string[] = [];\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n results.push(...(await this.listFilesRecursively(fullPath, baseDir)));\n } else if (entry.isFile()) {\n const rel = path.relative(baseDir, fullPath);\n // Normalize to POSIX-style keys for consistency\n results.push(rel.split(path.sep).join('/'));\n }\n }\n return results;\n }\n\n async list(\n tenantId: string,\n prefix: string,\n context: RequestContext,\n options?: ListOptions,\n ): Promise<ListResult> {\n return ErrorHandler.tryCatch(\n async () => {\n const tenantPath = this.getTenantPath(tenantId);\n const allKeys = await this.listFilesRecursively(tenantPath, tenantPath);\n const candidateKeys = allKeys.filter((k) => k.startsWith(prefix));\n\n // TTL-aware filtering: best-effort; expensive on large stores.\n const validKeys: string[] = [];\n for (const k of candidateKeys) {\n const filePath = this.getFilePath(tenantId, k);\n try {\n const raw = await readFile(filePath, 'utf-8');\n const value = await this.parseAndValidate<unknown>(\n raw,\n tenantId,\n k,\n filePath,\n context,\n );\n if (value !== null) {\n validKeys.push(k);\n }\n } catch (_e) {\n // If parsing fails, exclude key and continue; error already typed/logged by tryCatch wrapper.\n continue;\n }\n }\n\n // Sort for consistent pagination\n validKeys.sort();\n\n // Apply pagination with opaque cursors\n const limit = options?.limit ?? DEFAULT_LIST_LIMIT;\n let startIndex = 0;\n\n if (options?.cursor) {\n // Decode and validate cursor\n const lastKey = decodeCursor(options.cursor, tenantId, context);\n const cursorIndex = validKeys.indexOf(lastKey);\n if (cursorIndex !== -1) {\n startIndex = cursorIndex + 1;\n }\n }\n\n const paginatedKeys = validKeys.slice(startIndex, startIndex + limit);\n const nextCursor =\n startIndex + limit < validKeys.length && paginatedKeys.length > 0\n ? encodeCursor(paginatedKeys[paginatedKeys.length - 1]!, tenantId)\n : undefined;\n\n return {\n keys: paginatedKeys,\n nextCursor,\n };\n },\n {\n operation: 'FileSystemProvider.list',\n context,\n input: { tenantId, prefix },\n },\n );\n }\n\n async getMany<T>(\n tenantId: string,\n keys: string[],\n context: RequestContext,\n ): Promise<Map<string, T>> {\n return ErrorHandler.tryCatch(\n async () => {\n if (keys.length === 0) {\n return new Map<string, T>();\n }\n\n // Parallel fetch for better performance\n const promises = keys.map((key) => this.get<T>(tenantId, key, context));\n const values = await Promise.all(promises);\n\n const results = new Map<string, T>();\n keys.forEach((key, i) => {\n const value = values[i];\n if (value !== null) {\n results.set(key, value as T);\n }\n });\n return results;\n },\n {\n operation: 'FileSystemProvider.getMany',\n context,\n input: { tenantId, keyCount: keys.length },\n },\n );\n }\n\n async setMany(\n tenantId: string,\n entries: Map<string, unknown>,\n context: RequestContext,\n options?: StorageOptions,\n ): Promise<void> {\n return ErrorHandler.tryCatch(\n async () => {\n if (entries.size === 0) {\n return;\n }\n\n // Parallel set for better performance\n const promises = Array.from(entries.entries()).map(([key, value]) =>\n this.set(tenantId, key, value, context, options),\n );\n await Promise.all(promises);\n },\n {\n operation: 'FileSystemProvider.setMany',\n context,\n input: { tenantId, entryCount: entries.size },\n },\n );\n }\n\n async deleteMany(\n tenantId: string,\n keys: string[],\n context: RequestContext,\n ): Promise<number> {\n return ErrorHandler.tryCatch(\n async () => {\n if (keys.length === 0) {\n return 0;\n }\n\n // Parallel delete for better performance\n const promises = keys.map((key) => this.delete(tenantId, key, context));\n const results = await Promise.all(promises);\n return results.filter((deleted) => deleted).length;\n },\n {\n operation: 'FileSystemProvider.deleteMany',\n context,\n input: { tenantId, keyCount: keys.length },\n },\n );\n }\n\n async clear(tenantId: string, context: RequestContext): Promise<number> {\n return ErrorHandler.tryCatch(\n async () => {\n const tenantPath = this.getTenantPath(tenantId);\n const allKeys = await this.listFilesRecursively(tenantPath, tenantPath);\n let deletedCount = 0;\n for (const key of allKeys) {\n const deleted = await this.delete(tenantId, key, context);\n if (deleted) {\n deletedCount++;\n }\n }\n return deletedCount;\n },\n {\n operation: 'FileSystemProvider.clear',\n context,\n input: { tenantId },\n },\n );\n }\n}\n","/**\n * @fileoverview An in-memory storage provider implementation.\n * Ideal for development, testing, or scenarios where persistence is not required.\n * Supports TTL (Time-To-Live) for entries.\n * @module src/storage/providers/inMemory/inMemoryProvider\n */\nimport type {\n IStorageProvider,\n StorageOptions,\n ListOptions,\n ListResult,\n} from '@/storage/core/IStorageProvider.js';\nimport {\n encodeCursor,\n decodeCursor,\n} from '@/storage/core/storageValidation.js';\nimport { type RequestContext, logger } from '@/utils/index.js';\n\nconst DEFAULT_LIST_LIMIT = 1000;\n\ninterface InMemoryStoreEntry {\n value: unknown;\n expiresAt?: number;\n}\n\nexport class InMemoryProvider implements IStorageProvider {\n private readonly store = new Map<string, Map<string, InMemoryStoreEntry>>();\n\n private getTenantStore(tenantId: string): Map<string, InMemoryStoreEntry> {\n let tenantStore = this.store.get(tenantId);\n if (!tenantStore) {\n tenantStore = new Map<string, InMemoryStoreEntry>();\n this.store.set(tenantId, tenantStore);\n }\n return tenantStore;\n }\n\n get<T>(\n tenantId: string,\n key: string,\n context: RequestContext,\n ): Promise<T | null> {\n logger.debug(\n `[InMemoryProvider] Getting key: ${key} for tenant: ${tenantId}`,\n context,\n );\n const tenantStore = this.getTenantStore(tenantId);\n const entry = tenantStore.get(key);\n\n if (!entry) {\n return Promise.resolve(null);\n }\n\n if (entry.expiresAt && Date.now() > entry.expiresAt) {\n tenantStore.delete(key);\n logger.debug(\n `[InMemoryProvider] Key expired and removed: ${key} for tenant: ${tenantId}`,\n context,\n );\n return Promise.resolve(null);\n }\n\n return Promise.resolve(entry.value as T);\n }\n\n set(\n tenantId: string,\n key: string,\n value: unknown,\n context: RequestContext,\n options?: StorageOptions,\n ): Promise<void> {\n logger.debug(\n `[InMemoryProvider] Setting key: ${key} for tenant: ${tenantId}`,\n context,\n );\n const tenantStore = this.getTenantStore(tenantId);\n // Fix: Check for undefined instead of truthy to handle ttl=0 correctly\n const expiresAt =\n options?.ttl !== undefined ? Date.now() + options.ttl * 1000 : undefined;\n tenantStore.set(key, {\n value,\n ...(expiresAt !== undefined && { expiresAt }),\n });\n return Promise.resolve();\n }\n\n delete(\n tenantId: string,\n key: string,\n context: RequestContext,\n ): Promise<boolean> {\n logger.debug(\n `[InMemoryProvider] Deleting key: ${key} for tenant: ${tenantId}`,\n context,\n );\n const tenantStore = this.getTenantStore(tenantId);\n return Promise.resolve(tenantStore.delete(key));\n }\n\n list(\n tenantId: string,\n prefix: string,\n context: RequestContext,\n options?: ListOptions,\n ): Promise<ListResult> {\n logger.debug(\n `[InMemoryProvider] Listing keys with prefix: ${prefix} for tenant: ${tenantId}`,\n { ...context, options },\n );\n const tenantStore = this.getTenantStore(tenantId);\n const now = Date.now();\n const allKeys: string[] = [];\n\n // Collect all matching non-expired keys\n for (const [key, entry] of tenantStore.entries()) {\n if (key.startsWith(prefix)) {\n if (entry.expiresAt && now > entry.expiresAt) {\n tenantStore.delete(key); // Lazy cleanup\n } else {\n allKeys.push(key);\n }\n }\n }\n\n // Sort for consistent pagination\n allKeys.sort();\n\n // Apply pagination with opaque cursors\n const limit = options?.limit ?? DEFAULT_LIST_LIMIT;\n let startIndex = 0;\n\n if (options?.cursor) {\n // Decode and validate cursor\n const lastKey = decodeCursor(options.cursor, tenantId, context);\n const cursorIndex = allKeys.indexOf(lastKey);\n if (cursorIndex !== -1) {\n startIndex = cursorIndex + 1;\n }\n }\n\n const paginatedKeys = allKeys.slice(startIndex, startIndex + limit);\n const nextCursor =\n startIndex + limit < allKeys.length && paginatedKeys.length > 0\n ? encodeCursor(paginatedKeys[paginatedKeys.length - 1]!, tenantId)\n : undefined;\n\n return Promise.resolve({\n keys: paginatedKeys,\n nextCursor,\n });\n }\n\n async getMany<T>(\n tenantId: string,\n keys: string[],\n context: RequestContext,\n ): Promise<Map<string, T>> {\n if (keys.length === 0) {\n return new Map<string, T>();\n }\n\n logger.debug(\n `[InMemoryProvider] Getting ${keys.length} keys for tenant: ${tenantId}`,\n context,\n );\n\n // Parallel fetch for better performance\n const promises = keys.map((key) => this.get<T>(tenantId, key, context));\n const values = await Promise.all(promises);\n\n const results = new Map<string, T>();\n keys.forEach((key, i) => {\n const value = values[i];\n if (value !== null) {\n results.set(key, value as T);\n }\n });\n\n logger.debug(\n `[InMemoryProvider] Retrieved ${results.size}/${keys.length} keys for tenant: ${tenantId}`,\n context,\n );\n return results;\n }\n\n async setMany(\n tenantId: string,\n entries: Map<string, unknown>,\n context: RequestContext,\n options?: StorageOptions,\n ): Promise<void> {\n if (entries.size === 0) {\n return;\n }\n\n logger.debug(\n `[InMemoryProvider] Setting ${entries.size} keys for tenant: ${tenantId}`,\n context,\n );\n\n // Parallel set for better performance\n const promises = Array.from(entries.entries()).map(([key, value]) =>\n this.set(tenantId, key, value, context, options),\n );\n await Promise.all(promises);\n\n logger.debug(\n `[InMemoryProvider] Successfully set ${entries.size} keys for tenant: ${tenantId}`,\n context,\n );\n }\n\n async deleteMany(\n tenantId: string,\n keys: string[],\n context: RequestContext,\n ): Promise<number> {\n if (keys.length === 0) {\n return 0;\n }\n\n logger.debug(\n `[InMemoryProvider] Deleting ${keys.length} keys for tenant: ${tenantId}`,\n context,\n );\n\n // Parallel delete for better performance\n const promises = keys.map((key) => this.delete(tenantId, key, context));\n const results = await Promise.all(promises);\n const deletedCount = results.filter((deleted) => deleted).length;\n\n logger.debug(\n `[InMemoryProvider] Deleted ${deletedCount}/${keys.length} keys for tenant: ${tenantId}`,\n context,\n );\n return deletedCount;\n }\n\n clear(tenantId: string, context: RequestContext): Promise<number> {\n logger.debug(\n `[InMemoryProvider] Clearing all keys for tenant: ${tenantId}`,\n context,\n );\n const tenantStore = this.getTenantStore(tenantId);\n const count = tenantStore.size;\n tenantStore.clear();\n logger.info(\n `[InMemoryProvider] Cleared ${count} keys for tenant: ${tenantId}`,\n context,\n );\n return Promise.resolve(count);\n }\n}\n","/**\n * @fileoverview A Supabase-based storage provider.\n * Persists data to a specified table in a Supabase PostgreSQL database.\n * Assumes a table with columns: `key` (text), `value` (jsonb), and `expires_at` (timestamptz).\n * @module src/storage/providers/supabase/supabaseProvider\n */\nimport { inject, injectable } from 'tsyringe';\n\nimport { SupabaseClient } from '@supabase/supabase-js';\n\nimport { SupabaseAdminClient } from '@/container/tokens.js';\nimport type {\n IStorageProvider,\n StorageOptions,\n ListOptions,\n ListResult,\n} from '@/storage/core/IStorageProvider.js';\nimport type {\n Json,\n Database,\n} from '@/storage/providers/supabase/supabase.types.js';\nimport {\n encodeCursor,\n decodeCursor,\n} from '@/storage/core/storageValidation.js';\nimport { ErrorHandler, type RequestContext, logger } from '@/utils/index.js';\n\nconst TABLE_NAME = 'kv_store';\nconst DEFAULT_LIST_LIMIT = 1000;\n\n@injectable()\nexport class SupabaseProvider implements IStorageProvider {\n constructor(\n @inject(SupabaseAdminClient)\n private readonly client: SupabaseClient<Database>,\n ) {}\n\n private getClient() {\n return this.client;\n }\n\n async get<T>(\n tenantId: string,\n key: string,\n context: RequestContext,\n ): Promise<T | null> {\n return ErrorHandler.tryCatch(\n async () => {\n const { data, error } = await this.getClient()\n .from(TABLE_NAME)\n .select('value, expires_at')\n .eq('tenant_id', tenantId)\n .eq('key', key)\n .single();\n\n if (error) {\n if (error.code === 'PGRST116') {\n // \"Not found\" error code from PostgREST\n return null;\n }\n throw error;\n }\n\n if (\n data.expires_at &&\n new Date(data.expires_at).getTime() < Date.now()\n ) {\n await this.delete(tenantId, key, context);\n logger.debug(\n `[SupabaseProvider] Key expired and removed: ${key} for tenant: ${tenantId}`,\n context,\n );\n return null;\n }\n\n return data.value as T;\n },\n {\n operation: 'SupabaseProvider.get',\n context,\n input: { tenantId, key },\n },\n );\n }\n\n async set(\n tenantId: string,\n key: string,\n value: unknown,\n context: RequestContext,\n options?: StorageOptions,\n ): Promise<void> {\n return ErrorHandler.tryCatch(\n async () => {\n // Fix: Check for undefined instead of truthy to handle ttl=0 correctly\n const expires_at =\n options?.ttl !== undefined\n ? new Date(Date.now() + options.ttl * 1000).toISOString()\n : null;\n\n const { error } = await this.getClient()\n .from(TABLE_NAME)\n .upsert({\n tenant_id: tenantId,\n key,\n value: value as Json,\n expires_at,\n });\n\n if (error) throw error;\n },\n {\n operation: 'SupabaseProvider.set',\n context,\n input: { tenantId, key },\n },\n );\n }\n\n async delete(\n tenantId: string,\n key: string,\n context: RequestContext,\n ): Promise<boolean> {\n return ErrorHandler.tryCatch(\n async () => {\n const { error, count } = await this.getClient()\n .from(TABLE_NAME)\n .delete({ count: 'exact' })\n .eq('tenant_id', tenantId)\n .eq('key', key);\n\n if (error) throw error;\n return (count ?? 0) > 0;\n },\n {\n operation: 'SupabaseProvider.delete',\n context,\n input: { tenantId, key },\n },\n );\n }\n\n async list(\n tenantId: string,\n prefix: string,\n context: RequestContext,\n options?: ListOptions,\n ): Promise<ListResult> {\n return ErrorHandler.tryCatch(\n async () => {\n const now = new Date().toISOString();\n const limit = options?.limit ?? DEFAULT_LIST_LIMIT;\n\n let query = this.getClient()\n .from(TABLE_NAME)\n .select('key')\n .eq('tenant_id', tenantId)\n .like('key', `${prefix}%`)\n .or(`expires_at.is.null,expires_at.gt.${now}`)\n .order('key', { ascending: true })\n .limit(limit + 1); // Fetch one extra to determine if there are more results\n\n // Apply cursor-based pagination with opaque cursors\n if (options?.cursor) {\n // Decode and validate cursor\n const lastKey = decodeCursor(options.cursor, tenantId, context);\n query = query.gt('key', lastKey);\n }\n\n const { data, error } = await query;\n\n if (error) throw error;\n\n const keys = data?.map((item) => item.key) ?? [];\n const hasMore = keys.length > limit;\n const resultKeys = hasMore ? keys.slice(0, limit) : keys;\n const nextCursor =\n hasMore && resultKeys.length > 0\n ? encodeCursor(resultKeys[resultKeys.length - 1]!, tenantId)\n : undefined;\n\n return {\n keys: resultKeys,\n nextCursor,\n };\n },\n {\n operation: 'SupabaseProvider.list',\n context,\n input: { tenantId, prefix, options },\n },\n );\n }\n\n async getMany<T>(\n tenantId: string,\n keys: string[],\n context: RequestContext,\n ): Promise<Map<string, T>> {\n return ErrorHandler.tryCatch<Map<string, T>>(\n async () => {\n if (keys.length === 0) {\n return new Map<string, T>();\n }\n\n const { data, error } = await this.getClient()\n .from(TABLE_NAME)\n .select('key, value, expires_at')\n .eq('tenant_id', tenantId)\n .in('key', keys);\n\n if (error) throw error;\n\n const results = new Map<string, T>();\n for (const row of data ?? []) {\n if (\n !row.expires_at ||\n new Date(row.expires_at).getTime() >= Date.now()\n ) {\n results.set(row.key, row.value as T);\n } else {\n // Clean up expired entries\n await this.delete(tenantId, row.key, context);\n }\n }\n\n return results;\n },\n {\n operation: 'SupabaseProvider.getMany',\n context,\n input: { tenantId, keyCount: keys.length },\n },\n );\n }\n\n async setMany(\n tenantId: string,\n entries: Map<string, unknown>,\n context: RequestContext,\n options?: StorageOptions,\n ): Promise<void> {\n return ErrorHandler.tryCatch(\n async () => {\n if (entries.size === 0) {\n return;\n }\n\n // Fix: Check for undefined instead of truthy to handle ttl=0 correctly\n const expires_at =\n options?.ttl !== undefined\n ? new Date(Date.now() + options.ttl * 1000).toISOString()\n : null;\n\n const rows = Array.from(entries.entries()).map(([key, value]) => ({\n tenant_id: tenantId,\n key,\n value: value as Json,\n expires_at,\n }));\n\n const { error } = await this.getClient().from(TABLE_NAME).upsert(rows);\n\n if (error) throw error;\n },\n {\n operation: 'SupabaseProvider.setMany',\n context,\n input: { tenantId, entryCount: entries.size },\n },\n );\n }\n\n async deleteMany(\n tenantId: string,\n keys: string[],\n context: RequestContext,\n ): Promise<number> {\n return ErrorHandler.tryCatch(\n async () => {\n if (keys.length === 0) {\n return 0;\n }\n\n const { error, count } = await this.getClient()\n .from(TABLE_NAME)\n .delete({ count: 'exact' })\n .eq('tenant_id', tenantId)\n .in('key', keys);\n\n if (error) throw error;\n return count ?? 0;\n },\n {\n operation: 'SupabaseProvider.deleteMany',\n context,\n input: { tenantId, keyCount: keys.length },\n },\n );\n }\n\n async clear(tenantId: string, context: RequestContext): Promise<number> {\n return ErrorHandler.tryCatch(\n async () => {\n const { error, count } = await this.getClient()\n .from(TABLE_NAME)\n .delete({ count: 'exact' })\n .eq('tenant_id', tenantId);\n\n if (error) throw error;\n logger.info(\n `[SupabaseProvider] Cleared ${count ?? 0} keys for tenant: ${tenantId}`,\n context,\n );\n return count ?? 0;\n },\n {\n operation: 'SupabaseProvider.clear',\n context,\n input: { tenantId },\n },\n );\n }\n}\n","/**\n * @fileoverview Query builder utilities for constructing SurrealQL queries.\n * Provides type-safe query construction helpers for common patterns.\n * @module src/storage/providers/surrealdb/core/queryBuilder\n */\n\n/**\n * Parameter object for query building.\n */\nexport interface QueryParams {\n [key: string]: unknown;\n}\n\n/**\n * Built query with parameterized SQL and parameter values.\n */\nexport interface BuiltQuery {\n query: string;\n params: QueryParams;\n}\n\n/**\n * WHERE clause builder for filtering queries.\n */\nexport class WhereBuilder {\n private conditions: string[] = [];\n private params: QueryParams = {};\n private paramCounter: number = 0;\n\n /**\n * Add an equality condition.\n */\n equals(field: string, value: unknown): this {\n const paramName = `where_${this.paramCounter++}`;\n this.conditions.push(`${field} = $${paramName}`);\n this.params[paramName] = value;\n return this;\n }\n\n /**\n * Add a greater-than condition.\n */\n greaterThan(field: string, value: unknown): this {\n const paramName = `where_${this.paramCounter++}`;\n this.conditions.push(`${field} > $${paramName}`);\n this.params[paramName] = value;\n return this;\n }\n\n /**\n * Add an IN clause condition.\n */\n in(field: string, values: unknown[]): this {\n const paramName = `where_${this.paramCounter++}`;\n this.conditions.push(`${field} INSIDE $${paramName}`);\n this.params[paramName] = values;\n return this;\n }\n\n /**\n * Add a LIKE condition with string matching.\n */\n startsWith(field: string, prefix: string): this {\n const paramName = `where_${this.paramCounter++}`;\n this.conditions.push(`string::starts_with(${field}, $${paramName})`);\n this.params[paramName] = prefix;\n return this;\n }\n\n /**\n * Add a null check condition.\n */\n isNull(field: string): this {\n this.conditions.push(`${field} IS NONE`);\n return this;\n }\n\n /**\n * Add a not-null check condition.\n */\n isNotNull(field: string): this {\n this.conditions.push(`${field} IS NOT NONE`);\n return this;\n }\n\n /**\n * Add a raw condition (use with caution).\n */\n raw(condition: string, params?: QueryParams): this {\n this.conditions.push(condition);\n if (params) {\n Object.assign(this.params, params);\n }\n return this;\n }\n\n /**\n * Build the WHERE clause.\n */\n build(): { clause: string; params: QueryParams } {\n if (this.conditions.length === 0) {\n return { clause: '', params: {} };\n }\n\n return {\n clause: `WHERE ${this.conditions.join(' AND ')}`,\n params: this.params,\n };\n }\n}\n\n/**\n * Query builder for SELECT statements.\n */\nexport class SelectQueryBuilder {\n private table: string = '';\n private fields: string[] = ['*'];\n private whereBuilder = new WhereBuilder();\n private orderByField?: string;\n private orderDirection: 'ASC' | 'DESC' = 'ASC';\n private limitValue?: number;\n private params: QueryParams = {};\n\n /**\n * Set the table to select from.\n */\n from(table: string): this {\n this.table = table;\n return this;\n }\n\n /**\n * Set the fields to select.\n */\n select(...fields: string[]): this {\n this.fields = fields;\n return this;\n }\n\n /**\n * Add WHERE conditions.\n */\n where(builder: (where: WhereBuilder) => void): this {\n builder(this.whereBuilder);\n return this;\n }\n\n /**\n * Set ORDER BY clause.\n */\n orderBy(field: string, direction: 'ASC' | 'DESC' = 'ASC'): this {\n this.orderByField = field;\n this.orderDirection = direction;\n return this;\n }\n\n /**\n * Set LIMIT clause.\n */\n limit(value: number): this {\n this.limitValue = value;\n return this;\n }\n\n /**\n * Add custom parameters.\n */\n withParams(params: QueryParams): this {\n Object.assign(this.params, params);\n return this;\n }\n\n /**\n * Build the final query.\n */\n build(): BuiltQuery {\n if (!this.table) {\n throw new Error('Table name is required');\n }\n\n const parts: string[] = [\n `SELECT ${this.fields.join(', ')}`,\n `FROM type::table($table)`,\n ];\n\n const { clause: whereClause, params: whereParams } =\n this.whereBuilder.build();\n if (whereClause) {\n parts.push(whereClause);\n }\n\n if (this.orderByField) {\n parts.push(`ORDER BY ${this.orderByField} ${this.orderDirection}`);\n }\n\n if (this.limitValue !== undefined) {\n parts.push(`LIMIT ${this.limitValue}`);\n }\n\n const allParams = {\n table: this.table,\n ...whereParams,\n ...this.params,\n };\n\n return {\n query: parts.join(' '),\n params: allParams,\n };\n }\n}\n\n/**\n * Create a new SELECT query builder.\n */\nexport function select(...fields: string[]): SelectQueryBuilder {\n return new SelectQueryBuilder().select(...fields);\n}\n\n/**\n * Create a WHERE builder.\n */\nexport function where(builder: (where: WhereBuilder) => void): WhereBuilder {\n const whereBuilder = new WhereBuilder();\n builder(whereBuilder);\n return whereBuilder;\n}\n","/**\n * @fileoverview Transaction manager for SurrealDB operations.\n * Provides transaction support for multi-operation atomic updates.\n * @module src/storage/providers/surrealdb/core/transactionManager\n */\n\nimport type Surreal from 'surrealdb';\nimport { ErrorHandler, logger, type RequestContext } from '@/utils/index.js';\nimport type { TransactionOptions } from '../types.js';\n\n/**\n * Callback function type for transaction operations.\n */\nexport type TransactionCallback<T> = (client: Surreal) => Promise<T>;\n\n/**\n * Manages transactions for SurrealDB operations.\n *\n * @remarks\n * SurrealDB transactions are handled at the query level using\n * BEGIN TRANSACTION, COMMIT TRANSACTION, and CANCEL TRANSACTION.\n * This manager provides a convenient API for transaction lifecycle.\n */\nexport class TransactionManager {\n constructor(private readonly client: Surreal) {}\n\n /**\n * Execute a callback within a transaction.\n *\n * @param callback - The operations to execute within the transaction\n * @param context - Request context for logging\n * @param options - Transaction options\n * @returns The result of the callback\n *\n * @example\n * ```ts\n * const result = await txManager.executeInTransaction(\n * async (client) => {\n * await client.query('UPDATE account SET balance -= 100 WHERE id = $from', { from: 'alice' });\n * await client.query('UPDATE account SET balance += 100 WHERE id = $to', { to: 'bob' });\n * return 'success';\n * },\n * context\n * );\n * ```\n */\n async executeInTransaction<T>(\n callback: TransactionCallback<T>,\n context: RequestContext,\n options?: TransactionOptions,\n ): Promise<T> {\n return ErrorHandler.tryCatch(\n async () => {\n logger.debug('[TransactionManager] Starting transaction', context);\n\n // Begin transaction\n await this.client.query('BEGIN TRANSACTION');\n\n try {\n // Execute callback operations\n const result = await Promise.race([\n callback(this.client),\n this.createTimeout(options?.timeout),\n ]);\n\n // Commit transaction\n await this.client.query('COMMIT TRANSACTION');\n\n logger.debug('[TransactionManager] Transaction committed', context);\n\n return result as T;\n } catch (error: unknown) {\n // Cancel transaction on error\n logger.warning(\n '[TransactionManager] Transaction failed, cancelling',\n context,\n );\n\n await this.client.query('CANCEL TRANSACTION');\n\n throw error;\n }\n },\n {\n operation: 'TransactionManager.executeInTransaction',\n context,\n input: { timeout: options?.timeout },\n },\n );\n }\n\n /**\n * Execute multiple queries in a single batch within a transaction.\n *\n * @param queries - Array of queries to execute\n * @param context - Request context for logging\n * @returns Array of results from each query\n */\n async executeBatch<T = unknown>(\n queries: Array<{ query: string; params?: Record<string, unknown> }>,\n context: RequestContext,\n ): Promise<T[]> {\n return this.executeInTransaction(async (client) => {\n const results: T[] = [];\n\n for (const { query, params } of queries) {\n const result = await client.query<[{ result: T }]>(query, params ?? {});\n results.push(result[0]?.result);\n }\n\n return results;\n }, context);\n }\n\n /**\n * Create a timeout promise for transaction timeout.\n */\n private createTimeout(timeout?: number): Promise<never> {\n if (!timeout) {\n return new Promise(() => {\n /* never resolves */\n });\n }\n\n return new Promise((_, reject) => {\n setTimeout(() => {\n reject(new Error(`Transaction timeout after ${timeout}ms`));\n }, timeout);\n });\n }\n}\n","/**\n * @fileoverview SurrealDB key-value storage provider using modular base.\n * Implements IStorageProvider for multi-tenant KV operations.\n * @module src/storage/providers/surrealdb/kv/surrealKvProvider\n */\n\nimport { inject, injectable } from 'tsyringe';\nimport type Surreal from 'surrealdb';\n\nimport { SurrealdbClient } from '@/container/tokens.js';\nimport type {\n IStorageProvider,\n StorageOptions,\n ListOptions,\n ListResult,\n} from '@/storage/core/IStorageProvider.js';\nimport {\n encodeCursor,\n decodeCursor,\n} from '@/storage/core/storageValidation.js';\nimport { ErrorHandler, logger, type RequestContext } from '@/utils/index.js';\nimport type { KvStoreRecord, QueryResult } from '../types.js';\nimport { select } from '../core/queryBuilder.js';\nimport { TransactionManager } from '../core/transactionManager.js';\n\nconst DEFAULT_LIST_LIMIT = 1000;\n\n/**\n * SurrealDB-based key-value storage provider.\n *\n * @remarks\n * Provides key-value storage using SurrealDB with support for:\n * - Multi-tenancy isolation via tenant_id\n * - TTL (time-to-live) with automatic expiration\n * - Batch operations (getMany, setMany, deleteMany)\n * - Cursor-based pagination\n * - Transaction support\n *\n * This provider uses composition with direct client injection for\n * improved modularity and testability.\n */\n@injectable()\nexport class SurrealKvProvider implements IStorageProvider {\n private readonly tableName: string;\n private readonly client: Surreal;\n private readonly transactionManager: TransactionManager;\n\n constructor(\n @inject(SurrealdbClient) client: Surreal,\n tableName: string = 'kv_store',\n ) {\n this.client = client;\n this.tableName = tableName;\n this.transactionManager = new TransactionManager(this.client);\n }\n\n /**\n * Execute a raw query with parameters.\n *\n * @param query - The SurrealQL query string\n * @param params - Query parameters\n * @param context - Request context for logging\n * @returns Query result\n */\n private async executeQuery<T = unknown>(\n query: string,\n params: Record<string, unknown>,\n context: RequestContext,\n ): Promise<T[]> {\n return ErrorHandler.tryCatch(\n async () => {\n logger.debug('[SurrealKvProvider] Executing query', {\n ...context,\n query: query.substring(0, 100),\n });\n\n const queryResult = await this.client.query<[QueryResult<T>]>(\n query,\n params,\n );\n\n return queryResult[0]?.result ?? [];\n },\n {\n operation: 'SurrealKvProvider.executeQuery',\n context,\n input: { query: query.substring(0, 50) },\n },\n );\n }\n\n /**\n * Check if a record has expired based on expires_at field.\n *\n * @param record - Record to check\n * @returns True if expired\n */\n private isExpired(record: KvStoreRecord): boolean {\n if (!record.expires_at) {\n return false;\n }\n return new Date(record.expires_at).getTime() < Date.now();\n }\n\n async get<T>(\n tenantId: string,\n key: string,\n context: RequestContext,\n ): Promise<T | null> {\n return ErrorHandler.tryCatch(\n async () => {\n const builder = select('value', 'expires_at')\n .from(this.tableName)\n .where((w) => w.equals('tenant_id', tenantId).equals('key', key))\n .limit(1);\n\n const { query, params } = builder.build();\n const data = await this.executeQuery<KvStoreRecord>(\n query,\n params,\n context,\n );\n\n if (!data || data.length === 0) {\n return null;\n }\n\n const record = data[0];\n\n if (!record) {\n return null;\n }\n\n // Check expiration\n if (this.isExpired(record)) {\n await this.delete(tenantId, key, context);\n logger.debug(\n `[SurrealKvProvider] Key expired and removed: ${key}`,\n context,\n );\n return null;\n }\n\n return record.value as T;\n },\n {\n operation: 'SurrealKvProvider.get',\n context,\n input: { tenantId, key },\n },\n );\n }\n\n async set(\n tenantId: string,\n key: string,\n value: unknown,\n context: RequestContext,\n options?: StorageOptions,\n ): Promise<void> {\n return ErrorHandler.tryCatch(\n async () => {\n const expires_at =\n options?.ttl !== undefined\n ? new Date(Date.now() + options.ttl * 1000).toISOString()\n : null;\n\n const query = `\n UPDATE type::table($table):[$tenant_id, $key] MERGE {\n tenant_id: $tenant_id,\n key: $key,\n value: $value,\n expires_at: $expires_at,\n created_at: $this.created_at ?? time::now(),\n updated_at: time::now()\n }\n `;\n\n await this.executeQuery(\n query,\n {\n table: this.tableName,\n tenant_id: tenantId,\n key,\n value,\n expires_at,\n },\n context,\n );\n },\n {\n operation: 'SurrealKvProvider.set',\n context,\n input: { tenantId, key },\n },\n );\n }\n\n async delete(\n tenantId: string,\n key: string,\n context: RequestContext,\n ): Promise<boolean> {\n return ErrorHandler.tryCatch(\n async () => {\n const query = `\n DELETE FROM type::table($table)\n WHERE tenant_id = $tenant_id AND key = $key\n RETURN BEFORE\n `;\n\n const result = await this.executeQuery<KvStoreRecord>(\n query,\n {\n table: this.tableName,\n tenant_id: tenantId,\n key,\n },\n context,\n );\n\n return result !== undefined && result.length > 0;\n },\n {\n operation: 'SurrealKvProvider.delete',\n context,\n input: { tenantId, key },\n },\n );\n }\n\n async list(\n tenantId: string,\n prefix: string,\n context: RequestContext,\n options?: ListOptions,\n ): Promise<ListResult> {\n return ErrorHandler.tryCatch(\n async () => {\n const now = new Date().toISOString();\n const limit = options?.limit ?? DEFAULT_LIST_LIMIT;\n\n let query = `\n SELECT key\n FROM type::table($table)\n WHERE tenant_id = $tenant_id\n AND string::starts_with(key, $prefix)\n AND (expires_at IS NONE OR expires_at > type::datetime($now))\n `;\n\n if (options?.cursor) {\n decodeCursor(options.cursor, tenantId, context);\n query += ` AND key > $cursor`;\n }\n\n query += ` ORDER BY key ASC LIMIT $limit_plus_one`;\n\n const data = await this.executeQuery<{ key: string }>(\n query,\n {\n table: this.tableName,\n tenant_id: tenantId,\n prefix,\n now,\n cursor: options?.cursor\n ? decodeCursor(options.cursor, tenantId, context)\n : undefined,\n limit_plus_one: limit + 1,\n },\n context,\n );\n\n const keys = data.map((item) => item.key);\n const hasMore = keys.length > limit;\n const resultKeys = hasMore ? keys.slice(0, limit) : keys;\n const lastKey = resultKeys[resultKeys.length - 1];\n const nextCursor =\n hasMore && lastKey ? encodeCursor(lastKey, tenantId) : undefined;\n\n return { keys: resultKeys, nextCursor };\n },\n {\n operation: 'SurrealKvProvider.list',\n context,\n input: { tenantId, prefix, options },\n },\n );\n }\n\n async getMany<T>(\n tenantId: string,\n keys: string[],\n context: RequestContext,\n ): Promise<Map<string, T>> {\n return ErrorHandler.tryCatch<Map<string, T>>(\n async () => {\n if (keys.length === 0) {\n return new Map<string, T>();\n }\n\n const query = `\n SELECT key, value, expires_at\n FROM type::table($table)\n WHERE tenant_id = $tenant_id AND key INSIDE $keys\n `;\n\n const data = await this.executeQuery<KvStoreRecord>(\n query,\n {\n table: this.tableName,\n tenant_id: tenantId,\n keys,\n },\n context,\n );\n\n const results = new Map<string, T>();\n const expiredKeys: string[] = [];\n\n for (const row of data) {\n if (!this.isExpired(row)) {\n results.set(row.key, row.value as T);\n } else {\n expiredKeys.push(row.key);\n }\n }\n\n if (expiredKeys.length > 0) {\n await this.deleteMany(tenantId, expiredKeys, context);\n }\n\n return results;\n },\n {\n operation: 'SurrealKvProvider.getMany',\n context,\n input: { tenantId, keyCount: keys.length },\n },\n );\n }\n\n async setMany(\n tenantId: string,\n entries: Map<string, unknown>,\n context: RequestContext,\n options?: StorageOptions,\n ): Promise<void> {\n return ErrorHandler.tryCatch(\n async () => {\n if (entries.size === 0) {\n return;\n }\n\n const expires_at =\n options?.ttl !== undefined\n ? new Date(Date.now() + options.ttl * 1000).toISOString()\n : null;\n\n await this.transactionManager.executeInTransaction(async (client) => {\n for (const [key, value] of entries) {\n const query = `\n UPDATE type::table($table):[$tenant_id, $key] MERGE {\n tenant_id: $tenant_id,\n key: $key,\n value: $value,\n expires_at: $expires_at,\n created_at: $this.created_at ?? time::now(),\n updated_at: time::now()\n }\n `;\n\n await client.query(query, {\n table: this.tableName,\n tenant_id: tenantId,\n key,\n value,\n expires_at,\n });\n }\n }, context);\n },\n {\n operation: 'SurrealKvProvider.setMany',\n context,\n input: { tenantId, entryCount: entries.size },\n },\n );\n }\n\n async deleteMany(\n tenantId: string,\n keys: string[],\n context: RequestContext,\n ): Promise<number> {\n return ErrorHandler.tryCatch(\n async () => {\n if (keys.length === 0) {\n return 0;\n }\n\n const query = `\n DELETE FROM type::table($table)\n WHERE tenant_id = $tenant_id AND key INSIDE $keys\n RETURN BEFORE\n `;\n\n const deleted = await this.executeQuery<KvStoreRecord>(\n query,\n {\n table: this.tableName,\n tenant_id: tenantId,\n keys,\n },\n context,\n );\n\n return deleted.length;\n },\n {\n operation: 'SurrealKvProvider.deleteMany',\n context,\n input: { tenantId, keyCount: keys.length },\n },\n );\n }\n\n async clear(tenantId: string, context: RequestContext): Promise<number> {\n return ErrorHandler.tryCatch(\n async () => {\n const query = `\n DELETE FROM type::table($table)\n WHERE tenant_id = $tenant_id\n RETURN BEFORE\n `;\n\n const result = await this.executeQuery<KvStoreRecord>(\n query,\n {\n table: this.tableName,\n tenant_id: tenantId,\n },\n context,\n );\n\n const count = result.length;\n logger.info(\n `[SurrealKvProvider] Cleared ${count} keys for tenant: ${tenantId}`,\n context,\n );\n return count;\n },\n {\n operation: 'SurrealKvProvider.clear',\n context,\n input: { tenantId },\n },\n );\n }\n\n /**\n * Perform health check on the connection.\n *\n * @param context - Request context for logging\n * @returns Health check result\n */\n async healthCheck(context: RequestContext): Promise<boolean> {\n return ErrorHandler.tryCatch(\n async () => {\n try {\n // Simple ping query\n await this.client.query('SELECT 1 as ping');\n return true;\n } catch (_error) {\n return false;\n }\n },\n {\n operation: 'SurrealKvProvider.healthCheck',\n context,\n },\n );\n }\n}\n","/**\n * @fileoverview Implements the IStorageProvider interface for Cloudflare R2.\n *\n * Performance note: TTL filtering in list operations is not applied at the R2 API level.\n * Expired entries are only removed on get operations. For large datasets, consider\n * implementing periodic cleanup jobs to remove expired entries.\n *\n * @module src/storage/providers/cloudflare/r2Provider\n */\nimport type { R2Bucket } from '@cloudflare/workers-types';\n\nimport type {\n IStorageProvider,\n StorageOptions,\n ListOptions,\n ListResult,\n} from '@/storage/core/IStorageProvider.js';\nimport { JsonRpcErrorCode, McpError } from '@/types-global/errors.js';\nimport { ErrorHandler, logger, type RequestContext } from '@/utils/index.js';\n\ntype R2Envelope = {\n __mcp: { v: 1; expiresAt?: number };\n value: unknown;\n};\n\nconst R2_ENVELOPE_VERSION = 1;\nconst DEFAULT_LIST_LIMIT = 1000;\n\nexport class R2Provider implements IStorageProvider {\n private readonly bucket: R2Bucket;\n\n constructor(bucket: R2Bucket) {\n if (!bucket) {\n throw new McpError(\n JsonRpcErrorCode.ConfigurationError,\n 'R2Provider requires a valid R2Bucket instance.',\n );\n }\n this.bucket = bucket;\n }\n\n private getR2Key(tenantId: string, key: string): string {\n return `${tenantId}:${key}`;\n }\n\n private buildEnvelope(value: unknown, options?: StorageOptions): R2Envelope {\n // Fix: Check for undefined instead of truthy to handle ttl=0 correctly\n const expiresAt =\n options?.ttl !== undefined ? Date.now() + options.ttl * 1000 : undefined;\n return {\n __mcp: {\n v: R2_ENVELOPE_VERSION,\n ...(expiresAt !== undefined ? { expiresAt } : {}),\n },\n value,\n };\n }\n\n private parseAndValidate<T>(\n raw: string,\n tenantId: string,\n key: string,\n context: RequestContext,\n ): T | null {\n try {\n const parsed: unknown = JSON.parse(raw);\n if (parsed && typeof parsed === 'object' && '__mcp' in parsed) {\n const env = parsed as R2Envelope;\n const expiresAt = env.__mcp?.expiresAt;\n if (expiresAt && Date.now() > expiresAt) {\n // expired\n return null;\n }\n return env.value as T;\n }\n // legacy: direct value\n return parsed as T;\n } catch (error: unknown) {\n throw new McpError(\n JsonRpcErrorCode.SerializationError,\n `[R2Provider] Failed to parse JSON for key: ${this.getR2Key(\n tenantId,\n key,\n )}`,\n { ...context, error },\n );\n }\n }\n\n async get<T>(\n tenantId: string,\n key: string,\n context: RequestContext,\n ): Promise<T | null> {\n const r2Key = this.getR2Key(tenantId, key);\n return ErrorHandler.tryCatch(\n async () => {\n logger.debug(`[R2Provider] Getting key: ${r2Key}`, context);\n const object = await this.bucket.get(r2Key);\n if (object === null) {\n return null;\n }\n const text = await object.text();\n const value = this.parseAndValidate<T>(text, tenantId, key, context);\n if (value === null) {\n // best-effort cleanup if expired\n await this.bucket.delete(r2Key).catch(() => {});\n logger.debug(\n `[R2Provider] Key expired and removed: ${r2Key}`,\n context,\n );\n }\n return value;\n },\n {\n operation: 'R2Provider.get',\n context,\n input: { tenantId, key },\n },\n );\n }\n\n async set(\n tenantId: string,\n key: string,\n value: unknown,\n context: RequestContext,\n options?: StorageOptions,\n ): Promise<void> {\n const r2Key = this.getR2Key(tenantId, key);\n return ErrorHandler.tryCatch(\n async () => {\n logger.debug(`[R2Provider] Setting key: ${r2Key}`, {\n ...context,\n options,\n });\n const envelope = this.buildEnvelope(value, options);\n const body = JSON.stringify(envelope);\n await this.bucket.put(r2Key, body);\n logger.debug(`[R2Provider] Successfully set key: ${r2Key}`, context);\n },\n {\n operation: 'R2Provider.set',\n context,\n input: { tenantId, key },\n },\n );\n }\n\n async delete(\n tenantId: string,\n key: string,\n context: RequestContext,\n ): Promise<boolean> {\n const r2Key = this.getR2Key(tenantId, key);\n return ErrorHandler.tryCatch(\n async () => {\n logger.debug(`[R2Provider] Deleting key: ${r2Key}`, context);\n const head = await this.bucket.head(r2Key);\n if (head === null) {\n logger.debug(\n `[R2Provider] Key to delete not found: ${r2Key}`,\n context,\n );\n return false;\n }\n await this.bucket.delete(r2Key);\n logger.debug(\n `[R2Provider] Successfully deleted key: ${r2Key}`,\n context,\n );\n return true;\n },\n {\n operation: 'R2Provider.delete',\n context,\n input: { tenantId, key },\n },\n );\n }\n\n async list(\n tenantId: string,\n prefix: string,\n context: RequestContext,\n options?: ListOptions,\n ): Promise<ListResult> {\n const r2Prefix = this.getR2Key(tenantId, prefix);\n return ErrorHandler.tryCatch(\n async () => {\n logger.debug(`[R2Provider] Listing keys with prefix: ${r2Prefix}`, {\n ...context,\n options,\n });\n\n const limit = options?.limit ?? DEFAULT_LIST_LIMIT;\n const listOptions: import('@cloudflare/workers-types').R2ListOptions = {\n prefix: r2Prefix,\n limit: limit + 1, // Fetch one extra to determine if there are more\n };\n if (options?.cursor) {\n listOptions.cursor = options.cursor;\n }\n const listed = await this.bucket.list(listOptions);\n\n const tenantPrefix = `${tenantId}:`;\n const keys = listed.objects.map((obj) =>\n obj.key.startsWith(tenantPrefix)\n ? obj.key.substring(tenantPrefix.length)\n : obj.key,\n );\n\n const hasMore = keys.length > limit;\n const resultKeys = hasMore ? keys.slice(0, limit) : keys;\n const nextCursor =\n 'cursor' in listed && listed.truncated ? listed.cursor : undefined;\n\n logger.debug(\n `[R2Provider] Found ${resultKeys.length} keys with prefix: ${r2Prefix}`,\n context,\n );\n\n return {\n keys: resultKeys,\n nextCursor,\n };\n },\n {\n operation: 'R2Provider.list',\n context,\n input: { tenantId, prefix, options },\n },\n );\n }\n\n async getMany<T>(\n tenantId: string,\n keys: string[],\n context: RequestContext,\n ): Promise<Map<string, T>> {\n return ErrorHandler.tryCatch(\n async () => {\n if (keys.length === 0) {\n return new Map<string, T>();\n }\n\n const results = new Map<string, T>();\n for (const key of keys) {\n const value = await this.get<T>(tenantId, key, context);\n if (value !== null) {\n results.set(key, value);\n }\n }\n return results;\n },\n {\n operation: 'R2Provider.getMany',\n context,\n input: { tenantId, keyCount: keys.length },\n },\n );\n }\n\n async setMany(\n tenantId: string,\n entries: Map<string, unknown>,\n context: RequestContext,\n options?: StorageOptions,\n ): Promise<void> {\n return ErrorHandler.tryCatch(\n async () => {\n if (entries.size === 0) {\n return;\n }\n\n const promises = Array.from(entries.entries()).map(([key, value]) =>\n this.set(tenantId, key, value, context, options),\n );\n await Promise.all(promises);\n },\n {\n operation: 'R2Provider.setMany',\n context,\n input: { tenantId, entryCount: entries.size },\n },\n );\n }\n\n async deleteMany(\n tenantId: string,\n keys: string[],\n context: RequestContext,\n ): Promise<number> {\n return ErrorHandler.tryCatch(\n async () => {\n if (keys.length === 0) {\n return 0;\n }\n\n const promises = keys.map((key) => this.delete(tenantId, key, context));\n const results = await Promise.all(promises);\n return results.filter((deleted) => deleted).length;\n },\n {\n operation: 'R2Provider.deleteMany',\n context,\n input: { tenantId, keyCount: keys.length },\n },\n );\n }\n\n async clear(tenantId: string, context: RequestContext): Promise<number> {\n return ErrorHandler.tryCatch(\n async () => {\n const r2Prefix = `${tenantId}:`;\n let deletedCount = 0;\n let cursor: string | undefined;\n let hasMore = true;\n\n while (hasMore) {\n const listOpts: import('@cloudflare/workers-types').R2ListOptions = {\n prefix: r2Prefix,\n limit: 1000,\n };\n if (cursor) {\n listOpts.cursor = cursor;\n }\n const listed = await this.bucket.list(listOpts);\n\n const deletePromises = listed.objects.map((obj) =>\n this.bucket.delete(obj.key),\n );\n await Promise.all(deletePromises);\n deletedCount += listed.objects.length;\n\n hasMore = listed.truncated;\n cursor = 'cursor' in listed ? listed.cursor : undefined;\n }\n\n logger.info(\n `[R2Provider] Cleared ${deletedCount} keys for tenant: ${tenantId}`,\n context,\n );\n return deletedCount;\n },\n {\n operation: 'R2Provider.clear',\n context,\n input: { tenantId },\n },\n );\n }\n}\n","/**\n * @fileoverview Implements the IStorageProvider interface for Cloudflare KV.\n * @module src/storage/providers/cloudflare/kvProvider\n */\nimport type { KVNamespace } from '@cloudflare/workers-types';\n\nimport type {\n IStorageProvider,\n StorageOptions,\n ListOptions,\n ListResult,\n} from '@/storage/core/IStorageProvider.js';\nimport { JsonRpcErrorCode, McpError } from '@/types-global/errors.js';\nimport { ErrorHandler, logger, type RequestContext } from '@/utils/index.js';\n\nconst DEFAULT_LIST_LIMIT = 1000;\n\nexport class KvProvider implements IStorageProvider {\n private readonly kv: KVNamespace;\n\n constructor(kv: KVNamespace) {\n if (!kv) {\n throw new McpError(\n JsonRpcErrorCode.ConfigurationError,\n 'KvProvider requires a valid KVNamespace instance.',\n );\n }\n this.kv = kv;\n }\n\n private getKvKey(tenantId: string, key: string): string {\n return `${tenantId}:${key}`;\n }\n\n async get<T>(\n tenantId: string,\n key: string,\n context: RequestContext,\n ): Promise<T | null> {\n const kvKey = this.getKvKey(tenantId, key);\n return ErrorHandler.tryCatch(\n async () => {\n logger.debug(`[KvProvider] Getting key: ${kvKey}`, context);\n try {\n const result = await this.kv.get<T>(kvKey, 'json');\n return result; // null indicates not found\n } catch (error: unknown) {\n throw new McpError(\n JsonRpcErrorCode.SerializationError,\n `[KvProvider] Failed to parse JSON for key: ${kvKey}`,\n { ...context, error },\n );\n }\n },\n {\n operation: 'KvProvider.get',\n context,\n input: { tenantId, key },\n },\n );\n }\n\n async set(\n tenantId: string,\n key: string,\n value: unknown,\n context: RequestContext,\n options?: StorageOptions,\n ): Promise<void> {\n const kvKey = this.getKvKey(tenantId, key);\n return ErrorHandler.tryCatch(\n async () => {\n logger.debug(`[KvProvider] Setting key: ${kvKey}`, {\n ...context,\n options,\n });\n const valueToStore = JSON.stringify(value);\n\n const putOptions: import('@cloudflare/workers-types').KVNamespacePutOptions =\n {};\n // Fix: Check for undefined instead of truthy to handle ttl=0 correctly\n if (options?.ttl !== undefined) {\n putOptions.expirationTtl = options.ttl;\n }\n\n await this.kv.put(kvKey, valueToStore, putOptions);\n logger.debug(`[KvProvider] Successfully set key: ${kvKey}`, context);\n },\n {\n operation: 'KvProvider.set',\n context,\n input: { tenantId, key },\n },\n );\n }\n\n async delete(\n tenantId: string,\n key: string,\n context: RequestContext,\n ): Promise<boolean> {\n const kvKey = this.getKvKey(tenantId, key);\n return ErrorHandler.tryCatch(\n async () => {\n logger.debug(`[KvProvider] Deleting key: ${kvKey}`, context);\n\n const value = await this.kv.get(kvKey);\n if (value === null) {\n logger.debug(\n `[KvProvider] Key to delete not found: ${kvKey}`,\n context,\n );\n return false;\n }\n\n await this.kv.delete(kvKey);\n logger.debug(\n `[KvProvider] Successfully deleted key: ${kvKey}`,\n context,\n );\n return true;\n },\n {\n operation: 'KvProvider.delete',\n context,\n input: { tenantId, key },\n },\n );\n }\n\n async list(\n tenantId: string,\n prefix: string,\n context: RequestContext,\n options?: ListOptions,\n ): Promise<ListResult> {\n const kvPrefix = this.getKvKey(tenantId, prefix);\n return ErrorHandler.tryCatch(\n async () => {\n logger.debug(`[KvProvider] Listing keys with prefix: ${kvPrefix}`, {\n ...context,\n options,\n });\n\n const limit = options?.limit ?? DEFAULT_LIST_LIMIT;\n const listOptions: import('@cloudflare/workers-types').KVNamespaceListOptions =\n {\n prefix: kvPrefix,\n limit,\n };\n if (options?.cursor) {\n listOptions.cursor = options.cursor;\n }\n const listed = await this.kv.list(listOptions);\n\n const tenantPrefix = `${tenantId}:`;\n const keys = listed.keys.map((keyInfo) =>\n keyInfo.name.startsWith(tenantPrefix)\n ? keyInfo.name.substring(tenantPrefix.length)\n : keyInfo.name,\n );\n\n const nextCursor =\n 'cursor' in listed && !listed.list_complete\n ? listed.cursor\n : undefined;\n\n logger.debug(\n `[KvProvider] Found ${keys.length} keys with prefix: ${kvPrefix}`,\n context,\n );\n\n return {\n keys,\n nextCursor,\n };\n },\n {\n operation: 'KvProvider.list',\n context,\n input: { tenantId, prefix, options },\n },\n );\n }\n\n async getMany<T>(\n tenantId: string,\n keys: string[],\n context: RequestContext,\n ): Promise<Map<string, T>> {\n return ErrorHandler.tryCatch(\n async () => {\n if (keys.length === 0) {\n return new Map<string, T>();\n }\n\n const results = new Map<string, T>();\n for (const key of keys) {\n const value = await this.get<T>(tenantId, key, context);\n if (value !== null) {\n results.set(key, value);\n }\n }\n return results;\n },\n {\n operation: 'KvProvider.getMany',\n context,\n input: { tenantId, keyCount: keys.length },\n },\n );\n }\n\n async setMany(\n tenantId: string,\n entries: Map<string, unknown>,\n context: RequestContext,\n options?: StorageOptions,\n ): Promise<void> {\n return ErrorHandler.tryCatch(\n async () => {\n if (entries.size === 0) {\n return;\n }\n\n const promises = Array.from(entries.entries()).map(([key, value]) =>\n this.set(tenantId, key, value, context, options),\n );\n await Promise.all(promises);\n },\n {\n operation: 'KvProvider.setMany',\n context,\n input: { tenantId, entryCount: entries.size },\n },\n );\n }\n\n async deleteMany(\n tenantId: string,\n keys: string[],\n context: RequestContext,\n ): Promise<number> {\n return ErrorHandler.tryCatch(\n async () => {\n if (keys.length === 0) {\n return 0;\n }\n\n const promises = keys.map((key) => this.delete(tenantId, key, context));\n const results = await Promise.all(promises);\n return results.filter((deleted) => deleted).length;\n },\n {\n operation: 'KvProvider.deleteMany',\n context,\n input: { tenantId, keyCount: keys.length },\n },\n );\n }\n\n async clear(tenantId: string, context: RequestContext): Promise<number> {\n return ErrorHandler.tryCatch(\n async () => {\n const kvPrefix = `${tenantId}:`;\n let deletedCount = 0;\n let cursor: string | undefined;\n let listComplete = false;\n\n while (!listComplete) {\n const listOpts: import('@cloudflare/workers-types').KVNamespaceListOptions =\n {\n prefix: kvPrefix,\n limit: 1000,\n };\n if (cursor) {\n listOpts.cursor = cursor;\n }\n const listed = await this.kv.list(listOpts);\n\n const deletePromises = listed.keys.map((keyInfo) =>\n this.kv.delete(keyInfo.name),\n );\n await Promise.all(deletePromises);\n deletedCount += listed.keys.length;\n\n listComplete = listed.list_complete;\n cursor = 'cursor' in listed ? listed.cursor : undefined;\n }\n\n logger.info(\n `[KvProvider] Cleared ${deletedCount} keys for tenant: ${tenantId}`,\n context,\n );\n return deletedCount;\n },\n {\n operation: 'KvProvider.clear',\n context,\n input: { tenantId },\n },\n );\n }\n}\n","/**\n * @fileoverview Implements the IStorageProvider interface for Cloudflare D1.\n * Provides SQL-based key-value storage with multi-tenancy, TTL support, and batch operations.\n * @module src/storage/providers/cloudflare/d1Provider\n */\nimport type { D1Database } from '@cloudflare/workers-types';\n\nimport type {\n IStorageProvider,\n StorageOptions,\n ListOptions,\n ListResult,\n} from '@/storage/core/IStorageProvider.js';\nimport {\n encodeCursor,\n decodeCursor,\n} from '@/storage/core/storageValidation.js';\nimport { JsonRpcErrorCode, McpError } from '@/types-global/errors.js';\nimport { ErrorHandler, logger, type RequestContext } from '@/utils/index.js';\n\nconst DEFAULT_LIST_LIMIT = 1000;\n\n/**\n * Cloudflare D1 storage provider implementation.\n *\n * Features:\n * - SQL-based key-value storage with multi-tenancy\n * - TTL support via expires_at column (Unix timestamp in milliseconds)\n * - Batch operations using D1's batch() API for transactional writes\n * - Cursor-based pagination with tenant-bound security\n * - Strong consistency (vs KV's eventual consistency)\n *\n * Schema Requirements:\n * - Table: kv_store (tenant_id, key, value, expires_at)\n * - See docs/cloudflare-d1-schema.sql for setup\n *\n * Performance Characteristics:\n * - Reads: ~50-100ms (depends on query complexity)\n * - Writes: ~50-200ms (single), ~100-500ms (batch)\n * - List operations: Efficient with proper indexes\n * - Batch operations: 20-100x faster than individual calls\n */\nexport class D1Provider implements IStorageProvider {\n private readonly db: D1Database;\n private readonly tableName: string;\n\n /**\n * Creates a new D1Provider instance.\n *\n * @param db - The D1Database binding from Cloudflare Workers\n * @param tableName - The name of the kv_store table (default: 'kv_store')\n * @throws {McpError} If db is not provided or invalid\n */\n constructor(db: D1Database, tableName = 'kv_store') {\n if (!db) {\n throw new McpError(\n JsonRpcErrorCode.ConfigurationError,\n 'D1Provider requires a valid D1Database instance.',\n );\n }\n this.db = db;\n this.tableName = tableName;\n }\n\n /**\n * Helper to get current timestamp in milliseconds.\n */\n private getNow(): number {\n return Date.now();\n }\n\n /**\n * Helper to check if a value has expired based on expires_at timestamp.\n */\n private isExpired(expiresAt: number | null): boolean {\n if (expiresAt === null) return false;\n return expiresAt <= this.getNow();\n }\n\n /**\n * Retrieves a value from the D1 database.\n * Returns null if the key doesn't exist or has expired.\n */\n async get<T>(\n tenantId: string,\n key: string,\n context: RequestContext,\n ): Promise<T | null> {\n return ErrorHandler.tryCatch(\n async () => {\n logger.debug(`[D1Provider] Getting key: ${key}`, context);\n\n const stmt = this.db\n .prepare(\n `SELECT value, expires_at FROM ${this.tableName} WHERE tenant_id = ? AND key = ?`,\n )\n .bind(tenantId, key);\n\n const result = await stmt.first<{\n value: string;\n expires_at: number | null;\n }>();\n\n if (!result) {\n logger.debug(`[D1Provider] Key not found: ${key}`, context);\n return null;\n }\n\n // Check TTL expiration\n if (this.isExpired(result.expires_at)) {\n logger.debug(`[D1Provider] Key expired: ${key}`, context);\n // Optionally delete expired key (lazy cleanup)\n await this.delete(tenantId, key, context);\n return null;\n }\n\n try {\n return JSON.parse(result.value) as T;\n } catch (error: unknown) {\n throw new McpError(\n JsonRpcErrorCode.SerializationError,\n `[D1Provider] Failed to parse JSON for key: ${key}`,\n { ...context, error },\n );\n }\n },\n {\n operation: 'D1Provider.get',\n context,\n input: { tenantId, key },\n },\n );\n }\n\n /**\n * Stores a value in the D1 database.\n * Uses UPSERT (INSERT OR REPLACE) to handle both new and existing keys.\n */\n async set(\n tenantId: string,\n key: string,\n value: unknown,\n context: RequestContext,\n options?: StorageOptions,\n ): Promise<void> {\n return ErrorHandler.tryCatch(\n async () => {\n logger.debug(`[D1Provider] Setting key: ${key}`, {\n ...context,\n options,\n });\n\n const serializedValue = JSON.stringify(value);\n let expiresAt: number | null = null;\n\n // Handle TTL (including ttl=0 for immediate expiration)\n if (options?.ttl !== undefined) {\n expiresAt = this.getNow() + options.ttl * 1000;\n }\n\n const stmt = this.db\n .prepare(\n `INSERT OR REPLACE INTO ${this.tableName} (tenant_id, key, value, expires_at) VALUES (?, ?, ?, ?)`,\n )\n .bind(tenantId, key, serializedValue, expiresAt);\n\n await stmt.run();\n logger.debug(`[D1Provider] Successfully set key: ${key}`, context);\n },\n {\n operation: 'D1Provider.set',\n context,\n input: { tenantId, key },\n },\n );\n }\n\n /**\n * Deletes a key from the D1 database.\n * Returns true if the key existed, false otherwise.\n */\n async delete(\n tenantId: string,\n key: string,\n context: RequestContext,\n ): Promise<boolean> {\n return ErrorHandler.tryCatch(\n async () => {\n logger.debug(`[D1Provider] Deleting key: ${key}`, context);\n\n const stmt = this.db\n .prepare(\n `DELETE FROM ${this.tableName} WHERE tenant_id = ? AND key = ?`,\n )\n .bind(tenantId, key);\n\n const result = await stmt.run();\n\n // D1's meta.changes indicates number of rows affected\n const deleted = (result.meta?.changes ?? 0) > 0;\n\n if (deleted) {\n logger.debug(\n `[D1Provider] Successfully deleted key: ${key}`,\n context,\n );\n } else {\n logger.debug(`[D1Provider] Key to delete not found: ${key}`, context);\n }\n\n return deleted;\n },\n {\n operation: 'D1Provider.delete',\n context,\n input: { tenantId, key },\n },\n );\n }\n\n /**\n * Lists keys matching a prefix with pagination support.\n * Filters out expired keys based on TTL.\n */\n async list(\n tenantId: string,\n prefix: string,\n context: RequestContext,\n options?: ListOptions,\n ): Promise<ListResult> {\n return ErrorHandler.tryCatch(\n async () => {\n logger.debug(`[D1Provider] Listing keys with prefix: ${prefix}`, {\n ...context,\n options,\n });\n\n const limit = options?.limit ?? DEFAULT_LIST_LIMIT;\n let lastKey: string | undefined;\n\n // Decode cursor if provided\n if (options?.cursor) {\n try {\n lastKey = decodeCursor(options.cursor, tenantId, context);\n } catch (error: unknown) {\n throw new McpError(\n JsonRpcErrorCode.InvalidParams,\n 'Invalid cursor format or tenant mismatch',\n { ...context, error },\n );\n }\n }\n\n // Query with prefix matching and TTL filtering\n const now = this.getNow();\n let stmt;\n\n if (lastKey) {\n // Cursor-based pagination: fetch keys after lastKey\n stmt = this.db\n .prepare(\n `SELECT key FROM ${this.tableName}\n WHERE tenant_id = ?\n AND key LIKE ?\n AND key > ?\n AND (expires_at IS NULL OR expires_at > ?)\n ORDER BY key\n LIMIT ?`,\n )\n .bind(tenantId, `${prefix}%`, lastKey, now, limit + 1);\n } else {\n // Initial page: no cursor\n stmt = this.db\n .prepare(\n `SELECT key FROM ${this.tableName}\n WHERE tenant_id = ?\n AND key LIKE ?\n AND (expires_at IS NULL OR expires_at > ?)\n ORDER BY key\n LIMIT ?`,\n )\n .bind(tenantId, `${prefix}%`, now, limit + 1);\n }\n\n const result = await stmt.all<{ key: string }>();\n const rows = result.results ?? [];\n\n // Check if there are more results (for pagination)\n const hasMore = rows.length > limit;\n const keys = hasMore ? rows.slice(0, limit) : rows;\n\n // Generate next cursor if more results exist\n let nextCursor: string | undefined;\n if (hasMore && keys.length > 0) {\n // Use the last key from the results as the cursor\n nextCursor = encodeCursor(keys[keys.length - 1]!.key, tenantId);\n }\n\n logger.debug(\n `[D1Provider] Found ${keys.length} keys with prefix: ${prefix}`,\n context,\n );\n\n return {\n keys: keys.map((row) => row.key),\n nextCursor,\n };\n },\n {\n operation: 'D1Provider.list',\n context,\n input: { tenantId, prefix, options },\n },\n );\n }\n\n /**\n * Retrieves multiple values in a single operation.\n * More efficient than multiple individual get() calls.\n * Uses SQL IN clause for batch fetching.\n */\n async getMany<T>(\n tenantId: string,\n keys: string[],\n context: RequestContext,\n ): Promise<Map<string, T>> {\n return ErrorHandler.tryCatch(\n async () => {\n if (keys.length === 0) {\n return new Map<string, T>();\n }\n\n logger.debug(\n `[D1Provider] Getting ${keys.length} keys in batch`,\n context,\n );\n\n // Build SQL IN clause\n const placeholders = keys.map(() => '?').join(',');\n const now = this.getNow();\n\n const stmt = this.db\n .prepare(\n `SELECT key, value, expires_at FROM ${this.tableName}\n WHERE tenant_id = ?\n AND key IN (${placeholders})\n AND (expires_at IS NULL OR expires_at > ?)`,\n )\n .bind(tenantId, ...keys, now);\n\n const result = await stmt.all<{\n key: string;\n value: string;\n expires_at: number | null;\n }>();\n\n const results = new Map<string, T>();\n const rows = result.results ?? [];\n\n for (const row of rows) {\n try {\n const parsed = JSON.parse(row.value) as T;\n results.set(row.key, parsed);\n } catch (error: unknown) {\n logger.warning(\n `[D1Provider] Failed to parse value for key: ${row.key}`,\n { ...context, error },\n );\n // Skip unparseable values\n }\n }\n\n return results;\n },\n {\n operation: 'D1Provider.getMany',\n context,\n input: { tenantId, keyCount: keys.length },\n },\n );\n }\n\n /**\n * Stores multiple key-value pairs in a single transaction.\n * Uses D1's batch() API for atomic, transactional writes.\n * Significantly faster than individual set() calls (20-100x).\n */\n async setMany(\n tenantId: string,\n entries: Map<string, unknown>,\n context: RequestContext,\n options?: StorageOptions,\n ): Promise<void> {\n return ErrorHandler.tryCatch(\n async () => {\n if (entries.size === 0) {\n return;\n }\n\n logger.debug(`[D1Provider] Setting ${entries.size} keys in batch`, {\n ...context,\n options,\n });\n\n let expiresAt: number | null = null;\n if (options?.ttl !== undefined) {\n expiresAt = this.getNow() + options.ttl * 1000;\n }\n\n // Prepare batch statements\n const statements = Array.from(entries.entries()).map(([key, value]) => {\n const serializedValue = JSON.stringify(value);\n return this.db\n .prepare(\n `INSERT OR REPLACE INTO ${this.tableName} (tenant_id, key, value, expires_at) VALUES (?, ?, ?, ?)`,\n )\n .bind(tenantId, key, serializedValue, expiresAt);\n });\n\n // Execute as a single transaction\n await this.db.batch(statements);\n\n logger.debug(\n `[D1Provider] Successfully set ${entries.size} keys in batch`,\n context,\n );\n },\n {\n operation: 'D1Provider.setMany',\n context,\n input: { tenantId, entryCount: entries.size },\n },\n );\n }\n\n /**\n * Deletes multiple keys in a single transaction.\n * Uses D1's batch() API for atomic deletion.\n * Returns the count of successfully deleted keys.\n */\n async deleteMany(\n tenantId: string,\n keys: string[],\n context: RequestContext,\n ): Promise<number> {\n return ErrorHandler.tryCatch(\n async () => {\n if (keys.length === 0) {\n return 0;\n }\n\n logger.debug(\n `[D1Provider] Deleting ${keys.length} keys in batch`,\n context,\n );\n\n // Prepare batch delete statements\n const statements = keys.map((key) =>\n this.db\n .prepare(\n `DELETE FROM ${this.tableName} WHERE tenant_id = ? AND key = ?`,\n )\n .bind(tenantId, key),\n );\n\n // Execute as a single transaction\n const results = await this.db.batch(statements);\n\n // Count how many rows were actually deleted\n const deletedCount = results.reduce(\n (count, result) => count + (result.meta?.changes ?? 0),\n 0,\n );\n\n logger.debug(\n `[D1Provider] Deleted ${deletedCount} of ${keys.length} keys`,\n context,\n );\n\n return deletedCount;\n },\n {\n operation: 'D1Provider.deleteMany',\n context,\n input: { tenantId, keyCount: keys.length },\n },\n );\n }\n\n /**\n * Clears all keys for a given tenant.\n * WARNING: This is a destructive operation that cannot be undone.\n * Useful for testing or tenant cleanup operations.\n */\n async clear(tenantId: string, context: RequestContext): Promise<number> {\n return ErrorHandler.tryCatch(\n async () => {\n logger.warning(\n `[D1Provider] Clearing all keys for tenant: ${tenantId}`,\n context,\n );\n\n const stmt = this.db\n .prepare(`DELETE FROM ${this.tableName} WHERE tenant_id = ?`)\n .bind(tenantId);\n\n const result = await stmt.run();\n const deletedCount = result.meta?.changes ?? 0;\n\n logger.info(\n `[D1Provider] Cleared ${deletedCount} keys for tenant: ${tenantId}`,\n context,\n );\n\n return deletedCount;\n },\n {\n operation: 'D1Provider.clear',\n context,\n input: { tenantId },\n },\n );\n }\n}\n","/**\n * @fileoverview Factory function for creating a storage provider based on application configuration.\n * This module decouples the application from concrete storage implementations, allowing the\n * storage backend to be selected via environment variables. In a serverless environment,\n * it defaults to `in-memory` to ensure compatibility.\n * @module src/storage/core/storageFactory\n */\nimport { container } from 'tsyringe';\nimport type {\n R2Bucket,\n KVNamespace,\n D1Database,\n} from '@cloudflare/workers-types';\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport type Surreal from 'surrealdb';\n\nimport type { AppConfig } from '@/config/index.js';\nimport type { Database } from '@/storage/providers/supabase/supabase.types.js';\nimport { JsonRpcErrorCode, McpError } from '@/types-global/errors.js';\nimport type { IStorageProvider } from '@/storage/core/IStorageProvider.js';\nimport { FileSystemProvider } from '@/storage/providers/fileSystem/fileSystemProvider.js';\nimport { InMemoryProvider } from '@/storage/providers/inMemory/inMemoryProvider.js';\nimport { SupabaseProvider } from '@/storage/providers/supabase/supabaseProvider.js';\nimport { SurrealKvProvider } from '@/storage/providers/surrealdb/kv/surrealKvProvider.js';\nimport { R2Provider } from '@/storage/providers/cloudflare/r2Provider.js';\nimport { KvProvider } from '@/storage/providers/cloudflare/kvProvider.js';\nimport { D1Provider } from '@/storage/providers/cloudflare/d1Provider.js';\nimport { logger, requestContextService } from '@/utils/index.js';\n\nconst isServerless =\n typeof process === 'undefined' || process.env.IS_SERVERLESS === 'true';\n\n/**\n * Optional dependencies for storage provider creation.\n * Allows pre-resolved dependencies to be passed in, useful for testing\n * and Worker environments where DI container may not be available.\n */\nexport interface StorageFactoryDeps {\n /** Pre-configured Supabase client */\n readonly supabaseClient?: SupabaseClient<Database>;\n /** Pre-configured SurrealDB client */\n readonly surrealdbClient?: Surreal;\n /** Cloudflare R2 bucket binding */\n readonly r2Bucket?: R2Bucket;\n /** Cloudflare KV namespace binding */\n readonly kvNamespace?: KVNamespace;\n /** Cloudflare D1 database binding */\n readonly d1Database?: D1Database;\n}\n\n/**\n * Creates and returns a storage provider instance based on the provided configuration.\n *\n * This factory decouples the application from concrete storage implementations,\n * allowing the backend to be selected via environment configuration. In serverless\n * environments, automatically falls back to in-memory storage for non-compatible providers.\n *\n * Provider Selection Logic:\n * - Serverless environment: Only `in-memory`, `cloudflare-r2`, `cloudflare-kv` allowed\n * - Node environment: All providers available\n * - Missing config: Throws ConfigurationError\n *\n * @param config - The application configuration object, typically resolved from DI container.\n * @param deps - Optional pre-resolved dependencies for providers (useful for testing/Workers).\n * @returns An instance of a class that implements the IStorageProvider interface.\n *\n * @throws {McpError} JsonRpcErrorCode.ConfigurationError - If:\n * - filesystem provider selected but STORAGE_FILESYSTEM_PATH not set\n * - supabase provider selected but SUPABASE_URL or SUPABASE_SERVICE_ROLE_KEY not set\n * - cloudflare-r2 provider selected in non-serverless environment\n * - cloudflare-kv provider selected in non-serverless environment\n * - unknown provider type specified\n *\n * @example\n * ```typescript\n * // Standard usage via DI\n * const config = container.resolve<AppConfig>(AppConfig);\n * const provider = createStorageProvider(config);\n *\n * // Worker usage with pre-resolved bindings\n * const provider = createStorageProvider(config, {\n * r2Bucket: env.R2_BUCKET,\n * kvNamespace: env.KV_NAMESPACE\n * });\n * ```\n */\nexport function createStorageProvider(\n config: AppConfig,\n deps: StorageFactoryDeps = {},\n): IStorageProvider {\n const context = requestContextService.createRequestContext({\n operation: 'createStorageProvider',\n });\n\n const providerType = config.storage.providerType;\n\n if (\n isServerless &&\n ![\n 'in-memory',\n 'surrealdb',\n 'cloudflare-r2',\n 'cloudflare-kv',\n 'cloudflare-d1',\n ].includes(providerType)\n ) {\n logger.warning(\n `Forcing 'in-memory' storage provider in serverless environment (configured: ${providerType}).`,\n context,\n );\n return new InMemoryProvider();\n }\n\n logger.info(`Creating storage provider of type: ${providerType}`, context);\n\n switch (providerType) {\n case 'in-memory':\n return new InMemoryProvider();\n case 'filesystem':\n if (!config.storage.filesystemPath) {\n throw new McpError(\n JsonRpcErrorCode.ConfigurationError,\n 'STORAGE_FILESYSTEM_PATH must be set for the filesystem storage provider.',\n context,\n );\n }\n return new FileSystemProvider(config.storage.filesystemPath);\n case 'supabase':\n if (!config.supabase?.url || !config.supabase?.serviceRoleKey) {\n throw new McpError(\n JsonRpcErrorCode.ConfigurationError,\n 'SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY must be set for the supabase storage provider.',\n context,\n );\n }\n if (deps.supabaseClient) {\n return new SupabaseProvider(deps.supabaseClient);\n }\n // Fallback to DI container (backward-compatible)\n return container.resolve(SupabaseProvider);\n case 'surrealdb':\n if (\n !config.surrealdb?.url ||\n !config.surrealdb?.namespace ||\n !config.surrealdb?.database\n ) {\n throw new McpError(\n JsonRpcErrorCode.ConfigurationError,\n 'SURREALDB_URL, SURREALDB_NAMESPACE, and SURREALDB_DATABASE must be set for the surrealdb storage provider.',\n context,\n );\n }\n if (deps.surrealdbClient) {\n return new SurrealKvProvider(\n deps.surrealdbClient,\n config.surrealdb.tableName,\n );\n }\n // Fallback to DI container\n return container.resolve(SurrealKvProvider);\n case 'cloudflare-r2':\n if (isServerless) {\n if (deps.r2Bucket) {\n return new R2Provider(deps.r2Bucket);\n }\n\n // Type guard to check if globalThis has R2_BUCKET binding\n function hasR2Bucket(obj: unknown): obj is { R2_BUCKET: R2Bucket } {\n return typeof obj === 'object' && obj !== null && 'R2_BUCKET' in obj;\n }\n\n const globalWithBinding: unknown = globalThis;\n if (!hasR2Bucket(globalWithBinding)) {\n throw new McpError(\n JsonRpcErrorCode.ConfigurationError,\n 'R2_BUCKET binding not available in globalThis. Ensure wrangler.toml is configured correctly.',\n context,\n );\n }\n\n // After type guard, globalWithBinding is narrowed to { R2_BUCKET: R2Bucket }\n return new R2Provider(globalWithBinding.R2_BUCKET);\n }\n throw new McpError(\n JsonRpcErrorCode.ConfigurationError,\n 'Cloudflare R2 storage is only available in a Cloudflare Worker environment.',\n context,\n );\n case 'cloudflare-kv':\n if (isServerless) {\n if (deps.kvNamespace) {\n return new KvProvider(deps.kvNamespace);\n }\n\n // Type guard to check if globalThis has KV_NAMESPACE binding\n function hasKVNamespace(\n obj: unknown,\n ): obj is { KV_NAMESPACE: KVNamespace } {\n return (\n typeof obj === 'object' && obj !== null && 'KV_NAMESPACE' in obj\n );\n }\n\n const globalWithBinding: unknown = globalThis;\n if (!hasKVNamespace(globalWithBinding)) {\n throw new McpError(\n JsonRpcErrorCode.ConfigurationError,\n 'KV_NAMESPACE binding not available in globalThis. Ensure wrangler.toml is configured correctly.',\n context,\n );\n }\n\n // After type guard, globalWithBinding is narrowed to { KV_NAMESPACE: KVNamespace }\n return new KvProvider(globalWithBinding.KV_NAMESPACE);\n }\n throw new McpError(\n JsonRpcErrorCode.ConfigurationError,\n 'Cloudflare KV storage is only available in a Cloudflare Worker environment.',\n context,\n );\n case 'cloudflare-d1':\n if (isServerless) {\n if (deps.d1Database) {\n return new D1Provider(deps.d1Database);\n }\n\n // Type guard to check if globalThis has DB binding\n function hasD1Database(obj: unknown): obj is { DB: D1Database } {\n return typeof obj === 'object' && obj !== null && 'DB' in obj;\n }\n\n const globalWithBinding: unknown = globalThis;\n if (!hasD1Database(globalWithBinding)) {\n throw new McpError(\n JsonRpcErrorCode.ConfigurationError,\n 'DB binding not available in globalThis. Ensure wrangler.toml is configured correctly with D1 database binding.',\n context,\n );\n }\n\n // After type guard, globalWithBinding is narrowed to { DB: D1Database }\n return new D1Provider(globalWithBinding.DB);\n }\n throw new McpError(\n JsonRpcErrorCode.ConfigurationError,\n 'Cloudflare D1 storage is only available in a Cloudflare Worker environment.',\n context,\n );\n default: {\n const exhaustiveCheck: never = providerType;\n throw new McpError(\n JsonRpcErrorCode.ConfigurationError,\n `Unhandled storage provider type: ${String(exhaustiveCheck)}`,\n context,\n );\n }\n }\n}\n","/**\n * @fileoverview Registers core application services with the DI container.\n * This module encapsulates the registration of fundamental services such as\n * configuration, logging, storage, and rate limiting.\n * @module src/container/registrations/core\n */\nimport { container, Lifecycle } from 'tsyringe';\n\nimport { createClient, type SupabaseClient } from '@supabase/supabase-js';\nimport Surreal from 'surrealdb';\n\nimport { parseConfig } from '@/config/index.js';\nimport {\n AppConfig,\n Logger,\n RateLimiterService,\n StorageProvider,\n StorageService,\n SupabaseAdminClient,\n SurrealdbClient,\n} from '@/container/tokens.js';\nimport { StorageService as StorageServiceClass } from '@/storage/core/StorageService.js';\nimport { createStorageProvider } from '@/storage/core/storageFactory.js';\nimport type { Database } from '@/storage/providers/supabase/supabase.types.js';\nimport { JsonRpcErrorCode, McpError } from '@/types-global/errors.js';\nimport { logger } from '@/utils/index.js';\nimport { RateLimiter } from '@/utils/security/rateLimiter.js';\n\n/**\n * Registers core application services and values with the tsyringe container.\n */\nexport const registerCoreServices = () => {\n // Configuration (parsed and registered as a static value)\n const config = parseConfig();\n container.register(AppConfig, { useValue: config });\n\n // Logger (as a static value)\n container.register(Logger, { useValue: logger });\n\n type AppConfigType = ReturnType<typeof parseConfig>;\n\n container.register<SupabaseClient<Database>>(SupabaseAdminClient, {\n useFactory: (c) => {\n const cfg = c.resolve<AppConfigType>(AppConfig);\n if (!cfg.supabase?.url || !cfg.supabase?.serviceRoleKey) {\n throw new McpError(\n JsonRpcErrorCode.ConfigurationError,\n 'Supabase URL or service role key is missing for admin client.',\n );\n }\n return createClient<Database>(\n cfg.supabase.url,\n cfg.supabase.serviceRoleKey,\n {\n auth: { persistSession: false, autoRefreshToken: false },\n },\n );\n },\n });\n\n // Register SurrealDB client\n // Note: Since tsyringe doesn't support async factories, we create a promise-wrapped instance\n container.register<Surreal>(SurrealdbClient, {\n useFactory: (c) => {\n const cfg = c.resolve<AppConfigType>(AppConfig);\n if (\n !cfg.surrealdb?.url ||\n !cfg.surrealdb?.namespace ||\n !cfg.surrealdb?.database\n ) {\n throw new McpError(\n JsonRpcErrorCode.ConfigurationError,\n 'SurrealDB URL, namespace, and database are required for SurrealDB client.',\n );\n }\n\n const db = new Surreal();\n\n // Connect asynchronously (the connection will be established when first used)\n db.connect(cfg.surrealdb.url, {\n namespace: cfg.surrealdb.namespace,\n database: cfg.surrealdb.database,\n ...(cfg.surrealdb.username &&\n cfg.surrealdb.password && {\n auth: {\n username: cfg.surrealdb.username,\n password: cfg.surrealdb.password,\n },\n }),\n })\n .then(() => {\n logger.info('Connected to SurrealDB');\n })\n .catch((err: Error) => {\n logger.error('Failed to connect to SurrealDB', {\n requestId: 'surrealdb-init',\n timestamp: new Date().toISOString(),\n operation: 'SurrealDB.connect',\n error: err.message,\n });\n });\n\n return db;\n },\n });\n\n // --- Refactored Storage Service Registration ---\n // 1. Register the factory for the concrete provider against the provider token.\n // This factory depends on the AppConfig, which is already registered.\n container.register(StorageProvider, {\n useFactory: (c) => createStorageProvider(c.resolve(AppConfig)),\n });\n\n // 2. Register StorageServiceClass against the service token.\n // tsyringe will automatically inject the StorageProvider dependency.\n container.register(\n StorageService,\n { useClass: StorageServiceClass },\n { lifecycle: Lifecycle.Singleton },\n );\n // --- End Refactor ---\n\n // Register RateLimiter as a singleton service\n container.register<RateLimiter>(\n RateLimiterService,\n { useClass: RateLimiter },\n { lifecycle: Lifecycle.Singleton },\n );\n\n logger.info('Core services registered with the DI container.');\n};\n","/**\n * @fileoverview 飞书服务常量定义.\n * 包含 API 配置、默认设置、错误消息和 Callout 类型映射.\n * @module src/services/feishu/constants\n */\n\nimport type { CalloutTypeMapping, FeishuConfig } from './types.js';\n\n/**\n * FEISHU_CONFIG const 飞书 API 配置常量.\n */\nexport const FEISHU_CONFIG: FeishuConfig & {\n DEFAULT_APP_ID: string;\n DEFAULT_APP_SECRET: string;\n OAUTH_CALLBACK_URL: string;\n RATE_LIMIT_ENABLED: boolean;\n MAX_RETRIES: number;\n RETRY_DELAY_MS: number;\n} = {\n // API 基础地址\n BASE_URL:\n process.env.FEISHU_API_BASE_URL || 'https://open.feishu.cn/open-apis',\n\n // OAuth 相关地址\n AUTHORIZE_URL: 'https://open.feishu.cn/open-apis/authen/v1/authorize',\n TOKEN_URL: 'https://open.feishu.cn/open-apis/authen/v2/oauth/token',\n REFRESH_TOKEN_URL: 'https://open.feishu.cn/open-apis/authen/v2/oauth/token',\n\n // API 权限范围(包含 offline_access 以支持 refresh_token)\n SCOPES:\n 'contact:user.base:readonly docx:document wiki:wiki drive:drive offline_access',\n\n // 文件上传相关(使用素材上传 API,导入后自动删除源文件)\n UPLOAD_URL: 'https://open.feishu.cn/open-apis/drive/v1/medias/upload_all',\n\n // 文档创建相关\n DOC_CREATE_URL: 'https://open.feishu.cn/open-apis/docx/v1/documents',\n\n // 文件夹相关\n FOLDER_LIST_URL: 'https://open.feishu.cn/open-apis/drive/v1/files',\n\n // 用户信息\n USER_INFO_URL: 'https://open.feishu.cn/open-apis/authen/v1/user_info',\n\n // 默认配置(从环境变量读取)\n DEFAULT_APP_ID: process.env.FEISHU_DEFAULT_APP_ID || '',\n DEFAULT_APP_SECRET: process.env.FEISHU_DEFAULT_APP_SECRET || '',\n OAUTH_CALLBACK_URL:\n process.env.FEISHU_OAUTH_CALLBACK_URL ||\n 'http://localhost:3000/oauth/callback',\n\n // 频率限制配置\n RATE_LIMIT_ENABLED: process.env.FEISHU_RATE_LIMIT_ENABLED !== 'false',\n MAX_RETRIES: parseInt(process.env.FEISHU_MAX_RETRIES || '3', 10),\n RETRY_DELAY_MS: parseInt(process.env.FEISHU_RETRY_DELAY_MS || '1000', 10),\n};\n\n/**\n * FEISHU_ERROR_MESSAGES const 飞书错误消息映射.\n */\nexport const FEISHU_ERROR_MESSAGES: Record<number, string> = {\n 1061002: '参数错误,请检查文件格式和大小',\n 1061005: '文件大小超出限制',\n 1061006: '文件类型不支持',\n 99991663: 'access_token 无效',\n 99991664: 'access_token 已过期',\n 99991665: 'refresh_token 无效',\n 99991666: 'refresh_token 已过期',\n 20005: 'token 无效',\n};\n\n/**\n * TOKEN_EXPIRED_CODES const Token 过期相关错误码.\n */\nexport const TOKEN_EXPIRED_CODES = [\n 99991664, // access_token expired\n 99991663, // access_token invalid\n 99991665, // refresh_token expired\n 99991666, // refresh_token invalid\n 20005, // 另一种 token 无效错误码\n 1, // 通用的无效 token 错误\n];\n\n/**\n * RATE_LIMITS const API 频率限制配置.\n */\nexport const RATE_LIMITS = {\n document: { perSecond: 2, perMinute: 90 },\n import: { perSecond: 1, perMinute: 90 },\n block: { perSecond: 2, perMinute: 150 },\n file: { perSecond: 2, perMinute: 60 },\n};\n\n/**\n * CALLOUT_TYPE_MAPPING const Obsidian Callout 类型到飞书样式的映射表.\n */\nexport const CALLOUT_TYPE_MAPPING: Record<string, CalloutTypeMapping> = {\n // 信息类\n note: { emoji: '📝', color: 'blue', title: '笔记' },\n info: { emoji: 'ℹ️', color: 'blue', title: '信息' },\n tip: { emoji: '💡', color: 'green', title: '提示' },\n hint: { emoji: '💡', color: 'green', title: '提示' },\n\n // 警告类\n warning: { emoji: '⚠️', color: 'yellow', title: '警告' },\n caution: { emoji: '⚠️', color: 'yellow', title: '注意' },\n attention: { emoji: '⚠️', color: 'yellow', title: '注意' },\n\n // 错误类\n error: { emoji: '❌', color: 'red', title: '错误' },\n danger: { emoji: '⛔', color: 'red', title: '危险' },\n failure: { emoji: '❌', color: 'red', title: '失败' },\n fail: { emoji: '❌', color: 'red', title: '失败' },\n missing: { emoji: '❓', color: 'red', title: '缺失' },\n\n // 成功类\n success: { emoji: '✅', color: 'green', title: '成功' },\n check: { emoji: '✅', color: 'green', title: '检查' },\n done: { emoji: '✅', color: 'green', title: '完成' },\n\n // 问题类\n question: { emoji: '❓', color: 'purple', title: '问题' },\n help: { emoji: '❓', color: 'purple', title: '帮助' },\n faq: { emoji: '❓', color: 'purple', title: '常见问题' },\n\n // 引用类\n quote: { emoji: '💬', color: 'gray', title: '引用' },\n cite: { emoji: '📖', color: 'gray', title: '引用' },\n\n // 抽象类\n abstract: { emoji: '📄', color: 'cyan', title: '摘要' },\n summary: { emoji: '📄', color: 'cyan', title: '总结' },\n tldr: { emoji: '📄', color: 'cyan', title: 'TL;DR' },\n\n // 示例类\n example: { emoji: '📋', color: 'purple', title: '示例' },\n\n // 任务类\n todo: { emoji: '☑️', color: 'blue', title: '待办' },\n\n // 默认类型\n default: { emoji: '📌', color: 'blue', title: '提示' },\n};\n\n/**\n * CALLOUT_COLOR_MAP const Callout 颜色到飞书颜色值的映射.\n */\nexport const CALLOUT_COLOR_MAP: Record<\n string,\n { background: number; border: number; text: number }\n> = {\n blue: { background: 2, border: 2, text: 2 },\n green: { background: 4, border: 4, text: 4 },\n yellow: { background: 6, border: 6, text: 6 },\n red: { background: 1, border: 1, text: 1 },\n purple: { background: 5, border: 5, text: 5 },\n gray: { background: 7, border: 7, text: 7 },\n cyan: { background: 3, border: 3, text: 3 },\n};\n\n/**\n * DEFAULT_UPLOAD_CONFIG const 默认上传配置.\n */\nexport const DEFAULT_UPLOAD_CONFIG = {\n targetType: 'wiki' as const,\n uploadImages: true,\n uploadAttachments: true,\n removeFrontMatter: true,\n enableLinkShare: true,\n linkSharePermission: 'anyone_readable' as const,\n};\n\n/**\n * FILE_SIZE_LIMITS const 文件大小限制(字节).\n */\nexport const FILE_SIZE_LIMITS = {\n image: 20 * 1024 * 1024, // 20MB\n file: 100 * 1024 * 1024, // 100MB\n markdown: 10 * 1024 * 1024, // 10MB\n};\n\n/**\n * SUPPORTED_IMAGE_EXTENSIONS const 支持的图片扩展名.\n */\nexport const SUPPORTED_IMAGE_EXTENSIONS = [\n '.jpg',\n '.jpeg',\n '.png',\n '.gif',\n '.webp',\n '.svg',\n '.bmp',\n];\n\n/**\n * SUPPORTED_FILE_EXTENSIONS const 支持的附件扩展名.\n */\nexport const SUPPORTED_FILE_EXTENSIONS = [\n '.pdf',\n '.doc',\n '.docx',\n '.xls',\n '.xlsx',\n '.ppt',\n '.pptx',\n '.txt',\n '.zip',\n '.rar',\n '.7z',\n];\n","/**\n * @fileoverview 飞书服务编排器.\n * 协调 API Provider、Markdown Processor 和 Rate Limiter 完成高层业务逻辑.\n * @module src/services/feishu/core/FeishuService\n */\n\nimport { inject, injectable } from 'tsyringe';\nimport { McpError, JsonRpcErrorCode } from '@/types-global/errors.js';\nimport { StorageService } from '@/container/tokens.js';\nimport {\n logger,\n requestContextService,\n type RequestContext,\n} from '@/utils/index.js';\nimport type { StorageService as IStorageService } from '@/storage/core/StorageService.js';\nimport type {\n IFeishuApiProvider,\n IFeishuService,\n IMarkdownProcessor,\n IRateLimiter,\n} from './IFeishuProvider.js';\nimport type {\n FeishuAuth,\n FeishuFolder,\n FeishuUserInfo,\n FeishuWikiSpace,\n FeishuWikiNode,\n LocalFileInfo,\n MarkdownDocument,\n StoredFeishuAuth,\n UploadConfig,\n UploadedFile,\n UploadResult,\n} from '../types.js';\nimport { FEISHU_CONFIG } from '../constants.js';\n\n/**\n * FeishuService class 飞书服务编排器.\n * 实现 IFeishuService 接口,协调各个提供者完成业务逻辑.\n */\n@injectable()\nexport class FeishuService implements IFeishuService {\n private readonly storage: IStorageService;\n private apiProvider: IFeishuApiProvider | null = null;\n private markdownProcessor: IMarkdownProcessor | null = null;\n private rateLimiter: IRateLimiter | null = null;\n private contentConverter: import('./IFeishuProvider.js').IContentConverter | null = null;\n\n // 性能优化 T606: 配置缓存\n private configCache: Map<string, { value: unknown; expiresAt: number }> =\n new Map();\n private readonly cacheTtlMs = 5 * 60 * 1000; // 5 分钟缓存\n\n constructor(@inject(StorageService) storage: IStorageService) {\n this.storage = storage;\n }\n\n /** createContext method 创建请求上下文. */\n private createContext(\n operation: string,\n tenantId = 'feishu-service',\n ): RequestContext {\n const context = requestContextService.createRequestContext({\n operation,\n tenantId,\n });\n logger.debug('创建请求上下文', context);\n return context;\n }\n\n /** setProviders method 设置服务提供者. */\n setProviders(\n apiProvider: IFeishuApiProvider,\n markdownProcessor: IMarkdownProcessor,\n rateLimiter: IRateLimiter,\n contentConverter?: import('./IFeishuProvider.js').IContentConverter,\n ): void {\n this.apiProvider = apiProvider;\n this.markdownProcessor = markdownProcessor;\n this.rateLimiter = rateLimiter;\n if (contentConverter) {\n this.contentConverter = contentConverter;\n }\n }\n\n /**\n * getCached method 从缓存获取值(性能优化 T606).\n */\n private getCached<T>(key: string): T | null {\n const cached = this.configCache.get(key);\n if (cached && cached.expiresAt > Date.now()) {\n return cached.value as T;\n }\n if (cached) {\n this.configCache.delete(key);\n }\n return null;\n }\n\n /**\n * setCache method 设置缓存值(性能优化 T606).\n */\n private setCache(key: string, value: unknown): void {\n this.configCache.set(key, {\n value,\n expiresAt: Date.now() + this.cacheTtlMs,\n });\n }\n\n /**\n * clearCache method 清除缓存.\n */\n public clearCache(): void {\n this.configCache.clear();\n }\n\n /** uploadMarkdown method 上传 Markdown 文档. */\n async uploadMarkdown(\n document: MarkdownDocument,\n config: UploadConfig,\n ): Promise<UploadResult> {\n this.ensureProviders();\n const ctx = this.createContext('feishu.uploadMarkdown');\n\n const appId = config.appId || (await this.getDefaultAppId(ctx));\n if (!appId) {\n throw new McpError(\n JsonRpcErrorCode.InvalidParams,\n '未配置应用 ID,请先完成 OAuth 认证或指定 appId',\n );\n }\n\n const auth = await this.getAuth(appId, ctx);\n if (!auth) {\n throw new McpError(\n JsonRpcErrorCode.InvalidParams,\n `应用 ${appId} 未认证,请先完成 OAuth 认证`,\n );\n }\n\n const validAuth = await this.ensureValidToken(auth, ctx);\n const baseDirectory =\n document.workingDirectory ||\n (document.filePath\n ? this.getDirectoryFromPath(document.filePath)\n : process.cwd());\n\n const processResult = this.markdownProcessor!.process(\n document.content,\n baseDirectory,\n {\n removeFrontMatter: config.removeFrontMatter ?? true,\n processImages: config.uploadImages ?? true,\n processAttachments: config.uploadAttachments ?? true,\n codeBlockFilterLanguages: config.codeBlockFilterLanguages ?? [],\n },\n );\n\n const title = document.title || processResult.extractedTitle || 'Untitled';\n await this.rateLimiter!.throttle('document');\n\n const feishuDoc = await this.apiProvider!.createDocument(\n validAuth.accessToken,\n title,\n processResult.content,\n config.targetType,\n config.targetId,\n config.parentNodeToken,\n );\n\n const uploadedFiles = await this.uploadLocalFiles(\n validAuth.accessToken,\n processResult.localFiles,\n config,\n );\n\n await this.storeDocumentMeta(\n feishuDoc.documentId,\n {\n documentId: feishuDoc.documentId,\n url: feishuDoc.url,\n title,\n appId,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n lastUploadedAt: Date.now(),\n },\n ctx,\n );\n\n logger.info('文档上传成功', ctx);\n return {\n success: true,\n documentId: feishuDoc.documentId,\n url: feishuDoc.url,\n title,\n uploadedFiles,\n };\n }\n\n /** updateDocument method 更新文档. */\n async updateDocument(\n documentId: string,\n document: MarkdownDocument,\n config: UploadConfig,\n force = false,\n ): Promise<UploadResult> {\n this.ensureProviders();\n const ctx = this.createContext('feishu.updateDocument');\n\n const appId = config.appId || (await this.getDefaultAppId(ctx));\n if (!appId)\n throw new McpError(JsonRpcErrorCode.InvalidParams, '未配置应用 ID');\n\n const auth = await this.getAuth(appId, ctx);\n if (!auth)\n throw new McpError(\n JsonRpcErrorCode.InvalidParams,\n `应用 ${appId} 未认证`,\n );\n\n const validAuth = await this.ensureValidToken(auth, ctx);\n\n if (!force) {\n const conflict = await this.checkConflict(\n validAuth.accessToken,\n documentId,\n ctx,\n );\n if (conflict) {\n return {\n success: false,\n documentId,\n error:\n '检测到文档冲突:文档在上次上传后已被修改。使用 force=true 强制覆盖。',\n conflictDetected: true,\n };\n }\n }\n\n const baseDirectory =\n document.workingDirectory ||\n (document.filePath\n ? this.getDirectoryFromPath(document.filePath)\n : process.cwd());\n\n const processResult = this.markdownProcessor!.process(\n document.content,\n baseDirectory,\n {\n removeFrontMatter: config.removeFrontMatter ?? true,\n processImages: config.uploadImages ?? true,\n processAttachments: config.uploadAttachments ?? true,\n codeBlockFilterLanguages: config.codeBlockFilterLanguages ?? [],\n },\n );\n\n await this.rateLimiter!.throttle('document');\n const feishuDoc = await this.apiProvider!.updateDocument(\n validAuth.accessToken,\n documentId,\n processResult.content,\n );\n await this.updateDocumentMeta(\n documentId,\n { updatedAt: Date.now(), lastUploadedAt: Date.now() },\n ctx,\n );\n\n return {\n success: true,\n documentId: feishuDoc.documentId,\n url: feishuDoc.url,\n title: feishuDoc.title,\n };\n }\n\n /** getAuthUrl method 获取授权 URL. */\n async getAuthUrl(\n appId?: string,\n redirectUri?: string,\n ): Promise<{ authUrl: string; state: string }> {\n this.ensureProviders();\n const ctx = this.createContext('feishu.getAuthUrl');\n\n const finalAppId = appId || FEISHU_CONFIG.DEFAULT_APP_ID;\n const finalRedirectUri = redirectUri || FEISHU_CONFIG.OAUTH_CALLBACK_URL;\n if (!finalAppId)\n throw new McpError(JsonRpcErrorCode.InvalidParams, '未配置应用 ID');\n\n const result = this.apiProvider!.generateAuthUrl(\n finalAppId,\n finalRedirectUri,\n );\n\n // 存储state用于后续验证\n const stateKey = `feishu/state/${result.state}`;\n logger.info(`存储 state: ${stateKey}`, ctx);\n\n await this.storage.set(\n stateKey,\n result.state,\n ctx,\n { ttl: 10 * 60 * 1000 }, // 10分钟过期\n );\n\n // 立即验证存储是否成功\n const verifyState = await this.storage.get<string>(stateKey, ctx);\n logger.info(`验证 state 存储: ${stateKey}, 读取到: ${verifyState}`, ctx);\n\n logger.info(`State 存储成功: ${result.state}`, ctx);\n\n return result;\n }\n\n /** handleAuthCallback method 处理授权回调. */\n async handleAuthCallback(\n code: string,\n state: string,\n appId?: string,\n ): Promise<{\n success: boolean;\n userInfo?: FeishuUserInfo;\n expiresAt?: number;\n }> {\n this.ensureProviders();\n const ctx = this.createContext('feishu.handleAuthCallback');\n\n const finalAppId = appId || FEISHU_CONFIG.DEFAULT_APP_ID;\n const appSecret = await this.getAppSecret(finalAppId, ctx);\n if (!finalAppId || !appSecret)\n throw new McpError(JsonRpcErrorCode.InvalidParams, '应用配置不完整');\n\n const savedState = await this.storage.get<string>(\n `feishu/state/${state}`,\n ctx,\n );\n logger.info(`查找 state: feishu/state/${state}, 找到: ${savedState}`, ctx);\n if (!savedState)\n throw new McpError(JsonRpcErrorCode.InvalidParams, 'state 验证失败');\n\n const auth = await this.apiProvider!.exchangeCodeForToken(\n code,\n finalAppId,\n appSecret,\n FEISHU_CONFIG.OAUTH_CALLBACK_URL,\n );\n const userInfo = await this.apiProvider!.getUserInfo(auth.accessToken);\n\n await this.storeAuth(finalAppId, { ...auth, userInfo }, ctx);\n await this.storage.delete(`feishu/state/${state}`, ctx);\n\n // 检查是否只有一个应用,如果是则自动设置为默认应用\n const apps = await this.listApps(ctx);\n if (apps.length === 1) {\n logger.info('检测到只有一个应用,自动设置为默认应用', {\n ...ctx,\n appId: finalAppId,\n });\n await this.setDefaultApp(ctx, finalAppId);\n }\n\n logger.info('OAuth 认证成功', ctx);\n return { success: true, userInfo, expiresAt: auth.expiresAt };\n }\n\n /** listFolders method 列出文件夹. */\n async listFolders(\n context: RequestContext,\n parentId?: string,\n appId?: string,\n ): Promise<FeishuFolder[]> {\n this.ensureProviders();\n\n const finalAppId = appId || (await this.getDefaultAppId(context));\n if (!finalAppId)\n throw new McpError(JsonRpcErrorCode.InvalidParams, '未配置应用 ID');\n\n const auth = await this.getAuth(finalAppId, context);\n if (!auth)\n throw new McpError(\n JsonRpcErrorCode.InvalidParams,\n `应用 ${finalAppId} 未认证`,\n );\n\n const validAuth = await this.ensureValidToken(auth, context);\n await this.rateLimiter!.throttle('document');\n return this.apiProvider!.listFolders(validAuth.accessToken, parentId);\n }\n\n /** listWikis method 列出知识库. */\n async listWikis(\n context: RequestContext,\n appId?: string,\n ): Promise<FeishuWikiSpace[]> {\n this.ensureProviders();\n\n const finalAppId = appId || (await this.getDefaultAppId(context));\n if (!finalAppId)\n throw new McpError(JsonRpcErrorCode.InvalidParams, '未配置应用 ID');\n\n const auth = await this.getAuth(finalAppId, context);\n if (!auth)\n throw new McpError(\n JsonRpcErrorCode.InvalidParams,\n `应用 ${finalAppId} 未认证`,\n );\n\n const validAuth = await this.ensureValidToken(auth, context);\n await this.rateLimiter!.throttle('document');\n return this.apiProvider!.listWikis(validAuth.accessToken);\n }\n\n /** getUserInfo method 获取用户信息. */\n async getUserInfo(\n context: RequestContext,\n appId?: string,\n ): Promise<FeishuUserInfo>;\n async getUserInfo(appId?: string): Promise<FeishuUserInfo>;\n async getUserInfo(\n contextOrAppId?: RequestContext | string,\n appId?: string,\n ): Promise<FeishuUserInfo> {\n this.ensureProviders();\n\n let context: RequestContext;\n let finalAppId: string | undefined;\n\n // 判断第一个参数是上下文还是 appId\n if (typeof contextOrAppId === 'string' || contextOrAppId === undefined) {\n // 第一个参数是 appId 或 undefined\n context = this.createContext('feishu.getUserInfo');\n finalAppId = contextOrAppId;\n } else {\n // 第一个参数是 RequestContext\n context = contextOrAppId;\n finalAppId = appId;\n }\n\n // 如果没有提供 appId,尝试获取默认应用 ID\n if (!finalAppId) {\n const defaultAppId = await this.getDefaultAppId(context);\n finalAppId = defaultAppId || undefined;\n }\n\n if (!finalAppId)\n throw new McpError(JsonRpcErrorCode.InvalidParams, '未配置应用 ID');\n\n const auth = await this.getAuth(finalAppId, context);\n if (!auth)\n throw new McpError(\n JsonRpcErrorCode.InvalidParams,\n `应用 ${finalAppId} 未认证`,\n );\n\n const validAuth = await this.ensureValidToken(auth, context);\n return this.apiProvider!.getUserInfo(validAuth.accessToken);\n }\n\n /**\n * hasValidAuth method 检查是否有有效的认证.\n * @param context 请求上下文\n * @param appId 应用 ID\n * @returns 是否有有效认证\n */\n async hasValidAuth(\n context: RequestContext,\n appId?: string,\n ): Promise<boolean> {\n try {\n const finalAppId = appId || (await this.getDefaultAppId(context));\n if (!finalAppId) return false;\n\n const auth = await this.getAuth(finalAppId, context);\n if (!auth) return false;\n\n // 检查 token 是否即将过期(5分钟内)\n if (auth.expiresAt - Date.now() < 5 * 60 * 1000) {\n // 尝试刷新 token\n try {\n await this.ensureValidToken(auth, context);\n return true;\n } catch {\n return false;\n }\n }\n\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * listApps method 列出已配置的应用.\n * @param context 请求上下文\n * @returns 应用列表\n */\n async listApps(context: RequestContext): Promise<\n Array<{\n appId: string;\n isDefault: boolean;\n hasToken: boolean;\n userInfo?: FeishuUserInfo;\n }>\n > {\n const apps: Array<{\n appId: string;\n isDefault: boolean;\n hasToken: boolean;\n userInfo?: FeishuUserInfo;\n }> = [];\n\n // 获取默认应用 ID\n const defaultAppId = await this.getDefaultAppId(context);\n\n // 获取所有认证信息\n const authKeys = await this.storage.list('feishu/auth/', context);\n for (const key of authKeys.keys) {\n const appId = key.replace('feishu/auth/', '');\n const auth = await this.getAuth(appId, context);\n\n apps.push({\n appId,\n isDefault: appId === defaultAppId,\n hasToken: !!auth,\n ...(auth?.userInfo ? { userInfo: auth.userInfo } : {}),\n });\n }\n\n return apps;\n }\n\n /**\n * setDefaultApp method 设置默认应用.\n * @param context 请求上下文\n * @param appId 应用 ID\n * @returns 设置结果\n */\n async setDefaultApp(\n context: RequestContext,\n appId: string,\n ): Promise<{ success: boolean; appId: string }> {\n // 验证应用是否已认证\n const auth = await this.getAuth(appId, context);\n if (!auth) {\n throw new McpError(\n JsonRpcErrorCode.InvalidParams,\n `应用 ${appId} 未认证,请先完成 OAuth 认证`,\n );\n }\n\n // 设置为默认应用\n await this.storage.set('feishu/config/default_app', appId, context);\n\n // 更新缓存\n this.setCache('feishu/config/default_app', appId);\n\n return { success: true, appId };\n }\n\n /**\n * getWikiNodes method 获取知识库节点.\n * @param context 请求上下文\n * @param wikiId 知识库 ID\n * @param parentNodeToken 父节点 token\n * @param appId 应用 ID\n * @returns 节点列表\n */\n async getWikiNodes(\n _context: RequestContext,\n wikiId: string,\n parentNodeToken?: string,\n appId?: string,\n ): Promise<FeishuWikiNode[]> {\n this.ensureProviders();\n\n const finalAppId = appId || (await this.getDefaultAppId(_context));\n if (!finalAppId) {\n throw new McpError(JsonRpcErrorCode.InvalidParams, '未配置应用 ID');\n }\n\n const auth = await this.getAuth(finalAppId, _context);\n if (!auth) {\n throw new McpError(\n JsonRpcErrorCode.InvalidParams,\n `应用 ${finalAppId} 未认证`,\n );\n }\n\n const validAuth = await this.ensureValidToken(auth, _context);\n await this.rateLimiter!.throttle('wiki');\n\n return this.apiProvider!.getWikiNodes(\n validAuth.accessToken,\n wikiId,\n parentNodeToken,\n );\n }\n\n /**\n * batchUploadMarkdown method 批量上传 Markdown 文档.\n * @param config 批量上传配置\n * @param context 请求上下文\n * @returns 批量上传结果\n */\n async batchUploadMarkdown(\n config: {\n documents: Array<{\n filePath?: string;\n content?: string;\n targetType: 'drive' | 'wiki';\n targetId?: string;\n uploadImages?: boolean;\n uploadAttachments?: boolean;\n removeFrontMatter?: boolean;\n }>;\n concurrency?: number;\n uploadImages?: boolean;\n uploadAttachments?: boolean;\n removeFrontMatter?: boolean;\n appId?: string;\n },\n context: RequestContext,\n ): Promise<{\n total: number;\n succeeded: number;\n failed: number;\n results: Array<{\n documentId?: string;\n url?: string;\n title?: string;\n error?: string;\n }>;\n }> {\n const concurrency = config.concurrency || 3;\n const results: Array<{\n documentId?: string;\n url?: string;\n title?: string;\n error?: string;\n }> = [];\n\n // 使用 Set 来管理并发 Promise,避免 lint 错误\n const runningTasks = new Set<Promise<void>>();\n\n for (const doc of config.documents) {\n // 等待直到有空闲的并发槽位\n while (runningTasks.size >= concurrency) {\n await Promise.race(runningTasks);\n }\n\n // 创建上传任务\n const task = this.uploadSingleDocument(doc, config, context)\n .then((result) => {\n results.push(result);\n })\n .finally(() => {\n runningTasks.delete(task);\n });\n\n runningTasks.add(task);\n }\n\n // 等待所有任务完成\n await Promise.all(runningTasks);\n\n const succeeded = results.filter((r) => r.documentId).length;\n const failed = results.length - succeeded;\n\n return {\n total: config.documents.length,\n succeeded,\n failed,\n results,\n };\n }\n\n /**\n * uploadSingleDocument method 上传单个文档(批量上传的辅助方法).\n */\n private async uploadSingleDocument(\n doc: {\n filePath?: string;\n content?: string;\n targetType: 'drive' | 'wiki';\n targetId?: string;\n uploadImages?: boolean;\n uploadAttachments?: boolean;\n removeFrontMatter?: boolean;\n },\n batchConfig: {\n uploadImages?: boolean;\n uploadAttachments?: boolean;\n removeFrontMatter?: boolean;\n appId?: string;\n },\n _context: RequestContext,\n ): Promise<{\n documentId?: string;\n url?: string;\n title?: string;\n error?: string;\n }> {\n try {\n // 读取文档内容\n let content: string;\n if (doc.content) {\n content = doc.content;\n } else if (doc.filePath) {\n const fs = await import('node:fs');\n content = fs.readFileSync(doc.filePath, 'utf-8');\n } else {\n throw new Error('必须提供 content 或 filePath');\n }\n\n // 构建文档对象\n const document: MarkdownDocument = {\n title: '', // 临时标题,会在处理时提取\n content,\n ...(doc.filePath ? { filePath: doc.filePath } : {}),\n ...(doc.filePath\n ? { workingDirectory: this.getDirectoryFromPath(doc.filePath) }\n : {}),\n };\n\n // 构建上传配置\n const uploadConfig: UploadConfig = {\n targetType: doc.targetType,\n uploadImages: doc.uploadImages ?? batchConfig.uploadImages ?? true,\n uploadAttachments:\n doc.uploadAttachments ?? batchConfig.uploadAttachments ?? true,\n removeFrontMatter:\n doc.removeFrontMatter ?? batchConfig.removeFrontMatter ?? true,\n ...(doc.targetId ? { targetId: doc.targetId } : {}),\n ...(batchConfig.appId ? { appId: batchConfig.appId } : {}),\n };\n\n // 上传文档\n const result = await this.uploadMarkdown(document, uploadConfig);\n\n return {\n ...(result.documentId ? { documentId: result.documentId } : {}),\n ...(result.url ? { url: result.url } : {}),\n ...(result.title ? { title: result.title } : {}),\n };\n } catch (error) {\n return {\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n private ensureProviders(): void {\n if (!this.apiProvider || !this.markdownProcessor || !this.rateLimiter) {\n throw new McpError(JsonRpcErrorCode.InternalError, '服务提供者未初始化');\n }\n }\n\n private async getDefaultAppId(ctx: RequestContext): Promise<string | null> {\n // 尝试从缓存获取(性能优化 T606)\n const cacheKey = 'feishu/config/default_app';\n const cached = this.getCached<string>(cacheKey);\n if (cached !== null) {\n return cached;\n }\n\n const value = await this.storage.get<string>(\n 'feishu/config/default_app',\n ctx,\n );\n if (value) {\n this.setCache(cacheKey, value);\n }\n return value;\n }\n\n private async getAuth(\n appId: string,\n ctx: RequestContext,\n ): Promise<StoredFeishuAuth | null> {\n // 尝试从缓存获取(性能优化 T606)\n const cacheKey = `feishu/auth/${appId}`;\n const cached = this.getCached<StoredFeishuAuth>(cacheKey);\n if (cached !== null) {\n return cached;\n }\n\n const value = await this.storage.get<StoredFeishuAuth>(\n `feishu/auth/${appId}`,\n ctx,\n );\n if (value) {\n this.setCache(cacheKey, value);\n }\n return value;\n }\n\n private async storeAuth(\n appId: string,\n auth: FeishuAuth & { userInfo?: FeishuUserInfo },\n ctx: RequestContext,\n ): Promise<void> {\n const storedAuth: StoredFeishuAuth = {\n appId,\n appSecret: '',\n accessToken: auth.accessToken,\n refreshToken: auth.refreshToken,\n expiresAt: auth.expiresAt,\n userInfo: auth.userInfo,\n };\n await this.storage.set(`feishu/auth/${appId}`, storedAuth, ctx);\n // 更新缓存(性能优化 T606)\n this.setCache(`feishu/auth/${appId}`, storedAuth);\n\n // 维护应用列表\n const appListKey = 'feishu/config/app_list';\n const existingApps =\n (await this.storage.get<string[]>(appListKey, ctx)) ?? [];\n if (!existingApps.includes(appId)) {\n existingApps.push(appId);\n await this.storage.set(appListKey, existingApps, ctx);\n // 更新缓存\n this.setCache(appListKey, existingApps);\n }\n }\n\n private async getAppSecret(\n appId: string,\n ctx: RequestContext,\n ): Promise<string | null> {\n // 尝试从缓存获取(性能优化 T606)\n const cacheKey = `feishu/config/app/${appId}`;\n const cached = this.getCached<{ appSecret?: string }>(cacheKey);\n if (cached !== null) {\n return cached.appSecret || null;\n }\n\n const config = await this.storage.get<{ appSecret?: string }>(\n cacheKey,\n ctx,\n );\n if (config) {\n this.setCache(cacheKey, config);\n return config.appSecret || null;\n }\n\n // 如果存储中没有,回退到环境变量(用于默认应用)\n if (\n appId === FEISHU_CONFIG.DEFAULT_APP_ID &&\n FEISHU_CONFIG.DEFAULT_APP_SECRET\n ) {\n return FEISHU_CONFIG.DEFAULT_APP_SECRET;\n }\n\n return null;\n }\n\n private async ensureValidToken(\n auth: StoredFeishuAuth,\n ctx: RequestContext,\n ): Promise<StoredFeishuAuth> {\n if (auth.expiresAt - Date.now() < 5 * 60 * 1000) {\n logger.info('刷新访问令牌', ctx);\n const appSecret = await this.getAppSecret(auth.appId, ctx);\n if (!appSecret)\n throw new McpError(JsonRpcErrorCode.InternalError, '无法获取应用密钥');\n\n const newAuth = await this.apiProvider!.refreshToken(\n auth.refreshToken,\n auth.appId,\n appSecret,\n );\n const updatedAuth: StoredFeishuAuth = {\n ...auth,\n accessToken: newAuth.accessToken,\n refreshToken: newAuth.refreshToken,\n expiresAt: newAuth.expiresAt,\n };\n await this.storage.set(`feishu/auth/${auth.appId}`, updatedAuth, ctx);\n // 更新缓存(性能优化 T606)\n this.setCache(`feishu/auth/${auth.appId}`, updatedAuth);\n return updatedAuth;\n }\n return auth;\n }\n\n private async checkConflict(\n accessToken: string,\n documentId: string,\n ctx: RequestContext,\n ): Promise<boolean> {\n const storedMeta = await this.storage.get<{ lastUploadedAt: number }>(\n `feishu/doc/${documentId}`,\n ctx,\n );\n if (!storedMeta) return false;\n const docMeta = await this.apiProvider!.getDocumentMeta(\n accessToken,\n documentId,\n );\n return docMeta.updatedAt > storedMeta.lastUploadedAt;\n }\n\n private async storeDocumentMeta(\n documentId: string,\n meta: Record<string, unknown>,\n ctx: RequestContext,\n ): Promise<void> {\n await this.storage.set(`feishu/doc/${documentId}`, meta, ctx);\n }\n\n private async updateDocumentMeta(\n documentId: string,\n updates: Record<string, unknown>,\n ctx: RequestContext,\n ): Promise<void> {\n const existing = await this.storage.get<Record<string, unknown>>(\n `feishu/doc/${documentId}`,\n ctx,\n );\n if (existing)\n await this.storage.set(\n `feishu/doc/${documentId}`,\n { ...existing, ...updates },\n ctx,\n );\n }\n\n private async uploadLocalFiles(\n accessToken: string,\n localFiles: LocalFileInfo[],\n config: UploadConfig,\n ): Promise<UploadedFile[]> {\n const uploadedFiles: UploadedFile[] = [];\n const ctx = this.createContext('feishu.uploadLocalFiles');\n\n for (const file of localFiles) {\n if (file.isImage && !config.uploadImages) continue;\n if (!file.isImage && !config.uploadAttachments) continue;\n\n try {\n await this.rateLimiter!.throttle('upload');\n const fileKey = await this.apiProvider!.uploadFile(\n accessToken,\n file.originalPath,\n file.isImage ? 'image' : 'file',\n );\n uploadedFiles.push({\n originalPath: file.originalPath,\n fileName: file.fileName,\n fileKey,\n isImage: file.isImage,\n });\n } catch (_error) {\n logger.warning(`文件上传失败: ${file.originalPath}`, ctx);\n }\n }\n return uploadedFiles;\n }\n\n private getDirectoryFromPath(filePath: string): string {\n const lastSlash = Math.max(\n filePath.lastIndexOf('/'),\n filePath.lastIndexOf('\\\\'),\n );\n return lastSlash > 0 ? filePath.substring(0, lastSlash) : process.cwd();\n }\n\n // ============================================================================\n // 文档读取方法\n // ============================================================================\n\n /**\n * readDocument method 读取单个文档.\n */\n public async readDocument(\n documentId: string,\n options: import('../types.js').ReadDocumentOptions,\n context: RequestContext,\n ): Promise<import('../types.js').DocumentReadResult> {\n logger.info('读取文档', { ...context, documentId, options });\n\n try {\n // 获取认证信息\n const finalAppId = options.appId || FEISHU_CONFIG.DEFAULT_APP_ID;\n if (!finalAppId) {\n throw new McpError(JsonRpcErrorCode.InvalidParams, '未配置应用 ID');\n }\n\n const auth = await this.getAuth(finalAppId, context);\n if (!auth) {\n throw new McpError(\n JsonRpcErrorCode.InvalidParams,\n '未找到有效的认证信息',\n );\n }\n\n // 获取文档内容\n const content = await this.apiProvider!.getDocumentContent(\n auth.accessToken,\n documentId,\n options.documentType,\n );\n\n // 获取文档元数据\n const metadata = await this.apiProvider!.getDocumentMetadata(\n auth.accessToken,\n documentId,\n options.documentType,\n );\n\n // 转换内容为 Markdown\n const conversionResult = this.convertToMarkdown(content, options);\n\n // 下载资源(如果启用)\n let downloadedImages = 0;\n let downloadedAttachments = 0;\n if (options.downloadImages || options.downloadAttachments) {\n const downloadResult = await this.downloadResources(\n conversionResult.resources,\n options,\n auth.accessToken,\n );\n downloadedImages = downloadResult.images;\n downloadedAttachments = downloadResult.attachments;\n }\n\n // 生成输出文件(如果需要)\n let outputFile: string | undefined;\n if (options.outputFormat === 'markdown' && options.outputPath) {\n outputFile = await this.writeMarkdownFile(\n content.title || 'untitled',\n conversionResult.markdown,\n metadata,\n options.outputPath,\n );\n }\n\n const result: import('../types.js').DocumentReadResult = {\n success: true,\n documentId,\n title: content.title,\n content: conversionResult.markdown,\n metadata,\n downloadedImages,\n downloadedAttachments,\n };\n \n if (outputFile) result.outputFile = outputFile;\n \n return result;\n } catch (error) {\n logger.error(\n '读取文档失败',\n error instanceof Error ? error : new Error(String(error)),\n context,\n );\n return {\n success: false,\n documentId,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n /**\n * batchReadDocuments method 批量读取文档.\n */\n public async batchReadDocuments(\n documents: Array<{\n documentId: string;\n documentType: 'drive' | 'wiki';\n wikiSpaceId?: string;\n }>,\n options: import('../types.js').BatchReadOptions,\n context: RequestContext,\n ): Promise<import('../types.js').BatchReadResult> {\n logger.info('批量读取文档', { ...context, count: documents.length, options });\n\n const concurrency = options.concurrency ?? 3;\n const results: Array<{\n documentId: string;\n title?: string;\n success: boolean;\n outputFile?: string;\n error?: string;\n }> = [];\n\n // 使用 Promise 池控制并发\n const executing: Set<Promise<void>> = new Set();\n\n for (const doc of documents) {\n const readOptions: import('../types.js').ReadDocumentOptions = {\n documentType: doc.documentType,\n outputFormat: 'markdown',\n };\n if (doc.wikiSpaceId) readOptions.wikiSpaceId = doc.wikiSpaceId;\n if (options.downloadImages !== undefined) readOptions.downloadImages = options.downloadImages;\n if (options.downloadAttachments !== undefined) readOptions.downloadAttachments = options.downloadAttachments;\n if (options.outputPath) readOptions.outputPath = options.outputPath;\n if (options.assetsPath) readOptions.assetsPath = options.assetsPath;\n if (options.appId) readOptions.appId = options.appId;\n\n const promise = this.readDocument(\n doc.documentId,\n readOptions,\n context,\n )\n .then((result) => {\n const resultItem: {\n documentId: string;\n title?: string;\n success: boolean;\n outputFile?: string;\n error?: string;\n } = {\n documentId: doc.documentId,\n success: result.success,\n };\n if (result.title !== undefined) resultItem.title = result.title;\n if (result.outputFile !== undefined) resultItem.outputFile = result.outputFile;\n if (result.error !== undefined) resultItem.error = result.error;\n results.push(resultItem);\n })\n .catch((error) => {\n results.push({\n documentId: doc.documentId,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n })\n .finally(() => {\n executing.delete(promise);\n });\n\n executing.add(promise);\n\n if (executing.size >= concurrency) {\n await Promise.race(executing);\n }\n }\n\n await Promise.all(executing);\n\n const succeeded = results.filter((r) => r.success).length;\n const failed = results.filter((r) => !r.success).length;\n\n return {\n total: documents.length,\n succeeded,\n failed,\n results,\n };\n }\n\n /**\n * readWikiRecursive method 递归读取知识库.\n */\n public async readWikiRecursive(\n wikiSpaceId: string,\n options: import('../types.js').RecursiveReadOptions,\n context: RequestContext,\n ): Promise<import('../types.js').RecursiveReadResult> {\n logger.info('递归读取知识库', { ...context, wikiSpaceId, options });\n\n try {\n // 获取认证信息\n const finalAppId = options.appId || FEISHU_CONFIG.DEFAULT_APP_ID;\n if (!finalAppId) {\n throw new McpError(JsonRpcErrorCode.InvalidParams, '未配置应用 ID');\n }\n\n const auth = await this.getAuth(finalAppId, context);\n if (!auth) {\n throw new McpError(\n JsonRpcErrorCode.InvalidParams,\n '未找到有效的认证信息',\n );\n }\n\n const validAuth = await this.ensureValidToken(auth, context);\n\n // 获取知识库节点\n const nodes = await this.getWikiNodesRecursive(\n validAuth.accessToken,\n wikiSpaceId,\n options.parentNodeToken,\n options.maxDepth ?? 999,\n 0,\n );\n\n // 读取所有文档节点\n const structure: Array<{\n nodeToken: string;\n title: string;\n type: string;\n path: string;\n success: boolean;\n error?: string;\n }> = [];\n\n for (const node of nodes) {\n if (node.objType === 'doc' || node.objType === 'docx') {\n try {\n const readOptions: import('../types.js').ReadDocumentOptions = {\n documentType: 'wiki',\n outputFormat: 'markdown',\n };\n if (wikiSpaceId) readOptions.wikiSpaceId = wikiSpaceId;\n if (options.downloadImages !== undefined) readOptions.downloadImages = options.downloadImages;\n if (options.downloadAttachments !== undefined) readOptions.downloadAttachments = options.downloadAttachments;\n if (options.outputPath) readOptions.outputPath = `${options.outputPath}/${node.path}`;\n if (options.appId) readOptions.appId = options.appId;\n\n const result = await this.readDocument(\n node.objToken,\n readOptions,\n context,\n );\n\n const structureItem: {\n nodeToken: string;\n title: string;\n type: string;\n path: string;\n success: boolean;\n error?: string;\n } = {\n nodeToken: node.nodeToken,\n title: node.title,\n type: node.objType,\n path: node.path,\n success: result.success,\n };\n if (result.error !== undefined) structureItem.error = result.error;\n structure.push(structureItem);\n } catch (error) {\n structure.push({\n nodeToken: node.nodeToken,\n title: node.title,\n type: node.objType,\n path: node.path,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n } else {\n // 文件夹节点\n structure.push({\n nodeToken: node.nodeToken,\n title: node.title,\n type: 'folder',\n path: node.path,\n success: true,\n });\n }\n }\n\n const succeeded = structure.filter((s) => s.success).length;\n const failed = structure.filter((s) => !s.success).length;\n\n return {\n total: structure.length,\n succeeded,\n failed,\n structure,\n };\n } catch (error) {\n logger.error(\n '递归读取知识库失败',\n error instanceof Error ? error : new Error(String(error)),\n context,\n );\n throw error;\n }\n }\n\n // ============================================================================\n // 私有辅助方法\n // ============================================================================\n\n /**\n * convertToMarkdown method 转换文档内容为 Markdown.\n */\n private convertToMarkdown(\n content: import('../types.js').FeishuDocumentContent,\n options: import('../types.js').ReadDocumentOptions,\n ): import('../types.js').ConversionResult {\n if (!this.contentConverter) {\n throw new McpError(\n JsonRpcErrorCode.InternalError,\n 'ContentConverter 未初始化',\n );\n }\n\n return this.contentConverter.convert(content, {\n ...(options.downloadImages !== undefined && { processImages: options.downloadImages }),\n ...(options.downloadAttachments !== undefined && { processAttachments: options.downloadAttachments }),\n ...(options.assetsPath && { assetsBasePath: options.assetsPath }),\n });\n }\n\n /**\n * downloadResources method 下载资源文件.\n */\n private async downloadResources(\n resources: import('../types.js').ResourceReference[],\n options: import('../types.js').ReadDocumentOptions,\n accessToken: string,\n ): Promise<{ images: number; attachments: number }> {\n let images = 0;\n let attachments = 0;\n\n for (const resource of resources) {\n if (resource.type === 'image' && options.downloadImages) {\n const savePath = `${options.assetsPath ?? './assets'}/${resource.fileToken}`;\n const result = await this.apiProvider!.downloadFile(\n accessToken,\n resource.fileToken,\n savePath,\n );\n if (result.success) images++;\n } else if (resource.type === 'file' && options.downloadAttachments) {\n const savePath = `${options.assetsPath ?? './assets'}/${resource.fileName ?? resource.fileToken}`;\n const result = await this.apiProvider!.downloadFile(\n accessToken,\n resource.fileToken,\n savePath,\n );\n if (result.success) attachments++;\n }\n }\n\n return { images, attachments };\n }\n\n /**\n * writeMarkdownFile method 写入 Markdown 文件.\n */\n private async writeMarkdownFile(\n title: string,\n content: string,\n metadata: import('../types.js').DocumentMetadata,\n outputPath: string,\n ): Promise<string> {\n const fs = await import('fs/promises');\n const path = await import('path');\n\n // 生成文件名\n const fileName = this.sanitizeFileName(title) + '.md';\n const filePath = path.join(outputPath, fileName);\n\n // 确保目录存在\n await fs.mkdir(outputPath, { recursive: true });\n\n // 生成 Front Matter\n const frontMatter = this.generateFrontMatter(metadata);\n\n // 写入文件\n const fileContent = frontMatter + '\\n\\n' + content;\n await fs.writeFile(filePath, fileContent, 'utf-8');\n\n return filePath;\n }\n\n /**\n * generateFrontMatter method 生成 Front Matter.\n */\n private generateFrontMatter(\n metadata: import('../types.js').DocumentMetadata,\n ): string {\n const lines: string[] = ['---'];\n\n if (metadata.author) lines.push(`author: ${metadata.author}`);\n if (metadata.createdAt)\n lines.push(`created: ${new Date(metadata.createdAt).toISOString()}`);\n if (metadata.updatedAt)\n lines.push(`updated: ${new Date(metadata.updatedAt).toISOString()}`);\n if (metadata.documentType)\n lines.push(`documentType: ${metadata.documentType}`);\n if (metadata.path) lines.push(`path: ${metadata.path}`);\n\n lines.push('---');\n return lines.join('\\n');\n }\n\n /**\n * sanitizeFileName method 清理文件名.\n */\n private sanitizeFileName(fileName: string): string {\n return fileName\n .replace(/[<>:\"/\\\\|?*]/g, '-')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .substring(0, 200);\n }\n\n /**\n * getWikiNodesRecursive method 递归获取知识库节点.\n */\n private async getWikiNodesRecursive(\n accessToken: string,\n wikiSpaceId: string,\n parentNodeToken: string | undefined,\n maxDepth: number,\n currentDepth: number,\n ): Promise<\n Array<{\n nodeToken: string;\n objToken: string;\n objType: string;\n title: string;\n path: string;\n }>\n > {\n if (currentDepth >= maxDepth) return [];\n\n const nodes = await this.apiProvider!.getWikiNodes(\n accessToken,\n wikiSpaceId,\n parentNodeToken,\n );\n\n const result: Array<{\n nodeToken: string;\n objToken: string;\n objType: string;\n title: string;\n path: string;\n }> = [];\n\n for (const node of nodes) {\n const nodePath = parentNodeToken ? `${parentNodeToken}/${node.title}` : node.title;\n \n result.push({\n nodeToken: node.nodeToken,\n objToken: node.objToken,\n objType: node.objType,\n title: node.title,\n path: nodePath,\n });\n\n // 如果有子节点,递归获取\n if (node.hasChild) {\n const children = await this.getWikiNodesRecursive(\n accessToken,\n wikiSpaceId,\n node.nodeToken,\n maxDepth,\n currentDepth + 1,\n );\n result.push(...children);\n }\n }\n\n return result;\n }\n}\n\n","/**\n * @fileoverview Markdown 处理器提供者实现.\n * 从 feishushare 提取核心逻辑,移除 Obsidian 依赖,使用 Node.js 标准 API.\n * @module src/services/feishu/providers/markdown-processor.provider\n */\n\nimport { injectable } from 'tsyringe';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport type {\n IMarkdownProcessor,\n ProcessConfig,\n} from '../core/IFeishuProvider.js';\nimport type {\n LocalFileInfo,\n CalloutInfo,\n FrontMatterData,\n MarkdownProcessResult,\n} from '../types.js';\nimport {\n CALLOUT_TYPE_MAPPING,\n CALLOUT_COLOR_MAP,\n SUPPORTED_IMAGE_EXTENSIONS,\n} from '../constants.js';\n\n/** 替换项类型 */\ninterface Replacement {\n start: number;\n end: number;\n replacement: string;\n}\n\n// ============================================================================\n// 预编译正则表达式(性能优化 T604)\n// ============================================================================\n\n/** Wiki 链接正则 */\nconst WIKI_LINK_REGEX = /\\[\\[([^\\]|]+)(\\|([^\\]]+))?\\]\\]/g;\n\n/** 块引用正则 */\nconst BLOCK_REF_REGEX = /\\[\\[([^#\\]]+)#\\^([^\\]]+)\\]\\]/g;\n\n/** 标签正则 */\nconst TAG_REGEX = /#([a-zA-Z0-9_\\u4e00-\\u9fff]+)/g;\n\n/** 嵌入正则 */\nconst EMBED_REGEX = /!\\[\\[([^\\]]+)\\]\\]/g;\n\n/** 图片正则 */\nconst IMAGE_REGEX = /!\\[([^\\]]*)\\]\\(([^)]+)\\)/g;\n\n/** 链接正则 */\nconst LINK_REGEX = /\\[([^\\]]+)\\]\\(([^)]+)\\)/g;\n\n/** 高亮正则 */\nconst HIGHLIGHT_REGEX = /==([^=]+)==/g;\n\n/** 代码块正则 */\nconst CODE_BLOCK_REGEX =\n /(^|\\n)(```|~~~)\\s*([^\\n]*)\\n([\\s\\S]*?)\\n\\2\\s*(?=\\n|$)/g;\n\n/** Callout 正则 */\nconst CALLOUT_REGEX =\n /^>\\s*\\[!([^\\]]+)\\](-?)\\s*([^\\n]*)\\n((?:(?:>[^\\n]*|)\\n?)*?)(?=\\n(?!>)|$)/gm;\n\n/** 多空行正则 */\nconst MULTI_NEWLINE_REGEX = /\\n{3,}/g;\n\n/** 行尾空白正则 */\nconst TRAILING_WHITESPACE_REGEX = /[ \\t]+$/gm;\n\n/** 文件尾空白正则 */\nconst EOF_WHITESPACE_REGEX = /\\s+$/;\n\n/** 删除线正则 */\nconst STRIKETHROUGH_REGEX = /~~([^~]+)~~/g;\n\n/** 任务列表正则 */\nconst TASK_LIST_REGEX = /^(\\s*)- \\[([ xX])\\] (.*)$/gm;\n\n/**\n * MarkdownProcessorProvider class Markdown 处理器提供者.\n * 将 Markdown 内容转换为飞书文档格式,处理本地文件引用.\n */\n@injectable()\nexport class MarkdownProcessorProvider implements IMarkdownProcessor {\n public readonly name = 'markdown-processor';\n private localFiles: LocalFileInfo[] = [];\n private calloutBlocks: CalloutInfo[] = [];\n\n // 转换结果缓存(性能优化 T604)\n private cache: Map<string, MarkdownProcessResult> = new Map();\n private readonly maxCacheSize = 100;\n\n public process(\n content: string,\n baseDirectory: string,\n config?: ProcessConfig,\n ): MarkdownProcessResult {\n // 生成缓存键(性能优化 T604)\n const cacheKey = this.generateCacheKey(content, baseDirectory, config);\n const cached = this.cache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n this.localFiles = [];\n this.calloutBlocks = [];\n\n const frontMatterHandling = config?.removeFrontMatter\n ? 'remove'\n : 'keep-as-code';\n const { content: contentWithoutFrontMatter, frontMatter } =\n this.processFrontMatter(content, frontMatterHandling);\n\n const processedContent = this.processContent(\n contentWithoutFrontMatter,\n baseDirectory,\n config,\n );\n\n const result: MarkdownProcessResult = {\n content: processedContent,\n localFiles: [...this.localFiles],\n calloutBlocks: [...this.calloutBlocks],\n frontMatter,\n extractedTitle: frontMatter?.title ?? null,\n };\n\n // 缓存结果(性能优化 T604)\n this.cacheResult(cacheKey, result);\n\n return result;\n }\n\n /**\n * generateCacheKey method 生成缓存键.\n */\n private generateCacheKey(\n content: string,\n baseDirectory: string,\n config?: ProcessConfig,\n ): string {\n const configStr = config ? JSON.stringify(config) : '';\n // 使用内容长度和前100字符作为快速哈希\n return `${content.length}:${content.substring(0, 100)}:${baseDirectory}:${configStr}`;\n }\n\n /**\n * cacheResult method 缓存处理结果.\n */\n private cacheResult(key: string, result: MarkdownProcessResult): void {\n // 限制缓存大小\n if (this.cache.size >= this.maxCacheSize) {\n const firstKey = this.cache.keys().next().value;\n if (firstKey) {\n this.cache.delete(firstKey);\n }\n }\n this.cache.set(key, result);\n }\n\n /**\n * clearCache method 清除缓存.\n */\n public clearCache(): void {\n this.cache.clear();\n }\n\n public healthCheck(): Promise<boolean> {\n return Promise.resolve(true);\n }\n\n private processContent(\n content: string,\n baseDirectory: string,\n config?: ProcessConfig,\n ): string {\n let result = content;\n if (config?.codeBlockFilterLanguages?.length) {\n result = this.processCodeBlocks(result, config.codeBlockFilterLanguages);\n }\n result = this.processCallouts(result);\n result = this.processWikiLinks(result, baseDirectory, config);\n result = this.processBlockReferences(result);\n result = this.processEmbeds(result, baseDirectory, config);\n result = this.processImages(result, baseDirectory, config);\n result = this.processLinks(result);\n result = this.processTags(result);\n // 扩展语法支持 (T702, T703, T704)\n result = this.processHighlights(result);\n result = this.processStrikethrough(result);\n result = this.processTaskLists(result);\n result = this.cleanupWhitespace(result);\n return result;\n }\n\n /**\n * processStrikethrough method 处理删除线语法 (T703).\n * 将 ~~text~~ 转换为 <del>text</del>\n */\n private processStrikethrough(content: string): string {\n const replacements: Replacement[] = [];\n // 重置正则状态\n STRIKETHROUGH_REGEX.lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = STRIKETHROUGH_REGEX.exec(content)) !== null) {\n const text = String(match[1] ?? '');\n replacements.push({\n start: match.index,\n end: match.index + match[0].length,\n replacement: `<del>${text}</del>`,\n });\n }\n\n return this.applyReplacements(content, replacements);\n }\n\n /**\n * processTaskLists method 处理任务列表语法 (T704).\n * 将 - [ ] 和 - [x] 转换为飞书 Todo 格式\n */\n private processTaskLists(content: string): string {\n const replacements: Replacement[] = [];\n // 重置正则状态\n TASK_LIST_REGEX.lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = TASK_LIST_REGEX.exec(content)) !== null) {\n const indent = String(match[1] ?? '');\n const checked = String(match[2] ?? '').toLowerCase() === 'x';\n const text = String(match[3] ?? '');\n\n // 转换为飞书 Todo 格式\n const checkbox = checked ? '☑' : '☐';\n replacements.push({\n start: match.index,\n end: match.index + match[0].length,\n replacement: `${indent}${checkbox} ${text}`,\n });\n }\n\n return this.applyReplacements(content, replacements);\n }\n\n private processWikiLinks(\n content: string,\n baseDirectory: string,\n config?: ProcessConfig,\n ): string {\n // 重置正则状态(使用预编译正则)\n WIKI_LINK_REGEX.lastIndex = 0;\n const replacements: Replacement[] = [];\n let match: RegExpExecArray | null;\n\n while ((match = WIKI_LINK_REGEX.exec(content)) !== null) {\n const fullMatch = match[0];\n const link = String(match[1] ?? '');\n const display = String(match[3] ?? '');\n\n let replacement: string;\n if (this.isFileReference(link)) {\n const isImage = this.isImageFile(link);\n const shouldProcess = isImage\n ? config?.processImages !== false\n : config?.processAttachments !== false;\n\n if (shouldProcess) {\n const placeholder = this.generatePlaceholder();\n const resolvedPath = this.resolvePath(link, baseDirectory);\n this.localFiles.push({\n originalPath: resolvedPath,\n fileName: this.extractFileName(link),\n placeholder,\n isImage,\n altText: display || link,\n });\n replacement = placeholder;\n } else {\n replacement = fullMatch;\n }\n } else {\n replacement = `📝 ${display || link}`;\n }\n\n replacements.push({\n start: match.index,\n end: match.index + fullMatch.length,\n replacement,\n });\n }\n\n return this.applyReplacements(content, replacements);\n }\n\n private processBlockReferences(content: string): string {\n // 重置正则状态\n BLOCK_REF_REGEX.lastIndex = 0;\n const replacements: Replacement[] = [];\n let match: RegExpExecArray | null;\n\n while ((match = BLOCK_REF_REGEX.exec(content)) !== null) {\n const file = String(match[1] ?? '');\n const block = String(match[2] ?? '');\n replacements.push({\n start: match.index,\n end: match.index + match[0].length,\n replacement: `📝 ${file} (块引用: ${block})`,\n });\n }\n\n return this.applyReplacements(content, replacements);\n }\n\n private processTags(content: string): string {\n // 重置正则状态\n TAG_REGEX.lastIndex = 0;\n const replacements: Replacement[] = [];\n let match: RegExpExecArray | null;\n\n while ((match = TAG_REGEX.exec(content)) !== null) {\n const tag = String(match[1] ?? '');\n replacements.push({\n start: match.index,\n end: match.index + match[0].length,\n replacement: `#${tag}`,\n });\n }\n\n return this.applyReplacements(content, replacements);\n }\n\n private processEmbeds(\n content: string,\n baseDirectory: string,\n config?: ProcessConfig,\n ): string {\n // 重置正则状态\n EMBED_REGEX.lastIndex = 0;\n const replacements: Replacement[] = [];\n let match: RegExpExecArray | null;\n\n while ((match = EMBED_REGEX.exec(content)) !== null) {\n const fullMatch = match[0];\n const file = String(match[1] ?? '');\n const isImage = this.isImageFile(file);\n const shouldProcess = isImage\n ? config?.processImages !== false\n : config?.processAttachments !== false;\n\n let replacement: string;\n if (shouldProcess) {\n const placeholder = this.generatePlaceholder();\n const resolvedPath = this.resolvePath(file, baseDirectory);\n this.localFiles.push({\n originalPath: resolvedPath,\n fileName: this.extractFileName(file),\n placeholder,\n isImage,\n altText: file,\n });\n replacement = placeholder;\n } else {\n replacement = fullMatch;\n }\n\n replacements.push({\n start: match.index,\n end: match.index + fullMatch.length,\n replacement,\n });\n }\n\n return this.applyReplacements(content, replacements);\n }\n\n private processImages(\n content: string,\n baseDirectory: string,\n config?: ProcessConfig,\n ): string {\n // 重置正则状态\n IMAGE_REGEX.lastIndex = 0;\n const replacements: Replacement[] = [];\n let match: RegExpExecArray | null;\n\n while ((match = IMAGE_REGEX.exec(content)) !== null) {\n const fullMatch = match[0];\n const alt = String(match[1] ?? '');\n const src = String(match[2] ?? '');\n\n if (src.startsWith('http://') || src.startsWith('https://')) {\n continue;\n }\n\n let replacement: string;\n if (config?.processImages !== false) {\n const placeholder = this.generatePlaceholder();\n const resolvedPath = this.resolvePath(src, baseDirectory);\n this.localFiles.push({\n originalPath: resolvedPath,\n fileName: this.extractFileName(src),\n placeholder,\n isImage: true,\n altText: alt || '图片',\n });\n replacement = placeholder;\n } else {\n replacement = fullMatch;\n }\n\n replacements.push({\n start: match.index,\n end: match.index + fullMatch.length,\n replacement,\n });\n }\n\n return this.applyReplacements(content, replacements);\n }\n\n private processLinks(content: string): string {\n // 重置正则状态\n LINK_REGEX.lastIndex = 0;\n const replacements: Replacement[] = [];\n let match: RegExpExecArray | null;\n\n while ((match = LINK_REGEX.exec(content)) !== null) {\n const fullMatch = match[0];\n const text = String(match[1] ?? '');\n const url = String(match[2] ?? '');\n\n if (url.startsWith('obsidian://')) {\n replacements.push({\n start: match.index,\n end: match.index + fullMatch.length,\n replacement: `${text}(${url})`,\n });\n }\n }\n\n return this.applyReplacements(content, replacements);\n }\n\n private processHighlights(content: string): string {\n // 重置正则状态\n HIGHLIGHT_REGEX.lastIndex = 0;\n const replacements: Replacement[] = [];\n let match: RegExpExecArray | null;\n\n while ((match = HIGHLIGHT_REGEX.exec(content)) !== null) {\n const text = String(match[1] ?? '');\n replacements.push({\n start: match.index,\n end: match.index + match[0].length,\n replacement: `<mark>${text}</mark>`,\n });\n }\n\n return this.applyReplacements(content, replacements);\n }\n\n private processCodeBlocks(\n content: string,\n filterLanguages: string[],\n ): string {\n const list = filterLanguages.map((s) => s.toLowerCase());\n if (list.length === 0) return content;\n\n // 重置正则状态\n CODE_BLOCK_REGEX.lastIndex = 0;\n const replacements: Replacement[] = [];\n let match: RegExpExecArray | null;\n\n while ((match = CODE_BLOCK_REGEX.exec(content)) !== null) {\n const leading = String(match[1] ?? '');\n const info = String(match[3] ?? '');\n const lang = info.trim().split(/\\s+/)[0]?.toLowerCase() ?? '';\n\n if (lang && list.includes(lang)) {\n replacements.push({\n start: match.index,\n end: match.index + match[0].length,\n replacement: leading,\n });\n }\n }\n\n return this.applyReplacements(content, replacements);\n }\n\n private processCallouts(content: string): string {\n // 重置正则状态\n CALLOUT_REGEX.lastIndex = 0;\n const replacements: Replacement[] = [];\n let match: RegExpExecArray | null;\n\n while ((match = CALLOUT_REGEX.exec(content)) !== null) {\n const fullMatch = match[0];\n const calloutType = String(match[1] ?? '')\n .toLowerCase()\n .trim();\n const foldable = String(match[2] ?? '');\n const titleStr = String(match[3] ?? '');\n const bodyStr = String(match[4] ?? '');\n\n const defaultStyle = { emoji: '📌', color: 'blue', title: '提示' };\n const styleInfo =\n CALLOUT_TYPE_MAPPING[calloutType] ??\n CALLOUT_TYPE_MAPPING['default'] ??\n defaultStyle;\n\n let calloutTitle = titleStr.trim() || styleInfo.title;\n calloutTitle = this.escapeMarkdownInTitle(calloutTitle);\n\n const lines = bodyStr.split('\\n');\n const processedLines = lines\n .map((line: string) =>\n line.startsWith('>') ? line.replace(/^>\\s?/, '') : line,\n )\n .filter(\n (line: string, index: number, arr: string[]) =>\n !(line === '' && index === arr.length - 1),\n );\n\n const calloutContent = processedLines.join('\\n');\n const placeholder = this.generatePlaceholder();\n\n const defaultColor = { background: 2, border: 2, text: 2 };\n const colorInfo =\n CALLOUT_COLOR_MAP[styleInfo.color] ??\n CALLOUT_COLOR_MAP['blue'] ??\n defaultColor;\n\n this.calloutBlocks.push({\n placeholder,\n type: calloutType,\n title: calloutTitle,\n content: calloutContent,\n foldable: foldable === '-',\n backgroundColor: colorInfo.background,\n borderColor: colorInfo.border,\n textColor: colorInfo.text,\n emojiId: this.mapEmojiToFeishu(styleInfo.emoji),\n });\n\n replacements.push({\n start: match.index,\n end: match.index + fullMatch.length,\n replacement: placeholder,\n });\n }\n\n return this.applyReplacements(content, replacements);\n }\n\n private applyReplacements(\n content: string,\n replacements: Replacement[],\n ): string {\n let result = content;\n for (let i = replacements.length - 1; i >= 0; i--) {\n const r = replacements[i];\n if (r) {\n result = result.slice(0, r.start) + r.replacement + result.slice(r.end);\n }\n }\n return result;\n }\n\n private cleanupWhitespace(content: string): string {\n let result = content;\n result = result.replace(MULTI_NEWLINE_REGEX, '\\n\\n');\n result = result.replace(TRAILING_WHITESPACE_REGEX, '');\n result = result.replace(EOF_WHITESPACE_REGEX, '\\n');\n return result;\n }\n\n private processFrontMatter(\n content: string,\n handling: 'remove' | 'keep-as-code',\n ): { content: string; frontMatter: FrontMatterData | null } {\n const { frontMatter, content: contentWithoutFrontMatter } =\n this.parseFrontMatter(content);\n\n if (!frontMatter) return { content, frontMatter: null };\n if (handling === 'remove')\n return { content: contentWithoutFrontMatter, frontMatter };\n\n const yamlLines = content.split('\\n');\n let endIndex = -1;\n for (let i = 1; i < yamlLines.length; i++) {\n const line = yamlLines[i];\n if (line !== undefined && line.trim() === '---') {\n endIndex = i;\n break;\n }\n }\n\n if (endIndex !== -1) {\n const yamlContent = yamlLines.slice(1, endIndex).join('\\n');\n const codeBlock = '```yaml\\n' + yamlContent + '\\n```\\n\\n';\n return { content: codeBlock + contentWithoutFrontMatter, frontMatter };\n }\n\n return { content: contentWithoutFrontMatter, frontMatter };\n }\n\n private parseFrontMatter(content: string): {\n frontMatter: FrontMatterData | null;\n content: string;\n } {\n if (!content.startsWith('---\\n') && !content.startsWith('---\\r\\n')) {\n return { frontMatter: null, content };\n }\n\n const lines = content.split('\\n');\n let endIndex = -1;\n for (let i = 1; i < lines.length; i++) {\n const line = lines[i];\n if (line !== undefined && line.trim() === '---') {\n endIndex = i;\n break;\n }\n }\n\n if (endIndex === -1) return { frontMatter: null, content };\n\n const yamlContent = lines.slice(1, endIndex).join('\\n');\n const remainingContent = lines.slice(endIndex + 1).join('\\n');\n\n try {\n const frontMatter = this.parseSimpleYaml(yamlContent);\n return { frontMatter, content: remainingContent };\n } catch {\n return { frontMatter: null, content };\n }\n }\n\n private parseSimpleYaml(yamlContent: string): FrontMatterData {\n const result: FrontMatterData = {};\n const lines = yamlContent.split('\\n');\n\n for (const line of lines) {\n const trimmedLine = line.trim();\n if (!trimmedLine || trimmedLine.startsWith('#')) continue;\n\n const colonIndex = trimmedLine.indexOf(':');\n if (colonIndex === -1) continue;\n\n const key = trimmedLine.substring(0, colonIndex).trim();\n let value = trimmedLine.substring(colonIndex + 1).trim();\n\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n\n result[key] = value;\n }\n\n return result;\n }\n\n private escapeMarkdownInTitle(title: string): string {\n return title.replace(/\\*\\*/g, '*');\n }\n\n private mapEmojiToFeishu(emoji: string): string {\n const emojiMap: Record<string, string> = {\n '📝': 'memo',\n ℹ️: 'information_source',\n '💡': 'bulb',\n '⚠️': 'warning',\n '❌': 'x',\n '⛔': 'no_entry',\n '❓': 'question',\n '✅': 'white_check_mark',\n '💬': 'speech_balloon',\n '📖': 'book',\n '📄': 'page_facing_up',\n '📋': 'clipboard',\n '☑️': 'ballot_box_with_check',\n '📌': 'pushpin',\n };\n return emojiMap[emoji] ?? 'pushpin';\n }\n\n private generatePlaceholder(): string {\n const timestamp = Date.now();\n const randomId = Math.random().toString(36).substring(2, 8);\n return `__MCP_CONTENT_${timestamp}_${randomId}__`;\n }\n\n private extractFileName(filePath: string): string {\n return path.basename(filePath);\n }\n\n private isFileReference(pathStr: string): boolean {\n const fileName = this.extractFileName(pathStr);\n return fileName.includes('.') && fileName.lastIndexOf('.') > 0;\n }\n\n private isImageFile(fileName: string): boolean {\n const ext = path.extname(fileName).toLowerCase();\n return SUPPORTED_IMAGE_EXTENSIONS.includes(ext);\n }\n\n private resolvePath(filePath: string, baseDirectory: string): string {\n if (path.isAbsolute(filePath)) return filePath;\n const cleanPath = filePath.replace(/^\\.\\//, '').replace(/^\\//, '');\n return path.resolve(baseDirectory, cleanPath);\n }\n\n public getLocalFiles(): LocalFileInfo[] {\n return [...this.localFiles];\n }\n\n public getCalloutBlocks(): CalloutInfo[] {\n return [...this.calloutBlocks];\n }\n\n public fileExists(filePath: string): boolean {\n try {\n return fs.existsSync(filePath);\n } catch {\n return false;\n }\n }\n\n public readFile(filePath: string): string {\n return fs.readFileSync(filePath, 'utf-8');\n }\n\n public readFileBuffer(filePath: string): Buffer {\n return fs.readFileSync(filePath);\n }\n}\n","/**\n * @fileoverview 飞书 API 提供者实现.\n * @module src/services/feishu/providers/feishu-api.provider\n */\n\nimport { injectable } from 'tsyringe';\nimport type { IFeishuApiProvider } from '../core/IFeishuProvider.js';\nimport type {\n FeishuAuth,\n FeishuDocument,\n FeishuFolder,\n FeishuUserInfo,\n FeishuWikiSpace,\n FeishuWikiNode,\n FeishuOAuthResponse,\n FeishuApiResponse,\n} from '../types.js';\nimport {\n FEISHU_CONFIG,\n TOKEN_EXPIRED_CODES,\n FEISHU_ERROR_MESSAGES,\n} from '../constants.js';\nimport { McpError, JsonRpcErrorCode } from '@/types-global/errors.js';\nimport { logger, requestContextService } from '@/utils/index.js';\n\n/** HTTP 请求选项 */\ninterface RequestOptions {\n method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n headers?: Record<string, string>;\n body?: string | Buffer | FormData | ArrayBuffer;\n timeout?: number;\n}\n\n/**\n * FeishuApiProvider class 飞书 API 提供者.\n * 封装所有飞书开放平台 API 调用.\n */\n@injectable()\nexport class FeishuApiProvider implements IFeishuApiProvider {\n public readonly name = 'feishu-api';\n private refreshPromise: Promise<FeishuAuth | null> | null = null;\n\n // 性能优化 T605: 重试配置\n private readonly maxRetries = FEISHU_CONFIG.MAX_RETRIES;\n private readonly retryDelayMs = FEISHU_CONFIG.RETRY_DELAY_MS;\n\n /**\n * generateAuthUrl method 生成 OAuth 授权 URL.\n */\n public generateAuthUrl(\n appId: string,\n redirectUri: string,\n ): { authUrl: string; state: string } {\n const state = this.generateRandomState();\n\n const params = new URLSearchParams({\n client_id: appId,\n redirect_uri: redirectUri,\n scope: FEISHU_CONFIG.SCOPES,\n state,\n response_type: 'code',\n });\n\n const authUrl = `${FEISHU_CONFIG.AUTHORIZE_URL}?${params.toString()}`;\n return { authUrl, state };\n }\n\n /**\n * exchangeCodeForToken method 使用授权码换取访问令牌.\n */\n public async exchangeCodeForToken(\n code: string,\n appId: string,\n appSecret: string,\n redirectUri: string,\n ): Promise<FeishuAuth> {\n const requestBody = {\n grant_type: 'authorization_code',\n client_id: appId,\n client_secret: appSecret,\n code,\n redirect_uri: redirectUri,\n };\n\n const response = await this.request<FeishuOAuthResponse>(\n FEISHU_CONFIG.TOKEN_URL,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(requestBody),\n },\n );\n\n if (response.code !== 0) {\n const errorMsg =\n response.error_description ?? response.msg ?? '获取访问令牌失败';\n throw new McpError(\n JsonRpcErrorCode.InternalError,\n `OAuth 错误: ${errorMsg}`,\n );\n }\n\n const accessToken = response.access_token ?? response.data?.access_token;\n const refreshToken = response.refresh_token ?? response.data?.refresh_token;\n const expiresIn = response.expires_in ?? response.data?.expires_in ?? 7200;\n\n if (!accessToken) {\n throw new McpError(JsonRpcErrorCode.InternalError, '未获取到访问令牌');\n }\n\n return {\n appId,\n accessToken,\n refreshToken: refreshToken ?? '',\n expiresAt: Date.now() + expiresIn * 1000,\n };\n }\n\n /**\n * refreshToken method 刷新访问令牌.\n */\n public async refreshToken(\n refreshTokenValue: string,\n appId: string,\n appSecret: string,\n ): Promise<FeishuAuth> {\n // 防止并发刷新\n if (this.refreshPromise) {\n const result = await this.refreshPromise;\n if (result) return result;\n throw new McpError(JsonRpcErrorCode.InternalError, 'Token 刷新失败');\n }\n\n this.refreshPromise = this.doRefreshToken(\n refreshTokenValue,\n appId,\n appSecret,\n );\n\n try {\n const result = await this.refreshPromise;\n if (!result) {\n throw new McpError(JsonRpcErrorCode.InternalError, 'Token 刷新失败');\n }\n return result;\n } finally {\n this.refreshPromise = null;\n }\n }\n\n private async doRefreshToken(\n refreshTokenValue: string,\n appId: string,\n appSecret: string,\n ): Promise<FeishuAuth | null> {\n const ctx = requestContextService.createRequestContext({\n operation: 'feishu.refreshToken',\n });\n\n try {\n const requestBody = {\n grant_type: 'refresh_token',\n client_id: appId,\n client_secret: appSecret,\n refresh_token: refreshTokenValue,\n };\n\n const response = await this.request<FeishuOAuthResponse>(\n FEISHU_CONFIG.REFRESH_TOKEN_URL,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(requestBody),\n },\n );\n\n if (response.code !== 0) {\n logger.warning('Token 刷新失败', {\n ...ctx,\n code: response.code,\n msg: response.msg,\n });\n return null;\n }\n\n const accessToken = response.access_token ?? response.data?.access_token;\n const newRefreshToken =\n response.refresh_token ?? response.data?.refresh_token;\n const expiresIn =\n response.expires_in ?? response.data?.expires_in ?? 7200;\n\n if (!accessToken) {\n return null;\n }\n\n return {\n appId,\n accessToken,\n refreshToken: newRefreshToken ?? '',\n expiresAt: Date.now() + expiresIn * 1000,\n };\n } catch (error) {\n logger.error(\n 'Token 刷新异常',\n error instanceof Error ? error : new Error(String(error)),\n ctx,\n );\n return null;\n }\n }\n\n /**\n * getUserInfo method 获取用户信息.\n */\n public async getUserInfo(accessToken: string): Promise<FeishuUserInfo> {\n const response = await this.requestWithAuth<\n FeishuApiResponse<{\n name: string;\n avatar_url: string;\n email: string;\n user_id: string;\n }>\n >(FEISHU_CONFIG.USER_INFO_URL, accessToken, { method: 'GET' });\n\n if (response.code !== 0 || !response.data) {\n throw new McpError(JsonRpcErrorCode.InternalError, '获取用户信息失败');\n }\n\n return {\n userId: response.data.user_id,\n name: response.data.name,\n email: response.data.email,\n avatarUrl: response.data.avatar_url,\n };\n }\n\n /**\n * createDocument method 创建飞书文档.\n * 使用飞书的导入API,先上传Markdown文件,然后导入为富文本文档\n * 如果目标是知识库,会先创建云文档,然后移动到知识库\n */\n public async createDocument(\n accessToken: string,\n title: string,\n content: string,\n targetType: 'drive' | 'wiki',\n targetId?: string,\n parentNodeToken?: string,\n ): Promise<FeishuDocument> {\n const ctx = requestContextService.createRequestContext({\n operation: 'feishu.createDocument',\n tenantId: 'feishu-service',\n });\n\n logger.info('开始创建飞书文档', { \n ...ctx, \n title, \n targetType, \n targetId,\n parentNodeToken \n });\n\n // 第一步:上传Markdown文件到飞书\n logger.debug('第一步:上传Markdown文件', ctx);\n const uploadResult = await this.uploadMarkdownFile(\n accessToken,\n title,\n content,\n );\n\n if (!uploadResult.success || !uploadResult.fileToken) {\n logger.error(\n '文件上传失败',\n new Error(uploadResult.error || '未知错误'),\n ctx,\n );\n throw new McpError(\n JsonRpcErrorCode.InternalError,\n uploadResult.error || '文件上传失败',\n );\n }\n\n logger.info('文件上传成功', { ...ctx, fileToken: uploadResult.fileToken });\n\n // 第二步:创建导入任务(总是先导入到云空间)\n logger.debug('第二步:创建导入任务到云空间', ctx);\n const importResult = await this.createImportTask(\n accessToken,\n uploadResult.fileToken,\n title,\n targetType === 'drive' ? targetId : undefined, // 只有云空间类型才传递文件夹ID\n );\n\n if (!importResult.success || !importResult.ticket) {\n logger.error(\n '创建导入任务失败',\n new Error(importResult.error || '未知错误'),\n ctx,\n );\n throw new McpError(\n JsonRpcErrorCode.InternalError,\n importResult.error || '创建导入任务失败',\n );\n }\n\n logger.info('导入任务创建成功', { ...ctx, ticket: importResult.ticket });\n\n // 第三步:等待导入完成\n logger.debug('第三步:等待导入完成', ctx);\n const finalResult = await this.waitForImportCompletion(\n accessToken,\n importResult.ticket,\n );\n\n if (!finalResult.success || !finalResult.documentToken) {\n logger.error(\n '文档导入失败',\n new Error(finalResult.error || '未知错误'),\n ctx,\n );\n throw new McpError(\n JsonRpcErrorCode.InternalError,\n finalResult.error || '文档导入失败',\n );\n }\n\n logger.info('文档创建成功', {\n ...ctx,\n documentToken: finalResult.documentToken,\n });\n\n // 第四步:如果目标是知识库,移动文档到知识库\n if (targetType === 'wiki' && targetId) {\n logger.info('第四步:移动文档到知识库', {\n ...ctx,\n wikiSpaceId: targetId,\n documentToken: finalResult.documentToken,\n parentNodeToken,\n });\n\n const moveResult = await this.moveDocToWiki(\n accessToken,\n targetId,\n finalResult.documentToken,\n 'docx',\n parentNodeToken,\n );\n\n if (!moveResult.success) {\n logger.warning('移动到知识库失败,返回云文档链接', {\n ...ctx,\n error: moveResult.error,\n });\n // 移动失败,但文档已创建,返回云文档链接\n return {\n documentId: finalResult.documentToken,\n url: `https://feishu.cn/docx/${finalResult.documentToken}`,\n title,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n };\n }\n\n logger.info('文档已成功移动到知识库', {\n ...ctx,\n wikiToken: moveResult.wikiToken,\n });\n\n // 返回云文档URL(即使在知识库中,也使用云文档URL便于后续操作)\n return {\n documentId: finalResult.documentToken,\n url: `https://feishu.cn/docx/${finalResult.documentToken}`,\n title,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n };\n }\n\n // 云空间文档,直接返回\n return {\n documentId: finalResult.documentToken,\n url: `https://feishu.cn/docx/${finalResult.documentToken}`,\n title,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n };\n }\n\n /**\n * updateDocument method 更新飞书文档.\n * 注意:目前暂不支持更新,需要重新创建文档\n */\n public updateDocument(\n _accessToken: string,\n _documentId: string,\n _content: string,\n ): Promise<FeishuDocument> {\n // TODO: 实现文档更新功能\n throw new McpError(\n JsonRpcErrorCode.InternalError,\n '暂不支持文档更新,请重新创建文档',\n );\n }\n\n /**\n * getDocumentMeta method 获取文档元数据.\n */\n public async getDocumentMeta(\n accessToken: string,\n documentId: string,\n ): Promise<{ documentId: string; updatedAt: number }> {\n const url = `${FEISHU_CONFIG.BASE_URL}/docx/v1/documents/${documentId}`;\n const response = await this.requestWithAuth<\n FeishuApiResponse<{\n document: { document_id: string; revision_id: number; title: string };\n }>\n >(url, accessToken, { method: 'GET' });\n\n if (response.code !== 0) {\n throw new McpError(JsonRpcErrorCode.InternalError, '获取文档元数据失败');\n }\n\n return {\n documentId,\n updatedAt: Date.now(), // 飞书 API 不直接返回更新时间,需要通过其他方式获取\n };\n }\n\n /**\n * uploadFile method 上传文件到飞书.\n */\n public async uploadFile(\n accessToken: string,\n filePath: string,\n fileType: 'image' | 'file',\n ): Promise<string> {\n // 读取文件\n const fs = await import('node:fs');\n const path = await import('node:path');\n\n if (!fs.existsSync(filePath)) {\n throw new McpError(\n JsonRpcErrorCode.InvalidParams,\n `文件不存在: ${filePath}`,\n );\n }\n\n const buffer = fs.readFileSync(filePath);\n const fileName = path.basename(filePath);\n\n return this.uploadFileBuffer(accessToken, buffer, fileName, fileType);\n }\n\n /**\n * uploadFileBuffer method 上传文件 Buffer 到飞书.\n */\n public async uploadFileBuffer(\n accessToken: string,\n buffer: Buffer,\n fileName: string,\n fileType: 'image' | 'file',\n ): Promise<string> {\n const boundary = `---${Date.now()}${Math.random().toString(36).substring(2)}`;\n const parentType = fileType === 'image' ? 'docx_image' : 'docx_file';\n\n // 构建 multipart/form-data\n const parts: Buffer[] = [];\n\n // file_name 字段\n parts.push(Buffer.from(`--${boundary}\\r\\n`));\n parts.push(\n Buffer.from('Content-Disposition: form-data; name=\"file_name\"\\r\\n\\r\\n'),\n );\n parts.push(Buffer.from(`${fileName}\\r\\n`));\n\n // parent_type 字段\n parts.push(Buffer.from(`--${boundary}\\r\\n`));\n parts.push(\n Buffer.from('Content-Disposition: form-data; name=\"parent_type\"\\r\\n\\r\\n'),\n );\n parts.push(Buffer.from(`${parentType}\\r\\n`));\n\n // size 字段\n parts.push(Buffer.from(`--${boundary}\\r\\n`));\n parts.push(\n Buffer.from('Content-Disposition: form-data; name=\"size\"\\r\\n\\r\\n'),\n );\n parts.push(Buffer.from(`${buffer.length}\\r\\n`));\n\n // file 字段\n parts.push(Buffer.from(`--${boundary}\\r\\n`));\n parts.push(\n Buffer.from(\n `Content-Disposition: form-data; name=\"file\"; filename=\"${fileName}\"\\r\\n`,\n ),\n );\n parts.push(\n Buffer.from(`Content-Type: ${this.getMimeType(fileName)}\\r\\n\\r\\n`),\n );\n parts.push(buffer);\n parts.push(Buffer.from('\\r\\n'));\n\n // 结束边界\n parts.push(Buffer.from(`--${boundary}--\\r\\n`));\n\n const body = Buffer.concat(parts);\n\n const response = await this.requestWithAuth<\n FeishuApiResponse<{ file_token: string }>\n >(FEISHU_CONFIG.UPLOAD_URL, accessToken, {\n method: 'POST',\n headers: { 'Content-Type': `multipart/form-data; boundary=${boundary}` },\n body,\n });\n\n if (response.code !== 0 || !response.data) {\n const errorMsg =\n FEISHU_ERROR_MESSAGES[response.code] ?? response.msg ?? '文件上传失败';\n throw new McpError(JsonRpcErrorCode.InternalError, errorMsg);\n }\n\n return response.data.file_token;\n }\n\n /**\n * listFolders method 列出云空间文件夹.\n */\n public async listFolders(\n accessToken: string,\n parentId?: string,\n ): Promise<FeishuFolder[]> {\n const url = `${FEISHU_CONFIG.BASE_URL}/drive/v1/files`;\n const params = new URLSearchParams({ page_size: '50' });\n if (parentId) {\n params.set('folder_token', parentId);\n }\n\n const ctx = requestContextService.createRequestContext({\n operation: 'feishu.listFolders',\n });\n\n logger.debug('调用飞书文件夹列表API', {\n ...ctx,\n url: `${url}?${params.toString()}`,\n parentId,\n });\n\n const response = await this.requestWithAuth<\n FeishuApiResponse<{\n files: Array<{\n token: string;\n name: string;\n type: string;\n parent_token: string;\n created_time: string;\n modified_time: string;\n }>;\n has_more: boolean;\n }>\n >(`${url}?${params.toString()}`, accessToken, { method: 'GET' });\n\n logger.debug('飞书文件夹列表API响应', {\n ...ctx,\n code: response.code,\n msg: response.msg,\n fileCount: response.data?.files?.length || 0,\n folderCount:\n response.data?.files?.filter((f) => f.type === 'folder').length || 0,\n hasMore: response.data?.has_more,\n });\n\n if (response.code !== 0 || !response.data) {\n logger.error(\n '获取文件夹列表失败',\n new Error(`API错误: ${response.code} - ${response.msg}`),\n ctx,\n );\n throw new McpError(\n JsonRpcErrorCode.InternalError,\n `获取文件夹列表失败: ${response.msg || '未知错误'}`,\n );\n }\n\n return response.data.files\n .filter((file) => file.type === 'folder')\n .map((file) => ({\n token: file.token,\n name: file.name,\n parentToken: file.parent_token,\n createdAt: file.created_time,\n modifiedAt: file.modified_time,\n }));\n }\n\n /**\n * listWikis method 列出知识库空间.\n */\n public async listWikis(accessToken: string): Promise<FeishuWikiSpace[]> {\n const url = `${FEISHU_CONFIG.BASE_URL}/wiki/v2/spaces`;\n const params = new URLSearchParams({ page_size: '50' });\n\n const ctx = requestContextService.createRequestContext({\n operation: 'feishu.listWikis',\n });\n\n logger.debug('调用飞书知识库列表API', {\n ...ctx,\n url: `${url}?${params.toString()}`,\n });\n\n const response = await this.requestWithAuth<\n FeishuApiResponse<{\n items: Array<{\n space_id: string;\n name: string;\n description?: string;\n space_type?: string;\n visibility?: string;\n }>;\n has_more: boolean;\n }>\n >(`${url}?${params.toString()}`, accessToken, { method: 'GET' });\n\n logger.debug('飞书知识库列表API响应', {\n ...ctx,\n code: response.code,\n msg: response.msg,\n itemCount: response.data?.items?.length || 0,\n hasMore: response.data?.has_more,\n });\n\n if (response.code !== 0 || !response.data) {\n logger.error(\n '获取知识库列表失败',\n new Error(`API错误: ${response.code} - ${response.msg}`),\n ctx,\n );\n throw new McpError(\n JsonRpcErrorCode.InternalError,\n `获取知识库列表失败: ${response.msg || '未知错误'}`,\n );\n }\n\n return response.data.items.map((item) => {\n const result: FeishuWikiSpace = {\n spaceId: item.space_id,\n name: item.name,\n };\n if (item.description !== undefined) {\n result.description = item.description;\n }\n if (item.space_type !== undefined) {\n result.spaceType = item.space_type;\n }\n if (item.visibility !== undefined) {\n result.visibility = item.visibility;\n }\n return result;\n });\n }\n\n /**\n * getWikiNodes method 获取知识库节点.\n */\n public async getWikiNodes(\n accessToken: string,\n wikiId: string,\n parentNodeToken?: string,\n ): Promise<FeishuWikiNode[]> {\n const url = `${FEISHU_CONFIG.BASE_URL}/wiki/v2/spaces/${wikiId}/nodes`;\n const params = new URLSearchParams({ page_size: '50' });\n if (parentNodeToken) {\n params.set('parent_node_token', parentNodeToken);\n }\n\n const response = await this.requestWithAuth<\n FeishuApiResponse<{\n items: Array<{\n space_id: string;\n node_token: string;\n obj_token: string;\n obj_type: string;\n parent_node_token?: string;\n title: string;\n has_child: boolean;\n }>;\n has_more: boolean;\n }>\n >(`${url}?${params.toString()}`, accessToken, { method: 'GET' });\n\n if (response.code !== 0 || !response.data) {\n throw new McpError(JsonRpcErrorCode.InternalError, '获取知识库节点失败');\n }\n\n return response.data.items.map((item) => {\n const result: FeishuWikiNode = {\n spaceId: item.space_id,\n nodeToken: item.node_token,\n objToken: item.obj_token,\n objType: item.obj_type,\n title: item.title,\n hasChild: item.has_child,\n };\n if (item.parent_node_token !== undefined) {\n result.parentNodeToken = item.parent_node_token;\n }\n return result;\n });\n }\n\n /**\n * healthCheck method 健康检查.\n */\n public async healthCheck(): Promise<boolean> {\n try {\n // 简单检查 API 是否可达\n const response = await fetch(\n `${FEISHU_CONFIG.BASE_URL}/auth/v3/app_access_token/internal`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ app_id: 'test', app_secret: 'test' }),\n },\n );\n return response.status === 200 || response.status === 400; // 400 表示参数错误但 API 可达\n } catch {\n return false;\n }\n }\n\n /**\n * isTokenExpiredError method 判断是否为 token 过期错误.\n */\n public isTokenExpiredError(code: number): boolean {\n return TOKEN_EXPIRED_CODES.includes(code);\n }\n\n /**\n * moveDocToWiki method 将云文档移动到知识库.\n */\n public async moveDocToWiki(\n accessToken: string,\n spaceId: string,\n objToken: string,\n objType: string,\n parentNodeToken?: string,\n ): Promise<{ success: boolean; wikiToken?: string; error?: string }> {\n const url = `${FEISHU_CONFIG.BASE_URL}/wiki/v2/spaces/${spaceId}/nodes/move_docs_to_wiki`;\n\n const requestData: Record<string, string> = {\n obj_type: objType,\n obj_token: objToken,\n };\n\n if (parentNodeToken) {\n requestData.parent_wiki_token = parentNodeToken;\n }\n\n try {\n const response = await this.requestWithAuth<\n FeishuApiResponse<{\n wiki_token?: string;\n task_id?: string;\n }>\n >(url, accessToken, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(requestData),\n });\n\n if (response.code === 0) {\n const result: { success: boolean; wikiToken?: string } = {\n success: true,\n };\n if (response.data?.wiki_token !== undefined) {\n result.wikiToken = response.data.wiki_token;\n }\n return result;\n }\n\n return {\n success: false,\n error: response.msg ?? '移动文档到知识库失败',\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : '移动文档到知识库失败',\n };\n }\n }\n\n // ============================================================================\n // 私有辅助方法\n // ============================================================================\n\n /**\n * request method 发送 HTTP 请求(带重试机制 T605, T608).\n */\n private async request<T>(\n url: string,\n options: RequestOptions,\n retryCount = 0,\n ): Promise<T> {\n const controller = new AbortController();\n const timeout = options.timeout ?? 30000;\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const fetchOptions: RequestInit = {\n method: options.method,\n signal: controller.signal,\n };\n\n // 只有当 headers 存在时才添加\n if (options.headers) {\n fetchOptions.headers = options.headers;\n }\n\n // 只有当 body 存在时才添加\n if (options.body !== undefined) {\n fetchOptions.body = options.body as BodyInit;\n }\n\n const response = await fetch(url, fetchOptions);\n\n const text = await response.text();\n\n try {\n const result = JSON.parse(text) as T;\n\n // 检查是否需要重试(频率限制等)\n const apiResponse = result as unknown as { code?: number };\n if (apiResponse.code === 99991429 && retryCount < this.maxRetries) {\n // 频率限制,使用指数退避重试\n const delay = this.retryDelayMs * Math.pow(2, retryCount);\n await this.sleep(delay);\n return this.request<T>(url, options, retryCount + 1);\n }\n\n return result;\n } catch {\n throw new McpError(\n JsonRpcErrorCode.InternalError,\n `无效的 JSON 响应: ${text.substring(0, 200)}`,\n );\n }\n } catch (error) {\n if (error instanceof McpError) throw error;\n\n // 网络错误重试(T608)\n if (retryCount < this.maxRetries) {\n const isNetworkError =\n error instanceof Error &&\n (error.name === 'AbortError' ||\n error.message.includes('network') ||\n error.message.includes('ECONNRESET') ||\n error.message.includes('ETIMEDOUT'));\n\n if (isNetworkError || error instanceof TypeError) {\n const delay = this.retryDelayMs * Math.pow(2, retryCount);\n const ctx = requestContextService.createRequestContext({\n operation: 'feishu.request.retry',\n });\n logger.warning(\n `请求失败,${delay}ms 后重试 (${retryCount + 1}/${this.maxRetries})`,\n ctx,\n );\n await this.sleep(delay);\n return this.request<T>(url, options, retryCount + 1);\n }\n }\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new McpError(JsonRpcErrorCode.InternalError, '请求超时');\n }\n throw new McpError(\n JsonRpcErrorCode.InternalError,\n `请求失败: ${String(error)}`,\n );\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * sleep method 延迟执行.\n */\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * requestWithAuth method 发送带认证的 HTTP 请求.\n */\n private async requestWithAuth<T>(\n url: string,\n accessToken: string,\n options: RequestOptions,\n ): Promise<T> {\n const headers = {\n ...options.headers,\n Authorization: `Bearer ${accessToken}`,\n };\n\n return this.request<T>(url, { ...options, headers });\n }\n\n /**\n * uploadMarkdownFile method 上传Markdown文件到飞书.\n * 基于feishushare的实现\n */\n private async uploadMarkdownFile(\n accessToken: string,\n fileName: string,\n content: string,\n ): Promise<{ success: boolean; fileToken?: string; error?: string }> {\n const ctx = requestContextService.createRequestContext({\n operation: 'feishu.uploadMarkdownFile',\n tenantId: 'feishu-service',\n });\n\n try {\n logger.debug('开始上传Markdown文件', {\n ...ctx,\n fileName,\n contentLength: content.length,\n });\n\n const boundary = '---7MA4YWxkTrZu0gW';\n const finalFileName = fileName.endsWith('.md')\n ? fileName\n : `${fileName}.md`;\n\n // 将内容转换为UTF-8字节\n const utf8Content = new TextEncoder().encode(content);\n const contentLength = utf8Content.length;\n\n logger.debug('文件信息', { ...ctx, finalFileName, contentLength });\n\n // 构建multipart/form-data\n const parts: string[] = [];\n\n // file_name\n parts.push(`--${boundary}`);\n parts.push(`Content-Disposition: form-data; name=\"file_name\"`);\n parts.push('');\n parts.push(finalFileName);\n\n // parent_type\n parts.push(`--${boundary}`);\n parts.push(`Content-Disposition: form-data; name=\"parent_type\"`);\n parts.push('');\n parts.push('ccm_import_open');\n\n // size\n parts.push(`--${boundary}`);\n parts.push(`Content-Disposition: form-data; name=\"size\"`);\n parts.push('');\n parts.push(contentLength.toString());\n\n // extra\n parts.push(`--${boundary}`);\n parts.push(`Content-Disposition: form-data; name=\"extra\"`);\n parts.push('');\n parts.push('{\"obj_type\":\"docx\",\"file_extension\":\"md\"}');\n\n // file\n parts.push(`--${boundary}`);\n parts.push(\n `Content-Disposition: form-data; name=\"file\"; filename=\"${finalFileName}\"`,\n );\n parts.push(`Content-Type: text/markdown`);\n parts.push('');\n\n // 组合请求体\n const textPart = parts.join('\\r\\n') + '\\r\\n';\n const endBoundary = `\\r\\n--${boundary}--\\r\\n`;\n\n const textPartBytes = new TextEncoder().encode(textPart);\n const endBoundaryBytes = new TextEncoder().encode(endBoundary);\n\n const totalLength =\n textPartBytes.length + utf8Content.length + endBoundaryBytes.length;\n const bodyBytes = new Uint8Array(totalLength);\n\n let offset = 0;\n bodyBytes.set(textPartBytes, offset);\n offset += textPartBytes.length;\n bodyBytes.set(utf8Content, offset);\n offset += utf8Content.length;\n bodyBytes.set(endBoundaryBytes, offset);\n\n logger.debug('发送上传请求', {\n ...ctx,\n totalLength,\n url: FEISHU_CONFIG.UPLOAD_URL,\n });\n\n const response = await this.requestWithAuth<\n FeishuApiResponse<{ file_token: string }>\n >(FEISHU_CONFIG.UPLOAD_URL, accessToken, {\n method: 'POST',\n headers: {\n 'Content-Type': `multipart/form-data; boundary=${boundary}`,\n },\n body: bodyBytes.buffer, // 直接使用 ArrayBuffer,不转换为 Buffer\n });\n\n logger.debug('上传响应', {\n ...ctx,\n code: response.code,\n msg: response.msg,\n });\n\n if (response.code === 0 && response.data) {\n logger.info('文件上传成功', {\n ...ctx,\n fileToken: response.data.file_token,\n });\n return {\n success: true,\n fileToken: response.data.file_token,\n };\n } else {\n logger.error(\n '文件上传失败',\n new Error(`API错误: ${response.code} - ${response.msg}`),\n ctx,\n );\n return {\n success: false,\n error: response.msg || '文件上传失败',\n };\n }\n } catch (error) {\n logger.error(\n '文件上传异常',\n error instanceof Error ? error : new Error(String(error)),\n ctx,\n );\n return {\n success: false,\n error: error instanceof Error ? error.message : '文件上传失败',\n };\n }\n }\n\n /**\n * createImportTask method 创建导入任务.\n * 基于feishushare的实现,支持指定目标文件夹\n * 注意:飞书 API 要求必须提供 point 参数,即使上传到根目录\n */\n private async createImportTask(\n accessToken: string,\n fileToken: string,\n title: string,\n targetFolderId?: string,\n ): Promise<{ success: boolean; ticket?: string; error?: string }> {\n const ctx = requestContextService.createRequestContext({\n operation: 'feishu.createImportTask',\n tenantId: 'feishu-service',\n });\n\n try {\n const url = `${FEISHU_CONFIG.BASE_URL}/drive/v1/import_tasks`;\n \n // 构建请求体\n // 注意:根据参考项目 feishushare 的实现,point 参数是必需的\n // 如果不提供 targetFolderId,使用空字符串表示用户的根目录(我的空间)\n const requestBody: Record<string, unknown> = {\n file_extension: 'md',\n file_token: fileToken,\n type: 'docx',\n file_name: title,\n point: {\n mount_type: 1, // 1=云空间\n mount_key: targetFolderId || '', // 空字符串表示根目录\n },\n };\n\n logger.debug('创建导入任务请求', {\n ...ctx,\n url,\n requestBody,\n hasTargetFolder: !!targetFolderId,\n });\n\n const response = await this.requestWithAuth<\n FeishuApiResponse<{ ticket: string }>\n >(url, accessToken, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(requestBody),\n });\n\n logger.debug('创建导入任务响应', {\n ...ctx,\n code: response.code,\n msg: response.msg,\n hasData: !!response.data,\n });\n\n if (response.code === 0 && response.data) {\n logger.info('导入任务创建成功', {\n ...ctx,\n ticket: response.data.ticket,\n });\n return {\n success: true,\n ticket: response.data.ticket,\n };\n } else {\n logger.error(\n '创建导入任务失败',\n new Error(`API错误: ${response.code} - ${response.msg}`),\n {\n ...ctx,\n code: response.code,\n msg: response.msg,\n requestBody,\n },\n );\n return {\n success: false,\n error: response.msg || '创建导入任务失败',\n };\n }\n } catch (error) {\n logger.error(\n '创建导入任务异常',\n error instanceof Error ? error : new Error(String(error)),\n ctx,\n );\n return {\n success: false,\n error: error instanceof Error ? error.message : '创建导入任务失败',\n };\n }\n }\n\n /**\n * waitForImportCompletion method 等待导入完成.\n * 基于feishushare的实现,改进了状态处理逻辑\n * 增加超时时间到60秒,更宽容的状态处理\n */\n private async waitForImportCompletion(\n accessToken: string,\n ticket: string,\n timeoutMs: number = 60000, // 增加到60秒\n ): Promise<{ success: boolean; documentToken?: string; error?: string }> {\n const startTime = Date.now();\n const maxAttempts = 30; // 增加最大尝试次数\n\n const ctx = requestContextService.createRequestContext({\n operation: 'feishu.waitForImportCompletion',\n tenantId: 'feishu-service',\n });\n\n logger.info('开始等待导入任务完成', {\n ...ctx,\n ticket,\n timeoutMs,\n maxAttempts,\n });\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n const elapsedTime = Date.now() - startTime;\n\n // 检查是否超时\n if (elapsedTime >= timeoutMs) {\n logger.warning('导入任务超时', {\n ...ctx,\n elapsedTime,\n timeoutMs,\n totalAttempts: attempt,\n });\n return {\n success: false,\n error: `导入任务超时 (${timeoutMs}ms)`,\n };\n }\n\n try {\n const url = `${FEISHU_CONFIG.BASE_URL}/drive/v1/import_tasks/${ticket}`;\n const response = await this.requestWithAuth<\n FeishuApiResponse<{\n result: {\n job_status: number;\n job_error_msg?: string;\n token?: string;\n };\n }>\n >(url, accessToken, { method: 'GET' });\n\n if (response.code === 0 && response.data) {\n const jobStatus = response.data.result.job_status;\n const documentToken = response.data.result.token;\n const errorMsg = response.data.result.job_error_msg;\n\n logger.debug('导入任务状态检查', {\n ...ctx,\n attempt,\n jobStatus,\n documentToken: documentToken ? 'present' : 'missing',\n errorMsg,\n elapsedTime,\n });\n\n // 状态 0 或 3 = 成功\n if (jobStatus === 0 || jobStatus === 3) {\n if (documentToken) {\n logger.info('导入任务成功完成', {\n ...ctx,\n documentToken,\n totalAttempts: attempt,\n totalTime: elapsedTime,\n });\n return {\n success: true,\n documentToken,\n };\n } else {\n logger.debug('成功状态但token未返回,继续等待', {\n ...ctx,\n attempt,\n });\n // 继续等待,可能token还没有返回\n }\n }\n // 状态 2 = 失败,但要宽容处理\n else if (jobStatus === 2) {\n // 如果有document token,即使显示失败也认为成功\n if (documentToken) {\n logger.info('状态显示失败但有token,认为成功', {\n ...ctx,\n documentToken,\n errorMsg,\n attempt,\n });\n return {\n success: true,\n documentToken,\n };\n }\n // 前15次尝试时,即使显示失败也继续等待(更宽容)\n else if (attempt <= 15) {\n logger.debug('失败状态但继续等待', {\n ...ctx,\n attempt,\n errorMsg,\n });\n // 继续等待\n }\n // 15次后才真正认为失败\n else {\n logger.error(\n '导入任务最终失败',\n new Error(errorMsg || '导入任务失败'),\n {\n ...ctx,\n totalAttempts: attempt,\n errorMsg,\n },\n );\n return {\n success: false,\n error: errorMsg || '导入任务失败',\n };\n }\n }\n // 状态 -1 = 明确失败\n else if (jobStatus === -1) {\n logger.error(\n '导入任务明确失败',\n new Error(errorMsg || '导入失败'),\n {\n ...ctx,\n attempt,\n errorMsg,\n },\n );\n return {\n success: false,\n error: errorMsg || '导入失败',\n };\n }\n // 状态 1 = 进行中\n else if (jobStatus === 1) {\n logger.debug('导入任务进行中', { ...ctx, attempt, elapsedTime });\n }\n // 状态 116 = 权限错误\n else if (jobStatus === 116) {\n logger.error(\n '导入任务权限错误',\n new Error(errorMsg || '无权限访问目标位置'),\n {\n ...ctx,\n attempt,\n errorMsg,\n },\n );\n return {\n success: false,\n error: `权限错误: ${errorMsg || '无权限访问目标位置'}。请检查:1) 应用是否有知识库权限 2) 知识库ID是否正确 3) 尝试先上传到云空间`,\n };\n }\n // 未知状态\n else {\n logger.warning('未知的导入任务状态', {\n ...ctx,\n attempt,\n jobStatus,\n documentToken,\n errorMsg,\n });\n }\n } else {\n logger.warning('导入任务状态查询失败', {\n ...ctx,\n attempt,\n code: response.code,\n msg: response.msg,\n });\n }\n\n // 渐进式延迟\n if (attempt < maxAttempts) {\n const delay = this.getDelayForAttempt(attempt);\n await this.sleep(delay);\n }\n } catch (error) {\n // 轮询过程中的错误,记录但继续尝试\n logger.debug('导入任务状态查询异常,继续尝试', {\n ...ctx,\n attempt,\n error: error instanceof Error ? error.message : String(error),\n });\n const delay = this.getDelayForAttempt(attempt);\n await this.sleep(delay);\n }\n }\n\n logger.error('导入任务达到最大尝试次数', {\n ...ctx,\n maxAttempts,\n totalTime: Date.now() - startTime,\n });\n\n return {\n success: false,\n error: '导入任务超时',\n };\n }\n\n /**\n * getDelayForAttempt method 获取渐进式延迟时间.\n * 优化延迟策略,更快速地检查状态\n */\n private getDelayForAttempt(attempt: number): number {\n // 渐进式延迟策略:\n // 前5次:500ms (快速检查)\n // 6-10次:1秒 (正常检查)\n // 11-20次:2秒 (中速检查)\n // 21次以后:3秒 (慢速检查)\n if (attempt <= 5) {\n return 500; // 500ms\n } else if (attempt <= 10) {\n return 1000; // 1秒\n } else if (attempt <= 20) {\n return 2000; // 2秒\n } else {\n return 3000; // 3秒\n }\n }\n\n /**\n * generateRandomState method 生成随机状态值.\n */\n private generateRandomState(): string {\n return (\n Math.random().toString(36).substring(2, 15) +\n Math.random().toString(36).substring(2, 15)\n );\n }\n\n /**\n * getDocumentContent method 获取文档内容.\n */\n public async getDocumentContent(\n accessToken: string,\n documentId: string,\n documentType: 'drive' | 'wiki',\n ): Promise<import('../types.js').FeishuDocumentContent> {\n const ctx = requestContextService.createRequestContext({\n operation: 'feishu.getDocumentContent',\n tenantId: 'feishu-service',\n });\n\n logger.info('获取文档内容', { ...ctx, documentId, documentType });\n\n try {\n let url: string;\n if (documentType === 'drive') {\n // 云空间文档:获取文档块\n url = `${FEISHU_CONFIG.BASE_URL}/docx/v1/documents/${documentId}/blocks`;\n } else {\n // 知识库文档:获取节点内容\n url = `${FEISHU_CONFIG.BASE_URL}/wiki/v2/spaces/${documentId}/nodes`;\n }\n\n const response = await this.requestWithAuth<\n FeishuApiResponse<{\n items?: Array<{\n block_id: string;\n block_type: number;\n parent_id?: string;\n children?: string[];\n [key: string]: unknown;\n }>;\n blocks?: Array<{\n block_id: string;\n block_type: number;\n parent_id?: string;\n children?: string[];\n [key: string]: unknown;\n }>;\n }>\n >(url, accessToken, { method: 'GET' });\n\n if (response.code !== 0 || !response.data) {\n throw new McpError(\n JsonRpcErrorCode.InternalError,\n response.msg ?? '获取文档内容失败',\n );\n }\n\n // 处理响应数据\n const blocks = response.data.blocks ?? response.data.items ?? [];\n \n return {\n documentId,\n title: '', // 标题需要从元数据获取\n blocks: blocks.map((block): import('../types.js').FeishuBlock => {\n const result: import('../types.js').FeishuBlock = {\n blockId: block.block_id,\n blockType: this.mapBlockType(block.block_type),\n content: block as import('../types.js').FeishuBlockContent,\n };\n if (block.parent_id) result.parentId = block.parent_id;\n if (block.children) result.children = block.children;\n return result;\n }),\n };\n } catch (error) {\n logger.error('获取文档内容失败', error instanceof Error ? error : new Error(String(error)), ctx);\n throw error instanceof McpError\n ? error\n : new McpError(\n JsonRpcErrorCode.InternalError,\n `获取文档内容失败: ${String(error)}`,\n );\n }\n }\n\n /**\n * getDocumentMetadata method 获取文档元数据.\n */\n public async getDocumentMetadata(\n accessToken: string,\n documentId: string,\n documentType: 'drive' | 'wiki',\n ): Promise<import('../types.js').DocumentMetadata> {\n const ctx = requestContextService.createRequestContext({\n operation: 'feishu.getDocumentMetadata',\n tenantId: 'feishu-service',\n });\n\n logger.info('获取文档元数据', { ...ctx, documentId, documentType });\n\n try {\n let url: string;\n if (documentType === 'drive') {\n // 云空间文档\n url = `${FEISHU_CONFIG.BASE_URL}/docx/v1/documents/${documentId}`;\n } else {\n // 知识库文档\n url = `${FEISHU_CONFIG.BASE_URL}/wiki/v2/spaces/${documentId}`;\n }\n\n const response = await this.requestWithAuth<\n FeishuApiResponse<{\n document?: {\n document_id: string;\n title?: string;\n create_time?: string;\n update_time?: string;\n owner_id?: string;\n };\n space?: {\n space_id: string;\n name?: string;\n description?: string;\n };\n node?: {\n node_token: string;\n title?: string;\n create_time?: string;\n edit_time?: string;\n creator?: string;\n };\n }>\n >(url, accessToken, { method: 'GET' });\n\n if (response.code !== 0 || !response.data) {\n throw new McpError(\n JsonRpcErrorCode.InternalError,\n response.msg ?? '获取文档元数据失败',\n );\n }\n\n // 处理不同类型的响应\n let author: string | undefined;\n let createdAt: number | undefined;\n let updatedAt: number | undefined;\n \n if (response.data.document) {\n author = response.data.document.owner_id;\n createdAt = response.data.document.create_time ? new Date(response.data.document.create_time).getTime() : undefined;\n updatedAt = response.data.document.update_time ? new Date(response.data.document.update_time).getTime() : undefined;\n } else if (response.data.node) {\n author = response.data.node.creator;\n createdAt = response.data.node.create_time ? new Date(response.data.node.create_time).getTime() : undefined;\n updatedAt = response.data.node.edit_time ? new Date(response.data.node.edit_time).getTime() : undefined;\n }\n \n const metadata: import('../types.js').DocumentMetadata = {\n documentType,\n };\n \n if (author) metadata.author = author;\n if (createdAt) metadata.createdAt = createdAt;\n if (updatedAt) metadata.updatedAt = updatedAt;\n \n return metadata;\n } catch (error) {\n logger.error('获取文档元数据失败', error instanceof Error ? error : new Error(String(error)), ctx);\n throw error instanceof McpError\n ? error\n : new McpError(\n JsonRpcErrorCode.InternalError,\n `获取文档元数据失败: ${String(error)}`,\n );\n }\n }\n\n /**\n * downloadFile method 下载文件.\n */\n public async downloadFile(\n accessToken: string,\n fileToken: string,\n savePath: string,\n ): Promise<{ success: boolean; filePath?: string; error?: string }> {\n const ctx = requestContextService.createRequestContext({\n operation: 'feishu.downloadFile',\n tenantId: 'feishu-service',\n });\n\n logger.info('下载文件', { ...ctx, fileToken, savePath });\n\n try {\n const url = `${FEISHU_CONFIG.BASE_URL}/drive/v1/medias/${fileToken}/download`;\n\n const response = await this.requestWithAuth<ArrayBuffer>(\n url,\n accessToken,\n { method: 'GET' },\n );\n\n // 写入文件\n const fs = await import('fs/promises');\n const path = await import('path');\n \n // 确保目录存在\n const dir = path.dirname(savePath);\n await fs.mkdir(dir, { recursive: true });\n \n // 写入文件\n await fs.writeFile(savePath, Buffer.from(response));\n\n logger.info('文件下载成功', { ...ctx, filePath: savePath });\n\n return {\n success: true,\n filePath: savePath,\n };\n } catch (error) {\n logger.error('文件下载失败', error instanceof Error ? error : new Error(String(error)), ctx);\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n /**\n * mapBlockType method 映射块类型.\n */\n private mapBlockType(blockType: number): import('../types.js').FeishuBlockType {\n const typeMap: Record<number, import('../types.js').FeishuBlockType> = {\n 1: 'page',\n 2: 'text',\n 3: 'heading1',\n 4: 'heading2',\n 5: 'heading3',\n 6: 'heading4',\n 7: 'heading5',\n 8: 'heading6',\n 9: 'heading7',\n 10: 'heading8',\n 11: 'heading9',\n 12: 'bullet',\n 13: 'ordered',\n 14: 'code',\n 15: 'quote',\n 16: 'equation',\n 17: 'todo',\n 18: 'bitable',\n 19: 'callout',\n 20: 'chat_card',\n 21: 'diagram',\n 22: 'divider',\n 23: 'file',\n 24: 'grid',\n 25: 'grid_column',\n 26: 'iframe',\n 27: 'image',\n 28: 'isv',\n 29: 'mindnote',\n 30: 'sheet',\n 31: 'table',\n 32: 'table_cell',\n 33: 'view',\n };\n return typeMap[blockType] ?? 'undefined';\n }\n\n /**\n * getMimeType method 获取文件 MIME 类型.\n */\n private getMimeType(fileName: string): string {\n const ext = fileName.toLowerCase().split('.').pop();\n const mimeTypes: Record<string, string> = {\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n webp: 'image/webp',\n svg: 'image/svg+xml',\n bmp: 'image/bmp',\n pdf: 'application/pdf',\n doc: 'application/msword',\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n xls: 'application/vnd.ms-excel',\n xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n ppt: 'application/vnd.ms-powerpoint',\n pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n txt: 'text/plain',\n zip: 'application/zip',\n rar: 'application/x-rar-compressed',\n };\n return mimeTypes[ext ?? ''] ?? 'application/octet-stream';\n }\n}\n","/**\n * @fileoverview 飞书 API 频率限制器.\n * 从 feishushare 提取核心逻辑,实现智能频率控制.\n * @module src/services/feishu/providers/rate-limiter.provider\n */\n\nimport { injectable } from 'tsyringe';\nimport { logger, requestContextService } from '@/utils/index.js';\n\n/**\n * API 类型定义.\n */\nexport type FeishuApiType = 'document' | 'import' | 'block' | 'upload' | 'wiki';\n\n/**\n * 频率限制配置.\n */\ninterface RateLimitConfig {\n /** 每秒最大请求数 */\n perSecond: number;\n /** 每分钟最大请求数 */\n perMinute: number;\n}\n\n/**\n * 频率限制配置映射.\n */\nconst RATE_LIMITS: Record<FeishuApiType, RateLimitConfig> = {\n document: { perSecond: 2, perMinute: 90 },\n import: { perSecond: 1, perMinute: 90 },\n block: { perSecond: 2, perMinute: 150 },\n upload: { perSecond: 2, perMinute: 60 },\n wiki: { perSecond: 2, perMinute: 90 },\n};\n\n/**\n * FeishuRateLimiter class 飞书 API 频率限制器.\n * 实现滑动窗口算法,控制 API 调用频率.\n */\n@injectable()\nexport class FeishuRateLimiter {\n public readonly name = 'feishu-rate-limiter';\n\n /** 上次调用时间(按 API 类型) */\n private lastCallTime: Map<FeishuApiType, number> = new Map();\n\n /** 调用计数(按 API 类型) */\n private callCount: Map<FeishuApiType, number> = new Map();\n\n /** 计数器重置时间(按 API 类型) */\n private resetTime: Map<FeishuApiType, number> = new Map();\n\n /** 是否启用频率限制 */\n private enabled = true;\n\n /**\n * setEnabled method 设置是否启用频率限制.\n */\n public setEnabled(enabled: boolean): void {\n this.enabled = enabled;\n }\n\n /**\n * isEnabled method 获取是否启用频率限制.\n */\n public isEnabled(): boolean {\n return this.enabled;\n }\n\n /**\n * throttle method 智能节流控制.\n * 根据 API 类型应用不同的频率限制.\n */\n public async throttle(apiType: FeishuApiType): Promise<void> {\n if (!this.enabled) {\n return;\n }\n\n const limit = RATE_LIMITS[apiType];\n const now = Date.now();\n const ctx = requestContextService.createRequestContext({\n operation: 'feishu.rateLimiter.throttle',\n });\n\n // 获取当前 API 类型的状态\n const lastCall = this.lastCallTime.get(apiType) ?? 0;\n let count = this.callCount.get(apiType) ?? 0;\n const reset = this.resetTime.get(apiType) ?? 0;\n\n // 重置计数器(每分钟)\n if (now - reset > 60000) {\n count = 0;\n this.resetTime.set(apiType, now);\n }\n\n // 检查每分钟限制\n if (count >= limit.perMinute) {\n const waitTime = 60000 - (now - reset);\n logger.debug(\n `频率限制:${apiType} 达到每分钟限制,等待 ${waitTime}ms`,\n ctx,\n );\n await this.sleep(waitTime);\n count = 0;\n this.resetTime.set(apiType, Date.now());\n }\n\n // 检查每秒限制\n const timeSinceLastCall = now - lastCall;\n const minInterval = 1000 / limit.perSecond;\n\n if (timeSinceLastCall < minInterval) {\n const waitTime = minInterval - timeSinceLastCall;\n logger.debug(\n `频率限制:${apiType} 达到每秒限制,等待 ${waitTime}ms`,\n ctx,\n );\n await this.sleep(waitTime);\n }\n\n // 更新状态\n this.lastCallTime.set(apiType, Date.now());\n this.callCount.set(apiType, count + 1);\n }\n\n /**\n * reset method 重置所有计数器.\n */\n public reset(): void {\n this.lastCallTime.clear();\n this.callCount.clear();\n this.resetTime.clear();\n }\n\n /**\n * resetForType method 重置指定 API 类型的计数器.\n */\n public resetForType(apiType: FeishuApiType): void {\n this.lastCallTime.delete(apiType);\n this.callCount.delete(apiType);\n this.resetTime.delete(apiType);\n }\n\n /**\n * getStats method 获取当前频率限制统计.\n */\n public getStats(): Record<\n FeishuApiType,\n { count: number; remaining: number; resetIn: number }\n > {\n const now = Date.now();\n const stats: Record<\n FeishuApiType,\n { count: number; remaining: number; resetIn: number }\n > = {} as Record<\n FeishuApiType,\n { count: number; remaining: number; resetIn: number }\n >;\n\n for (const apiType of Object.keys(RATE_LIMITS) as FeishuApiType[]) {\n const limit = RATE_LIMITS[apiType];\n const count = this.callCount.get(apiType) ?? 0;\n const reset = this.resetTime.get(apiType) ?? now;\n const resetIn = Math.max(0, 60000 - (now - reset));\n\n stats[apiType] = {\n count,\n remaining: Math.max(0, limit.perMinute - count),\n resetIn,\n };\n }\n\n return stats;\n }\n\n /**\n * healthCheck method 健康检查.\n */\n public healthCheck(): boolean {\n return true;\n }\n\n /**\n * sleep method 延迟执行.\n */\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","/**\n * @fileoverview 内容转换器提供者实现.\n * 将飞书富文本转换为 Markdown 格式.\n * @module src/services/feishu/providers/content-converter.provider\n */\n\nimport { injectable } from 'tsyringe';\nimport type { IContentConverter } from '../core/IFeishuProvider.js';\nimport type {\n FeishuDocumentContent,\n FeishuBlock,\n ResourceReference,\n ConversionOptions,\n ConversionResult,\n} from '../types.js';\nimport { logger, requestContextService } from '@/utils/index.js';\n\n/**\n * ContentConverterProvider class 内容转换器提供者.\n * 将飞书富文本转换为 Markdown 格式.\n */\n@injectable()\nexport class ContentConverterProvider implements IContentConverter {\n public readonly name = 'content-converter';\n\n /**\n * convert method 转换飞书富文本为 Markdown.\n */\n public convert(\n content: FeishuDocumentContent,\n _options: ConversionOptions,\n ): ConversionResult {\n const ctx = requestContextService.createRequestContext({\n operation: 'contentConverter.convert',\n tenantId: 'feishu-service',\n });\n\n logger.info('开始转换文档内容', {\n ...ctx,\n documentId: content.documentId,\n blockCount: content.blocks.length,\n });\n\n try {\n // 构建块映射\n const blockMap = new Map<string, FeishuBlock>();\n for (const block of content.blocks) {\n blockMap.set(block.blockId, block);\n }\n\n // 找到根块(page 类型)\n const rootBlock = content.blocks.find((b) => b.blockType === 'page');\n if (!rootBlock) {\n logger.warning('未找到根块,使用第一个块', ctx);\n }\n\n // 遍历并转换块\n const markdown = this.traverseBlocks(\n blockMap,\n rootBlock?.blockId ?? content.blocks[0]?.blockId ?? '',\n 0,\n );\n\n // 提取资源\n const resources = this.extractResources(content);\n\n logger.info('文档转换完成', {\n ...ctx,\n markdownLength: markdown.length,\n resourceCount: resources.length,\n });\n\n const result: ConversionResult = {\n markdown: markdown.trim(),\n resources,\n };\n if (content.title) result.extractedTitle = content.title;\n return result;\n } catch (error) {\n logger.error(\n '文档转换失败',\n error instanceof Error ? error : new Error(String(error)),\n ctx,\n );\n throw error;\n }\n }\n\n /**\n * extractResources method 提取资源引用.\n */\n public extractResources(content: FeishuDocumentContent): ResourceReference[] {\n const resources: ResourceReference[] = [];\n\n for (const block of content.blocks) {\n if (block.blockType === 'image' && block.content) {\n const imageContent = block.content as {\n image?: { token?: string };\n };\n if (imageContent.image?.token) {\n resources.push({\n type: 'image',\n fileToken: imageContent.image.token,\n originalUrl: `https://open.feishu.cn/open-apis/drive/v1/medias/${imageContent.image.token}/download`,\n });\n }\n } else if (block.blockType === 'file' && block.content) {\n const fileContent = block.content as {\n file?: { token?: string; name?: string };\n };\n if (fileContent.file?.token) {\n const resourceRef: ResourceReference = {\n type: 'file',\n fileToken: fileContent.file.token,\n originalUrl: `https://open.feishu.cn/open-apis/drive/v1/medias/${fileContent.file.token}/download`,\n };\n if (fileContent.file.name) resourceRef.fileName = fileContent.file.name;\n resources.push(resourceRef);\n }\n }\n }\n\n return resources;\n }\n\n /**\n * healthCheck method 健康检查.\n */\n public healthCheck(): boolean {\n return true;\n }\n\n /**\n * traverseBlocks method 遍历块树并转换为 Markdown.\n */\n private traverseBlocks(\n blockMap: Map<string, FeishuBlock>,\n blockId: string,\n depth: number,\n ): string {\n const block = blockMap.get(blockId);\n if (!block) return '';\n\n const result: string[] = [];\n\n // 转换当前块\n const markdown = this.convertBlock(block, depth);\n if (markdown) {\n result.push(markdown);\n }\n\n // 递归处理子块\n if (block.children) {\n for (const childId of block.children) {\n const childMarkdown = this.traverseBlocks(blockMap, childId, depth + 1);\n if (childMarkdown) {\n result.push(childMarkdown);\n }\n }\n }\n\n return result.join('\\n\\n');\n }\n\n /**\n * convertBlock method 转换单个块为 Markdown.\n */\n private convertBlock(block: FeishuBlock, depth: number): string {\n switch (block.blockType) {\n case 'heading1':\n return `# ${this.extractText(block)}`;\n case 'heading2':\n return `## ${this.extractText(block)}`;\n case 'heading3':\n return `### ${this.extractText(block)}`;\n case 'heading4':\n return `#### ${this.extractText(block)}`;\n case 'heading5':\n return `##### ${this.extractText(block)}`;\n case 'heading6':\n return `###### ${this.extractText(block)}`;\n case 'heading7':\n return `####### ${this.extractText(block)}`;\n case 'heading8':\n return `######## ${this.extractText(block)}`;\n case 'heading9':\n return `######### ${this.extractText(block)}`;\n case 'text':\n return this.extractText(block);\n case 'bullet':\n return `${' '.repeat(depth)}- ${this.extractText(block)}`;\n case 'ordered':\n return `${' '.repeat(depth)}1. ${this.extractText(block)}`;\n case 'code':\n return this.convertCodeBlock(block);\n case 'quote':\n return `> ${this.extractText(block)}`;\n case 'todo':\n return this.convertTodoBlock(block);\n case 'callout':\n return this.convertCalloutBlock(block);\n case 'divider':\n return '---';\n case 'image':\n return this.convertImageBlock(block);\n case 'file':\n return this.convertFileBlock(block);\n case 'table':\n return this.convertTableBlock(block);\n case 'page':\n // 页面块不输出内容\n return '';\n default:\n // 不支持的块类型,尝试提取文本\n const ctx = requestContextService.createRequestContext({\n operation: 'contentConverter.convertBlock',\n tenantId: 'feishu-service',\n });\n logger.warning('不支持的块类型', {\n ...ctx,\n blockType: block.blockType,\n blockId: block.blockId,\n });\n return this.extractText(block);\n }\n }\n\n /**\n * extractText method 提取块中的文本内容.\n */\n private extractText(block: FeishuBlock): string {\n if (!block.content?.text) return '';\n\n return block.content.text\n .map((run) => {\n let text = run.text;\n\n // 应用文本样式\n if (run.style) {\n if (run.style.bold) text = `**${text}**`;\n if (run.style.italic) text = `*${text}*`;\n if (run.style.strikethrough) text = `~~${text}~~`;\n if (run.style.inlineCode) text = `\\`${text}\\``;\n if (run.style.link) text = `[${text}](${run.style.link.url})`;\n }\n\n return text;\n })\n .join('');\n }\n\n /**\n * convertCodeBlock method 转换代码块.\n */\n private convertCodeBlock(block: FeishuBlock): string {\n const text = this.extractText(block);\n const language = block.content?.style?.language ?? '';\n return `\\`\\`\\`${language}\\n${text}\\n\\`\\`\\``;\n }\n\n /**\n * convertTodoBlock method 转换任务列表块.\n */\n private convertTodoBlock(block: FeishuBlock): string {\n const text = this.extractText(block);\n const checked = (block.content as { checked?: boolean })?.checked ?? false;\n return `- [${checked ? 'x' : ' '}] ${text}`;\n }\n\n /**\n * convertCalloutBlock method 转换 Callout 块.\n */\n private convertCalloutBlock(block: FeishuBlock): string {\n const text = this.extractText(block);\n const calloutType =\n (block.content as { callout_type?: string })?.callout_type ?? 'info';\n return `> [!${calloutType}]\\n> ${text}`;\n }\n\n /**\n * convertImageBlock method 转换图片块.\n */\n private convertImageBlock(block: FeishuBlock): string {\n const imageContent = block.content as {\n image?: { token?: string };\n };\n const token = imageContent?.image?.token ?? '';\n const url = `https://open.feishu.cn/open-apis/drive/v1/medias/${token}/download`;\n return `![image](${url})`;\n }\n\n /**\n * convertFileBlock method 转换文件块.\n */\n private convertFileBlock(block: FeishuBlock): string {\n const fileContent = block.content as {\n file?: { token?: string; name?: string };\n };\n const token = fileContent?.file?.token ?? '';\n const name = fileContent?.file?.name ?? 'file';\n const url = `https://open.feishu.cn/open-apis/drive/v1/medias/${token}/download`;\n return `[${name}](${url})`;\n }\n\n /**\n * convertTableBlock method 转换表格块.\n */\n private convertTableBlock(block: FeishuBlock): string {\n // 简化实现:表格转换较复杂,这里返回占位符\n const ctx = requestContextService.createRequestContext({\n operation: 'contentConverter.convertTableBlock',\n tenantId: 'feishu-service',\n });\n logger.warning('表格转换暂未完全实现', { ...ctx, blockId: block.blockId });\n return '<!-- Table content -->';\n }\n}\n","/**\n * @fileoverview 飞书服务 DI 容器注册.\n * 注册飞书相关的服务提供者到 tsyringe 容器.\n * @module src/container/registrations/feishu\n */\n\nimport { container, Lifecycle } from 'tsyringe';\n\nimport {\n FeishuApiProviderToken,\n FeishuMarkdownProcessorToken,\n FeishuRateLimiterToken,\n FeishuContentConverterToken,\n FeishuServiceToken,\n} from '@/container/tokens.js';\nimport {\n FeishuApiProvider,\n FeishuRateLimiter,\n FeishuService,\n MarkdownProcessorProvider,\n} from '@/services/feishu/index.js';\nimport { ContentConverterProvider } from '@/services/feishu/providers/content-converter.provider.js';\nimport { logger } from '@/utils/index.js';\n\n/**\n * registerFeishuServices function 注册飞书服务到 DI 容器.\n */\nexport const registerFeishuServices = (): void => {\n // 注册 FeishuApiProvider\n container.register(\n FeishuApiProviderToken,\n { useClass: FeishuApiProvider },\n { lifecycle: Lifecycle.Singleton },\n );\n\n // 注册 MarkdownProcessorProvider\n container.register(\n FeishuMarkdownProcessorToken,\n { useClass: MarkdownProcessorProvider },\n { lifecycle: Lifecycle.Singleton },\n );\n\n // 注册 FeishuRateLimiter\n container.register(\n FeishuRateLimiterToken,\n { useClass: FeishuRateLimiter },\n { lifecycle: Lifecycle.Singleton },\n );\n\n // 注册 ContentConverterProvider\n container.register(\n FeishuContentConverterToken,\n { useClass: ContentConverterProvider },\n { lifecycle: Lifecycle.Singleton },\n );\n\n // 注册 FeishuService(编排器)\n // 使用工厂模式注入所有依赖\n container.register(FeishuServiceToken, {\n useFactory: (c) => {\n const feishuService = c.resolve(FeishuService);\n const apiProvider = c.resolve<FeishuApiProvider>(FeishuApiProviderToken);\n const markdownProcessor = c.resolve<MarkdownProcessorProvider>(\n FeishuMarkdownProcessorToken,\n );\n const rateLimiter = c.resolve<FeishuRateLimiter>(FeishuRateLimiterToken);\n const contentConverter = c.resolve<ContentConverterProvider>(\n FeishuContentConverterToken,\n );\n\n // 设置服务提供者\n feishuService.setProviders(apiProvider, markdownProcessor, rateLimiter, contentConverter);\n\n return feishuService;\n },\n });\n\n logger.info('飞书服务已注册到 DI 容器');\n};\n","/**\n * @fileoverview Barrel file for all resource definitions.\n * Re-exports all resource definitions and provides an array for easy iteration.\n * @module src/mcp-server/resources/definitions\n */\n\n/**\n * An array containing all resource definitions for easy iteration.\n * This is used by the registration system to automatically discover and register\n * all available resources.\n */\nexport const allResourceDefinitions = [];\n","/**\n * @fileoverview A factory for registering standardized MCP resources from definitions.\n * Encapsulates context creation, error handling, and response formatting, keeping\n * resource logic pure and stateless.\n * @module src/mcp-server/resources/utils/resourceHandlerFactory\n */\nimport {\n McpServer,\n ResourceTemplate,\n} from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { ReadResourceResult } from '@modelcontextprotocol/sdk/types.js';\nimport type { ZodObject, ZodRawShape, z } from 'zod';\n\nimport type { ResourceDefinition } from '@/mcp-server/resources/utils/resourceDefinition.js';\nimport { JsonRpcErrorCode, McpError } from '@/types-global/errors.js';\nimport {\n ErrorHandler,\n type RequestContext,\n logger,\n requestContextService,\n} from '@/utils/index.js';\n\n/** Default formatter producing a single JSON text content block. */\ntype ResponseFormatter = (\n result: unknown,\n meta: { uri: URL; mimeType: string },\n) => ReadResourceResult['contents'];\n\nfunction defaultResponseFormatter(\n result: unknown,\n meta: { uri: URL; mimeType: string },\n): ReadResourceResult['contents'] {\n return [\n {\n uri: meta.uri.href,\n text: JSON.stringify(result),\n mimeType: meta.mimeType,\n },\n ];\n}\n\nfunction ensureResourceContents(\n contents: unknown,\n handlerContext: RequestContext,\n resourceName: string,\n uri: URL,\n): ReadResourceResult['contents'] {\n if (!Array.isArray(contents)) {\n throw new McpError(\n JsonRpcErrorCode.InternalError,\n 'Resource formatter must return an array of contents.',\n {\n requestId: handlerContext.requestId,\n resourceName,\n uri: uri.href,\n },\n );\n }\n\n // We perform a shallow validation here. A full Zod schema validation would be safer\n // but might be too slow for every resource call. This is a pragmatic trade-off.\n for (const item of contents) {\n if (typeof item !== 'object' || item === null || !('uri' in item)) {\n throw new McpError(\n JsonRpcErrorCode.InternalError,\n 'Invalid content block found in resource formatter output. Each item must be an object with a `uri` property.',\n {\n requestId: handlerContext.requestId,\n resourceName,\n uri: uri.href,\n },\n );\n }\n }\n\n return contents as ReadResourceResult['contents'];\n}\n\n/**\n * Registers a single resource definition with the provided MCP server.\n */\nexport async function registerResource<\n TParamsSchema extends ZodObject<ZodRawShape>,\n TOutputSchema extends ZodObject<ZodRawShape> | undefined = undefined,\n>(\n server: McpServer,\n def: ResourceDefinition<TParamsSchema, TOutputSchema>,\n): Promise<void> {\n const resourceName = def.name;\n const registrationContext: RequestContext =\n requestContextService.createRequestContext({\n operation: 'RegisterResource',\n additionalContext: { resourceName },\n });\n\n logger.info(`Registering resource: '${resourceName}'`, registrationContext);\n\n await ErrorHandler.tryCatch(\n () => {\n const template = new ResourceTemplate(def.uriTemplate, {\n list: def.list,\n });\n\n const mimeType = def.mimeType ?? 'application/json';\n const formatter: ResponseFormatter =\n def.responseFormatter ?? defaultResponseFormatter;\n const title = def.title ?? resourceName;\n\n server.resource(\n resourceName,\n template,\n {\n title,\n description: def.description,\n mimeType,\n ...(def.examples && { examples: def.examples }),\n },\n async (uri, params, callContext): Promise<ReadResourceResult> => {\n const sessionId =\n typeof callContext?.sessionId === 'string'\n ? callContext.sessionId\n : undefined;\n\n const handlerContext: RequestContext =\n requestContextService.createRequestContext({\n parentContext: callContext,\n operation: 'HandleResourceRead',\n additionalContext: {\n resourceUri: uri.href,\n sessionId,\n inputParams: params,\n },\n });\n\n try {\n // Validate params via the schema before invoking logic\n type TParams = z.infer<TParamsSchema>;\n type TOutput =\n TOutputSchema extends ZodObject<ZodRawShape>\n ? z.infer<TOutputSchema>\n : unknown;\n const parsedParams = def.paramsSchema.parse(params) as TParams;\n const responseData = (await def.logic(\n uri,\n parsedParams,\n handlerContext,\n )) as TOutput;\n\n const rawContents: unknown = formatter(responseData, {\n uri,\n mimeType,\n });\n\n const contents = ensureResourceContents(\n rawContents,\n handlerContext,\n resourceName,\n uri,\n );\n\n const readResult: ReadResourceResult = { contents };\n return readResult;\n } catch (error: unknown) {\n // Centralized handler re-throws the error for the SDK to catch\n throw ErrorHandler.handleError(error, {\n operation: `resource:${resourceName}:readHandler`,\n context: handlerContext,\n input: { uri: uri.href, params },\n });\n }\n },\n );\n\n logger.notice(\n `Resource '${resourceName}' registered successfully.`,\n registrationContext,\n );\n },\n {\n operation: `RegisteringResource_${resourceName}`,\n context: registrationContext,\n errorCode: JsonRpcErrorCode.InitializationFailed,\n critical: true,\n },\n );\n}\n","/**\n * @fileoverview Encapsulates the registration of all resource definitions for the application's\n * dependency injection (DI) container and provides a registry service to apply them to an\n * McpServer instance.\n * @module src/mcp-server/resources/resource-registration\n */\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { type DependencyContainer, injectable, injectAll } from 'tsyringe';\nimport { ZodObject, type ZodRawShape } from 'zod';\n\nimport { ResourceDefinitions } from '@/container/index.js';\nimport { allResourceDefinitions } from '@/mcp-server/resources/definitions/index.js';\nimport type { ResourceDefinition } from '@/mcp-server/resources/utils/resourceDefinition.js';\nimport { registerResource } from '@/mcp-server/resources/utils/resourceHandlerFactory.js';\nimport { logger, requestContextService } from '@/utils/index.js';\n\n@injectable()\nexport class ResourceRegistry {\n constructor(\n @injectAll(ResourceDefinitions, { isOptional: true })\n private resourceDefs: ResourceDefinition<\n ZodObject<ZodRawShape>,\n ZodObject<ZodRawShape> | undefined\n >[],\n ) {}\n\n /**\n * Registers all resolved resource definitions with the provided McpServer instance.\n * @param {McpServer} server - The server instance to register resources with.\n */\n public async registerAll(server: McpServer): Promise<void> {\n const context = requestContextService.createRequestContext({\n operation: 'ResourceRegistry.registerAll',\n });\n logger.info(\n `Registering ${this.resourceDefs.length} resource(s)...`,\n context,\n );\n for (const resourceDef of this.resourceDefs) {\n await registerResource(server, resourceDef);\n }\n }\n}\n\n/**\n * Registers all resource definitions with the provided dependency container.\n * This function uses multi-injection to register each resource under the `ResourceDefinitions` token.\n *\n * @param {DependencyContainer} container - The tsyringe container instance to register resources with.\n */\nexport const registerResources = (container: DependencyContainer): void => {\n for (const resource of allResourceDefinitions) {\n container.register(ResourceDefinitions, { useValue: resource });\n }\n};\n","/**\n * @fileoverview Barrel file for all prompt definitions.\n * This file re-exports all prompt definitions for easy import and registration.\n * @module src/mcp-server/prompts/definitions\n */\nimport type { PromptDefinition } from '../utils/promptDefinition.js';\n\n/**\n * An array containing all prompt definitions for easy iteration.\n */\nexport const allPromptDefinitions: PromptDefinition<any>[] = [];\n","/**\n * @fileoverview Service for registering MCP prompts on a server instance.\n * Prompts are structured message templates that users can discover and invoke.\n *\n * MCP Prompts Specification:\n * @see {@link https://modelcontextprotocol.io/specification/2025-06-18/basic/prompts | MCP Prompts}\n * @module src/mcp-server/prompts/prompt-registration\n */\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { inject, injectable } from 'tsyringe';\n\nimport { Logger } from '@/container/tokens.js';\nimport { allPromptDefinitions } from './definitions/index.js';\nimport {\n logger as defaultLogger,\n requestContextService,\n} from '@/utils/index.js';\n\n@injectable()\nexport class PromptRegistry {\n constructor(@inject(Logger) private logger: typeof defaultLogger) {}\n\n /**\n * Registers all prompts on the given MCP server.\n */\n registerAll(server: McpServer): void {\n const context = requestContextService.createRequestContext({\n operation: 'PromptRegistry.registerAll',\n });\n\n this.logger.debug(\n `Registering ${allPromptDefinitions.length} prompts...`,\n context,\n );\n\n // Early return if no prompts to register\n if (allPromptDefinitions.length === 0) {\n this.logger.info('No prompts to register', context);\n return;\n }\n\n // Register each prompt using the SDK's registerPrompt API\n for (const promptDef of allPromptDefinitions) {\n this.logger.debug(`Registering prompt: ${promptDef.name}`, context);\n\n server.registerPrompt(\n promptDef.name,\n {\n description: promptDef.description,\n ...(promptDef.argumentsSchema && {\n argsSchema: promptDef.argumentsSchema.shape,\n }),\n },\n async (args: Record<string, unknown>) => {\n const messages = await promptDef.generate(args as never);\n return { messages };\n },\n );\n\n this.logger.info(`Registered prompt: ${promptDef.name}`, context);\n }\n\n this.logger.info(\n `Successfully registered ${allPromptDefinitions.length} prompts`,\n context,\n );\n }\n}\n","/**\n * @fileoverview Service for implementing MCP roots capability.\n * Roots provide filesystem/workspace context awareness for the server.\n *\n * MCP Roots Specification:\n * @see {@link https://modelcontextprotocol.io/specification/2025-06-18/basic/roots | MCP Roots}\n * @module src/mcp-server/roots/roots-registration\n */\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { inject, injectable } from 'tsyringe';\n\nimport { Logger } from '@/container/tokens.js';\nimport {\n logger as defaultLogger,\n requestContextService,\n} from '@/utils/index.js';\n\n@injectable()\nexport class RootsRegistry {\n constructor(@inject(Logger) private logger: typeof defaultLogger) {}\n\n /**\n * Registers roots handlers on the given MCP server.\n * Note: In MCP, roots are typically provided BY THE CLIENT to the server.\n * This implementation provides a placeholder for demonstration.\n * In production, roots would be received from the client via client.listRoots().\n */\n registerAll(_server: McpServer): void {\n const context = requestContextService.createRequestContext({\n operation: 'RootsRegistry.registerAll',\n });\n\n this.logger.debug(\n 'Roots capability enabled (client-provided roots)',\n context,\n );\n\n // Note: The MCP SDK handles roots automatically via the client-server protocol.\n // Servers receive roots from clients, not the other way around.\n // This is just a placeholder to demonstrate the capability is enabled.\n // To access roots in your tools, use sdkContext to query the client.\n\n this.logger.info('Roots capability registered successfully', context);\n }\n}\n","/**\n * @fileoverview Provides utility functions for authorization, specifically for\n * checking token scopes against required permissions for a given operation.\n * @module src/mcp-server/transports/auth/core/authUtils\n */\nimport { JsonRpcErrorCode, McpError } from '@/types-global/errors.js';\nimport { logger, requestContextService } from '@/utils/index.js';\nimport { authContext } from '@/mcp-server/transports/auth/lib/authContext.js';\n\n/**\n * Checks if the current authentication context contains all the specified scopes.\n * If no authentication context is found (i.e., auth is disabled), it defaults\n * to allowing the operation, making it suitable for templates and demos.\n * If auth is enabled, it strictly enforces scope checks.\n *\n * @param requiredScopes - An array of scope strings that are mandatory for the operation.\n * @throws {McpError} Throws an error with `JsonRpcErrorCode.Forbidden` if authentication\n * is active and one or more required scopes are not present in the validated token.\n */\nexport function withRequiredScopes(requiredScopes: string[]): void {\n const operationName = 'withRequiredScopesCheck';\n const initialContext = requestContextService.createRequestContext({\n operation: operationName,\n additionalContext: { requiredScopes },\n });\n\n const store = authContext.getStore();\n\n // If no auth store is found, it means auth is not configured. Default to allowed for template usability.\n if (!store || !store.authInfo) {\n logger.debug(\n 'No authentication context found. Defaulting to allowed for demonstration purposes.',\n initialContext,\n );\n return;\n }\n\n logger.debug('Performing scope authorization check.', initialContext);\n\n const { scopes: grantedScopes, clientId, subject } = store.authInfo;\n const grantedScopeSet = new Set(grantedScopes);\n\n const missingScopes = requiredScopes.filter(\n (scope) => !grantedScopeSet.has(scope),\n );\n\n const finalContext = {\n ...initialContext,\n grantedScopes,\n clientId,\n subject,\n };\n\n if (missingScopes.length > 0) {\n const errorContext = { ...finalContext, missingScopes };\n logger.warning(\n 'Authorization failed: Missing required scopes.',\n errorContext,\n );\n throw new McpError(\n JsonRpcErrorCode.Forbidden,\n `Insufficient permissions. Missing required scopes: ${missingScopes.join(', ')}`,\n errorContext,\n );\n }\n\n logger.debug('Scope authorization successful.', finalContext);\n}\n","/**\n * @fileoverview Higher-order functions for declarative, scope-based authorization.\n * @module src/mcp-server/transports/auth/lib/withAuth\n */\nimport type { SdkContext } from '@/mcp-server/tools/utils/index.js';\nimport { withRequiredScopes } from '@/mcp-server/transports/auth/lib/authUtils.js';\nimport type { RequestContext } from '@/utils/index.js';\n\n/**\n * A higher-order function that wraps a **tool's** logic function with a\n * scope-based authorization check.\n *\n * @param {string[]} requiredScopes An array of scopes required to execute the logic.\n * @param {Function} logicFn The core tool logic function to execute if authorization succeeds.\n * @returns A new async function that performs the auth check before executing the logic.\n */\nexport function withToolAuth<TInput, TOutput>(\n requiredScopes: string[],\n logicFn: (\n input: TInput,\n context: RequestContext,\n sdkContext: SdkContext,\n ) => TOutput | Promise<TOutput>,\n): (\n input: TInput,\n context: RequestContext,\n sdkContext: SdkContext,\n) => Promise<TOutput> {\n return async (\n input: TInput,\n context: RequestContext,\n sdkContext: SdkContext,\n ): Promise<TOutput> => {\n withRequiredScopes(requiredScopes);\n return Promise.resolve(logicFn(input, context, sdkContext));\n };\n}\n\n/**\n * A higher-order function that wraps a **resource's** logic function with a\n * scope-based authorization check.\n *\n * @param {string[]} requiredScopes An array of scopes required to execute the logic.\n * @param {Function} logicFn The core resource logic function to execute if authorization succeeds.\n * @returns A new async function that performs the auth check before executing the logic.\n */\nexport function withResourceAuth<TUri, TParams, TOutput>(\n requiredScopes: string[],\n logicFn: (\n uri: TUri,\n params: TParams,\n context: RequestContext,\n ) => TOutput | Promise<TOutput>,\n): (uri: TUri, params: TParams, context: RequestContext) => Promise<TOutput> {\n return async (\n uri: TUri,\n params: TParams,\n context: RequestContext,\n ): Promise<TOutput> => {\n withRequiredScopes(requiredScopes);\n return Promise.resolve(logicFn(uri, params, context));\n };\n}\n","/**\n * @fileoverview 飞书 OAuth 授权 URL 生成工具.\n * 生成飞书 OAuth 2.0 授权链接,用于用户授权.\n * @module src/mcp-server/tools/definitions/feishu-auth-url.tool\n */\n\nimport type { ContentBlock } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\nimport { container } from 'tsyringe';\n\nimport type {\n SdkContext,\n ToolAnnotations,\n ToolDefinition,\n} from '@/mcp-server/tools/utils/index.js';\nimport { withToolAuth } from '@/mcp-server/transports/auth/lib/withAuth.js';\nimport { FeishuServiceToken } from '@/container/tokens.js';\nimport type { FeishuService } from '@/services/feishu/index.js';\nimport { markdown, type RequestContext, logger } from '@/utils/index.js';\n\n/**\n * 工具名称.\n */\nconst TOOL_NAME = 'feishu_auth_url';\n\n/**\n * 工具标题.\n */\nconst TOOL_TITLE = '飞书授权链接';\n\n/**\n * 工具描述.\n */\nconst TOOL_DESCRIPTION =\n '生成飞书 OAuth 2.0 授权链接。用户访问此链接完成授权后,将获得访问飞书 API 的权限。返回授权 URL 和 state 参数。';\n\n/**\n * 工具注解.\n */\nconst TOOL_ANNOTATIONS: ToolAnnotations = {\n readOnlyHint: true,\n idempotentHint: true,\n openWorldHint: false,\n};\n\n/**\n * 输入 Schema.\n */\nconst InputSchema = z\n .object({\n appId: z\n .string()\n .optional()\n .describe('飞书应用 ID。如果不提供,将使用默认配置的应用。'),\n redirectUri: z\n .string()\n .url()\n .optional()\n .describe('OAuth 回调地址。如果不提供,将使用默认配置的回调地址。'),\n })\n .describe('生成飞书 OAuth 授权链接的参数。');\n\n/**\n * 输出 Schema.\n */\nconst OutputSchema = z\n .object({\n authUrl: z\n .string()\n .url()\n .describe('飞书 OAuth 授权链接,用户需要访问此链接完成授权。'),\n state: z\n .string()\n .describe('OAuth state 参数,用于防止 CSRF 攻击,回调时需要验证。'),\n appId: z.string().describe('使用的飞书应用 ID。'),\n expiresIn: z.number().describe('state 参数的有效期(秒)。'),\n })\n .describe('飞书授权链接生成结果。');\n\ntype AuthUrlInput = z.infer<typeof InputSchema>;\ntype AuthUrlOutput = z.infer<typeof OutputSchema>;\n\n/**\n * 工具逻辑.\n */\nasync function authUrlLogic(\n input: AuthUrlInput,\n appContext: RequestContext,\n _sdkContext: SdkContext,\n): Promise<AuthUrlOutput> {\n logger.debug('生成飞书授权链接', {\n ...appContext,\n appId: input.appId ?? 'default',\n });\n\n const feishuService = container.resolve<FeishuService>(\n FeishuServiceToken as symbol,\n );\n const { authUrl, state } = await feishuService.getAuthUrl(\n input.appId,\n input.redirectUri,\n );\n\n // 从 authUrl 中提取实际使用的 appId\n const urlParams = new URL(authUrl).searchParams;\n const usedAppId = urlParams.get('client_id') ?? input.appId ?? 'unknown';\n\n logger.info('飞书授权链接生成成功', {\n ...appContext,\n appId: usedAppId,\n });\n\n return {\n authUrl,\n state,\n appId: usedAppId,\n expiresIn: 300, // state 有效期 5 分钟\n };\n}\n\n/**\n * 响应格式化器.\n */\nfunction responseFormatter(result: AuthUrlOutput): ContentBlock[] {\n const md = markdown()\n .h2('飞书授权链接')\n .paragraph('请访问以下链接完成飞书授权:')\n .text(`🔗 [点击授权](${result.authUrl})`)\n .blankLine()\n .blankLine()\n .paragraph('或复制以下链接到浏览器:')\n .codeBlock(result.authUrl, 'text')\n .keyValue('应用 ID', result.appId)\n .keyValue('有效期', `${result.expiresIn} 秒`)\n .blankLine()\n .blockquote(\n '授权完成后,系统将自动获取访问令牌。请确保在有效期内完成授权。',\n );\n\n return [\n {\n type: 'text',\n text: md.build(),\n },\n ];\n}\n\n/**\n * 飞书授权链接工具定义.\n */\nexport const feishuAuthUrlTool: ToolDefinition<\n typeof InputSchema,\n typeof OutputSchema\n> = {\n name: TOOL_NAME,\n title: TOOL_TITLE,\n description: TOOL_DESCRIPTION,\n inputSchema: InputSchema,\n outputSchema: OutputSchema,\n annotations: TOOL_ANNOTATIONS,\n logic: withToolAuth(['tool:feishu:auth'], authUrlLogic),\n responseFormatter,\n};\n","/**\n * @fileoverview 飞书 OAuth 授权回调处理工具.\n * 处理飞书 OAuth 2.0 授权回调,交换授权码获取访问令牌.\n * @module src/mcp-server/tools/definitions/feishu-auth-callback.tool\n */\n\nimport type { ContentBlock } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\nimport { container } from 'tsyringe';\n\nimport type {\n SdkContext,\n ToolAnnotations,\n ToolDefinition,\n} from '@/mcp-server/tools/utils/index.js';\nimport { withToolAuth } from '@/mcp-server/transports/auth/lib/withAuth.js';\nimport { FeishuServiceToken } from '@/container/tokens.js';\nimport type { FeishuService } from '@/services/feishu/index.js';\nimport { FEISHU_CONFIG } from '@/services/feishu/constants.js';\nimport {\n markdown,\n type RequestContext,\n logger,\n requestContextService,\n} from '@/utils/index.js';\n\n/**\n * 工具名称.\n */\nconst TOOL_NAME = 'feishu_auth_callback';\n\n/**\n * 工具标题.\n */\nconst TOOL_TITLE = '飞书授权回调';\n\n/**\n * 工具描述.\n */\nconst TOOL_DESCRIPTION =\n '处理飞书 OAuth 2.0 授权回调。使用授权码交换访问令牌,并存储认证信息。通常由 OAuth 回调端点自动调用,也可手动调用处理授权码。';\n\n/**\n * 工具注解.\n */\nconst TOOL_ANNOTATIONS: ToolAnnotations = {\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint: true,\n};\n\n/**\n * 输入 Schema.\n */\nconst InputSchema = z\n .object({\n code: z\n .string()\n .min(1, '授权码不能为空')\n .describe('飞书 OAuth 授权码,从授权回调 URL 中获取。'),\n state: z\n .string()\n .min(1, 'state 参数不能为空')\n .describe('OAuth state 参数,用于验证请求来源,防止 CSRF 攻击。'),\n appId: z\n .string()\n .optional()\n .describe('飞书应用 ID。如果不提供,将使用默认配置的应用。'),\n })\n .describe('飞书 OAuth 授权回调参数。');\n\n/**\n * 输出 Schema.\n */\nconst OutputSchema = z\n .object({\n success: z.boolean().describe('授权是否成功。'),\n userInfo: z\n .object({\n userId: z.string().describe('飞书用户 ID。'),\n name: z.string().describe('用户名称。'),\n email: z.string().optional().describe('用户邮箱。'),\n avatarUrl: z.string().optional().describe('用户头像 URL。'),\n })\n .optional()\n .describe('授权用户信息。'),\n appId: z.string().describe('使用的飞书应用 ID。'),\n expiresAt: z.number().optional().describe('访问令牌过期时间戳(毫秒)。'),\n message: z.string().describe('操作结果消息。'),\n })\n .describe('飞书授权回调处理结果。');\n\ntype AuthCallbackInput = z.infer<typeof InputSchema>;\ntype AuthCallbackOutput = z.infer<typeof OutputSchema>;\n\n/**\n * 工具逻辑.\n */\nasync function authCallbackLogic(\n input: AuthCallbackInput,\n appContext: RequestContext,\n _sdkContext: SdkContext,\n): Promise<AuthCallbackOutput> {\n logger.debug('处理飞书授权回调', {\n ...appContext,\n appId: input.appId ?? 'default',\n hasCode: !!input.code,\n hasState: !!input.state,\n });\n\n const feishuService = container.resolve<FeishuService>(\n FeishuServiceToken as symbol,\n );\n\n try {\n // 创建带有正确租户ID的上下文\n const context = requestContextService.createRequestContext({\n operation: 'feishu.handleAuthCallback',\n tenantId: 'feishu-service',\n });\n\n const result = await feishuService.handleAuthCallback(\n input.code,\n input.state,\n input.appId,\n );\n\n if (!result.success) {\n // 获取实际使用的 appId\n const usedAppId =\n input.appId ?? FEISHU_CONFIG.DEFAULT_APP_ID ?? 'unknown';\n\n return {\n success: false,\n appId: usedAppId,\n message: '授权回调处理失败',\n };\n }\n\n // 获取实际使用的 appId\n const usedAppId = input.appId ?? FEISHU_CONFIG.DEFAULT_APP_ID ?? 'unknown';\n\n logger.info('飞书授权成功', {\n ...context,\n appId: usedAppId,\n userName: result.userInfo?.name,\n });\n\n return {\n success: true,\n userInfo: result.userInfo,\n appId: usedAppId,\n expiresAt: result.expiresAt,\n message: `授权成功!欢迎 ${result.userInfo?.name ?? '用户'}`,\n };\n } catch (error) {\n logger.error(\n '飞书授权失败',\n error instanceof Error ? error : new Error(String(error)),\n appContext,\n );\n\n // 获取实际使用的 appId\n const usedAppId = input.appId ?? FEISHU_CONFIG.DEFAULT_APP_ID ?? 'unknown';\n\n return {\n success: false,\n appId: usedAppId,\n message: `授权失败: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 响应格式化器.\n */\nfunction responseFormatter(result: AuthCallbackOutput): ContentBlock[] {\n const md = markdown();\n\n if (result.success) {\n md.h2('✅ 飞书授权成功').paragraph(result.message);\n\n if (result.userInfo) {\n md.h3('用户信息')\n .keyValue('用户名', result.userInfo.name)\n .keyValue('用户 ID', result.userInfo.userId);\n\n if (result.userInfo.email) {\n md.keyValue('邮箱', result.userInfo.email);\n }\n }\n\n md.blankLine().keyValue('应用 ID', result.appId);\n\n if (result.expiresAt) {\n const expiresDate = new Date(result.expiresAt);\n md.keyValue('令牌有效期至', expiresDate.toLocaleString());\n }\n\n md.blankLine().blockquote('现在可以使用飞书相关功能了!');\n } else {\n md.h2('❌ 飞书授权失败')\n .paragraph(result.message)\n .keyValue('应用 ID', result.appId)\n .blankLine()\n .blockquote('请重新尝试授权,或检查应用配置是否正确。');\n }\n\n return [\n {\n type: 'text',\n text: md.build(),\n },\n ];\n}\n\n/**\n * 飞书授权回调工具定义.\n */\nexport const feishuAuthCallbackTool: ToolDefinition<\n typeof InputSchema,\n typeof OutputSchema\n> = {\n name: TOOL_NAME,\n title: TOOL_TITLE,\n description: TOOL_DESCRIPTION,\n inputSchema: InputSchema,\n outputSchema: OutputSchema,\n annotations: TOOL_ANNOTATIONS,\n logic: withToolAuth(['tool:feishu:auth'], authCallbackLogic),\n responseFormatter,\n};\n","/**\n * @fileoverview 飞书 Markdown 文档上传工具.\n * 将 Markdown 文档转换并上传到飞书云空间或知识库.\n * @module src/mcp-server/tools/definitions/feishu-upload-markdown.tool\n */\n\nimport type { ContentBlock } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\nimport { container } from 'tsyringe';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport type {\n SdkContext,\n ToolAnnotations,\n ToolDefinition,\n} from '@/mcp-server/tools/utils/index.js';\nimport { withToolAuth } from '@/mcp-server/transports/auth/lib/withAuth.js';\nimport { FeishuServiceToken } from '@/container/tokens.js';\nimport type { FeishuService } from '@/services/feishu/index.js';\nimport {\n markdown,\n type RequestContext,\n logger,\n requestContextService,\n} from '@/utils/index.js';\nimport { McpError, JsonRpcErrorCode } from '@/types-global/errors.js';\n\n/**\n * 工具名称.\n */\nconst TOOL_NAME = 'feishu_upload_markdown';\n\n/**\n * 工具标题.\n */\nconst TOOL_TITLE = '上传 Markdown 到飞书';\n\n/**\n * 工具描述.\n */\nconst TOOL_DESCRIPTION = `将 Markdown 文档上传到飞书云空间或知识库。\n\n支持两种输入方式:\n1. 提供文件路径 (filePath) - 从本地文件读取内容\n2. 提供内容字符串 (content) - 直接使用提供的 Markdown 内容\n\n功能特性:\n- 自动转换 Markdown 语法为飞书文档格式\n- 支持上传本地图片和附件\n- 支持 Front Matter 处理\n- 支持上传到云空间文件夹或知识库空间\n\n**注意事项:**\n- 需要先完成飞书 OAuth 授权\n- 上传到云空间需要应用具有 drive:drive 权限\n- 上传到知识库需要应用具有 wiki:wiki 权限\n`.trim();\n\n/**\n * 工具注解.\n */\nconst TOOL_ANNOTATIONS: ToolAnnotations = {\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint: true,\n};\n\n/**\n * 输入 Schema.\n */\nconst InputSchema = z\n .object({\n filePath: z\n .string()\n .optional()\n .describe('Markdown 文件路径。与 content 二选一,优先使用 filePath。'),\n content: z\n .string()\n .optional()\n .describe('Markdown 内容字符串。与 filePath 二选一。'),\n title: z\n .string()\n .optional()\n .describe('文档标题。如果不提供,将从 Front Matter 或文件名中提取。'),\n workingDirectory: z\n .string()\n .optional()\n .describe(\n '工作目录,用于解析相对路径的图片和附件。默认使用文件所在目录或当前目录。',\n ),\n targetType: z\n .enum(['drive', 'wiki'])\n .default('wiki')\n .describe('目标类型:drive(云空间)或 wiki(知识库)。'),\n targetId: z\n .string()\n .optional()\n .describe(\n '目标 ID。drive 类型为文件夹 token,wiki 类型为空间 ID。不提供则上传到根目录。',\n ),\n parentNodeToken: z\n .string()\n .optional()\n .describe(\n '父节点 token。用于在云空间文档或知识库文档下创建子文档。如果提供,文档将作为该节点的子文档创建。',\n ),\n appId: z\n .string()\n .optional()\n .describe('飞书应用 ID。如果不提供,将使用默认配置的应用。'),\n uploadImages: z\n .boolean()\n .default(true)\n .describe('是否上传本地图片到飞书。'),\n uploadAttachments: z\n .boolean()\n .default(true)\n .describe('是否上传本地附件到飞书。'),\n removeFrontMatter: z\n .boolean()\n .default(true)\n .describe('是否移除 Front Matter。设为 false 将保留为代码块。'),\n })\n .refine((data) => data.filePath || data.content, {\n message: '必须提供 filePath 或 content 其中之一',\n })\n .describe('上传 Markdown 文档到飞书的参数。');\n\n/**\n * 输出 Schema.\n */\nconst OutputSchema = z\n .object({\n success: z.boolean().describe('上传是否成功。'),\n documentId: z.string().optional().describe('飞书文档 ID。'),\n url: z.string().optional().describe('飞书文档 URL。'),\n title: z.string().optional().describe('文档标题。'),\n uploadedFiles: z\n .array(\n z.object({\n originalPath: z.string().describe('原始文件路径。'),\n fileName: z.string().describe('文件名。'),\n fileKey: z.string().describe('飞书文件 key。'),\n isImage: z.boolean().describe('是否为图片。'),\n }),\n )\n .optional()\n .describe('已上传的本地文件列表。'),\n error: z.string().optional().describe('错误信息。'),\n })\n .describe('Markdown 文档上传结果。');\n\ntype UploadInput = z.infer<typeof InputSchema>;\ntype UploadOutput = z.infer<typeof OutputSchema>;\n\n/**\n * 工具逻辑.\n */\nasync function uploadLogic(\n input: UploadInput,\n appContext: RequestContext,\n _sdkContext: SdkContext,\n): Promise<UploadOutput> {\n logger.debug('开始上传 Markdown 文档', {\n ...appContext,\n hasFilePath: !!input.filePath,\n hasContent: !!input.content,\n targetType: input.targetType,\n });\n\n // 创建带有正确租户ID的上下文\n const context = requestContextService.createRequestContext({\n operation: 'feishu.uploadMarkdown',\n tenantId: 'feishu-service',\n });\n\n // 获取文档内容\n let content: string;\n let documentTitle = input.title;\n let workingDirectory = input.workingDirectory;\n\n if (input.filePath) {\n // 从文件读取\n const absolutePath = path.isAbsolute(input.filePath)\n ? input.filePath\n : path.resolve(process.cwd(), input.filePath);\n\n if (!fs.existsSync(absolutePath)) {\n throw new McpError(\n JsonRpcErrorCode.InvalidParams,\n `文件不存在: ${input.filePath}`,\n );\n }\n\n content = fs.readFileSync(absolutePath, 'utf-8');\n workingDirectory = workingDirectory || path.dirname(absolutePath);\n\n // 如果没有提供标题,从文件名提取\n if (!documentTitle) {\n documentTitle = path.basename(absolutePath, path.extname(absolutePath));\n }\n } else if (input.content) {\n content = input.content;\n workingDirectory = workingDirectory || process.cwd();\n } else {\n throw new McpError(\n JsonRpcErrorCode.InvalidParams,\n '必须提供 filePath 或 content',\n );\n }\n\n const feishuService = container.resolve<FeishuService>(\n FeishuServiceToken as symbol,\n );\n\n const result = await feishuService.uploadMarkdown(\n {\n title: documentTitle || 'Untitled',\n content,\n ...(input.filePath ? { filePath: input.filePath } : {}),\n workingDirectory,\n },\n {\n ...(input.appId ? { appId: input.appId } : {}),\n targetType: input.targetType,\n ...(input.targetId ? { targetId: input.targetId } : {}),\n ...(input.parentNodeToken ? { parentNodeToken: input.parentNodeToken } : {}),\n uploadImages: input.uploadImages,\n uploadAttachments: input.uploadAttachments,\n removeFrontMatter: input.removeFrontMatter,\n },\n );\n\n if (result.success) {\n logger.info('Markdown 文档上传成功', {\n ...context,\n documentId: result.documentId,\n title: result.title,\n });\n } else {\n logger.warning('Markdown 文档上传失败', {\n ...context,\n error: result.error,\n });\n }\n\n return {\n success: result.success,\n documentId: result.documentId,\n url: result.url,\n title: result.title,\n uploadedFiles: result.uploadedFiles,\n error: result.error,\n };\n}\n\n/**\n * 响应格式化器.\n */\nfunction responseFormatter(result: UploadOutput): ContentBlock[] {\n const md = markdown();\n\n if (result.success) {\n md.h2('✅ 文档上传成功')\n .keyValue('文档标题', result.title ?? '未知')\n .keyValue('文档 ID', result.documentId ?? '未知');\n\n if (result.url) {\n md.blankLine()\n .paragraph('📎 文档链接:')\n .text(`[点击查看文档](${result.url})`);\n }\n\n if (result.uploadedFiles && result.uploadedFiles.length > 0) {\n md.blankLine().h3('已上传的文件');\n\n const images = result.uploadedFiles.filter((f) => f.isImage);\n const attachments = result.uploadedFiles.filter((f) => !f.isImage);\n\n if (images.length > 0) {\n md.paragraph(`🖼️ 图片: ${images.length} 个`);\n for (const img of images) {\n md.text(` - ${img.fileName}`);\n }\n }\n\n if (attachments.length > 0) {\n md.paragraph(`📄 附件: ${attachments.length} 个`);\n for (const att of attachments) {\n md.text(` - ${att.fileName}`);\n }\n }\n }\n\n md.blankLine().blockquote('文档已成功上传到飞书,可以通过链接访问。');\n } else {\n md.h2('❌ 文档上传失败').paragraph(result.error ?? '未知错误');\n\n md.blankLine().blockquote('请检查错误信息,确保已完成 OAuth 认证。');\n }\n\n return [\n {\n type: 'text',\n text: md.build(),\n },\n ];\n}\n\n/**\n * 飞书 Markdown 上传工具定义.\n */\nexport const feishuUploadMarkdownTool: ToolDefinition<\n typeof InputSchema,\n typeof OutputSchema\n> = {\n name: TOOL_NAME,\n title: TOOL_TITLE,\n description: TOOL_DESCRIPTION,\n inputSchema: InputSchema,\n outputSchema: OutputSchema,\n annotations: TOOL_ANNOTATIONS,\n logic: withToolAuth(['tool:feishu:write'], uploadLogic),\n responseFormatter,\n};\n","/**\n * @fileoverview 飞书文档更新工具.\n * 更新已存在的飞书文档内容,支持冲突检测.\n * @module src/mcp-server/tools/definitions/feishu-update-document.tool\n */\n\nimport type { ContentBlock } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\nimport { container } from 'tsyringe';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport type {\n SdkContext,\n ToolAnnotations,\n ToolDefinition,\n} from '@/mcp-server/tools/utils/index.js';\nimport { withToolAuth } from '@/mcp-server/transports/auth/lib/withAuth.js';\nimport { FeishuServiceToken } from '@/container/tokens.js';\nimport type { FeishuService } from '@/services/feishu/index.js';\nimport {\n markdown,\n type RequestContext,\n logger,\n requestContextService,\n} from '@/utils/index.js';\nimport { McpError, JsonRpcErrorCode } from '@/types-global/errors.js';\n\n/**\n * 工具名称.\n */\nconst TOOL_NAME = 'feishu_update_document';\n\n/**\n * 工具标题.\n */\nconst TOOL_TITLE = '更新飞书文档';\n\n/**\n * 工具描述.\n */\nconst TOOL_DESCRIPTION = `更新已存在的飞书文档内容。\n\n功能特性:\n- 支持从文件路径或内容字符串更新\n- 自动检测文档冲突(文档在上次上传后被修改)\n- 支持强制覆盖模式\n- 支持上传新的本地图片和附件\n\n冲突检测:\n- 如果文档在上次上传后被其他人修改,将返回冲突警告\n- 使用 force=true 可以强制覆盖`;\n\n/**\n * 工具注解.\n */\nconst TOOL_ANNOTATIONS: ToolAnnotations = {\n readOnlyHint: false,\n destructiveHint: true,\n idempotentHint: false,\n openWorldHint: true,\n};\n\n/**\n * 输入 Schema.\n */\nconst InputSchema = z\n .object({\n documentId: z\n .string()\n .min(1, '文档 ID 不能为空')\n .describe('要更新的飞书文档 ID。'),\n filePath: z\n .string()\n .optional()\n .describe('Markdown 文件路径。与 content 二选一,优先使用 filePath。'),\n content: z\n .string()\n .optional()\n .describe('Markdown 内容字符串。与 filePath 二选一。'),\n workingDirectory: z\n .string()\n .optional()\n .describe(\n '工作目录,用于解析相对路径的图片和附件。默认使用文件所在目录或当前目录。',\n ),\n appId: z\n .string()\n .optional()\n .describe('飞书应用 ID。如果不提供,将使用默认配置的应用。'),\n uploadImages: z\n .boolean()\n .default(true)\n .describe('是否上传本地图片到飞书。'),\n uploadAttachments: z\n .boolean()\n .default(true)\n .describe('是否上传本地附件到飞书。'),\n removeFrontMatter: z\n .boolean()\n .default(true)\n .describe('是否移除 Front Matter。设为 false 将保留为代码块。'),\n force: z\n .boolean()\n .default(false)\n .describe('是否强制覆盖。设为 true 将忽略冲突检测。'),\n })\n .refine((data) => data.filePath || data.content, {\n message: '必须提供 filePath 或 content 其中之一',\n })\n .describe('更新飞书文档的参数。');\n\n/**\n * 输出 Schema.\n */\nconst OutputSchema = z\n .object({\n success: z.boolean().describe('更新是否成功。'),\n documentId: z.string().describe('飞书文档 ID。'),\n url: z.string().optional().describe('飞书文档 URL。'),\n title: z.string().optional().describe('文档标题。'),\n conflictDetected: z.boolean().optional().describe('是否检测到冲突。'),\n error: z.string().optional().describe('错误信息。'),\n })\n .describe('飞书文档更新结果。');\n\ntype UpdateInput = z.infer<typeof InputSchema>;\ntype UpdateOutput = z.infer<typeof OutputSchema>;\n\n/**\n * 工具逻辑.\n */\nasync function updateLogic(\n input: UpdateInput,\n appContext: RequestContext,\n _sdkContext: SdkContext,\n): Promise<UpdateOutput> {\n logger.debug('开始更新飞书文档', {\n ...appContext,\n documentId: input.documentId,\n hasFilePath: !!input.filePath,\n hasContent: !!input.content,\n force: input.force,\n });\n\n // 创建带有正确租户ID的上下文\n const context = requestContextService.createRequestContext({\n operation: 'feishu.updateDocument',\n tenantId: 'feishu-service',\n });\n\n // 获取文档内容\n let content: string;\n let workingDirectory = input.workingDirectory;\n\n if (input.filePath) {\n // 从文件读取\n const absolutePath = path.isAbsolute(input.filePath)\n ? input.filePath\n : path.resolve(process.cwd(), input.filePath);\n\n if (!fs.existsSync(absolutePath)) {\n throw new McpError(\n JsonRpcErrorCode.InvalidParams,\n `文件不存在: ${input.filePath}`,\n );\n }\n\n content = fs.readFileSync(absolutePath, 'utf-8');\n workingDirectory = workingDirectory || path.dirname(absolutePath);\n } else if (input.content) {\n content = input.content;\n workingDirectory = workingDirectory || process.cwd();\n } else {\n throw new McpError(\n JsonRpcErrorCode.InvalidParams,\n '必须提供 filePath 或 content',\n );\n }\n\n const feishuService = container.resolve<FeishuService>(\n FeishuServiceToken as symbol,\n );\n\n const result = await feishuService.updateDocument(\n input.documentId,\n {\n title: '',\n content,\n ...(input.filePath ? { filePath: input.filePath } : {}),\n workingDirectory,\n },\n {\n ...(input.appId ? { appId: input.appId } : {}),\n targetType: 'wiki',\n uploadImages: input.uploadImages,\n uploadAttachments: input.uploadAttachments,\n removeFrontMatter: input.removeFrontMatter,\n },\n input.force,\n );\n\n if (result.success) {\n logger.info('飞书文档更新成功', {\n ...context,\n documentId: result.documentId,\n });\n } else if (result.conflictDetected) {\n logger.warning('检测到文档冲突', {\n ...context,\n documentId: input.documentId,\n });\n } else {\n logger.warning('飞书文档更新失败', {\n ...context,\n error: result.error,\n });\n }\n\n return {\n success: result.success,\n documentId: result.documentId ?? input.documentId,\n url: result.url,\n title: result.title,\n conflictDetected: result.conflictDetected,\n error: result.error,\n };\n}\n\n/**\n * 响应格式化器.\n */\nfunction responseFormatter(result: UpdateOutput): ContentBlock[] {\n const md = markdown();\n\n if (result.success) {\n md.h2('✅ 文档更新成功').keyValue('文档 ID', result.documentId);\n\n if (result.title) {\n md.keyValue('文档标题', result.title);\n }\n\n if (result.url) {\n md.blankLine()\n .paragraph('📎 文档链接:')\n .text(`[点击查看文档](${result.url})`);\n }\n\n md.blankLine().blockquote('文档已成功更新。');\n } else if (result.conflictDetected) {\n md.h2('⚠️ 检测到文档冲突')\n .keyValue('文档 ID', result.documentId)\n .blankLine()\n .paragraph(result.error ?? '文档在上次上传后已被修改。')\n .blankLine()\n .h3('解决方案')\n .text('1. 查看飞书文档,确认是否需要保留远程修改')\n .text('2. 使用 `force: true` 参数强制覆盖')\n .blankLine()\n .blockquote('建议先查看远程文档的修改内容,避免覆盖重要更改。');\n } else {\n md.h2('❌ 文档更新失败')\n .keyValue('文档 ID', result.documentId)\n .paragraph(result.error ?? '未知错误')\n .blankLine()\n .blockquote('请检查错误信息,确保文档存在且已完成 OAuth 认证。');\n }\n\n return [\n {\n type: 'text',\n text: md.build(),\n },\n ];\n}\n\n/**\n * 飞书文档更新工具定义.\n */\nexport const feishuUpdateDocumentTool: ToolDefinition<\n typeof InputSchema,\n typeof OutputSchema\n> = {\n name: TOOL_NAME,\n title: TOOL_TITLE,\n description: TOOL_DESCRIPTION,\n inputSchema: InputSchema,\n outputSchema: OutputSchema,\n annotations: TOOL_ANNOTATIONS,\n logic: withToolAuth(['tool:feishu:write'], updateLogic),\n responseFormatter,\n};\n","/**\n * @fileoverview 飞书云空间文件夹列表工具.\n * 列出飞书云空间中的文件夹.\n * @module src/mcp-server/tools/definitions/feishu-list-folders.tool\n */\n\nimport type { ContentBlock } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\nimport { container } from 'tsyringe';\n\nimport type {\n SdkContext,\n ToolAnnotations,\n ToolDefinition,\n} from '@/mcp-server/tools/utils/index.js';\nimport { withToolAuth } from '@/mcp-server/transports/auth/lib/withAuth.js';\nimport { FeishuServiceToken } from '@/container/tokens.js';\nimport type { FeishuService } from '@/services/feishu/index.js';\nimport {\n markdown,\n type RequestContext,\n logger,\n requestContextService,\n} from '@/utils/index.js';\n\n/**\n * 工具名称.\n */\nconst TOOL_NAME = 'feishu_list_folders';\n\n/**\n * 工具标题.\n */\nconst TOOL_TITLE = '列出飞书文件夹';\n\n/**\n * 工具描述.\n */\nconst TOOL_DESCRIPTION = `列出飞书云空间中的文件夹。可以指定父文件夹 ID 来列出子文件夹,不指定则列出根目录下的文件夹。\n\n**注意事项:**\n- 需要先完成飞书 OAuth 授权\n- 需要应用具有 drive:drive 权限\n- 返回的文件夹 token 可用于上传文档到指定位置\n`.trim();\n\n/**\n * 工具注解.\n */\nconst TOOL_ANNOTATIONS: ToolAnnotations = {\n readOnlyHint: true,\n idempotentHint: true,\n openWorldHint: true,\n};\n\n/**\n * 输入 Schema.\n */\nconst InputSchema = z\n .object({\n parentId: z\n .string()\n .optional()\n .describe('父文件夹 token。不提供则列出根目录下的文件夹。'),\n appId: z\n .string()\n .optional()\n .describe('飞书应用 ID。如果不提供,将使用默认配置的应用。'),\n })\n .describe('列出飞书文件夹的参数。');\n\n/**\n * 输出 Schema.\n */\nconst OutputSchema = z\n .object({\n folders: z\n .array(\n z.object({\n token: z.string().describe('文件夹 token。'),\n name: z.string().describe('文件夹名称。'),\n parentToken: z.string().optional().describe('父文件夹 token。'),\n createdAt: z.string().optional().describe('创建时间。'),\n modifiedAt: z.string().optional().describe('修改时间。'),\n }),\n )\n .describe('文件夹列表。'),\n total: z.number().describe('文件夹总数。'),\n })\n .describe('飞书文件夹列表结果。');\n\ntype ListFoldersInput = z.infer<typeof InputSchema>;\ntype ListFoldersOutput = z.infer<typeof OutputSchema>;\n\n/**\n * 工具逻辑.\n */\nasync function listFoldersLogic(\n input: ListFoldersInput,\n appContext: RequestContext,\n _sdkContext: SdkContext,\n): Promise<ListFoldersOutput> {\n logger.debug('列出飞书文件夹', {\n ...appContext,\n parentId: input.parentId ?? 'root',\n appId: input.appId ?? 'default',\n });\n\n const feishuService = container.resolve<FeishuService>(\n FeishuServiceToken as symbol,\n );\n\n // 创建带有正确租户 ID 的上下文\n const ctx = requestContextService.createRequestContext({\n operation: 'feishu.listFolders',\n tenantId: 'feishu-service',\n });\n\n try {\n const folders = await feishuService.listFolders(\n ctx,\n input.parentId,\n input.appId,\n );\n\n logger.info('获取文件夹列表成功', {\n ...appContext,\n count: folders.length,\n });\n\n return {\n folders: folders.map((f) => ({\n token: f.token,\n name: f.name,\n parentToken: f.parentToken,\n createdAt: f.createdAt,\n modifiedAt: f.modifiedAt,\n })),\n total: folders.length,\n };\n } catch (error) {\n logger.error('获取文件夹列表失败', {\n ...appContext,\n error: error instanceof Error ? error.message : String(error),\n });\n\n // 重新抛出错误而不是返回空结果\n throw error;\n }\n}\n\n/**\n * 响应格式化器.\n */\nfunction responseFormatter(result: ListFoldersOutput): ContentBlock[] {\n const md = markdown();\n\n md.h2('📁 飞书文件夹列表').keyValue('文件夹数量', String(result.total));\n\n if (result.folders.length === 0) {\n md.blankLine().paragraph('当前目录下没有文件夹。');\n } else {\n md.blankLine();\n\n for (const folder of result.folders) {\n md.text(`📂 **${folder.name}**`).text(` Token: \\`${folder.token}\\``);\n\n if (folder.modifiedAt) {\n md.text(` 修改时间: ${folder.modifiedAt}`);\n }\n\n md.blankLine();\n }\n }\n\n md.blockquote('使用文件夹 token 作为 targetId 可以将文档上传到指定文件夹。');\n\n return [\n {\n type: 'text',\n text: md.build(),\n },\n ];\n}\n\n/**\n * 飞书文件夹列表工具定义.\n */\nexport const feishuListFoldersTool: ToolDefinition<\n typeof InputSchema,\n typeof OutputSchema\n> = {\n name: TOOL_NAME,\n title: TOOL_TITLE,\n description: TOOL_DESCRIPTION,\n inputSchema: InputSchema,\n outputSchema: OutputSchema,\n annotations: TOOL_ANNOTATIONS,\n logic: withToolAuth(['tool:feishu:read'], listFoldersLogic),\n responseFormatter,\n};\n","/**\n * @fileoverview 飞书知识库列表工具.\n * 列出用户有权限访问的飞书知识库空间.\n * @module src/mcp-server/tools/definitions/feishu-list-wikis.tool\n */\n\nimport type { ContentBlock } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\nimport { container } from 'tsyringe';\n\nimport type {\n SdkContext,\n ToolAnnotations,\n ToolDefinition,\n} from '@/mcp-server/tools/utils/index.js';\nimport { withToolAuth } from '@/mcp-server/transports/auth/lib/withAuth.js';\nimport { FeishuServiceToken } from '@/container/tokens.js';\nimport type { FeishuService } from '@/services/feishu/index.js';\nimport {\n markdown,\n type RequestContext,\n logger,\n requestContextService,\n} from '@/utils/index.js';\n\n/**\n * 工具名称.\n */\nconst TOOL_NAME = 'feishu_list_wikis';\n\n/**\n * 工具标题.\n */\nconst TOOL_TITLE = '列出飞书知识库';\n\n/**\n * 工具描述.\n */\nconst TOOL_DESCRIPTION =\n '列出用户有权限访问的飞书知识库空间。返回知识库的 ID、名称、描述等信息。';\n\n/**\n * 工具注解.\n */\nconst TOOL_ANNOTATIONS: ToolAnnotations = {\n readOnlyHint: true,\n idempotentHint: true,\n openWorldHint: true,\n};\n\n/**\n * 输入 Schema.\n */\nconst InputSchema = z\n .object({\n appId: z\n .string()\n .optional()\n .describe('飞书应用 ID。如果不提供,将使用默认配置的应用。'),\n })\n .describe('列出飞书知识库的参数。');\n\n/**\n * 输出 Schema.\n */\nconst OutputSchema = z\n .object({\n wikis: z\n .array(\n z.object({\n spaceId: z.string().describe('知识库空间 ID。'),\n name: z.string().describe('知识库名称。'),\n description: z.string().optional().describe('知识库描述。'),\n spaceType: z.string().optional().describe('空间类型。'),\n visibility: z.string().optional().describe('可见性。'),\n }),\n )\n .describe('知识库列表。'),\n total: z.number().describe('知识库总数。'),\n })\n .describe('飞书知识库列表结果。');\n\ntype ListWikisInput = z.infer<typeof InputSchema>;\ntype ListWikisOutput = z.infer<typeof OutputSchema>;\n\n/**\n * 工具逻辑.\n */\nasync function listWikisLogic(\n input: ListWikisInput,\n appContext: RequestContext,\n _sdkContext: SdkContext,\n): Promise<ListWikisOutput> {\n logger.debug('列出飞书知识库', {\n ...appContext,\n appId: input.appId ?? 'default',\n });\n\n const feishuService = container.resolve<FeishuService>(\n FeishuServiceToken as symbol,\n );\n\n // 创建带有正确租户 ID 的上下文\n const ctx = requestContextService.createRequestContext({\n operation: 'feishu.listWikis',\n tenantId: 'feishu-service',\n });\n\n try {\n const wikis = await feishuService.listWikis(ctx, input.appId);\n\n logger.info('获取知识库列表成功', {\n ...appContext,\n count: wikis.length,\n });\n\n return {\n wikis: wikis.map((w) => ({\n spaceId: w.spaceId,\n name: w.name,\n description: w.description,\n spaceType: w.spaceType,\n visibility: w.visibility,\n })),\n total: wikis.length,\n };\n } catch (error) {\n logger.error('获取知识库列表失败', {\n ...appContext,\n error: error instanceof Error ? error.message : String(error),\n });\n\n // 重新抛出错误而不是返回空结果\n throw error;\n }\n}\n\n/**\n * 响应格式化器.\n */\nfunction responseFormatter(result: ListWikisOutput): ContentBlock[] {\n const md = markdown();\n\n md.h2('📚 飞书知识库列表').keyValue('知识库数量', String(result.total));\n\n if (result.wikis.length === 0) {\n md.blankLine().paragraph('没有可访问的知识库。');\n } else {\n md.blankLine();\n\n for (const wiki of result.wikis) {\n md.text(`📖 **${wiki.name}**`).text(` 空间 ID: \\`${wiki.spaceId}\\``);\n\n if (wiki.description) {\n md.text(` 描述: ${wiki.description}`);\n }\n\n if (wiki.visibility) {\n md.text(` 可见性: ${wiki.visibility}`);\n }\n\n md.blankLine();\n }\n }\n\n md.blockquote(\n '使用知识库空间 ID 作为 targetId,并设置 targetType 为 wiki,可以将文档上传到知识库。',\n );\n\n return [\n {\n type: 'text',\n text: md.build(),\n },\n ];\n}\n\n/**\n * 飞书知识库列表工具定义.\n */\nexport const feishuListWikisTool: ToolDefinition<\n typeof InputSchema,\n typeof OutputSchema\n> = {\n name: TOOL_NAME,\n title: TOOL_TITLE,\n description: TOOL_DESCRIPTION,\n inputSchema: InputSchema,\n outputSchema: OutputSchema,\n annotations: TOOL_ANNOTATIONS,\n logic: withToolAuth(['tool:feishu:read'], listWikisLogic),\n responseFormatter,\n};\n","/**\n * @fileoverview 飞书知识库节点列表工具定义.\n * @module src/mcp-server/tools/definitions/feishu-list-wiki-nodes.tool\n */\n\nimport type { ContentBlock } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\nimport { container } from 'tsyringe';\n\nimport type {\n SdkContext,\n ToolAnnotations,\n ToolDefinition,\n} from '@/mcp-server/tools/utils/index.js';\nimport { withToolAuth } from '@/mcp-server/transports/auth/lib/withAuth.js';\nimport { FeishuServiceToken } from '@/container/tokens.js';\nimport type { FeishuService } from '@/services/feishu/index.js';\nimport {\n markdown,\n type RequestContext,\n logger,\n requestContextService,\n} from '@/utils/index.js';\n\n// ============================================================================\n// 元数据\n// ============================================================================\n\nconst TOOL_NAME = 'feishu_list_wiki_nodes';\nconst TOOL_TITLE = '列出飞书知识库节点';\nconst TOOL_DESCRIPTION = `\n列出指定飞书知识库空间中的节点(文档和文件夹)。\n\n**功能:**\n- 列出知识库根目录下的所有节点\n- 支持列出指定父节点下的子节点\n- 返回节点的详细信息(类型、标题、token等)\n\n**使用场景:**\n- 浏览知识库结构\n- 查找特定文档或文件夹\n- 获取节点 token 用于后续操作\n\n**注意事项:**\n- 需要先完成飞书 OAuth 授权\n- 需要有知识库的访问权限\n- 每次最多返回 50 个节点\n`.trim();\n\nconst TOOL_ANNOTATIONS: ToolAnnotations = {\n readOnlyHint: true,\n idempotentHint: true,\n};\n\n// ============================================================================\n// 输入/输出模式\n// ============================================================================\n\nconst InputSchema = z\n .object({\n wikiId: z\n .string()\n .min(1)\n .describe('知识库空间 ID,可以通过 feishu_list_wikis 工具获取'),\n parentNodeToken: z\n .string()\n .optional()\n .describe('父节点 token,不提供则列出根目录下的节点'),\n appId: z\n .string()\n .optional()\n .describe('飞书应用 ID,不提供则使用默认应用'),\n })\n .describe('列出飞书知识库节点的参数。');\n\nconst OutputSchema = z\n .object({\n nodes: z\n .array(\n z.object({\n spaceId: z.string().describe('空间 ID'),\n nodeToken: z.string().describe('节点 token'),\n objToken: z.string().describe('对象 token'),\n objType: z.string().describe('对象类型(docx, sheet等)'),\n parentNodeToken: z.string().optional().describe('父节点 token'),\n title: z.string().describe('节点标题'),\n hasChild: z.boolean().describe('是否有子节点'),\n }),\n )\n .describe('节点列表'),\n count: z.number().describe('节点数量'),\n })\n .describe('飞书知识库节点列表结果。');\n\ntype ListWikiNodesInput = z.infer<typeof InputSchema>;\ntype ListWikiNodesOutput = z.infer<typeof OutputSchema>;\n\n// ============================================================================\n// 业务逻辑\n// ============================================================================\n\nasync function listWikiNodesLogic(\n input: ListWikiNodesInput,\n appContext: RequestContext,\n _sdkContext: SdkContext,\n): Promise<ListWikiNodesOutput> {\n logger.debug('列出飞书知识库节点', {\n ...appContext,\n wikiId: input.wikiId,\n parentNodeToken: input.parentNodeToken,\n appId: input.appId ?? 'default',\n });\n\n const feishuService = container.resolve<FeishuService>(\n FeishuServiceToken as symbol,\n );\n\n // 创建带有正确租户 ID 的上下文\n const ctx = requestContextService.createRequestContext({\n operation: 'feishu.listWikiNodes',\n tenantId: 'feishu-service',\n });\n\n const nodes = await feishuService.getWikiNodes(\n ctx,\n input.wikiId,\n input.parentNodeToken,\n input.appId,\n );\n\n logger.info('获取知识库节点列表成功', {\n ...appContext,\n count: nodes.length,\n });\n\n return {\n nodes: nodes.map((node) => ({\n spaceId: node.spaceId,\n nodeToken: node.nodeToken,\n objToken: node.objToken,\n objType: node.objType,\n parentNodeToken: node.parentNodeToken,\n title: node.title,\n hasChild: node.hasChild,\n })),\n count: nodes.length,\n };\n}\n\n// ============================================================================\n// 响应格式化器\n// ============================================================================\n\nfunction responseFormatter(result: ListWikiNodesOutput): ContentBlock[] {\n const md = markdown();\n\n md.h2('📚 飞书知识库节点列表').keyValue('节点数量', String(result.count));\n\n if (result.nodes.length === 0) {\n md.blankLine().paragraph('该位置暂无节点。');\n } else {\n md.blankLine();\n\n for (const node of result.nodes) {\n const icon = node.hasChild ? '📁' : '📄';\n const typeLabel = node.objType === 'docx' ? '文档' : node.objType;\n\n md.h3(`${icon} ${node.title}`)\n .keyValue('类型', typeLabel)\n .keyValue('节点 Token', `\\`${node.nodeToken}\\``)\n .keyValue('对象 Token', `\\`${node.objToken}\\``);\n\n if (node.parentNodeToken) {\n md.keyValue('父节点', `\\`${node.parentNodeToken}\\``);\n }\n\n if (node.hasChild) {\n md.paragraph('💡 提示: 使用此节点 token 作为 parentNodeToken 可以查看子节点');\n }\n\n md.blankLine();\n }\n\n md.paragraph('使用节点 token 可以进行后续操作,如上传文档到指定位置。');\n }\n\n return [\n {\n type: 'text',\n text: md.build(),\n },\n ];\n}\n\n// ============================================================================\n// 工具定义导出\n// ============================================================================\n\nexport const feishuListWikiNodesTool: ToolDefinition<\n typeof InputSchema,\n typeof OutputSchema\n> = {\n name: TOOL_NAME,\n title: TOOL_TITLE,\n description: TOOL_DESCRIPTION,\n inputSchema: InputSchema,\n outputSchema: OutputSchema,\n logic: withToolAuth(['tool:feishu:read'], listWikiNodesLogic),\n annotations: TOOL_ANNOTATIONS,\n responseFormatter,\n};\n","/**\n * @fileoverview 飞书用户信息获取工具.\n * 获取当前授权用户的飞书账号信息.\n * @module src/mcp-server/tools/definitions/feishu-get-user-info.tool\n */\n\nimport type { ContentBlock } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\nimport { container } from 'tsyringe';\n\nimport type {\n SdkContext,\n ToolAnnotations,\n ToolDefinition,\n} from '@/mcp-server/tools/utils/index.js';\nimport { withToolAuth } from '@/mcp-server/transports/auth/lib/withAuth.js';\nimport { StorageService } from '@/container/tokens.js';\n\nimport type { StoredFeishuAuth } from '@/services/feishu/types.js';\nimport type { StorageService as IStorageService } from '@/storage/core/StorageService.js';\nimport { McpError, JsonRpcErrorCode } from '@/types-global/errors.js';\nimport {\n markdown,\n type RequestContext,\n logger,\n requestContextService,\n} from '@/utils/index.js';\n\n/**\n * 工具名称.\n */\nconst TOOL_NAME = 'feishu_get_user_info';\n\n/**\n * 工具标题.\n */\nconst TOOL_TITLE = '获取飞书用户信息';\n\n/**\n * 工具描述.\n */\nconst TOOL_DESCRIPTION =\n '获取当前授权用户的飞书账号信息,包括用户 ID、名称、邮箱和头像。需要先完成 OAuth 认证。';\n\n/**\n * 工具注解.\n */\nconst TOOL_ANNOTATIONS: ToolAnnotations = {\n readOnlyHint: true,\n idempotentHint: true,\n openWorldHint: true,\n};\n\n/**\n * 输入 Schema.\n */\nconst InputSchema = z\n .object({\n appId: z\n .string()\n .optional()\n .describe('飞书应用 ID。如果不提供,将使用默认配置的应用。'),\n })\n .describe('获取飞书用户信息的参数。');\n\n/**\n * 输出 Schema.\n */\nconst OutputSchema = z\n .object({\n userId: z.string().describe('飞书用户 ID。'),\n name: z.string().describe('用户名称。'),\n email: z.string().optional().describe('用户邮箱。'),\n avatarUrl: z.string().optional().describe('用户头像 URL。'),\n })\n .describe('飞书用户信息。');\n\ntype GetUserInfoInput = z.infer<typeof InputSchema>;\ntype GetUserInfoOutput = z.infer<typeof OutputSchema>;\n\n/**\n * 工具逻辑.\n */\nasync function getUserInfoLogic(\n input: GetUserInfoInput,\n appContext: RequestContext,\n _sdkContext: SdkContext,\n): Promise<GetUserInfoOutput> {\n logger.debug('获取飞书用户信息', {\n ...appContext,\n appId: input.appId ?? 'default',\n });\n\n // 直接从存储中获取用户信息,避免通过 FeishuService\n const storage = container.resolve<IStorageService>(StorageService);\n const ctx = requestContextService.createRequestContext({\n operation: 'feishu.getUserInfo',\n tenantId: 'feishu-service',\n });\n\n const appId = input.appId || 'cli_a9e211f948381bdf';\n const auth = await storage.get<StoredFeishuAuth>(`feishu/auth/${appId}`, ctx);\n\n if (!auth) {\n throw new McpError(JsonRpcErrorCode.InvalidParams, `应用 ${appId} 未认证`);\n }\n\n if (!auth.userInfo) {\n throw new McpError(JsonRpcErrorCode.InvalidParams, '用户信息不存在');\n }\n\n logger.info('获取用户信息成功', {\n ...appContext,\n userName: auth.userInfo.name,\n });\n\n return {\n userId: auth.userInfo.userId,\n name: auth.userInfo.name,\n email: auth.userInfo.email,\n avatarUrl: auth.userInfo.avatarUrl,\n };\n}\n\n/**\n * 响应格式化器.\n */\nfunction responseFormatter(result: GetUserInfoOutput): ContentBlock[] {\n const md = markdown();\n\n md.h2('👤 飞书用户信息')\n .keyValue('用户名', result.name)\n .keyValue('用户 ID', result.userId);\n\n if (result.email) {\n md.keyValue('邮箱', result.email);\n }\n\n if (result.avatarUrl) {\n md.blankLine().paragraph(`头像: ![头像](${result.avatarUrl})`);\n }\n\n md.blankLine().blockquote('已成功获取当前授权用户的信息。');\n\n return [\n {\n type: 'text',\n text: md.build(),\n },\n ];\n}\n\n/**\n * 飞书用户信息工具定义.\n */\nexport const feishuGetUserInfoTool: ToolDefinition<\n typeof InputSchema,\n typeof OutputSchema\n> = {\n name: TOOL_NAME,\n title: TOOL_TITLE,\n description: TOOL_DESCRIPTION,\n inputSchema: InputSchema,\n outputSchema: OutputSchema,\n annotations: TOOL_ANNOTATIONS,\n logic: withToolAuth(['tool:feishu:read'], getUserInfoLogic),\n responseFormatter,\n};\n","/**\n * @fileoverview 飞书默认应用设置工具.\n * 设置默认使用的飞书应用.\n * @module src/mcp-server/tools/definitions/feishu-set-default-app.tool\n */\n\nimport type { ContentBlock } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\nimport { container } from 'tsyringe';\n\nimport type {\n SdkContext,\n ToolAnnotations,\n ToolDefinition,\n} from '@/mcp-server/tools/utils/index.js';\nimport { withToolAuth } from '@/mcp-server/transports/auth/lib/withAuth.js';\nimport { StorageService } from '@/container/tokens.js';\nimport type { StorageService as IStorageService } from '@/storage/core/StorageService.js';\nimport type { StoredFeishuAuth } from '@/services/feishu/types.js';\nimport {\n markdown,\n type RequestContext,\n logger,\n requestContextService,\n} from '@/utils/index.js';\nimport { McpError, JsonRpcErrorCode } from '@/types-global/errors.js';\n\n/**\n * 工具名称.\n */\nconst TOOL_NAME = 'feishu_set_default_app';\n\n/**\n * 工具标题.\n */\nconst TOOL_TITLE = '设置默认飞书应用';\n\n/**\n * 工具描述.\n */\nconst TOOL_DESCRIPTION =\n '设置默认使用的飞书应用。设置后,其他飞书工具在不指定 appId 时将使用此应用。应用必须已完成 OAuth 认证。';\n\n/**\n * 工具注解.\n */\nconst TOOL_ANNOTATIONS: ToolAnnotations = {\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n};\n\n/**\n * 输入 Schema.\n */\nconst InputSchema = z\n .object({\n appId: z\n .string()\n .min(1, '应用 ID 不能为空')\n .describe('要设置为默认的飞书应用 ID。该应用必须已完成 OAuth 认证。'),\n })\n .describe('设置默认飞书应用的参数。');\n\n/**\n * 输出 Schema.\n */\nconst OutputSchema = z\n .object({\n success: z.boolean().describe('设置是否成功。'),\n appId: z.string().describe('设置的应用 ID。'),\n userName: z.string().optional().describe('应用关联的用户名。'),\n message: z.string().describe('操作结果消息。'),\n })\n .describe('设置默认应用结果。');\n\ntype SetDefaultAppInput = z.infer<typeof InputSchema>;\ntype SetDefaultAppOutput = z.infer<typeof OutputSchema>;\n\n/**\n * 工具逻辑.\n */\nasync function setDefaultAppLogic(\n input: SetDefaultAppInput,\n appContext: RequestContext,\n _sdkContext: SdkContext,\n): Promise<SetDefaultAppOutput> {\n logger.debug('设置默认飞书应用', {\n ...appContext,\n appId: input.appId,\n });\n\n const storage = container.resolve<IStorageService>(StorageService);\n const ctx = requestContextService.createRequestContext({\n operation: 'feishu.setDefaultApp',\n tenantId: 'feishu-service',\n });\n\n // 检查应用是否已认证\n const auth = await storage.get<StoredFeishuAuth>(\n `feishu/auth/${input.appId}`,\n ctx,\n );\n\n if (!auth) {\n throw new McpError(\n JsonRpcErrorCode.InvalidParams,\n `应用 ${input.appId} 未认证。请先使用 feishu_auth_url 和 feishu_auth_callback 完成 OAuth 认证。`,\n );\n }\n\n // 设置默认应用\n await storage.set('feishu/config/default_app', input.appId, ctx);\n\n logger.info('默认飞书应用设置成功', {\n ...appContext,\n appId: input.appId,\n userName: auth.userInfo?.name,\n });\n\n return {\n success: true,\n appId: input.appId,\n userName: auth.userInfo?.name,\n message: `已将 ${input.appId} 设置为默认应用`,\n };\n}\n\n/**\n * 响应格式化器.\n */\nfunction responseFormatter(result: SetDefaultAppOutput): ContentBlock[] {\n const md = markdown();\n\n if (result.success) {\n md.h2('✅ 默认应用设置成功').keyValue('应用 ID', result.appId);\n\n if (result.userName) {\n md.keyValue('关联用户', result.userName);\n }\n\n md.blankLine().blockquote(\n '现在其他飞书工具在不指定 appId 时将使用此应用。',\n );\n } else {\n md.h2('❌ 设置失败').paragraph(result.message);\n }\n\n return [\n {\n type: 'text',\n text: md.build(),\n },\n ];\n}\n\n/**\n * 飞书默认应用设置工具定义.\n */\nexport const feishuSetDefaultAppTool: ToolDefinition<\n typeof InputSchema,\n typeof OutputSchema\n> = {\n name: TOOL_NAME,\n title: TOOL_TITLE,\n description: TOOL_DESCRIPTION,\n inputSchema: InputSchema,\n outputSchema: OutputSchema,\n annotations: TOOL_ANNOTATIONS,\n logic: withToolAuth(['tool:feishu:write'], setDefaultAppLogic),\n responseFormatter,\n};\n","/**\n * @fileoverview 飞书应用列表工具.\n * 列出所有已配置的飞书应用.\n * @module src/mcp-server/tools/definitions/feishu-list-apps.tool\n */\n\nimport type { ContentBlock } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\nimport { container } from 'tsyringe';\n\nimport type {\n SdkContext,\n ToolAnnotations,\n ToolDefinition,\n} from '@/mcp-server/tools/utils/index.js';\nimport { withToolAuth } from '@/mcp-server/transports/auth/lib/withAuth.js';\nimport { StorageService } from '@/container/tokens.js';\nimport type { StorageService as IStorageService } from '@/storage/core/StorageService.js';\nimport type { StoredFeishuAuth } from '@/services/feishu/types.js';\nimport {\n markdown,\n type RequestContext,\n logger,\n requestContextService,\n} from '@/utils/index.js';\n\n/**\n * 工具名称.\n */\nconst TOOL_NAME = 'feishu_list_apps';\n\n/**\n * 工具标题.\n */\nconst TOOL_TITLE = '列出飞书应用';\n\n/**\n * 工具描述.\n */\nconst TOOL_DESCRIPTION =\n '列出所有已配置的飞书应用,包括认证状态、关联用户等信息。可以查看哪个应用是默认应用。';\n\n/**\n * 工具注解.\n */\nconst TOOL_ANNOTATIONS: ToolAnnotations = {\n readOnlyHint: true,\n idempotentHint: true,\n openWorldHint: false,\n};\n\n/**\n * 输入 Schema.\n */\nconst InputSchema = z.object({}).describe('列出飞书应用的参数(无需参数)。');\n\n/**\n * 输出 Schema.\n */\nconst OutputSchema = z\n .object({\n apps: z\n .array(\n z.object({\n appId: z.string().describe('应用 ID。'),\n isDefault: z.boolean().describe('是否为默认应用。'),\n hasToken: z.boolean().describe('是否有有效的访问令牌。'),\n userName: z.string().optional().describe('关联的用户名。'),\n userEmail: z.string().optional().describe('关联的用户邮箱。'),\n expiresAt: z.number().optional().describe('令牌过期时间戳。'),\n }),\n )\n .describe('应用列表。'),\n total: z.number().describe('应用总数。'),\n defaultAppId: z.string().optional().describe('默认应用 ID。'),\n })\n .describe('飞书应用列表结果。');\n\ntype ListAppsInput = z.infer<typeof InputSchema>;\ntype ListAppsOutput = z.infer<typeof OutputSchema>;\n\n/**\n * 工具逻辑.\n */\nasync function listAppsLogic(\n _input: ListAppsInput,\n appContext: RequestContext,\n _sdkContext: SdkContext,\n): Promise<ListAppsOutput> {\n logger.debug('列出飞书应用', appContext);\n\n try {\n const storage = container.resolve<IStorageService>(StorageService);\n const ctx = requestContextService.createRequestContext({\n operation: 'feishu.listApps',\n tenantId: 'feishu-service',\n });\n\n // 获取默认应用 ID\n const defaultAppId = await storage.get<string>(\n 'feishu/config/default_app',\n ctx,\n );\n\n // 获取所有已认证的应用\n // 注意:这里需要遍历存储来查找所有 feishu/auth/* 的键\n // 由于 StorageService 可能不支持 list 操作,我们使用一个已知应用列表\n // 在实际实现中,可以维护一个应用列表键\n const appListKey = 'feishu/config/app_list';\n const appIds = (await storage.get<string[]>(appListKey, ctx)) ?? [];\n\n // 如果有默认应用但不在列表中,添加它\n if (defaultAppId && !appIds.includes(defaultAppId)) {\n appIds.push(defaultAppId);\n }\n\n const apps: ListAppsOutput['apps'] = [];\n\n for (const appId of appIds) {\n const auth = await storage.get<StoredFeishuAuth>(\n `feishu/auth/${appId}`,\n ctx,\n );\n\n if (auth) {\n const now = Date.now();\n const hasValidToken = auth.expiresAt > now;\n\n apps.push({\n appId,\n isDefault: appId === defaultAppId,\n hasToken: hasValidToken,\n userName: auth.userInfo?.name,\n userEmail: auth.userInfo?.email,\n expiresAt: auth.expiresAt,\n });\n }\n }\n\n logger.info('获取应用列表成功', {\n ...appContext,\n count: apps.length,\n });\n\n const result: ListAppsOutput = {\n apps,\n total: apps.length,\n };\n\n if (defaultAppId) {\n result.defaultAppId = defaultAppId;\n }\n\n return result;\n } catch (error) {\n logger.error(\n '获取应用列表失败',\n error instanceof Error ? error : new Error(String(error)),\n appContext,\n );\n\n // 返回空列表而不是抛出错误\n return {\n apps: [],\n total: 0,\n };\n }\n}\n\n/**\n * 响应格式化器.\n */\nfunction responseFormatter(result: ListAppsOutput): ContentBlock[] {\n const md = markdown();\n\n md.h2('🔧 飞书应用列表').keyValue('应用数量', String(result.total));\n\n if (result.defaultAppId) {\n md.keyValue('默认应用', result.defaultAppId);\n }\n\n if (result.apps.length === 0) {\n md.blankLine()\n .paragraph('暂无已配置的应用。')\n .blankLine()\n .blockquote(\n '使用 feishu_auth_url 生成授权链接,完成 OAuth 认证后即可添加应用。',\n );\n } else {\n md.blankLine();\n\n for (const app of result.apps) {\n const statusIcon = app.hasToken ? '✅' : '⚠️';\n const defaultBadge = app.isDefault ? ' [默认]' : '';\n\n md.text(`${statusIcon} **${app.appId}**${defaultBadge}`);\n\n if (app.userName) {\n md.text(` 用户: ${app.userName}`);\n }\n\n if (app.userEmail) {\n md.text(` 邮箱: ${app.userEmail}`);\n }\n\n if (app.expiresAt) {\n const expiresDate = new Date(app.expiresAt);\n const isExpired = app.expiresAt < Date.now();\n const status = isExpired ? '已过期' : '有效';\n md.text(` 令牌状态: ${status} (${expiresDate.toLocaleString()})`);\n }\n\n md.blankLine();\n }\n\n md.blockquote(\n '使用 feishu_set_default_app 可以更改默认应用。令牌过期后需要重新认证。',\n );\n }\n\n return [\n {\n type: 'text',\n text: md.build(),\n },\n ];\n}\n\n/**\n * 飞书应用列表工具定义.\n */\nexport const feishuListAppsTool: ToolDefinition<\n typeof InputSchema,\n typeof OutputSchema\n> = {\n name: TOOL_NAME,\n title: TOOL_TITLE,\n description: TOOL_DESCRIPTION,\n inputSchema: InputSchema,\n outputSchema: OutputSchema,\n annotations: TOOL_ANNOTATIONS,\n logic: withToolAuth(['tool:feishu:read'], listAppsLogic),\n responseFormatter,\n};\n","/**\n * @fileoverview 飞书批量上传 Markdown 工具.\n * 批量将多个 Markdown 文档上传到飞书.\n * @module src/mcp-server/tools/definitions/feishu-batch-upload.tool\n */\n\nimport type { ContentBlock } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\nimport { container } from 'tsyringe';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport type {\n SdkContext,\n ToolAnnotations,\n ToolDefinition,\n} from '@/mcp-server/tools/utils/index.js';\nimport { withToolAuth } from '@/mcp-server/transports/auth/lib/withAuth.js';\nimport { FeishuServiceToken } from '@/container/tokens.js';\nimport type { FeishuService } from '@/services/feishu/index.js';\nimport {\n markdown,\n type RequestContext,\n logger,\n requestContextService,\n} from '@/utils/index.js';\n\n/**\n * 工具名称.\n */\nconst TOOL_NAME = 'feishu_batch_upload_markdown';\n\n/**\n * 工具标题.\n */\nconst TOOL_TITLE = '批量上传 Markdown 到飞书';\n\n/**\n * 工具描述.\n */\nconst TOOL_DESCRIPTION = `批量将多个 Markdown 文档上传到飞书云空间或知识库。\n\n功能特性:\n- 支持同时上传多个文档\n- 并发控制,避免触发 API 限制\n- 错误隔离,单个文档失败不影响其他文档\n- 返回详细的成功/失败列表\n\n使用场景:\n- 批量迁移文档到飞书\n- 同步多个笔记到飞书知识库\n\n**注意事项:**\n- 需要先完成飞书 OAuth 授权\n- 上传到云空间需要应用具有 drive:drive 权限\n- 上传到知识库需要应用具有 wiki:wiki 权限\n`.trim();\n\n/**\n * 工具注解.\n */\nconst TOOL_ANNOTATIONS: ToolAnnotations = {\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint: true,\n};\n\n/**\n * 单个文档 Schema.\n */\nconst DocumentSchema = z\n .object({\n filePath: z\n .string()\n .optional()\n .describe('Markdown 文件路径。与 content 二选一。'),\n content: z\n .string()\n .optional()\n .describe('Markdown 内容。与 filePath 二选一。'),\n title: z.string().optional().describe('文档标题。'),\n targetType: z\n .enum(['drive', 'wiki'])\n .default('wiki')\n .describe('目标类型。'),\n targetId: z.string().optional().describe('目标 ID。'),\n })\n .refine((data) => data.filePath || data.content, {\n message: '必须提供 filePath 或 content',\n });\n\n/**\n * 输入 Schema.\n */\nconst InputSchema = z\n .object({\n documents: z\n .array(DocumentSchema)\n .min(1, '至少需要一个文档')\n .max(50, '单次最多上传 50 个文档')\n .describe('要上传的文档列表。'),\n workingDirectory: z\n .string()\n .optional()\n .describe('工作目录,用于解析相对路径。'),\n appId: z\n .string()\n .optional()\n .describe('飞书应用 ID。如果不提供,将使用默认配置的应用。'),\n concurrency: z\n .number()\n .int()\n .min(1)\n .max(5)\n .default(3)\n .describe('并发数量,默认 3,最大 5。'),\n uploadImages: z.boolean().default(true).describe('是否上传本地图片。'),\n uploadAttachments: z.boolean().default(true).describe('是否上传本地附件。'),\n removeFrontMatter: z\n .boolean()\n .default(true)\n .describe('是否移除 Front Matter。'),\n })\n .describe('批量上传 Markdown 文档的参数。');\n\n/**\n * 单个结果 Schema.\n */\nconst ResultItemSchema = z.object({\n index: z.number().describe('文档索引。'),\n success: z.boolean().describe('是否成功。'),\n documentId: z.string().optional().describe('飞书文档 ID。'),\n url: z.string().optional().describe('飞书文档 URL。'),\n title: z.string().optional().describe('文档标题。'),\n error: z.string().optional().describe('错误信息。'),\n});\n\n/**\n * 输出 Schema.\n */\nconst OutputSchema = z\n .object({\n total: z.number().describe('总文档数。'),\n succeeded: z.number().describe('成功数量。'),\n failed: z.number().describe('失败数量。'),\n results: z.array(ResultItemSchema).describe('详细结果列表。'),\n })\n .describe('批量上传结果。');\n\ntype BatchUploadInput = z.infer<typeof InputSchema>;\ntype BatchUploadOutput = z.infer<typeof OutputSchema>;\ntype ResultItem = z.infer<typeof ResultItemSchema>;\n\n/**\n * 并发控制器.\n */\nasync function runWithConcurrency<T, R>(\n items: T[],\n concurrency: number,\n fn: (item: T, index: number) => Promise<R>,\n): Promise<R[]> {\n const results: R[] = [];\n const executing: Set<Promise<void>> = new Set();\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n if (!item) continue;\n\n const index = i;\n const promise = (async () => {\n const result = await fn(item, index);\n results[index] = result;\n })();\n\n const wrappedPromise = promise.finally(() => {\n executing.delete(wrappedPromise);\n });\n\n executing.add(wrappedPromise);\n\n if (executing.size >= concurrency) {\n await Promise.race(executing);\n }\n }\n\n await Promise.all(executing);\n return results;\n}\n\n/**\n * 工具逻辑.\n */\nasync function batchUploadLogic(\n input: BatchUploadInput,\n appContext: RequestContext,\n _sdkContext: SdkContext,\n): Promise<BatchUploadOutput> {\n logger.debug('开始批量上传 Markdown 文档', {\n ...appContext,\n documentCount: input.documents.length,\n concurrency: input.concurrency,\n });\n\n const feishuService = container.resolve<FeishuService>(\n FeishuServiceToken as symbol,\n );\n\n // 创建带有正确租户ID的上下文\n const context = requestContextService.createRequestContext({\n operation: 'feishu.batchUploadMarkdown',\n tenantId: 'feishu-service',\n });\n\n const baseWorkingDirectory = input.workingDirectory || process.cwd();\n\n const uploadDocument = async (\n doc: (typeof input.documents)[0],\n index: number,\n ): Promise<ResultItem> => {\n try {\n // 获取文档内容\n let content: string;\n let documentTitle = doc.title;\n let workingDirectory = baseWorkingDirectory;\n\n if (doc.filePath) {\n const absolutePath = path.isAbsolute(doc.filePath)\n ? doc.filePath\n : path.resolve(baseWorkingDirectory, doc.filePath);\n\n if (!fs.existsSync(absolutePath)) {\n return {\n index,\n success: false,\n title: doc.title,\n error: `文件不存在: ${doc.filePath}`,\n };\n }\n\n content = fs.readFileSync(absolutePath, 'utf-8');\n workingDirectory = path.dirname(absolutePath);\n\n if (!documentTitle) {\n documentTitle = path.basename(\n absolutePath,\n path.extname(absolutePath),\n );\n }\n } else if (doc.content) {\n content = doc.content;\n } else {\n return {\n index,\n success: false,\n title: doc.title,\n error: '必须提供 filePath 或 content',\n };\n }\n\n const result = await feishuService.uploadMarkdown(\n {\n title: documentTitle || `Document ${index + 1}`,\n content,\n ...(doc.filePath ? { filePath: doc.filePath } : {}),\n workingDirectory,\n },\n {\n ...(input.appId ? { appId: input.appId } : {}),\n targetType: doc.targetType,\n ...(doc.targetId ? { targetId: doc.targetId } : {}),\n uploadImages: input.uploadImages,\n uploadAttachments: input.uploadAttachments,\n removeFrontMatter: input.removeFrontMatter,\n },\n );\n\n if (result.success) {\n return {\n index,\n success: true,\n documentId: result.documentId,\n url: result.url,\n title: result.title,\n };\n } else {\n return {\n index,\n success: false,\n title: documentTitle,\n error: result.error ?? '上传失败',\n };\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n return {\n index,\n success: false,\n title: doc.title,\n error: errorMessage,\n };\n }\n };\n\n // 使用并发控制执行上传\n const results = await runWithConcurrency(\n input.documents,\n input.concurrency,\n uploadDocument,\n );\n\n const succeeded = results.filter((r) => r.success).length;\n const failed = results.filter((r) => !r.success).length;\n\n logger.info('批量上传完成', {\n ...context,\n total: input.documents.length,\n succeeded,\n failed,\n });\n\n return {\n total: input.documents.length,\n succeeded,\n failed,\n results,\n };\n}\n\n/**\n * 响应格式化器.\n */\nfunction responseFormatter(result: BatchUploadOutput): ContentBlock[] {\n const md = markdown();\n\n const allSuccess = result.failed === 0;\n const allFailed = result.succeeded === 0;\n\n if (allSuccess) {\n md.h2('✅ 批量上传完成');\n } else if (allFailed) {\n md.h2('❌ 批量上传失败');\n } else {\n md.h2('⚠️ 批量上传部分完成');\n }\n\n md.keyValue('总数', String(result.total))\n .keyValue('成功', String(result.succeeded))\n .keyValue('失败', String(result.failed));\n\n // 成功的文档\n const successResults = result.results.filter((r) => r.success);\n if (successResults.length > 0) {\n md.blankLine().h3('✅ 成功上传的文档');\n\n for (const item of successResults) {\n md.text(`${item.index + 1}. **${item.title ?? '未知'}**`);\n if (item.url) {\n md.text(` [查看文档](${item.url})`);\n }\n }\n }\n\n // 失败的文档\n const failedResults = result.results.filter((r) => !r.success);\n if (failedResults.length > 0) {\n md.blankLine().h3('❌ 上传失败的文档');\n\n for (const item of failedResults) {\n md.text(`${item.index + 1}. **${item.title ?? '未知'}**`).text(\n ` 错误: ${item.error}`,\n );\n }\n }\n\n if (result.failed > 0) {\n md.blankLine().blockquote('部分文档上传失败,请检查错误信息后重试。');\n }\n\n return [\n {\n type: 'text',\n text: md.build(),\n },\n ];\n}\n\n/**\n * 飞书批量上传工具定义.\n */\nexport const feishuBatchUploadTool: ToolDefinition<\n typeof InputSchema,\n typeof OutputSchema\n> = {\n name: TOOL_NAME,\n title: TOOL_TITLE,\n description: TOOL_DESCRIPTION,\n inputSchema: InputSchema,\n outputSchema: OutputSchema,\n annotations: TOOL_ANNOTATIONS,\n logic: withToolAuth(['tool:feishu:write'], batchUploadLogic),\n responseFormatter,\n};\n","/**\n * @fileoverview 飞书文档读取工具.\n * 读取飞书云空间或知识库文档并转换为 Markdown 格式.\n * @module src/mcp-server/tools/definitions/feishu-read-document.tool\n */\n\nimport type { ContentBlock } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\nimport { container } from 'tsyringe';\n\nimport type {\n SdkContext,\n ToolAnnotations,\n ToolDefinition,\n} from '@/mcp-server/tools/utils/index.js';\nimport { withToolAuth } from '@/mcp-server/transports/auth/lib/withAuth.js';\nimport { FeishuServiceToken } from '@/container/tokens.js';\nimport type { FeishuService } from '@/services/feishu/index.js';\nimport {\n markdown,\n type RequestContext,\n logger,\n requestContextService,\n} from '@/utils/index.js';\nimport { McpError, JsonRpcErrorCode } from '@/types-global/errors.js';\n\n/**\n * 工具名称.\n */\nconst TOOL_NAME = 'feishu_read_document';\n\n/**\n * 工具标题.\n */\nconst TOOL_TITLE = '读取飞书文档';\n\n/**\n * 工具描述.\n */\nconst TOOL_DESCRIPTION = `读取飞书云空间或知识库文档,并转换为 Markdown 格式。\n\n支持的文档类型:\n- 云空间文档 (drive)\n- 知识库文档 (wiki)\n\n功能特性:\n- 自动转换飞书富文本为 Markdown\n- 支持下载文档中的图片和附件\n- 支持保存为本地 Markdown 文件\n- 自动生成 Front Matter 元数据\n\n**注意事项:**\n- 需要先完成飞书 OAuth 授权\n- 读取云空间文档需要应用具有 drive:drive 权限\n- 读取知识库文档需要应用具有 wiki:wiki 权限\n`.trim();\n\n/**\n * 工具注解.\n */\nconst TOOL_ANNOTATIONS: ToolAnnotations = {\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: true,\n};\n\n/**\n * 输入 Schema.\n */\nconst InputSchema = z\n .object({\n documentId: z\n .string()\n .min(1)\n .describe('文档 ID 或 token。云空间文档使用 document_id,知识库文档使用 obj_token。'),\n documentType: z\n .enum(['drive', 'wiki'])\n .describe('文档类型:drive(云空间)或 wiki(知识库)。'),\n wikiSpaceId: z\n .string()\n .optional()\n .describe('知识库空间 ID。仅当 documentType 为 wiki 时需要。'),\n downloadImages: z\n .boolean()\n .default(false)\n .describe('是否下载文档中的图片到本地。'),\n downloadAttachments: z\n .boolean()\n .default(false)\n .describe('是否下载文档中的附件到本地。'),\n outputPath: z\n .string()\n .optional()\n .describe('输出文件路径。如果提供,将保存为本地 Markdown 文件。'),\n assetsPath: z\n .string()\n .optional()\n .describe('资源保存路径。默认为 ./assets。'),\n appId: z\n .string()\n .optional()\n .describe('飞书应用 ID。如果不提供,将使用默认配置的应用。'),\n })\n .refine(\n (data) => {\n if (data.documentType === 'wiki' && !data.wikiSpaceId) {\n return false;\n }\n return true;\n },\n {\n message: '当 documentType 为 wiki 时,必须提供 wikiSpaceId',\n },\n )\n .describe('读取飞书文档的参数。');\n\n/**\n * 输出 Schema.\n */\nconst OutputSchema = z\n .object({\n success: z.boolean().describe('读取是否成功。'),\n documentId: z.string().optional().describe('文档 ID。'),\n title: z.string().optional().describe('文档标题。'),\n content: z.string().optional().describe('Markdown 内容。'),\n metadata: z\n .object({\n author: z.string().optional().describe('作者。'),\n createdAt: z.number().optional().describe('创建时间戳。'),\n updatedAt: z.number().optional().describe('更新时间戳。'),\n documentType: z.string().optional().describe('文档类型。'),\n path: z.string().optional().describe('文档路径。'),\n })\n .optional()\n .describe('文档元数据。'),\n downloadedImages: z.number().optional().describe('下载的图片数量。'),\n downloadedAttachments: z.number().optional().describe('下载的附件数量。'),\n outputFile: z.string().optional().describe('输出文件路径。'),\n error: z.string().optional().describe('错误信息。'),\n })\n .describe('文档读取结果。');\n\ntype ReadInput = z.infer<typeof InputSchema>;\ntype ReadOutput = z.infer<typeof OutputSchema>;\n\n/**\n * 工具逻辑.\n */\nasync function readLogic(\n input: ReadInput,\n appContext: RequestContext,\n _sdkContext: SdkContext,\n): Promise<ReadOutput> {\n logger.debug('开始读取飞书文档', {\n ...appContext,\n documentId: input.documentId,\n documentType: input.documentType,\n });\n\n // 创建带有正确租户ID的上下文\n const context = requestContextService.createRequestContext({\n operation: 'feishu.readDocument',\n tenantId: 'feishu-service',\n });\n\n // 验证参数\n if (input.documentType === 'wiki' && !input.wikiSpaceId) {\n throw new McpError(\n JsonRpcErrorCode.InvalidParams,\n '读取知识库文档时必须提供 wikiSpaceId',\n );\n }\n\n const feishuService = container.resolve<FeishuService>(\n FeishuServiceToken as symbol,\n );\n\n // 构建读取选项\n const options: {\n documentType: 'drive' | 'wiki';\n wikiSpaceId?: string;\n downloadImages?: boolean;\n downloadAttachments?: boolean;\n outputPath?: string;\n assetsPath?: string;\n outputFormat?: 'markdown' | 'json';\n appId?: string;\n } = {\n documentType: input.documentType,\n outputFormat: 'markdown',\n };\n\n if (input.wikiSpaceId) options.wikiSpaceId = input.wikiSpaceId;\n if (input.downloadImages !== undefined) options.downloadImages = input.downloadImages;\n if (input.downloadAttachments !== undefined) options.downloadAttachments = input.downloadAttachments;\n if (input.outputPath) options.outputPath = input.outputPath;\n if (input.assetsPath) options.assetsPath = input.assetsPath;\n if (input.appId) options.appId = input.appId;\n\n const result = await feishuService.readDocument(\n input.documentId,\n options,\n context,\n );\n\n if (result.success) {\n logger.info('飞书文档读取成功', {\n ...context,\n documentId: result.documentId,\n title: result.title,\n });\n } else {\n logger.warning('飞书文档读取失败', {\n ...context,\n error: result.error,\n });\n }\n\n return {\n success: result.success,\n documentId: result.documentId,\n title: result.title,\n content: result.content,\n metadata: result.metadata,\n downloadedImages: result.downloadedImages,\n downloadedAttachments: result.downloadedAttachments,\n outputFile: result.outputFile,\n error: result.error,\n };\n}\n\n/**\n * 响应格式化器.\n */\nfunction responseFormatter(result: ReadOutput): ContentBlock[] {\n const md = markdown();\n\n if (result.success) {\n md.h2('✅ 文档读取成功')\n .keyValue('文档标题', result.title ?? '未知')\n .keyValue('文档 ID', result.documentId ?? '未知');\n\n if (result.metadata) {\n md.blankLine().h3('📋 文档元数据');\n if (result.metadata.author) {\n md.keyValue('作者', result.metadata.author);\n }\n if (result.metadata.createdAt) {\n md.keyValue(\n '创建时间',\n new Date(result.metadata.createdAt).toLocaleString('zh-CN'),\n );\n }\n if (result.metadata.updatedAt) {\n md.keyValue(\n '更新时间',\n new Date(result.metadata.updatedAt).toLocaleString('zh-CN'),\n );\n }\n if (result.metadata.path) {\n md.keyValue('路径', result.metadata.path);\n }\n }\n\n if (result.downloadedImages || result.downloadedAttachments) {\n md.blankLine().h3('📦 下载的资源');\n if (result.downloadedImages) {\n md.text(`🖼️ 图片: ${result.downloadedImages} 个`);\n }\n if (result.downloadedAttachments) {\n md.text(`📄 附件: ${result.downloadedAttachments} 个`);\n }\n }\n\n if (result.outputFile) {\n md.blankLine()\n .keyValue('输出文件', result.outputFile)\n .blankLine()\n .blockquote('文档已保存到本地文件。');\n }\n\n if (result.content) {\n md.blankLine()\n .h3('📝 文档内容')\n .blankLine()\n .codeBlock(\n result.content.length > 1000\n ? result.content.substring(0, 1000) + '\\n\\n... (内容过长,已截断)'\n : result.content,\n 'markdown',\n );\n }\n } else {\n md.h2('❌ 文档读取失败').paragraph(result.error ?? '未知错误');\n\n md.blankLine().blockquote('请检查错误信息,确保已完成 OAuth 认证且有权限访问该文档。');\n }\n\n return [\n {\n type: 'text',\n text: md.build(),\n },\n ];\n}\n\n/**\n * 飞书文档读取工具定义.\n */\nexport const feishuReadDocumentTool: ToolDefinition<\n typeof InputSchema,\n typeof OutputSchema\n> = {\n name: TOOL_NAME,\n title: TOOL_TITLE,\n description: TOOL_DESCRIPTION,\n inputSchema: InputSchema,\n outputSchema: OutputSchema,\n annotations: TOOL_ANNOTATIONS,\n logic: withToolAuth(['tool:feishu:read'], readLogic),\n responseFormatter,\n};\n","/**\n * @fileoverview 飞书文档批量读取工具.\n * 批量读取多个飞书文档并转换为 Markdown 格式.\n * @module src/mcp-server/tools/definitions/feishu-batch-read-documents.tool\n */\n\nimport type { ContentBlock } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\nimport { container } from 'tsyringe';\n\nimport type {\n SdkContext,\n ToolAnnotations,\n ToolDefinition,\n} from '@/mcp-server/tools/utils/index.js';\nimport { withToolAuth } from '@/mcp-server/transports/auth/lib/withAuth.js';\nimport { FeishuServiceToken } from '@/container/tokens.js';\nimport type { FeishuService } from '@/services/feishu/index.js';\nimport {\n markdown,\n type RequestContext,\n logger,\n requestContextService,\n} from '@/utils/index.js';\n\n/**\n * 工具名称.\n */\nconst TOOL_NAME = 'feishu_batch_read_documents';\n\n/**\n * 工具标题.\n */\nconst TOOL_TITLE = '批量读取飞书文档';\n\n/**\n * 工具描述.\n */\nconst TOOL_DESCRIPTION = `批量读取多个飞书文档,并转换为 Markdown 格式。\n\n支持的文档类型:\n- 云空间文档 (drive)\n- 知识库文档 (wiki)\n- 混合类型(可以同时读取云空间和知识库文档)\n\n功能特性:\n- 并发读取多个文档(可配置并发数)\n- 自动转换飞书富文本为 Markdown\n- 支持批量下载图片和附件\n- 支持保存为本地 Markdown 文件\n- 错误隔离(单个文档失败不影响其他文档)\n- 详细的成功/失败统计\n\n**注意事项:**\n- 需要先完成飞书 OAuth 授权\n- 读取云空间文档需要应用具有 drive:drive 权限\n- 读取知识库文档需要应用具有 wiki:wiki 权限\n- 建议并发数不超过 5,避免触发 API 频率限制\n`.trim();\n\n/**\n * 工具注解.\n */\nconst TOOL_ANNOTATIONS: ToolAnnotations = {\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: true,\n};\n\n/**\n * 输入 Schema.\n */\nconst InputSchema = z\n .object({\n documents: z\n .array(\n z.object({\n documentId: z\n .string()\n .min(1)\n .describe('文档 ID 或 token。'),\n documentType: z\n .enum(['drive', 'wiki'])\n .describe('文档类型:drive(云空间)或 wiki(知识库)。'),\n wikiSpaceId: z\n .string()\n .optional()\n .describe('知识库空间 ID。仅当 documentType 为 wiki 时需要。'),\n }),\n )\n .min(1)\n .describe('要读取的文档列表。'),\n concurrency: z\n .number()\n .int()\n .min(1)\n .max(10)\n .default(3)\n .describe('并发读取数量。默认为 3,建议不超过 5。'),\n downloadImages: z\n .boolean()\n .default(false)\n .describe('是否下载文档中的图片到本地。'),\n downloadAttachments: z\n .boolean()\n .default(false)\n .describe('是否下载文档中的附件到本地。'),\n outputPath: z\n .string()\n .optional()\n .describe('输出目录路径。如果提供,将保存为本地 Markdown 文件。'),\n assetsPath: z\n .string()\n .optional()\n .describe('资源保存路径。默认为 ./assets。'),\n appId: z\n .string()\n .optional()\n .describe('飞书应用 ID。如果不提供,将使用默认配置的应用。'),\n })\n .describe('批量读取飞书文档的参数。');\n\n/**\n * 输出 Schema.\n */\nconst OutputSchema = z\n .object({\n total: z.number().describe('总文档数。'),\n succeeded: z.number().describe('成功读取的文档数。'),\n failed: z.number().describe('失败的文档数。'),\n results: z\n .array(\n z.object({\n documentId: z.string().describe('文档 ID。'),\n title: z.string().optional().describe('文档标题。'),\n success: z.boolean().describe('是否成功。'),\n outputFile: z.string().optional().describe('输出文件路径。'),\n error: z.string().optional().describe('错误信息。'),\n }),\n )\n .describe('详细结果列表。'),\n })\n .describe('批量读取结果。');\n\ntype BatchReadInput = z.infer<typeof InputSchema>;\ntype BatchReadOutput = z.infer<typeof OutputSchema>;\n\n/**\n * 工具逻辑.\n */\nasync function batchReadLogic(\n input: BatchReadInput,\n appContext: RequestContext,\n _sdkContext: SdkContext,\n): Promise<BatchReadOutput> {\n logger.debug('开始批量读取飞书文档', {\n ...appContext,\n documentCount: input.documents.length,\n concurrency: input.concurrency,\n });\n\n // 创建带有正确租户ID的上下文\n const context = requestContextService.createRequestContext({\n operation: 'feishu.batchReadDocuments',\n tenantId: 'feishu-service',\n });\n\n const feishuService = container.resolve<FeishuService>(\n FeishuServiceToken as symbol,\n );\n\n // 构建批量读取选项\n const options: {\n concurrency?: number;\n downloadImages?: boolean;\n downloadAttachments?: boolean;\n outputPath?: string;\n assetsPath?: string;\n appId?: string;\n } = {};\n\n if (input.concurrency !== undefined) options.concurrency = input.concurrency;\n if (input.downloadImages !== undefined) options.downloadImages = input.downloadImages;\n if (input.downloadAttachments !== undefined) options.downloadAttachments = input.downloadAttachments;\n if (input.outputPath) options.outputPath = input.outputPath;\n if (input.assetsPath) options.assetsPath = input.assetsPath;\n if (input.appId) options.appId = input.appId;\n\n // 构建文档列表,确保类型兼容\n const documents = input.documents.map((doc) => {\n const result: {\n documentId: string;\n documentType: 'drive' | 'wiki';\n wikiSpaceId?: string;\n } = {\n documentId: doc.documentId,\n documentType: doc.documentType,\n };\n if (doc.wikiSpaceId) result.wikiSpaceId = doc.wikiSpaceId;\n return result;\n });\n\n const result = await feishuService.batchReadDocuments(\n documents,\n options,\n context,\n );\n\n logger.info('批量读取完成', {\n ...context,\n total: result.total,\n succeeded: result.succeeded,\n failed: result.failed,\n });\n\n return result;\n}\n\n/**\n * 响应格式化器.\n */\nfunction responseFormatter(result: BatchReadOutput): ContentBlock[] {\n const md = markdown();\n\n md.h2('📊 批量读取结果')\n .keyValue('总文档数', result.total.toString())\n .keyValue('成功', `${result.succeeded} 个`)\n .keyValue('失败', `${result.failed} 个`)\n .keyValue(\n '成功率',\n `${((result.succeeded / result.total) * 100).toFixed(1)}%`,\n );\n\n if (result.succeeded > 0) {\n md.blankLine().h3('✅ 成功读取的文档');\n\n const successResults = result.results.filter((r) => r.success);\n for (const doc of successResults) {\n md.text(`- **${doc.title ?? doc.documentId}**`);\n if (doc.outputFile) {\n md.text(` - 输出文件: ${doc.outputFile}`);\n }\n }\n }\n\n if (result.failed > 0) {\n md.blankLine().h3('❌ 失败的文档');\n\n const failedResults = result.results.filter((r) => !r.success);\n for (const doc of failedResults) {\n md.text(`- **${doc.title ?? doc.documentId}**`);\n if (doc.error) {\n md.text(` - 错误: ${doc.error}`);\n }\n }\n }\n\n md.blankLine().blockquote(\n result.failed > 0\n ? '部分文档读取失败,请检查错误信息。'\n : '所有文档已成功读取。',\n );\n\n return [\n {\n type: 'text',\n text: md.build(),\n },\n ];\n}\n\n/**\n * 飞书文档批量读取工具定义.\n */\nexport const feishuBatchReadDocumentsTool: ToolDefinition<\n typeof InputSchema,\n typeof OutputSchema\n> = {\n name: TOOL_NAME,\n title: TOOL_TITLE,\n description: TOOL_DESCRIPTION,\n inputSchema: InputSchema,\n outputSchema: OutputSchema,\n annotations: TOOL_ANNOTATIONS,\n logic: withToolAuth(['tool:feishu:read'], batchReadLogic),\n responseFormatter,\n};\n","/**\n * @fileoverview 飞书知识库递归读取工具.\n * 递归读取知识库空间的所有文档并转换为 Markdown 格式.\n * @module src/mcp-server/tools/definitions/feishu-read-wiki-recursive.tool\n */\n\nimport type { ContentBlock } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\nimport { container } from 'tsyringe';\n\nimport type {\n SdkContext,\n ToolAnnotations,\n ToolDefinition,\n} from '@/mcp-server/tools/utils/index.js';\nimport { withToolAuth } from '@/mcp-server/transports/auth/lib/withAuth.js';\nimport { FeishuServiceToken } from '@/container/tokens.js';\nimport type { FeishuService } from '@/services/feishu/index.js';\nimport {\n markdown,\n type RequestContext,\n logger,\n requestContextService,\n} from '@/utils/index.js';\n\n/**\n * 工具名称.\n */\nconst TOOL_NAME = 'feishu_read_wiki_recursive';\n\n/**\n * 工具标题.\n */\nconst TOOL_TITLE = '递归读取知识库';\n\n/**\n * 工具描述.\n */\nconst TOOL_DESCRIPTION = `递归读取飞书知识库空间的所有文档,并转换为 Markdown 格式。\n\n功能特性:\n- 递归遍历知识库的所有节点(文档和文件夹)\n- 自动转换飞书富文本为 Markdown\n- 保持原有的目录结构\n- 支持深度限制(避免无限递归)\n- 支持批量下载图片和附件\n- 支持保存为本地 Markdown 文件\n- 错误隔离(单个文档失败不影响其他文档)\n- 详细的成功/失败统计\n\n**使用场景:**\n- 备份整个知识库\n- 迁移知识库内容\n- 批量导出文档\n\n**注意事项:**\n- 需要先完成飞书 OAuth 授权\n- 需要应用具有 wiki:wiki 权限\n- 大型知识库可能需要较长时间\n- 建议设置合理的深度限制\n`.trim();\n\n/**\n * 工具注解.\n */\nconst TOOL_ANNOTATIONS: ToolAnnotations = {\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: true,\n};\n\n/**\n * 输入 Schema.\n */\nconst InputSchema = z\n .object({\n wikiSpaceId: z\n .string()\n .min(1)\n .describe('知识库空间 ID。'),\n parentNodeToken: z\n .string()\n .optional()\n .describe('父节点 token。如果提供,将从该节点开始递归读取。不提供则从根节点开始。'),\n maxDepth: z\n .number()\n .int()\n .min(1)\n .max(20)\n .default(10)\n .describe('最大递归深度。默认为 10,建议不超过 20。'),\n downloadImages: z\n .boolean()\n .default(false)\n .describe('是否下载文档中的图片到本地。'),\n downloadAttachments: z\n .boolean()\n .default(false)\n .describe('是否下载文档中的附件到本地。'),\n outputPath: z\n .string()\n .optional()\n .describe('输出目录路径。如果提供,将保存为本地 Markdown 文件并保持目录结构。'),\n preserveStructure: z\n .boolean()\n .default(true)\n .describe('是否保持原有的目录结构。默认为 true。'),\n appId: z\n .string()\n .optional()\n .describe('飞书应用 ID。如果不提供,将使用默认配置的应用。'),\n })\n .describe('递归读取知识库的参数。');\n\n/**\n * 输出 Schema.\n */\nconst OutputSchema = z\n .object({\n total: z.number().describe('总节点数(包括文档和文件夹)。'),\n succeeded: z.number().describe('成功读取的节点数。'),\n failed: z.number().describe('失败的节点数。'),\n structure: z\n .array(\n z.object({\n nodeToken: z.string().describe('节点 token。'),\n title: z.string().describe('节点标题。'),\n type: z.string().describe('节点类型(doc/docx/folder)。'),\n path: z.string().describe('节点路径。'),\n success: z.boolean().describe('是否成功。'),\n error: z.string().optional().describe('错误信息。'),\n }),\n )\n .describe('目录结构和处理结果。'),\n })\n .describe('递归读取结果。');\n\ntype RecursiveReadInput = z.infer<typeof InputSchema>;\ntype RecursiveReadOutput = z.infer<typeof OutputSchema>;\n\n/**\n * 工具逻辑.\n */\nasync function recursiveReadLogic(\n input: RecursiveReadInput,\n appContext: RequestContext,\n _sdkContext: SdkContext,\n): Promise<RecursiveReadOutput> {\n logger.debug('开始递归读取知识库', {\n ...appContext,\n wikiSpaceId: input.wikiSpaceId,\n maxDepth: input.maxDepth,\n });\n\n // 创建带有正确租户ID的上下文\n const context = requestContextService.createRequestContext({\n operation: 'feishu.readWikiRecursive',\n tenantId: 'feishu-service',\n });\n\n const feishuService = container.resolve<FeishuService>(\n FeishuServiceToken as symbol,\n );\n\n // 构建递归读取选项\n const options: {\n parentNodeToken?: string;\n maxDepth?: number;\n downloadImages?: boolean;\n downloadAttachments?: boolean;\n outputPath?: string;\n preserveStructure?: boolean;\n appId?: string;\n } = {};\n\n if (input.parentNodeToken) options.parentNodeToken = input.parentNodeToken;\n if (input.maxDepth !== undefined) options.maxDepth = input.maxDepth;\n if (input.downloadImages !== undefined) options.downloadImages = input.downloadImages;\n if (input.downloadAttachments !== undefined) options.downloadAttachments = input.downloadAttachments;\n if (input.outputPath) options.outputPath = input.outputPath;\n if (input.preserveStructure !== undefined) options.preserveStructure = input.preserveStructure;\n if (input.appId) options.appId = input.appId;\n\n const result = await feishuService.readWikiRecursive(\n input.wikiSpaceId,\n options,\n context,\n );\n\n logger.info('递归读取完成', {\n ...context,\n total: result.total,\n succeeded: result.succeeded,\n failed: result.failed,\n });\n\n return result;\n}\n\n/**\n * 响应格式化器.\n */\nfunction responseFormatter(result: RecursiveReadOutput): ContentBlock[] {\n const md = markdown();\n\n md.h2('🌲 知识库递归读取结果')\n .keyValue('总节点数', result.total.toString())\n .keyValue('成功', `${result.succeeded} 个`)\n .keyValue('失败', `${result.failed} 个`)\n .keyValue(\n '成功率',\n `${((result.succeeded / result.total) * 100).toFixed(1)}%`,\n );\n\n // 统计文档和文件夹数量\n const documents = result.structure.filter(\n (n) => n.type === 'doc' || n.type === 'docx',\n );\n const folders = result.structure.filter((n) => n.type === 'folder');\n\n md.blankLine()\n .keyValue('文档数', documents.length.toString())\n .keyValue('文件夹数', folders.length.toString());\n\n if (result.structure.length > 0) {\n md.blankLine().h3('📁 目录结构');\n\n // 构建树形结构显示\n const maxDisplay = 50; // 最多显示50个节点\n const displayNodes = result.structure.slice(0, maxDisplay);\n\n for (const node of displayNodes) {\n const indent = ' '.repeat((node.path.match(/\\//g) || []).length);\n const icon = node.type === 'folder' ? '📁' : '📄';\n const status = node.success ? '✅' : '❌';\n\n md.text(`${indent}${icon} ${status} ${node.title}`);\n\n if (!node.success && node.error) {\n md.text(`${indent} ⚠️ ${node.error}`);\n }\n }\n\n if (result.structure.length > maxDisplay) {\n md.blankLine().text(\n `... 还有 ${result.structure.length - maxDisplay} 个节点未显示`,\n );\n }\n }\n\n if (result.failed > 0) {\n md.blankLine().h3('❌ 失败的节点');\n\n const failedNodes = result.structure.filter((n) => !n.success);\n for (const node of failedNodes.slice(0, 10)) {\n md.text(`- **${node.title}** (${node.type})`);\n if (node.error) {\n md.text(` - 错误: ${node.error}`);\n }\n }\n\n if (failedNodes.length > 10) {\n md.blankLine().text(`... 还有 ${failedNodes.length - 10} 个失败节点`);\n }\n }\n\n md.blankLine().blockquote(\n result.failed > 0\n ? '部分节点处理失败,请检查错误信息。'\n : '知识库已成功递归读取。',\n );\n\n return [\n {\n type: 'text',\n text: md.build(),\n },\n ];\n}\n\n/**\n * 飞书知识库递归读取工具定义.\n */\nexport const feishuReadWikiRecursiveTool: ToolDefinition<\n typeof InputSchema,\n typeof OutputSchema\n> = {\n name: TOOL_NAME,\n title: TOOL_TITLE,\n description: TOOL_DESCRIPTION,\n inputSchema: InputSchema,\n outputSchema: OutputSchema,\n annotations: TOOL_ANNOTATIONS,\n logic: withToolAuth(['tool:feishu:read'], recursiveReadLogic),\n responseFormatter,\n};\n","/**\n * @fileoverview Barrel file for all tool definitions.\n * This file re-exports all tool definitions for easy import and registration.\n * It also exports an array of all definitions for automated registration.\n * @module src/mcp-server/tools/definitions\n */\n\nimport { feishuAuthUrlTool } from './feishu-auth-url.tool.js';\nimport { feishuAuthCallbackTool } from './feishu-auth-callback.tool.js';\nimport { feishuUploadMarkdownTool } from './feishu-upload-markdown.tool.js';\nimport { feishuUpdateDocumentTool } from './feishu-update-document.tool.js';\nimport { feishuListFoldersTool } from './feishu-list-folders.tool.js';\nimport { feishuListWikisTool } from './feishu-list-wikis.tool.js';\nimport { feishuListWikiNodesTool } from './feishu-list-wiki-nodes.tool.js';\nimport { feishuGetUserInfoTool } from './feishu-get-user-info.tool.js';\nimport { feishuSetDefaultAppTool } from './feishu-set-default-app.tool.js';\nimport { feishuListAppsTool } from './feishu-list-apps.tool.js';\nimport { feishuBatchUploadTool } from './feishu-batch-upload.tool.js';\nimport { feishuReadDocumentTool } from './feishu-read-document.tool.js';\nimport { feishuBatchReadDocumentsTool } from './feishu-batch-read-documents.tool.js';\nimport { feishuReadWikiRecursiveTool } from './feishu-read-wiki-recursive.tool.js';\n\n/**\n * An array containing all tool definitions for easy iteration.\n * Add your custom tools here after creating them in this directory.\n */\nexport const allToolDefinitions = [\n // 飞书 OAuth 认证工具\n feishuAuthUrlTool, // 飞书 OAuth:生成授权链接\n feishuAuthCallbackTool, // 飞书 OAuth:处理授权回调\n // 飞书文档操作工具\n feishuUploadMarkdownTool, // 飞书文档:上传 Markdown\n feishuUpdateDocumentTool, // 飞书文档:更新文档\n feishuBatchUploadTool, // 飞书文档:批量上传\n feishuReadDocumentTool, // 飞书文档:读取文档\n feishuBatchReadDocumentsTool, // 飞书文档:批量读取\n feishuReadWikiRecursiveTool, // 飞书文档:递归读取知识库\n // 飞书管理工具\n feishuListFoldersTool, // 飞书管理:列出文件夹\n feishuListWikisTool, // 飞书管理:列出知识库\n feishuListWikiNodesTool, // 飞书管理:列出知识库节点\n feishuGetUserInfoTool, // 飞书管理:获取用户信息\n feishuSetDefaultAppTool, // 飞书管理:设置默认应用\n feishuListAppsTool, // 飞书管理:列出应用\n];\n","/**\n * @fileoverview A factory for creating standardized MCP tool handlers.\n * This module abstracts away the boilerplate of error handling, context creation,\n * performance measurement, and response formatting for tool handlers.\n * @module mcp-server/tools/utils/toolHandlerFactory\n */\nimport type { AnySchema } from '@modelcontextprotocol/sdk/server/zod-compat.js';\nimport type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport type {\n CallToolResult,\n ContentBlock,\n ServerNotification,\n ServerRequest,\n} from '@modelcontextprotocol/sdk/types.js';\nimport type { z } from 'zod';\n\nimport type { SdkContext } from './toolDefinition.js';\nimport { McpError } from '@/types-global/errors.js';\nimport {\n ErrorHandler,\n type RequestContext,\n measureToolExecution,\n requestContextService,\n} from '@/utils/index.js';\n\n// Define a type for a context that may have elicitation capabilities.\ntype ElicitableContext = RequestContext & {\n elicitInput?: (args: {\n message: string;\n schema: unknown;\n }) => Promise<unknown>;\n};\n\n// Default formatter for successful responses\nconst defaultResponseFormatter = (result: unknown): ContentBlock[] => [\n { type: 'text', text: JSON.stringify(result, null, 2) },\n];\n\n/**\n * Options for creating an MCP tool handler via the factory.\n * Uses `AnySchema` from the SDK for Zod 3/4 compatibility.\n */\nexport type ToolHandlerFactoryOptions<\n TInputSchema extends AnySchema,\n TOutput extends Record<string, unknown>,\n> = {\n toolName: string;\n /** The input schema, captured for type inference (not used at runtime). */\n inputSchema: TInputSchema;\n logic: (\n input: z.infer<TInputSchema>,\n appContext: RequestContext,\n sdkContext: SdkContext,\n ) => Promise<TOutput>;\n responseFormatter?: (result: TOutput) => ContentBlock[];\n};\n\n/**\n * Creates a standardized MCP tool handler.\n * This factory encapsulates context creation, performance measurement,\n * error handling, and response formatting. It separates the app's internal\n * RequestContext from the SDK's `callContext` (which we type as `SdkContext`).\n *\n * @param options - Factory options including toolName, inputSchema, logic, and optional responseFormatter\n * @returns A handler function compatible with the MCP SDK's ToolCallback type\n */\nexport function createMcpToolHandler<\n TInputSchema extends AnySchema,\n TOutput extends Record<string, unknown>,\n>({\n toolName,\n inputSchema: _inputSchema, // Captured for type inference, not used at runtime\n logic,\n responseFormatter = defaultResponseFormatter,\n}: ToolHandlerFactoryOptions<TInputSchema, TOutput>): (\n input: z.infer<TInputSchema>,\n extra: RequestHandlerExtra<ServerRequest, ServerNotification>,\n) => Promise<CallToolResult> {\n return async (\n input: z.infer<TInputSchema>,\n callContext: Record<string, unknown>,\n ): Promise<CallToolResult> => {\n // The `callContext` from the SDK is cast to our specific SdkContext type.\n const sdkContext = callContext as SdkContext;\n\n const sessionId =\n typeof sdkContext?.sessionId === 'string'\n ? sdkContext.sessionId\n : undefined;\n\n // Create the application's internal logger/tracing context.\n const appContext: ElicitableContext =\n requestContextService.createRequestContext({\n parentContext: sdkContext,\n operation: 'HandleToolRequest',\n additionalContext: { toolName, sessionId, input },\n });\n\n // If the SDK context supports elicitation, add it to our app context.\n // This makes it available to the tool's logic function.\n if (\n 'elicitInput' in sdkContext &&\n typeof sdkContext.elicitInput === 'function'\n ) {\n appContext.elicitInput = sdkContext.elicitInput as (args: {\n message: string;\n schema: unknown;\n }) => Promise<unknown>;\n }\n\n try {\n const result = await measureToolExecution(\n // Pass both the app's internal context and the full SDK context to the logic.\n () => logic(input, appContext, sdkContext),\n { ...appContext, toolName },\n input,\n );\n\n return {\n structuredContent: result,\n content: responseFormatter(result),\n };\n } catch (error: unknown) {\n const mcpError = ErrorHandler.handleError(error, {\n operation: `tool:${toolName}`,\n context: appContext,\n input,\n }) as McpError;\n\n return {\n isError: true,\n content: [{ type: 'text', text: `Error: ${mcpError.message}` }],\n };\n }\n };\n}\n","/**\n * @fileoverview A TaskStore implementation backed by the template's StorageService.\n * This provides persistent task storage that survives server restarts, using\n * whatever storage backend is configured (filesystem, Supabase, SurrealDB, etc.).\n *\n * Use this instead of InMemoryTaskStore when you need task durability.\n *\n * @experimental These APIs are experimental and may change without notice.\n * @module src/mcp-server/tasks/core/storageBackedTaskStore\n */\nimport type {\n Request,\n RequestId,\n Result,\n} from '@modelcontextprotocol/sdk/types.js';\n\nimport type { StorageService } from '@/storage/core/StorageService.js';\nimport { idGenerator, type RequestContext } from '@/utils/index.js';\nimport type { Task, TaskStore, CreateTaskOptions } from './taskTypes.js';\nimport { isTerminal } from './taskTypes.js';\n\n/**\n * Internal structure for storing task data in the storage backend.\n */\ninterface StoredTask {\n task: Task;\n request: Request;\n requestId: RequestId;\n result?: Result;\n}\n\n/**\n * Configuration options for StorageBackedTaskStore.\n */\nexport interface StorageBackedTaskStoreOptions {\n /**\n * The tenant ID to use for storage operations.\n * Tasks are stored under this tenant for isolation.\n * @default 'system-tasks'\n */\n tenantId?: string;\n\n /**\n * Prefix for storage keys.\n * @default 'tasks'\n */\n keyPrefix?: string;\n\n /**\n * Default TTL in milliseconds if not specified in task creation.\n * Set to null for unlimited lifetime.\n * @default null\n */\n defaultTtl?: number | null;\n\n /**\n * Page size for listTasks pagination.\n * @default 10\n */\n pageSize?: number;\n}\n\n/**\n * A TaskStore implementation backed by StorageService for persistent task storage.\n *\n * Unlike InMemoryTaskStore, this implementation:\n * - Persists tasks across server restarts\n * - Works with any configured storage backend (filesystem, Supabase, SurrealDB, etc.)\n * - Supports TTL via storage provider options\n *\n * @example\n * ```typescript\n * const taskStore = new StorageBackedTaskStore(storageService, {\n * tenantId: 'my-app-tasks',\n * defaultTtl: 3600000, // 1 hour\n * });\n * ```\n *\n * @experimental\n */\nexport class StorageBackedTaskStore implements TaskStore {\n private readonly tenantId: string;\n private readonly keyPrefix: string;\n private readonly defaultTtl: number | null;\n private readonly pageSize: number;\n\n constructor(\n private readonly storage: StorageService,\n options: StorageBackedTaskStoreOptions = {},\n ) {\n this.tenantId = options.tenantId ?? 'system-tasks';\n this.keyPrefix = options.keyPrefix ?? 'tasks';\n this.defaultTtl = options.defaultTtl ?? null;\n this.pageSize = options.pageSize ?? 10;\n }\n\n /**\n * Creates a request context for storage operations.\n */\n private createContext(operation: string): RequestContext {\n return {\n operation: `StorageBackedTaskStore.${operation}`,\n requestId: idGenerator.generate('req'),\n timestamp: new Date().toISOString(),\n tenantId: this.tenantId,\n };\n }\n\n /**\n * Generates the storage key for a task.\n */\n private getTaskKey(taskId: string): string {\n return `${this.keyPrefix}/${taskId}`;\n }\n\n /**\n * Generates a unique task ID.\n * Uses the template's idGenerator for consistent ID format.\n */\n private generateTaskId(): string {\n // Generate a longer ID for global uniqueness (16 chars)\n return idGenerator.generate('task', { length: 16 });\n }\n\n async createTask(\n taskParams: CreateTaskOptions,\n requestId: RequestId,\n request: Request,\n _sessionId?: string,\n ): Promise<Task> {\n const context = this.createContext('createTask');\n const taskId = this.generateTaskId();\n\n const actualTtl = taskParams.ttl ?? this.defaultTtl;\n const createdAt = new Date().toISOString();\n\n const task: Task = {\n taskId,\n status: 'working',\n ttl: actualTtl,\n createdAt,\n lastUpdatedAt: createdAt,\n pollInterval: taskParams.pollInterval ?? 1000,\n };\n\n const storedTask: StoredTask = {\n task,\n request,\n requestId,\n };\n\n // Store with TTL if specified (convert ms to seconds for StorageService)\n await this.storage.set(\n this.getTaskKey(taskId),\n storedTask,\n context,\n actualTtl ? { ttl: Math.ceil(actualTtl / 1000) } : undefined,\n );\n\n return task;\n }\n\n async getTask(taskId: string, _sessionId?: string): Promise<Task | null> {\n const context = this.createContext('getTask');\n const stored = await this.storage.get<StoredTask>(\n this.getTaskKey(taskId),\n context,\n );\n\n return stored ? { ...stored.task } : null;\n }\n\n async storeTaskResult(\n taskId: string,\n status: 'completed' | 'failed',\n result: Result,\n _sessionId?: string,\n ): Promise<void> {\n const context = this.createContext('storeTaskResult');\n const key = this.getTaskKey(taskId);\n\n const stored = await this.storage.get<StoredTask>(key, context);\n if (!stored) {\n throw new Error(`Task with ID ${taskId} not found`);\n }\n\n // Don't allow storing results for tasks already in terminal state\n if (isTerminal(stored.task.status)) {\n throw new Error(\n `Cannot store result for task ${taskId} in terminal status '${stored.task.status}'. Task results can only be stored once.`,\n );\n }\n\n stored.result = result;\n stored.task.status = status;\n stored.task.lastUpdatedAt = new Date().toISOString();\n\n // Re-store with TTL reset (if ttl is set, convert ms to seconds)\n await this.storage.set(\n key,\n stored,\n context,\n stored.task.ttl ? { ttl: Math.ceil(stored.task.ttl / 1000) } : undefined,\n );\n }\n\n async getTaskResult(taskId: string, _sessionId?: string): Promise<Result> {\n const context = this.createContext('getTaskResult');\n const stored = await this.storage.get<StoredTask>(\n this.getTaskKey(taskId),\n context,\n );\n\n if (!stored) {\n throw new Error(`Task with ID ${taskId} not found`);\n }\n\n if (!stored.result) {\n throw new Error(`Task ${taskId} has no result stored`);\n }\n\n return stored.result;\n }\n\n async updateTaskStatus(\n taskId: string,\n status: Task['status'],\n statusMessage?: string,\n _sessionId?: string,\n ): Promise<void> {\n const context = this.createContext('updateTaskStatus');\n const key = this.getTaskKey(taskId);\n\n const stored = await this.storage.get<StoredTask>(key, context);\n if (!stored) {\n throw new Error(`Task with ID ${taskId} not found`);\n }\n\n // Don't allow transitions from terminal states\n if (isTerminal(stored.task.status)) {\n throw new Error(\n `Cannot update task ${taskId} from terminal status '${stored.task.status}' to '${status}'. Terminal states (completed, failed, cancelled) cannot transition to other states.`,\n );\n }\n\n stored.task.status = status;\n if (statusMessage) {\n stored.task.statusMessage = statusMessage;\n }\n stored.task.lastUpdatedAt = new Date().toISOString();\n\n // Re-store, reset TTL if transitioning to terminal state (convert ms to seconds)\n const shouldResetTtl = isTerminal(status) && stored.task.ttl;\n await this.storage.set(\n key,\n stored,\n context,\n shouldResetTtl ? { ttl: Math.ceil(stored.task.ttl! / 1000) } : undefined,\n );\n }\n\n async listTasks(\n cursor?: string,\n _sessionId?: string,\n ): Promise<{ tasks: Task[]; nextCursor?: string }> {\n const context = this.createContext('listTasks');\n\n // List all task keys with pagination\n const listResult = await this.storage.list(\n this.keyPrefix,\n context,\n cursor ? { cursor, limit: this.pageSize } : { limit: this.pageSize },\n );\n\n // Fetch all tasks in parallel\n const taskPromises = listResult.keys.map(async (key) => {\n const stored = await this.storage.get<StoredTask>(key, context);\n return stored ? { ...stored.task } : null;\n });\n\n const tasksOrNull = await Promise.all(taskPromises);\n const tasks = tasksOrNull.filter((t): t is Task => t !== null);\n\n // Handle exactOptionalPropertyTypes - only include nextCursor if defined\n if (listResult.nextCursor !== undefined) {\n return { tasks, nextCursor: listResult.nextCursor };\n }\n return { tasks };\n }\n\n /**\n * Deletes a task from storage.\n * Useful for manual cleanup or testing.\n *\n * @param taskId - The task ID to delete\n */\n async deleteTask(taskId: string): Promise<void> {\n const context = this.createContext('deleteTask');\n await this.storage.delete(this.getTaskKey(taskId), context);\n }\n\n /**\n * Clears all tasks from storage.\n * Useful for testing or administrative purposes.\n *\n * WARNING: This deletes ALL tasks for the configured tenant.\n */\n async clearAllTasks(): Promise<void> {\n const context = this.createContext('clearAllTasks');\n\n // List and delete all tasks\n let cursor: string | undefined;\n do {\n const result = await this.storage.list(\n this.keyPrefix,\n context,\n cursor ? { cursor, limit: 100 } : { limit: 100 },\n );\n\n await Promise.all(\n result.keys.map((key) => this.storage.delete(key, context)),\n );\n\n cursor = result.nextCursor;\n } while (cursor);\n }\n}\n","/**\n * @fileoverview Singleton service for managing MCP task state and message queues.\n * Supports both in-memory and storage-backed task stores based on configuration.\n *\n * Configure via environment variables:\n * - TASK_STORE_TYPE: 'in-memory' (default) or 'storage'\n * - TASK_STORE_TENANT_ID: Tenant ID for storage isolation (default: 'system-tasks')\n * - TASK_STORE_DEFAULT_TTL_MS: Default TTL in milliseconds (optional)\n *\n * @experimental These APIs are experimental and may change without notice.\n * @module src/mcp-server/tasks/core/taskManager\n */\nimport { inject, injectable } from 'tsyringe';\n\nimport {\n AppConfig,\n StorageService as StorageServiceToken,\n} from '@/container/tokens.js';\nimport { type config as configType } from '@/config/index.js';\nimport { StorageService } from '@/storage/core/StorageService.js';\nimport { logger, type RequestContext } from '@/utils/index.js';\nimport {\n InMemoryTaskStore,\n InMemoryTaskMessageQueue,\n type TaskStore,\n type TaskMessageQueue,\n} from './taskTypes.js';\nimport { StorageBackedTaskStore } from './storageBackedTaskStore.js';\n\n/**\n * Singleton service that manages task state and message queues for the MCP server.\n *\n * The TaskManager provides:\n * - A shared TaskStore for creating, tracking, and completing tasks\n * - A shared TaskMessageQueue for side-channel message delivery\n * - Cleanup methods for graceful shutdown\n *\n * The store type is determined by configuration:\n * - `in-memory`: Fast, suitable for development (data lost on restart)\n * - `storage`: Persistent, uses configured StorageService backend\n *\n * @example\n * ```typescript\n * // Inject via DI\n * constructor(@inject(TaskManagerToken) private taskManager: TaskManager) {}\n *\n * // Access stores\n * const taskStore = this.taskManager.getTaskStore();\n * const messageQueue = this.taskManager.getMessageQueue();\n * ```\n *\n * @experimental\n */\n@injectable()\nexport class TaskManager {\n private readonly taskStore: TaskStore;\n private readonly inMemoryTaskStore: InMemoryTaskStore | null = null;\n private readonly messageQueue: InMemoryTaskMessageQueue;\n private readonly storeType: 'in-memory' | 'storage';\n private isShuttingDown = false;\n\n constructor(\n @inject(AppConfig) config: typeof configType,\n @inject(StorageServiceToken) storageService: StorageService,\n ) {\n this.storeType = config.tasks.storeType;\n this.messageQueue = new InMemoryTaskMessageQueue();\n\n if (this.storeType === 'storage') {\n // Use storage-backed task store for persistence\n this.taskStore = new StorageBackedTaskStore(storageService, {\n tenantId: config.tasks.tenantId,\n defaultTtl: config.tasks.defaultTtlMs ?? null,\n });\n logger.info('TaskManager initialized with storage-backed task store', {\n operation: 'TaskManager.constructor',\n requestId: 'init',\n timestamp: new Date().toISOString(),\n storeType: this.storeType,\n tenantId: config.tasks.tenantId,\n });\n } else {\n // Use in-memory task store (default)\n this.inMemoryTaskStore = new InMemoryTaskStore();\n this.taskStore = this.inMemoryTaskStore;\n logger.info('TaskManager initialized with in-memory task store', {\n operation: 'TaskManager.constructor',\n requestId: 'init',\n timestamp: new Date().toISOString(),\n storeType: this.storeType,\n });\n }\n }\n\n /**\n * Returns the TaskStore instance for managing task lifecycle.\n *\n * The TaskStore handles:\n * - Task creation with TTL and poll intervals\n * - Status updates (working, input_required, completed, failed, cancelled)\n * - Result storage and retrieval\n * - Task listing with pagination\n *\n * @returns The singleton TaskStore instance\n */\n public getTaskStore(): TaskStore {\n return this.taskStore;\n }\n\n /**\n * Returns the TaskMessageQueue instance for side-channel messaging.\n *\n * The message queue enables:\n * - Queuing requests/notifications for delivery via tasks/result\n * - FIFO ordering per task\n * - Atomic enqueue with size limits\n *\n * @returns The singleton TaskMessageQueue instance\n */\n public getMessageQueue(): TaskMessageQueue {\n return this.messageQueue;\n }\n\n /**\n * Returns the store type currently in use.\n *\n * @returns 'in-memory' or 'storage'\n */\n public getStoreType(): 'in-memory' | 'storage' {\n return this.storeType;\n }\n\n /**\n * Performs cleanup of task resources.\n *\n * Should be called during graceful server shutdown to:\n * - Cancel cleanup timers in the in-memory task store\n * - Clear any pending message queues\n *\n * Note: Storage-backed task stores don't require cleanup as data persists.\n *\n * @param context - Request context for logging\n */\n public cleanup(context?: RequestContext): void {\n if (this.isShuttingDown) {\n return;\n }\n\n this.isShuttingDown = true;\n\n const logContext = context ?? {\n operation: 'TaskManager.cleanup',\n requestId: 'shutdown',\n timestamp: new Date().toISOString(),\n };\n\n logger.info('Cleaning up TaskManager resources...', logContext);\n\n // Only InMemoryTaskStore has cleanup timers\n if (this.inMemoryTaskStore) {\n this.inMemoryTaskStore.cleanup();\n }\n\n logger.info('TaskManager cleanup complete', logContext);\n }\n\n /**\n * Returns the current task count (for debugging/monitoring).\n * Only available for in-memory store; returns -1 for storage-backed store.\n *\n * @returns The number of tasks currently tracked, or -1 if unavailable\n */\n public getTaskCount(): number {\n if (this.inMemoryTaskStore) {\n return this.inMemoryTaskStore.getAllTasks().length;\n }\n // Storage-backed store doesn't have getAllTasks - would require listing\n return -1;\n }\n\n /**\n * Checks if the TaskManager is shutting down.\n *\n * @returns True if cleanup has been initiated\n */\n public isCleaningUp(): boolean {\n return this.isShuttingDown;\n }\n}\n","/**\n * @fileoverview Defines the structure for task-based tool definitions.\n * Task tools support long-running async operations with the MCP Tasks API,\n * enabling \"call-now, fetch-later\" execution patterns.\n *\n * @experimental These APIs are experimental and may change without notice.\n * @module src/mcp-server/tasks/utils/taskToolDefinition\n */\nimport type { ZodObject, ZodRawShape } from 'zod';\n\nimport type { ToolAnnotations } from '@/mcp-server/tools/utils/toolDefinition.js';\nimport type {\n ToolTaskHandler,\n TaskToolExecution,\n} from '@/mcp-server/tasks/core/taskTypes.js';\n\n/**\n * Represents a task-based tool definition for long-running async operations.\n *\n * Unlike regular tools that execute synchronously and return immediately,\n * task tools create durable task handles that clients can poll for status\n * and retrieve results after completion.\n *\n * Task tools are registered via `server.experimental.tasks.registerToolTask()`\n * and must implement three handlers:\n * - `createTask`: Called when the tool is invoked, creates the task and starts work\n * - `getTask`: Called to poll task status (tasks/get)\n * - `getTaskResult`: Called to retrieve results (tasks/result)\n *\n * @example\n * ```typescript\n * const myTaskTool: TaskToolDefinition<typeof InputSchema, typeof OutputSchema> = {\n * name: 'long_running_analysis',\n * description: 'Performs a long-running analysis operation',\n * inputSchema: z.object({ data: z.string() }),\n * outputSchema: z.object({ result: z.string() }),\n * execution: { taskSupport: 'required' },\n * taskHandlers: {\n * createTask: async (args, extra) => {\n * const task = await extra.taskStore.createTask({ ttl: 300000 }, ...);\n * startBackgroundWork(task.taskId, args);\n * return { task };\n * },\n * getTask: async (_args, extra) => {\n * return await extra.taskStore.getTask(extra.taskId);\n * },\n * getTaskResult: async (_args, extra) => {\n * return await extra.taskStore.getTaskResult(extra.taskId);\n * }\n * }\n * };\n * ```\n *\n * @experimental\n */\nexport interface TaskToolDefinition<\n TInputSchema extends ZodObject<ZodRawShape>,\n TOutputSchema extends ZodObject<ZodRawShape>,\n> {\n /**\n * The programmatic, unique name for the tool (e.g., 'async_analysis').\n * Must follow MCP tool naming conventions: alphanumeric, underscores, hyphens.\n */\n name: string;\n\n /**\n * An optional, human-readable title for the tool.\n * If not provided, derived from `name` or `annotations.title`.\n */\n title?: string;\n\n /**\n * A clear, concise description of what the tool does.\n * This is sent to the LLM to help it decide when to use the tool.\n */\n description: string;\n\n /**\n * The Zod schema for validating the tool's input parameters.\n * All fields should have `.describe()` for LLM context.\n */\n inputSchema: TInputSchema;\n\n /**\n * The Zod schema for validating the tool's successful output structure.\n * Used for documentation and client-side type inference.\n */\n outputSchema?: TOutputSchema;\n\n /**\n * Optional metadata providing hints about the tool's behavior.\n */\n annotations?: ToolAnnotations;\n\n /**\n * Task execution configuration.\n *\n * - `taskSupport: 'required'` - Tool MUST be invoked as a task\n * - `taskSupport: 'optional'` - Tool can be invoked normally or as a task\n *\n * Note: `taskSupport: 'forbidden'` is not valid for task tools;\n * use a regular ToolDefinition instead.\n */\n execution: TaskToolExecution;\n\n /**\n * The task handlers implementing the task lifecycle.\n *\n * These handlers are called by the SDK at different points:\n * - `createTask`: When the tool is first invoked (tools/call with task param)\n * - `getTask`: When polling for status (tasks/get)\n * - `getTaskResult`: When retrieving results (tasks/result)\n */\n taskHandlers: ToolTaskHandler<TInputSchema>;\n}\n\n/**\n * Type guard to check if a tool definition is a task tool.\n *\n * @param def - The tool definition to check\n * @returns True if the definition has taskHandlers (is a TaskToolDefinition)\n */\nexport function isTaskToolDefinition(\n def: unknown,\n): def is TaskToolDefinition<ZodObject<ZodRawShape>, ZodObject<ZodRawShape>> {\n return (\n def !== null &&\n typeof def === 'object' &&\n 'taskHandlers' in def &&\n def.taskHandlers !== null &&\n typeof def.taskHandlers === 'object'\n );\n}\n","/**\n * @fileoverview Encapsulates the registration of all tool definitions for the application's\n * dependency injection (DI) container and provides a registry service to apply them to an\n * McpServer instance. Supports both regular tools and task-based tools (experimental).\n * @module src/mcp-server/tools/tool-registration\n */\nimport {\n McpServer,\n type ToolCallback,\n} from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { type DependencyContainer, injectable, injectAll } from 'tsyringe';\nimport { ZodObject, type ZodRawShape } from 'zod';\n\nimport { ToolDefinitions } from '@/container/index.js';\nimport { JsonRpcErrorCode } from '@/types-global/errors.js';\nimport { ErrorHandler, logger, requestContextService } from '@/utils/index.js';\nimport { allToolDefinitions } from '@/mcp-server/tools/definitions/index.js';\nimport type { ToolDefinition } from '@/mcp-server/tools/utils/index.js';\nimport { createMcpToolHandler } from '@/mcp-server/tools/utils/index.js';\nimport {\n type TaskToolDefinition,\n isTaskToolDefinition,\n} from '@/mcp-server/tasks/index.js';\n\n@injectable()\nexport class ToolRegistry {\n constructor(\n @injectAll(ToolDefinitions, { isOptional: true })\n private toolDefs: ToolDefinition<\n ZodObject<ZodRawShape>,\n ZodObject<ZodRawShape>\n >[],\n ) {}\n\n /**\n * Registers all resolved tool definitions with the provided McpServer instance.\n * Automatically detects task-based tools and registers them via the experimental Tasks API.\n * @param {McpServer} server - The server instance to register tools with.\n */\n public async registerAll(server: McpServer): Promise<void> {\n const context = requestContextService.createRequestContext({\n operation: 'ToolRegistry.registerAll',\n });\n\n const regularTools: ToolDefinition<\n ZodObject<ZodRawShape>,\n ZodObject<ZodRawShape>\n >[] = [];\n const taskTools: TaskToolDefinition<\n ZodObject<ZodRawShape>,\n ZodObject<ZodRawShape>\n >[] = [];\n\n // Separate regular tools from task tools\n for (const toolDef of this.toolDefs) {\n if (isTaskToolDefinition(toolDef)) {\n taskTools.push(toolDef);\n } else {\n regularTools.push(toolDef);\n }\n }\n\n logger.info(\n `Registering ${regularTools.length} regular tool(s) and ${taskTools.length} task tool(s)...`,\n context,\n );\n\n // Register regular tools\n for (const toolDef of regularTools) {\n await this.registerTool(server, toolDef);\n }\n\n // Register task tools via experimental API\n for (const toolDef of taskTools) {\n await this.registerTaskTool(server, toolDef);\n }\n }\n\n private deriveTitleFromName(name: string): string {\n return name\n .replace(/_/g, ' ')\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\n }\n\n private async registerTool<\n TInputSchema extends ZodObject<ZodRawShape>,\n TOutputSchema extends ZodObject<ZodRawShape>,\n >(\n server: McpServer,\n tool: ToolDefinition<TInputSchema, TOutputSchema>,\n ): Promise<void> {\n const registrationContext = requestContextService.createRequestContext({\n operation: 'ToolRegistry.registerTool',\n toolName: tool.name,\n });\n\n logger.debug(`Registering tool: '${tool.name}'`, registrationContext);\n\n await ErrorHandler.tryCatch(\n () => {\n const handler = createMcpToolHandler({\n toolName: tool.name,\n inputSchema: tool.inputSchema,\n logic: tool.logic,\n ...(tool.responseFormatter && {\n responseFormatter: tool.responseFormatter,\n }),\n });\n\n const title =\n tool.title ??\n tool.annotations?.title ??\n this.deriveTitleFromName(tool.name);\n\n // Type assertion required: SDK's conditional types don't resolve with generic constraints\n server.registerTool(\n tool.name,\n {\n title,\n description: tool.description,\n inputSchema: tool.inputSchema,\n outputSchema: tool.outputSchema,\n ...(tool.annotations && { annotations: tool.annotations }),\n },\n handler as ToolCallback<TInputSchema>,\n );\n\n logger.notice(\n `Tool '${tool.name}' registered successfully.`,\n registrationContext,\n );\n },\n {\n operation: `RegisteringTool_${tool.name}`,\n context: registrationContext,\n errorCode: JsonRpcErrorCode.InitializationFailed,\n critical: true,\n },\n );\n }\n\n /**\n * Registers a task-based tool with the MCP server via the experimental Tasks API.\n * Task tools support long-running async operations with polling for status and results.\n *\n * @experimental\n */\n private async registerTaskTool<\n TInputSchema extends ZodObject<ZodRawShape>,\n TOutputSchema extends ZodObject<ZodRawShape>,\n >(\n server: McpServer,\n tool: TaskToolDefinition<TInputSchema, TOutputSchema>,\n ): Promise<void> {\n const registrationContext = requestContextService.createRequestContext({\n operation: 'ToolRegistry.registerTaskTool',\n toolName: tool.name,\n });\n\n logger.debug(\n `Registering task tool: '${tool.name}' (experimental)`,\n registrationContext,\n );\n\n await ErrorHandler.tryCatch(\n () => {\n const title =\n tool.title ??\n tool.annotations?.title ??\n this.deriveTitleFromName(tool.name);\n\n // Use the experimental Tasks API to register task-based tools\n server.experimental.tasks.registerToolTask(\n tool.name,\n {\n title,\n description: tool.description,\n inputSchema: tool.inputSchema,\n ...(tool.outputSchema && { outputSchema: tool.outputSchema }),\n ...(tool.annotations && { annotations: tool.annotations }),\n execution: tool.execution,\n },\n tool.taskHandlers,\n );\n\n logger.notice(\n `Task tool '${tool.name}' registered successfully (experimental).`,\n registrationContext,\n );\n },\n {\n operation: `RegisteringTaskTool_${tool.name}`,\n context: registrationContext,\n errorCode: JsonRpcErrorCode.InitializationFailed,\n critical: true,\n },\n );\n }\n}\n\n/**\n * Registers all tool definitions with the provided dependency container.\n * This function uses multi-injection to register each tool under the `ToolDefinitions` token.\n *\n * @param {DependencyContainer} container - The tsyringe container instance to register tools with.\n */\nexport const registerTools = (container: DependencyContainer): void => {\n for (const tool of allToolDefinitions) {\n container.register(ToolDefinitions, { useValue: tool });\n }\n};\n","/**\n * @fileoverview Main entry point for the MCP (Model Context Protocol) server.\n * This file orchestrates the server's lifecycle:\n * 1. Initializes the core `McpServer` instance (from `@modelcontextprotocol/sdk`) with its identity and capabilities.\n * 2. Registers available resources and tools, making them discoverable and usable by clients.\n * 3. Selects and starts the appropriate communication transport (stdio or Streamable HTTP)\n * based on configuration.\n * 4. Handles top-level error management during startup.\n *\n * MCP Specification References:\n * - Lifecycle: https://modelcontextprotocol.io/specification/2025-06-18/basic/lifecycle\n * - Overview (Capabilities): https://modelcontextprotocol.io/specification/2025-06-18/basic/index\n * - Transports: https://modelcontextprotocol.io/specification/2025-06-18/basic/transports\n * @module src/mcp-server/server\n */\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { container } from 'tsyringe';\n\nimport { config } from '@/config/index.js';\nimport { PromptRegistry } from '@/mcp-server/prompts/prompt-registration.js';\nimport { ResourceRegistry } from '@/mcp-server/resources/resource-registration.js';\nimport { RootsRegistry } from '@/mcp-server/roots/roots-registration.js';\nimport { ToolRegistry } from '@/mcp-server/tools/tool-registration.js';\nimport { logger, requestContextService } from '@/utils/index.js';\n\n/**\n * Creates and configures a new instance of the `McpServer`.\n * This function now resolves tool and resource definitions from the DI container.\n *\n * @returns A promise resolving with the configured `McpServer` instance.\n * @throws {McpError} If any resource or tool registration fails.\n * @private\n */\nexport async function createMcpServerInstance(): Promise<McpServer> {\n const context = requestContextService.createRequestContext({\n operation: 'createMcpServerInstance',\n });\n logger.info('Initializing MCP server instance', context);\n\n requestContextService.configure({\n appName: config.mcpServerName,\n appVersion: config.mcpServerVersion,\n environment: config.environment,\n });\n\n const server = new McpServer(\n {\n name: config.mcpServerName,\n version: config.mcpServerVersion,\n },\n {\n capabilities: {\n logging: {},\n resources: { listChanged: true },\n tools: { listChanged: true },\n prompts: { listChanged: true },\n // Experimental: Tasks API for long-running async operations\n tasks: {\n list: {},\n cancel: {},\n requests: {\n tools: { call: {} },\n },\n },\n },\n },\n );\n\n try {\n logger.debug('Registering all MCP capabilities via registries...', context);\n\n // Resolve and use registry services\n const toolRegistry = container.resolve(ToolRegistry);\n await toolRegistry.registerAll(server);\n\n const resourceRegistry = container.resolve(ResourceRegistry);\n await resourceRegistry.registerAll(server);\n\n const promptRegistry = container.resolve(PromptRegistry);\n promptRegistry.registerAll(server);\n\n const rootsRegistry = container.resolve(RootsRegistry);\n void rootsRegistry.registerAll(server);\n\n logger.info('All MCP capabilities registered successfully', context);\n } catch (err) {\n logger.error('Failed to register MCP capabilities', {\n ...context,\n error: err instanceof Error ? err.message : String(err),\n stack: err instanceof Error ? err.stack : undefined,\n });\n throw err;\n }\n\n return server;\n}\n","let crypto;\ncrypto =\n globalThis.crypto?.webcrypto ?? // Node.js [18-16] REPL\n globalThis.crypto ?? // Node.js >18\n import(\"node:crypto\").then(m => m.webcrypto); // Node.js <18 Non-REPL\n/**\n * Creates an array of length `size` of random bytes\n * @param size\n * @returns Array of random ints (0 to 255)\n */\nasync function getRandomValues(size) {\n return (await crypto).getRandomValues(new Uint8Array(size));\n}\n/** Generate cryptographically strong random string\n * @param size The desired length of the string\n * @returns The random string\n */\nasync function random(size) {\n const mask = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~\";\n const evenDistCutoff = Math.pow(2, 8) - Math.pow(2, 8) % mask.length;\n let result = \"\";\n while (result.length < size) {\n const randomBytes = await getRandomValues(size - result.length);\n for (const randomByte of randomBytes) {\n if (randomByte < evenDistCutoff) {\n result += mask[randomByte % mask.length];\n }\n }\n }\n return result;\n}\n/** Generate a PKCE challenge verifier\n * @param length Length of the verifier\n * @returns A random verifier `length` characters long\n */\nasync function generateVerifier(length) {\n return await random(length);\n}\n/** Generate a PKCE code challenge from a code verifier\n * @param code_verifier\n * @returns The base64 url encoded code challenge\n */\nexport async function generateChallenge(code_verifier) {\n const buffer = await (await crypto).subtle.digest(\"SHA-256\", new TextEncoder().encode(code_verifier));\n // Generate base64url string\n // btoa is deprecated in Node.js but is used here for web browser compatibility\n // (which has no good replacement yet, see also https://github.com/whatwg/html/issues/6811)\n return btoa(String.fromCharCode(...new Uint8Array(buffer)))\n .replace(/\\//g, '_')\n .replace(/\\+/g, '-')\n .replace(/=/g, '');\n}\n/** Generate a PKCE challenge pair\n * @param length Length of the verifer (between 43-128). Defaults to 43.\n * @returns PKCE challenge pair\n */\nexport default async function pkceChallenge(length) {\n if (!length)\n length = 43;\n if (length < 43 || length > 128) {\n throw `Expected a length between 43 and 128. Received ${length}.`;\n }\n const verifier = await generateVerifier(length);\n const challenge = await generateChallenge(verifier);\n return {\n code_verifier: verifier,\n code_challenge: challenge,\n };\n}\n/** Verify that a code_verifier produces the expected code challenge\n * @param code_verifier\n * @param expectedChallenge The code challenge to verify\n * @returns True if challenges are equal. False otherwise.\n */\nexport async function verifyChallenge(code_verifier, expectedChallenge) {\n const actualChallenge = await generateChallenge(code_verifier);\n return actualChallenge === expectedChallenge;\n}\n","import {\n InvalidClientError,\n InvalidRequestError,\n InvalidScopeError,\n OAuthError,\n ServerError,\n} from '@modelcontextprotocol/sdk/server/auth/errors.js'\nimport type { OAuthServerProvider } from '@modelcontextprotocol/sdk/server/auth/provider.js'\nimport type { MiddlewareHandler } from 'hono'\nimport * as z from 'zod/v4'\n\n// Parameters that must be validated in order to issue redirects.\nconst ClientAuthorizationParamsSchema = z.object({\n client_id: z.string(),\n redirect_uri: z\n .string()\n .optional()\n .refine((value) => value === undefined || URL.canParse(value), {\n message: 'redirect_uri must be a valid URL',\n }),\n})\n\n// Parameters that must be validated for a successful authorization request. Failure can be reported to the redirect URI.\nconst RequestAuthorizationParamsSchema = z.object({\n response_type: z.literal('code'),\n code_challenge: z.string(),\n code_challenge_method: z.literal('S256'),\n scope: z.string().optional(),\n state: z.string().optional(),\n resource: z.url().optional(),\n})\n\nexport function authorizeHandler(provider: OAuthServerProvider): MiddlewareHandler {\n return async (c) => {\n c.header('Cache-Control', 'no-store')\n\n // In the authorization flow, errors are split into two categories:\n // 1. Pre-redirect errors (direct response with 400)\n // 2. Post-redirect errors (redirect with error parameters)\n\n // Phase 1: Validate client_id and redirect_uri. Any errors here must be direct responses.\n let redirect_uri, client\n try {\n const result = ClientAuthorizationParamsSchema.safeParse(\n c.req.method === 'POST' ? await c.req.json() : c.req.query()\n )\n\n if (!result.success) {\n throw new InvalidRequestError(result.error.message)\n }\n\n redirect_uri = result.data.redirect_uri\n\n client = await provider.clientsStore.getClient(result.data.client_id)\n\n if (!client) {\n throw new InvalidClientError('Invalid client_id')\n }\n\n if (redirect_uri !== undefined) {\n if (!client.redirect_uris.includes(redirect_uri)) {\n throw new InvalidRequestError('Unregistered redirect_uri')\n }\n } else if (client.redirect_uris.length === 1) {\n redirect_uri = client.redirect_uris[0]\n } else {\n throw new InvalidRequestError(\n 'redirect_uri must be specified when client has multiple registered URIs'\n )\n }\n } catch (error) {\n // Pre-redirect errors - return direct response\n //\n // These don't need to be JSON encoded, as they'll be displayed in a user\n // agent, but OTOH they all represent exceptional situations (arguably,\n // \"programmer error\"), so presenting a nice HTML page doesn't help the\n // user anyway.\n if (error instanceof OAuthError) {\n const status = error instanceof ServerError ? 500 : 400\n return c.json(error.toResponseObject(), status)\n }\n\n const serverError = new ServerError('Internal Server Error')\n return c.json(serverError.toResponseObject(), 500)\n }\n\n // Phase 2: Validate other parameters. Any errors here should go into redirect responses.\n let state\n try {\n // Parse and validate authorization parameters\n const parseResult = RequestAuthorizationParamsSchema.safeParse(\n c.req.method === 'POST' ? await c.req.json() : c.req.query()\n )\n\n if (!parseResult.success) {\n throw new InvalidRequestError(parseResult.error.message)\n }\n\n const { scope, code_challenge, resource } = parseResult.data\n state = parseResult.data.state\n\n // Validate scopes\n let requestedScopes: string[] = []\n if (scope !== undefined) {\n requestedScopes = scope.split(' ')\n const allowedScopes = new Set(client.scope?.split(' '))\n\n // Check each requested scope against allowed scopes\n for (const scope of requestedScopes) {\n if (!allowedScopes.has(scope)) {\n throw new InvalidScopeError(`Client was not registered with scope ${scope}`)\n }\n }\n }\n\n // All validation passed, proceed with authorization\n await provider.authorize(\n client,\n {\n state,\n scopes: requestedScopes,\n redirectUri: redirect_uri,\n codeChallenge: code_challenge,\n resource: resource ? new URL(resource) : undefined,\n },\n c\n )\n\n return c.res\n } catch (error) {\n // Post-redirect errors - redirect with error parameters\n if (error instanceof OAuthError) {\n return c.redirect(createErrorRedirect(redirect_uri, error, state))\n }\n\n const serverError = new ServerError('Internal Server Error')\n return c.redirect(createErrorRedirect(redirect_uri, serverError, state), 302)\n }\n }\n}\n\n/**\n * Helper function to create redirect URL with error parameters\n */\nfunction createErrorRedirect(redirectUri: string, error: OAuthError, state?: string): string {\n const errorUrl = new URL(redirectUri)\n errorUrl.searchParams.set('error', error.errorCode)\n errorUrl.searchParams.set('error_description', error.message)\n if (error.errorUri) {\n errorUrl.searchParams.set('error_uri', error.errorUri)\n }\n if (state) {\n errorUrl.searchParams.set('state', state)\n }\n return errorUrl.href\n}\n","import {\n InvalidGrantError,\n InvalidRequestError,\n OAuthError,\n ServerError,\n UnsupportedGrantTypeError,\n} from '@modelcontextprotocol/sdk/server/auth/errors.js'\nimport type { OAuthServerProvider } from '@modelcontextprotocol/sdk/server/auth/provider.js'\nimport type { MiddlewareHandler } from 'hono'\nimport { verifyChallenge } from 'pkce-challenge'\nimport * as z from 'zod/v4'\nimport type { ClientAuthenticationEnv } from '../middleware/client-auth'\n\nconst TokenRequestSchema = z.object({\n grant_type: z.string(),\n})\n\nconst AuthorizationCodeGrantSchema = z.object({\n code: z.string(),\n code_verifier: z.string(),\n redirect_uri: z.string().optional(),\n resource: z.url().optional(),\n})\n\nconst RefreshTokenGrantSchema = z.object({\n refresh_token: z.string(),\n scope: z.string().optional(),\n resource: z.url().optional(),\n})\n\nexport function tokenHandler(\n provider: OAuthServerProvider\n): MiddlewareHandler<ClientAuthenticationEnv> {\n return async (c) => {\n c.header('Cache-Control', 'no-store')\n\n try {\n let body: any\n\n if (c.req.header('Content-Type') === 'application/json') {\n body = await c.req.json()\n } else {\n body = await c.req.parseBody()\n }\n\n const parseResult = TokenRequestSchema.safeParse(body)\n if (!parseResult.success) {\n throw new InvalidRequestError(parseResult.error.message)\n }\n\n const { grant_type } = parseResult.data\n\n const client = c.get('client')\n if (!client) {\n // This should never happen\n throw new ServerError('Internal Server Error')\n }\n\n switch (grant_type) {\n case 'authorization_code': {\n const parseResult = AuthorizationCodeGrantSchema.safeParse(body)\n if (!parseResult.success) {\n throw new InvalidRequestError(parseResult.error.message)\n }\n\n const { code, code_verifier, redirect_uri, resource } = parseResult.data\n\n const skipLocalPkceValidation = provider.skipLocalPkceValidation\n\n // Perform local PKCE validation unless explicitly skipped\n // (e.g. to validate code_verifier in upstream server)\n if (!skipLocalPkceValidation) {\n const codeChallenge = await provider.challengeForAuthorizationCode(client, code)\n if (!(await verifyChallenge(code_verifier, codeChallenge))) {\n throw new InvalidGrantError('code_verifier does not match the challenge')\n }\n }\n\n // Passes the code_verifier to the provider if PKCE validation didn't occur locally\n const tokens = await provider.exchangeAuthorizationCode(\n client,\n code,\n skipLocalPkceValidation ? code_verifier : undefined,\n redirect_uri,\n resource ? new URL(resource) : undefined\n )\n return c.json(tokens, 200)\n }\n\n case 'refresh_token': {\n const parseResult = RefreshTokenGrantSchema.safeParse(body)\n if (!parseResult.success) {\n throw new InvalidRequestError(parseResult.error.message)\n }\n\n const { refresh_token, scope, resource } = parseResult.data\n\n const scopes = scope?.split(' ')\n const tokens = await provider.exchangeRefreshToken(\n client,\n refresh_token,\n scopes,\n resource ? new URL(resource) : undefined\n )\n return c.json(tokens)\n }\n\n // Not supported right now\n //case \"client_credentials\":\n\n default:\n throw new UnsupportedGrantTypeError(\n 'The grant type is not supported by this authorization server.'\n )\n }\n } catch (error) {\n if (error instanceof OAuthError) {\n const status = error instanceof ServerError ? 500 : 400\n return c.json(error.toResponseObject(), status)\n }\n\n const serverError = new ServerError('Internal Server Error')\n return c.json(serverError.toResponseObject(), 500)\n }\n }\n}\n","import type { OAuthRegisteredClientsStore } from '@modelcontextprotocol/sdk/server/auth/clients.js'\nimport {\n InvalidClientError,\n InvalidRequestError,\n OAuthError,\n ServerError,\n} from '@modelcontextprotocol/sdk/server/auth/errors.js'\nimport type { OAuthClientInformationFull } from '@modelcontextprotocol/sdk/shared/auth.js'\nimport type { MiddlewareHandler } from 'hono'\nimport * as z from 'zod/v4'\n\nexport type ClientAuthenticationMiddlewareOptions = {\n /**\n * A store used to read information about registered OAuth clients.\n */\n clientsStore: OAuthRegisteredClientsStore\n}\n\nconst ClientAuthenticatedRequestSchema = z.object({\n client_id: z.string(),\n client_secret: z.string().optional(),\n})\n\nexport type ClientAuthenticationEnv = {\n Variables: {\n /**\n * The authenticated client for this request, if the `authenticateClient` middleware was used.\n */\n client: OAuthClientInformationFull\n }\n}\n\nexport function authenticateClient({\n clientsStore,\n}: ClientAuthenticationMiddlewareOptions): MiddlewareHandler<ClientAuthenticationEnv> {\n return async (c, next) => {\n try {\n let body: any\n\n if (c.req.header('Content-Type') === 'application/json') {\n body = await c.req.json()\n } else {\n body = await c.req.parseBody()\n }\n\n const result = ClientAuthenticatedRequestSchema.safeParse(body)\n\n if (!result.success) {\n throw new InvalidRequestError(String(result.error))\n }\n\n const { client_id, client_secret } = result.data\n const client = await clientsStore.getClient(client_id)\n if (!client) {\n throw new InvalidClientError('Invalid client_id')\n }\n\n // If client has a secret, validate it\n if (client.client_secret) {\n // Check if client_secret is required but not provided\n if (!client_secret) {\n throw new InvalidClientError('Client secret is required')\n }\n\n // Check if client_secret matches\n if (client.client_secret !== client_secret) {\n throw new InvalidClientError('Invalid client_secret')\n }\n\n // Check if client_secret has expired\n if (\n client.client_secret_expires_at &&\n client.client_secret_expires_at < Math.floor(Date.now() / 1000)\n ) {\n throw new InvalidClientError('Client secret has expired')\n }\n }\n\n c.set('client', client)\n\n await next()\n } catch (error) {\n if (error instanceof OAuthError) {\n const status = error instanceof ServerError ? 500 : 400\n return c.json(error.toResponseObject(), status)\n }\n\n const serverError = new ServerError('Internal Server Error')\n return c.json(serverError.toResponseObject(), 500)\n }\n }\n}\n","import type { Context } from 'hono'\nimport { SSEStreamingApi } from 'hono/streaming'\n\nlet isOldBunVersion = (): boolean => {\n // @ts-expect-error @types/bun is not installed\n const version: string = typeof Bun !== 'undefined' ? Bun.version : undefined\n if (version === undefined) {\n return false\n }\n const result = version.startsWith('1.1') || version.startsWith('1.0') || version.startsWith('0.')\n // Avoid running this check on every call\n isOldBunVersion = () => result\n return result\n}\n\nconst run = async (\n stream: SSEStreamingApi,\n cb: (stream: SSEStreamingApi) => Promise<void>,\n onError?: (e: Error, stream: SSEStreamingApi) => Promise<void>\n): Promise<void> => {\n try {\n await cb(stream)\n } catch (e) {\n if (e instanceof Error && onError) {\n await onError(e, stream)\n\n await stream.writeSSE({\n event: 'error',\n data: e.message,\n })\n } else {\n console.error(e)\n }\n }\n}\n\nconst contextStash: WeakMap<ReadableStream, Context> = new WeakMap<ReadableStream, Context>()\n\nexport const streamSSE = (\n c: Context,\n cb: (stream: SSEStreamingApi) => Promise<void>,\n onError?: (e: Error, stream: SSEStreamingApi) => Promise<void>\n): Response => {\n const { readable, writable } = new TransformStream()\n const stream = new SSEStreamingApi(writable, readable)\n\n // Until Bun v1.1.27, Bun didn't call cancel() on the ReadableStream for Response objects from Bun.serve()\n if (isOldBunVersion()) {\n c.req.raw.signal.addEventListener('abort', () => {\n if (!stream.closed) {\n stream.abort()\n }\n })\n }\n\n // in bun, `c` is destroyed when the request is returned, so hold it until the end of streaming\n contextStash.set(stream.responseReadable, c)\n\n c.header('Transfer-Encoding', 'chunked')\n c.header('Content-Type', 'text/event-stream')\n c.header('Cache-Control', 'no-cache')\n c.header('Connection', 'keep-alive')\n\n run(stream, cb, onError)\n\n return c.newResponse(stream.responseReadable)\n}\n","/**\n * @module\n * MCP HTTP Streaming Helper for Hono.\n */\nimport type { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js'\nimport type {\n EventStore,\n StreamableHTTPServerTransportOptions,\n} from '@modelcontextprotocol/sdk/server/streamableHttp.js'\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js'\nimport type {\n JSONRPCMessage,\n MessageExtraInfo,\n RequestId,\n RequestInfo,\n} from '@modelcontextprotocol/sdk/types.js'\nimport {\n DEFAULT_NEGOTIATED_PROTOCOL_VERSION,\n ErrorCode,\n isInitializeRequest,\n isJSONRPCErrorResponse,\n isJSONRPCRequest,\n isJSONRPCResultResponse,\n JSONRPCMessageSchema,\n SUPPORTED_PROTOCOL_VERSIONS,\n} from '@modelcontextprotocol/sdk/types.js'\nimport type { Context } from 'hono'\nimport { HTTPException } from 'hono/http-exception'\nimport type { SSEStreamingApi } from 'hono/streaming'\nimport { streamSSE } from './streaming'\n\nexport class StreamableHTTPTransport implements Transport {\n #started = false\n #initialized = false\n #onSessionInitialized?: (sessionId: string) => void | Promise<void>\n #onSessionClosed?: (sessionId: string) => void | Promise<void>\n #sessionIdGenerator?: () => string\n #eventStore?: EventStore\n #enableJsonResponse = false\n #standaloneSseStreamId = '_GET_stream'\n #streamMapping = new Map<\n string,\n {\n ctx: {\n header: (name: string, value: string) => void\n json?: (data: unknown) => void\n }\n stream?: SSEStreamingApi\n cleanup: () => void\n }\n >()\n #requestToStreamMapping = new Map<RequestId, string>()\n #requestResponseMap = new Map<RequestId, JSONRPCMessage>()\n #allowedHosts?: string[]\n #allowedOrigins?: string[]\n #enableDnsRebindingProtection: boolean\n\n sessionId?: string\n onclose?: () => void\n onerror?: (error: Error) => void\n onmessage?: (message: JSONRPCMessage, extra?: MessageExtraInfo) => void\n\n constructor(options?: StreamableHTTPServerTransportOptions) {\n this.#sessionIdGenerator = options?.sessionIdGenerator\n this.#enableJsonResponse = options?.enableJsonResponse ?? false\n this.#eventStore = options?.eventStore\n this.#onSessionInitialized = options?.onsessioninitialized\n this.#onSessionClosed = options?.onsessionclosed\n this.#allowedHosts = options?.allowedHosts\n this.#allowedOrigins = options?.allowedOrigins\n this.#enableDnsRebindingProtection = options?.enableDnsRebindingProtection ?? false\n }\n\n /**\n * Starts the transport. This is required by the Transport interface but is a no-op\n * for the Streamable HTTP transport as connections are managed per-request.\n */\n async start(): Promise<void> {\n if (this.#started) {\n throw new Error('Transport already started')\n }\n this.#started = true\n }\n\n /**\n * Validates request headers for DNS rebinding protection.\n * @returns Error message if validation fails, undefined if validation passes.\n */\n #validateRequestHeaders(ctx: Context): string | undefined {\n // Skip validation if protection is not enabled\n if (!this.#enableDnsRebindingProtection) {\n return undefined\n }\n\n // Validate Host header if allowedHosts is configured\n if (this.#allowedHosts && this.#allowedHosts.length > 0) {\n const hostHeader = ctx.req.header('Host')\n if (!hostHeader || !this.#allowedHosts.includes(hostHeader)) {\n return `Invalid Host header: ${hostHeader}`\n }\n }\n\n // Validate Origin header if allowedOrigins is configured\n if (this.#allowedOrigins && this.#allowedOrigins.length > 0) {\n const originHeader = ctx.req.header('Origin')\n if (!originHeader || !this.#allowedOrigins.includes(originHeader)) {\n return `Invalid Origin header: ${originHeader}`\n }\n }\n\n return undefined\n }\n\n /**\n * Handles an incoming HTTP request, whether GET or POST\n */\n async handleRequest(ctx: Context, parsedBody?: unknown): Promise<Response | undefined> {\n // Validate request headers for DNS rebinding protection\n const validationError = this.#validateRequestHeaders(ctx)\n if (validationError) {\n throw new HTTPException(403, {\n res: Response.json({\n jsonrpc: '2.0',\n error: {\n code: -32000,\n message: validationError,\n },\n id: null,\n }),\n })\n }\n\n switch (ctx.req.method) {\n case 'GET':\n return this.handleGetRequest(ctx)\n case 'POST':\n return this.handlePostRequest(ctx, parsedBody)\n case 'DELETE':\n return this.handleDeleteRequest(ctx)\n default:\n return this.handleUnsupportedRequest(ctx)\n }\n }\n\n /**\n * Handles GET requests for SSE stream\n */\n private async handleGetRequest(ctx: Context) {\n try {\n // The client MUST include an Accept header, listing text/event-stream as a supported content type.\n const acceptHeader = ctx.req.header('Accept')\n if (!acceptHeader?.includes('text/event-stream')) {\n throw new HTTPException(406, {\n res: Response.json({\n jsonrpc: '2.0',\n error: {\n code: -32000,\n message: 'Not Acceptable: Client must accept text/event-stream',\n },\n id: null,\n }),\n })\n }\n\n // If an Mcp-Session-Id is returned by the server during initialization,\n // clients using the Streamable HTTP transport MUST include it\n // in the Mcp-Session-Id header on all of their subsequent HTTP requests.\n this.#validateSession(ctx)\n this.#validateProtocolVersion(ctx)\n\n // After initialization, always include the session ID if we have one\n if (this.sessionId !== undefined) {\n ctx.header('mcp-session-id', this.sessionId)\n }\n\n let streamId: string | ((stream: SSEStreamingApi) => Promise<string>) =\n this.#standaloneSseStreamId\n\n // Handle resumability: check for Last-Event-ID header\n if (this.#eventStore) {\n const lastEventId = ctx.req.header('last-event-id')\n if (lastEventId) {\n streamId = (stream) =>\n this.#eventStore!.replayEventsAfter(lastEventId, {\n send: async (eventId: string, message: JSONRPCMessage) => {\n try {\n await stream.writeSSE({\n id: eventId,\n event: 'message',\n data: JSON.stringify(message),\n })\n } catch {\n this.onerror?.(new Error('Failed replay events'))\n throw new HTTPException(500, {\n message: 'Failed replay events',\n })\n }\n },\n })\n }\n }\n\n // Check if there's already an active standalone SSE stream for this session\n if (typeof streamId === 'string' && this.#streamMapping.get(streamId) !== undefined) {\n // Only one GET SSE stream is allowed per session\n throw new HTTPException(409, {\n res: Response.json({\n jsonrpc: '2.0',\n error: {\n code: -32000,\n message: 'Conflict: Only one SSE stream is allowed per session',\n },\n id: null,\n }),\n })\n }\n\n return streamSSE(ctx, async (stream) => {\n const resolvedStreamId = typeof streamId === 'string' ? streamId : await streamId(stream)\n\n // Keep connection alive\n const keepAlive = setInterval(() => {\n if (!stream.closed) {\n stream.writeSSE({ data: '', event: 'ping' }).catch(() => {\n stream.abort()\n })\n }\n }, 30000)\n\n // Unref the timer to avoid blocking the server from shutting down\n if (typeof keepAlive === 'object' && 'unref' in keepAlive) {\n ;(keepAlive as any).unref()\n }\n\n // Assign the response to the standalone SSE stream\n this.#streamMapping.set(resolvedStreamId, {\n ctx: { header: ctx.header },\n stream,\n cleanup: () => {\n clearInterval(keepAlive)\n this.#streamMapping.delete(resolvedStreamId)\n },\n })\n\n // Set up close handler for client disconnects\n stream.onAbort(() => {\n this.#streamMapping.get(resolvedStreamId)?.cleanup()\n })\n })\n } catch (error) {\n if (error instanceof HTTPException) {\n throw error\n }\n\n this.onerror?.(error as Error)\n\n // return JSON-RPC formatted error\n throw new HTTPException(400, {\n res: Response.json({\n jsonrpc: '2.0',\n error: {\n code: ErrorCode.ParseError,\n message: 'Parse error',\n data: String(error),\n },\n id: null,\n }),\n })\n }\n }\n\n /**\n * Handles POST requests containing JSON-RPC messages\n */\n private async handlePostRequest(ctx: Context, parsedBody?: unknown) {\n try {\n // Validate the Accept header\n const acceptHeader = ctx.req.header('Accept')\n // The client MUST include an Accept header, listing both application/json and text/event-stream as supported content types.\n if (\n !acceptHeader?.includes('application/json') ||\n !acceptHeader.includes('text/event-stream')\n ) {\n throw new HTTPException(406, {\n res: Response.json({\n jsonrpc: '2.0',\n error: {\n code: ErrorCode.ConnectionClosed,\n message:\n 'Not Acceptable: Client must accept both application/json and text/event-stream',\n },\n id: null,\n }),\n })\n }\n\n const ct = ctx.req.header('Content-Type')\n if (!ct?.includes('application/json')) {\n throw new HTTPException(415, {\n res: Response.json({\n jsonrpc: '2.0',\n error: {\n code: ErrorCode.ConnectionClosed,\n message: 'Unsupported Media Type: Content-Type must be application/json',\n },\n id: null,\n }),\n })\n }\n\n const authInfo: AuthInfo | undefined = ctx.get('auth')\n const requestInfo: RequestInfo = { headers: ctx.req.header() }\n\n let rawMessage = parsedBody\n if (rawMessage === undefined) {\n rawMessage = await ctx.req.json()\n }\n\n let messages: JSONRPCMessage[]\n\n // handle batch and single messages\n if (Array.isArray(rawMessage)) {\n messages = rawMessage.map((msg) => JSONRPCMessageSchema.parse(msg))\n } else {\n messages = [JSONRPCMessageSchema.parse(rawMessage)]\n }\n\n // Check if this is an initialization request\n // https://spec.modelcontextprotocol.io/specification/2025-03-26/basic/lifecycle/\n const isInitializationRequest = messages.some(isInitializeRequest)\n if (isInitializationRequest) {\n // If it's a server with session management and the session ID is already set we should reject the request\n // to avoid re-initialization.\n if (this.#initialized && this.sessionId !== undefined) {\n throw new HTTPException(400, {\n res: Response.json({\n jsonrpc: '2.0',\n error: {\n code: ErrorCode.InvalidRequest,\n message: 'Invalid Request: Server already initialized',\n },\n id: null,\n }),\n })\n }\n\n if (messages.length > 1) {\n throw new HTTPException(400, {\n res: Response.json({\n jsonrpc: '2.0',\n error: {\n code: ErrorCode.InvalidRequest,\n message: 'Invalid Request: Only one initialization request is allowed',\n },\n id: null,\n }),\n })\n }\n this.sessionId = this.#sessionIdGenerator?.()\n this.#initialized = true\n\n // If we have a session ID and an onsessioninitialized handler, call it immediately\n // This is needed in cases where the server needs to keep track of multiple sessions\n if (this.sessionId && this.#onSessionInitialized) {\n await this.#onSessionInitialized(this.sessionId)\n }\n }\n\n if (!isInitializationRequest) {\n // If an Mcp-Session-Id is returned by the server during initialization,\n // clients using the Streamable HTTP transport MUST include it\n // in the Mcp-Session-Id header on all of their subsequent HTTP requests.\n this.#validateSession(ctx)\n // Mcp-Protocol-Version header is required for all requests after initialization.\n this.#validateProtocolVersion(ctx)\n }\n\n // check if it contains requests\n const hasRequests = messages.some(isJSONRPCRequest)\n\n if (!hasRequests) {\n // handle each message\n for (const message of messages) {\n this.onmessage?.(message, { authInfo, requestInfo })\n }\n\n // if it only contains notifications or responses, return 202\n return ctx.json(null, { status: 202 })\n }\n\n if (hasRequests) {\n // The default behavior is to use SSE streaming\n // but in some cases server will return JSON responses\n const streamId = crypto.randomUUID()\n\n if (!this.#enableJsonResponse && this.sessionId !== undefined) {\n ctx.header('mcp-session-id', this.sessionId)\n }\n\n if (this.#enableJsonResponse) {\n // Store the response for this request to send messages back through this connection\n // We need to track by request ID to maintain the connection\n const result = await new Promise<Response>((resolve) => {\n for (const message of messages) {\n if (isJSONRPCRequest(message)) {\n this.#streamMapping.set(streamId, {\n ctx: {\n header: ctx.header,\n json: (data) => {\n resolve(ctx.json(data as JSONRPCMessage))\n },\n },\n cleanup: () => {\n this.#streamMapping.delete(streamId)\n },\n })\n this.#requestToStreamMapping.set(message.id, streamId)\n }\n }\n\n // handle each message\n for (const message of messages) {\n this.onmessage?.(message, { authInfo, requestInfo })\n }\n })\n\n return result\n }\n\n return streamSSE(ctx, async (stream) => {\n // Store the response for this request to send messages back through this connection\n // We need to track by request ID to maintain the connection\n for (const message of messages) {\n if (isJSONRPCRequest(message)) {\n this.#streamMapping.set(streamId, {\n ctx: { header: ctx.header },\n stream,\n cleanup: () => {\n this.#streamMapping.delete(streamId)\n },\n })\n this.#requestToStreamMapping.set(message.id, streamId)\n }\n }\n\n // handle each message\n for (const message of messages) {\n this.onmessage?.(message, { authInfo, requestInfo })\n }\n // The server SHOULD NOT close the SSE stream before sending all JSON-RPC responses\n // This will be handled by the send() method when responses are ready\n\n // Set up close handler for client disconnects\n stream.onAbort(() => {\n this.#streamMapping.get(streamId)?.cleanup()\n })\n })\n }\n } catch (error) {\n if (error instanceof HTTPException) {\n throw error\n }\n\n this.onerror?.(error as Error)\n\n // return JSON-RPC formatted error\n throw new HTTPException(400, {\n res: Response.json({\n jsonrpc: '2.0',\n error: {\n code: ErrorCode.ParseError,\n message: 'Parse error',\n data: String(error),\n },\n id: null,\n }),\n })\n }\n }\n\n /**\n * Handles DELETE requests to terminate sessions\n */\n private async handleDeleteRequest(ctx: Context) {\n this.#validateSession(ctx)\n this.#validateProtocolVersion(ctx)\n\n if (this.#onSessionClosed && this.sessionId)\n await Promise.resolve(this.#onSessionClosed(this.sessionId))\n\n await this.close()\n return ctx.body(null, 200)\n }\n\n /**\n * Handles unsupported requests (PUT, PATCH, etc.)\n */\n private handleUnsupportedRequest(ctx: Context) {\n return ctx.json(\n {\n jsonrpc: '2.0',\n error: {\n code: ErrorCode.ConnectionClosed,\n message: 'Method not allowed.',\n },\n id: null,\n },\n {\n status: 405,\n headers: {\n Allow: 'GET, POST, DELETE',\n },\n }\n )\n }\n\n /**\n * Validates session ID for non-initialization requests\n * Returns true if the session is valid, false otherwise\n */\n #validateSession(ctx: Context): boolean {\n if (this.#sessionIdGenerator === undefined) {\n // If the sessionIdGenerator ID is not set, the session management is disabled\n // and we don't need to validate the session ID\n return true\n }\n if (!this.#initialized) {\n // If the server has not been initialized yet, reject all requests\n throw new HTTPException(400, {\n res: Response.json({\n jsonrpc: '2.0',\n error: {\n code: ErrorCode.ConnectionClosed,\n message: 'Bad Request: Server not initialized',\n },\n id: null,\n }),\n })\n }\n\n const sessionId = ctx.req.header('mcp-session-id')\n\n if (!sessionId) {\n // Non-initialization requests without a session ID should return 400 Bad Request\n throw new HTTPException(400, {\n res: Response.json({\n jsonrpc: '2.0',\n error: {\n code: ErrorCode.ConnectionClosed,\n message: 'Bad Request: Mcp-Session-Id header is required',\n },\n id: null,\n }),\n })\n }\n\n if (Array.isArray(sessionId)) {\n throw new HTTPException(400, {\n res: Response.json({\n jsonrpc: '2.0',\n error: {\n code: ErrorCode.ConnectionClosed,\n message: 'Bad Request: Mcp-Session-Id header must be a single value',\n },\n id: null,\n }),\n })\n }\n\n if (sessionId !== this.sessionId) {\n // Reject requests with invalid session ID with 404 Not Found\n throw new HTTPException(404, {\n res: Response.json({\n jsonrpc: '2.0',\n error: {\n code: ErrorCode.RequestTimeout,\n message: 'Session not found',\n },\n id: null,\n }),\n })\n }\n\n return true\n }\n\n #validateProtocolVersion(ctx: Context): boolean {\n let protocolVersion =\n ctx.req.header('mcp-protocol-version') ?? DEFAULT_NEGOTIATED_PROTOCOL_VERSION\n if (Array.isArray(protocolVersion)) {\n protocolVersion = protocolVersion[protocolVersion.length - 1]\n }\n\n if (!SUPPORTED_PROTOCOL_VERSIONS.includes(protocolVersion)) {\n throw new HTTPException(404, {\n res: Response.json({\n jsonrpc: '2.0',\n error: {\n code: ErrorCode.ConnectionClosed,\n message: `Bad Request: Unsupported protocol version (supported versions: ${SUPPORTED_PROTOCOL_VERSIONS.join(', ')})`,\n },\n id: null,\n }),\n })\n }\n return true\n }\n\n async close(): Promise<void> {\n // Close all SSE connections\n\n for (const { stream } of this.#streamMapping.values()) {\n stream?.abort()\n }\n\n this.#streamMapping.clear()\n\n // Clear any pending responses\n this.#requestResponseMap.clear()\n this.onclose?.()\n }\n\n async send(message: JSONRPCMessage, options?: { relatedRequestId?: RequestId }): Promise<void> {\n let requestId = options?.relatedRequestId\n if (isJSONRPCResultResponse(message) || isJSONRPCErrorResponse(message)) {\n // If the message is a response, use the request ID from the message\n requestId = message.id\n }\n\n // Check if this message should be sent on the standalone SSE stream (no request ID)\n // Ignore notifications from tools (which have relatedRequestId set)\n // Those will be sent via dedicated response SSE streams\n if (requestId === undefined) {\n // For standalone SSE streams, we can only send requests and notifications\n if (isJSONRPCResultResponse(message) || isJSONRPCErrorResponse(message)) {\n throw new Error(\n 'Cannot send a response on a standalone SSE stream unless resuming a previous client request'\n )\n }\n const standaloneSse = this.#streamMapping.get(this.#standaloneSseStreamId)\n\n if (standaloneSse === undefined) {\n // The spec says the server MAY send messages on the stream, so it's ok to discard if no stream\n return\n }\n\n // Generate and store event ID if event store is provided\n let eventId: string | undefined\n if (this.#eventStore) {\n // Stores the event and gets the generated event ID\n eventId = await this.#eventStore.storeEvent(this.#standaloneSseStreamId, message)\n }\n\n // Send the message to the standalone SSE stream\n return standaloneSse.stream?.writeSSE({\n id: eventId,\n event: 'message',\n data: JSON.stringify(message),\n })\n }\n\n // Get the response for this request\n const streamId = this.#requestToStreamMapping.get(requestId)\n const response = this.#streamMapping.get(streamId!)\n if (!streamId) {\n throw new Error(`No connection established for request ID: ${String(requestId)}`)\n }\n\n if (!this.#enableJsonResponse) {\n // For SSE responses, generate event ID if event store is provided\n let eventId: string | undefined\n\n if (this.#eventStore) {\n eventId = await this.#eventStore.storeEvent(streamId, message)\n }\n\n if (response) {\n // Write the event to the response stream\n await response.stream?.writeSSE({\n id: eventId,\n event: 'message',\n data: JSON.stringify(message),\n })\n }\n }\n\n if (isJSONRPCResultResponse(message) || isJSONRPCErrorResponse(message)) {\n this.#requestResponseMap.set(requestId, message)\n const relatedIds = Array.from(this.#requestToStreamMapping.entries())\n .filter(([, streamId]) => this.#streamMapping.get(streamId) === response)\n .map(([id]) => id)\n isJSONRPCResultResponse\n // Check if we have responses for all requests using this connection\n const allResponsesReady = relatedIds.every((id) => this.#requestResponseMap.has(id))\n\n if (allResponsesReady) {\n if (!response) {\n throw new Error(`No connection established for request ID: ${String(requestId)}`)\n }\n if (this.#enableJsonResponse) {\n // All responses ready, send as JSON\n if (this.sessionId !== undefined) {\n response.ctx.header('mcp-session-id', this.sessionId)\n }\n\n const responses = relatedIds.map((id) => this.#requestResponseMap.get(id)!)\n\n response.ctx.json?.(responses.length === 1 ? responses[0] : responses)\n return\n } else {\n response.stream?.abort()\n }\n // Clean up\n for (const id of relatedIds) {\n this.#requestResponseMap.delete(id)\n this.#requestToStreamMapping.delete(id)\n }\n }\n }\n }\n}\n","/**\n * @fileoverview Implements the JWT authentication strategy.\n * This module provides a concrete implementation of the AuthStrategy for validating\n * JSON Web Tokens (JWTs). It encapsulates all logic related to JWT verification,\n * including secret key management and payload validation.\n * @module src/mcp-server/transports/auth/strategies/JwtStrategy\n */\nimport { jwtVerify } from 'jose';\nimport { injectable, inject } from 'tsyringe';\n\nimport { config as ConfigType } from '@/config/index.js';\nimport { AppConfig, Logger } from '@/container/tokens.js';\nimport { JsonRpcErrorCode, McpError } from '@/types-global/errors.js';\nimport {\n ErrorHandler,\n logger as LoggerType,\n requestContextService,\n} from '@/utils/index.js';\nimport type { AuthInfo } from '@/mcp-server/transports/auth/lib/authTypes.js';\nimport type { AuthStrategy } from '@/mcp-server/transports/auth/strategies/authStrategy.js';\n\n@injectable()\nexport class JwtStrategy implements AuthStrategy {\n private readonly secretKey: Uint8Array | null;\n private readonly env: string;\n private readonly devMcpClientId: string;\n private readonly devMcpScopes: string[];\n\n constructor(\n @inject(AppConfig) private config: typeof ConfigType,\n @inject(Logger) private logger: typeof LoggerType,\n ) {\n const context = requestContextService.createRequestContext({\n operation: 'JwtStrategy.constructor',\n });\n this.logger.debug('Initializing JwtStrategy...', context);\n this.env = this.config.environment;\n this.devMcpClientId = this.config.devMcpClientId || 'dev-client-id';\n this.devMcpScopes = this.config.devMcpScopes || ['dev-scope'];\n const secretKey = this.config.mcpAuthSecretKey;\n\n if (this.env === 'production' && !secretKey) {\n this.logger.fatal(\n 'CRITICAL: MCP_AUTH_SECRET_KEY is not set in production for JWT auth.',\n context,\n );\n throw new McpError(\n JsonRpcErrorCode.ConfigurationError,\n 'MCP_AUTH_SECRET_KEY must be set for JWT auth in production.',\n context,\n );\n } else if (!secretKey) {\n this.logger.warning(\n 'MCP_AUTH_SECRET_KEY is not set. JWT auth will be bypassed (DEV ONLY).',\n context,\n );\n this.secretKey = null;\n } else {\n this.logger.info('JWT secret key loaded successfully.', context);\n this.secretKey = new TextEncoder().encode(secretKey);\n }\n }\n\n async verify(token: string): Promise<AuthInfo> {\n const context = requestContextService.createRequestContext({\n operation: 'JwtStrategy.verify',\n });\n this.logger.debug('Attempting to verify JWT.', context);\n\n // Handle development mode bypass\n if (!this.secretKey) {\n if (this.env !== 'production') {\n this.logger.warning(\n 'Bypassing JWT verification: No secret key (DEV ONLY).',\n context,\n );\n return {\n token: 'dev-mode-placeholder-token',\n clientId: this.devMcpClientId,\n scopes: this.devMcpScopes,\n };\n }\n // This path is defensive. The constructor should prevent this state in production.\n this.logger.crit('Auth secret key is missing in production.', context);\n throw new McpError(\n JsonRpcErrorCode.ConfigurationError,\n 'Auth secret key is missing in production. This indicates a server configuration error.',\n context,\n );\n }\n\n try {\n const { payload: decoded } = await jwtVerify(token, this.secretKey);\n this.logger.debug('JWT signature verified successfully.', {\n ...context,\n claims: decoded,\n });\n\n const clientId =\n typeof decoded.cid === 'string'\n ? decoded.cid\n : typeof decoded.client_id === 'string'\n ? decoded.client_id\n : undefined;\n\n if (!clientId) {\n this.logger.warning(\n \"Invalid token: missing 'cid' or 'client_id' claim.\",\n context,\n );\n throw new McpError(\n JsonRpcErrorCode.Unauthorized,\n \"Invalid token: missing 'cid' or 'client_id' claim.\",\n context,\n );\n }\n\n let scopes: string[] = [];\n if (\n Array.isArray(decoded.scp) &&\n decoded.scp.every((s) => typeof s === 'string')\n ) {\n scopes = decoded.scp;\n } else if (typeof decoded.scope === 'string' && decoded.scope.trim()) {\n scopes = decoded.scope.split(' ').filter(Boolean);\n }\n\n if (scopes.length === 0) {\n this.logger.warning(\n \"Invalid token: missing or empty 'scp' or 'scope' claim.\",\n context,\n );\n throw new McpError(\n JsonRpcErrorCode.Unauthorized,\n 'Token must contain valid, non-empty scopes.',\n context,\n );\n }\n\n const tenantId =\n typeof decoded.tid === 'string' ? decoded.tid : undefined;\n\n const authInfo: AuthInfo = {\n token,\n clientId,\n scopes,\n ...(decoded.sub && { subject: decoded.sub }),\n ...(tenantId && { tenantId }),\n };\n this.logger.info('JWT verification successful.', {\n ...context,\n clientId,\n scopes,\n ...(tenantId ? { tenantId } : {}),\n });\n return authInfo;\n } catch (error: unknown) {\n // If the error is already a structured McpError, re-throw it directly.\n if (error instanceof McpError) {\n throw error;\n }\n\n const message =\n error instanceof Error && error.name === 'JWTExpired'\n ? 'Token has expired.'\n : 'Token verification failed.';\n\n this.logger.warning(`JWT verification failed: ${message}`, {\n ...context,\n errorName: error instanceof Error ? error.name : 'Unknown',\n });\n\n throw ErrorHandler.handleError(error, {\n operation: 'JwtStrategy.verify',\n context,\n rethrow: true,\n errorCode: JsonRpcErrorCode.Unauthorized,\n errorMapper: () =>\n new McpError(JsonRpcErrorCode.Unauthorized, message, context),\n });\n }\n }\n}\n","/**\n * @fileoverview Implements the OAuth 2.1 authentication strategy.\n * This module provides a concrete implementation of the AuthStrategy for validating\n * JWTs against a remote JSON Web Key Set (JWKS), as is common in OAuth 2.1 flows.\n * @module src/mcp-server/transports/auth/strategies/OauthStrategy\n */\nimport { type JWTVerifyResult, createRemoteJWKSet, jwtVerify } from 'jose';\nimport { inject, injectable } from 'tsyringe';\n\nimport { type config as ConfigType } from '@/config/index.js';\nimport { AppConfig, Logger } from '@/container/tokens.js';\nimport type { AuthInfo } from '@/mcp-server/transports/auth/lib/authTypes.js';\nimport type { AuthStrategy } from '@/mcp-server/transports/auth/strategies/authStrategy.js';\nimport { JsonRpcErrorCode, McpError } from '@/types-global/errors.js';\nimport {\n ErrorHandler,\n type logger as LoggerType,\n requestContextService,\n} from '@/utils/index.js';\n\n@injectable()\nexport class OauthStrategy implements AuthStrategy {\n private readonly jwks: ReturnType<typeof createRemoteJWKSet>;\n\n constructor(\n @inject(AppConfig) private config: typeof ConfigType,\n @inject(Logger) private logger: typeof LoggerType,\n ) {\n const context = requestContextService.createRequestContext({\n operation: 'OauthStrategy.constructor',\n });\n this.logger.debug('Initializing OauthStrategy...', context);\n\n if (this.config.mcpAuthMode !== 'oauth') {\n // This check is for internal consistency, so a standard Error is acceptable here.\n throw new Error('OauthStrategy instantiated for non-oauth auth mode.');\n }\n if (!this.config.oauthIssuerUrl || !this.config.oauthAudience) {\n this.logger.fatal(\n 'CRITICAL: OAUTH_ISSUER_URL and OAUTH_AUDIENCE must be set for OAuth mode.',\n context,\n );\n // This is a user-facing configuration error, so McpError is appropriate.\n throw new McpError(\n JsonRpcErrorCode.ConfigurationError,\n 'OAUTH_ISSUER_URL and OAUTH_AUDIENCE must be set for OAuth mode.',\n context,\n );\n }\n\n try {\n const jwksUrl = new URL(\n this.config.oauthJwksUri ||\n `${this.config.oauthIssuerUrl.replace(\n /\\/$/,\n '',\n )}/.well-known/jwks.json`,\n );\n this.jwks = createRemoteJWKSet(jwksUrl, {\n cooldownDuration: this.config.oauthJwksCooldownMs,\n timeoutDuration: this.config.oauthJwksTimeoutMs,\n });\n this.logger.info(\n `JWKS client initialized for URL: ${jwksUrl.href}`,\n context,\n );\n } catch (error: unknown) {\n this.logger.fatal('Failed to initialize JWKS client.', {\n ...context,\n error: error instanceof Error ? error.message : String(error),\n });\n // This is a critical startup failure, so a specific McpError is warranted.\n throw new McpError(\n JsonRpcErrorCode.ServiceUnavailable,\n 'Could not initialize JWKS client for OAuth strategy.',\n {\n ...context,\n originalError: error instanceof Error ? error.message : 'Unknown',\n },\n );\n }\n }\n\n async verify(token: string): Promise<AuthInfo> {\n const context = requestContextService.createRequestContext({\n operation: 'OauthStrategy.verify',\n });\n this.logger.debug('Attempting to verify OAuth token via JWKS.', context);\n\n try {\n const { payload }: JWTVerifyResult = await jwtVerify(token, this.jwks, {\n issuer: this.config.oauthIssuerUrl!,\n audience: this.config.oauthAudience!,\n });\n this.logger.debug('OAuth token signature verified successfully.', {\n ...context,\n claims: payload,\n });\n\n // RFC 8707 Resource Indicators validation (MCP 2025-06-18 requirement)\n // Validate that the token was issued for this specific MCP server\n if (this.config.mcpServerResourceIdentifier) {\n const resourceClaim = payload.resource || payload.aud;\n const expectedResource = this.config.mcpServerResourceIdentifier;\n\n const isResourceValid =\n (Array.isArray(resourceClaim) &&\n resourceClaim.includes(expectedResource)) ||\n resourceClaim === expectedResource;\n\n if (!isResourceValid) {\n this.logger.warning(\n 'Token resource indicator mismatch. Token was not issued for this MCP server.',\n {\n ...context,\n expected: expectedResource,\n received: resourceClaim,\n },\n );\n throw new McpError(\n JsonRpcErrorCode.Forbidden,\n 'Token was not issued for this MCP server. Resource indicator mismatch.',\n {\n expected: expectedResource,\n received: resourceClaim,\n },\n );\n }\n\n this.logger.debug(\n 'RFC 8707 resource indicator validated successfully.',\n {\n ...context,\n resource: expectedResource,\n },\n );\n }\n\n const scopes =\n typeof payload.scope === 'string' ? payload.scope.split(' ') : [];\n if (scopes.length === 0) {\n this.logger.warning(\n \"Invalid token: missing or empty 'scope' claim.\",\n context,\n );\n throw new McpError(\n JsonRpcErrorCode.Unauthorized,\n 'Token must contain valid, non-empty scopes.',\n context,\n );\n }\n\n const clientId =\n typeof payload.client_id === 'string' ? payload.client_id : undefined;\n if (!clientId) {\n this.logger.warning(\n \"Invalid token: missing 'client_id' claim.\",\n context,\n );\n throw new McpError(\n JsonRpcErrorCode.Unauthorized,\n \"Token must contain a 'client_id' claim.\",\n context,\n );\n }\n\n const subject = typeof payload.sub === 'string' ? payload.sub : undefined;\n const tenantId =\n typeof payload.tid === 'string' ? payload.tid : undefined;\n const authInfo: AuthInfo = {\n token,\n clientId,\n scopes,\n ...(subject && { subject }),\n ...(tenantId && { tenantId }),\n };\n this.logger.info('OAuth token verification successful.', {\n ...context,\n clientId,\n scopes,\n ...(tenantId ? { tenantId } : {}),\n });\n return authInfo;\n } catch (error: unknown) {\n // If the error is already a structured McpError, re-throw it directly.\n if (error instanceof McpError) {\n throw error;\n }\n\n const message =\n error instanceof Error && error.name === 'JWTExpired'\n ? 'Token has expired.'\n : 'OAuth token verification failed.';\n\n this.logger.warning(`OAuth token verification failed: ${message}`, {\n ...context,\n errorName: error instanceof Error ? error.name : 'Unknown',\n });\n\n // For all other errors, use the ErrorHandler to wrap them.\n throw ErrorHandler.handleError(error, {\n operation: 'OauthStrategy.verify',\n context,\n rethrow: true,\n errorCode: JsonRpcErrorCode.Unauthorized,\n errorMapper: () =>\n new McpError(JsonRpcErrorCode.Unauthorized, message, context),\n });\n }\n }\n}\n","/**\n * @fileoverview Factory for creating an authentication strategy based on configuration.\n * This module centralizes the logic for selecting and instantiating the correct\n * authentication strategy, promoting loose coupling and easy extensibility.\n * @module src/mcp-server/transports/auth/authFactory\n */\nimport { container } from 'tsyringe';\n\nimport { config } from '@/config/index.js';\nimport { logger, requestContextService } from '@/utils/index.js';\nimport type { AuthStrategy } from '@/mcp-server/transports/auth/strategies/authStrategy.js';\nimport { JwtStrategy } from '@/mcp-server/transports/auth/strategies/jwtStrategy.js';\nimport { OauthStrategy } from '@/mcp-server/transports/auth/strategies/oauthStrategy.js';\n\n// Register strategies in the container.\n// The container will manage their lifecycle and dependencies.\ncontainer.register(JwtStrategy, { useClass: JwtStrategy });\ncontainer.register(OauthStrategy, { useClass: OauthStrategy });\n\n/**\n * Creates and returns an authentication strategy instance based on the\n * application's configuration (`config.mcpAuthMode`).\n *\n * @returns An instance of a class that implements the `AuthStrategy` interface,\n * or `null` if authentication is disabled (`none`).\n * @throws {Error} If the auth mode is unknown or misconfigured.\n */\nexport function createAuthStrategy(): AuthStrategy | null {\n const context = requestContextService.createRequestContext({\n operation: 'createAuthStrategy',\n authMode: config.mcpAuthMode,\n });\n logger.info('Creating authentication strategy...', context);\n\n switch (config.mcpAuthMode) {\n case 'jwt':\n logger.debug('Resolving JWT strategy from container.', context);\n return container.resolve(JwtStrategy);\n case 'oauth':\n logger.debug('Resolving OAuth strategy from container.', context);\n return container.resolve(OauthStrategy);\n case 'none':\n logger.info(\"Authentication is disabled ('none' mode).\", context);\n return null; // No authentication\n default:\n // This ensures that if a new auth mode is added to the config type\n // but not to this factory, we get a compile-time or runtime error.\n logger.error(\n `Unknown authentication mode: ${String(config.mcpAuthMode)}`,\n context,\n );\n throw new Error(\n `Unknown authentication mode: ${String(config.mcpAuthMode)}`,\n );\n }\n}\n","/**\n * @fileoverview Defines a unified Hono middleware for authentication.\n * This middleware is strategy-agnostic. It extracts a Bearer token,\n * delegates verification to the provided authentication strategy, and\n * populates the async-local storage context with the resulting auth info.\n * @module src/mcp-server/transports/auth/authMiddleware\n */\nimport { trace } from '@opentelemetry/api';\nimport type { HttpBindings } from '@hono/node-server';\nimport type { Context, MiddlewareHandler, Next } from 'hono';\n\nimport { JsonRpcErrorCode, McpError } from '@/types-global/errors.js';\nimport { ErrorHandler, logger, requestContextService } from '@/utils/index.js';\nimport { authContext } from '@/mcp-server/transports/auth/lib/authContext.js';\nimport type { AuthStrategy } from '@/mcp-server/transports/auth/strategies/authStrategy.js';\n\n/**\n * Creates a Hono middleware function that enforces authentication using a given strategy.\n *\n * @param strategy - An instance of a class that implements the `AuthStrategy` interface.\n * @returns A Hono middleware function.\n */\nexport function createAuthMiddleware(\n strategy: AuthStrategy,\n): MiddlewareHandler<{ Bindings: HttpBindings }> {\n return async function authMiddleware(\n c: Context<{ Bindings: HttpBindings }>,\n next: Next,\n ) {\n const context = requestContextService.createRequestContext({\n operation: 'authMiddleware',\n additionalContext: {\n method: c.req.method,\n path: c.req.path,\n },\n });\n\n logger.debug('Initiating authentication check.', context);\n\n const authHeader = c.req.header('Authorization');\n if (!authHeader || !authHeader.startsWith('Bearer ')) {\n logger.warning('Authorization header missing or invalid.', context);\n throw new McpError(\n JsonRpcErrorCode.Unauthorized,\n 'Missing or invalid Authorization header. Bearer scheme required.',\n context,\n );\n }\n\n const token = authHeader.substring(7);\n if (!token) {\n logger.warning(\n 'Bearer token is missing from Authorization header.',\n context,\n );\n throw new McpError(\n JsonRpcErrorCode.Unauthorized,\n 'Authentication token is missing.',\n context,\n );\n }\n\n logger.debug(\n 'Extracted Bearer token, proceeding to verification.',\n context,\n );\n\n try {\n const authInfo = await strategy.verify(token);\n\n const authLogContext = {\n ...context,\n ...(authInfo.tenantId ? { tenantId: authInfo.tenantId } : {}),\n clientId: authInfo.clientId,\n subject: authInfo.subject,\n scopes: authInfo.scopes,\n };\n logger.info(\n 'Authentication successful. Auth context populated.',\n authLogContext,\n );\n\n // Add authentication context to OpenTelemetry span for distributed tracing\n const activeSpan = trace.getActiveSpan();\n if (activeSpan) {\n activeSpan.setAttributes({\n 'auth.client_id': authInfo.clientId,\n 'auth.tenant_id': authInfo.tenantId ?? 'none',\n 'auth.scopes': authInfo.scopes.join(','),\n 'auth.subject': authInfo.subject ?? 'unknown',\n 'auth.method': 'bearer',\n });\n logger.debug('Added auth context to OpenTelemetry span', {\n ...authLogContext,\n spanId: activeSpan.spanContext().spanId,\n });\n }\n\n // Run the next middleware in the chain within the populated auth context.\n await authContext.run({ authInfo }, next);\n } catch (error: unknown) {\n // The strategy is expected to throw an McpError.\n // We re-throw it here to be caught by the global httpErrorHandler.\n logger.warning('Authentication verification failed.', {\n ...context,\n error: error instanceof Error ? error.message : String(error),\n });\n\n // Ensure consistent error handling\n throw ErrorHandler.handleError(error, {\n operation: 'authMiddlewareVerification',\n context,\n rethrow: true, // Rethrow to be caught by Hono's global error handler\n errorCode: JsonRpcErrorCode.Unauthorized, // Default to unauthorized if not more specific\n });\n }\n };\n}\n","/**\n * @fileoverview Centralized error handler for the Hono HTTP transport.\n * This middleware intercepts errors that occur during request processing,\n * standardizes them using the application's ErrorHandler utility, and\n * formats them into a consistent JSON-RPC error response.\n * @module src/mcp-server/transports/http/httpErrorHandler\n */\nimport type { Context } from 'hono';\nimport type { StatusCode } from 'hono/utils/http-status';\n\nimport { config } from '@/config/index.js';\nimport type { HonoNodeBindings } from '@/mcp-server/transports/http/httpTypes.js';\nimport { JsonRpcErrorCode, McpError } from '@/types-global/errors.js';\nimport {\n ErrorHandler,\n logger,\n requestContextService,\n getProperty,\n} from '@/utils/index.js';\n\n/**\n * A centralized error handling middleware for Hono.\n * This function is registered with `app.onError()` and will catch any errors\n * thrown from preceding middleware or route handlers.\n *\n * Generic to support different binding types (Node.js, Cloudflare Workers, etc).\n *\n * @template TBindings - The Hono binding type (defaults to HonoNodeBindings)\n * @param err - The error that was thrown.\n * @param c - The Hono context object for the request.\n * @returns A Response object containing the formatted JSON-RPC error.\n */\nexport const httpErrorHandler = async <\n TBindings extends object = HonoNodeBindings,\n>(\n err: Error,\n c: Context<{ Bindings: TBindings }>,\n): Promise<Response> => {\n const context = requestContextService.createRequestContext({\n operation: 'httpErrorHandler',\n additionalContext: {\n path: c.req.path,\n method: c.req.method,\n },\n });\n logger.debug('HTTP error handler invoked.', context);\n\n const handledError = ErrorHandler.handleError(err, {\n operation: 'httpTransport',\n context,\n });\n\n let status: StatusCode = 500;\n if (handledError instanceof McpError) {\n switch (handledError.code) {\n case JsonRpcErrorCode.NotFound:\n status = 404;\n break;\n case JsonRpcErrorCode.Unauthorized:\n status = 401;\n // MCP Spec 2025-06-18: Add WWW-Authenticate header per RFC 9728 Section 5.1\n // https://datatracker.ietf.org/doc/html/rfc9728#section-5.1\n if (config.oauthIssuerUrl) {\n const origin = new URL(c.req.url).origin;\n const resourceMetadataUrl = `${origin}/.well-known/oauth-protected-resource`;\n\n // Build WWW-Authenticate header per RFC 9728\n const wwwAuthValue = [\n `Bearer realm=\"${config.mcpServerName}\"`,\n `resource_metadata=\"${resourceMetadataUrl}\"`,\n ].join(', ');\n\n c.header('WWW-Authenticate', wwwAuthValue);\n\n logger.debug('Added WWW-Authenticate header for 401 response', {\n ...context,\n resourceMetadataUrl,\n });\n }\n break;\n case JsonRpcErrorCode.Forbidden:\n status = 403;\n break;\n case JsonRpcErrorCode.ValidationError:\n case JsonRpcErrorCode.InvalidRequest:\n status = 400;\n break;\n case JsonRpcErrorCode.Conflict:\n status = 409;\n break;\n case JsonRpcErrorCode.RateLimited:\n status = 429;\n break;\n default:\n status = 500;\n }\n }\n logger.debug(`Mapping error to HTTP status ${status}.`, {\n ...context,\n status,\n errorCode: (handledError as McpError).code,\n });\n\n // Attempt to get the request ID from the body, but don't fail if it's not there or unreadable.\n let requestId: string | number | null = null;\n // Only attempt to read the body if it hasn't been consumed already.\n if (c.req.raw.bodyUsed === false) {\n try {\n const body: unknown = await c.req.json();\n const id = getProperty(body, 'id');\n requestId = typeof id === 'string' || typeof id === 'number' ? id : null;\n logger.debug('Extracted JSON-RPC request ID from body.', {\n ...context,\n jsonRpcId: requestId,\n });\n } catch {\n logger.warning(\n 'Could not parse request body to extract JSON-RPC ID.',\n context,\n );\n // Ignore parsing errors, requestId will remain null\n }\n } else {\n logger.debug(\n 'Request body already consumed, cannot extract JSON-RPC ID.',\n context,\n );\n }\n\n const errorCode =\n handledError instanceof McpError ? handledError.code : -32603;\n\n c.status(status);\n const errorResponse = {\n jsonrpc: '2.0',\n error: {\n code: errorCode,\n message: handledError.message,\n },\n id: requestId,\n };\n logger.info(`Sending formatted error response for request.`, {\n ...context,\n status,\n errorCode,\n jsonRpcId: requestId,\n });\n return c.json(errorResponse);\n};\n","/**\n * @fileoverview Utilities for generating and validating cryptographically secure session IDs.\n * @module src/mcp-server/transports/http/sessionIdUtils\n */\nimport { randomBytes } from 'crypto';\n\nimport { runtimeCaps } from '@/utils/internal/runtime.js';\n\n/**\n * Generates a cryptographically secure session ID.\n *\n * Uses 32 bytes (256 bits) of entropy, which provides sufficient security\n * for session identification per OWASP guidelines.\n *\n * @returns A 64-character hexadecimal session ID\n *\n * @example\n * ```typescript\n * const sessionId = generateSecureSessionId();\n * // Returns: \"a1b2c3d4e5f6...048\" (64 hex characters)\n * ```\n */\nexport function generateSecureSessionId(): string {\n if (runtimeCaps.isNode && runtimeCaps.hasBuffer) {\n // Node.js environment - use crypto.randomBytes\n const bytes = randomBytes(32); // 256 bits\n return bytes.toString('hex');\n } else {\n // Worker/Browser environment - use Web Crypto API\n const bytes = new Uint8Array(32);\n crypto.getRandomValues(bytes);\n return Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');\n }\n}\n\n/**\n * Validates a session ID format.\n *\n * Session IDs must be exactly 64 hexadecimal characters (representing 32 bytes).\n * This validation helps prevent injection attacks and ensures consistency.\n *\n * @param sessionId - The session ID to validate\n * @returns True if the session ID has a valid format, false otherwise\n *\n * @example\n * ```typescript\n * validateSessionIdFormat('abc123'); // false - too short\n * validateSessionIdFormat('g1h2...'); // false - invalid hex\n * validateSessionIdFormat('a1b2c3...048'); // true - 64 hex chars\n * ```\n */\nexport function validateSessionIdFormat(sessionId: string): boolean {\n // Must be exactly 64 hexadecimal characters (32 bytes)\n return /^[a-f0-9]{64}$/.test(sessionId);\n}\n","/**\n * @fileoverview Simple in-memory session store for MCP HTTP transport.\n * Implements session management as per MCP Spec 2025-06-18.\n * @see {@link https://modelcontextprotocol.io/specification/2025-06-18/basic/transports#session-management | MCP Session Management}\n * @module src/mcp-server/transports/http/sessionStore\n */\n\nimport { validateSessionIdFormat } from '@/mcp-server/transports/http/sessionIdUtils.js';\nimport { JsonRpcErrorCode, McpError } from '@/types-global/errors.js';\nimport { logger, requestContextService } from '@/utils/index.js';\n\n/**\n * Identity information for binding sessions to authenticated users.\n * Used to prevent session hijacking across tenants/clients.\n */\nexport interface SessionIdentity {\n /** Tenant ID from JWT 'tid' claim */\n tenantId?: string;\n /** Client ID from JWT 'cid'/'client_id' claim */\n clientId?: string;\n /** Subject from JWT 'sub' claim */\n subject?: string;\n}\n\n/**\n * Represents a stateful MCP session with identity binding.\n * Sessions are bound to the authenticated identity to prevent hijacking.\n */\ninterface Session {\n id: string;\n createdAt: Date;\n lastAccessedAt: Date;\n\n // Identity binding for security\n tenantId?: string;\n clientId?: string;\n subject?: string;\n}\n\n/**\n * Simple in-memory session store for stateful MCP sessions.\n * In production, consider using Redis or another persistent store.\n */\nexport class SessionStore {\n private sessions: Map<string, Session> = new Map();\n private staleTimeout: number;\n\n constructor(staleTimeoutMs: number) {\n this.staleTimeout = staleTimeoutMs;\n // Clean up stale sessions every minute\n setInterval(() => this.cleanupStaleSessions(), 60_000);\n }\n\n /**\n * Creates or retrieves a session with optional identity binding.\n * If identity is provided, binds the session to prevent cross-tenant/client hijacking.\n *\n * @param sessionId - The session identifier\n * @param identity - Optional identity info (tenantId, clientId, subject)\n * @returns The session object\n * @throws {McpError} If session ID format is invalid\n */\n getOrCreate(sessionId: string, identity?: SessionIdentity): Session {\n // Validate session ID format to prevent injection attacks\n if (!validateSessionIdFormat(sessionId)) {\n const context = requestContextService.createRequestContext({\n operation: 'SessionStore.getOrCreate',\n sessionIdPrefix: sessionId.substring(0, 16),\n });\n logger.warning('Invalid session ID format rejected', context);\n throw new McpError(\n JsonRpcErrorCode.InvalidParams,\n 'Invalid session ID format. Session IDs must be 64 hexadecimal characters.',\n context,\n );\n }\n\n let session = this.sessions.get(sessionId);\n\n if (!session) {\n // Build session object conditionally to satisfy exactOptionalPropertyTypes\n const newSession: Session = {\n id: sessionId,\n createdAt: new Date(),\n lastAccessedAt: new Date(),\n };\n\n // Only set identity fields if they have actual values (not undefined)\n if (identity?.tenantId) newSession.tenantId = identity.tenantId;\n if (identity?.clientId) newSession.clientId = identity.clientId;\n if (identity?.subject) newSession.subject = identity.subject;\n\n session = newSession;\n this.sessions.set(sessionId, session);\n const context = requestContextService.createRequestContext({\n operation: 'SessionStore.create',\n sessionId,\n tenantId: identity?.tenantId,\n });\n logger.debug('Session created with identity binding', context);\n } else {\n session.lastAccessedAt = new Date();\n\n // Bind identity on first authenticated request (lazy binding)\n // This handles sessions created before authentication\n if (identity && !session.tenantId) {\n if (identity.tenantId) session.tenantId = identity.tenantId;\n if (identity.clientId) session.clientId = identity.clientId;\n if (identity.subject) session.subject = identity.subject;\n const context = requestContextService.createRequestContext({\n operation: 'SessionStore.bindIdentity',\n sessionId,\n tenantId: identity.tenantId,\n });\n logger.debug(\n 'Session identity bound on authenticated request',\n context,\n );\n }\n }\n\n return session;\n }\n\n /**\n * Validates a session with identity binding checks.\n * Prevents session hijacking by verifying the session belongs to the requesting identity.\n *\n * Security checks:\n * 1. Session existence\n * 2. Staleness timeout\n * 3. Tenant ID match (if session has tenantId)\n * 4. Client ID match (if session has clientId)\n *\n * @param sessionId - The session identifier\n * @param identity - The identity to validate against (from auth)\n * @returns True if session is valid and matches identity\n */\n isValidForIdentity(sessionId: string, identity?: SessionIdentity): boolean {\n const session = this.sessions.get(sessionId);\n if (!session) {\n return false;\n }\n\n // Check staleness\n const isStale =\n Date.now() - session.lastAccessedAt.getTime() > this.staleTimeout;\n if (isStale) {\n this.terminate(sessionId);\n return false;\n }\n\n // If session has no identity bound, allow (backwards compatibility / no-auth mode)\n if (!session.tenantId && !session.clientId) {\n return true;\n }\n\n // If request has no identity but session does, reject (security: session was authenticated)\n if (!identity) {\n const context = requestContextService.createRequestContext({\n operation: 'SessionStore.isValidForIdentity',\n sessionId,\n });\n logger.warning(\n 'Session requires authentication but request has no identity',\n context,\n );\n return false;\n }\n\n // Verify tenant ID match\n if (session.tenantId && identity.tenantId) {\n if (session.tenantId !== identity.tenantId) {\n const context = requestContextService.createRequestContext({\n operation: 'SessionStore.isValidForIdentity',\n sessionId,\n });\n logger.warning('Session tenant mismatch - possible hijacking attempt', {\n ...context,\n sessionTenant: session.tenantId,\n requestTenant: identity.tenantId,\n });\n return false;\n }\n }\n\n // Verify client ID match\n if (session.clientId && identity.clientId) {\n if (session.clientId !== identity.clientId) {\n const context = requestContextService.createRequestContext({\n operation: 'SessionStore.isValidForIdentity',\n sessionId,\n });\n logger.warning('Session client mismatch - possible hijacking attempt', {\n ...context,\n sessionClient: session.clientId,\n requestClient: identity.clientId,\n });\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Terminates a session.\n * @param sessionId - The session identifier\n */\n terminate(sessionId: string): void {\n const deleted = this.sessions.delete(sessionId);\n if (deleted) {\n const context = requestContextService.createRequestContext({\n operation: 'SessionStore.terminate',\n sessionId,\n });\n logger.info('Session terminated', context);\n }\n }\n\n /**\n * Cleans up stale sessions that haven't been accessed recently.\n */\n private cleanupStaleSessions(): void {\n const now = Date.now();\n let cleanedCount = 0;\n\n for (const [id, session] of this.sessions.entries()) {\n if (now - session.lastAccessedAt.getTime() > this.staleTimeout) {\n this.sessions.delete(id);\n cleanedCount++;\n }\n }\n\n if (cleanedCount > 0) {\n const context = requestContextService.createRequestContext({\n operation: 'SessionStore.cleanup',\n });\n logger.debug('Cleaned up stale sessions', {\n ...context,\n count: cleanedCount,\n });\n }\n }\n\n /**\n * Gets the current number of active sessions.\n * @returns The number of sessions\n */\n getSessionCount(): number {\n return this.sessions.size;\n }\n}\n","/**\n * @fileoverview Configures and starts the HTTP MCP transport using Hono.\n * This implementation uses the official @hono/mcp package for a fully\n * web-standard, platform-agnostic transport layer.\n *\n * Implements MCP Specification 2025-06-18 Streamable HTTP Transport.\n * @see {@link https://modelcontextprotocol.io/specification/2025-06-18/basic/transports#streamable-http | MCP Streamable HTTP Transport}\n * @module src/mcp-server/transports/http/httpTransport\n */\nimport { StreamableHTTPTransport } from '@hono/mcp';\nimport { type ServerType, serve } from '@hono/node-server';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport { html } from 'hono/html';\nimport http from 'http';\nimport { container } from 'tsyringe';\n\nimport { config } from '@/config/index.js';\nimport { FeishuServiceToken } from '@/container/tokens.js';\nimport {\n authContext,\n createAuthMiddleware,\n createAuthStrategy,\n} from '@/mcp-server/transports/auth/index.js';\nimport { httpErrorHandler } from '@/mcp-server/transports/http/httpErrorHandler.js';\nimport type { HonoNodeBindings } from '@/mcp-server/transports/http/httpTypes.js';\nimport { generateSecureSessionId } from '@/mcp-server/transports/http/sessionIdUtils.js';\nimport {\n SessionStore,\n type SessionIdentity,\n} from '@/mcp-server/transports/http/sessionStore.js';\nimport type { FeishuService } from '@/services/feishu/index.js';\nimport {\n type RequestContext,\n logger,\n logStartupBanner,\n} from '@/utils/index.js';\n\n/**\n * Extends the base StreamableHTTPTransport to include a session ID.\n */\nclass McpSessionTransport extends StreamableHTTPTransport {\n public sessionId: string;\n\n constructor(sessionId: string) {\n super();\n this.sessionId = sessionId;\n }\n}\n\n/**\n * Creates a Hono HTTP application for the MCP server.\n *\n * This function is generic and can create apps with different binding types:\n * - Node.js environments use HonoNodeBindings (default)\n * - Cloudflare Workers use CloudflareBindings\n *\n * The function itself doesn't access bindings; they're only used at runtime\n * when the app processes requests in its specific environment.\n *\n * @template TBindings - The Hono binding type (must extend object, defaults to HonoNodeBindings for Node.js)\n * @param mcpServer - The MCP server instance\n * @param parentContext - Parent request context for logging\n * @returns Configured Hono application with the specified binding type\n */\nexport function createHttpApp<TBindings extends object = HonoNodeBindings>(\n mcpServer: McpServer,\n parentContext: RequestContext,\n): Hono<{ Bindings: TBindings }> {\n const app = new Hono<{ Bindings: TBindings }>();\n const transportContext = {\n ...parentContext,\n component: 'HttpTransportSetup',\n };\n\n // Initialize session store for stateful mode\n const sessionStore =\n config.mcpSessionMode === 'stateful'\n ? new SessionStore(config.mcpStatefulSessionStaleTimeoutMs)\n : null;\n\n // CORS (with permissive fallback)\n const allowedOrigin =\n Array.isArray(config.mcpAllowedOrigins) &&\n config.mcpAllowedOrigins.length > 0\n ? config.mcpAllowedOrigins\n : '*';\n\n app.use(\n '*',\n cors({\n origin: allowedOrigin,\n allowMethods: ['GET', 'POST', 'DELETE', 'OPTIONS'],\n allowHeaders: [\n 'Content-Type',\n 'Authorization',\n 'Mcp-Session-Id',\n 'MCP-Protocol-Version',\n ],\n exposeHeaders: ['Mcp-Session-Id'],\n credentials: true,\n }),\n );\n\n // Centralized error handling\n app.onError(httpErrorHandler);\n\n // MCP Spec 2025-06-18: Origin header validation for DNS rebinding protection\n // https://modelcontextprotocol.io/specification/2025-06-18/basic/transports#security-warning\n app.use(config.mcpHttpEndpointPath, async (c, next) => {\n const origin = c.req.header('origin');\n if (origin) {\n const isAllowed =\n allowedOrigin === '*' ||\n (Array.isArray(allowedOrigin) && allowedOrigin.includes(origin));\n\n if (!isAllowed) {\n logger.warning('Rejected request with invalid Origin header', {\n ...transportContext,\n origin,\n allowedOrigins: allowedOrigin,\n });\n return c.json(\n { error: 'Invalid origin. DNS rebinding protection.' },\n 403,\n );\n }\n }\n // Origin is valid or not present, continue\n return await next();\n });\n\n // Health and GET /mcp status remain unprotected for convenience\n app.get('/healthz', (c) => c.json({ status: 'ok' }));\n\n // 飞书 OAuth 授权URL生成端点(用于测试)\n app.get('/oauth/feishu/auth', async (c) => {\n const authContext = {\n ...transportContext,\n operation: 'feishuGenerateAuthUrl',\n };\n\n try {\n const feishuService = container.resolve<FeishuService>(\n FeishuServiceToken as symbol,\n );\n const result = await feishuService.getAuthUrl();\n\n logger.info('生成授权URL成功', {\n ...authContext,\n state: result.state,\n });\n\n return c.html(\n html`<!doctype html>\n <html lang=\"zh-CN\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta\n name=\"viewport\"\n content=\"width=device-width, initial-scale=1.0\"\n />\n <title>飞书授权</title>\n <style>\n body {\n font-family:\n -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,\n sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n margin: 0;\n background: linear-gradient(135deg, #e0f2fe 0%, #b3e5fc 100%);\n }\n .container {\n text-align: center;\n padding: 40px;\n background: white;\n border-radius: 16px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);\n max-width: 500px;\n }\n .icon {\n font-size: 64px;\n margin-bottom: 20px;\n }\n h1 {\n color: #0277bd;\n margin-bottom: 16px;\n }\n p {\n color: #6b7280;\n line-height: 1.6;\n margin-bottom: 24px;\n }\n .auth-button {\n display: inline-block;\n background: #0277bd;\n color: white;\n padding: 12px 24px;\n border-radius: 8px;\n text-decoration: none;\n font-weight: 600;\n transition: background-color 0.2s;\n }\n .auth-button:hover {\n background: #01579b;\n }\n .state-info {\n background: #f0f9ff;\n padding: 16px;\n border-radius: 8px;\n margin-top: 24px;\n font-size: 14px;\n color: #0369a1;\n }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <div class=\"icon\">🔐</div>\n <h1>飞书授权</h1>\n <p>\n 点击下面的按钮完成飞书账号授权,授权后即可使用飞书相关功能。\n </p>\n <a href=\"${result.authUrl}\" class=\"auth-button\">\n 前往飞书授权\n </a>\n <div class=\"state-info\">State: ${result.state}</div>\n </div>\n </body>\n </html>`,\n );\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n logger.error(\n '生成授权URL失败',\n err instanceof Error ? err : new Error(errorMessage),\n authContext,\n );\n\n return c.html(\n html`<!doctype html>\n <html lang=\"zh-CN\">\n <head>\n <meta charset=\"UTF-8\" />\n <title>生成授权URL失败</title>\n </head>\n <body>\n <h1>生成授权URL失败</h1>\n <p>${errorMessage}</p>\n </body>\n </html>`,\n 500,\n );\n }\n });\n\n // 飞书 OAuth 回调路由\n // 处理飞书授权回调,交换授权码获取访问令牌\n app.get('/oauth/feishu/callback', async (c) => {\n const oauthContext = {\n ...transportContext,\n operation: 'feishuOAuthCallback',\n };\n\n const code = c.req.query('code');\n const state = c.req.query('state');\n const error = c.req.query('error');\n const errorDescription = c.req.query('error_description');\n\n logger.debug('收到飞书 OAuth 回调', {\n ...oauthContext,\n hasCode: !!code,\n hasState: !!state,\n hasError: !!error,\n });\n\n // 处理授权错误\n if (error) {\n logger.warning('飞书授权失败', {\n ...oauthContext,\n error,\n errorDescription,\n });\n return c.html(\n html`<!doctype html>\n <html lang=\"zh-CN\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta\n name=\"viewport\"\n content=\"width=device-width, initial-scale=1.0\"\n />\n <title>飞书授权失败</title>\n <style>\n body {\n font-family:\n -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,\n sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n margin: 0;\n background: linear-gradient(135deg, #fee2e2 0%, #fecaca 100%);\n }\n .container {\n text-align: center;\n padding: 40px;\n background: white;\n border-radius: 16px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);\n max-width: 400px;\n }\n .icon {\n font-size: 64px;\n margin-bottom: 20px;\n }\n h1 {\n color: #dc2626;\n margin-bottom: 16px;\n }\n p {\n color: #6b7280;\n line-height: 1.6;\n }\n .error-code {\n background: #fef2f2;\n padding: 12px;\n border-radius: 8px;\n margin-top: 16px;\n font-family: monospace;\n color: #991b1b;\n }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <div class=\"icon\">❌</div>\n <h1>授权失败</h1>\n <p>飞书授权过程中发生错误,请重新尝试。</p>\n <div class=\"error-code\">\n ${errorDescription ?? error ?? '未知错误'}\n </div>\n </div>\n </body>\n </html>`,\n 400,\n );\n }\n\n // 验证必要参数\n if (!code || !state) {\n logger.warning('飞书 OAuth 回调缺少必要参数', {\n ...oauthContext,\n hasCode: !!code,\n hasState: !!state,\n });\n return c.html(\n html`<!doctype html>\n <html lang=\"zh-CN\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta\n name=\"viewport\"\n content=\"width=device-width, initial-scale=1.0\"\n />\n <title>参数错误</title>\n <style>\n body {\n font-family:\n -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,\n sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n margin: 0;\n background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);\n }\n .container {\n text-align: center;\n padding: 40px;\n background: white;\n border-radius: 16px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);\n max-width: 400px;\n }\n .icon {\n font-size: 64px;\n margin-bottom: 20px;\n }\n h1 {\n color: #d97706;\n margin-bottom: 16px;\n }\n p {\n color: #6b7280;\n line-height: 1.6;\n }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <div class=\"icon\">⚠️</div>\n <h1>参数错误</h1>\n <p>授权回调缺少必要参数,请重新发起授权请求。</p>\n </div>\n </body>\n </html>`,\n 400,\n );\n }\n\n try {\n // 获取 FeishuService 并处理回调\n const feishuService = container.resolve<FeishuService>(\n FeishuServiceToken as symbol,\n );\n const result = await feishuService.handleAuthCallback(code, state);\n\n if (!result.success) {\n throw new Error('授权回调处理失败');\n }\n\n logger.info('飞书授权成功', {\n ...oauthContext,\n userName: result.userInfo?.name,\n });\n\n // 返回成功页面\n return c.html(\n html`<!doctype html>\n <html lang=\"zh-CN\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta\n name=\"viewport\"\n content=\"width=device-width, initial-scale=1.0\"\n />\n <title>飞书授权成功</title>\n <style>\n body {\n font-family:\n -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,\n sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n margin: 0;\n background: linear-gradient(135deg, #d1fae5 0%, #a7f3d0 100%);\n }\n .container {\n text-align: center;\n padding: 40px;\n background: white;\n border-radius: 16px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);\n max-width: 400px;\n }\n .icon {\n font-size: 64px;\n margin-bottom: 20px;\n }\n h1 {\n color: #059669;\n margin-bottom: 16px;\n }\n p {\n color: #6b7280;\n line-height: 1.6;\n }\n .user-info {\n background: #f0fdf4;\n padding: 16px;\n border-radius: 8px;\n margin-top: 16px;\n }\n .user-name {\n font-size: 18px;\n font-weight: 600;\n color: #065f46;\n }\n .close-hint {\n margin-top: 24px;\n font-size: 14px;\n color: #9ca3af;\n }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <div class=\"icon\">✅</div>\n <h1>授权成功</h1>\n <p>您已成功授权飞书账号,现在可以使用飞书相关功能了。</p>\n ${result.userInfo\n ? html`<div class=\"user-info\">\n <div class=\"user-name\">\n 欢迎,${result.userInfo.name}!\n </div>\n </div>`\n : ''}\n <p class=\"close-hint\">您可以关闭此页面</p>\n </div>\n </body>\n </html>`,\n );\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n logger.error(\n '飞书授权回调处理失败',\n err instanceof Error ? err : new Error(errorMessage),\n oauthContext,\n );\n\n return c.html(\n html`<!doctype html>\n <html lang=\"zh-CN\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta\n name=\"viewport\"\n content=\"width=device-width, initial-scale=1.0\"\n />\n <title>授权处理失败</title>\n <style>\n body {\n font-family:\n -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,\n sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n margin: 0;\n background: linear-gradient(135deg, #fee2e2 0%, #fecaca 100%);\n }\n .container {\n text-align: center;\n padding: 40px;\n background: white;\n border-radius: 16px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);\n max-width: 400px;\n }\n .icon {\n font-size: 64px;\n margin-bottom: 20px;\n }\n h1 {\n color: #dc2626;\n margin-bottom: 16px;\n }\n p {\n color: #6b7280;\n line-height: 1.6;\n }\n .error-detail {\n background: #fef2f2;\n padding: 12px;\n border-radius: 8px;\n margin-top: 16px;\n font-size: 14px;\n color: #991b1b;\n }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <div class=\"icon\">❌</div>\n <h1>授权处理失败</h1>\n <p>处理授权回调时发生错误,请重新尝试。</p>\n <div class=\"error-detail\">${errorMessage}</div>\n </div>\n </body>\n </html>`,\n 500,\n );\n }\n });\n\n // RFC 9728 Protected Resource Metadata endpoint (MCP 2025-06-18)\n // Must be accessible without authentication for discovery\n // https://datatracker.ietf.org/doc/html/rfc9728\n app.get('/.well-known/oauth-protected-resource', (c) => {\n if (!config.oauthIssuerUrl) {\n logger.debug(\n 'OAuth Protected Resource Metadata requested but OAuth not configured',\n transportContext,\n );\n return c.json(\n { error: 'OAuth not configured on this server' },\n { status: 404 },\n );\n }\n\n const origin = new URL(c.req.url).origin;\n const resourceIdentifier =\n config.mcpServerResourceIdentifier ??\n config.oauthAudience ??\n `${origin}/mcp`;\n\n // Per RFC 9728, this endpoint provides metadata about the protected resource\n const metadata = {\n resource: resourceIdentifier,\n authorization_servers: [config.oauthIssuerUrl],\n bearer_methods_supported: ['header'],\n resource_signing_alg_values_supported: ['RS256', 'ES256', 'PS256'],\n resource_documentation: `${origin}/docs`,\n ...(config.oauthJwksUri && { jwks_uri: config.oauthJwksUri }),\n };\n\n // RFC 9728 recommends caching this metadata\n c.header('Cache-Control', 'public, max-age=3600');\n c.header('Content-Type', 'application/json');\n\n logger.debug('Serving OAuth Protected Resource Metadata', {\n ...transportContext,\n resourceIdentifier,\n });\n\n return c.json(metadata);\n });\n\n app.get(config.mcpHttpEndpointPath, (c) => {\n return c.json({\n status: 'ok',\n server: {\n name: config.mcpServerName,\n version: config.mcpServerVersion,\n description: config.mcpServerDescription,\n environment: config.environment,\n transport: config.mcpTransportType,\n sessionMode: config.mcpSessionMode,\n },\n });\n });\n\n // MCP Spec 2025-06-18: DELETE endpoint for session termination\n // Clients SHOULD send DELETE to explicitly terminate sessions\n // https://modelcontextprotocol.io/specification/2025-06-18/basic/transports#session-management\n app.delete(config.mcpHttpEndpointPath, (c) => {\n const sessionId = c.req.header('mcp-session-id');\n\n if (!sessionId) {\n logger.warning('DELETE request without session ID', transportContext);\n return c.json({ error: 'Mcp-Session-Id header required' }, 400);\n }\n\n logger.info('Session termination requested', {\n ...transportContext,\n sessionId,\n });\n\n // For stateless mode or if session management is disabled, return 405\n if (config.mcpSessionMode === 'stateless' || !sessionStore) {\n return c.json(\n { error: 'Session termination not supported in stateless mode' },\n 405,\n );\n }\n\n // Terminate the session in the store\n sessionStore.terminate(sessionId);\n\n logger.info('Session terminated successfully', {\n ...transportContext,\n sessionId,\n });\n\n return c.json({ status: 'terminated', sessionId }, 200);\n });\n\n // Create auth strategy and middleware if auth is enabled\n const authStrategy = createAuthStrategy();\n if (authStrategy) {\n const authMiddleware = createAuthMiddleware(authStrategy);\n app.use(config.mcpHttpEndpointPath, authMiddleware);\n logger.info(\n 'Authentication middleware enabled for MCP endpoint.',\n transportContext,\n );\n } else {\n logger.info(\n 'Authentication is disabled; MCP endpoint is unprotected.',\n transportContext,\n );\n }\n\n // JSON-RPC over HTTP (Streamable)\n app.all(config.mcpHttpEndpointPath, async (c) => {\n const protocolVersion =\n c.req.header('mcp-protocol-version') ?? '2025-03-26';\n logger.debug('Handling MCP request.', {\n ...transportContext,\n path: c.req.path,\n method: c.req.method,\n protocolVersion,\n });\n\n // Per MCP Spec 2025-06-18: MCP-Protocol-Version header MUST be validated\n // Server MUST respond with 400 Bad Request for unsupported versions\n // We default to 2025-03-26 for backward compatibility if not provided\n const supportedVersions = ['2025-03-26', '2025-06-18'];\n if (!supportedVersions.includes(protocolVersion)) {\n logger.warning('Unsupported MCP protocol version requested.', {\n ...transportContext,\n protocolVersion,\n supportedVersions,\n });\n return c.json(\n {\n error: 'Unsupported MCP protocol version',\n protocolVersion,\n supportedVersions,\n },\n 400,\n );\n }\n\n const providedSessionId = c.req.header('mcp-session-id');\n const sessionId = providedSessionId ?? generateSecureSessionId();\n\n // Extract identity from auth context (if auth is enabled)\n // This MUST happen before session validation for security\n const authStore = authContext.getStore();\n let sessionIdentity: SessionIdentity | undefined;\n if (authStore?.authInfo) {\n // Build identity object conditionally to satisfy exactOptionalPropertyTypes\n sessionIdentity = {};\n if (authStore.authInfo.tenantId)\n sessionIdentity.tenantId = authStore.authInfo.tenantId;\n if (authStore.authInfo.clientId)\n sessionIdentity.clientId = authStore.authInfo.clientId;\n if (authStore.authInfo.subject)\n sessionIdentity.subject = authStore.authInfo.subject;\n }\n\n // MCP Spec 2025-06-18: Return 404 for invalid/terminated sessions\n // https://modelcontextprotocol.io/specification/2025-06-18/basic/transports#session-management\n // SECURITY: Validate session WITH identity binding to prevent hijacking\n if (\n sessionStore &&\n providedSessionId &&\n !sessionStore.isValidForIdentity(providedSessionId, sessionIdentity)\n ) {\n logger.warning(\n 'Session validation failed - invalid or hijacked session',\n {\n ...transportContext,\n sessionId: providedSessionId,\n requestTenant: sessionIdentity?.tenantId,\n requestClient: sessionIdentity?.clientId,\n },\n );\n return c.json({ error: 'Session not found or expired' }, 404);\n }\n\n // Create or update session for stateful mode WITH identity binding\n if (sessionStore) {\n sessionStore.getOrCreate(sessionId, sessionIdentity);\n }\n\n const transport = new McpSessionTransport(sessionId);\n\n const handleRpc = async (): Promise<Response> => {\n await mcpServer.connect(transport);\n const response = await transport.handleRequest(c);\n\n // MCP Spec 2025-06-18: For stateful sessions, return Mcp-Session-Id header\n // in InitializeResponse (and all subsequent responses)\n if (response && config.mcpSessionMode === 'stateful') {\n response.headers.set('Mcp-Session-Id', sessionId);\n logger.debug('Added Mcp-Session-Id header to response', {\n ...transportContext,\n sessionId,\n });\n }\n\n if (response) {\n return response;\n }\n return c.body(null, 204);\n };\n\n // The auth logic is now handled by the middleware. We just need to\n // run the core RPC logic within the async-local-storage context that\n // the middleware has already populated.\n try {\n const store = authContext.getStore();\n if (store) {\n return await authContext.run(store, handleRpc);\n }\n return await handleRpc();\n } catch (err) {\n // Only close transport on error - success path needs to keep it open\n await transport.close?.().catch((closeErr) => {\n logger.warning('Failed to close transport after error', {\n ...transportContext,\n sessionId,\n error:\n closeErr instanceof Error ? closeErr.message : String(closeErr),\n });\n });\n throw err instanceof Error ? err : new Error(String(err));\n }\n });\n\n logger.info('Hono application setup complete.', transportContext);\n return app;\n}\n\nasync function isPortInUse(\n port: number,\n host: string,\n parentContext: RequestContext,\n): Promise<boolean> {\n const context = { ...parentContext, operation: 'isPortInUse', port, host };\n logger.debug(`Checking if port ${port} is in use...`, context);\n return new Promise((resolve) => {\n const tempServer = http.createServer();\n tempServer\n .once('error', (err: NodeJS.ErrnoException) =>\n resolve(err.code === 'EADDRINUSE'),\n )\n .once('listening', () => tempServer.close(() => resolve(false)))\n .listen(port, host);\n });\n}\n\nfunction startHttpServerWithRetry<TBindings extends object = HonoNodeBindings>(\n app: Hono<{ Bindings: TBindings }>,\n initialPort: number,\n host: string,\n maxRetries: number,\n parentContext: RequestContext,\n): Promise<ServerType> {\n const startContext = {\n ...parentContext,\n operation: 'startHttpServerWithRetry',\n };\n logger.info(\n `Attempting to start HTTP server on port ${initialPort} with ${maxRetries} retries.`,\n startContext,\n );\n\n return new Promise((resolve, reject) => {\n const tryBind = (port: number, attempt: number) => {\n if (attempt > maxRetries + 1) {\n const error = new Error(\n `Failed to bind to any port after ${maxRetries} retries.`,\n );\n logger.fatal(error.message, { ...startContext, port, attempt });\n return reject(error);\n }\n\n isPortInUse(port, host, { ...startContext, port, attempt })\n .then((inUse) => {\n if (inUse) {\n logger.warning(`Port ${port} is in use, retrying...`, {\n ...startContext,\n port,\n attempt,\n });\n setTimeout(\n () => tryBind(port + 1, attempt + 1),\n config.mcpHttpPortRetryDelayMs,\n );\n return;\n }\n\n try {\n const serverInstance = serve(\n { fetch: app.fetch, port, hostname: host },\n (info) => {\n const serverAddress = `http://${info.address}:${info.port}${config.mcpHttpEndpointPath}`;\n logger.info(`HTTP transport listening at ${serverAddress}`, {\n ...startContext,\n port,\n address: serverAddress,\n });\n logStartupBanner(\n `\\n🚀 MCP Server running at: ${serverAddress}`,\n 'http',\n );\n },\n );\n resolve(serverInstance);\n } catch (err: unknown) {\n logger.warning(\n `Binding attempt failed for port ${port}, retrying...`,\n { ...startContext, port, attempt, error: String(err) },\n );\n setTimeout(\n () => tryBind(port + 1, attempt + 1),\n config.mcpHttpPortRetryDelayMs,\n );\n }\n })\n .catch((err) =>\n reject(err instanceof Error ? err : new Error(String(err))),\n );\n };\n\n tryBind(initialPort, 1);\n });\n}\n\nexport async function startHttpTransport(\n mcpServer: McpServer,\n parentContext: RequestContext,\n): Promise<ServerType> {\n const transportContext = {\n ...parentContext,\n component: 'HttpTransportStart',\n };\n logger.info('Starting HTTP transport.', transportContext);\n\n const app = createHttpApp(mcpServer, transportContext);\n\n const server = await startHttpServerWithRetry(\n app,\n config.mcpHttpPort,\n config.mcpHttpHost,\n config.mcpHttpMaxPortRetries,\n transportContext,\n );\n\n logger.info('HTTP transport started successfully.', transportContext);\n return server;\n}\n\nexport async function stopHttpTransport(\n server: ServerType,\n parentContext: RequestContext,\n): Promise<void> {\n const operationContext = {\n ...parentContext,\n operation: 'stopHttpTransport',\n transportType: 'Http',\n };\n logger.info('Attempting to stop http transport...', operationContext);\n\n return new Promise((resolve, reject) => {\n server.close((err) => {\n if (err) {\n logger.error('Error closing HTTP server.', err, operationContext);\n return reject(err);\n }\n logger.info('HTTP server closed successfully.', operationContext);\n resolve();\n });\n });\n}\n","/**\n * @fileoverview Streamable HTTP transport implementation using native MCP SDK.\n * This provides SSE support compatible with Kiro and other MCP clients.\n *\n * @module src/mcp-server/transports/http/streamableHttpTransport\n */\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { type ServerType, serve } from '@hono/node-server';\nimport { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport { html } from 'hono/html';\nimport http from 'http';\nimport { container } from 'tsyringe';\nimport { randomUUID } from 'crypto';\nimport type { IncomingMessage, ServerResponse } from 'node:http';\n\nimport { config } from '@/config/index.js';\nimport { FeishuServiceToken } from '@/container/tokens.js';\nimport { httpErrorHandler } from '@/mcp-server/transports/http/httpErrorHandler.js';\nimport type { HonoNodeBindings } from '@/mcp-server/transports/http/httpTypes.js';\nimport type { FeishuService } from '@/services/feishu/index.js';\nimport {\n type RequestContext,\n logger,\n logStartupBanner,\n} from '@/utils/index.js';\n\n/**\n * 创建支持 Streamable HTTP (SSE) 的 Hono 应用\n */\nexport function createStreamableHttpApp<TBindings extends object = HonoNodeBindings>(\n mcpServer: McpServer,\n parentContext: RequestContext,\n): Hono<{ Bindings: TBindings }> {\n const app = new Hono<{ Bindings: TBindings }>();\n const transportContext = {\n ...parentContext,\n component: 'StreamableHttpTransportSetup',\n };\n\n // CORS配置\n const allowedOrigin =\n Array.isArray(config.mcpAllowedOrigins) &&\n config.mcpAllowedOrigins.length > 0\n ? config.mcpAllowedOrigins\n : '*';\n\n app.use(\n '*',\n cors({\n origin: allowedOrigin,\n allowMethods: ['GET', 'POST', 'DELETE', 'OPTIONS'],\n allowHeaders: [\n 'Content-Type',\n 'Authorization',\n 'Mcp-Session-Id',\n 'MCP-Protocol-Version',\n ],\n exposeHeaders: ['Mcp-Session-Id'],\n credentials: true,\n }),\n );\n\n // 错误处理\n app.onError(httpErrorHandler);\n\n // 健康检查\n app.get('/healthz', (c) => c.json({ status: 'ok', transport: 'streamable-http' }));\n\n // 飞书 OAuth 授权URL生成端点\n app.get('/oauth/feishu/auth', async (c) => {\n const authContext = {\n ...transportContext,\n operation: 'feishuGenerateAuthUrl',\n };\n\n try {\n const feishuService = container.resolve<FeishuService>(\n FeishuServiceToken as symbol,\n );\n const result = await feishuService.getAuthUrl();\n\n logger.info('生成授权URL成功', {\n ...authContext,\n state: result.state,\n });\n\n return c.html(\n html`<!doctype html>\n <html lang=\"zh-CN\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>飞书授权</title>\n <style>\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n margin: 0;\n background: linear-gradient(135deg, #e0f2fe 0%, #b3e5fc 100%);\n }\n .container {\n text-align: center;\n padding: 40px;\n background: white;\n border-radius: 16px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);\n max-width: 500px;\n }\n .icon { font-size: 64px; margin-bottom: 20px; }\n h1 { color: #0277bd; margin-bottom: 16px; }\n p { color: #6b7280; line-height: 1.6; margin-bottom: 24px; }\n .auth-button {\n display: inline-block;\n background: #0277bd;\n color: white;\n padding: 12px 24px;\n border-radius: 8px;\n text-decoration: none;\n font-weight: 600;\n transition: background-color 0.2s;\n }\n .auth-button:hover { background: #01579b; }\n .state-info {\n background: #f0f9ff;\n padding: 16px;\n border-radius: 8px;\n margin-top: 24px;\n font-size: 14px;\n color: #0369a1;\n }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <div class=\"icon\">🔐</div>\n <h1>飞书授权</h1>\n <p>点击下面的按钮完成飞书账号授权,授权后即可使用飞书相关功能。</p>\n <a href=\"${result.authUrl}\" class=\"auth-button\">前往飞书授权</a>\n <div class=\"state-info\">State: ${result.state}</div>\n </div>\n </body>\n </html>`,\n );\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n logger.error(\n '生成授权URL失败',\n err instanceof Error ? err : new Error(errorMessage),\n authContext,\n );\n return c.html(html`<h1>生成授权URL失败</h1><p>${errorMessage}</p>`, 500);\n }\n });\n\n // 飞书 OAuth 回调路由\n app.get('/oauth/feishu/callback', async (c) => {\n const oauthContext = {\n ...transportContext,\n operation: 'feishuOAuthCallback',\n };\n\n const code = c.req.query('code');\n const state = c.req.query('state');\n const error = c.req.query('error');\n const errorDescription = c.req.query('error_description');\n\n if (error) {\n logger.warning('飞书授权失败', { ...oauthContext, error, errorDescription });\n return c.html(html`<h1>授权失败</h1><p>${errorDescription ?? error}</p>`, 400);\n }\n\n if (!code || !state) {\n logger.warning('飞书 OAuth 回调缺少必要参数', oauthContext);\n return c.html(html`<h1>参数错误</h1><p>缺少必要参数</p>`, 400);\n }\n\n try {\n const feishuService = container.resolve<FeishuService>(FeishuServiceToken as symbol);\n const result = await feishuService.handleAuthCallback(code, state);\n\n if (!result.success) {\n throw new Error('授权回调处理失败');\n }\n\n logger.info('飞书授权成功', { ...oauthContext, userName: result.userInfo?.name });\n\n return c.html(\n html`<!doctype html>\n <html lang=\"zh-CN\">\n <head>\n <meta charset=\"UTF-8\" />\n <title>飞书授权成功</title>\n <style>\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n margin: 0;\n background: linear-gradient(135deg, #d1fae5 0%, #a7f3d0 100%);\n }\n .container {\n text-align: center;\n padding: 40px;\n background: white;\n border-radius: 16px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);\n max-width: 400px;\n }\n .icon { font-size: 64px; margin-bottom: 20px; }\n h1 { color: #059669; margin-bottom: 16px; }\n p { color: #6b7280; line-height: 1.6; }\n .user-info {\n background: #f0fdf4;\n padding: 16px;\n border-radius: 8px;\n margin-top: 16px;\n }\n .user-name {\n font-size: 18px;\n font-weight: 600;\n color: #065f46;\n }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <div class=\"icon\">✅</div>\n <h1>授权成功</h1>\n <p>您已成功授权飞书账号,现在可以使用飞书相关功能了。</p>\n ${result.userInfo ? html`<div class=\"user-info\"><div class=\"user-name\">欢迎,${result.userInfo.name}!</div></div>` : ''}\n <p style=\"margin-top: 24px; font-size: 14px; color: #9ca3af;\">您可以关闭此页面</p>\n </div>\n </body>\n </html>`,\n );\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n logger.error('飞书授权回调处理失败', err instanceof Error ? err : new Error(errorMessage), oauthContext);\n return c.html(html`<h1>授权处理失败</h1><p>${errorMessage}</p>`, 500);\n }\n });\n\n // 创建传输实例 - 根据配置选择有状态或无状态模式\n const transport = config.mcpSessionMode === 'stateless'\n ? new StreamableHTTPServerTransport()\n : new StreamableHTTPServerTransport({ sessionIdGenerator: () => randomUUID() });\n\n // 连接到MCP服务器\n void mcpServer.connect(transport as any).then(() => {\n logger.info('MCP server connected to Streamable HTTP transport', transportContext);\n }).catch((err) => {\n logger.error(\n 'Failed to connect MCP server to transport',\n err instanceof Error ? err : new Error(String(err)),\n transportContext,\n );\n });\n\n // MCP endpoint - 处理所有 GET 和 POST 请求\n app.all(config.mcpHttpEndpointPath, async (c) => {\n logger.debug('Handling MCP request', {\n ...transportContext,\n method: c.req.method,\n path: c.req.path,\n });\n\n // 获取原始的Node.js请求和响应对象\n const req = (c.env as any)?.incoming as IncomingMessage | undefined;\n const res = (c.env as any)?.outgoing as ServerResponse | undefined;\n\n if (!req || !res) {\n logger.error('Failed to get Node.js request/response objects', transportContext);\n return c.json({ error: 'Internal server error' }, 500);\n }\n\n try {\n // 对于 POST 请求,传递已解析的 body\n const parsedBody = c.req.method === 'POST' ? await c.req.json().catch(() => undefined) : undefined;\n \n // 使用 SDK 的传输处理请求\n await transport.handleRequest(req, res, parsedBody);\n\n // handleRequest 会直接写入响应,不需要返回\n return undefined as any;\n } catch (err) {\n logger.error(\n 'Failed to handle MCP request',\n err instanceof Error ? err : new Error(String(err)),\n transportContext,\n );\n \n // 如果响应还没有发送,返回错误\n if (!res.headersSent) {\n return c.json({ error: 'Failed to handle request' }, 500);\n }\n return undefined as any;\n }\n });\n\n logger.info('Streamable HTTP Hono application setup complete', transportContext);\n return app;\n}\n\nasync function isPortInUse(\n port: number,\n host: string,\n parentContext: RequestContext,\n): Promise<boolean> {\n const context = { ...parentContext, operation: 'isPortInUse', port, host };\n logger.debug(`Checking if port ${port} is in use...`, context);\n return new Promise((resolve) => {\n const tempServer = http.createServer();\n tempServer\n .once('error', (err: NodeJS.ErrnoException) =>\n resolve(err.code === 'EADDRINUSE'),\n )\n .once('listening', () => tempServer.close(() => resolve(false)))\n .listen(port, host);\n });\n}\n\nfunction startHttpServerWithRetry<TBindings extends object = HonoNodeBindings>(\n app: Hono<{ Bindings: TBindings }>,\n initialPort: number,\n host: string,\n maxRetries: number,\n parentContext: RequestContext,\n): Promise<ServerType> {\n const startContext = {\n ...parentContext,\n operation: 'startHttpServerWithRetry',\n };\n logger.info(\n `Attempting to start Streamable HTTP server on port ${initialPort} with ${maxRetries} retries.`,\n startContext,\n );\n\n return new Promise((resolve, reject) => {\n const tryBind = (port: number, attempt: number) => {\n if (attempt > maxRetries + 1) {\n const error = new Error(\n `Failed to bind to any port after ${maxRetries} retries.`,\n );\n logger.fatal(error.message, { ...startContext, port, attempt });\n return reject(error);\n }\n\n isPortInUse(port, host, { ...startContext, port, attempt })\n .then((inUse) => {\n if (inUse) {\n logger.warning(`Port ${port} is in use, retrying...`, {\n ...startContext,\n port,\n attempt,\n });\n setTimeout(\n () => tryBind(port + 1, attempt + 1),\n config.mcpHttpPortRetryDelayMs,\n );\n return;\n }\n\n try {\n const serverInstance = serve(\n { fetch: app.fetch, port, hostname: host },\n (info) => {\n const serverAddress = `http://${info.address}:${info.port}${config.mcpHttpEndpointPath}`;\n logger.info(`Streamable HTTP transport listening at ${serverAddress}`, {\n ...startContext,\n port,\n address: serverAddress,\n });\n logStartupBanner(\n `\\n🚀 MCP Server (Streamable HTTP/SSE) running at: ${serverAddress}`,\n 'http' as 'stdio' | 'http',\n );\n },\n );\n resolve(serverInstance);\n } catch (err: unknown) {\n logger.warning(\n `Binding attempt failed for port ${port}, retrying...`,\n { ...startContext, port, attempt, error: String(err) },\n );\n setTimeout(\n () => tryBind(port + 1, attempt + 1),\n config.mcpHttpPortRetryDelayMs,\n );\n }\n })\n .catch((err) =>\n reject(err instanceof Error ? err : new Error(String(err))),\n );\n };\n\n tryBind(initialPort, 1);\n });\n}\n\nexport async function startStreamableHttpTransport(\n mcpServer: McpServer,\n parentContext: RequestContext,\n): Promise<ServerType> {\n const transportContext = {\n ...parentContext,\n component: 'StreamableHttpTransportStart',\n };\n logger.info('Starting Streamable HTTP transport.', transportContext);\n\n const app = createStreamableHttpApp(mcpServer, transportContext);\n\n const server = await startHttpServerWithRetry(\n app,\n config.mcpHttpPort,\n config.mcpHttpHost,\n config.mcpHttpMaxPortRetries,\n transportContext,\n );\n\n logger.info('Streamable HTTP transport started successfully.', transportContext);\n return server;\n}\n\nexport async function stopStreamableHttpTransport(\n server: ServerType,\n parentContext: RequestContext,\n): Promise<void> {\n const operationContext = {\n ...parentContext,\n operation: 'stopStreamableHttpTransport',\n transportType: 'Http-Streamable',\n };\n logger.info('Attempting to stop Streamable HTTP transport...', operationContext);\n\n return new Promise((resolve, reject) => {\n server.close((err) => {\n if (err) {\n logger.error('Error closing Streamable HTTP server.', err, operationContext);\n return reject(err);\n }\n logger.info('Streamable HTTP server closed successfully.', operationContext);\n resolve();\n });\n });\n}\n","/**\n * @fileoverview Hybrid transport: stdio for MCP + HTTP for OAuth callbacks\n * This allows Kiro to communicate via stdio while OAuth callbacks work via HTTP\n *\n * @module src/mcp-server/transports/hybrid/hybridTransport\n */\nimport { type ServerType, serve } from '@hono/node-server';\nimport { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport { html } from 'hono/html';\nimport { container } from 'tsyringe';\n\nimport { config } from '@/config/index.js';\nimport { FeishuServiceToken } from '@/container/tokens.js';\nimport { httpErrorHandler } from '@/mcp-server/transports/http/httpErrorHandler.js';\nimport type { HonoNodeBindings } from '@/mcp-server/transports/http/httpTypes.js';\nimport type { FeishuService } from '@/services/feishu/index.js';\nimport {\n type RequestContext,\n logger,\n} from '@/utils/index.js';\n\n/**\n * 创建仅用于 OAuth 回调的 HTTP 服务器\n */\nexport function createOAuthCallbackApp<TBindings extends object = HonoNodeBindings>(\n parentContext: RequestContext,\n): Hono<{ Bindings: TBindings }> {\n const app = new Hono<{ Bindings: TBindings }>();\n const transportContext = {\n ...parentContext,\n component: 'OAuthCallbackServer',\n };\n\n // CORS配置\n const allowedOrigin =\n Array.isArray(config.mcpAllowedOrigins) &&\n config.mcpAllowedOrigins.length > 0\n ? config.mcpAllowedOrigins\n : '*';\n\n app.use(\n '*',\n cors({\n origin: allowedOrigin,\n allowMethods: ['GET', 'POST', 'OPTIONS'],\n allowHeaders: ['Content-Type'],\n credentials: true,\n }),\n );\n\n // 错误处理\n app.onError(httpErrorHandler);\n\n // 健康检查\n app.get('/healthz', (c) => c.json({ status: 'ok', purpose: 'oauth-callback' }));\n\n // 飞书 OAuth 授权URL生成端点\n app.get('/oauth/feishu/auth', async (c) => {\n const authContext = {\n ...transportContext,\n operation: 'feishuGenerateAuthUrl',\n };\n\n try {\n const feishuService = container.resolve<FeishuService>(\n FeishuServiceToken as symbol,\n );\n const result = await feishuService.getAuthUrl();\n\n logger.info('生成授权URL成功', {\n ...authContext,\n state: result.state,\n });\n\n return c.html(\n html`<!doctype html>\n <html lang=\"zh-CN\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>飞书授权</title>\n <style>\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n margin: 0;\n background: linear-gradient(135deg, #e0f2fe 0%, #b3e5fc 100%);\n }\n .container {\n text-align: center;\n padding: 40px;\n background: white;\n border-radius: 16px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);\n max-width: 500px;\n }\n .icon { font-size: 64px; margin-bottom: 20px; }\n h1 { color: #0277bd; margin-bottom: 16px; }\n p { color: #6b7280; line-height: 1.6; margin-bottom: 24px; }\n .auth-button {\n display: inline-block;\n background: #0277bd;\n color: white;\n padding: 12px 24px;\n border-radius: 8px;\n text-decoration: none;\n font-weight: 600;\n transition: background-color 0.2s;\n }\n .auth-button:hover { background: #01579b; }\n .state-info {\n background: #f0f9ff;\n padding: 16px;\n border-radius: 8px;\n margin-top: 24px;\n font-size: 14px;\n color: #0369a1;\n }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <div class=\"icon\">🔐</div>\n <h1>飞书授权</h1>\n <p>点击下面的按钮完成飞书账号授权,授权后即可使用飞书相关功能。</p>\n <a href=\"${result.authUrl}\" class=\"auth-button\">前往飞书授权</a>\n <div class=\"state-info\">State: ${result.state}</div>\n </div>\n </body>\n </html>`,\n );\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n logger.error(\n '生成授权URL失败',\n err instanceof Error ? err : new Error(errorMessage),\n authContext,\n );\n return c.html(html`<h1>生成授权URL失败</h1><p>${errorMessage}</p>`, 500);\n }\n });\n\n // 飞书 OAuth 回调路由\n app.get('/oauth/feishu/callback', async (c) => {\n const oauthContext = {\n ...transportContext,\n operation: 'feishuOAuthCallback',\n };\n\n const code = c.req.query('code');\n const state = c.req.query('state');\n const error = c.req.query('error');\n const errorDescription = c.req.query('error_description');\n\n if (error) {\n logger.warning('飞书授权失败', { ...oauthContext, error, errorDescription });\n return c.html(\n html`<!doctype html>\n <html lang=\"zh-CN\">\n <head>\n <meta charset=\"UTF-8\" />\n <title>授权失败</title>\n <style>\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n margin: 0;\n background: linear-gradient(135deg, #fee2e2 0%, #fecaca 100%);\n }\n .container {\n text-align: center;\n padding: 40px;\n background: white;\n border-radius: 16px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);\n max-width: 400px;\n }\n .icon { font-size: 64px; margin-bottom: 20px; }\n h1 { color: #dc2626; margin-bottom: 16px; }\n p { color: #6b7280; line-height: 1.6; }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <div class=\"icon\">❌</div>\n <h1>授权失败</h1>\n <p>${errorDescription ?? error ?? '未知错误'}</p>\n </div>\n </body>\n </html>`,\n 400,\n );\n }\n\n if (!code || !state) {\n logger.warning('飞书 OAuth 回调缺少必要参数', oauthContext);\n return c.html(html`<h1>参数错误</h1><p>缺少必要参数</p>`, 400);\n }\n\n try {\n const feishuService = container.resolve<FeishuService>(FeishuServiceToken as symbol);\n const result = await feishuService.handleAuthCallback(code, state);\n\n if (!result.success) {\n throw new Error('授权回调处理失败');\n }\n\n logger.info('飞书授权成功', { ...oauthContext, userName: result.userInfo?.name });\n\n return c.html(\n html`<!doctype html>\n <html lang=\"zh-CN\">\n <head>\n <meta charset=\"UTF-8\" />\n <title>授权成功</title>\n <style>\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n margin: 0;\n background: linear-gradient(135deg, #d1fae5 0%, #a7f3d0 100%);\n }\n .container {\n text-align: center;\n padding: 40px;\n background: white;\n border-radius: 16px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);\n max-width: 400px;\n }\n .icon { font-size: 64px; margin-bottom: 20px; }\n h1 { color: #059669; margin-bottom: 16px; }\n p { color: #6b7280; line-height: 1.6; }\n .user-info {\n background: #f0fdf4;\n padding: 16px;\n border-radius: 8px;\n margin-top: 16px;\n }\n .user-name {\n font-size: 18px;\n font-weight: 600;\n color: #065f46;\n }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <div class=\"icon\">✅</div>\n <h1>授权成功</h1>\n <p>您已成功授权飞书账号,现在可以使用飞书相关功能了。</p>\n ${result.userInfo ? html`<div class=\"user-info\"><div class=\"user-name\">欢迎,${result.userInfo.name}!</div></div>` : ''}\n <p style=\"margin-top: 24px; font-size: 14px; color: #9ca3af;\">您可以关闭此页面</p>\n </div>\n </body>\n </html>`,\n );\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n logger.error('飞书授权回调处理失败', err instanceof Error ? err : new Error(errorMessage), oauthContext);\n return c.html(html`<h1>授权处理失败</h1><p>${errorMessage}</p>`, 500);\n }\n });\n\n logger.info('OAuth callback server setup complete', transportContext);\n return app;\n}\n\n/**\n * 检查端口是否被占用\n */\nasync function isPortInUse(port: number, host: string): Promise<boolean> {\n return new Promise((resolve) => {\n // 动态导入 net 模块\n import('net')\n .then((net) => {\n const tester = net\n .createServer()\n .once('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EADDRINUSE') {\n resolve(true);\n } else {\n resolve(false);\n }\n })\n .once('listening', () => {\n tester.close();\n resolve(false);\n })\n .listen(port, host);\n })\n .catch(() => {\n // 如果导入失败,假设端口未被占用\n resolve(false);\n });\n });\n}\n\n/**\n * 等待端口释放\n */\nasync function waitForPortRelease(\n port: number,\n host: string,\n maxRetries: number = 10,\n delayMs: number = 500,\n): Promise<void> {\n for (let i = 0; i < maxRetries; i++) {\n const inUse = await isPortInUse(port, host);\n if (!inUse) {\n return;\n }\n if (i < maxRetries - 1) {\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n }\n throw new Error(`Port ${port} is still in use after ${maxRetries} retries`);\n}\n\n/**\n * 启动 OAuth 回调服务器(后台运行)\n */\nexport async function startOAuthCallbackServer(\n parentContext: RequestContext,\n): Promise<ServerType> {\n const transportContext = {\n ...parentContext,\n component: 'OAuthCallbackServer',\n };\n\n logger.info('Starting OAuth callback server...', transportContext);\n\n // 检查端口是否被占用\n const portInUse = await isPortInUse(config.mcpHttpPort, config.mcpHttpHost);\n if (portInUse) {\n logger.warning(\n `Port ${config.mcpHttpPort} is in use, waiting for it to be released...`,\n transportContext,\n );\n try {\n await waitForPortRelease(config.mcpHttpPort, config.mcpHttpHost);\n logger.info(`Port ${config.mcpHttpPort} is now available`, transportContext);\n } catch (err) {\n logger.error(\n `Failed to wait for port ${config.mcpHttpPort} to be released`,\n err instanceof Error ? err : new Error(String(err)),\n transportContext,\n );\n throw err;\n }\n }\n\n const app = createOAuthCallbackApp(transportContext);\n\n const server = serve(\n {\n fetch: app.fetch,\n port: config.mcpHttpPort,\n hostname: config.mcpHttpHost,\n },\n (info) => {\n logger.info(`OAuth callback server listening at http://${info.address}:${info.port}`, {\n ...transportContext,\n port: info.port,\n address: `http://${info.address}:${info.port}`,\n });\n },\n );\n\n logger.info('OAuth callback server started successfully', transportContext);\n return server;\n}\n\n/**\n * 停止 OAuth 回调服务器\n */\nexport async function stopOAuthCallbackServer(\n server: ServerType,\n parentContext: RequestContext,\n): Promise<void> {\n const operationContext = {\n ...parentContext,\n operation: 'stopOAuthCallbackServer',\n };\n logger.info('Stopping OAuth callback server...', operationContext);\n\n return new Promise((resolve) => {\n // 设置超时,确保即使关闭失败也能继续\n const timeout = setTimeout(() => {\n logger.warning('OAuth callback server close timeout, forcing shutdown', operationContext);\n resolve();\n }, 5000);\n\n server.close((err) => {\n clearTimeout(timeout);\n if (err) {\n logger.error('Error closing OAuth callback server', err, operationContext);\n // 不要 reject,让进程继续\n resolve();\n } else {\n logger.info('OAuth callback server closed successfully', operationContext);\n resolve();\n }\n });\n\n // 强制关闭所有连接\n try {\n const serverWithClose = server as ServerType & {\n closeAllConnections?: () => void;\n };\n if (typeof serverWithClose.closeAllConnections === 'function') {\n serverWithClose.closeAllConnections();\n logger.debug('Closed all server connections', operationContext);\n }\n } catch (err) {\n logger.debug('Failed to close all connections', {\n ...operationContext,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n });\n}\n","/**\n * @fileoverview Handles the setup and connection for the Stdio MCP transport.\n * Implements the MCP Specification 2025-06-18 for stdio transport.\n * This transport communicates directly over standard input (stdin) and\n * standard output (stdout), typically used when the MCP server is launched\n * as a child process by a host application.\n *\n * Specification Reference:\n * https://modelcontextprotocol.io/specification/2025-06-18/basic/transports#stdio\n *\n * --- Authentication Note ---\n * As per the MCP Authorization Specification (2025-06-18, Section 1.2),\n * STDIO transports SHOULD NOT implement HTTP-based authentication flows.\n * Authorization is typically handled implicitly by the host application\n * controlling the server process. This implementation follows that guideline.\n *\n * @see {@link https://modelcontextprotocol.io/specification/2025-06-18/basic/authorization | MCP Authorization Specification}\n * @module src/mcp-server/transports/stdioTransport\n */\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport type { ServerType } from '@hono/node-server';\n\nimport { config } from '@/config/index.js';\nimport {\n startOAuthCallbackServer,\n stopOAuthCallbackServer,\n} from '@/mcp-server/transports/hybrid/hybridTransport.js';\nimport {\n ErrorHandler,\n type RequestContext,\n logger,\n logStartupBanner,\n} from '@/utils/index.js';\n\n// 存储 OAuth 回调服务器实例\nlet oauthCallbackServer: ServerType | null = null;\n\n/**\n * Connects a given `McpServer` instance to the Stdio transport.\n * This function initializes the SDK's `StdioServerTransport`, which manages\n * communication over `process.stdin` and `process.stdout` according to the\n * MCP stdio transport specification.\n *\n * MCP Spec Points Covered by SDK's `StdioServerTransport`:\n * - Reads JSON-RPC messages (requests, notifications, responses, batches) from stdin.\n * - Writes JSON-RPC messages to stdout.\n * - Handles newline delimiters and ensures no embedded newlines in output messages.\n * - Ensures only valid MCP messages are written to stdout.\n *\n * Logging via the `logger` utility MAY result in output to stderr, which is\n * permitted by the spec for logging purposes.\n *\n * @param server - The `McpServer` instance.\n * @param parentContext - The logging and tracing context from the calling function.\n * @returns A promise that resolves when the Stdio transport is successfully connected.\n * @throws {Error} If the connection fails during setup.\n */\nexport async function startStdioTransport(\n server: McpServer,\n parentContext: RequestContext,\n): Promise<McpServer> {\n const operationContext = {\n ...parentContext,\n operation: 'connectStdioTransport',\n transportType: 'Stdio',\n };\n logger.info('Attempting to connect stdio transport...', operationContext);\n\n try {\n logger.debug('Creating StdioServerTransport instance...', operationContext);\n const transport = new StdioServerTransport();\n\n logger.debug(\n 'Connecting McpServer instance to StdioServerTransport...',\n operationContext,\n );\n await server.connect(transport);\n\n logger.info(\n 'MCP Server connected and listening via stdio transport.',\n operationContext,\n );\n\n // 如果配置了飞书服务,启动 OAuth 回调服务器\n if (config.feishu?.oauthCallbackUrl) {\n try {\n logger.info('Starting OAuth callback server for Feishu...', operationContext);\n oauthCallbackServer = await startOAuthCallbackServer(operationContext);\n logger.info('OAuth callback server started successfully', operationContext);\n } catch (err) {\n logger.warning(\n 'Failed to start OAuth callback server, OAuth features may not work',\n {\n ...operationContext,\n error: err instanceof Error ? err.message : String(err),\n },\n );\n }\n }\n\n logStartupBanner(\n `\\n🚀 MCP Server running in STDIO mode.\\n (MCP Spec: 2025-06-18 Stdio Transport)\\n${oauthCallbackServer ? ` OAuth callback server: http://${config.mcpHttpHost}:${config.mcpHttpPort}\\n` : ''}`,\n 'stdio',\n );\n return server;\n } catch (err) {\n // Let the ErrorHandler log the error with all context, then rethrow.\n throw ErrorHandler.handleError(err, {\n operation: 'connectStdioTransport',\n context: operationContext,\n critical: true,\n rethrow: true,\n });\n }\n}\n\nexport async function stopStdioTransport(\n server: McpServer,\n parentContext: RequestContext,\n): Promise<void> {\n const operationContext = {\n ...parentContext,\n operation: 'stopStdioTransport',\n transportType: 'Stdio',\n };\n logger.info('Attempting to stop stdio transport...', operationContext);\n\n // 先停止 OAuth 回调服务器\n if (oauthCallbackServer) {\n try {\n logger.info('Stopping OAuth callback server...', operationContext);\n await stopOAuthCallbackServer(oauthCallbackServer, operationContext);\n oauthCallbackServer = null;\n logger.info('OAuth callback server stopped', operationContext);\n \n // 等待一小段时间确保端口完全释放\n await new Promise((resolve) => setTimeout(resolve, 500));\n } catch (err) {\n logger.warning('Failed to stop OAuth callback server', {\n ...operationContext,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n // 然后停止 stdio 传输\n if (server) {\n try {\n await server.close();\n logger.info('Stdio transport stopped successfully.', operationContext);\n } catch (err) {\n logger.error(\n 'Error stopping stdio transport',\n err instanceof Error ? err : new Error(String(err)),\n operationContext,\n );\n throw err;\n }\n }\n}\n","/**\n * @fileoverview Manages the lifecycle of the configured MCP transport.\n * @module src/mcp-server/transports/manager\n */\nimport type { ServerType } from '@hono/node-server';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { inject, injectable } from 'tsyringe';\n\nimport type { AppConfig as AppConfigType } from '../../config/index.js';\nimport {\n AppConfig,\n CreateMcpServerInstance,\n Logger,\n} from '../../container/tokens.js';\nimport { requestContextService } from '../../utils/index.js';\nimport type { logger as LoggerType } from '../../utils/index.js';\nimport { startHttpTransport, stopHttpTransport } from './http/httpTransport.js';\nimport { startStreamableHttpTransport, stopStreamableHttpTransport } from './http/streamableHttpTransport.js';\nimport type { TransportServer } from './ITransport.js';\nimport {\n startStdioTransport,\n stopStdioTransport,\n} from './stdio/stdioTransport.js';\n\n@injectable()\nexport class TransportManager {\n private serverInstance: TransportServer | null = null;\n\n constructor(\n @inject(AppConfig) private config: AppConfigType,\n @inject(Logger) private logger: typeof LoggerType,\n @inject(CreateMcpServerInstance)\n private createMcpServer: () => Promise<McpServer>,\n ) {}\n\n async start(): Promise<void> {\n const context = requestContextService.createRequestContext({\n operation: 'TransportManager.start',\n transport: this.config.mcpTransportType,\n });\n\n this.logger.info(\n `Starting transport: ${this.config.mcpTransportType}`,\n context,\n );\n\n const mcpServer = await this.createMcpServer();\n\n if (this.config.mcpTransportType === 'http') {\n // 根据配置选择 HTTP 传输模式\n if (this.config.mcpHttpTransportMode === 'sse') {\n this.logger.info('Using Streamable HTTP (SSE) transport', context);\n this.serverInstance = await startStreamableHttpTransport(mcpServer, context);\n } else {\n this.logger.info('Using @hono/mcp StreamableHTTP transport', context);\n this.serverInstance = await startHttpTransport(mcpServer, context);\n }\n } else if (this.config.mcpTransportType === 'stdio') {\n this.serverInstance = await startStdioTransport(mcpServer, context);\n } else {\n // This case should ideally not be reached due to config validation,\n // but it's a good safeguard.\n const transportType = String(this.config.mcpTransportType);\n const error = new Error(`Unsupported transport type: ${transportType}`);\n this.logger.crit(error.message, context);\n throw error;\n }\n }\n\n async stop(signal: string): Promise<void> {\n const context = requestContextService.createRequestContext({\n operation: 'TransportManager.stop',\n signal,\n });\n\n if (!this.serverInstance) {\n this.logger.warning(\n 'Stop called but no active server instance found.',\n context,\n );\n return;\n }\n\n if (this.config.mcpTransportType === 'http') {\n if (this.config.mcpHttpTransportMode === 'sse') {\n await stopStreamableHttpTransport(this.serverInstance as ServerType, context);\n } else {\n await stopHttpTransport(this.serverInstance as ServerType, context);\n }\n } else if (this.config.mcpTransportType === 'stdio') {\n await stopStdioTransport(this.serverInstance as McpServer, context);\n }\n }\n\n getServer(): TransportServer | null {\n return this.serverInstance;\n }\n}\n","/**\n * @fileoverview Registers MCP (Model Context Protocol) services with the DI container.\n * This module handles the registration of tool and resource registries,\n * the tools and resources themselves, and the factory for creating the MCP server instance.\n * @module src/container/registrations/mcp\n */\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { container } from 'tsyringe';\n\nimport {\n CreateMcpServerInstance,\n TaskManagerToken,\n TransportManagerToken,\n} from '@/container/tokens.js';\nimport {\n ResourceRegistry,\n registerResources,\n} from '@/mcp-server/resources/resource-registration.js';\nimport { createMcpServerInstance } from '@/mcp-server/server.js';\nimport {\n ToolRegistry,\n registerTools,\n} from '@/mcp-server/tools/tool-registration.js';\nimport { TaskManager } from '@/mcp-server/tasks/index.js';\nimport { TransportManager } from '@/mcp-server/transports/manager.js';\nimport { logger } from '@/utils/index.js';\n\n/**\n * Registers MCP-related services and factories with the tsyringe container.\n */\nexport const registerMcpServices = () => {\n // --- Register Registries ---\n container.registerSingleton(ToolRegistry);\n container.registerSingleton(ResourceRegistry);\n\n // --- Register Task Manager (experimental) ---\n container.registerSingleton(TaskManagerToken, TaskManager);\n\n // --- Register Tools & Resources (via modular functions) ---\n registerTools(container);\n registerResources(container);\n\n // --- Register Factories ---\n // Register the server factory function. It will be resolved by the transport layer.\n container.register<() => Promise<McpServer>>(CreateMcpServerInstance, {\n useValue: createMcpServerInstance,\n });\n\n // Register TransportManager\n container.registerSingleton(TransportManagerToken, TransportManager);\n\n logger.info('MCP services and factories registered with the DI container.');\n};\n","/**\n * @fileoverview Centralized dependency injection container setup.\n * This file provides a `composeContainer` function to act as the Composition\n * Root for the application. It also serves as a barrel file for exporting\n * the configured container and all DI tokens.\n * @module src/container\n */\nimport 'reflect-metadata';\nimport { container } from 'tsyringe';\n\nimport { registerCoreServices } from '@/container/registrations/core.js';\nimport { registerFeishuServices } from '@/container/registrations/feishu.js';\nimport { registerMcpServices } from '@/container/registrations/mcp.js';\n\nlet isContainerComposed = false;\n\n/**\n * Composes the DI container by registering all services.\n * This function is designed to be called once at application startup.\n */\nexport function composeContainer(): void {\n if (isContainerComposed) {\n return;\n }\n\n registerCoreServices();\n registerFeishuServices();\n registerMcpServices();\n\n isContainerComposed = true;\n}\n\n// --- Export DI tokens and the container instance ---\nexport * from '@/container/tokens.js';\nexport default container;\n","#!/usr/bin/env node\n/**\n * @fileoverview Main entry point for the MCP TypeScript Template application.\n * This script initializes the configuration, sets up the logger, starts the\n * MCP server (either via STDIO or HTTP transport), and handles graceful\n * shutdown on process signals or unhandled errors.\n * @module src/index\n */\n\n// CRITICAL: Disable ANSI color codes BEFORE any imports when running via MCP clients.\n// The MCP specification requires clean output. Even in HTTP mode, if launched via\n// bunx/npx by an MCP client, colored output pollutes the client's process streams.\n// This must be set before pino-pretty or any other library loads.\n//\n// We disable colors in these scenarios:\n// 1. STDIO mode (always - MCP JSON-RPC on stdout)\n// 2. HTTP mode when NOT in TTY (likely launched by MCP client via bunx/npx)\n// 3. When explicitly disabled via existing NO_COLOR env var\nconst transportType = process.env.MCP_TRANSPORT_TYPE?.toLowerCase();\nconst isStdioMode = !transportType || transportType === 'stdio';\nconst isHttpModeWithoutTty = transportType === 'http' && !process.stdout.isTTY;\n\nif (isStdioMode || isHttpModeWithoutTty) {\n process.env.NO_COLOR = '1'; // Standard env var that most libraries respect\n process.env.FORCE_COLOR = '0'; // Disable forced coloring\n}\n\nimport {\n initializeOpenTelemetry,\n shutdownOpenTelemetry,\n} from '@/utils/telemetry/instrumentation.js';\nimport 'reflect-metadata';\n\nimport {\n initializePerformance_Hrt,\n requestContextService,\n} from '@/utils/index.js';\nimport { type McpLogLevel, logger } from '@/utils/internal/logger.js';\n\nimport { config as appConfigType } from '@/config/index.js';\nimport container, {\n AppConfig,\n TransportManagerToken,\n composeContainer,\n} from '@/container/index.js';\nimport { TransportManager } from '@/mcp-server/transports/manager.js';\n\n// The container is now composed in start(), so we must resolve config there.\nlet config: typeof appConfigType;\nlet transportManager: TransportManager;\nlet isShuttingDown = false;\n\nconst shutdown = async (signal: string): Promise<void> => {\n if (isShuttingDown) {\n return;\n }\n isShuttingDown = true;\n\n const shutdownContext = requestContextService.createRequestContext({\n operation: 'ServerShutdown',\n triggerEvent: signal,\n });\n\n logger.info(\n `Received ${signal}. Initiating graceful shutdown...`,\n shutdownContext,\n );\n\n try {\n if (transportManager) {\n await transportManager.stop(signal);\n }\n\n logger.info(\n 'Graceful shutdown completed successfully. Exiting.',\n shutdownContext,\n );\n\n // Shutdown OpenTelemetry and logger last to ensure all telemetry and logs are sent.\n await shutdownOpenTelemetry();\n await logger.close();\n\n process.exit(0);\n } catch (error: unknown) {\n logger.error(\n 'Critical error during shutdown process.',\n error as Error,\n shutdownContext,\n );\n try {\n await logger.close();\n } catch (_e) {\n // Ignore errors during final logger close attempt\n }\n process.exit(1);\n }\n};\n\nconst start = async (): Promise<void> => {\n try {\n // Initialize DI container first\n composeContainer();\n // Now it's safe to resolve dependencies\n config = container.resolve<typeof appConfigType>(AppConfig);\n } catch (_error) {\n // This will catch the McpError from parseConfig\n if (process.stdout.isTTY) {\n // The config module already logged the details. We just provide a final message.\n console.error('Halting due to critical configuration error.');\n }\n // Ensure OpenTelemetry is shut down if it was started before the error\n await shutdownOpenTelemetry();\n process.exit(1);\n }\n\n // Initialize OpenTelemetry before logger to capture all spans\n // This must happen before logger initialization for proper instrumentation\n try {\n await initializeOpenTelemetry();\n } catch (error: unknown) {\n // Observability failure should not block startup\n console.error('[Startup] Failed to initialize OpenTelemetry:', error);\n // Continue - application can run without telemetry\n }\n\n // Initialize the high-resolution timer\n await initializePerformance_Hrt();\n\n const validMcpLogLevels: McpLogLevel[] = [\n 'debug',\n 'info',\n 'notice',\n 'warning',\n 'error',\n 'crit',\n 'alert',\n 'emerg',\n ];\n const initialLogLevelConfig = config.logLevel;\n\n let validatedMcpLogLevel: McpLogLevel = 'info';\n if (validMcpLogLevels.includes(initialLogLevelConfig as McpLogLevel)) {\n validatedMcpLogLevel = initialLogLevelConfig as McpLogLevel;\n } else {\n if (process.stdout.isTTY) {\n console.warn(\n `[Startup Warning] Invalid MCP_LOG_LEVEL \"${initialLogLevelConfig}\". Defaulting to \"info\".`,\n );\n }\n }\n\n // Pass transport type to logger to ensure STDIO mode uses plain JSON (no ANSI colors)\n await logger.initialize(validatedMcpLogLevel, config.mcpTransportType);\n\n // Storage Service is now initialized in the container\n logger.info(\n `Storage service initialized with provider: ${config.storage.providerType}`,\n requestContextService.createRequestContext({ operation: 'StorageInit' }),\n );\n\n transportManager = container.resolve<TransportManager>(TransportManagerToken);\n\n const startupContext = requestContextService.createRequestContext({\n operation: 'ServerStartup',\n applicationName: config.mcpServerName,\n applicationVersion: config.mcpServerVersion,\n nodeEnvironment: config.environment,\n });\n\n logger.info(\n `Starting ${config.mcpServerName} (v${config.mcpServerVersion})...`,\n startupContext,\n );\n\n try {\n await transportManager.start();\n\n logger.info(\n `${config.mcpServerName} is now running and ready.`,\n startupContext,\n );\n\n process.on('SIGTERM', () => void shutdown('SIGTERM'));\n process.on('SIGINT', () => void shutdown('SIGINT'));\n process.on('uncaughtException', (error: Error) => {\n logger.fatal(\n 'FATAL: Uncaught exception detected.',\n error,\n startupContext,\n );\n void shutdown('uncaughtException');\n });\n process.on('unhandledRejection', (reason: unknown) => {\n logger.fatal(\n 'FATAL: Unhandled promise rejection detected.',\n reason as Error,\n startupContext,\n );\n void shutdown('unhandledRejection');\n });\n } catch (error: unknown) {\n logger.fatal(\n 'CRITICAL ERROR DURING STARTUP.',\n error as Error,\n startupContext,\n );\n await shutdownOpenTelemetry(); // Attempt to flush any startup-related traces\n process.exit(1);\n }\n};\n\nvoid (async () => {\n try {\n await start();\n } catch (error: unknown) {\n if (process.stdout.isTTY) {\n console.error('[GLOBAL CATCH] A fatal, unhandled error occurred:', error);\n }\n process.exit(1);\n }\n})();\n"]}