@willjackson/claude-code-bridge 0.2.4 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -146
- package/dist/{chunk-5HWFDZKH.js → chunk-LUL3SX2F.js} +1 -355
- package/dist/chunk-LUL3SX2F.js.map +1 -0
- package/dist/cli.d.ts +1 -2
- package/dist/cli.js +38 -154
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +35 -290
- package/dist/index.js +1 -81
- package/dist/index.js.map +1 -1
- package/package.json +4 -6
- package/dist/chunk-5HWFDZKH.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/bridge/context.ts","../src/utils/tokens.ts","../src/transport/index.ts","../src/environment/docksal.ts","../src/environment/ddev.ts","../src/environment/lando.ts","../src/utils/errors.ts","../src/index.ts"],"sourcesContent":["/**\n * Context Manager for Claude Code Bridge\n *\n * Handles project context management including:\n * - Project snapshot generation\n * - Relevant context extraction with token limits\n * - Delta synchronization between snapshots\n */\n\nimport { readdirSync, readFileSync, statSync, existsSync, lstatSync, realpathSync } from 'fs';\nimport { join, basename, relative, extname, resolve } from 'path';\nimport { v4 as uuidv4 } from 'uuid';\nimport { minimatch } from 'minimatch';\nimport type { DirectoryTree, FileChunk } from './protocol.js';\nimport { estimateTokens } from '../utils/tokens.js';\n\n/**\n * Options for building a directory tree\n */\nexport interface BuildDirectoryTreeOptions {\n /** Glob patterns for files to include */\n includePatterns?: string[];\n /** Glob patterns for files to exclude */\n excludePatterns?: string[];\n /** Maximum depth for directory tree building (default: 10) */\n maxDepth?: number;\n}\n\n/**\n * Build a directory tree structure starting from a root path\n *\n * This standalone function creates a DirectoryTree representation\n * of the file system, respecting include/exclude patterns and depth limits.\n * Symlinks are handled safely to prevent infinite loops.\n *\n * @param rootPath The root path to start building from\n * @param options Configuration options\n * @returns DirectoryTree representation of the directory structure\n *\n * @example\n * ```typescript\n * const tree = buildDirectoryTree('/path/to/project', {\n * includePatterns: ['src/**\\/*.ts'],\n * excludePatterns: ['node_modules/**'],\n * maxDepth: 5\n * });\n * ```\n */\nexport function buildDirectoryTree(\n rootPath: string,\n options: BuildDirectoryTreeOptions = {}\n): DirectoryTree {\n const includePatterns = options.includePatterns ?? [];\n const excludePatterns = options.excludePatterns ?? [];\n const maxDepth = options.maxDepth ?? 10;\n\n // Track visited real paths to prevent infinite loops from symlinks\n const visitedPaths = new Set<string>();\n\n function isIncluded(relativePath: string): boolean {\n if (includePatterns.length === 0) {\n return true;\n }\n return includePatterns.some(pattern => minimatch(relativePath, pattern));\n }\n\n function isExcluded(relativePath: string): boolean {\n return excludePatterns.some(pattern => minimatch(relativePath, pattern));\n }\n\n function shouldIncludeDirectory(relativePath: string): boolean {\n if (includePatterns.length === 0) {\n return true;\n }\n return includePatterns.some(pattern => {\n if (pattern.startsWith('**')) {\n return true;\n }\n const patternParts = pattern.split('/');\n const pathParts = relativePath.split('/');\n for (let i = 0; i < pathParts.length && i < patternParts.length; i++) {\n if (patternParts[i] === '**') {\n return true;\n }\n if (!minimatch(pathParts[i], patternParts[i])) {\n return false;\n }\n }\n return true;\n });\n }\n\n function buildTree(dirPath: string, depth: number): DirectoryTree {\n const name = basename(dirPath);\n const tree: DirectoryTree = {\n name,\n type: 'directory',\n children: [],\n };\n\n if (depth >= maxDepth) {\n return tree;\n }\n\n // Resolve symlinks and check for cycles\n try {\n const realPath = realpathSync(dirPath);\n if (visitedPaths.has(realPath)) {\n // Symlink cycle detected, return empty directory\n return tree;\n }\n visitedPaths.add(realPath);\n } catch {\n // Can't resolve path, skip it\n return tree;\n }\n\n try {\n const entries = readdirSync(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dirPath, entry.name);\n const relativePath = relative(rootPath, fullPath);\n\n // Check exclusions first\n if (isExcluded(relativePath)) {\n continue;\n }\n\n // Handle symlinks\n if (entry.isSymbolicLink()) {\n try {\n const stats = statSync(fullPath);\n if (stats.isDirectory()) {\n if (shouldIncludeDirectory(relativePath)) {\n tree.children!.push(buildTree(fullPath, depth + 1));\n }\n } else if (stats.isFile()) {\n if (isIncluded(relativePath)) {\n tree.children!.push({\n name: entry.name,\n type: 'file',\n });\n }\n }\n } catch {\n // Broken symlink, skip it\n continue;\n }\n } else if (entry.isDirectory()) {\n if (shouldIncludeDirectory(relativePath)) {\n tree.children!.push(buildTree(fullPath, depth + 1));\n }\n } else if (entry.isFile()) {\n if (isIncluded(relativePath)) {\n tree.children!.push({\n name: entry.name,\n type: 'file',\n });\n }\n }\n }\n\n // Sort children: directories first, then files, alphabetically\n tree.children!.sort((a, b) => {\n if (a.type !== b.type) {\n return a.type === 'directory' ? -1 : 1;\n }\n return a.name.localeCompare(b.name);\n });\n } catch {\n // Return empty directory if we can't read it\n }\n\n return tree;\n }\n\n return buildTree(rootPath, 0);\n}\n\n/**\n * Configuration options for ContextManager\n */\nexport interface ContextManagerOptions {\n /** Root path of the project to manage context for */\n rootPath: string;\n /** Glob patterns for files to include */\n includePatterns: string[];\n /** Glob patterns for files to exclude */\n excludePatterns: string[];\n /** Maximum depth for directory tree building (default: 10) */\n maxDepth?: number;\n}\n\n/**\n * Snapshot of the project state at a point in time\n */\nexport interface ProjectSnapshot {\n /** Unique identifier for this snapshot */\n id: string;\n /** Unix timestamp when snapshot was created */\n timestamp: number;\n /** Directory tree structure */\n tree: DirectoryTree;\n /** Summary of the project (file count, languages, etc.) */\n summary: string;\n /** List of key files identified in the project */\n keyFiles: string[];\n}\n\n/**\n * Represents a change to a file between snapshots\n */\nexport interface FileChange {\n /** Relative path of the file */\n path: string;\n /** Type of change detected */\n action: 'added' | 'modified' | 'deleted';\n /** Diff content for modified files */\n diff?: string;\n}\n\n/**\n * Delta between two snapshots\n */\nexport interface ContextDelta {\n /** ID of the source snapshot */\n fromSyncId: string;\n /** ID of the target snapshot */\n toSyncId: string;\n /** List of file changes */\n changes: FileChange[];\n}\n\n/**\n * Internal file state for delta comparison\n */\ninterface FileState {\n /** Relative path of the file */\n path: string;\n /** Modification time in milliseconds */\n mtime: number;\n /** File size in bytes */\n size: number;\n}\n\n/**\n * Internal snapshot state for delta comparison\n */\ninterface SnapshotState {\n /** Snapshot ID */\n id: string;\n /** Map of file path to FileState */\n files: Map<string, FileState>;\n}\n\n/**\n * ContextManager handles project context extraction and management\n */\nexport class ContextManager {\n private readonly rootPath: string;\n private readonly includePatterns: string[];\n private readonly excludePatterns: string[];\n private readonly maxDepth: number;\n\n /** Stored snapshots for delta comparison */\n private readonly snapshotStates: Map<string, SnapshotState> = new Map();\n\n /**\n * Create a new ContextManager\n * @param options Configuration options\n */\n constructor(options: ContextManagerOptions) {\n this.rootPath = options.rootPath;\n this.includePatterns = options.includePatterns;\n this.excludePatterns = options.excludePatterns;\n this.maxDepth = options.maxDepth ?? 10;\n }\n\n /**\n * Generate a complete snapshot of the current project state\n * @returns ProjectSnapshot with tree structure, summary, and key files\n */\n async generateSnapshot(): Promise<ProjectSnapshot> {\n const tree = buildDirectoryTree(this.rootPath, {\n includePatterns: this.includePatterns,\n excludePatterns: this.excludePatterns,\n maxDepth: this.maxDepth,\n });\n const files = this.collectMatchingFiles(this.rootPath);\n const keyFiles = this.identifyKeyFiles(files);\n const summary = this.generateSummary(files);\n\n const snapshotId = uuidv4();\n\n // Store file states for delta comparison\n const fileStates = new Map<string, FileState>();\n for (const file of files) {\n try {\n const stats = statSync(file);\n const relativePath = relative(this.rootPath, file);\n fileStates.set(relativePath, {\n path: relativePath,\n mtime: stats.mtimeMs,\n size: stats.size,\n });\n } catch {\n // Skip files we can't stat\n }\n }\n\n this.snapshotStates.set(snapshotId, {\n id: snapshotId,\n files: fileStates,\n });\n\n return {\n id: snapshotId,\n timestamp: Date.now(),\n tree,\n summary,\n keyFiles,\n };\n }\n\n /**\n * Get changes since the last snapshot\n *\n * Compares the current file system state with a previously stored snapshot\n * to detect added, modified, and deleted files.\n *\n * @param lastSyncId ID of the last snapshot to compare against\n * @returns ContextDelta with changes since the last sync\n * @throws Error if lastSyncId is not found\n */\n async getDelta(lastSyncId: string): Promise<ContextDelta> {\n const lastState = this.snapshotStates.get(lastSyncId);\n if (!lastState) {\n throw new Error(`Snapshot ${lastSyncId} not found`);\n }\n\n // Generate a new snapshot to compare against\n const currentSnapshot = await this.generateSnapshot();\n const currentState = this.snapshotStates.get(currentSnapshot.id)!;\n\n const changes: FileChange[] = [];\n\n // Check for added and modified files\n for (const [path, currentFile] of currentState.files) {\n const lastFile = lastState.files.get(path);\n\n if (!lastFile) {\n // File was added\n changes.push({\n path,\n action: 'added',\n });\n } else if (currentFile.mtime !== lastFile.mtime || currentFile.size !== lastFile.size) {\n // File was modified\n const diff = await this.generateFileDiff(path);\n changes.push({\n path,\n action: 'modified',\n diff,\n });\n }\n }\n\n // Check for deleted files\n for (const path of lastState.files.keys()) {\n if (!currentState.files.has(path)) {\n changes.push({\n path,\n action: 'deleted',\n });\n }\n }\n\n return {\n fromSyncId: lastSyncId,\n toSyncId: currentSnapshot.id,\n changes,\n };\n }\n\n /**\n * Generate a simple diff for a modified file\n * Returns the new content (simplified diff for now)\n */\n private async generateFileDiff(relativePath: string): Promise<string> {\n try {\n const fullPath = join(this.rootPath, relativePath);\n const content = readFileSync(fullPath, 'utf-8');\n // Simplified diff: return first 1000 chars of new content\n // A more sophisticated implementation could use a proper diff algorithm\n return content.length > 1000 ? content.slice(0, 1000) + '...' : content;\n } catch {\n return '';\n }\n }\n\n /**\n * Get relevant file chunks based on a task description, respecting token limits\n * @param task Description of the task to get context for\n * @param maxTokens Maximum tokens for the returned context\n * @returns Array of FileChunk objects within the token limit\n */\n async getRelevantContext(task: string, maxTokens: number): Promise<FileChunk[]> {\n const files = this.collectMatchingFiles(this.rootPath);\n const rankedFiles = this.rankFilesForTask(files, task);\n const chunks: FileChunk[] = [];\n let currentTokens = 0;\n\n for (const filePath of rankedFiles) {\n try {\n const content = readFileSync(filePath, 'utf-8');\n const fileTokens = estimateTokens(content);\n\n // Check if we can fit this file\n if (currentTokens + fileTokens <= maxTokens) {\n chunks.push({\n path: relative(this.rootPath, filePath),\n content,\n language: this.getLanguage(filePath),\n });\n currentTokens += fileTokens;\n } else if (chunks.length === 0) {\n // If first file and it doesn't fit, truncate it\n const remainingTokens = maxTokens - currentTokens;\n const truncatedContent = this.truncateContent(content, remainingTokens);\n if (truncatedContent) {\n chunks.push({\n path: relative(this.rootPath, filePath),\n content: truncatedContent,\n language: this.getLanguage(filePath),\n });\n break;\n }\n }\n\n // Stop if we've reached the limit\n if (currentTokens >= maxTokens) {\n break;\n }\n } catch {\n // Skip files that can't be read\n continue;\n }\n }\n\n return chunks;\n }\n\n /**\n * Collect all files matching include patterns and not matching exclude patterns\n */\n private collectMatchingFiles(dirPath: string): string[] {\n const files: string[] = [];\n this.collectFilesRecursive(dirPath, files, 0);\n return files;\n }\n\n private collectFilesRecursive(dirPath: string, files: string[], depth: number): void {\n if (depth >= this.maxDepth) {\n return;\n }\n\n try {\n const entries = readdirSync(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dirPath, entry.name);\n const relativePath = relative(this.rootPath, fullPath);\n\n if (this.isExcluded(relativePath)) {\n continue;\n }\n\n if (entry.isDirectory()) {\n this.collectFilesRecursive(fullPath, files, depth + 1);\n } else if (entry.isFile() && this.isIncluded(relativePath)) {\n files.push(fullPath);\n }\n }\n } catch {\n // Skip directories we can't read\n }\n }\n\n /**\n * Check if a path matches any include pattern\n */\n private isIncluded(relativePath: string): boolean {\n if (this.includePatterns.length === 0) {\n return true;\n }\n return this.includePatterns.some(pattern => minimatch(relativePath, pattern));\n }\n\n /**\n * Check if a path matches any exclude pattern\n */\n private isExcluded(relativePath: string): boolean {\n return this.excludePatterns.some(pattern => minimatch(relativePath, pattern));\n }\n\n /**\n * Check if a directory should be traversed based on include patterns\n */\n private shouldIncludeDirectory(relativePath: string): boolean {\n // Always traverse directories if we might find matching files inside\n // This is a simplified check - we traverse if any include pattern\n // could potentially match files in this directory\n if (this.includePatterns.length === 0) {\n return true;\n }\n\n return this.includePatterns.some(pattern => {\n // Check if this directory is part of any include pattern path\n const patternParts = pattern.split('/');\n const pathParts = relativePath.split('/');\n\n // If pattern starts with **, always include\n if (pattern.startsWith('**')) {\n return true;\n }\n\n // Check if path could be a prefix of the pattern\n for (let i = 0; i < pathParts.length && i < patternParts.length; i++) {\n if (patternParts[i] === '**') {\n return true;\n }\n if (!minimatch(pathParts[i], patternParts[i])) {\n return false;\n }\n }\n return true;\n });\n }\n\n /**\n * Identify key files in the project (config files, entry points, etc.)\n */\n private identifyKeyFiles(files: string[]): string[] {\n const keyFileNames = [\n 'package.json',\n 'tsconfig.json',\n 'index.ts',\n 'index.js',\n 'main.ts',\n 'main.js',\n 'app.ts',\n 'app.js',\n 'README.md',\n 'CLAUDE.md',\n ];\n\n const keyFiles: string[] = [];\n\n for (const file of files) {\n const fileName = basename(file);\n if (keyFileNames.includes(fileName)) {\n keyFiles.push(relative(this.rootPath, file));\n }\n }\n\n return keyFiles;\n }\n\n /**\n * Generate a summary string describing the project\n */\n private generateSummary(files: string[]): string {\n const extensions = new Map<string, number>();\n\n for (const file of files) {\n const ext = extname(file) || '(no extension)';\n extensions.set(ext, (extensions.get(ext) || 0) + 1);\n }\n\n const extSummary = Array.from(extensions.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5)\n .map(([ext, count]) => `${ext}: ${count}`)\n .join(', ');\n\n return `Project contains ${files.length} files. Top extensions: ${extSummary}`;\n }\n\n /**\n * Rank files by relevance to a task description\n * Files with matching keywords are ranked higher\n */\n private rankFilesForTask(files: string[], task: string): string[] {\n const taskLower = task.toLowerCase();\n const keywords = taskLower.split(/\\s+/).filter(w => w.length > 2);\n\n const scored = files.map(file => {\n const relativePath = relative(this.rootPath, file).toLowerCase();\n let score = 0;\n\n // Score based on keyword matches in file path\n for (const keyword of keywords) {\n if (relativePath.includes(keyword)) {\n score += 10;\n }\n }\n\n // Boost key files\n const fileName = basename(file);\n if (['index.ts', 'index.js', 'main.ts', 'main.js'].includes(fileName)) {\n score += 5;\n }\n if (fileName === 'package.json') {\n score += 3;\n }\n\n return { file, score };\n });\n\n // Sort by score descending, then by path\n scored.sort((a, b) => {\n if (a.score !== b.score) {\n return b.score - a.score;\n }\n return a.file.localeCompare(b.file);\n });\n\n return scored.map(s => s.file);\n }\n\n /**\n * Get programming language from file extension\n */\n private getLanguage(filePath: string): string {\n const ext = extname(filePath).toLowerCase();\n const languageMap: Record<string, string> = {\n '.ts': 'typescript',\n '.tsx': 'typescript',\n '.js': 'javascript',\n '.jsx': 'javascript',\n '.py': 'python',\n '.rb': 'ruby',\n '.go': 'go',\n '.rs': 'rust',\n '.java': 'java',\n '.c': 'c',\n '.cpp': 'cpp',\n '.h': 'c',\n '.hpp': 'cpp',\n '.cs': 'csharp',\n '.php': 'php',\n '.swift': 'swift',\n '.kt': 'kotlin',\n '.scala': 'scala',\n '.md': 'markdown',\n '.json': 'json',\n '.yaml': 'yaml',\n '.yml': 'yaml',\n '.xml': 'xml',\n '.html': 'html',\n '.css': 'css',\n '.scss': 'scss',\n '.less': 'less',\n '.sql': 'sql',\n '.sh': 'bash',\n '.bash': 'bash',\n '.zsh': 'zsh',\n };\n\n return languageMap[ext] || 'text';\n }\n\n /**\n * Truncate file content to fit within a token limit\n */\n private truncateContent(content: string, maxTokens: number): string {\n const lines = content.split('\\n');\n const result: string[] = [];\n let currentTokens = 0;\n\n for (const line of lines) {\n const lineTokens = estimateTokens(line);\n if (currentTokens + lineTokens <= maxTokens) {\n result.push(line);\n currentTokens += lineTokens;\n } else {\n break;\n }\n }\n\n return result.join('\\n');\n }\n}\n","/**\n * Token counting utilities for context chunking.\n * Uses word-based approximation since exact token counting requires\n * a tokenizer specific to the model being used.\n */\n\n/**\n * Average tokens per word approximation.\n * This is a rough estimate based on typical English text.\n * Actual token counts vary by model and text content.\n */\nconst TOKENS_PER_WORD = 1.3;\n\n/**\n * Estimates the number of tokens in a given text.\n * Uses a simple word-based approximation (roughly 1.3 tokens per word).\n *\n * @param text - The text to estimate tokens for\n * @returns Estimated number of tokens\n */\nexport function estimateTokens(text: string): number {\n if (!text || text.length === 0) {\n return 0;\n }\n\n // Split on whitespace to count words\n const words = text.split(/\\s+/).filter(word => word.length > 0);\n\n // Apply the tokens per word ratio and round up\n return Math.ceil(words.length * TOKENS_PER_WORD);\n}\n\n/**\n * Truncates text to fit within a token limit while preserving complete words.\n *\n * @param text - The text to truncate\n * @param maxTokens - The maximum number of tokens allowed\n * @returns Truncated text that fits within the token limit\n */\nexport function truncateToTokenLimit(text: string, maxTokens: number): string {\n if (!text || text.length === 0) {\n return '';\n }\n\n if (maxTokens <= 0) {\n return '';\n }\n\n // If already within limit, return as-is\n if (estimateTokens(text) <= maxTokens) {\n return text;\n }\n\n // Split into words\n const words = text.split(/\\s+/).filter(word => word.length > 0);\n\n // Calculate maximum words we can include\n const maxWords = Math.floor(maxTokens / TOKENS_PER_WORD);\n\n if (maxWords <= 0) {\n return '';\n }\n\n // Take only the allowed number of words and join with single spaces\n const truncatedWords = words.slice(0, maxWords);\n\n return truncatedWords.join(' ');\n}\n","/**\n * Transport module exports\n */\n\nexport {\n // Enums\n ConnectionState,\n // Types\n type AuthConfig,\n type ConnectionConfig,\n type MessageHandler,\n type DisconnectHandler,\n type ErrorHandler,\n type Transport,\n type TransportEvents,\n} from './interface.js';\n\nexport { WebSocketTransport } from './websocket.js';\n\n// Discovery exports\nexport {\n type DiscoveredPeer,\n type BridgeLabelConfig,\n parseDockerLabels,\n isDockerAvailable,\n discoverDockerPeers,\n discoverDocksalProjects,\n discoverDdevProjects,\n discoverLandoProjects,\n discoverAllPeers,\n} from './discovery.js';\n\nimport { WebSocketTransport } from './websocket.js';\nimport type { ConnectionConfig, Transport } from './interface.js';\n\n// Transport type for factory function\nexport type TransportType = 'websocket';\n\n/**\n * Options for creating a transport\n */\nexport interface CreateTransportOptions {\n /** Configuration to use when connecting */\n config?: ConnectionConfig;\n}\n\n/**\n * Factory function to create transport instances\n * @param type The type of transport to create\n * @param options Optional configuration options\n * @returns A Transport instance\n * @throws Error if the transport type is not supported\n */\nexport function createTransport(type: TransportType, options?: CreateTransportOptions): Transport {\n switch (type) {\n case 'websocket':\n // Config will be passed to connect(), not the constructor\n return new WebSocketTransport();\n default:\n throw new Error(`Unknown transport type: ${type as string}`);\n }\n}\n","/**\n * Docksal-specific helper functions for Claude Code Bridge\n *\n * Provides utilities to extract project information from the Docksal environment.\n * Docksal is a Docker-based development environment primarily used for\n * Drupal and other PHP projects.\n *\n * @see https://docksal.io/\n */\n\n/**\n * Information about a Docksal project\n */\nexport interface DocksalProjectInfo {\n /** Project name from DOCKSAL_PROJECT env var */\n projectName: string;\n /** Project root path from PROJECT_ROOT env var */\n projectRoot: string;\n /** Docksal stack name from DOCKSAL_STACK env var */\n stack: string;\n}\n\n/**\n * Check if currently running in a Docksal environment\n *\n * @returns true if DOCKSAL_STACK environment variable is set\n */\nexport function isDocksalEnvironment(): boolean {\n return !!process.env.DOCKSAL_STACK;\n}\n\n/**\n * Get Docksal project information from environment variables\n *\n * Extracts project details from the standard Docksal environment variables:\n * - DOCKSAL_PROJECT: The project name\n * - PROJECT_ROOT: The project root directory\n * - DOCKSAL_STACK: The Docksal stack being used (e.g., 'default', 'acquia')\n *\n * @returns DocksalProjectInfo if in Docksal environment, null otherwise\n *\n * @example\n * ```typescript\n * const info = getDocksalProjectInfo();\n * if (info) {\n * console.log(`Project: ${info.projectName}`);\n * console.log(`Root: ${info.projectRoot}`);\n * console.log(`Stack: ${info.stack}`);\n * }\n * ```\n */\nexport function getDocksalProjectInfo(): DocksalProjectInfo | null {\n // Check if we're in a Docksal environment\n if (!isDocksalEnvironment()) {\n return null;\n }\n\n const projectName = process.env.DOCKSAL_PROJECT;\n const projectRoot = process.env.PROJECT_ROOT;\n const stack = process.env.DOCKSAL_STACK;\n\n // All three values should be present in a proper Docksal environment\n if (!projectName || !projectRoot || !stack) {\n return null;\n }\n\n return {\n projectName,\n projectRoot,\n stack,\n };\n}\n","/**\n * DDEV-specific helper functions for Claude Code Bridge\n *\n * Provides utilities to extract project information from the DDEV environment.\n * DDEV is a Docker-based development environment for PHP and other projects.\n *\n * @see https://ddev.readthedocs.io/\n */\n\n/**\n * Information about a DDEV project\n */\nexport interface DdevProjectInfo {\n /** Project name from DDEV_PROJECT env var */\n projectName: string;\n /** Project document root from DDEV_DOCROOT env var */\n projectRoot: string;\n}\n\n/**\n * Check if currently running in a DDEV environment\n *\n * @returns true if IS_DDEV_PROJECT environment variable is 'true'\n */\nexport function isDdevEnvironment(): boolean {\n return process.env.IS_DDEV_PROJECT === 'true';\n}\n\n/**\n * Get DDEV project information from environment variables\n *\n * Extracts project details from the standard DDEV environment variables:\n * - DDEV_PROJECT: The project name\n * - DDEV_DOCROOT: The document root directory (web root)\n *\n * @returns DdevProjectInfo if in DDEV environment, null otherwise\n *\n * @example\n * ```typescript\n * const info = getDdevProjectInfo();\n * if (info) {\n * console.log(`Project: ${info.projectName}`);\n * console.log(`Root: ${info.projectRoot}`);\n * }\n * ```\n */\nexport function getDdevProjectInfo(): DdevProjectInfo | null {\n // Check if we're in a DDEV environment\n if (!isDdevEnvironment()) {\n return null;\n }\n\n const projectName = process.env.DDEV_PROJECT;\n const projectRoot = process.env.DDEV_DOCROOT;\n\n // Both values should be present in a proper DDEV environment\n if (!projectName || !projectRoot) {\n return null;\n }\n\n return {\n projectName,\n projectRoot,\n };\n}\n","/**\n * Lando-specific helper functions for Claude Code Bridge\n *\n * Provides utilities to extract project information from the Lando environment.\n * Lando is a Docker-based development environment for PHP, Node.js, and other projects.\n *\n * @see https://docs.lando.dev/\n */\n\n/**\n * Information about a Lando project\n */\nexport interface LandoProjectInfo {\n /** Project name (app name) from LANDO_APP_NAME env var */\n projectName: string;\n}\n\n/**\n * Check if currently running in a Lando environment\n *\n * @returns true if LANDO environment variable is 'ON'\n */\nexport function isLandoEnvironment(): boolean {\n return process.env.LANDO === 'ON';\n}\n\n/**\n * Get Lando project information from environment variables\n *\n * Extracts project details from the standard Lando environment variables:\n * - LANDO_APP_NAME: The application/project name\n *\n * @returns LandoProjectInfo if in Lando environment, null otherwise\n *\n * @example\n * ```typescript\n * const info = getLandoProjectInfo();\n * if (info) {\n * console.log(`Project: ${info.projectName}`);\n * }\n * ```\n */\nexport function getLandoProjectInfo(): LandoProjectInfo | null {\n // Check if we're in a Lando environment\n if (!isLandoEnvironment()) {\n return null;\n }\n\n const projectName = process.env.LANDO_APP_NAME;\n\n // App name should be present in a proper Lando environment\n if (!projectName) {\n return null;\n }\n\n return {\n projectName,\n };\n}\n","/**\n * Custom error classes for Claude Code Bridge\n *\n * Provides structured error types with clear, actionable messages\n * for different error scenarios.\n */\n\n/**\n * Base error class for bridge errors\n */\nexport class BridgeError extends Error {\n readonly code: string;\n readonly context?: Record<string, unknown>;\n\n constructor(message: string, code: string, context?: Record<string, unknown>) {\n super(message);\n this.name = 'BridgeError';\n this.code = code;\n this.context = context;\n\n // Maintains proper stack trace for where error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n\n /**\n * Get formatted error message with context\n */\n toDetailedString(): string {\n const parts = [`${this.name}[${this.code}]: ${this.message}`];\n if (this.context) {\n parts.push(`Context: ${JSON.stringify(this.context)}`);\n }\n return parts.join('\\n');\n }\n}\n\n/**\n * Error codes for bridge errors\n */\nexport const ErrorCodes = {\n // Configuration errors\n CONFIG_INVALID: 'CONFIG_INVALID',\n CONFIG_MISSING: 'CONFIG_MISSING',\n CONFIG_PARSE_ERROR: 'CONFIG_PARSE_ERROR',\n\n // Connection errors\n CONNECTION_FAILED: 'CONNECTION_FAILED',\n CONNECTION_REFUSED: 'CONNECTION_REFUSED',\n CONNECTION_TIMEOUT: 'CONNECTION_TIMEOUT',\n CONNECTION_CLOSED: 'CONNECTION_CLOSED',\n NOT_CONNECTED: 'NOT_CONNECTED',\n ALREADY_CONNECTED: 'ALREADY_CONNECTED',\n\n // Peer errors\n PEER_NOT_FOUND: 'PEER_NOT_FOUND',\n NO_PEERS_CONNECTED: 'NO_PEERS_CONNECTED',\n PEER_DISCONNECTED: 'PEER_DISCONNECTED',\n\n // Task errors\n TASK_TIMEOUT: 'TASK_TIMEOUT',\n TASK_FAILED: 'TASK_FAILED',\n NO_TASK_HANDLER: 'NO_TASK_HANDLER',\n\n // Context errors\n CONTEXT_TIMEOUT: 'CONTEXT_TIMEOUT',\n CONTEXT_SYNC_FAILED: 'CONTEXT_SYNC_FAILED',\n SNAPSHOT_NOT_FOUND: 'SNAPSHOT_NOT_FOUND',\n\n // Protocol errors\n INVALID_MESSAGE: 'INVALID_MESSAGE',\n SERIALIZATION_ERROR: 'SERIALIZATION_ERROR',\n\n // Bridge lifecycle errors\n BRIDGE_ALREADY_STARTED: 'BRIDGE_ALREADY_STARTED',\n BRIDGE_NOT_STARTED: 'BRIDGE_NOT_STARTED',\n BRIDGE_SHUTDOWN: 'BRIDGE_SHUTDOWN',\n\n // General errors\n UNKNOWN: 'UNKNOWN',\n} as const;\n\nexport type ErrorCode = typeof ErrorCodes[keyof typeof ErrorCodes];\n\n/**\n * Configuration error\n */\nexport class ConfigurationError extends BridgeError {\n readonly setting?: string;\n\n constructor(message: string, code: ErrorCode, setting?: string, context?: Record<string, unknown>) {\n super(message, code, {\n ...context,\n setting,\n });\n this.name = 'ConfigurationError';\n this.setting = setting;\n }\n\n static missing(setting: string): ConfigurationError {\n return new ConfigurationError(\n `Missing required configuration: '${setting}'`,\n ErrorCodes.CONFIG_MISSING,\n setting\n );\n }\n\n static invalid(setting: string, reason: string, value?: unknown): ConfigurationError {\n return new ConfigurationError(\n `Invalid configuration for '${setting}': ${reason}`,\n ErrorCodes.CONFIG_INVALID,\n setting,\n { value }\n );\n }\n\n static parseError(filePath: string, error: Error): ConfigurationError {\n return new ConfigurationError(\n `Failed to parse configuration file '${filePath}': ${error.message}`,\n ErrorCodes.CONFIG_PARSE_ERROR,\n undefined,\n { filePath, originalError: error.message }\n );\n }\n}\n\n/**\n * Connection error with network details\n */\nexport class ConnectionError extends BridgeError {\n readonly url?: string;\n readonly host?: string;\n readonly port?: number;\n\n constructor(\n message: string,\n code: ErrorCode = ErrorCodes.CONNECTION_FAILED,\n options?: {\n url?: string;\n host?: string;\n port?: number;\n cause?: Error;\n }\n ) {\n super(message, code, {\n url: options?.url,\n host: options?.host,\n port: options?.port,\n cause: options?.cause?.message,\n });\n this.name = 'ConnectionError';\n this.url = options?.url;\n this.host = options?.host;\n this.port = options?.port;\n\n if (options?.cause) {\n this.cause = options.cause;\n }\n }\n\n static refused(url: string): ConnectionError {\n return new ConnectionError(\n `Connection refused to ${url}. Ensure the bridge is running and accepting connections.`,\n ErrorCodes.CONNECTION_REFUSED,\n { url }\n );\n }\n\n static timeout(url: string, timeoutMs: number): ConnectionError {\n return new ConnectionError(\n `Connection to ${url} timed out after ${timeoutMs}ms. Check network connectivity and firewall settings.`,\n ErrorCodes.CONNECTION_TIMEOUT,\n { url }\n );\n }\n\n static closed(url: string, reason?: string): ConnectionError {\n const message = reason\n ? `Connection to ${url} closed: ${reason}`\n : `Connection to ${url} closed unexpectedly`;\n return new ConnectionError(message, ErrorCodes.CONNECTION_CLOSED, { url });\n }\n\n static notConnected(): ConnectionError {\n return new ConnectionError(\n 'Not connected to any peer. Call connect() first.',\n ErrorCodes.NOT_CONNECTED\n );\n }\n\n static alreadyConnected(): ConnectionError {\n return new ConnectionError(\n 'Already connected. Disconnect first to establish a new connection.',\n ErrorCodes.ALREADY_CONNECTED\n );\n }\n}\n\n/**\n * Peer-related error\n */\nexport class PeerError extends BridgeError {\n readonly peerId?: string;\n\n constructor(message: string, code: ErrorCode, peerId?: string) {\n super(message, code, { peerId });\n this.name = 'PeerError';\n this.peerId = peerId;\n }\n\n static notFound(peerId: string): PeerError {\n return new PeerError(\n `Peer '${peerId}' not found. The peer may have disconnected.`,\n ErrorCodes.PEER_NOT_FOUND,\n peerId\n );\n }\n\n static noPeersConnected(): PeerError {\n return new PeerError(\n 'No peers are connected. Wait for a peer to connect or call connectToPeer() first.',\n ErrorCodes.NO_PEERS_CONNECTED\n );\n }\n\n static disconnected(peerId: string): PeerError {\n return new PeerError(\n `Peer '${peerId}' has disconnected.`,\n ErrorCodes.PEER_DISCONNECTED,\n peerId\n );\n }\n}\n\n/**\n * Task-related error\n */\nexport class TaskError extends BridgeError {\n readonly taskId?: string;\n\n constructor(message: string, code: ErrorCode, taskId?: string, context?: Record<string, unknown>) {\n super(message, code, { ...context, taskId });\n this.name = 'TaskError';\n this.taskId = taskId;\n }\n\n static timeout(taskId: string, timeoutMs: number): TaskError {\n return new TaskError(\n `Task '${taskId}' timed out after ${timeoutMs}ms. Consider increasing the task timeout or breaking the task into smaller pieces.`,\n ErrorCodes.TASK_TIMEOUT,\n taskId,\n { timeoutMs }\n );\n }\n\n static failed(taskId: string, reason: string): TaskError {\n return new TaskError(\n `Task '${taskId}' failed: ${reason}`,\n ErrorCodes.TASK_FAILED,\n taskId\n );\n }\n\n static noHandler(): TaskError {\n return new TaskError(\n 'No task handler registered. Register a handler with onTaskReceived() before delegating tasks.',\n ErrorCodes.NO_TASK_HANDLER\n );\n }\n}\n\n/**\n * Context synchronization error\n */\nexport class ContextError extends BridgeError {\n constructor(message: string, code: ErrorCode, context?: Record<string, unknown>) {\n super(message, code, context);\n this.name = 'ContextError';\n }\n\n static timeout(timeoutMs: number): ContextError {\n return new ContextError(\n `Context request timed out after ${timeoutMs}ms. The peer may be processing a large amount of data.`,\n ErrorCodes.CONTEXT_TIMEOUT,\n { timeoutMs }\n );\n }\n\n static syncFailed(reason: string): ContextError {\n return new ContextError(\n `Context synchronization failed: ${reason}`,\n ErrorCodes.CONTEXT_SYNC_FAILED\n );\n }\n\n static snapshotNotFound(snapshotId: string): ContextError {\n return new ContextError(\n `Snapshot '${snapshotId}' not found. It may have expired or never existed.`,\n ErrorCodes.SNAPSHOT_NOT_FOUND,\n { snapshotId }\n );\n }\n}\n\n/**\n * Protocol/message error\n */\nexport class ProtocolError extends BridgeError {\n constructor(message: string, code: ErrorCode = ErrorCodes.INVALID_MESSAGE, context?: Record<string, unknown>) {\n super(message, code, context);\n this.name = 'ProtocolError';\n }\n\n static invalidMessage(reason: string, data?: unknown): ProtocolError {\n return new ProtocolError(\n `Invalid message: ${reason}`,\n ErrorCodes.INVALID_MESSAGE,\n { data: data ? String(data).substring(0, 200) : undefined }\n );\n }\n\n static serializationError(error: Error): ProtocolError {\n return new ProtocolError(\n `Message serialization failed: ${error.message}`,\n ErrorCodes.SERIALIZATION_ERROR,\n { originalError: error.message }\n );\n }\n}\n\n/**\n * Bridge lifecycle error\n */\nexport class BridgeLifecycleError extends BridgeError {\n constructor(message: string, code: ErrorCode) {\n super(message, code);\n this.name = 'BridgeLifecycleError';\n }\n\n static alreadyStarted(): BridgeLifecycleError {\n return new BridgeLifecycleError(\n 'Bridge is already started. Call stop() before starting again.',\n ErrorCodes.BRIDGE_ALREADY_STARTED\n );\n }\n\n static notStarted(): BridgeLifecycleError {\n return new BridgeLifecycleError(\n 'Bridge is not started. Call start() first.',\n ErrorCodes.BRIDGE_NOT_STARTED\n );\n }\n\n static shuttingDown(): BridgeLifecycleError {\n return new BridgeLifecycleError(\n 'Bridge is shutting down.',\n ErrorCodes.BRIDGE_SHUTDOWN\n );\n }\n}\n\n/**\n * Format an error for logging with context\n */\nexport function formatErrorForLogging(error: unknown): {\n message: string;\n code?: string;\n context?: Record<string, unknown>;\n stack?: string;\n} {\n if (error instanceof BridgeError) {\n return {\n message: error.message,\n code: error.code,\n context: error.context,\n stack: error.stack,\n };\n }\n\n if (error instanceof Error) {\n return {\n message: error.message,\n stack: error.stack,\n };\n }\n\n return {\n message: String(error),\n };\n}\n\n/**\n * Wrap an error with additional context\n */\nexport function wrapError(error: unknown, context: string): BridgeError {\n if (error instanceof BridgeError) {\n return new BridgeError(\n `${context}: ${error.message}`,\n error.code,\n error.context\n );\n }\n\n const message = error instanceof Error ? error.message : String(error);\n return new BridgeError(\n `${context}: ${message}`,\n ErrorCodes.UNKNOWN,\n { originalError: message }\n );\n}\n\n/**\n * Check if an error is of a specific type\n */\nexport function isErrorCode(error: unknown, code: ErrorCode): boolean {\n return error instanceof BridgeError && error.code === code;\n}\n","/**\n * Claude Code Bridge\n *\n * A bidirectional communication system that enables two separate Claude Code instances\n * to collaborate across different environments. The primary use case is connecting a\n * native macOS Claude Code instance with a Claude Code instance running inside a\n * Docker-based development environment (Docksal, DDEV, Lando, or plain Docker).\n *\n * @packageDocumentation\n */\n\nexport const VERSION = '0.1.0';\n\n// ============================================================================\n// Bridge Core\n// ============================================================================\n\nexport {\n // Main Bridge class\n Bridge,\n // Bridge types\n type BridgeMode,\n type BridgeConfig,\n type BridgeListenConfig,\n type BridgeConnectConfig,\n type ContextSharingConfig,\n type PeerInfo,\n // Handler types\n type PeerConnectedHandler,\n type PeerDisconnectedHandler,\n type MessageReceivedHandler,\n type TaskReceivedHandler,\n type ContextReceivedHandler,\n type ContextRequestedHandler,\n} from './bridge/core.js';\n\n// ============================================================================\n// Protocol & Messages\n// ============================================================================\n\nexport {\n // Schemas (for validation)\n MessageType,\n FileChunkSchema,\n DirectoryTreeSchema,\n ArtifactSchema,\n ContextSchema,\n TaskRequestSchema,\n TaskResultSchema,\n BridgeMessageSchema,\n // Protocol types\n type FileChunk,\n type DirectoryTree,\n type Artifact,\n type Context,\n type TaskRequest,\n type TaskResult,\n type BridgeMessage,\n // Helper functions\n createMessage,\n validateMessage,\n safeValidateMessage,\n serializeMessage,\n deserializeMessage,\n safeDeserializeMessage,\n} from './bridge/protocol.js';\n\nexport {\n // Message builders\n createContextSyncMessage,\n createTaskDelegateMessage,\n createTaskResponseMessage,\n createContextRequestMessage,\n createNotificationMessage,\n type NotificationData,\n} from './bridge/messages.js';\n\n// ============================================================================\n// Context Management\n// ============================================================================\n\nexport {\n ContextManager,\n buildDirectoryTree,\n type ContextManagerOptions,\n type ProjectSnapshot,\n type BuildDirectoryTreeOptions,\n type ContextDelta,\n type FileChange,\n} from './bridge/context.js';\n\n// ============================================================================\n// Transport Layer\n// ============================================================================\n\nexport {\n // Transport interface\n type Transport,\n type ConnectionConfig,\n ConnectionState,\n // Transport implementation\n WebSocketTransport,\n // Factory\n createTransport,\n} from './transport/index.js';\n\nexport {\n // Discovery functions\n discoverAllPeers,\n discoverDockerPeers,\n discoverDocksalProjects,\n discoverDdevProjects,\n discoverLandoProjects,\n parseDockerLabels,\n isDockerAvailable,\n // Discovery types\n type DiscoveredPeer,\n type BridgeLabelConfig,\n} from './transport/discovery.js';\n\n// ============================================================================\n// Environment Detection\n// ============================================================================\n\nexport {\n detectEnvironment,\n getHostGateway,\n getDefaultConfig,\n type DockerEnvironment,\n type EnvironmentInfo,\n} from './environment/detect.js';\n\nexport { getDocksalProjectInfo, type DocksalProjectInfo } from './environment/docksal.js';\nexport { getDdevProjectInfo, type DdevProjectInfo } from './environment/ddev.js';\nexport { getLandoProjectInfo, type LandoProjectInfo } from './environment/lando.js';\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\nexport {\n // Logger\n createLogger,\n createChildLogger,\n type Logger,\n type LogLevel,\n // Configuration\n loadConfig,\n loadConfigSync,\n mergeConfig,\n DEFAULT_CONFIG,\n type BridgeConfig as UtilsBridgeConfig,\n type ListenConfig,\n type ConnectConfig,\n type ContextSharingConfig as UtilsContextSharingConfig,\n type InteractionConfig,\n // Tokens\n estimateTokens,\n truncateToTokenLimit,\n // Errors\n BridgeError,\n ConfigurationError,\n ConnectionError,\n PeerError,\n TaskError,\n ContextError,\n ProtocolError,\n BridgeLifecycleError,\n ErrorCodes,\n formatErrorForLogging,\n wrapError,\n isErrorCode,\n type ErrorCode,\n} from './utils/index.js';\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/bridge/context.ts","../src/utils/tokens.ts","../src/transport/index.ts","../src/utils/errors.ts","../src/index.ts"],"sourcesContent":["/**\n * Context Manager for Claude Code Bridge\n *\n * Handles project context management including:\n * - Project snapshot generation\n * - Relevant context extraction with token limits\n * - Delta synchronization between snapshots\n */\n\nimport { readdirSync, readFileSync, statSync, existsSync, lstatSync, realpathSync } from 'fs';\nimport { join, basename, relative, extname, resolve } from 'path';\nimport { v4 as uuidv4 } from 'uuid';\nimport { minimatch } from 'minimatch';\nimport type { DirectoryTree, FileChunk } from './protocol.js';\nimport { estimateTokens } from '../utils/tokens.js';\n\n/**\n * Options for building a directory tree\n */\nexport interface BuildDirectoryTreeOptions {\n /** Glob patterns for files to include */\n includePatterns?: string[];\n /** Glob patterns for files to exclude */\n excludePatterns?: string[];\n /** Maximum depth for directory tree building (default: 10) */\n maxDepth?: number;\n}\n\n/**\n * Build a directory tree structure starting from a root path\n *\n * This standalone function creates a DirectoryTree representation\n * of the file system, respecting include/exclude patterns and depth limits.\n * Symlinks are handled safely to prevent infinite loops.\n *\n * @param rootPath The root path to start building from\n * @param options Configuration options\n * @returns DirectoryTree representation of the directory structure\n *\n * @example\n * ```typescript\n * const tree = buildDirectoryTree('/path/to/project', {\n * includePatterns: ['src/**\\/*.ts'],\n * excludePatterns: ['node_modules/**'],\n * maxDepth: 5\n * });\n * ```\n */\nexport function buildDirectoryTree(\n rootPath: string,\n options: BuildDirectoryTreeOptions = {}\n): DirectoryTree {\n const includePatterns = options.includePatterns ?? [];\n const excludePatterns = options.excludePatterns ?? [];\n const maxDepth = options.maxDepth ?? 10;\n\n // Track visited real paths to prevent infinite loops from symlinks\n const visitedPaths = new Set<string>();\n\n function isIncluded(relativePath: string): boolean {\n if (includePatterns.length === 0) {\n return true;\n }\n return includePatterns.some(pattern => minimatch(relativePath, pattern));\n }\n\n function isExcluded(relativePath: string): boolean {\n return excludePatterns.some(pattern => minimatch(relativePath, pattern));\n }\n\n function shouldIncludeDirectory(relativePath: string): boolean {\n if (includePatterns.length === 0) {\n return true;\n }\n return includePatterns.some(pattern => {\n if (pattern.startsWith('**')) {\n return true;\n }\n const patternParts = pattern.split('/');\n const pathParts = relativePath.split('/');\n for (let i = 0; i < pathParts.length && i < patternParts.length; i++) {\n if (patternParts[i] === '**') {\n return true;\n }\n if (!minimatch(pathParts[i], patternParts[i])) {\n return false;\n }\n }\n return true;\n });\n }\n\n function buildTree(dirPath: string, depth: number): DirectoryTree {\n const name = basename(dirPath);\n const tree: DirectoryTree = {\n name,\n type: 'directory',\n children: [],\n };\n\n if (depth >= maxDepth) {\n return tree;\n }\n\n // Resolve symlinks and check for cycles\n try {\n const realPath = realpathSync(dirPath);\n if (visitedPaths.has(realPath)) {\n // Symlink cycle detected, return empty directory\n return tree;\n }\n visitedPaths.add(realPath);\n } catch {\n // Can't resolve path, skip it\n return tree;\n }\n\n try {\n const entries = readdirSync(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dirPath, entry.name);\n const relativePath = relative(rootPath, fullPath);\n\n // Check exclusions first\n if (isExcluded(relativePath)) {\n continue;\n }\n\n // Handle symlinks\n if (entry.isSymbolicLink()) {\n try {\n const stats = statSync(fullPath);\n if (stats.isDirectory()) {\n if (shouldIncludeDirectory(relativePath)) {\n tree.children!.push(buildTree(fullPath, depth + 1));\n }\n } else if (stats.isFile()) {\n if (isIncluded(relativePath)) {\n tree.children!.push({\n name: entry.name,\n type: 'file',\n });\n }\n }\n } catch {\n // Broken symlink, skip it\n continue;\n }\n } else if (entry.isDirectory()) {\n if (shouldIncludeDirectory(relativePath)) {\n tree.children!.push(buildTree(fullPath, depth + 1));\n }\n } else if (entry.isFile()) {\n if (isIncluded(relativePath)) {\n tree.children!.push({\n name: entry.name,\n type: 'file',\n });\n }\n }\n }\n\n // Sort children: directories first, then files, alphabetically\n tree.children!.sort((a, b) => {\n if (a.type !== b.type) {\n return a.type === 'directory' ? -1 : 1;\n }\n return a.name.localeCompare(b.name);\n });\n } catch {\n // Return empty directory if we can't read it\n }\n\n return tree;\n }\n\n return buildTree(rootPath, 0);\n}\n\n/**\n * Configuration options for ContextManager\n */\nexport interface ContextManagerOptions {\n /** Root path of the project to manage context for */\n rootPath: string;\n /** Glob patterns for files to include */\n includePatterns: string[];\n /** Glob patterns for files to exclude */\n excludePatterns: string[];\n /** Maximum depth for directory tree building (default: 10) */\n maxDepth?: number;\n}\n\n/**\n * Snapshot of the project state at a point in time\n */\nexport interface ProjectSnapshot {\n /** Unique identifier for this snapshot */\n id: string;\n /** Unix timestamp when snapshot was created */\n timestamp: number;\n /** Directory tree structure */\n tree: DirectoryTree;\n /** Summary of the project (file count, languages, etc.) */\n summary: string;\n /** List of key files identified in the project */\n keyFiles: string[];\n}\n\n/**\n * Represents a change to a file between snapshots\n */\nexport interface FileChange {\n /** Relative path of the file */\n path: string;\n /** Type of change detected */\n action: 'added' | 'modified' | 'deleted';\n /** Diff content for modified files */\n diff?: string;\n}\n\n/**\n * Delta between two snapshots\n */\nexport interface ContextDelta {\n /** ID of the source snapshot */\n fromSyncId: string;\n /** ID of the target snapshot */\n toSyncId: string;\n /** List of file changes */\n changes: FileChange[];\n}\n\n/**\n * Internal file state for delta comparison\n */\ninterface FileState {\n /** Relative path of the file */\n path: string;\n /** Modification time in milliseconds */\n mtime: number;\n /** File size in bytes */\n size: number;\n}\n\n/**\n * Internal snapshot state for delta comparison\n */\ninterface SnapshotState {\n /** Snapshot ID */\n id: string;\n /** Map of file path to FileState */\n files: Map<string, FileState>;\n}\n\n/**\n * ContextManager handles project context extraction and management\n */\nexport class ContextManager {\n private readonly rootPath: string;\n private readonly includePatterns: string[];\n private readonly excludePatterns: string[];\n private readonly maxDepth: number;\n\n /** Stored snapshots for delta comparison */\n private readonly snapshotStates: Map<string, SnapshotState> = new Map();\n\n /**\n * Create a new ContextManager\n * @param options Configuration options\n */\n constructor(options: ContextManagerOptions) {\n this.rootPath = options.rootPath;\n this.includePatterns = options.includePatterns;\n this.excludePatterns = options.excludePatterns;\n this.maxDepth = options.maxDepth ?? 10;\n }\n\n /**\n * Generate a complete snapshot of the current project state\n * @returns ProjectSnapshot with tree structure, summary, and key files\n */\n async generateSnapshot(): Promise<ProjectSnapshot> {\n const tree = buildDirectoryTree(this.rootPath, {\n includePatterns: this.includePatterns,\n excludePatterns: this.excludePatterns,\n maxDepth: this.maxDepth,\n });\n const files = this.collectMatchingFiles(this.rootPath);\n const keyFiles = this.identifyKeyFiles(files);\n const summary = this.generateSummary(files);\n\n const snapshotId = uuidv4();\n\n // Store file states for delta comparison\n const fileStates = new Map<string, FileState>();\n for (const file of files) {\n try {\n const stats = statSync(file);\n const relativePath = relative(this.rootPath, file);\n fileStates.set(relativePath, {\n path: relativePath,\n mtime: stats.mtimeMs,\n size: stats.size,\n });\n } catch {\n // Skip files we can't stat\n }\n }\n\n this.snapshotStates.set(snapshotId, {\n id: snapshotId,\n files: fileStates,\n });\n\n return {\n id: snapshotId,\n timestamp: Date.now(),\n tree,\n summary,\n keyFiles,\n };\n }\n\n /**\n * Get changes since the last snapshot\n *\n * Compares the current file system state with a previously stored snapshot\n * to detect added, modified, and deleted files.\n *\n * @param lastSyncId ID of the last snapshot to compare against\n * @returns ContextDelta with changes since the last sync\n * @throws Error if lastSyncId is not found\n */\n async getDelta(lastSyncId: string): Promise<ContextDelta> {\n const lastState = this.snapshotStates.get(lastSyncId);\n if (!lastState) {\n throw new Error(`Snapshot ${lastSyncId} not found`);\n }\n\n // Generate a new snapshot to compare against\n const currentSnapshot = await this.generateSnapshot();\n const currentState = this.snapshotStates.get(currentSnapshot.id)!;\n\n const changes: FileChange[] = [];\n\n // Check for added and modified files\n for (const [path, currentFile] of currentState.files) {\n const lastFile = lastState.files.get(path);\n\n if (!lastFile) {\n // File was added\n changes.push({\n path,\n action: 'added',\n });\n } else if (currentFile.mtime !== lastFile.mtime || currentFile.size !== lastFile.size) {\n // File was modified\n const diff = await this.generateFileDiff(path);\n changes.push({\n path,\n action: 'modified',\n diff,\n });\n }\n }\n\n // Check for deleted files\n for (const path of lastState.files.keys()) {\n if (!currentState.files.has(path)) {\n changes.push({\n path,\n action: 'deleted',\n });\n }\n }\n\n return {\n fromSyncId: lastSyncId,\n toSyncId: currentSnapshot.id,\n changes,\n };\n }\n\n /**\n * Generate a simple diff for a modified file\n * Returns the new content (simplified diff for now)\n */\n private async generateFileDiff(relativePath: string): Promise<string> {\n try {\n const fullPath = join(this.rootPath, relativePath);\n const content = readFileSync(fullPath, 'utf-8');\n // Simplified diff: return first 1000 chars of new content\n // A more sophisticated implementation could use a proper diff algorithm\n return content.length > 1000 ? content.slice(0, 1000) + '...' : content;\n } catch {\n return '';\n }\n }\n\n /**\n * Get relevant file chunks based on a task description, respecting token limits\n * @param task Description of the task to get context for\n * @param maxTokens Maximum tokens for the returned context\n * @returns Array of FileChunk objects within the token limit\n */\n async getRelevantContext(task: string, maxTokens: number): Promise<FileChunk[]> {\n const files = this.collectMatchingFiles(this.rootPath);\n const rankedFiles = this.rankFilesForTask(files, task);\n const chunks: FileChunk[] = [];\n let currentTokens = 0;\n\n for (const filePath of rankedFiles) {\n try {\n const content = readFileSync(filePath, 'utf-8');\n const fileTokens = estimateTokens(content);\n\n // Check if we can fit this file\n if (currentTokens + fileTokens <= maxTokens) {\n chunks.push({\n path: relative(this.rootPath, filePath),\n content,\n language: this.getLanguage(filePath),\n });\n currentTokens += fileTokens;\n } else if (chunks.length === 0) {\n // If first file and it doesn't fit, truncate it\n const remainingTokens = maxTokens - currentTokens;\n const truncatedContent = this.truncateContent(content, remainingTokens);\n if (truncatedContent) {\n chunks.push({\n path: relative(this.rootPath, filePath),\n content: truncatedContent,\n language: this.getLanguage(filePath),\n });\n break;\n }\n }\n\n // Stop if we've reached the limit\n if (currentTokens >= maxTokens) {\n break;\n }\n } catch {\n // Skip files that can't be read\n continue;\n }\n }\n\n return chunks;\n }\n\n /**\n * Collect all files matching include patterns and not matching exclude patterns\n */\n private collectMatchingFiles(dirPath: string): string[] {\n const files: string[] = [];\n this.collectFilesRecursive(dirPath, files, 0);\n return files;\n }\n\n private collectFilesRecursive(dirPath: string, files: string[], depth: number): void {\n if (depth >= this.maxDepth) {\n return;\n }\n\n try {\n const entries = readdirSync(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dirPath, entry.name);\n const relativePath = relative(this.rootPath, fullPath);\n\n if (this.isExcluded(relativePath)) {\n continue;\n }\n\n if (entry.isDirectory()) {\n this.collectFilesRecursive(fullPath, files, depth + 1);\n } else if (entry.isFile() && this.isIncluded(relativePath)) {\n files.push(fullPath);\n }\n }\n } catch {\n // Skip directories we can't read\n }\n }\n\n /**\n * Check if a path matches any include pattern\n */\n private isIncluded(relativePath: string): boolean {\n if (this.includePatterns.length === 0) {\n return true;\n }\n return this.includePatterns.some(pattern => minimatch(relativePath, pattern));\n }\n\n /**\n * Check if a path matches any exclude pattern\n */\n private isExcluded(relativePath: string): boolean {\n return this.excludePatterns.some(pattern => minimatch(relativePath, pattern));\n }\n\n /**\n * Check if a directory should be traversed based on include patterns\n */\n private shouldIncludeDirectory(relativePath: string): boolean {\n // Always traverse directories if we might find matching files inside\n // This is a simplified check - we traverse if any include pattern\n // could potentially match files in this directory\n if (this.includePatterns.length === 0) {\n return true;\n }\n\n return this.includePatterns.some(pattern => {\n // Check if this directory is part of any include pattern path\n const patternParts = pattern.split('/');\n const pathParts = relativePath.split('/');\n\n // If pattern starts with **, always include\n if (pattern.startsWith('**')) {\n return true;\n }\n\n // Check if path could be a prefix of the pattern\n for (let i = 0; i < pathParts.length && i < patternParts.length; i++) {\n if (patternParts[i] === '**') {\n return true;\n }\n if (!minimatch(pathParts[i], patternParts[i])) {\n return false;\n }\n }\n return true;\n });\n }\n\n /**\n * Identify key files in the project (config files, entry points, etc.)\n */\n private identifyKeyFiles(files: string[]): string[] {\n const keyFileNames = [\n 'package.json',\n 'tsconfig.json',\n 'index.ts',\n 'index.js',\n 'main.ts',\n 'main.js',\n 'app.ts',\n 'app.js',\n 'README.md',\n 'CLAUDE.md',\n ];\n\n const keyFiles: string[] = [];\n\n for (const file of files) {\n const fileName = basename(file);\n if (keyFileNames.includes(fileName)) {\n keyFiles.push(relative(this.rootPath, file));\n }\n }\n\n return keyFiles;\n }\n\n /**\n * Generate a summary string describing the project\n */\n private generateSummary(files: string[]): string {\n const extensions = new Map<string, number>();\n\n for (const file of files) {\n const ext = extname(file) || '(no extension)';\n extensions.set(ext, (extensions.get(ext) || 0) + 1);\n }\n\n const extSummary = Array.from(extensions.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5)\n .map(([ext, count]) => `${ext}: ${count}`)\n .join(', ');\n\n return `Project contains ${files.length} files. Top extensions: ${extSummary}`;\n }\n\n /**\n * Rank files by relevance to a task description\n * Files with matching keywords are ranked higher\n */\n private rankFilesForTask(files: string[], task: string): string[] {\n const taskLower = task.toLowerCase();\n const keywords = taskLower.split(/\\s+/).filter(w => w.length > 2);\n\n const scored = files.map(file => {\n const relativePath = relative(this.rootPath, file).toLowerCase();\n let score = 0;\n\n // Score based on keyword matches in file path\n for (const keyword of keywords) {\n if (relativePath.includes(keyword)) {\n score += 10;\n }\n }\n\n // Boost key files\n const fileName = basename(file);\n if (['index.ts', 'index.js', 'main.ts', 'main.js'].includes(fileName)) {\n score += 5;\n }\n if (fileName === 'package.json') {\n score += 3;\n }\n\n return { file, score };\n });\n\n // Sort by score descending, then by path\n scored.sort((a, b) => {\n if (a.score !== b.score) {\n return b.score - a.score;\n }\n return a.file.localeCompare(b.file);\n });\n\n return scored.map(s => s.file);\n }\n\n /**\n * Get programming language from file extension\n */\n private getLanguage(filePath: string): string {\n const ext = extname(filePath).toLowerCase();\n const languageMap: Record<string, string> = {\n '.ts': 'typescript',\n '.tsx': 'typescript',\n '.js': 'javascript',\n '.jsx': 'javascript',\n '.py': 'python',\n '.rb': 'ruby',\n '.go': 'go',\n '.rs': 'rust',\n '.java': 'java',\n '.c': 'c',\n '.cpp': 'cpp',\n '.h': 'c',\n '.hpp': 'cpp',\n '.cs': 'csharp',\n '.php': 'php',\n '.swift': 'swift',\n '.kt': 'kotlin',\n '.scala': 'scala',\n '.md': 'markdown',\n '.json': 'json',\n '.yaml': 'yaml',\n '.yml': 'yaml',\n '.xml': 'xml',\n '.html': 'html',\n '.css': 'css',\n '.scss': 'scss',\n '.less': 'less',\n '.sql': 'sql',\n '.sh': 'bash',\n '.bash': 'bash',\n '.zsh': 'zsh',\n };\n\n return languageMap[ext] || 'text';\n }\n\n /**\n * Truncate file content to fit within a token limit\n */\n private truncateContent(content: string, maxTokens: number): string {\n const lines = content.split('\\n');\n const result: string[] = [];\n let currentTokens = 0;\n\n for (const line of lines) {\n const lineTokens = estimateTokens(line);\n if (currentTokens + lineTokens <= maxTokens) {\n result.push(line);\n currentTokens += lineTokens;\n } else {\n break;\n }\n }\n\n return result.join('\\n');\n }\n}\n","/**\n * Token counting utilities for context chunking.\n * Uses word-based approximation since exact token counting requires\n * a tokenizer specific to the model being used.\n */\n\n/**\n * Average tokens per word approximation.\n * This is a rough estimate based on typical English text.\n * Actual token counts vary by model and text content.\n */\nconst TOKENS_PER_WORD = 1.3;\n\n/**\n * Estimates the number of tokens in a given text.\n * Uses a simple word-based approximation (roughly 1.3 tokens per word).\n *\n * @param text - The text to estimate tokens for\n * @returns Estimated number of tokens\n */\nexport function estimateTokens(text: string): number {\n if (!text || text.length === 0) {\n return 0;\n }\n\n // Split on whitespace to count words\n const words = text.split(/\\s+/).filter(word => word.length > 0);\n\n // Apply the tokens per word ratio and round up\n return Math.ceil(words.length * TOKENS_PER_WORD);\n}\n\n/**\n * Truncates text to fit within a token limit while preserving complete words.\n *\n * @param text - The text to truncate\n * @param maxTokens - The maximum number of tokens allowed\n * @returns Truncated text that fits within the token limit\n */\nexport function truncateToTokenLimit(text: string, maxTokens: number): string {\n if (!text || text.length === 0) {\n return '';\n }\n\n if (maxTokens <= 0) {\n return '';\n }\n\n // If already within limit, return as-is\n if (estimateTokens(text) <= maxTokens) {\n return text;\n }\n\n // Split into words\n const words = text.split(/\\s+/).filter(word => word.length > 0);\n\n // Calculate maximum words we can include\n const maxWords = Math.floor(maxTokens / TOKENS_PER_WORD);\n\n if (maxWords <= 0) {\n return '';\n }\n\n // Take only the allowed number of words and join with single spaces\n const truncatedWords = words.slice(0, maxWords);\n\n return truncatedWords.join(' ');\n}\n","/**\n * Transport module exports\n */\n\nexport {\n // Enums\n ConnectionState,\n // Types\n type AuthConfig,\n type ConnectionConfig,\n type MessageHandler,\n type DisconnectHandler,\n type ErrorHandler,\n type Transport,\n type TransportEvents,\n} from './interface.js';\n\nexport { WebSocketTransport } from './websocket.js';\n\nimport { WebSocketTransport } from './websocket.js';\nimport type { ConnectionConfig, Transport } from './interface.js';\n\n// Transport type for factory function\nexport type TransportType = 'websocket';\n\n/**\n * Options for creating a transport\n */\nexport interface CreateTransportOptions {\n /** Configuration to use when connecting */\n config?: ConnectionConfig;\n}\n\n/**\n * Factory function to create transport instances\n * @param type The type of transport to create\n * @param options Optional configuration options\n * @returns A Transport instance\n * @throws Error if the transport type is not supported\n */\nexport function createTransport(type: TransportType, options?: CreateTransportOptions): Transport {\n switch (type) {\n case 'websocket':\n // Config will be passed to connect(), not the constructor\n return new WebSocketTransport();\n default:\n throw new Error(`Unknown transport type: ${type as string}`);\n }\n}\n","/**\n * Custom error classes for Claude Code Bridge\n *\n * Provides structured error types with clear, actionable messages\n * for different error scenarios.\n */\n\n/**\n * Base error class for bridge errors\n */\nexport class BridgeError extends Error {\n readonly code: string;\n readonly context?: Record<string, unknown>;\n\n constructor(message: string, code: string, context?: Record<string, unknown>) {\n super(message);\n this.name = 'BridgeError';\n this.code = code;\n this.context = context;\n\n // Maintains proper stack trace for where error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n\n /**\n * Get formatted error message with context\n */\n toDetailedString(): string {\n const parts = [`${this.name}[${this.code}]: ${this.message}`];\n if (this.context) {\n parts.push(`Context: ${JSON.stringify(this.context)}`);\n }\n return parts.join('\\n');\n }\n}\n\n/**\n * Error codes for bridge errors\n */\nexport const ErrorCodes = {\n // Configuration errors\n CONFIG_INVALID: 'CONFIG_INVALID',\n CONFIG_MISSING: 'CONFIG_MISSING',\n CONFIG_PARSE_ERROR: 'CONFIG_PARSE_ERROR',\n\n // Connection errors\n CONNECTION_FAILED: 'CONNECTION_FAILED',\n CONNECTION_REFUSED: 'CONNECTION_REFUSED',\n CONNECTION_TIMEOUT: 'CONNECTION_TIMEOUT',\n CONNECTION_CLOSED: 'CONNECTION_CLOSED',\n NOT_CONNECTED: 'NOT_CONNECTED',\n ALREADY_CONNECTED: 'ALREADY_CONNECTED',\n\n // Peer errors\n PEER_NOT_FOUND: 'PEER_NOT_FOUND',\n NO_PEERS_CONNECTED: 'NO_PEERS_CONNECTED',\n PEER_DISCONNECTED: 'PEER_DISCONNECTED',\n\n // Task errors\n TASK_TIMEOUT: 'TASK_TIMEOUT',\n TASK_FAILED: 'TASK_FAILED',\n NO_TASK_HANDLER: 'NO_TASK_HANDLER',\n\n // Context errors\n CONTEXT_TIMEOUT: 'CONTEXT_TIMEOUT',\n CONTEXT_SYNC_FAILED: 'CONTEXT_SYNC_FAILED',\n SNAPSHOT_NOT_FOUND: 'SNAPSHOT_NOT_FOUND',\n\n // Protocol errors\n INVALID_MESSAGE: 'INVALID_MESSAGE',\n SERIALIZATION_ERROR: 'SERIALIZATION_ERROR',\n\n // Bridge lifecycle errors\n BRIDGE_ALREADY_STARTED: 'BRIDGE_ALREADY_STARTED',\n BRIDGE_NOT_STARTED: 'BRIDGE_NOT_STARTED',\n BRIDGE_SHUTDOWN: 'BRIDGE_SHUTDOWN',\n\n // General errors\n UNKNOWN: 'UNKNOWN',\n} as const;\n\nexport type ErrorCode = typeof ErrorCodes[keyof typeof ErrorCodes];\n\n/**\n * Configuration error\n */\nexport class ConfigurationError extends BridgeError {\n readonly setting?: string;\n\n constructor(message: string, code: ErrorCode, setting?: string, context?: Record<string, unknown>) {\n super(message, code, {\n ...context,\n setting,\n });\n this.name = 'ConfigurationError';\n this.setting = setting;\n }\n\n static missing(setting: string): ConfigurationError {\n return new ConfigurationError(\n `Missing required configuration: '${setting}'`,\n ErrorCodes.CONFIG_MISSING,\n setting\n );\n }\n\n static invalid(setting: string, reason: string, value?: unknown): ConfigurationError {\n return new ConfigurationError(\n `Invalid configuration for '${setting}': ${reason}`,\n ErrorCodes.CONFIG_INVALID,\n setting,\n { value }\n );\n }\n\n static parseError(filePath: string, error: Error): ConfigurationError {\n return new ConfigurationError(\n `Failed to parse configuration file '${filePath}': ${error.message}`,\n ErrorCodes.CONFIG_PARSE_ERROR,\n undefined,\n { filePath, originalError: error.message }\n );\n }\n}\n\n/**\n * Connection error with network details\n */\nexport class ConnectionError extends BridgeError {\n readonly url?: string;\n readonly host?: string;\n readonly port?: number;\n\n constructor(\n message: string,\n code: ErrorCode = ErrorCodes.CONNECTION_FAILED,\n options?: {\n url?: string;\n host?: string;\n port?: number;\n cause?: Error;\n }\n ) {\n super(message, code, {\n url: options?.url,\n host: options?.host,\n port: options?.port,\n cause: options?.cause?.message,\n });\n this.name = 'ConnectionError';\n this.url = options?.url;\n this.host = options?.host;\n this.port = options?.port;\n\n if (options?.cause) {\n this.cause = options.cause;\n }\n }\n\n static refused(url: string): ConnectionError {\n return new ConnectionError(\n `Connection refused to ${url}. Ensure the bridge is running and accepting connections.`,\n ErrorCodes.CONNECTION_REFUSED,\n { url }\n );\n }\n\n static timeout(url: string, timeoutMs: number): ConnectionError {\n return new ConnectionError(\n `Connection to ${url} timed out after ${timeoutMs}ms. Check network connectivity and firewall settings.`,\n ErrorCodes.CONNECTION_TIMEOUT,\n { url }\n );\n }\n\n static closed(url: string, reason?: string): ConnectionError {\n const message = reason\n ? `Connection to ${url} closed: ${reason}`\n : `Connection to ${url} closed unexpectedly`;\n return new ConnectionError(message, ErrorCodes.CONNECTION_CLOSED, { url });\n }\n\n static notConnected(): ConnectionError {\n return new ConnectionError(\n 'Not connected to any peer. Call connect() first.',\n ErrorCodes.NOT_CONNECTED\n );\n }\n\n static alreadyConnected(): ConnectionError {\n return new ConnectionError(\n 'Already connected. Disconnect first to establish a new connection.',\n ErrorCodes.ALREADY_CONNECTED\n );\n }\n}\n\n/**\n * Peer-related error\n */\nexport class PeerError extends BridgeError {\n readonly peerId?: string;\n\n constructor(message: string, code: ErrorCode, peerId?: string) {\n super(message, code, { peerId });\n this.name = 'PeerError';\n this.peerId = peerId;\n }\n\n static notFound(peerId: string): PeerError {\n return new PeerError(\n `Peer '${peerId}' not found. The peer may have disconnected.`,\n ErrorCodes.PEER_NOT_FOUND,\n peerId\n );\n }\n\n static noPeersConnected(): PeerError {\n return new PeerError(\n 'No peers are connected. Wait for a peer to connect or call connectToPeer() first.',\n ErrorCodes.NO_PEERS_CONNECTED\n );\n }\n\n static disconnected(peerId: string): PeerError {\n return new PeerError(\n `Peer '${peerId}' has disconnected.`,\n ErrorCodes.PEER_DISCONNECTED,\n peerId\n );\n }\n}\n\n/**\n * Task-related error\n */\nexport class TaskError extends BridgeError {\n readonly taskId?: string;\n\n constructor(message: string, code: ErrorCode, taskId?: string, context?: Record<string, unknown>) {\n super(message, code, { ...context, taskId });\n this.name = 'TaskError';\n this.taskId = taskId;\n }\n\n static timeout(taskId: string, timeoutMs: number): TaskError {\n return new TaskError(\n `Task '${taskId}' timed out after ${timeoutMs}ms. Consider increasing the task timeout or breaking the task into smaller pieces.`,\n ErrorCodes.TASK_TIMEOUT,\n taskId,\n { timeoutMs }\n );\n }\n\n static failed(taskId: string, reason: string): TaskError {\n return new TaskError(\n `Task '${taskId}' failed: ${reason}`,\n ErrorCodes.TASK_FAILED,\n taskId\n );\n }\n\n static noHandler(): TaskError {\n return new TaskError(\n 'No task handler registered. Register a handler with onTaskReceived() before delegating tasks.',\n ErrorCodes.NO_TASK_HANDLER\n );\n }\n}\n\n/**\n * Context synchronization error\n */\nexport class ContextError extends BridgeError {\n constructor(message: string, code: ErrorCode, context?: Record<string, unknown>) {\n super(message, code, context);\n this.name = 'ContextError';\n }\n\n static timeout(timeoutMs: number): ContextError {\n return new ContextError(\n `Context request timed out after ${timeoutMs}ms. The peer may be processing a large amount of data.`,\n ErrorCodes.CONTEXT_TIMEOUT,\n { timeoutMs }\n );\n }\n\n static syncFailed(reason: string): ContextError {\n return new ContextError(\n `Context synchronization failed: ${reason}`,\n ErrorCodes.CONTEXT_SYNC_FAILED\n );\n }\n\n static snapshotNotFound(snapshotId: string): ContextError {\n return new ContextError(\n `Snapshot '${snapshotId}' not found. It may have expired or never existed.`,\n ErrorCodes.SNAPSHOT_NOT_FOUND,\n { snapshotId }\n );\n }\n}\n\n/**\n * Protocol/message error\n */\nexport class ProtocolError extends BridgeError {\n constructor(message: string, code: ErrorCode = ErrorCodes.INVALID_MESSAGE, context?: Record<string, unknown>) {\n super(message, code, context);\n this.name = 'ProtocolError';\n }\n\n static invalidMessage(reason: string, data?: unknown): ProtocolError {\n return new ProtocolError(\n `Invalid message: ${reason}`,\n ErrorCodes.INVALID_MESSAGE,\n { data: data ? String(data).substring(0, 200) : undefined }\n );\n }\n\n static serializationError(error: Error): ProtocolError {\n return new ProtocolError(\n `Message serialization failed: ${error.message}`,\n ErrorCodes.SERIALIZATION_ERROR,\n { originalError: error.message }\n );\n }\n}\n\n/**\n * Bridge lifecycle error\n */\nexport class BridgeLifecycleError extends BridgeError {\n constructor(message: string, code: ErrorCode) {\n super(message, code);\n this.name = 'BridgeLifecycleError';\n }\n\n static alreadyStarted(): BridgeLifecycleError {\n return new BridgeLifecycleError(\n 'Bridge is already started. Call stop() before starting again.',\n ErrorCodes.BRIDGE_ALREADY_STARTED\n );\n }\n\n static notStarted(): BridgeLifecycleError {\n return new BridgeLifecycleError(\n 'Bridge is not started. Call start() first.',\n ErrorCodes.BRIDGE_NOT_STARTED\n );\n }\n\n static shuttingDown(): BridgeLifecycleError {\n return new BridgeLifecycleError(\n 'Bridge is shutting down.',\n ErrorCodes.BRIDGE_SHUTDOWN\n );\n }\n}\n\n/**\n * Format an error for logging with context\n */\nexport function formatErrorForLogging(error: unknown): {\n message: string;\n code?: string;\n context?: Record<string, unknown>;\n stack?: string;\n} {\n if (error instanceof BridgeError) {\n return {\n message: error.message,\n code: error.code,\n context: error.context,\n stack: error.stack,\n };\n }\n\n if (error instanceof Error) {\n return {\n message: error.message,\n stack: error.stack,\n };\n }\n\n return {\n message: String(error),\n };\n}\n\n/**\n * Wrap an error with additional context\n */\nexport function wrapError(error: unknown, context: string): BridgeError {\n if (error instanceof BridgeError) {\n return new BridgeError(\n `${context}: ${error.message}`,\n error.code,\n error.context\n );\n }\n\n const message = error instanceof Error ? error.message : String(error);\n return new BridgeError(\n `${context}: ${message}`,\n ErrorCodes.UNKNOWN,\n { originalError: message }\n );\n}\n\n/**\n * Check if an error is of a specific type\n */\nexport function isErrorCode(error: unknown, code: ErrorCode): boolean {\n return error instanceof BridgeError && error.code === code;\n}\n","/**\n * Claude Code Bridge\n *\n * A bidirectional communication system that enables two separate Claude Code instances\n * to collaborate across different environments. Connect instances running on different\n * machines, containers, or networks via WebSocket.\n *\n * @packageDocumentation\n */\n\nexport const VERSION = '0.1.0';\n\n// ============================================================================\n// Bridge Core\n// ============================================================================\n\nexport {\n // Main Bridge class\n Bridge,\n // Bridge types\n type BridgeMode,\n type BridgeConfig,\n type BridgeListenConfig,\n type BridgeConnectConfig,\n type ContextSharingConfig,\n type PeerInfo,\n // Handler types\n type PeerConnectedHandler,\n type PeerDisconnectedHandler,\n type MessageReceivedHandler,\n type TaskReceivedHandler,\n type ContextReceivedHandler,\n type ContextRequestedHandler,\n} from './bridge/core.js';\n\n// ============================================================================\n// Protocol & Messages\n// ============================================================================\n\nexport {\n // Schemas (for validation)\n MessageType,\n FileChunkSchema,\n DirectoryTreeSchema,\n ArtifactSchema,\n ContextSchema,\n TaskRequestSchema,\n TaskResultSchema,\n BridgeMessageSchema,\n // Protocol types\n type FileChunk,\n type DirectoryTree,\n type Artifact,\n type Context,\n type TaskRequest,\n type TaskResult,\n type BridgeMessage,\n // Helper functions\n createMessage,\n validateMessage,\n safeValidateMessage,\n serializeMessage,\n deserializeMessage,\n safeDeserializeMessage,\n} from './bridge/protocol.js';\n\nexport {\n // Message builders\n createContextSyncMessage,\n createTaskDelegateMessage,\n createTaskResponseMessage,\n createContextRequestMessage,\n createNotificationMessage,\n type NotificationData,\n} from './bridge/messages.js';\n\n// ============================================================================\n// Context Management\n// ============================================================================\n\nexport {\n ContextManager,\n buildDirectoryTree,\n type ContextManagerOptions,\n type ProjectSnapshot,\n type BuildDirectoryTreeOptions,\n type ContextDelta,\n type FileChange,\n} from './bridge/context.js';\n\n// ============================================================================\n// Transport Layer\n// ============================================================================\n\nexport {\n // Transport interface\n type Transport,\n type ConnectionConfig,\n ConnectionState,\n // Transport implementation\n WebSocketTransport,\n // Factory\n createTransport,\n} from './transport/index.js';\n\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\nexport {\n // Logger\n createLogger,\n createChildLogger,\n type Logger,\n type LogLevel,\n // Configuration\n loadConfig,\n loadConfigSync,\n mergeConfig,\n DEFAULT_CONFIG,\n type BridgeConfig as UtilsBridgeConfig,\n type ListenConfig,\n type ConnectConfig,\n type ContextSharingConfig as UtilsContextSharingConfig,\n type InteractionConfig,\n // Tokens\n estimateTokens,\n truncateToTokenLimit,\n // Errors\n BridgeError,\n ConfigurationError,\n ConnectionError,\n PeerError,\n TaskError,\n ContextError,\n ProtocolError,\n BridgeLifecycleError,\n ErrorCodes,\n formatErrorForLogging,\n wrapError,\n isErrorCode,\n type ErrorCode,\n} from './utils/index.js';\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@willjackson/claude-code-bridge",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Bidirectional communication system for Claude Code instances across environments",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -32,12 +32,10 @@
|
|
|
32
32
|
"ai",
|
|
33
33
|
"bridge",
|
|
34
34
|
"websocket",
|
|
35
|
-
"docker",
|
|
36
|
-
"docksal",
|
|
37
|
-
"ddev",
|
|
38
|
-
"lando",
|
|
39
35
|
"cross-environment",
|
|
40
|
-
"collaboration"
|
|
36
|
+
"collaboration",
|
|
37
|
+
"remote",
|
|
38
|
+
"file-operations"
|
|
41
39
|
],
|
|
42
40
|
"author": "Will Jackson",
|
|
43
41
|
"license": "MIT",
|