@dataflint/mcp-server 1.0.15 → 1.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth/auth0-service.d.ts.map +1 -1
- package/dist/auth/auth0-service.js +27 -13
- package/dist/auth/auth0-service.js.map +1 -1
- package/dist/auth/errors.d.ts +86 -0
- package/dist/auth/errors.d.ts.map +1 -0
- package/dist/auth/errors.js +144 -0
- package/dist/auth/errors.js.map +1 -0
- package/dist/auth/index.d.ts +1 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +10 -1
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/secrets/aws-secrets-provider.d.ts.map +1 -1
- package/dist/auth/secrets/aws-secrets-provider.js +3 -1
- package/dist/auth/secrets/aws-secrets-provider.js.map +1 -1
- package/dist/dataflint-server-service.d.ts +7 -2
- package/dist/dataflint-server-service.d.ts.map +1 -1
- package/dist/dataflint-server-service.js +86 -15
- package/dist/dataflint-server-service.js.map +1 -1
- package/dist/errors.d.ts +55 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +185 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +6 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -9
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +2 -2
- package/dist/server.js.map +1 -1
- package/dist/standalone/config.js +1667 -280
- package/dist/standalone/config.js.map +7 -1
- package/dist/standalone/logger.js +2 -2
- package/dist/standalone/logger.js.map +1 -1
- package/dist/standalone/server.js +3 -3
- package/dist/standalone/server.js.map +1 -1
- package/dist/standalone/stdio-transport.d.ts +1 -1
- package/dist/standalone/stdio-transport.d.ts.map +1 -1
- package/dist/standalone/stdio-transport.js +2 -2
- package/dist/standalone/stdio-transport.js.map +1 -1
- package/dist/test-helpers.d.ts +27 -0
- package/dist/test-helpers.d.ts.map +1 -0
- package/dist/test-helpers.js +101 -0
- package/dist/test-helpers.js.map +1 -0
- package/dist/tools/base.d.ts +16 -0
- package/dist/tools/base.d.ts.map +1 -1
- package/dist/tools/base.js +16 -0
- package/dist/tools/base.js.map +1 -1
- package/dist/tools/core-tools.d.ts.map +1 -1
- package/dist/tools/core-tools.js +4 -4
- package/dist/tools/core-tools.js.map +1 -1
- package/dist/tools/expertise-tools.d.ts.map +1 -1
- package/dist/tools/expertise-tools.js +5 -5
- package/dist/tools/expertise-tools.js.map +1 -1
- package/dist/tools/findings-tools.d.ts.map +1 -1
- package/dist/tools/findings-tools.js +4 -4
- package/dist/tools/findings-tools.js.map +1 -1
- package/dist/tools/highlight-tools.d.ts.map +1 -1
- package/dist/tools/highlight-tools.js +8 -10
- package/dist/tools/highlight-tools.js.map +1 -1
- package/dist/tools/listing-tools.d.ts.map +1 -1
- package/dist/tools/listing-tools.js +1 -1
- package/dist/tools/listing-tools.js.map +1 -1
- package/dist/types.d.ts +3 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +3 -3
- package/dist/types.js.map +1 -1
- package/package.json +3 -2
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/auth/customer-auth-configs.ts", "../../src/auth/types.ts", "../../src/auth/errors.ts", "../../src/auth/auth0-service.ts", "../../src/auth/auth0-m2m-service.ts", "../../src/auth/service-account-service.ts", "../../src/auth/secrets/aws-secrets-provider.ts", "../../src/auth/secrets/local-file-secrets-provider.ts", "../../src/auth/secrets/secrets-provider.ts", "../../src/auth/secrets/index.ts", "../../src/auth/auth-strategy-factory.ts", "../../src/auth/index.ts", "../../src/types.ts", "../../src/logger.ts", "../../src/standalone/config.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Customer-specific authentication configurations\n *\n * This file contains mappings from hashed customer domains to their Auth0 configurations.\n * Customer domains are hashed using SHA-256 for privacy.\n *\n * To add a new customer:\n * 1. Generate hash: npm run hash-domain -- \"customer.domain.com\"\n * 2. Add entry to customerAuthConfigs with the hash as key\n */\n\nexport interface CustomerAuthConfig {\n /**\n * Auth0 client ID for this customer\n */\n clientId: string;\n\n /**\n * Optional function to produce customer-specific Auth0 domain\n * @param customerDomain - The customer's domain (e.g., \"acme.corp\")\n * @returns Auth0 domain URL (e.g., \"https://dataflint-acme.us.auth0.com/\")\n */\n domainProducer?: (customerDomain: string) => string;\n}\n\n/**\n * Mapping from hashed customer domain to Auth0 configuration\n * Key: SHA-256 hash of customer domain\n * Value: CustomerAuthConfig with clientId and optional domainProducer\n */\nexport const customerAuthConfigs: { [key: string]: CustomerAuthConfig } = {\n // Customer domain hash \u2192 Auth0 configuration\n \"857064adfec4e0e5e37be8afef397155db006bb6009d1b395388d9174eb40795\": {\n clientId: \"CWvpqujjEV2aoRSDVWFSh1U6HQALygB0\",\n domainProducer: (customerDomain) =>\n `https://dataflint-${customerDomain}.us.auth0.com/`,\n },\n\n cafe6e0af028d729afd3c4a386482621af90e8e117b1216f2bbc08e86a5e9445: {\n clientId: \"HRLICLhE0BP4AeZ8dSPAoDHFmMZVacxi\",\n },\n\n \"1613f29ea956158d2ad56a10780feb45d78755819565e76c4bf0d9069d17aab9\": {\n clientId: \"CnyJJKVqes0Y0uU57GreAeaPbJlm4l4w\",\n },\n\n eae8e3404182477f008479b38a6629ee86b23cefe2c418c5dc5c2f0d02af5475: {\n clientId: \"etY3z44ssWohe77PEBIMPzktW4BmvWGT\",\n },\n\n // dataflint-demo (added from commit f38928c)\n cc1677626e05d82b301cc83c22a850eac849555e704f288083108d79f600cea1: {\n clientId: \"u9W23NGvlV58W2N9WXMMhsM12bKK8oGI\",\n },\n};\n", "/**\n * Auth types and interfaces for DataFlint authentication\n *\n * This module defines the core interfaces used across all authentication strategies:\n * - Service Account (M2M token from file)\n * - Auth0 M2M (client credentials grant)\n * - Auth0 User (interactive OAuth2/PKCE flow)\n */\n\n/**\n * Basic authentication configuration for Auth0\n */\nexport interface AuthConfig {\n domain: string;\n clientId: string;\n scope: string;\n audience: string;\n}\n\n/**\n * Result from a successful authentication\n */\nexport interface AuthResult {\n accessToken: string;\n idToken?: string;\n refreshToken?: string;\n expiresAt?: Date;\n userInfo?: unknown;\n}\n\n/**\n * Credentials required for Auth0 M2M (client credentials) authentication\n */\nexport interface Auth0M2MCredentials {\n client_id: string;\n client_secret: string;\n audience: string;\n domain: string;\n}\n\n/**\n * Authentication strategy types\n */\nexport enum AuthStrategyType {\n SERVICE_ACCOUNT = \"service_account\",\n AUTH0_M2M = \"auth0_m2m\",\n AUTH0_USER = \"auth0_user\",\n}\n\n/**\n * M2M authentication mode types\n */\nexport enum M2MType {\n NONE = \"none\",\n SERVICE_ACCOUNT = \"service_account\",\n AUTH0_M2M = \"auth0_m2m\",\n}\n\n/**\n * M2M authentication mode - single source of truth for M2M detection\n */\nexport type M2MMode =\n | { type: M2MType.NONE }\n | { type: M2MType.SERVICE_ACCOUNT; tokenPath: string; tenantId?: string }\n | { type: M2MType.AUTH0_M2M; secretName: string; tenantId?: string };\n\n/**\n * User information returned from authentication\n */\nexport interface AuthUserInfo {\n sub: string;\n name: string;\n tenant_id?: string;\n}\n\n/**\n * Common interface for all authentication strategies\n *\n * Implementations:\n * - ServiceAccountService: Reads JWT from file path\n * - Auth0M2MService: Uses client credentials grant\n * - Auth0Service: Uses interactive OAuth2/PKCE flow\n */\nexport interface IAuthStrategy {\n /**\n * Get the type of this authentication strategy\n */\n getType(): AuthStrategyType;\n\n /**\n * Initialize the authentication strategy (e.g., discover issuer, validate credentials)\n */\n initialize(): Promise<void>;\n\n /**\n * Get a valid access token, refreshing if necessary\n */\n getToken(): Promise<string>;\n\n /**\n * Force refresh the token\n */\n refreshToken(): Promise<void>;\n\n /**\n * Check if currently authenticated with a valid token\n */\n isAuthenticated(): Promise<boolean>;\n\n /**\n * Get user information for the current authentication\n */\n getUserInfo(): Promise<AuthUserInfo>;\n\n /**\n * Get the tenant ID associated with this authentication (if any)\n */\n getTenantId(): string | undefined;\n}\n\n/**\n * Configuration provider interface for authentication\n */\nexport interface IAuthConfigProvider {\n getAuthConfig(): AuthConfig;\n getM2MMode(): M2MMode;\n getTenantId(): string | undefined;\n getEnvironment(): string;\n getServerUrl(): string;\n}\n\n/**\n * Logger interface for authentication services\n */\nexport interface IAuthLogger {\n info(message: string): void;\n warn(message: string): void;\n error(message: string, error?: unknown): void;\n debug(message: string): void;\n}\n\n/**\n * Handler for opening URLs (used for OAuth2 browser-based flow)\n */\nexport type OpenUrlHandler = (url: string) => Promise<void>;\n\n/**\n * Provider function for AuthConfig\n */\nexport type ConfigProvider = () => AuthConfig;\n", "/**\n * DataFlint Error Classes for Authentication\n *\n * Provides typed errors for better error handling and user messaging.\n * Each error type includes:\n * - code: Unique error code for programmatic handling\n * - isRetryable: Whether the operation can be retried\n * - userAction: Suggested action for the user\n */\n\nexport enum ErrorCode {\n // Authentication errors\n AUTH_NOT_INITIALIZED = \"AUTH_NOT_INITIALIZED\",\n AUTH_TOKEN_EXPIRED = \"AUTH_TOKEN_EXPIRED\",\n AUTH_TOKEN_INVALID = \"AUTH_TOKEN_INVALID\",\n AUTH_REFRESH_FAILED = \"AUTH_REFRESH_FAILED\",\n AUTH_LOGIN_REQUIRED = \"AUTH_LOGIN_REQUIRED\",\n AUTH_TIMEOUT = \"AUTH_TIMEOUT\",\n\n // Configuration errors\n CONFIG_MISSING = \"CONFIG_MISSING\",\n CONFIG_INVALID = \"CONFIG_INVALID\",\n CONFIG_DOMAIN_NOT_FOUND = \"CONFIG_DOMAIN_NOT_FOUND\",\n\n // Network errors\n NETWORK_UNAVAILABLE = \"NETWORK_UNAVAILABLE\",\n NETWORK_TIMEOUT = \"NETWORK_TIMEOUT\",\n NETWORK_DNS_FAILED = \"NETWORK_DNS_FAILED\",\n\n // API errors (used by dataflint-mcp)\n API_UNAUTHORIZED = \"API_UNAUTHORIZED\",\n API_FORBIDDEN = \"API_FORBIDDEN\",\n API_NOT_FOUND = \"API_NOT_FOUND\",\n API_RATE_LIMITED = \"API_RATE_LIMITED\",\n API_SERVER_ERROR = \"API_SERVER_ERROR\",\n API_BAD_REQUEST = \"API_BAD_REQUEST\",\n\n // Service errors (used by dataflint-mcp)\n SERVICE_NOT_STARTED = \"SERVICE_NOT_STARTED\",\n SERVICE_UNAVAILABLE = \"SERVICE_UNAVAILABLE\",\n\n // Unknown\n UNKNOWN = \"UNKNOWN\",\n}\n\n/**\n * Base error class for all DataFlint errors\n */\nexport abstract class DataFlintError extends Error {\n abstract readonly code: ErrorCode;\n abstract readonly isRetryable: boolean;\n abstract readonly userAction: string;\n\n constructor(\n message: string,\n public readonly cause?: Error\n ) {\n super(message);\n this.name = this.constructor.name;\n\n // Maintain proper stack trace\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n\n /**\n * Get a user-friendly error message with action\n */\n getUserMessage(): string {\n return `${this.message}. ${this.userAction}`;\n }\n}\n\n/**\n * Authentication-related errors\n */\nexport class AuthError extends DataFlintError {\n readonly code: ErrorCode;\n readonly isRetryable: boolean;\n readonly userAction: string;\n\n constructor(\n code: ErrorCode,\n message: string,\n userAction: string,\n isRetryable: boolean = false,\n cause?: Error\n ) {\n super(message, cause);\n this.code = code;\n this.isRetryable = isRetryable;\n this.userAction = userAction;\n }\n\n static tokenExpired(cause?: Error): AuthError {\n return new AuthError(\n ErrorCode.AUTH_TOKEN_EXPIRED,\n \"Your session has expired\",\n 'Please click \"Login\" to authenticate again.',\n false,\n cause\n );\n }\n\n static tokenInvalid(cause?: Error): AuthError {\n return new AuthError(\n ErrorCode.AUTH_TOKEN_INVALID,\n \"Authentication token is invalid\",\n 'Please click \"Login\" to authenticate again.',\n false,\n cause\n );\n }\n\n static refreshFailed(cause?: Error): AuthError {\n return new AuthError(\n ErrorCode.AUTH_REFRESH_FAILED,\n \"Failed to refresh authentication\",\n 'Please click \"Login\" to authenticate again.',\n false,\n cause\n );\n }\n\n static loginRequired(): AuthError {\n return new AuthError(\n ErrorCode.AUTH_LOGIN_REQUIRED,\n \"Authentication required\",\n 'Please run \"DataFlint: Login\" from the command palette.',\n false\n );\n }\n\n static timeout(cause?: Error): AuthError {\n return new AuthError(\n ErrorCode.AUTH_TIMEOUT,\n \"Authentication timed out\",\n \"Please check your internet connection and try again.\",\n true,\n cause\n );\n }\n\n static notInitialized(): AuthError {\n return new AuthError(\n ErrorCode.AUTH_NOT_INITIALIZED,\n \"Authentication service not initialized\",\n 'Please run \"DataFlint: Restart Server\" to reinitialize.',\n true\n );\n }\n}\n\n/**\n * Configuration-related errors\n */\nexport class ConfigError extends DataFlintError {\n readonly code: ErrorCode;\n readonly isRetryable = false;\n readonly userAction: string;\n\n constructor(\n code: ErrorCode,\n message: string,\n userAction: string,\n cause?: Error\n ) {\n super(message, cause);\n this.code = code;\n this.userAction = userAction;\n }\n\n static missing(field: string): ConfigError {\n return new ConfigError(\n ErrorCode.CONFIG_MISSING,\n `Missing required configuration: ${field}`,\n 'Please check your DataFlint settings. Run \"DataFlint: Show Debug Information\" for details.'\n );\n }\n\n static invalid(\n field: string,\n value: string,\n expected: string\n ): ConfigError {\n return new ConfigError(\n ErrorCode.CONFIG_INVALID,\n `Invalid configuration for ${field}: \"${value}\"`,\n `Expected ${expected}. Please check your DataFlint settings.`\n );\n }\n\n static customerDomainNotFound(domain: string): ConfigError {\n return new ConfigError(\n ErrorCode.CONFIG_DOMAIN_NOT_FOUND,\n `Customer domain \"${domain}\" is not configured`,\n \"Please contact support to set up your organization's domain, or remove the customer domain setting.\"\n );\n }\n}\n\n/**\n * Network-related errors\n */\nexport class NetworkError extends DataFlintError {\n readonly code: ErrorCode;\n readonly isRetryable = true;\n readonly userAction: string;\n\n constructor(\n code: ErrorCode,\n message: string,\n userAction: string,\n cause?: Error\n ) {\n super(message, cause);\n this.code = code;\n this.userAction = userAction;\n }\n\n static unavailable(cause?: Error): NetworkError {\n return new NetworkError(\n ErrorCode.NETWORK_UNAVAILABLE,\n \"Cannot connect to server\",\n \"Please check your internet connection and try again.\",\n cause\n );\n }\n\n static timeout(cause?: Error): NetworkError {\n return new NetworkError(\n ErrorCode.NETWORK_TIMEOUT,\n \"Request timed out\",\n \"The server took too long to respond. Please check your connection and try again.\",\n cause\n );\n }\n\n static dnsFailed(host: string, cause?: Error): NetworkError {\n return new NetworkError(\n ErrorCode.NETWORK_DNS_FAILED,\n `Cannot resolve hostname: ${host}`,\n \"Please check your internet connection and DNS settings.\",\n cause\n );\n }\n}\n", "/**\n * Auth0 OAuth2/PKCE Authentication Service\n *\n * Provides interactive browser-based authentication using Auth0 with PKCE flow.\n * This is the primary authentication method for user-facing applications.\n */\n\nimport * as http from \"http\";\nimport { Client, Issuer, generators, custom } from \"openid-client\";\nimport { URL } from \"url\";\nimport {\n AuthConfig,\n AuthResult,\n OpenUrlHandler,\n ConfigProvider,\n IAuthLogger,\n} from \"./types\";\nimport { AuthError, ConfigError, NetworkError } from \"./errors\";\n\nconst AUTH_DISCOVERY_TIMEOUT_MS = 10_000; // 10 seconds\n\ncustom.setHttpOptionsDefaults({\n timeout: AUTH_DISCOVERY_TIMEOUT_MS,\n});\n\n/**\n * Default no-op logger for when no logger is provided\n */\nconst noopLogger: IAuthLogger = {\n info: () => {},\n warn: () => {},\n error: () => {},\n debug: () => {},\n};\n\n/**\n * Auth0 service for interactive OAuth2/PKCE authentication\n *\n * @example\n * ```typescript\n * const auth0Service = new Auth0Service(\n * async (url) => { await open(url); },\n * () => configService.getAuthConfig(),\n * logger\n * );\n *\n * await auth0Service.initialize();\n * const result = await auth0Service.authenticate();\n * console.log('Access Token:', result.accessToken);\n * ```\n */\nexport class Auth0Service {\n private config: AuthConfig;\n private redirectUri: string;\n private callbackPort: number;\n private client: Client | null = null;\n private issuer: Issuer | null = null;\n private initialized = false;\n private openUrlHandler: OpenUrlHandler;\n private logger: IAuthLogger;\n\n constructor(\n openUrlHandler: OpenUrlHandler,\n configProvider: ConfigProvider,\n logger?: IAuthLogger,\n callbackPort: number = 11334\n ) {\n this.logger = logger || noopLogger;\n this.openUrlHandler = openUrlHandler;\n this.config = {\n ...configProvider(),\n scope: configProvider().scope || \"openid profile email\",\n };\n this.callbackPort = callbackPort;\n this.redirectUri = `http://localhost:${callbackPort}/callback`;\n this.logger.info(\n `Auth0Service initialized for domain: ${this.config.domain}`\n );\n }\n\n /**\n * Initialize the Auth0 client by discovering the issuer metadata\n */\n async initialize(): Promise<void> {\n if (this.initialized) {\n this.logger.debug(\"Auth0 client already initialized\");\n return;\n }\n\n try {\n const issuerUrl = this.config.domain.startsWith(\"http\")\n ? this.config.domain\n : `https://${this.config.domain}`;\n\n this.logger.info(\n `Attempting to discover Auth0 issuer at: ${issuerUrl}`\n );\n this.logger.debug(`Discovery URL will be: ${issuerUrl}`);\n\n this.issuer = await Issuer.discover(issuerUrl);\n this.logger.info(\n `Auth0 issuer discovered successfully: ${this.issuer.issuer}`\n );\n\n this.client = new this.issuer.Client({\n client_id: this.config.clientId,\n redirect_uris: [this.redirectUri],\n response_types: [\"code\"],\n token_endpoint_auth_method: \"none\", // Public client, no client secret required\n });\n\n this.initialized = true;\n this.logger.info(\"Auth0 client initialized successfully\");\n } catch (error) {\n this.logger.error(\"Failed to initialize Auth0 client\", error);\n this.logger.error(`Auth0 domain: ${this.config.domain}`);\n this.logger.error(`Client ID: ${this.config.clientId}`);\n this.logger.error(\n `Constructed issuer URL: ${this.config.domain.startsWith(\"http\") ? this.config.domain : `https://${this.config.domain}`}`\n );\n\n // Classify the error type for better user messaging\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n\n // Domain not found (404)\n if (message.includes(\"404\") || message.includes(\"not found\")) {\n throw ConfigError.invalid(\n \"Auth0 domain\",\n this.config.domain,\n \"a valid Auth0 domain (e.g., your-tenant.auth0.com)\"\n );\n }\n\n // DNS resolution failed\n if (\n message.includes(\"enotfound\") ||\n message.includes(\"getaddrinfo\")\n ) {\n throw NetworkError.dnsFailed(this.config.domain, error);\n }\n\n // Timeout\n if (\n message.includes(\"timeout\") ||\n message.includes(\"etimedout\")\n ) {\n throw AuthError.timeout(error);\n }\n\n // Connection refused\n if (\n message.includes(\"econnrefused\") ||\n message.includes(\"econnreset\")\n ) {\n throw NetworkError.unavailable(error);\n }\n }\n\n // Default: wrap as auth error\n throw new AuthError(\n \"AUTH_NOT_INITIALIZED\" as any,\n `Auth0 initialization failed: ${error instanceof Error ? error.message : String(error)}`,\n \"Please check your internet connection and Auth0 configuration.\",\n false,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Start the authentication flow\n */\n async authenticate(): Promise<AuthResult> {\n if (!this.client) {\n await this.initialize();\n }\n\n if (!this.client) {\n throw AuthError.notInitialized();\n }\n\n // Generate PKCE code verifier/challenge for security\n const codeVerifier = generators.codeVerifier();\n const codeChallenge = generators.codeChallenge(codeVerifier);\n\n // Create the authorization URL\n const authUrl = this.client.authorizationUrl({\n scope: this.config.scope,\n code_challenge: codeChallenge,\n code_challenge_method: \"S256\",\n ...(this.config.audience && { audience: this.config.audience }),\n });\n\n this.logger.info(\"Opening browser for authentication...\");\n\n try {\n await this.openUrlHandler(authUrl);\n } catch (error) {\n this.logger.error(\"Failed to open browser\", error);\n this.logger.info(`Please manually navigate to: ${authUrl}`);\n }\n\n // Wait for the callback and exchange the code for tokens\n return new Promise((resolve, reject) => {\n const server = http.createServer(async (req, res) => {\n try {\n if (!req.url?.startsWith(\"/callback\")) {\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"Not Found\");\n return;\n }\n\n const callbackUrl = new URL(\n `http://localhost:${this.callbackPort}${req.url}`\n );\n const params = this.client!.callbackParams(\n callbackUrl.toString()\n );\n\n // Exchange authorization code for tokens\n const tokenSet = await this.client!.callback(\n this.redirectUri,\n params,\n {\n code_verifier: codeVerifier,\n }\n );\n\n const authResult = this.processTokenSet(tokenSet);\n\n // Send success response\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(`\n <html>\n <body style=\"font-family: Arial, sans-serif; text-align: center; padding: 50px;\">\n <h2 style=\"color: #4CAF50;\">Authentication Successful!</h2>\n <p>You can now close this tab and return to VS Code/Cursor.</p>\n <script>\n setTimeout(() => {\n window.close();\n }, 3000);\n </script>\n </body>\n </html>\n `);\n\n server.close();\n resolve(authResult);\n } catch (error) {\n this.logger.error(\"Authentication callback error\", error);\n\n // Send error response\n res.writeHead(400, { \"Content-Type\": \"text/html\" });\n res.end(`\n <html>\n <body style=\"font-family: Arial, sans-serif; text-align: center; padding: 50px;\">\n <h2 style=\"color: #f44336;\">Authentication Failed</h2>\n <p>Error: ${error}</p>\n <p>Please try again.</p>\n </body>\n </html>\n `);\n\n server.close();\n reject(error);\n }\n });\n\n server.listen(this.callbackPort, () => {\n this.logger.info(\n `Listening for Auth0 callback on http://localhost:${this.callbackPort}/callback`\n );\n });\n\n // Add timeout to prevent hanging\n setTimeout(() => {\n server.close();\n reject(AuthError.timeout());\n }, 300000); // 5 minutes timeout\n });\n }\n\n /**\n * Get user information using the access token\n */\n async getUserInfo(accessToken: string): Promise<unknown> {\n if (!this.client) {\n throw AuthError.notInitialized();\n }\n\n try {\n this.logger.info(\"Fetching user information...\");\n\n const userInfo = await this.client.userinfo(accessToken);\n\n this.logger.info(\"User information retrieved successfully\");\n this.logger.debug(`User ID: ${userInfo.sub}`);\n\n return userInfo;\n } catch (error) {\n this.logger.error(\"Failed to get user info\", error);\n throw error;\n }\n }\n\n /**\n * Refresh the access token using refresh token\n */\n async refreshToken(refreshToken: string): Promise<AuthResult> {\n if (!this.client) {\n throw AuthError.notInitialized();\n }\n\n try {\n this.logger.info(\"Refreshing access token...\");\n\n const tokenSet = await this.client.refresh(refreshToken);\n const result = this.processTokenSet(tokenSet);\n\n this.logger.info(\"Token refresh completed successfully\");\n return result;\n } catch (error) {\n this.logger.error(\"Token refresh failed\", error);\n throw error;\n }\n }\n\n /**\n * Process token set and return structured result\n */\n private processTokenSet(tokenSet: {\n access_token?: string;\n id_token?: string;\n refresh_token?: string;\n expires_at?: number;\n }): AuthResult {\n const result: AuthResult = {\n accessToken: tokenSet.access_token!,\n idToken: tokenSet.id_token,\n refreshToken: tokenSet.refresh_token,\n };\n\n if (tokenSet.expires_at) {\n result.expiresAt = new Date(tokenSet.expires_at * 1000);\n }\n\n this.logger.info(\"Authentication tokens processed successfully\");\n this.logger.debug(\n `Access Token: ${result.accessToken?.substring(0, 20)}...`\n );\n this.logger.debug(\n `ID Token: ${result.idToken ? \"Present\" : \"Not provided\"}`\n );\n this.logger.debug(\n `Refresh Token: ${result.refreshToken ? \"Present\" : \"Not provided\"}`\n );\n this.logger.debug(`Expires At: ${result.expiresAt}`);\n\n return result;\n }\n\n /**\n * Check if a token is expired\n */\n isTokenExpired(authResult: AuthResult): boolean {\n if (!authResult.expiresAt) {\n this.logger.debug(\n \"No expiration time available, considering token valid\"\n );\n return false; // If no expiration time, assume it's still valid\n }\n\n // Ensure expiresAt is a Date object (it might be a string if serialized)\n const expiresAt =\n authResult.expiresAt instanceof Date\n ? authResult.expiresAt\n : new Date(authResult.expiresAt);\n\n const now = new Date();\n const buffer = 5 * 60 * 1000; // 5 minutes buffer\n const isExpired = expiresAt.getTime() - buffer < now.getTime();\n\n if (isExpired) {\n this.logger.warn(\"Access token is expired or will expire soon\");\n } else {\n this.logger.debug(\"Access token is still valid\");\n }\n\n return isExpired;\n }\n\n /**\n * Logout (revoke tokens if supported)\n */\n async logout(accessToken: string): Promise<void> {\n if (!this.client) {\n throw AuthError.notInitialized();\n }\n\n try {\n await this.client.revoke(accessToken);\n this.logger.info(\"Token revoked successfully\");\n } catch (error) {\n this.logger.error(\"Failed to revoke token\", error);\n // Don't throw error as logout should be graceful\n }\n }\n}\n\n// Re-export AuthResult for convenience\nexport type { AuthResult };\n", "/**\n * Auth0 Machine-to-Machine (M2M) Authentication Service\n *\n * Provides authentication using Auth0's client credentials grant.\n * This is used for server-to-server communication where no user interaction is needed.\n *\n * The service automatically caches tokens and refreshes them before expiration.\n */\n\nimport {\n IAuthStrategy,\n AuthStrategyType,\n AuthUserInfo,\n Auth0M2MCredentials,\n IAuthLogger,\n} from \"./types\";\n\ninterface TokenCacheEntry {\n accessToken: string;\n expiresAt: number;\n}\n\n/**\n * Default no-op logger for when no logger is provided\n */\nconst noopLogger: IAuthLogger = {\n info: () => {},\n warn: () => {},\n error: () => {},\n debug: () => {},\n};\n\n/**\n * Token response from Auth0 client credentials grant\n */\ninterface Auth0TokenResponse {\n access_token: string;\n token_type: string;\n expires_in: number;\n scope?: string;\n}\n\n/**\n * Auth0 M2M authentication strategy using client credentials grant\n *\n * @example\n * ```typescript\n * const credentials: Auth0M2MCredentials = {\n * client_id: 'my-client-id',\n * client_secret: 'my-client-secret',\n * domain: 'https://my-tenant.auth0.com',\n * audience: 'https://api.example.com',\n * };\n *\n * const service = new Auth0M2MService(credentials, 'tenant-123', logger);\n * await service.initialize();\n * const token = await service.getToken();\n * ```\n */\nexport class Auth0M2MService implements IAuthStrategy {\n private credentials: Auth0M2MCredentials;\n private tenantId: string | undefined;\n private tokenCache: TokenCacheEntry | null = null;\n private logger: IAuthLogger;\n private initialized = false;\n\n /**\n * Token expiry buffer in milliseconds (5 minutes)\n * Tokens will be refreshed this long before actual expiration\n */\n private static readonly EXPIRY_BUFFER_MS = 5 * 60 * 1000;\n\n constructor(\n credentials: Auth0M2MCredentials,\n tenantId?: string,\n logger?: IAuthLogger\n ) {\n this.credentials = credentials;\n this.tenantId = tenantId;\n this.logger = logger || noopLogger;\n\n // Security: only log partial client_id\n const clientIdPrefix = credentials.client_id.substring(0, 8);\n this.logger.info(\n `Auth0M2MService created for client: ${clientIdPrefix}...`\n );\n }\n\n /**\n * Get the strategy type identifier\n */\n getType(): AuthStrategyType {\n return AuthStrategyType.AUTH0_M2M;\n }\n\n /**\n * Initialize the M2M service\n * Validates credentials format and performs initial token fetch\n */\n async initialize(): Promise<void> {\n if (this.initialized) {\n this.logger.debug(\"Auth0M2MService already initialized\");\n return;\n }\n\n this.logger.info(\"Initializing Auth0M2MService...\");\n\n // Validate credentials\n if (!this.credentials.client_id || !this.credentials.client_secret) {\n throw new Error(\n \"M2M credentials missing client_id or client_secret\"\n );\n }\n if (!this.credentials.domain) {\n throw new Error(\"M2M credentials missing domain\");\n }\n if (!this.credentials.audience) {\n throw new Error(\"M2M credentials missing audience\");\n }\n\n // Perform initial token fetch to validate credentials\n await this.fetchNewToken();\n\n this.initialized = true;\n this.logger.info(\"Auth0M2MService initialized successfully\");\n }\n\n /**\n * Get a valid access token, fetching a new one if cache is expired\n */\n async getToken(): Promise<string> {\n const now = Date.now();\n\n // Check if we have a valid cached token (with buffer)\n if (\n this.tokenCache &&\n now < this.tokenCache.expiresAt - Auth0M2MService.EXPIRY_BUFFER_MS\n ) {\n this.logger.debug(\"Using cached M2M token\");\n return this.tokenCache.accessToken;\n }\n\n this.logger.info(\n \"M2M token expired or not cached, fetching new token...\"\n );\n await this.fetchNewToken();\n\n return this.tokenCache!.accessToken;\n }\n\n /**\n * Force refresh the token by clearing cache and fetching a new one\n */\n async refreshToken(): Promise<void> {\n this.logger.info(\"Force refreshing M2M token...\");\n this.tokenCache = null;\n await this.fetchNewToken();\n this.logger.info(\"M2M token refreshed\");\n }\n\n /**\n * Check if currently authenticated (credentials are valid)\n */\n async isAuthenticated(): Promise<boolean> {\n try {\n await this.getToken();\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Get user information for the M2M client\n * Returns synthetic user info since M2M clients don't have traditional user profiles\n */\n async getUserInfo(): Promise<AuthUserInfo> {\n const clientIdPrefix = this.credentials.client_id.substring(0, 8);\n return {\n sub: `m2m-client-${clientIdPrefix}`,\n name: \"M2M Client\",\n ...(this.tenantId && { tenant_id: this.tenantId }),\n };\n }\n\n /**\n * Get the tenant ID associated with this M2M client\n */\n getTenantId(): string | undefined {\n return this.tenantId;\n }\n\n /**\n * Fetch a new token from Auth0 using client credentials grant\n */\n private async fetchNewToken(): Promise<void> {\n const domain = this.credentials.domain.startsWith(\"http\")\n ? this.credentials.domain\n : `https://${this.credentials.domain}`;\n\n const tokenUrl = `${domain.replace(/\\/$/, \"\")}/oauth/token`;\n\n this.logger.debug(`Fetching M2M token from: ${tokenUrl}`);\n\n const requestBody = {\n grant_type: \"client_credentials\",\n client_id: this.credentials.client_id,\n client_secret: this.credentials.client_secret,\n audience: this.credentials.audience,\n };\n\n try {\n const response = await fetch(tokenUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n this.logger.error(\n `M2M token request failed: ${response.status}`\n );\n throw new Error(\n `Auth0 M2M token request failed with status ${response.status}`\n );\n }\n\n const tokenResponse = (await response.json()) as Auth0TokenResponse;\n\n if (!tokenResponse.access_token) {\n throw new Error(\"Auth0 response missing access_token\");\n }\n\n const expiresIn = tokenResponse.expires_in || 3600; // Default to 1 hour\n const expiresAt = Date.now() + expiresIn * 1000;\n\n this.tokenCache = {\n accessToken: tokenResponse.access_token,\n expiresAt,\n };\n\n const expiresInMinutes = Math.floor(expiresIn / 60);\n this.logger.info(\n `M2M token obtained${this.tenantId ? ` for tenant ${this.tenantId}` : \"\"}: expires in ${expiresInMinutes} minutes`\n );\n } catch (error) {\n // Clear cache on error\n this.tokenCache = null;\n\n if (error instanceof Error) {\n this.logger.error(\"Failed to fetch M2M token\", error);\n throw error;\n }\n\n throw new Error(`Failed to fetch M2M token: ${error}`);\n }\n }\n}\n", "/**\n * Service Account Authentication Service\n *\n * Provides authentication using a pre-generated JWT token read from a file.\n * This is typically used for M2M (machine-to-machine) scenarios where a service\n * account token is mounted as a file (e.g., in Kubernetes).\n *\n * The token is expected to be a valid JWT with an 'exp' claim.\n */\n\nimport * as fs from \"fs\";\nimport {\n IAuthStrategy,\n AuthStrategyType,\n AuthUserInfo,\n IAuthLogger,\n} from \"./types\";\n\ninterface TokenCacheEntry {\n token: string;\n expiresAt: number;\n}\n\n/**\n * Default no-op logger for when no logger is provided\n */\nconst noopLogger: IAuthLogger = {\n info: () => {},\n warn: () => {},\n error: () => {},\n debug: () => {},\n};\n\n/**\n * Service Account authentication strategy\n *\n * Reads a JWT token from a file path and manages token caching and expiration.\n *\n * @example\n * ```typescript\n * const service = new ServiceAccountService(\n * '/var/run/secrets/dataflint/token',\n * 'tenant-123',\n * logger\n * );\n *\n * await service.initialize();\n * const token = await service.getToken();\n * ```\n */\nexport class ServiceAccountService implements IAuthStrategy {\n private tokenPath: string;\n private tenantId: string | undefined;\n private tokenCache: TokenCacheEntry | null = null;\n private logger: IAuthLogger;\n\n constructor(tokenPath: string, tenantId?: string, logger?: IAuthLogger) {\n this.tokenPath = tokenPath;\n this.tenantId = tenantId;\n this.logger = logger || noopLogger;\n }\n\n /**\n * Get the strategy type identifier\n */\n getType(): AuthStrategyType {\n return AuthStrategyType.SERVICE_ACCOUNT;\n }\n\n /**\n * Initialize the service account strategy\n * Validates that the token file exists and is readable\n */\n async initialize(): Promise<void> {\n this.logger.info(\n `Initializing ServiceAccountService with token path: ${this.tokenPath}`\n );\n\n if (!fs.existsSync(this.tokenPath)) {\n throw new Error(\n `Service account token file not found: ${this.tokenPath}`\n );\n }\n\n // Pre-load and validate the token\n await this.getToken();\n this.logger.info(\"ServiceAccountService initialized successfully\");\n }\n\n /**\n * Get a valid access token, reading from file if cache is expired\n */\n async getToken(): Promise<string> {\n const now = Date.now();\n\n // Check if we have a valid cached token (with 5-minute buffer)\n const bufferMs = 5 * 60 * 1000;\n if (this.tokenCache && now < this.tokenCache.expiresAt - bufferMs) {\n this.logger.debug(\"Using cached service account token\");\n return this.tokenCache.token;\n }\n\n const rawToken = this.readTokenFromFile();\n this.validateAndCacheToken(rawToken);\n\n return this.tokenCache!.token;\n }\n\n /**\n * Force refresh the token by clearing cache and re-reading from file\n */\n async refreshToken(): Promise<void> {\n this.logger.info(\"Refreshing service account token...\");\n this.tokenCache = null;\n await this.getToken();\n this.logger.info(\"Service account token refreshed\");\n }\n\n /**\n * Check if currently authenticated (token file exists and is valid)\n */\n async isAuthenticated(): Promise<boolean> {\n try {\n await this.getToken();\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Get user information for the service account\n * Returns synthetic user info since service accounts don't have traditional user profiles\n */\n async getUserInfo(): Promise<AuthUserInfo> {\n return {\n sub: \"m2m-service-account\",\n name: \"M2M Service Account\",\n ...(this.tenantId && { tenant_id: this.tenantId }),\n };\n }\n\n /**\n * Get the tenant ID associated with this service account\n */\n getTenantId(): string | undefined {\n return this.tenantId;\n }\n\n /**\n * Read the token from the file system\n */\n private readTokenFromFile(): string {\n return fs.readFileSync(this.tokenPath, \"utf8\");\n }\n\n /**\n * Validate the token format and cache it with expiration\n */\n private validateAndCacheToken(rawToken: string): void {\n const token = rawToken.trim();\n\n if (!token) {\n throw new Error(\"Service account token is empty\");\n }\n\n const parts = token.split(\".\");\n if (parts.length !== 3) {\n throw new Error(\n `Invalid JWT format: expected 3 parts, got ${parts.length}`\n );\n }\n\n const expiresAt = this.extractExpiration(token);\n const now = Date.now();\n const expiresIn = Math.floor((expiresAt - now) / 1000);\n\n // Check if token is already expired\n if (expiresAt <= now) {\n throw new Error(\"Service account token is expired\");\n }\n\n this.logger.info(\n `Service account token loaded${this.tenantId ? ` for tenant ${this.tenantId}` : \"\"}: expires in ${expiresIn}s (${new Date(expiresAt).toISOString()})`\n );\n\n this.tokenCache = {\n token,\n expiresAt,\n };\n }\n\n /**\n * Extract expiration time from JWT payload\n */\n private extractExpiration(token: string): number {\n const parts = token.split(\".\");\n\n try {\n const payload = parts[1];\n const decoded = Buffer.from(payload, \"base64url\").toString(\"utf8\");\n const parsed = JSON.parse(decoded);\n\n if (typeof parsed.exp === \"number\") {\n return parsed.exp * 1000;\n }\n\n this.logger.warn(\n \"JWT missing 'exp' field, using fallback expiration\"\n );\n return Date.now() + 300000; // 5 minutes fallback\n } catch (error) {\n this.logger.warn(\n `Failed to parse JWT expiration: ${error}, using fallback expiration`\n );\n return Date.now() + 300000; // 5 minutes fallback\n }\n }\n}\n", "/**\n * AWS Secrets Manager Provider\n *\n * Loads M2M credentials from AWS Secrets Manager.\n * Uses dynamic import to avoid requiring AWS SDK when not in AWS environment.\n */\n\nimport { Auth0M2MCredentials, IAuthLogger } from \"../types\";\nimport { ISecretsProvider } from \"./types\";\n\n/**\n * Default no-op logger\n */\nconst noopLogger: IAuthLogger = {\n info: () => {},\n warn: () => {},\n error: () => {},\n debug: () => {},\n};\n\n/**\n * AWS Secrets Manager provider for M2M credentials\n *\n * This provider:\n * 1. Detects AWS environment via env vars\n * 2. Dynamically imports AWS SDK to avoid bundling overhead\n * 3. Loads credentials from Secrets Manager\n *\n * @example\n * ```typescript\n * const provider = new AWSSecretsProvider(logger);\n * if (await provider.isAvailable()) {\n * const credentials = await provider.loadAuth0M2MCredentials('my-secret-name');\n * }\n * ```\n */\nexport class AWSSecretsProvider implements ISecretsProvider {\n private logger: IAuthLogger;\n private region: string | undefined;\n\n constructor(logger?: IAuthLogger) {\n this.logger = logger || noopLogger;\n this.region = process.env.AWS_REGION || process.env.AWS_DEFAULT_REGION;\n }\n\n /**\n * Get the provider name for logging\n */\n getName(): string {\n return \"AWS Secrets Manager\";\n }\n\n /**\n * Check if running in AWS environment with credentials available\n */\n async isAvailable(): Promise<boolean> {\n // Check for AWS environment indicators\n const hasRegion = !!(\n process.env.AWS_REGION || process.env.AWS_DEFAULT_REGION\n );\n const hasExecutionEnv = !!process.env.AWS_EXECUTION_ENV;\n const hasCredentials = !!(\n process.env.AWS_ACCESS_KEY_ID ||\n process.env.AWS_CONTAINER_CREDENTIALS_RELATIVE_URI ||\n process.env.AWS_WEB_IDENTITY_TOKEN_FILE\n );\n\n const isAWSEnvironment =\n hasRegion && (hasExecutionEnv || hasCredentials);\n\n if (isAWSEnvironment) {\n this.logger.debug(\"AWS environment detected\");\n } else {\n this.logger.debug(\"Not in AWS environment\");\n }\n\n return isAWSEnvironment;\n }\n\n /**\n * Load Auth0 M2M credentials from AWS Secrets Manager\n *\n * @param secretName - The name or ARN of the secret in Secrets Manager\n * @returns M2M credentials or null if not found\n */\n async loadAuth0M2MCredentials(\n secretName: string\n ): Promise<Auth0M2MCredentials | null> {\n this.logger.info(\n `Loading M2M credentials from AWS Secrets Manager: ${secretName}`\n );\n\n try {\n // Dynamic import to avoid bundling AWS SDK when not needed\n const { SecretsManagerClient, GetSecretValueCommand } =\n // @ts-expect-error - @aws-sdk/client-secrets-manager is an optional runtime dependency\n await import(\"@aws-sdk/client-secrets-manager\");\n\n const client = new SecretsManagerClient({\n region: this.region,\n });\n\n const command = new GetSecretValueCommand({\n SecretId: secretName,\n });\n\n const response = await client.send(command);\n\n if (!response.SecretString) {\n this.logger.error(\"Secret value is empty or binary\");\n return null;\n }\n\n const secretValue = JSON.parse(response.SecretString);\n\n // Validate required fields\n if (\n !secretValue.client_id ||\n !secretValue.client_secret ||\n !secretValue.audience ||\n !secretValue.domain\n ) {\n this.logger.error(\n \"Secret missing required fields (client_id, client_secret, audience, domain)\"\n );\n return null;\n }\n\n this.logger.info(\"M2M credentials loaded from AWS Secrets Manager\");\n return {\n client_id: secretValue.client_id,\n client_secret: secretValue.client_secret,\n audience: secretValue.audience,\n domain: secretValue.domain,\n };\n } catch (error) {\n if (error instanceof Error) {\n if (error.name === \"ResourceNotFoundException\") {\n this.logger.warn(`Secret not found: ${secretName}`);\n return null;\n }\n if (error.message.includes(\"Cannot find module\")) {\n this.logger.warn(\n \"AWS SDK not available - @aws-sdk/client-secrets-manager not installed\"\n );\n return null;\n }\n this.logger.error(\"Failed to load secret from AWS\", error);\n }\n return null;\n }\n }\n}\n", "/**\n * Local File Secrets Provider\n *\n * Loads M2M credentials from local file system.\n * Primarily used for local development and testing.\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { Auth0M2MCredentials, IAuthLogger } from \"../types\";\nimport { ISecretsProvider } from \"./types\";\n\n/**\n * Default no-op logger\n */\nconst noopLogger: IAuthLogger = {\n info: () => {},\n warn: () => {},\n error: () => {},\n debug: () => {},\n};\n\n/**\n * Local file secrets provider for M2M credentials\n *\n * Loads credentials from `~/.dataflint/m2m_secret.{environment}.json`\n *\n * @example\n * ```typescript\n * const provider = new LocalFileSecretsProvider('prod', logger);\n * if (await provider.isAvailable()) {\n * const credentials = await provider.loadAuth0M2MCredentials('unused');\n * }\n * ```\n */\nexport class LocalFileSecretsProvider implements ISecretsProvider {\n private logger: IAuthLogger;\n private environment: string;\n private secretFilePath: string;\n\n constructor(environment: string, logger?: IAuthLogger) {\n this.logger = logger || noopLogger;\n this.environment = environment;\n this.secretFilePath = path.join(\n os.homedir(),\n \".dataflint\",\n `m2m_secret.${environment}.json`\n );\n }\n\n /**\n * Get the provider name for logging\n */\n getName(): string {\n return \"Local File\";\n }\n\n /**\n * Check if the local secret file exists\n */\n async isAvailable(): Promise<boolean> {\n const exists = fs.existsSync(this.secretFilePath);\n\n if (exists) {\n this.logger.debug(\n `Local M2M secret file found: ${this.secretFilePath}`\n );\n } else {\n this.logger.debug(\n `Local M2M secret file not found: ${this.secretFilePath}`\n );\n }\n\n return exists;\n }\n\n /**\n * Load Auth0 M2M credentials from local file\n *\n * @param _secretName - Ignored, uses environment-based file path\n * @returns M2M credentials or null if not found or invalid\n */\n async loadAuth0M2MCredentials(\n _secretName: string\n ): Promise<Auth0M2MCredentials | null> {\n this.logger.info(\n `Loading M2M credentials from local file: ${this.secretFilePath}`\n );\n\n try {\n if (!fs.existsSync(this.secretFilePath)) {\n this.logger.debug(\"Local secret file does not exist\");\n return null;\n }\n\n // Check file permissions (should be 0600 for security)\n const stats = fs.statSync(this.secretFilePath);\n const mode = stats.mode & 0o777;\n if (mode !== 0o600) {\n this.logger.warn(\n `Secret file has insecure permissions: ${mode.toString(8)}. Should be 600.`\n );\n }\n\n const content = fs.readFileSync(this.secretFilePath, \"utf8\");\n const secretValue = JSON.parse(content);\n\n // Validate required fields\n if (\n !secretValue.client_id ||\n !secretValue.client_secret ||\n !secretValue.audience ||\n !secretValue.domain\n ) {\n this.logger.error(\n \"Local secret file missing required fields (client_id, client_secret, audience, domain)\"\n );\n return null;\n }\n\n this.logger.info(\"M2M credentials loaded from local file\");\n return {\n client_id: secretValue.client_id,\n client_secret: secretValue.client_secret,\n audience: secretValue.audience,\n domain: secretValue.domain,\n };\n } catch (error) {\n if (error instanceof SyntaxError) {\n this.logger.error(\"Failed to parse local secret file as JSON\");\n } else {\n this.logger.error(\"Failed to load local secret file\", error);\n }\n return null;\n }\n }\n\n /**\n * Get the path to the secret file (for diagnostics)\n */\n getSecretFilePath(): string {\n return this.secretFilePath;\n }\n}\n", "/**\n * Composite Secrets Provider\n *\n * Tries multiple secrets providers in priority order:\n * 1. AWS Secrets Manager (production environments)\n * 2. Local file (development/testing)\n */\n\nimport { Auth0M2MCredentials, IAuthLogger } from \"../types\";\nimport { ISecretsProvider } from \"./types\";\nimport { AWSSecretsProvider } from \"./aws-secrets-provider\";\nimport { LocalFileSecretsProvider } from \"./local-file-secrets-provider\";\n\n/**\n * Default no-op logger\n */\nconst noopLogger: IAuthLogger = {\n info: () => {},\n warn: () => {},\n error: () => {},\n debug: () => {},\n};\n\n/**\n * Composite secrets provider that tries multiple sources in order\n *\n * Priority:\n * 1. AWS Secrets Manager (if in AWS environment)\n * 2. Local file (~/.dataflint/m2m_secret.{env}.json)\n *\n * @example\n * ```typescript\n * const provider = new SecretsProvider('prod', logger);\n * const credentials = await provider.loadAuth0M2MCredentials('auth0_m2m_databricks_loader_prod');\n * if (credentials) {\n * // Use credentials for Auth0 M2M authentication\n * }\n * ```\n */\nexport class SecretsProvider implements ISecretsProvider {\n private logger: IAuthLogger;\n private providers: ISecretsProvider[];\n private environment: string;\n\n constructor(environment: string, logger?: IAuthLogger) {\n this.logger = logger || noopLogger;\n this.environment = environment;\n\n // Initialize providers in priority order\n this.providers = [\n new AWSSecretsProvider(logger),\n new LocalFileSecretsProvider(environment, logger),\n ];\n }\n\n /**\n * Get the provider name for logging\n */\n getName(): string {\n return \"Composite Secrets Provider\";\n }\n\n /**\n * Check if any provider is available\n */\n async isAvailable(): Promise<boolean> {\n for (const provider of this.providers) {\n if (await provider.isAvailable()) {\n this.logger.debug(\n `Secrets provider available: ${provider.getName()}`\n );\n return true;\n }\n }\n this.logger.debug(\"No secrets providers available\");\n return false;\n }\n\n /**\n * Load Auth0 M2M credentials from the first available provider\n *\n * @param secretName - The name of the secret (used for AWS, ignored for local file)\n * @returns M2M credentials or null if not found in any provider\n */\n async loadAuth0M2MCredentials(\n secretName: string\n ): Promise<Auth0M2MCredentials | null> {\n this.logger.info(\"Attempting to load M2M credentials...\");\n\n for (const provider of this.providers) {\n const providerName = provider.getName();\n\n if (!(await provider.isAvailable())) {\n this.logger.debug(`Provider not available: ${providerName}`);\n continue;\n }\n\n this.logger.info(`Trying provider: ${providerName}`);\n const credentials =\n await provider.loadAuth0M2MCredentials(secretName);\n\n if (credentials) {\n this.logger.info(\n `M2M credentials loaded from: ${providerName}`\n );\n return credentials;\n }\n\n this.logger.debug(\n `No credentials found in provider: ${providerName}`\n );\n }\n\n this.logger.info(\"No M2M credentials found in any provider\");\n return null;\n }\n\n /**\n * Get the default secret name for M2M credentials based on environment\n *\n * @param environment - The environment (prod, staging, local)\n * @returns The default secret name\n */\n static getDefaultSecretName(environment: string): string {\n return `auth0_m2m_databricks_loader_${environment}`;\n }\n}\n", "/**\n * Secrets Providers Module\n *\n * Provides multiple strategies for loading M2M credentials:\n * - AWS Secrets Manager (production)\n * - Local file (development)\n */\n\nexport { ISecretsProvider } from \"./types\";\nexport { AWSSecretsProvider } from \"./aws-secrets-provider\";\nexport { LocalFileSecretsProvider } from \"./local-file-secrets-provider\";\nexport { SecretsProvider } from \"./secrets-provider\";\n", "/**\n * Authentication Strategy Factory\n *\n * Creates the appropriate authentication strategy based on configuration and environment.\n *\n * Strategy Priority (for MCP standalone server):\n * 1. Service Account - M2M_SA_TOKEN_PATH env var \u2192 read JWT from file\n * 2. Auth0 M2M - Secrets available \u2192 client credentials grant\n * 3. Auth0 User - Interactive OAuth2/PKCE flow (fallback, returned as null)\n *\n * Note: VS Code Extension only uses Auth0 User flow directly (no factory needed).\n */\n\nimport {\n IAuthStrategy,\n AuthStrategyType,\n IAuthConfigProvider,\n IAuthLogger,\n M2MMode,\n M2MType,\n} from \"./types\";\nimport { ServiceAccountService } from \"./service-account-service\";\nimport { Auth0M2MService } from \"./auth0-m2m-service\";\nimport { SecretsProvider } from \"./secrets\";\n\n/**\n * Result from strategy creation\n */\nexport interface StrategyResult {\n /**\n * The created strategy, or null if fallback to interactive OAuth is needed\n */\n strategy: IAuthStrategy | null;\n\n /**\n * The type of strategy created (or 'auth0_user' if null strategy)\n */\n strategyType: AuthStrategyType;\n}\n\n/**\n * Default no-op logger\n */\nconst noopLogger: IAuthLogger = {\n info: () => {},\n warn: () => {},\n error: () => {},\n debug: () => {},\n};\n\n/**\n * Factory for creating authentication strategies\n *\n * This factory determines the best authentication strategy based on:\n * 1. Environment configuration (M2M_SA_TOKEN_PATH)\n * 2. Available secrets (AWS Secrets Manager or local file)\n * 3. Falls back to interactive OAuth if no M2M strategy is available\n *\n * @example\n * ```typescript\n * const factory = new AuthStrategyFactory(configService, logger);\n * const { strategy, strategyType } = await factory.createStrategy();\n *\n * if (strategy) {\n * // Use M2M strategy (ServiceAccount or Auth0 M2M)\n * await strategy.initialize();\n * const token = await strategy.getToken();\n * } else {\n * // Fall back to interactive Auth0 OAuth flow\n * const auth0Service = new Auth0Service(...);\n * await auth0Service.authenticate();\n * }\n * ```\n */\nexport class AuthStrategyFactory {\n private configProvider: IAuthConfigProvider;\n private logger: IAuthLogger;\n\n constructor(configProvider: IAuthConfigProvider, logger?: IAuthLogger) {\n this.configProvider = configProvider;\n this.logger = logger || noopLogger;\n }\n\n async createStrategy(): Promise<StrategyResult> {\n const m2mMode = this.configProvider.getM2MMode();\n\n switch (m2mMode.type) {\n case M2MType.SERVICE_ACCOUNT:\n return this.buildServiceAccountStrategy(m2mMode);\n case M2MType.AUTH0_M2M:\n return await this.buildAuth0M2MStrategy(m2mMode);\n default:\n this.logger.info(\"Using interactive OAuth flow\");\n return {\n strategy: null,\n strategyType: AuthStrategyType.AUTH0_USER,\n };\n }\n }\n\n private buildServiceAccountStrategy(\n mode: Extract<M2MMode, { type: M2MType.SERVICE_ACCOUNT }>\n ): StrategyResult {\n this.logger.info(`Service Account mode: ${mode.tokenPath}`);\n return {\n strategy: new ServiceAccountService(\n mode.tokenPath,\n mode.tenantId,\n this.logger\n ),\n strategyType: AuthStrategyType.SERVICE_ACCOUNT,\n };\n }\n\n private async buildAuth0M2MStrategy(\n mode: Extract<M2MMode, { type: M2MType.AUTH0_M2M }>\n ): Promise<StrategyResult> {\n const secretsProvider = new SecretsProvider(\n this.configProvider.getEnvironment(),\n this.logger\n );\n\n if (!(await secretsProvider.isAvailable())) {\n throw new Error(\n `Auth0 M2M mode requires a secrets provider. ` +\n `M2M_AUTH0_SECRET_NAME is set to \"${mode.secretName}\" but no secrets provider is available. ` +\n `Ensure AWS credentials are configured or use Service Account mode instead.`\n );\n }\n\n const credentials = await secretsProvider.loadAuth0M2MCredentials(\n mode.secretName\n );\n if (!credentials) {\n throw new Error(\n `Auth0 M2M credentials not found: \"${mode.secretName}\". ` +\n `Ensure the secret exists and contains valid Auth0 M2M credentials.`\n );\n }\n\n this.logger.info(`Auth0 M2M mode: ${mode.secretName}`);\n return {\n strategy: new Auth0M2MService(\n credentials,\n mode.tenantId,\n this.logger\n ),\n strategyType: AuthStrategyType.AUTH0_M2M,\n };\n }\n\n async isM2MAvailable(): Promise<boolean> {\n const mode = this.configProvider.getM2MMode();\n if (mode.type === M2MType.SERVICE_ACCOUNT) {\n return true;\n }\n if (mode.type === M2MType.AUTH0_M2M) {\n const secretsProvider = new SecretsProvider(\n this.configProvider.getEnvironment(),\n this.logger\n );\n return secretsProvider.isAvailable();\n }\n return false;\n }\n}\n", "/**\n * Shared authentication configuration and services for DataFlint\n *\n * This package provides:\n * - Customer-specific Auth0 configuration lookup\n * - Multiple authentication strategies (Service Account, Auth0 M2M, Auth0 User)\n * - Secrets providers (AWS Secrets Manager, Local File)\n * - Strategy factory for automatic strategy selection\n *\n * @example Basic usage with Auth0 user flow:\n * ```typescript\n * import { Auth0Service, getCustomerAuthConfig } from \"@dataflint/shared-auth-config\";\n *\n * const config = getCustomerAuthConfig(\"acme.corp\");\n * const auth0 = new Auth0Service(openUrl, () => config, logger);\n * await auth0.authenticate();\n * ```\n *\n * @example Using the strategy factory (MCP standalone):\n * ```typescript\n * import { AuthStrategyFactory } from \"@dataflint/shared-auth-config\";\n *\n * const factory = new AuthStrategyFactory(configService, logger);\n * const { strategy, strategyType } = await factory.createStrategy();\n *\n * if (strategy) {\n * await strategy.initialize();\n * const token = await strategy.getToken();\n * } else {\n * // Fall back to interactive OAuth\n * }\n * ```\n */\n\nimport * as crypto from \"node:crypto\";\nimport {\n customerAuthConfigs,\n CustomerAuthConfig,\n} from \"./customer-auth-configs\";\n\n// ============================================================================\n// Customer Auth Configuration\n// ============================================================================\n\n/**\n * Resolved authentication configuration for a customer\n */\nexport interface ResolvedAuthConfig {\n /**\n * Auth0 domain URL (e.g., \"https://dataflint-acme.us.auth0.com/\")\n */\n domain: string;\n\n /**\n * Auth0 client ID\n */\n clientId: string;\n\n /**\n * Auth0 audience (API identifier)\n */\n audience: string;\n\n /**\n * DataFlint API server URL\n */\n serverUrl: string;\n}\n\n/**\n * Get customer-specific authentication configuration\n *\n * This function:\n * 1. Hashes the customer domain using SHA-256\n * 2. Looks up the hash in customerAuthConfigs\n * 3. Returns the resolved Auth0 configuration\n *\n * @param customerDomain - Customer's domain (e.g., \"acme.corp\")\n * @returns ResolvedAuthConfig or null if customer not found\n */\nexport function getCustomerAuthConfig(\n customerDomain: string\n): ResolvedAuthConfig | null {\n // Step 1: Hash the customer domain using SHA-256\n const customerHash = crypto\n .createHash(\"sha256\")\n .update(customerDomain)\n .digest(\"hex\");\n\n // Step 2: Look up the hash in our customer configurations\n const customerConfig = customerAuthConfigs[customerHash];\n if (!customerConfig) {\n // Customer not found in registry\n return null;\n }\n\n // Step 3: Build the complete authentication configuration\n return {\n // Use custom Auth0 domain if domainProducer is defined, otherwise use default\n domain:\n customerConfig.domainProducer?.(customerDomain) ||\n \"https://dataflint.us.auth0.com/\",\n\n // Customer-specific Auth0 client ID\n clientId: customerConfig.clientId,\n\n // Customer-specific API audience\n audience: `https://api.${customerDomain}.dataflint.io`,\n\n // Customer-specific server URL\n serverUrl: `https://api.${customerDomain}.dataflint.io`,\n };\n}\n\n// Re-export customer configs for direct access if needed\nexport { customerAuthConfigs, CustomerAuthConfig };\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport {\n AuthConfig,\n AuthResult,\n Auth0M2MCredentials,\n AuthStrategyType,\n M2MType,\n M2MMode,\n AuthUserInfo,\n IAuthStrategy,\n IAuthConfigProvider,\n IAuthLogger,\n OpenUrlHandler,\n ConfigProvider,\n} from \"./types\";\n\n// ============================================================================\n// Authentication Services\n// ============================================================================\n\nexport { Auth0Service } from \"./auth0-service\";\nexport { Auth0M2MService } from \"./auth0-m2m-service\";\nexport { ServiceAccountService } from \"./service-account-service\";\n\n// ============================================================================\n// Authentication Strategy Factory\n// ============================================================================\n\nexport { AuthStrategyFactory, StrategyResult } from \"./auth-strategy-factory\";\n\n// ============================================================================\n// Secrets Providers\n// ============================================================================\n\nexport {\n ISecretsProvider,\n AWSSecretsProvider,\n LocalFileSecretsProvider,\n SecretsProvider,\n} from \"./secrets\";\n\n// ============================================================================\n// Error Types\n// ============================================================================\n\nexport {\n ErrorCode,\n DataFlintError,\n AuthError,\n ConfigError,\n NetworkError,\n} from \"./errors\";\n", "// Import types needed locally in this file\nimport type { AuthConfig, M2MMode } from \"./auth/index\";\n\n// Re-export types from auth module (formerly shared-auth-config)\nexport type {\n AuthConfig,\n AuthResult,\n IAuthStrategy,\n AuthUserInfo,\n IAuthConfigProvider,\n IAuthLogger,\n OpenUrlHandler,\n ConfigProvider,\n M2MMode,\n} from \"./auth/index\";\n\n// Re-export enums (includes both type and runtime value)\nexport { AuthStrategyType, M2MType } from \"./auth/index\";\n\nexport type AddHighlightsHandler = (\n highlights: HighlightDTO[],\n clearExisting: boolean\n) => Promise<void>;\n\n/**\n * Function to obfuscate source code for privacy.\n * Returns obfuscated code or null if obfuscation is unavailable.\n *\n * @param code - Raw source code to obfuscate\n * @param language - Language hint (e.g., \"Python\", \"Scala\")\n * @returns Obfuscated code string, or null if obfuscation not available\n */\nexport type ObfuscateCodeHandler = (\n code: string,\n language: string\n) => Promise<string | null>;\n\nexport interface IConfigService {\n getServerUrl(): string;\n getEnvironment(): string;\n getCustomerDomain(): string | null;\n getAdminCompanyDomain(): string;\n getAuthConfig(): AuthConfig;\n setAuthSecret(value: string): Promise<void>;\n getAuthSecret(): Promise<string | undefined>;\n deleteAuthSecret(): Promise<void>;\n getSendSourceCode(): boolean;\n getM2MMode(): M2MMode;\n getTenantId(): string | undefined;\n}\n\nexport interface IMcpLogger {\n info(message: string): void;\n warn(message: string): void;\n error(message: string, error?: any): void;\n debug(message: string): void;\n}\n\nexport interface AlertInfo {\n title: string;\n icon: string;\n sqlId?: number;\n nodeIds: number[];\n}\n\nexport interface ContributionInfo {\n sqlId: number;\n nodeId: number;\n nodeName: string;\n durationPct: number;\n metricsLine: string;\n queryPrefix: string;\n}\n\nexport interface TooltipHeader {\n type: \"hotspot\" | \"failed\" | \"analysis\";\n title: string;\n reason?: string;\n}\n\nexport interface TooltipSummary {\n operationCount: number;\n queryCount: number;\n totalDurationPct: number;\n}\n\nexport interface TooltipFailedQuery {\n sqlId: number;\n description: string;\n}\n\nexport interface TooltipAlert {\n severity: \"critical\" | \"warning\" | \"info\";\n title: string;\n message: string;\n suggestion?: string;\n}\n\nexport interface TooltipOperation {\n sqlId: number;\n queryDescription?: string;\n nodeName: string;\n durationPct: number;\n metricsLine?: string;\n isHotspot: boolean;\n isFailed: boolean;\n}\n\nexport interface TooltipFinding {\n type: \"critical\" | \"warning\" | \"hint\" | \"insight\" | \"context\";\n // Aligned with SHS Alert structure\n title: string; // Short display title\n message?: string; // Detailed explanation\n suggestion?: string;\n estimatedImpact?: string;\n codeSnippet?: string;\n fixComplexity?: string; // XS/S/M/L/XL\n}\n\nexport interface TooltipFooter {\n deepLinkUrl?: string;\n deepLinkText: string;\n}\n\nexport interface StructuredTooltip {\n header: TooltipHeader;\n summary?: TooltipSummary;\n failedQueries: TooltipFailedQuery[];\n alerts: TooltipAlert[];\n operations: TooltipOperation[];\n findings: TooltipFinding[];\n footer?: TooltipFooter;\n}\n\nexport interface HighlightDTO {\n jobId: number;\n filePath: string;\n codeLine: number;\n mappingHash?: string;\n queryPrefix: string;\n displayText: string;\n shortDisplayText?: string;\n tooltip: string;\n structuredTooltip?: StructuredTooltip;\n deepLinkUrl?: string;\n url?: string;\n sqlIds: number[];\n nodeIds: number[];\n severity: string;\n isHotspot: boolean;\n alertCount: number;\n findingCount: number;\n topItemDisplay?: string;\n hasFix?: boolean;\n additionalCount?: number;\n contributions?: ContributionInfo[];\n\n // Legacy fields for backward compatibility\n name?: string;\n summary?: string;\n shortSummary?: string;\n sqlId?: number;\n nodeId?: number;\n alerts?: AlertInfo[];\n}\n", "import { IMcpLogger } from \"./types\";\n\nconst LOGGER_KEY = \"__dataflint_mcp_logger__\";\n\n/**\n * Logger singleton using globalThis to survive bundling across multiple imports\n */\nexport class Logger {\n static setInstance(logger: IMcpLogger): void {\n (globalThis as any)[LOGGER_KEY] = logger;\n }\n\n static getInstance(): IMcpLogger {\n const instance = (globalThis as any)[LOGGER_KEY] as\n | IMcpLogger\n | undefined;\n if (!instance) {\n throw new Error(\n \"Logger not initialized. Call Logger.setInstance() first.\"\n );\n }\n return instance;\n }\n\n static clear(): void {\n (globalThis as any)[LOGGER_KEY] = undefined;\n }\n}\n", "import * as fs from \"node:fs\";\nimport * as fsPromises from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport * as crypto from \"node:crypto\";\nimport { z } from \"zod\";\nimport { AuthConfig, IConfigService, M2MMode, M2MType } from \"../types\";\nimport { getCustomerAuthConfig } from \"../auth/index\";\nimport { Logger } from \"../logger\";\n\n// Constants\nconst DEFAULT_CLIENT_ID_FOR_HASH = \"default\";\nconst HASH_PREFIX_LENGTH = 8;\nconst DEFAULT_ADMIN_COMPANY_DOMAIN = \"none\";\nconst DEFAULT_SERVER_URL = \"https://api.dataflint.io\";\nconst DEFAULT_AUTH_DOMAIN = \"https://dataflint.us.auth0.com/\";\nconst DEFAULT_AUDIENCE = \"https://api.dataflint.io\";\nconst DEFAULT_SCOPE = \"openid profile email offline_access\";\nconst DEFAULT_PUBLIC_CLIENT_ID = \"1NdbhkYoLyqQWtevBNal1BozB9pSZe3g\";\nconst CREDENTIALS_DIR_MODE = 0o700;\nconst CREDENTIALS_FILE_MODE = 0o600;\n\n// Zod schema for config file validation\nconst StandaloneConfigSchema = z\n .object({\n serverUrl: z.string().url().optional(),\n authDomain: z.string().optional(),\n clientId: z.string().optional(),\n audience: z.string().optional(),\n scope: z.string().optional(),\n credentialsPath: z.string().optional(),\n adminCompanyDomain: z.string().optional(),\n customerDomain: z.string().optional(),\n m2mTokenPath: z.string().optional(),\n m2mSecretName: z.string().optional(),\n tenantId: z.string().optional(),\n })\n .strict();\n\nexport type StandaloneConfig = Readonly<{\n serverUrl?: string;\n authDomain?: string;\n clientId?: string;\n audience?: string;\n scope?: string;\n credentialsPath?: string;\n adminCompanyDomain?: string;\n customerDomain?: string;\n m2mTokenPath?: string;\n m2mSecretName?: string;\n tenantId?: string;\n}>;\n\nexport class StandaloneConfigService implements IConfigService {\n private config: StandaloneConfig;\n private credentialsPath: string;\n private m2mMode: M2MMode;\n\n constructor(config: StandaloneConfig = {}) {\n this.config = this.mergeWithDefaults(config);\n this.m2mMode = this.detectM2MMode();\n this.validateM2MConfig();\n this.credentialsPath =\n config.credentialsPath || this.defaultCredentialsPath();\n this.ensureDataflintDirectory();\n }\n\n private defaultCredentialsPath(): string {\n const hash = crypto\n .createHash(\"sha256\")\n .update(this.config.clientId || DEFAULT_CLIENT_ID_FOR_HASH)\n .digest(\"hex\")\n .substring(0, HASH_PREFIX_LENGTH);\n return path.join(\n os.homedir(),\n \".dataflint\",\n `credentials-${hash}.json`\n );\n }\n\n private ensureDataflintDirectory(): void {\n const dir = path.dirname(this.credentialsPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true, mode: CREDENTIALS_DIR_MODE });\n }\n }\n\n private detectM2MMode(): M2MMode {\n const tokenPath = this.config.m2mTokenPath;\n const secretName = this.config.m2mSecretName;\n const tenantId = this.config.tenantId;\n const logger = Logger.getInstance();\n\n if (tokenPath) {\n logger.info(\"M2M mode: Service Account\");\n return { type: M2MType.SERVICE_ACCOUNT, tokenPath, tenantId };\n }\n if (secretName) {\n logger.info(\"M2M mode: Auth0 M2M\");\n return { type: M2MType.AUTH0_M2M, secretName, tenantId };\n }\n return { type: M2MType.NONE };\n }\n\n private validateM2MConfig(): void {\n if (this.m2mMode.type !== M2MType.NONE && !this.config.serverUrl) {\n throw new Error(\"DATAFLINT_SERVER_URL is required in M2M mode\");\n }\n }\n\n private loadFileConfig(): StandaloneConfig {\n const configFilePath = path.join(\n os.homedir(),\n \".dataflint\",\n \"config.json\"\n );\n if (!fs.existsSync(configFilePath)) {\n return {};\n }\n const logger = Logger.getInstance();\n try {\n const rawContent = JSON.parse(\n fs.readFileSync(configFilePath, \"utf8\")\n );\n const result = StandaloneConfigSchema.safeParse(rawContent);\n if (!result.success) {\n logger.warn(\n `Invalid config file format at ${configFilePath}: ${result.error.issues.map((i) => i.message).join(\", \")}`\n );\n return {};\n }\n return result.data;\n } catch (error) {\n logger.warn(\n `Failed to parse config file at ${configFilePath}: ${error instanceof Error ? error.message : String(error)}`\n );\n return {};\n }\n }\n\n private mergeWithDefaults(config: StandaloneConfig): StandaloneConfig {\n const envConfig: StandaloneConfig = {\n serverUrl: process.env.DATAFLINT_SERVER_URL,\n authDomain: process.env.DATAFLINT_AUTH_DOMAIN,\n clientId: process.env.DATAFLINT_CLIENT_ID,\n audience: process.env.DATAFLINT_AUDIENCE,\n scope: process.env.DATAFLINT_SCOPE,\n adminCompanyDomain: process.env.DATAFLINT_ADMIN_COMPANY_DOMAIN,\n customerDomain: process.env.DATAFLINT_CUSTOMER_DOMAIN,\n m2mTokenPath: process.env.M2M_SA_TOKEN_PATH,\n m2mSecretName: process.env.M2M_AUTH0_SECRET_NAME,\n tenantId: process.env.TENANT_ID,\n };\n\n const fileConfig = this.loadFileConfig();\n const logger = Logger.getInstance();\n\n const customerDomain =\n config.customerDomain ||\n envConfig.customerDomain ||\n fileConfig.customerDomain;\n\n if (customerDomain) {\n // Customer domain provided - resolve customer-specific config\n logger.info(`Customer domain detected: ${customerDomain}`);\n\n const customerConfig = getCustomerAuthConfig(customerDomain);\n\n if (!customerConfig) {\n logger.error(`Unknown customer domain: ${customerDomain}`);\n throw new Error(\n `Unknown customer domain: \"${customerDomain}\". ` +\n `This customer is not registered in the system. ` +\n `Please check the domain name or contact support.`\n );\n }\n\n logger.info(`Using customer-specific configuration:`);\n logger.info(`Server URL: ${customerConfig.serverUrl}`);\n logger.info(`Auth0 Domain: ${customerConfig.domain}`);\n logger.info(\n `Client ID: ${customerConfig.clientId.substring(0, 8)}...`\n );\n\n // Return customer-specific configuration\n // Customer config takes precedence over everything else\n return {\n serverUrl: customerConfig.serverUrl,\n authDomain: customerConfig.domain,\n clientId: customerConfig.clientId,\n audience: customerConfig.audience,\n scope: DEFAULT_SCOPE,\n // Credentials path only configurable via CLI argument for security\n credentialsPath: config.credentialsPath,\n adminCompanyDomain:\n config.adminCompanyDomain ||\n envConfig.adminCompanyDomain ||\n fileConfig.adminCompanyDomain ||\n DEFAULT_ADMIN_COMPANY_DOMAIN,\n customerDomain: customerDomain,\n m2mTokenPath:\n config.m2mTokenPath ||\n envConfig.m2mTokenPath ||\n fileConfig.m2mTokenPath,\n m2mSecretName:\n config.m2mSecretName ||\n envConfig.m2mSecretName ||\n fileConfig.m2mSecretName,\n tenantId:\n config.tenantId ||\n envConfig.tenantId ||\n fileConfig.tenantId,\n };\n }\n\n // No customer domain - use existing merge logic\n logger.info(\n `No customer domain - using default/explicit configuration`\n );\n\n return {\n serverUrl:\n config.serverUrl ||\n envConfig.serverUrl ||\n fileConfig.serverUrl ||\n DEFAULT_SERVER_URL,\n authDomain:\n config.authDomain ||\n envConfig.authDomain ||\n fileConfig.authDomain ||\n DEFAULT_AUTH_DOMAIN,\n clientId:\n config.clientId ||\n envConfig.clientId ||\n fileConfig.clientId ||\n DEFAULT_PUBLIC_CLIENT_ID,\n audience:\n config.audience ||\n envConfig.audience ||\n fileConfig.audience ||\n DEFAULT_AUDIENCE,\n scope:\n config.scope ||\n envConfig.scope ||\n fileConfig.scope ||\n DEFAULT_SCOPE,\n adminCompanyDomain:\n config.adminCompanyDomain ||\n envConfig.adminCompanyDomain ||\n fileConfig.adminCompanyDomain ||\n DEFAULT_ADMIN_COMPANY_DOMAIN,\n // Credentials path only configurable via CLI argument for security\n credentialsPath: config.credentialsPath,\n customerDomain: undefined,\n m2mTokenPath:\n config.m2mTokenPath ||\n envConfig.m2mTokenPath ||\n fileConfig.m2mTokenPath,\n m2mSecretName:\n config.m2mSecretName ||\n envConfig.m2mSecretName ||\n fileConfig.m2mSecretName,\n tenantId:\n config.tenantId || envConfig.tenantId || fileConfig.tenantId,\n };\n }\n\n // IConfigService interface implementation\n\n getServerUrl(): string {\n if (!this.config.serverUrl) {\n throw new Error(\n \"Server URL not configured. Set DATAFLINT_SERVER_URL environment variable or configure in ~/.dataflint/config.json\"\n );\n }\n return this.config.serverUrl;\n }\n\n getEnvironment(): string {\n return \"prod\";\n }\n\n getCustomerDomain(): string | null {\n return this.config.customerDomain ?? null;\n }\n\n getAdminCompanyDomain(): string {\n return this.config.adminCompanyDomain ?? DEFAULT_ADMIN_COMPANY_DOMAIN;\n }\n\n getAuthConfig(): AuthConfig {\n if (!this.config.authDomain) {\n throw new Error(\n \"Auth domain not configured. Set DATAFLINT_AUTH_DOMAIN environment variable or configure in ~/.dataflint/config.json\"\n );\n }\n if (!this.config.clientId) {\n throw new Error(\n \"Client ID not configured. Set DATAFLINT_CLIENT_ID environment variable or configure in ~/.dataflint/config.json\"\n );\n }\n if (!this.config.audience) {\n throw new Error(\n \"Audience not configured. Set DATAFLINT_AUDIENCE environment variable or configure in ~/.dataflint/config.json\"\n );\n }\n return {\n domain: this.config.authDomain,\n clientId: this.config.clientId,\n audience: this.config.audience,\n scope: this.config.scope ?? DEFAULT_SCOPE,\n };\n }\n\n async getAuthSecret(): Promise<string | undefined> {\n try {\n return await fsPromises.readFile(this.credentialsPath, \"utf8\");\n } catch (error) {\n const nodeError = error as NodeJS.ErrnoException;\n if (nodeError.code === \"ENOENT\") {\n // File doesn't exist - this is expected, not an error\n return undefined;\n }\n Logger.getInstance().warn(\n `Failed to read credentials from ${this.credentialsPath}: ${nodeError.message}`\n );\n return undefined;\n }\n }\n\n async setAuthSecret(value: string): Promise<void> {\n // Ensure directory exists\n this.ensureDataflintDirectory();\n\n // Write with restricted permissions (600)\n await fsPromises.writeFile(this.credentialsPath, value, {\n mode: CREDENTIALS_FILE_MODE,\n encoding: \"utf8\",\n });\n }\n\n async deleteAuthSecret(): Promise<void> {\n try {\n await fsPromises.unlink(this.credentialsPath);\n } catch (error) {\n const nodeError = error as NodeJS.ErrnoException;\n if (nodeError.code === \"ENOENT\") {\n // File doesn't exist - nothing to delete\n return;\n }\n Logger.getInstance().warn(\n `Failed to delete credentials at ${this.credentialsPath}: ${nodeError.message}`\n );\n }\n }\n\n getSendSourceCode(): boolean {\n const envValue = process.env.DATAFLINT_SEND_SOURCE_CODE;\n return envValue?.toLowerCase() === \"true\";\n }\n\n getM2MMode(): M2MMode {\n return this.m2mMode;\n }\n\n getTenantId(): string | undefined {\n return this.config.tenantId;\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8Ba,IAAAA,SAAA,sBAA6D;;MAEtE,oEAAoE;QAChE,UAAU;QACV,gBAAgB,CAAC,mBACb,qBAAqB,cAAc;;MAG3C,kEAAkE;QAC9D,UAAU;;MAGd,oEAAoE;QAChE,UAAU;;MAGd,kEAAkE;QAC9D,UAAU;;;MAId,kEAAkE;QAC9D,UAAU;;;;;;;;;;;;ACTlB,QAAY;AAAZ,KAAA,SAAYC,mBAAgB;AACxB,MAAAA,kBAAA,iBAAA,IAAA;AACA,MAAAA,kBAAA,WAAA,IAAA;AACA,MAAAA,kBAAA,YAAA,IAAA;IACJ,GAJY,qBAAgBC,SAAA,mBAAhB,mBAAgB,CAAA,EAAA;AAS5B,QAAY;AAAZ,KAAA,SAAYC,UAAO;AACf,MAAAA,SAAA,MAAA,IAAA;AACA,MAAAA,SAAA,iBAAA,IAAA;AACA,MAAAA,SAAA,WAAA,IAAA;IACJ,GAJY,YAAOD,SAAA,UAAP,UAAO,CAAA,EAAA;;;;;;;;;;AC1CnB,QAAY;AAAZ,KAAA,SAAYE,YAAS;AAEjB,MAAAA,WAAA,sBAAA,IAAA;AACA,MAAAA,WAAA,oBAAA,IAAA;AACA,MAAAA,WAAA,oBAAA,IAAA;AACA,MAAAA,WAAA,qBAAA,IAAA;AACA,MAAAA,WAAA,qBAAA,IAAA;AACA,MAAAA,WAAA,cAAA,IAAA;AAGA,MAAAA,WAAA,gBAAA,IAAA;AACA,MAAAA,WAAA,gBAAA,IAAA;AACA,MAAAA,WAAA,yBAAA,IAAA;AAGA,MAAAA,WAAA,qBAAA,IAAA;AACA,MAAAA,WAAA,iBAAA,IAAA;AACA,MAAAA,WAAA,oBAAA,IAAA;AAGA,MAAAA,WAAA,kBAAA,IAAA;AACA,MAAAA,WAAA,eAAA,IAAA;AACA,MAAAA,WAAA,eAAA,IAAA;AACA,MAAAA,WAAA,kBAAA,IAAA;AACA,MAAAA,WAAA,kBAAA,IAAA;AACA,MAAAA,WAAA,iBAAA,IAAA;AAGA,MAAAA,WAAA,qBAAA,IAAA;AACA,MAAAA,WAAA,qBAAA,IAAA;AAGA,MAAAA,WAAA,SAAA,IAAA;IACJ,GAjCY,cAASC,SAAA,YAAT,YAAS,CAAA,EAAA;AAsCrB,QAAsB,iBAAtB,cAA6C,MAAK;MAO1B;MAFpB,YACI,SACgB,OAAa;AAE7B,cAAM,OAAO;AAFG,aAAA,QAAA;AAGhB,aAAK,OAAO,KAAK,YAAY;AAG7B,YAAI,MAAM,mBAAmB;AACzB,gBAAM,kBAAkB,MAAM,KAAK,WAAW;QAClD;MACJ;;;;MAKA,iBAAc;AACV,eAAO,GAAG,KAAK,OAAO,KAAK,KAAK,UAAU;MAC9C;;AAvBJ,IAAAA,SAAA,iBAAA;AA6BA,QAAa,YAAb,MAAa,mBAAkB,eAAc;MAChC;MACA;MACA;MAET,YACI,MACA,SACA,YACA,cAAuB,OACvB,OAAa;AAEb,cAAM,SAAS,KAAK;AACpB,aAAK,OAAO;AACZ,aAAK,cAAc;AACnB,aAAK,aAAa;MACtB;MAEA,OAAO,aAAa,OAAa;AAC7B,eAAO,IAAI,WACP,UAAU,oBACV,4BACA,+CACA,OACA,KAAK;MAEb;MAEA,OAAO,aAAa,OAAa;AAC7B,eAAO,IAAI,WACP,UAAU,oBACV,mCACA,+CACA,OACA,KAAK;MAEb;MAEA,OAAO,cAAc,OAAa;AAC9B,eAAO,IAAI,WACP,UAAU,qBACV,oCACA,+CACA,OACA,KAAK;MAEb;MAEA,OAAO,gBAAa;AAChB,eAAO,IAAI,WACP,UAAU,qBACV,2BACA,2DACA,KAAK;MAEb;MAEA,OAAO,QAAQ,OAAa;AACxB,eAAO,IAAI,WACP,UAAU,cACV,4BACA,wDACA,MACA,KAAK;MAEb;MAEA,OAAO,iBAAc;AACjB,eAAO,IAAI,WACP,UAAU,sBACV,0CACA,2DACA,IAAI;MAEZ;;AA1EJ,IAAAA,SAAA,YAAA;AAgFA,QAAa,cAAb,MAAa,qBAAoB,eAAc;MAClC;MACA,cAAc;MACd;MAET,YACI,MACA,SACA,YACA,OAAa;AAEb,cAAM,SAAS,KAAK;AACpB,aAAK,OAAO;AACZ,aAAK,aAAa;MACtB;MAEA,OAAO,QAAQ,OAAa;AACxB,eAAO,IAAI,aACP,UAAU,gBACV,mCAAmC,KAAK,IACxC,4FAA4F;MAEpG;MAEA,OAAO,QACH,OACA,OACA,UAAgB;AAEhB,eAAO,IAAI,aACP,UAAU,gBACV,6BAA6B,KAAK,MAAM,KAAK,KAC7C,YAAY,QAAQ,yCAAyC;MAErE;MAEA,OAAO,uBAAuB,QAAc;AACxC,eAAO,IAAI,aACP,UAAU,yBACV,oBAAoB,MAAM,uBAC1B,qGAAqG;MAE7G;;AA1CJ,IAAAA,SAAA,cAAA;AAgDA,QAAa,eAAb,MAAa,sBAAqB,eAAc;MACnC;MACA,cAAc;MACd;MAET,YACI,MACA,SACA,YACA,OAAa;AAEb,cAAM,SAAS,KAAK;AACpB,aAAK,OAAO;AACZ,aAAK,aAAa;MACtB;MAEA,OAAO,YAAY,OAAa;AAC5B,eAAO,IAAI,cACP,UAAU,qBACV,4BACA,wDACA,KAAK;MAEb;MAEA,OAAO,QAAQ,OAAa;AACxB,eAAO,IAAI,cACP,UAAU,iBACV,qBACA,oFACA,KAAK;MAEb;MAEA,OAAO,UAAU,MAAc,OAAa;AACxC,eAAO,IAAI,cACP,UAAU,oBACV,4BAA4B,IAAI,IAChC,2DACA,KAAK;MAEb;;AAzCJ,IAAAA,SAAA,eAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACtMA,QAAA,OAAAC,cAAA,QAAA,MAAA,CAAA;AACA,QAAA,kBAAA,QAAA,eAAA;AACA,QAAA,QAAA,QAAA,KAAA;AAQA,QAAA,WAAA;AAEA,QAAM,4BAA4B;AAElC,oBAAA,OAAO,uBAAuB;MAC1B,SAAS;KACZ;AAKD,QAAM,aAA0B;MAC5B,MAAM,MAAK;MAAE;MACb,MAAM,MAAK;MAAE;MACb,OAAO,MAAK;MAAE;MACd,OAAO,MAAK;MAAE;;AAmBlB,QAAa,eAAb,MAAyB;MACb;MACA;MACA;MACA,SAAwB;MACxB,SAAwB;MACxB,cAAc;MACd;MACA;MAER,YACI,gBACA,gBACA,QACA,eAAuB,OAAK;AAE5B,aAAK,SAAS,UAAU;AACxB,aAAK,iBAAiB;AACtB,aAAK,SAAS;UACV,GAAG,eAAc;UACjB,OAAO,eAAc,EAAG,SAAS;;AAErC,aAAK,eAAe;AACpB,aAAK,cAAc,oBAAoB,YAAY;AACnD,aAAK,OAAO,KACR,wCAAwC,KAAK,OAAO,MAAM,EAAE;MAEpE;;;;MAKA,MAAM,aAAU;AACZ,YAAI,KAAK,aAAa;AAClB,eAAK,OAAO,MAAM,kCAAkC;AACpD;QACJ;AAEA,YAAI;AACA,gBAAM,YAAY,KAAK,OAAO,OAAO,WAAW,MAAM,IAChD,KAAK,OAAO,SACZ,WAAW,KAAK,OAAO,MAAM;AAEnC,eAAK,OAAO,KACR,2CAA2C,SAAS,EAAE;AAE1D,eAAK,OAAO,MAAM,0BAA0B,SAAS,EAAE;AAEvD,eAAK,SAAS,MAAM,gBAAA,OAAO,SAAS,SAAS;AAC7C,eAAK,OAAO,KACR,yCAAyC,KAAK,OAAO,MAAM,EAAE;AAGjE,eAAK,SAAS,IAAI,KAAK,OAAO,OAAO;YACjC,WAAW,KAAK,OAAO;YACvB,eAAe,CAAC,KAAK,WAAW;YAChC,gBAAgB,CAAC,MAAM;YACvB,4BAA4B;;WAC/B;AAED,eAAK,cAAc;AACnB,eAAK,OAAO,KAAK,uCAAuC;QAC5D,SAAS,OAAO;AACZ,eAAK,OAAO,MAAM,qCAAqC,KAAK;AAC5D,eAAK,OAAO,MAAM,iBAAiB,KAAK,OAAO,MAAM,EAAE;AACvD,eAAK,OAAO,MAAM,cAAc,KAAK,OAAO,QAAQ,EAAE;AACtD,eAAK,OAAO,MACR,2BAA2B,KAAK,OAAO,OAAO,WAAW,MAAM,IAAI,KAAK,OAAO,SAAS,WAAW,KAAK,OAAO,MAAM,EAAE,EAAE;AAI7H,cAAI,iBAAiB,OAAO;AACxB,kBAAM,UAAU,MAAM,QAAQ,YAAW;AAGzC,gBAAI,QAAQ,SAAS,KAAK,KAAK,QAAQ,SAAS,WAAW,GAAG;AAC1D,oBAAM,SAAA,YAAY,QACd,gBACA,KAAK,OAAO,QACZ,oDAAoD;YAE5D;AAGA,gBACI,QAAQ,SAAS,WAAW,KAC5B,QAAQ,SAAS,aAAa,GAChC;AACE,oBAAM,SAAA,aAAa,UAAU,KAAK,OAAO,QAAQ,KAAK;YAC1D;AAGA,gBACI,QAAQ,SAAS,SAAS,KAC1B,QAAQ,SAAS,WAAW,GAC9B;AACE,oBAAM,SAAA,UAAU,QAAQ,KAAK;YACjC;AAGA,gBACI,QAAQ,SAAS,cAAc,KAC/B,QAAQ,SAAS,YAAY,GAC/B;AACE,oBAAM,SAAA,aAAa,YAAY,KAAK;YACxC;UACJ;AAGA,gBAAM,IAAI,SAAA,UACN,wBACA,gCAAgC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,IACtF,kEACA,OACA,iBAAiB,QAAQ,QAAQ,MAAS;QAElD;MACJ;;;;MAKA,MAAM,eAAY;AACd,YAAI,CAAC,KAAK,QAAQ;AACd,gBAAM,KAAK,WAAU;QACzB;AAEA,YAAI,CAAC,KAAK,QAAQ;AACd,gBAAM,SAAA,UAAU,eAAc;QAClC;AAGA,cAAM,eAAe,gBAAA,WAAW,aAAY;AAC5C,cAAM,gBAAgB,gBAAA,WAAW,cAAc,YAAY;AAG3D,cAAM,UAAU,KAAK,OAAO,iBAAiB;UACzC,OAAO,KAAK,OAAO;UACnB,gBAAgB;UAChB,uBAAuB;UACvB,GAAI,KAAK,OAAO,YAAY,EAAE,UAAU,KAAK,OAAO,SAAQ;SAC/D;AAED,aAAK,OAAO,KAAK,uCAAuC;AAExD,YAAI;AACA,gBAAM,KAAK,eAAe,OAAO;QACrC,SAAS,OAAO;AACZ,eAAK,OAAO,MAAM,0BAA0B,KAAK;AACjD,eAAK,OAAO,KAAK,gCAAgC,OAAO,EAAE;QAC9D;AAGA,eAAO,IAAI,QAAQ,CAAC,SAAS,WAAU;AACnC,gBAAM,SAAS,KAAK,aAAa,OAAO,KAAK,QAAO;;AAChD,gBAAI;AACA,kBAAI,GAAC,SAAI,QAAJ,mBAAS,WAAW,eAAc;AACnC,oBAAI,UAAU,KAAK,EAAE,gBAAgB,aAAY,CAAE;AACnD,oBAAI,IAAI,WAAW;AACnB;cACJ;AAEA,oBAAM,cAAc,IAAI,MAAA,IACpB,oBAAoB,KAAK,YAAY,GAAG,IAAI,GAAG,EAAE;AAErD,oBAAM,SAAS,KAAK,OAAQ,eACxB,YAAY,SAAQ,CAAE;AAI1B,oBAAM,WAAW,MAAM,KAAK,OAAQ,SAChC,KAAK,aACL,QACA;gBACI,eAAe;eAClB;AAGL,oBAAM,aAAa,KAAK,gBAAgB,QAAQ;AAGhD,kBAAI,UAAU,KAAK,EAAE,gBAAgB,YAAW,CAAE;AAClD,kBAAI,IAAI;;;;;;;;;;;;WAYjB;AAES,qBAAO,MAAK;AACZ,sBAAQ,UAAU;YACtB,SAAS,OAAO;AACZ,mBAAK,OAAO,MAAM,iCAAiC,KAAK;AAGxD,kBAAI,UAAU,KAAK,EAAE,gBAAgB,YAAW,CAAE;AAClD,kBAAI,IAAI;;;;4BAIA,KAAK;;;;WAItB;AAES,qBAAO,MAAK;AACZ,qBAAO,KAAK;YAChB;UACJ,CAAC;AAED,iBAAO,OAAO,KAAK,cAAc,MAAK;AAClC,iBAAK,OAAO,KACR,oDAAoD,KAAK,YAAY,WAAW;UAExF,CAAC;AAGD,qBAAW,MAAK;AACZ,mBAAO,MAAK;AACZ,mBAAO,SAAA,UAAU,QAAO,CAAE;UAC9B,GAAG,GAAM;QACb,CAAC;MACL;;;;MAKA,MAAM,YAAY,aAAmB;AACjC,YAAI,CAAC,KAAK,QAAQ;AACd,gBAAM,SAAA,UAAU,eAAc;QAClC;AAEA,YAAI;AACA,eAAK,OAAO,KAAK,8BAA8B;AAE/C,gBAAM,WAAW,MAAM,KAAK,OAAO,SAAS,WAAW;AAEvD,eAAK,OAAO,KAAK,yCAAyC;AAC1D,eAAK,OAAO,MAAM,YAAY,SAAS,GAAG,EAAE;AAE5C,iBAAO;QACX,SAAS,OAAO;AACZ,eAAK,OAAO,MAAM,2BAA2B,KAAK;AAClD,gBAAM;QACV;MACJ;;;;MAKA,MAAM,aAAa,cAAoB;AACnC,YAAI,CAAC,KAAK,QAAQ;AACd,gBAAM,SAAA,UAAU,eAAc;QAClC;AAEA,YAAI;AACA,eAAK,OAAO,KAAK,4BAA4B;AAE7C,gBAAM,WAAW,MAAM,KAAK,OAAO,QAAQ,YAAY;AACvD,gBAAM,SAAS,KAAK,gBAAgB,QAAQ;AAE5C,eAAK,OAAO,KAAK,sCAAsC;AACvD,iBAAO;QACX,SAAS,OAAO;AACZ,eAAK,OAAO,MAAM,wBAAwB,KAAK;AAC/C,gBAAM;QACV;MACJ;;;;MAKQ,gBAAgB,UAKvB;;AACG,cAAM,SAAqB;UACvB,aAAa,SAAS;UACtB,SAAS,SAAS;UAClB,cAAc,SAAS;;AAG3B,YAAI,SAAS,YAAY;AACrB,iBAAO,YAAY,IAAI,KAAK,SAAS,aAAa,GAAI;QAC1D;AAEA,aAAK,OAAO,KAAK,8CAA8C;AAC/D,aAAK,OAAO,MACR,kBAAiB,YAAO,gBAAP,mBAAoB,UAAU,GAAG,GAAG,KAAK;AAE9D,aAAK,OAAO,MACR,aAAa,OAAO,UAAU,YAAY,cAAc,EAAE;AAE9D,aAAK,OAAO,MACR,kBAAkB,OAAO,eAAe,YAAY,cAAc,EAAE;AAExE,aAAK,OAAO,MAAM,eAAe,OAAO,SAAS,EAAE;AAEnD,eAAO;MACX;;;;MAKA,eAAe,YAAsB;AACjC,YAAI,CAAC,WAAW,WAAW;AACvB,eAAK,OAAO,MACR,uDAAuD;AAE3D,iBAAO;QACX;AAGA,cAAM,YACF,WAAW,qBAAqB,OAC1B,WAAW,YACX,IAAI,KAAK,WAAW,SAAS;AAEvC,cAAM,MAAM,oBAAI,KAAI;AACpB,cAAM,SAAS,IAAI,KAAK;AACxB,cAAM,YAAY,UAAU,QAAO,IAAK,SAAS,IAAI,QAAO;AAE5D,YAAI,WAAW;AACX,eAAK,OAAO,KAAK,6CAA6C;QAClE,OAAO;AACH,eAAK,OAAO,MAAM,6BAA6B;QACnD;AAEA,eAAO;MACX;;;;MAKA,MAAM,OAAO,aAAmB;AAC5B,YAAI,CAAC,KAAK,QAAQ;AACd,gBAAM,SAAA,UAAU,eAAc;QAClC;AAEA,YAAI;AACA,gBAAM,KAAK,OAAO,OAAO,WAAW;AACpC,eAAK,OAAO,KAAK,4BAA4B;QACjD,SAAS,OAAO;AACZ,eAAK,OAAO,MAAM,0BAA0B,KAAK;QAErD;MACJ;;AApWJ,IAAAC,SAAA,eAAA;;;;;;;;;;AC1CA,QAAAC,WAAA;AAgBA,QAAM,aAA0B;MAC5B,MAAM,MAAK;MAAE;MACb,MAAM,MAAK;MAAE;MACb,OAAO,MAAK;MAAE;MACd,OAAO,MAAK;MAAE;;AA8BlB,QAAa,kBAAb,MAAa,iBAAe;MAChB;MACA;MACA,aAAqC;MACrC;MACA,cAAc;;;;;MAMd,OAAgB,mBAAmB,IAAI,KAAK;MAEpD,YACI,aACA,UACA,QAAoB;AAEpB,aAAK,cAAc;AACnB,aAAK,WAAW;AAChB,aAAK,SAAS,UAAU;AAGxB,cAAM,iBAAiB,YAAY,UAAU,UAAU,GAAG,CAAC;AAC3D,aAAK,OAAO,KACR,uCAAuC,cAAc,KAAK;MAElE;;;;MAKA,UAAO;AACH,eAAOA,SAAA,iBAAiB;MAC5B;;;;;MAMA,MAAM,aAAU;AACZ,YAAI,KAAK,aAAa;AAClB,eAAK,OAAO,MAAM,qCAAqC;AACvD;QACJ;AAEA,aAAK,OAAO,KAAK,iCAAiC;AAGlD,YAAI,CAAC,KAAK,YAAY,aAAa,CAAC,KAAK,YAAY,eAAe;AAChE,gBAAM,IAAI,MACN,oDAAoD;QAE5D;AACA,YAAI,CAAC,KAAK,YAAY,QAAQ;AAC1B,gBAAM,IAAI,MAAM,gCAAgC;QACpD;AACA,YAAI,CAAC,KAAK,YAAY,UAAU;AAC5B,gBAAM,IAAI,MAAM,kCAAkC;QACtD;AAGA,cAAM,KAAK,cAAa;AAExB,aAAK,cAAc;AACnB,aAAK,OAAO,KAAK,0CAA0C;MAC/D;;;;MAKA,MAAM,WAAQ;AACV,cAAM,MAAM,KAAK,IAAG;AAGpB,YACI,KAAK,cACL,MAAM,KAAK,WAAW,YAAY,iBAAgB,kBACpD;AACE,eAAK,OAAO,MAAM,wBAAwB;AAC1C,iBAAO,KAAK,WAAW;QAC3B;AAEA,aAAK,OAAO,KACR,wDAAwD;AAE5D,cAAM,KAAK,cAAa;AAExB,eAAO,KAAK,WAAY;MAC5B;;;;MAKA,MAAM,eAAY;AACd,aAAK,OAAO,KAAK,+BAA+B;AAChD,aAAK,aAAa;AAClB,cAAM,KAAK,cAAa;AACxB,aAAK,OAAO,KAAK,qBAAqB;MAC1C;;;;MAKA,MAAM,kBAAe;AACjB,YAAI;AACA,gBAAM,KAAK,SAAQ;AACnB,iBAAO;QACX,QAAQ;AACJ,iBAAO;QACX;MACJ;;;;;MAMA,MAAM,cAAW;AACb,cAAM,iBAAiB,KAAK,YAAY,UAAU,UAAU,GAAG,CAAC;AAChE,eAAO;UACH,KAAK,cAAc,cAAc;UACjC,MAAM;UACN,GAAI,KAAK,YAAY,EAAE,WAAW,KAAK,SAAQ;;MAEvD;;;;MAKA,cAAW;AACP,eAAO,KAAK;MAChB;;;;MAKQ,MAAM,gBAAa;AACvB,cAAM,SAAS,KAAK,YAAY,OAAO,WAAW,MAAM,IAClD,KAAK,YAAY,SACjB,WAAW,KAAK,YAAY,MAAM;AAExC,cAAM,WAAW,GAAG,OAAO,QAAQ,OAAO,EAAE,CAAC;AAE7C,aAAK,OAAO,MAAM,4BAA4B,QAAQ,EAAE;AAExD,cAAM,cAAc;UAChB,YAAY;UACZ,WAAW,KAAK,YAAY;UAC5B,eAAe,KAAK,YAAY;UAChC,UAAU,KAAK,YAAY;;AAG/B,YAAI;AACA,gBAAM,WAAW,MAAM,MAAM,UAAU;YACnC,QAAQ;YACR,SAAS;cACL,gBAAgB;;YAEpB,MAAM,KAAK,UAAU,WAAW;WACnC;AAED,cAAI,CAAC,SAAS,IAAI;AACd,iBAAK,OAAO,MACR,6BAA6B,SAAS,MAAM,EAAE;AAElD,kBAAM,IAAI,MACN,8CAA8C,SAAS,MAAM,EAAE;UAEvE;AAEA,gBAAM,gBAAiB,MAAM,SAAS,KAAI;AAE1C,cAAI,CAAC,cAAc,cAAc;AAC7B,kBAAM,IAAI,MAAM,qCAAqC;UACzD;AAEA,gBAAM,YAAY,cAAc,cAAc;AAC9C,gBAAM,YAAY,KAAK,IAAG,IAAK,YAAY;AAE3C,eAAK,aAAa;YACd,aAAa,cAAc;YAC3B;;AAGJ,gBAAM,mBAAmB,KAAK,MAAM,YAAY,EAAE;AAClD,eAAK,OAAO,KACR,qBAAqB,KAAK,WAAW,eAAe,KAAK,QAAQ,KAAK,EAAE,gBAAgB,gBAAgB,UAAU;QAE1H,SAAS,OAAO;AAEZ,eAAK,aAAa;AAElB,cAAI,iBAAiB,OAAO;AACxB,iBAAK,OAAO,MAAM,6BAA6B,KAAK;AACpD,kBAAM;UACV;AAEA,gBAAM,IAAI,MAAM,8BAA8B,KAAK,EAAE;QACzD;MACJ;;AAvMJ,IAAAC,SAAA,kBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjDA,QAAAC,MAAAC,cAAA,QAAA,IAAA,CAAA;AACA,QAAAC,WAAA;AAeA,QAAM,aAA0B;MAC5B,MAAM,MAAK;MAAE;MACb,MAAM,MAAK;MAAE;MACb,OAAO,MAAK;MAAE;MACd,OAAO,MAAK;MAAE;;AAoBlB,QAAa,wBAAb,MAAkC;MACtB;MACA;MACA,aAAqC;MACrC;MAER,YAAY,WAAmB,UAAmB,QAAoB;AAClE,aAAK,YAAY;AACjB,aAAK,WAAW;AAChB,aAAK,SAAS,UAAU;MAC5B;;;;MAKA,UAAO;AACH,eAAOA,SAAA,iBAAiB;MAC5B;;;;;MAMA,MAAM,aAAU;AACZ,aAAK,OAAO,KACR,uDAAuD,KAAK,SAAS,EAAE;AAG3E,YAAI,CAACF,IAAG,WAAW,KAAK,SAAS,GAAG;AAChC,gBAAM,IAAI,MACN,yCAAyC,KAAK,SAAS,EAAE;QAEjE;AAGA,cAAM,KAAK,SAAQ;AACnB,aAAK,OAAO,KAAK,gDAAgD;MACrE;;;;MAKA,MAAM,WAAQ;AACV,cAAM,MAAM,KAAK,IAAG;AAGpB,cAAM,WAAW,IAAI,KAAK;AAC1B,YAAI,KAAK,cAAc,MAAM,KAAK,WAAW,YAAY,UAAU;AAC/D,eAAK,OAAO,MAAM,oCAAoC;AACtD,iBAAO,KAAK,WAAW;QAC3B;AAEA,cAAM,WAAW,KAAK,kBAAiB;AACvC,aAAK,sBAAsB,QAAQ;AAEnC,eAAO,KAAK,WAAY;MAC5B;;;;MAKA,MAAM,eAAY;AACd,aAAK,OAAO,KAAK,qCAAqC;AACtD,aAAK,aAAa;AAClB,cAAM,KAAK,SAAQ;AACnB,aAAK,OAAO,KAAK,iCAAiC;MACtD;;;;MAKA,MAAM,kBAAe;AACjB,YAAI;AACA,gBAAM,KAAK,SAAQ;AACnB,iBAAO;QACX,QAAQ;AACJ,iBAAO;QACX;MACJ;;;;;MAMA,MAAM,cAAW;AACb,eAAO;UACH,KAAK;UACL,MAAM;UACN,GAAI,KAAK,YAAY,EAAE,WAAW,KAAK,SAAQ;;MAEvD;;;;MAKA,cAAW;AACP,eAAO,KAAK;MAChB;;;;MAKQ,oBAAiB;AACrB,eAAOA,IAAG,aAAa,KAAK,WAAW,MAAM;MACjD;;;;MAKQ,sBAAsB,UAAgB;AAC1C,cAAM,QAAQ,SAAS,KAAI;AAE3B,YAAI,CAAC,OAAO;AACR,gBAAM,IAAI,MAAM,gCAAgC;QACpD;AAEA,cAAM,QAAQ,MAAM,MAAM,GAAG;AAC7B,YAAI,MAAM,WAAW,GAAG;AACpB,gBAAM,IAAI,MACN,6CAA6C,MAAM,MAAM,EAAE;QAEnE;AAEA,cAAM,YAAY,KAAK,kBAAkB,KAAK;AAC9C,cAAM,MAAM,KAAK,IAAG;AACpB,cAAM,YAAY,KAAK,OAAO,YAAY,OAAO,GAAI;AAGrD,YAAI,aAAa,KAAK;AAClB,gBAAM,IAAI,MAAM,kCAAkC;QACtD;AAEA,aAAK,OAAO,KACR,+BAA+B,KAAK,WAAW,eAAe,KAAK,QAAQ,KAAK,EAAE,gBAAgB,SAAS,MAAM,IAAI,KAAK,SAAS,EAAE,YAAW,CAAE,GAAG;AAGzJ,aAAK,aAAa;UACd;UACA;;MAER;;;;MAKQ,kBAAkB,OAAa;AACnC,cAAM,QAAQ,MAAM,MAAM,GAAG;AAE7B,YAAI;AACA,gBAAM,UAAU,MAAM,CAAC;AACvB,gBAAM,UAAU,OAAO,KAAK,SAAS,WAAW,EAAE,SAAS,MAAM;AACjE,gBAAM,SAAS,KAAK,MAAM,OAAO;AAEjC,cAAI,OAAO,OAAO,QAAQ,UAAU;AAChC,mBAAO,OAAO,MAAM;UACxB;AAEA,eAAK,OAAO,KACR,oDAAoD;AAExD,iBAAO,KAAK,IAAG,IAAK;QACxB,SAAS,OAAO;AACZ,eAAK,OAAO,KACR,mCAAmC,KAAK,6BAA6B;AAEzE,iBAAO,KAAK,IAAG,IAAK;QACxB;MACJ;;AAvKJ,IAAAG,SAAA,wBAAA;;;;;;;;;;ACrCA,QAAM,aAA0B;MAC5B,MAAM,MAAK;MAAE;MACb,MAAM,MAAK;MAAE;MACb,OAAO,MAAK;MAAE;MACd,OAAO,MAAK;MAAE;;AAmBlB,QAAa,qBAAb,MAA+B;MACnB;MACA;MAER,YAAY,QAAoB;AAC5B,aAAK,SAAS,UAAU;AACxB,aAAK,SAAS,QAAQ,IAAI,cAAc,QAAQ,IAAI;MACxD;;;;MAKA,UAAO;AACH,eAAO;MACX;;;;MAKA,MAAM,cAAW;AAEb,cAAM,YAAY,CAAC,EACf,QAAQ,IAAI,cAAc,QAAQ,IAAI;AAE1C,cAAM,kBAAkB,CAAC,CAAC,QAAQ,IAAI;AACtC,cAAM,iBAAiB,CAAC,EACpB,QAAQ,IAAI,qBACZ,QAAQ,IAAI,0CACZ,QAAQ,IAAI;AAGhB,cAAM,mBACF,cAAc,mBAAmB;AAErC,YAAI,kBAAkB;AAClB,eAAK,OAAO,MAAM,0BAA0B;QAChD,OAAO;AACH,eAAK,OAAO,MAAM,wBAAwB;QAC9C;AAEA,eAAO;MACX;;;;;;;MAQA,MAAM,wBACF,YAAkB;AAElB,aAAK,OAAO,KACR,qDAAqD,UAAU,EAAE;AAGrE,YAAI;AAEA,gBAAM,EAAE,sBAAsB,sBAAqB;;YAE/C,MAAM,OAAO,iCAAiC;;AAElD,gBAAM,SAAS,IAAI,qBAAqB;YACpC,QAAQ,KAAK;WAChB;AAED,gBAAM,UAAU,IAAI,sBAAsB;YACtC,UAAU;WACb;AAED,gBAAM,WAAW,MAAM,OAAO,KAAK,OAAO;AAE1C,cAAI,CAAC,SAAS,cAAc;AACxB,iBAAK,OAAO,MAAM,iCAAiC;AACnD,mBAAO;UACX;AAEA,gBAAM,cAAc,KAAK,MAAM,SAAS,YAAY;AAGpD,cACI,CAAC,YAAY,aACb,CAAC,YAAY,iBACb,CAAC,YAAY,YACb,CAAC,YAAY,QACf;AACE,iBAAK,OAAO,MACR,6EAA6E;AAEjF,mBAAO;UACX;AAEA,eAAK,OAAO,KAAK,iDAAiD;AAClE,iBAAO;YACH,WAAW,YAAY;YACvB,eAAe,YAAY;YAC3B,UAAU,YAAY;YACtB,QAAQ,YAAY;;QAE5B,SAAS,OAAO;AACZ,cAAI,iBAAiB,OAAO;AACxB,gBAAI,MAAM,SAAS,6BAA6B;AAC5C,mBAAK,OAAO,KAAK,qBAAqB,UAAU,EAAE;AAClD,qBAAO;YACX;AACA,gBAAI,MAAM,QAAQ,SAAS,oBAAoB,GAAG;AAC9C,mBAAK,OAAO,KACR,uEAAuE;AAE3E,qBAAO;YACX;AACA,iBAAK,OAAO,MAAM,kCAAkC,KAAK;UAC7D;AACA,iBAAO;QACX;MACJ;;AAnHJ,IAAAC,SAAA,qBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC7BA,QAAAC,MAAAC,cAAA,QAAA,IAAA,CAAA;AACA,QAAAC,QAAAD,cAAA,QAAA,MAAA,CAAA;AACA,QAAAE,MAAAF,cAAA,QAAA,IAAA,CAAA;AAOA,QAAM,aAA0B;MAC5B,MAAM,MAAK;MAAE;MACb,MAAM,MAAK;MAAE;MACb,OAAO,MAAK;MAAE;MACd,OAAO,MAAK;MAAE;;AAgBlB,QAAa,2BAAb,MAAqC;MACzB;MACA;MACA;MAER,YAAY,aAAqB,QAAoB;AACjD,aAAK,SAAS,UAAU;AACxB,aAAK,cAAc;AACnB,aAAK,iBAAiBC,MAAK,KACvBC,IAAG,QAAO,GACV,cACA,cAAc,WAAW,OAAO;MAExC;;;;MAKA,UAAO;AACH,eAAO;MACX;;;;MAKA,MAAM,cAAW;AACb,cAAM,SAASH,IAAG,WAAW,KAAK,cAAc;AAEhD,YAAI,QAAQ;AACR,eAAK,OAAO,MACR,gCAAgC,KAAK,cAAc,EAAE;QAE7D,OAAO;AACH,eAAK,OAAO,MACR,oCAAoC,KAAK,cAAc,EAAE;QAEjE;AAEA,eAAO;MACX;;;;;;;MAQA,MAAM,wBACF,aAAmB;AAEnB,aAAK,OAAO,KACR,4CAA4C,KAAK,cAAc,EAAE;AAGrE,YAAI;AACA,cAAI,CAACA,IAAG,WAAW,KAAK,cAAc,GAAG;AACrC,iBAAK,OAAO,MAAM,kCAAkC;AACpD,mBAAO;UACX;AAGA,gBAAM,QAAQA,IAAG,SAAS,KAAK,cAAc;AAC7C,gBAAM,OAAO,MAAM,OAAO;AAC1B,cAAI,SAAS,KAAO;AAChB,iBAAK,OAAO,KACR,yCAAyC,KAAK,SAAS,CAAC,CAAC,kBAAkB;UAEnF;AAEA,gBAAM,UAAUA,IAAG,aAAa,KAAK,gBAAgB,MAAM;AAC3D,gBAAM,cAAc,KAAK,MAAM,OAAO;AAGtC,cACI,CAAC,YAAY,aACb,CAAC,YAAY,iBACb,CAAC,YAAY,YACb,CAAC,YAAY,QACf;AACE,iBAAK,OAAO,MACR,wFAAwF;AAE5F,mBAAO;UACX;AAEA,eAAK,OAAO,KAAK,wCAAwC;AACzD,iBAAO;YACH,WAAW,YAAY;YACvB,eAAe,YAAY;YAC3B,UAAU,YAAY;YACtB,QAAQ,YAAY;;QAE5B,SAAS,OAAO;AACZ,cAAI,iBAAiB,aAAa;AAC9B,iBAAK,OAAO,MAAM,2CAA2C;UACjE,OAAO;AACH,iBAAK,OAAO,MAAM,oCAAoC,KAAK;UAC/D;AACA,iBAAO;QACX;MACJ;;;;MAKA,oBAAiB;AACb,eAAO,KAAK;MAChB;;AA3GJ,IAAAI,SAAA,2BAAA;;;;;;;;;;AC1BA,QAAA,yBAAA;AACA,QAAA,gCAAA;AAKA,QAAM,aAA0B;MAC5B,MAAM,MAAK;MAAE;MACb,MAAM,MAAK;MAAE;MACb,OAAO,MAAK;MAAE;MACd,OAAO,MAAK;MAAE;;AAmBlB,QAAa,kBAAb,MAA4B;MAChB;MACA;MACA;MAER,YAAY,aAAqB,QAAoB;AACjD,aAAK,SAAS,UAAU;AACxB,aAAK,cAAc;AAGnB,aAAK,YAAY;UACb,IAAI,uBAAA,mBAAmB,MAAM;UAC7B,IAAI,8BAAA,yBAAyB,aAAa,MAAM;;MAExD;;;;MAKA,UAAO;AACH,eAAO;MACX;;;;MAKA,MAAM,cAAW;AACb,mBAAW,YAAY,KAAK,WAAW;AACnC,cAAI,MAAM,SAAS,YAAW,GAAI;AAC9B,iBAAK,OAAO,MACR,+BAA+B,SAAS,QAAO,CAAE,EAAE;AAEvD,mBAAO;UACX;QACJ;AACA,aAAK,OAAO,MAAM,gCAAgC;AAClD,eAAO;MACX;;;;;;;MAQA,MAAM,wBACF,YAAkB;AAElB,aAAK,OAAO,KAAK,uCAAuC;AAExD,mBAAW,YAAY,KAAK,WAAW;AACnC,gBAAM,eAAe,SAAS,QAAO;AAErC,cAAI,CAAE,MAAM,SAAS,YAAW,GAAK;AACjC,iBAAK,OAAO,MAAM,2BAA2B,YAAY,EAAE;AAC3D;UACJ;AAEA,eAAK,OAAO,KAAK,oBAAoB,YAAY,EAAE;AACnD,gBAAM,cACF,MAAM,SAAS,wBAAwB,UAAU;AAErD,cAAI,aAAa;AACb,iBAAK,OAAO,KACR,gCAAgC,YAAY,EAAE;AAElD,mBAAO;UACX;AAEA,eAAK,OAAO,MACR,qCAAqC,YAAY,EAAE;QAE3D;AAEA,aAAK,OAAO,KAAK,0CAA0C;AAC3D,eAAO;MACX;;;;;;;MAQA,OAAO,qBAAqB,aAAmB;AAC3C,eAAO,+BAA+B,WAAW;MACrD;;AAtFJ,IAAAC,SAAA,kBAAA;;;;;;;;;;AC9BA,QAAA,yBAAA;AAAS,WAAA,eAAAC,UAAA,sBAAA,EAAA,YAAA,MAAA,KAAA,WAAA;AAAA,aAAA,uBAAA;IAAkB,EAAA,CAAA;AAC3B,QAAA,gCAAA;AAAS,WAAA,eAAAA,UAAA,4BAAA,EAAA,YAAA,MAAA,KAAA,WAAA;AAAA,aAAA,8BAAA;IAAwB,EAAA,CAAA;AACjC,QAAA,qBAAA;AAAS,WAAA,eAAAA,UAAA,mBAAA,EAAA,YAAA,MAAA,KAAA,WAAA;AAAA,aAAA,mBAAA;IAAe,EAAA,CAAA;;;;;;;;;;ACExB,QAAAC,WAAA;AAQA,QAAA,4BAAA;AACA,QAAA,sBAAA;AACA,QAAA,YAAA;AAoBA,QAAM,aAA0B;MAC5B,MAAM,MAAK;MAAE;MACb,MAAM,MAAK;MAAE;MACb,OAAO,MAAK;MAAE;MACd,OAAO,MAAK;MAAE;;AA2BlB,QAAa,sBAAb,MAAgC;MACpB;MACA;MAER,YAAY,gBAAqC,QAAoB;AACjE,aAAK,iBAAiB;AACtB,aAAK,SAAS,UAAU;MAC5B;MAEA,MAAM,iBAAc;AAChB,cAAM,UAAU,KAAK,eAAe,WAAU;AAE9C,gBAAQ,QAAQ,MAAM;UAClB,KAAKA,SAAA,QAAQ;AACT,mBAAO,KAAK,4BAA4B,OAAO;UACnD,KAAKA,SAAA,QAAQ;AACT,mBAAO,MAAM,KAAK,sBAAsB,OAAO;UACnD;AACI,iBAAK,OAAO,KAAK,8BAA8B;AAC/C,mBAAO;cACH,UAAU;cACV,cAAcA,SAAA,iBAAiB;;QAE3C;MACJ;MAEQ,4BACJ,MAAyD;AAEzD,aAAK,OAAO,KAAK,yBAAyB,KAAK,SAAS,EAAE;AAC1D,eAAO;UACH,UAAU,IAAI,0BAAA,sBACV,KAAK,WACL,KAAK,UACL,KAAK,MAAM;UAEf,cAAcA,SAAA,iBAAiB;;MAEvC;MAEQ,MAAM,sBACV,MAAmD;AAEnD,cAAM,kBAAkB,IAAI,UAAA,gBACxB,KAAK,eAAe,eAAc,GAClC,KAAK,MAAM;AAGf,YAAI,CAAE,MAAM,gBAAgB,YAAW,GAAK;AACxC,gBAAM,IAAI,MACN,gFACwC,KAAK,UAAU,oHACyB;QAExF;AAEA,cAAM,cAAc,MAAM,gBAAgB,wBACtC,KAAK,UAAU;AAEnB,YAAI,CAAC,aAAa;AACd,gBAAM,IAAI,MACN,qCAAqC,KAAK,UAAU,uEACoB;QAEhF;AAEA,aAAK,OAAO,KAAK,mBAAmB,KAAK,UAAU,EAAE;AACrD,eAAO;UACH,UAAU,IAAI,oBAAA,gBACV,aACA,KAAK,UACL,KAAK,MAAM;UAEf,cAAcA,SAAA,iBAAiB;;MAEvC;MAEA,MAAM,iBAAc;AAChB,cAAM,OAAO,KAAK,eAAe,WAAU;AAC3C,YAAI,KAAK,SAASA,SAAA,QAAQ,iBAAiB;AACvC,iBAAO;QACX;AACA,YAAI,KAAK,SAASA,SAAA,QAAQ,WAAW;AACjC,gBAAM,kBAAkB,IAAI,UAAA,gBACxB,KAAK,eAAe,eAAc,GAClC,KAAK,MAAM;AAEf,iBAAO,gBAAgB,YAAW;QACtC;AACA,eAAO;MACX;;AA1FJ,IAAAC,SAAA,sBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACMA,IAAAC,SAAA,wBAAA;AA9CA,QAAAC,UAAAC,cAAA,QAAA,aAAA,CAAA;AACA,QAAA,0BAAA;AAgFS,WAAA,eAAAF,UAAA,uBAAA,EAAA,YAAA,MAAA,KAAA,WAAA;AAAA,aA/EL,wBAAA;IAAmB,EAAA,CAAA;AA4CvB,aAAgB,sBACZ,gBAAsB;;AAGtB,YAAM,eAAeC,QAChB,WAAW,QAAQ,EACnB,OAAO,cAAc,EACrB,OAAO,KAAK;AAGjB,YAAM,iBAAiB,wBAAA,oBAAoB,YAAY;AACvD,UAAI,CAAC,gBAAgB;AAEjB,eAAO;MACX;AAGA,aAAO;;QAEH,UACI,oBAAe,mBAAf,wCAAgC,oBAChC;;QAGJ,UAAU,eAAe;;QAGzB,UAAU,eAAe,cAAc;;QAGvC,WAAW,eAAe,cAAc;;IAEhD;AASA,QAAAE,WAAA;AAII,WAAA,eAAAH,UAAA,oBAAA,EAAA,YAAA,MAAA,KAAA,WAAA;AAAA,aAAAG,SAAA;IAAgB,EAAA,CAAA;AAChB,WAAA,eAAAH,UAAA,WAAA,EAAA,YAAA,MAAA,KAAA,WAAA;AAAA,aAAAG,SAAA;IAAO,EAAA,CAAA;AAcX,QAAA,kBAAA;AAAS,WAAA,eAAAH,UAAA,gBAAA,EAAA,YAAA,MAAA,KAAA,WAAA;AAAA,aAAA,gBAAA;IAAY,EAAA,CAAA;AACrB,QAAA,sBAAA;AAAS,WAAA,eAAAA,UAAA,mBAAA,EAAA,YAAA,MAAA,KAAA,WAAA;AAAA,aAAA,oBAAA;IAAe,EAAA,CAAA;AACxB,QAAA,4BAAA;AAAS,WAAA,eAAAA,UAAA,yBAAA,EAAA,YAAA,MAAA,KAAA,WAAA;AAAA,aAAA,0BAAA;IAAqB,EAAA,CAAA;AAM9B,QAAA,0BAAA;AAAS,WAAA,eAAAA,UAAA,uBAAA,EAAA,YAAA,MAAA,KAAA,WAAA;AAAA,aAAA,wBAAA;IAAmB,EAAA,CAAA;AAM5B,QAAA,YAAA;AAEI,WAAA,eAAAA,UAAA,sBAAA,EAAA,YAAA,MAAA,KAAA,WAAA;AAAA,aAAA,UAAA;IAAkB,EAAA,CAAA;AAClB,WAAA,eAAAA,UAAA,4BAAA,EAAA,YAAA,MAAA,KAAA,WAAA;AAAA,aAAA,UAAA;IAAwB,EAAA,CAAA;AACxB,WAAA,eAAAA,UAAA,mBAAA,EAAA,YAAA,MAAA,KAAA,WAAA;AAAA,aAAA,UAAA;IAAe,EAAA,CAAA;AAOnB,QAAA,WAAA;AACI,WAAA,eAAAA,UAAA,aAAA,EAAA,YAAA,MAAA,KAAA,WAAA;AAAA,aAAA,SAAA;IAAS,EAAA,CAAA;AACT,WAAA,eAAAA,UAAA,kBAAA,EAAA,YAAA,MAAA,KAAA,WAAA;AAAA,aAAA,SAAA;IAAc,EAAA,CAAA;AACd,WAAA,eAAAA,UAAA,aAAA,EAAA,YAAA,MAAA,KAAA,WAAA;AAAA,aAAA,SAAA;IAAS,EAAA,CAAA;AACT,WAAA,eAAAA,UAAA,eAAA,EAAA,YAAA,MAAA,KAAA,WAAA;AAAA,aAAA,SAAA;IAAW,EAAA,CAAA;AACX,WAAA,eAAAA,UAAA,gBAAA,EAAA,YAAA,MAAA,KAAA,WAAA;AAAA,aAAA,SAAA;IAAY,EAAA,CAAA;;;;;;;;;;ACzJhB,QAAAI,WAAA;AAAS,WAAA,eAAAC,UAAA,oBAAA,EAAA,YAAA,MAAA,KAAA,WAAA;AAAA,aAAAD,SAAA;IAAgB,EAAA,CAAA;AAAE,WAAA,eAAAC,UAAA,WAAA,EAAA,YAAA,MAAA,KAAA,WAAA;AAAA,aAAAD,SAAA;IAAO,EAAA,CAAA;;;;;;;;;;ACflC,QAAM,aAAa;AAKnB,QAAa,SAAb,MAAmB;MACf,OAAO,YAAY,QAAkB;AAChC,mBAAmB,UAAU,IAAI;MACtC;MAEA,OAAO,cAAW;AACd,cAAM,WAAY,WAAmB,UAAU;AAG/C,YAAI,CAAC,UAAU;AACX,gBAAM,IAAI,MACN,0DAA0D;QAElE;AACA,eAAO;MACX;MAEA,OAAO,QAAK;AACP,mBAAmB,UAAU,IAAI;MACtC;;AAnBJ,IAAAE,SAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACPA,IAAA,KAAA,aAAA,QAAA,SAAA,CAAA;AACA,IAAA,aAAA,aAAA,QAAA,kBAAA,CAAA;AACA,IAAA,OAAA,aAAA,QAAA,WAAA,CAAA;AACA,IAAA,KAAA,aAAA,QAAA,SAAA,CAAA;AACA,IAAA,SAAA,aAAA,QAAA,aAAA,CAAA;AACA,IAAA,QAAA,QAAA,KAAA;AACA,IAAA,UAAA;AACA,IAAA,UAAA;AACA,IAAA,WAAA;AAGA,IAAM,6BAA6B;AACnC,IAAM,qBAAqB;AAC3B,IAAM,+BAA+B;AACrC,IAAM,qBAAqB;AAC3B,IAAM,sBAAsB;AAC5B,IAAM,mBAAmB;AACzB,IAAM,gBAAgB;AACtB,IAAM,2BAA2B;AACjC,IAAM,uBAAuB;AAC7B,IAAM,wBAAwB;AAG9B,IAAM,yBAAyB,MAAA,EAC1B,OAAO;EACJ,WAAW,MAAA,EAAE,OAAM,EAAG,IAAG,EAAG,SAAQ;EACpC,YAAY,MAAA,EAAE,OAAM,EAAG,SAAQ;EAC/B,UAAU,MAAA,EAAE,OAAM,EAAG,SAAQ;EAC7B,UAAU,MAAA,EAAE,OAAM,EAAG,SAAQ;EAC7B,OAAO,MAAA,EAAE,OAAM,EAAG,SAAQ;EAC1B,iBAAiB,MAAA,EAAE,OAAM,EAAG,SAAQ;EACpC,oBAAoB,MAAA,EAAE,OAAM,EAAG,SAAQ;EACvC,gBAAgB,MAAA,EAAE,OAAM,EAAG,SAAQ;EACnC,cAAc,MAAA,EAAE,OAAM,EAAG,SAAQ;EACjC,eAAe,MAAA,EAAE,OAAM,EAAG,SAAQ;EAClC,UAAU,MAAA,EAAE,OAAM,EAAG,SAAQ;CAChC,EACA,OAAM;AAgBX,IAAa,0BAAb,MAAoC;EACxB;EACA;EACA;EAER,YAAY,SAA2B,CAAA,GAAE;AACrC,SAAK,SAAS,KAAK,kBAAkB,MAAM;AAC3C,SAAK,UAAU,KAAK,cAAa;AACjC,SAAK,kBAAiB;AACtB,SAAK,kBACD,OAAO,mBAAmB,KAAK,uBAAsB;AACzD,SAAK,yBAAwB;EACjC;EAEQ,yBAAsB;AAC1B,UAAM,OAAO,OACR,WAAW,QAAQ,EACnB,OAAO,KAAK,OAAO,YAAY,0BAA0B,EACzD,OAAO,KAAK,EACZ,UAAU,GAAG,kBAAkB;AACpC,WAAO,KAAK,KACR,GAAG,QAAO,GACV,cACA,eAAe,IAAI,OAAO;EAElC;EAEQ,2BAAwB;AAC5B,UAAM,MAAM,KAAK,QAAQ,KAAK,eAAe;AAC7C,QAAI,CAAC,GAAG,WAAW,GAAG,GAAG;AACrB,SAAG,UAAU,KAAK,EAAE,WAAW,MAAM,MAAM,qBAAoB,CAAE;IACrE;EACJ;EAEQ,gBAAa;AACjB,UAAM,YAAY,KAAK,OAAO;AAC9B,UAAM,aAAa,KAAK,OAAO;AAC/B,UAAM,WAAW,KAAK,OAAO;AAC7B,UAAM,SAAS,SAAA,OAAO,YAAW;AAEjC,QAAI,WAAW;AACX,aAAO,KAAK,2BAA2B;AACvC,aAAO,EAAE,MAAM,QAAA,QAAQ,iBAAiB,WAAW,SAAQ;IAC/D;AACA,QAAI,YAAY;AACZ,aAAO,KAAK,qBAAqB;AACjC,aAAO,EAAE,MAAM,QAAA,QAAQ,WAAW,YAAY,SAAQ;IAC1D;AACA,WAAO,EAAE,MAAM,QAAA,QAAQ,KAAI;EAC/B;EAEQ,oBAAiB;AACrB,QAAI,KAAK,QAAQ,SAAS,QAAA,QAAQ,QAAQ,CAAC,KAAK,OAAO,WAAW;AAC9D,YAAM,IAAI,MAAM,8CAA8C;IAClE;EACJ;EAEQ,iBAAc;AAClB,UAAM,iBAAiB,KAAK,KACxB,GAAG,QAAO,GACV,cACA,aAAa;AAEjB,QAAI,CAAC,GAAG,WAAW,cAAc,GAAG;AAChC,aAAO,CAAA;IACX;AACA,UAAM,SAAS,SAAA,OAAO,YAAW;AACjC,QAAI;AACA,YAAM,aAAa,KAAK,MACpB,GAAG,aAAa,gBAAgB,MAAM,CAAC;AAE3C,YAAM,SAAS,uBAAuB,UAAU,UAAU;AAC1D,UAAI,CAAC,OAAO,SAAS;AACjB,eAAO,KACH,iCAAiC,cAAc,KAAK,OAAO,MAAM,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC,EAAE;AAE9G,eAAO,CAAA;MACX;AACA,aAAO,OAAO;IAClB,SAAS,OAAO;AACZ,aAAO,KACH,kCAAkC,cAAc,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAEjH,aAAO,CAAA;IACX;EACJ;EAEQ,kBAAkB,QAAwB;AAC9C,UAAM,YAA8B;MAChC,WAAW,QAAQ,IAAI;MACvB,YAAY,QAAQ,IAAI;MACxB,UAAU,QAAQ,IAAI;MACtB,UAAU,QAAQ,IAAI;MACtB,OAAO,QAAQ,IAAI;MACnB,oBAAoB,QAAQ,IAAI;MAChC,gBAAgB,QAAQ,IAAI;MAC5B,cAAc,QAAQ,IAAI;MAC1B,eAAe,QAAQ,IAAI;MAC3B,UAAU,QAAQ,IAAI;;AAG1B,UAAM,aAAa,KAAK,eAAc;AACtC,UAAM,SAAS,SAAA,OAAO,YAAW;AAEjC,UAAM,iBACF,OAAO,kBACP,UAAU,kBACV,WAAW;AAEf,QAAI,gBAAgB;AAEhB,aAAO,KAAK,6BAA6B,cAAc,EAAE;AAEzD,YAAM,kBAAiB,GAAA,QAAA,uBAAsB,cAAc;AAE3D,UAAI,CAAC,gBAAgB;AACjB,eAAO,MAAM,4BAA4B,cAAc,EAAE;AACzD,cAAM,IAAI,MACN,6BAA6B,cAAc,oGAEW;MAE9D;AAEA,aAAO,KAAK,wCAAwC;AACpD,aAAO,KAAK,eAAe,eAAe,SAAS,EAAE;AACrD,aAAO,KAAK,iBAAiB,eAAe,MAAM,EAAE;AACpD,aAAO,KACH,cAAc,eAAe,SAAS,UAAU,GAAG,CAAC,CAAC,KAAK;AAK9D,aAAO;QACH,WAAW,eAAe;QAC1B,YAAY,eAAe;QAC3B,UAAU,eAAe;QACzB,UAAU,eAAe;QACzB,OAAO;;QAEP,iBAAiB,OAAO;QACxB,oBACI,OAAO,sBACP,UAAU,sBACV,WAAW,sBACX;QACJ;QACA,cACI,OAAO,gBACP,UAAU,gBACV,WAAW;QACf,eACI,OAAO,iBACP,UAAU,iBACV,WAAW;QACf,UACI,OAAO,YACP,UAAU,YACV,WAAW;;IAEvB;AAGA,WAAO,KACH,2DAA2D;AAG/D,WAAO;MACH,WACI,OAAO,aACP,UAAU,aACV,WAAW,aACX;MACJ,YACI,OAAO,cACP,UAAU,cACV,WAAW,cACX;MACJ,UACI,OAAO,YACP,UAAU,YACV,WAAW,YACX;MACJ,UACI,OAAO,YACP,UAAU,YACV,WAAW,YACX;MACJ,OACI,OAAO,SACP,UAAU,SACV,WAAW,SACX;MACJ,oBACI,OAAO,sBACP,UAAU,sBACV,WAAW,sBACX;;MAEJ,iBAAiB,OAAO;MACxB,gBAAgB;MAChB,cACI,OAAO,gBACP,UAAU,gBACV,WAAW;MACf,eACI,OAAO,iBACP,UAAU,iBACV,WAAW;MACf,UACI,OAAO,YAAY,UAAU,YAAY,WAAW;;EAEhE;;EAIA,eAAY;AACR,QAAI,CAAC,KAAK,OAAO,WAAW;AACxB,YAAM,IAAI,MACN,mHAAmH;IAE3H;AACA,WAAO,KAAK,OAAO;EACvB;EAEA,iBAAc;AACV,WAAO;EACX;EAEA,oBAAiB;AACb,WAAO,KAAK,OAAO,kBAAkB;EACzC;EAEA,wBAAqB;AACjB,WAAO,KAAK,OAAO,sBAAsB;EAC7C;EAEA,gBAAa;AACT,QAAI,CAAC,KAAK,OAAO,YAAY;AACzB,YAAM,IAAI,MACN,qHAAqH;IAE7H;AACA,QAAI,CAAC,KAAK,OAAO,UAAU;AACvB,YAAM,IAAI,MACN,iHAAiH;IAEzH;AACA,QAAI,CAAC,KAAK,OAAO,UAAU;AACvB,YAAM,IAAI,MACN,+GAA+G;IAEvH;AACA,WAAO;MACH,QAAQ,KAAK,OAAO;MACpB,UAAU,KAAK,OAAO;MACtB,UAAU,KAAK,OAAO;MACtB,OAAO,KAAK,OAAO,SAAS;;EAEpC;EAEA,MAAM,gBAAa;AACf,QAAI;AACA,aAAO,MAAM,WAAW,SAAS,KAAK,iBAAiB,MAAM;IACjE,SAAS,OAAO;AACZ,YAAM,YAAY;AAClB,UAAI,UAAU,SAAS,UAAU;AAE7B,eAAO;MACX;AACA,eAAA,OAAO,YAAW,EAAG,KACjB,mCAAmC,KAAK,eAAe,KAAK,UAAU,OAAO,EAAE;AAEnF,aAAO;IACX;EACJ;EAEA,MAAM,cAAc,OAAa;AAE7B,SAAK,yBAAwB;AAG7B,UAAM,WAAW,UAAU,KAAK,iBAAiB,OAAO;MACpD,MAAM;MACN,UAAU;KACb;EACL;EAEA,MAAM,mBAAgB;AAClB,QAAI;AACA,YAAM,WAAW,OAAO,KAAK,eAAe;IAChD,SAAS,OAAO;AACZ,YAAM,YAAY;AAClB,UAAI,UAAU,SAAS,UAAU;AAE7B;MACJ;AACA,eAAA,OAAO,YAAW,EAAG,KACjB,mCAAmC,KAAK,eAAe,KAAK,UAAU,OAAO,EAAE;IAEvF;EACJ;EAEA,oBAAiB;AACb,UAAM,WAAW,QAAQ,IAAI;AAC7B,YAAO,qCAAU,mBAAkB;EACvC;EAEA,aAAU;AACN,WAAO,KAAK;EAChB;EAEA,cAAW;AACP,WAAO,KAAK,OAAO;EACvB;;AA1TJ,QAAA,0BAAA;",
|
|
6
|
+
"names": ["exports", "AuthStrategyType", "exports", "M2MType", "ErrorCode", "exports", "__importStar", "exports", "types_1", "exports", "fs", "__importStar", "types_1", "exports", "exports", "fs", "__importStar", "path", "os", "exports", "exports", "exports", "types_1", "exports", "exports", "crypto", "__importStar", "types_1", "index_1", "exports", "exports"]
|
|
7
|
+
}
|
|
@@ -34,8 +34,8 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.StandaloneLogger = void 0;
|
|
37
|
-
const fs = __importStar(require("
|
|
38
|
-
const path = __importStar(require("
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
39
|
/**
|
|
40
40
|
* Standalone logger implementation for MCP server
|
|
41
41
|
* Writes to stderr (for stdio mode) and optionally to a log file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/standalone/logger.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/standalone/logger.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAG7B;;;GAGG;AACH,MAAa,gBAAgB;IACjB,OAAO,CAAU;IAEzB,YAAY,OAAgB;QACxB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAEvB,mCAAmC;QACnC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzB,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAC3D,CAAC;QACL,CAAC;IACL,CAAC;IAEO,aAAa,CAAC,KAAa,EAAE,OAAe;QAChD,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,OAAO,IAAI,SAAS,KAAK,KAAK,KAAK,OAAO,EAAE,CAAC;IACjD,CAAC;IAEO,GAAG,CAAC,KAAa,EAAE,OAAe,EAAE,KAAW;QACnD,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,CACvC,KAAK,CAAC,WAAW,EAAE,EACnB,OAAO,CACV,CAAC;QACF,MAAM,WAAW,GAAG,KAAK;YACrB,CAAC,CAAC,GAAG,gBAAgB,YAAY,KAAK,CAAC,QAAQ,EAAE,YAAY,KAAK,CAAC,KAAK,IAAI,KAAK,EAAE;YACnF,CAAC,CAAC,gBAAgB,CAAC;QAEvB,yDAAyD;QACzD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;QAEzC,kCAAkC;QAClC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,IAAI,CAAC;gBACD,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC,CAAC;YACxD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,2BAA2B;YAC/B,CAAC;QACL,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAe;QACjB,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,CAAC,OAAe;QAChB,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,CAAC,OAAe;QAChB,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,KAAW;QAC9B,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;CACJ;AAzDD,4CAyDC"}
|
|
@@ -43,7 +43,7 @@ const stdio_transport_1 = require("./stdio-transport");
|
|
|
43
43
|
const logger_1 = require("./logger");
|
|
44
44
|
const server_1 = require("../server");
|
|
45
45
|
const logger_2 = require("../logger");
|
|
46
|
-
const
|
|
46
|
+
const index_1 = require("../auth/index");
|
|
47
47
|
// Hardcoded version - avoids file read at module load time which breaks in bundled environments
|
|
48
48
|
const MCP_VERSION = "1.0.5";
|
|
49
49
|
/**
|
|
@@ -103,7 +103,7 @@ async function performAuthentication(configService) {
|
|
|
103
103
|
const configProvider = () => {
|
|
104
104
|
return configService.getAuthConfig();
|
|
105
105
|
};
|
|
106
|
-
const auth0Service = new
|
|
106
|
+
const auth0Service = new index_1.Auth0Service(openUrlHandler, configProvider, logger);
|
|
107
107
|
try {
|
|
108
108
|
// Perform authentication
|
|
109
109
|
const authResult = await auth0Service.authenticate();
|
|
@@ -202,7 +202,7 @@ async function startStandaloneServer() {
|
|
|
202
202
|
});
|
|
203
203
|
logger.info(`Server URL: ${configService.getServerUrl()}`);
|
|
204
204
|
// Use AuthStrategyFactory to determine authentication strategy
|
|
205
|
-
const strategyFactory = new
|
|
205
|
+
const strategyFactory = new index_1.AuthStrategyFactory(configService, logger);
|
|
206
206
|
const { strategy, strategyType } = await strategyFactory.createStrategy();
|
|
207
207
|
let m2mStrategy;
|
|
208
208
|
if (strategy) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/standalone/server.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmMA,sDA0HC;AA3TD,yCAA4C;AAC5C,gDAAkC;AAClC,4CAA8B;AAC9B,qCAAmD;AACnD,uDAAmD;AACnD,qCAA4C;AAC5C,sCAAsD;AACtD,sCAAmC;AACnC
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/standalone/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DataFlintServerService } from "../dataflint-server-service";
|
|
2
|
-
import { IAuthStrategy } from "../auth/index
|
|
2
|
+
import { IAuthStrategy } from "../auth/index";
|
|
3
3
|
import { IConfigService } from "../types";
|
|
4
4
|
/**
|
|
5
5
|
* MCP Server using stdio transport for Claude Code CLI
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stdio-transport.d.ts","sourceRoot":"","sources":["../../src/standalone/stdio-transport.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE,OAAO,EAAgB,aAAa,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"stdio-transport.d.ts","sourceRoot":"","sources":["../../src/standalone/stdio-transport.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE,OAAO,EAAgB,aAAa,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EACH,cAAc,EAKjB,MAAM,UAAU,CAAC;AAGlB;;;;GAIG;AACH,qBAAa,cAAc;IACvB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,gBAAgB,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,aAAa,CAAiB;gBAE1B,aAAa,EAAE,cAAc,EAAE,WAAW,CAAC,EAAE,aAAa;IAqEtE,OAAO,CAAC,qBAAqB;IAavB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA+BrB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAIzC,mBAAmB,IAAI,sBAAsB;CAGhD"}
|
|
@@ -6,7 +6,7 @@ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
|
6
6
|
const state_1 = require("../state");
|
|
7
7
|
const dataflint_server_service_1 = require("../dataflint-server-service");
|
|
8
8
|
const tools_1 = require("../tools");
|
|
9
|
-
const
|
|
9
|
+
const index_1 = require("../auth/index");
|
|
10
10
|
const logger_1 = require("../logger");
|
|
11
11
|
/**
|
|
12
12
|
* MCP Server using stdio transport for Claude Code CLI
|
|
@@ -30,7 +30,7 @@ class StdioMcpServer {
|
|
|
30
30
|
const configProvider = () => {
|
|
31
31
|
return this.configService.getAuthConfig();
|
|
32
32
|
};
|
|
33
|
-
this.dataflintService = new dataflint_server_service_1.DataFlintServerService(() => new
|
|
33
|
+
this.dataflintService = new dataflint_server_service_1.DataFlintServerService(() => new index_1.Auth0Service(openUrlHandler, configProvider, logger), configService, undefined, m2mStrategy);
|
|
34
34
|
this.mcpState = new state_1.DataFlintMcpState();
|
|
35
35
|
// Create MCP server
|
|
36
36
|
this.server = new mcp_js_1.McpServer({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stdio-transport.js","sourceRoot":"","sources":["../../src/standalone/stdio-transport.ts"],"names":[],"mappings":";;;AAAA,oEAAoE;AACpE,wEAAiF;AACjF,oCAA6C;AAC7C,0EAAqE;AACrE,oCAA6C;AAC7C
|
|
1
|
+
{"version":3,"file":"stdio-transport.js","sourceRoot":"","sources":["../../src/standalone/stdio-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { AuthResult, IConfigService, IMcpLogger } from "./index";
|
|
2
|
+
/** Creates a fresh logger mock instance */
|
|
3
|
+
export declare function createLoggerMock(): IMcpLogger;
|
|
4
|
+
/** Creates a mock config service with sensible defaults */
|
|
5
|
+
export declare function createMockConfig(overrides?: Partial<IConfigService>): IConfigService;
|
|
6
|
+
/** Creates a valid mock auth result */
|
|
7
|
+
export declare function createMockAuthResult(overrides?: Partial<AuthResult>): AuthResult;
|
|
8
|
+
/** Creates an expired mock auth result */
|
|
9
|
+
export declare function createExpiredAuthResult(): AuthResult;
|
|
10
|
+
/** Creates a mock Auth0Service */
|
|
11
|
+
export declare function createMockAuthService(mockAuthResult?: AuthResult): {
|
|
12
|
+
initialize: import("vitest").Mock<(...args: any[]) => any>;
|
|
13
|
+
authenticate: import("vitest").Mock<(...args: any[]) => any>;
|
|
14
|
+
refreshToken: import("vitest").Mock<(...args: any[]) => any>;
|
|
15
|
+
isTokenExpired: import("vitest").Mock<(...args: any[]) => any>;
|
|
16
|
+
getUserInfo: import("vitest").Mock<(...args: any[]) => any>;
|
|
17
|
+
logout: import("vitest").Mock<(...args: any[]) => any>;
|
|
18
|
+
};
|
|
19
|
+
/** Sets up mock logger as global Logger instance */
|
|
20
|
+
export declare function setupMockLogger(): IMcpLogger;
|
|
21
|
+
/** Creates a mock fetch response */
|
|
22
|
+
export declare function createMockFetch(responseData: unknown, ok?: boolean): import("vitest").Mock<(...args: any[]) => any>;
|
|
23
|
+
/** Helper to setup started service with mock fetch */
|
|
24
|
+
export declare function setupStartedService(service: {
|
|
25
|
+
start: () => Promise<void>;
|
|
26
|
+
}, responseData?: unknown): Promise<import("vitest").Mock<(...args: any[]) => any>>;
|
|
27
|
+
//# sourceMappingURL=test-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-helpers.d.ts","sourceRoot":"","sources":["../src/test-helpers.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAW,MAAM,SAAS,CAAC;AAG/E,2CAA2C;AAC3C,wBAAgB,gBAAgB,IAAI,UAAU,CAO7C;AAED,2DAA2D;AAC3D,wBAAgB,gBAAgB,CAC5B,SAAS,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GACpC,cAAc,CAsBhB;AAED,uCAAuC;AACvC,wBAAgB,oBAAoB,CAChC,SAAS,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAChC,UAAU,CAQZ;AAED,0CAA0C;AAC1C,wBAAgB,uBAAuB,IAAI,UAAU,CAOpD;AAED,kCAAkC;AAClC,wBAAgB,qBAAqB,CAAC,cAAc,CAAC,EAAE,UAAU;;;;;;;EAUhE;AAED,oDAAoD;AACpD,wBAAgB,eAAe,IAAI,UAAU,CAI5C;AAED,oCAAoC;AACpC,wBAAgB,eAAe,CAAC,YAAY,EAAE,OAAO,EAAE,EAAE,UAAO,kDAM/D;AAED,sDAAsD;AACtD,wBAAsB,mBAAmB,CACrC,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,EACvC,YAAY,GAAE,OAAyB,2DAM1C"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createLoggerMock = createLoggerMock;
|
|
4
|
+
exports.createMockConfig = createMockConfig;
|
|
5
|
+
exports.createMockAuthResult = createMockAuthResult;
|
|
6
|
+
exports.createExpiredAuthResult = createExpiredAuthResult;
|
|
7
|
+
exports.createMockAuthService = createMockAuthService;
|
|
8
|
+
exports.setupMockLogger = setupMockLogger;
|
|
9
|
+
exports.createMockFetch = createMockFetch;
|
|
10
|
+
exports.setupStartedService = setupStartedService;
|
|
11
|
+
/**
|
|
12
|
+
* Shared test helpers for dataflint-mcp package
|
|
13
|
+
*/
|
|
14
|
+
const vitest_1 = require("vitest");
|
|
15
|
+
const logger_1 = require("./logger");
|
|
16
|
+
/** Creates a fresh logger mock instance */
|
|
17
|
+
function createLoggerMock() {
|
|
18
|
+
return {
|
|
19
|
+
info: vitest_1.vi.fn(),
|
|
20
|
+
debug: vitest_1.vi.fn(),
|
|
21
|
+
warn: vitest_1.vi.fn(),
|
|
22
|
+
error: vitest_1.vi.fn(),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/** Creates a mock config service with sensible defaults */
|
|
26
|
+
function createMockConfig(overrides) {
|
|
27
|
+
return {
|
|
28
|
+
getServerUrl: vitest_1.vi.fn().mockReturnValue("http://localhost:8080"),
|
|
29
|
+
getEnvironment: vitest_1.vi.fn().mockReturnValue("local"),
|
|
30
|
+
getAdminCompanyDomain: vitest_1.vi.fn().mockReturnValue("test-domain"),
|
|
31
|
+
getCustomerDomain: vitest_1.vi.fn().mockReturnValue("customer-domain"),
|
|
32
|
+
setAuthSecret: vitest_1.vi.fn().mockResolvedValue(undefined),
|
|
33
|
+
deleteAuthSecret: vitest_1.vi.fn().mockResolvedValue(undefined),
|
|
34
|
+
getAuthSecret: vitest_1.vi.fn().mockResolvedValue(undefined),
|
|
35
|
+
getAuthConfig: vitest_1.vi.fn().mockReturnValue({
|
|
36
|
+
domain: "test.auth0.com",
|
|
37
|
+
clientId: "test-client-id",
|
|
38
|
+
audience: "test-audience",
|
|
39
|
+
scope: "openid profile email",
|
|
40
|
+
}),
|
|
41
|
+
getSendSourceCode: vitest_1.vi.fn().mockReturnValue(false),
|
|
42
|
+
getM2MMode: vitest_1.vi
|
|
43
|
+
.fn()
|
|
44
|
+
.mockReturnValue({ type: "none" }),
|
|
45
|
+
getTenantId: vitest_1.vi.fn().mockReturnValue(undefined),
|
|
46
|
+
...overrides,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/** Creates a valid mock auth result */
|
|
50
|
+
function createMockAuthResult(overrides) {
|
|
51
|
+
return {
|
|
52
|
+
accessToken: "mock-access-token",
|
|
53
|
+
idToken: "mock-id-token",
|
|
54
|
+
refreshToken: "mock-refresh-token",
|
|
55
|
+
expiresAt: new Date(Date.now() + 3600000),
|
|
56
|
+
...overrides,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/** Creates an expired mock auth result */
|
|
60
|
+
function createExpiredAuthResult() {
|
|
61
|
+
return {
|
|
62
|
+
accessToken: "expired-access-token",
|
|
63
|
+
idToken: "expired-id-token",
|
|
64
|
+
refreshToken: "expired-refresh-token",
|
|
65
|
+
expiresAt: new Date(Date.now() - 3600000),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/** Creates a mock Auth0Service */
|
|
69
|
+
function createMockAuthService(mockAuthResult) {
|
|
70
|
+
const result = mockAuthResult ?? createMockAuthResult();
|
|
71
|
+
return {
|
|
72
|
+
initialize: vitest_1.vi.fn().mockResolvedValue(undefined),
|
|
73
|
+
authenticate: vitest_1.vi.fn().mockResolvedValue(result),
|
|
74
|
+
refreshToken: vitest_1.vi.fn().mockResolvedValue(result),
|
|
75
|
+
isTokenExpired: vitest_1.vi.fn().mockReturnValue(false),
|
|
76
|
+
getUserInfo: vitest_1.vi.fn().mockResolvedValue({ sub: "user123" }),
|
|
77
|
+
logout: vitest_1.vi.fn().mockResolvedValue(undefined),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/** Sets up mock logger as global Logger instance */
|
|
81
|
+
function setupMockLogger() {
|
|
82
|
+
const mockLogger = createLoggerMock();
|
|
83
|
+
logger_1.Logger.setInstance(mockLogger);
|
|
84
|
+
return mockLogger;
|
|
85
|
+
}
|
|
86
|
+
/** Creates a mock fetch response */
|
|
87
|
+
function createMockFetch(responseData, ok = true) {
|
|
88
|
+
return vitest_1.vi.fn().mockResolvedValue({
|
|
89
|
+
ok,
|
|
90
|
+
status: ok ? 200 : 500,
|
|
91
|
+
json: vitest_1.vi.fn().mockResolvedValue(responseData),
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/** Helper to setup started service with mock fetch */
|
|
95
|
+
async function setupStartedService(service, responseData = { prompts: [] }) {
|
|
96
|
+
const mockFetch = createMockFetch(responseData);
|
|
97
|
+
global.fetch = mockFetch;
|
|
98
|
+
await service.start();
|
|
99
|
+
return mockFetch;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=test-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-helpers.js","sourceRoot":"","sources":["../src/test-helpers.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/base.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { ToolAnnotations } from "@modelcontextprotocol/sdk/types.js";
|
|
2
3
|
import { DataFlintJobService } from "../dataflint-job-service.js";
|
|
3
4
|
import { DataFlintMcpState } from "../state.js";
|
|
4
5
|
import { DataFlintServerService } from "../dataflint-server-service.js";
|
|
@@ -24,6 +25,21 @@ export interface McpToolResponse {
|
|
|
24
25
|
}>;
|
|
25
26
|
isError?: boolean;
|
|
26
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Type-erased wrapper around McpServer.registerTool to avoid exponential
|
|
30
|
+
* TypeScript type instantiation caused by the MCP SDK's complex generic
|
|
31
|
+
* signature combined with inline zod schemas.
|
|
32
|
+
*
|
|
33
|
+
* The MCP SDK's registerTool<InputArgs, OutputArgs> triggers millions of
|
|
34
|
+
* type instantiations per call when TypeScript infers zod schema types.
|
|
35
|
+
* This wrapper breaks that inference chain while preserving full runtime behavior.
|
|
36
|
+
*/
|
|
37
|
+
export declare function registerTool(server: McpServer, name: string, config: {
|
|
38
|
+
title?: string;
|
|
39
|
+
description?: string;
|
|
40
|
+
inputSchema?: any;
|
|
41
|
+
annotations?: ToolAnnotations;
|
|
42
|
+
}, cb: (args: any, extra: any) => Promise<any>): void;
|
|
27
43
|
export declare function successResponse(data: unknown): McpToolResponse;
|
|
28
44
|
export declare function errorResponse(message: string, troubleshootingSteps: string[]): McpToolResponse;
|
|
29
45
|
//# sourceMappingURL=base.d.ts.map
|