@willjackson/claude-code-bridge 0.6.2 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  ArtifactSchema,
3
+ Authenticator,
3
4
  Bridge,
4
5
  BridgeMcpServer,
5
6
  BridgeMessageSchema,
@@ -13,16 +14,22 @@ import {
13
14
  TaskRequestSchema,
14
15
  TaskResultSchema,
15
16
  WebSocketTransport,
17
+ createAuthConfigFromOptions,
16
18
  createChildLogger,
17
19
  createContextRequestMessage,
18
20
  createContextSyncMessage,
19
21
  createLogger,
20
22
  createMessage,
21
23
  createNotificationMessage,
24
+ createSecureContextOptions,
22
25
  createTaskDelegateMessage,
23
26
  createTaskResponseMessage,
24
27
  createToolHandlers,
25
28
  deserializeMessage,
29
+ extractCredentials,
30
+ isTLSEnabled,
31
+ loadCertificates,
32
+ loadCertificatesSync,
26
33
  loadConfig,
27
34
  loadConfigSync,
28
35
  mergeConfig,
@@ -30,8 +37,13 @@ import {
30
37
  safeValidateMessage,
31
38
  serializeMessage,
32
39
  startMcpServer,
33
- validateMessage
34
- } from "./chunk-XOAR3DQB.js";
40
+ validateAuthConfig,
41
+ validateIp,
42
+ validateMessage,
43
+ validatePassword,
44
+ validateTLSConfig,
45
+ validateToken
46
+ } from "./chunk-2O352EPO.js";
35
47
 
36
48
  // src/bridge/context.ts
37
49
  import { readdirSync, readFileSync, statSync, realpathSync } from "fs";
@@ -851,6 +863,7 @@ function isErrorCode(error, code) {
851
863
  var VERSION = "0.1.0";
852
864
  export {
853
865
  ArtifactSchema,
866
+ Authenticator,
854
867
  Bridge,
855
868
  BridgeError,
856
869
  BridgeLifecycleError,
@@ -876,20 +889,26 @@ export {
876
889
  VERSION,
877
890
  WebSocketTransport,
878
891
  buildDirectoryTree,
892
+ createAuthConfigFromOptions,
879
893
  createChildLogger,
880
894
  createContextRequestMessage,
881
895
  createContextSyncMessage,
882
896
  createLogger,
883
897
  createMessage,
884
898
  createNotificationMessage,
899
+ createSecureContextOptions,
885
900
  createTaskDelegateMessage,
886
901
  createTaskResponseMessage,
887
902
  createToolHandlers,
888
903
  createTransport,
889
904
  deserializeMessage,
890
905
  estimateTokens,
906
+ extractCredentials,
891
907
  formatErrorForLogging,
892
908
  isErrorCode,
909
+ isTLSEnabled,
910
+ loadCertificates,
911
+ loadCertificatesSync,
893
912
  loadConfig,
894
913
  loadConfigSync,
895
914
  mergeConfig,
@@ -898,7 +917,12 @@ export {
898
917
  serializeMessage,
899
918
  startMcpServer,
900
919
  truncateToTokenLimit,
920
+ validateAuthConfig,
921
+ validateIp,
901
922
  validateMessage,
923
+ validatePassword,
924
+ validateTLSConfig,
925
+ validateToken,
902
926
  wrapError
903
927
  };
904
928
  //# sourceMappingURL=index.js.map
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/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\n// ============================================================================\n// MCP Server\n// ============================================================================\n\nexport {\n BridgeMcpServer,\n startMcpServer,\n type McpServerConfig,\n TOOL_DEFINITIONS,\n createToolHandlers,\n type ToolDefinition,\n type ToolResponse,\n} from './mcp/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 // TLS\n loadCertificates,\n loadCertificatesSync,\n validateTLSConfig,\n isTLSEnabled,\n createSecureContextOptions,\n type TLSConfig,\n type TLSValidationResult,\n type LoadedTLSOptions,\n // Authentication\n Authenticator,\n validateToken,\n validatePassword,\n validateIp,\n extractCredentials,\n createAuthConfigFromOptions,\n validateAuthConfig,\n type AuthConfig,\n type AuthType,\n type AuthResult,\n type ExtractedCredentials,\n} from './utils/index.js';\n\n// ============================================================================\n// MCP Server\n// ============================================================================\n\nexport {\n BridgeMcpServer,\n startMcpServer,\n type McpServerConfig,\n TOOL_DEFINITIONS,\n createToolHandlers,\n type ToolDefinition,\n type ToolResponse,\n} from './mcp/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.6.2",
3
+ "version": "0.7.1",
4
4
  "description": "Bidirectional communication system for Claude Code instances across environments",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",