@coderule/clients 1.6.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -521,6 +521,46 @@ var SyncHttpClient = class {
521
521
  throw error;
522
522
  }
523
523
  }
524
+ /**
525
+ * Truncate all database tables and clean RabbitMQ queue
526
+ *
527
+ * **DANGER**: This deletes ALL data from the database and message queue.
528
+ * Should only be used in development/testing environments.
529
+ *
530
+ * @param adminToken - Admin token for authentication
531
+ * @returns Promise with success message
532
+ * @throws Error on HTTP errors (including 401/403 for auth failures) or connection errors
533
+ */
534
+ async truncate(adminToken) {
535
+ const url = `${this.baseUrl}/admin/truncate`;
536
+ const controller = new AbortController2();
537
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
538
+ try {
539
+ const response = await fetch_wrapper_default(url, {
540
+ method: "POST",
541
+ headers: {
542
+ "X-Admin-Token": adminToken
543
+ },
544
+ signal: controller.signal
545
+ });
546
+ clearTimeout(timeoutId);
547
+ if (!response.ok) {
548
+ const errorText = await response.text();
549
+ throw new Error(
550
+ `Truncate failed with status ${response.status}: ${errorText}`
551
+ );
552
+ }
553
+ const data = await response.json();
554
+ this.logger.warn(`Database truncated: ${data.message}`);
555
+ return data;
556
+ } catch (error) {
557
+ if (error.name === "AbortError") {
558
+ throw new Error(`Request timeout after ${this.timeout}ms`);
559
+ }
560
+ this.logger.error(`Request failed: ${error.message}`);
561
+ throw error;
562
+ }
563
+ }
524
564
  /**
525
565
  * Close the HTTP client connection (no-op for fetch)
526
566
  */
@@ -1 +1 @@
1
- {"version":3,"sources":["../node_modules/tsup/assets/cjs_shims.js","../src/polyfills/fetch-polyfill.ts","../src/index.ts","../src/clients/auth-client.ts","../src/utils/fetch-wrapper.ts","../src/utils/logger.ts","../src/clients/sync-client.ts","../src/clients/retrieval-client.ts","../src/clients/ast-client.ts","../src/utils/jwt-factory.ts","../src/coderule-clients.ts"],"names":["fetch","FormData","AbortController","data","crypto"],"mappings":"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","file":"index.cjs","sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () =>\n typeof document === 'undefined'\n ? new URL(`file:${__filename}`).href\n : (document.currentScript && document.currentScript.src) ||\n new URL('main.js', document.baseURI).href\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","/**\n * Polyfill for Node.js < 18\n */\n\n// Dynamic import to avoid errors when node-fetch is not installed\nlet nodeFetch: any;\nlet NodeHeaders: any;\nlet NodeRequest: any;\nlet NodeResponse: any;\nlet NodeFormData: any;\nlet NodeAbortController: any;\n\ntry {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const module = require('node-fetch');\n nodeFetch = module.default || module;\n NodeHeaders = module.Headers;\n NodeRequest = module.Request;\n NodeResponse = module.Response;\n\n // FormData might be in a separate package for node-fetch v2\n try {\n NodeFormData =\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n module.FormData || require('formdata-polyfill/esm.min.js').FormData;\n } catch {\n NodeFormData = class FormData {\n constructor() {\n throw new Error(\n 'FormData is not available. Install formdata-polyfill if needed.',\n );\n }\n };\n }\n\n // AbortController is built-in since Node 15\n NodeAbortController = globalThis.AbortController || module.AbortController;\n} catch {\n throw new Error(\n 'For Node.js < 18, please install node-fetch: npm install node-fetch@2',\n );\n}\n\nexport const fetch = nodeFetch;\nexport const Headers = NodeHeaders;\nexport const Request = NodeRequest;\nexport const Response = NodeResponse;\nexport const FormData = NodeFormData;\nexport const AbortController = NodeAbortController;\n","/**\n * Coderule TypeScript Client SDK\n *\n * HTTP clients for core Coderule microservices with automatic fetch polyfill.\n * Works with Node.js 14+ (uses node-fetch for < 18, native fetch for 18+).\n */\n\n// Export all clients\nexport { AuthHttpClient, decodeJWT } from './clients/auth-client';\nexport {\n SyncHttpClient,\n type SyncClientConfig,\n type SnapshotTimingMetrics,\n type SnapshotStatus,\n} from './clients/sync-client';\nexport {\n RetrievalHttpClient,\n type RetrievalClientConfig,\n} from './clients/retrieval-client';\nexport { ASTHttpClient, type ASTClientConfig } from './clients/ast-client';\n\n// Export types\nexport type { VisitorRulesV2, HealthStatus } from './clients/ast-client';\n\nexport {\n JWTFactory,\n type JWTFactoryOptions,\n type JWTProvider,\n type TokenRefreshInfo,\n} from './utils/jwt-factory';\n\nexport {\n CoderuleClients,\n type CoderuleClientOptions,\n type ServiceConfig,\n type ServiceKey,\n} from './coderule-clients';\n\n// Export logger utilities\nexport { Logger, nullLogger, consoleLogger } from './utils/logger';\n\n// Export fetch utilities if needed by consumers\nexport { default as fetch } from './utils/fetch-wrapper';\n","/**\n * HTTP client SDK for Auth service\n * Using fetch with automatic polyfill for Node.js < 18\n */\n\nimport fetch, { AbortController } from '../utils/fetch-wrapper';\nimport { Logger, nullLogger } from '../utils/logger';\n\ninterface AuthResponse {\n jwt: string;\n expires_at: string;\n}\n\ninterface HealthResponse {\n status: string;\n version?: string;\n [key: string]: any;\n}\n\nexport class AuthHttpClient {\n private baseUrl: string;\n private timeout: number;\n private readonly logger: Logger;\n\n /**\n * Initialize the Auth HTTP client\n * @param baseUrl - Base URL of the Auth service (e.g., \"http://localhost:8001\")\n * @param timeout - Request timeout in milliseconds (default: 30000)\n * @param logger - Optional logger instance (defaults to nullLogger)\n */\n constructor(baseUrl: string, timeout: number = 30000, logger?: Logger) {\n this.baseUrl = baseUrl.replace(/\\/$/, '');\n this.timeout = timeout;\n this.logger = logger ?? nullLogger;\n }\n\n /**\n * Authenticate a token and receive a JWT\n * @param token - Authentication token\n * @returns Response containing JWT and expiration\n * @throws Error on HTTP errors or connection errors\n */\n async authenticate(token: string): Promise<AuthResponse> {\n const url = `${this.baseUrl}/api/auth/authenticate`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ token }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Authentication failed with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as AuthResponse;\n this.logger.debug(\n `Authentication successful, JWT expires at ${data.expires_at}`,\n );\n return data;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Authentication request failed: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Check the health status of the Auth service\n * @returns Health status information\n * @throws Error on HTTP errors or connection errors\n */\n async health(): Promise<HealthResponse> {\n const url = `${this.baseUrl}/api/auth/health`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method: 'GET',\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Health check failed with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as HealthResponse;\n this.logger.debug(`Health check: ${data.status}`);\n return data;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Health check request failed: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Close the HTTP client connection (no-op for fetch)\n */\n close(): void {\n // fetch doesn't maintain persistent connections, so nothing to close\n }\n}\n\n/**\n * Simple JWT payload interface\n */\ninterface JWTPayload {\n [key: string]: any;\n exp?: number;\n iat?: number;\n nbf?: number;\n}\n\n/**\n * Verify a JWT token (utility function for other services)\n * Note: This is a simplified version that only decodes the payload.\n * For proper verification, you would need a JWT library to verify the signature.\n * @param jwtToken - JWT token to verify\n * @param logger - Optional logger instance\n * @returns Decoded JWT payload if valid, null if invalid\n */\nexport function decodeJWT(\n jwtToken: string,\n logger?: Logger,\n): JWTPayload | null {\n try {\n // Split the JWT into its three parts\n const parts = jwtToken.split('.');\n if (parts.length !== 3) {\n return null;\n }\n\n // Decode the payload (second part)\n const payload = parts[1];\n // Add padding if necessary\n const paddedPayload = payload + '='.repeat((4 - (payload.length % 4)) % 4);\n\n // Decode base64url to base64\n const base64 = paddedPayload.replace(/-/g, '+').replace(/_/g, '/');\n\n // Decode base64 to string\n const jsonString = Buffer.from(base64, 'base64').toString('utf8');\n\n // Parse JSON\n const payloadObj: JWTPayload = JSON.parse(jsonString);\n\n // Check if token is expired\n if (payloadObj.exp) {\n const now = Math.floor(Date.now() / 1000);\n if (payloadObj.exp < now) {\n if (logger) logger.debug('JWT token is expired');\n return null;\n }\n }\n\n return payloadObj;\n } catch (error) {\n if (logger) logger.error('Failed to decode JWT:', error);\n return null;\n }\n}\n\n/**\n * Note: For actual JWT verification with signature validation,\n * you would need to use a proper JWT library like 'jsonwebtoken'.\n * This implementation only decodes and checks expiration.\n */\n","/**\n * Smart fetch wrapper that automatically uses native fetch or polyfill\n */\n\n// Check if native fetch is available (Node.js 18+ or browser)\nconst hasNativeFetch = typeof globalThis.fetch !== 'undefined';\n\ninterface FetchModule {\n fetch: typeof globalThis.fetch;\n Headers: typeof globalThis.Headers;\n Request: typeof globalThis.Request;\n Response: typeof globalThis.Response;\n FormData: typeof globalThis.FormData;\n AbortController: typeof globalThis.AbortController;\n}\n\nlet fetchModule: FetchModule;\n\nif (hasNativeFetch) {\n // Use native fetch\n fetchModule = {\n fetch: globalThis.fetch,\n Headers: globalThis.Headers,\n Request: globalThis.Request,\n Response: globalThis.Response,\n FormData: globalThis.FormData,\n AbortController: globalThis.AbortController,\n };\n} else {\n // Try to load polyfill for older Node.js versions\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n fetchModule = require('../polyfills/fetch-polyfill');\n } catch {\n throw new Error(\n `This library requires Node.js 18+ or the node-fetch package.\\n` +\n `Please either:\\n` +\n `1. Upgrade to Node.js 18 or later, or\\n` +\n `2. Install node-fetch: npm install node-fetch@2`,\n );\n }\n}\n\n// Export fetch and related APIs\nexport const fetch = fetchModule.fetch;\nexport const Headers = fetchModule.Headers;\nexport const Request = fetchModule.Request;\nexport const Response = fetchModule.Response;\nexport const FormData = fetchModule.FormData;\nexport const AbortController = fetchModule.AbortController;\n\n// Export default fetch for convenience\nexport default fetch;\n","/**\n * Logger interface for Coderule clients\n * Provides a standard logging interface that can be implemented by any logging library\n */\n\nexport interface Logger {\n error(message: string, ...meta: unknown[]): void;\n warn(message: string, ...meta: unknown[]): void;\n info(message: string, ...meta: unknown[]): void;\n debug(message: string, ...meta: unknown[]): void;\n}\n\n/**\n * Silent logger implementation that does nothing\n * This is the default logger used when no logger is provided\n */\nexport const nullLogger: Logger = {\n error: () => {},\n warn: () => {},\n info: () => {},\n debug: () => {},\n};\n\n/**\n * Console logger implementation that outputs to console\n * Useful for development and debugging\n */\nexport const consoleLogger: Logger = {\n error: (message: string, ...meta: unknown[]) =>\n console.error(message, ...meta),\n warn: (message: string, ...meta: unknown[]) => console.warn(message, ...meta),\n info: (message: string, ...meta: unknown[]) => console.info(message, ...meta),\n debug: (message: string, ...meta: unknown[]) =>\n console.debug(message, ...meta),\n};\n","/**\n * HTTP client SDK for Sync service\n * Using fetch with automatic polyfill for Node.js < 18\n */\n\nimport * as crypto from 'crypto';\n\nimport fetch, { AbortController, FormData } from '../utils/fetch-wrapper';\nimport { JWTProvider } from '../utils/jwt-factory';\nimport { Logger, nullLogger } from '../utils/logger';\n\n/**\n * Timing telemetry metrics for snapshot indexing\n */\nexport interface SnapshotTimingMetrics {\n /** Pass 1 duration: oldest file creation to newest file ready (seconds) */\n pass1?: number;\n /** Pass 2 duration: total cross-reference resolution time (seconds) */\n pass2?: number;\n /** Gap between newest file ready and Pass 2 start (seconds) */\n gap?: number;\n /** Pass 2 database operation time (seconds) */\n pass2db?: number;\n /** Total number of files indexed */\n total_files?: number;\n /** Total number of chunks created */\n total_chunks?: number;\n /** Total number of classes found */\n total_classes?: number;\n /** Total number of methods found */\n total_methods?: number;\n}\n\nexport interface SnapshotStatus {\n status:\n | 'NOT_FOUND'\n | 'READY'\n | 'INDEXING'\n | 'PENDING'\n | 'FAILED'\n | 'MISSING_CONTENT';\n snapshot_hash?: string;\n created_at?: string;\n updated_at?: string;\n /** Timing and summary metrics (available when status is READY) */\n timing?: SnapshotTimingMetrics;\n missing_files?: Array<{ file_path: string; file_hash: string }>;\n message?: string;\n [key: string]: any;\n}\n\ninterface FileInfo {\n file_path: string;\n file_hash: string;\n}\n\ninterface UploadResult {\n uploaded_count: number;\n failed_count: number;\n failed_files?: string[];\n}\n\ninterface HealthResponse {\n status: string;\n database?: string;\n version?: string;\n [key: string]: any;\n}\n\nexport interface SyncClientConfig {\n baseUrl?: string;\n timeout?: number;\n jwtProvider: JWTProvider;\n logger?: Logger;\n}\n\nexport class SyncHttpClient {\n private baseUrl!: string;\n private timeout: number;\n private apiBase!: string;\n private readonly jwtProvider: JWTProvider;\n private readonly logger: Logger;\n\n /**\n * Initialize the Sync HTTP client\n * @param config.baseUrl - URI/URL for connecting to the HTTP server (e.g., \"http://localhost:8002\")\n * @param config.timeout - Request timeout in milliseconds (default: 60000)\n * @param config.jwtProvider - Provider for obtaining JWT tokens\n * @param config.logger - Optional logger instance (defaults to nullLogger)\n */\n constructor({\n baseUrl = 'http://localhost:8002',\n timeout = 60000,\n jwtProvider,\n logger,\n }: SyncClientConfig) {\n if (!jwtProvider) {\n throw new Error('SyncHttpClient requires a JWT provider');\n }\n\n this.timeout = timeout;\n this.jwtProvider = jwtProvider;\n this.logger = logger ?? nullLogger;\n this.configureBase(baseUrl);\n }\n\n updateBaseUrl(baseUrl: string): void {\n this.configureBase(baseUrl);\n }\n\n private configureBase(uri: string): void {\n let processedUri = uri;\n if (!uri.startsWith('http://') && !uri.startsWith('https://')) {\n processedUri = `http://${uri}`;\n }\n\n const url = new URL(processedUri);\n\n if (url.pathname && url.pathname !== '/') {\n this.baseUrl = `${url.protocol}//${url.host}${url.pathname}`;\n } else {\n this.baseUrl = `${url.protocol}//${url.host}`;\n }\n\n if (this.baseUrl.endsWith('/')) {\n this.apiBase = `${this.baseUrl}sync/v1/`;\n } else {\n this.apiBase = `${this.baseUrl}/sync/v1/`;\n }\n }\n\n /**\n * Check the status of a snapshot\n * @param snapshotHash - SHA256 hash of the snapshot\n * @returns Snapshot status information\n * @throws Error on HTTP errors or connection errors\n */\n async checkSnapshotStatus(snapshotHash: string): Promise<SnapshotStatus> {\n if (!snapshotHash) {\n throw new Error('Snapshot hash must be provided');\n }\n\n const jwt = await this.jwtProvider.getJWT();\n const url = `${this.apiBase}snapshots`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${jwt}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ snapshot_hash: snapshotHash }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.status === 404) {\n return { status: 'NOT_FOUND' };\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Failed to check snapshot with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as SnapshotStatus;\n return data;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Request failed: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Create a new snapshot or get its status if it exists\n * @param snapshotHash - SHA256 hash of the snapshot\n * @param files - List of file information with 'file_path' and 'file_hash'\n * @returns Snapshot creation result or status\n * @throws Error on HTTP errors or connection errors\n */\n async createSnapshot(\n snapshotHash: string,\n files: FileInfo[],\n ): Promise<SnapshotStatus> {\n if (!snapshotHash) {\n throw new Error('Snapshot hash must be provided');\n }\n\n const jwt = await this.jwtProvider.getJWT();\n const url = `${this.apiBase}snapshots`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${jwt}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n snapshot_hash: snapshotHash,\n files: files,\n }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.status === 422) {\n // Missing content\n const data = (await response.json()) as SnapshotStatus;\n this.logger.info(\n `Snapshot ${snapshotHash.substring(0, 8)}... missing ${data.missing_files?.length || 0} files`,\n );\n return data;\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Failed to create snapshot with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as SnapshotStatus;\n this.logger.info(\n `Snapshot ${snapshotHash.substring(0, 8)}... status: ${data.status}`,\n );\n return data;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Request failed: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Upload file content to the service\n * @param filesContent - Map of file_hash to object with 'path' and 'content'\n * @returns Upload result with counts\n * @throws Error on HTTP errors or connection errors\n */\n async uploadFileContent(\n filesContent: Map<string, { path: string; content: Buffer | string }>,\n ): Promise<UploadResult> {\n const jwt = await this.jwtProvider.getJWT();\n const url = `${this.apiBase}files/content`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n // Create FormData for multipart upload\n const formData = new FormData();\n\n for (const [fileHash, fileData] of filesContent.entries()) {\n const content =\n typeof fileData.content === 'string'\n ? Buffer.from(fileData.content)\n : fileData.content;\n\n // Create a Blob from the Buffer\n const blob = new Blob([content], { type: 'application/octet-stream' });\n\n // Append to form data with filename as the file path\n formData.append(fileHash, blob, fileData.path);\n }\n\n // Remove Content-Type from headers for multipart (browser sets it)\n const uploadHeaders = {\n Authorization: `Bearer ${jwt}`,\n };\n\n const response = await fetch(url, {\n method: 'POST',\n headers: uploadHeaders,\n body: formData,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Failed to upload files with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as UploadResult;\n this.logger.info(\n `Uploaded ${data.uploaded_count || 0} files, ${data.failed_count || 0} failed`,\n );\n return data;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Request failed: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Calculate file hash from path and content\n * @param filePath - Relative file path\n * @param content - File content as Buffer or string\n * @returns SHA256 hash of the file\n */\n static calculateFileHash(filePath: string, content: Buffer | string): string {\n const contentBuffer =\n typeof content === 'string' ? Buffer.from(content) : content;\n const fileData = Buffer.concat([\n Buffer.from(`${filePath}\\n`, 'utf-8'),\n contentBuffer,\n ]);\n return crypto.createHash('sha256').update(fileData).digest('hex');\n }\n\n /**\n * Calculate snapshot hash from file hashes\n * @param fileHashes - Array of file SHA256 hashes\n * @returns SHA256 hash of the snapshot\n */\n static calculateSnapshotHash(fileHashes: string[]): string {\n const snapshotData = fileHashes.sort().join('\\n');\n return crypto\n .createHash('sha256')\n .update(snapshotData, 'utf-8')\n .digest('hex');\n }\n\n /**\n * Check the health status of the Sync service\n * @returns Health status information\n * @throws Error on HTTP errors or connection errors\n */\n async health(): Promise<HealthResponse> {\n const url = `${this.apiBase}health`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method: 'GET',\n // No authentication required for health check\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Health check failed with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as HealthResponse;\n return data;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Request failed: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Close the HTTP client connection (no-op for fetch)\n */\n close(): void {\n // fetch doesn't maintain persistent connections, so nothing to close\n }\n}\n","/**\n * HTTP client SDK for Retrieval service\n * Using fetch with automatic polyfill for Node.js < 18\n */\n\nimport fetch, { AbortController } from '../utils/fetch-wrapper';\nimport { JWTProvider } from '../utils/jwt-factory';\nimport { Logger, nullLogger } from '../utils/logger';\n\ninterface HealthResponse {\n status: string;\n database?: string;\n embedder?: string;\n cache_size?: number;\n cache_ttl?: number;\n version?: string;\n}\n\ninterface RetrievalOptions {\n flow_strength?: number; // Flow intensity multiplier (default: 1.5)\n blend_alpha?: number; // Blending factor for scores (default: 0.8)\n hop_depth?: number; // Depth of local neighborhood (default: 2)\n max_iterations?: number; // Maximum flood-walk iterations (default: 12)\n split?: number; // Fraction of budget for full chunks (default: 0.8)\n formatter?: 'standard' | 'compact'; // Output format (default: 'standard')\n}\n\ninterface RetrievalResult {\n formatted_output: string;\n [key: string]: any;\n}\n\ninterface SnapshotStatus {\n snapshot_hash: string;\n status: 'PENDING' | 'INDEXING' | 'READY' | 'FAILED' | 'NOT_FOUND';\n indexed_at?: string;\n total_files?: number;\n total_chunks?: number;\n message?: string;\n}\n\ninterface CacheStats {\n cached_snapshots: number;\n max_size: number;\n ttl: number;\n snapshots: string[];\n}\n\nexport interface RetrievalClientConfig {\n baseUrl?: string;\n timeout?: number;\n jwtProvider: JWTProvider;\n logger?: Logger;\n}\n\nexport class RetrievalHttpClient {\n private baseUrl!: string;\n private timeout: number;\n private apiBase!: string;\n private readonly jwtProvider: JWTProvider;\n private readonly logger: Logger;\n\n /**\n * Initialize the Retrieval HTTP client\n * @param config.baseUrl - URI/URL for connecting to the HTTP server (e.g., \"http://localhost:8004\")\n * @param config.timeout - Request timeout in milliseconds (default: 60000)\n * @param config.jwtProvider - Provider for obtaining JWT tokens\n * @param config.logger - Optional logger instance (defaults to nullLogger)\n */\n constructor({\n baseUrl = 'http://localhost:8004',\n timeout = 60000,\n jwtProvider,\n logger,\n }: RetrievalClientConfig) {\n if (!jwtProvider) {\n throw new Error('RetrievalHttpClient requires a JWT provider');\n }\n\n this.timeout = timeout;\n this.jwtProvider = jwtProvider;\n this.logger = logger ?? nullLogger;\n this.configureBase(baseUrl);\n\n this.logger.debug(`Initialized HTTP client for ${this.baseUrl}`);\n this.logger.debug(`API base: ${this.apiBase}`);\n }\n\n updateBaseUrl(baseUrl: string): void {\n this.configureBase(baseUrl);\n }\n\n private configureBase(uri: string): void {\n let processedUri = uri;\n if (!uri.startsWith('http://') && !uri.startsWith('https://')) {\n processedUri = `http://${uri}`;\n }\n\n const url = new URL(processedUri);\n\n if (url.pathname && url.pathname !== '/') {\n this.baseUrl = `${url.protocol}//${url.host}${url.pathname}`;\n } else {\n this.baseUrl = `${url.protocol}//${url.host}`;\n }\n\n if (this.baseUrl.endsWith('/')) {\n this.apiBase = `${this.baseUrl}api/retrieval/`;\n } else {\n this.apiBase = `${this.baseUrl}/api/retrieval/`;\n }\n }\n\n /**\n * Check the health status of the Retrieval service\n * @returns Health status information\n * @throws Error on connection errors\n */\n async healthCheck(): Promise<HealthResponse> {\n const healthEndpoint = `${this.apiBase}health`;\n this.logger.debug(`Checking server health: ${healthEndpoint}`);\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(healthEndpoint, {\n method: 'GET',\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Health check failed with status ${response.status}: ${errorText}`,\n );\n }\n\n const healthInfo = (await response.json()) as any;\n this.logger.debug(`HTTP retrieval server status:`, healthInfo);\n\n return {\n status: healthInfo.status || 'UNKNOWN',\n database: healthInfo.database || 'UNKNOWN',\n embedder: healthInfo.embedder || 'UNKNOWN',\n cache_size: healthInfo.cache_size || 0,\n cache_ttl: healthInfo.cache_ttl || 0,\n version: healthInfo.version || 'unknown',\n };\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Error checking HTTP server health: ${error.message}`);\n throw new Error(\n `Unable to connect to HTTP server ${this.baseUrl}: ${error.message}`,\n );\n }\n }\n\n /**\n * Execute a retrieval query on a snapshot\n * @param snapshotHash - SHA256 hash of the codebase snapshot\n * @param queryText - Natural language query for retrieval\n * @param budgetTokens - Maximum token budget for results (default: 3000)\n * @param options - Optional retrieval parameters\n * @returns Retrieval results with formatted output\n * @throws Error on query failures\n */\n async query(\n snapshotHash: string,\n queryText: string,\n budgetTokens: number = 3000,\n options?: RetrievalOptions,\n ): Promise<RetrievalResult> {\n if (!snapshotHash) {\n throw new Error('Snapshot hash must be provided');\n }\n if (!queryText) {\n throw new Error('Query text must be provided');\n }\n if (budgetTokens < 100) {\n throw new Error('Budget tokens must be at least 100');\n }\n\n const startTime = Date.now();\n const jwt = await this.jwtProvider.getJWT();\n const queryEndpoint = `${this.apiBase}query`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const requestBody: any = {\n snapshot_hash: snapshotHash,\n query: queryText,\n budget_tokens: budgetTokens,\n };\n\n if (options) {\n requestBody.options = options;\n }\n\n const response = await fetch(queryEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${jwt}`,\n },\n body: JSON.stringify(requestBody),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.status === 404) {\n const errorData = (await response.json()) as any;\n throw new Error(\n errorData.detail || 'Snapshot not found or access denied',\n );\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Query failed with status ${response.status}: ${errorText}`,\n );\n }\n\n const result = (await response.json()) as RetrievalResult;\n\n const elapsedTime = (Date.now() - startTime) / 1000;\n const formatter = options?.formatter || 'standard';\n this.logger.debug(\n `Retrieval query completed for snapshot ${snapshotHash.substring(0, 8)}... ` +\n `Formatter: ${formatter}. Total time: ${elapsedTime.toFixed(2)}s`,\n );\n\n return result;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Error executing retrieval query: ${error.message}`);\n throw new Error(`Failed to execute retrieval query: ${error.message}`);\n }\n }\n\n /**\n * Check if a snapshot is indexed and ready for retrieval\n * @param snapshotHash - SHA256 hash of the snapshot to check\n * @param jwt - JWT token for authorization (required)\n * @returns Snapshot status information\n * @throws Error on status check failures\n */\n async checkSnapshotStatus(snapshotHash: string): Promise<SnapshotStatus> {\n if (!snapshotHash) {\n throw new Error('Snapshot hash must be provided');\n }\n\n const jwt = await this.jwtProvider.getJWT();\n const statusEndpoint = `${this.apiBase}snapshots/${snapshotHash}/status`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(statusEndpoint, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${jwt}`,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.status === 404) {\n return {\n snapshot_hash: snapshotHash,\n status: 'NOT_FOUND',\n message: 'Snapshot not found or access denied',\n };\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Status check failed with status ${response.status}: ${errorText}`,\n );\n }\n\n const statusInfo = (await response.json()) as SnapshotStatus;\n this.logger.debug(\n `Snapshot ${snapshotHash.substring(0, 8)}... status: ${statusInfo.status}`,\n );\n\n return statusInfo;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Error checking snapshot status: ${error.message}`);\n throw new Error(`Failed to check snapshot status: ${error.message}`);\n }\n }\n\n /**\n * Clear the graph cache (admin operation)\n * @param jwt - JWT token for authorization (required)\n * @returns true if cache cleared successfully\n * @throws Error on cache clear failures\n */\n async clearCache(): Promise<boolean> {\n const jwt = await this.jwtProvider.getJWT();\n const cacheEndpoint = `${this.apiBase}cache`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(cacheEndpoint, {\n method: 'DELETE',\n headers: {\n Authorization: `Bearer ${jwt}`,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Cache clear failed with status ${response.status}: ${errorText}`,\n );\n }\n\n this.logger.info('Graph cache cleared successfully');\n return true;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Error clearing cache: ${error.message}`);\n throw new Error(`Failed to clear cache: ${error.message}`);\n }\n }\n\n /**\n * Get cache statistics\n * @param jwt - JWT token for authorization (required)\n * @returns Cache statistics\n * @throws Error on stats retrieval failures\n */\n async getCacheStats(): Promise<CacheStats> {\n const jwt = await this.jwtProvider.getJWT();\n const statsEndpoint = `${this.apiBase}cache/stats`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(statsEndpoint, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${jwt}`,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Stats retrieval failed with status ${response.status}: ${errorText}`,\n );\n }\n\n const stats = (await response.json()) as CacheStats;\n this.logger.debug(\n `Cache stats: ${stats.cached_snapshots || 0} snapshots cached`,\n );\n\n return stats;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Error getting cache stats: ${error.message}`);\n throw new Error(`Failed to get cache stats: ${error.message}`);\n }\n }\n\n /**\n * Convenience method for querying with specific options\n * @param snapshotHash - SHA256 hash of the codebase snapshot\n * @param queryText - Natural language query for retrieval\n * @param jwt - JWT token for authorization (required)\n * @param budgetTokens - Maximum token budget for results\n * @param flowStrength - Flow intensity multiplier\n * @param blendAlpha - Blending factor for scores\n * @param hopDepth - Depth of local neighborhood\n * @param maxIterations - Maximum flood-walk iterations\n * @param split - Fraction of budget for full chunks\n * @param formatter - Output format \"standard\" or \"compact\"\n * @returns Retrieval results\n */\n async queryWithOptions(\n snapshotHash: string,\n queryText: string,\n budgetTokens: number = 3000,\n flowStrength: number = 1.5,\n blendAlpha: number = 0.8,\n hopDepth: number = 2,\n maxIterations: number = 12,\n split: number = 0.8,\n formatter: 'standard' | 'compact' = 'standard',\n ): Promise<RetrievalResult> {\n const options: RetrievalOptions = {\n flow_strength: flowStrength,\n blend_alpha: blendAlpha,\n hop_depth: hopDepth,\n max_iterations: maxIterations,\n split,\n formatter,\n };\n\n return this.query(snapshotHash, queryText, budgetTokens, options);\n }\n\n /**\n * Close the HTTP client connection (no-op for fetch)\n */\n close(): void {\n // fetch doesn't maintain persistent connections, so nothing to close\n }\n}\n","/**\n * HTTP client SDK for AST service\n * Using fetch with automatic polyfill for Node.js < 18\n */\n\nimport fetch, { AbortController } from '../utils/fetch-wrapper';\nimport { JWTProvider } from '../utils/jwt-factory';\nimport { Logger, nullLogger } from '../utils/logger';\n\ninterface VisitorRulesV2 {\n format: 'segments+exts@v2';\n include_extensions: string[];\n include_filenames: string[];\n exclude_dirnames: string[];\n}\n\ninterface HealthStatus {\n status: 'OK' | 'NOT_READY';\n message: string;\n frontends_loaded: number;\n info: Record<string, string>;\n}\n\nexport interface ASTClientConfig {\n baseUrl?: string;\n timeout?: number;\n jwtProvider: JWTProvider;\n logger?: Logger;\n}\n\nexport class ASTHttpClient {\n private baseUrl!: string;\n private timeout: number;\n private apiBase!: string;\n private readonly jwtProvider: JWTProvider;\n private readonly logger: Logger;\n\n /**\n * Initialize the AST HTTP client\n * @param config.baseUrl - URI/URL for connecting to the HTTP server (e.g., \"http://localhost:8003\")\n * @param config.timeout - Request timeout in milliseconds (default: 60000)\n * @param config.jwtProvider - Provider for obtaining JWT tokens\n * @param config.logger - Optional logger instance (defaults to nullLogger)\n */\n constructor({\n baseUrl = 'http://localhost:8003',\n timeout = 60000,\n jwtProvider,\n logger,\n }: ASTClientConfig) {\n if (!jwtProvider) {\n throw new Error('ASTHttpClient requires a JWT provider');\n }\n\n this.timeout = timeout;\n this.jwtProvider = jwtProvider;\n this.logger = logger ?? nullLogger;\n this.configureBase(baseUrl);\n }\n\n updateBaseUrl(baseUrl: string): void {\n this.configureBase(baseUrl);\n }\n\n private configureBase(uri: string): void {\n let processedUri = uri;\n if (!uri.startsWith('http://') && !uri.startsWith('https://')) {\n processedUri = `http://${uri}`;\n }\n\n const url = new URL(processedUri);\n\n if (url.pathname && url.pathname !== '/') {\n this.baseUrl = `${url.protocol}//${url.host}${url.pathname}`;\n } else {\n this.baseUrl = `${url.protocol}//${url.host}`;\n }\n\n if (this.baseUrl.endsWith('/')) {\n this.apiBase = `${this.baseUrl}api/ast/`;\n } else {\n this.apiBase = `${this.baseUrl}/api/ast/`;\n }\n }\n\n /**\n * Get file visitor rules in v2 format optimized for Chokidar v4\n * @returns Visitor rules with format, include_extensions, include_filenames, exclude_dirnames\n * @throws Error on HTTP errors or connection errors\n */\n async getVisitorRulesV2(): Promise<VisitorRulesV2> {\n const jwt = await this.jwtProvider.getJWT();\n const url = `${this.apiBase}visitor-rules`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${jwt}`,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Failed to get visitor rules v2 with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as VisitorRulesV2;\n\n // Validate the format\n if (data.format !== 'segments+exts@v2') {\n throw new Error(`Unexpected visitor rules format: ${data.format}`);\n }\n\n return data;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Failed to get visitor rules v2: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Check the health status of the AST service\n * @returns Health status information\n * @throws Error on HTTP errors or connection errors\n */\n async health(): Promise<HealthStatus> {\n const url = `${this.apiBase}health`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method: 'GET',\n // No authentication required for health check\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Health check failed with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as HealthStatus;\n return data;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Health check failed: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Compile visitor rules v2 for use with Chokidar v4\n * This is a helper method that compiles the rules into a format\n * that can be directly used with Chokidar's ignored option\n * @param rules - The visitor rules v2 from the server\n * @returns Compiled rules with Sets and RegExp for efficient matching\n */\n static compileRulesV2(rules: VisitorRulesV2): {\n exts: Set<string>;\n names: Set<string>;\n dirRe: RegExp;\n dirs: Set<string>;\n } {\n if (rules.format !== 'segments+exts@v2') {\n throw new Error(`Unsupported rules format: ${rules.format}`);\n }\n\n const exts = new Set(rules.include_extensions.map((e) => e.toLowerCase()));\n const names = new Set(rules.include_filenames.map((n) => n.toLowerCase()));\n const dirs = new Set(rules.exclude_dirnames.map((n) => n.toLowerCase()));\n\n // Escape special regex characters\n const escapeRe = (s: string) => s.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&');\n\n // One regex to prune excluded dir segments anywhere in the path\n const dirRe = new RegExp(\n `(?:^|[\\\\/])(?:${[...dirs].map(escapeRe).join('|')})(?:[\\\\/]|$)`,\n 'i',\n );\n\n return { exts, names, dirRe, dirs };\n }\n\n /**\n * Build Chokidar v4 `ignored` predicate from compiled rules\n * @param compiled - Compiled rules from compileRulesV2\n * @returns Predicate function that returns true to ignore, false to watch\n */\n static buildIgnoredPredicate(\n compiled: ReturnType<typeof ASTHttpClient.compileRulesV2>,\n ): (path: string, stats?: any) => boolean {\n return (p: string, stats?: any) => {\n // Normalize path to posix style\n const posix = p.replace(/\\\\/g, '/');\n const parts = posix.split('/').map((segment) => segment.toLowerCase());\n\n const isDirectory = stats?.isDirectory?.() ?? false;\n\n // If the current path is a directory and it matches the excluded set, ignore it.\n if (isDirectory) {\n const current = parts[parts.length - 1];\n if (compiled.dirs.has(current)) {\n return true;\n }\n return false;\n }\n\n // For files, ignore if any parent directory is excluded\n const parentDirs = parts.slice(0, -1);\n if (parentDirs.some((segment) => compiled.dirs.has(segment))) {\n return true;\n }\n\n // 2) File allowlist by basename or extension\n const base = posix.split('/').pop()?.toLowerCase() || '';\n if (compiled.names.has(base)) return false;\n\n const extIndex = base.lastIndexOf('.');\n const ext = extIndex > -1 ? base.slice(extIndex).toLowerCase() : '';\n if (!compiled.exts.has(ext)) return true;\n\n return false;\n };\n }\n\n /**\n * Close the HTTP client connection (no-op for fetch)\n */\n close(): void {\n // fetch doesn't maintain persistent connections, so nothing to close\n }\n}\n\n// Export types for external use\nexport type { VisitorRulesV2, HealthStatus };\n","import { AuthHttpClient, decodeJWT } from '../clients/auth-client';\n\nimport { Logger, nullLogger } from './logger';\n\nexport interface JWTProvider {\n getJWT(forceRefresh?: boolean): Promise<string>;\n}\n\nexport interface TokenRefreshInfo {\n token: string;\n expiresAt: number;\n serverUrl?: string;\n}\n\ninterface JWTCacheEntry {\n token: string;\n expiresAt: number;\n refreshAt: number;\n fetchedAt: number;\n serverUrl?: string;\n}\n\nexport interface JWTFactoryOptions {\n /**\n * Minimum amount of time (ms) a token must remain valid. Defaults to 5s.\n * If the upstream reports an expiry sooner than this, we treat the token as\n * already expired and immediately refresh it on next request.\n */\n minTtlMs?: number;\n /**\n * Optional callback invoked whenever a new JWT is fetched successfully.\n */\n onTokenRefreshed?: (info: TokenRefreshInfo) => void;\n /**\n * Optional logger instance (defaults to nullLogger)\n */\n logger?: Logger;\n}\n\nconst DEFAULT_MIN_TTL_MS = 5_000;\n\n/**\n * Provides short-lived JWTs issued by the Auth service.\n * Tokens are cached and refreshed once half of their lifetime has elapsed.\n */\nexport class JWTFactory implements JWTProvider {\n private cache?: JWTCacheEntry;\n private refreshPromise?: Promise<string>;\n private readonly minTtlMs: number;\n private readonly onTokenRefreshed?: (info: TokenRefreshInfo) => void;\n private currentServerUrl?: string;\n private readonly logger: Logger;\n\n constructor(\n private readonly authClient: AuthHttpClient,\n private sourceToken: string,\n options: JWTFactoryOptions = {},\n ) {\n if (!sourceToken) {\n throw new Error('JWTFactory requires a non-empty source token');\n }\n\n this.minTtlMs = options.minTtlMs ?? DEFAULT_MIN_TTL_MS;\n this.onTokenRefreshed = options.onTokenRefreshed;\n this.logger = options.logger ?? nullLogger;\n }\n\n setSourceToken(token: string): void {\n if (!token) {\n throw new Error('JWTFactory requires a non-empty source token');\n }\n\n if (token !== this.sourceToken) {\n this.sourceToken = token;\n this.cache = undefined;\n this.currentServerUrl = undefined;\n }\n }\n\n invalidate(): void {\n this.cache = undefined;\n this.currentServerUrl = undefined;\n }\n\n async getJWT(forceRefresh = false): Promise<string> {\n const now = Date.now();\n\n if (!forceRefresh && this.cache) {\n if (now < this.cache.expiresAt) {\n if (now < this.cache.refreshAt) {\n return this.cache.token;\n }\n // Half-life reached; allow subsequent logic to refresh\n } else {\n this.cache = undefined;\n }\n }\n\n return this.refresh(now, forceRefresh);\n }\n\n private async refresh(now: number, forceRefresh: boolean): Promise<string> {\n if (!this.refreshPromise) {\n this.refreshPromise = this.fetchNewToken().finally(() => {\n this.refreshPromise = undefined;\n });\n }\n\n try {\n return await this.refreshPromise;\n } catch (error) {\n if (!forceRefresh && this.cache && now < this.cache.expiresAt) {\n this.logger.warn(\n 'Failed to refresh JWT, using cached token until expiry. Reason:',\n error,\n );\n return this.cache.token;\n }\n throw error;\n }\n }\n\n private async fetchNewToken(): Promise<string> {\n const response = await this.authClient.authenticate(this.sourceToken);\n const fetchedAt = Date.now();\n\n const expiresAt = this.resolveExpiryMs(\n response.jwt,\n response.expires_at,\n fetchedAt,\n );\n\n const payload = decodeJWT(response.jwt);\n const serverUrl = this.extractServerUrl(payload);\n\n const halfLife = Math.max((expiresAt - fetchedAt) / 2, this.minTtlMs);\n const refreshAt = fetchedAt + halfLife;\n\n this.cache = {\n token: response.jwt,\n expiresAt,\n refreshAt,\n fetchedAt,\n serverUrl,\n };\n this.currentServerUrl = serverUrl;\n\n this.emitTokenRefreshed({\n token: response.jwt,\n expiresAt,\n serverUrl,\n });\n\n return response.jwt;\n }\n\n private resolveExpiryMs(\n jwt: string,\n expiresAt: string | undefined,\n referenceTime: number,\n ): number {\n if (expiresAt) {\n const parsed = Date.parse(expiresAt);\n if (!Number.isNaN(parsed) && parsed > referenceTime + this.minTtlMs) {\n return parsed;\n }\n }\n\n const decoded = decodeJWT(jwt, this.logger);\n if (decoded?.exp) {\n const expMs = decoded.exp * 1000;\n if (expMs > referenceTime + this.minTtlMs) {\n return expMs;\n }\n }\n\n // Fall back to a conservative 60 second lifetime.\n return referenceTime + Math.max(this.minTtlMs, 60_000);\n }\n\n private extractServerUrl(\n payload: ReturnType<typeof decodeJWT>,\n ): string | undefined {\n const possibleUrl = payload?.server_url;\n if (typeof possibleUrl === 'string' && possibleUrl.trim()) {\n return possibleUrl.trim();\n }\n return undefined;\n }\n\n private emitTokenRefreshed(info: TokenRefreshInfo): void {\n if (this.onTokenRefreshed) {\n try {\n this.onTokenRefreshed(info);\n } catch (error) {\n this.logger.warn('JWTFactory onTokenRefreshed callback failed:', error);\n }\n }\n }\n\n getServerUrl(): string | undefined {\n return this.currentServerUrl ?? this.cache?.serverUrl;\n }\n}\n","import { AuthHttpClient } from './clients/auth-client';\nimport { ASTHttpClient } from './clients/ast-client';\nimport { RetrievalHttpClient } from './clients/retrieval-client';\nimport { SyncHttpClient } from './clients/sync-client';\nimport {\n JWTFactory,\n JWTFactoryOptions,\n JWTProvider,\n TokenRefreshInfo,\n} from './utils/jwt-factory';\nimport { Logger, nullLogger } from './utils/logger';\n\nexport type ServiceKey = 'auth' | 'ast' | 'retrieval' | 'sync';\n\nexport interface ServiceConfig {\n baseUrl?: string;\n timeout?: number;\n}\n\nexport interface CoderuleClientOptions {\n token: string;\n baseUrl?: string;\n auth?: ServiceConfig;\n ast?: ServiceConfig;\n retrieval?: ServiceConfig;\n sync?: ServiceConfig;\n jwtFactory?: JWTFactoryOptions;\n logger?: Logger;\n}\n\nconst DEFAULT_AUTH_BASE_URL = 'https://r.coderule.ai:16803';\nconst DEFAULT_SERVICE_BASE_URL = 'https://s1.coderule.ai:16803';\n\nconst DEFAULT_TIMEOUTS: Record<ServiceKey, number> = {\n auth: 30_000,\n ast: 60_000,\n retrieval: 60_000,\n sync: 60_000,\n};\n\nfunction resolveOverrides(\n options: CoderuleClientOptions,\n): Partial<Record<ServiceKey, ServiceConfig>> {\n return {\n auth: options.auth,\n ast: options.ast,\n retrieval: options.retrieval,\n sync: options.sync,\n };\n}\n\nfunction resolveTimeout(\n service: ServiceKey,\n overrides: Partial<Record<ServiceKey, ServiceConfig>>,\n): number {\n return overrides[service]?.timeout ?? DEFAULT_TIMEOUTS[service];\n}\n\nexport class CoderuleClients {\n readonly auth: AuthHttpClient;\n readonly ast: ASTHttpClient;\n readonly retrieval: RetrievalHttpClient;\n readonly sync: SyncHttpClient;\n readonly jwtFactory: JWTFactory;\n private readonly serviceBaseLocked: Record<\n 'ast' | 'retrieval' | 'sync',\n boolean\n >;\n private lastServerUrl?: string;\n private readonly logger: Logger;\n\n constructor(options: CoderuleClientOptions) {\n if (!options?.token) {\n throw new Error('CoderuleClients requires a non-empty token');\n }\n\n this.logger = options.logger ?? nullLogger;\n const overrides = resolveOverrides(options);\n const baseUrl = options.baseUrl;\n\n const authBase =\n overrides.auth?.baseUrl ?? baseUrl ?? DEFAULT_AUTH_BASE_URL;\n const authTimeout = resolveTimeout('auth', overrides);\n this.auth = new AuthHttpClient(authBase, authTimeout, this.logger);\n\n const userTokenCallback = options.jwtFactory?.onTokenRefreshed;\n const jwtOptions: JWTFactoryOptions = {\n ...options.jwtFactory,\n logger: this.logger,\n onTokenRefreshed: (info: TokenRefreshInfo) => {\n userTokenCallback?.(info);\n if (info.serverUrl) {\n this.applyServerUrl(info.serverUrl);\n }\n },\n };\n\n this.jwtFactory = new JWTFactory(this.auth, options.token, jwtOptions);\n\n this.serviceBaseLocked = {\n ast: Boolean(overrides.ast?.baseUrl),\n retrieval: Boolean(overrides.retrieval?.baseUrl),\n sync: Boolean(overrides.sync?.baseUrl),\n };\n\n const defaultServiceBase = baseUrl ?? DEFAULT_SERVICE_BASE_URL;\n\n this.ast = new ASTHttpClient({\n baseUrl: overrides.ast?.baseUrl ?? defaultServiceBase,\n timeout: resolveTimeout('ast', overrides),\n jwtProvider: this.jwtFactory,\n logger: this.logger,\n });\n\n this.retrieval = new RetrievalHttpClient({\n baseUrl: overrides.retrieval?.baseUrl ?? defaultServiceBase,\n timeout: resolveTimeout('retrieval', overrides),\n jwtProvider: this.jwtFactory,\n logger: this.logger,\n });\n\n this.sync = new SyncHttpClient({\n baseUrl: overrides.sync?.baseUrl ?? defaultServiceBase,\n timeout: resolveTimeout('sync', overrides),\n jwtProvider: this.jwtFactory,\n logger: this.logger,\n });\n\n const initialServerUrl = this.jwtFactory.getServerUrl();\n if (initialServerUrl) {\n this.applyServerUrl(initialServerUrl);\n }\n }\n\n get jwt(): JWTProvider {\n return this.jwtFactory;\n }\n\n async getJWT(forceRefresh = false): Promise<string> {\n return this.jwtFactory.getJWT(forceRefresh);\n }\n\n setToken(token: string): void {\n this.jwtFactory.setSourceToken(token);\n }\n\n close(): void {\n // Keep symmetry with individual clients.\n this.ast.close();\n this.retrieval.close();\n this.sync.close();\n this.auth.close();\n }\n\n private applyServerUrl(serverUrl: string): void {\n const trimmed = serverUrl.trim();\n if (!trimmed || this.lastServerUrl === trimmed) {\n return;\n }\n\n this.lastServerUrl = trimmed;\n\n try {\n if (!this.serviceBaseLocked.ast) {\n this.ast.updateBaseUrl(trimmed);\n }\n } catch (error) {\n this.logger.warn('Failed to update AST client base URL:', error);\n }\n\n try {\n if (!this.serviceBaseLocked.retrieval) {\n this.retrieval.updateBaseUrl(trimmed);\n }\n } catch (error) {\n this.logger.warn('Failed to update Retrieval client base URL:', error);\n }\n\n try {\n if (!this.serviceBaseLocked.sync) {\n this.sync.updateBaseUrl(trimmed);\n }\n } catch (error) {\n this.logger.warn('Failed to update Sync client base URL:', error);\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../node_modules/tsup/assets/cjs_shims.js","../src/polyfills/fetch-polyfill.ts","../src/index.ts","../src/clients/auth-client.ts","../src/utils/fetch-wrapper.ts","../src/utils/logger.ts","../src/clients/sync-client.ts","../src/clients/retrieval-client.ts","../src/clients/ast-client.ts","../src/utils/jwt-factory.ts","../src/coderule-clients.ts"],"names":["fetch","FormData","AbortController","data","crypto"],"mappings":"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","file":"index.cjs","sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () =>\n typeof document === 'undefined'\n ? new URL(`file:${__filename}`).href\n : (document.currentScript && document.currentScript.src) ||\n new URL('main.js', document.baseURI).href\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","/**\n * Polyfill for Node.js < 18\n */\n\n// Dynamic import to avoid errors when node-fetch is not installed\nlet nodeFetch: any;\nlet NodeHeaders: any;\nlet NodeRequest: any;\nlet NodeResponse: any;\nlet NodeFormData: any;\nlet NodeAbortController: any;\n\ntry {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const module = require('node-fetch');\n nodeFetch = module.default || module;\n NodeHeaders = module.Headers;\n NodeRequest = module.Request;\n NodeResponse = module.Response;\n\n // FormData might be in a separate package for node-fetch v2\n try {\n NodeFormData =\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n module.FormData || require('formdata-polyfill/esm.min.js').FormData;\n } catch {\n NodeFormData = class FormData {\n constructor() {\n throw new Error(\n 'FormData is not available. Install formdata-polyfill if needed.',\n );\n }\n };\n }\n\n // AbortController is built-in since Node 15\n NodeAbortController = globalThis.AbortController || module.AbortController;\n} catch {\n throw new Error(\n 'For Node.js < 18, please install node-fetch: npm install node-fetch@2',\n );\n}\n\nexport const fetch = nodeFetch;\nexport const Headers = NodeHeaders;\nexport const Request = NodeRequest;\nexport const Response = NodeResponse;\nexport const FormData = NodeFormData;\nexport const AbortController = NodeAbortController;\n","/**\n * Coderule TypeScript Client SDK\n *\n * HTTP clients for core Coderule microservices with automatic fetch polyfill.\n * Works with Node.js 14+ (uses node-fetch for < 18, native fetch for 18+).\n */\n\n// Export all clients\nexport { AuthHttpClient, decodeJWT } from './clients/auth-client';\nexport {\n SyncHttpClient,\n type SyncClientConfig,\n type SnapshotTimingMetrics,\n type SnapshotStatus,\n} from './clients/sync-client';\nexport {\n RetrievalHttpClient,\n type RetrievalClientConfig,\n} from './clients/retrieval-client';\nexport { ASTHttpClient, type ASTClientConfig } from './clients/ast-client';\n\n// Export types\nexport type { VisitorRulesV2, HealthStatus } from './clients/ast-client';\n\nexport {\n JWTFactory,\n type JWTFactoryOptions,\n type JWTProvider,\n type TokenRefreshInfo,\n} from './utils/jwt-factory';\n\nexport {\n CoderuleClients,\n type CoderuleClientOptions,\n type ServiceConfig,\n type ServiceKey,\n} from './coderule-clients';\n\n// Export logger utilities\nexport { Logger, nullLogger, consoleLogger } from './utils/logger';\n\n// Export fetch utilities if needed by consumers\nexport { default as fetch } from './utils/fetch-wrapper';\n","/**\n * HTTP client SDK for Auth service\n * Using fetch with automatic polyfill for Node.js < 18\n */\n\nimport fetch, { AbortController } from '../utils/fetch-wrapper';\nimport { Logger, nullLogger } from '../utils/logger';\n\ninterface AuthResponse {\n jwt: string;\n expires_at: string;\n}\n\ninterface HealthResponse {\n status: string;\n version?: string;\n [key: string]: any;\n}\n\nexport class AuthHttpClient {\n private baseUrl: string;\n private timeout: number;\n private readonly logger: Logger;\n\n /**\n * Initialize the Auth HTTP client\n * @param baseUrl - Base URL of the Auth service (e.g., \"http://localhost:8001\")\n * @param timeout - Request timeout in milliseconds (default: 30000)\n * @param logger - Optional logger instance (defaults to nullLogger)\n */\n constructor(baseUrl: string, timeout: number = 30000, logger?: Logger) {\n this.baseUrl = baseUrl.replace(/\\/$/, '');\n this.timeout = timeout;\n this.logger = logger ?? nullLogger;\n }\n\n /**\n * Authenticate a token and receive a JWT\n * @param token - Authentication token\n * @returns Response containing JWT and expiration\n * @throws Error on HTTP errors or connection errors\n */\n async authenticate(token: string): Promise<AuthResponse> {\n const url = `${this.baseUrl}/api/auth/authenticate`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ token }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Authentication failed with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as AuthResponse;\n this.logger.debug(\n `Authentication successful, JWT expires at ${data.expires_at}`,\n );\n return data;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Authentication request failed: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Check the health status of the Auth service\n * @returns Health status information\n * @throws Error on HTTP errors or connection errors\n */\n async health(): Promise<HealthResponse> {\n const url = `${this.baseUrl}/api/auth/health`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method: 'GET',\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Health check failed with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as HealthResponse;\n this.logger.debug(`Health check: ${data.status}`);\n return data;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Health check request failed: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Close the HTTP client connection (no-op for fetch)\n */\n close(): void {\n // fetch doesn't maintain persistent connections, so nothing to close\n }\n}\n\n/**\n * Simple JWT payload interface\n */\ninterface JWTPayload {\n [key: string]: any;\n exp?: number;\n iat?: number;\n nbf?: number;\n}\n\n/**\n * Verify a JWT token (utility function for other services)\n * Note: This is a simplified version that only decodes the payload.\n * For proper verification, you would need a JWT library to verify the signature.\n * @param jwtToken - JWT token to verify\n * @param logger - Optional logger instance\n * @returns Decoded JWT payload if valid, null if invalid\n */\nexport function decodeJWT(\n jwtToken: string,\n logger?: Logger,\n): JWTPayload | null {\n try {\n // Split the JWT into its three parts\n const parts = jwtToken.split('.');\n if (parts.length !== 3) {\n return null;\n }\n\n // Decode the payload (second part)\n const payload = parts[1];\n // Add padding if necessary\n const paddedPayload = payload + '='.repeat((4 - (payload.length % 4)) % 4);\n\n // Decode base64url to base64\n const base64 = paddedPayload.replace(/-/g, '+').replace(/_/g, '/');\n\n // Decode base64 to string\n const jsonString = Buffer.from(base64, 'base64').toString('utf8');\n\n // Parse JSON\n const payloadObj: JWTPayload = JSON.parse(jsonString);\n\n // Check if token is expired\n if (payloadObj.exp) {\n const now = Math.floor(Date.now() / 1000);\n if (payloadObj.exp < now) {\n if (logger) logger.debug('JWT token is expired');\n return null;\n }\n }\n\n return payloadObj;\n } catch (error) {\n if (logger) logger.error('Failed to decode JWT:', error);\n return null;\n }\n}\n\n/**\n * Note: For actual JWT verification with signature validation,\n * you would need to use a proper JWT library like 'jsonwebtoken'.\n * This implementation only decodes and checks expiration.\n */\n","/**\n * Smart fetch wrapper that automatically uses native fetch or polyfill\n */\n\n// Check if native fetch is available (Node.js 18+ or browser)\nconst hasNativeFetch = typeof globalThis.fetch !== 'undefined';\n\ninterface FetchModule {\n fetch: typeof globalThis.fetch;\n Headers: typeof globalThis.Headers;\n Request: typeof globalThis.Request;\n Response: typeof globalThis.Response;\n FormData: typeof globalThis.FormData;\n AbortController: typeof globalThis.AbortController;\n}\n\nlet fetchModule: FetchModule;\n\nif (hasNativeFetch) {\n // Use native fetch\n fetchModule = {\n fetch: globalThis.fetch,\n Headers: globalThis.Headers,\n Request: globalThis.Request,\n Response: globalThis.Response,\n FormData: globalThis.FormData,\n AbortController: globalThis.AbortController,\n };\n} else {\n // Try to load polyfill for older Node.js versions\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n fetchModule = require('../polyfills/fetch-polyfill');\n } catch {\n throw new Error(\n `This library requires Node.js 18+ or the node-fetch package.\\n` +\n `Please either:\\n` +\n `1. Upgrade to Node.js 18 or later, or\\n` +\n `2. Install node-fetch: npm install node-fetch@2`,\n );\n }\n}\n\n// Export fetch and related APIs\nexport const fetch = fetchModule.fetch;\nexport const Headers = fetchModule.Headers;\nexport const Request = fetchModule.Request;\nexport const Response = fetchModule.Response;\nexport const FormData = fetchModule.FormData;\nexport const AbortController = fetchModule.AbortController;\n\n// Export default fetch for convenience\nexport default fetch;\n","/**\n * Logger interface for Coderule clients\n * Provides a standard logging interface that can be implemented by any logging library\n */\n\nexport interface Logger {\n error(message: string, ...meta: unknown[]): void;\n warn(message: string, ...meta: unknown[]): void;\n info(message: string, ...meta: unknown[]): void;\n debug(message: string, ...meta: unknown[]): void;\n}\n\n/**\n * Silent logger implementation that does nothing\n * This is the default logger used when no logger is provided\n */\nexport const nullLogger: Logger = {\n error: () => {},\n warn: () => {},\n info: () => {},\n debug: () => {},\n};\n\n/**\n * Console logger implementation that outputs to console\n * Useful for development and debugging\n */\nexport const consoleLogger: Logger = {\n error: (message: string, ...meta: unknown[]) =>\n console.error(message, ...meta),\n warn: (message: string, ...meta: unknown[]) => console.warn(message, ...meta),\n info: (message: string, ...meta: unknown[]) => console.info(message, ...meta),\n debug: (message: string, ...meta: unknown[]) =>\n console.debug(message, ...meta),\n};\n","/**\n * HTTP client SDK for Sync service\n * Using fetch with automatic polyfill for Node.js < 18\n */\n\nimport * as crypto from 'crypto';\n\nimport fetch, { AbortController, FormData } from '../utils/fetch-wrapper';\nimport { JWTProvider } from '../utils/jwt-factory';\nimport { Logger, nullLogger } from '../utils/logger';\n\n/**\n * Timing telemetry metrics for snapshot indexing\n */\nexport interface SnapshotTimingMetrics {\n /** Pass 1 duration: oldest file creation to newest file ready (seconds) */\n pass1?: number;\n /** Pass 2 duration: total cross-reference resolution time (seconds) */\n pass2?: number;\n /** Gap between newest file ready and Pass 2 start (seconds) */\n gap?: number;\n /** Total HDF5 compilation time (seconds) */\n pass2_hdf5_compile?: number;\n /** Chunk/edge/FQN deduplication time (seconds) */\n pass2_hdf5_dedup?: number;\n /** Raw HDF5 file I/O time (seconds) */\n pass2_hdf5_write?: number;\n /** Bush ID used for this snapshot */\n bush_id?: number;\n /** Total number of files indexed */\n total_files?: number;\n /** Total number of chunks created */\n total_chunks?: number;\n /** Total number of classes found */\n total_classes?: number;\n /** Total number of methods found */\n total_methods?: number;\n}\n\nexport interface SnapshotStatus {\n status:\n | 'NOT_FOUND'\n | 'READY'\n | 'INDEXING'\n | 'PENDING'\n | 'FAILED'\n | 'MISSING_CONTENT';\n snapshot_hash?: string;\n created_at?: string;\n updated_at?: string;\n /** Timing and summary metrics (available when status is READY) */\n timing?: SnapshotTimingMetrics;\n missing_files?: Array<{ file_path: string; file_hash: string }>;\n message?: string;\n [key: string]: any;\n}\n\ninterface FileInfo {\n file_path: string;\n file_hash: string;\n}\n\ninterface UploadResult {\n uploaded_count: number;\n failed_count: number;\n failed_files?: string[];\n}\n\ninterface HealthResponse {\n status: string;\n database?: string;\n version?: string;\n [key: string]: any;\n}\n\nexport interface SyncClientConfig {\n baseUrl?: string;\n timeout?: number;\n jwtProvider: JWTProvider;\n logger?: Logger;\n}\n\nexport class SyncHttpClient {\n private baseUrl!: string;\n private timeout: number;\n private apiBase!: string;\n private readonly jwtProvider: JWTProvider;\n private readonly logger: Logger;\n\n /**\n * Initialize the Sync HTTP client\n * @param config.baseUrl - URI/URL for connecting to the HTTP server (e.g., \"http://localhost:8002\")\n * @param config.timeout - Request timeout in milliseconds (default: 60000)\n * @param config.jwtProvider - Provider for obtaining JWT tokens\n * @param config.logger - Optional logger instance (defaults to nullLogger)\n */\n constructor({\n baseUrl = 'http://localhost:8002',\n timeout = 60000,\n jwtProvider,\n logger,\n }: SyncClientConfig) {\n if (!jwtProvider) {\n throw new Error('SyncHttpClient requires a JWT provider');\n }\n\n this.timeout = timeout;\n this.jwtProvider = jwtProvider;\n this.logger = logger ?? nullLogger;\n this.configureBase(baseUrl);\n }\n\n updateBaseUrl(baseUrl: string): void {\n this.configureBase(baseUrl);\n }\n\n private configureBase(uri: string): void {\n let processedUri = uri;\n if (!uri.startsWith('http://') && !uri.startsWith('https://')) {\n processedUri = `http://${uri}`;\n }\n\n const url = new URL(processedUri);\n\n if (url.pathname && url.pathname !== '/') {\n this.baseUrl = `${url.protocol}//${url.host}${url.pathname}`;\n } else {\n this.baseUrl = `${url.protocol}//${url.host}`;\n }\n\n if (this.baseUrl.endsWith('/')) {\n this.apiBase = `${this.baseUrl}sync/v1/`;\n } else {\n this.apiBase = `${this.baseUrl}/sync/v1/`;\n }\n }\n\n /**\n * Check the status of a snapshot\n * @param snapshotHash - SHA256 hash of the snapshot\n * @returns Snapshot status information\n * @throws Error on HTTP errors or connection errors\n */\n async checkSnapshotStatus(snapshotHash: string): Promise<SnapshotStatus> {\n if (!snapshotHash) {\n throw new Error('Snapshot hash must be provided');\n }\n\n const jwt = await this.jwtProvider.getJWT();\n const url = `${this.apiBase}snapshots`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${jwt}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ snapshot_hash: snapshotHash }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.status === 404) {\n return { status: 'NOT_FOUND' };\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Failed to check snapshot with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as SnapshotStatus;\n return data;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Request failed: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Create a new snapshot or get its status if it exists\n * @param snapshotHash - SHA256 hash of the snapshot\n * @param files - List of file information with 'file_path' and 'file_hash'\n * @returns Snapshot creation result or status\n * @throws Error on HTTP errors or connection errors\n */\n async createSnapshot(\n snapshotHash: string,\n files: FileInfo[],\n ): Promise<SnapshotStatus> {\n if (!snapshotHash) {\n throw new Error('Snapshot hash must be provided');\n }\n\n const jwt = await this.jwtProvider.getJWT();\n const url = `${this.apiBase}snapshots`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${jwt}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n snapshot_hash: snapshotHash,\n files: files,\n }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.status === 422) {\n // Missing content\n const data = (await response.json()) as SnapshotStatus;\n this.logger.info(\n `Snapshot ${snapshotHash.substring(0, 8)}... missing ${data.missing_files?.length || 0} files`,\n );\n return data;\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Failed to create snapshot with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as SnapshotStatus;\n this.logger.info(\n `Snapshot ${snapshotHash.substring(0, 8)}... status: ${data.status}`,\n );\n return data;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Request failed: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Upload file content to the service\n * @param filesContent - Map of file_hash to object with 'path' and 'content'\n * @returns Upload result with counts\n * @throws Error on HTTP errors or connection errors\n */\n async uploadFileContent(\n filesContent: Map<string, { path: string; content: Buffer | string }>,\n ): Promise<UploadResult> {\n const jwt = await this.jwtProvider.getJWT();\n const url = `${this.apiBase}files/content`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n // Create FormData for multipart upload\n const formData = new FormData();\n\n for (const [fileHash, fileData] of filesContent.entries()) {\n const content =\n typeof fileData.content === 'string'\n ? Buffer.from(fileData.content)\n : fileData.content;\n\n // Create a Blob from the Buffer\n const blob = new Blob([content], { type: 'application/octet-stream' });\n\n // Append to form data with filename as the file path\n formData.append(fileHash, blob, fileData.path);\n }\n\n // Remove Content-Type from headers for multipart (browser sets it)\n const uploadHeaders = {\n Authorization: `Bearer ${jwt}`,\n };\n\n const response = await fetch(url, {\n method: 'POST',\n headers: uploadHeaders,\n body: formData,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Failed to upload files with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as UploadResult;\n this.logger.info(\n `Uploaded ${data.uploaded_count || 0} files, ${data.failed_count || 0} failed`,\n );\n return data;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Request failed: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Calculate file hash from path and content\n * @param filePath - Relative file path\n * @param content - File content as Buffer or string\n * @returns SHA256 hash of the file\n */\n static calculateFileHash(filePath: string, content: Buffer | string): string {\n const contentBuffer =\n typeof content === 'string' ? Buffer.from(content) : content;\n const fileData = Buffer.concat([\n Buffer.from(`${filePath}\\n`, 'utf-8'),\n contentBuffer,\n ]);\n return crypto.createHash('sha256').update(fileData).digest('hex');\n }\n\n /**\n * Calculate snapshot hash from file hashes\n * @param fileHashes - Array of file SHA256 hashes\n * @returns SHA256 hash of the snapshot\n */\n static calculateSnapshotHash(fileHashes: string[]): string {\n const snapshotData = fileHashes.sort().join('\\n');\n return crypto\n .createHash('sha256')\n .update(snapshotData, 'utf-8')\n .digest('hex');\n }\n\n /**\n * Check the health status of the Sync service\n * @returns Health status information\n * @throws Error on HTTP errors or connection errors\n */\n async health(): Promise<HealthResponse> {\n const url = `${this.apiBase}health`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method: 'GET',\n // No authentication required for health check\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Health check failed with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as HealthResponse;\n return data;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Request failed: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Truncate all database tables and clean RabbitMQ queue\n *\n * **DANGER**: This deletes ALL data from the database and message queue.\n * Should only be used in development/testing environments.\n *\n * @param adminToken - Admin token for authentication\n * @returns Promise with success message\n * @throws Error on HTTP errors (including 401/403 for auth failures) or connection errors\n */\n async truncate(\n adminToken: string,\n ): Promise<{ status: string; message: string }> {\n const url = `${this.baseUrl}/admin/truncate`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'X-Admin-Token': adminToken,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Truncate failed with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as {\n status: string;\n message: string;\n };\n this.logger.warn(`Database truncated: ${data.message}`);\n return data;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Request failed: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Close the HTTP client connection (no-op for fetch)\n */\n close(): void {\n // fetch doesn't maintain persistent connections, so nothing to close\n }\n}\n","/**\n * HTTP client SDK for Retrieval service\n * Using fetch with automatic polyfill for Node.js < 18\n */\n\nimport fetch, { AbortController } from '../utils/fetch-wrapper';\nimport { JWTProvider } from '../utils/jwt-factory';\nimport { Logger, nullLogger } from '../utils/logger';\n\ninterface HealthResponse {\n status: string;\n database?: string;\n embedder?: string;\n cache_size?: number;\n cache_ttl?: number;\n version?: string;\n}\n\ninterface RetrievalOptions {\n flow_strength?: number; // Flow intensity multiplier (default: 1.5)\n blend_alpha?: number; // Blending factor for scores (default: 0.8)\n hop_depth?: number; // Depth of local neighborhood (default: 2)\n max_iterations?: number; // Maximum flood-walk iterations (default: 12)\n split?: number; // Fraction of budget for full chunks (default: 0.8)\n formatter?: 'standard' | 'compact'; // Output format (default: 'standard')\n}\n\ninterface RetrievalResult {\n formatted_output: string;\n [key: string]: any;\n}\n\ninterface SnapshotStatus {\n snapshot_hash: string;\n status: 'PENDING' | 'INDEXING' | 'READY' | 'FAILED' | 'NOT_FOUND';\n indexed_at?: string;\n total_files?: number;\n total_chunks?: number;\n message?: string;\n}\n\ninterface CacheStats {\n cached_snapshots: number;\n max_size: number;\n ttl: number;\n snapshots: string[];\n}\n\nexport interface RetrievalClientConfig {\n baseUrl?: string;\n timeout?: number;\n jwtProvider: JWTProvider;\n logger?: Logger;\n}\n\nexport class RetrievalHttpClient {\n private baseUrl!: string;\n private timeout: number;\n private apiBase!: string;\n private readonly jwtProvider: JWTProvider;\n private readonly logger: Logger;\n\n /**\n * Initialize the Retrieval HTTP client\n * @param config.baseUrl - URI/URL for connecting to the HTTP server (e.g., \"http://localhost:8004\")\n * @param config.timeout - Request timeout in milliseconds (default: 60000)\n * @param config.jwtProvider - Provider for obtaining JWT tokens\n * @param config.logger - Optional logger instance (defaults to nullLogger)\n */\n constructor({\n baseUrl = 'http://localhost:8004',\n timeout = 60000,\n jwtProvider,\n logger,\n }: RetrievalClientConfig) {\n if (!jwtProvider) {\n throw new Error('RetrievalHttpClient requires a JWT provider');\n }\n\n this.timeout = timeout;\n this.jwtProvider = jwtProvider;\n this.logger = logger ?? nullLogger;\n this.configureBase(baseUrl);\n\n this.logger.debug(`Initialized HTTP client for ${this.baseUrl}`);\n this.logger.debug(`API base: ${this.apiBase}`);\n }\n\n updateBaseUrl(baseUrl: string): void {\n this.configureBase(baseUrl);\n }\n\n private configureBase(uri: string): void {\n let processedUri = uri;\n if (!uri.startsWith('http://') && !uri.startsWith('https://')) {\n processedUri = `http://${uri}`;\n }\n\n const url = new URL(processedUri);\n\n if (url.pathname && url.pathname !== '/') {\n this.baseUrl = `${url.protocol}//${url.host}${url.pathname}`;\n } else {\n this.baseUrl = `${url.protocol}//${url.host}`;\n }\n\n if (this.baseUrl.endsWith('/')) {\n this.apiBase = `${this.baseUrl}api/retrieval/`;\n } else {\n this.apiBase = `${this.baseUrl}/api/retrieval/`;\n }\n }\n\n /**\n * Check the health status of the Retrieval service\n * @returns Health status information\n * @throws Error on connection errors\n */\n async healthCheck(): Promise<HealthResponse> {\n const healthEndpoint = `${this.apiBase}health`;\n this.logger.debug(`Checking server health: ${healthEndpoint}`);\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(healthEndpoint, {\n method: 'GET',\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Health check failed with status ${response.status}: ${errorText}`,\n );\n }\n\n const healthInfo = (await response.json()) as any;\n this.logger.debug(`HTTP retrieval server status:`, healthInfo);\n\n return {\n status: healthInfo.status || 'UNKNOWN',\n database: healthInfo.database || 'UNKNOWN',\n embedder: healthInfo.embedder || 'UNKNOWN',\n cache_size: healthInfo.cache_size || 0,\n cache_ttl: healthInfo.cache_ttl || 0,\n version: healthInfo.version || 'unknown',\n };\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Error checking HTTP server health: ${error.message}`);\n throw new Error(\n `Unable to connect to HTTP server ${this.baseUrl}: ${error.message}`,\n );\n }\n }\n\n /**\n * Execute a retrieval query on a snapshot\n * @param snapshotHash - SHA256 hash of the codebase snapshot\n * @param queryText - Natural language query for retrieval\n * @param budgetTokens - Maximum token budget for results (default: 3000)\n * @param options - Optional retrieval parameters\n * @returns Retrieval results with formatted output\n * @throws Error on query failures\n */\n async query(\n snapshotHash: string,\n queryText: string,\n budgetTokens: number = 3000,\n options?: RetrievalOptions,\n ): Promise<RetrievalResult> {\n if (!snapshotHash) {\n throw new Error('Snapshot hash must be provided');\n }\n if (!queryText) {\n throw new Error('Query text must be provided');\n }\n if (budgetTokens < 100) {\n throw new Error('Budget tokens must be at least 100');\n }\n\n const startTime = Date.now();\n const jwt = await this.jwtProvider.getJWT();\n const queryEndpoint = `${this.apiBase}query`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const requestBody: any = {\n snapshot_hash: snapshotHash,\n query: queryText,\n budget_tokens: budgetTokens,\n };\n\n if (options) {\n requestBody.options = options;\n }\n\n const response = await fetch(queryEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${jwt}`,\n },\n body: JSON.stringify(requestBody),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.status === 404) {\n const errorData = (await response.json()) as any;\n throw new Error(\n errorData.detail || 'Snapshot not found or access denied',\n );\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Query failed with status ${response.status}: ${errorText}`,\n );\n }\n\n const result = (await response.json()) as RetrievalResult;\n\n const elapsedTime = (Date.now() - startTime) / 1000;\n const formatter = options?.formatter || 'standard';\n this.logger.debug(\n `Retrieval query completed for snapshot ${snapshotHash.substring(0, 8)}... ` +\n `Formatter: ${formatter}. Total time: ${elapsedTime.toFixed(2)}s`,\n );\n\n return result;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Error executing retrieval query: ${error.message}`);\n throw new Error(`Failed to execute retrieval query: ${error.message}`);\n }\n }\n\n /**\n * Check if a snapshot is indexed and ready for retrieval\n * @param snapshotHash - SHA256 hash of the snapshot to check\n * @param jwt - JWT token for authorization (required)\n * @returns Snapshot status information\n * @throws Error on status check failures\n */\n async checkSnapshotStatus(snapshotHash: string): Promise<SnapshotStatus> {\n if (!snapshotHash) {\n throw new Error('Snapshot hash must be provided');\n }\n\n const jwt = await this.jwtProvider.getJWT();\n const statusEndpoint = `${this.apiBase}snapshots/${snapshotHash}/status`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(statusEndpoint, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${jwt}`,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.status === 404) {\n return {\n snapshot_hash: snapshotHash,\n status: 'NOT_FOUND',\n message: 'Snapshot not found or access denied',\n };\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Status check failed with status ${response.status}: ${errorText}`,\n );\n }\n\n const statusInfo = (await response.json()) as SnapshotStatus;\n this.logger.debug(\n `Snapshot ${snapshotHash.substring(0, 8)}... status: ${statusInfo.status}`,\n );\n\n return statusInfo;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Error checking snapshot status: ${error.message}`);\n throw new Error(`Failed to check snapshot status: ${error.message}`);\n }\n }\n\n /**\n * Clear the graph cache (admin operation)\n * @param jwt - JWT token for authorization (required)\n * @returns true if cache cleared successfully\n * @throws Error on cache clear failures\n */\n async clearCache(): Promise<boolean> {\n const jwt = await this.jwtProvider.getJWT();\n const cacheEndpoint = `${this.apiBase}cache`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(cacheEndpoint, {\n method: 'DELETE',\n headers: {\n Authorization: `Bearer ${jwt}`,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Cache clear failed with status ${response.status}: ${errorText}`,\n );\n }\n\n this.logger.info('Graph cache cleared successfully');\n return true;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Error clearing cache: ${error.message}`);\n throw new Error(`Failed to clear cache: ${error.message}`);\n }\n }\n\n /**\n * Get cache statistics\n * @param jwt - JWT token for authorization (required)\n * @returns Cache statistics\n * @throws Error on stats retrieval failures\n */\n async getCacheStats(): Promise<CacheStats> {\n const jwt = await this.jwtProvider.getJWT();\n const statsEndpoint = `${this.apiBase}cache/stats`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(statsEndpoint, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${jwt}`,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Stats retrieval failed with status ${response.status}: ${errorText}`,\n );\n }\n\n const stats = (await response.json()) as CacheStats;\n this.logger.debug(\n `Cache stats: ${stats.cached_snapshots || 0} snapshots cached`,\n );\n\n return stats;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Error getting cache stats: ${error.message}`);\n throw new Error(`Failed to get cache stats: ${error.message}`);\n }\n }\n\n /**\n * Convenience method for querying with specific options\n * @param snapshotHash - SHA256 hash of the codebase snapshot\n * @param queryText - Natural language query for retrieval\n * @param jwt - JWT token for authorization (required)\n * @param budgetTokens - Maximum token budget for results\n * @param flowStrength - Flow intensity multiplier\n * @param blendAlpha - Blending factor for scores\n * @param hopDepth - Depth of local neighborhood\n * @param maxIterations - Maximum flood-walk iterations\n * @param split - Fraction of budget for full chunks\n * @param formatter - Output format \"standard\" or \"compact\"\n * @returns Retrieval results\n */\n async queryWithOptions(\n snapshotHash: string,\n queryText: string,\n budgetTokens: number = 3000,\n flowStrength: number = 1.5,\n blendAlpha: number = 0.8,\n hopDepth: number = 2,\n maxIterations: number = 12,\n split: number = 0.8,\n formatter: 'standard' | 'compact' = 'standard',\n ): Promise<RetrievalResult> {\n const options: RetrievalOptions = {\n flow_strength: flowStrength,\n blend_alpha: blendAlpha,\n hop_depth: hopDepth,\n max_iterations: maxIterations,\n split,\n formatter,\n };\n\n return this.query(snapshotHash, queryText, budgetTokens, options);\n }\n\n /**\n * Close the HTTP client connection (no-op for fetch)\n */\n close(): void {\n // fetch doesn't maintain persistent connections, so nothing to close\n }\n}\n","/**\n * HTTP client SDK for AST service\n * Using fetch with automatic polyfill for Node.js < 18\n */\n\nimport fetch, { AbortController } from '../utils/fetch-wrapper';\nimport { JWTProvider } from '../utils/jwt-factory';\nimport { Logger, nullLogger } from '../utils/logger';\n\ninterface VisitorRulesV2 {\n format: 'segments+exts@v2';\n include_extensions: string[];\n include_filenames: string[];\n exclude_dirnames: string[];\n}\n\ninterface HealthStatus {\n status: 'OK' | 'NOT_READY';\n message: string;\n frontends_loaded: number;\n info: Record<string, string>;\n}\n\nexport interface ASTClientConfig {\n baseUrl?: string;\n timeout?: number;\n jwtProvider: JWTProvider;\n logger?: Logger;\n}\n\nexport class ASTHttpClient {\n private baseUrl!: string;\n private timeout: number;\n private apiBase!: string;\n private readonly jwtProvider: JWTProvider;\n private readonly logger: Logger;\n\n /**\n * Initialize the AST HTTP client\n * @param config.baseUrl - URI/URL for connecting to the HTTP server (e.g., \"http://localhost:8003\")\n * @param config.timeout - Request timeout in milliseconds (default: 60000)\n * @param config.jwtProvider - Provider for obtaining JWT tokens\n * @param config.logger - Optional logger instance (defaults to nullLogger)\n */\n constructor({\n baseUrl = 'http://localhost:8003',\n timeout = 60000,\n jwtProvider,\n logger,\n }: ASTClientConfig) {\n if (!jwtProvider) {\n throw new Error('ASTHttpClient requires a JWT provider');\n }\n\n this.timeout = timeout;\n this.jwtProvider = jwtProvider;\n this.logger = logger ?? nullLogger;\n this.configureBase(baseUrl);\n }\n\n updateBaseUrl(baseUrl: string): void {\n this.configureBase(baseUrl);\n }\n\n private configureBase(uri: string): void {\n let processedUri = uri;\n if (!uri.startsWith('http://') && !uri.startsWith('https://')) {\n processedUri = `http://${uri}`;\n }\n\n const url = new URL(processedUri);\n\n if (url.pathname && url.pathname !== '/') {\n this.baseUrl = `${url.protocol}//${url.host}${url.pathname}`;\n } else {\n this.baseUrl = `${url.protocol}//${url.host}`;\n }\n\n if (this.baseUrl.endsWith('/')) {\n this.apiBase = `${this.baseUrl}api/ast/`;\n } else {\n this.apiBase = `${this.baseUrl}/api/ast/`;\n }\n }\n\n /**\n * Get file visitor rules in v2 format optimized for Chokidar v4\n * @returns Visitor rules with format, include_extensions, include_filenames, exclude_dirnames\n * @throws Error on HTTP errors or connection errors\n */\n async getVisitorRulesV2(): Promise<VisitorRulesV2> {\n const jwt = await this.jwtProvider.getJWT();\n const url = `${this.apiBase}visitor-rules`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${jwt}`,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Failed to get visitor rules v2 with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as VisitorRulesV2;\n\n // Validate the format\n if (data.format !== 'segments+exts@v2') {\n throw new Error(`Unexpected visitor rules format: ${data.format}`);\n }\n\n return data;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Failed to get visitor rules v2: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Check the health status of the AST service\n * @returns Health status information\n * @throws Error on HTTP errors or connection errors\n */\n async health(): Promise<HealthStatus> {\n const url = `${this.apiBase}health`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method: 'GET',\n // No authentication required for health check\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Health check failed with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as HealthStatus;\n return data;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Health check failed: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Compile visitor rules v2 for use with Chokidar v4\n * This is a helper method that compiles the rules into a format\n * that can be directly used with Chokidar's ignored option\n * @param rules - The visitor rules v2 from the server\n * @returns Compiled rules with Sets and RegExp for efficient matching\n */\n static compileRulesV2(rules: VisitorRulesV2): {\n exts: Set<string>;\n names: Set<string>;\n dirRe: RegExp;\n dirs: Set<string>;\n } {\n if (rules.format !== 'segments+exts@v2') {\n throw new Error(`Unsupported rules format: ${rules.format}`);\n }\n\n const exts = new Set(rules.include_extensions.map((e) => e.toLowerCase()));\n const names = new Set(rules.include_filenames.map((n) => n.toLowerCase()));\n const dirs = new Set(rules.exclude_dirnames.map((n) => n.toLowerCase()));\n\n // Escape special regex characters\n const escapeRe = (s: string) => s.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&');\n\n // One regex to prune excluded dir segments anywhere in the path\n const dirRe = new RegExp(\n `(?:^|[\\\\/])(?:${[...dirs].map(escapeRe).join('|')})(?:[\\\\/]|$)`,\n 'i',\n );\n\n return { exts, names, dirRe, dirs };\n }\n\n /**\n * Build Chokidar v4 `ignored` predicate from compiled rules\n * @param compiled - Compiled rules from compileRulesV2\n * @returns Predicate function that returns true to ignore, false to watch\n */\n static buildIgnoredPredicate(\n compiled: ReturnType<typeof ASTHttpClient.compileRulesV2>,\n ): (path: string, stats?: any) => boolean {\n return (p: string, stats?: any) => {\n // Normalize path to posix style\n const posix = p.replace(/\\\\/g, '/');\n const parts = posix.split('/').map((segment) => segment.toLowerCase());\n\n const isDirectory = stats?.isDirectory?.() ?? false;\n\n // If the current path is a directory and it matches the excluded set, ignore it.\n if (isDirectory) {\n const current = parts[parts.length - 1];\n if (compiled.dirs.has(current)) {\n return true;\n }\n return false;\n }\n\n // For files, ignore if any parent directory is excluded\n const parentDirs = parts.slice(0, -1);\n if (parentDirs.some((segment) => compiled.dirs.has(segment))) {\n return true;\n }\n\n // 2) File allowlist by basename or extension\n const base = posix.split('/').pop()?.toLowerCase() || '';\n if (compiled.names.has(base)) return false;\n\n const extIndex = base.lastIndexOf('.');\n const ext = extIndex > -1 ? base.slice(extIndex).toLowerCase() : '';\n if (!compiled.exts.has(ext)) return true;\n\n return false;\n };\n }\n\n /**\n * Close the HTTP client connection (no-op for fetch)\n */\n close(): void {\n // fetch doesn't maintain persistent connections, so nothing to close\n }\n}\n\n// Export types for external use\nexport type { VisitorRulesV2, HealthStatus };\n","import { AuthHttpClient, decodeJWT } from '../clients/auth-client';\n\nimport { Logger, nullLogger } from './logger';\n\nexport interface JWTProvider {\n getJWT(forceRefresh?: boolean): Promise<string>;\n}\n\nexport interface TokenRefreshInfo {\n token: string;\n expiresAt: number;\n serverUrl?: string;\n}\n\ninterface JWTCacheEntry {\n token: string;\n expiresAt: number;\n refreshAt: number;\n fetchedAt: number;\n serverUrl?: string;\n}\n\nexport interface JWTFactoryOptions {\n /**\n * Minimum amount of time (ms) a token must remain valid. Defaults to 5s.\n * If the upstream reports an expiry sooner than this, we treat the token as\n * already expired and immediately refresh it on next request.\n */\n minTtlMs?: number;\n /**\n * Optional callback invoked whenever a new JWT is fetched successfully.\n */\n onTokenRefreshed?: (info: TokenRefreshInfo) => void;\n /**\n * Optional logger instance (defaults to nullLogger)\n */\n logger?: Logger;\n}\n\nconst DEFAULT_MIN_TTL_MS = 5_000;\n\n/**\n * Provides short-lived JWTs issued by the Auth service.\n * Tokens are cached and refreshed once half of their lifetime has elapsed.\n */\nexport class JWTFactory implements JWTProvider {\n private cache?: JWTCacheEntry;\n private refreshPromise?: Promise<string>;\n private readonly minTtlMs: number;\n private readonly onTokenRefreshed?: (info: TokenRefreshInfo) => void;\n private currentServerUrl?: string;\n private readonly logger: Logger;\n\n constructor(\n private readonly authClient: AuthHttpClient,\n private sourceToken: string,\n options: JWTFactoryOptions = {},\n ) {\n if (!sourceToken) {\n throw new Error('JWTFactory requires a non-empty source token');\n }\n\n this.minTtlMs = options.minTtlMs ?? DEFAULT_MIN_TTL_MS;\n this.onTokenRefreshed = options.onTokenRefreshed;\n this.logger = options.logger ?? nullLogger;\n }\n\n setSourceToken(token: string): void {\n if (!token) {\n throw new Error('JWTFactory requires a non-empty source token');\n }\n\n if (token !== this.sourceToken) {\n this.sourceToken = token;\n this.cache = undefined;\n this.currentServerUrl = undefined;\n }\n }\n\n invalidate(): void {\n this.cache = undefined;\n this.currentServerUrl = undefined;\n }\n\n async getJWT(forceRefresh = false): Promise<string> {\n const now = Date.now();\n\n if (!forceRefresh && this.cache) {\n if (now < this.cache.expiresAt) {\n if (now < this.cache.refreshAt) {\n return this.cache.token;\n }\n // Half-life reached; allow subsequent logic to refresh\n } else {\n this.cache = undefined;\n }\n }\n\n return this.refresh(now, forceRefresh);\n }\n\n private async refresh(now: number, forceRefresh: boolean): Promise<string> {\n if (!this.refreshPromise) {\n this.refreshPromise = this.fetchNewToken().finally(() => {\n this.refreshPromise = undefined;\n });\n }\n\n try {\n return await this.refreshPromise;\n } catch (error) {\n if (!forceRefresh && this.cache && now < this.cache.expiresAt) {\n this.logger.warn(\n 'Failed to refresh JWT, using cached token until expiry. Reason:',\n error,\n );\n return this.cache.token;\n }\n throw error;\n }\n }\n\n private async fetchNewToken(): Promise<string> {\n const response = await this.authClient.authenticate(this.sourceToken);\n const fetchedAt = Date.now();\n\n const expiresAt = this.resolveExpiryMs(\n response.jwt,\n response.expires_at,\n fetchedAt,\n );\n\n const payload = decodeJWT(response.jwt);\n const serverUrl = this.extractServerUrl(payload);\n\n const halfLife = Math.max((expiresAt - fetchedAt) / 2, this.minTtlMs);\n const refreshAt = fetchedAt + halfLife;\n\n this.cache = {\n token: response.jwt,\n expiresAt,\n refreshAt,\n fetchedAt,\n serverUrl,\n };\n this.currentServerUrl = serverUrl;\n\n this.emitTokenRefreshed({\n token: response.jwt,\n expiresAt,\n serverUrl,\n });\n\n return response.jwt;\n }\n\n private resolveExpiryMs(\n jwt: string,\n expiresAt: string | undefined,\n referenceTime: number,\n ): number {\n if (expiresAt) {\n const parsed = Date.parse(expiresAt);\n if (!Number.isNaN(parsed) && parsed > referenceTime + this.minTtlMs) {\n return parsed;\n }\n }\n\n const decoded = decodeJWT(jwt, this.logger);\n if (decoded?.exp) {\n const expMs = decoded.exp * 1000;\n if (expMs > referenceTime + this.minTtlMs) {\n return expMs;\n }\n }\n\n // Fall back to a conservative 60 second lifetime.\n return referenceTime + Math.max(this.minTtlMs, 60_000);\n }\n\n private extractServerUrl(\n payload: ReturnType<typeof decodeJWT>,\n ): string | undefined {\n const possibleUrl = payload?.server_url;\n if (typeof possibleUrl === 'string' && possibleUrl.trim()) {\n return possibleUrl.trim();\n }\n return undefined;\n }\n\n private emitTokenRefreshed(info: TokenRefreshInfo): void {\n if (this.onTokenRefreshed) {\n try {\n this.onTokenRefreshed(info);\n } catch (error) {\n this.logger.warn('JWTFactory onTokenRefreshed callback failed:', error);\n }\n }\n }\n\n getServerUrl(): string | undefined {\n return this.currentServerUrl ?? this.cache?.serverUrl;\n }\n}\n","import { AuthHttpClient } from './clients/auth-client';\nimport { ASTHttpClient } from './clients/ast-client';\nimport { RetrievalHttpClient } from './clients/retrieval-client';\nimport { SyncHttpClient } from './clients/sync-client';\nimport {\n JWTFactory,\n JWTFactoryOptions,\n JWTProvider,\n TokenRefreshInfo,\n} from './utils/jwt-factory';\nimport { Logger, nullLogger } from './utils/logger';\n\nexport type ServiceKey = 'auth' | 'ast' | 'retrieval' | 'sync';\n\nexport interface ServiceConfig {\n baseUrl?: string;\n timeout?: number;\n}\n\nexport interface CoderuleClientOptions {\n token: string;\n baseUrl?: string;\n auth?: ServiceConfig;\n ast?: ServiceConfig;\n retrieval?: ServiceConfig;\n sync?: ServiceConfig;\n jwtFactory?: JWTFactoryOptions;\n logger?: Logger;\n}\n\nconst DEFAULT_AUTH_BASE_URL = 'https://r.coderule.ai:16803';\nconst DEFAULT_SERVICE_BASE_URL = 'https://s1.coderule.ai:16803';\n\nconst DEFAULT_TIMEOUTS: Record<ServiceKey, number> = {\n auth: 30_000,\n ast: 60_000,\n retrieval: 60_000,\n sync: 60_000,\n};\n\nfunction resolveOverrides(\n options: CoderuleClientOptions,\n): Partial<Record<ServiceKey, ServiceConfig>> {\n return {\n auth: options.auth,\n ast: options.ast,\n retrieval: options.retrieval,\n sync: options.sync,\n };\n}\n\nfunction resolveTimeout(\n service: ServiceKey,\n overrides: Partial<Record<ServiceKey, ServiceConfig>>,\n): number {\n return overrides[service]?.timeout ?? DEFAULT_TIMEOUTS[service];\n}\n\nexport class CoderuleClients {\n readonly auth: AuthHttpClient;\n readonly ast: ASTHttpClient;\n readonly retrieval: RetrievalHttpClient;\n readonly sync: SyncHttpClient;\n readonly jwtFactory: JWTFactory;\n private readonly serviceBaseLocked: Record<\n 'ast' | 'retrieval' | 'sync',\n boolean\n >;\n private lastServerUrl?: string;\n private readonly logger: Logger;\n\n constructor(options: CoderuleClientOptions) {\n if (!options?.token) {\n throw new Error('CoderuleClients requires a non-empty token');\n }\n\n this.logger = options.logger ?? nullLogger;\n const overrides = resolveOverrides(options);\n const baseUrl = options.baseUrl;\n\n const authBase =\n overrides.auth?.baseUrl ?? baseUrl ?? DEFAULT_AUTH_BASE_URL;\n const authTimeout = resolveTimeout('auth', overrides);\n this.auth = new AuthHttpClient(authBase, authTimeout, this.logger);\n\n const userTokenCallback = options.jwtFactory?.onTokenRefreshed;\n const jwtOptions: JWTFactoryOptions = {\n ...options.jwtFactory,\n logger: this.logger,\n onTokenRefreshed: (info: TokenRefreshInfo) => {\n userTokenCallback?.(info);\n if (info.serverUrl) {\n this.applyServerUrl(info.serverUrl);\n }\n },\n };\n\n this.jwtFactory = new JWTFactory(this.auth, options.token, jwtOptions);\n\n this.serviceBaseLocked = {\n ast: Boolean(overrides.ast?.baseUrl),\n retrieval: Boolean(overrides.retrieval?.baseUrl),\n sync: Boolean(overrides.sync?.baseUrl),\n };\n\n const defaultServiceBase = baseUrl ?? DEFAULT_SERVICE_BASE_URL;\n\n this.ast = new ASTHttpClient({\n baseUrl: overrides.ast?.baseUrl ?? defaultServiceBase,\n timeout: resolveTimeout('ast', overrides),\n jwtProvider: this.jwtFactory,\n logger: this.logger,\n });\n\n this.retrieval = new RetrievalHttpClient({\n baseUrl: overrides.retrieval?.baseUrl ?? defaultServiceBase,\n timeout: resolveTimeout('retrieval', overrides),\n jwtProvider: this.jwtFactory,\n logger: this.logger,\n });\n\n this.sync = new SyncHttpClient({\n baseUrl: overrides.sync?.baseUrl ?? defaultServiceBase,\n timeout: resolveTimeout('sync', overrides),\n jwtProvider: this.jwtFactory,\n logger: this.logger,\n });\n\n const initialServerUrl = this.jwtFactory.getServerUrl();\n if (initialServerUrl) {\n this.applyServerUrl(initialServerUrl);\n }\n }\n\n get jwt(): JWTProvider {\n return this.jwtFactory;\n }\n\n async getJWT(forceRefresh = false): Promise<string> {\n return this.jwtFactory.getJWT(forceRefresh);\n }\n\n setToken(token: string): void {\n this.jwtFactory.setSourceToken(token);\n }\n\n close(): void {\n // Keep symmetry with individual clients.\n this.ast.close();\n this.retrieval.close();\n this.sync.close();\n this.auth.close();\n }\n\n private applyServerUrl(serverUrl: string): void {\n const trimmed = serverUrl.trim();\n if (!trimmed || this.lastServerUrl === trimmed) {\n return;\n }\n\n this.lastServerUrl = trimmed;\n\n try {\n if (!this.serviceBaseLocked.ast) {\n this.ast.updateBaseUrl(trimmed);\n }\n } catch (error) {\n this.logger.warn('Failed to update AST client base URL:', error);\n }\n\n try {\n if (!this.serviceBaseLocked.retrieval) {\n this.retrieval.updateBaseUrl(trimmed);\n }\n } catch (error) {\n this.logger.warn('Failed to update Retrieval client base URL:', error);\n }\n\n try {\n if (!this.serviceBaseLocked.sync) {\n this.sync.updateBaseUrl(trimmed);\n }\n } catch (error) {\n this.logger.warn('Failed to update Sync client base URL:', error);\n }\n }\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -71,7 +71,10 @@ interface SnapshotTimingMetrics {
71
71
  pass1?: number;
72
72
  pass2?: number;
73
73
  gap?: number;
74
- pass2db?: number;
74
+ pass2_hdf5_compile?: number;
75
+ pass2_hdf5_dedup?: number;
76
+ pass2_hdf5_write?: number;
77
+ bush_id?: number;
75
78
  total_files?: number;
76
79
  total_chunks?: number;
77
80
  total_classes?: number;
@@ -129,6 +132,10 @@ declare class SyncHttpClient {
129
132
  static calculateFileHash(filePath: string, content: Buffer | string): string;
130
133
  static calculateSnapshotHash(fileHashes: string[]): string;
131
134
  health(): Promise<HealthResponse$1>;
135
+ truncate(adminToken: string): Promise<{
136
+ status: string;
137
+ message: string;
138
+ }>;
132
139
  close(): void;
133
140
  }
134
141
 
package/dist/index.d.ts CHANGED
@@ -71,7 +71,10 @@ interface SnapshotTimingMetrics {
71
71
  pass1?: number;
72
72
  pass2?: number;
73
73
  gap?: number;
74
- pass2db?: number;
74
+ pass2_hdf5_compile?: number;
75
+ pass2_hdf5_dedup?: number;
76
+ pass2_hdf5_write?: number;
77
+ bush_id?: number;
75
78
  total_files?: number;
76
79
  total_chunks?: number;
77
80
  total_classes?: number;
@@ -129,6 +132,10 @@ declare class SyncHttpClient {
129
132
  static calculateFileHash(filePath: string, content: Buffer | string): string;
130
133
  static calculateSnapshotHash(fileHashes: string[]): string;
131
134
  health(): Promise<HealthResponse$1>;
135
+ truncate(adminToken: string): Promise<{
136
+ status: string;
137
+ message: string;
138
+ }>;
132
139
  close(): void;
133
140
  }
134
141
 
package/dist/index.js CHANGED
@@ -499,6 +499,46 @@ var SyncHttpClient = class {
499
499
  throw error;
500
500
  }
501
501
  }
502
+ /**
503
+ * Truncate all database tables and clean RabbitMQ queue
504
+ *
505
+ * **DANGER**: This deletes ALL data from the database and message queue.
506
+ * Should only be used in development/testing environments.
507
+ *
508
+ * @param adminToken - Admin token for authentication
509
+ * @returns Promise with success message
510
+ * @throws Error on HTTP errors (including 401/403 for auth failures) or connection errors
511
+ */
512
+ async truncate(adminToken) {
513
+ const url = `${this.baseUrl}/admin/truncate`;
514
+ const controller = new AbortController2();
515
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
516
+ try {
517
+ const response = await fetch_wrapper_default(url, {
518
+ method: "POST",
519
+ headers: {
520
+ "X-Admin-Token": adminToken
521
+ },
522
+ signal: controller.signal
523
+ });
524
+ clearTimeout(timeoutId);
525
+ if (!response.ok) {
526
+ const errorText = await response.text();
527
+ throw new Error(
528
+ `Truncate failed with status ${response.status}: ${errorText}`
529
+ );
530
+ }
531
+ const data = await response.json();
532
+ this.logger.warn(`Database truncated: ${data.message}`);
533
+ return data;
534
+ } catch (error) {
535
+ if (error.name === "AbortError") {
536
+ throw new Error(`Request timeout after ${this.timeout}ms`);
537
+ }
538
+ this.logger.error(`Request failed: ${error.message}`);
539
+ throw error;
540
+ }
541
+ }
502
542
  /**
503
543
  * Close the HTTP client connection (no-op for fetch)
504
544
  */
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js","../src/polyfills/fetch-polyfill.ts","../src/index.ts","../src/clients/auth-client.ts","../src/utils/fetch-wrapper.ts","../src/utils/logger.ts","../src/clients/sync-client.ts","../src/clients/retrieval-client.ts","../src/clients/ast-client.ts","../src/utils/jwt-factory.ts","../src/coderule-clients.ts"],"names":["fetch","FormData","AbortController","data"],"mappings":"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","file":"index.js","sourcesContent":["// Shim globals in esm bundle\nimport { fileURLToPath } from 'url'\nimport path from 'path'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","/**\n * Polyfill for Node.js < 18\n */\n\n// Dynamic import to avoid errors when node-fetch is not installed\nlet nodeFetch: any;\nlet NodeHeaders: any;\nlet NodeRequest: any;\nlet NodeResponse: any;\nlet NodeFormData: any;\nlet NodeAbortController: any;\n\ntry {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const module = require('node-fetch');\n nodeFetch = module.default || module;\n NodeHeaders = module.Headers;\n NodeRequest = module.Request;\n NodeResponse = module.Response;\n\n // FormData might be in a separate package for node-fetch v2\n try {\n NodeFormData =\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n module.FormData || require('formdata-polyfill/esm.min.js').FormData;\n } catch {\n NodeFormData = class FormData {\n constructor() {\n throw new Error(\n 'FormData is not available. Install formdata-polyfill if needed.',\n );\n }\n };\n }\n\n // AbortController is built-in since Node 15\n NodeAbortController = globalThis.AbortController || module.AbortController;\n} catch {\n throw new Error(\n 'For Node.js < 18, please install node-fetch: npm install node-fetch@2',\n );\n}\n\nexport const fetch = nodeFetch;\nexport const Headers = NodeHeaders;\nexport const Request = NodeRequest;\nexport const Response = NodeResponse;\nexport const FormData = NodeFormData;\nexport const AbortController = NodeAbortController;\n","/**\n * Coderule TypeScript Client SDK\n *\n * HTTP clients for core Coderule microservices with automatic fetch polyfill.\n * Works with Node.js 14+ (uses node-fetch for < 18, native fetch for 18+).\n */\n\n// Export all clients\nexport { AuthHttpClient, decodeJWT } from './clients/auth-client';\nexport {\n SyncHttpClient,\n type SyncClientConfig,\n type SnapshotTimingMetrics,\n type SnapshotStatus,\n} from './clients/sync-client';\nexport {\n RetrievalHttpClient,\n type RetrievalClientConfig,\n} from './clients/retrieval-client';\nexport { ASTHttpClient, type ASTClientConfig } from './clients/ast-client';\n\n// Export types\nexport type { VisitorRulesV2, HealthStatus } from './clients/ast-client';\n\nexport {\n JWTFactory,\n type JWTFactoryOptions,\n type JWTProvider,\n type TokenRefreshInfo,\n} from './utils/jwt-factory';\n\nexport {\n CoderuleClients,\n type CoderuleClientOptions,\n type ServiceConfig,\n type ServiceKey,\n} from './coderule-clients';\n\n// Export logger utilities\nexport { Logger, nullLogger, consoleLogger } from './utils/logger';\n\n// Export fetch utilities if needed by consumers\nexport { default as fetch } from './utils/fetch-wrapper';\n","/**\n * HTTP client SDK for Auth service\n * Using fetch with automatic polyfill for Node.js < 18\n */\n\nimport fetch, { AbortController } from '../utils/fetch-wrapper';\nimport { Logger, nullLogger } from '../utils/logger';\n\ninterface AuthResponse {\n jwt: string;\n expires_at: string;\n}\n\ninterface HealthResponse {\n status: string;\n version?: string;\n [key: string]: any;\n}\n\nexport class AuthHttpClient {\n private baseUrl: string;\n private timeout: number;\n private readonly logger: Logger;\n\n /**\n * Initialize the Auth HTTP client\n * @param baseUrl - Base URL of the Auth service (e.g., \"http://localhost:8001\")\n * @param timeout - Request timeout in milliseconds (default: 30000)\n * @param logger - Optional logger instance (defaults to nullLogger)\n */\n constructor(baseUrl: string, timeout: number = 30000, logger?: Logger) {\n this.baseUrl = baseUrl.replace(/\\/$/, '');\n this.timeout = timeout;\n this.logger = logger ?? nullLogger;\n }\n\n /**\n * Authenticate a token and receive a JWT\n * @param token - Authentication token\n * @returns Response containing JWT and expiration\n * @throws Error on HTTP errors or connection errors\n */\n async authenticate(token: string): Promise<AuthResponse> {\n const url = `${this.baseUrl}/api/auth/authenticate`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ token }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Authentication failed with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as AuthResponse;\n this.logger.debug(\n `Authentication successful, JWT expires at ${data.expires_at}`,\n );\n return data;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Authentication request failed: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Check the health status of the Auth service\n * @returns Health status information\n * @throws Error on HTTP errors or connection errors\n */\n async health(): Promise<HealthResponse> {\n const url = `${this.baseUrl}/api/auth/health`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method: 'GET',\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Health check failed with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as HealthResponse;\n this.logger.debug(`Health check: ${data.status}`);\n return data;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Health check request failed: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Close the HTTP client connection (no-op for fetch)\n */\n close(): void {\n // fetch doesn't maintain persistent connections, so nothing to close\n }\n}\n\n/**\n * Simple JWT payload interface\n */\ninterface JWTPayload {\n [key: string]: any;\n exp?: number;\n iat?: number;\n nbf?: number;\n}\n\n/**\n * Verify a JWT token (utility function for other services)\n * Note: This is a simplified version that only decodes the payload.\n * For proper verification, you would need a JWT library to verify the signature.\n * @param jwtToken - JWT token to verify\n * @param logger - Optional logger instance\n * @returns Decoded JWT payload if valid, null if invalid\n */\nexport function decodeJWT(\n jwtToken: string,\n logger?: Logger,\n): JWTPayload | null {\n try {\n // Split the JWT into its three parts\n const parts = jwtToken.split('.');\n if (parts.length !== 3) {\n return null;\n }\n\n // Decode the payload (second part)\n const payload = parts[1];\n // Add padding if necessary\n const paddedPayload = payload + '='.repeat((4 - (payload.length % 4)) % 4);\n\n // Decode base64url to base64\n const base64 = paddedPayload.replace(/-/g, '+').replace(/_/g, '/');\n\n // Decode base64 to string\n const jsonString = Buffer.from(base64, 'base64').toString('utf8');\n\n // Parse JSON\n const payloadObj: JWTPayload = JSON.parse(jsonString);\n\n // Check if token is expired\n if (payloadObj.exp) {\n const now = Math.floor(Date.now() / 1000);\n if (payloadObj.exp < now) {\n if (logger) logger.debug('JWT token is expired');\n return null;\n }\n }\n\n return payloadObj;\n } catch (error) {\n if (logger) logger.error('Failed to decode JWT:', error);\n return null;\n }\n}\n\n/**\n * Note: For actual JWT verification with signature validation,\n * you would need to use a proper JWT library like 'jsonwebtoken'.\n * This implementation only decodes and checks expiration.\n */\n","/**\n * Smart fetch wrapper that automatically uses native fetch or polyfill\n */\n\n// Check if native fetch is available (Node.js 18+ or browser)\nconst hasNativeFetch = typeof globalThis.fetch !== 'undefined';\n\ninterface FetchModule {\n fetch: typeof globalThis.fetch;\n Headers: typeof globalThis.Headers;\n Request: typeof globalThis.Request;\n Response: typeof globalThis.Response;\n FormData: typeof globalThis.FormData;\n AbortController: typeof globalThis.AbortController;\n}\n\nlet fetchModule: FetchModule;\n\nif (hasNativeFetch) {\n // Use native fetch\n fetchModule = {\n fetch: globalThis.fetch,\n Headers: globalThis.Headers,\n Request: globalThis.Request,\n Response: globalThis.Response,\n FormData: globalThis.FormData,\n AbortController: globalThis.AbortController,\n };\n} else {\n // Try to load polyfill for older Node.js versions\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n fetchModule = require('../polyfills/fetch-polyfill');\n } catch {\n throw new Error(\n `This library requires Node.js 18+ or the node-fetch package.\\n` +\n `Please either:\\n` +\n `1. Upgrade to Node.js 18 or later, or\\n` +\n `2. Install node-fetch: npm install node-fetch@2`,\n );\n }\n}\n\n// Export fetch and related APIs\nexport const fetch = fetchModule.fetch;\nexport const Headers = fetchModule.Headers;\nexport const Request = fetchModule.Request;\nexport const Response = fetchModule.Response;\nexport const FormData = fetchModule.FormData;\nexport const AbortController = fetchModule.AbortController;\n\n// Export default fetch for convenience\nexport default fetch;\n","/**\n * Logger interface for Coderule clients\n * Provides a standard logging interface that can be implemented by any logging library\n */\n\nexport interface Logger {\n error(message: string, ...meta: unknown[]): void;\n warn(message: string, ...meta: unknown[]): void;\n info(message: string, ...meta: unknown[]): void;\n debug(message: string, ...meta: unknown[]): void;\n}\n\n/**\n * Silent logger implementation that does nothing\n * This is the default logger used when no logger is provided\n */\nexport const nullLogger: Logger = {\n error: () => {},\n warn: () => {},\n info: () => {},\n debug: () => {},\n};\n\n/**\n * Console logger implementation that outputs to console\n * Useful for development and debugging\n */\nexport const consoleLogger: Logger = {\n error: (message: string, ...meta: unknown[]) =>\n console.error(message, ...meta),\n warn: (message: string, ...meta: unknown[]) => console.warn(message, ...meta),\n info: (message: string, ...meta: unknown[]) => console.info(message, ...meta),\n debug: (message: string, ...meta: unknown[]) =>\n console.debug(message, ...meta),\n};\n","/**\n * HTTP client SDK for Sync service\n * Using fetch with automatic polyfill for Node.js < 18\n */\n\nimport * as crypto from 'crypto';\n\nimport fetch, { AbortController, FormData } from '../utils/fetch-wrapper';\nimport { JWTProvider } from '../utils/jwt-factory';\nimport { Logger, nullLogger } from '../utils/logger';\n\n/**\n * Timing telemetry metrics for snapshot indexing\n */\nexport interface SnapshotTimingMetrics {\n /** Pass 1 duration: oldest file creation to newest file ready (seconds) */\n pass1?: number;\n /** Pass 2 duration: total cross-reference resolution time (seconds) */\n pass2?: number;\n /** Gap between newest file ready and Pass 2 start (seconds) */\n gap?: number;\n /** Pass 2 database operation time (seconds) */\n pass2db?: number;\n /** Total number of files indexed */\n total_files?: number;\n /** Total number of chunks created */\n total_chunks?: number;\n /** Total number of classes found */\n total_classes?: number;\n /** Total number of methods found */\n total_methods?: number;\n}\n\nexport interface SnapshotStatus {\n status:\n | 'NOT_FOUND'\n | 'READY'\n | 'INDEXING'\n | 'PENDING'\n | 'FAILED'\n | 'MISSING_CONTENT';\n snapshot_hash?: string;\n created_at?: string;\n updated_at?: string;\n /** Timing and summary metrics (available when status is READY) */\n timing?: SnapshotTimingMetrics;\n missing_files?: Array<{ file_path: string; file_hash: string }>;\n message?: string;\n [key: string]: any;\n}\n\ninterface FileInfo {\n file_path: string;\n file_hash: string;\n}\n\ninterface UploadResult {\n uploaded_count: number;\n failed_count: number;\n failed_files?: string[];\n}\n\ninterface HealthResponse {\n status: string;\n database?: string;\n version?: string;\n [key: string]: any;\n}\n\nexport interface SyncClientConfig {\n baseUrl?: string;\n timeout?: number;\n jwtProvider: JWTProvider;\n logger?: Logger;\n}\n\nexport class SyncHttpClient {\n private baseUrl!: string;\n private timeout: number;\n private apiBase!: string;\n private readonly jwtProvider: JWTProvider;\n private readonly logger: Logger;\n\n /**\n * Initialize the Sync HTTP client\n * @param config.baseUrl - URI/URL for connecting to the HTTP server (e.g., \"http://localhost:8002\")\n * @param config.timeout - Request timeout in milliseconds (default: 60000)\n * @param config.jwtProvider - Provider for obtaining JWT tokens\n * @param config.logger - Optional logger instance (defaults to nullLogger)\n */\n constructor({\n baseUrl = 'http://localhost:8002',\n timeout = 60000,\n jwtProvider,\n logger,\n }: SyncClientConfig) {\n if (!jwtProvider) {\n throw new Error('SyncHttpClient requires a JWT provider');\n }\n\n this.timeout = timeout;\n this.jwtProvider = jwtProvider;\n this.logger = logger ?? nullLogger;\n this.configureBase(baseUrl);\n }\n\n updateBaseUrl(baseUrl: string): void {\n this.configureBase(baseUrl);\n }\n\n private configureBase(uri: string): void {\n let processedUri = uri;\n if (!uri.startsWith('http://') && !uri.startsWith('https://')) {\n processedUri = `http://${uri}`;\n }\n\n const url = new URL(processedUri);\n\n if (url.pathname && url.pathname !== '/') {\n this.baseUrl = `${url.protocol}//${url.host}${url.pathname}`;\n } else {\n this.baseUrl = `${url.protocol}//${url.host}`;\n }\n\n if (this.baseUrl.endsWith('/')) {\n this.apiBase = `${this.baseUrl}sync/v1/`;\n } else {\n this.apiBase = `${this.baseUrl}/sync/v1/`;\n }\n }\n\n /**\n * Check the status of a snapshot\n * @param snapshotHash - SHA256 hash of the snapshot\n * @returns Snapshot status information\n * @throws Error on HTTP errors or connection errors\n */\n async checkSnapshotStatus(snapshotHash: string): Promise<SnapshotStatus> {\n if (!snapshotHash) {\n throw new Error('Snapshot hash must be provided');\n }\n\n const jwt = await this.jwtProvider.getJWT();\n const url = `${this.apiBase}snapshots`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${jwt}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ snapshot_hash: snapshotHash }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.status === 404) {\n return { status: 'NOT_FOUND' };\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Failed to check snapshot with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as SnapshotStatus;\n return data;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Request failed: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Create a new snapshot or get its status if it exists\n * @param snapshotHash - SHA256 hash of the snapshot\n * @param files - List of file information with 'file_path' and 'file_hash'\n * @returns Snapshot creation result or status\n * @throws Error on HTTP errors or connection errors\n */\n async createSnapshot(\n snapshotHash: string,\n files: FileInfo[],\n ): Promise<SnapshotStatus> {\n if (!snapshotHash) {\n throw new Error('Snapshot hash must be provided');\n }\n\n const jwt = await this.jwtProvider.getJWT();\n const url = `${this.apiBase}snapshots`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${jwt}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n snapshot_hash: snapshotHash,\n files: files,\n }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.status === 422) {\n // Missing content\n const data = (await response.json()) as SnapshotStatus;\n this.logger.info(\n `Snapshot ${snapshotHash.substring(0, 8)}... missing ${data.missing_files?.length || 0} files`,\n );\n return data;\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Failed to create snapshot with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as SnapshotStatus;\n this.logger.info(\n `Snapshot ${snapshotHash.substring(0, 8)}... status: ${data.status}`,\n );\n return data;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Request failed: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Upload file content to the service\n * @param filesContent - Map of file_hash to object with 'path' and 'content'\n * @returns Upload result with counts\n * @throws Error on HTTP errors or connection errors\n */\n async uploadFileContent(\n filesContent: Map<string, { path: string; content: Buffer | string }>,\n ): Promise<UploadResult> {\n const jwt = await this.jwtProvider.getJWT();\n const url = `${this.apiBase}files/content`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n // Create FormData for multipart upload\n const formData = new FormData();\n\n for (const [fileHash, fileData] of filesContent.entries()) {\n const content =\n typeof fileData.content === 'string'\n ? Buffer.from(fileData.content)\n : fileData.content;\n\n // Create a Blob from the Buffer\n const blob = new Blob([content], { type: 'application/octet-stream' });\n\n // Append to form data with filename as the file path\n formData.append(fileHash, blob, fileData.path);\n }\n\n // Remove Content-Type from headers for multipart (browser sets it)\n const uploadHeaders = {\n Authorization: `Bearer ${jwt}`,\n };\n\n const response = await fetch(url, {\n method: 'POST',\n headers: uploadHeaders,\n body: formData,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Failed to upload files with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as UploadResult;\n this.logger.info(\n `Uploaded ${data.uploaded_count || 0} files, ${data.failed_count || 0} failed`,\n );\n return data;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Request failed: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Calculate file hash from path and content\n * @param filePath - Relative file path\n * @param content - File content as Buffer or string\n * @returns SHA256 hash of the file\n */\n static calculateFileHash(filePath: string, content: Buffer | string): string {\n const contentBuffer =\n typeof content === 'string' ? Buffer.from(content) : content;\n const fileData = Buffer.concat([\n Buffer.from(`${filePath}\\n`, 'utf-8'),\n contentBuffer,\n ]);\n return crypto.createHash('sha256').update(fileData).digest('hex');\n }\n\n /**\n * Calculate snapshot hash from file hashes\n * @param fileHashes - Array of file SHA256 hashes\n * @returns SHA256 hash of the snapshot\n */\n static calculateSnapshotHash(fileHashes: string[]): string {\n const snapshotData = fileHashes.sort().join('\\n');\n return crypto\n .createHash('sha256')\n .update(snapshotData, 'utf-8')\n .digest('hex');\n }\n\n /**\n * Check the health status of the Sync service\n * @returns Health status information\n * @throws Error on HTTP errors or connection errors\n */\n async health(): Promise<HealthResponse> {\n const url = `${this.apiBase}health`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method: 'GET',\n // No authentication required for health check\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Health check failed with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as HealthResponse;\n return data;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Request failed: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Close the HTTP client connection (no-op for fetch)\n */\n close(): void {\n // fetch doesn't maintain persistent connections, so nothing to close\n }\n}\n","/**\n * HTTP client SDK for Retrieval service\n * Using fetch with automatic polyfill for Node.js < 18\n */\n\nimport fetch, { AbortController } from '../utils/fetch-wrapper';\nimport { JWTProvider } from '../utils/jwt-factory';\nimport { Logger, nullLogger } from '../utils/logger';\n\ninterface HealthResponse {\n status: string;\n database?: string;\n embedder?: string;\n cache_size?: number;\n cache_ttl?: number;\n version?: string;\n}\n\ninterface RetrievalOptions {\n flow_strength?: number; // Flow intensity multiplier (default: 1.5)\n blend_alpha?: number; // Blending factor for scores (default: 0.8)\n hop_depth?: number; // Depth of local neighborhood (default: 2)\n max_iterations?: number; // Maximum flood-walk iterations (default: 12)\n split?: number; // Fraction of budget for full chunks (default: 0.8)\n formatter?: 'standard' | 'compact'; // Output format (default: 'standard')\n}\n\ninterface RetrievalResult {\n formatted_output: string;\n [key: string]: any;\n}\n\ninterface SnapshotStatus {\n snapshot_hash: string;\n status: 'PENDING' | 'INDEXING' | 'READY' | 'FAILED' | 'NOT_FOUND';\n indexed_at?: string;\n total_files?: number;\n total_chunks?: number;\n message?: string;\n}\n\ninterface CacheStats {\n cached_snapshots: number;\n max_size: number;\n ttl: number;\n snapshots: string[];\n}\n\nexport interface RetrievalClientConfig {\n baseUrl?: string;\n timeout?: number;\n jwtProvider: JWTProvider;\n logger?: Logger;\n}\n\nexport class RetrievalHttpClient {\n private baseUrl!: string;\n private timeout: number;\n private apiBase!: string;\n private readonly jwtProvider: JWTProvider;\n private readonly logger: Logger;\n\n /**\n * Initialize the Retrieval HTTP client\n * @param config.baseUrl - URI/URL for connecting to the HTTP server (e.g., \"http://localhost:8004\")\n * @param config.timeout - Request timeout in milliseconds (default: 60000)\n * @param config.jwtProvider - Provider for obtaining JWT tokens\n * @param config.logger - Optional logger instance (defaults to nullLogger)\n */\n constructor({\n baseUrl = 'http://localhost:8004',\n timeout = 60000,\n jwtProvider,\n logger,\n }: RetrievalClientConfig) {\n if (!jwtProvider) {\n throw new Error('RetrievalHttpClient requires a JWT provider');\n }\n\n this.timeout = timeout;\n this.jwtProvider = jwtProvider;\n this.logger = logger ?? nullLogger;\n this.configureBase(baseUrl);\n\n this.logger.debug(`Initialized HTTP client for ${this.baseUrl}`);\n this.logger.debug(`API base: ${this.apiBase}`);\n }\n\n updateBaseUrl(baseUrl: string): void {\n this.configureBase(baseUrl);\n }\n\n private configureBase(uri: string): void {\n let processedUri = uri;\n if (!uri.startsWith('http://') && !uri.startsWith('https://')) {\n processedUri = `http://${uri}`;\n }\n\n const url = new URL(processedUri);\n\n if (url.pathname && url.pathname !== '/') {\n this.baseUrl = `${url.protocol}//${url.host}${url.pathname}`;\n } else {\n this.baseUrl = `${url.protocol}//${url.host}`;\n }\n\n if (this.baseUrl.endsWith('/')) {\n this.apiBase = `${this.baseUrl}api/retrieval/`;\n } else {\n this.apiBase = `${this.baseUrl}/api/retrieval/`;\n }\n }\n\n /**\n * Check the health status of the Retrieval service\n * @returns Health status information\n * @throws Error on connection errors\n */\n async healthCheck(): Promise<HealthResponse> {\n const healthEndpoint = `${this.apiBase}health`;\n this.logger.debug(`Checking server health: ${healthEndpoint}`);\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(healthEndpoint, {\n method: 'GET',\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Health check failed with status ${response.status}: ${errorText}`,\n );\n }\n\n const healthInfo = (await response.json()) as any;\n this.logger.debug(`HTTP retrieval server status:`, healthInfo);\n\n return {\n status: healthInfo.status || 'UNKNOWN',\n database: healthInfo.database || 'UNKNOWN',\n embedder: healthInfo.embedder || 'UNKNOWN',\n cache_size: healthInfo.cache_size || 0,\n cache_ttl: healthInfo.cache_ttl || 0,\n version: healthInfo.version || 'unknown',\n };\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Error checking HTTP server health: ${error.message}`);\n throw new Error(\n `Unable to connect to HTTP server ${this.baseUrl}: ${error.message}`,\n );\n }\n }\n\n /**\n * Execute a retrieval query on a snapshot\n * @param snapshotHash - SHA256 hash of the codebase snapshot\n * @param queryText - Natural language query for retrieval\n * @param budgetTokens - Maximum token budget for results (default: 3000)\n * @param options - Optional retrieval parameters\n * @returns Retrieval results with formatted output\n * @throws Error on query failures\n */\n async query(\n snapshotHash: string,\n queryText: string,\n budgetTokens: number = 3000,\n options?: RetrievalOptions,\n ): Promise<RetrievalResult> {\n if (!snapshotHash) {\n throw new Error('Snapshot hash must be provided');\n }\n if (!queryText) {\n throw new Error('Query text must be provided');\n }\n if (budgetTokens < 100) {\n throw new Error('Budget tokens must be at least 100');\n }\n\n const startTime = Date.now();\n const jwt = await this.jwtProvider.getJWT();\n const queryEndpoint = `${this.apiBase}query`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const requestBody: any = {\n snapshot_hash: snapshotHash,\n query: queryText,\n budget_tokens: budgetTokens,\n };\n\n if (options) {\n requestBody.options = options;\n }\n\n const response = await fetch(queryEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${jwt}`,\n },\n body: JSON.stringify(requestBody),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.status === 404) {\n const errorData = (await response.json()) as any;\n throw new Error(\n errorData.detail || 'Snapshot not found or access denied',\n );\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Query failed with status ${response.status}: ${errorText}`,\n );\n }\n\n const result = (await response.json()) as RetrievalResult;\n\n const elapsedTime = (Date.now() - startTime) / 1000;\n const formatter = options?.formatter || 'standard';\n this.logger.debug(\n `Retrieval query completed for snapshot ${snapshotHash.substring(0, 8)}... ` +\n `Formatter: ${formatter}. Total time: ${elapsedTime.toFixed(2)}s`,\n );\n\n return result;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Error executing retrieval query: ${error.message}`);\n throw new Error(`Failed to execute retrieval query: ${error.message}`);\n }\n }\n\n /**\n * Check if a snapshot is indexed and ready for retrieval\n * @param snapshotHash - SHA256 hash of the snapshot to check\n * @param jwt - JWT token for authorization (required)\n * @returns Snapshot status information\n * @throws Error on status check failures\n */\n async checkSnapshotStatus(snapshotHash: string): Promise<SnapshotStatus> {\n if (!snapshotHash) {\n throw new Error('Snapshot hash must be provided');\n }\n\n const jwt = await this.jwtProvider.getJWT();\n const statusEndpoint = `${this.apiBase}snapshots/${snapshotHash}/status`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(statusEndpoint, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${jwt}`,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.status === 404) {\n return {\n snapshot_hash: snapshotHash,\n status: 'NOT_FOUND',\n message: 'Snapshot not found or access denied',\n };\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Status check failed with status ${response.status}: ${errorText}`,\n );\n }\n\n const statusInfo = (await response.json()) as SnapshotStatus;\n this.logger.debug(\n `Snapshot ${snapshotHash.substring(0, 8)}... status: ${statusInfo.status}`,\n );\n\n return statusInfo;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Error checking snapshot status: ${error.message}`);\n throw new Error(`Failed to check snapshot status: ${error.message}`);\n }\n }\n\n /**\n * Clear the graph cache (admin operation)\n * @param jwt - JWT token for authorization (required)\n * @returns true if cache cleared successfully\n * @throws Error on cache clear failures\n */\n async clearCache(): Promise<boolean> {\n const jwt = await this.jwtProvider.getJWT();\n const cacheEndpoint = `${this.apiBase}cache`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(cacheEndpoint, {\n method: 'DELETE',\n headers: {\n Authorization: `Bearer ${jwt}`,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Cache clear failed with status ${response.status}: ${errorText}`,\n );\n }\n\n this.logger.info('Graph cache cleared successfully');\n return true;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Error clearing cache: ${error.message}`);\n throw new Error(`Failed to clear cache: ${error.message}`);\n }\n }\n\n /**\n * Get cache statistics\n * @param jwt - JWT token for authorization (required)\n * @returns Cache statistics\n * @throws Error on stats retrieval failures\n */\n async getCacheStats(): Promise<CacheStats> {\n const jwt = await this.jwtProvider.getJWT();\n const statsEndpoint = `${this.apiBase}cache/stats`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(statsEndpoint, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${jwt}`,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Stats retrieval failed with status ${response.status}: ${errorText}`,\n );\n }\n\n const stats = (await response.json()) as CacheStats;\n this.logger.debug(\n `Cache stats: ${stats.cached_snapshots || 0} snapshots cached`,\n );\n\n return stats;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Error getting cache stats: ${error.message}`);\n throw new Error(`Failed to get cache stats: ${error.message}`);\n }\n }\n\n /**\n * Convenience method for querying with specific options\n * @param snapshotHash - SHA256 hash of the codebase snapshot\n * @param queryText - Natural language query for retrieval\n * @param jwt - JWT token for authorization (required)\n * @param budgetTokens - Maximum token budget for results\n * @param flowStrength - Flow intensity multiplier\n * @param blendAlpha - Blending factor for scores\n * @param hopDepth - Depth of local neighborhood\n * @param maxIterations - Maximum flood-walk iterations\n * @param split - Fraction of budget for full chunks\n * @param formatter - Output format \"standard\" or \"compact\"\n * @returns Retrieval results\n */\n async queryWithOptions(\n snapshotHash: string,\n queryText: string,\n budgetTokens: number = 3000,\n flowStrength: number = 1.5,\n blendAlpha: number = 0.8,\n hopDepth: number = 2,\n maxIterations: number = 12,\n split: number = 0.8,\n formatter: 'standard' | 'compact' = 'standard',\n ): Promise<RetrievalResult> {\n const options: RetrievalOptions = {\n flow_strength: flowStrength,\n blend_alpha: blendAlpha,\n hop_depth: hopDepth,\n max_iterations: maxIterations,\n split,\n formatter,\n };\n\n return this.query(snapshotHash, queryText, budgetTokens, options);\n }\n\n /**\n * Close the HTTP client connection (no-op for fetch)\n */\n close(): void {\n // fetch doesn't maintain persistent connections, so nothing to close\n }\n}\n","/**\n * HTTP client SDK for AST service\n * Using fetch with automatic polyfill for Node.js < 18\n */\n\nimport fetch, { AbortController } from '../utils/fetch-wrapper';\nimport { JWTProvider } from '../utils/jwt-factory';\nimport { Logger, nullLogger } from '../utils/logger';\n\ninterface VisitorRulesV2 {\n format: 'segments+exts@v2';\n include_extensions: string[];\n include_filenames: string[];\n exclude_dirnames: string[];\n}\n\ninterface HealthStatus {\n status: 'OK' | 'NOT_READY';\n message: string;\n frontends_loaded: number;\n info: Record<string, string>;\n}\n\nexport interface ASTClientConfig {\n baseUrl?: string;\n timeout?: number;\n jwtProvider: JWTProvider;\n logger?: Logger;\n}\n\nexport class ASTHttpClient {\n private baseUrl!: string;\n private timeout: number;\n private apiBase!: string;\n private readonly jwtProvider: JWTProvider;\n private readonly logger: Logger;\n\n /**\n * Initialize the AST HTTP client\n * @param config.baseUrl - URI/URL for connecting to the HTTP server (e.g., \"http://localhost:8003\")\n * @param config.timeout - Request timeout in milliseconds (default: 60000)\n * @param config.jwtProvider - Provider for obtaining JWT tokens\n * @param config.logger - Optional logger instance (defaults to nullLogger)\n */\n constructor({\n baseUrl = 'http://localhost:8003',\n timeout = 60000,\n jwtProvider,\n logger,\n }: ASTClientConfig) {\n if (!jwtProvider) {\n throw new Error('ASTHttpClient requires a JWT provider');\n }\n\n this.timeout = timeout;\n this.jwtProvider = jwtProvider;\n this.logger = logger ?? nullLogger;\n this.configureBase(baseUrl);\n }\n\n updateBaseUrl(baseUrl: string): void {\n this.configureBase(baseUrl);\n }\n\n private configureBase(uri: string): void {\n let processedUri = uri;\n if (!uri.startsWith('http://') && !uri.startsWith('https://')) {\n processedUri = `http://${uri}`;\n }\n\n const url = new URL(processedUri);\n\n if (url.pathname && url.pathname !== '/') {\n this.baseUrl = `${url.protocol}//${url.host}${url.pathname}`;\n } else {\n this.baseUrl = `${url.protocol}//${url.host}`;\n }\n\n if (this.baseUrl.endsWith('/')) {\n this.apiBase = `${this.baseUrl}api/ast/`;\n } else {\n this.apiBase = `${this.baseUrl}/api/ast/`;\n }\n }\n\n /**\n * Get file visitor rules in v2 format optimized for Chokidar v4\n * @returns Visitor rules with format, include_extensions, include_filenames, exclude_dirnames\n * @throws Error on HTTP errors or connection errors\n */\n async getVisitorRulesV2(): Promise<VisitorRulesV2> {\n const jwt = await this.jwtProvider.getJWT();\n const url = `${this.apiBase}visitor-rules`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${jwt}`,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Failed to get visitor rules v2 with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as VisitorRulesV2;\n\n // Validate the format\n if (data.format !== 'segments+exts@v2') {\n throw new Error(`Unexpected visitor rules format: ${data.format}`);\n }\n\n return data;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Failed to get visitor rules v2: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Check the health status of the AST service\n * @returns Health status information\n * @throws Error on HTTP errors or connection errors\n */\n async health(): Promise<HealthStatus> {\n const url = `${this.apiBase}health`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method: 'GET',\n // No authentication required for health check\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Health check failed with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as HealthStatus;\n return data;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Health check failed: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Compile visitor rules v2 for use with Chokidar v4\n * This is a helper method that compiles the rules into a format\n * that can be directly used with Chokidar's ignored option\n * @param rules - The visitor rules v2 from the server\n * @returns Compiled rules with Sets and RegExp for efficient matching\n */\n static compileRulesV2(rules: VisitorRulesV2): {\n exts: Set<string>;\n names: Set<string>;\n dirRe: RegExp;\n dirs: Set<string>;\n } {\n if (rules.format !== 'segments+exts@v2') {\n throw new Error(`Unsupported rules format: ${rules.format}`);\n }\n\n const exts = new Set(rules.include_extensions.map((e) => e.toLowerCase()));\n const names = new Set(rules.include_filenames.map((n) => n.toLowerCase()));\n const dirs = new Set(rules.exclude_dirnames.map((n) => n.toLowerCase()));\n\n // Escape special regex characters\n const escapeRe = (s: string) => s.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&');\n\n // One regex to prune excluded dir segments anywhere in the path\n const dirRe = new RegExp(\n `(?:^|[\\\\/])(?:${[...dirs].map(escapeRe).join('|')})(?:[\\\\/]|$)`,\n 'i',\n );\n\n return { exts, names, dirRe, dirs };\n }\n\n /**\n * Build Chokidar v4 `ignored` predicate from compiled rules\n * @param compiled - Compiled rules from compileRulesV2\n * @returns Predicate function that returns true to ignore, false to watch\n */\n static buildIgnoredPredicate(\n compiled: ReturnType<typeof ASTHttpClient.compileRulesV2>,\n ): (path: string, stats?: any) => boolean {\n return (p: string, stats?: any) => {\n // Normalize path to posix style\n const posix = p.replace(/\\\\/g, '/');\n const parts = posix.split('/').map((segment) => segment.toLowerCase());\n\n const isDirectory = stats?.isDirectory?.() ?? false;\n\n // If the current path is a directory and it matches the excluded set, ignore it.\n if (isDirectory) {\n const current = parts[parts.length - 1];\n if (compiled.dirs.has(current)) {\n return true;\n }\n return false;\n }\n\n // For files, ignore if any parent directory is excluded\n const parentDirs = parts.slice(0, -1);\n if (parentDirs.some((segment) => compiled.dirs.has(segment))) {\n return true;\n }\n\n // 2) File allowlist by basename or extension\n const base = posix.split('/').pop()?.toLowerCase() || '';\n if (compiled.names.has(base)) return false;\n\n const extIndex = base.lastIndexOf('.');\n const ext = extIndex > -1 ? base.slice(extIndex).toLowerCase() : '';\n if (!compiled.exts.has(ext)) return true;\n\n return false;\n };\n }\n\n /**\n * Close the HTTP client connection (no-op for fetch)\n */\n close(): void {\n // fetch doesn't maintain persistent connections, so nothing to close\n }\n}\n\n// Export types for external use\nexport type { VisitorRulesV2, HealthStatus };\n","import { AuthHttpClient, decodeJWT } from '../clients/auth-client';\n\nimport { Logger, nullLogger } from './logger';\n\nexport interface JWTProvider {\n getJWT(forceRefresh?: boolean): Promise<string>;\n}\n\nexport interface TokenRefreshInfo {\n token: string;\n expiresAt: number;\n serverUrl?: string;\n}\n\ninterface JWTCacheEntry {\n token: string;\n expiresAt: number;\n refreshAt: number;\n fetchedAt: number;\n serverUrl?: string;\n}\n\nexport interface JWTFactoryOptions {\n /**\n * Minimum amount of time (ms) a token must remain valid. Defaults to 5s.\n * If the upstream reports an expiry sooner than this, we treat the token as\n * already expired and immediately refresh it on next request.\n */\n minTtlMs?: number;\n /**\n * Optional callback invoked whenever a new JWT is fetched successfully.\n */\n onTokenRefreshed?: (info: TokenRefreshInfo) => void;\n /**\n * Optional logger instance (defaults to nullLogger)\n */\n logger?: Logger;\n}\n\nconst DEFAULT_MIN_TTL_MS = 5_000;\n\n/**\n * Provides short-lived JWTs issued by the Auth service.\n * Tokens are cached and refreshed once half of their lifetime has elapsed.\n */\nexport class JWTFactory implements JWTProvider {\n private cache?: JWTCacheEntry;\n private refreshPromise?: Promise<string>;\n private readonly minTtlMs: number;\n private readonly onTokenRefreshed?: (info: TokenRefreshInfo) => void;\n private currentServerUrl?: string;\n private readonly logger: Logger;\n\n constructor(\n private readonly authClient: AuthHttpClient,\n private sourceToken: string,\n options: JWTFactoryOptions = {},\n ) {\n if (!sourceToken) {\n throw new Error('JWTFactory requires a non-empty source token');\n }\n\n this.minTtlMs = options.minTtlMs ?? DEFAULT_MIN_TTL_MS;\n this.onTokenRefreshed = options.onTokenRefreshed;\n this.logger = options.logger ?? nullLogger;\n }\n\n setSourceToken(token: string): void {\n if (!token) {\n throw new Error('JWTFactory requires a non-empty source token');\n }\n\n if (token !== this.sourceToken) {\n this.sourceToken = token;\n this.cache = undefined;\n this.currentServerUrl = undefined;\n }\n }\n\n invalidate(): void {\n this.cache = undefined;\n this.currentServerUrl = undefined;\n }\n\n async getJWT(forceRefresh = false): Promise<string> {\n const now = Date.now();\n\n if (!forceRefresh && this.cache) {\n if (now < this.cache.expiresAt) {\n if (now < this.cache.refreshAt) {\n return this.cache.token;\n }\n // Half-life reached; allow subsequent logic to refresh\n } else {\n this.cache = undefined;\n }\n }\n\n return this.refresh(now, forceRefresh);\n }\n\n private async refresh(now: number, forceRefresh: boolean): Promise<string> {\n if (!this.refreshPromise) {\n this.refreshPromise = this.fetchNewToken().finally(() => {\n this.refreshPromise = undefined;\n });\n }\n\n try {\n return await this.refreshPromise;\n } catch (error) {\n if (!forceRefresh && this.cache && now < this.cache.expiresAt) {\n this.logger.warn(\n 'Failed to refresh JWT, using cached token until expiry. Reason:',\n error,\n );\n return this.cache.token;\n }\n throw error;\n }\n }\n\n private async fetchNewToken(): Promise<string> {\n const response = await this.authClient.authenticate(this.sourceToken);\n const fetchedAt = Date.now();\n\n const expiresAt = this.resolveExpiryMs(\n response.jwt,\n response.expires_at,\n fetchedAt,\n );\n\n const payload = decodeJWT(response.jwt);\n const serverUrl = this.extractServerUrl(payload);\n\n const halfLife = Math.max((expiresAt - fetchedAt) / 2, this.minTtlMs);\n const refreshAt = fetchedAt + halfLife;\n\n this.cache = {\n token: response.jwt,\n expiresAt,\n refreshAt,\n fetchedAt,\n serverUrl,\n };\n this.currentServerUrl = serverUrl;\n\n this.emitTokenRefreshed({\n token: response.jwt,\n expiresAt,\n serverUrl,\n });\n\n return response.jwt;\n }\n\n private resolveExpiryMs(\n jwt: string,\n expiresAt: string | undefined,\n referenceTime: number,\n ): number {\n if (expiresAt) {\n const parsed = Date.parse(expiresAt);\n if (!Number.isNaN(parsed) && parsed > referenceTime + this.minTtlMs) {\n return parsed;\n }\n }\n\n const decoded = decodeJWT(jwt, this.logger);\n if (decoded?.exp) {\n const expMs = decoded.exp * 1000;\n if (expMs > referenceTime + this.minTtlMs) {\n return expMs;\n }\n }\n\n // Fall back to a conservative 60 second lifetime.\n return referenceTime + Math.max(this.minTtlMs, 60_000);\n }\n\n private extractServerUrl(\n payload: ReturnType<typeof decodeJWT>,\n ): string | undefined {\n const possibleUrl = payload?.server_url;\n if (typeof possibleUrl === 'string' && possibleUrl.trim()) {\n return possibleUrl.trim();\n }\n return undefined;\n }\n\n private emitTokenRefreshed(info: TokenRefreshInfo): void {\n if (this.onTokenRefreshed) {\n try {\n this.onTokenRefreshed(info);\n } catch (error) {\n this.logger.warn('JWTFactory onTokenRefreshed callback failed:', error);\n }\n }\n }\n\n getServerUrl(): string | undefined {\n return this.currentServerUrl ?? this.cache?.serverUrl;\n }\n}\n","import { AuthHttpClient } from './clients/auth-client';\nimport { ASTHttpClient } from './clients/ast-client';\nimport { RetrievalHttpClient } from './clients/retrieval-client';\nimport { SyncHttpClient } from './clients/sync-client';\nimport {\n JWTFactory,\n JWTFactoryOptions,\n JWTProvider,\n TokenRefreshInfo,\n} from './utils/jwt-factory';\nimport { Logger, nullLogger } from './utils/logger';\n\nexport type ServiceKey = 'auth' | 'ast' | 'retrieval' | 'sync';\n\nexport interface ServiceConfig {\n baseUrl?: string;\n timeout?: number;\n}\n\nexport interface CoderuleClientOptions {\n token: string;\n baseUrl?: string;\n auth?: ServiceConfig;\n ast?: ServiceConfig;\n retrieval?: ServiceConfig;\n sync?: ServiceConfig;\n jwtFactory?: JWTFactoryOptions;\n logger?: Logger;\n}\n\nconst DEFAULT_AUTH_BASE_URL = 'https://r.coderule.ai:16803';\nconst DEFAULT_SERVICE_BASE_URL = 'https://s1.coderule.ai:16803';\n\nconst DEFAULT_TIMEOUTS: Record<ServiceKey, number> = {\n auth: 30_000,\n ast: 60_000,\n retrieval: 60_000,\n sync: 60_000,\n};\n\nfunction resolveOverrides(\n options: CoderuleClientOptions,\n): Partial<Record<ServiceKey, ServiceConfig>> {\n return {\n auth: options.auth,\n ast: options.ast,\n retrieval: options.retrieval,\n sync: options.sync,\n };\n}\n\nfunction resolveTimeout(\n service: ServiceKey,\n overrides: Partial<Record<ServiceKey, ServiceConfig>>,\n): number {\n return overrides[service]?.timeout ?? DEFAULT_TIMEOUTS[service];\n}\n\nexport class CoderuleClients {\n readonly auth: AuthHttpClient;\n readonly ast: ASTHttpClient;\n readonly retrieval: RetrievalHttpClient;\n readonly sync: SyncHttpClient;\n readonly jwtFactory: JWTFactory;\n private readonly serviceBaseLocked: Record<\n 'ast' | 'retrieval' | 'sync',\n boolean\n >;\n private lastServerUrl?: string;\n private readonly logger: Logger;\n\n constructor(options: CoderuleClientOptions) {\n if (!options?.token) {\n throw new Error('CoderuleClients requires a non-empty token');\n }\n\n this.logger = options.logger ?? nullLogger;\n const overrides = resolveOverrides(options);\n const baseUrl = options.baseUrl;\n\n const authBase =\n overrides.auth?.baseUrl ?? baseUrl ?? DEFAULT_AUTH_BASE_URL;\n const authTimeout = resolveTimeout('auth', overrides);\n this.auth = new AuthHttpClient(authBase, authTimeout, this.logger);\n\n const userTokenCallback = options.jwtFactory?.onTokenRefreshed;\n const jwtOptions: JWTFactoryOptions = {\n ...options.jwtFactory,\n logger: this.logger,\n onTokenRefreshed: (info: TokenRefreshInfo) => {\n userTokenCallback?.(info);\n if (info.serverUrl) {\n this.applyServerUrl(info.serverUrl);\n }\n },\n };\n\n this.jwtFactory = new JWTFactory(this.auth, options.token, jwtOptions);\n\n this.serviceBaseLocked = {\n ast: Boolean(overrides.ast?.baseUrl),\n retrieval: Boolean(overrides.retrieval?.baseUrl),\n sync: Boolean(overrides.sync?.baseUrl),\n };\n\n const defaultServiceBase = baseUrl ?? DEFAULT_SERVICE_BASE_URL;\n\n this.ast = new ASTHttpClient({\n baseUrl: overrides.ast?.baseUrl ?? defaultServiceBase,\n timeout: resolveTimeout('ast', overrides),\n jwtProvider: this.jwtFactory,\n logger: this.logger,\n });\n\n this.retrieval = new RetrievalHttpClient({\n baseUrl: overrides.retrieval?.baseUrl ?? defaultServiceBase,\n timeout: resolveTimeout('retrieval', overrides),\n jwtProvider: this.jwtFactory,\n logger: this.logger,\n });\n\n this.sync = new SyncHttpClient({\n baseUrl: overrides.sync?.baseUrl ?? defaultServiceBase,\n timeout: resolveTimeout('sync', overrides),\n jwtProvider: this.jwtFactory,\n logger: this.logger,\n });\n\n const initialServerUrl = this.jwtFactory.getServerUrl();\n if (initialServerUrl) {\n this.applyServerUrl(initialServerUrl);\n }\n }\n\n get jwt(): JWTProvider {\n return this.jwtFactory;\n }\n\n async getJWT(forceRefresh = false): Promise<string> {\n return this.jwtFactory.getJWT(forceRefresh);\n }\n\n setToken(token: string): void {\n this.jwtFactory.setSourceToken(token);\n }\n\n close(): void {\n // Keep symmetry with individual clients.\n this.ast.close();\n this.retrieval.close();\n this.sync.close();\n this.auth.close();\n }\n\n private applyServerUrl(serverUrl: string): void {\n const trimmed = serverUrl.trim();\n if (!trimmed || this.lastServerUrl === trimmed) {\n return;\n }\n\n this.lastServerUrl = trimmed;\n\n try {\n if (!this.serviceBaseLocked.ast) {\n this.ast.updateBaseUrl(trimmed);\n }\n } catch (error) {\n this.logger.warn('Failed to update AST client base URL:', error);\n }\n\n try {\n if (!this.serviceBaseLocked.retrieval) {\n this.retrieval.updateBaseUrl(trimmed);\n }\n } catch (error) {\n this.logger.warn('Failed to update Retrieval client base URL:', error);\n }\n\n try {\n if (!this.serviceBaseLocked.sync) {\n this.sync.updateBaseUrl(trimmed);\n }\n } catch (error) {\n this.logger.warn('Failed to update Sync client base URL:', error);\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js","../src/polyfills/fetch-polyfill.ts","../src/index.ts","../src/clients/auth-client.ts","../src/utils/fetch-wrapper.ts","../src/utils/logger.ts","../src/clients/sync-client.ts","../src/clients/retrieval-client.ts","../src/clients/ast-client.ts","../src/utils/jwt-factory.ts","../src/coderule-clients.ts"],"names":["fetch","FormData","AbortController","data"],"mappings":"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","file":"index.js","sourcesContent":["// Shim globals in esm bundle\nimport { fileURLToPath } from 'url'\nimport path from 'path'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","/**\n * Polyfill for Node.js < 18\n */\n\n// Dynamic import to avoid errors when node-fetch is not installed\nlet nodeFetch: any;\nlet NodeHeaders: any;\nlet NodeRequest: any;\nlet NodeResponse: any;\nlet NodeFormData: any;\nlet NodeAbortController: any;\n\ntry {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const module = require('node-fetch');\n nodeFetch = module.default || module;\n NodeHeaders = module.Headers;\n NodeRequest = module.Request;\n NodeResponse = module.Response;\n\n // FormData might be in a separate package for node-fetch v2\n try {\n NodeFormData =\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n module.FormData || require('formdata-polyfill/esm.min.js').FormData;\n } catch {\n NodeFormData = class FormData {\n constructor() {\n throw new Error(\n 'FormData is not available. Install formdata-polyfill if needed.',\n );\n }\n };\n }\n\n // AbortController is built-in since Node 15\n NodeAbortController = globalThis.AbortController || module.AbortController;\n} catch {\n throw new Error(\n 'For Node.js < 18, please install node-fetch: npm install node-fetch@2',\n );\n}\n\nexport const fetch = nodeFetch;\nexport const Headers = NodeHeaders;\nexport const Request = NodeRequest;\nexport const Response = NodeResponse;\nexport const FormData = NodeFormData;\nexport const AbortController = NodeAbortController;\n","/**\n * Coderule TypeScript Client SDK\n *\n * HTTP clients for core Coderule microservices with automatic fetch polyfill.\n * Works with Node.js 14+ (uses node-fetch for < 18, native fetch for 18+).\n */\n\n// Export all clients\nexport { AuthHttpClient, decodeJWT } from './clients/auth-client';\nexport {\n SyncHttpClient,\n type SyncClientConfig,\n type SnapshotTimingMetrics,\n type SnapshotStatus,\n} from './clients/sync-client';\nexport {\n RetrievalHttpClient,\n type RetrievalClientConfig,\n} from './clients/retrieval-client';\nexport { ASTHttpClient, type ASTClientConfig } from './clients/ast-client';\n\n// Export types\nexport type { VisitorRulesV2, HealthStatus } from './clients/ast-client';\n\nexport {\n JWTFactory,\n type JWTFactoryOptions,\n type JWTProvider,\n type TokenRefreshInfo,\n} from './utils/jwt-factory';\n\nexport {\n CoderuleClients,\n type CoderuleClientOptions,\n type ServiceConfig,\n type ServiceKey,\n} from './coderule-clients';\n\n// Export logger utilities\nexport { Logger, nullLogger, consoleLogger } from './utils/logger';\n\n// Export fetch utilities if needed by consumers\nexport { default as fetch } from './utils/fetch-wrapper';\n","/**\n * HTTP client SDK for Auth service\n * Using fetch with automatic polyfill for Node.js < 18\n */\n\nimport fetch, { AbortController } from '../utils/fetch-wrapper';\nimport { Logger, nullLogger } from '../utils/logger';\n\ninterface AuthResponse {\n jwt: string;\n expires_at: string;\n}\n\ninterface HealthResponse {\n status: string;\n version?: string;\n [key: string]: any;\n}\n\nexport class AuthHttpClient {\n private baseUrl: string;\n private timeout: number;\n private readonly logger: Logger;\n\n /**\n * Initialize the Auth HTTP client\n * @param baseUrl - Base URL of the Auth service (e.g., \"http://localhost:8001\")\n * @param timeout - Request timeout in milliseconds (default: 30000)\n * @param logger - Optional logger instance (defaults to nullLogger)\n */\n constructor(baseUrl: string, timeout: number = 30000, logger?: Logger) {\n this.baseUrl = baseUrl.replace(/\\/$/, '');\n this.timeout = timeout;\n this.logger = logger ?? nullLogger;\n }\n\n /**\n * Authenticate a token and receive a JWT\n * @param token - Authentication token\n * @returns Response containing JWT and expiration\n * @throws Error on HTTP errors or connection errors\n */\n async authenticate(token: string): Promise<AuthResponse> {\n const url = `${this.baseUrl}/api/auth/authenticate`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ token }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Authentication failed with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as AuthResponse;\n this.logger.debug(\n `Authentication successful, JWT expires at ${data.expires_at}`,\n );\n return data;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Authentication request failed: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Check the health status of the Auth service\n * @returns Health status information\n * @throws Error on HTTP errors or connection errors\n */\n async health(): Promise<HealthResponse> {\n const url = `${this.baseUrl}/api/auth/health`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method: 'GET',\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Health check failed with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as HealthResponse;\n this.logger.debug(`Health check: ${data.status}`);\n return data;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Health check request failed: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Close the HTTP client connection (no-op for fetch)\n */\n close(): void {\n // fetch doesn't maintain persistent connections, so nothing to close\n }\n}\n\n/**\n * Simple JWT payload interface\n */\ninterface JWTPayload {\n [key: string]: any;\n exp?: number;\n iat?: number;\n nbf?: number;\n}\n\n/**\n * Verify a JWT token (utility function for other services)\n * Note: This is a simplified version that only decodes the payload.\n * For proper verification, you would need a JWT library to verify the signature.\n * @param jwtToken - JWT token to verify\n * @param logger - Optional logger instance\n * @returns Decoded JWT payload if valid, null if invalid\n */\nexport function decodeJWT(\n jwtToken: string,\n logger?: Logger,\n): JWTPayload | null {\n try {\n // Split the JWT into its three parts\n const parts = jwtToken.split('.');\n if (parts.length !== 3) {\n return null;\n }\n\n // Decode the payload (second part)\n const payload = parts[1];\n // Add padding if necessary\n const paddedPayload = payload + '='.repeat((4 - (payload.length % 4)) % 4);\n\n // Decode base64url to base64\n const base64 = paddedPayload.replace(/-/g, '+').replace(/_/g, '/');\n\n // Decode base64 to string\n const jsonString = Buffer.from(base64, 'base64').toString('utf8');\n\n // Parse JSON\n const payloadObj: JWTPayload = JSON.parse(jsonString);\n\n // Check if token is expired\n if (payloadObj.exp) {\n const now = Math.floor(Date.now() / 1000);\n if (payloadObj.exp < now) {\n if (logger) logger.debug('JWT token is expired');\n return null;\n }\n }\n\n return payloadObj;\n } catch (error) {\n if (logger) logger.error('Failed to decode JWT:', error);\n return null;\n }\n}\n\n/**\n * Note: For actual JWT verification with signature validation,\n * you would need to use a proper JWT library like 'jsonwebtoken'.\n * This implementation only decodes and checks expiration.\n */\n","/**\n * Smart fetch wrapper that automatically uses native fetch or polyfill\n */\n\n// Check if native fetch is available (Node.js 18+ or browser)\nconst hasNativeFetch = typeof globalThis.fetch !== 'undefined';\n\ninterface FetchModule {\n fetch: typeof globalThis.fetch;\n Headers: typeof globalThis.Headers;\n Request: typeof globalThis.Request;\n Response: typeof globalThis.Response;\n FormData: typeof globalThis.FormData;\n AbortController: typeof globalThis.AbortController;\n}\n\nlet fetchModule: FetchModule;\n\nif (hasNativeFetch) {\n // Use native fetch\n fetchModule = {\n fetch: globalThis.fetch,\n Headers: globalThis.Headers,\n Request: globalThis.Request,\n Response: globalThis.Response,\n FormData: globalThis.FormData,\n AbortController: globalThis.AbortController,\n };\n} else {\n // Try to load polyfill for older Node.js versions\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n fetchModule = require('../polyfills/fetch-polyfill');\n } catch {\n throw new Error(\n `This library requires Node.js 18+ or the node-fetch package.\\n` +\n `Please either:\\n` +\n `1. Upgrade to Node.js 18 or later, or\\n` +\n `2. Install node-fetch: npm install node-fetch@2`,\n );\n }\n}\n\n// Export fetch and related APIs\nexport const fetch = fetchModule.fetch;\nexport const Headers = fetchModule.Headers;\nexport const Request = fetchModule.Request;\nexport const Response = fetchModule.Response;\nexport const FormData = fetchModule.FormData;\nexport const AbortController = fetchModule.AbortController;\n\n// Export default fetch for convenience\nexport default fetch;\n","/**\n * Logger interface for Coderule clients\n * Provides a standard logging interface that can be implemented by any logging library\n */\n\nexport interface Logger {\n error(message: string, ...meta: unknown[]): void;\n warn(message: string, ...meta: unknown[]): void;\n info(message: string, ...meta: unknown[]): void;\n debug(message: string, ...meta: unknown[]): void;\n}\n\n/**\n * Silent logger implementation that does nothing\n * This is the default logger used when no logger is provided\n */\nexport const nullLogger: Logger = {\n error: () => {},\n warn: () => {},\n info: () => {},\n debug: () => {},\n};\n\n/**\n * Console logger implementation that outputs to console\n * Useful for development and debugging\n */\nexport const consoleLogger: Logger = {\n error: (message: string, ...meta: unknown[]) =>\n console.error(message, ...meta),\n warn: (message: string, ...meta: unknown[]) => console.warn(message, ...meta),\n info: (message: string, ...meta: unknown[]) => console.info(message, ...meta),\n debug: (message: string, ...meta: unknown[]) =>\n console.debug(message, ...meta),\n};\n","/**\n * HTTP client SDK for Sync service\n * Using fetch with automatic polyfill for Node.js < 18\n */\n\nimport * as crypto from 'crypto';\n\nimport fetch, { AbortController, FormData } from '../utils/fetch-wrapper';\nimport { JWTProvider } from '../utils/jwt-factory';\nimport { Logger, nullLogger } from '../utils/logger';\n\n/**\n * Timing telemetry metrics for snapshot indexing\n */\nexport interface SnapshotTimingMetrics {\n /** Pass 1 duration: oldest file creation to newest file ready (seconds) */\n pass1?: number;\n /** Pass 2 duration: total cross-reference resolution time (seconds) */\n pass2?: number;\n /** Gap between newest file ready and Pass 2 start (seconds) */\n gap?: number;\n /** Total HDF5 compilation time (seconds) */\n pass2_hdf5_compile?: number;\n /** Chunk/edge/FQN deduplication time (seconds) */\n pass2_hdf5_dedup?: number;\n /** Raw HDF5 file I/O time (seconds) */\n pass2_hdf5_write?: number;\n /** Bush ID used for this snapshot */\n bush_id?: number;\n /** Total number of files indexed */\n total_files?: number;\n /** Total number of chunks created */\n total_chunks?: number;\n /** Total number of classes found */\n total_classes?: number;\n /** Total number of methods found */\n total_methods?: number;\n}\n\nexport interface SnapshotStatus {\n status:\n | 'NOT_FOUND'\n | 'READY'\n | 'INDEXING'\n | 'PENDING'\n | 'FAILED'\n | 'MISSING_CONTENT';\n snapshot_hash?: string;\n created_at?: string;\n updated_at?: string;\n /** Timing and summary metrics (available when status is READY) */\n timing?: SnapshotTimingMetrics;\n missing_files?: Array<{ file_path: string; file_hash: string }>;\n message?: string;\n [key: string]: any;\n}\n\ninterface FileInfo {\n file_path: string;\n file_hash: string;\n}\n\ninterface UploadResult {\n uploaded_count: number;\n failed_count: number;\n failed_files?: string[];\n}\n\ninterface HealthResponse {\n status: string;\n database?: string;\n version?: string;\n [key: string]: any;\n}\n\nexport interface SyncClientConfig {\n baseUrl?: string;\n timeout?: number;\n jwtProvider: JWTProvider;\n logger?: Logger;\n}\n\nexport class SyncHttpClient {\n private baseUrl!: string;\n private timeout: number;\n private apiBase!: string;\n private readonly jwtProvider: JWTProvider;\n private readonly logger: Logger;\n\n /**\n * Initialize the Sync HTTP client\n * @param config.baseUrl - URI/URL for connecting to the HTTP server (e.g., \"http://localhost:8002\")\n * @param config.timeout - Request timeout in milliseconds (default: 60000)\n * @param config.jwtProvider - Provider for obtaining JWT tokens\n * @param config.logger - Optional logger instance (defaults to nullLogger)\n */\n constructor({\n baseUrl = 'http://localhost:8002',\n timeout = 60000,\n jwtProvider,\n logger,\n }: SyncClientConfig) {\n if (!jwtProvider) {\n throw new Error('SyncHttpClient requires a JWT provider');\n }\n\n this.timeout = timeout;\n this.jwtProvider = jwtProvider;\n this.logger = logger ?? nullLogger;\n this.configureBase(baseUrl);\n }\n\n updateBaseUrl(baseUrl: string): void {\n this.configureBase(baseUrl);\n }\n\n private configureBase(uri: string): void {\n let processedUri = uri;\n if (!uri.startsWith('http://') && !uri.startsWith('https://')) {\n processedUri = `http://${uri}`;\n }\n\n const url = new URL(processedUri);\n\n if (url.pathname && url.pathname !== '/') {\n this.baseUrl = `${url.protocol}//${url.host}${url.pathname}`;\n } else {\n this.baseUrl = `${url.protocol}//${url.host}`;\n }\n\n if (this.baseUrl.endsWith('/')) {\n this.apiBase = `${this.baseUrl}sync/v1/`;\n } else {\n this.apiBase = `${this.baseUrl}/sync/v1/`;\n }\n }\n\n /**\n * Check the status of a snapshot\n * @param snapshotHash - SHA256 hash of the snapshot\n * @returns Snapshot status information\n * @throws Error on HTTP errors or connection errors\n */\n async checkSnapshotStatus(snapshotHash: string): Promise<SnapshotStatus> {\n if (!snapshotHash) {\n throw new Error('Snapshot hash must be provided');\n }\n\n const jwt = await this.jwtProvider.getJWT();\n const url = `${this.apiBase}snapshots`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${jwt}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ snapshot_hash: snapshotHash }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.status === 404) {\n return { status: 'NOT_FOUND' };\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Failed to check snapshot with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as SnapshotStatus;\n return data;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Request failed: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Create a new snapshot or get its status if it exists\n * @param snapshotHash - SHA256 hash of the snapshot\n * @param files - List of file information with 'file_path' and 'file_hash'\n * @returns Snapshot creation result or status\n * @throws Error on HTTP errors or connection errors\n */\n async createSnapshot(\n snapshotHash: string,\n files: FileInfo[],\n ): Promise<SnapshotStatus> {\n if (!snapshotHash) {\n throw new Error('Snapshot hash must be provided');\n }\n\n const jwt = await this.jwtProvider.getJWT();\n const url = `${this.apiBase}snapshots`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${jwt}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n snapshot_hash: snapshotHash,\n files: files,\n }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.status === 422) {\n // Missing content\n const data = (await response.json()) as SnapshotStatus;\n this.logger.info(\n `Snapshot ${snapshotHash.substring(0, 8)}... missing ${data.missing_files?.length || 0} files`,\n );\n return data;\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Failed to create snapshot with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as SnapshotStatus;\n this.logger.info(\n `Snapshot ${snapshotHash.substring(0, 8)}... status: ${data.status}`,\n );\n return data;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Request failed: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Upload file content to the service\n * @param filesContent - Map of file_hash to object with 'path' and 'content'\n * @returns Upload result with counts\n * @throws Error on HTTP errors or connection errors\n */\n async uploadFileContent(\n filesContent: Map<string, { path: string; content: Buffer | string }>,\n ): Promise<UploadResult> {\n const jwt = await this.jwtProvider.getJWT();\n const url = `${this.apiBase}files/content`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n // Create FormData for multipart upload\n const formData = new FormData();\n\n for (const [fileHash, fileData] of filesContent.entries()) {\n const content =\n typeof fileData.content === 'string'\n ? Buffer.from(fileData.content)\n : fileData.content;\n\n // Create a Blob from the Buffer\n const blob = new Blob([content], { type: 'application/octet-stream' });\n\n // Append to form data with filename as the file path\n formData.append(fileHash, blob, fileData.path);\n }\n\n // Remove Content-Type from headers for multipart (browser sets it)\n const uploadHeaders = {\n Authorization: `Bearer ${jwt}`,\n };\n\n const response = await fetch(url, {\n method: 'POST',\n headers: uploadHeaders,\n body: formData,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Failed to upload files with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as UploadResult;\n this.logger.info(\n `Uploaded ${data.uploaded_count || 0} files, ${data.failed_count || 0} failed`,\n );\n return data;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Request failed: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Calculate file hash from path and content\n * @param filePath - Relative file path\n * @param content - File content as Buffer or string\n * @returns SHA256 hash of the file\n */\n static calculateFileHash(filePath: string, content: Buffer | string): string {\n const contentBuffer =\n typeof content === 'string' ? Buffer.from(content) : content;\n const fileData = Buffer.concat([\n Buffer.from(`${filePath}\\n`, 'utf-8'),\n contentBuffer,\n ]);\n return crypto.createHash('sha256').update(fileData).digest('hex');\n }\n\n /**\n * Calculate snapshot hash from file hashes\n * @param fileHashes - Array of file SHA256 hashes\n * @returns SHA256 hash of the snapshot\n */\n static calculateSnapshotHash(fileHashes: string[]): string {\n const snapshotData = fileHashes.sort().join('\\n');\n return crypto\n .createHash('sha256')\n .update(snapshotData, 'utf-8')\n .digest('hex');\n }\n\n /**\n * Check the health status of the Sync service\n * @returns Health status information\n * @throws Error on HTTP errors or connection errors\n */\n async health(): Promise<HealthResponse> {\n const url = `${this.apiBase}health`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method: 'GET',\n // No authentication required for health check\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Health check failed with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as HealthResponse;\n return data;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Request failed: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Truncate all database tables and clean RabbitMQ queue\n *\n * **DANGER**: This deletes ALL data from the database and message queue.\n * Should only be used in development/testing environments.\n *\n * @param adminToken - Admin token for authentication\n * @returns Promise with success message\n * @throws Error on HTTP errors (including 401/403 for auth failures) or connection errors\n */\n async truncate(\n adminToken: string,\n ): Promise<{ status: string; message: string }> {\n const url = `${this.baseUrl}/admin/truncate`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'X-Admin-Token': adminToken,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Truncate failed with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as {\n status: string;\n message: string;\n };\n this.logger.warn(`Database truncated: ${data.message}`);\n return data;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Request failed: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Close the HTTP client connection (no-op for fetch)\n */\n close(): void {\n // fetch doesn't maintain persistent connections, so nothing to close\n }\n}\n","/**\n * HTTP client SDK for Retrieval service\n * Using fetch with automatic polyfill for Node.js < 18\n */\n\nimport fetch, { AbortController } from '../utils/fetch-wrapper';\nimport { JWTProvider } from '../utils/jwt-factory';\nimport { Logger, nullLogger } from '../utils/logger';\n\ninterface HealthResponse {\n status: string;\n database?: string;\n embedder?: string;\n cache_size?: number;\n cache_ttl?: number;\n version?: string;\n}\n\ninterface RetrievalOptions {\n flow_strength?: number; // Flow intensity multiplier (default: 1.5)\n blend_alpha?: number; // Blending factor for scores (default: 0.8)\n hop_depth?: number; // Depth of local neighborhood (default: 2)\n max_iterations?: number; // Maximum flood-walk iterations (default: 12)\n split?: number; // Fraction of budget for full chunks (default: 0.8)\n formatter?: 'standard' | 'compact'; // Output format (default: 'standard')\n}\n\ninterface RetrievalResult {\n formatted_output: string;\n [key: string]: any;\n}\n\ninterface SnapshotStatus {\n snapshot_hash: string;\n status: 'PENDING' | 'INDEXING' | 'READY' | 'FAILED' | 'NOT_FOUND';\n indexed_at?: string;\n total_files?: number;\n total_chunks?: number;\n message?: string;\n}\n\ninterface CacheStats {\n cached_snapshots: number;\n max_size: number;\n ttl: number;\n snapshots: string[];\n}\n\nexport interface RetrievalClientConfig {\n baseUrl?: string;\n timeout?: number;\n jwtProvider: JWTProvider;\n logger?: Logger;\n}\n\nexport class RetrievalHttpClient {\n private baseUrl!: string;\n private timeout: number;\n private apiBase!: string;\n private readonly jwtProvider: JWTProvider;\n private readonly logger: Logger;\n\n /**\n * Initialize the Retrieval HTTP client\n * @param config.baseUrl - URI/URL for connecting to the HTTP server (e.g., \"http://localhost:8004\")\n * @param config.timeout - Request timeout in milliseconds (default: 60000)\n * @param config.jwtProvider - Provider for obtaining JWT tokens\n * @param config.logger - Optional logger instance (defaults to nullLogger)\n */\n constructor({\n baseUrl = 'http://localhost:8004',\n timeout = 60000,\n jwtProvider,\n logger,\n }: RetrievalClientConfig) {\n if (!jwtProvider) {\n throw new Error('RetrievalHttpClient requires a JWT provider');\n }\n\n this.timeout = timeout;\n this.jwtProvider = jwtProvider;\n this.logger = logger ?? nullLogger;\n this.configureBase(baseUrl);\n\n this.logger.debug(`Initialized HTTP client for ${this.baseUrl}`);\n this.logger.debug(`API base: ${this.apiBase}`);\n }\n\n updateBaseUrl(baseUrl: string): void {\n this.configureBase(baseUrl);\n }\n\n private configureBase(uri: string): void {\n let processedUri = uri;\n if (!uri.startsWith('http://') && !uri.startsWith('https://')) {\n processedUri = `http://${uri}`;\n }\n\n const url = new URL(processedUri);\n\n if (url.pathname && url.pathname !== '/') {\n this.baseUrl = `${url.protocol}//${url.host}${url.pathname}`;\n } else {\n this.baseUrl = `${url.protocol}//${url.host}`;\n }\n\n if (this.baseUrl.endsWith('/')) {\n this.apiBase = `${this.baseUrl}api/retrieval/`;\n } else {\n this.apiBase = `${this.baseUrl}/api/retrieval/`;\n }\n }\n\n /**\n * Check the health status of the Retrieval service\n * @returns Health status information\n * @throws Error on connection errors\n */\n async healthCheck(): Promise<HealthResponse> {\n const healthEndpoint = `${this.apiBase}health`;\n this.logger.debug(`Checking server health: ${healthEndpoint}`);\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(healthEndpoint, {\n method: 'GET',\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Health check failed with status ${response.status}: ${errorText}`,\n );\n }\n\n const healthInfo = (await response.json()) as any;\n this.logger.debug(`HTTP retrieval server status:`, healthInfo);\n\n return {\n status: healthInfo.status || 'UNKNOWN',\n database: healthInfo.database || 'UNKNOWN',\n embedder: healthInfo.embedder || 'UNKNOWN',\n cache_size: healthInfo.cache_size || 0,\n cache_ttl: healthInfo.cache_ttl || 0,\n version: healthInfo.version || 'unknown',\n };\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Error checking HTTP server health: ${error.message}`);\n throw new Error(\n `Unable to connect to HTTP server ${this.baseUrl}: ${error.message}`,\n );\n }\n }\n\n /**\n * Execute a retrieval query on a snapshot\n * @param snapshotHash - SHA256 hash of the codebase snapshot\n * @param queryText - Natural language query for retrieval\n * @param budgetTokens - Maximum token budget for results (default: 3000)\n * @param options - Optional retrieval parameters\n * @returns Retrieval results with formatted output\n * @throws Error on query failures\n */\n async query(\n snapshotHash: string,\n queryText: string,\n budgetTokens: number = 3000,\n options?: RetrievalOptions,\n ): Promise<RetrievalResult> {\n if (!snapshotHash) {\n throw new Error('Snapshot hash must be provided');\n }\n if (!queryText) {\n throw new Error('Query text must be provided');\n }\n if (budgetTokens < 100) {\n throw new Error('Budget tokens must be at least 100');\n }\n\n const startTime = Date.now();\n const jwt = await this.jwtProvider.getJWT();\n const queryEndpoint = `${this.apiBase}query`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const requestBody: any = {\n snapshot_hash: snapshotHash,\n query: queryText,\n budget_tokens: budgetTokens,\n };\n\n if (options) {\n requestBody.options = options;\n }\n\n const response = await fetch(queryEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${jwt}`,\n },\n body: JSON.stringify(requestBody),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.status === 404) {\n const errorData = (await response.json()) as any;\n throw new Error(\n errorData.detail || 'Snapshot not found or access denied',\n );\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Query failed with status ${response.status}: ${errorText}`,\n );\n }\n\n const result = (await response.json()) as RetrievalResult;\n\n const elapsedTime = (Date.now() - startTime) / 1000;\n const formatter = options?.formatter || 'standard';\n this.logger.debug(\n `Retrieval query completed for snapshot ${snapshotHash.substring(0, 8)}... ` +\n `Formatter: ${formatter}. Total time: ${elapsedTime.toFixed(2)}s`,\n );\n\n return result;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Error executing retrieval query: ${error.message}`);\n throw new Error(`Failed to execute retrieval query: ${error.message}`);\n }\n }\n\n /**\n * Check if a snapshot is indexed and ready for retrieval\n * @param snapshotHash - SHA256 hash of the snapshot to check\n * @param jwt - JWT token for authorization (required)\n * @returns Snapshot status information\n * @throws Error on status check failures\n */\n async checkSnapshotStatus(snapshotHash: string): Promise<SnapshotStatus> {\n if (!snapshotHash) {\n throw new Error('Snapshot hash must be provided');\n }\n\n const jwt = await this.jwtProvider.getJWT();\n const statusEndpoint = `${this.apiBase}snapshots/${snapshotHash}/status`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(statusEndpoint, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${jwt}`,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.status === 404) {\n return {\n snapshot_hash: snapshotHash,\n status: 'NOT_FOUND',\n message: 'Snapshot not found or access denied',\n };\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Status check failed with status ${response.status}: ${errorText}`,\n );\n }\n\n const statusInfo = (await response.json()) as SnapshotStatus;\n this.logger.debug(\n `Snapshot ${snapshotHash.substring(0, 8)}... status: ${statusInfo.status}`,\n );\n\n return statusInfo;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Error checking snapshot status: ${error.message}`);\n throw new Error(`Failed to check snapshot status: ${error.message}`);\n }\n }\n\n /**\n * Clear the graph cache (admin operation)\n * @param jwt - JWT token for authorization (required)\n * @returns true if cache cleared successfully\n * @throws Error on cache clear failures\n */\n async clearCache(): Promise<boolean> {\n const jwt = await this.jwtProvider.getJWT();\n const cacheEndpoint = `${this.apiBase}cache`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(cacheEndpoint, {\n method: 'DELETE',\n headers: {\n Authorization: `Bearer ${jwt}`,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Cache clear failed with status ${response.status}: ${errorText}`,\n );\n }\n\n this.logger.info('Graph cache cleared successfully');\n return true;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Error clearing cache: ${error.message}`);\n throw new Error(`Failed to clear cache: ${error.message}`);\n }\n }\n\n /**\n * Get cache statistics\n * @param jwt - JWT token for authorization (required)\n * @returns Cache statistics\n * @throws Error on stats retrieval failures\n */\n async getCacheStats(): Promise<CacheStats> {\n const jwt = await this.jwtProvider.getJWT();\n const statsEndpoint = `${this.apiBase}cache/stats`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(statsEndpoint, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${jwt}`,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Stats retrieval failed with status ${response.status}: ${errorText}`,\n );\n }\n\n const stats = (await response.json()) as CacheStats;\n this.logger.debug(\n `Cache stats: ${stats.cached_snapshots || 0} snapshots cached`,\n );\n\n return stats;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Error getting cache stats: ${error.message}`);\n throw new Error(`Failed to get cache stats: ${error.message}`);\n }\n }\n\n /**\n * Convenience method for querying with specific options\n * @param snapshotHash - SHA256 hash of the codebase snapshot\n * @param queryText - Natural language query for retrieval\n * @param jwt - JWT token for authorization (required)\n * @param budgetTokens - Maximum token budget for results\n * @param flowStrength - Flow intensity multiplier\n * @param blendAlpha - Blending factor for scores\n * @param hopDepth - Depth of local neighborhood\n * @param maxIterations - Maximum flood-walk iterations\n * @param split - Fraction of budget for full chunks\n * @param formatter - Output format \"standard\" or \"compact\"\n * @returns Retrieval results\n */\n async queryWithOptions(\n snapshotHash: string,\n queryText: string,\n budgetTokens: number = 3000,\n flowStrength: number = 1.5,\n blendAlpha: number = 0.8,\n hopDepth: number = 2,\n maxIterations: number = 12,\n split: number = 0.8,\n formatter: 'standard' | 'compact' = 'standard',\n ): Promise<RetrievalResult> {\n const options: RetrievalOptions = {\n flow_strength: flowStrength,\n blend_alpha: blendAlpha,\n hop_depth: hopDepth,\n max_iterations: maxIterations,\n split,\n formatter,\n };\n\n return this.query(snapshotHash, queryText, budgetTokens, options);\n }\n\n /**\n * Close the HTTP client connection (no-op for fetch)\n */\n close(): void {\n // fetch doesn't maintain persistent connections, so nothing to close\n }\n}\n","/**\n * HTTP client SDK for AST service\n * Using fetch with automatic polyfill for Node.js < 18\n */\n\nimport fetch, { AbortController } from '../utils/fetch-wrapper';\nimport { JWTProvider } from '../utils/jwt-factory';\nimport { Logger, nullLogger } from '../utils/logger';\n\ninterface VisitorRulesV2 {\n format: 'segments+exts@v2';\n include_extensions: string[];\n include_filenames: string[];\n exclude_dirnames: string[];\n}\n\ninterface HealthStatus {\n status: 'OK' | 'NOT_READY';\n message: string;\n frontends_loaded: number;\n info: Record<string, string>;\n}\n\nexport interface ASTClientConfig {\n baseUrl?: string;\n timeout?: number;\n jwtProvider: JWTProvider;\n logger?: Logger;\n}\n\nexport class ASTHttpClient {\n private baseUrl!: string;\n private timeout: number;\n private apiBase!: string;\n private readonly jwtProvider: JWTProvider;\n private readonly logger: Logger;\n\n /**\n * Initialize the AST HTTP client\n * @param config.baseUrl - URI/URL for connecting to the HTTP server (e.g., \"http://localhost:8003\")\n * @param config.timeout - Request timeout in milliseconds (default: 60000)\n * @param config.jwtProvider - Provider for obtaining JWT tokens\n * @param config.logger - Optional logger instance (defaults to nullLogger)\n */\n constructor({\n baseUrl = 'http://localhost:8003',\n timeout = 60000,\n jwtProvider,\n logger,\n }: ASTClientConfig) {\n if (!jwtProvider) {\n throw new Error('ASTHttpClient requires a JWT provider');\n }\n\n this.timeout = timeout;\n this.jwtProvider = jwtProvider;\n this.logger = logger ?? nullLogger;\n this.configureBase(baseUrl);\n }\n\n updateBaseUrl(baseUrl: string): void {\n this.configureBase(baseUrl);\n }\n\n private configureBase(uri: string): void {\n let processedUri = uri;\n if (!uri.startsWith('http://') && !uri.startsWith('https://')) {\n processedUri = `http://${uri}`;\n }\n\n const url = new URL(processedUri);\n\n if (url.pathname && url.pathname !== '/') {\n this.baseUrl = `${url.protocol}//${url.host}${url.pathname}`;\n } else {\n this.baseUrl = `${url.protocol}//${url.host}`;\n }\n\n if (this.baseUrl.endsWith('/')) {\n this.apiBase = `${this.baseUrl}api/ast/`;\n } else {\n this.apiBase = `${this.baseUrl}/api/ast/`;\n }\n }\n\n /**\n * Get file visitor rules in v2 format optimized for Chokidar v4\n * @returns Visitor rules with format, include_extensions, include_filenames, exclude_dirnames\n * @throws Error on HTTP errors or connection errors\n */\n async getVisitorRulesV2(): Promise<VisitorRulesV2> {\n const jwt = await this.jwtProvider.getJWT();\n const url = `${this.apiBase}visitor-rules`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${jwt}`,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Failed to get visitor rules v2 with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as VisitorRulesV2;\n\n // Validate the format\n if (data.format !== 'segments+exts@v2') {\n throw new Error(`Unexpected visitor rules format: ${data.format}`);\n }\n\n return data;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Failed to get visitor rules v2: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Check the health status of the AST service\n * @returns Health status information\n * @throws Error on HTTP errors or connection errors\n */\n async health(): Promise<HealthStatus> {\n const url = `${this.apiBase}health`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method: 'GET',\n // No authentication required for health check\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Health check failed with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as HealthStatus;\n return data;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n this.logger.error(`Health check failed: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Compile visitor rules v2 for use with Chokidar v4\n * This is a helper method that compiles the rules into a format\n * that can be directly used with Chokidar's ignored option\n * @param rules - The visitor rules v2 from the server\n * @returns Compiled rules with Sets and RegExp for efficient matching\n */\n static compileRulesV2(rules: VisitorRulesV2): {\n exts: Set<string>;\n names: Set<string>;\n dirRe: RegExp;\n dirs: Set<string>;\n } {\n if (rules.format !== 'segments+exts@v2') {\n throw new Error(`Unsupported rules format: ${rules.format}`);\n }\n\n const exts = new Set(rules.include_extensions.map((e) => e.toLowerCase()));\n const names = new Set(rules.include_filenames.map((n) => n.toLowerCase()));\n const dirs = new Set(rules.exclude_dirnames.map((n) => n.toLowerCase()));\n\n // Escape special regex characters\n const escapeRe = (s: string) => s.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&');\n\n // One regex to prune excluded dir segments anywhere in the path\n const dirRe = new RegExp(\n `(?:^|[\\\\/])(?:${[...dirs].map(escapeRe).join('|')})(?:[\\\\/]|$)`,\n 'i',\n );\n\n return { exts, names, dirRe, dirs };\n }\n\n /**\n * Build Chokidar v4 `ignored` predicate from compiled rules\n * @param compiled - Compiled rules from compileRulesV2\n * @returns Predicate function that returns true to ignore, false to watch\n */\n static buildIgnoredPredicate(\n compiled: ReturnType<typeof ASTHttpClient.compileRulesV2>,\n ): (path: string, stats?: any) => boolean {\n return (p: string, stats?: any) => {\n // Normalize path to posix style\n const posix = p.replace(/\\\\/g, '/');\n const parts = posix.split('/').map((segment) => segment.toLowerCase());\n\n const isDirectory = stats?.isDirectory?.() ?? false;\n\n // If the current path is a directory and it matches the excluded set, ignore it.\n if (isDirectory) {\n const current = parts[parts.length - 1];\n if (compiled.dirs.has(current)) {\n return true;\n }\n return false;\n }\n\n // For files, ignore if any parent directory is excluded\n const parentDirs = parts.slice(0, -1);\n if (parentDirs.some((segment) => compiled.dirs.has(segment))) {\n return true;\n }\n\n // 2) File allowlist by basename or extension\n const base = posix.split('/').pop()?.toLowerCase() || '';\n if (compiled.names.has(base)) return false;\n\n const extIndex = base.lastIndexOf('.');\n const ext = extIndex > -1 ? base.slice(extIndex).toLowerCase() : '';\n if (!compiled.exts.has(ext)) return true;\n\n return false;\n };\n }\n\n /**\n * Close the HTTP client connection (no-op for fetch)\n */\n close(): void {\n // fetch doesn't maintain persistent connections, so nothing to close\n }\n}\n\n// Export types for external use\nexport type { VisitorRulesV2, HealthStatus };\n","import { AuthHttpClient, decodeJWT } from '../clients/auth-client';\n\nimport { Logger, nullLogger } from './logger';\n\nexport interface JWTProvider {\n getJWT(forceRefresh?: boolean): Promise<string>;\n}\n\nexport interface TokenRefreshInfo {\n token: string;\n expiresAt: number;\n serverUrl?: string;\n}\n\ninterface JWTCacheEntry {\n token: string;\n expiresAt: number;\n refreshAt: number;\n fetchedAt: number;\n serverUrl?: string;\n}\n\nexport interface JWTFactoryOptions {\n /**\n * Minimum amount of time (ms) a token must remain valid. Defaults to 5s.\n * If the upstream reports an expiry sooner than this, we treat the token as\n * already expired and immediately refresh it on next request.\n */\n minTtlMs?: number;\n /**\n * Optional callback invoked whenever a new JWT is fetched successfully.\n */\n onTokenRefreshed?: (info: TokenRefreshInfo) => void;\n /**\n * Optional logger instance (defaults to nullLogger)\n */\n logger?: Logger;\n}\n\nconst DEFAULT_MIN_TTL_MS = 5_000;\n\n/**\n * Provides short-lived JWTs issued by the Auth service.\n * Tokens are cached and refreshed once half of their lifetime has elapsed.\n */\nexport class JWTFactory implements JWTProvider {\n private cache?: JWTCacheEntry;\n private refreshPromise?: Promise<string>;\n private readonly minTtlMs: number;\n private readonly onTokenRefreshed?: (info: TokenRefreshInfo) => void;\n private currentServerUrl?: string;\n private readonly logger: Logger;\n\n constructor(\n private readonly authClient: AuthHttpClient,\n private sourceToken: string,\n options: JWTFactoryOptions = {},\n ) {\n if (!sourceToken) {\n throw new Error('JWTFactory requires a non-empty source token');\n }\n\n this.minTtlMs = options.minTtlMs ?? DEFAULT_MIN_TTL_MS;\n this.onTokenRefreshed = options.onTokenRefreshed;\n this.logger = options.logger ?? nullLogger;\n }\n\n setSourceToken(token: string): void {\n if (!token) {\n throw new Error('JWTFactory requires a non-empty source token');\n }\n\n if (token !== this.sourceToken) {\n this.sourceToken = token;\n this.cache = undefined;\n this.currentServerUrl = undefined;\n }\n }\n\n invalidate(): void {\n this.cache = undefined;\n this.currentServerUrl = undefined;\n }\n\n async getJWT(forceRefresh = false): Promise<string> {\n const now = Date.now();\n\n if (!forceRefresh && this.cache) {\n if (now < this.cache.expiresAt) {\n if (now < this.cache.refreshAt) {\n return this.cache.token;\n }\n // Half-life reached; allow subsequent logic to refresh\n } else {\n this.cache = undefined;\n }\n }\n\n return this.refresh(now, forceRefresh);\n }\n\n private async refresh(now: number, forceRefresh: boolean): Promise<string> {\n if (!this.refreshPromise) {\n this.refreshPromise = this.fetchNewToken().finally(() => {\n this.refreshPromise = undefined;\n });\n }\n\n try {\n return await this.refreshPromise;\n } catch (error) {\n if (!forceRefresh && this.cache && now < this.cache.expiresAt) {\n this.logger.warn(\n 'Failed to refresh JWT, using cached token until expiry. Reason:',\n error,\n );\n return this.cache.token;\n }\n throw error;\n }\n }\n\n private async fetchNewToken(): Promise<string> {\n const response = await this.authClient.authenticate(this.sourceToken);\n const fetchedAt = Date.now();\n\n const expiresAt = this.resolveExpiryMs(\n response.jwt,\n response.expires_at,\n fetchedAt,\n );\n\n const payload = decodeJWT(response.jwt);\n const serverUrl = this.extractServerUrl(payload);\n\n const halfLife = Math.max((expiresAt - fetchedAt) / 2, this.minTtlMs);\n const refreshAt = fetchedAt + halfLife;\n\n this.cache = {\n token: response.jwt,\n expiresAt,\n refreshAt,\n fetchedAt,\n serverUrl,\n };\n this.currentServerUrl = serverUrl;\n\n this.emitTokenRefreshed({\n token: response.jwt,\n expiresAt,\n serverUrl,\n });\n\n return response.jwt;\n }\n\n private resolveExpiryMs(\n jwt: string,\n expiresAt: string | undefined,\n referenceTime: number,\n ): number {\n if (expiresAt) {\n const parsed = Date.parse(expiresAt);\n if (!Number.isNaN(parsed) && parsed > referenceTime + this.minTtlMs) {\n return parsed;\n }\n }\n\n const decoded = decodeJWT(jwt, this.logger);\n if (decoded?.exp) {\n const expMs = decoded.exp * 1000;\n if (expMs > referenceTime + this.minTtlMs) {\n return expMs;\n }\n }\n\n // Fall back to a conservative 60 second lifetime.\n return referenceTime + Math.max(this.minTtlMs, 60_000);\n }\n\n private extractServerUrl(\n payload: ReturnType<typeof decodeJWT>,\n ): string | undefined {\n const possibleUrl = payload?.server_url;\n if (typeof possibleUrl === 'string' && possibleUrl.trim()) {\n return possibleUrl.trim();\n }\n return undefined;\n }\n\n private emitTokenRefreshed(info: TokenRefreshInfo): void {\n if (this.onTokenRefreshed) {\n try {\n this.onTokenRefreshed(info);\n } catch (error) {\n this.logger.warn('JWTFactory onTokenRefreshed callback failed:', error);\n }\n }\n }\n\n getServerUrl(): string | undefined {\n return this.currentServerUrl ?? this.cache?.serverUrl;\n }\n}\n","import { AuthHttpClient } from './clients/auth-client';\nimport { ASTHttpClient } from './clients/ast-client';\nimport { RetrievalHttpClient } from './clients/retrieval-client';\nimport { SyncHttpClient } from './clients/sync-client';\nimport {\n JWTFactory,\n JWTFactoryOptions,\n JWTProvider,\n TokenRefreshInfo,\n} from './utils/jwt-factory';\nimport { Logger, nullLogger } from './utils/logger';\n\nexport type ServiceKey = 'auth' | 'ast' | 'retrieval' | 'sync';\n\nexport interface ServiceConfig {\n baseUrl?: string;\n timeout?: number;\n}\n\nexport interface CoderuleClientOptions {\n token: string;\n baseUrl?: string;\n auth?: ServiceConfig;\n ast?: ServiceConfig;\n retrieval?: ServiceConfig;\n sync?: ServiceConfig;\n jwtFactory?: JWTFactoryOptions;\n logger?: Logger;\n}\n\nconst DEFAULT_AUTH_BASE_URL = 'https://r.coderule.ai:16803';\nconst DEFAULT_SERVICE_BASE_URL = 'https://s1.coderule.ai:16803';\n\nconst DEFAULT_TIMEOUTS: Record<ServiceKey, number> = {\n auth: 30_000,\n ast: 60_000,\n retrieval: 60_000,\n sync: 60_000,\n};\n\nfunction resolveOverrides(\n options: CoderuleClientOptions,\n): Partial<Record<ServiceKey, ServiceConfig>> {\n return {\n auth: options.auth,\n ast: options.ast,\n retrieval: options.retrieval,\n sync: options.sync,\n };\n}\n\nfunction resolveTimeout(\n service: ServiceKey,\n overrides: Partial<Record<ServiceKey, ServiceConfig>>,\n): number {\n return overrides[service]?.timeout ?? DEFAULT_TIMEOUTS[service];\n}\n\nexport class CoderuleClients {\n readonly auth: AuthHttpClient;\n readonly ast: ASTHttpClient;\n readonly retrieval: RetrievalHttpClient;\n readonly sync: SyncHttpClient;\n readonly jwtFactory: JWTFactory;\n private readonly serviceBaseLocked: Record<\n 'ast' | 'retrieval' | 'sync',\n boolean\n >;\n private lastServerUrl?: string;\n private readonly logger: Logger;\n\n constructor(options: CoderuleClientOptions) {\n if (!options?.token) {\n throw new Error('CoderuleClients requires a non-empty token');\n }\n\n this.logger = options.logger ?? nullLogger;\n const overrides = resolveOverrides(options);\n const baseUrl = options.baseUrl;\n\n const authBase =\n overrides.auth?.baseUrl ?? baseUrl ?? DEFAULT_AUTH_BASE_URL;\n const authTimeout = resolveTimeout('auth', overrides);\n this.auth = new AuthHttpClient(authBase, authTimeout, this.logger);\n\n const userTokenCallback = options.jwtFactory?.onTokenRefreshed;\n const jwtOptions: JWTFactoryOptions = {\n ...options.jwtFactory,\n logger: this.logger,\n onTokenRefreshed: (info: TokenRefreshInfo) => {\n userTokenCallback?.(info);\n if (info.serverUrl) {\n this.applyServerUrl(info.serverUrl);\n }\n },\n };\n\n this.jwtFactory = new JWTFactory(this.auth, options.token, jwtOptions);\n\n this.serviceBaseLocked = {\n ast: Boolean(overrides.ast?.baseUrl),\n retrieval: Boolean(overrides.retrieval?.baseUrl),\n sync: Boolean(overrides.sync?.baseUrl),\n };\n\n const defaultServiceBase = baseUrl ?? DEFAULT_SERVICE_BASE_URL;\n\n this.ast = new ASTHttpClient({\n baseUrl: overrides.ast?.baseUrl ?? defaultServiceBase,\n timeout: resolveTimeout('ast', overrides),\n jwtProvider: this.jwtFactory,\n logger: this.logger,\n });\n\n this.retrieval = new RetrievalHttpClient({\n baseUrl: overrides.retrieval?.baseUrl ?? defaultServiceBase,\n timeout: resolveTimeout('retrieval', overrides),\n jwtProvider: this.jwtFactory,\n logger: this.logger,\n });\n\n this.sync = new SyncHttpClient({\n baseUrl: overrides.sync?.baseUrl ?? defaultServiceBase,\n timeout: resolveTimeout('sync', overrides),\n jwtProvider: this.jwtFactory,\n logger: this.logger,\n });\n\n const initialServerUrl = this.jwtFactory.getServerUrl();\n if (initialServerUrl) {\n this.applyServerUrl(initialServerUrl);\n }\n }\n\n get jwt(): JWTProvider {\n return this.jwtFactory;\n }\n\n async getJWT(forceRefresh = false): Promise<string> {\n return this.jwtFactory.getJWT(forceRefresh);\n }\n\n setToken(token: string): void {\n this.jwtFactory.setSourceToken(token);\n }\n\n close(): void {\n // Keep symmetry with individual clients.\n this.ast.close();\n this.retrieval.close();\n this.sync.close();\n this.auth.close();\n }\n\n private applyServerUrl(serverUrl: string): void {\n const trimmed = serverUrl.trim();\n if (!trimmed || this.lastServerUrl === trimmed) {\n return;\n }\n\n this.lastServerUrl = trimmed;\n\n try {\n if (!this.serviceBaseLocked.ast) {\n this.ast.updateBaseUrl(trimmed);\n }\n } catch (error) {\n this.logger.warn('Failed to update AST client base URL:', error);\n }\n\n try {\n if (!this.serviceBaseLocked.retrieval) {\n this.retrieval.updateBaseUrl(trimmed);\n }\n } catch (error) {\n this.logger.warn('Failed to update Retrieval client base URL:', error);\n }\n\n try {\n if (!this.serviceBaseLocked.sync) {\n this.sync.updateBaseUrl(trimmed);\n }\n } catch (error) {\n this.logger.warn('Failed to update Sync client base URL:', error);\n }\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coderule/clients",
3
- "version": "1.6.1",
3
+ "version": "2.0.0",
4
4
  "description": "TypeScript HTTP clients for core Coderule microservices (Auth, Sync, Retrieval, AST)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",