UNPKG

mlld

Version:

mlld: llm scripting language

1 lines 60.2 kB
{"version":3,"sources":["../core/registry/auth/GitHubAuthService.ts","../core/resolvers/GitHubResolver.ts"],"names":["GitHubAuthService","config","serviceName","accountName","fallbackTokenPath","clientId","octokitModule","keytarModule","process","env","MLLD_GITHUB_CLIENT_ID","fallbackStorage","join","homedir","getInstance","instance","getKeytarModule","undefined","getOctokitModule","getOctokit","token","getStoredToken","MlldError","code","severity","ErrorSeverity","Fatal","Octokit","auth","log","debug","info","warn","console","error","isAuthenticated","octokit","users","getAuthenticated","getGitHubUser","data","authenticate","existingUser","success","user","deviceFlow","initiateDeviceFlow","verification_uri","user_code","verification_uri_complete","result","pollForToken","login","errorMessage","Error","message","String","logout","keytar","deletePassword","unlink","getPassword","authData","readFile","parsed","JSON","parse","storeToken","storedInKeychain","setPassword","mkdir","dirname","recursive","stored_at","Date","toISOString","service","writeFile","stringify","mode","response","fetch","method","headers","body","client_id","scope","ok","text","json","cause","startTime","now","expirationTime","expires_in","interval","sleep","device_code","grant_type","access_token","error_description","ms","Promise","resolve","setTimeout","GitHubResolver","name","description","type","capabilities","io","read","write","list","contexts","import","path","output","supportedContentTypes","defaultContentType","priority","cache","strategy","ttl","duration","Map","defaultCacheTimeout","authService","canResolve","ref","repository","MlldResolutionError","reference","owner","repo","split","buildPath","cacheKey","branch","cached","getCached","cacheTimeout","contentType","detectContentType","content","metadata","source","timestamp","taint","author","mx","getAuthToken","etag","fetchFromGitHub","set","mimeType","getMimeType","err","status","localPath","getLocalPath","localExists","existsSync","prefix","logger","details","hasLocal","originalError","resolveBranch","url","githubFetch","items","Array","isArray","map","item","size","lastModified","sha","validateConfig","errors","push","cfg","includes","basePath","useRawApi","checkAccess","operation","authToken","GITHUB_TOKEN","parts","replace","modulePath","filter","p","length","key","timeout","get","maxAge","delete","statusText","Buffer","from","toString","defaultBranch","default_branch","ext","pop","toLowerCase","mimeTypes","filePath","endsWith","hasModuleExports","ast","some","node","kind","cwd"],"mappings":"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","file":"chunk-YUPK4GL5.mjs","sourcesContent":["/**\n * GitHub Authentication Service for mlld CLI\n * Implements OAuth Device Flow with secure token storage\n */\n\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { MlldError, ErrorSeverity } from '@core/errors';\n\nexport interface AuthConfig {\n  clientId?: string;\n  serviceName?: string;\n  accountName?: string;\n  fallbackStorage?: boolean;\n}\n\nexport interface GitHubUser {\n  login: string;\n  id: number;\n  name: string | null;\n  email: string | null;\n  avatar_url: string;\n  type: string;\n}\n\nexport interface DeviceFlowResult {\n  device_code: string;\n  user_code: string;\n  verification_uri: string;\n  verification_uri_complete?: string;\n  expires_in: number;\n  interval: number;\n}\n\nexport interface AuthResult {\n  success: boolean;\n  user?: GitHubUser;\n  token?: string;\n  error?: string;\n}\n\nexport class GitHubAuthService {\n  private static instance: GitHubAuthService | null = null;\n  private config: AuthConfig;\n  private serviceName: string;\n  private accountName: string;\n  private fallbackTokenPath: string;\n  private clientId: string;\n  private octokitModule: any;\n  private keytarModule: any = undefined;\n\n  constructor(config: AuthConfig = {}) {\n    this.config = {\n      clientId: process.env.MLLD_GITHUB_CLIENT_ID || 'Ov23liFeqioeJmD9xZOP',\n      serviceName: 'mlld-cli',\n      accountName: 'github-token',\n      fallbackStorage: true,\n      ...config\n    };\n    \n    this.clientId = this.config.clientId!;\n    this.serviceName = this.config.serviceName!;\n    this.accountName = this.config.accountName!;\n    this.fallbackTokenPath = path.join(os.homedir(), '.mlld', 'auth.json');\n  }\n\n  /**\n   * Get singleton instance of GitHubAuthService\n   */\n  static getInstance(config?: AuthConfig): GitHubAuthService {\n    if (!GitHubAuthService.instance) {\n      GitHubAuthService.instance = new GitHubAuthService(config);\n    }\n    return GitHubAuthService.instance;\n  }\n\n  /**\n   * Dynamically load keytar module (optional dependency)\n   */\n  private async getKeytarModule() {\n    if (this.keytarModule === undefined) {\n      try {\n        this.keytarModule = await import('keytar');\n      } catch {\n        this.keytarModule = null;\n      }\n    }\n    return this.keytarModule;\n  }\n\n  /**\n   * Dynamically load Octokit module\n   */\n  private async getOctokitModule() {\n    if (!this.octokitModule) {\n      this.octokitModule = await import('@octokit/rest');\n    }\n    return this.octokitModule;\n  }\n\n  /**\n   * Get authenticated Octokit instance\n   */\n  async getOctokit(): Promise<any> {\n    const token = await this.getStoredToken();\n    if (!token) {\n      throw new MlldError('Not authenticated. Please run: mlld auth login', {\n        code: 'AUTH_NOT_AUTHENTICATED',\n        severity: ErrorSeverity.Fatal\n      });\n    }\n    const { Octokit } = await this.getOctokitModule();\n    return new Octokit({ \n      auth: token,\n      log: {\n        debug: () => {},\n        info: () => {},\n        warn: console.warn,\n        error: console.error\n      }\n    });\n  }\n\n  /**\n   * Check if user is currently authenticated\n   */\n  async isAuthenticated(): Promise<boolean> {\n    try {\n      const token = await this.getStoredToken();\n      if (!token) return false;\n\n      // Validate token with GitHub API\n      const { Octokit } = await this.getOctokitModule();\n      const octokit = new Octokit({ \n        auth: token,\n        log: {\n          debug: () => {},\n          info: () => {},\n          warn: console.warn,\n          error: console.error\n        }\n      });\n      await octokit.users.getAuthenticated();\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * Get current authenticated GitHub user\n   */\n  async getGitHubUser(): Promise<GitHubUser | null> {\n    try {\n      const octokit = await this.getOctokit();\n      const { data } = await octokit.users.getAuthenticated();\n      return data;\n    } catch {\n      return null;\n    }\n  }\n\n  /**\n   * Perform authentication using OAuth Device Flow\n   */\n  async authenticate(): Promise<AuthResult> {\n    try {\n      // Check if already authenticated\n      const existingUser = await this.getGitHubUser();\n      if (existingUser) {\n        return {\n          success: true,\n          user: existingUser,\n          token: await this.getStoredToken()\n        };\n      }\n\n      // Start device flow\n      console.log('🔐 Starting GitHub authentication...\\n');\n      console.log('📄 By publishing to the mlld registry, you agree to license your');\n      console.log('   modules under the CC0 1.0 Universal (CC0 1.0) Public Domain Dedication.');\n      console.log('   Learn more: https://creativecommons.org/public-domain/cc0/\\n');\n      \n      const deviceFlow = await this.initiateDeviceFlow();\n      \n      console.log(`Please visit: ${deviceFlow.verification_uri}`);\n      console.log(`And enter code: ${deviceFlow.user_code}\\n`);\n      if (deviceFlow.verification_uri_complete) {\n        console.log('Or open the direct link:');\n        console.log(`${deviceFlow.verification_uri_complete}\\n`);\n      }\n      console.log('Waiting for authentication...');\n\n      // Poll for token\n      const result = await this.pollForToken(deviceFlow);\n      \n      if (result.success) {\n        console.log(`✅ Successfully authenticated as ${result.user!.login}`);\n        return result;\n      } else {\n        console.error(`❌ Authentication failed: ${result.error}`);\n        return result;\n      }\n    } catch (error) {\n      const errorMessage = error instanceof Error ? error.message : String(error);\n      return {\n        success: false,\n        error: `Authentication failed: ${errorMessage}`\n      };\n    }\n  }\n\n  /**\n   * Logout - remove stored credentials\n   */\n  async logout(): Promise<void> {\n    try {\n      // Remove from keychain\n      const keytar = await this.getKeytarModule();\n      if (keytar) {\n        try {\n          await keytar.deletePassword(this.serviceName, this.accountName);\n        } catch {\n          // Keychain removal failed, continue to fallback\n        }\n      }\n\n      // Remove fallback file\n      if (this.config.fallbackStorage) {\n        try {\n          await fs.unlink(this.fallbackTokenPath);\n        } catch {\n          // File doesn't exist or can't be removed\n        }\n      }\n\n    } catch (error) {\n      const errorMessage = error instanceof Error ? error.message : String(error);\n      throw new MlldError(`Logout failed: ${errorMessage}`, {\n        code: 'AUTH_LOGOUT_FAILED',\n        severity: ErrorSeverity.Fatal\n      });\n    }\n  }\n\n  /**\n   * Get stored authentication token\n   */\n  async getStoredToken(): Promise<string | null> {\n    // Try keychain first\n    const keytar = await this.getKeytarModule();\n    if (keytar) {\n      try {\n        const token = await keytar.getPassword(this.serviceName, this.accountName);\n        if (token) return token;\n      } catch {\n        // Keychain access failed, try fallback\n      }\n    }\n\n    // Try fallback storage\n    if (this.config.fallbackStorage) {\n      try {\n        const authData = await fs.readFile(this.fallbackTokenPath, 'utf8');\n        const parsed = JSON.parse(authData);\n        return parsed.token || null;\n      } catch {\n        // Fallback file doesn't exist or is invalid\n      }\n    }\n\n    return null;\n  }\n\n  /**\n   * Store authentication token securely\n   */\n  private async storeToken(token: string): Promise<void> {\n    let storedInKeychain = false;\n\n    // Try to store in keychain\n    const keytar = await this.getKeytarModule();\n    if (keytar) {\n      try {\n        await keytar.setPassword(this.serviceName, this.accountName, token);\n        storedInKeychain = true;\n      } catch (error) {\n        console.warn('⚠️  Could not store token in system keychain, using fallback storage');\n      }\n    } else {\n      console.warn('⚠️  Keytar not available, using fallback storage');\n    }\n\n    // Store in fallback if keychain failed or if fallback is enabled\n    if (!storedInKeychain && this.config.fallbackStorage) {\n      try {\n        // Ensure directory exists\n        await fs.mkdir(path.dirname(this.fallbackTokenPath), { recursive: true });\n        \n        // Store token with metadata\n        const authData = {\n          token,\n          stored_at: new Date().toISOString(),\n          service: this.serviceName,\n        };\n        \n        await fs.writeFile(\n          this.fallbackTokenPath, \n          JSON.stringify(authData, null, 2),\n          { mode: 0o600 } // Readable only by owner\n        );\n      } catch (error) {\n        const errorMessage = error instanceof Error ? error.message : String(error);\n        throw new MlldError(`Failed to store authentication token: ${errorMessage}`, {\n          code: 'AUTH_TOKEN_STORAGE_FAILED',\n          severity: ErrorSeverity.Fatal\n        });\n      }\n    }\n  }\n\n\n  /**\n   * Initiate GitHub OAuth Device Flow\n   */\n  private async initiateDeviceFlow(): Promise<DeviceFlowResult> {\n    try {\n      const response = await fetch('https://github.com/login/device/code', {\n        method: 'POST',\n        headers: {\n          'Accept': 'application/json',\n          'Content-Type': 'application/json',\n        },\n        body: JSON.stringify({\n          client_id: this.clientId,\n          scope: 'gist public_repo',\n        }),\n      });\n\n      if (!response.ok) {\n        const error = await response.text();\n        throw new MlldError(`Failed to initiate device flow: ${error}`, {\n          code: 'AUTH_DEVICE_FLOW_FAILED',\n          severity: ErrorSeverity.Fatal\n        });\n      }\n\n      return await response.json();\n    } catch (error) {\n      if (error instanceof MlldError) {\n        throw error;\n      }\n      throw new MlldError(`Failed to initiate device flow: ${error instanceof Error ? error.message : String(error)}`, {\n        code: 'AUTH_DEVICE_FLOW_ERROR',\n        severity: ErrorSeverity.Fatal,\n        cause: error\n      });\n    }\n  }\n\n  /**\n   * Poll for authentication token\n   */\n  private async pollForToken(deviceFlow: DeviceFlowResult): Promise<AuthResult> {\n    const startTime = Date.now();\n    const expirationTime = startTime + (deviceFlow.expires_in * 1000);\n    let interval = deviceFlow.interval * 1000; // Convert to milliseconds\n\n    while (Date.now() < expirationTime) {\n      await this.sleep(interval);\n\n      try {\n        const response = await fetch('https://github.com/login/oauth/access_token', {\n          method: 'POST',\n          headers: {\n            'Accept': 'application/json',\n            'Content-Type': 'application/json',\n          },\n          body: JSON.stringify({\n            client_id: this.clientId,\n            device_code: deviceFlow.device_code,\n            grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n          }),\n        });\n\n        const data = await response.json();\n        \n        if (data.access_token) {\n          // Store the token\n          await this.storeToken(data.access_token);\n          \n          // Get user info\n          const { Octokit } = await this.getOctokitModule();\n          const octokit = new Octokit({ \n            auth: data.access_token,\n            log: {\n              debug: () => {},\n              info: () => {},\n              warn: console.warn,\n              error: console.error\n            }\n          });\n          const { data: user } = await octokit.users.getAuthenticated();\n          \n          return {\n            success: true,\n            user,\n            token: data.access_token,\n          };\n        } else if (data.error === 'authorization_pending') {\n          // Continue polling\n          continue;\n        } else if (data.error === 'slow_down') {\n          // Increase polling interval\n          interval += 5000;\n          continue;\n        } else if (data.error === 'access_denied') {\n          return {\n            success: false,\n            error: 'Authentication was denied by user',\n          };\n        } else if (data.error === 'expired_token') {\n          return {\n            success: false,\n            error: 'Authentication code expired. Please try again.',\n          };\n        } else {\n          return {\n            success: false,\n            error: data.error_description || data.error || 'Unknown error',\n          };\n        }\n      } catch (error) {\n        // Network error - continue polling unless we're close to expiration\n        if (Date.now() + interval >= expirationTime) {\n          const errorMessage = error instanceof Error ? error.message : String(error);\n          return {\n            success: false,\n            error: `Network error during authentication: ${errorMessage}`,\n          };\n        }\n        // Otherwise continue polling\n      }\n    }\n\n    return {\n      success: false,\n      error: 'Authentication timed out. Please try again.',\n    };\n  }\n\n  /**\n   * Utility function to sleep for a given number of milliseconds\n   */\n  private sleep(ms: number): Promise<void> {\n    return new Promise(resolve => setTimeout(resolve, ms));\n  }\n}","import { \n  Resolver, \n  ResolverContent, \n  ResolverType,\n  ContentInfo,\n  ResolverCapabilities\n} from '@core/resolvers/types';\nimport { MlldResolutionError } from '@core/errors';\nimport { GitHubAuthService } from '@core/registry/auth/GitHubAuthService';\nimport { logger } from '@core/utils/logger';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\n// GitHub API response types\ninterface GitHubContentItem {\n  name: string;\n  path: string;\n  sha: string;\n  size?: number;\n  url: string;\n  html_url: string;\n  git_url: string;\n  download_url?: string;\n  type: 'file' | 'dir' | 'symlink' | 'submodule';\n  content?: string;\n  encoding?: string;\n}\n\ninterface GitHubRepoInfo {\n  default_branch: string;\n  name: string;\n  full_name: string;\n  private: boolean;\n  owner: {\n    login: string;\n    type: string;\n  };\n}\n\n/**\n * Configuration for GitHubResolver\n */\nexport interface GitHubResolverConfig {\n  /**\n   * GitHub personal access token for authentication\n   * @deprecated Use 'mlld auth login' to store tokens securely instead\n   */\n  token?: string;\n\n  /**\n   * Repository owner and name (e.g., \"mlld-lang/mlld\")\n   */\n  repository: string;\n\n  /**\n   * Branch or tag to use (defaults to main/master)\n   */\n  branch?: string;\n\n  /**\n   * Base path within the repository\n   */\n  basePath?: string;\n\n  /**\n   * Whether to use raw content API (faster but limited to 1MB files)\n   */\n  useRawApi?: boolean;\n\n  /**\n   * Cache timeout in milliseconds\n   */\n  cacheTimeout?: number;\n\n  /**\n   * The prefix used to reference this resolver (e.g., \"@private/\")\n   * Used for helpful error messages\n   */\n  prefix?: string;\n\n  /**\n   * Resolution context (import, path, variable)\n   */\n  context?: string;\n}\n\n/**\n * GitHub Resolver - provides access to GitHub repository contents\n * Supports both public and private repositories (with token)\n */\nexport class GitHubResolver implements Resolver {\n  name = 'GITHUB';\n  description = 'Resolves modules from GitHub repositories';\n  type: ResolverType = 'input';\n\n  constructor() {\n    this.authService = GitHubAuthService.getInstance();\n  }\n  \n  capabilities: ResolverCapabilities = {\n    io: { read: true, write: false, list: true },\n    contexts: { import: true, path: true, output: false },\n    supportedContentTypes: ['module', 'data', 'text'],\n    defaultContentType: 'text',\n    priority: 20, // Same as other file resolvers\n    cache: { \n      strategy: 'persistent',\n      ttl: { duration: 300 } // 5 minutes\n    }\n  };\n\n  private readonly cache: Map<string, { content: string; timestamp: number; etag?: string }> = new Map();\n  private readonly defaultCacheTimeout = 300000; // 5 minutes\n  private authService: GitHubAuthService;\n\n  /**\n   * Check if this resolver can handle the reference\n   */\n  canResolve(ref: string, config?: GitHubResolverConfig): boolean {\n    // We can handle any reference if we have a valid repository config\n    return !!config?.repository;\n  }\n\n  /**\n   * Resolve a reference to GitHub content\n   */\n  async resolve(ref: string, config?: GitHubResolverConfig): Promise<ResolverContent> {\n    if (!config?.repository) {\n      throw new MlldResolutionError(\n        'GitHubResolver requires repository in configuration',\n        { reference: ref }\n      );\n    }\n\n    // Parse repository owner and name\n    const [owner, repo] = config.repository.split('/');\n    if (!owner || !repo) {\n      throw new MlldResolutionError(\n        'Invalid repository format. Expected \"owner/repo\"',\n        { reference: ref, repository: config.repository }\n      );\n    }\n\n    // Build the path within the repository\n    const path = this.buildPath(ref, config);\n    \n    // Check cache first\n    const cacheKey = `${config.repository}:${config.branch || 'default'}:${path}`;\n    const cached = this.getCached(cacheKey, config.cacheTimeout);\n    if (cached) {\n      const contentType = await this.detectContentType(path, cached.content);\n      const metadata = {\n        source: `github://${config.repository}/${path}`,\n        timestamp: new Date(),\n        taint: [],\n        author: owner\n      };\n      return {\n        content: cached.content,\n        contentType,\n        mx: metadata,\n        metadata\n      };\n    }\n\n    try {\n      // Get authentication token\n      const token = await this.getAuthToken(config);\n      \n      // Fetch from GitHub\n      const { content, etag } = await this.fetchFromGitHub(owner, repo, path, config, cached?.etag, token);\n      \n      // Update cache\n      this.cache.set(cacheKey, {\n        content,\n        timestamp: Date.now(),\n        etag\n      });\n\n      const contentType = await this.detectContentType(path, content);\n      const metadata = {\n        source: `github://${config.repository}/${path}`,\n        timestamp: new Date(),\n        taint: [],\n        author: owner,\n        mimeType: this.getMimeType(path)\n      };\n      return {\n        content,\n        contentType,\n        mx: metadata,\n        metadata\n      };\n    } catch (error) {\n      const err = error as { status?: number; message?: string };\n      if (err.status === 404) {\n        // Check if the file exists locally\n        const localPath = this.getLocalPath(ref, config);\n        const localExists = localPath && fs.existsSync(localPath);\n        \n        if (localExists) {\n          // Extract the prefix from the original reference\n          const prefix = config.prefix || '@private/';\n          \n          logger.debug(`GitHubResolver: Module ${ref} not found in repo, but local version exists at ${localPath}`);\n          \n          throw new MlldResolutionError(\n            `Module '${prefix}${ref}' not found in repository ${config.repository}.\\n` +\n            `However, a local version exists at: ${localPath}\\n\\n` +\n            `To test locally before publishing:\\n` +\n            `  @import { something } from @local/${ref}\\n\\n` +\n            `Ready to publish? Run:\\n` +\n            `  mlld publish ${localPath}`,\n            { \n              code: 'MODULE_NOT_FOUND_BUT_LOCAL_EXISTS',\n              details: { \n                reference: ref, \n                repository: config.repository, \n                path, \n                hasLocal: true, \n                localPath \n              }\n            }\n          );\n        } else {\n          throw new MlldResolutionError(\n            `File not found in repository: ${path}`,\n            { \n              code: 'FILE_NOT_FOUND', \n              details: { reference: ref, repository: config.repository, path } \n            }\n          );\n        }\n      }\n      if (err.status === 401 || err.status === 403) {\n        throw new MlldResolutionError(\n          `GitHub authentication required. Run 'mlld auth login' to authenticate`,\n          { reference: ref, repository: config.repository, path }\n        );\n      }\n      throw new MlldResolutionError(\n        `Failed to fetch from GitHub: ${err.message || 'Unknown error'}`,\n        { \n          reference: ref, \n          repository: config.repository,\n          path,\n          originalError: error\n        }\n      );\n    }\n  }\n\n  /**\n   * List files in a GitHub directory\n   */\n  async list(prefix: string, config?: GitHubResolverConfig): Promise<ContentInfo[]> {\n    if (!config?.repository) {\n      return [];\n    }\n\n    const [owner, repo] = config.repository.split('/');\n    if (!owner || !repo) {\n      return [];\n    }\n\n    const path = this.buildPath(prefix, config);\n    const token = await this.getAuthToken(config);\n    const branch = await this.resolveBranch(owner, repo, config, token);\n\n    try {\n      const url = `https://api.github.com/repos/${owner}/${repo}/contents/${path}?ref=${branch}`;\n      const response = await this.githubFetch(url, token);\n      \n      if (!response.ok) {\n        return [];\n      }\n\n      const items = await response.json() as GitHubContentItem[];\n      if (!Array.isArray(items)) {\n        return [];\n      }\n\n      return items.map(item => ({\n        path: `${prefix}/${item.name}`,\n        type: item.type === 'dir' ? 'directory' : 'file' as const,\n        size: item.size,\n        lastModified: new Date(item.sha) // Using SHA as a proxy for last modified\n      }));\n    } catch {\n      return [];\n    }\n  }\n\n  /**\n   * Validate configuration\n   */\n  validateConfig(config: unknown): string[] {\n    const errors: string[] = [];\n    \n    // Type guard for config\n    if (!config || typeof config !== 'object') {\n      errors.push('config must be an object');\n      return errors;\n    }\n    \n    const cfg = config as Record<string, unknown>;\n\n    if (!cfg.repository) {\n      errors.push('repository is required');\n    } else if (typeof cfg.repository !== 'string') {\n      errors.push('repository must be a string');\n    } else if (!cfg.repository.includes('/')) {\n      errors.push('repository must be in format \"owner/repo\"');\n    }\n\n    if (cfg.token !== undefined && typeof cfg.token !== 'string') {\n      errors.push('token must be a string');\n    }\n\n    if (cfg.branch !== undefined && typeof cfg.branch !== 'string') {\n      errors.push('branch must be a string');\n    }\n\n    if (cfg.basePath !== undefined && typeof cfg.basePath !== 'string') {\n      errors.push('basePath must be a string');\n    }\n\n    if (cfg.useRawApi !== undefined && typeof cfg.useRawApi !== 'boolean') {\n      errors.push('useRawApi must be a boolean');\n    }\n\n    if (cfg.cacheTimeout !== undefined) {\n      if (typeof cfg.cacheTimeout !== 'number' || cfg.cacheTimeout < 0) {\n        errors.push('cacheTimeout must be a non-negative number');\n      }\n    }\n\n    return errors;\n  }\n\n  /**\n   * Check access - depends on whether repository is public/private\n   */\n  async checkAccess(ref: string, operation: 'read' | 'write', config?: GitHubResolverConfig): Promise<boolean> {\n    if (operation === 'write') {\n      return false; // GitHub resolver is read-only\n    }\n\n    if (!config?.repository) {\n      return false;\n    }\n\n    // Get authentication token from auth service or config\n    const token = await this.getAuthToken(config);\n    \n    // For private repos, we need a token\n    if (token) {\n      return true;\n    }\n\n    // For public repos, check if accessible\n    const [owner, repo] = config.repository.split('/');\n    try {\n      const response = await fetch(`https://api.github.com/repos/${owner}/${repo}`);\n      return response.ok;\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * Get authentication token from auth service or config fallback\n   */\n  private async getAuthToken(config?: GitHubResolverConfig): Promise<string | null> {\n    try {\n      // First try to get token from auth service\n      const authToken = await this.authService.getStoredToken();\n      if (authToken) {\n        return authToken;\n      }\n    } catch {\n      // Auth service failed, continue to fallback\n    }\n\n    // Fall back to config token (deprecated)\n    if (config?.token) {\n      return config.token;\n    }\n\n    // Fall back to environment variable\n    if (process.env.GITHUB_TOKEN) {\n      return process.env.GITHUB_TOKEN;\n    }\n\n    return null;\n  }\n\n  /**\n   * Build the full path within the repository\n   */\n  private buildPath(ref: string, config: GitHubResolverConfig): string {\n    const parts: string[] = [];\n    \n    if (config.basePath) {\n      parts.push(config.basePath.replace(/^\\/|\\/$/g, ''));\n    }\n    \n    if (ref) {\n      let modulePath = ref.replace(/^\\/|\\/$/g, '');\n      \n      // Auto-append .mld.md extension if no extension is provided\n      if (modulePath && !modulePath.includes('.')) {\n        modulePath += '.mld.md';\n      }\n      \n      parts.push(modulePath);\n    }\n    \n    return parts.filter(p => p.length > 0).join('/');\n  }\n\n  /**\n   * Get cached content if available\n   */\n  private getCached(\n    key: string, \n    timeout?: number\n  ): { content: string; etag?: string } | null {\n    const cached = this.cache.get(key);\n    if (!cached) return null;\n\n    const maxAge = timeout || this.defaultCacheTimeout;\n    if (Date.now() - cached.timestamp > maxAge) {\n      this.cache.delete(key);\n      return null;\n    }\n\n    return { content: cached.content, etag: cached.etag };\n  }\n\n  /**\n   * Fetch content from GitHub\n   */\n  private async fetchFromGitHub(\n    owner: string,\n    repo: string,\n    path: string,\n    config: GitHubResolverConfig,\n    etag?: string,\n    token?: string | null\n  ): Promise<{ content: string; etag?: string }> {\n    const branch = await this.resolveBranch(owner, repo, config, token);\n\n    // Use raw API for better performance if enabled\n    if (config.useRawApi !== false) {\n      const url = `https://raw.githubusercontent.com/${owner}/${repo}/${branch}/${path}`;\n      const headers: HeadersInit = {};\n      \n      if (token) {\n        headers['Authorization'] = `token ${token}`;\n      }\n      \n      if (etag) {\n        headers['If-None-Match'] = etag;\n      }\n\n      const response = await fetch(url, { headers });\n      \n      if (response.status === 304) {\n        // Not modified, use cache\n        const cached = this.cache.get(`${config.repository}:${branch}:${path}`);\n        if (cached) {\n          return { content: cached.content, etag: cached.etag };\n        }\n      }\n\n      if (!response.ok) {\n        const error = new Error(`GitHub API error: ${response.statusText}`) as Error & { status: number };\n        error.status = response.status;\n        throw error;\n      }\n\n      return {\n        content: await response.text(),\n        etag: response.headers.get('etag') || undefined\n      };\n    }\n\n    // Fall back to contents API\n    const url = `https://api.github.com/repos/${owner}/${repo}/contents/${path}?ref=${branch}`;\n    const response = await this.githubFetch(url, token, etag);\n\n    if (response.status === 304) {\n      // Not modified, use cache\n      const cached = this.cache.get(`${config.repository}:${branch}:${path}`);\n      if (cached) {\n        return { content: cached.content, etag: cached.etag };\n      }\n    }\n\n    if (!response.ok) {\n      const error = new Error(`GitHub API error: ${response.statusText}`) as Error & { status: number };\n      error.status = response.status;\n      throw error;\n    }\n\n    const data = await response.json() as GitHubContentItem;\n    \n    if (data.type !== 'file') {\n      throw new Error(`Path is not a file: ${path}`);\n    }\n    \n    if (!data.content) {\n      throw new Error(`No content found for file: ${path}`);\n    }\n\n    // Decode base64 content\n    const content = Buffer.from(data.content, 'base64').toString('utf8');\n    \n    return {\n      content,\n      etag: response.headers.get('etag') || undefined\n    };\n  }\n\n  /**\n   * Resolve the branch to use\n   */\n  private async resolveBranch(\n    owner: string,\n    repo: string,\n    config: GitHubResolverConfig,\n    token?: string | null\n  ): Promise<string> {\n    if (config.branch) {\n      return config.branch;\n    }\n\n    // Get default branch from repo info\n    const cacheKey = `${owner}/${repo}:default-branch`;\n    const cached = this.cache.get(cacheKey);\n    \n    if (cached && Date.now() - cached.timestamp < 86400000) { // 24 hours\n      return cached.content;\n    }\n\n    try {\n      const response = await this.githubFetch(\n        `https://api.github.com/repos/${owner}/${repo}`,\n        token\n      );\n      \n      if (response.ok) {\n        const data = await response.json() as GitHubRepoInfo;\n        const defaultBranch = data.default_branch || 'main';\n        \n        this.cache.set(cacheKey, {\n          content: defaultBranch,\n          timestamp: Date.now()\n        });\n        \n        return defaultBranch;\n      }\n    } catch {\n      // Fall through to default\n    }\n\n    return 'main';\n  }\n\n  /**\n   * Make a GitHub API request with proper headers\n   */\n  private async githubFetch(\n    url: string,\n    token?: string,\n    etag?: string\n  ): Promise<Response> {\n    const headers: HeadersInit = {\n      'Accept': 'application/vnd.github.v3+json',\n      'User-Agent': 'mlld-resolver'\n    };\n\n    if (token) {\n      headers['Authorization'] = `token ${token}`;\n    }\n\n    if (etag) {\n      headers['If-None-Match'] = etag;\n    }\n\n    return fetch(url, { headers });\n  }\n\n  /**\n   * Get MIME type based on file extension\n   */\n  private getMimeType(path: string): string {\n    const ext = path.split('.').pop()?.toLowerCase();\n    const mimeTypes: Record<string, string> = {\n      'mld': 'text/x-mlld',\n      'mlld': 'text/x-mlld',\n      'md': 'text/markdown',\n      'txt': 'text/plain',\n      'json': 'application/json',\n      'yaml': 'text/yaml',\n      'yml': 'text/yaml',\n      'js': 'text/javascript',\n      'ts': 'text/typescript',\n      'py': 'text/x-python',\n      'sh': 'text/x-shellscript'\n    };\n\n    return mimeTypes[ext || ''] || 'text/plain';\n  }\n\n  /**\n   * Detect content type based on file extension and content\n   */\n  private async detectContentType(filePath: string, content: string): Promise<'module' | 'data' | 'text'> {\n    // Check file extension\n    if (filePath.endsWith('.mld') || filePath.endsWith('.mld.md') ||\n        filePath.endsWith('.mlld') || filePath.endsWith('.mlld.md')) {\n      return 'module';\n    }\n    if (filePath.endsWith('.json')) {\n      return 'data';\n    }\n    \n    // Try to detect mlld module content\n    try {\n      const { parse } = await import('@grammar/parser');\n      const result = await parse(content);\n      if (result.success && this.hasModuleExports(result.ast)) {\n        return 'module';\n      }\n    } catch {\n      // Not valid mlld\n    }\n    \n    // Try JSON\n    try {\n      JSON.parse(content);\n      return 'data';\n    } catch {\n      // Not JSON\n    }\n    \n    return 'text';\n  }\n  \n  /**\n   * Check if AST has module exports\n   */\n  private hasModuleExports(ast: any): boolean {\n    // Check if there are any directive nodes (not just text/newlines)\n    if (!ast || !Array.isArray(ast)) return false;\n    \n    return ast.some(node => \n      node && node.type === 'Directive' && \n      ['var', 'exe', 'path'].includes(node.kind)\n    );\n  }\n\n  /**\n   * Get the local path where this module might exist\n   */\n  private getLocalPath(ref: string, config: GitHubResolverConfig): string | null {\n    if (!config.basePath) return null;\n    \n    // Build the same path that would be used in the repository\n    const modulePath = this.buildPath(ref, config);\n    \n    // Check relative to current working directory\n    return path.join(process.cwd(), modulePath);\n  }\n}\n"]}