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.
package/README.md CHANGED
@@ -23,7 +23,7 @@ const response = await openai.chat.completions.create({
23
23
  });
24
24
  ```
25
25
 
26
- Requires a running Headroom proxy (`headroom proxy`) or Headroom Cloud API key.
26
+ Requires a running Headroom proxy (`headroom proxy`).
27
27
 
28
28
  ## Framework Adapters
29
29
 
@@ -359,8 +359,8 @@ import { compress } from 'headroom-ai';
359
359
 
360
360
  const result = await compress(messages, {
361
361
  model: 'gpt-4o',
362
- baseUrl: 'http://localhost:8787', // or https://api.headroom.ai
363
- apiKey: 'hr_...', // for Headroom Cloud
362
+ baseUrl: 'http://localhost:8787', // proxy URL
363
+ apiKey: 'your-api-key', // optional, for authenticated endpoints
364
364
  timeout: 30000, // ms
365
365
  fallback: true, // return uncompressed if proxy is down (default)
366
366
  retries: 1, // retry on transient failures (default)
@@ -370,8 +370,8 @@ const result = await compress(messages, {
370
370
  ```
371
371
 
372
372
  Or use environment variables:
373
- - `HEADROOM_BASE_URL` — proxy/cloud URL
374
- - `HEADROOM_API_KEY` — Cloud API key
373
+ - `HEADROOM_BASE_URL` — proxy URL
374
+ - `HEADROOM_API_KEY` — optional API key for authenticated endpoints
375
375
 
376
376
  ## Utilities
377
377
 
@@ -1,6 +1,6 @@
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/adapters/anthropic.ts
6
6
  function anthropicToOpenAI(messages) {
@@ -120,7 +120,7 @@ function withHeadroom(client, options = {}) {
120
120
  const messages = params.messages;
121
121
  const model = options.model ?? params.model ?? "claude-sonnet-4-5-20250929";
122
122
  const openaiMessages = anthropicToOpenAI(messages);
123
- const result = await chunkR6FB52AD_cjs.compress(openaiMessages, {
123
+ const result = await chunkUVXIB3EK_cjs.compress(openaiMessages, {
124
124
  stack: "adapter_ts_anthropic",
125
125
  ...options,
126
126
  model
@@ -1,4 +1,4 @@
1
- import { compress } from '../chunk-7AJIWIPP.js';
1
+ import { compress } from '../chunk-2NXG6XPP.js';
2
2
 
3
3
  // src/adapters/anthropic.ts
4
4
  function anthropicToOpenAI(messages) {
@@ -1,6 +1,6 @@
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/adapters/gemini.ts
6
6
  function withHeadroom(model, options = {}) {
@@ -9,7 +9,7 @@ function withHeadroom(model, options = {}) {
9
9
  const compressedGenerate = async (params) => {
10
10
  const contents = params.contents ?? params;
11
11
  const modelName = options.model ?? "gemini-2.0-flash";
12
- const result = await chunkR6FB52AD_cjs.compress(
12
+ const result = await chunkUVXIB3EK_cjs.compress(
13
13
  Array.isArray(contents) ? contents : [contents],
14
14
  { stack: "adapter_ts_gemini", ...options, model: modelName }
15
15
  );
@@ -19,7 +19,7 @@ function withHeadroom(model, options = {}) {
19
19
  const compressedStream = originalStream ? async (params) => {
20
20
  const contents = params.contents ?? params;
21
21
  const modelName = options.model ?? "gemini-2.0-flash";
22
- const result = await chunkR6FB52AD_cjs.compress(
22
+ const result = await chunkUVXIB3EK_cjs.compress(
23
23
  Array.isArray(contents) ? contents : [contents],
24
24
  { stack: "adapter_ts_gemini", ...options, model: modelName }
25
25
  );
@@ -1,4 +1,4 @@
1
- import { compress } from '../chunk-7AJIWIPP.js';
1
+ import { compress } from '../chunk-2NXG6XPP.js';
2
2
 
3
3
  // src/adapters/gemini.ts
4
4
  function withHeadroom(model, options = {}) {
@@ -1,6 +1,6 @@
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/adapters/openai.ts
6
6
  function withHeadroom(client, options = {}) {
@@ -10,7 +10,7 @@ function withHeadroom(client, options = {}) {
10
10
  const compressedCreate = async (params) => {
11
11
  const messages = params.messages;
12
12
  const model = options.model ?? params.model ?? "gpt-4o";
13
- const result = await chunkR6FB52AD_cjs.compress(messages, {
13
+ const result = await chunkUVXIB3EK_cjs.compress(messages, {
14
14
  stack: "adapter_ts_openai",
15
15
  ...options,
16
16
  model
@@ -1,4 +1,4 @@
1
- import { compress } from '../chunk-7AJIWIPP.js';
1
+ import { compress } from '../chunk-2NXG6XPP.js';
2
2
 
3
3
  // src/adapters/openai.ts
4
4
  function withHeadroom(client, options = {}) {
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkR6FB52AD_cjs = require('../chunk-R6FB52AD.cjs');
3
+ var chunkUVXIB3EK_cjs = require('../chunk-UVXIB3EK.cjs');
4
4
  var module$1 = require('module');
5
5
 
6
6
  var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
@@ -12,25 +12,25 @@ function headroomMiddleware(options = {}) {
12
12
  const prompt = params.prompt;
13
13
  if (!prompt || prompt.length === 0) return params;
14
14
  const model = options.model ?? params.modelId ?? "gpt-4o";
15
- const openaiMessages = chunkR6FB52AD_cjs.vercelToOpenAI(prompt);
16
- const result = await chunkR6FB52AD_cjs.compress(openaiMessages, {
15
+ const openaiMessages = chunkUVXIB3EK_cjs.vercelToOpenAI(prompt);
16
+ const result = await chunkUVXIB3EK_cjs.compress(openaiMessages, {
17
17
  stack: "adapter_ts_vercel_ai",
18
18
  ...options,
19
19
  model
20
20
  });
21
21
  if (!result.compressed) return params;
22
- const compressedPrompt = chunkR6FB52AD_cjs.openAIToVercel(result.messages);
22
+ const compressedPrompt = chunkUVXIB3EK_cjs.openAIToVercel(result.messages);
23
23
  return { ...params, prompt: compressedPrompt };
24
24
  }
25
25
  };
26
26
  }
27
27
  async function compressVercelMessages(messages, options = {}) {
28
- const openaiMessages = chunkR6FB52AD_cjs.vercelToOpenAI(messages);
29
- const result = await chunkR6FB52AD_cjs.compress(openaiMessages, {
28
+ const openaiMessages = chunkUVXIB3EK_cjs.vercelToOpenAI(messages);
29
+ const result = await chunkUVXIB3EK_cjs.compress(openaiMessages, {
30
30
  stack: "adapter_ts_vercel_ai",
31
31
  ...options
32
32
  });
33
- const vercelMessages = chunkR6FB52AD_cjs.openAIToVercel(result.messages);
33
+ const vercelMessages = chunkUVXIB3EK_cjs.openAIToVercel(result.messages);
34
34
  return {
35
35
  ...result,
36
36
  messages: vercelMessages
@@ -1,4 +1,4 @@
1
- import { vercelToOpenAI, compress, openAIToVercel } from '../chunk-7AJIWIPP.js';
1
+ import { vercelToOpenAI, compress, openAIToVercel } from '../chunk-2NXG6XPP.js';
2
2
  import { createRequire } from 'module';
3
3
 
4
4
  function headroomMiddleware(options = {}) {
@@ -183,6 +183,7 @@ var ChatCompletions = class {
183
183
  constructor(client) {
184
184
  this.client = client;
185
185
  }
186
+ client;
186
187
  /**
187
188
  * Create a chat completion with automatic compression.
188
189
  * Routes through proxy's POST /v1/chat/completions.
@@ -221,6 +222,7 @@ var Messages = class {
221
222
  constructor(client) {
222
223
  this.client = client;
223
224
  }
225
+ client;
224
226
  /**
225
227
  * Create a message with automatic compression.
226
228
  * Routes through proxy's POST /v1/messages (Anthropic).
@@ -1104,5 +1106,5 @@ async function compress(messages, options = {}) {
1104
1106
  }
1105
1107
 
1106
1108
  export { CacheError, CompressionHooks, ConfigurationError, HeadroomAuthError, HeadroomClient, HeadroomCompressError, HeadroomConnectionError, HeadroomError, ProviderError, StorageError, TokenizationError, TransformError, ValidationError, __require, camelToSnake, collectStream, compress, countTurns, deepCamelCase, deepSnakeCase, detectFormat, extractToolCalls, extractUserQuery, fromOpenAI, mapProxyError, openAIToVercel, parseSSE, snakeToCamel, toOpenAI, vercelToOpenAI };
1107
- //# sourceMappingURL=chunk-7AJIWIPP.js.map
1108
- //# sourceMappingURL=chunk-7AJIWIPP.js.map
1109
+ //# sourceMappingURL=chunk-2NXG6XPP.js.map
1110
+ //# sourceMappingURL=chunk-2NXG6XPP.js.map
@@ -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-2NXG6XPP.js","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"]}
@@ -185,6 +185,7 @@ var ChatCompletions = class {
185
185
  constructor(client) {
186
186
  this.client = client;
187
187
  }
188
+ client;
188
189
  /**
189
190
  * Create a chat completion with automatic compression.
190
191
  * Routes through proxy's POST /v1/chat/completions.
@@ -223,6 +224,7 @@ var Messages = class {
223
224
  constructor(client) {
224
225
  this.client = client;
225
226
  }
227
+ client;
226
228
  /**
227
229
  * Create a message with automatic compression.
228
230
  * Routes through proxy's POST /v1/messages (Anthropic).
@@ -1135,5 +1137,5 @@ exports.parseSSE = parseSSE;
1135
1137
  exports.snakeToCamel = snakeToCamel;
1136
1138
  exports.toOpenAI = toOpenAI;
1137
1139
  exports.vercelToOpenAI = vercelToOpenAI;
1138
- //# sourceMappingURL=chunk-R6FB52AD.cjs.map
1139
- //# sourceMappingURL=chunk-R6FB52AD.cjs.map
1140
+ //# sourceMappingURL=chunk-UVXIB3EK.cjs.map
1141
+ //# sourceMappingURL=chunk-UVXIB3EK.cjs.map