{"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"]}