headroom-ai 0.22.4 → 0.36.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors.ts","../src/utils/case.ts","../src/utils/stream.ts","../src/client.ts","../src/utils/format.ts","../src/hooks.ts","../src/compress.ts"],"names":[],"mappings":"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","file":"chunk-UVXIB3EK.cjs","sourcesContent":["/**\n * Error hierarchy matching Python headroom.exceptions.\n */\n\nexport class HeadroomError extends Error {\n details?: Record<string, any>;\n\n constructor(message: string, details?: Record<string, any>) {\n super(message);\n this.name = \"HeadroomError\";\n this.details = details;\n }\n}\n\nexport class HeadroomConnectionError extends HeadroomError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, details);\n this.name = \"HeadroomConnectionError\";\n }\n}\n\nexport class HeadroomAuthError extends HeadroomError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, details);\n this.name = \"HeadroomAuthError\";\n }\n}\n\nexport class HeadroomCompressError extends HeadroomError {\n statusCode: number;\n errorType: string;\n\n constructor(statusCode: number, errorType: string, message: string, details?: Record<string, any>) {\n super(message, details);\n this.name = \"HeadroomCompressError\";\n this.statusCode = statusCode;\n this.errorType = errorType;\n }\n}\n\nexport class ConfigurationError extends HeadroomError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, details);\n this.name = \"ConfigurationError\";\n }\n}\n\nexport class ProviderError extends HeadroomError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, details);\n this.name = \"ProviderError\";\n }\n}\n\nexport class StorageError extends HeadroomError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, details);\n this.name = \"StorageError\";\n }\n}\n\nexport class TokenizationError extends HeadroomError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, details);\n this.name = \"TokenizationError\";\n }\n}\n\nexport class CacheError extends HeadroomError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, details);\n this.name = \"CacheError\";\n }\n}\n\nexport class ValidationError extends HeadroomError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, details);\n this.name = \"ValidationError\";\n }\n}\n\nexport class TransformError extends HeadroomError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, details);\n this.name = \"TransformError\";\n }\n}\n\n// --- Proxy error mapping ---\n\nconst ERROR_TYPE_MAP: Record<string, new (message: string, details?: Record<string, any>) => HeadroomError> = {\n configuration_error: ConfigurationError,\n provider_error: ProviderError,\n storage_error: StorageError,\n tokenization_error: TokenizationError,\n cache_error: CacheError,\n validation_error: ValidationError,\n transform_error: TransformError,\n};\n\n/**\n * Map a proxy error response to the correct HeadroomError subclass.\n */\nexport function mapProxyError(\n status: number,\n type: string,\n message: string,\n): HeadroomError {\n if (status === 401) return new HeadroomAuthError(message);\n const ErrorClass = ERROR_TYPE_MAP[type];\n if (ErrorClass) return new ErrorClass(message, { statusCode: status, errorType: type });\n return new HeadroomCompressError(status, type, message);\n}\n","/**\n * Case conversion utilities for proxy communication.\n * Proxy uses snake_case (Python), SDK uses camelCase (TypeScript).\n */\n\nexport function snakeToCamel(str: string): string {\n return str.replace(/_([a-z0-9])/g, (_, c) => c.toUpperCase());\n}\n\nexport function camelToSnake(str: string): string {\n return str.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`);\n}\n\nexport function deepCamelCase<T = any>(obj: any): T {\n if (obj === null || obj === undefined) return obj as T;\n if (Array.isArray(obj)) return obj.map(deepCamelCase) as T;\n if (typeof obj === \"object\" && !(obj instanceof Date)) {\n return Object.fromEntries(\n Object.entries(obj).map(([k, v]) => [snakeToCamel(k), deepCamelCase(v)]),\n ) as T;\n }\n return obj as T;\n}\n\nexport function deepSnakeCase(obj: any): any {\n if (obj === null || obj === undefined) return obj;\n if (Array.isArray(obj)) return obj.map(deepSnakeCase);\n if (typeof obj === \"object\" && !(obj instanceof Date)) {\n return Object.fromEntries(\n Object.entries(obj).map(([k, v]) => [camelToSnake(k), deepSnakeCase(v)]),\n );\n }\n return obj;\n}\n","/**\n * SSE (Server-Sent Events) stream parser for proxy streaming responses.\n */\n\n/**\n * Parse an SSE response body into an async generator of parsed JSON events.\n */\nexport async function* parseSSE<T = any>(\n response: Response,\n): AsyncGenerator<T> {\n const reader = response.body!.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop()!;\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6).trim();\n if (data === \"[DONE]\") return;\n try {\n yield JSON.parse(data) as T;\n } catch {\n // skip non-JSON data lines (e.g. Anthropic event metadata)\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * Collect all chunks from an async iterable into an array.\n */\nexport async function collectStream<T>(stream: AsyncIterable<T>): Promise<T[]> {\n const chunks: T[] = [];\n for await (const chunk of stream) {\n chunks.push(chunk);\n }\n return chunks;\n}\n","/**\n * HeadroomClient — HTTP client for the Headroom compression proxy.\n *\n * Supports:\n * - compress() — direct compression via /v1/compress\n * - chat.completions.create() — OpenAI-style passthrough via /v1/chat/completions\n * - messages.create() — Anthropic-style passthrough via /v1/messages\n * - Metrics, health, CCR retrieve, telemetry, feedback, TOIN\n */\n\nimport type {\n OpenAIMessage,\n CompressResult,\n HeadroomClientOptions,\n HeadroomClientInterface,\n ProxyCompressResponse,\n ProxyErrorResponse,\n} from \"./types.js\";\nimport { mapProxyError, HeadroomConnectionError, HeadroomAuthError, HeadroomCompressError } from \"./errors.js\";\nimport { deepCamelCase, deepSnakeCase } from \"./utils/case.js\";\nimport { parseSSE } from \"./utils/stream.js\";\nimport type { HeadroomConfig, HeadroomMode } from \"./types/config.js\";\nimport type {\n SimulationResult,\n RequestMetrics,\n MetricsSummary,\n SessionStats,\n ValidationResult,\n HealthStatus,\n ProxyStats,\n MemoryUsage,\n RetrieveResult,\n RetrieveSearchResult,\n CCRStats,\n TelemetryStats,\n ToolHints,\n TOINStats,\n TOINPattern,\n MetricsQuery,\n SummaryQuery,\n StatsHistoryQuery,\n} from \"./types/models.js\";\n\nconst DEFAULT_BASE_URL = \"http://localhost:8787\";\nconst DEFAULT_TIMEOUT = 30_000;\nconst DEFAULT_RETRIES = 1;\n\nfunction getEnv(key: string): string | undefined {\n if (typeof process !== \"undefined\" && process.env) {\n return process.env[key];\n }\n return undefined;\n}\n\nfunction makeFallbackResult(messages: OpenAIMessage[]): CompressResult {\n return {\n messages,\n tokensBefore: 0,\n tokensAfter: 0,\n tokensSaved: 0,\n compressionRatio: 1.0,\n transformsApplied: [],\n ccrHashes: [],\n compressed: false,\n };\n}\n\n// --- Headroom request params ---\n\nexport interface HeadroomParams {\n headroomMode?: HeadroomMode;\n headroomCachePrefixTokens?: number;\n headroomOutputBufferTokens?: number;\n headroomKeepTurns?: number;\n headroomToolProfiles?: Record<string, Record<string, any>>;\n}\n\n// --- Sub-clients ---\n\nclass ChatCompletions {\n constructor(private client: HeadroomClient) {}\n\n /**\n * Create a chat completion with automatic compression.\n * Routes through proxy's POST /v1/chat/completions.\n */\n async create(\n params: { model: string; messages: OpenAIMessage[]; stream?: boolean; [key: string]: any } & HeadroomParams,\n ): Promise<any> {\n const { headroomMode, headroomCachePrefixTokens, headroomOutputBufferTokens, headroomKeepTurns, headroomToolProfiles, ...apiParams } = params;\n\n const headers: Record<string, string> = {};\n if (headroomMode) headers[\"x-headroom-mode\"] = headroomMode;\n\n const providerKey = this.client.providerApiKey ?? getEnv(\"OPENAI_API_KEY\");\n if (providerKey) headers[\"Authorization\"] = `Bearer ${providerKey}`;\n\n const response = await this.client.rawFetch(\"/v1/chat/completions\", {\n method: \"POST\",\n headers,\n body: apiParams,\n stream: params.stream,\n });\n\n if (params.stream) {\n return parseSSE(response);\n }\n\n return response.json();\n }\n\n /**\n * Simulate compression without calling the LLM.\n */\n async simulate(\n params: { model: string; messages: OpenAIMessage[] } & HeadroomParams,\n ): Promise<SimulationResult> {\n const body = {\n messages: params.messages,\n model: params.model,\n config: { default_mode: \"simulate\", generate_diff_artifact: true },\n };\n const result = await this.client.compressRaw(body);\n return deepCamelCase<SimulationResult>(result);\n }\n}\n\nclass Messages {\n constructor(private client: HeadroomClient) {}\n\n /**\n * Create a message with automatic compression.\n * Routes through proxy's POST /v1/messages (Anthropic).\n */\n async create(\n params: { model: string; messages: any[]; max_tokens?: number; system?: string | any[]; stream?: boolean; [key: string]: any } & HeadroomParams,\n ): Promise<any> {\n const { headroomMode, headroomCachePrefixTokens, headroomOutputBufferTokens, headroomKeepTurns, headroomToolProfiles, ...apiParams } = params;\n\n const headers: Record<string, string> = {\n \"anthropic-version\": \"2023-06-01\",\n };\n if (headroomMode) headers[\"x-headroom-mode\"] = headroomMode;\n\n const providerKey = this.client.providerApiKey ?? getEnv(\"ANTHROPIC_API_KEY\");\n if (providerKey) headers[\"x-api-key\"] = providerKey;\n\n if (!apiParams.max_tokens) apiParams.max_tokens = 1024;\n\n const response = await this.client.rawFetch(\"/v1/messages\", {\n method: \"POST\",\n headers,\n body: apiParams,\n stream: params.stream,\n });\n\n if (params.stream) {\n return parseSSE(response);\n }\n\n return response.json();\n }\n\n /**\n * Stream a message with automatic compression.\n */\n stream(\n params: { model: string; messages: any[]; max_tokens?: number; system?: string | any[]; [key: string]: any } & HeadroomParams,\n ): Promise<AsyncGenerator<any>> {\n return this.create({ ...params, stream: true }) as Promise<AsyncGenerator<any>>;\n }\n\n /**\n * Simulate compression without calling the LLM.\n */\n async simulate(\n params: { model: string; messages: any[] } & HeadroomParams,\n ): Promise<SimulationResult> {\n const body = {\n messages: params.messages,\n model: params.model,\n config: { default_mode: \"simulate\", generate_diff_artifact: true },\n };\n const result = await this.client.compressRaw(body);\n return deepCamelCase<SimulationResult>(result);\n }\n}\n\n// --- Main client ---\n\nexport interface ExtendedClientOptions extends HeadroomClientOptions {\n providerApiKey?: string;\n defaultMode?: HeadroomMode;\n config?: HeadroomConfig;\n}\n\nexport class HeadroomClient implements HeadroomClientInterface {\n private baseUrl: string;\n private apiKey: string | undefined;\n private timeout: number;\n private fallback: boolean;\n private retries: number;\n private config: HeadroomConfig | undefined;\n private stack: string | undefined;\n\n /** @internal */ providerApiKey: string | undefined;\n\n /** OpenAI-style chat completions API. */\n readonly chat: { completions: ChatCompletions };\n /** Anthropic-style messages API. */\n readonly messages: Messages;\n\n constructor(options: ExtendedClientOptions = {}) {\n this.baseUrl = (\n options.baseUrl ??\n getEnv(\"HEADROOM_BASE_URL\") ??\n DEFAULT_BASE_URL\n ).replace(/\\/+$/, \"\");\n this.apiKey = options.apiKey ?? getEnv(\"HEADROOM_API_KEY\");\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n this.fallback = options.fallback ?? true;\n this.retries = options.retries ?? DEFAULT_RETRIES;\n this.providerApiKey = options.providerApiKey;\n this.config = options.config;\n this.stack = options.stack;\n\n this.chat = { completions: new ChatCompletions(this) };\n this.messages = new Messages(this);\n }\n\n // ============================================================\n // Core: compress\n // ============================================================\n\n async compress(\n messages: OpenAIMessage[],\n options: { model?: string; tokenBudget?: number } = {},\n ): Promise<CompressResult> {\n const model = options.model ?? \"gpt-4o\";\n\n let lastError: unknown;\n const maxAttempts = 1 + this.retries;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n return await this._doCompress(messages, model, options.tokenBudget);\n } catch (error) {\n lastError = error;\n if (error instanceof HeadroomAuthError) throw error;\n if (\n error instanceof HeadroomCompressError &&\n error.statusCode < 500\n ) {\n throw error;\n }\n }\n }\n\n if (this.fallback) {\n return makeFallbackResult(messages);\n }\n if (lastError instanceof HeadroomConnectionError) throw lastError;\n if (lastError instanceof HeadroomCompressError) throw lastError;\n throw new HeadroomConnectionError(\n `Failed after ${maxAttempts} attempts: ${lastError}`,\n );\n }\n\n /**\n * Raw compress call — sends body directly to /v1/compress.\n * Used by simulate() and other advanced features.\n * @internal\n */\n async compressRaw(body: Record<string, any>): Promise<any> {\n const response = await this._fetch(\"/v1/compress\", {\n method: \"POST\",\n body: JSON.stringify(body),\n });\n return response.json();\n }\n\n // ============================================================\n // Health & Stats\n // ============================================================\n\n /** Check if the proxy is running and healthy. */\n async health(): Promise<HealthStatus> {\n const resp = await this._fetch(\"/health\", { method: \"GET\" });\n return deepCamelCase<HealthStatus>(await resp.json());\n }\n\n /** Get comprehensive proxy statistics. */\n async proxyStats(): Promise<ProxyStats> {\n const resp = await this._fetch(\"/stats\", { method: \"GET\" });\n return deepCamelCase<ProxyStats>(await resp.json());\n }\n\n /** Get Prometheus-format metrics. */\n async prometheusMetrics(): Promise<string> {\n const resp = await this._fetch(\"/metrics\", { method: \"GET\" });\n return resp.text();\n }\n\n /** Get historical stats. */\n async statsHistory(query?: StatsHistoryQuery): Promise<any> {\n const params = new URLSearchParams();\n if (query?.format) params.set(\"format\", query.format);\n if (query?.series) params.set(\"series\", query.series);\n const qs = params.toString();\n const resp = await this._fetch(`/stats-history${qs ? `?${qs}` : \"\"}`, { method: \"GET\" });\n return resp.json();\n }\n\n /** Get proxy memory usage. */\n async memoryUsage(): Promise<MemoryUsage> {\n const resp = await this._fetch(\"/debug/memory\", { method: \"GET\" });\n return deepCamelCase<MemoryUsage>(await resp.json());\n }\n\n /** Clear the response cache. */\n async clearCache(): Promise<{ status: string }> {\n const resp = await this._fetch(\"/cache/clear\", { method: \"POST\" });\n return resp.json() as Promise<{ status: string }>;\n }\n\n // ============================================================\n // Metrics & Observability\n // ============================================================\n\n /** Get request metrics from the proxy. */\n async getMetrics(query?: MetricsQuery): Promise<RequestMetrics[]> {\n const resp = await this._fetch(\"/stats\", { method: \"GET\" });\n const stats = (await resp.json()) as any;\n let metrics: any[] = stats.recent_requests ?? [];\n\n if (query?.model) {\n metrics = metrics.filter((m: any) => m.model === query.model);\n }\n if (query?.mode) {\n metrics = metrics.filter((m: any) => m.mode === query.mode);\n }\n if (query?.limit) {\n metrics = metrics.slice(0, query.limit);\n }\n\n return metrics.map((m: any) => deepCamelCase<RequestMetrics>(m));\n }\n\n /** Get aggregated metrics summary. */\n async getSummary(query?: SummaryQuery): Promise<MetricsSummary> {\n const resp = await this._fetch(\"/stats\", { method: \"GET\" });\n const stats = (await resp.json()) as any;\n return deepCamelCase<MetricsSummary>({\n total_requests: stats.requests?.total ?? 0,\n total_tokens_before: stats.tokens?.total_before_compression ?? 0,\n total_tokens_after: (stats.tokens?.total_before_compression ?? 0) - (stats.tokens?.saved ?? 0),\n total_tokens_saved: stats.tokens?.saved ?? 0,\n average_compression_ratio: stats.tokens?.savings_percent ? stats.tokens.savings_percent / 100 : 0,\n models: stats.requests?.by_model ?? {},\n modes: {},\n error_count: stats.requests?.failed ?? 0,\n });\n }\n\n /** Get in-memory session stats. */\n async getStats(): Promise<SessionStats> {\n const resp = await this._fetch(\"/stats\", { method: \"GET\" });\n const stats = (await resp.json()) as any;\n return deepCamelCase<SessionStats>({\n total_requests: stats.requests?.total ?? 0,\n total_tokens_before: stats.tokens?.total_before_compression ?? 0,\n total_tokens_after: (stats.tokens?.total_before_compression ?? 0) - (stats.tokens?.saved ?? 0),\n total_tokens_saved: stats.tokens?.saved ?? 0,\n average_compression_ratio: stats.tokens?.savings_percent ? stats.tokens.savings_percent / 100 : 0,\n cache_hits: stats.requests?.cached ?? 0,\n by_mode: {},\n });\n }\n\n /** Validate proxy configuration. */\n async validateSetup(): Promise<ValidationResult> {\n const resp = await this._fetch(\"/health\", { method: \"GET\" });\n const health = (await resp.json()) as any;\n return {\n valid: health.status === \"healthy\",\n provider: \"\",\n errors: health.status !== \"healthy\" ? [\"Proxy unhealthy\"] : [],\n warnings: [],\n config: health.config ?? {},\n };\n }\n\n // ============================================================\n // CCR Retrieve\n // ============================================================\n\n /** Retrieve original content from the CCR compression store. */\n async retrieve(\n hash: string,\n options?: { query?: string },\n ): Promise<RetrieveResult | RetrieveSearchResult> {\n const body: Record<string, any> = { hash };\n if (options?.query) body.query = options.query;\n const resp = await this._fetch(\"/v1/retrieve\", {\n method: \"POST\",\n body: JSON.stringify(body),\n });\n return deepCamelCase(await resp.json());\n }\n\n /** Get CCR store statistics. */\n async getCCRStats(): Promise<CCRStats> {\n const resp = await this._fetch(\"/v1/retrieve/stats\", { method: \"GET\" });\n return deepCamelCase<CCRStats>(await resp.json());\n }\n\n /** Handle an LLM tool call for headroom_retrieve. */\n async handleToolCall(request: {\n toolCall: any;\n provider?: \"anthropic\" | \"openai\";\n }): Promise<any> {\n const resp = await this._fetch(\"/v1/retrieve/tool_call\", {\n method: \"POST\",\n body: JSON.stringify(deepSnakeCase(request)),\n });\n return deepCamelCase(await resp.json());\n }\n\n // ============================================================\n // Telemetry & Feedback\n // ============================================================\n\n readonly telemetry = {\n getStats: async (): Promise<TelemetryStats> => {\n const resp = await this._fetch(\"/v1/telemetry\", { method: \"GET\" });\n return deepCamelCase<TelemetryStats>(await resp.json());\n },\n export: async (): Promise<any> => {\n const resp = await this._fetch(\"/v1/telemetry/export\", { method: \"GET\" });\n return resp.json();\n },\n import: async (data: any): Promise<{ status: string }> => {\n const resp = await this._fetch(\"/v1/telemetry/import\", {\n method: \"POST\",\n body: JSON.stringify(data),\n });\n return resp.json() as Promise<{ status: string }>;\n },\n getTools: async (): Promise<any> => {\n const resp = await this._fetch(\"/v1/telemetry/tools\", { method: \"GET\" });\n return deepCamelCase(await resp.json());\n },\n getTool: async (signatureHash: string): Promise<any> => {\n const resp = await this._fetch(`/v1/telemetry/tools/${signatureHash}`, { method: \"GET\" });\n return deepCamelCase(await resp.json());\n },\n };\n\n readonly feedback = {\n getStats: async (): Promise<any> => {\n const resp = await this._fetch(\"/v1/feedback\", { method: \"GET\" });\n return deepCamelCase(await resp.json());\n },\n getHints: async (toolName: string): Promise<ToolHints> => {\n const resp = await this._fetch(`/v1/feedback/${encodeURIComponent(toolName)}`, { method: \"GET\" });\n return deepCamelCase<ToolHints>(await resp.json());\n },\n };\n\n readonly toin = {\n getStats: async (): Promise<TOINStats> => {\n const resp = await this._fetch(\"/v1/toin/stats\", { method: \"GET\" });\n return deepCamelCase<TOINStats>(await resp.json());\n },\n getPatterns: async (limit?: number): Promise<TOINPattern[]> => {\n const qs = limit ? `?limit=${limit}` : \"\";\n const resp = await this._fetch(`/v1/toin/patterns${qs}`, { method: \"GET\" });\n return deepCamelCase<TOINPattern[]>(await resp.json());\n },\n getPattern: async (hashPrefix: string): Promise<any> => {\n const resp = await this._fetch(`/v1/toin/pattern/${encodeURIComponent(hashPrefix)}`, { method: \"GET\" });\n return deepCamelCase(await resp.json());\n },\n };\n\n // ============================================================\n // Lifecycle\n // ============================================================\n\n /** Close the client (no-op for HTTP client, included for API parity). */\n close(): void {\n // HTTP client is stateless — nothing to close\n }\n\n // ============================================================\n // Internal HTTP helpers\n // ============================================================\n\n /**\n * Raw fetch with proxy base URL, auth, and timeout.\n * @internal\n */\n async rawFetch(\n path: string,\n options: { method: string; headers?: Record<string, string>; body?: any; stream?: boolean },\n ): Promise<Response> {\n const url = `${this.baseUrl}${path}`;\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n };\n if (this.apiKey) {\n // Don't override provider auth headers\n if (!headers[\"Authorization\"] && !headers[\"x-api-key\"]) {\n headers[\"Authorization\"] = `Bearer ${this.apiKey}`;\n }\n }\n if (this.stack && !headers[\"X-Headroom-Stack\"]) {\n headers[\"X-Headroom-Stack\"] = this.stack;\n }\n\n let response: Response;\n try {\n response = await fetch(url, {\n method: options.method,\n headers,\n body: options.body ? JSON.stringify(options.body) : undefined,\n signal: AbortSignal.timeout(this.timeout),\n });\n } catch (error) {\n throw new HeadroomConnectionError(\n `Failed to connect to Headroom at ${this.baseUrl}: ${error}`,\n );\n }\n\n if (!response.ok) {\n let errorBody: ProxyErrorResponse | undefined;\n try {\n errorBody = (await response.json()) as ProxyErrorResponse;\n } catch {\n // ignore\n }\n throw mapProxyError(\n response.status,\n errorBody?.error?.type ?? \"unknown\",\n errorBody?.error?.message ?? `HTTP ${response.status}`,\n );\n }\n\n return response;\n }\n\n /** @internal */\n private async _fetch(\n path: string,\n init: { method: string; body?: string; headers?: Record<string, string> },\n ): Promise<Response> {\n const url = `${this.baseUrl}${path}`;\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...init.headers,\n };\n if (this.apiKey) {\n headers[\"Authorization\"] = `Bearer ${this.apiKey}`;\n }\n if (this.stack && !headers[\"X-Headroom-Stack\"]) {\n headers[\"X-Headroom-Stack\"] = this.stack;\n }\n\n let response: Response;\n try {\n response = await fetch(url, {\n method: init.method,\n headers,\n body: init.body,\n signal: AbortSignal.timeout(this.timeout),\n });\n } catch (error) {\n throw new HeadroomConnectionError(\n `Failed to connect to Headroom at ${this.baseUrl}: ${error}`,\n );\n }\n\n if (!response.ok) {\n let errorBody: ProxyErrorResponse | undefined;\n try {\n errorBody = (await response.json()) as ProxyErrorResponse;\n } catch {\n // ignore\n }\n throw mapProxyError(\n response.status,\n errorBody?.error?.type ?? \"unknown\",\n errorBody?.error?.message ?? `HTTP ${response.status}`,\n );\n }\n\n return response;\n }\n\n private async _doCompress(\n messages: OpenAIMessage[],\n model: string,\n tokenBudget?: number,\n ): Promise<CompressResult> {\n const body: Record<string, unknown> = { messages, model };\n if (tokenBudget) {\n body.token_budget = tokenBudget;\n }\n if (this.config) {\n body.config = deepSnakeCase(this.config);\n }\n\n const response = await this._fetch(\"/v1/compress\", {\n method: \"POST\",\n body: JSON.stringify(body),\n });\n\n const data = (await response.json()) as ProxyCompressResponse;\n\n return {\n messages: data.messages,\n tokensBefore: data.tokens_before,\n tokensAfter: data.tokens_after,\n tokensSaved: data.tokens_saved,\n compressionRatio: data.compression_ratio,\n transformsApplied: data.transforms_applied,\n ccrHashes: data.ccr_hashes,\n compressed: true,\n };\n }\n}\n","/**\n * Universal message format detection and conversion.\n *\n * Supports 4 formats:\n * - OpenAI: { role, content, tool_calls?, tool_call_id? }\n * - Anthropic: { role, content (string | ContentBlock[]) } with tool_use/tool_result blocks\n * - Vercel AI SDK: { role, content (string | Part[]) } with tool-call/tool-result parts\n * - Google Gemini: { role, parts[] } with functionCall/functionResponse\n *\n * Detection is structural (unique keys/values per format), not heuristic.\n * Conversion always targets OpenAI format (the proxy's lingua franca).\n */\n\nimport type {\n OpenAIMessage,\n AssistantMessage,\n ToolCall,\n} from \"../types.js\";\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport type MessageFormat = \"openai\" | \"anthropic\" | \"vercel\" | \"gemini\";\n\n/**\n * Detect which format an array of messages is in.\n *\n * Uses structural markers unique to each format:\n * - Gemini: messages have `parts` field (not `content`)\n * - Vercel: content parts use hyphenated types: `tool-call`, `tool-result`\n * - Anthropic: content blocks use underscored types: `tool_use`, `tool_result`\n * - OpenAI: assistant messages have `tool_calls` field; tool messages have `tool_call_id`\n */\nexport function detectFormat(messages: any[]): MessageFormat {\n for (const msg of messages) {\n // Gemini: uses `parts` instead of `content`\n if (\"parts\" in msg && !(\"content\" in msg)) return \"gemini\";\n\n // Gemini: role \"model\" instead of \"assistant\"\n if (msg.role === \"model\") return \"gemini\";\n\n // OpenAI: tool_calls on assistant messages\n if (msg.tool_calls && msg.role === \"assistant\") return \"openai\";\n\n // OpenAI: tool role with tool_call_id\n if (msg.role === \"tool\" && \"tool_call_id\" in msg && typeof msg.content === \"string\") return \"openai\";\n\n // Check content blocks/parts for format-specific markers\n if (Array.isArray(msg.content)) {\n for (const part of msg.content) {\n // Vercel: hyphenated types\n if (part.type === \"tool-call\" || part.type === \"tool-result\") return \"vercel\";\n // Anthropic: underscored types\n if (part.type === \"tool_use\" || part.type === \"tool_result\") return \"anthropic\";\n // Anthropic: image with source.type\n if (part.type === \"image\" && part.source?.type) return \"anthropic\";\n }\n }\n }\n\n // Default: OpenAI (simple {role, content: string} is valid OpenAI)\n return \"openai\";\n}\n\n// ============================================================\n// OpenAI ↔ OpenAI (passthrough)\n// ============================================================\n\n// No conversion needed — this is the canonical format.\n\n// ============================================================\n// Anthropic → OpenAI\n// ============================================================\n\nexport function anthropicToOpenAI(messages: any[]): OpenAIMessage[] {\n const result: OpenAIMessage[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"user\") {\n if (typeof msg.content === \"string\") {\n result.push({ role: \"user\", content: msg.content });\n continue;\n }\n if (Array.isArray(msg.content)) {\n const textBlocks = msg.content.filter((b: any) => b.type === \"text\");\n const toolResults = msg.content.filter((b: any) => b.type === \"tool_result\");\n\n if (textBlocks.length > 0) {\n result.push({\n role: \"user\",\n content: textBlocks.map((b: any) => b.text).join(\"\\n\"),\n });\n }\n for (const tr of toolResults) {\n const content = typeof tr.content === \"string\"\n ? tr.content\n : Array.isArray(tr.content)\n ? tr.content.map((b: any) => b.text ?? JSON.stringify(b)).join(\"\\n\")\n : JSON.stringify(tr.content);\n result.push({\n role: \"tool\",\n content,\n tool_call_id: tr.tool_use_id,\n });\n }\n }\n continue;\n }\n\n if (msg.role === \"assistant\") {\n if (typeof msg.content === \"string\") {\n result.push({ role: \"assistant\", content: msg.content });\n continue;\n }\n if (Array.isArray(msg.content)) {\n const textBlocks = msg.content.filter((b: any) => b.type === \"text\");\n const toolUseBlocks = msg.content.filter((b: any) => b.type === \"tool_use\");\n\n const content = textBlocks.length > 0\n ? textBlocks.map((b: any) => b.text).join(\"\\n\")\n : null;\n\n const openaiMsg: AssistantMessage = { role: \"assistant\", content };\n if (toolUseBlocks.length > 0) {\n openaiMsg.tool_calls = toolUseBlocks.map((b: any): ToolCall => ({\n id: b.id,\n type: \"function\",\n function: {\n name: b.name,\n arguments: typeof b.input === \"string\" ? b.input : JSON.stringify(b.input),\n },\n }));\n }\n result.push(openaiMsg);\n }\n continue;\n }\n }\n\n return result;\n}\n\nexport function openAIToAnthropic(messages: OpenAIMessage[]): any[] {\n const result: any[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n // Anthropic system is top-level, but if it appears in messages, convert to user\n result.push({ role: \"user\", content: msg.content });\n continue;\n }\n\n if (msg.role === \"user\") {\n if (typeof msg.content === \"string\") {\n result.push({ role: \"user\", content: msg.content });\n } else if (Array.isArray(msg.content)) {\n result.push({\n role: \"user\",\n content: msg.content.map((p) =>\n p.type === \"text\" ? { type: \"text\", text: p.text } : { type: \"text\", text: \"\" },\n ),\n });\n }\n continue;\n }\n\n if (msg.role === \"assistant\") {\n const blocks: any[] = [];\n if (msg.content) blocks.push({ type: \"text\", text: msg.content });\n if (msg.tool_calls) {\n for (const tc of msg.tool_calls) {\n blocks.push({\n type: \"tool_use\",\n id: tc.id,\n name: tc.function.name,\n input: JSON.parse(tc.function.arguments),\n });\n }\n }\n result.push({\n role: \"assistant\",\n content: blocks.length === 1 && blocks[0].type === \"text\" ? blocks[0].text : blocks,\n });\n continue;\n }\n\n if (msg.role === \"tool\") {\n result.push({\n role: \"user\",\n content: [\n { type: \"tool_result\", tool_use_id: msg.tool_call_id, content: msg.content },\n ],\n });\n continue;\n }\n }\n\n return result;\n}\n\n// ============================================================\n// Vercel AI SDK → OpenAI\n// ============================================================\n\nexport function vercelToOpenAI(messages: any[]): OpenAIMessage[] {\n const result: OpenAIMessage[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n result.push({ role: \"system\", content: typeof msg.content === \"string\" ? msg.content : String(msg.content) });\n continue;\n }\n\n if (msg.role === \"user\") {\n if (typeof msg.content === \"string\") {\n result.push({ role: \"user\", content: msg.content });\n continue;\n }\n const parts = Array.isArray(msg.content) ? msg.content : [];\n const textParts = parts.filter((p: any) => p.type === \"text\");\n const imageParts = parts.filter((p: any) => p.type === \"image\");\n\n if (imageParts.length === 0 && textParts.length > 0) {\n result.push({ role: \"user\", content: textParts.map((p: any) => p.text).join(\"\") });\n } else {\n const openaiParts = parts\n .filter((p: any) => p.type === \"text\" || p.type === \"image\")\n .map((p: any) => {\n if (p.type === \"text\") return { type: \"text\" as const, text: p.text };\n if (p.type === \"image\") {\n const url = p.image instanceof URL ? p.image.toString() : String(p.image);\n return { type: \"image_url\" as const, image_url: { url } };\n }\n return { type: \"text\" as const, text: \"\" };\n });\n result.push({ role: \"user\", content: openaiParts });\n }\n continue;\n }\n\n if (msg.role === \"assistant\") {\n if (typeof msg.content === \"string\") {\n result.push({ role: \"assistant\", content: msg.content });\n continue;\n }\n const parts = Array.isArray(msg.content) ? msg.content : [];\n const textParts = parts.filter((p: any) => p.type === \"text\");\n const toolCallParts = parts.filter((p: any) => p.type === \"tool-call\");\n\n const content = textParts.length > 0 ? textParts.map((p: any) => p.text).join(\"\") : null;\n const openaiMsg: AssistantMessage = { role: \"assistant\", content };\n\n if (toolCallParts.length > 0) {\n openaiMsg.tool_calls = toolCallParts.map((p: any): ToolCall => ({\n id: p.toolCallId,\n type: \"function\",\n // AI SDK v6 uses `input`, earlier versions used `args`\n function: { name: p.toolName, arguments: JSON.stringify(p.input ?? p.args) },\n }));\n }\n result.push(openaiMsg);\n continue;\n }\n\n if (msg.role === \"tool\") {\n const parts = Array.isArray(msg.content) ? msg.content : [];\n for (const part of parts) {\n if (part.type === \"tool-result\") {\n // AI SDK v6 uses `output: { type, value }`, earlier versions used `result`\n let contentStr: string;\n if (part.output !== undefined) {\n // v6 format: output is { type: 'json', value } or { type: 'text', value }\n const val = part.output?.value ?? part.output;\n contentStr = typeof val === \"string\" ? val : JSON.stringify(val);\n } else if (part.result !== undefined) {\n // Legacy format: result field directly\n contentStr = typeof part.result === \"string\" ? part.result : JSON.stringify(part.result);\n } else {\n contentStr = \"\";\n }\n result.push({\n role: \"tool\",\n content: contentStr,\n tool_call_id: part.toolCallId,\n });\n }\n }\n continue;\n }\n }\n\n return result;\n}\n\nexport function openAIToVercel(messages: OpenAIMessage[]): any[] {\n const result: any[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n result.push({ role: \"system\", content: msg.content });\n continue;\n }\n\n if (msg.role === \"user\") {\n if (typeof msg.content === \"string\") {\n result.push({ role: \"user\", content: [{ type: \"text\", text: msg.content }] });\n } else if (Array.isArray(msg.content)) {\n const parts = msg.content.map((p) => {\n if (p.type === \"text\") return { type: \"text\", text: p.text };\n if (p.type === \"image_url\") return { type: \"image\", image: new URL(p.image_url.url) };\n return { type: \"text\", text: \"\" };\n });\n result.push({ role: \"user\", content: parts });\n }\n continue;\n }\n\n if (msg.role === \"assistant\") {\n const parts: any[] = [];\n if (msg.content) parts.push({ type: \"text\", text: msg.content });\n if (msg.tool_calls) {\n for (const tc of msg.tool_calls) {\n let input: any;\n try { input = JSON.parse(tc.function.arguments); } catch { input = tc.function.arguments ?? {}; }\n parts.push({\n type: \"tool-call\",\n toolCallId: tc.id,\n toolName: tc.function.name,\n input, // AI SDK v6 uses `input`, not `args`\n });\n }\n }\n result.push({ role: \"assistant\", content: parts });\n continue;\n }\n\n if (msg.role === \"tool\") {\n let parsed: any;\n try { parsed = JSON.parse(msg.content); } catch { parsed = msg.content; }\n // AI SDK v6 requires output: { type: 'json' | 'text', value }\n const output = typeof parsed === \"string\"\n ? { type: \"text\" as const, value: parsed }\n : { type: \"json\" as const, value: parsed };\n result.push({\n role: \"tool\",\n content: [{\n type: \"tool-result\",\n toolCallId: msg.tool_call_id,\n toolName: \"unknown\",\n output,\n }],\n });\n continue;\n }\n }\n\n return result;\n}\n\n// ============================================================\n// Google Gemini → OpenAI\n// ============================================================\n\nexport function geminiToOpenAI(messages: any[]): OpenAIMessage[] {\n const result: OpenAIMessage[] = [];\n\n for (const msg of messages) {\n const role = msg.role === \"model\" ? \"assistant\" : \"user\";\n const parts: any[] = msg.parts ?? [];\n\n if (role === \"user\") {\n // Check for functionResponse parts\n const funcResponses = parts.filter((p: any) => p.functionResponse);\n const textParts = parts.filter((p: any) => p.text !== undefined);\n\n if (textParts.length > 0) {\n result.push({ role: \"user\", content: textParts.map((p: any) => p.text).join(\"\\n\") });\n }\n for (const fr of funcResponses) {\n result.push({\n role: \"tool\",\n content: JSON.stringify(fr.functionResponse.response),\n tool_call_id: `gemini_${fr.functionResponse.name}`,\n });\n }\n continue;\n }\n\n if (role === \"assistant\") {\n const textParts = parts.filter((p: any) => p.text !== undefined);\n const funcCalls = parts.filter((p: any) => p.functionCall);\n\n const content = textParts.length > 0 ? textParts.map((p: any) => p.text).join(\"\\n\") : null;\n const openaiMsg: AssistantMessage = { role: \"assistant\", content };\n\n if (funcCalls.length > 0) {\n openaiMsg.tool_calls = funcCalls.map((p: any): ToolCall => ({\n id: `gemini_${p.functionCall.name}`,\n type: \"function\",\n function: {\n name: p.functionCall.name,\n arguments: JSON.stringify(p.functionCall.args),\n },\n }));\n }\n result.push(openaiMsg);\n continue;\n }\n }\n\n return result;\n}\n\nexport function openAIToGemini(messages: OpenAIMessage[]): any[] {\n const result: any[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n // Gemini system is top-level; if in messages, convert to user\n result.push({ role: \"user\", parts: [{ text: msg.content }] });\n continue;\n }\n\n if (msg.role === \"user\") {\n const text = typeof msg.content === \"string\"\n ? msg.content\n : (msg.content ?? []).filter((p) => p.type === \"text\").map((p) => (p as any).text).join(\"\\n\");\n result.push({ role: \"user\", parts: [{ text }] });\n continue;\n }\n\n if (msg.role === \"assistant\") {\n const parts: any[] = [];\n if (msg.content) parts.push({ text: msg.content });\n if (msg.tool_calls) {\n for (const tc of msg.tool_calls) {\n parts.push({\n functionCall: { name: tc.function.name, args: JSON.parse(tc.function.arguments) },\n });\n }\n }\n result.push({ role: \"model\", parts });\n continue;\n }\n\n if (msg.role === \"tool\") {\n let response: any;\n try { response = JSON.parse(msg.content); } catch { response = { result: msg.content }; }\n result.push({\n role: \"user\",\n parts: [{ functionResponse: { name: msg.tool_call_id?.replace(\"gemini_\", \"\") ?? \"unknown\", response } }],\n });\n continue;\n }\n }\n\n return result;\n}\n\n// ============================================================\n// Universal: any format → OpenAI, and OpenAI → original format\n// ============================================================\n\nexport function toOpenAI(messages: any[]): OpenAIMessage[] {\n const format = detectFormat(messages);\n switch (format) {\n case \"openai\": return messages as OpenAIMessage[];\n case \"anthropic\": return anthropicToOpenAI(messages);\n case \"vercel\": return vercelToOpenAI(messages);\n case \"gemini\": return geminiToOpenAI(messages);\n }\n}\n\nexport function fromOpenAI(messages: OpenAIMessage[], targetFormat: MessageFormat): any[] {\n switch (targetFormat) {\n case \"openai\": return messages;\n case \"anthropic\": return openAIToAnthropic(messages);\n case \"vercel\": return openAIToVercel(messages);\n case \"gemini\": return openAIToGemini(messages);\n }\n}\n","/**\n * Compression hooks matching Python headroom.hooks.\n * Allows customizing compression behavior with pre/post hooks.\n */\n\nexport interface CompressContext {\n model: string;\n userQuery: string;\n turnNumber: number;\n toolCalls: string[];\n provider: string;\n}\n\nexport interface CompressEvent {\n tokensBefore: number;\n tokensAfter: number;\n tokensSaved: number;\n compressionRatio: number;\n transformsApplied: string[];\n ccrHashes: string[];\n model: string;\n userQuery: string;\n provider: string;\n}\n\n/**\n * Base class for compression hooks. Override methods to customize behavior.\n *\n * @example\n * ```typescript\n * class LoggingHooks extends CompressionHooks {\n * postCompress(event: CompressEvent) {\n * console.log(`Saved ${event.tokensSaved} tokens (${event.compressionRatio})`);\n * }\n * }\n * ```\n */\nexport class CompressionHooks {\n /**\n * Called before compression. Modify messages before they're sent to the proxy.\n */\n preCompress(\n messages: any[],\n _ctx: CompressContext,\n ): any[] | Promise<any[]> {\n return messages;\n }\n\n /**\n * Compute per-message compression biases.\n * Return a map of message index -> bias (>1 = preserve more, <1 = compress more).\n */\n computeBiases(\n _messages: any[],\n _ctx: CompressContext,\n ): Record<number, number> | Promise<Record<number, number>> {\n return {};\n }\n\n /**\n * Called after compression. Observe-only — cannot modify the result.\n */\n postCompress(_event: CompressEvent): void | Promise<void> {\n // no-op default\n }\n}\n\n/**\n * Extract the last user message text from a messages array (any format).\n */\nexport function extractUserQuery(messages: any[]): string {\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n if (msg.role === \"user\") {\n if (typeof msg.content === \"string\") return msg.content;\n if (Array.isArray(msg.content)) {\n const textPart = msg.content.find(\n (p: any) => p.type === \"text\" || p.text,\n );\n if (textPart) return textPart.text ?? textPart.content ?? \"\";\n }\n }\n }\n return \"\";\n}\n\n/**\n * Count conversation turns (user+assistant pairs).\n */\nexport function countTurns(messages: any[]): number {\n return messages.filter((m) => m.role === \"user\").length;\n}\n\n/**\n * Extract tool call names from messages.\n */\nexport function extractToolCalls(messages: any[]): string[] {\n const names: string[] = [];\n for (const msg of messages) {\n if (msg.tool_calls) {\n for (const tc of msg.tool_calls) {\n names.push(tc.function?.name ?? tc.name ?? \"unknown\");\n }\n }\n if (Array.isArray(msg.content)) {\n for (const part of msg.content) {\n if (part.type === \"tool_use\") names.push(part.name ?? \"unknown\");\n if (part.type === \"tool-call\") names.push(part.toolName ?? \"unknown\");\n }\n }\n }\n return names;\n}\n","/**\n * Universal compress function with hooks support.\n * Accepts messages in any format: OpenAI, Anthropic, Vercel AI SDK, or Google Gemini.\n */\n\nimport { HeadroomClient } from \"./client.js\";\nimport type { CompressResult, CompressOptions } from \"./types.js\";\nimport { detectFormat, toOpenAI, fromOpenAI } from \"./utils/format.js\";\nimport type { CompressionHooks, CompressContext, CompressEvent } from \"./hooks.js\";\nimport { extractUserQuery, countTurns, extractToolCalls } from \"./hooks.js\";\n\n/**\n * Compress an array of messages using the Headroom proxy.\n *\n * Accepts messages in any format: OpenAI, Anthropic, Vercel AI SDK, or Google Gemini.\n * Detects the format automatically, compresses via the proxy, and returns\n * compressed messages in the same format as the input.\n */\nexport async function compress(\n messages: any[],\n options: CompressOptions = {},\n): Promise<CompressResult> {\n const {\n client: providedClient,\n model,\n tokenBudget,\n hooks,\n ...clientOptions\n } = options;\n\n // Build hook context\n const ctx: CompressContext = {\n model: model ?? \"gpt-4o\",\n userQuery: extractUserQuery(messages),\n turnNumber: countTurns(messages),\n toolCalls: extractToolCalls(messages),\n provider: \"\",\n };\n\n // 1. Pre-compress hook\n let processedMessages = messages;\n if (hooks) {\n processedMessages = await hooks.preCompress(messages, ctx);\n }\n\n // 2. Detect input format\n const inputFormat = detectFormat(processedMessages);\n\n // 3. Convert to OpenAI format (the proxy's lingua franca)\n const openaiMessages = toOpenAI(processedMessages);\n\n // 4. Compute biases\n let biases: Record<number, number> = {};\n if (hooks) {\n biases = await hooks.computeBiases(openaiMessages, ctx);\n }\n\n // 5. Compress via proxy\n const client = providedClient ?? new HeadroomClient(clientOptions);\n const result = await client.compress(openaiMessages, { model, tokenBudget });\n\n // 6. Convert compressed messages back to original format\n const outputMessages = fromOpenAI(result.messages, inputFormat);\n\n const finalResult: CompressResult = {\n ...result,\n messages: outputMessages,\n };\n\n // 7. Post-compress hook\n if (hooks) {\n const event: CompressEvent = {\n tokensBefore: result.tokensBefore,\n tokensAfter: result.tokensAfter,\n tokensSaved: result.tokensSaved,\n compressionRatio: result.compressionRatio,\n transformsApplied: result.transformsApplied,\n ccrHashes: result.ccrHashes,\n model: ctx.model,\n userQuery: ctx.userQuery,\n provider: ctx.provider,\n };\n await hooks.postCompress(event);\n }\n\n return finalResult;\n}\n"]}
package/dist/index.cjs CHANGED
@@ -1,23 +1,23 @@
1
1
  'use strict';
2
2
 
3
- var chunkR6FB52AD_cjs = require('./chunk-R6FB52AD.cjs');
3
+ var chunkUVXIB3EK_cjs = require('./chunk-UVXIB3EK.cjs');
4
4
 
5
5
  // src/simulate.ts
6
6
  async function simulate(messages, options = {}) {
7
7
  const { client: providedClient, model, config, ...clientOptions } = options;
8
- const openaiMessages = chunkR6FB52AD_cjs.toOpenAI(messages);
9
- const client = providedClient ?? new chunkR6FB52AD_cjs.HeadroomClient(clientOptions);
8
+ const openaiMessages = chunkUVXIB3EK_cjs.toOpenAI(messages);
9
+ const client = providedClient ?? new chunkUVXIB3EK_cjs.HeadroomClient(clientOptions);
10
10
  const body = {
11
11
  messages: openaiMessages,
12
12
  model: model ?? "gpt-4o",
13
13
  config: {
14
14
  default_mode: "simulate",
15
15
  generate_diff_artifact: true,
16
- ...config ? chunkR6FB52AD_cjs.deepSnakeCase(config) : {}
16
+ ...config ? chunkUVXIB3EK_cjs.deepSnakeCase(config) : {}
17
17
  }
18
18
  };
19
19
  const result = await client.compressRaw(body);
20
- return chunkR6FB52AD_cjs.deepCamelCase(result);
20
+ return chunkUVXIB3EK_cjs.deepCamelCase(result);
21
21
  }
22
22
 
23
23
  // src/shared-context.ts
@@ -29,7 +29,7 @@ var SharedContext = class {
29
29
  maxEntries;
30
30
  constructor(options = {}) {
31
31
  const { model, ttl, maxEntries, ...clientOptions } = options;
32
- this.client = new chunkR6FB52AD_cjs.HeadroomClient(clientOptions);
32
+ this.client = new chunkUVXIB3EK_cjs.HeadroomClient(clientOptions);
33
33
  this.model = model ?? "claude-sonnet-4-5-20250929";
34
34
  this.ttl = ttl ?? 3600;
35
35
  this.maxEntries = maxEntries ?? 100;
@@ -166,7 +166,7 @@ function homeDir() {
166
166
  return "";
167
167
  }
168
168
  try {
169
- const os = chunkR6FB52AD_cjs.__require("os");
169
+ const os = chunkUVXIB3EK_cjs.__require("os");
170
170
  if (os.homedir) {
171
171
  const home = os.homedir();
172
172
  if (home) return home;
@@ -180,7 +180,7 @@ function joinPath(...parts) {
180
180
  return parts.filter((p) => p !== "").join("/");
181
181
  }
182
182
  try {
183
- const path = chunkR6FB52AD_cjs.__require("path");
183
+ const path = chunkUVXIB3EK_cjs.__require("path");
184
184
  if (path.join) return path.join(...parts.filter((p) => p !== ""));
185
185
  } catch {
186
186
  }
@@ -291,11 +291,6 @@ function binDir() {
291
291
  if (!isNode()) return "";
292
292
  return joinPath(workspaceDir(), "bin");
293
293
  }
294
- function rtkPath() {
295
- if (!isNode()) return "";
296
- const name = process.platform === "win32" ? "rtk.exe" : "rtk";
297
- return joinPath(binDir(), name);
298
- }
299
294
  function deployRoot() {
300
295
  if (!isNode()) return "";
301
296
  return joinPath(workspaceDir(), "deploy");
@@ -326,111 +321,111 @@ function pluginWorkspaceDir(pluginName) {
326
321
 
327
322
  Object.defineProperty(exports, "CacheError", {
328
323
  enumerable: true,
329
- get: function () { return chunkR6FB52AD_cjs.CacheError; }
324
+ get: function () { return chunkUVXIB3EK_cjs.CacheError; }
330
325
  });
331
326
  Object.defineProperty(exports, "CompressionHooks", {
332
327
  enumerable: true,
333
- get: function () { return chunkR6FB52AD_cjs.CompressionHooks; }
328
+ get: function () { return chunkUVXIB3EK_cjs.CompressionHooks; }
334
329
  });
335
330
  Object.defineProperty(exports, "ConfigurationError", {
336
331
  enumerable: true,
337
- get: function () { return chunkR6FB52AD_cjs.ConfigurationError; }
332
+ get: function () { return chunkUVXIB3EK_cjs.ConfigurationError; }
338
333
  });
339
334
  Object.defineProperty(exports, "HeadroomAuthError", {
340
335
  enumerable: true,
341
- get: function () { return chunkR6FB52AD_cjs.HeadroomAuthError; }
336
+ get: function () { return chunkUVXIB3EK_cjs.HeadroomAuthError; }
342
337
  });
343
338
  Object.defineProperty(exports, "HeadroomClient", {
344
339
  enumerable: true,
345
- get: function () { return chunkR6FB52AD_cjs.HeadroomClient; }
340
+ get: function () { return chunkUVXIB3EK_cjs.HeadroomClient; }
346
341
  });
347
342
  Object.defineProperty(exports, "HeadroomCompressError", {
348
343
  enumerable: true,
349
- get: function () { return chunkR6FB52AD_cjs.HeadroomCompressError; }
344
+ get: function () { return chunkUVXIB3EK_cjs.HeadroomCompressError; }
350
345
  });
351
346
  Object.defineProperty(exports, "HeadroomConnectionError", {
352
347
  enumerable: true,
353
- get: function () { return chunkR6FB52AD_cjs.HeadroomConnectionError; }
348
+ get: function () { return chunkUVXIB3EK_cjs.HeadroomConnectionError; }
354
349
  });
355
350
  Object.defineProperty(exports, "HeadroomError", {
356
351
  enumerable: true,
357
- get: function () { return chunkR6FB52AD_cjs.HeadroomError; }
352
+ get: function () { return chunkUVXIB3EK_cjs.HeadroomError; }
358
353
  });
359
354
  Object.defineProperty(exports, "ProviderError", {
360
355
  enumerable: true,
361
- get: function () { return chunkR6FB52AD_cjs.ProviderError; }
356
+ get: function () { return chunkUVXIB3EK_cjs.ProviderError; }
362
357
  });
363
358
  Object.defineProperty(exports, "StorageError", {
364
359
  enumerable: true,
365
- get: function () { return chunkR6FB52AD_cjs.StorageError; }
360
+ get: function () { return chunkUVXIB3EK_cjs.StorageError; }
366
361
  });
367
362
  Object.defineProperty(exports, "TokenizationError", {
368
363
  enumerable: true,
369
- get: function () { return chunkR6FB52AD_cjs.TokenizationError; }
364
+ get: function () { return chunkUVXIB3EK_cjs.TokenizationError; }
370
365
  });
371
366
  Object.defineProperty(exports, "TransformError", {
372
367
  enumerable: true,
373
- get: function () { return chunkR6FB52AD_cjs.TransformError; }
368
+ get: function () { return chunkUVXIB3EK_cjs.TransformError; }
374
369
  });
375
370
  Object.defineProperty(exports, "ValidationError", {
376
371
  enumerable: true,
377
- get: function () { return chunkR6FB52AD_cjs.ValidationError; }
372
+ get: function () { return chunkUVXIB3EK_cjs.ValidationError; }
378
373
  });
379
374
  Object.defineProperty(exports, "camelToSnake", {
380
375
  enumerable: true,
381
- get: function () { return chunkR6FB52AD_cjs.camelToSnake; }
376
+ get: function () { return chunkUVXIB3EK_cjs.camelToSnake; }
382
377
  });
383
378
  Object.defineProperty(exports, "collectStream", {
384
379
  enumerable: true,
385
- get: function () { return chunkR6FB52AD_cjs.collectStream; }
380
+ get: function () { return chunkUVXIB3EK_cjs.collectStream; }
386
381
  });
387
382
  Object.defineProperty(exports, "compress", {
388
383
  enumerable: true,
389
- get: function () { return chunkR6FB52AD_cjs.compress; }
384
+ get: function () { return chunkUVXIB3EK_cjs.compress; }
390
385
  });
391
386
  Object.defineProperty(exports, "countTurns", {
392
387
  enumerable: true,
393
- get: function () { return chunkR6FB52AD_cjs.countTurns; }
388
+ get: function () { return chunkUVXIB3EK_cjs.countTurns; }
394
389
  });
395
390
  Object.defineProperty(exports, "deepCamelCase", {
396
391
  enumerable: true,
397
- get: function () { return chunkR6FB52AD_cjs.deepCamelCase; }
392
+ get: function () { return chunkUVXIB3EK_cjs.deepCamelCase; }
398
393
  });
399
394
  Object.defineProperty(exports, "deepSnakeCase", {
400
395
  enumerable: true,
401
- get: function () { return chunkR6FB52AD_cjs.deepSnakeCase; }
396
+ get: function () { return chunkUVXIB3EK_cjs.deepSnakeCase; }
402
397
  });
403
398
  Object.defineProperty(exports, "detectFormat", {
404
399
  enumerable: true,
405
- get: function () { return chunkR6FB52AD_cjs.detectFormat; }
400
+ get: function () { return chunkUVXIB3EK_cjs.detectFormat; }
406
401
  });
407
402
  Object.defineProperty(exports, "extractToolCalls", {
408
403
  enumerable: true,
409
- get: function () { return chunkR6FB52AD_cjs.extractToolCalls; }
404
+ get: function () { return chunkUVXIB3EK_cjs.extractToolCalls; }
410
405
  });
411
406
  Object.defineProperty(exports, "extractUserQuery", {
412
407
  enumerable: true,
413
- get: function () { return chunkR6FB52AD_cjs.extractUserQuery; }
408
+ get: function () { return chunkUVXIB3EK_cjs.extractUserQuery; }
414
409
  });
415
410
  Object.defineProperty(exports, "fromOpenAI", {
416
411
  enumerable: true,
417
- get: function () { return chunkR6FB52AD_cjs.fromOpenAI; }
412
+ get: function () { return chunkUVXIB3EK_cjs.fromOpenAI; }
418
413
  });
419
414
  Object.defineProperty(exports, "mapProxyError", {
420
415
  enumerable: true,
421
- get: function () { return chunkR6FB52AD_cjs.mapProxyError; }
416
+ get: function () { return chunkUVXIB3EK_cjs.mapProxyError; }
422
417
  });
423
418
  Object.defineProperty(exports, "parseSSE", {
424
419
  enumerable: true,
425
- get: function () { return chunkR6FB52AD_cjs.parseSSE; }
420
+ get: function () { return chunkUVXIB3EK_cjs.parseSSE; }
426
421
  });
427
422
  Object.defineProperty(exports, "snakeToCamel", {
428
423
  enumerable: true,
429
- get: function () { return chunkR6FB52AD_cjs.snakeToCamel; }
424
+ get: function () { return chunkUVXIB3EK_cjs.snakeToCamel; }
430
425
  });
431
426
  Object.defineProperty(exports, "toOpenAI", {
432
427
  enumerable: true,
433
- get: function () { return chunkR6FB52AD_cjs.toOpenAI; }
428
+ get: function () { return chunkUVXIB3EK_cjs.toOpenAI; }
434
429
  });
435
430
  exports.HEADROOM_CONFIG_DIR_ENV = HEADROOM_CONFIG_DIR_ENV;
436
431
  exports.HEADROOM_SAVINGS_PATH_ENV = HEADROOM_SAVINGS_PATH_ENV;
@@ -452,7 +447,6 @@ exports.nativeMemoryDir = nativeMemoryDir;
452
447
  exports.pluginConfigDir = pluginConfigDir;
453
448
  exports.pluginWorkspaceDir = pluginWorkspaceDir;
454
449
  exports.proxyLogPath = proxyLogPath;
455
- exports.rtkPath = rtkPath;
456
450
  exports.savingsPath = savingsPath;
457
451
  exports.sessionStatsPath = sessionStatsPath;
458
452
  exports.simulate = simulate;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/simulate.ts","../src/shared-context.ts","../src/paths.ts"],"names":["toOpenAI","HeadroomClient","deepSnakeCase","deepCamelCase","__require"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Simulation API — dry-run compression to see what would happen.\n * Matches Python client.simulate() behavior.\n */\n\nimport { HeadroomClient } from \"./client.js\";\nimport type { HeadroomClientOptions } from \"./types.js\";\nimport type { SimulationResult } from \"./types/models.js\";\nimport type { HeadroomConfig } from \"./types/config.js\";\nimport { deepCamelCase, deepSnakeCase } from \"./utils/case.js\";\nimport { detectFormat, toOpenAI } from \"./utils/format.js\";\n\nexport interface SimulateOptions extends HeadroomClientOptions {\n model?: string;\n config?: HeadroomConfig;\n client?: HeadroomClient;\n}\n\n/**\n * Simulate compression without calling the LLM.\n * Shows what compression would do: token savings, transforms, waste signals.\n *\n * @example\n * ```typescript\n * const sim = await simulate(messages, { model: 'gpt-4o' });\n * console.log(`Would save ${sim.tokensSaved} tokens (${sim.estimatedSavings})`);\n * console.log('Transforms:', sim.transforms);\n * ```\n */\nexport async function simulate(\n messages: any[],\n options: SimulateOptions = {},\n): Promise<SimulationResult> {\n const { client: providedClient, model, config, ...clientOptions } = options;\n\n const openaiMessages = toOpenAI(messages);\n const client = providedClient ?? new HeadroomClient(clientOptions);\n\n const body: Record<string, any> = {\n messages: openaiMessages,\n model: model ?? \"gpt-4o\",\n config: {\n default_mode: \"simulate\",\n generate_diff_artifact: true,\n ...(config ? deepSnakeCase(config) : {}),\n },\n };\n\n // Use the client's internal fetch to hit /v1/compress with simulation config\n const result = await client.compressRaw(body);\n return deepCamelCase<SimulationResult>(result);\n}\n","/**\n * SharedContext — compressed inter-agent context sharing.\n * Matches Python headroom.shared_context.SharedContext.\n */\n\nimport { HeadroomClient } from \"./client.js\";\nimport type { HeadroomClientOptions, CompressResult } from \"./types.js\";\n\nexport interface ContextEntry {\n key: string;\n original: string;\n compressed: string;\n originalTokens: number;\n compressedTokens: number;\n agent: string | null;\n timestamp: number;\n transforms: string[];\n savingsPercent: number;\n}\n\nexport interface SharedContextStats {\n entries: number;\n totalOriginalTokens: number;\n totalCompressedTokens: number;\n totalTokensSaved: number;\n savingsPercent: number;\n}\n\nexport interface SharedContextOptions extends HeadroomClientOptions {\n model?: string;\n ttl?: number;\n maxEntries?: number;\n}\n\nexport class SharedContext {\n private entries = new Map<string, ContextEntry>();\n private client: HeadroomClient;\n private model: string;\n private ttl: number;\n private maxEntries: number;\n\n constructor(options: SharedContextOptions = {}) {\n const { model, ttl, maxEntries, ...clientOptions } = options;\n this.client = new HeadroomClient(clientOptions);\n this.model = model ?? \"claude-sonnet-4-5-20250929\";\n this.ttl = ttl ?? 3600;\n this.maxEntries = maxEntries ?? 100;\n }\n\n /**\n * Store content with compression.\n */\n async put(\n key: string,\n content: string,\n options?: { agent?: string },\n ): Promise<ContextEntry> {\n this.evictExpired();\n this.evictIfFull();\n\n const messages = [{ role: \"user\" as const, content }];\n let result: CompressResult;\n try {\n result = await this.client.compress(messages, { model: this.model });\n } catch {\n // If proxy unavailable, store uncompressed\n result = {\n messages,\n tokensBefore: content.length / 4, // rough estimate\n tokensAfter: content.length / 4,\n tokensSaved: 0,\n compressionRatio: 1.0,\n transformsApplied: [],\n ccrHashes: [],\n compressed: false,\n };\n }\n\n const compressed = result.compressed\n ? typeof result.messages[0]?.content === \"string\"\n ? result.messages[0].content\n : JSON.stringify(result.messages[0]?.content ?? content)\n : content;\n\n const entry: ContextEntry = {\n key,\n original: content,\n compressed,\n originalTokens: result.tokensBefore,\n compressedTokens: result.tokensAfter,\n agent: options?.agent ?? null,\n timestamp: Date.now() / 1000,\n transforms: result.transformsApplied,\n savingsPercent:\n result.tokensBefore > 0\n ? ((result.tokensBefore - result.tokensAfter) / result.tokensBefore) *\n 100\n : 0,\n };\n\n this.entries.set(key, entry);\n return entry;\n }\n\n /**\n * Get content by key. Returns compressed by default, full original if full=true.\n */\n get(key: string, options?: { full?: boolean }): string | null {\n const entry = this.entries.get(key);\n if (!entry) return null;\n\n if (Date.now() / 1000 - entry.timestamp > this.ttl) {\n this.entries.delete(key);\n return null;\n }\n\n return options?.full ? entry.original : entry.compressed;\n }\n\n /**\n * Get full entry metadata.\n */\n getEntry(key: string): ContextEntry | null {\n const entry = this.entries.get(key);\n if (!entry) return null;\n\n if (Date.now() / 1000 - entry.timestamp > this.ttl) {\n this.entries.delete(key);\n return null;\n }\n\n return entry;\n }\n\n /**\n * List all stored keys (excluding expired).\n */\n keys(): string[] {\n this.evictExpired();\n return Array.from(this.entries.keys());\n }\n\n /**\n * Get aggregated statistics.\n */\n stats(): SharedContextStats {\n this.evictExpired();\n let totalOriginal = 0;\n let totalCompressed = 0;\n\n for (const entry of this.entries.values()) {\n totalOriginal += entry.originalTokens;\n totalCompressed += entry.compressedTokens;\n }\n\n const saved = totalOriginal - totalCompressed;\n return {\n entries: this.entries.size,\n totalOriginalTokens: totalOriginal,\n totalCompressedTokens: totalCompressed,\n totalTokensSaved: saved,\n savingsPercent: totalOriginal > 0 ? (saved / totalOriginal) * 100 : 0,\n };\n }\n\n /**\n * Clear all entries.\n */\n clear(): void {\n this.entries.clear();\n }\n\n private evictExpired(): void {\n const now = Date.now() / 1000;\n for (const [key, entry] of this.entries) {\n if (now - entry.timestamp > this.ttl) {\n this.entries.delete(key);\n }\n }\n }\n\n private evictIfFull(): void {\n while (this.entries.size >= this.maxEntries) {\n const oldest = this.entries.keys().next().value;\n if (oldest !== undefined) this.entries.delete(oldest);\n }\n }\n}\n","/**\n * Canonical filesystem contract for Headroom — parity shell for the npm SDK.\n *\n * The TypeScript SDK is an HTTP client today and does not touch the\n * filesystem directly. This module mirrors `headroom/paths.py` so that\n * future local features (e.g. cache/log co-location with the Python\n * proxy) land on the same contract.\n *\n * Two canonical roots:\n * - HEADROOM_CONFIG_DIR — read-mostly configuration\n * (default: ~/.headroom/config)\n * - HEADROOM_WORKSPACE_DIR — read-write state\n * (default: ~/.headroom)\n *\n * Precedence for every per-resource helper is:\n * explicit argument > per-resource env var > derived from canonical\n * root > default.\n *\n * Browser behavior: when `process` is not available (typeof process ===\n * \"undefined\"), all helpers return the empty string. Consumers running\n * in a browser should not call these helpers; they exist here so the\n * shape of the API matches Python's `headroom.paths` module.\n */\n\n// ---------------------------------------------------------------------------\n// Env var names\n// ---------------------------------------------------------------------------\n\nexport const HEADROOM_CONFIG_DIR_ENV = \"HEADROOM_CONFIG_DIR\";\nexport const HEADROOM_WORKSPACE_DIR_ENV = \"HEADROOM_WORKSPACE_DIR\";\n\nexport const HEADROOM_SAVINGS_PATH_ENV = \"HEADROOM_SAVINGS_PATH\";\nexport const HEADROOM_TOIN_PATH_ENV = \"HEADROOM_TOIN_PATH\";\nexport const HEADROOM_SUBSCRIPTION_STATE_PATH_ENV =\n \"HEADROOM_SUBSCRIPTION_STATE_PATH\";\n\n// ---------------------------------------------------------------------------\n// Node / browser guard (mirrors the pattern in client.ts::getEnv)\n// ---------------------------------------------------------------------------\n\nfunction isNode(): boolean {\n return (\n typeof process !== \"undefined\" &&\n typeof process.versions !== \"undefined\" &&\n typeof process.versions.node === \"string\"\n );\n}\n\nfunction getEnv(name: string): string {\n if (typeof process === \"undefined\" || !process.env) {\n return \"\";\n }\n const value = process.env[name];\n return typeof value === \"string\" ? value.trim() : \"\";\n}\n\nfunction homeDir(): string {\n if (!isNode()) {\n return \"\";\n }\n // Prefer the userInfo API, fall back to HOME / USERPROFILE env vars.\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const os = require(\"os\") as { homedir?: () => string };\n if (os.homedir) {\n const home = os.homedir();\n if (home) return home;\n }\n } catch {\n // ignore — fall back to env\n }\n return getEnv(\"HOME\") || getEnv(\"USERPROFILE\") || \"\";\n}\n\nfunction joinPath(...parts: string[]): string {\n if (!isNode()) {\n // Browser fallback — keep it simple, use forward slashes.\n return parts.filter((p) => p !== \"\").join(\"/\");\n }\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const path = require(\"path\") as {\n join?: (...p: string[]) => string;\n };\n if (path.join) return path.join(...parts.filter((p) => p !== \"\"));\n } catch {\n // ignore — fall back\n }\n const sep = process.platform === \"win32\" ? \"\\\\\" : \"/\";\n return parts.filter((p) => p !== \"\").join(sep);\n}\n\nfunction expandTilde(p: string): string {\n if (!p.startsWith(\"~\")) return p;\n const home = homeDir();\n if (!home) return p;\n if (p === \"~\") return home;\n if (p.startsWith(\"~/\") || p.startsWith(\"~\\\\\")) {\n return joinPath(home, p.slice(2));\n }\n return p;\n}\n\nfunction resolve(\n explicit: string | undefined,\n envVar: string,\n derived: string,\n): string {\n if (!isNode()) {\n // Browser fallback: no filesystem, return empty string.\n return \"\";\n }\n if (explicit !== undefined && explicit !== \"\") {\n return expandTilde(explicit);\n }\n const envValue = getEnv(envVar);\n if (envValue) {\n return expandTilde(envValue);\n }\n return derived;\n}\n\n// ---------------------------------------------------------------------------\n// Canonical roots\n// ---------------------------------------------------------------------------\n\nexport function workspaceDir(): string {\n if (!isNode()) return \"\";\n const envValue = getEnv(HEADROOM_WORKSPACE_DIR_ENV);\n if (envValue) return expandTilde(envValue);\n const home = homeDir();\n if (!home) return \"\";\n return joinPath(home, \".headroom\");\n}\n\nexport function configDir(): string {\n if (!isNode()) return \"\";\n const envValue = getEnv(HEADROOM_CONFIG_DIR_ENV);\n if (envValue) return expandTilde(envValue);\n const workspaceEnv = getEnv(HEADROOM_WORKSPACE_DIR_ENV);\n if (workspaceEnv) {\n return joinPath(expandTilde(workspaceEnv), \"config\");\n }\n const home = homeDir();\n if (!home) return \"\";\n return joinPath(home, \".headroom\", \"config\");\n}\n\n// ---------------------------------------------------------------------------\n// Per-resource helpers -- workspace bucket\n// ---------------------------------------------------------------------------\n\nexport function savingsPath(explicit?: string): string {\n return resolve(\n explicit,\n HEADROOM_SAVINGS_PATH_ENV,\n joinPath(workspaceDir(), \"proxy_savings.json\"),\n );\n}\n\nexport function toinPath(explicit?: string): string {\n return resolve(\n explicit,\n HEADROOM_TOIN_PATH_ENV,\n joinPath(workspaceDir(), \"toin.json\"),\n );\n}\n\nexport function subscriptionStatePath(explicit?: string): string {\n return resolve(\n explicit,\n HEADROOM_SUBSCRIPTION_STATE_PATH_ENV,\n joinPath(workspaceDir(), \"subscription_state.json\"),\n );\n}\n\nexport function memoryDbPath(): string {\n if (!isNode()) return \"\";\n return joinPath(workspaceDir(), \"memory.db\");\n}\n\nexport function nativeMemoryDir(): string {\n if (!isNode()) return \"\";\n return joinPath(workspaceDir(), \"memories\");\n}\n\nexport function licenseCachePath(): string {\n if (!isNode()) return \"\";\n return joinPath(workspaceDir(), \"license_cache.json\");\n}\n\nexport function sessionStatsPath(): string {\n if (!isNode()) return \"\";\n return joinPath(workspaceDir(), \"session_stats.jsonl\");\n}\n\nexport function syncStatePath(): string {\n if (!isNode()) return \"\";\n return joinPath(workspaceDir(), \"sync_state.json\");\n}\n\nexport function bridgeStatePath(): string {\n if (!isNode()) return \"\";\n return joinPath(workspaceDir(), \"bridge_state.json\");\n}\n\nexport function logDir(): string {\n if (!isNode()) return \"\";\n return joinPath(workspaceDir(), \"logs\");\n}\n\nexport function proxyLogPath(): string {\n if (!isNode()) return \"\";\n return joinPath(logDir(), \"proxy.log\");\n}\n\nexport function debug400Dir(): string {\n if (!isNode()) return \"\";\n return joinPath(logDir(), \"debug_400\");\n}\n\nexport function binDir(): string {\n if (!isNode()) return \"\";\n return joinPath(workspaceDir(), \"bin\");\n}\n\nexport function rtkPath(): string {\n if (!isNode()) return \"\";\n const name = process.platform === \"win32\" ? \"rtk.exe\" : \"rtk\";\n return joinPath(binDir(), name);\n}\n\nexport function deployRoot(): string {\n if (!isNode()) return \"\";\n return joinPath(workspaceDir(), \"deploy\");\n}\n\nexport function beaconLockPath(port: number): string {\n if (!isNode()) return \"\";\n return joinPath(workspaceDir(), `.beacon_lock_${Math.trunc(port)}`);\n}\n\n// ---------------------------------------------------------------------------\n// Per-resource helpers -- config bucket\n// ---------------------------------------------------------------------------\n\nexport function modelsConfigPath(): string {\n if (!isNode()) return \"\";\n return joinPath(configDir(), \"models.json\");\n}\n\n// ---------------------------------------------------------------------------\n// Plugin-author entry points\n// ---------------------------------------------------------------------------\n\nfunction assertPluginName(name: string): void {\n if (!name || name.includes(\"/\") || name.includes(\"\\\\\")) {\n throw new Error(`invalid plugin name: ${JSON.stringify(name)}`);\n }\n}\n\nexport function pluginConfigDir(pluginName: string): string {\n assertPluginName(pluginName);\n if (!isNode()) return \"\";\n return joinPath(configDir(), \"plugins\", pluginName);\n}\n\nexport function pluginWorkspaceDir(pluginName: string): string {\n assertPluginName(pluginName);\n if (!isNode()) return \"\";\n return joinPath(workspaceDir(), \"plugins\", pluginName);\n}\n"]}
1
+ {"version":3,"sources":["../src/simulate.ts","../src/shared-context.ts","../src/paths.ts"],"names":["toOpenAI","HeadroomClient","deepSnakeCase","deepCamelCase","__require"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Simulation API — dry-run compression to see what would happen.\n * Matches Python client.simulate() behavior.\n */\n\nimport { HeadroomClient } from \"./client.js\";\nimport type { HeadroomClientOptions } from \"./types.js\";\nimport type { SimulationResult } from \"./types/models.js\";\nimport type { HeadroomConfig } from \"./types/config.js\";\nimport { deepCamelCase, deepSnakeCase } from \"./utils/case.js\";\nimport { detectFormat, toOpenAI } from \"./utils/format.js\";\n\nexport interface SimulateOptions extends HeadroomClientOptions {\n model?: string;\n config?: HeadroomConfig;\n client?: HeadroomClient;\n}\n\n/**\n * Simulate compression without calling the LLM.\n * Shows what compression would do: token savings, transforms, waste signals.\n *\n * @example\n * ```typescript\n * const sim = await simulate(messages, { model: 'gpt-4o' });\n * console.log(`Would save ${sim.tokensSaved} tokens (${sim.estimatedSavings})`);\n * console.log('Transforms:', sim.transforms);\n * ```\n */\nexport async function simulate(\n messages: any[],\n options: SimulateOptions = {},\n): Promise<SimulationResult> {\n const { client: providedClient, model, config, ...clientOptions } = options;\n\n const openaiMessages = toOpenAI(messages);\n const client = providedClient ?? new HeadroomClient(clientOptions);\n\n const body: Record<string, any> = {\n messages: openaiMessages,\n model: model ?? \"gpt-4o\",\n config: {\n default_mode: \"simulate\",\n generate_diff_artifact: true,\n ...(config ? deepSnakeCase(config) : {}),\n },\n };\n\n // Use the client's internal fetch to hit /v1/compress with simulation config\n const result = await client.compressRaw(body);\n return deepCamelCase<SimulationResult>(result);\n}\n","/**\n * SharedContext — compressed inter-agent context sharing.\n * Matches Python headroom.shared_context.SharedContext.\n */\n\nimport { HeadroomClient } from \"./client.js\";\nimport type { HeadroomClientOptions, CompressResult } from \"./types.js\";\n\nexport interface ContextEntry {\n key: string;\n original: string;\n compressed: string;\n originalTokens: number;\n compressedTokens: number;\n agent: string | null;\n timestamp: number;\n transforms: string[];\n savingsPercent: number;\n}\n\nexport interface SharedContextStats {\n entries: number;\n totalOriginalTokens: number;\n totalCompressedTokens: number;\n totalTokensSaved: number;\n savingsPercent: number;\n}\n\nexport interface SharedContextOptions extends HeadroomClientOptions {\n model?: string;\n ttl?: number;\n maxEntries?: number;\n}\n\nexport class SharedContext {\n private entries = new Map<string, ContextEntry>();\n private client: HeadroomClient;\n private model: string;\n private ttl: number;\n private maxEntries: number;\n\n constructor(options: SharedContextOptions = {}) {\n const { model, ttl, maxEntries, ...clientOptions } = options;\n this.client = new HeadroomClient(clientOptions);\n this.model = model ?? \"claude-sonnet-4-5-20250929\";\n this.ttl = ttl ?? 3600;\n this.maxEntries = maxEntries ?? 100;\n }\n\n /**\n * Store content with compression.\n */\n async put(\n key: string,\n content: string,\n options?: { agent?: string },\n ): Promise<ContextEntry> {\n this.evictExpired();\n this.evictIfFull();\n\n const messages = [{ role: \"user\" as const, content }];\n let result: CompressResult;\n try {\n result = await this.client.compress(messages, { model: this.model });\n } catch {\n // If proxy unavailable, store uncompressed\n result = {\n messages,\n tokensBefore: content.length / 4, // rough estimate\n tokensAfter: content.length / 4,\n tokensSaved: 0,\n compressionRatio: 1.0,\n transformsApplied: [],\n ccrHashes: [],\n compressed: false,\n };\n }\n\n const compressed = result.compressed\n ? typeof result.messages[0]?.content === \"string\"\n ? result.messages[0].content\n : JSON.stringify(result.messages[0]?.content ?? content)\n : content;\n\n const entry: ContextEntry = {\n key,\n original: content,\n compressed,\n originalTokens: result.tokensBefore,\n compressedTokens: result.tokensAfter,\n agent: options?.agent ?? null,\n timestamp: Date.now() / 1000,\n transforms: result.transformsApplied,\n savingsPercent:\n result.tokensBefore > 0\n ? ((result.tokensBefore - result.tokensAfter) / result.tokensBefore) *\n 100\n : 0,\n };\n\n this.entries.set(key, entry);\n return entry;\n }\n\n /**\n * Get content by key. Returns compressed by default, full original if full=true.\n */\n get(key: string, options?: { full?: boolean }): string | null {\n const entry = this.entries.get(key);\n if (!entry) return null;\n\n if (Date.now() / 1000 - entry.timestamp > this.ttl) {\n this.entries.delete(key);\n return null;\n }\n\n return options?.full ? entry.original : entry.compressed;\n }\n\n /**\n * Get full entry metadata.\n */\n getEntry(key: string): ContextEntry | null {\n const entry = this.entries.get(key);\n if (!entry) return null;\n\n if (Date.now() / 1000 - entry.timestamp > this.ttl) {\n this.entries.delete(key);\n return null;\n }\n\n return entry;\n }\n\n /**\n * List all stored keys (excluding expired).\n */\n keys(): string[] {\n this.evictExpired();\n return Array.from(this.entries.keys());\n }\n\n /**\n * Get aggregated statistics.\n */\n stats(): SharedContextStats {\n this.evictExpired();\n let totalOriginal = 0;\n let totalCompressed = 0;\n\n for (const entry of this.entries.values()) {\n totalOriginal += entry.originalTokens;\n totalCompressed += entry.compressedTokens;\n }\n\n const saved = totalOriginal - totalCompressed;\n return {\n entries: this.entries.size,\n totalOriginalTokens: totalOriginal,\n totalCompressedTokens: totalCompressed,\n totalTokensSaved: saved,\n savingsPercent: totalOriginal > 0 ? (saved / totalOriginal) * 100 : 0,\n };\n }\n\n /**\n * Clear all entries.\n */\n clear(): void {\n this.entries.clear();\n }\n\n private evictExpired(): void {\n const now = Date.now() / 1000;\n for (const [key, entry] of this.entries) {\n if (now - entry.timestamp > this.ttl) {\n this.entries.delete(key);\n }\n }\n }\n\n private evictIfFull(): void {\n while (this.entries.size >= this.maxEntries) {\n const oldest = this.entries.keys().next().value;\n if (oldest !== undefined) this.entries.delete(oldest);\n }\n }\n}\n","/**\n * Canonical filesystem contract for Headroom — parity shell for the npm SDK.\n *\n * The TypeScript SDK is an HTTP client today and does not touch the\n * filesystem directly. This module mirrors `headroom/paths.py` so that\n * future local features (e.g. cache/log co-location with the Python\n * proxy) land on the same contract.\n *\n * Two canonical roots:\n * - HEADROOM_CONFIG_DIR — read-mostly configuration\n * (default: ~/.headroom/config)\n * - HEADROOM_WORKSPACE_DIR — read-write state\n * (default: ~/.headroom)\n *\n * Precedence for every per-resource helper is:\n * explicit argument > per-resource env var > derived from canonical\n * root > default.\n *\n * Browser behavior: when `process` is not available (typeof process ===\n * \"undefined\"), all helpers return the empty string. Consumers running\n * in a browser should not call these helpers; they exist here so the\n * shape of the API matches Python's `headroom.paths` module.\n */\n\n// ---------------------------------------------------------------------------\n// Env var names\n// ---------------------------------------------------------------------------\n\nexport const HEADROOM_CONFIG_DIR_ENV = \"HEADROOM_CONFIG_DIR\";\nexport const HEADROOM_WORKSPACE_DIR_ENV = \"HEADROOM_WORKSPACE_DIR\";\n\nexport const HEADROOM_SAVINGS_PATH_ENV = \"HEADROOM_SAVINGS_PATH\";\nexport const HEADROOM_TOIN_PATH_ENV = \"HEADROOM_TOIN_PATH\";\nexport const HEADROOM_SUBSCRIPTION_STATE_PATH_ENV =\n \"HEADROOM_SUBSCRIPTION_STATE_PATH\";\n\n// ---------------------------------------------------------------------------\n// Node / browser guard (mirrors the pattern in client.ts::getEnv)\n// ---------------------------------------------------------------------------\n\nfunction isNode(): boolean {\n return (\n typeof process !== \"undefined\" &&\n typeof process.versions !== \"undefined\" &&\n typeof process.versions.node === \"string\"\n );\n}\n\nfunction getEnv(name: string): string {\n if (typeof process === \"undefined\" || !process.env) {\n return \"\";\n }\n const value = process.env[name];\n return typeof value === \"string\" ? value.trim() : \"\";\n}\n\nfunction homeDir(): string {\n if (!isNode()) {\n return \"\";\n }\n // Prefer the userInfo API, fall back to HOME / USERPROFILE env vars.\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const os = require(\"os\") as { homedir?: () => string };\n if (os.homedir) {\n const home = os.homedir();\n if (home) return home;\n }\n } catch {\n // ignore — fall back to env\n }\n return getEnv(\"HOME\") || getEnv(\"USERPROFILE\") || \"\";\n}\n\nfunction joinPath(...parts: string[]): string {\n if (!isNode()) {\n // Browser fallback — keep it simple, use forward slashes.\n return parts.filter((p) => p !== \"\").join(\"/\");\n }\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const path = require(\"path\") as {\n join?: (...p: string[]) => string;\n };\n if (path.join) return path.join(...parts.filter((p) => p !== \"\"));\n } catch {\n // ignore — fall back\n }\n const sep = process.platform === \"win32\" ? \"\\\\\" : \"/\";\n return parts.filter((p) => p !== \"\").join(sep);\n}\n\nfunction expandTilde(p: string): string {\n if (!p.startsWith(\"~\")) return p;\n const home = homeDir();\n if (!home) return p;\n if (p === \"~\") return home;\n if (p.startsWith(\"~/\") || p.startsWith(\"~\\\\\")) {\n return joinPath(home, p.slice(2));\n }\n return p;\n}\n\nfunction resolve(\n explicit: string | undefined,\n envVar: string,\n derived: string,\n): string {\n if (!isNode()) {\n // Browser fallback: no filesystem, return empty string.\n return \"\";\n }\n if (explicit !== undefined && explicit !== \"\") {\n return expandTilde(explicit);\n }\n const envValue = getEnv(envVar);\n if (envValue) {\n return expandTilde(envValue);\n }\n return derived;\n}\n\n// ---------------------------------------------------------------------------\n// Canonical roots\n// ---------------------------------------------------------------------------\n\nexport function workspaceDir(): string {\n if (!isNode()) return \"\";\n const envValue = getEnv(HEADROOM_WORKSPACE_DIR_ENV);\n if (envValue) return expandTilde(envValue);\n const home = homeDir();\n if (!home) return \"\";\n return joinPath(home, \".headroom\");\n}\n\nexport function configDir(): string {\n if (!isNode()) return \"\";\n const envValue = getEnv(HEADROOM_CONFIG_DIR_ENV);\n if (envValue) return expandTilde(envValue);\n const workspaceEnv = getEnv(HEADROOM_WORKSPACE_DIR_ENV);\n if (workspaceEnv) {\n return joinPath(expandTilde(workspaceEnv), \"config\");\n }\n const home = homeDir();\n if (!home) return \"\";\n return joinPath(home, \".headroom\", \"config\");\n}\n\n// ---------------------------------------------------------------------------\n// Per-resource helpers -- workspace bucket\n// ---------------------------------------------------------------------------\n\nexport function savingsPath(explicit?: string): string {\n return resolve(\n explicit,\n HEADROOM_SAVINGS_PATH_ENV,\n joinPath(workspaceDir(), \"proxy_savings.json\"),\n );\n}\n\nexport function toinPath(explicit?: string): string {\n return resolve(\n explicit,\n HEADROOM_TOIN_PATH_ENV,\n joinPath(workspaceDir(), \"toin.json\"),\n );\n}\n\nexport function subscriptionStatePath(explicit?: string): string {\n return resolve(\n explicit,\n HEADROOM_SUBSCRIPTION_STATE_PATH_ENV,\n joinPath(workspaceDir(), \"subscription_state.json\"),\n );\n}\n\nexport function memoryDbPath(): string {\n if (!isNode()) return \"\";\n return joinPath(workspaceDir(), \"memory.db\");\n}\n\nexport function nativeMemoryDir(): string {\n if (!isNode()) return \"\";\n return joinPath(workspaceDir(), \"memories\");\n}\n\nexport function licenseCachePath(): string {\n if (!isNode()) return \"\";\n return joinPath(workspaceDir(), \"license_cache.json\");\n}\n\nexport function sessionStatsPath(): string {\n if (!isNode()) return \"\";\n return joinPath(workspaceDir(), \"session_stats.jsonl\");\n}\n\nexport function syncStatePath(): string {\n if (!isNode()) return \"\";\n return joinPath(workspaceDir(), \"sync_state.json\");\n}\n\nexport function bridgeStatePath(): string {\n if (!isNode()) return \"\";\n return joinPath(workspaceDir(), \"bridge_state.json\");\n}\n\nexport function logDir(): string {\n if (!isNode()) return \"\";\n return joinPath(workspaceDir(), \"logs\");\n}\n\nexport function proxyLogPath(): string {\n if (!isNode()) return \"\";\n return joinPath(logDir(), \"proxy.log\");\n}\n\nexport function debug400Dir(): string {\n if (!isNode()) return \"\";\n return joinPath(logDir(), \"debug_400\");\n}\n\nexport function binDir(): string {\n if (!isNode()) return \"\";\n return joinPath(workspaceDir(), \"bin\");\n}\n\nexport function deployRoot(): string {\n if (!isNode()) return \"\";\n return joinPath(workspaceDir(), \"deploy\");\n}\n\nexport function beaconLockPath(port: number): string {\n if (!isNode()) return \"\";\n return joinPath(workspaceDir(), `.beacon_lock_${Math.trunc(port)}`);\n}\n\n// ---------------------------------------------------------------------------\n// Per-resource helpers -- config bucket\n// ---------------------------------------------------------------------------\n\nexport function modelsConfigPath(): string {\n if (!isNode()) return \"\";\n return joinPath(configDir(), \"models.json\");\n}\n\n// ---------------------------------------------------------------------------\n// Plugin-author entry points\n// ---------------------------------------------------------------------------\n\nfunction assertPluginName(name: string): void {\n if (!name || name.includes(\"/\") || name.includes(\"\\\\\")) {\n throw new Error(`invalid plugin name: ${JSON.stringify(name)}`);\n }\n}\n\nexport function pluginConfigDir(pluginName: string): string {\n assertPluginName(pluginName);\n if (!isNode()) return \"\";\n return joinPath(configDir(), \"plugins\", pluginName);\n}\n\nexport function pluginWorkspaceDir(pluginName: string): string {\n assertPluginName(pluginName);\n if (!isNode()) return \"\";\n return joinPath(workspaceDir(), \"plugins\", pluginName);\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -261,6 +261,15 @@ interface RequestMetrics {
261
261
  model: string;
262
262
  stream: boolean;
263
263
  mode: string;
264
+ inputTokensOriginal?: number | null;
265
+ inputTokensOptimized?: number | null;
266
+ outputTokens?: number | null;
267
+ tokensSaved?: number | null;
268
+ savingsPercent?: number | null;
269
+ optimizationLatencyMs?: number | null;
270
+ totalLatencyMs?: number | null;
271
+ hasExactTokens?: boolean;
272
+ tokenAccountingStatus?: "complete" | "partial" | "missing";
264
273
  tokensInputBefore: number;
265
274
  tokensInputAfter: number;
266
275
  tokensOutput?: number | null;
@@ -835,11 +844,10 @@ declare function logDir(): string;
835
844
  declare function proxyLogPath(): string;
836
845
  declare function debug400Dir(): string;
837
846
  declare function binDir(): string;
838
- declare function rtkPath(): string;
839
847
  declare function deployRoot(): string;
840
848
  declare function beaconLockPath(port: number): string;
841
849
  declare function modelsConfigPath(): string;
842
850
  declare function pluginConfigDir(pluginName: string): string;
843
851
  declare function pluginWorkspaceDir(pluginName: string): string;
844
852
 
845
- export { type AnchorConfig, type Block, type BlockKind, type CCRConfig, type CCRStats, type CacheAlignerConfig, CacheError, type CacheOptimizerConfig, type CachePrefixMetrics, CompressOptions, CompressResult, type CompressionProfile, ConfigurationError, type ContentType, type ContextEntry, type DiffArtifact, type ExtendedClientOptions, HEADROOM_CONFIG_DIR_ENV, HEADROOM_SAVINGS_PATH_ENV, HEADROOM_SUBSCRIPTION_STATE_PATH_ENV, HEADROOM_TOIN_PATH_ENV, HEADROOM_WORKSPACE_DIR_ENV, HeadroomAuthError, HeadroomClient, HeadroomClientInterface, HeadroomClientOptions, HeadroomCompressError, type HeadroomConfig, HeadroomConnectionError, HeadroomError, type HeadroomMode, type HeadroomParams, type HealthStatus, type IntelligentContextConfig, type MemoryUsage, type MessageFormat, type MetricsQuery, type MetricsSummary, OpenAIMessage, type PrefixFreezeConfig, ProviderError, type ProxyStats, type ReadLifecycleConfig, type RelevanceScorerConfig, type RelevanceTier, type RequestMetrics, type RetrieveResult, type RetrieveSearchResult, type RollingWindowConfig, type ScoringWeights, type SessionStats, SharedContext, type SharedContextOptions, type SharedContextStats, type SimulateOptions, type SimulationResult, type SmartCrusherConfig, type StatsHistoryQuery, StorageError, type SummaryQuery, type TOINPattern, type TOINStats, type TelemetryStats, TokenizationError, type ToolCrusherConfig, type ToolHints, type TransformDiff, TransformError, ValidationError, type ValidationResult, type WasteSignals, beaconLockPath, binDir, bridgeStatePath, camelToSnake, collectStream, compress, configDir, debug400Dir, deepCamelCase, deepSnakeCase, deployRoot, detectFormat, fromOpenAI, licenseCachePath, logDir, mapProxyError, memoryDbPath, modelsConfigPath, nativeMemoryDir, parseSSE, pluginConfigDir, pluginWorkspaceDir, proxyLogPath, rtkPath, savingsPath, sessionStatsPath, simulate, snakeToCamel, subscriptionStatePath, syncStatePath, toOpenAI, toinPath, workspaceDir };
853
+ export { type AnchorConfig, type Block, type BlockKind, type CCRConfig, type CCRStats, type CacheAlignerConfig, CacheError, type CacheOptimizerConfig, type CachePrefixMetrics, CompressOptions, CompressResult, type CompressionProfile, ConfigurationError, type ContentType, type ContextEntry, type DiffArtifact, type ExtendedClientOptions, HEADROOM_CONFIG_DIR_ENV, HEADROOM_SAVINGS_PATH_ENV, HEADROOM_SUBSCRIPTION_STATE_PATH_ENV, HEADROOM_TOIN_PATH_ENV, HEADROOM_WORKSPACE_DIR_ENV, HeadroomAuthError, HeadroomClient, HeadroomClientInterface, HeadroomClientOptions, HeadroomCompressError, type HeadroomConfig, HeadroomConnectionError, HeadroomError, type HeadroomMode, type HeadroomParams, type HealthStatus, type IntelligentContextConfig, type MemoryUsage, type MessageFormat, type MetricsQuery, type MetricsSummary, OpenAIMessage, type PrefixFreezeConfig, ProviderError, type ProxyStats, type ReadLifecycleConfig, type RelevanceScorerConfig, type RelevanceTier, type RequestMetrics, type RetrieveResult, type RetrieveSearchResult, type RollingWindowConfig, type ScoringWeights, type SessionStats, SharedContext, type SharedContextOptions, type SharedContextStats, type SimulateOptions, type SimulationResult, type SmartCrusherConfig, type StatsHistoryQuery, StorageError, type SummaryQuery, type TOINPattern, type TOINStats, type TelemetryStats, TokenizationError, type ToolCrusherConfig, type ToolHints, type TransformDiff, TransformError, ValidationError, type ValidationResult, type WasteSignals, beaconLockPath, binDir, bridgeStatePath, camelToSnake, collectStream, compress, configDir, debug400Dir, deepCamelCase, deepSnakeCase, deployRoot, detectFormat, fromOpenAI, licenseCachePath, logDir, mapProxyError, memoryDbPath, modelsConfigPath, nativeMemoryDir, parseSSE, pluginConfigDir, pluginWorkspaceDir, proxyLogPath, savingsPath, sessionStatsPath, simulate, snakeToCamel, subscriptionStatePath, syncStatePath, toOpenAI, toinPath, workspaceDir };