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 +5 -5
- package/dist/adapters/anthropic.cjs +2 -2
- package/dist/adapters/anthropic.js +1 -1
- package/dist/adapters/gemini.cjs +3 -3
- package/dist/adapters/gemini.js +1 -1
- package/dist/adapters/openai.cjs +2 -2
- package/dist/adapters/openai.js +1 -1
- package/dist/adapters/vercel-ai.cjs +7 -7
- package/dist/adapters/vercel-ai.js +1 -1
- package/dist/{chunk-7AJIWIPP.js → chunk-2NXG6XPP.js} +4 -2
- package/dist/chunk-2NXG6XPP.js.map +1 -0
- package/dist/{chunk-R6FB52AD.cjs → chunk-UVXIB3EK.cjs} +4 -2
- package/dist/chunk-UVXIB3EK.cjs.map +1 -0
- package/dist/index.cjs +35 -41
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -2
- package/dist/index.d.ts +10 -2
- package/dist/index.js +3 -8
- package/dist/index.js.map +1 -1
- package/package.json +5 -2
- package/dist/chunk-7AJIWIPP.js.map +0 -1
- package/dist/chunk-R6FB52AD.cjs.map +0 -1
|
@@ -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
|
|
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 =
|
|
9
|
-
const client = providedClient ?? new
|
|
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 ?
|
|
16
|
+
...config ? chunkUVXIB3EK_cjs.deepSnakeCase(config) : {}
|
|
17
17
|
}
|
|
18
18
|
};
|
|
19
19
|
const result = await client.compressRaw(body);
|
|
20
|
-
return
|
|
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
|
|
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 =
|
|
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 =
|
|
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
|
|
324
|
+
get: function () { return chunkUVXIB3EK_cjs.CacheError; }
|
|
330
325
|
});
|
|
331
326
|
Object.defineProperty(exports, "CompressionHooks", {
|
|
332
327
|
enumerable: true,
|
|
333
|
-
get: function () { return
|
|
328
|
+
get: function () { return chunkUVXIB3EK_cjs.CompressionHooks; }
|
|
334
329
|
});
|
|
335
330
|
Object.defineProperty(exports, "ConfigurationError", {
|
|
336
331
|
enumerable: true,
|
|
337
|
-
get: function () { return
|
|
332
|
+
get: function () { return chunkUVXIB3EK_cjs.ConfigurationError; }
|
|
338
333
|
});
|
|
339
334
|
Object.defineProperty(exports, "HeadroomAuthError", {
|
|
340
335
|
enumerable: true,
|
|
341
|
-
get: function () { return
|
|
336
|
+
get: function () { return chunkUVXIB3EK_cjs.HeadroomAuthError; }
|
|
342
337
|
});
|
|
343
338
|
Object.defineProperty(exports, "HeadroomClient", {
|
|
344
339
|
enumerable: true,
|
|
345
|
-
get: function () { return
|
|
340
|
+
get: function () { return chunkUVXIB3EK_cjs.HeadroomClient; }
|
|
346
341
|
});
|
|
347
342
|
Object.defineProperty(exports, "HeadroomCompressError", {
|
|
348
343
|
enumerable: true,
|
|
349
|
-
get: function () { return
|
|
344
|
+
get: function () { return chunkUVXIB3EK_cjs.HeadroomCompressError; }
|
|
350
345
|
});
|
|
351
346
|
Object.defineProperty(exports, "HeadroomConnectionError", {
|
|
352
347
|
enumerable: true,
|
|
353
|
-
get: function () { return
|
|
348
|
+
get: function () { return chunkUVXIB3EK_cjs.HeadroomConnectionError; }
|
|
354
349
|
});
|
|
355
350
|
Object.defineProperty(exports, "HeadroomError", {
|
|
356
351
|
enumerable: true,
|
|
357
|
-
get: function () { return
|
|
352
|
+
get: function () { return chunkUVXIB3EK_cjs.HeadroomError; }
|
|
358
353
|
});
|
|
359
354
|
Object.defineProperty(exports, "ProviderError", {
|
|
360
355
|
enumerable: true,
|
|
361
|
-
get: function () { return
|
|
356
|
+
get: function () { return chunkUVXIB3EK_cjs.ProviderError; }
|
|
362
357
|
});
|
|
363
358
|
Object.defineProperty(exports, "StorageError", {
|
|
364
359
|
enumerable: true,
|
|
365
|
-
get: function () { return
|
|
360
|
+
get: function () { return chunkUVXIB3EK_cjs.StorageError; }
|
|
366
361
|
});
|
|
367
362
|
Object.defineProperty(exports, "TokenizationError", {
|
|
368
363
|
enumerable: true,
|
|
369
|
-
get: function () { return
|
|
364
|
+
get: function () { return chunkUVXIB3EK_cjs.TokenizationError; }
|
|
370
365
|
});
|
|
371
366
|
Object.defineProperty(exports, "TransformError", {
|
|
372
367
|
enumerable: true,
|
|
373
|
-
get: function () { return
|
|
368
|
+
get: function () { return chunkUVXIB3EK_cjs.TransformError; }
|
|
374
369
|
});
|
|
375
370
|
Object.defineProperty(exports, "ValidationError", {
|
|
376
371
|
enumerable: true,
|
|
377
|
-
get: function () { return
|
|
372
|
+
get: function () { return chunkUVXIB3EK_cjs.ValidationError; }
|
|
378
373
|
});
|
|
379
374
|
Object.defineProperty(exports, "camelToSnake", {
|
|
380
375
|
enumerable: true,
|
|
381
|
-
get: function () { return
|
|
376
|
+
get: function () { return chunkUVXIB3EK_cjs.camelToSnake; }
|
|
382
377
|
});
|
|
383
378
|
Object.defineProperty(exports, "collectStream", {
|
|
384
379
|
enumerable: true,
|
|
385
|
-
get: function () { return
|
|
380
|
+
get: function () { return chunkUVXIB3EK_cjs.collectStream; }
|
|
386
381
|
});
|
|
387
382
|
Object.defineProperty(exports, "compress", {
|
|
388
383
|
enumerable: true,
|
|
389
|
-
get: function () { return
|
|
384
|
+
get: function () { return chunkUVXIB3EK_cjs.compress; }
|
|
390
385
|
});
|
|
391
386
|
Object.defineProperty(exports, "countTurns", {
|
|
392
387
|
enumerable: true,
|
|
393
|
-
get: function () { return
|
|
388
|
+
get: function () { return chunkUVXIB3EK_cjs.countTurns; }
|
|
394
389
|
});
|
|
395
390
|
Object.defineProperty(exports, "deepCamelCase", {
|
|
396
391
|
enumerable: true,
|
|
397
|
-
get: function () { return
|
|
392
|
+
get: function () { return chunkUVXIB3EK_cjs.deepCamelCase; }
|
|
398
393
|
});
|
|
399
394
|
Object.defineProperty(exports, "deepSnakeCase", {
|
|
400
395
|
enumerable: true,
|
|
401
|
-
get: function () { return
|
|
396
|
+
get: function () { return chunkUVXIB3EK_cjs.deepSnakeCase; }
|
|
402
397
|
});
|
|
403
398
|
Object.defineProperty(exports, "detectFormat", {
|
|
404
399
|
enumerable: true,
|
|
405
|
-
get: function () { return
|
|
400
|
+
get: function () { return chunkUVXIB3EK_cjs.detectFormat; }
|
|
406
401
|
});
|
|
407
402
|
Object.defineProperty(exports, "extractToolCalls", {
|
|
408
403
|
enumerable: true,
|
|
409
|
-
get: function () { return
|
|
404
|
+
get: function () { return chunkUVXIB3EK_cjs.extractToolCalls; }
|
|
410
405
|
});
|
|
411
406
|
Object.defineProperty(exports, "extractUserQuery", {
|
|
412
407
|
enumerable: true,
|
|
413
|
-
get: function () { return
|
|
408
|
+
get: function () { return chunkUVXIB3EK_cjs.extractUserQuery; }
|
|
414
409
|
});
|
|
415
410
|
Object.defineProperty(exports, "fromOpenAI", {
|
|
416
411
|
enumerable: true,
|
|
417
|
-
get: function () { return
|
|
412
|
+
get: function () { return chunkUVXIB3EK_cjs.fromOpenAI; }
|
|
418
413
|
});
|
|
419
414
|
Object.defineProperty(exports, "mapProxyError", {
|
|
420
415
|
enumerable: true,
|
|
421
|
-
get: function () { return
|
|
416
|
+
get: function () { return chunkUVXIB3EK_cjs.mapProxyError; }
|
|
422
417
|
});
|
|
423
418
|
Object.defineProperty(exports, "parseSSE", {
|
|
424
419
|
enumerable: true,
|
|
425
|
-
get: function () { return
|
|
420
|
+
get: function () { return chunkUVXIB3EK_cjs.parseSSE; }
|
|
426
421
|
});
|
|
427
422
|
Object.defineProperty(exports, "snakeToCamel", {
|
|
428
423
|
enumerable: true,
|
|
429
|
-
get: function () { return
|
|
424
|
+
get: function () { return chunkUVXIB3EK_cjs.snakeToCamel; }
|
|
430
425
|
});
|
|
431
426
|
Object.defineProperty(exports, "toOpenAI", {
|
|
432
427
|
enumerable: true,
|
|
433
|
-
get: function () { return
|
|
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;
|
package/dist/index.cjs.map
CHANGED
|
@@ -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,
|
|
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 };
|