@agimon-ai/po-cache 0.0.0-alpha.13 → 0.0.0-alpha.14

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.
@@ -1 +1 @@
1
- {"version":3,"file":"server.mjs","names":["rootSession","hookAgentSettled","hookBeforeProviderRequest","hookMessageEnd","hookModelSelect","hookSessionShutdown","hookSessionStart","hookToolExecutionEnd"],"sources":["../../src/services/environment/index.ts","../../src/services/promptCacheUsage/index.ts","../../src/services/cacheRuntime/index.ts","../../src/services/agentDirectory/index.ts","../../src/services/optimizerSupport/index.ts","../../src/services/nativeOptimizer/index.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/agent-settled.server.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/cacheHooks.ts","../../src/extensions/workspaces/sessions/(backend)/hook/before-provider-request.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/message-end.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/model-select.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/session-start.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/tool-execution-end.server.ts","../../generated/server.ts"],"sourcesContent":["const environmentLeases = new WeakMap<\n NodeJS.ProcessEnv,\n Map<string, { count: number; value: string; owner: OwnedEnvironmentValue }>\n>();\n\n/** Same-value session leases restore only after the final owner leaves. External writes win. */\nexport function acquireEnvironmentValue(\n name: string,\n value: string,\n environment: NodeJS.ProcessEnv = process.env,\n): () => void {\n let leases = environmentLeases.get(environment);\n if (!leases) {\n leases = new Map();\n environmentLeases.set(environment, leases);\n }\n let lease = leases.get(name);\n if (lease && lease.value !== value) throw new Error(`Conflicting environment lease for ${name}.`);\n if (!lease) {\n const owner = new OwnedEnvironmentValue(name, environment);\n owner.set(value);\n lease = { count: 0, value, owner };\n leases.set(name, lease);\n }\n lease.count++;\n let released = false;\n return () => {\n if (released) return;\n released = true;\n if (--lease.count > 0) return;\n lease.owner.restore();\n leases.delete(name);\n };\n}\n\ninterface EnvironmentSnapshot {\n readonly present: boolean;\n readonly value?: string;\n}\n\nexport class OwnedEnvironmentValue {\n readonly #environment: NodeJS.ProcessEnv;\n readonly #name: string;\n readonly #baseline: EnvironmentSnapshot;\n #ownedValue?: string;\n\n constructor(name: string, environment: NodeJS.ProcessEnv = process.env) {\n this.#name = name;\n this.#environment = environment;\n this.#baseline = {\n present: Object.hasOwn(environment, name),\n value: environment[name],\n };\n }\n\n set(value: string): void {\n this.#environment[this.#name] = value;\n this.#ownedValue = value;\n }\n\n restore(): void {\n if (this.#ownedValue === undefined || this.#environment[this.#name] !== this.#ownedValue) return;\n if (this.#baseline.present) this.#environment[this.#name] = this.#baseline.value;\n else delete this.#environment[this.#name];\n this.#ownedValue = undefined;\n }\n}\n","import type { PromptCacheUsage } from '../../types/cache';\n\nfunction recordValue(value: unknown): Readonly<Record<string, unknown>> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Readonly<Record<string, unknown>>)\n : undefined;\n}\n\nfunction nonNegativeNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : undefined;\n}\n\nfunction firstNumber(...values: readonly unknown[]): number | undefined {\n for (const value of values) {\n const number = nonNegativeNumber(value);\n if (number !== undefined) return number;\n }\n return undefined;\n}\n\nfunction normalizedUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const cacheRead = nonNegativeNumber(usage.cacheRead);\n const cacheWrite = nonNegativeNumber(usage.cacheWrite);\n if (cacheRead === undefined && cacheWrite === undefined) return undefined;\n const input = nonNegativeNumber(usage.input) ?? 0;\n return {\n cacheRead: cacheRead ?? 0,\n cacheWrite: cacheWrite ?? 0,\n totalInput: input + (cacheRead ?? 0) + (cacheWrite ?? 0),\n };\n}\n\nfunction openAiUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const promptDetails = recordValue(usage.prompt_tokens_details) ?? recordValue(usage.promptTokensDetails);\n const inputDetails = recordValue(usage.input_tokens_details) ?? recordValue(usage.inputTokensDetails);\n const cacheRead = firstNumber(\n promptDetails?.cached_tokens,\n promptDetails?.cachedTokens,\n inputDetails?.cached_tokens,\n inputDetails?.cachedTokens,\n );\n const cacheWrite = firstNumber(\n promptDetails?.cache_write_tokens,\n promptDetails?.cacheWriteTokens,\n inputDetails?.cache_write_tokens,\n inputDetails?.cacheWriteTokens,\n );\n if (cacheRead === undefined && cacheWrite === undefined) return undefined;\n const floor = (cacheRead ?? 0) + (cacheWrite ?? 0);\n const reportedTotal = firstNumber(usage.prompt_tokens, usage.promptTokens, usage.input_tokens, usage.inputTokens);\n return {\n cacheRead: cacheRead ?? 0,\n cacheWrite: cacheWrite ?? 0,\n totalInput: Math.max(reportedTotal ?? floor, floor),\n };\n}\n\nfunction anthropicUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const cacheRead = firstNumber(usage.cache_read_input_tokens, usage.cacheReadInputTokens);\n const cacheWrite = firstNumber(usage.cache_creation_input_tokens, usage.cacheCreationInputTokens);\n if (cacheRead === undefined && cacheWrite === undefined) return undefined;\n const input = firstNumber(usage.input_tokens, usage.inputTokens) ?? 0;\n return {\n cacheRead: cacheRead ?? 0,\n cacheWrite: cacheWrite ?? 0,\n totalInput: input + (cacheRead ?? 0) + (cacheWrite ?? 0),\n };\n}\n\nfunction geminiUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const metadata = recordValue(usage.usage_metadata) ?? recordValue(usage.usageMetadata) ?? usage;\n const cacheRead = firstNumber(metadata.cachedContentTokenCount, metadata.cached_content_token_count);\n if (cacheRead === undefined) return undefined;\n const totalInput = firstNumber(\n metadata.promptTokenCount,\n metadata.prompt_token_count,\n usage.input_tokens,\n usage.inputTokens,\n usage.prompt_tokens,\n usage.promptTokens,\n );\n return { cacheRead, cacheWrite: 0, totalInput: Math.max(totalInput ?? cacheRead, cacheRead) };\n}\n\n/** Normalize only usage values carried by a provider-produced assistant message. */\nexport function normalizePromptCacheUsage(message: unknown): PromptCacheUsage | undefined {\n const messageRecord = recordValue(message);\n const usage = recordValue(messageRecord?.usage);\n if (!usage) return undefined;\n return normalizedUsage(usage) ?? openAiUsage(usage) ?? anthropicUsage(usage) ?? geminiUsage(usage);\n}\n","import { getSessionHarnessState } from '@agimon-ai/po-config/harnessStore';\nimport { PO_MINOR_MODE_CATALOG_SERVICE, readMinorModeCatalog, type MinorModeRecord } from '@agimon-ai/po-minor-mode';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport {\n PO_PROMPT_CACHE_CHILD_PROJECTION_ENV,\n PO_PROMPT_CACHE_PARENT_NAMESPACE_ENV,\n PO_PROMPT_CACHE_ROOT_SESSION_ENV,\n} from '../../constants/environment';\nimport type { PromptCacheMinorModeState } from '../../types/cache';\nimport type { CacheExtensionDependencies } from '../../types/extension';\nimport { sha256Base64Url } from '../digest';\nimport { OwnedEnvironmentValue } from '../environment';\nimport { createParentPromptCacheNamespace, createRootSessionIdentity } from '../namespace';\nimport { normalizePromptCacheUsage } from '../promptCacheUsage';\nimport type { CacheRuntime } from './type';\n\ntype MinorModeStateWithVariant = MinorModeRecord['state'] & { readonly modelContextVariant?: string };\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\nfunction minorModeState(record: MinorModeRecord): PromptCacheMinorModeState {\n const state = record.state as MinorModeStateWithVariant;\n return {\n source: record.descriptor.source,\n id: record.descriptor.id,\n activation: state.activation,\n ...(state.modelContextVariant ? { modelContextVariant: state.modelContextVariant } : {}),\n };\n}\nfunction isErrorMessage(message: unknown): boolean {\n const record = typeof message === 'object' && message !== null ? (message as Record<string, unknown>) : undefined;\n return record?.stopReason === 'error' || record?.stopReason === 'aborted';\n}\n\nexport function createCacheRuntime(\n dependencies: CacheExtensionDependencies,\n environment: Readonly<Record<string, string | undefined>>,\n): CacheRuntime {\n const parentNamespaceEnvironment = new OwnedEnvironmentValue(PO_PROMPT_CACHE_PARENT_NAMESPACE_ENV);\n const rootSessionEnvironment = new OwnedEnvironmentValue(PO_PROMPT_CACHE_ROOT_SESSION_ENV);\n const projectedParentNamespace = stringValue(environment[PO_PROMPT_CACHE_PARENT_NAMESPACE_ENV]);\n const childProjection = stringValue(environment[PO_PROMPT_CACHE_CHILD_PROJECTION_ENV]);\n const isProjectedChild = Boolean(projectedParentNamespace && childProjection);\n let rootSessionId: string | undefined;\n let parentNamespace = projectedParentNamespace;\n let minorModes: readonly PromptCacheMinorModeState[] = [];\n\n const refreshParentNamespace = (): string | undefined => {\n if (isProjectedChild) return parentNamespace;\n if (!rootSessionId) return undefined;\n const harness = getSessionHarnessState(rootSessionId);\n parentNamespace = createParentPromptCacheNamespace(\n {\n rootSessionId,\n compositionFingerprint: harness.compositionFingerprint,\n majorMode: harness.majorMode,\n domains: harness.domains,\n profile: harness.profile,\n persona: harness.personaFile,\n minorModes,\n },\n sha256Base64Url,\n );\n parentNamespaceEnvironment.set(parentNamespace);\n rootSessionEnvironment.set(createRootSessionIdentity(rootSessionId, sha256Base64Url));\n return parentNamespace;\n };\n\n const plugin = (cordis: Context): void => {\n cordis.inject([PO_MINOR_MODE_CATALOG_SERVICE], (context) => {\n if (isProjectedChild) return undefined;\n const catalog = readMinorModeCatalog(context);\n if (!catalog) return undefined;\n const refreshModes = (): void => {\n minorModes = catalog.getSnapshot().modes.map(minorModeState);\n refreshParentNamespace();\n };\n refreshModes();\n return catalog.subscribe(refreshModes);\n });\n };\n return {\n plugin,\n events: {\n session_start: (_event, ctx) => {\n if (!isProjectedChild) {\n rootSessionId = stringValue(ctx.sessionId);\n refreshParentNamespace();\n }\n },\n\n message_end: (event) => {\n if (isErrorMessage(event.message)) return;\n const usage = normalizePromptCacheUsage(event.message);\n if (usage) dependencies.telemetry.observe(usage, dependencies.now());\n },\n },\n dispose: () => {\n parentNamespaceEnvironment.restore();\n rootSessionEnvironment.restore();\n dependencies.telemetry.reset();\n },\n };\n}\n","import { getAgentDir } from '@earendil-works/pi-coding-agent';\n\n/** Pi's agent directory, where the optimizer keeps its state; the edge build swaps in `index.edge.ts`. */\nexport function defaultAgentDirectory(): string {\n return getAgentDir();\n}\n","/*\n * Adapted from pi-cache-optimizer 2.8.16, https://github.com/jiangge/pi-cache-optimizer\n * Reachable cache statistics and diagnostics only. Native lifecycle is owned by Po.\n * MIT License\n *\n * Copyright (c) 2026 freescheme\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport { createHash, randomUUID } from 'node:crypto';\nimport { join } from 'node:path';\n\nimport {\n BACKGROUND_CONTEXT,\n createSerialRunner,\n type FileSystem,\n getOrThrow,\n nodeHost,\n readTextIfExists,\n writeFileAtomic,\n} from '@agimon-ai/po-core/platform';\n\nimport type {\n MutableEnv,\n ModelIdentity,\n UnknownRecord,\n CacheProviderId,\n FooterStatsMode,\n FooterStatsModeSource,\n PersistedCacheOptimizerFeature,\n PersistedCacheOptimizerConfigV3,\n PersistedCacheOptimizerConfig,\n CacheCompat,\n CacheStats,\n PersistedRoutedModelRef,\n UsageSnapshot,\n PersistedStatsShardV7,\n ShardAggregate,\n CacheProviderAdapter,\n ModelsConfigCache,\n CompatAdvicePlacement,\n FixSuggestion,\n CacheModel,\n} from './type';\n\n/** One directory entry as the injected file system reports it, without following symbolic links. */\ntype DirectoryEntry = { name: string; kind: 'file' | 'directory' | 'symlink'; mtimeMs: number };\n\n/**\n * Optimizer state under `STATE_DIR`, read and written through the injected file system. Synchronous\n * readers (`getCompat`, `footerStatsMode`) use the files as of the last `refreshFileConfig()`.\n */\nexport function createOptimizerSupport(\n STATE_DIR: string,\n environment: Readonly<Record<string, string | undefined>>,\n fs: FileSystem,\n) {\n const io = BACKGROUND_CONTEXT;\n const MODELS_JSON_PATH = join(STATE_DIR, 'models.json');\n function isVirtualRoutingModel(model: CacheModel | undefined): boolean {\n return !!model && (isNativeVirtualModel(model) || model.provider.toLowerCase() === 'router');\n }\n const ROUTED_FALLBACK_MODEL_SYMBOL = Symbol('pi-cache-optimizer.routed-fallback-model');\n\n const LOG_PREFIX = 'pi-cache-optimizer';\n\n const STATE_FILE_PATH = join(STATE_DIR, 'pi-cache-optimizer-stats.json');\n\n const LEGACY_STATE_FILE_PATH = join(STATE_DIR, 'deepseek-cache-optimizer-stats.json');\n\n const SHARD_STATE_DIR = join(STATE_DIR, 'pi-cache-optimizer-stats.d');\n\n const SHARD_FILES_DIR = join(SHARD_STATE_DIR, 'shards');\n\n const SHARD_EPOCH_DIR = join(SHARD_STATE_DIR, 'epochs');\n\n const SHARD_MODEL_EPOCH_DIR = join(SHARD_EPOCH_DIR, 'models');\n\n const SHARD_MAINTENANCE_DIR = join(SHARD_STATE_DIR, 'maintenance');\n\n const SHARD_GLOBAL_EPOCH_PATH = join(SHARD_EPOCH_DIR, 'global.json');\n\n const SHARD_CLEANUP_LOCK_PATH = join(SHARD_MAINTENANCE_DIR, 'cleanup.lock');\n\n const SHARD_CLEANUP_MARKER_PATH = join(SHARD_MAINTENANCE_DIR, 'last-cleanup');\n\n const CONFIG_FILE_PATH = join(STATE_DIR, 'pi-cache-optimizer-config.json');\n\n const SHARD_RETENTION_MS = 48 * 60 * 60 * 1000;\n\n const SHARD_TEMP_RETENTION_MS = 24 * 60 * 60 * 1000;\n\n const SHARD_CLEANUP_INTERVAL_MS = 6 * 60 * 60 * 1000;\n\n const SHARD_CLEANUP_LOCK_STALE_MS = 60 * 60 * 1000;\n\n const FOOTER_MODE_ENV = 'PI_CACHE_OPTIMIZER_FOOTER_MODE';\n\n const PI_VIRTUAL_MODEL_API = 'pi-virtual';\n\n const ASSISTANT_MESSAGE_MODEL_TOKEN_KEYS = ['model', 'name'];\n\n const OPENAI_REASONING_MODEL_PATTERN = /(^|[/\\s:_-])o[1345]($|[-_.:/\\s])/;\n\n const XAI_MODEL_PATTERN = /(^|[/\\s:_-])xai($|[-_.:/\\s])/;\n\n const MIMO_MODEL_PATTERN = /(^|[/\\s:_-])mi-?mo($|[-_.:/\\s])/i;\n\n const PPLX_MODEL_PATTERN = /(^|[/\\s:_-])pplx($|[-_.:/\\s])/i;\n\n const NOVA_MODEL_PATTERN = /(^|[/\\s:_-])nova($|[-_.:/\\s])/i;\n\n const MPT_MODEL_PATTERN = /(^|[/\\s:_-])mpt($|[-_.:/\\s])/i;\n\n const ALEPH_MODEL_PATTERN = /(^|[/\\s:_-])aleph($|[-_.:/\\s])/i;\n\n const ARCTIC_MODEL_PATTERN = /(^|[/\\s:_-])arctic($|[-_.:/\\s])/i;\n\n const AYA_MODEL_PATTERN = /(^|[/\\s:_-])aya($|[-_.:/\\s])/i;\n\n const ORION_MODEL_PATTERN = /(^|[/\\s:_-])orion($|[-_.:/\\s])/i;\n\n function hashSessionId(sessionId: string): string {\n return createHash('sha256').update(sessionId).digest('hex').slice(0, 16);\n }\n\n function firstNonEmptyString(...values: unknown[]): string | undefined {\n for (const value of values) {\n if (isNonEmptyString(value)) return value.trim();\n }\n return undefined;\n }\n\n function isRoutedFallbackModel(model: CacheModel | undefined): boolean {\n return !!model && (model as CacheModel & Record<symbol, unknown>)[ROUTED_FALLBACK_MODEL_SYMBOL] === true;\n }\n\n function isNativeVirtualModel(model: { api?: unknown } | undefined): boolean {\n return model?.api === PI_VIRTUAL_MODEL_API;\n }\n\n function makeSessionModelKey(sessionHash: string, provider: string, id: string): string {\n return `${sessionHash}:${provider}/${id}`;\n }\n\n function asRecord(value: unknown): UnknownRecord | undefined {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return undefined;\n return value as UnknownRecord;\n }\n\n function lower(value: unknown): string {\n return typeof value === 'string' ? value.toLowerCase() : '';\n }\n\n function getNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n }\n\n function getNonNegativeNumber(record: UnknownRecord, key: string): number | undefined {\n const value = getNumber(record[key]);\n return value !== undefined && value >= 0 ? value : undefined;\n }\n\n const NESTED_COMPAT_KEYS = [\n 'openRouterRouting',\n 'vercelGatewayRouting',\n 'chatTemplateKwargs',\n 'chatTemplateArgs',\n ] as const;\n\n function findLastExactModelDefinition(models: unknown[] | undefined, modelId: string): UnknownRecord | undefined {\n if (!models) return undefined;\n // Pi's provider composer processes definitions in array order. If a malformed\n // or hand-edited config repeats an id, the last definition replaces earlier\n // definitions, so effective resolution must use the same deterministic rule.\n for (let index = models.length - 1; index >= 0; index--) {\n const candidate = asRecord(models[index]);\n if (candidate?.id === modelId) return candidate;\n }\n return undefined;\n }\n\n function mergeCacheCompat(...sources: Array<UnknownRecord | undefined>): CacheCompat {\n const merged: CacheCompat = {};\n for (const source of sources) {\n if (!source) continue;\n const previousNested = Object.fromEntries(\n NESTED_COMPAT_KEYS.map((key) => [key, asRecord(merged[key])]),\n ) as Partial<Record<(typeof NESTED_COMPAT_KEYS)[number], UnknownRecord | undefined>>;\n Object.assign(merged, source);\n for (const key of NESTED_COMPAT_KEYS) {\n const baseValue = previousNested[key];\n const overrideValue = asRecord(source[key]);\n if (baseValue || overrideValue) {\n merged[key] = { ...baseValue, ...overrideValue };\n }\n }\n }\n return merged;\n }\n\n function getEffectiveCompatSources(\n model: CacheModel,\n config: unknown,\n ): Array<{ source: 'provider' | 'model' | 'runtime' | 'modelOverride'; compat: UnknownRecord }> {\n const root = asRecord(config);\n const providers = asRecord(root?.providers);\n const provider = asRecord(providers?.[model.provider]);\n const providerCompat = asRecord(provider?.compat);\n const customModel = findLastExactModelDefinition(\n Array.isArray(provider?.models) ? provider.models : undefined,\n model.id,\n );\n const customModelCompat = asRecord(asRecord(customModel)?.compat);\n const runtimeCompat = asRecord(model.compat);\n const modelOverride = asRecord(asRecord(provider?.modelOverrides)?.[model.id]);\n const modelOverrideCompat = asRecord(modelOverride?.compat);\n\n return [\n ...(providerCompat ? [{ source: 'provider' as const, compat: providerCompat }] : []),\n ...(customModelCompat ? [{ source: 'model' as const, compat: customModelCompat }] : []),\n ...(runtimeCompat ? [{ source: 'runtime' as const, compat: runtimeCompat }] : []),\n ...(modelOverrideCompat ? [{ source: 'modelOverride' as const, compat: modelOverrideCompat }] : []),\n ];\n }\n\n function resolveEffectiveCompatFromConfig(model: CacheModel, config: unknown): CacheCompat {\n // Pi's effective precedence is provider → models[] → runtime model →\n // modelOverrides. The runtime layer is intentionally included between the\n // config model and modelOverride: extension providers can replace the model\n // object after lower config layers were applied, while the override remains\n // Pi's highest-precedence user layer.\n return mergeCacheCompat(...getEffectiveCompatSources(model, config).map(({ compat }) => compat));\n }\n\n function isOptionalString(value: unknown): boolean {\n return value === undefined || (typeof value === 'string' && value.length > 0);\n }\n\n function isOptionalBoolean(value: unknown): boolean {\n return value === undefined || typeof value === 'boolean';\n }\n\n function isFiniteNumber(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value);\n }\n\n function isRecordOfStrings(value: unknown): boolean {\n const record = asRecord(value);\n return !!record && Object.values(record).every((entry) => typeof entry === 'string');\n }\n\n function isThinkingLevelMap(value: unknown): boolean {\n const map = asRecord(value);\n if (!map) return false;\n return ['off', 'minimal', 'low', 'medium', 'high', 'xhigh', 'max'].every(\n (key) => map[key] === undefined || map[key] === null || typeof map[key] === 'string',\n );\n }\n\n function isValidModelCostTier(value: unknown): boolean {\n const tier = asRecord(value);\n return (\n !!tier &&\n isFiniteNumber(tier.inputTokensAbove) &&\n isFiniteNumber(tier.input) &&\n isFiniteNumber(tier.output) &&\n isFiniteNumber(tier.cacheRead) &&\n isFiniteNumber(tier.cacheWrite)\n );\n }\n\n function isValidModelCost(value: unknown, partial: boolean): boolean {\n const cost = asRecord(value);\n if (!cost) return false;\n for (const key of ['input', 'output', 'cacheRead', 'cacheWrite']) {\n if ((!partial || cost[key] !== undefined) && !isFiniteNumber(cost[key])) return false;\n }\n return cost.tiers === undefined || (Array.isArray(cost.tiers) && cost.tiers.every(isValidModelCostTier));\n }\n\n function isValidModelDefinition(value: unknown): boolean {\n const model = asRecord(value);\n if (!model || !isNonEmptyString(model.id)) return false;\n if (!isOptionalString(model.name) || !isOptionalString(model.api) || !isOptionalString(model.baseUrl)) return false;\n if (!isOptionalBoolean(model.reasoning) || !isValidCompatRecord(model.compat)) return false;\n if (model.thinkingLevelMap !== undefined && !isThinkingLevelMap(model.thinkingLevelMap)) return false;\n if (\n model.input !== undefined &&\n (!Array.isArray(model.input) || !model.input.every((entry) => entry === 'text' || entry === 'image'))\n )\n return false;\n if (model.cost !== undefined && !isValidModelCost(model.cost, false)) return false;\n if (model.contextWindow !== undefined && !isFiniteNumber(model.contextWindow)) return false;\n if (model.maxTokens !== undefined && !isFiniteNumber(model.maxTokens)) return false;\n if (model.samplingParams !== undefined && !asRecord(model.samplingParams)) return false;\n if (model.headers !== undefined && !isRecordOfStrings(model.headers)) return false;\n return true;\n }\n\n function isValidModelOverride(value: unknown): boolean {\n const override = asRecord(value);\n if (!override || !isValidCompatRecord(override.compat)) return false;\n if (!isOptionalString(override.name) || !isOptionalBoolean(override.reasoning)) return false;\n if (override.thinkingLevelMap !== undefined && !isThinkingLevelMap(override.thinkingLevelMap)) return false;\n if (\n override.input !== undefined &&\n (!Array.isArray(override.input) || !override.input.every((entry) => entry === 'text' || entry === 'image'))\n )\n return false;\n if (override.cost !== undefined && !isValidModelCost(override.cost, true)) return false;\n if (override.contextWindow !== undefined && !isFiniteNumber(override.contextWindow)) return false;\n if (override.maxTokens !== undefined && !isFiniteNumber(override.maxTokens)) return false;\n if (override.samplingParams !== undefined && !asRecord(override.samplingParams)) return false;\n if (override.headers !== undefined && !isRecordOfStrings(override.headers)) return false;\n return true;\n }\n\n function isValidOpenAICompletionsCompat(compat: UnknownRecord): boolean {\n const booleanKeys = [\n 'supportsStore',\n 'supportsDeveloperRole',\n 'supportsReasoningEffort',\n 'supportsUsageInStreaming',\n 'requiresToolResultName',\n 'requiresAssistantAfterToolResult',\n 'requiresThinkingAsText',\n 'requiresReasoningContentOnAssistantMessages',\n 'supportsOpenAIGrammarTools',\n 'supportsStrictMode',\n 'sendSessionAffinityHeaders',\n 'supportsLongCacheRetention',\n ];\n if (booleanKeys.some((key) => !isOptionalBoolean(compat[key]))) return false;\n if (\n compat.maxTokensField !== undefined &&\n compat.maxTokensField !== 'max_completion_tokens' &&\n compat.maxTokensField !== 'max_tokens'\n )\n return false;\n if (\n compat.thinkingFormat !== undefined &&\n ![\n 'openai',\n 'openrouter',\n 'together',\n 'baseten',\n 'deepseek',\n 'zai',\n 'qwen',\n 'chat-template',\n 'qwen-chat-template',\n 'string-thinking',\n 'ant-ling',\n ].includes(typeof compat.thinkingFormat === 'string' ? compat.thinkingFormat : '')\n )\n return false;\n if (compat.cacheControlFormat !== undefined && compat.cacheControlFormat !== 'anthropic') return false;\n if (compat.deferredToolsMode !== undefined && compat.deferredToolsMode !== 'kimi') return false;\n if (\n compat.sessionAffinityFormat !== undefined &&\n !['openai', 'openai-nosession', 'openrouter'].includes(\n typeof compat.sessionAffinityFormat === 'string' ? compat.sessionAffinityFormat : '',\n )\n )\n return false;\n for (const key of NESTED_COMPAT_KEYS) {\n if (compat[key] !== undefined && !asRecord(compat[key])) return false;\n }\n return true;\n }\n\n function isValidOpenAIResponsesCompat(compat: UnknownRecord): boolean {\n const booleanKeys = [\n 'supportsDeveloperRole',\n 'supportsLongCacheRetention',\n 'supportsStrictMode',\n 'supportsOpenAIGrammarTools',\n 'supportsAdditionalTools',\n 'supportsToolSearch',\n ];\n if (booleanKeys.some((key) => !isOptionalBoolean(compat[key]))) return false;\n return (\n compat.sessionAffinityFormat === undefined ||\n ['openai', 'openai-nosession', 'openrouter'].includes(\n typeof compat.sessionAffinityFormat === 'string' ? compat.sessionAffinityFormat : '',\n )\n );\n }\n\n function isValidAnthropicMessagesCompat(compat: UnknownRecord): boolean {\n return [\n 'supportsEagerToolInputStreaming',\n 'supportsLongCacheRetention',\n 'sendSessionAffinityHeaders',\n 'supportsCacheControlOnTools',\n 'supportsTemperature',\n 'forceAdaptiveThinking',\n 'allowEmptySignature',\n 'supportsStrictTools',\n 'supportsToolReferences',\n ].every((key) => isOptionalBoolean(compat[key]));\n }\n\n function isValidCompatRecord(value: unknown): boolean {\n if (value === undefined) return true;\n const compat = asRecord(value);\n return (\n !!compat &&\n !Object.prototype.hasOwnProperty.call(compat, 'supportsPromptCacheKey') &&\n (isValidOpenAICompletionsCompat(compat) ||\n isValidOpenAIResponsesCompat(compat) ||\n isValidAnthropicMessagesCompat(compat))\n );\n }\n\n function isValidModelsConfigForEffectiveCompat(value: unknown): boolean {\n const root = asRecord(value);\n const providers = asRecord(root?.providers);\n if (!root || !providers) return false;\n\n for (const providerValue of Object.values(providers)) {\n const provider = asRecord(providerValue);\n if (!provider) return false;\n if (\n !isOptionalString(provider.name) ||\n !isOptionalString(provider.baseUrl) ||\n !isOptionalString(provider.apiKey) ||\n !isOptionalString(provider.api)\n )\n return false;\n if (!isOptionalBoolean(provider.authHeader) || !isValidCompatRecord(provider.compat)) return false;\n if (provider.oauth !== undefined && provider.oauth !== 'radius') return false;\n if (provider.headers !== undefined && !isRecordOfStrings(provider.headers)) return false;\n if (\n provider.models !== undefined &&\n (!Array.isArray(provider.models) || !provider.models.every(isValidModelDefinition))\n )\n return false;\n const overrides = provider.modelOverrides === undefined ? undefined : asRecord(provider.modelOverrides);\n if (\n provider.modelOverrides !== undefined &&\n (!overrides || !Object.values(overrides).every(isValidModelOverride))\n )\n return false;\n }\n return true;\n }\n\n /** Keyed by the file text, so an unchanged models.json is not parsed again. */\n let modelsConfigCache: ModelsConfigCache | undefined;\n\n async function refreshModelsConfig(): Promise<void> {\n let text: string | undefined;\n try {\n text = await readTextIfExists(fs, MODELS_JSON_PATH, io);\n } catch {\n text = undefined;\n }\n const signature = text ?? 'missing';\n if (modelsConfigCache?.signature === signature) return;\n\n let value: unknown;\n if (text !== undefined) {\n try {\n const parsed = parseJsonc(text);\n value = isValidModelsConfigForEffectiveCompat(parsed) ? parsed : undefined;\n } catch {\n value = undefined;\n }\n }\n\n modelsConfigCache = { signature, value };\n }\n\n /** The models.json compat config as of the last refresh. */\n function effectiveCompatConfig(): unknown {\n return modelsConfigCache?.value;\n }\n\n async function readEffectiveCompatConfig(): Promise<unknown> {\n await refreshModelsConfig();\n return effectiveCompatConfig();\n }\n\n function getCompat(model: CacheModel | undefined): CacheCompat {\n if (!model) return {} as CacheCompat;\n return resolveEffectiveCompatFromConfig(model, effectiveCompatConfig());\n }\n\n function joinDisplayPath(base: string, child: string, platform: string = process.platform): string {\n const sep = platform.startsWith('win') ? '\\\\' : '/';\n return `${base.replace(/[\\\\/]+$/, '')}${sep}${child}`;\n }\n\n function getAgentDirDisplayPath(\n platform: string = process.platform,\n agentDir: string = STATE_DIR,\n homeDir: string = nodeHost.homeDirectory(),\n ): string {\n const sep = platform.startsWith('win') ? '\\\\' : '/';\n const normalizedAgentDir = agentDir.replace(/[\\\\/]+/g, sep);\n const normalizedHomeDir = homeDir.replace(/[\\\\/]+/g, sep).replace(/[\\\\/]+$/, '');\n const homePrefix = `${normalizedHomeDir}${sep}`;\n\n if (normalizedAgentDir === normalizedHomeDir || normalizedAgentDir.startsWith(homePrefix)) {\n const relative = normalizedAgentDir.slice(normalizedHomeDir.length).replace(/^[\\\\/]+/, '');\n const homeLabel = platform.startsWith('win') ? '%USERPROFILE%' : '~';\n return relative ? `${homeLabel}${sep}${relative}` : homeLabel;\n }\n\n return normalizedAgentDir;\n }\n\n function getModelsJsonDisplayPath(\n platform: string = process.platform,\n agentDir: string = STATE_DIR,\n homeDir: string = nodeHost.homeDirectory(),\n ): string {\n return joinDisplayPath(getAgentDirDisplayPath(platform, agentDir, homeDir), 'models.json', platform);\n }\n\n function parseFooterStatsMode(value: unknown): FooterStatsMode | undefined {\n if (typeof value !== 'string') return undefined;\n const normalized = value.trim().toLowerCase();\n return normalized === 'session' || normalized === 'total' || normalized === 'process' ? normalized : undefined;\n }\n\n function parsePersistedCacheOptimizerConfig(value: unknown): PersistedCacheOptimizerConfig | undefined {\n const record = asRecord(value);\n if (!record || (record.version !== 1 && record.version !== 2 && record.version !== 3)) return undefined;\n const allowedTopLevel = new Set(\n record.version === 1\n ? ['version', 'footerMode']\n : record.version === 2\n ? ['version', 'footerMode', 'promptCacheKey']\n : ['version', 'footerMode', 'promptCacheKey', 'features'],\n );\n if (Object.keys(record).some((key) => !allowedTopLevel.has(key))) return undefined;\n const footerMode = parseFooterStatsMode(record.footerMode);\n if (record.footerMode !== undefined && !footerMode) return undefined;\n if (record.version === 1) return { version: 1, ...(footerMode ? { footerMode } : {}) };\n\n const rawFeatures = record.version === 3 ? record.features : undefined;\n if (rawFeatures !== undefined && !asRecord(rawFeatures)) return undefined;\n const featuresRecord = asRecord(rawFeatures);\n const featureNames = new Set<PersistedCacheOptimizerFeature>([\n 'promptRewrite',\n 'virtualRewrite',\n 'skillCompression',\n 'openAICacheKey',\n 'toolOrder',\n ]);\n if (\n featuresRecord &&\n Object.keys(featuresRecord).some(\n (key) => !featureNames.has(key as PersistedCacheOptimizerFeature) || typeof featuresRecord[key] !== 'boolean',\n )\n )\n return undefined;\n\n const rawPromptCacheKey = record.promptCacheKey;\n if (rawPromptCacheKey !== undefined && !asRecord(rawPromptCacheKey)) return undefined;\n const promptCacheKey = asRecord(rawPromptCacheKey);\n if (promptCacheKey && Object.keys(promptCacheKey).some((key) => key !== 'omit')) return undefined;\n const omit = promptCacheKey?.omit;\n if (omit !== undefined && (!Array.isArray(omit) || omit.some((value): value is string => !isNonEmptyString(value))))\n return undefined;\n const stringOmit = omit as string[] | undefined;\n const uniqueOmit = stringOmit ? [...new Set(stringOmit.map((value) => value.trim()))].sort() : undefined;\n return {\n version: record.version === 3 ? 3 : 2,\n ...(footerMode ? { footerMode } : {}),\n ...(uniqueOmit && uniqueOmit.length > 0 ? { promptCacheKey: { omit: uniqueOmit } } : {}),\n ...(featuresRecord\n ? {\n features: Object.fromEntries(Object.entries(featuresRecord)) as Partial<\n Record<PersistedCacheOptimizerFeature, boolean>\n >,\n }\n : {}),\n } as PersistedCacheOptimizerConfigV3;\n }\n\n function normalizePersistedCacheOptimizerConfig(\n value: PersistedCacheOptimizerConfig | undefined,\n ): PersistedCacheOptimizerConfigV3 {\n if (!value) return { version: 2 };\n const features = value.version === 3 ? value.features : undefined;\n return {\n version: features ? 3 : 2,\n ...(value.footerMode ? { footerMode: value.footerMode } : {}),\n ...(value.version !== 1 && value.promptCacheKey ? { promptCacheKey: value.promptCacheKey } : {}),\n ...(features ? { features } : {}),\n };\n }\n\n async function readPersistedCacheOptimizerConfig(\n configPath: string = CONFIG_FILE_PATH,\n ): Promise<PersistedCacheOptimizerConfigV3> {\n try {\n const text = await readTextIfExists(fs, configPath, io);\n if (text === undefined) return { version: 2 };\n return normalizePersistedCacheOptimizerConfig(parsePersistedCacheOptimizerConfig(JSON.parse(text)));\n } catch (error) {\n console.warn(`${LOG_PREFIX}: failed to read optimizer config; using defaults`, error);\n return { version: 2 };\n }\n }\n\n function resolveFooterStatsMode(\n configuredMode: FooterStatsMode | undefined,\n env: MutableEnv = environment,\n ): { mode: FooterStatsMode; source: FooterStatsModeSource } {\n if (configuredMode) return { mode: configuredMode, source: 'config' };\n const envMode = parseFooterStatsMode(env[FOOTER_MODE_ENV]);\n return envMode ? { mode: envMode, source: 'env' } : { mode: 'session', source: 'default' };\n }\n\n function footerStatsMode(\n env: MutableEnv = environment,\n configuredMode: FooterStatsMode | undefined = persistedFooterStatsMode,\n ): FooterStatsMode {\n return resolveFooterStatsMode(configuredMode, env).mode;\n }\n\n /** Read once, on the first refresh, like the original read at construction. */\n let persistedConfigLoaded = false;\n let persistedFooterStatsMode: FooterStatsMode | undefined;\n\n /** Loads the persisted optimizer config once and rereads models.json; call before the synchronous readers. */\n async function refreshFileConfig(): Promise<void> {\n if (!persistedConfigLoaded) {\n persistedConfigLoaded = true;\n persistedFooterStatsMode = (await readPersistedCacheOptimizerConfig()).footerMode;\n }\n await refreshModelsConfig();\n }\n\n function isAssistantMessage(message: unknown): boolean {\n return asRecord(message)?.role === 'assistant';\n }\n\n function getAssistantRecord(message: unknown): UnknownRecord | undefined {\n const record = asRecord(message);\n return record?.role === 'assistant' ? record : undefined;\n }\n\n function getModelIdNameTokenValues(model: CacheModel | undefined): string[] {\n if (!model) return [];\n return [model.id, model.name].map(lower).filter(Boolean);\n }\n\n function getAssistantMessageModelTokenValues(message: unknown): string[] {\n const record = asRecord(message);\n if (!record) return [];\n\n return ASSISTANT_MESSAGE_MODEL_TOKEN_KEYS.map((key) => lower(record[key])).filter(Boolean);\n }\n\n function hasAnyTokenContaining(tokens: string[], needles: string[]): boolean {\n return tokens.some((token) => needles.some((needle) => token.includes(needle)));\n }\n\n function modelOrAssistantMessageHas(message: unknown, model: CacheModel | undefined, needles: string[]): boolean {\n return hasAnyTokenContaining(\n [...getModelIdNameTokenValues(model), ...getAssistantMessageModelTokenValues(message)],\n needles,\n );\n }\n\n function isDeepSeekLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['deepseek']);\n }\n\n function isDeepSeekLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['deepseek']);\n }\n\n function isOpenAICompatibleApi(api: unknown): boolean {\n const value = lower(api);\n return value === 'openai-completions' || value === 'openai-responses';\n }\n\n function isOpenAICompatibleProxyApi(api: unknown): boolean {\n return lower(api) === 'openai-completions';\n }\n\n function isPiBuiltInLlamaCppModel(model: CacheModel | undefined): boolean {\n if (lower(model?.provider) !== 'llama.cpp' || !isOpenAICompatibleProxyApi(model?.api)) return false;\n\n // Pi's built-in llama.cpp provider supplies this exact explicit compat\n // fingerprint. Provider ids are extension-overridable and models.json can add\n // cache/routing overrides, so provider id alone must never imply exemption.\n // supportsUsageInStreaming is deliberately not part of the fingerprint: Pi\n // 0.82.x sets it false and Pi 0.83+ sets it true after fixing streamed usage,\n // and it carries no routing or cache configuration.\n const compat = getCompat(model);\n return (\n compat.supportsStore === false &&\n compat.supportsDeveloperRole === false &&\n compat.supportsReasoningEffort === false &&\n compat.supportsStrictMode === false &&\n compat.maxTokensField === 'max_tokens' &&\n compat.sendSessionAffinityHeaders === undefined &&\n compat.sessionAffinityFormat === undefined &&\n compat.supportsLongCacheRetention === undefined\n );\n }\n\n function hasAnthropicCacheTtlOrderError(message: unknown): boolean {\n const record = getAssistantRecord(message);\n if (record?.stopReason !== 'error' || typeof record.errorMessage !== 'string') return false;\n\n const error = lower(record.errorMessage);\n return (\n error.includes('cache_control') &&\n error.includes(\"ttl='1h'\") &&\n error.includes(\"ttl='5m'\") &&\n error.includes('must not come after')\n );\n }\n\n function isOpenAIFamilyToken(token: string): boolean {\n return token.includes('gpt-') || token.includes('chatgpt') || OPENAI_REASONING_MODEL_PATTERN.test(token);\n }\n\n function isOpenAIFamilyModel(model: CacheModel | undefined): boolean {\n return getModelIdNameTokenValues(model).some(isOpenAIFamilyToken);\n }\n\n function isOpenAIFamilyAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return [...getModelIdNameTokenValues(model), ...getAssistantMessageModelTokenValues(message)].some(\n isOpenAIFamilyToken,\n );\n }\n\n function isClaudeLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['anthropic', 'claude']);\n }\n\n function isClaudeLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['anthropic', 'claude']);\n }\n\n function isGeminiLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['gemini', 'vertex']);\n }\n\n function isGeminiLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['gemini', 'vertex']);\n }\n\n const ADAPTIVE_OPUS_PATTERN =\n /(^|[/\\s:_-])(opus-4[.-][6-9]|opus-4-[1-9][0-9]|opus-([5-9]|[1-9][0-9]))($|[-_.:/\\s[])/i;\n\n const ADAPTIVE_SONNET_PATTERN =\n /(^|[/\\s:_-])(sonnet-4[.-][6-9]|sonnet-4-[1-9][0-9]|sonnet-([5-9]|[1-9][0-9]))($|[-_.:/\\s[])/i;\n\n const ADAPTIVE_FABLE_PATTERN = /(^|[/\\s:_-])fable-([5-9]|[1-9][0-9])($|[-_.:/\\s[])/i;\n\n function isAdaptiveGenerationModel(model: CacheModel | undefined): boolean {\n if (!model) return false;\n const tokens = getModelIdNameTokenValues(model);\n return tokens.some(\n (t) => ADAPTIVE_OPUS_PATTERN.test(t) || ADAPTIVE_SONNET_PATTERN.test(t) || ADAPTIVE_FABLE_PATTERN.test(t),\n );\n }\n\n function isKimiCodingAdaptiveModel(model: CacheModel | undefined): boolean {\n if (!model) return false;\n const provider = lower(model.provider);\n const baseUrl = lower(model.baseUrl);\n const isKimiCodingChannel = provider.includes('kimi-coding') || baseUrl.includes('api.kimi.com/coding');\n if (!isKimiCodingChannel) return false;\n\n const tokens = getModelIdNameTokenValues(model);\n return tokens.some(\n (token) =>\n token === 'k3' ||\n token.includes('kimi-k3') ||\n token.includes('kimi k3') ||\n token.includes('kimi-for-coding') ||\n token.includes('kimi for coding'),\n );\n }\n\n function isKimiCodingEmptySignatureModel(model: CacheModel | undefined): boolean {\n if (!isKimiCodingAdaptiveModel(model)) return false;\n return getModelIdNameTokenValues(model).some(\n (token) =>\n token === 'k3' ||\n token === 'kimi-k3' ||\n token.startsWith('kimi-k3-') ||\n token === 'kimi k3' ||\n token === 'kimi-for-coding' ||\n token === 'kimi for coding',\n );\n }\n\n function isAdaptiveThinkingCompatApplicable(model: CacheModel): boolean {\n // A routed registry miss may preserve the upstream API/model identity while\n // lacking a verified endpoint. Do not diagnose or suggest compat fixes for\n // that incomplete transport metadata; ordinary direct Anthropic models still\n // use their normal native adaptive-thinking check.\n if (isRoutedFallbackModel(model) && !isNonEmptyString(model.baseUrl)) {\n return false;\n }\n\n return (\n lower(model.api) === 'anthropic-messages' &&\n (isAdaptiveGenerationModel(model) || isKimiCodingAdaptiveModel(model))\n );\n }\n\n function describeMissingAdaptiveThinkingCompat(model: CacheModel): string[] {\n const compat = getCompat(model);\n const missing: string[] = [];\n if (compat.forceAdaptiveThinking !== true) {\n missing.push('forceAdaptiveThinking');\n }\n if (isKimiCodingEmptySignatureModel(model) && compat.allowEmptySignature !== true) {\n missing.push('allowEmptySignature');\n }\n return missing;\n }\n\n function buildAdaptiveThinkingCompatSuggestion(missing: string[]): Record<string, unknown> {\n const suggestion: Record<string, unknown> = {};\n if (missing.includes('forceAdaptiveThinking')) {\n suggestion.forceAdaptiveThinking = true;\n }\n if (missing.includes('allowEmptySignature')) {\n suggestion.allowEmptySignature = true;\n }\n return suggestion;\n }\n\n function appendAdaptiveThinkingCompatAdviceLines(\n lines: string[],\n missing: string[],\n placement: CompatAdvicePlacement = {},\n ): void {\n const suggestion = buildAdaptiveThinkingCompatSuggestion(missing);\n if (Object.keys(suggestion).length > 0) {\n lines.push('Suggested fix:');\n lines.push(JSON.stringify(suggestion, null, 2));\n }\n lines.push('- forceAdaptiveThinking: true tells Pi to use adaptive thinking format');\n lines.push(\" (thinking: {type: 'adaptive'}) instead of legacy budget tokens format.\");\n lines.push(' Without this flag, Pi sends legacy thinking which adaptive-only upstreams reject.');\n if (missing.includes('allowEmptySignature')) {\n lines.push(\n '- allowEmptySignature: true preserves Kimi Coding K3 thinking blocks whose replay signature is empty.',\n );\n }\n appendCredentialSafeProviderGuidance(lines, placement, suggestion);\n }\n\n function buildAdaptiveThinkingCompatWarningText(key: string, missing: string[]): string {\n const slashIdx = key.indexOf('/');\n const providerLabel = slashIdx > 0 ? key.slice(0, slashIdx) : key;\n const modelId = slashIdx > 0 ? key.slice(slashIdx + 1) : undefined;\n const modelsJsonPath = getModelsJsonDisplayPath();\n const lines: string[] = [\n `💡 pi-cache-optimizer: ${key} is an adaptive-generation model but merged compat lacks ${missing.join(' and ')}.`,\n `Without the required compat, Pi may send legacy thinking or replay thinking blocks incorrectly.`,\n `Edit ${modelsJsonPath} -> providers[\"${providerLabel}\"] -> compat (at the same level as baseUrl/api/apiKey/models).`,\n '',\n ];\n appendAdaptiveThinkingCompatAdviceLines(lines, missing, { providerLabel, modelId });\n return lines.join('\\n');\n }\n\n function isKimiLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['kimi']);\n }\n\n function isKimiLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['kimi']);\n }\n\n function isQwenLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['qwen']);\n }\n\n function isQwenLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['qwen']);\n }\n\n function isGLMLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['glm']);\n }\n\n function isGLMLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['glm']);\n }\n\n function isMiniMaxLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['minimax']);\n }\n\n function isMiniMaxLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['minimax']);\n }\n\n function isMimoLikeModel(model: CacheModel | undefined): boolean {\n const tokens = getModelIdNameTokenValues(model);\n return hasAnyTokenContaining(tokens, ['xiaomimimo']) || tokens.some((t) => MIMO_MODEL_PATTERN.test(t));\n }\n\n function isMimoLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n const allTokens = [...getModelIdNameTokenValues(model), ...getAssistantMessageModelTokenValues(message)];\n return hasAnyTokenContaining(allTokens, ['xiaomimimo']) || allTokens.some((t) => MIMO_MODEL_PATTERN.test(t));\n }\n\n function isHunyuanLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['hunyuan']);\n }\n\n function isHunyuanLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['hunyuan']);\n }\n\n function isMistralLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['mistral', 'mixtral', 'codestral']);\n }\n\n function isMistralLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['mistral', 'mixtral', 'codestral']);\n }\n\n function isGrokLikeModel(model: CacheModel | undefined): boolean {\n const tokens = getModelIdNameTokenValues(model);\n return hasAnyTokenContaining(tokens, ['grok']) || tokens.some((t) => XAI_MODEL_PATTERN.test(t));\n }\n\n function isGrokLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n const allTokens = [...getModelIdNameTokenValues(model), ...getAssistantMessageModelTokenValues(message)];\n return hasAnyTokenContaining(allTokens, ['grok']) || allTokens.some((t) => XAI_MODEL_PATTERN.test(t));\n }\n\n function isLlamaLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['llama']);\n }\n\n function isLlamaLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['llama']);\n }\n\n function isNemotronLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['nemotron']);\n }\n\n function isNemotronLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['nemotron']);\n }\n\n function isCohereLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['cohere', 'command-r']);\n }\n\n function isCohereLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['cohere', 'command-r']);\n }\n\n const YI_MODEL_PATTERN = /(^|[/\\s:_-])yi($|[-_.:/\\s])/;\n\n function isYiLikeModel(model: CacheModel | undefined): boolean {\n const tokens = getModelIdNameTokenValues(model);\n return hasAnyTokenContaining(tokens, ['yi-', '01-ai', 'zero-one']) || tokens.some((t) => YI_MODEL_PATTERN.test(t));\n }\n\n function isYiLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n const allTokens = [...getModelIdNameTokenValues(model), ...getAssistantMessageModelTokenValues(message)];\n return (\n hasAnyTokenContaining(allTokens, ['yi-', '01-ai', 'zero-one']) || allTokens.some((t) => YI_MODEL_PATTERN.test(t))\n );\n }\n\n const DOUBAO_SEED_PATTERN = /(^|[/\\s:_-])seed($|[-_.:/\\s])/i;\n\n function isDoubaoLikeModel(model: CacheModel | undefined): boolean {\n const tokens = getModelIdNameTokenValues(model);\n return (\n hasAnyTokenContaining(tokens, ['doubao', '豆包', 'volcengine', 'bytedance', 'byte-dance']) ||\n tokens.some((t) => DOUBAO_SEED_PATTERN.test(t))\n );\n }\n\n function isDoubaoLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n const allTokens = [...getModelIdNameTokenValues(model), ...getAssistantMessageModelTokenValues(message)];\n return (\n hasAnyTokenContaining(allTokens, ['doubao', '豆包', 'volcengine', 'bytedance', 'byte-dance']) ||\n allTokens.some((t) => DOUBAO_SEED_PATTERN.test(t))\n );\n }\n\n function isErnieLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), [\n 'ernie',\n 'wenxin',\n '文心',\n 'yiyan',\n '一言',\n 'baidu',\n ]);\n }\n\n function isErnieLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['ernie', 'wenxin', '文心', 'yiyan', '一言', 'baidu']);\n }\n\n function isBaichuanLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['baichuan', '百川']);\n }\n\n function isBaichuanLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['baichuan', '百川']);\n }\n\n function isStepFunLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['stepfun', 'step-']);\n }\n\n function isStepFunLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['stepfun', 'step-']);\n }\n\n function isSparkLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['spark', 'xinghuo', '星火', 'iflytek', '讯飞']);\n }\n\n function isSparkLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['spark', 'xinghuo', '星火', 'iflytek', '讯飞']);\n }\n\n function isInternLMLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['internlm', 'intern-lm', '书生']);\n }\n\n function isInternLMLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['internlm', 'intern-lm', '书生']);\n }\n\n function isGemmaLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['gemma']);\n }\n\n function isGemmaLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['gemma']);\n }\n\n const PHI_MODEL_PATTERN = /(^|[/\\s:_-])phi($|[-_.:/\\s])/i;\n\n function isPhiLikeModel(model: CacheModel | undefined): boolean {\n const tokens = getModelIdNameTokenValues(model);\n return hasAnyTokenContaining(tokens, ['phi-']) || tokens.some((t) => PHI_MODEL_PATTERN.test(t));\n }\n\n function isPhiLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n const allTokens = [...getModelIdNameTokenValues(model), ...getAssistantMessageModelTokenValues(message)];\n return hasAnyTokenContaining(allTokens, ['phi-']) || allTokens.some((t) => PHI_MODEL_PATTERN.test(t));\n }\n\n function isJambaLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['jamba', 'ai21']);\n }\n\n function isJambaLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['jamba', 'ai21']);\n }\n\n function isSolarLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['solar', 'upstage']);\n }\n\n function isSolarLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['solar', 'upstage']);\n }\n\n function isPerplexityLikeModel(model: CacheModel | undefined): boolean {\n const tokens = getModelIdNameTokenValues(model);\n return hasAnyTokenContaining(tokens, ['sonar', 'perplexity']) || tokens.some((t) => PPLX_MODEL_PATTERN.test(t));\n }\n\n function isPerplexityLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n const allTokens = [...getModelIdNameTokenValues(model), ...getAssistantMessageModelTokenValues(message)];\n return (\n hasAnyTokenContaining(allTokens, ['sonar', 'perplexity']) || allTokens.some((t) => PPLX_MODEL_PATTERN.test(t))\n );\n }\n\n function isNovaLikeModel(model: CacheModel | undefined): boolean {\n const tokens = getModelIdNameTokenValues(model);\n return hasAnyTokenContaining(tokens, ['amazon-nova']) || tokens.some((t) => NOVA_MODEL_PATTERN.test(t));\n }\n\n function isNovaLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n const allTokens = [...getModelIdNameTokenValues(model), ...getAssistantMessageModelTokenValues(message)];\n return hasAnyTokenContaining(allTokens, ['amazon-nova']) || allTokens.some((t) => NOVA_MODEL_PATTERN.test(t));\n }\n\n function isRekaLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['reka']);\n }\n\n function isRekaLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['reka']);\n }\n\n function isFalconLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['falcon', 'tiiuae']);\n }\n\n function isFalconLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['falcon', 'tiiuae']);\n }\n\n function isDbrxLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['dbrx', 'databricks']);\n }\n\n function isDbrxLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['dbrx', 'databricks']);\n }\n\n function isMptLikeModel(model: CacheModel | undefined): boolean {\n const tokens = getModelIdNameTokenValues(model);\n return hasAnyTokenContaining(tokens, ['mosaicml', 'mpt-']) || tokens.some((t) => MPT_MODEL_PATTERN.test(t));\n }\n\n function isMptLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n const allTokens = [...getModelIdNameTokenValues(model), ...getAssistantMessageModelTokenValues(message)];\n return hasAnyTokenContaining(allTokens, ['mosaicml', 'mpt-']) || allTokens.some((t) => MPT_MODEL_PATTERN.test(t));\n }\n\n function isStableLMLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['stablelm', 'stable-lm', 'stability-ai']);\n }\n\n function isStableLMLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['stablelm', 'stable-lm', 'stability-ai']);\n }\n\n function isAquilaLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['aquila', 'baai']);\n }\n\n function isAquilaLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['aquila', 'baai']);\n }\n\n function isExaoneLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['exaone']);\n }\n\n function isExaoneLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['exaone']);\n }\n\n function isHyperCLOVALikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['hyperclova', 'clova-x']);\n }\n\n function isHyperCLOVALikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['hyperclova', 'clova-x']);\n }\n\n function isLuminousLikeModel(model: CacheModel | undefined): boolean {\n const tokens = getModelIdNameTokenValues(model);\n return (\n hasAnyTokenContaining(tokens, ['luminous', 'aleph-alpha']) || tokens.some((t) => ALEPH_MODEL_PATTERN.test(t))\n );\n }\n\n function isLuminousLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n const allTokens = [...getModelIdNameTokenValues(model), ...getAssistantMessageModelTokenValues(message)];\n return (\n hasAnyTokenContaining(allTokens, ['luminous', 'aleph-alpha']) ||\n allTokens.some((t) => ALEPH_MODEL_PATTERN.test(t))\n );\n }\n\n function isHermesLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['nous', 'hermes', 'openhermes']);\n }\n\n function isHermesLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['nous', 'hermes', 'openhermes']);\n }\n\n function isGraniteLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['granite', 'ibm-granite']);\n }\n\n function isGraniteLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['granite', 'ibm-granite']);\n }\n\n function isArcticLikeModel(model: CacheModel | undefined): boolean {\n const tokens = getModelIdNameTokenValues(model);\n return hasAnyTokenContaining(tokens, ['snowflake-arctic']) || tokens.some((t) => ARCTIC_MODEL_PATTERN.test(t));\n }\n\n function isArcticLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n const allTokens = [...getModelIdNameTokenValues(model), ...getAssistantMessageModelTokenValues(message)];\n return (\n hasAnyTokenContaining(allTokens, ['snowflake-arctic']) || allTokens.some((t) => ARCTIC_MODEL_PATTERN.test(t))\n );\n }\n\n function isPanguLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['pangu', 'pan-gu', '盘古', 'huawei-pangu']);\n }\n\n function isPanguLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['pangu', 'pan-gu', '盘古', 'huawei-pangu']);\n }\n\n function isSenseNovaLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['sensenova', 'sense-nova', 'sensechat', '商汤']);\n }\n\n function isSenseNovaLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['sensenova', 'sense-nova', 'sensechat', '商汤']);\n }\n\n function isZhinaoLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['360gpt', '360-gpt', 'zhinao', '智脑']);\n }\n\n function isZhinaoLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['360gpt', '360-gpt', 'zhinao', '智脑']);\n }\n\n function isMiniCPMLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['minicpm', 'mini-cpm', 'openbmb']);\n }\n\n function isMiniCPMLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['minicpm', 'mini-cpm', 'openbmb']);\n }\n\n function isXVerseLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['xverse']);\n }\n\n function isXVerseLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['xverse']);\n }\n\n function isOrionLikeModel(model: CacheModel | undefined): boolean {\n const tokens = getModelIdNameTokenValues(model);\n return (\n hasAnyTokenContaining(tokens, ['orionstar', 'orion-star']) || tokens.some((t) => ORION_MODEL_PATTERN.test(t))\n );\n }\n\n function isOrionLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n const allTokens = [...getModelIdNameTokenValues(model), ...getAssistantMessageModelTokenValues(message)];\n return (\n hasAnyTokenContaining(allTokens, ['orionstar', 'orion-star']) ||\n allTokens.some((t) => ORION_MODEL_PATTERN.test(t))\n );\n }\n\n function isOpenChatLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['openchat']);\n }\n\n function isOpenChatLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['openchat']);\n }\n\n function isVicunaLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['vicuna']);\n }\n\n function isVicunaLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['vicuna']);\n }\n\n function isWizardLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), [\n 'wizardlm',\n 'wizard-lm',\n 'wizardcoder',\n 'wizard-coder',\n ]);\n }\n\n function isWizardLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['wizardlm', 'wizard-lm', 'wizardcoder', 'wizard-coder']);\n }\n\n function isZephyrLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['zephyr']);\n }\n\n function isZephyrLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['zephyr']);\n }\n\n function isDolphinLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['dolphin']);\n }\n\n function isDolphinLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['dolphin']);\n }\n\n function isOpenOrcaLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['openorca', 'open-orca']);\n }\n\n function isOpenOrcaLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['openorca', 'open-orca']);\n }\n\n function isStarlingLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['starling']);\n }\n\n function isStarlingLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['starling']);\n }\n\n function isBloomLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['bloom', 'bigscience']);\n }\n\n function isBloomLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['bloom', 'bigscience']);\n }\n\n function isRwkvLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['rwkv']);\n }\n\n function isRwkvLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['rwkv']);\n }\n\n function isAyaLikeModel(model: CacheModel | undefined): boolean {\n const tokens = getModelIdNameTokenValues(model);\n return hasAnyTokenContaining(tokens, ['aya-expanse']) || tokens.some((t) => AYA_MODEL_PATTERN.test(t));\n }\n\n function isAyaLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n const allTokens = [...getModelIdNameTokenValues(model), ...getAssistantMessageModelTokenValues(message)];\n return hasAnyTokenContaining(allTokens, ['aya-expanse']) || allTokens.some((t) => AYA_MODEL_PATTERN.test(t));\n }\n\n function modelKey(model: ModelIdentity): string {\n return `${model.provider}/${model.id}`;\n }\n\n function modelFromAssistantMessage(message: unknown, fallback: CacheModel | undefined): CacheModel | undefined {\n const record = getAssistantRecord(message);\n if (!record) return fallback;\n\n const id = firstNonEmptyString(record.responseModel, record.model, fallback?.id);\n const provider = firstNonEmptyString(record.provider, fallback?.provider);\n const api = firstNonEmptyString(record.api, fallback?.api) ?? '';\n if (!id || !provider) return fallback;\n\n const fallbackName = isNonEmptyString(fallback?.name) ? fallback.name : undefined;\n const preservesFallbackIdentity =\n !isVirtualRoutingModel(fallback) &&\n provider === fallback?.provider &&\n id === fallback?.id &&\n fallbackName !== undefined;\n\n return {\n ...fallback,\n id,\n // Direct providers such as kimi-coding may echo only a short model id\n // (`k3`) while the active model name (`Kimi K3`) carries the adapter token.\n // Preserve that display name only when response and fallback identities are\n // exactly the same; routed/different identities keep message-local naming.\n name: preservesFallbackIdentity ? fallbackName : id,\n provider,\n api,\n baseUrl: fallback?.baseUrl ?? '',\n } as CacheModel;\n }\n\n /** Physical catalog identity for native virtual dispatch, including registry misses. */\n function resolvePhysicalModel(dispatch: CacheModel, registered: CacheModel | undefined): CacheModel {\n const model =\n registered && registered.api !== PI_VIRTUAL_MODEL_API\n ? registered\n : {\n provider: dispatch.provider,\n id: dispatch.id,\n name: dispatch.name,\n api: dispatch.api === PI_VIRTUAL_MODEL_API ? '' : dispatch.api,\n baseUrl: '',\n [ROUTED_FALLBACK_MODEL_SYMBOL]: true,\n };\n const providers = asRecord(asRecord(effectiveCompatConfig())?.providers);\n const provider = asRecord(providers?.[model.provider]);\n const customModel = findLastExactModelDefinition(\n Array.isArray(provider?.models) ? provider.models : undefined,\n model.id,\n );\n const configuredApi = customModel?.api ?? provider?.api;\n const configuredBaseUrl = customModel?.baseUrl ?? provider?.baseUrl;\n const api = isNonEmptyString(model.api) ? model.api : isNonEmptyString(configuredApi) ? configuredApi : model.api;\n const baseUrl = isNonEmptyString(model.baseUrl)\n ? model.baseUrl\n : isNonEmptyString(configuredBaseUrl)\n ? configuredBaseUrl\n : model.baseUrl;\n return api === model.api && baseUrl === model.baseUrl ? model : { ...model, api, baseUrl };\n }\n\n function consolidateDirectProviderStatsModel(\n statsModel: CacheModel | undefined,\n ctxModel: CacheModel | undefined,\n ): CacheModel | undefined {\n if (!statsModel || !ctxModel) return statsModel;\n // Virtual routing providers keep message-local stats identity.\n if (isVirtualRoutingModel(ctxModel)) return statsModel;\n // Only consolidate within the same provider.\n if (statsModel.provider !== ctxModel.provider) return statsModel;\n // Only consolidate when both resolve to the same cache adapter object, so\n // genuinely different models sharing a provider (or sharing the same adapter\n // family id, e.g. GPT and GLM both report family id \"openai\") are never\n // merged. `selectAdapterForModel` returns the precise adapter object, so\n // object identity is the correct criterion.\n const statsAdapter = selectAdapterForModel(statsModel);\n const ctxAdapter = selectAdapterForModel(ctxModel);\n if (!statsAdapter || !ctxAdapter || statsAdapter !== ctxAdapter) return statsModel;\n // No drift , nothing to consolidate.\n if (statsModel.id === ctxModel.id) return statsModel;\n // Consolidate: pin stats to the active-model identity the footer reads.\n return {\n ...statsModel,\n id: ctxModel.id,\n name: ctxModel.name || ctxModel.id,\n };\n }\n\n function usageRecordFromAssistant(message: unknown): UnknownRecord | undefined {\n return asRecord(getAssistantRecord(message)?.usage);\n }\n\n function getNestedRecord(record: UnknownRecord | undefined, key: string): UnknownRecord | undefined {\n return asRecord(record?.[key]);\n }\n\n function getFirstNonNegativeNumber(...values: unknown[]): number | undefined {\n for (const value of values) {\n const number = getNumber(value);\n if (number !== undefined && number >= 0) return number;\n }\n return undefined;\n }\n\n function readCachedTokensFromDetails(details: UnknownRecord | undefined): number | undefined {\n return getFirstNonNegativeNumber(details?.cached_tokens, details?.cachedTokens);\n }\n\n function readCacheWriteFromDetails(details: UnknownRecord | undefined): number | undefined {\n return getFirstNonNegativeNumber(details?.cache_write_tokens, details?.cacheWriteTokens);\n }\n\n function getPiNormalizedUsage(message: unknown, allowInputOnly = false): UsageSnapshot | undefined {\n const usage = usageRecordFromAssistant(message);\n if (!usage) return undefined;\n\n const input = getNonNegativeNumber(usage, 'input');\n const cacheRead = getNonNegativeNumber(usage, 'cacheRead');\n const cacheWrite = getNonNegativeNumber(usage, 'cacheWrite');\n const hasCacheSignal = cacheRead !== undefined || cacheWrite !== undefined;\n\n if (!hasCacheSignal && (input === undefined || !allowInputOnly)) return undefined;\n\n // Under healthy Pi normalization input is the uncached portion, so\n // totalInput = input + cacheRead + cacheWrite gives the full prompt token count.\n // Guard against degenerate reads where a broken proxy omits prompt_tokens and\n // Pi's input falls to zero: totalInput must never be less than cacheRead + cacheWrite.\n const computed = (input ?? 0) + (cacheRead ?? 0) + (cacheWrite ?? 0);\n const floor = (cacheRead ?? 0) + (cacheWrite ?? 0);\n return {\n cacheRead: cacheRead ?? 0,\n cacheWrite: cacheWrite ?? 0,\n totalInput: computed >= floor ? computed : floor,\n };\n }\n\n function getDeepSeekRawUsage(message: unknown): UsageSnapshot | undefined {\n const usage = usageRecordFromAssistant(message);\n if (!usage) return undefined;\n\n const cacheRead = getFirstNonNegativeNumber(usage.prompt_cache_hit_tokens);\n if (cacheRead === undefined) return undefined;\n\n const cacheMiss = getFirstNonNegativeNumber(usage.prompt_cache_miss_tokens);\n const promptTokens = getFirstNonNegativeNumber(usage.prompt_tokens);\n // DeepSeek guarantees prompt_tokens = prompt_cache_hit_tokens + prompt_cache_miss_tokens.\n const totalInput = promptTokens ?? cacheRead + (cacheMiss ?? 0);\n\n return { cacheRead, cacheWrite: 0, totalInput };\n }\n\n function getOpenAIRawUsage(message: unknown): UsageSnapshot | undefined {\n const usage = usageRecordFromAssistant(message);\n if (!usage) return undefined;\n\n const promptDetails =\n getNestedRecord(usage, 'prompt_tokens_details') ?? getNestedRecord(usage, 'promptTokensDetails');\n const inputDetails = getNestedRecord(usage, 'input_tokens_details') ?? getNestedRecord(usage, 'inputTokensDetails');\n const cacheRead = readCachedTokensFromDetails(promptDetails) ?? readCachedTokensFromDetails(inputDetails);\n if (cacheRead === undefined) return undefined;\n\n const cacheWrite = readCacheWriteFromDetails(promptDetails) ?? readCacheWriteFromDetails(inputDetails) ?? 0;\n const totalInput =\n getFirstNonNegativeNumber(usage.prompt_tokens, usage.promptTokens, usage.input_tokens, usage.inputTokens) ??\n cacheRead + cacheWrite;\n\n return { cacheRead, cacheWrite, totalInput };\n }\n\n function getAnthropicRawUsage(message: unknown): UsageSnapshot | undefined {\n const usage = usageRecordFromAssistant(message);\n if (!usage) return undefined;\n\n const cacheRead = getFirstNonNegativeNumber(usage.cache_read_input_tokens, usage.cacheReadInputTokens);\n const cacheWrite = getFirstNonNegativeNumber(usage.cache_creation_input_tokens, usage.cacheCreationInputTokens);\n if (cacheRead === undefined && cacheWrite === undefined) return undefined;\n\n // Anthropic input_tokens = tokens after the last cache breakpoint (neither read nor written).\n const input = getFirstNonNegativeNumber(usage.input_tokens, usage.inputTokens) ?? 0;\n return {\n cacheRead: cacheRead ?? 0,\n cacheWrite: cacheWrite ?? 0,\n totalInput: input + (cacheRead ?? 0) + (cacheWrite ?? 0),\n };\n }\n\n function getGeminiRawUsage(message: unknown): UsageSnapshot | undefined {\n const record = getAssistantRecord(message);\n if (!record) return undefined;\n\n const usage = asRecord(record.usage);\n const metadata =\n getNestedRecord(record, 'usageMetadata') ??\n getNestedRecord(record, 'usage_metadata') ??\n getNestedRecord(usage, 'usageMetadata') ??\n getNestedRecord(usage, 'usage_metadata') ??\n usage;\n if (!metadata) return undefined;\n\n const cacheRead = getFirstNonNegativeNumber(metadata.cachedContentTokenCount, metadata.cached_content_token_count);\n if (cacheRead === undefined) return undefined;\n\n const totalInput =\n getFirstNonNegativeNumber(\n metadata.promptTokenCount,\n metadata.prompt_token_count,\n metadata.inputTokenCount,\n metadata.input_token_count,\n usage?.input_tokens,\n usage?.inputTokens,\n usage?.prompt_tokens,\n usage?.promptTokens,\n ) ?? cacheRead;\n\n return { cacheRead, cacheWrite: 0, totalInput };\n }\n\n function normalizeWithFallback(\n message: unknown,\n rawNormalizer: (message: unknown) => UsageSnapshot | undefined,\n options: { allowInputOnlyPiUsage?: boolean } = {},\n ): UsageSnapshot | undefined {\n return getPiNormalizedUsage(message, options.allowInputOnlyPiUsage) ?? rawNormalizer(message);\n }\n\n function isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n }\n\n function isOfficialOpenAIBaseUrl(model: CacheModel): boolean {\n const value = lower(model.baseUrl).trim();\n if (!value) {\n return lower(model.provider) === 'openai';\n }\n\n try {\n return new URL(value).hostname === 'api.openai.com';\n } catch {\n return value === 'api.openai.com' || value.startsWith('api.openai.com/');\n }\n }\n\n function isKnownThirdPartyOpenAIEndpoint(model: CacheModel): boolean {\n return isNonEmptyString(model.baseUrl) && !isOfficialOpenAIBaseUrl(model);\n }\n\n function describeMissingOpenAICompatibleProxyCompat(model: CacheModel): string[] {\n const compat = getCompat(model);\n const missing: string[] = [];\n\n if (!isOpenAICompatibleProxyApi(model.api)) return missing;\n if (!isKnownThirdPartyOpenAIEndpoint(model)) return missing;\n if (isPiBuiltInLlamaCppModel(model)) return missing;\n\n if (compat.sendSessionAffinityHeaders === undefined) {\n missing.push('sendSessionAffinityHeaders');\n }\n\n // Explicit `sendSessionAffinityHeaders: false` is a valid safe opt-out for\n // proxies/CDNs/WAFs that block Pi's custom affinity headers with HTTP 403.\n // Treat only a missing/undefined value as missing compat; do not mark an\n // intentional false override as ⚠️ compat or let /cache-optimizer fix turn it\n // back to true.\n //\n // NOTE: supportsLongCacheRetention is intentionally NOT checked here.\n // Per spec, it is optional/risky advisory text only and must NOT trigger\n // the ⚠️ compat marker. The before_provider_request hook proactively\n // strips prompt_cache_retention for models without explicit opt-in,\n // so 400 errors are prevented regardless of this compat flag.\n // Doctor/compat may mention it as optional guidance separately.\n\n return missing;\n }\n\n function buildSafeOpenAIProxyCompatSuggestion(missing: string[]): Record<string, boolean> {\n const suggestion: Record<string, boolean> = {};\n if (missing.includes('sendSessionAffinityHeaders')) {\n suggestion.sendSessionAffinityHeaders = true;\n }\n // supportsLongCacheRetention is NOT suggested here , per spec it is\n // optional/risky and must not appear in the copyable safe snippet.\n // The proactive stripping in before_provider_request handles 400 prevention.\n return suggestion;\n }\n\n function getPromptCacheRetentionUnsupportedHint(): string {\n return 'If this channel returns `400 Unsupported parameter: prompt_cache_retention`, remove/avoid `supportsLongCacheRetention`; this extension does not write that field directly, but Pi may send it when long retention is requested and compat says the proxy supports it.';\n }\n\n function hasPromptCacheRetentionUnsupportedText(value: unknown): boolean {\n const normalized = lower(value);\n if (!normalized.includes('prompt_cache_retention')) return false;\n\n return [\n 'unsupported parameter',\n 'unsupported_parameter',\n 'unknown parameter',\n 'not supported',\n 'unsupported field',\n 'extra inputs',\n 'not permitted',\n 'unrecognized',\n ].some((needle) => normalized.includes(needle));\n }\n\n function hasPromptCacheRetentionUnsupportedErrorMessage(message: unknown): boolean {\n const record = getAssistantRecord(message);\n return record?.stopReason === 'error' && hasPromptCacheRetentionUnsupportedText(record.errorMessage);\n }\n\n function hasPromptCacheKeyUnsupportedText(value: unknown): boolean {\n const normalized = lower(value)\n .replace(/[\"'`]/g, '')\n .replace(/[\\s_-]+/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n const key = String.raw`(?:prompt ?cache ?key|promptcachekey)`;\n const field = String.raw`(?:parameter|field|input|argument)`;\n const unsupported = String.raw`(?:unsupported|unknown|unrecognized|unexpected|not supported|not allowed|not permitted|must be omitted|should be omitted)`;\n if (!new RegExp(key).test(normalized)) return false;\n\n // Keep this deliberately grammar-bound. A rejected value or a conditional\n // restriction (for example, \"not allowed when temperature is set\") is not\n // proof that the endpoint lacks support for the field itself.\n const terminal = String.raw`(?=$|[}\\]>,.;])`;\n return (\n new RegExp(\n String.raw`(?:unsupported|unknown|unrecognized|unexpected)\\s+${field}\\s*[:=]?\\s*${key}${terminal}`,\n ).test(normalized) ||\n new RegExp(\n String.raw`(?:extra\\s+inputs?|${field}\\s+not\\s+(?:allowed|permitted|supported))\\s*[:=]\\s*${key}${terminal}`,\n ).test(normalized) ||\n new RegExp(String.raw`${key}(?:\\s+${field})?\\s*[:=]?\\s*(?:is\\s+)?${unsupported}${terminal}`).test(normalized)\n );\n }\n\n function hasPromptCacheKeyUnsupportedErrorMessage(message: unknown): boolean {\n const record = getAssistantRecord(message);\n return (\n record?.stopReason === 'error' &&\n getOptionalAssistantHttpStatus(record) === 400 &&\n hasPromptCacheKeyUnsupportedText(record.errorMessage)\n );\n }\n\n function isPromptCacheKeyUnsupportedApplicable(model: CacheModel): boolean {\n return isOpenAICompatibleApi(model.api);\n }\n\n function hasReasoningProtocolRejectionText(value: unknown): boolean {\n const normalized = lower(value).replace(/\\s+/g, ' ').trim();\n if (!normalized) return false;\n\n // Match only a rejection that is attached to the `thinking` parameter. Do\n // not merely look for both parameter names: `reasoning_effort is not\n // supported; use thinking` is the opposite direction and must not activate\n // this fallback.\n const thinkingParameterRejectionPatterns = [\n /(?:^|[^a-z0-9_])[\"'`]?thinking[\"'`]?(?:\\s+(?:parameter|field|argument))?\\s*(?:is\\s+)?(?:not supported|unsupported|unknown|unrecognized|not allowed|not permitted|rejected|invalid|not valid|not accepted|disallowed|not a valid(?:\\s+(?:parameter|field|argument))?)(?![a-z0-9_])/,\n /(?:^|[^a-z0-9_])(?:unsupported|unknown|unrecognized|invalid|disallowed|rejected|not\\s+(?:a\\s+)?valid|not\\s+accepted|not\\s+allowed|not\\s+permitted)(?:[_ ](?:parameter|field|argument))?\\s*[:=]?\\s*[\"'`]?thinking[\"'`]?(?![a-z0-9_])/,\n /(?:^|[^a-z0-9_])(?:extra\\s+inputs?|additional\\s+(?:inputs?|parameters?))\\s+(?:are\\s+)?(?:not permitted|not allowed|unsupported)\\s*[:=]?\\s*[\"'`]?thinking[\"'`]?(?![a-z0-9_])/,\n ];\n let rejectionEnd = -1;\n for (const pattern of thinkingParameterRejectionPatterns) {\n const match = pattern.exec(normalized);\n if (match && match.index + match[0].length > rejectionEnd) {\n rejectionEnd = match.index + match[0].length;\n }\n }\n if (rejectionEnd < 0) return false;\n\n // The provider must direct the caller to reasoning_effort after the\n // rejection. Limiting this to the short suffix after the matched rejection\n // keeps generic documentation or an unrelated earlier sentence from being\n // treated as runtime protocol evidence.\n const recommendation = normalized.slice(rejectionEnd, rejectionEnd + 260);\n if (!/\\breasoning[_.]effort\\b/.test(recommendation)) return false;\n\n const recommendationClauses = recommendation.split(/[.;!?\\n]/);\n return recommendationClauses.some((clause) => {\n if (!/\\breasoning[_.]effort\\b/.test(clause)) return false;\n // A target mentioned inside a negated/disabled clause is not positive\n // protocol guidance, even if words such as `must` or `supported` occur.\n if (\n /\\b(?:do\\s+not|don't|never|avoid)\\s+(?:use|set|send|pass|provide)?\\s*[\"'`]?reasoning[_.]effort\\b/.test(\n clause,\n ) ||\n /\\breasoning[_.]effort\\b[^.;]{0,80}\\b(?:must|should|may|do)\\s+(?:not|never)\\b/.test(clause) ||\n /\\breasoning[_.]effort\\b[^.;]{0,80}\\b(?:unsupported|disabled|unavailable|not\\s+(?:supported|accepted|allowed|available|enabled|required|recommended|expected))\\b/.test(\n clause,\n )\n )\n return false;\n\n return [\n /(?:use|try|set|send|pass|provide)\\s+(?:the\\s+)?(?:top[- ]level\\s+)?[\"'`]?reasoning[_.]effort[\"'`]?(?![a-z0-9_])/,\n /(?:reasoning[_.]effort)\\b[^.;]{0,120}(?:instead|required|must\\s+be|should\\s+be|is\\s+(?:supported|accepted|preferred|recommended|expected))\\b/,\n /(?:parameter|field|option)\\s+(?:is|should be)\\s+[\"'`]?reasoning[_.]effort[\"'`]?(?![a-z0-9_])/,\n /instead[^.;]{0,120}(?:use|try|set|send|pass|provide)\\s+(?:the\\s+)?[\"'`]?reasoning[_.]effort[\"'`]?(?![a-z0-9_])/,\n /(?:replace|change|switch)\\s+(?:the\\s+)?[\"'`]?thinking[\"'`]?\\s+(?:with|to)\\s+[\"'`]?reasoning[_.]effort[\"'`]?(?![a-z0-9_])/,\n ].some((pattern) => pattern.test(clause));\n });\n }\n\n function getOptionalAssistantHttpStatus(record: UnknownRecord): number | undefined {\n const readStatus = (value: unknown): number | undefined => {\n if (typeof value === 'number' && Number.isInteger(value) && value >= 100 && value <= 599) return value;\n if (typeof value === 'string' && /^\\d{3}$/.test(value.trim())) {\n const parsed = Number(value.trim());\n return parsed >= 100 && parsed <= 599 ? parsed : undefined;\n }\n return undefined;\n };\n\n for (const key of ['status', 'statusCode', 'httpStatus', 'httpStatusCode']) {\n const status = readStatus(record[key]);\n if (status !== undefined) return status;\n }\n\n // Foreign/provider adapters sometimes put the HTTP status under a\n // diagnostic `details`, `error`, or `cause` object rather than exposing it\n // on the finalized assistant message itself. Traverse only these known\n // diagnostic wrappers, with a small depth bound; never inspect arbitrary\n // payload/message fields for a number that happens to look like a status.\n const scanDiagnosticStatus = (value: unknown, depth: number): number | undefined => {\n if (depth > 2) return undefined;\n if (Array.isArray(value)) {\n for (const item of value) {\n const status = scanDiagnosticStatus(item, depth + 1);\n if (status !== undefined) return status;\n }\n return undefined;\n }\n const source = asRecord(value);\n if (!source) return undefined;\n for (const key of ['status', 'statusCode', 'httpStatus', 'httpStatusCode', 'code']) {\n const status = readStatus(source[key]);\n if (status !== undefined) return status;\n }\n for (const key of ['details', 'error', 'cause', 'diagnostics']) {\n const status = scanDiagnosticStatus(source[key], depth + 1);\n if (status !== undefined) return status;\n }\n return undefined;\n };\n for (const key of ['diagnostics', 'diagnostic', 'details', 'error', 'cause']) {\n const status = scanDiagnosticStatus(record[key], 0);\n if (status !== undefined) return status;\n }\n\n // Pi's built-in OpenAI-compatible adapters normally prefix a provider error\n // body with the HTTP status (for example `400: {...}` or\n // `OpenAI API error (400): ...`). Only parse status-shaped prefixes; never\n // search arbitrary body text where a model id or payload number could be\n // mistaken for a response status.\n if (typeof record.errorMessage === 'string') {\n const errorText = record.errorMessage;\n const matches = [\n /^\\s*([1-5]\\d{2})\\b/,\n /^\\s*(?:http(?:\\s+status)?|status(?:\\s+code)?)\\s*[:(]?\\s*([1-5]\\d{2})\\b/i,\n /^\\s*[^():\\n]{1,100}\\(\\s*([1-5]\\d{2})\\b/,\n /^\\s*(?:error|api\\s+error|provider\\s+error|request\\s+failed|http\\s+error)\\s*[:(]\\s*([1-5]\\d{2})\\b/i,\n ];\n for (const pattern of matches) {\n const match = pattern.exec(errorText);\n if (match) return Number(match[1]);\n }\n }\n return undefined;\n }\n\n function hasReasoningProtocolRejectionErrorMessage(message: unknown): boolean {\n const record = getAssistantRecord(message);\n if (!record || record.stopReason !== 'error') return false;\n // Finalized assistant messages do not expose a separate status field in the\n // normal Pi path, so recover it only from structured diagnostics or the\n // adapter's status-shaped error prefix. A text-only 400-looking parameter\n // message is not enough evidence for a protocol repair.\n return getOptionalAssistantHttpStatus(record) === 400 && hasReasoningProtocolRejectionText(record.errorMessage);\n }\n\n function isReasoningProtocolRejectionSignalApplicable(model: CacheModel | undefined): boolean {\n // A provider error can teach us which protocol it expects, so this gate is\n // intentionally broader than the explicit DeepSeek-format diagnostic gate.\n // The model family identifies the affected cache/compat bucket; the error\n // text, not the model name, supplies the wire-protocol evidence.\n return !!model && isOpenAICompatibleProxyApi(model.api) && isDeepSeekLikeModel(model);\n }\n\n function isReasoningProtocolRejectionForModel(message: unknown, model: CacheModel | undefined): boolean {\n if (!model || !isReasoningProtocolRejectionSignalApplicable(model)) return false;\n if (!hasReasoningProtocolRejectionErrorMessage(message)) return false;\n const record = getAssistantRecord(message);\n if (!record) return false;\n const messageProvider = firstNonEmptyString(record.provider);\n const messageModel = firstNonEmptyString(record.responseModel, record.model);\n // An explicit identity in the finalized assistant error is authoritative.\n // Do not broaden a model-scoped observation to another DeepSeek-named model.\n return (!messageProvider || messageProvider === model.provider) && (!messageModel || messageModel === model.id);\n }\n\n function buildProviderCompatOverride(\n providerLabel: string,\n compat: Record<string, unknown>,\n ): Record<string, unknown> {\n return {\n providers: {\n [providerLabel]: {\n compat,\n },\n },\n };\n }\n\n function buildModelCompatOverride(\n providerLabel: string,\n modelId: string,\n compat: Record<string, unknown>,\n ): Record<string, unknown> {\n return {\n providers: {\n [providerLabel]: {\n modelOverrides: {\n [modelId]: {\n compat,\n },\n },\n },\n },\n };\n }\n\n function appendCredentialSafeProviderGuidance(\n lines: string[],\n placement: CompatAdvicePlacement,\n compatSuggestion: Record<string, unknown>,\n ): void {\n const providerLabel = placement.providerLabel;\n if (!providerLabel) return;\n\n lines.push('');\n lines.push('If this channel has no models.json provider entry yet:');\n lines.push('- Keep existing authentication as-is; do not copy credentials, tokens, or API keys.');\n lines.push(`- Add only cache/routing compat overrides in ${getModelsJsonDisplayPath()}.`);\n\n if (Object.keys(compatSuggestion).length === 0) {\n lines.push('- No safe copyable override is available for the missing flags shown above.');\n return;\n }\n\n lines.push('Provider-level minimal override:');\n lines.push(JSON.stringify(buildProviderCompatOverride(providerLabel, compatSuggestion), null, 2));\n\n if (placement.modelId) {\n lines.push('Single-model override (use this if only this model should change):');\n lines.push(JSON.stringify(buildModelCompatOverride(providerLabel, placement.modelId, compatSuggestion), null, 2));\n }\n }\n\n function appendOpenAIProxyCompatAdviceLines(\n lines: string[],\n missing: string[],\n options: { includeJsonIntro?: boolean } & CompatAdvicePlacement = {},\n ): void {\n const suggestion = buildSafeOpenAIProxyCompatSuggestion(missing);\n const hasSafeSuggestion = Object.keys(suggestion).length > 0;\n\n if (hasSafeSuggestion) {\n if (options.includeJsonIntro !== false) {\n lines.push('Safe default suggestion:');\n }\n lines.push(JSON.stringify(suggestion, null, 2));\n }\n\n if (missing.includes('sendSessionAffinityHeaders')) {\n lines.push(\n '- sendSessionAffinityHeaders: recommended for third-party proxies when supported; it helps keep one Pi session on the same upstream/backend.',\n );\n }\n appendCredentialSafeProviderGuidance(lines, options, suggestion);\n }\n\n function buildOpenAIProxyCompatWarningText(key: string, missing: string[]): string {\n // Extract provider id from the model key (e.g. \"otokapi/gpt-5.5\" -> \"otokapi\").\n // If no slash is found, fall back to the key itself.\n const slashIdx = key.indexOf('/');\n const providerLabel = slashIdx > 0 ? key.slice(0, slashIdx) : key;\n const modelId = slashIdx > 0 ? key.slice(slashIdx + 1) : undefined;\n\n const modelsJsonPath = getModelsJsonDisplayPath();\n const lines: string[] = [\n `💡 pi-cache-optimizer: ${key} is a third-party OpenAI-compatible proxy but merged compat lacks ${missing.join(' and ')}.`,\n `Review a precise model-scoped repair (or edit ${modelsJsonPath} -> providers[\"${providerLabel}\"] -> compat manually).`,\n ``,\n ];\n\n appendOpenAIProxyCompatAdviceLines(lines, missing, { providerLabel, modelId });\n\n return lines.join('\\n');\n }\n\n function isDeepSeekWireCompatApplicable(model: CacheModel): boolean {\n // `thinkingFormat` is the only wire-protocol signal. The model family is\n // still name/id based for adapter selection, while provider, URL, and\n // supportsReasoningEffort remain deliberately irrelevant here.\n return (\n isDeepSeekLikeModel(model) &&\n isOpenAICompatibleProxyApi(model.api) &&\n getCompat(model).thinkingFormat === 'deepseek'\n );\n }\n\n function describeMissingDeepSeekCompat(model: CacheModel): string[] {\n if (!isDeepSeekWireCompatApplicable(model)) return [];\n\n const compat = getCompat(model);\n const missing: string[] = [];\n if (compat.requiresReasoningContentOnAssistantMessages !== true) {\n missing.push('requiresReasoningContentOnAssistantMessages');\n }\n return missing;\n }\n\n function isDeepSeekCompatCheckApplicable(model: CacheModel): boolean {\n return isDeepSeekWireCompatApplicable(model);\n }\n\n function describeMissingCacheCompatForModel(model: CacheModel): string[] {\n if (isAdaptiveThinkingCompatApplicable(model)) {\n return describeMissingAdaptiveThinkingCompat(model);\n }\n\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (isDeepSeekWireCompatApplicable(model)) {\n missing.push(...describeMissingDeepSeekCompat(model));\n }\n return missing;\n }\n\n function buildDeepSeekCompatSuggestion(missing: string[]): Record<string, unknown> {\n const suggestion: Record<string, unknown> = {\n ...buildSafeOpenAIProxyCompatSuggestion(missing),\n };\n if (missing.includes('requiresReasoningContentOnAssistantMessages')) {\n suggestion.requiresReasoningContentOnAssistantMessages = true;\n }\n return suggestion;\n }\n\n function appendDeepSeekCompatAdviceLines(\n lines: string[],\n missing: string[],\n placement: CompatAdvicePlacement = {},\n ): void {\n const suggestion = buildDeepSeekCompatSuggestion(missing);\n if (Object.keys(suggestion).length > 0) {\n lines.push('Recommended DeepSeek reasoning/replay compat snippet:');\n lines.push(JSON.stringify(suggestion, null, 2));\n }\n\n if (missing.includes('requiresReasoningContentOnAssistantMessages')) {\n lines.push(\n '- requiresReasoningContentOnAssistantMessages: true keeps replayed assistant turns compatible with an explicitly selected DeepSeek reasoning wire format.',\n );\n }\n if (missing.includes('sendSessionAffinityHeaders')) {\n lines.push(\n '- sendSessionAffinityHeaders: recommended for third-party OpenAI-compatible proxies when supported; it helps keep one Pi session on the same upstream/backend.',\n );\n }\n\n appendCredentialSafeProviderGuidance(lines, placement, suggestion);\n }\n\n function buildDeepSeekCompatWarningText(key: string, missing: string[]): string {\n const slashIdx = key.indexOf('/');\n const providerLabel = slashIdx > 0 ? key.slice(0, slashIdx) : key;\n const modelId = slashIdx > 0 ? key.slice(slashIdx + 1) : undefined;\n const modelsJsonPath = getModelsJsonDisplayPath();\n const lines: string[] = [\n `💡 pi-cache-optimizer: ${key} is DeepSeek-like but merged compat lacks ${missing.join(' and ')}.`,\n `Proxies may reduce or hide cache hits. Edit ${modelsJsonPath} -> providers[\"${providerLabel}\"] -> compat (at the same level as baseUrl/api/apiKey/models).`,\n '',\n ];\n\n appendDeepSeekCompatAdviceLines(lines, missing, { providerLabel, modelId });\n\n return lines.join('\\n');\n }\n\n const CACHE_PROVIDER_ADAPTERS: CacheProviderAdapter[] = [\n {\n id: 'deepseek',\n label: 'DS cache',\n matchesModel: isDeepSeekLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isDeepSeekLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getDeepSeekRawUsage, { allowInputOnlyPiUsage: true });\n },\n warningText(model) {\n const missing = describeMissingCacheCompatForModel(model);\n if (missing.length === 0) return undefined;\n\n const key = modelKey(model);\n return isDeepSeekWireCompatApplicable(model)\n ? buildDeepSeekCompatWarningText(key, missing)\n : buildOpenAIProxyCompatWarningText(key, missing);\n },\n },\n {\n id: 'claude',\n label: 'Claude cache',\n showCacheWrite: true,\n matchesModel: isClaudeLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isClaudeLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getAnthropicRawUsage);\n },\n warningText(model) {\n if (!isClaudeLikeModel(model) || !isOpenAICompatibleApi(model.api) || isPiBuiltInLlamaCppModel(model))\n return undefined;\n if (getCompat(model).cacheControlFormat === 'anthropic') return undefined;\n\n return (\n `💡 Cache optimizer: ${modelKey(model)} looks Claude/Anthropic-like but OpenAI-compatible compat lacks cacheControlFormat: \"anthropic\". ` +\n 'Pi may not place Anthropic cache_control breakpoints unless this endpoint supports and enables that compat flag.'\n );\n },\n },\n {\n id: 'openai',\n label: 'OpenAI cache',\n matchesModel: isOpenAIFamilyModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isOpenAIFamilyAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'gemini',\n label: 'Gemini cache',\n matchesModel: isGeminiLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isGeminiLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getGeminiRawUsage);\n },\n },\n // ── Non-GPT OpenAI-compatible adapters ──────────────────────\n {\n id: 'openai' as CacheProviderId,\n label: 'Kimi cache',\n matchesModel: isKimiLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isKimiLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Qwen cache',\n matchesModel: isQwenLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isQwenLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'GLM cache',\n matchesModel: isGLMLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isGLMLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'MiniMax cache',\n matchesModel: isMiniMaxLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isMiniMaxLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Mimo cache',\n matchesModel: isMimoLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isMimoLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Hunyuan cache',\n matchesModel: isHunyuanLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isHunyuanLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n // ── More OpenAI-compatible adapters ──────────────────────────\n {\n id: 'openai' as CacheProviderId,\n label: 'Mistral cache',\n matchesModel: isMistralLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isMistralLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Grok cache',\n matchesModel: isGrokLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isGrokLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Llama cache',\n matchesModel: isLlamaLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isLlamaLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Nemotron cache',\n matchesModel: isNemotronLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isNemotronLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Cohere cache',\n matchesModel: isCohereLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isCohereLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Yi cache',\n matchesModel: isYiLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isYiLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n // ── More OpenAI-compatible adapters (batch 2) ───────────────────\n {\n id: 'openai' as CacheProviderId,\n label: 'Doubao cache',\n matchesModel: isDoubaoLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isDoubaoLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'ERNIE cache',\n matchesModel: isErnieLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isErnieLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Baichuan cache',\n matchesModel: isBaichuanLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isBaichuanLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'StepFun cache',\n matchesModel: isStepFunLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isStepFunLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Spark cache',\n matchesModel: isSparkLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isSparkLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'InternLM cache',\n matchesModel: isInternLMLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isInternLMLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Gemma cache',\n matchesModel: isGemmaLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isGemmaLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Phi cache',\n matchesModel: isPhiLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isPhiLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Jamba cache',\n matchesModel: isJambaLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isJambaLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Solar cache',\n matchesModel: isSolarLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isSolarLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n // ── New OpenAI-compatible adapters (batch 3, 12 families) ────────\n {\n id: 'openai' as CacheProviderId,\n label: 'Sonar cache',\n matchesModel: isPerplexityLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isPerplexityLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Nova cache',\n matchesModel: isNovaLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isNovaLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Reka cache',\n matchesModel: isRekaLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isRekaLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Falcon cache',\n matchesModel: isFalconLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isFalconLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'DBRX cache',\n matchesModel: isDbrxLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isDbrxLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'MPT cache',\n matchesModel: isMptLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isMptLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'StableLM cache',\n matchesModel: isStableLMLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isStableLMLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Aquila cache',\n matchesModel: isAquilaLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isAquilaLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'EXAONE cache',\n matchesModel: isExaoneLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isExaoneLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'HyperCLOVA cache',\n matchesModel: isHyperCLOVALikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isHyperCLOVALikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Luminous cache',\n matchesModel: isLuminousLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isLuminousLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Hermes cache',\n matchesModel: isHermesLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isHermesLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n // ── More OpenAI-compatible adapters (batch 4, 18 families) ────────\n {\n id: 'openai' as CacheProviderId,\n label: 'Granite cache',\n matchesModel: isGraniteLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isGraniteLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Arctic cache',\n matchesModel: isArcticLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isArcticLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Pangu cache',\n matchesModel: isPanguLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isPanguLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'SenseNova cache',\n matchesModel: isSenseNovaLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isSenseNovaLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Zhinao cache',\n matchesModel: isZhinaoLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isZhinaoLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'MiniCPM cache',\n matchesModel: isMiniCPMLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isMiniCPMLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'XVERSE cache',\n matchesModel: isXVerseLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isXVerseLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Orion cache',\n matchesModel: isOrionLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isOrionLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'OpenChat cache',\n matchesModel: isOpenChatLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isOpenChatLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Vicuna cache',\n matchesModel: isVicunaLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isVicunaLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Wizard cache',\n matchesModel: isWizardLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isWizardLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Zephyr cache',\n matchesModel: isZephyrLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isZephyrLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Dolphin cache',\n matchesModel: isDolphinLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isDolphinLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'OpenOrca cache',\n matchesModel: isOpenOrcaLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isOpenOrcaLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Starling cache',\n matchesModel: isStarlingLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isStarlingLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'BLOOM cache',\n matchesModel: isBloomLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isBloomLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'RWKV cache',\n matchesModel: isRwkvLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isRwkvLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Aya cache',\n matchesModel: isAyaLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isAyaLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n ];\n\n function selectAdapterForModel(model: CacheModel | undefined): CacheProviderAdapter | undefined {\n // A native virtual selection has no cache identity of its own; stats always\n // belong to the physical model it routed to.\n if (isNativeVirtualModel(model)) return undefined;\n return CACHE_PROVIDER_ADAPTERS.find((adapter) => adapter.matchesModel(model));\n }\n\n function selectAdapterForAssistantMessage(\n message: unknown,\n model: CacheModel | undefined,\n ): CacheProviderAdapter | undefined {\n // Assistant message metadata is request-local and authoritative for virtual\n // routing providers. Use it first for every model; direct providers normally\n // echo the same provider/model and therefore remain unchanged.\n const responseModel = modelFromAssistantMessage(message, model);\n return CACHE_PROVIDER_ADAPTERS.find((adapter) => adapter.matchesAssistantMessage(message, responseModel));\n }\n\n function notifyCacheCompatIfNeeded(\n model: CacheModel | undefined,\n notify: (text: string, level: 'warning') => void,\n warnedModels: Set<string>,\n ): void {\n if (!model) return;\n\n // A protocol rejection is retained separately from ordinary compat warnings;\n // it is surfaced once by the response hook and can be used by a later fix.\n // Do not turn it into an automatic write here.\n\n // Native anthropic-messages adaptive thinking compat check.\n // Adapter warningText only fires for OpenAI-compatible APIs, so native\n // Anthropic and Kimi Coding adaptive models need a separate check.\n if (isAdaptiveThinkingCompatApplicable(model)) {\n const missing = describeMissingAdaptiveThinkingCompat(model);\n if (missing.length > 0) {\n const key = `adaptive-thinking:${modelKey(model)}`;\n if (!warnedModels.has(key)) {\n warnedModels.add(key);\n notify(buildAdaptiveThinkingCompatWarningText(modelKey(model), missing), 'warning');\n }\n }\n // Still check adapter warnings for other compat issues.\n }\n\n const adapter = selectAdapterForModel(model);\n const text = adapter?.warningText?.(model);\n if (!adapter || !text) return;\n\n const affinityOnly =\n adapter.warningText !== undefined &&\n describeMissingOpenAICompatibleProxyCompat(model).length === 1 &&\n describeMissingCacheCompatForModel(model).length === 1;\n const key = affinityOnly ? `proxy-affinity:${model.provider}` : `${adapter.id}:${modelKey(model)}`;\n if (warnedModels.has(key)) return;\n warnedModels.add(key);\n\n notify(text, 'warning');\n }\n\n function currentLocalDay(): string {\n const now = new Date();\n const year = now.getFullYear();\n const month = String(now.getMonth() + 1).padStart(2, '0');\n const day = String(now.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n }\n\n function emptyCacheStats(day = currentLocalDay()): CacheStats {\n return {\n day,\n totalRequests: 0,\n hitRequests: 0,\n cachedInputTokens: 0,\n cacheWriteInputTokens: 0,\n totalInputTokens: 0,\n };\n }\n\n function addUsageToCacheStats(stats: CacheStats, usage: UsageSnapshot): void {\n stats.totalRequests += 1;\n if (usage.cacheRead > 0) stats.hitRequests += 1;\n stats.cachedInputTokens += usage.cacheRead;\n stats.cacheWriteInputTokens += usage.cacheWrite;\n stats.totalInputTokens += usage.totalInput;\n }\n\n function formatTokenCount(value: number): string {\n const millions = Math.max(0, Math.round(value)) / 1_000_000;\n if (millions === 0) return '0M';\n if (millions < 0.001) return `${millions.toFixed(4)}M`;\n if (millions < 0.01) return `${millions.toFixed(3)}M`;\n if (millions >= 10) return `${millions.toFixed(1)}M`;\n return `${millions.toFixed(2)}M`;\n }\n\n function formatCacheStats(adapter: CacheProviderAdapter, stats: CacheStats): string {\n const percent = stats.totalInputTokens > 0 ? (stats.cachedInputTokens / stats.totalInputTokens) * 100 : 0;\n const writeText =\n adapter.showCacheWrite && stats.cacheWriteInputTokens > 0\n ? `·write ${formatTokenCount(stats.cacheWriteInputTokens)}`\n : '';\n\n return `${adapter.label} ${stats.hitRequests}/${stats.totalRequests}·${formatTokenCount(stats.cachedInputTokens)}/${formatTokenCount(stats.totalInputTokens)} ${percent.toFixed(1)}%${writeText}`;\n }\n\n function prefixFooterStatus(statusText: string | undefined): string | undefined {\n if (!statusText || statusText.startsWith('· ')) return statusText;\n return `· ${statusText}`;\n }\n\n function hasMissingUsageFields(message: unknown, adapter: CacheProviderAdapter): boolean {\n const usage = usageRecordFromAssistant(message);\n if (!usage) return true;\n\n // Check Pi-normalized fields\n const input = getNonNegativeNumber(usage, 'input');\n const cacheRead = getNonNegativeNumber(usage, 'cacheRead');\n const cacheWrite = getNonNegativeNumber(usage, 'cacheWrite');\n\n // If Pi-normalized fields exist with non-zero values, usage is present\n if (cacheRead !== undefined || cacheWrite !== undefined || (input !== undefined && input > 0)) {\n return false;\n }\n\n // Check raw usage for the adapter's provider family\n const rawUsage = adapter.normalizeUsage(message);\n if (!rawUsage || (rawUsage.cacheRead === 0 && rawUsage.cacheWrite === 0 && rawUsage.totalInput === 0)) {\n return true;\n }\n\n return false;\n }\n\n function getErrorCode(error: unknown): string | undefined {\n return typeof error === 'object' && error !== null && 'code' in error\n ? String((error as { code?: unknown }).code)\n : undefined;\n }\n\n function parseCacheStats(value: unknown): CacheStats | undefined {\n const stats = asRecord(value);\n if (!stats || typeof stats.day !== 'string' || !/^\\d{4}-\\d{2}-\\d{2}$/.test(stats.day)) {\n return undefined;\n }\n\n const totalRequests = getNonNegativeNumber(stats, 'totalRequests');\n const hitRequests = getNonNegativeNumber(stats, 'hitRequests');\n const cachedInputTokens = getNonNegativeNumber(stats, 'cachedInputTokens');\n const cacheWriteInputTokens = getNonNegativeNumber(stats, 'cacheWriteInputTokens') ?? 0;\n const totalInputTokens = getNonNegativeNumber(stats, 'totalInputTokens');\n\n if (\n totalRequests === undefined ||\n hitRequests === undefined ||\n cachedInputTokens === undefined ||\n totalInputTokens === undefined ||\n hitRequests > totalRequests ||\n cachedInputTokens > totalInputTokens ||\n cacheWriteInputTokens > totalInputTokens\n ) {\n return undefined;\n }\n\n return {\n day: stats.day,\n totalRequests,\n hitRequests,\n cachedInputTokens,\n cacheWriteInputTokens,\n totalInputTokens,\n };\n }\n\n function cloneCacheStats(stats: CacheStats): CacheStats {\n return { ...stats };\n }\n\n function addCacheStatsTotals(target: CacheStats, source: CacheStats): void {\n target.totalRequests += source.totalRequests;\n target.hitRequests += source.hitRequests;\n target.cachedInputTokens += source.cachedInputTokens;\n target.cacheWriteInputTokens += source.cacheWriteInputTokens;\n target.totalInputTokens += source.totalInputTokens;\n }\n\n function mergeCacheStatsForTotal(existing: CacheStats | undefined, incoming: CacheStats): CacheStats {\n if (!existing) return cloneCacheStats(incoming);\n if (incoming.day > existing.day) return cloneCacheStats(incoming);\n if (incoming.day < existing.day) return existing;\n addCacheStatsTotals(existing, incoming);\n return existing;\n }\n\n function parsePersistedRoutedModelRef(value: unknown): PersistedRoutedModelRef | undefined {\n const record = asRecord(value);\n const provider = record?.provider;\n const id = record?.id;\n const name = record?.name;\n if (!isNonEmptyString(provider) || !isNonEmptyString(id)) return undefined;\n\n return {\n provider: provider.trim(),\n id: id.trim(),\n name: isNonEmptyString(name) ? name.trim() : id.trim(),\n };\n }\n\n function routedModelRefToCacheModel(ref: PersistedRoutedModelRef): CacheModel {\n return {\n id: ref.id,\n name: ref.name ?? ref.id,\n provider: ref.provider,\n api: '',\n baseUrl: '',\n } as CacheModel;\n }\n\n function selectFooterStatsForModel(\n mode: FooterStatsMode,\n sessionHash: string | undefined,\n statsByModel: Record<string, CacheStats>,\n totalsByModel: Record<string, CacheStats>,\n model: { provider: string; id: string },\n processByModel: Record<string, CacheStats> = {},\n ): CacheStats | undefined {\n if (mode === 'total') return totalsByModel[modelKey(model)];\n if (mode === 'process') return processByModel[modelKey(model)];\n if (!sessionHash) return undefined;\n return statsByModel[makeSessionModelKey(sessionHash, model.provider, model.id)];\n }\n\n function buildExactRouterStatusEntry(\n sessionHash: string | undefined,\n statsByModel: Record<string, CacheStats>,\n lastRoutedModel: PersistedRoutedModelRef | undefined,\n totalsByModel: Record<string, CacheStats> = {},\n mode: FooterStatsMode = 'total',\n processByModel: Record<string, CacheStats> = {},\n ): { model: CacheModel; adapter: CacheProviderAdapter; stats: CacheStats } | undefined {\n if (!sessionHash || !lastRoutedModel) return undefined;\n\n const model = routedModelRefToCacheModel(lastRoutedModel);\n const adapter = selectAdapterForModel(model);\n if (!adapter) return undefined;\n\n return {\n model,\n adapter,\n stats:\n selectFooterStatsForModel(mode, sessionHash, statsByModel, totalsByModel, model, processByModel) ??\n emptyCacheStats(),\n };\n }\n\n function findBestRouterModelStats(\n mode: FooterStatsMode,\n sessionHash: string | undefined,\n statsByModel: Record<string, CacheStats>,\n totalsByModel: Record<string, CacheStats>,\n processByModel: Record<string, CacheStats> = {},\n ): { model: CacheModel; adapter: CacheProviderAdapter; stats: CacheStats } | undefined {\n const entries =\n mode === 'total'\n ? Object.entries(totalsByModel)\n : mode === 'process'\n ? Object.entries(processByModel)\n : sessionHash\n ? Object.entries(statsByModel)\n .filter(([key]) => key.startsWith(`${sessionHash}:`))\n .map(([key, stats]) => [key.slice(sessionHash.length + 1), stats] as const)\n : [];\n let best: { model: CacheModel; adapter: CacheProviderAdapter; stats: CacheStats; total: number } | undefined;\n\n for (const [modelKeyPart, stats] of entries) {\n const slashIdx = modelKeyPart.indexOf('/');\n if (slashIdx < 1 || slashIdx >= modelKeyPart.length - 1) continue;\n const model = routedModelRefToCacheModel({\n provider: modelKeyPart.slice(0, slashIdx),\n id: modelKeyPart.slice(slashIdx + 1),\n });\n const adapter = selectAdapterForModel(model);\n if (!adapter) continue;\n if (!best || stats.totalRequests > best.total) {\n best = { model, adapter, stats, total: stats.totalRequests };\n }\n }\n\n return best ? { model: best.model, adapter: best.adapter, stats: best.stats } : undefined;\n }\n\n function modelEpochPath(modelKeyValue: string): string {\n return join(SHARD_MODEL_EPOCH_DIR, `${createHash('sha256').update(modelKeyValue).digest('hex')}.json`);\n }\n\n function initialEpoch(scope: string): string {\n return `initial:${scope}`;\n }\n\n function parseEpochRecord(value: unknown): string | undefined {\n const record = asRecord(value);\n return record?.version === 1 && isNonEmptyString(record.epoch) ? record.epoch.trim() : undefined;\n }\n\n async function readEpochFile(path: string, fallback: string): Promise<string> {\n try {\n return parseEpochRecord(JSON.parse(getOrThrow(await fs.readTextFile(path, io)))) ?? fallback;\n } catch {\n return fallback;\n }\n }\n\n async function readGlobalStatsEpoch(): Promise<string> {\n return readEpochFile(SHARD_GLOBAL_EPOCH_PATH, initialEpoch('global'));\n }\n\n async function readModelStatsEpoch(modelKeyValue: string): Promise<string> {\n return readEpochFile(modelEpochPath(modelKeyValue), initialEpoch(`model:${modelKeyValue}`));\n }\n\n async function writeStatsEpoch(path: string, epoch: string): Promise<void> {\n await writeFileAtomic(fs, path, JSON.stringify({ version: 1, epoch, createdAt: Date.now() }, null, 2) + '\\n', io);\n }\n\n async function advanceGlobalStatsEpoch(): Promise<string> {\n const epoch = `${Date.now()}-${randomUUID()}`;\n await writeStatsEpoch(SHARD_GLOBAL_EPOCH_PATH, epoch);\n return epoch;\n }\n\n async function advanceModelStatsEpoch(modelKeyValue: string): Promise<string> {\n const epoch = `${Date.now()}-${randomUUID()}`;\n await writeStatsEpoch(modelEpochPath(modelKeyValue), epoch);\n return epoch;\n }\n\n function parsePersistedStatsShardV7(value: unknown): PersistedStatsShardV7 | undefined {\n const record = asRecord(value);\n const processRecord = asRecord(record?.process);\n const lifecycle = asRecord(record?.lifecycle);\n const rawModels = asRecord(record?.models);\n if (\n record?.version !== 7 ||\n record.kind !== 'pi-cache-optimizer-shard' ||\n !isNonEmptyString(record.instanceId) ||\n !isNonEmptyString(record.sessionHash) ||\n !processRecord ||\n !Number.isInteger(processRecord.pid) ||\n !Number.isInteger(processRecord.ppid) ||\n typeof processRecord.instanceStartedAt !== 'number' ||\n !lifecycle ||\n (lifecycle.state !== 'active' && lifecycle.state !== 'closed') ||\n typeof lifecycle.createdAt !== 'number' ||\n typeof lifecycle.updatedAt !== 'number' ||\n !isNonEmptyString(record.day) ||\n !/^\\d{4}-\\d{2}-\\d{2}$/.test(record.day) ||\n !isNonEmptyString(record.globalEpoch) ||\n !rawModels\n )\n return undefined;\n\n const models: PersistedStatsShardV7['models'] = {};\n for (const [key, rawEntry] of Object.entries(rawModels)) {\n const entry = asRecord(rawEntry);\n const stats = parseCacheStats(entry?.stats);\n if (\n !entry ||\n !stats ||\n !isNonEmptyString(entry.modelEpoch) ||\n !isNonEmptyString(entry.provider) ||\n !isNonEmptyString(entry.modelId) ||\n key !== `${entry.provider.trim()}/${entry.modelId.trim()}`\n )\n continue;\n models[key] = {\n modelEpoch: entry.modelEpoch.trim(),\n provider: entry.provider.trim(),\n modelId: entry.modelId.trim(),\n ...(isNonEmptyString(entry.modelName) ? { modelName: entry.modelName.trim() } : {}),\n ...(isNonEmptyString(entry.api) ? { api: entry.api.trim() } : {}),\n stats,\n };\n }\n\n const lastRoutedModel = parsePersistedRoutedModelRef(record.lastRoutedModel);\n return {\n version: 7,\n kind: 'pi-cache-optimizer-shard',\n instanceId: record.instanceId.trim(),\n sessionHash: record.sessionHash.trim(),\n process: {\n pid: Number(processRecord.pid),\n ppid: Number(processRecord.ppid),\n instanceStartedAt: processRecord.instanceStartedAt,\n },\n lifecycle: {\n state: lifecycle.state,\n createdAt: lifecycle.createdAt,\n updatedAt: lifecycle.updatedAt,\n ...(typeof lifecycle.closedAt === 'number' ? { closedAt: lifecycle.closedAt } : {}),\n },\n day: record.day,\n globalEpoch: record.globalEpoch.trim(),\n models,\n ...(lastRoutedModel ? { lastRoutedModel } : {}),\n };\n }\n\n async function writeStatsShardV7(path: string, shard: PersistedStatsShardV7): Promise<void> {\n await writeFileAtomic(fs, path, JSON.stringify(shard, null, 2) + '\\n', io);\n }\n\n /** Entries of `directory`, or undefined when it does not exist. Entries removed while listing are skipped. */\n async function listDirectoryEntries(directory: string): Promise<DirectoryEntry[] | undefined> {\n const opened = await fs.openDirReader(directory, io);\n if (!opened.ok && opened.error.code === 'not_found') return undefined;\n const reader = getOrThrow(opened);\n try {\n const entries: DirectoryEntry[] = [];\n for (;;) {\n const page = getOrThrow(await reader.next(256, io));\n entries.push(...page.entries);\n if (page.done) return entries;\n }\n } finally {\n await reader.close(io);\n }\n }\n\n async function readValidStatsShardsV7(directory: string = SHARD_FILES_DIR): Promise<PersistedStatsShardV7[]> {\n const entries = await listDirectoryEntries(directory);\n if (!entries) return [];\n const shards: PersistedStatsShardV7[] = [];\n for (const { name, kind } of entries) {\n if (!/^[0-9a-f-]+\\.json$/i.test(name)) continue;\n const path = join(directory, name);\n try {\n if (kind !== 'file') continue;\n const parsed = parsePersistedStatsShardV7(JSON.parse(getOrThrow(await fs.readTextFile(path, io))));\n const filenameInstanceId = name.slice(0, -'.json'.length);\n if (parsed && parsed.instanceId === filenameInstanceId) shards.push(parsed);\n } catch {\n // Ignore malformed or transiently unavailable shards. Atomic writers will\n // publish a complete replacement on the next successful update.\n }\n }\n return shards;\n }\n\n async function aggregateStatsShardsV7(\n shards: PersistedStatsShardV7[],\n day: string = currentLocalDay(),\n ): Promise<ShardAggregate> {\n const globalEpoch = await readGlobalStatsEpoch();\n const modelEpochs = new Map<string, string>();\n const result: ShardAggregate = {\n bySession: {},\n totalsByModel: {},\n instancesBySession: {},\n instancesBySessionModel: {},\n sessionsByModel: {},\n instancesByModel: {},\n modelRefsByKey: {},\n lastRoutedModelBySession: {},\n };\n const routedUpdatedAt = new Map<string, number>();\n const modelRefUpdatedAt = new Map<string, number>();\n const modelSessions = new Map<string, Set<string>>();\n\n for (const shard of shards) {\n if (shard.day !== day || shard.globalEpoch !== globalEpoch) continue;\n let contributed = false;\n if (shard.lastRoutedModel && (routedUpdatedAt.get(shard.sessionHash) ?? -1) < shard.lifecycle.updatedAt) {\n routedUpdatedAt.set(shard.sessionHash, shard.lifecycle.updatedAt);\n result.lastRoutedModelBySession[shard.sessionHash] = shard.lastRoutedModel;\n }\n for (const [key, entry] of Object.entries(shard.models)) {\n let epoch = modelEpochs.get(key);\n if (!epoch) {\n epoch = await readModelStatsEpoch(key);\n modelEpochs.set(key, epoch);\n }\n if (entry.modelEpoch !== epoch || entry.stats.day !== day) continue;\n contributed = true;\n const sessionModels = (result.bySession[shard.sessionHash] ??= {});\n sessionModels[key] = mergeCacheStatsForTotal(sessionModels[key], entry.stats);\n result.totalsByModel[key] = mergeCacheStatsForTotal(result.totalsByModel[key], entry.stats);\n result.instancesByModel[key] = (result.instancesByModel[key] ?? 0) + 1;\n if ((modelRefUpdatedAt.get(key) ?? -1) < shard.lifecycle.updatedAt) {\n modelRefUpdatedAt.set(key, shard.lifecycle.updatedAt);\n result.modelRefsByKey[key] = {\n provider: entry.provider,\n id: entry.modelId,\n name: entry.modelName ?? entry.modelId,\n };\n }\n const sessionInstances = (result.instancesBySessionModel[shard.sessionHash] ??= {});\n sessionInstances[key] = (sessionInstances[key] ?? 0) + 1;\n const sessions = modelSessions.get(key) ?? new Set<string>();\n sessions.add(shard.sessionHash);\n modelSessions.set(key, sessions);\n }\n if (contributed) {\n result.instancesBySession[shard.sessionHash] = (result.instancesBySession[shard.sessionHash] ?? 0) + 1;\n }\n }\n for (const [key, sessions] of modelSessions) result.sessionsByModel[key] = sessions.size;\n return result;\n }\n\n function isProcessAlive(pid: number): boolean {\n if (!Number.isInteger(pid) || pid <= 0) return false;\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return getErrorCode(error) === 'EPERM';\n }\n }\n\n async function removeLegacyStatsFiles(): Promise<void> {\n for (const path of [STATE_FILE_PATH, LEGACY_STATE_FILE_PATH]) {\n const removed = await fs.remove(path, { force: true }, io);\n if (!removed.ok) console.warn(`${LOG_PREFIX}: failed to remove obsolete stats file ${path}`, removed.error);\n }\n }\n\n async function cleanupStatsShardsV7(now = Date.now(), directory: string = SHARD_FILES_DIR): Promise<number> {\n const entries = await listDirectoryEntries(directory);\n if (!entries) return 0;\n const today = currentLocalDay();\n let removed = 0;\n for (const info of entries) {\n const { name } = info;\n const isShard = /^[0-9a-f-]+\\.json$/i.test(name);\n const isTemp = name.endsWith('.tmp');\n if (!isShard && !isTemp) continue;\n const path = join(directory, name);\n try {\n if (info.kind !== 'file') continue;\n if (isTemp) {\n if (now - info.mtimeMs < SHARD_TEMP_RETENTION_MS) continue;\n } else {\n const parsed = parsePersistedStatsShardV7(JSON.parse(getOrThrow(await fs.readTextFile(path, io))));\n if (parsed?.day === today) continue;\n const updatedAt = parsed?.lifecycle.updatedAt ?? info.mtimeMs;\n if (now - updatedAt < SHARD_RETENTION_MS) continue;\n if (parsed?.lifecycle.state === 'active' && isProcessAlive(parsed.process.pid)) continue;\n }\n getOrThrow(await fs.remove(path, undefined, io));\n removed += 1;\n } catch {\n // Best-effort maintenance must never block the extension.\n }\n }\n return removed;\n }\n\n /**\n * Best-effort cross-process maintenance. A non-recursive `createDir` claims the cleanup lock; if two\n * cleanups ever overlap, each only removes expired shards, so the lock bounds work rather than guarding\n * correctness.\n */\n async function maybeCleanupStatsShardsV7(now = Date.now()): Promise<void> {\n getOrThrow(await fs.createDir(SHARD_MAINTENANCE_DIR, { recursive: true }, io));\n const marker = await fs.fileInfo(SHARD_CLEANUP_MARKER_PATH, io);\n if (marker.ok && now - marker.value.mtimeMs < SHARD_CLEANUP_INTERVAL_MS) return;\n\n const claimed = await fs.createDir(SHARD_CLEANUP_LOCK_PATH, { recursive: false }, io);\n if (!claimed.ok) {\n // Only an existing lock may be taken over; any other failure skips this cleanup.\n const lock = await fs.fileInfo(SHARD_CLEANUP_LOCK_PATH, io);\n if (!lock.ok || now - lock.value.mtimeMs <= SHARD_CLEANUP_LOCK_STALE_MS) return;\n const removed = await fs.remove(SHARD_CLEANUP_LOCK_PATH, { recursive: true, force: true }, io);\n if (!removed.ok || !(await fs.createDir(SHARD_CLEANUP_LOCK_PATH, { recursive: false }, io)).ok) return;\n }\n\n try {\n await cleanupStatsShardsV7(now);\n await writeFileAtomic(fs, SHARD_CLEANUP_MARKER_PATH, `${now}\\n`, io);\n } finally {\n getOrThrow(await fs.remove(SHARD_CLEANUP_LOCK_PATH, { recursive: true, force: true }, io));\n }\n }\n\n function isExplicitPromptCacheRetentionUnsupportedApplicable(model: CacheModel): boolean {\n // A finalized assistant error with an explicit unsupported-parameter signal\n // proves that prompt_cache_retention reached this provider/model. Do not\n // require compat inherited from the active fallback model: router shells may\n // have no upstream compat metadata when no live routing registry is present.\n return isOpenAICompatibleApi(model.api) && !isOfficialOpenAIBaseUrl(model) && !isPiBuiltInLlamaCppModel(model);\n }\n\n function isJsonWhitespace(ch: string): boolean {\n return ch === ' ' || ch === '\\n' || ch === '\\r' || ch === '\\t';\n }\n\n function readJsonStringLiteral(text: string, pos: number): { value: string; end: number } | undefined {\n if (text[pos] !== '\"') return undefined;\n let i = pos + 1;\n let value = '';\n while (i < text.length) {\n const ch = text[i];\n if (ch === '\\\\') {\n const next = text[i + 1];\n if (next === undefined) return undefined;\n if (next === 'u') {\n const hex = text.slice(i + 2, i + 6);\n if (!/^[0-9a-fA-F]{4}$/.test(hex)) return undefined;\n value += String.fromCharCode(parseInt(hex, 16));\n i += 6;\n } else {\n if (next === 'n') value += '\\n';\n else if (next === 't') value += '\\t';\n else if (next === 'r') value += '\\r';\n else if (next === 'b') value += '\\b';\n else if (next === 'f') value += '\\f';\n else value += next; // \", \\\\, / and lenient passthrough\n i += 2;\n }\n continue;\n }\n if (ch === '\"') return { value, end: i + 1 };\n value += ch;\n i++;\n }\n return undefined;\n }\n\n function buildFixSuggestion(model: CacheModel): FixSuggestion | undefined {\n const missing = describeMissingCacheCompatForModel(model);\n if (missing.length === 0) return undefined;\n\n let compatKeys: Record<string, unknown> = {};\n\n if (isAdaptiveThinkingCompatApplicable(model)) {\n compatKeys = buildAdaptiveThinkingCompatSuggestion(missing);\n } else if (isDeepSeekCompatCheckApplicable(model)) {\n compatKeys = buildDeepSeekCompatSuggestion(missing);\n } else {\n compatKeys = buildSafeOpenAIProxyCompatSuggestion(missing);\n }\n\n if (Object.keys(compatKeys).length === 0) return undefined;\n\n const key = modelKey(model);\n const slashIdx = key.indexOf('/');\n const providerLabel = slashIdx > 0 ? key.slice(0, slashIdx) : key;\n\n return {\n providerLabel,\n modelId: model.id,\n compatKeys,\n };\n }\n\n function stripJsoncComments(text: string): string {\n const out: string[] = [];\n let i = 0;\n while (i < text.length) {\n const ch = text[i];\n\n if (ch === '\"') {\n // String literal , copy byte-for-byte until the closing quote.\n // Escaped quotes/slashes must not be mistaken for comment delimiters.\n out.push(ch);\n i++;\n while (i < text.length) {\n const sc = text[i];\n out.push(sc);\n i++;\n if (sc === '\\\\' && i < text.length) {\n out.push(text[i]);\n i++;\n } else if (sc === '\"') {\n break;\n }\n }\n continue;\n }\n\n if (ch === '/' && i + 1 < text.length && text[i + 1] === '/') {\n // Line comment , replace BOTH slashes and every comment byte with\n // spaces, but leave the newline to be copied by the normal path.\n out.push(' ', ' ');\n i += 2;\n while (i < text.length && text[i] !== '\\n') {\n out.push(' ');\n i++;\n }\n continue;\n }\n\n if (ch === '/' && i + 1 < text.length && text[i + 1] === '*') {\n // Block comment , replace every byte with a space except newlines.\n // This deliberately preserves text.length and all structural offsets.\n out.push(' ', ' ');\n i += 2;\n while (i < text.length) {\n if (text[i] === '*' && i + 1 < text.length && text[i + 1] === '/') {\n out.push(' ', ' ');\n i += 2;\n break;\n }\n out.push(text[i] === '\\n' ? '\\n' : ' ');\n i++;\n }\n continue;\n }\n\n out.push(ch);\n i++;\n }\n return out.join('');\n }\n\n function stripJsoncTrailingCommas(text: string): string {\n const chars = text.split('');\n let i = 0;\n while (i < chars.length) {\n if (chars[i] === '\"') {\n const str = readJsonStringLiteral(text, i);\n if (!str) break;\n i = str.end;\n continue;\n }\n\n if (chars[i] === ',') {\n let j = i + 1;\n while (j < chars.length && isJsonWhitespace(chars[j])) j++;\n if (chars[j] === '}' || chars[j] === ']') chars[i] = ' ';\n }\n i++;\n }\n return chars.join('');\n }\n\n function parseJsonc(text: string): unknown {\n return JSON.parse(stripJsoncTrailingCommas(stripJsoncComments(text)));\n }\n return {\n selectAdapterForModel,\n selectAdapterForAssistantMessage,\n notifyCacheCompatIfNeeded,\n buildFixSuggestion,\n hasMissingUsageFields,\n formatCacheStats,\n prefixFooterStatus,\n emptyCacheStats,\n addUsageToCacheStats,\n cloneCacheStats,\n selectFooterStatsForModel,\n findBestRouterModelStats,\n buildExactRouterStatusEntry,\n hashSessionId,\n readValidStatsShardsV7,\n aggregateStatsShardsV7,\n writeStatsShardV7,\n readGlobalStatsEpoch,\n readModelStatsEpoch,\n advanceGlobalStatsEpoch,\n advanceModelStatsEpoch,\n maybeCleanupStatsShardsV7,\n removeLegacyStatsFiles,\n createSerializedAsyncRunner: createSerialRunner,\n hasReasoningProtocolRejectionErrorMessage,\n isReasoningProtocolRejectionForModel,\n hasPromptCacheKeyUnsupportedErrorMessage,\n isPromptCacheKeyUnsupportedApplicable,\n hasPromptCacheRetentionUnsupportedErrorMessage,\n isExplicitPromptCacheRetentionUnsupportedApplicable,\n hasAnthropicCacheTtlOrderError,\n getPromptCacheRetentionUnsupportedHint,\n modelFromAssistantMessage,\n resolvePhysicalModel,\n consolidateDirectProviderStatsModel,\n footerStatsMode,\n currentLocalDay,\n modelKey,\n initialEpoch,\n parsePersistedStatsShardV7,\n cleanupStatsShardsV7,\n readEffectiveCompatConfig,\n refreshFileConfig,\n getCompat,\n SHARD_FILES_DIR,\n LOG_PREFIX,\n };\n}\n","/*\n * Adapted from pi-cache-optimizer 2.8.16, https://github.com/jiangge/pi-cache-optimizer\n * Reachable cache statistics and diagnostics only. Native lifecycle is owned by Po.\n * MIT License\n *\n * Copyright (c) 2026 freescheme\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport { randomUUID } from 'node:crypto';\nimport { join } from 'node:path';\n\nimport type { PoHeadlessExecutionContext, PoHeadlessHook, PoHeadlessModelMetadata } from '@agimon-ai/po-core/headless';\nimport type { FileSystem } from '@agimon-ai/po-core/platform';\n\nimport { defaultAgentDirectory } from '../agentDirectory';\nimport { acquireEnvironmentValue } from '../environment';\nimport { createOptimizerSupport } from '../optimizerSupport';\nimport type { CacheModel, CacheStats, PersistedRoutedModelRef, PersistedStatsShardV7 } from '../optimizerSupport/type';\n\nconst STATUS_KEY = 'pi-cache-stats';\nconst PERSIST_DEBOUNCE_MS = 2000;\nconst MAX_RECENT_SAMPLES = 50;\n\nfunction asModel(model: PoHeadlessModelMetadata | undefined): CacheModel | undefined {\n return model\n ? { ...model, api: model.api ?? '', name: model.name ?? model.id, baseUrl: model.baseUrl ?? '' }\n : undefined;\n}\n\n/** One native session owner. Only V7 counters, never payloads or credentials, reach disk. */\nexport function createNativeOptimizer(\n initial: PoHeadlessExecutionContext,\n fs: FileSystem,\n stateDir = defaultAgentDirectory(),\n) {\n const support = createOptimizerSupport(stateDir, initial.environment, fs);\n const serialized = support.createSerializedAsyncRunner();\n const instanceId = randomUUID();\n const instanceStartedAt = Date.now();\n const sessionHash = support.hashSessionId(initial.sessionId);\n const shardPath = join(support.SHARD_FILES_DIR, `${instanceId}.json`);\n let currentGlobalEpoch = support.initialEpoch('global');\n const modelEpochs = new Map<string, string>();\n const models = new Map<string, CacheModel>();\n let processStats: Record<string, CacheStats> = {};\n let bySession: Record<string, CacheStats> = {};\n let totals: Record<string, CacheStats> = {};\n let lastRoutedModel: PersistedRoutedModelRef | undefined;\n let lastStatus: string | undefined;\n let shardCreatedAt = Date.now();\n let persistTimer: ReturnType<typeof setTimeout> | undefined;\n let releaseRetention: (() => void) | undefined;\n let started = false;\n let closed = false;\n let persistenceWarningShown = false;\n const warnedModels = new Set<string>();\n const warnedErrors = new Set<string>();\n const recentSamples = new Map<\n string,\n {\n timestamp: number;\n hit: boolean;\n cachedInputTokens: number;\n cacheWriteInputTokens: number;\n totalInputTokens: number;\n missingUsageFields: boolean;\n }[]\n >();\n\n const notify = (context: PoHeadlessExecutionContext, body: string): void => {\n void context.client.notify({ body, level: 'warning' });\n };\n\n function buildShard(state: 'active' | 'closed' = 'active'): PersistedStatsShardV7 {\n const entries: PersistedStatsShardV7['models'] = {};\n for (const [key, stats] of Object.entries(processStats)) {\n const model = models.get(key);\n if (!model) continue;\n entries[key] = {\n modelEpoch: modelEpochs.get(key) ?? support.initialEpoch(`model:${key}`),\n provider: model.provider,\n modelId: model.id,\n modelName: model.name,\n ...(model.api ? { api: model.api } : {}),\n stats: support.cloneCacheStats(stats),\n };\n }\n const now = Date.now();\n return {\n version: 7,\n kind: 'pi-cache-optimizer-shard',\n instanceId,\n sessionHash,\n process: { pid: process.pid, ppid: process.ppid, instanceStartedAt },\n lifecycle: { state, createdAt: shardCreatedAt, updatedAt: now, ...(state === 'closed' ? { closedAt: now } : {}) },\n day: support.currentLocalDay(),\n globalEpoch: currentGlobalEpoch,\n models: entries,\n ...(lastRoutedModel ? { lastRoutedModel: { ...lastRoutedModel } } : {}),\n };\n }\n\n async function refresh(): Promise<void> {\n const shards = (await support.readValidStatsShardsV7()).filter((shard) => shard.instanceId !== instanceId);\n if (started) shards.push(buildShard());\n const aggregate = await support.aggregateStatsShardsV7(shards);\n const epoch = await support.readGlobalStatsEpoch();\n if (epoch !== currentGlobalEpoch) {\n currentGlobalEpoch = epoch;\n processStats = {};\n modelEpochs.clear();\n models.clear();\n lastRoutedModel = undefined;\n } else {\n for (const key of Object.keys(processStats)) {\n const latest = await support.readModelStatsEpoch(key);\n if ((modelEpochs.get(key) ?? support.initialEpoch(`model:${key}`)) === latest) continue;\n delete processStats[key];\n modelEpochs.set(key, latest);\n models.delete(key);\n }\n }\n bySession = {};\n for (const [hash, stats] of Object.entries(aggregate.bySession)) {\n for (const [key, value] of Object.entries(stats)) bySession[`${hash}:${key}`] = value;\n }\n totals = aggregate.totalsByModel;\n lastRoutedModel = aggregate.lastRoutedModelBySession[sessionHash];\n lastStatus = undefined;\n }\n\n async function persist(context: PoHeadlessExecutionContext, state: 'active' | 'closed' = 'active'): Promise<void> {\n try {\n await support.writeStatsShardV7(shardPath, buildShard(state));\n } catch (error) {\n console.warn(`${support.LOG_PREFIX}: failed to persist cache stats shard`, error);\n if (!persistenceWarningShown) {\n persistenceWarningShown = true;\n notify(\n context,\n `${support.LOG_PREFIX}: failed to persist footer stats; using in-memory stats for this process.`,\n );\n }\n }\n }\n\n async function flush(context: PoHeadlessExecutionContext, state: 'active' | 'closed' = 'active'): Promise<void> {\n if (persistTimer) clearTimeout(persistTimer);\n persistTimer = undefined;\n await refresh();\n await persist(context, state);\n await refresh();\n }\n\n function schedulePersist(context: PoHeadlessExecutionContext): void {\n if (persistTimer) clearTimeout(persistTimer);\n persistTimer = setTimeout(() => {\n persistTimer = undefined;\n void serialized(async () => {\n if (!closed) {\n await persist(context);\n await refresh();\n }\n }).catch((error) => notify(context, `Cache stats refresh failed: ${String(error)}`));\n }, PERSIST_DEBOUNCE_MS);\n persistTimer.unref?.();\n }\n\n async function rollover(context: PoHeadlessExecutionContext): Promise<void> {\n const day = support.currentLocalDay();\n let changed = false;\n for (const key of Object.keys(processStats)) {\n if (processStats[key]?.day !== day) {\n processStats[key] = support.emptyCacheStats(day);\n changed = true;\n }\n }\n if (changed) {\n shardCreatedAt = Date.now();\n lastStatus = undefined;\n await flush(context);\n }\n }\n\n function selectedModel(context: PoHeadlessExecutionContext): CacheModel | undefined {\n const selected = asModel(context.model);\n if (selected?.api === 'pi-virtual' && lastRoutedModel) {\n const physical = models.get(support.modelKey(lastRoutedModel)) ?? {\n ...lastRoutedModel,\n name: lastRoutedModel.name ?? lastRoutedModel.id,\n api: '',\n baseUrl: '',\n };\n return support.resolvePhysicalModel(physical, asModel(context.getModel?.(physical.provider, physical.id)));\n }\n return selected;\n }\n\n async function publish(context: PoHeadlessExecutionContext, model = selectedModel(context)): Promise<void> {\n await rollover(context);\n const adapter = support.selectAdapterForModel(model);\n const mode = support.footerStatsMode();\n let status: string | undefined;\n if (adapter && model) {\n const stats = support.selectFooterStatsForModel(mode, sessionHash, bySession, totals, model, processStats);\n status = support.formatCacheStats(adapter, stats ?? support.emptyCacheStats());\n if (support.buildFixSuggestion(model)) status += ' ⚠️ compat';\n } else if (context.model?.api === 'pi-virtual' || context.model?.provider === 'router') {\n if (lastStatus !== undefined) return;\n const entry =\n support.buildExactRouterStatusEntry(sessionHash, bySession, lastRoutedModel, totals, mode, processStats) ??\n support.findBestRouterModelStats(mode, sessionHash, bySession, totals, processStats);\n if (entry) status = support.formatCacheStats(entry.adapter, entry.stats);\n }\n status = support.prefixFooterStatus(status);\n if (status === lastStatus) return;\n lastStatus = status;\n context.client.setStatus(STATUS_KEY, status);\n }\n\n function diagnose(message: unknown, model: CacheModel | undefined, context: PoHeadlessExecutionContext): void {\n if (!model) return;\n const key = support.modelKey(model);\n const observations: [string, boolean, string][] = [\n [\n 'reasoning',\n support.hasReasoningProtocolRejectionErrorMessage(message) &&\n support.isReasoningProtocolRejectionForModel(message, model),\n `${key} returned a reasoning-protocol rejection. Review model-scoped thinkingFormat and supportsReasoningEffort compat. No configuration was changed automatically.`,\n ],\n [\n 'key',\n support.hasPromptCacheKeyUnsupportedErrorMessage(message) &&\n support.isPromptCacheKeyUnsupportedApplicable(model),\n `${key} rejected prompt_cache_key. Review a precise model-scoped repair. No configuration was changed automatically.`,\n ],\n [\n 'retention',\n support.hasPromptCacheRetentionUnsupportedErrorMessage(message) &&\n support.isExplicitPromptCacheRetentionUnsupportedApplicable(model),\n `${key} rejected prompt_cache_retention. ${support.getPromptCacheRetentionUnsupportedHint()}`,\n ],\n [\n 'ttl',\n support.hasAnthropicCacheTtlOrderError(message) && model.api === 'anthropic-messages',\n `${key} returned an Anthropic cache-control TTL ordering error. Review model-level supportsLongCacheRetention: false. No configuration was changed automatically.`,\n ],\n ];\n for (const [kind, applicable, text] of observations) {\n const observationKey = `${kind}:${key}`;\n if (!applicable || warnedErrors.has(observationKey)) continue;\n warnedErrors.add(observationKey);\n notify(context, `⚠️ ${support.LOG_PREFIX}: ${text}`);\n }\n }\n\n async function observe(message: unknown, context: PoHeadlessExecutionContext): Promise<void> {\n const record = typeof message === 'object' && message !== null ? (message as Record<string, unknown>) : {};\n const active = asModel(context.model);\n // Native virtual messages carry the dispatched catalog id in model. responseModel\n // may be an echoed alias that the registry does not know.\n const nativeVirtual = active?.api === 'pi-virtual';\n const identity = support.modelFromAssistantMessage(\n nativeVirtual ? { ...record, responseModel: record.model ?? record.responseModel } : message,\n active,\n );\n const registered = identity && asModel(context.getModel?.(identity.provider, identity.id));\n let model = nativeVirtual && identity ? support.resolvePhysicalModel(identity, registered) : registered || identity;\n diagnose(message, model, context);\n if (record.stopReason === 'error' || record.stopReason === 'aborted') return;\n model = support.consolidateDirectProviderStatsModel(model, active);\n const adapter =\n (nativeVirtual && model ? support.selectAdapterForModel(model) : undefined) ??\n support.selectAdapterForAssistantMessage(message, model ?? active);\n if (!adapter) return;\n const usage = adapter.normalizeUsage(message);\n let routeChanged = false;\n if (model && (active?.api === 'pi-virtual' || active?.provider === 'router')) {\n const next = { provider: model.provider, id: model.id, name: model.name };\n routeChanged = JSON.stringify(lastRoutedModel) !== JSON.stringify(next);\n lastRoutedModel = next;\n }\n if (model) {\n const key = support.modelKey(model);\n const samples = recentSamples.get(key) ?? [];\n samples.push({\n timestamp: Date.now(),\n hit: (usage?.cacheRead ?? 0) > 0,\n cachedInputTokens: usage?.cacheRead ?? 0,\n cacheWriteInputTokens: usage?.cacheWrite ?? 0,\n totalInputTokens: usage?.totalInput ?? 0,\n missingUsageFields:\n !usage ||\n (usage.cacheRead === 0 && usage.cacheWrite === 0 && usage.totalInput === 0) ||\n support.hasMissingUsageFields(message, adapter),\n });\n if (samples.length > MAX_RECENT_SAMPLES) samples.splice(0, samples.length - MAX_RECENT_SAMPLES);\n recentSamples.set(key, samples);\n }\n if (!usage) {\n if (routeChanged) schedulePersist(context);\n return;\n }\n await rollover(context);\n if (model) {\n const key = support.modelKey(model);\n const globalEpoch = await support.readGlobalStatsEpoch();\n const modelEpoch = await support.readModelStatsEpoch(key);\n if (globalEpoch !== currentGlobalEpoch) {\n currentGlobalEpoch = globalEpoch;\n processStats = {};\n modelEpochs.clear();\n }\n if (modelEpochs.get(key) !== modelEpoch) {\n delete processStats[key];\n modelEpochs.set(key, modelEpoch);\n }\n models.set(key, model);\n support.addUsageToCacheStats((processStats[key] ??= support.emptyCacheStats()), usage);\n }\n schedulePersist(context);\n await refresh();\n await publish(context, model);\n }\n\n async function shutdown(context: PoHeadlessExecutionContext): Promise<void> {\n if (closed) return;\n closed = true;\n try {\n if (started) await flush(context, 'closed');\n } finally {\n if (persistTimer) clearTimeout(persistTimer);\n persistTimer = undefined;\n releaseRetention?.();\n releaseRetention = undefined;\n context.client.setStatus(STATUS_KEY, undefined);\n }\n }\n\n const hooks: PoHeadlessHook[] = [\n {\n event: 'session_start',\n handle: (_event, context) =>\n serialized(async () => {\n if (started || closed) return;\n started = true;\n releaseRetention = acquireEnvironmentValue('PI_CACHE_RETENTION', 'long');\n await support.refreshFileConfig();\n currentGlobalEpoch = await support.readGlobalStatsEpoch();\n await support.removeLegacyStatsFiles();\n await refresh();\n await flush(context);\n await support.maybeCleanupStatsShardsV7();\n await refresh();\n await publish(context);\n }),\n },\n {\n event: 'tool_execution_end',\n handle: (event, context) =>\n serialized(async () => {\n if (typeof event.parentToolCallId === 'string' && event.parentToolCallId.trim()) return;\n if (started && !closed) {\n await support.refreshFileConfig();\n await refresh();\n await publish(context);\n }\n }),\n },\n {\n event: 'agent_settled',\n handle: (_event, context) =>\n serialized(async () => {\n if (started && !closed) {\n await support.refreshFileConfig();\n await refresh();\n await publish(context);\n }\n }),\n },\n {\n event: 'model_select',\n handle: (_event, context) =>\n serialized(async () => {\n if (!started || closed) return;\n await support.refreshFileConfig();\n const model = selectedModel(context);\n support.notifyCacheCompatIfNeeded(model, (text) => notify(context, text), warnedModels);\n await refresh();\n await publish(context, model);\n }),\n },\n {\n event: 'message_end',\n handle: (event, context) =>\n serialized(async () => {\n if (!started || closed) return;\n await support.refreshFileConfig();\n await observe(event.message, context);\n }),\n },\n { event: 'session_shutdown', handle: (_event, context) => serialized(() => shutdown(context)) },\n ];\n return {\n hooks,\n dispose: () => serialized(() => shutdown(initial)),\n snapshot: () => ({ sessionHash, processStats, bySession, totals, recentSamples }),\n };\n}\n","import { defineRoot } from '@agimon-ai/po-core/extensionFile';\nimport { requirePoFs } from '@agimon-ai/po-core/platform';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverFacet';\n\nimport { PromptCacheTelemetry } from '../../../../models/promptCacheTelemetry';\nimport { createCacheRuntime } from '../../../../services/cacheRuntime';\nimport { createNativeOptimizer } from '../../../../services/nativeOptimizer';\nimport { PromptCacheTelemetryService } from '../../../../services/promptCacheTelemetry';\n\nexport default defineRoot(({ agent, context: root }: PoServerPluginContext) => {\n if (!agent) throw new Error('Cache statistics require the native session host.');\n const telemetry = new PromptCacheTelemetry();\n const runtime = createCacheRuntime({ telemetry, now: Date.now }, agent.context.environment);\n const optimizer = createNativeOptimizer(agent.context, requirePoFs(root));\n return {\n value: {\n hooks: optimizer.hooks.map((hook) => {\n if (hook.event === 'session_start')\n return {\n ...hook,\n async handle(event, context) {\n await runtime.events.session_start(event, context);\n await hook.handle(event, context);\n },\n } satisfies typeof hook;\n if (hook.event === 'message_end')\n return {\n ...hook,\n async handle(event, context) {\n runtime.events.message_end(event, context);\n await hook.handle(event, context);\n },\n } satisfies typeof hook;\n return hook;\n }),\n },\n services: [\n (context) => {\n new PromptCacheTelemetryService(context, telemetry);\n },\n runtime.plugin,\n ],\n async onDispose() {\n try {\n await optimizer.dispose();\n } finally {\n runtime.dispose();\n }\n },\n };\n});\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverFacet';\n\ntype CacheServerScope = Awaited<ReturnType<typeof import('../root.server').default>>['value'];\nexport default defineHook((context: WithRoot<PoServerPluginContext, CacheServerScope>) =>\n context.root.hooks.find((hook) => hook.event === 'agent_settled')!,\n);\n","import { type PoHeadlessHook } from '@agimon-ai/po-core/headless';\n\nimport { canonicalJson } from '../../../../../services/canonical';\nimport { sha256Base64Url } from '../../../../../services/digest';\nimport { createPromptCacheKey, createPromptCacheModelFingerprint } from '../../../../../services/namespace';\nimport { rewritePromptCacheKey } from '../../../../../services/providerPolicy';\nimport type { PromptCacheModelIdentity } from '../../../../../types/cache';\n\nfunction record(value: unknown): Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Readonly<Record<string, unknown>>)\n : {};\n}\n\nfunction modelIdentity(\n model: { provider: string; id: string; api?: string } | undefined,\n payload: unknown,\n): PromptCacheModelIdentity {\n const request = record(payload);\n return {\n virtualProvider: model?.provider,\n virtualModel: model?.id,\n api: model?.api,\n wireModel: typeof request.model === 'string' ? request.model : undefined,\n };\n}\n\nfunction cacheNamespace(context: { sessionId: string; selection: Record<string, unknown> }): string {\n return `dph_${sha256Base64Url(canonicalJson({ version: 1, session: context.sessionId, selection: context.selection }))}`;\n}\n\nexport const cacheHooks: PoHeadlessHook[] = [\n {\n event: 'before_provider_request',\n handle(event, execution) {\n const payload = record(event.payload);\n const identity = modelIdentity(event.model, payload);\n const modelFingerprint = createPromptCacheModelFingerprint(identity, sha256Base64Url);\n const key = createPromptCacheKey(\n cacheNamespace({\n sessionId: execution.sessionId,\n selection: execution.selection as unknown as Record<string, unknown>,\n }),\n 'parent',\n modelFingerprint,\n sha256Base64Url,\n );\n const rewritten = rewritePromptCacheKey(payload, identity.api, key, true);\n return rewritten === undefined ? undefined : { payload: rewritten };\n },\n },\n];\n","import { defineHook } from '@agimon-ai/po-core/extensionFile';\n\nimport { cacheHooks } from '../_lib/cacheHooks';\nexport default defineHook(cacheHooks.find((hook) => hook.event === 'before_provider_request')!);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverFacet';\n\ntype CacheServerScope = Awaited<ReturnType<typeof import('../root.server').default>>['value'];\nexport default defineHook((context: WithRoot<PoServerPluginContext, CacheServerScope>) =>\n context.root.hooks.find((hook) => hook.event === 'message_end')!,\n);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverFacet';\n\ntype CacheServerScope = Awaited<ReturnType<typeof import('../root.server').default>>['value'];\nexport default defineHook((context: WithRoot<PoServerPluginContext, CacheServerScope>) =>\n context.root.hooks.find((hook) => hook.event === 'model_select')!,\n);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverFacet';\n\ntype CacheServerScope = Awaited<ReturnType<typeof import('../root.server').default>>['value'];\nexport default defineHook((context: WithRoot<PoServerPluginContext, CacheServerScope>) =>\n context.root.hooks.find((hook) => hook.event === 'session_shutdown')!,\n);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverFacet';\n\ntype CacheServerScope = Awaited<ReturnType<typeof import('../root.server').default>>['value'];\nexport default defineHook((context: WithRoot<PoServerPluginContext, CacheServerScope>) =>\n context.root.hooks.find((hook) => hook.event === 'session_start')!,\n);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverFacet';\n\ntype CacheServerScope = Awaited<ReturnType<typeof import('../root.server').default>>['value'];\nexport default defineHook((context: WithRoot<PoServerPluginContext, CacheServerScope>) =>\n context.root.hooks.find((hook) => hook.event === 'tool_execution_end')!,\n);\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineServerPlugin, type PoServerSessionPlugin } from '@agimon-ai/po-core/serverFacet';\nimport { composeServerProviderOverrides } from '@agimon-ai/po-core/serverFacet';\nimport { composeRootHooks } from '@agimon-ai/po-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport hookAgentSettled from '../src/extensions/workspaces/sessions/(backend)/hook/agent-settled.server';\nimport hookBeforeProviderRequest from '../src/extensions/workspaces/sessions/(backend)/hook/before-provider-request.server';\nimport hookMessageEnd from '../src/extensions/workspaces/sessions/(backend)/hook/message-end.server';\nimport hookModelSelect from '../src/extensions/workspaces/sessions/(backend)/hook/model-select.server';\nimport hookSessionShutdown from '../src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server';\nimport hookSessionStart from '../src/extensions/workspaces/sessions/(backend)/hook/session-start.server';\nimport hookToolExecutionEnd from '../src/extensions/workspaces/sessions/(backend)/hook/tool-execution-end.server';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const facet = defineServerPlugin({\n name: '@agimon-ai/po-cache',\n providerOverrides: composeServerProviderOverrides(rootSession),\n session: async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get hooks(): PoServerSessionPlugin['hooks'] { return [via({ event: 'agent_settled' }, at(hookAgentSettled, contextSession)), via({ event: 'before_provider_request' }, at(hookBeforeProviderRequest, contextSession)), via({ event: 'message_end' }, at(hookMessageEnd, contextSession)), via({ event: 'model_select' }, at(hookModelSelect, contextSession)), via({ event: 'session_shutdown' }, at(hookSessionShutdown, contextSession)), via({ event: 'session_start' }, at(hookSessionStart, contextSession)), via({ event: 'tool_execution_end' }, at(hookToolExecutionEnd, contextSession))]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): PoServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default facet;\n"],"mappings":"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"}
1
+ {"version":3,"file":"server.mjs","names":["rootSession","hookAgentSettled","hookBeforeProviderRequest","hookMessageEnd","hookModelSelect","hookSessionShutdown","hookSessionStart","hookToolExecutionEnd"],"sources":["../../src/services/environment/index.ts","../../src/services/promptCacheUsage/index.ts","../../src/services/cacheRuntime/index.ts","../../src/services/agentDirectory/index.ts","../../src/services/optimizerSupport/index.ts","../../src/services/nativeOptimizer/index.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/agent-settled.server.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/cacheHooks.ts","../../src/extensions/workspaces/sessions/(backend)/hook/before-provider-request.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/message-end.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/model-select.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/session-start.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/tool-execution-end.server.ts","../../generated/server.ts"],"sourcesContent":["const environmentLeases = new WeakMap<\n NodeJS.ProcessEnv,\n Map<string, { count: number; value: string; owner: OwnedEnvironmentValue }>\n>();\n\n/** Same-value session leases restore only after the final owner leaves. External writes win. */\nexport function acquireEnvironmentValue(\n name: string,\n value: string,\n environment: NodeJS.ProcessEnv = process.env,\n): () => void {\n let leases = environmentLeases.get(environment);\n if (!leases) {\n leases = new Map();\n environmentLeases.set(environment, leases);\n }\n let lease = leases.get(name);\n if (lease && lease.value !== value) throw new Error(`Conflicting environment lease for ${name}.`);\n if (!lease) {\n const owner = new OwnedEnvironmentValue(name, environment);\n owner.set(value);\n lease = { count: 0, value, owner };\n leases.set(name, lease);\n }\n lease.count++;\n let released = false;\n return () => {\n if (released) return;\n released = true;\n if (--lease.count > 0) return;\n lease.owner.restore();\n leases.delete(name);\n };\n}\n\ninterface EnvironmentSnapshot {\n readonly present: boolean;\n readonly value?: string;\n}\n\nexport class OwnedEnvironmentValue {\n readonly #environment: NodeJS.ProcessEnv;\n readonly #name: string;\n readonly #baseline: EnvironmentSnapshot;\n #ownedValue?: string;\n\n constructor(name: string, environment: NodeJS.ProcessEnv = process.env) {\n this.#name = name;\n this.#environment = environment;\n this.#baseline = {\n present: Object.hasOwn(environment, name),\n value: environment[name],\n };\n }\n\n set(value: string): void {\n this.#environment[this.#name] = value;\n this.#ownedValue = value;\n }\n\n restore(): void {\n if (this.#ownedValue === undefined || this.#environment[this.#name] !== this.#ownedValue) return;\n if (this.#baseline.present) this.#environment[this.#name] = this.#baseline.value;\n else delete this.#environment[this.#name];\n this.#ownedValue = undefined;\n }\n}\n","import type { PromptCacheUsage } from '../../types/cache';\n\nfunction recordValue(value: unknown): Readonly<Record<string, unknown>> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Readonly<Record<string, unknown>>)\n : undefined;\n}\n\nfunction nonNegativeNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : undefined;\n}\n\nfunction firstNumber(...values: readonly unknown[]): number | undefined {\n for (const value of values) {\n const number = nonNegativeNumber(value);\n if (number !== undefined) return number;\n }\n return undefined;\n}\n\nfunction normalizedUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const cacheRead = nonNegativeNumber(usage.cacheRead);\n const cacheWrite = nonNegativeNumber(usage.cacheWrite);\n if (cacheRead === undefined && cacheWrite === undefined) return undefined;\n const input = nonNegativeNumber(usage.input) ?? 0;\n return {\n cacheRead: cacheRead ?? 0,\n cacheWrite: cacheWrite ?? 0,\n totalInput: input + (cacheRead ?? 0) + (cacheWrite ?? 0),\n };\n}\n\nfunction openAiUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const promptDetails = recordValue(usage.prompt_tokens_details) ?? recordValue(usage.promptTokensDetails);\n const inputDetails = recordValue(usage.input_tokens_details) ?? recordValue(usage.inputTokensDetails);\n const cacheRead = firstNumber(\n promptDetails?.cached_tokens,\n promptDetails?.cachedTokens,\n inputDetails?.cached_tokens,\n inputDetails?.cachedTokens,\n );\n const cacheWrite = firstNumber(\n promptDetails?.cache_write_tokens,\n promptDetails?.cacheWriteTokens,\n inputDetails?.cache_write_tokens,\n inputDetails?.cacheWriteTokens,\n );\n if (cacheRead === undefined && cacheWrite === undefined) return undefined;\n const floor = (cacheRead ?? 0) + (cacheWrite ?? 0);\n const reportedTotal = firstNumber(usage.prompt_tokens, usage.promptTokens, usage.input_tokens, usage.inputTokens);\n return {\n cacheRead: cacheRead ?? 0,\n cacheWrite: cacheWrite ?? 0,\n totalInput: Math.max(reportedTotal ?? floor, floor),\n };\n}\n\nfunction anthropicUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const cacheRead = firstNumber(usage.cache_read_input_tokens, usage.cacheReadInputTokens);\n const cacheWrite = firstNumber(usage.cache_creation_input_tokens, usage.cacheCreationInputTokens);\n if (cacheRead === undefined && cacheWrite === undefined) return undefined;\n const input = firstNumber(usage.input_tokens, usage.inputTokens) ?? 0;\n return {\n cacheRead: cacheRead ?? 0,\n cacheWrite: cacheWrite ?? 0,\n totalInput: input + (cacheRead ?? 0) + (cacheWrite ?? 0),\n };\n}\n\nfunction geminiUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const metadata = recordValue(usage.usage_metadata) ?? recordValue(usage.usageMetadata) ?? usage;\n const cacheRead = firstNumber(metadata.cachedContentTokenCount, metadata.cached_content_token_count);\n if (cacheRead === undefined) return undefined;\n const totalInput = firstNumber(\n metadata.promptTokenCount,\n metadata.prompt_token_count,\n usage.input_tokens,\n usage.inputTokens,\n usage.prompt_tokens,\n usage.promptTokens,\n );\n return { cacheRead, cacheWrite: 0, totalInput: Math.max(totalInput ?? cacheRead, cacheRead) };\n}\n\n/** Normalize only usage values carried by a provider-produced assistant message. */\nexport function normalizePromptCacheUsage(message: unknown): PromptCacheUsage | undefined {\n const messageRecord = recordValue(message);\n const usage = recordValue(messageRecord?.usage);\n if (!usage) return undefined;\n return normalizedUsage(usage) ?? openAiUsage(usage) ?? anthropicUsage(usage) ?? geminiUsage(usage);\n}\n","import { getSessionHarnessState } from '@agimon-ai/po-config/harnessStore';\nimport { PO_MINOR_MODE_CATALOG_SERVICE, readMinorModeCatalog, type MinorModeRecord } from '@agimon-ai/po-minor-mode';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport {\n PO_PROMPT_CACHE_CHILD_PROJECTION_ENV,\n PO_PROMPT_CACHE_PARENT_NAMESPACE_ENV,\n PO_PROMPT_CACHE_ROOT_SESSION_ENV,\n} from '../../constants/environment';\nimport type { PromptCacheMinorModeState } from '../../types/cache';\nimport type { CacheExtensionDependencies } from '../../types/extension';\nimport { sha256Base64Url } from '../digest';\nimport { OwnedEnvironmentValue } from '../environment';\nimport { createParentPromptCacheNamespace, createRootSessionIdentity } from '../namespace';\nimport { normalizePromptCacheUsage } from '../promptCacheUsage';\nimport type { CacheRuntime } from './type';\n\ntype MinorModeStateWithVariant = MinorModeRecord['state'] & { readonly modelContextVariant?: string };\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\nfunction minorModeState(record: MinorModeRecord): PromptCacheMinorModeState {\n const state = record.state as MinorModeStateWithVariant;\n return {\n source: record.descriptor.source,\n id: record.descriptor.id,\n activation: state.activation,\n ...(state.modelContextVariant ? { modelContextVariant: state.modelContextVariant } : {}),\n };\n}\nfunction isErrorMessage(message: unknown): boolean {\n const record = typeof message === 'object' && message !== null ? (message as Record<string, unknown>) : undefined;\n return record?.stopReason === 'error' || record?.stopReason === 'aborted';\n}\n\nexport function createCacheRuntime(\n dependencies: CacheExtensionDependencies,\n environment: Readonly<Record<string, string | undefined>>,\n): CacheRuntime {\n const parentNamespaceEnvironment = new OwnedEnvironmentValue(PO_PROMPT_CACHE_PARENT_NAMESPACE_ENV);\n const rootSessionEnvironment = new OwnedEnvironmentValue(PO_PROMPT_CACHE_ROOT_SESSION_ENV);\n const projectedParentNamespace = stringValue(environment[PO_PROMPT_CACHE_PARENT_NAMESPACE_ENV]);\n const childProjection = stringValue(environment[PO_PROMPT_CACHE_CHILD_PROJECTION_ENV]);\n const isProjectedChild = Boolean(projectedParentNamespace && childProjection);\n let rootSessionId: string | undefined;\n let parentNamespace = projectedParentNamespace;\n let minorModes: readonly PromptCacheMinorModeState[] = [];\n\n const refreshParentNamespace = (): string | undefined => {\n if (isProjectedChild) return parentNamespace;\n if (!rootSessionId) return undefined;\n const harness = getSessionHarnessState(rootSessionId);\n parentNamespace = createParentPromptCacheNamespace(\n {\n rootSessionId,\n compositionFingerprint: harness.compositionFingerprint,\n majorMode: harness.majorMode,\n domains: harness.domains,\n profile: harness.profile,\n persona: harness.personaFile,\n minorModes,\n },\n sha256Base64Url,\n );\n parentNamespaceEnvironment.set(parentNamespace);\n rootSessionEnvironment.set(createRootSessionIdentity(rootSessionId, sha256Base64Url));\n return parentNamespace;\n };\n\n const plugin = (cordis: Context): void => {\n cordis.inject([PO_MINOR_MODE_CATALOG_SERVICE], (context) => {\n if (isProjectedChild) return undefined;\n const catalog = readMinorModeCatalog(context);\n if (!catalog) return undefined;\n const refreshModes = (): void => {\n minorModes = catalog.getSnapshot().modes.map(minorModeState);\n refreshParentNamespace();\n };\n refreshModes();\n return catalog.subscribe(refreshModes);\n });\n };\n return {\n plugin,\n events: {\n session_start: (_event, ctx) => {\n if (!isProjectedChild) {\n rootSessionId = stringValue(ctx.sessionId);\n refreshParentNamespace();\n }\n },\n\n message_end: (event) => {\n if (isErrorMessage(event.message)) return;\n const usage = normalizePromptCacheUsage(event.message);\n if (usage) dependencies.telemetry.observe(usage, dependencies.now());\n },\n },\n dispose: () => {\n parentNamespaceEnvironment.restore();\n rootSessionEnvironment.restore();\n dependencies.telemetry.reset();\n },\n };\n}\n","import { getAgentDir } from '@earendil-works/pi-coding-agent';\n\n/** Pi's agent directory, where the optimizer keeps its state; the edge build swaps in `index.edge.ts`. */\nexport function defaultAgentDirectory(): string {\n return getAgentDir();\n}\n","/*\n * Adapted from pi-cache-optimizer 2.8.16, https://github.com/jiangge/pi-cache-optimizer\n * Reachable cache statistics and diagnostics only. Native lifecycle is owned by Po.\n * MIT License\n *\n * Copyright (c) 2026 freescheme\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport { createHash, randomUUID } from 'node:crypto';\nimport { join } from 'node:path';\n\nimport {\n BACKGROUND_CONTEXT,\n createSerialRunner,\n type FileSystem,\n getOrThrow,\n nodeHost,\n readTextIfExists,\n writeFileAtomic,\n} from '@agimon-ai/po-core/platform';\n\nimport type {\n MutableEnv,\n ModelIdentity,\n UnknownRecord,\n CacheProviderId,\n FooterStatsMode,\n FooterStatsModeSource,\n PersistedCacheOptimizerFeature,\n PersistedCacheOptimizerConfigV3,\n PersistedCacheOptimizerConfig,\n CacheCompat,\n CacheStats,\n PersistedRoutedModelRef,\n UsageSnapshot,\n PersistedStatsShardV7,\n ShardAggregate,\n CacheProviderAdapter,\n ModelsConfigCache,\n CompatAdvicePlacement,\n FixSuggestion,\n CacheModel,\n} from './type';\n\n/** One directory entry as the injected file system reports it, without following symbolic links. */\ntype DirectoryEntry = { name: string; kind: 'file' | 'directory' | 'symlink'; mtimeMs: number };\n\n/**\n * Optimizer state under `STATE_DIR`, read and written through the injected file system. Synchronous\n * readers (`getCompat`, `footerStatsMode`) use the files as of the last `refreshFileConfig()`.\n */\nexport function createOptimizerSupport(\n STATE_DIR: string,\n environment: Readonly<Record<string, string | undefined>>,\n fs: FileSystem,\n) {\n const io = BACKGROUND_CONTEXT;\n const MODELS_JSON_PATH = join(STATE_DIR, 'models.json');\n function isVirtualRoutingModel(model: CacheModel | undefined): boolean {\n return !!model && (isNativeVirtualModel(model) || model.provider.toLowerCase() === 'router');\n }\n const ROUTED_FALLBACK_MODEL_SYMBOL = Symbol('pi-cache-optimizer.routed-fallback-model');\n\n const LOG_PREFIX = 'pi-cache-optimizer';\n\n const STATE_FILE_PATH = join(STATE_DIR, 'pi-cache-optimizer-stats.json');\n\n const LEGACY_STATE_FILE_PATH = join(STATE_DIR, 'deepseek-cache-optimizer-stats.json');\n\n const SHARD_STATE_DIR = join(STATE_DIR, 'pi-cache-optimizer-stats.d');\n\n const SHARD_FILES_DIR = join(SHARD_STATE_DIR, 'shards');\n\n const SHARD_EPOCH_DIR = join(SHARD_STATE_DIR, 'epochs');\n\n const SHARD_MODEL_EPOCH_DIR = join(SHARD_EPOCH_DIR, 'models');\n\n const SHARD_MAINTENANCE_DIR = join(SHARD_STATE_DIR, 'maintenance');\n\n const SHARD_GLOBAL_EPOCH_PATH = join(SHARD_EPOCH_DIR, 'global.json');\n\n const SHARD_CLEANUP_LOCK_PATH = join(SHARD_MAINTENANCE_DIR, 'cleanup.lock');\n\n const SHARD_CLEANUP_MARKER_PATH = join(SHARD_MAINTENANCE_DIR, 'last-cleanup');\n\n const CONFIG_FILE_PATH = join(STATE_DIR, 'pi-cache-optimizer-config.json');\n\n const SHARD_RETENTION_MS = 48 * 60 * 60 * 1000;\n\n const SHARD_TEMP_RETENTION_MS = 24 * 60 * 60 * 1000;\n\n const SHARD_CLEANUP_INTERVAL_MS = 6 * 60 * 60 * 1000;\n\n const SHARD_CLEANUP_LOCK_STALE_MS = 60 * 60 * 1000;\n\n const FOOTER_MODE_ENV = 'PI_CACHE_OPTIMIZER_FOOTER_MODE';\n\n const PI_VIRTUAL_MODEL_API = 'pi-virtual';\n\n const ASSISTANT_MESSAGE_MODEL_TOKEN_KEYS = ['model', 'name'];\n\n const OPENAI_REASONING_MODEL_PATTERN = /(^|[/\\s:_-])o[1345]($|[-_.:/\\s])/;\n\n const XAI_MODEL_PATTERN = /(^|[/\\s:_-])xai($|[-_.:/\\s])/;\n\n const MIMO_MODEL_PATTERN = /(^|[/\\s:_-])mi-?mo($|[-_.:/\\s])/i;\n\n const PPLX_MODEL_PATTERN = /(^|[/\\s:_-])pplx($|[-_.:/\\s])/i;\n\n const NOVA_MODEL_PATTERN = /(^|[/\\s:_-])nova($|[-_.:/\\s])/i;\n\n const MPT_MODEL_PATTERN = /(^|[/\\s:_-])mpt($|[-_.:/\\s])/i;\n\n const ALEPH_MODEL_PATTERN = /(^|[/\\s:_-])aleph($|[-_.:/\\s])/i;\n\n const ARCTIC_MODEL_PATTERN = /(^|[/\\s:_-])arctic($|[-_.:/\\s])/i;\n\n const AYA_MODEL_PATTERN = /(^|[/\\s:_-])aya($|[-_.:/\\s])/i;\n\n const ORION_MODEL_PATTERN = /(^|[/\\s:_-])orion($|[-_.:/\\s])/i;\n\n function hashSessionId(sessionId: string): string {\n return createHash('sha256').update(sessionId).digest('hex').slice(0, 16);\n }\n\n function firstNonEmptyString(...values: unknown[]): string | undefined {\n for (const value of values) {\n if (isNonEmptyString(value)) return value.trim();\n }\n return undefined;\n }\n\n function isRoutedFallbackModel(model: CacheModel | undefined): boolean {\n return !!model && (model as CacheModel & Record<symbol, unknown>)[ROUTED_FALLBACK_MODEL_SYMBOL] === true;\n }\n\n function isNativeVirtualModel(model: { api?: unknown } | undefined): boolean {\n return model?.api === PI_VIRTUAL_MODEL_API;\n }\n\n function makeSessionModelKey(sessionHash: string, provider: string, id: string): string {\n return `${sessionHash}:${provider}/${id}`;\n }\n\n function asRecord(value: unknown): UnknownRecord | undefined {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return undefined;\n return value as UnknownRecord;\n }\n\n function lower(value: unknown): string {\n return typeof value === 'string' ? value.toLowerCase() : '';\n }\n\n function getNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n }\n\n function getNonNegativeNumber(record: UnknownRecord, key: string): number | undefined {\n const value = getNumber(record[key]);\n return value !== undefined && value >= 0 ? value : undefined;\n }\n\n const NESTED_COMPAT_KEYS = [\n 'openRouterRouting',\n 'vercelGatewayRouting',\n 'chatTemplateKwargs',\n 'chatTemplateArgs',\n ] as const;\n\n function findLastExactModelDefinition(models: unknown[] | undefined, modelId: string): UnknownRecord | undefined {\n if (!models) return undefined;\n // Pi's provider composer processes definitions in array order. If a malformed\n // or hand-edited config repeats an id, the last definition replaces earlier\n // definitions, so effective resolution must use the same deterministic rule.\n for (let index = models.length - 1; index >= 0; index--) {\n const candidate = asRecord(models[index]);\n if (candidate?.id === modelId) return candidate;\n }\n return undefined;\n }\n\n function mergeCacheCompat(...sources: Array<UnknownRecord | undefined>): CacheCompat {\n const merged: CacheCompat = {};\n for (const source of sources) {\n if (!source) continue;\n const previousNested = Object.fromEntries(\n NESTED_COMPAT_KEYS.map((key) => [key, asRecord(merged[key])]),\n ) as Partial<Record<(typeof NESTED_COMPAT_KEYS)[number], UnknownRecord | undefined>>;\n Object.assign(merged, source);\n for (const key of NESTED_COMPAT_KEYS) {\n const baseValue = previousNested[key];\n const overrideValue = asRecord(source[key]);\n if (baseValue || overrideValue) {\n merged[key] = { ...baseValue, ...overrideValue };\n }\n }\n }\n return merged;\n }\n\n function getEffectiveCompatSources(\n model: CacheModel,\n config: unknown,\n ): Array<{ source: 'provider' | 'model' | 'runtime' | 'modelOverride'; compat: UnknownRecord }> {\n const root = asRecord(config);\n const providers = asRecord(root?.providers);\n const provider = asRecord(providers?.[model.provider]);\n const providerCompat = asRecord(provider?.compat);\n const customModel = findLastExactModelDefinition(\n Array.isArray(provider?.models) ? provider.models : undefined,\n model.id,\n );\n const customModelCompat = asRecord(asRecord(customModel)?.compat);\n const runtimeCompat = asRecord(model.compat);\n const modelOverride = asRecord(asRecord(provider?.modelOverrides)?.[model.id]);\n const modelOverrideCompat = asRecord(modelOverride?.compat);\n\n return [\n ...(providerCompat ? [{ source: 'provider' as const, compat: providerCompat }] : []),\n ...(customModelCompat ? [{ source: 'model' as const, compat: customModelCompat }] : []),\n ...(runtimeCompat ? [{ source: 'runtime' as const, compat: runtimeCompat }] : []),\n ...(modelOverrideCompat ? [{ source: 'modelOverride' as const, compat: modelOverrideCompat }] : []),\n ];\n }\n\n function resolveEffectiveCompatFromConfig(model: CacheModel, config: unknown): CacheCompat {\n // Pi's effective precedence is provider → models[] → runtime model →\n // modelOverrides. The runtime layer is intentionally included between the\n // config model and modelOverride: extension providers can replace the model\n // object after lower config layers were applied, while the override remains\n // Pi's highest-precedence user layer.\n return mergeCacheCompat(...getEffectiveCompatSources(model, config).map(({ compat }) => compat));\n }\n\n function isOptionalString(value: unknown): boolean {\n return value === undefined || (typeof value === 'string' && value.length > 0);\n }\n\n function isOptionalBoolean(value: unknown): boolean {\n return value === undefined || typeof value === 'boolean';\n }\n\n function isFiniteNumber(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value);\n }\n\n function isRecordOfStrings(value: unknown): boolean {\n const record = asRecord(value);\n return !!record && Object.values(record).every((entry) => typeof entry === 'string');\n }\n\n function isThinkingLevelMap(value: unknown): boolean {\n const map = asRecord(value);\n if (!map) return false;\n return ['off', 'minimal', 'low', 'medium', 'high', 'xhigh', 'max'].every(\n (key) => map[key] === undefined || map[key] === null || typeof map[key] === 'string',\n );\n }\n\n function isValidModelCostTier(value: unknown): boolean {\n const tier = asRecord(value);\n return (\n !!tier &&\n isFiniteNumber(tier.inputTokensAbove) &&\n isFiniteNumber(tier.input) &&\n isFiniteNumber(tier.output) &&\n isFiniteNumber(tier.cacheRead) &&\n isFiniteNumber(tier.cacheWrite)\n );\n }\n\n function isValidModelCost(value: unknown, partial: boolean): boolean {\n const cost = asRecord(value);\n if (!cost) return false;\n for (const key of ['input', 'output', 'cacheRead', 'cacheWrite']) {\n if ((!partial || cost[key] !== undefined) && !isFiniteNumber(cost[key])) return false;\n }\n return cost.tiers === undefined || (Array.isArray(cost.tiers) && cost.tiers.every(isValidModelCostTier));\n }\n\n function isValidModelDefinition(value: unknown): boolean {\n const model = asRecord(value);\n if (!model || !isNonEmptyString(model.id)) return false;\n if (!isOptionalString(model.name) || !isOptionalString(model.api) || !isOptionalString(model.baseUrl)) return false;\n if (!isOptionalBoolean(model.reasoning) || !isValidCompatRecord(model.compat)) return false;\n if (model.thinkingLevelMap !== undefined && !isThinkingLevelMap(model.thinkingLevelMap)) return false;\n if (\n model.input !== undefined &&\n (!Array.isArray(model.input) || !model.input.every((entry) => entry === 'text' || entry === 'image'))\n )\n return false;\n if (model.cost !== undefined && !isValidModelCost(model.cost, false)) return false;\n if (model.contextWindow !== undefined && !isFiniteNumber(model.contextWindow)) return false;\n if (model.maxTokens !== undefined && !isFiniteNumber(model.maxTokens)) return false;\n if (model.samplingParams !== undefined && !asRecord(model.samplingParams)) return false;\n if (model.headers !== undefined && !isRecordOfStrings(model.headers)) return false;\n return true;\n }\n\n function isValidModelOverride(value: unknown): boolean {\n const override = asRecord(value);\n if (!override || !isValidCompatRecord(override.compat)) return false;\n if (!isOptionalString(override.name) || !isOptionalBoolean(override.reasoning)) return false;\n if (override.thinkingLevelMap !== undefined && !isThinkingLevelMap(override.thinkingLevelMap)) return false;\n if (\n override.input !== undefined &&\n (!Array.isArray(override.input) || !override.input.every((entry) => entry === 'text' || entry === 'image'))\n )\n return false;\n if (override.cost !== undefined && !isValidModelCost(override.cost, true)) return false;\n if (override.contextWindow !== undefined && !isFiniteNumber(override.contextWindow)) return false;\n if (override.maxTokens !== undefined && !isFiniteNumber(override.maxTokens)) return false;\n if (override.samplingParams !== undefined && !asRecord(override.samplingParams)) return false;\n if (override.headers !== undefined && !isRecordOfStrings(override.headers)) return false;\n return true;\n }\n\n function isValidOpenAICompletionsCompat(compat: UnknownRecord): boolean {\n const booleanKeys = [\n 'supportsStore',\n 'supportsDeveloperRole',\n 'supportsReasoningEffort',\n 'supportsUsageInStreaming',\n 'requiresToolResultName',\n 'requiresAssistantAfterToolResult',\n 'requiresThinkingAsText',\n 'requiresReasoningContentOnAssistantMessages',\n 'supportsOpenAIGrammarTools',\n 'supportsStrictMode',\n 'sendSessionAffinityHeaders',\n 'supportsLongCacheRetention',\n ];\n if (booleanKeys.some((key) => !isOptionalBoolean(compat[key]))) return false;\n if (\n compat.maxTokensField !== undefined &&\n compat.maxTokensField !== 'max_completion_tokens' &&\n compat.maxTokensField !== 'max_tokens'\n )\n return false;\n if (\n compat.thinkingFormat !== undefined &&\n ![\n 'openai',\n 'openrouter',\n 'together',\n 'baseten',\n 'deepseek',\n 'zai',\n 'qwen',\n 'chat-template',\n 'qwen-chat-template',\n 'string-thinking',\n 'ant-ling',\n ].includes(typeof compat.thinkingFormat === 'string' ? compat.thinkingFormat : '')\n )\n return false;\n if (compat.cacheControlFormat !== undefined && compat.cacheControlFormat !== 'anthropic') return false;\n if (compat.deferredToolsMode !== undefined && compat.deferredToolsMode !== 'kimi') return false;\n if (\n compat.sessionAffinityFormat !== undefined &&\n !['openai', 'openai-nosession', 'openrouter'].includes(\n typeof compat.sessionAffinityFormat === 'string' ? compat.sessionAffinityFormat : '',\n )\n )\n return false;\n for (const key of NESTED_COMPAT_KEYS) {\n if (compat[key] !== undefined && !asRecord(compat[key])) return false;\n }\n return true;\n }\n\n function isValidOpenAIResponsesCompat(compat: UnknownRecord): boolean {\n const booleanKeys = [\n 'supportsDeveloperRole',\n 'supportsLongCacheRetention',\n 'supportsStrictMode',\n 'supportsOpenAIGrammarTools',\n 'supportsAdditionalTools',\n 'supportsToolSearch',\n ];\n if (booleanKeys.some((key) => !isOptionalBoolean(compat[key]))) return false;\n return (\n compat.sessionAffinityFormat === undefined ||\n ['openai', 'openai-nosession', 'openrouter'].includes(\n typeof compat.sessionAffinityFormat === 'string' ? compat.sessionAffinityFormat : '',\n )\n );\n }\n\n function isValidAnthropicMessagesCompat(compat: UnknownRecord): boolean {\n return [\n 'supportsEagerToolInputStreaming',\n 'supportsLongCacheRetention',\n 'sendSessionAffinityHeaders',\n 'supportsCacheControlOnTools',\n 'supportsTemperature',\n 'forceAdaptiveThinking',\n 'allowEmptySignature',\n 'supportsStrictTools',\n 'supportsToolReferences',\n ].every((key) => isOptionalBoolean(compat[key]));\n }\n\n function isValidCompatRecord(value: unknown): boolean {\n if (value === undefined) return true;\n const compat = asRecord(value);\n return (\n !!compat &&\n !Object.prototype.hasOwnProperty.call(compat, 'supportsPromptCacheKey') &&\n (isValidOpenAICompletionsCompat(compat) ||\n isValidOpenAIResponsesCompat(compat) ||\n isValidAnthropicMessagesCompat(compat))\n );\n }\n\n function isValidModelsConfigForEffectiveCompat(value: unknown): boolean {\n const root = asRecord(value);\n const providers = asRecord(root?.providers);\n if (!root || !providers) return false;\n\n for (const providerValue of Object.values(providers)) {\n const provider = asRecord(providerValue);\n if (!provider) return false;\n if (\n !isOptionalString(provider.name) ||\n !isOptionalString(provider.baseUrl) ||\n !isOptionalString(provider.apiKey) ||\n !isOptionalString(provider.api)\n )\n return false;\n if (!isOptionalBoolean(provider.authHeader) || !isValidCompatRecord(provider.compat)) return false;\n if (provider.oauth !== undefined && provider.oauth !== 'radius') return false;\n if (provider.headers !== undefined && !isRecordOfStrings(provider.headers)) return false;\n if (\n provider.models !== undefined &&\n (!Array.isArray(provider.models) || !provider.models.every(isValidModelDefinition))\n )\n return false;\n const overrides = provider.modelOverrides === undefined ? undefined : asRecord(provider.modelOverrides);\n if (\n provider.modelOverrides !== undefined &&\n (!overrides || !Object.values(overrides).every(isValidModelOverride))\n )\n return false;\n }\n return true;\n }\n\n /** Keyed by the file text, so an unchanged models.json is not parsed again. */\n let modelsConfigCache: ModelsConfigCache | undefined;\n\n async function refreshModelsConfig(): Promise<void> {\n let text: string | undefined;\n try {\n text = await readTextIfExists(fs, MODELS_JSON_PATH, io);\n } catch {\n text = undefined;\n }\n const signature = text ?? 'missing';\n if (modelsConfigCache?.signature === signature) return;\n\n let value: unknown;\n if (text !== undefined) {\n try {\n const parsed = parseJsonc(text);\n value = isValidModelsConfigForEffectiveCompat(parsed) ? parsed : undefined;\n } catch {\n value = undefined;\n }\n }\n\n modelsConfigCache = { signature, value };\n }\n\n /** The models.json compat config as of the last refresh. */\n function effectiveCompatConfig(): unknown {\n return modelsConfigCache?.value;\n }\n\n async function readEffectiveCompatConfig(): Promise<unknown> {\n await refreshModelsConfig();\n return effectiveCompatConfig();\n }\n\n function getCompat(model: CacheModel | undefined): CacheCompat {\n if (!model) return {} as CacheCompat;\n return resolveEffectiveCompatFromConfig(model, effectiveCompatConfig());\n }\n\n function joinDisplayPath(base: string, child: string, platform: string = process.platform): string {\n const sep = platform.startsWith('win') ? '\\\\' : '/';\n return `${base.replace(/[\\\\/]+$/, '')}${sep}${child}`;\n }\n\n function getAgentDirDisplayPath(\n platform: string = process.platform,\n agentDir: string = STATE_DIR,\n homeDir: string = nodeHost.homeDirectory(),\n ): string {\n const sep = platform.startsWith('win') ? '\\\\' : '/';\n const normalizedAgentDir = agentDir.replace(/[\\\\/]+/g, sep);\n const normalizedHomeDir = homeDir.replace(/[\\\\/]+/g, sep).replace(/[\\\\/]+$/, '');\n const homePrefix = `${normalizedHomeDir}${sep}`;\n\n if (normalizedAgentDir === normalizedHomeDir || normalizedAgentDir.startsWith(homePrefix)) {\n const relative = normalizedAgentDir.slice(normalizedHomeDir.length).replace(/^[\\\\/]+/, '');\n const homeLabel = platform.startsWith('win') ? '%USERPROFILE%' : '~';\n return relative ? `${homeLabel}${sep}${relative}` : homeLabel;\n }\n\n return normalizedAgentDir;\n }\n\n function getModelsJsonDisplayPath(\n platform: string = process.platform,\n agentDir: string = STATE_DIR,\n homeDir: string = nodeHost.homeDirectory(),\n ): string {\n return joinDisplayPath(getAgentDirDisplayPath(platform, agentDir, homeDir), 'models.json', platform);\n }\n\n function parseFooterStatsMode(value: unknown): FooterStatsMode | undefined {\n if (typeof value !== 'string') return undefined;\n const normalized = value.trim().toLowerCase();\n return normalized === 'session' || normalized === 'total' || normalized === 'process' ? normalized : undefined;\n }\n\n function parsePersistedCacheOptimizerConfig(value: unknown): PersistedCacheOptimizerConfig | undefined {\n const record = asRecord(value);\n if (!record || (record.version !== 1 && record.version !== 2 && record.version !== 3)) return undefined;\n const allowedTopLevel = new Set(\n record.version === 1\n ? ['version', 'footerMode']\n : record.version === 2\n ? ['version', 'footerMode', 'promptCacheKey']\n : ['version', 'footerMode', 'promptCacheKey', 'features'],\n );\n if (Object.keys(record).some((key) => !allowedTopLevel.has(key))) return undefined;\n const footerMode = parseFooterStatsMode(record.footerMode);\n if (record.footerMode !== undefined && !footerMode) return undefined;\n if (record.version === 1) return { version: 1, ...(footerMode ? { footerMode } : {}) };\n\n const rawFeatures = record.version === 3 ? record.features : undefined;\n if (rawFeatures !== undefined && !asRecord(rawFeatures)) return undefined;\n const featuresRecord = asRecord(rawFeatures);\n const featureNames = new Set<PersistedCacheOptimizerFeature>([\n 'promptRewrite',\n 'virtualRewrite',\n 'skillCompression',\n 'openAICacheKey',\n 'toolOrder',\n ]);\n if (\n featuresRecord &&\n Object.keys(featuresRecord).some(\n (key) => !featureNames.has(key as PersistedCacheOptimizerFeature) || typeof featuresRecord[key] !== 'boolean',\n )\n )\n return undefined;\n\n const rawPromptCacheKey = record.promptCacheKey;\n if (rawPromptCacheKey !== undefined && !asRecord(rawPromptCacheKey)) return undefined;\n const promptCacheKey = asRecord(rawPromptCacheKey);\n if (promptCacheKey && Object.keys(promptCacheKey).some((key) => key !== 'omit')) return undefined;\n const omit = promptCacheKey?.omit;\n if (omit !== undefined && (!Array.isArray(omit) || omit.some((value): value is string => !isNonEmptyString(value))))\n return undefined;\n const stringOmit = omit as string[] | undefined;\n const uniqueOmit = stringOmit ? [...new Set(stringOmit.map((value) => value.trim()))].sort() : undefined;\n return {\n version: record.version === 3 ? 3 : 2,\n ...(footerMode ? { footerMode } : {}),\n ...(uniqueOmit && uniqueOmit.length > 0 ? { promptCacheKey: { omit: uniqueOmit } } : {}),\n ...(featuresRecord\n ? {\n features: Object.fromEntries(Object.entries(featuresRecord)) as Partial<\n Record<PersistedCacheOptimizerFeature, boolean>\n >,\n }\n : {}),\n } as PersistedCacheOptimizerConfigV3;\n }\n\n function normalizePersistedCacheOptimizerConfig(\n value: PersistedCacheOptimizerConfig | undefined,\n ): PersistedCacheOptimizerConfigV3 {\n if (!value) return { version: 2 };\n const features = value.version === 3 ? value.features : undefined;\n return {\n version: features ? 3 : 2,\n ...(value.footerMode ? { footerMode: value.footerMode } : {}),\n ...(value.version !== 1 && value.promptCacheKey ? { promptCacheKey: value.promptCacheKey } : {}),\n ...(features ? { features } : {}),\n };\n }\n\n async function readPersistedCacheOptimizerConfig(\n configPath: string = CONFIG_FILE_PATH,\n ): Promise<PersistedCacheOptimizerConfigV3> {\n try {\n const text = await readTextIfExists(fs, configPath, io);\n if (text === undefined) return { version: 2 };\n return normalizePersistedCacheOptimizerConfig(parsePersistedCacheOptimizerConfig(JSON.parse(text)));\n } catch (error) {\n console.warn(`${LOG_PREFIX}: failed to read optimizer config; using defaults`, error);\n return { version: 2 };\n }\n }\n\n function resolveFooterStatsMode(\n configuredMode: FooterStatsMode | undefined,\n env: MutableEnv = environment,\n ): { mode: FooterStatsMode; source: FooterStatsModeSource } {\n if (configuredMode) return { mode: configuredMode, source: 'config' };\n const envMode = parseFooterStatsMode(env[FOOTER_MODE_ENV]);\n return envMode ? { mode: envMode, source: 'env' } : { mode: 'session', source: 'default' };\n }\n\n function footerStatsMode(\n env: MutableEnv = environment,\n configuredMode: FooterStatsMode | undefined = persistedFooterStatsMode,\n ): FooterStatsMode {\n return resolveFooterStatsMode(configuredMode, env).mode;\n }\n\n /** Read once, on the first refresh, like the original read at construction. */\n let persistedConfigLoaded = false;\n let persistedFooterStatsMode: FooterStatsMode | undefined;\n\n /** Loads the persisted optimizer config once and rereads models.json; call before the synchronous readers. */\n async function refreshFileConfig(): Promise<void> {\n if (!persistedConfigLoaded) {\n persistedConfigLoaded = true;\n persistedFooterStatsMode = (await readPersistedCacheOptimizerConfig()).footerMode;\n }\n await refreshModelsConfig();\n }\n\n function isAssistantMessage(message: unknown): boolean {\n return asRecord(message)?.role === 'assistant';\n }\n\n function getAssistantRecord(message: unknown): UnknownRecord | undefined {\n const record = asRecord(message);\n return record?.role === 'assistant' ? record : undefined;\n }\n\n function getModelIdNameTokenValues(model: CacheModel | undefined): string[] {\n if (!model) return [];\n return [model.id, model.name].map(lower).filter(Boolean);\n }\n\n function getAssistantMessageModelTokenValues(message: unknown): string[] {\n const record = asRecord(message);\n if (!record) return [];\n\n return ASSISTANT_MESSAGE_MODEL_TOKEN_KEYS.map((key) => lower(record[key])).filter(Boolean);\n }\n\n function hasAnyTokenContaining(tokens: string[], needles: string[]): boolean {\n return tokens.some((token) => needles.some((needle) => token.includes(needle)));\n }\n\n function modelOrAssistantMessageHas(message: unknown, model: CacheModel | undefined, needles: string[]): boolean {\n return hasAnyTokenContaining(\n [...getModelIdNameTokenValues(model), ...getAssistantMessageModelTokenValues(message)],\n needles,\n );\n }\n\n function isDeepSeekLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['deepseek']);\n }\n\n function isDeepSeekLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['deepseek']);\n }\n\n function isOpenAICompatibleApi(api: unknown): boolean {\n const value = lower(api);\n return value === 'openai-completions' || value === 'openai-responses';\n }\n\n function isOpenAICompatibleProxyApi(api: unknown): boolean {\n return lower(api) === 'openai-completions';\n }\n\n function isPiBuiltInLlamaCppModel(model: CacheModel | undefined): boolean {\n if (lower(model?.provider) !== 'llama.cpp' || !isOpenAICompatibleProxyApi(model?.api)) return false;\n\n // Pi's built-in llama.cpp provider supplies this exact explicit compat\n // fingerprint. Provider ids are extension-overridable and models.json can add\n // cache/routing overrides, so provider id alone must never imply exemption.\n // supportsUsageInStreaming is deliberately not part of the fingerprint: Pi\n // 0.82.x sets it false and Pi 0.83+ sets it true after fixing streamed usage,\n // and it carries no routing or cache configuration.\n const compat = getCompat(model);\n return (\n compat.supportsStore === false &&\n compat.supportsDeveloperRole === false &&\n compat.supportsReasoningEffort === false &&\n compat.supportsStrictMode === false &&\n compat.maxTokensField === 'max_tokens' &&\n compat.sendSessionAffinityHeaders === undefined &&\n compat.sessionAffinityFormat === undefined &&\n compat.supportsLongCacheRetention === undefined\n );\n }\n\n function hasAnthropicCacheTtlOrderError(message: unknown): boolean {\n const record = getAssistantRecord(message);\n if (record?.stopReason !== 'error' || typeof record.errorMessage !== 'string') return false;\n\n const error = lower(record.errorMessage);\n return (\n error.includes('cache_control') &&\n error.includes(\"ttl='1h'\") &&\n error.includes(\"ttl='5m'\") &&\n error.includes('must not come after')\n );\n }\n\n function isOpenAIFamilyToken(token: string): boolean {\n return token.includes('gpt-') || token.includes('chatgpt') || OPENAI_REASONING_MODEL_PATTERN.test(token);\n }\n\n function isOpenAIFamilyModel(model: CacheModel | undefined): boolean {\n return getModelIdNameTokenValues(model).some(isOpenAIFamilyToken);\n }\n\n function isOpenAIFamilyAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return [...getModelIdNameTokenValues(model), ...getAssistantMessageModelTokenValues(message)].some(\n isOpenAIFamilyToken,\n );\n }\n\n function isClaudeLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['anthropic', 'claude']);\n }\n\n function isClaudeLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['anthropic', 'claude']);\n }\n\n function isGeminiLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['gemini', 'vertex']);\n }\n\n function isGeminiLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['gemini', 'vertex']);\n }\n\n const ADAPTIVE_OPUS_PATTERN =\n /(^|[/\\s:_-])(opus-4[.-][6-9]|opus-4-[1-9][0-9]|opus-([5-9]|[1-9][0-9]))($|[-_.:/\\s[])/i;\n\n const ADAPTIVE_SONNET_PATTERN =\n /(^|[/\\s:_-])(sonnet-4[.-][6-9]|sonnet-4-[1-9][0-9]|sonnet-([5-9]|[1-9][0-9]))($|[-_.:/\\s[])/i;\n\n const ADAPTIVE_FABLE_PATTERN = /(^|[/\\s:_-])fable-([5-9]|[1-9][0-9])($|[-_.:/\\s[])/i;\n\n function isAdaptiveGenerationModel(model: CacheModel | undefined): boolean {\n if (!model) return false;\n const tokens = getModelIdNameTokenValues(model);\n return tokens.some(\n (t) => ADAPTIVE_OPUS_PATTERN.test(t) || ADAPTIVE_SONNET_PATTERN.test(t) || ADAPTIVE_FABLE_PATTERN.test(t),\n );\n }\n\n function isKimiCodingAdaptiveModel(model: CacheModel | undefined): boolean {\n if (!model) return false;\n const provider = lower(model.provider);\n const baseUrl = lower(model.baseUrl);\n const isKimiCodingChannel = provider.includes('kimi-coding') || baseUrl.includes('api.kimi.com/coding');\n if (!isKimiCodingChannel) return false;\n\n const tokens = getModelIdNameTokenValues(model);\n return tokens.some(\n (token) =>\n token === 'k3' ||\n token.includes('kimi-k3') ||\n token.includes('kimi k3') ||\n token.includes('kimi-for-coding') ||\n token.includes('kimi for coding'),\n );\n }\n\n function isKimiCodingEmptySignatureModel(model: CacheModel | undefined): boolean {\n if (!isKimiCodingAdaptiveModel(model)) return false;\n return getModelIdNameTokenValues(model).some(\n (token) =>\n token === 'k3' ||\n token === 'kimi-k3' ||\n token.startsWith('kimi-k3-') ||\n token === 'kimi k3' ||\n token === 'kimi-for-coding' ||\n token === 'kimi for coding',\n );\n }\n\n function isAdaptiveThinkingCompatApplicable(model: CacheModel): boolean {\n // A routed registry miss may preserve the upstream API/model identity while\n // lacking a verified endpoint. Do not diagnose or suggest compat fixes for\n // that incomplete transport metadata; ordinary direct Anthropic models still\n // use their normal native adaptive-thinking check.\n if (isRoutedFallbackModel(model) && !isNonEmptyString(model.baseUrl)) {\n return false;\n }\n\n return (\n lower(model.api) === 'anthropic-messages' &&\n (isAdaptiveGenerationModel(model) || isKimiCodingAdaptiveModel(model))\n );\n }\n\n function describeMissingAdaptiveThinkingCompat(model: CacheModel): string[] {\n const compat = getCompat(model);\n const missing: string[] = [];\n if (compat.forceAdaptiveThinking !== true) {\n missing.push('forceAdaptiveThinking');\n }\n if (isKimiCodingEmptySignatureModel(model) && compat.allowEmptySignature !== true) {\n missing.push('allowEmptySignature');\n }\n return missing;\n }\n\n function buildAdaptiveThinkingCompatSuggestion(missing: string[]): Record<string, unknown> {\n const suggestion: Record<string, unknown> = {};\n if (missing.includes('forceAdaptiveThinking')) {\n suggestion.forceAdaptiveThinking = true;\n }\n if (missing.includes('allowEmptySignature')) {\n suggestion.allowEmptySignature = true;\n }\n return suggestion;\n }\n\n function appendAdaptiveThinkingCompatAdviceLines(\n lines: string[],\n missing: string[],\n placement: CompatAdvicePlacement = {},\n ): void {\n const suggestion = buildAdaptiveThinkingCompatSuggestion(missing);\n if (Object.keys(suggestion).length > 0) {\n lines.push('Suggested fix:');\n lines.push(JSON.stringify(suggestion, null, 2));\n }\n lines.push('- forceAdaptiveThinking: true tells Pi to use adaptive thinking format');\n lines.push(\" (thinking: {type: 'adaptive'}) instead of legacy budget tokens format.\");\n lines.push(' Without this flag, Pi sends legacy thinking which adaptive-only upstreams reject.');\n if (missing.includes('allowEmptySignature')) {\n lines.push(\n '- allowEmptySignature: true preserves Kimi Coding K3 thinking blocks whose replay signature is empty.',\n );\n }\n appendCredentialSafeProviderGuidance(lines, placement, suggestion);\n }\n\n function buildAdaptiveThinkingCompatWarningText(key: string, missing: string[]): string {\n const slashIdx = key.indexOf('/');\n const providerLabel = slashIdx > 0 ? key.slice(0, slashIdx) : key;\n const modelId = slashIdx > 0 ? key.slice(slashIdx + 1) : undefined;\n const modelsJsonPath = getModelsJsonDisplayPath();\n const lines: string[] = [\n `💡 pi-cache-optimizer: ${key} is an adaptive-generation model but merged compat lacks ${missing.join(' and ')}.`,\n `Without the required compat, Pi may send legacy thinking or replay thinking blocks incorrectly.`,\n `Edit ${modelsJsonPath} -> providers[\"${providerLabel}\"] -> compat (at the same level as baseUrl/api/apiKey/models).`,\n '',\n ];\n appendAdaptiveThinkingCompatAdviceLines(lines, missing, { providerLabel, modelId });\n return lines.join('\\n');\n }\n\n function isKimiLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['kimi']);\n }\n\n function isKimiLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['kimi']);\n }\n\n function isQwenLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['qwen']);\n }\n\n function isQwenLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['qwen']);\n }\n\n function isGLMLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['glm']);\n }\n\n function isGLMLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['glm']);\n }\n\n function isMiniMaxLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['minimax']);\n }\n\n function isMiniMaxLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['minimax']);\n }\n\n function isMimoLikeModel(model: CacheModel | undefined): boolean {\n const tokens = getModelIdNameTokenValues(model);\n return hasAnyTokenContaining(tokens, ['xiaomimimo']) || tokens.some((t) => MIMO_MODEL_PATTERN.test(t));\n }\n\n function isMimoLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n const allTokens = [...getModelIdNameTokenValues(model), ...getAssistantMessageModelTokenValues(message)];\n return hasAnyTokenContaining(allTokens, ['xiaomimimo']) || allTokens.some((t) => MIMO_MODEL_PATTERN.test(t));\n }\n\n function isHunyuanLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['hunyuan']);\n }\n\n function isHunyuanLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['hunyuan']);\n }\n\n function isMistralLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['mistral', 'mixtral', 'codestral']);\n }\n\n function isMistralLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['mistral', 'mixtral', 'codestral']);\n }\n\n function isGrokLikeModel(model: CacheModel | undefined): boolean {\n const tokens = getModelIdNameTokenValues(model);\n return hasAnyTokenContaining(tokens, ['grok']) || tokens.some((t) => XAI_MODEL_PATTERN.test(t));\n }\n\n function isGrokLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n const allTokens = [...getModelIdNameTokenValues(model), ...getAssistantMessageModelTokenValues(message)];\n return hasAnyTokenContaining(allTokens, ['grok']) || allTokens.some((t) => XAI_MODEL_PATTERN.test(t));\n }\n\n function isLlamaLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['llama']);\n }\n\n function isLlamaLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['llama']);\n }\n\n function isNemotronLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['nemotron']);\n }\n\n function isNemotronLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['nemotron']);\n }\n\n function isCohereLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['cohere', 'command-r']);\n }\n\n function isCohereLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['cohere', 'command-r']);\n }\n\n const YI_MODEL_PATTERN = /(^|[/\\s:_-])yi($|[-_.:/\\s])/;\n\n function isYiLikeModel(model: CacheModel | undefined): boolean {\n const tokens = getModelIdNameTokenValues(model);\n return hasAnyTokenContaining(tokens, ['yi-', '01-ai', 'zero-one']) || tokens.some((t) => YI_MODEL_PATTERN.test(t));\n }\n\n function isYiLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n const allTokens = [...getModelIdNameTokenValues(model), ...getAssistantMessageModelTokenValues(message)];\n return (\n hasAnyTokenContaining(allTokens, ['yi-', '01-ai', 'zero-one']) || allTokens.some((t) => YI_MODEL_PATTERN.test(t))\n );\n }\n\n const DOUBAO_SEED_PATTERN = /(^|[/\\s:_-])seed($|[-_.:/\\s])/i;\n\n function isDoubaoLikeModel(model: CacheModel | undefined): boolean {\n const tokens = getModelIdNameTokenValues(model);\n return (\n hasAnyTokenContaining(tokens, ['doubao', '豆包', 'volcengine', 'bytedance', 'byte-dance']) ||\n tokens.some((t) => DOUBAO_SEED_PATTERN.test(t))\n );\n }\n\n function isDoubaoLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n const allTokens = [...getModelIdNameTokenValues(model), ...getAssistantMessageModelTokenValues(message)];\n return (\n hasAnyTokenContaining(allTokens, ['doubao', '豆包', 'volcengine', 'bytedance', 'byte-dance']) ||\n allTokens.some((t) => DOUBAO_SEED_PATTERN.test(t))\n );\n }\n\n function isErnieLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), [\n 'ernie',\n 'wenxin',\n '文心',\n 'yiyan',\n '一言',\n 'baidu',\n ]);\n }\n\n function isErnieLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['ernie', 'wenxin', '文心', 'yiyan', '一言', 'baidu']);\n }\n\n function isBaichuanLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['baichuan', '百川']);\n }\n\n function isBaichuanLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['baichuan', '百川']);\n }\n\n function isStepFunLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['stepfun', 'step-']);\n }\n\n function isStepFunLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['stepfun', 'step-']);\n }\n\n function isSparkLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['spark', 'xinghuo', '星火', 'iflytek', '讯飞']);\n }\n\n function isSparkLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['spark', 'xinghuo', '星火', 'iflytek', '讯飞']);\n }\n\n function isInternLMLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['internlm', 'intern-lm', '书生']);\n }\n\n function isInternLMLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['internlm', 'intern-lm', '书生']);\n }\n\n function isGemmaLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['gemma']);\n }\n\n function isGemmaLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['gemma']);\n }\n\n const PHI_MODEL_PATTERN = /(^|[/\\s:_-])phi($|[-_.:/\\s])/i;\n\n function isPhiLikeModel(model: CacheModel | undefined): boolean {\n const tokens = getModelIdNameTokenValues(model);\n return hasAnyTokenContaining(tokens, ['phi-']) || tokens.some((t) => PHI_MODEL_PATTERN.test(t));\n }\n\n function isPhiLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n const allTokens = [...getModelIdNameTokenValues(model), ...getAssistantMessageModelTokenValues(message)];\n return hasAnyTokenContaining(allTokens, ['phi-']) || allTokens.some((t) => PHI_MODEL_PATTERN.test(t));\n }\n\n function isJambaLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['jamba', 'ai21']);\n }\n\n function isJambaLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['jamba', 'ai21']);\n }\n\n function isSolarLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['solar', 'upstage']);\n }\n\n function isSolarLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['solar', 'upstage']);\n }\n\n function isPerplexityLikeModel(model: CacheModel | undefined): boolean {\n const tokens = getModelIdNameTokenValues(model);\n return hasAnyTokenContaining(tokens, ['sonar', 'perplexity']) || tokens.some((t) => PPLX_MODEL_PATTERN.test(t));\n }\n\n function isPerplexityLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n const allTokens = [...getModelIdNameTokenValues(model), ...getAssistantMessageModelTokenValues(message)];\n return (\n hasAnyTokenContaining(allTokens, ['sonar', 'perplexity']) || allTokens.some((t) => PPLX_MODEL_PATTERN.test(t))\n );\n }\n\n function isNovaLikeModel(model: CacheModel | undefined): boolean {\n const tokens = getModelIdNameTokenValues(model);\n return hasAnyTokenContaining(tokens, ['amazon-nova']) || tokens.some((t) => NOVA_MODEL_PATTERN.test(t));\n }\n\n function isNovaLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n const allTokens = [...getModelIdNameTokenValues(model), ...getAssistantMessageModelTokenValues(message)];\n return hasAnyTokenContaining(allTokens, ['amazon-nova']) || allTokens.some((t) => NOVA_MODEL_PATTERN.test(t));\n }\n\n function isRekaLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['reka']);\n }\n\n function isRekaLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['reka']);\n }\n\n function isFalconLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['falcon', 'tiiuae']);\n }\n\n function isFalconLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['falcon', 'tiiuae']);\n }\n\n function isDbrxLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['dbrx', 'databricks']);\n }\n\n function isDbrxLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['dbrx', 'databricks']);\n }\n\n function isMptLikeModel(model: CacheModel | undefined): boolean {\n const tokens = getModelIdNameTokenValues(model);\n return hasAnyTokenContaining(tokens, ['mosaicml', 'mpt-']) || tokens.some((t) => MPT_MODEL_PATTERN.test(t));\n }\n\n function isMptLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n const allTokens = [...getModelIdNameTokenValues(model), ...getAssistantMessageModelTokenValues(message)];\n return hasAnyTokenContaining(allTokens, ['mosaicml', 'mpt-']) || allTokens.some((t) => MPT_MODEL_PATTERN.test(t));\n }\n\n function isStableLMLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['stablelm', 'stable-lm', 'stability-ai']);\n }\n\n function isStableLMLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['stablelm', 'stable-lm', 'stability-ai']);\n }\n\n function isAquilaLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['aquila', 'baai']);\n }\n\n function isAquilaLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['aquila', 'baai']);\n }\n\n function isExaoneLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['exaone']);\n }\n\n function isExaoneLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['exaone']);\n }\n\n function isHyperCLOVALikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['hyperclova', 'clova-x']);\n }\n\n function isHyperCLOVALikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['hyperclova', 'clova-x']);\n }\n\n function isLuminousLikeModel(model: CacheModel | undefined): boolean {\n const tokens = getModelIdNameTokenValues(model);\n return (\n hasAnyTokenContaining(tokens, ['luminous', 'aleph-alpha']) || tokens.some((t) => ALEPH_MODEL_PATTERN.test(t))\n );\n }\n\n function isLuminousLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n const allTokens = [...getModelIdNameTokenValues(model), ...getAssistantMessageModelTokenValues(message)];\n return (\n hasAnyTokenContaining(allTokens, ['luminous', 'aleph-alpha']) ||\n allTokens.some((t) => ALEPH_MODEL_PATTERN.test(t))\n );\n }\n\n function isHermesLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['nous', 'hermes', 'openhermes']);\n }\n\n function isHermesLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['nous', 'hermes', 'openhermes']);\n }\n\n function isGraniteLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['granite', 'ibm-granite']);\n }\n\n function isGraniteLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['granite', 'ibm-granite']);\n }\n\n function isArcticLikeModel(model: CacheModel | undefined): boolean {\n const tokens = getModelIdNameTokenValues(model);\n return hasAnyTokenContaining(tokens, ['snowflake-arctic']) || tokens.some((t) => ARCTIC_MODEL_PATTERN.test(t));\n }\n\n function isArcticLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n const allTokens = [...getModelIdNameTokenValues(model), ...getAssistantMessageModelTokenValues(message)];\n return (\n hasAnyTokenContaining(allTokens, ['snowflake-arctic']) || allTokens.some((t) => ARCTIC_MODEL_PATTERN.test(t))\n );\n }\n\n function isPanguLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['pangu', 'pan-gu', '盘古', 'huawei-pangu']);\n }\n\n function isPanguLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['pangu', 'pan-gu', '盘古', 'huawei-pangu']);\n }\n\n function isSenseNovaLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['sensenova', 'sense-nova', 'sensechat', '商汤']);\n }\n\n function isSenseNovaLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['sensenova', 'sense-nova', 'sensechat', '商汤']);\n }\n\n function isZhinaoLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['360gpt', '360-gpt', 'zhinao', '智脑']);\n }\n\n function isZhinaoLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['360gpt', '360-gpt', 'zhinao', '智脑']);\n }\n\n function isMiniCPMLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['minicpm', 'mini-cpm', 'openbmb']);\n }\n\n function isMiniCPMLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['minicpm', 'mini-cpm', 'openbmb']);\n }\n\n function isXVerseLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['xverse']);\n }\n\n function isXVerseLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['xverse']);\n }\n\n function isOrionLikeModel(model: CacheModel | undefined): boolean {\n const tokens = getModelIdNameTokenValues(model);\n return (\n hasAnyTokenContaining(tokens, ['orionstar', 'orion-star']) || tokens.some((t) => ORION_MODEL_PATTERN.test(t))\n );\n }\n\n function isOrionLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n const allTokens = [...getModelIdNameTokenValues(model), ...getAssistantMessageModelTokenValues(message)];\n return (\n hasAnyTokenContaining(allTokens, ['orionstar', 'orion-star']) ||\n allTokens.some((t) => ORION_MODEL_PATTERN.test(t))\n );\n }\n\n function isOpenChatLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['openchat']);\n }\n\n function isOpenChatLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['openchat']);\n }\n\n function isVicunaLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['vicuna']);\n }\n\n function isVicunaLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['vicuna']);\n }\n\n function isWizardLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), [\n 'wizardlm',\n 'wizard-lm',\n 'wizardcoder',\n 'wizard-coder',\n ]);\n }\n\n function isWizardLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['wizardlm', 'wizard-lm', 'wizardcoder', 'wizard-coder']);\n }\n\n function isZephyrLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['zephyr']);\n }\n\n function isZephyrLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['zephyr']);\n }\n\n function isDolphinLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['dolphin']);\n }\n\n function isDolphinLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['dolphin']);\n }\n\n function isOpenOrcaLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['openorca', 'open-orca']);\n }\n\n function isOpenOrcaLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['openorca', 'open-orca']);\n }\n\n function isStarlingLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['starling']);\n }\n\n function isStarlingLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['starling']);\n }\n\n function isBloomLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['bloom', 'bigscience']);\n }\n\n function isBloomLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['bloom', 'bigscience']);\n }\n\n function isRwkvLikeModel(model: CacheModel | undefined): boolean {\n return hasAnyTokenContaining(getModelIdNameTokenValues(model), ['rwkv']);\n }\n\n function isRwkvLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n return modelOrAssistantMessageHas(message, model, ['rwkv']);\n }\n\n function isAyaLikeModel(model: CacheModel | undefined): boolean {\n const tokens = getModelIdNameTokenValues(model);\n return hasAnyTokenContaining(tokens, ['aya-expanse']) || tokens.some((t) => AYA_MODEL_PATTERN.test(t));\n }\n\n function isAyaLikeAssistantMessage(message: unknown, model: CacheModel | undefined): boolean {\n const allTokens = [...getModelIdNameTokenValues(model), ...getAssistantMessageModelTokenValues(message)];\n return hasAnyTokenContaining(allTokens, ['aya-expanse']) || allTokens.some((t) => AYA_MODEL_PATTERN.test(t));\n }\n\n function modelKey(model: ModelIdentity): string {\n return `${model.provider}/${model.id}`;\n }\n\n function modelFromAssistantMessage(message: unknown, fallback: CacheModel | undefined): CacheModel | undefined {\n const record = getAssistantRecord(message);\n if (!record) return fallback;\n\n const id = firstNonEmptyString(record.responseModel, record.model, fallback?.id);\n const provider = firstNonEmptyString(record.provider, fallback?.provider);\n const api = firstNonEmptyString(record.api, fallback?.api) ?? '';\n if (!id || !provider) return fallback;\n\n const fallbackName = isNonEmptyString(fallback?.name) ? fallback.name : undefined;\n const preservesFallbackIdentity =\n !isVirtualRoutingModel(fallback) &&\n provider === fallback?.provider &&\n id === fallback?.id &&\n fallbackName !== undefined;\n\n return {\n ...fallback,\n id,\n // Direct providers such as kimi-coding may echo only a short model id\n // (`k3`) while the active model name (`Kimi K3`) carries the adapter token.\n // Preserve that display name only when response and fallback identities are\n // exactly the same; routed/different identities keep message-local naming.\n name: preservesFallbackIdentity ? fallbackName : id,\n provider,\n api,\n baseUrl: fallback?.baseUrl ?? '',\n } as CacheModel;\n }\n\n /** Physical catalog identity for native virtual dispatch, including registry misses. */\n function resolvePhysicalModel(dispatch: CacheModel, registered: CacheModel | undefined): CacheModel {\n const model =\n registered && registered.api !== PI_VIRTUAL_MODEL_API\n ? registered\n : {\n provider: dispatch.provider,\n id: dispatch.id,\n name: dispatch.name,\n api: dispatch.api === PI_VIRTUAL_MODEL_API ? '' : dispatch.api,\n baseUrl: '',\n [ROUTED_FALLBACK_MODEL_SYMBOL]: true,\n };\n const providers = asRecord(asRecord(effectiveCompatConfig())?.providers);\n const provider = asRecord(providers?.[model.provider]);\n const customModel = findLastExactModelDefinition(\n Array.isArray(provider?.models) ? provider.models : undefined,\n model.id,\n );\n const configuredApi = customModel?.api ?? provider?.api;\n const configuredBaseUrl = customModel?.baseUrl ?? provider?.baseUrl;\n const api = isNonEmptyString(model.api) ? model.api : isNonEmptyString(configuredApi) ? configuredApi : model.api;\n const baseUrl = isNonEmptyString(model.baseUrl)\n ? model.baseUrl\n : isNonEmptyString(configuredBaseUrl)\n ? configuredBaseUrl\n : model.baseUrl;\n return api === model.api && baseUrl === model.baseUrl ? model : { ...model, api, baseUrl };\n }\n\n function consolidateDirectProviderStatsModel(\n statsModel: CacheModel | undefined,\n ctxModel: CacheModel | undefined,\n ): CacheModel | undefined {\n if (!statsModel || !ctxModel) return statsModel;\n // Virtual routing providers keep message-local stats identity.\n if (isVirtualRoutingModel(ctxModel)) return statsModel;\n // Only consolidate within the same provider.\n if (statsModel.provider !== ctxModel.provider) return statsModel;\n // Only consolidate when both resolve to the same cache adapter object, so\n // genuinely different models sharing a provider (or sharing the same adapter\n // family id, e.g. GPT and GLM both report family id \"openai\") are never\n // merged. `selectAdapterForModel` returns the precise adapter object, so\n // object identity is the correct criterion.\n const statsAdapter = selectAdapterForModel(statsModel);\n const ctxAdapter = selectAdapterForModel(ctxModel);\n if (!statsAdapter || !ctxAdapter || statsAdapter !== ctxAdapter) return statsModel;\n // No drift , nothing to consolidate.\n if (statsModel.id === ctxModel.id) return statsModel;\n // Consolidate: pin stats to the active-model identity the footer reads.\n return {\n ...statsModel,\n id: ctxModel.id,\n name: ctxModel.name || ctxModel.id,\n };\n }\n\n function usageRecordFromAssistant(message: unknown): UnknownRecord | undefined {\n return asRecord(getAssistantRecord(message)?.usage);\n }\n\n function getNestedRecord(record: UnknownRecord | undefined, key: string): UnknownRecord | undefined {\n return asRecord(record?.[key]);\n }\n\n function getFirstNonNegativeNumber(...values: unknown[]): number | undefined {\n for (const value of values) {\n const number = getNumber(value);\n if (number !== undefined && number >= 0) return number;\n }\n return undefined;\n }\n\n function readCachedTokensFromDetails(details: UnknownRecord | undefined): number | undefined {\n return getFirstNonNegativeNumber(details?.cached_tokens, details?.cachedTokens);\n }\n\n function readCacheWriteFromDetails(details: UnknownRecord | undefined): number | undefined {\n return getFirstNonNegativeNumber(details?.cache_write_tokens, details?.cacheWriteTokens);\n }\n\n function getPiNormalizedUsage(message: unknown, allowInputOnly = false): UsageSnapshot | undefined {\n const usage = usageRecordFromAssistant(message);\n if (!usage) return undefined;\n\n const input = getNonNegativeNumber(usage, 'input');\n const cacheRead = getNonNegativeNumber(usage, 'cacheRead');\n const cacheWrite = getNonNegativeNumber(usage, 'cacheWrite');\n const hasCacheSignal = cacheRead !== undefined || cacheWrite !== undefined;\n\n if (!hasCacheSignal && (input === undefined || !allowInputOnly)) return undefined;\n\n // Under healthy Pi normalization input is the uncached portion, so\n // totalInput = input + cacheRead + cacheWrite gives the full prompt token count.\n // Guard against degenerate reads where a broken proxy omits prompt_tokens and\n // Pi's input falls to zero: totalInput must never be less than cacheRead + cacheWrite.\n const computed = (input ?? 0) + (cacheRead ?? 0) + (cacheWrite ?? 0);\n const floor = (cacheRead ?? 0) + (cacheWrite ?? 0);\n return {\n cacheRead: cacheRead ?? 0,\n cacheWrite: cacheWrite ?? 0,\n totalInput: computed >= floor ? computed : floor,\n };\n }\n\n function getDeepSeekRawUsage(message: unknown): UsageSnapshot | undefined {\n const usage = usageRecordFromAssistant(message);\n if (!usage) return undefined;\n\n const cacheRead = getFirstNonNegativeNumber(usage.prompt_cache_hit_tokens);\n if (cacheRead === undefined) return undefined;\n\n const cacheMiss = getFirstNonNegativeNumber(usage.prompt_cache_miss_tokens);\n const promptTokens = getFirstNonNegativeNumber(usage.prompt_tokens);\n // DeepSeek guarantees prompt_tokens = prompt_cache_hit_tokens + prompt_cache_miss_tokens.\n const totalInput = promptTokens ?? cacheRead + (cacheMiss ?? 0);\n\n return { cacheRead, cacheWrite: 0, totalInput };\n }\n\n function getOpenAIRawUsage(message: unknown): UsageSnapshot | undefined {\n const usage = usageRecordFromAssistant(message);\n if (!usage) return undefined;\n\n const promptDetails =\n getNestedRecord(usage, 'prompt_tokens_details') ?? getNestedRecord(usage, 'promptTokensDetails');\n const inputDetails = getNestedRecord(usage, 'input_tokens_details') ?? getNestedRecord(usage, 'inputTokensDetails');\n const cacheRead = readCachedTokensFromDetails(promptDetails) ?? readCachedTokensFromDetails(inputDetails);\n if (cacheRead === undefined) return undefined;\n\n const cacheWrite = readCacheWriteFromDetails(promptDetails) ?? readCacheWriteFromDetails(inputDetails) ?? 0;\n const totalInput =\n getFirstNonNegativeNumber(usage.prompt_tokens, usage.promptTokens, usage.input_tokens, usage.inputTokens) ??\n cacheRead + cacheWrite;\n\n return { cacheRead, cacheWrite, totalInput };\n }\n\n function getAnthropicRawUsage(message: unknown): UsageSnapshot | undefined {\n const usage = usageRecordFromAssistant(message);\n if (!usage) return undefined;\n\n const cacheRead = getFirstNonNegativeNumber(usage.cache_read_input_tokens, usage.cacheReadInputTokens);\n const cacheWrite = getFirstNonNegativeNumber(usage.cache_creation_input_tokens, usage.cacheCreationInputTokens);\n if (cacheRead === undefined && cacheWrite === undefined) return undefined;\n\n // Anthropic input_tokens = tokens after the last cache breakpoint (neither read nor written).\n const input = getFirstNonNegativeNumber(usage.input_tokens, usage.inputTokens) ?? 0;\n return {\n cacheRead: cacheRead ?? 0,\n cacheWrite: cacheWrite ?? 0,\n totalInput: input + (cacheRead ?? 0) + (cacheWrite ?? 0),\n };\n }\n\n function getGeminiRawUsage(message: unknown): UsageSnapshot | undefined {\n const record = getAssistantRecord(message);\n if (!record) return undefined;\n\n const usage = asRecord(record.usage);\n const metadata =\n getNestedRecord(record, 'usageMetadata') ??\n getNestedRecord(record, 'usage_metadata') ??\n getNestedRecord(usage, 'usageMetadata') ??\n getNestedRecord(usage, 'usage_metadata') ??\n usage;\n if (!metadata) return undefined;\n\n const cacheRead = getFirstNonNegativeNumber(metadata.cachedContentTokenCount, metadata.cached_content_token_count);\n if (cacheRead === undefined) return undefined;\n\n const totalInput =\n getFirstNonNegativeNumber(\n metadata.promptTokenCount,\n metadata.prompt_token_count,\n metadata.inputTokenCount,\n metadata.input_token_count,\n usage?.input_tokens,\n usage?.inputTokens,\n usage?.prompt_tokens,\n usage?.promptTokens,\n ) ?? cacheRead;\n\n return { cacheRead, cacheWrite: 0, totalInput };\n }\n\n function normalizeWithFallback(\n message: unknown,\n rawNormalizer: (message: unknown) => UsageSnapshot | undefined,\n options: { allowInputOnlyPiUsage?: boolean } = {},\n ): UsageSnapshot | undefined {\n return getPiNormalizedUsage(message, options.allowInputOnlyPiUsage) ?? rawNormalizer(message);\n }\n\n function isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n }\n\n function isOfficialOpenAIBaseUrl(model: CacheModel): boolean {\n const value = lower(model.baseUrl).trim();\n if (!value) {\n return lower(model.provider) === 'openai';\n }\n\n try {\n return new URL(value).hostname === 'api.openai.com';\n } catch {\n return value === 'api.openai.com' || value.startsWith('api.openai.com/');\n }\n }\n\n function isKnownThirdPartyOpenAIEndpoint(model: CacheModel): boolean {\n return isNonEmptyString(model.baseUrl) && !isOfficialOpenAIBaseUrl(model);\n }\n\n function describeMissingOpenAICompatibleProxyCompat(model: CacheModel): string[] {\n const compat = getCompat(model);\n const missing: string[] = [];\n\n if (!isOpenAICompatibleProxyApi(model.api)) return missing;\n if (!isKnownThirdPartyOpenAIEndpoint(model)) return missing;\n if (isPiBuiltInLlamaCppModel(model)) return missing;\n\n if (compat.sendSessionAffinityHeaders === undefined) {\n missing.push('sendSessionAffinityHeaders');\n }\n\n // Explicit `sendSessionAffinityHeaders: false` is a valid safe opt-out for\n // proxies/CDNs/WAFs that block Pi's custom affinity headers with HTTP 403.\n // Treat only a missing/undefined value as missing compat; do not mark an\n // intentional false override as ⚠️ compat or let /cache-optimizer fix turn it\n // back to true.\n //\n // NOTE: supportsLongCacheRetention is intentionally NOT checked here.\n // Per spec, it is optional/risky advisory text only and must NOT trigger\n // the ⚠️ compat marker. The before_provider_request hook proactively\n // strips prompt_cache_retention for models without explicit opt-in,\n // so 400 errors are prevented regardless of this compat flag.\n // Doctor/compat may mention it as optional guidance separately.\n\n return missing;\n }\n\n function buildSafeOpenAIProxyCompatSuggestion(missing: string[]): Record<string, boolean> {\n const suggestion: Record<string, boolean> = {};\n if (missing.includes('sendSessionAffinityHeaders')) {\n suggestion.sendSessionAffinityHeaders = true;\n }\n // supportsLongCacheRetention is NOT suggested here , per spec it is\n // optional/risky and must not appear in the copyable safe snippet.\n // The proactive stripping in before_provider_request handles 400 prevention.\n return suggestion;\n }\n\n function getPromptCacheRetentionUnsupportedHint(): string {\n return 'If this channel returns `400 Unsupported parameter: prompt_cache_retention`, remove/avoid `supportsLongCacheRetention`; this extension does not write that field directly, but Pi may send it when long retention is requested and compat says the proxy supports it.';\n }\n\n function hasPromptCacheRetentionUnsupportedText(value: unknown): boolean {\n const normalized = lower(value);\n if (!normalized.includes('prompt_cache_retention')) return false;\n\n return [\n 'unsupported parameter',\n 'unsupported_parameter',\n 'unknown parameter',\n 'not supported',\n 'unsupported field',\n 'extra inputs',\n 'not permitted',\n 'unrecognized',\n ].some((needle) => normalized.includes(needle));\n }\n\n function hasPromptCacheRetentionUnsupportedErrorMessage(message: unknown): boolean {\n const record = getAssistantRecord(message);\n return record?.stopReason === 'error' && hasPromptCacheRetentionUnsupportedText(record.errorMessage);\n }\n\n function hasPromptCacheKeyUnsupportedText(value: unknown): boolean {\n const normalized = lower(value)\n .replace(/[\"'`]/g, '')\n .replace(/[\\s_-]+/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n const key = String.raw`(?:prompt ?cache ?key|promptcachekey)`;\n const field = String.raw`(?:parameter|field|input|argument)`;\n const unsupported = String.raw`(?:unsupported|unknown|unrecognized|unexpected|not supported|not allowed|not permitted|must be omitted|should be omitted)`;\n if (!new RegExp(key).test(normalized)) return false;\n\n // Keep this deliberately grammar-bound. A rejected value or a conditional\n // restriction (for example, \"not allowed when temperature is set\") is not\n // proof that the endpoint lacks support for the field itself.\n const terminal = String.raw`(?=$|[}\\]>,.;])`;\n return (\n new RegExp(\n String.raw`(?:unsupported|unknown|unrecognized|unexpected)\\s+${field}\\s*[:=]?\\s*${key}${terminal}`,\n ).test(normalized) ||\n new RegExp(\n String.raw`(?:extra\\s+inputs?|${field}\\s+not\\s+(?:allowed|permitted|supported))\\s*[:=]\\s*${key}${terminal}`,\n ).test(normalized) ||\n new RegExp(String.raw`${key}(?:\\s+${field})?\\s*[:=]?\\s*(?:is\\s+)?${unsupported}${terminal}`).test(normalized)\n );\n }\n\n function hasPromptCacheKeyUnsupportedErrorMessage(message: unknown): boolean {\n const record = getAssistantRecord(message);\n return (\n record?.stopReason === 'error' &&\n getOptionalAssistantHttpStatus(record) === 400 &&\n hasPromptCacheKeyUnsupportedText(record.errorMessage)\n );\n }\n\n function isPromptCacheKeyUnsupportedApplicable(model: CacheModel): boolean {\n return isOpenAICompatibleApi(model.api);\n }\n\n function hasReasoningProtocolRejectionText(value: unknown): boolean {\n const normalized = lower(value).replace(/\\s+/g, ' ').trim();\n if (!normalized) return false;\n\n // Match only a rejection that is attached to the `thinking` parameter. Do\n // not merely look for both parameter names: `reasoning_effort is not\n // supported; use thinking` is the opposite direction and must not activate\n // this fallback.\n const thinkingParameterRejectionPatterns = [\n /(?:^|[^a-z0-9_])[\"'`]?thinking[\"'`]?(?:\\s+(?:parameter|field|argument))?\\s*(?:is\\s+)?(?:not supported|unsupported|unknown|unrecognized|not allowed|not permitted|rejected|invalid|not valid|not accepted|disallowed|not a valid(?:\\s+(?:parameter|field|argument))?)(?![a-z0-9_])/,\n /(?:^|[^a-z0-9_])(?:unsupported|unknown|unrecognized|invalid|disallowed|rejected|not\\s+(?:a\\s+)?valid|not\\s+accepted|not\\s+allowed|not\\s+permitted)(?:[_ ](?:parameter|field|argument))?\\s*[:=]?\\s*[\"'`]?thinking[\"'`]?(?![a-z0-9_])/,\n /(?:^|[^a-z0-9_])(?:extra\\s+inputs?|additional\\s+(?:inputs?|parameters?))\\s+(?:are\\s+)?(?:not permitted|not allowed|unsupported)\\s*[:=]?\\s*[\"'`]?thinking[\"'`]?(?![a-z0-9_])/,\n ];\n let rejectionEnd = -1;\n for (const pattern of thinkingParameterRejectionPatterns) {\n const match = pattern.exec(normalized);\n if (match && match.index + match[0].length > rejectionEnd) {\n rejectionEnd = match.index + match[0].length;\n }\n }\n if (rejectionEnd < 0) return false;\n\n // The provider must direct the caller to reasoning_effort after the\n // rejection. Limiting this to the short suffix after the matched rejection\n // keeps generic documentation or an unrelated earlier sentence from being\n // treated as runtime protocol evidence.\n const recommendation = normalized.slice(rejectionEnd, rejectionEnd + 260);\n if (!/\\breasoning[_.]effort\\b/.test(recommendation)) return false;\n\n const recommendationClauses = recommendation.split(/[.;!?\\n]/);\n return recommendationClauses.some((clause) => {\n if (!/\\breasoning[_.]effort\\b/.test(clause)) return false;\n // A target mentioned inside a negated/disabled clause is not positive\n // protocol guidance, even if words such as `must` or `supported` occur.\n if (\n /\\b(?:do\\s+not|don't|never|avoid)\\s+(?:use|set|send|pass|provide)?\\s*[\"'`]?reasoning[_.]effort\\b/.test(\n clause,\n ) ||\n /\\breasoning[_.]effort\\b[^.;]{0,80}\\b(?:must|should|may|do)\\s+(?:not|never)\\b/.test(clause) ||\n /\\breasoning[_.]effort\\b[^.;]{0,80}\\b(?:unsupported|disabled|unavailable|not\\s+(?:supported|accepted|allowed|available|enabled|required|recommended|expected))\\b/.test(\n clause,\n )\n )\n return false;\n\n return [\n /(?:use|try|set|send|pass|provide)\\s+(?:the\\s+)?(?:top[- ]level\\s+)?[\"'`]?reasoning[_.]effort[\"'`]?(?![a-z0-9_])/,\n /(?:reasoning[_.]effort)\\b[^.;]{0,120}(?:instead|required|must\\s+be|should\\s+be|is\\s+(?:supported|accepted|preferred|recommended|expected))\\b/,\n /(?:parameter|field|option)\\s+(?:is|should be)\\s+[\"'`]?reasoning[_.]effort[\"'`]?(?![a-z0-9_])/,\n /instead[^.;]{0,120}(?:use|try|set|send|pass|provide)\\s+(?:the\\s+)?[\"'`]?reasoning[_.]effort[\"'`]?(?![a-z0-9_])/,\n /(?:replace|change|switch)\\s+(?:the\\s+)?[\"'`]?thinking[\"'`]?\\s+(?:with|to)\\s+[\"'`]?reasoning[_.]effort[\"'`]?(?![a-z0-9_])/,\n ].some((pattern) => pattern.test(clause));\n });\n }\n\n function getOptionalAssistantHttpStatus(record: UnknownRecord): number | undefined {\n const readStatus = (value: unknown): number | undefined => {\n if (typeof value === 'number' && Number.isInteger(value) && value >= 100 && value <= 599) return value;\n if (typeof value === 'string' && /^\\d{3}$/.test(value.trim())) {\n const parsed = Number(value.trim());\n return parsed >= 100 && parsed <= 599 ? parsed : undefined;\n }\n return undefined;\n };\n\n for (const key of ['status', 'statusCode', 'httpStatus', 'httpStatusCode']) {\n const status = readStatus(record[key]);\n if (status !== undefined) return status;\n }\n\n // Foreign/provider adapters sometimes put the HTTP status under a\n // diagnostic `details`, `error`, or `cause` object rather than exposing it\n // on the finalized assistant message itself. Traverse only these known\n // diagnostic wrappers, with a small depth bound; never inspect arbitrary\n // payload/message fields for a number that happens to look like a status.\n const scanDiagnosticStatus = (value: unknown, depth: number): number | undefined => {\n if (depth > 2) return undefined;\n if (Array.isArray(value)) {\n for (const item of value) {\n const status = scanDiagnosticStatus(item, depth + 1);\n if (status !== undefined) return status;\n }\n return undefined;\n }\n const source = asRecord(value);\n if (!source) return undefined;\n for (const key of ['status', 'statusCode', 'httpStatus', 'httpStatusCode', 'code']) {\n const status = readStatus(source[key]);\n if (status !== undefined) return status;\n }\n for (const key of ['details', 'error', 'cause', 'diagnostics']) {\n const status = scanDiagnosticStatus(source[key], depth + 1);\n if (status !== undefined) return status;\n }\n return undefined;\n };\n for (const key of ['diagnostics', 'diagnostic', 'details', 'error', 'cause']) {\n const status = scanDiagnosticStatus(record[key], 0);\n if (status !== undefined) return status;\n }\n\n // Pi's built-in OpenAI-compatible adapters normally prefix a provider error\n // body with the HTTP status (for example `400: {...}` or\n // `OpenAI API error (400): ...`). Only parse status-shaped prefixes; never\n // search arbitrary body text where a model id or payload number could be\n // mistaken for a response status.\n if (typeof record.errorMessage === 'string') {\n const errorText = record.errorMessage;\n const matches = [\n /^\\s*([1-5]\\d{2})\\b/,\n /^\\s*(?:http(?:\\s+status)?|status(?:\\s+code)?)\\s*[:(]?\\s*([1-5]\\d{2})\\b/i,\n /^\\s*[^():\\n]{1,100}\\(\\s*([1-5]\\d{2})\\b/,\n /^\\s*(?:error|api\\s+error|provider\\s+error|request\\s+failed|http\\s+error)\\s*[:(]\\s*([1-5]\\d{2})\\b/i,\n ];\n for (const pattern of matches) {\n const match = pattern.exec(errorText);\n if (match) return Number(match[1]);\n }\n }\n return undefined;\n }\n\n function hasReasoningProtocolRejectionErrorMessage(message: unknown): boolean {\n const record = getAssistantRecord(message);\n if (!record || record.stopReason !== 'error') return false;\n // Finalized assistant messages do not expose a separate status field in the\n // normal Pi path, so recover it only from structured diagnostics or the\n // adapter's status-shaped error prefix. A text-only 400-looking parameter\n // message is not enough evidence for a protocol repair.\n return getOptionalAssistantHttpStatus(record) === 400 && hasReasoningProtocolRejectionText(record.errorMessage);\n }\n\n function isReasoningProtocolRejectionSignalApplicable(model: CacheModel | undefined): boolean {\n // A provider error can teach us which protocol it expects, so this gate is\n // intentionally broader than the explicit DeepSeek-format diagnostic gate.\n // The model family identifies the affected cache/compat bucket; the error\n // text, not the model name, supplies the wire-protocol evidence.\n return !!model && isOpenAICompatibleProxyApi(model.api) && isDeepSeekLikeModel(model);\n }\n\n function isReasoningProtocolRejectionForModel(message: unknown, model: CacheModel | undefined): boolean {\n if (!model || !isReasoningProtocolRejectionSignalApplicable(model)) return false;\n if (!hasReasoningProtocolRejectionErrorMessage(message)) return false;\n const record = getAssistantRecord(message);\n if (!record) return false;\n const messageProvider = firstNonEmptyString(record.provider);\n const messageModel = firstNonEmptyString(record.responseModel, record.model);\n // An explicit identity in the finalized assistant error is authoritative.\n // Do not broaden a model-scoped observation to another DeepSeek-named model.\n return (!messageProvider || messageProvider === model.provider) && (!messageModel || messageModel === model.id);\n }\n\n function buildProviderCompatOverride(\n providerLabel: string,\n compat: Record<string, unknown>,\n ): Record<string, unknown> {\n return {\n providers: {\n [providerLabel]: {\n compat,\n },\n },\n };\n }\n\n function buildModelCompatOverride(\n providerLabel: string,\n modelId: string,\n compat: Record<string, unknown>,\n ): Record<string, unknown> {\n return {\n providers: {\n [providerLabel]: {\n modelOverrides: {\n [modelId]: {\n compat,\n },\n },\n },\n },\n };\n }\n\n function appendCredentialSafeProviderGuidance(\n lines: string[],\n placement: CompatAdvicePlacement,\n compatSuggestion: Record<string, unknown>,\n ): void {\n const providerLabel = placement.providerLabel;\n if (!providerLabel) return;\n\n lines.push('');\n lines.push('If this channel has no models.json provider entry yet:');\n lines.push('- Keep existing authentication as-is; do not copy credentials, tokens, or API keys.');\n lines.push(`- Add only cache/routing compat overrides in ${getModelsJsonDisplayPath()}.`);\n\n if (Object.keys(compatSuggestion).length === 0) {\n lines.push('- No safe copyable override is available for the missing flags shown above.');\n return;\n }\n\n lines.push('Provider-level minimal override:');\n lines.push(JSON.stringify(buildProviderCompatOverride(providerLabel, compatSuggestion), null, 2));\n\n if (placement.modelId) {\n lines.push('Single-model override (use this if only this model should change):');\n lines.push(JSON.stringify(buildModelCompatOverride(providerLabel, placement.modelId, compatSuggestion), null, 2));\n }\n }\n\n function appendOpenAIProxyCompatAdviceLines(\n lines: string[],\n missing: string[],\n options: { includeJsonIntro?: boolean } & CompatAdvicePlacement = {},\n ): void {\n const suggestion = buildSafeOpenAIProxyCompatSuggestion(missing);\n const hasSafeSuggestion = Object.keys(suggestion).length > 0;\n\n if (hasSafeSuggestion) {\n if (options.includeJsonIntro !== false) {\n lines.push('Safe default suggestion:');\n }\n lines.push(JSON.stringify(suggestion, null, 2));\n }\n\n if (missing.includes('sendSessionAffinityHeaders')) {\n lines.push(\n '- sendSessionAffinityHeaders: recommended for third-party proxies when supported; it helps keep one Pi session on the same upstream/backend.',\n );\n }\n appendCredentialSafeProviderGuidance(lines, options, suggestion);\n }\n\n function buildOpenAIProxyCompatWarningText(key: string, missing: string[]): string {\n // Extract provider id from the model key (e.g. \"otokapi/gpt-5.5\" -> \"otokapi\").\n // If no slash is found, fall back to the key itself.\n const slashIdx = key.indexOf('/');\n const providerLabel = slashIdx > 0 ? key.slice(0, slashIdx) : key;\n const modelId = slashIdx > 0 ? key.slice(slashIdx + 1) : undefined;\n\n const modelsJsonPath = getModelsJsonDisplayPath();\n const lines: string[] = [\n `💡 pi-cache-optimizer: ${key} is a third-party OpenAI-compatible proxy but merged compat lacks ${missing.join(' and ')}.`,\n `Review a precise model-scoped repair (or edit ${modelsJsonPath} -> providers[\"${providerLabel}\"] -> compat manually).`,\n ``,\n ];\n\n appendOpenAIProxyCompatAdviceLines(lines, missing, { providerLabel, modelId });\n\n return lines.join('\\n');\n }\n\n function isDeepSeekWireCompatApplicable(model: CacheModel): boolean {\n // `thinkingFormat` is the only wire-protocol signal. The model family is\n // still name/id based for adapter selection, while provider, URL, and\n // supportsReasoningEffort remain deliberately irrelevant here.\n return (\n isDeepSeekLikeModel(model) &&\n isOpenAICompatibleProxyApi(model.api) &&\n getCompat(model).thinkingFormat === 'deepseek'\n );\n }\n\n function describeMissingDeepSeekCompat(model: CacheModel): string[] {\n if (!isDeepSeekWireCompatApplicable(model)) return [];\n\n const compat = getCompat(model);\n const missing: string[] = [];\n if (compat.requiresReasoningContentOnAssistantMessages !== true) {\n missing.push('requiresReasoningContentOnAssistantMessages');\n }\n return missing;\n }\n\n function isDeepSeekCompatCheckApplicable(model: CacheModel): boolean {\n return isDeepSeekWireCompatApplicable(model);\n }\n\n function describeMissingCacheCompatForModel(model: CacheModel): string[] {\n if (isAdaptiveThinkingCompatApplicable(model)) {\n return describeMissingAdaptiveThinkingCompat(model);\n }\n\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (isDeepSeekWireCompatApplicable(model)) {\n missing.push(...describeMissingDeepSeekCompat(model));\n }\n return missing;\n }\n\n function buildDeepSeekCompatSuggestion(missing: string[]): Record<string, unknown> {\n const suggestion: Record<string, unknown> = {\n ...buildSafeOpenAIProxyCompatSuggestion(missing),\n };\n if (missing.includes('requiresReasoningContentOnAssistantMessages')) {\n suggestion.requiresReasoningContentOnAssistantMessages = true;\n }\n return suggestion;\n }\n\n function appendDeepSeekCompatAdviceLines(\n lines: string[],\n missing: string[],\n placement: CompatAdvicePlacement = {},\n ): void {\n const suggestion = buildDeepSeekCompatSuggestion(missing);\n if (Object.keys(suggestion).length > 0) {\n lines.push('Recommended DeepSeek reasoning/replay compat snippet:');\n lines.push(JSON.stringify(suggestion, null, 2));\n }\n\n if (missing.includes('requiresReasoningContentOnAssistantMessages')) {\n lines.push(\n '- requiresReasoningContentOnAssistantMessages: true keeps replayed assistant turns compatible with an explicitly selected DeepSeek reasoning wire format.',\n );\n }\n if (missing.includes('sendSessionAffinityHeaders')) {\n lines.push(\n '- sendSessionAffinityHeaders: recommended for third-party OpenAI-compatible proxies when supported; it helps keep one Pi session on the same upstream/backend.',\n );\n }\n\n appendCredentialSafeProviderGuidance(lines, placement, suggestion);\n }\n\n function buildDeepSeekCompatWarningText(key: string, missing: string[]): string {\n const slashIdx = key.indexOf('/');\n const providerLabel = slashIdx > 0 ? key.slice(0, slashIdx) : key;\n const modelId = slashIdx > 0 ? key.slice(slashIdx + 1) : undefined;\n const modelsJsonPath = getModelsJsonDisplayPath();\n const lines: string[] = [\n `💡 pi-cache-optimizer: ${key} is DeepSeek-like but merged compat lacks ${missing.join(' and ')}.`,\n `Proxies may reduce or hide cache hits. Edit ${modelsJsonPath} -> providers[\"${providerLabel}\"] -> compat (at the same level as baseUrl/api/apiKey/models).`,\n '',\n ];\n\n appendDeepSeekCompatAdviceLines(lines, missing, { providerLabel, modelId });\n\n return lines.join('\\n');\n }\n\n const CACHE_PROVIDER_ADAPTERS: CacheProviderAdapter[] = [\n {\n id: 'deepseek',\n label: 'DS cache',\n matchesModel: isDeepSeekLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isDeepSeekLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getDeepSeekRawUsage, { allowInputOnlyPiUsage: true });\n },\n warningText(model) {\n const missing = describeMissingCacheCompatForModel(model);\n if (missing.length === 0) return undefined;\n\n const key = modelKey(model);\n return isDeepSeekWireCompatApplicable(model)\n ? buildDeepSeekCompatWarningText(key, missing)\n : buildOpenAIProxyCompatWarningText(key, missing);\n },\n },\n {\n id: 'claude',\n label: 'Claude cache',\n showCacheWrite: true,\n matchesModel: isClaudeLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isClaudeLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getAnthropicRawUsage);\n },\n warningText(model) {\n if (!isClaudeLikeModel(model) || !isOpenAICompatibleApi(model.api) || isPiBuiltInLlamaCppModel(model))\n return undefined;\n if (getCompat(model).cacheControlFormat === 'anthropic') return undefined;\n\n return (\n `💡 Cache optimizer: ${modelKey(model)} looks Claude/Anthropic-like but OpenAI-compatible compat lacks cacheControlFormat: \"anthropic\". ` +\n 'Pi may not place Anthropic cache_control breakpoints unless this endpoint supports and enables that compat flag.'\n );\n },\n },\n {\n id: 'openai',\n label: 'OpenAI cache',\n matchesModel: isOpenAIFamilyModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isOpenAIFamilyAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'gemini',\n label: 'Gemini cache',\n matchesModel: isGeminiLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isGeminiLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getGeminiRawUsage);\n },\n },\n // ── Non-GPT OpenAI-compatible adapters ──────────────────────\n {\n id: 'openai' as CacheProviderId,\n label: 'Kimi cache',\n matchesModel: isKimiLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isKimiLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Qwen cache',\n matchesModel: isQwenLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isQwenLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'GLM cache',\n matchesModel: isGLMLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isGLMLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'MiniMax cache',\n matchesModel: isMiniMaxLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isMiniMaxLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Mimo cache',\n matchesModel: isMimoLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isMimoLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Hunyuan cache',\n matchesModel: isHunyuanLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isHunyuanLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n // ── More OpenAI-compatible adapters ──────────────────────────\n {\n id: 'openai' as CacheProviderId,\n label: 'Mistral cache',\n matchesModel: isMistralLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isMistralLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Grok cache',\n matchesModel: isGrokLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isGrokLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Llama cache',\n matchesModel: isLlamaLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isLlamaLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Nemotron cache',\n matchesModel: isNemotronLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isNemotronLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Cohere cache',\n matchesModel: isCohereLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isCohereLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Yi cache',\n matchesModel: isYiLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isYiLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n // ── More OpenAI-compatible adapters (batch 2) ───────────────────\n {\n id: 'openai' as CacheProviderId,\n label: 'Doubao cache',\n matchesModel: isDoubaoLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isDoubaoLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'ERNIE cache',\n matchesModel: isErnieLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isErnieLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Baichuan cache',\n matchesModel: isBaichuanLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isBaichuanLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'StepFun cache',\n matchesModel: isStepFunLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isStepFunLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Spark cache',\n matchesModel: isSparkLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isSparkLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'InternLM cache',\n matchesModel: isInternLMLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isInternLMLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Gemma cache',\n matchesModel: isGemmaLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isGemmaLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Phi cache',\n matchesModel: isPhiLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isPhiLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Jamba cache',\n matchesModel: isJambaLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isJambaLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Solar cache',\n matchesModel: isSolarLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isSolarLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n // ── New OpenAI-compatible adapters (batch 3, 12 families) ────────\n {\n id: 'openai' as CacheProviderId,\n label: 'Sonar cache',\n matchesModel: isPerplexityLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isPerplexityLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Nova cache',\n matchesModel: isNovaLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isNovaLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Reka cache',\n matchesModel: isRekaLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isRekaLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Falcon cache',\n matchesModel: isFalconLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isFalconLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'DBRX cache',\n matchesModel: isDbrxLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isDbrxLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'MPT cache',\n matchesModel: isMptLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isMptLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'StableLM cache',\n matchesModel: isStableLMLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isStableLMLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Aquila cache',\n matchesModel: isAquilaLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isAquilaLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'EXAONE cache',\n matchesModel: isExaoneLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isExaoneLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'HyperCLOVA cache',\n matchesModel: isHyperCLOVALikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isHyperCLOVALikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Luminous cache',\n matchesModel: isLuminousLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isLuminousLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Hermes cache',\n matchesModel: isHermesLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isHermesLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n // ── More OpenAI-compatible adapters (batch 4, 18 families) ────────\n {\n id: 'openai' as CacheProviderId,\n label: 'Granite cache',\n matchesModel: isGraniteLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isGraniteLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Arctic cache',\n matchesModel: isArcticLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isArcticLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Pangu cache',\n matchesModel: isPanguLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isPanguLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'SenseNova cache',\n matchesModel: isSenseNovaLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isSenseNovaLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Zhinao cache',\n matchesModel: isZhinaoLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isZhinaoLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'MiniCPM cache',\n matchesModel: isMiniCPMLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isMiniCPMLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'XVERSE cache',\n matchesModel: isXVerseLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isXVerseLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Orion cache',\n matchesModel: isOrionLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isOrionLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'OpenChat cache',\n matchesModel: isOpenChatLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isOpenChatLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Vicuna cache',\n matchesModel: isVicunaLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isVicunaLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Wizard cache',\n matchesModel: isWizardLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isWizardLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Zephyr cache',\n matchesModel: isZephyrLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isZephyrLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Dolphin cache',\n matchesModel: isDolphinLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isDolphinLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'OpenOrca cache',\n matchesModel: isOpenOrcaLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isOpenOrcaLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Starling cache',\n matchesModel: isStarlingLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isStarlingLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'BLOOM cache',\n matchesModel: isBloomLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isBloomLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'RWKV cache',\n matchesModel: isRwkvLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isRwkvLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n {\n id: 'openai' as CacheProviderId,\n label: 'Aya cache',\n matchesModel: isAyaLikeModel,\n matchesAssistantMessage(message, model) {\n if (!isAssistantMessage(message)) return false;\n return isAyaLikeAssistantMessage(message, model);\n },\n normalizeUsage(message) {\n return normalizeWithFallback(message, getOpenAIRawUsage);\n },\n warningText(model) {\n const missing = describeMissingOpenAICompatibleProxyCompat(model);\n if (missing.length === 0) return undefined;\n return buildOpenAIProxyCompatWarningText(modelKey(model), missing);\n },\n },\n ];\n\n function selectAdapterForModel(model: CacheModel | undefined): CacheProviderAdapter | undefined {\n // A native virtual selection has no cache identity of its own; stats always\n // belong to the physical model it routed to.\n if (isNativeVirtualModel(model)) return undefined;\n return CACHE_PROVIDER_ADAPTERS.find((adapter) => adapter.matchesModel(model));\n }\n\n function selectAdapterForAssistantMessage(\n message: unknown,\n model: CacheModel | undefined,\n ): CacheProviderAdapter | undefined {\n // Assistant message metadata is request-local and authoritative for virtual\n // routing providers. Use it first for every model; direct providers normally\n // echo the same provider/model and therefore remain unchanged.\n const responseModel = modelFromAssistantMessage(message, model);\n return CACHE_PROVIDER_ADAPTERS.find((adapter) => adapter.matchesAssistantMessage(message, responseModel));\n }\n\n function notifyCacheCompatIfNeeded(\n model: CacheModel | undefined,\n notify: (text: string, level: 'warning') => void,\n warnedModels: Set<string>,\n ): void {\n if (!model) return;\n\n // A protocol rejection is retained separately from ordinary compat warnings;\n // it is surfaced once by the response hook and can be used by a later fix.\n // Do not turn it into an automatic write here.\n\n // Native anthropic-messages adaptive thinking compat check.\n // Adapter warningText only fires for OpenAI-compatible APIs, so native\n // Anthropic and Kimi Coding adaptive models need a separate check.\n if (isAdaptiveThinkingCompatApplicable(model)) {\n const missing = describeMissingAdaptiveThinkingCompat(model);\n if (missing.length > 0) {\n const key = `adaptive-thinking:${modelKey(model)}`;\n if (!warnedModels.has(key)) {\n warnedModels.add(key);\n notify(buildAdaptiveThinkingCompatWarningText(modelKey(model), missing), 'warning');\n }\n }\n // Still check adapter warnings for other compat issues.\n }\n\n const adapter = selectAdapterForModel(model);\n const text = adapter?.warningText?.(model);\n if (!adapter || !text) return;\n\n const affinityOnly =\n adapter.warningText !== undefined &&\n describeMissingOpenAICompatibleProxyCompat(model).length === 1 &&\n describeMissingCacheCompatForModel(model).length === 1;\n const key = affinityOnly ? `proxy-affinity:${model.provider}` : `${adapter.id}:${modelKey(model)}`;\n if (warnedModels.has(key)) return;\n warnedModels.add(key);\n\n notify(text, 'warning');\n }\n\n function currentLocalDay(): string {\n const now = new Date();\n const year = now.getFullYear();\n const month = String(now.getMonth() + 1).padStart(2, '0');\n const day = String(now.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n }\n\n function emptyCacheStats(day = currentLocalDay()): CacheStats {\n return {\n day,\n totalRequests: 0,\n hitRequests: 0,\n cachedInputTokens: 0,\n cacheWriteInputTokens: 0,\n totalInputTokens: 0,\n };\n }\n\n function addUsageToCacheStats(stats: CacheStats, usage: UsageSnapshot): void {\n stats.totalRequests += 1;\n if (usage.cacheRead > 0) stats.hitRequests += 1;\n stats.cachedInputTokens += usage.cacheRead;\n stats.cacheWriteInputTokens += usage.cacheWrite;\n stats.totalInputTokens += usage.totalInput;\n }\n\n function formatTokenCount(value: number): string {\n const millions = Math.max(0, Math.round(value)) / 1_000_000;\n if (millions === 0) return '0M';\n if (millions < 0.001) return `${millions.toFixed(4)}M`;\n if (millions < 0.01) return `${millions.toFixed(3)}M`;\n if (millions >= 10) return `${millions.toFixed(1)}M`;\n return `${millions.toFixed(2)}M`;\n }\n\n function formatCacheStats(adapter: CacheProviderAdapter, stats: CacheStats): string {\n const percent = stats.totalInputTokens > 0 ? (stats.cachedInputTokens / stats.totalInputTokens) * 100 : 0;\n const writeText =\n adapter.showCacheWrite && stats.cacheWriteInputTokens > 0\n ? `·write ${formatTokenCount(stats.cacheWriteInputTokens)}`\n : '';\n\n return `${adapter.label} ${stats.hitRequests}/${stats.totalRequests}·${formatTokenCount(stats.cachedInputTokens)}/${formatTokenCount(stats.totalInputTokens)} ${percent.toFixed(1)}%${writeText}`;\n }\n\n function prefixFooterStatus(statusText: string | undefined): string | undefined {\n if (!statusText || statusText.startsWith('· ')) return statusText;\n return `· ${statusText}`;\n }\n\n function hasMissingUsageFields(message: unknown, adapter: CacheProviderAdapter): boolean {\n const usage = usageRecordFromAssistant(message);\n if (!usage) return true;\n\n // Check Pi-normalized fields\n const input = getNonNegativeNumber(usage, 'input');\n const cacheRead = getNonNegativeNumber(usage, 'cacheRead');\n const cacheWrite = getNonNegativeNumber(usage, 'cacheWrite');\n\n // If Pi-normalized fields exist with non-zero values, usage is present\n if (cacheRead !== undefined || cacheWrite !== undefined || (input !== undefined && input > 0)) {\n return false;\n }\n\n // Check raw usage for the adapter's provider family\n const rawUsage = adapter.normalizeUsage(message);\n if (!rawUsage || (rawUsage.cacheRead === 0 && rawUsage.cacheWrite === 0 && rawUsage.totalInput === 0)) {\n return true;\n }\n\n return false;\n }\n\n function getErrorCode(error: unknown): string | undefined {\n return typeof error === 'object' && error !== null && 'code' in error\n ? String((error as { code?: unknown }).code)\n : undefined;\n }\n\n function parseCacheStats(value: unknown): CacheStats | undefined {\n const stats = asRecord(value);\n if (!stats || typeof stats.day !== 'string' || !/^\\d{4}-\\d{2}-\\d{2}$/.test(stats.day)) {\n return undefined;\n }\n\n const totalRequests = getNonNegativeNumber(stats, 'totalRequests');\n const hitRequests = getNonNegativeNumber(stats, 'hitRequests');\n const cachedInputTokens = getNonNegativeNumber(stats, 'cachedInputTokens');\n const cacheWriteInputTokens = getNonNegativeNumber(stats, 'cacheWriteInputTokens') ?? 0;\n const totalInputTokens = getNonNegativeNumber(stats, 'totalInputTokens');\n\n if (\n totalRequests === undefined ||\n hitRequests === undefined ||\n cachedInputTokens === undefined ||\n totalInputTokens === undefined ||\n hitRequests > totalRequests ||\n cachedInputTokens > totalInputTokens ||\n cacheWriteInputTokens > totalInputTokens\n ) {\n return undefined;\n }\n\n return {\n day: stats.day,\n totalRequests,\n hitRequests,\n cachedInputTokens,\n cacheWriteInputTokens,\n totalInputTokens,\n };\n }\n\n function cloneCacheStats(stats: CacheStats): CacheStats {\n return { ...stats };\n }\n\n function addCacheStatsTotals(target: CacheStats, source: CacheStats): void {\n target.totalRequests += source.totalRequests;\n target.hitRequests += source.hitRequests;\n target.cachedInputTokens += source.cachedInputTokens;\n target.cacheWriteInputTokens += source.cacheWriteInputTokens;\n target.totalInputTokens += source.totalInputTokens;\n }\n\n function mergeCacheStatsForTotal(existing: CacheStats | undefined, incoming: CacheStats): CacheStats {\n if (!existing) return cloneCacheStats(incoming);\n if (incoming.day > existing.day) return cloneCacheStats(incoming);\n if (incoming.day < existing.day) return existing;\n addCacheStatsTotals(existing, incoming);\n return existing;\n }\n\n function parsePersistedRoutedModelRef(value: unknown): PersistedRoutedModelRef | undefined {\n const record = asRecord(value);\n const provider = record?.provider;\n const id = record?.id;\n const name = record?.name;\n if (!isNonEmptyString(provider) || !isNonEmptyString(id)) return undefined;\n\n return {\n provider: provider.trim(),\n id: id.trim(),\n name: isNonEmptyString(name) ? name.trim() : id.trim(),\n };\n }\n\n function routedModelRefToCacheModel(ref: PersistedRoutedModelRef): CacheModel {\n return {\n id: ref.id,\n name: ref.name ?? ref.id,\n provider: ref.provider,\n api: '',\n baseUrl: '',\n } as CacheModel;\n }\n\n function selectFooterStatsForModel(\n mode: FooterStatsMode,\n sessionHash: string | undefined,\n statsByModel: Record<string, CacheStats>,\n totalsByModel: Record<string, CacheStats>,\n model: { provider: string; id: string },\n processByModel: Record<string, CacheStats> = {},\n ): CacheStats | undefined {\n if (mode === 'total') return totalsByModel[modelKey(model)];\n if (mode === 'process') return processByModel[modelKey(model)];\n if (!sessionHash) return undefined;\n return statsByModel[makeSessionModelKey(sessionHash, model.provider, model.id)];\n }\n\n function buildExactRouterStatusEntry(\n sessionHash: string | undefined,\n statsByModel: Record<string, CacheStats>,\n lastRoutedModel: PersistedRoutedModelRef | undefined,\n totalsByModel: Record<string, CacheStats> = {},\n mode: FooterStatsMode = 'total',\n processByModel: Record<string, CacheStats> = {},\n ): { model: CacheModel; adapter: CacheProviderAdapter; stats: CacheStats } | undefined {\n if (!sessionHash || !lastRoutedModel) return undefined;\n\n const model = routedModelRefToCacheModel(lastRoutedModel);\n const adapter = selectAdapterForModel(model);\n if (!adapter) return undefined;\n\n return {\n model,\n adapter,\n stats:\n selectFooterStatsForModel(mode, sessionHash, statsByModel, totalsByModel, model, processByModel) ??\n emptyCacheStats(),\n };\n }\n\n function findBestRouterModelStats(\n mode: FooterStatsMode,\n sessionHash: string | undefined,\n statsByModel: Record<string, CacheStats>,\n totalsByModel: Record<string, CacheStats>,\n processByModel: Record<string, CacheStats> = {},\n ): { model: CacheModel; adapter: CacheProviderAdapter; stats: CacheStats } | undefined {\n const entries =\n mode === 'total'\n ? Object.entries(totalsByModel)\n : mode === 'process'\n ? Object.entries(processByModel)\n : sessionHash\n ? Object.entries(statsByModel)\n .filter(([key]) => key.startsWith(`${sessionHash}:`))\n .map(([key, stats]) => [key.slice(sessionHash.length + 1), stats] as const)\n : [];\n let best: { model: CacheModel; adapter: CacheProviderAdapter; stats: CacheStats; total: number } | undefined;\n\n for (const [modelKeyPart, stats] of entries) {\n const slashIdx = modelKeyPart.indexOf('/');\n if (slashIdx < 1 || slashIdx >= modelKeyPart.length - 1) continue;\n const model = routedModelRefToCacheModel({\n provider: modelKeyPart.slice(0, slashIdx),\n id: modelKeyPart.slice(slashIdx + 1),\n });\n const adapter = selectAdapterForModel(model);\n if (!adapter) continue;\n if (!best || stats.totalRequests > best.total) {\n best = { model, adapter, stats, total: stats.totalRequests };\n }\n }\n\n return best ? { model: best.model, adapter: best.adapter, stats: best.stats } : undefined;\n }\n\n function modelEpochPath(modelKeyValue: string): string {\n return join(SHARD_MODEL_EPOCH_DIR, `${createHash('sha256').update(modelKeyValue).digest('hex')}.json`);\n }\n\n function initialEpoch(scope: string): string {\n return `initial:${scope}`;\n }\n\n function parseEpochRecord(value: unknown): string | undefined {\n const record = asRecord(value);\n return record?.version === 1 && isNonEmptyString(record.epoch) ? record.epoch.trim() : undefined;\n }\n\n async function readEpochFile(path: string, fallback: string): Promise<string> {\n try {\n return parseEpochRecord(JSON.parse(getOrThrow(await fs.readTextFile(path, io)))) ?? fallback;\n } catch {\n return fallback;\n }\n }\n\n async function readGlobalStatsEpoch(): Promise<string> {\n return readEpochFile(SHARD_GLOBAL_EPOCH_PATH, initialEpoch('global'));\n }\n\n async function readModelStatsEpoch(modelKeyValue: string): Promise<string> {\n return readEpochFile(modelEpochPath(modelKeyValue), initialEpoch(`model:${modelKeyValue}`));\n }\n\n async function writeStatsEpoch(path: string, epoch: string): Promise<void> {\n await writeFileAtomic(fs, path, JSON.stringify({ version: 1, epoch, createdAt: Date.now() }, null, 2) + '\\n', io);\n }\n\n async function advanceGlobalStatsEpoch(): Promise<string> {\n const epoch = `${Date.now()}-${randomUUID()}`;\n await writeStatsEpoch(SHARD_GLOBAL_EPOCH_PATH, epoch);\n return epoch;\n }\n\n async function advanceModelStatsEpoch(modelKeyValue: string): Promise<string> {\n const epoch = `${Date.now()}-${randomUUID()}`;\n await writeStatsEpoch(modelEpochPath(modelKeyValue), epoch);\n return epoch;\n }\n\n function parsePersistedStatsShardV7(value: unknown): PersistedStatsShardV7 | undefined {\n const record = asRecord(value);\n const processRecord = asRecord(record?.process);\n const lifecycle = asRecord(record?.lifecycle);\n const rawModels = asRecord(record?.models);\n if (\n record?.version !== 7 ||\n record.kind !== 'pi-cache-optimizer-shard' ||\n !isNonEmptyString(record.instanceId) ||\n !isNonEmptyString(record.sessionHash) ||\n !processRecord ||\n !Number.isInteger(processRecord.pid) ||\n !Number.isInteger(processRecord.ppid) ||\n typeof processRecord.instanceStartedAt !== 'number' ||\n !lifecycle ||\n (lifecycle.state !== 'active' && lifecycle.state !== 'closed') ||\n typeof lifecycle.createdAt !== 'number' ||\n typeof lifecycle.updatedAt !== 'number' ||\n !isNonEmptyString(record.day) ||\n !/^\\d{4}-\\d{2}-\\d{2}$/.test(record.day) ||\n !isNonEmptyString(record.globalEpoch) ||\n !rawModels\n )\n return undefined;\n\n const models: PersistedStatsShardV7['models'] = {};\n for (const [key, rawEntry] of Object.entries(rawModels)) {\n const entry = asRecord(rawEntry);\n const stats = parseCacheStats(entry?.stats);\n if (\n !entry ||\n !stats ||\n !isNonEmptyString(entry.modelEpoch) ||\n !isNonEmptyString(entry.provider) ||\n !isNonEmptyString(entry.modelId) ||\n key !== `${entry.provider.trim()}/${entry.modelId.trim()}`\n )\n continue;\n models[key] = {\n modelEpoch: entry.modelEpoch.trim(),\n provider: entry.provider.trim(),\n modelId: entry.modelId.trim(),\n ...(isNonEmptyString(entry.modelName) ? { modelName: entry.modelName.trim() } : {}),\n ...(isNonEmptyString(entry.api) ? { api: entry.api.trim() } : {}),\n stats,\n };\n }\n\n const lastRoutedModel = parsePersistedRoutedModelRef(record.lastRoutedModel);\n return {\n version: 7,\n kind: 'pi-cache-optimizer-shard',\n instanceId: record.instanceId.trim(),\n sessionHash: record.sessionHash.trim(),\n process: {\n pid: Number(processRecord.pid),\n ppid: Number(processRecord.ppid),\n instanceStartedAt: processRecord.instanceStartedAt,\n },\n lifecycle: {\n state: lifecycle.state,\n createdAt: lifecycle.createdAt,\n updatedAt: lifecycle.updatedAt,\n ...(typeof lifecycle.closedAt === 'number' ? { closedAt: lifecycle.closedAt } : {}),\n },\n day: record.day,\n globalEpoch: record.globalEpoch.trim(),\n models,\n ...(lastRoutedModel ? { lastRoutedModel } : {}),\n };\n }\n\n async function writeStatsShardV7(path: string, shard: PersistedStatsShardV7): Promise<void> {\n await writeFileAtomic(fs, path, JSON.stringify(shard, null, 2) + '\\n', io);\n }\n\n /** Entries of `directory`, or undefined when it does not exist. Entries removed while listing are skipped. */\n async function listDirectoryEntries(directory: string): Promise<DirectoryEntry[] | undefined> {\n const opened = await fs.openDirReader(directory, io);\n if (!opened.ok && opened.error.code === 'not_found') return undefined;\n const reader = getOrThrow(opened);\n try {\n const entries: DirectoryEntry[] = [];\n for (;;) {\n const page = getOrThrow(await reader.next(256, io));\n entries.push(...page.entries);\n if (page.done) return entries;\n }\n } finally {\n await reader.close(io);\n }\n }\n\n async function readValidStatsShardsV7(directory: string = SHARD_FILES_DIR): Promise<PersistedStatsShardV7[]> {\n const entries = await listDirectoryEntries(directory);\n if (!entries) return [];\n const shards: PersistedStatsShardV7[] = [];\n for (const { name, kind } of entries) {\n if (!/^[0-9a-f-]+\\.json$/i.test(name)) continue;\n const path = join(directory, name);\n try {\n if (kind !== 'file') continue;\n const parsed = parsePersistedStatsShardV7(JSON.parse(getOrThrow(await fs.readTextFile(path, io))));\n const filenameInstanceId = name.slice(0, -'.json'.length);\n if (parsed && parsed.instanceId === filenameInstanceId) shards.push(parsed);\n } catch {\n // Ignore malformed or transiently unavailable shards. Atomic writers will\n // publish a complete replacement on the next successful update.\n }\n }\n return shards;\n }\n\n async function aggregateStatsShardsV7(\n shards: PersistedStatsShardV7[],\n day: string = currentLocalDay(),\n ): Promise<ShardAggregate> {\n const globalEpoch = await readGlobalStatsEpoch();\n const modelEpochs = new Map<string, string>();\n const result: ShardAggregate = {\n bySession: {},\n totalsByModel: {},\n instancesBySession: {},\n instancesBySessionModel: {},\n sessionsByModel: {},\n instancesByModel: {},\n modelRefsByKey: {},\n lastRoutedModelBySession: {},\n };\n const routedUpdatedAt = new Map<string, number>();\n const modelRefUpdatedAt = new Map<string, number>();\n const modelSessions = new Map<string, Set<string>>();\n\n for (const shard of shards) {\n if (shard.day !== day || shard.globalEpoch !== globalEpoch) continue;\n let contributed = false;\n if (shard.lastRoutedModel && (routedUpdatedAt.get(shard.sessionHash) ?? -1) < shard.lifecycle.updatedAt) {\n routedUpdatedAt.set(shard.sessionHash, shard.lifecycle.updatedAt);\n result.lastRoutedModelBySession[shard.sessionHash] = shard.lastRoutedModel;\n }\n for (const [key, entry] of Object.entries(shard.models)) {\n let epoch = modelEpochs.get(key);\n if (!epoch) {\n epoch = await readModelStatsEpoch(key);\n modelEpochs.set(key, epoch);\n }\n if (entry.modelEpoch !== epoch || entry.stats.day !== day) continue;\n contributed = true;\n const sessionModels = (result.bySession[shard.sessionHash] ??= {});\n sessionModels[key] = mergeCacheStatsForTotal(sessionModels[key], entry.stats);\n result.totalsByModel[key] = mergeCacheStatsForTotal(result.totalsByModel[key], entry.stats);\n result.instancesByModel[key] = (result.instancesByModel[key] ?? 0) + 1;\n if ((modelRefUpdatedAt.get(key) ?? -1) < shard.lifecycle.updatedAt) {\n modelRefUpdatedAt.set(key, shard.lifecycle.updatedAt);\n result.modelRefsByKey[key] = {\n provider: entry.provider,\n id: entry.modelId,\n name: entry.modelName ?? entry.modelId,\n };\n }\n const sessionInstances = (result.instancesBySessionModel[shard.sessionHash] ??= {});\n sessionInstances[key] = (sessionInstances[key] ?? 0) + 1;\n const sessions = modelSessions.get(key) ?? new Set<string>();\n sessions.add(shard.sessionHash);\n modelSessions.set(key, sessions);\n }\n if (contributed) {\n result.instancesBySession[shard.sessionHash] = (result.instancesBySession[shard.sessionHash] ?? 0) + 1;\n }\n }\n for (const [key, sessions] of modelSessions) result.sessionsByModel[key] = sessions.size;\n return result;\n }\n\n function isProcessAlive(pid: number): boolean {\n if (!Number.isInteger(pid) || pid <= 0) return false;\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return getErrorCode(error) === 'EPERM';\n }\n }\n\n async function removeLegacyStatsFiles(): Promise<void> {\n for (const path of [STATE_FILE_PATH, LEGACY_STATE_FILE_PATH]) {\n const removed = await fs.remove(path, { force: true }, io);\n if (!removed.ok) console.warn(`${LOG_PREFIX}: failed to remove obsolete stats file ${path}`, removed.error);\n }\n }\n\n async function cleanupStatsShardsV7(now = Date.now(), directory: string = SHARD_FILES_DIR): Promise<number> {\n const entries = await listDirectoryEntries(directory);\n if (!entries) return 0;\n const today = currentLocalDay();\n let removed = 0;\n for (const info of entries) {\n const { name } = info;\n const isShard = /^[0-9a-f-]+\\.json$/i.test(name);\n const isTemp = name.endsWith('.tmp');\n if (!isShard && !isTemp) continue;\n const path = join(directory, name);\n try {\n if (info.kind !== 'file') continue;\n if (isTemp) {\n if (now - info.mtimeMs < SHARD_TEMP_RETENTION_MS) continue;\n } else {\n const parsed = parsePersistedStatsShardV7(JSON.parse(getOrThrow(await fs.readTextFile(path, io))));\n if (parsed?.day === today) continue;\n const updatedAt = parsed?.lifecycle.updatedAt ?? info.mtimeMs;\n if (now - updatedAt < SHARD_RETENTION_MS) continue;\n if (parsed?.lifecycle.state === 'active' && isProcessAlive(parsed.process.pid)) continue;\n }\n getOrThrow(await fs.remove(path, undefined, io));\n removed += 1;\n } catch {\n // Best-effort maintenance must never block the extension.\n }\n }\n return removed;\n }\n\n /**\n * Best-effort cross-process maintenance. A non-recursive `createDir` claims the cleanup lock; if two\n * cleanups ever overlap, each only removes expired shards, so the lock bounds work rather than guarding\n * correctness.\n */\n async function maybeCleanupStatsShardsV7(now = Date.now()): Promise<void> {\n getOrThrow(await fs.createDir(SHARD_MAINTENANCE_DIR, { recursive: true }, io));\n const marker = await fs.fileInfo(SHARD_CLEANUP_MARKER_PATH, io);\n if (marker.ok && now - marker.value.mtimeMs < SHARD_CLEANUP_INTERVAL_MS) return;\n\n const claimed = await fs.createDir(SHARD_CLEANUP_LOCK_PATH, { recursive: false }, io);\n if (!claimed.ok) {\n // Only an existing lock may be taken over; any other failure skips this cleanup.\n const lock = await fs.fileInfo(SHARD_CLEANUP_LOCK_PATH, io);\n if (!lock.ok || now - lock.value.mtimeMs <= SHARD_CLEANUP_LOCK_STALE_MS) return;\n const removed = await fs.remove(SHARD_CLEANUP_LOCK_PATH, { recursive: true, force: true }, io);\n if (!removed.ok || !(await fs.createDir(SHARD_CLEANUP_LOCK_PATH, { recursive: false }, io)).ok) return;\n }\n\n try {\n await cleanupStatsShardsV7(now);\n await writeFileAtomic(fs, SHARD_CLEANUP_MARKER_PATH, `${now}\\n`, io);\n } finally {\n getOrThrow(await fs.remove(SHARD_CLEANUP_LOCK_PATH, { recursive: true, force: true }, io));\n }\n }\n\n function isExplicitPromptCacheRetentionUnsupportedApplicable(model: CacheModel): boolean {\n // A finalized assistant error with an explicit unsupported-parameter signal\n // proves that prompt_cache_retention reached this provider/model. Do not\n // require compat inherited from the active fallback model: router shells may\n // have no upstream compat metadata when no live routing registry is present.\n return isOpenAICompatibleApi(model.api) && !isOfficialOpenAIBaseUrl(model) && !isPiBuiltInLlamaCppModel(model);\n }\n\n function isJsonWhitespace(ch: string): boolean {\n return ch === ' ' || ch === '\\n' || ch === '\\r' || ch === '\\t';\n }\n\n function readJsonStringLiteral(text: string, pos: number): { value: string; end: number } | undefined {\n if (text[pos] !== '\"') return undefined;\n let i = pos + 1;\n let value = '';\n while (i < text.length) {\n const ch = text[i];\n if (ch === '\\\\') {\n const next = text[i + 1];\n if (next === undefined) return undefined;\n if (next === 'u') {\n const hex = text.slice(i + 2, i + 6);\n if (!/^[0-9a-fA-F]{4}$/.test(hex)) return undefined;\n value += String.fromCharCode(parseInt(hex, 16));\n i += 6;\n } else {\n if (next === 'n') value += '\\n';\n else if (next === 't') value += '\\t';\n else if (next === 'r') value += '\\r';\n else if (next === 'b') value += '\\b';\n else if (next === 'f') value += '\\f';\n else value += next; // \", \\\\, / and lenient passthrough\n i += 2;\n }\n continue;\n }\n if (ch === '\"') return { value, end: i + 1 };\n value += ch;\n i++;\n }\n return undefined;\n }\n\n function buildFixSuggestion(model: CacheModel): FixSuggestion | undefined {\n const missing = describeMissingCacheCompatForModel(model);\n if (missing.length === 0) return undefined;\n\n let compatKeys: Record<string, unknown> = {};\n\n if (isAdaptiveThinkingCompatApplicable(model)) {\n compatKeys = buildAdaptiveThinkingCompatSuggestion(missing);\n } else if (isDeepSeekCompatCheckApplicable(model)) {\n compatKeys = buildDeepSeekCompatSuggestion(missing);\n } else {\n compatKeys = buildSafeOpenAIProxyCompatSuggestion(missing);\n }\n\n if (Object.keys(compatKeys).length === 0) return undefined;\n\n const key = modelKey(model);\n const slashIdx = key.indexOf('/');\n const providerLabel = slashIdx > 0 ? key.slice(0, slashIdx) : key;\n\n return {\n providerLabel,\n modelId: model.id,\n compatKeys,\n };\n }\n\n function stripJsoncComments(text: string): string {\n const out: string[] = [];\n let i = 0;\n while (i < text.length) {\n const ch = text[i];\n\n if (ch === '\"') {\n // String literal , copy byte-for-byte until the closing quote.\n // Escaped quotes/slashes must not be mistaken for comment delimiters.\n out.push(ch);\n i++;\n while (i < text.length) {\n const sc = text[i];\n out.push(sc);\n i++;\n if (sc === '\\\\' && i < text.length) {\n out.push(text[i]);\n i++;\n } else if (sc === '\"') {\n break;\n }\n }\n continue;\n }\n\n if (ch === '/' && i + 1 < text.length && text[i + 1] === '/') {\n // Line comment , replace BOTH slashes and every comment byte with\n // spaces, but leave the newline to be copied by the normal path.\n out.push(' ', ' ');\n i += 2;\n while (i < text.length && text[i] !== '\\n') {\n out.push(' ');\n i++;\n }\n continue;\n }\n\n if (ch === '/' && i + 1 < text.length && text[i + 1] === '*') {\n // Block comment , replace every byte with a space except newlines.\n // This deliberately preserves text.length and all structural offsets.\n out.push(' ', ' ');\n i += 2;\n while (i < text.length) {\n if (text[i] === '*' && i + 1 < text.length && text[i + 1] === '/') {\n out.push(' ', ' ');\n i += 2;\n break;\n }\n out.push(text[i] === '\\n' ? '\\n' : ' ');\n i++;\n }\n continue;\n }\n\n out.push(ch);\n i++;\n }\n return out.join('');\n }\n\n function stripJsoncTrailingCommas(text: string): string {\n const chars = text.split('');\n let i = 0;\n while (i < chars.length) {\n if (chars[i] === '\"') {\n const str = readJsonStringLiteral(text, i);\n if (!str) break;\n i = str.end;\n continue;\n }\n\n if (chars[i] === ',') {\n let j = i + 1;\n while (j < chars.length && isJsonWhitespace(chars[j])) j++;\n if (chars[j] === '}' || chars[j] === ']') chars[i] = ' ';\n }\n i++;\n }\n return chars.join('');\n }\n\n function parseJsonc(text: string): unknown {\n return JSON.parse(stripJsoncTrailingCommas(stripJsoncComments(text)));\n }\n return {\n selectAdapterForModel,\n selectAdapterForAssistantMessage,\n notifyCacheCompatIfNeeded,\n buildFixSuggestion,\n hasMissingUsageFields,\n formatCacheStats,\n prefixFooterStatus,\n emptyCacheStats,\n addUsageToCacheStats,\n cloneCacheStats,\n selectFooterStatsForModel,\n findBestRouterModelStats,\n buildExactRouterStatusEntry,\n hashSessionId,\n readValidStatsShardsV7,\n aggregateStatsShardsV7,\n writeStatsShardV7,\n readGlobalStatsEpoch,\n readModelStatsEpoch,\n advanceGlobalStatsEpoch,\n advanceModelStatsEpoch,\n maybeCleanupStatsShardsV7,\n removeLegacyStatsFiles,\n createSerializedAsyncRunner: createSerialRunner,\n hasReasoningProtocolRejectionErrorMessage,\n isReasoningProtocolRejectionForModel,\n hasPromptCacheKeyUnsupportedErrorMessage,\n isPromptCacheKeyUnsupportedApplicable,\n hasPromptCacheRetentionUnsupportedErrorMessage,\n isExplicitPromptCacheRetentionUnsupportedApplicable,\n hasAnthropicCacheTtlOrderError,\n getPromptCacheRetentionUnsupportedHint,\n modelFromAssistantMessage,\n resolvePhysicalModel,\n consolidateDirectProviderStatsModel,\n footerStatsMode,\n currentLocalDay,\n modelKey,\n initialEpoch,\n parsePersistedStatsShardV7,\n cleanupStatsShardsV7,\n readEffectiveCompatConfig,\n refreshFileConfig,\n getCompat,\n SHARD_FILES_DIR,\n LOG_PREFIX,\n };\n}\n","/*\n * Adapted from pi-cache-optimizer 2.8.16, https://github.com/jiangge/pi-cache-optimizer\n * Reachable cache statistics and diagnostics only. Native lifecycle is owned by Po.\n * MIT License\n *\n * Copyright (c) 2026 freescheme\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport { randomUUID } from 'node:crypto';\nimport { join } from 'node:path';\n\nimport type { PoHeadlessExecutionContext, PoHeadlessHook, PoHeadlessModelMetadata } from '@agimon-ai/po-core/headless';\nimport type { FileSystem } from '@agimon-ai/po-core/platform';\n\nimport { defaultAgentDirectory } from '../agentDirectory';\nimport { acquireEnvironmentValue } from '../environment';\nimport { createOptimizerSupport } from '../optimizerSupport';\nimport type { CacheModel, CacheStats, PersistedRoutedModelRef, PersistedStatsShardV7 } from '../optimizerSupport/type';\n\nconst STATUS_KEY = 'pi-cache-stats';\nconst PERSIST_DEBOUNCE_MS = 2000;\nconst MAX_RECENT_SAMPLES = 50;\n\nfunction asModel(model: PoHeadlessModelMetadata | undefined): CacheModel | undefined {\n return model\n ? { ...model, api: model.api ?? '', name: model.name ?? model.id, baseUrl: model.baseUrl ?? '' }\n : undefined;\n}\n\n/** One native session owner. Only V7 counters, never payloads or credentials, reach disk. */\nexport function createNativeOptimizer(\n initial: PoHeadlessExecutionContext,\n fs: FileSystem,\n stateDir = defaultAgentDirectory(),\n) {\n const support = createOptimizerSupport(stateDir, initial.environment, fs);\n const serialized = support.createSerializedAsyncRunner();\n const instanceId = randomUUID();\n const instanceStartedAt = Date.now();\n const sessionHash = support.hashSessionId(initial.sessionId);\n const shardPath = join(support.SHARD_FILES_DIR, `${instanceId}.json`);\n let currentGlobalEpoch = support.initialEpoch('global');\n const modelEpochs = new Map<string, string>();\n const models = new Map<string, CacheModel>();\n let processStats: Record<string, CacheStats> = {};\n let bySession: Record<string, CacheStats> = {};\n let totals: Record<string, CacheStats> = {};\n let lastRoutedModel: PersistedRoutedModelRef | undefined;\n let lastStatus: string | undefined;\n let shardCreatedAt = Date.now();\n let persistTimer: ReturnType<typeof setTimeout> | undefined;\n let releaseRetention: (() => void) | undefined;\n let started = false;\n let closed = false;\n let persistenceWarningShown = false;\n const warnedModels = new Set<string>();\n const warnedErrors = new Set<string>();\n const recentSamples = new Map<\n string,\n {\n timestamp: number;\n hit: boolean;\n cachedInputTokens: number;\n cacheWriteInputTokens: number;\n totalInputTokens: number;\n missingUsageFields: boolean;\n }[]\n >();\n\n const notify = (context: PoHeadlessExecutionContext, body: string): void => {\n void context.client.notify({ body, level: 'warning' });\n };\n\n function buildShard(state: 'active' | 'closed' = 'active'): PersistedStatsShardV7 {\n const entries: PersistedStatsShardV7['models'] = {};\n for (const [key, stats] of Object.entries(processStats)) {\n const model = models.get(key);\n if (!model) continue;\n entries[key] = {\n modelEpoch: modelEpochs.get(key) ?? support.initialEpoch(`model:${key}`),\n provider: model.provider,\n modelId: model.id,\n modelName: model.name,\n ...(model.api ? { api: model.api } : {}),\n stats: support.cloneCacheStats(stats),\n };\n }\n const now = Date.now();\n return {\n version: 7,\n kind: 'pi-cache-optimizer-shard',\n instanceId,\n sessionHash,\n process: { pid: process.pid, ppid: process.ppid, instanceStartedAt },\n lifecycle: { state, createdAt: shardCreatedAt, updatedAt: now, ...(state === 'closed' ? { closedAt: now } : {}) },\n day: support.currentLocalDay(),\n globalEpoch: currentGlobalEpoch,\n models: entries,\n ...(lastRoutedModel ? { lastRoutedModel: { ...lastRoutedModel } } : {}),\n };\n }\n\n async function refresh(): Promise<void> {\n const shards = (await support.readValidStatsShardsV7()).filter((shard) => shard.instanceId !== instanceId);\n if (started) shards.push(buildShard());\n const aggregate = await support.aggregateStatsShardsV7(shards);\n const epoch = await support.readGlobalStatsEpoch();\n if (epoch !== currentGlobalEpoch) {\n currentGlobalEpoch = epoch;\n processStats = {};\n modelEpochs.clear();\n models.clear();\n lastRoutedModel = undefined;\n } else {\n for (const key of Object.keys(processStats)) {\n const latest = await support.readModelStatsEpoch(key);\n if ((modelEpochs.get(key) ?? support.initialEpoch(`model:${key}`)) === latest) continue;\n delete processStats[key];\n modelEpochs.set(key, latest);\n models.delete(key);\n }\n }\n bySession = {};\n for (const [hash, stats] of Object.entries(aggregate.bySession)) {\n for (const [key, value] of Object.entries(stats)) bySession[`${hash}:${key}`] = value;\n }\n totals = aggregate.totalsByModel;\n lastRoutedModel = aggregate.lastRoutedModelBySession[sessionHash];\n lastStatus = undefined;\n }\n\n async function persist(context: PoHeadlessExecutionContext, state: 'active' | 'closed' = 'active'): Promise<void> {\n try {\n await support.writeStatsShardV7(shardPath, buildShard(state));\n } catch (error) {\n console.warn(`${support.LOG_PREFIX}: failed to persist cache stats shard`, error);\n if (!persistenceWarningShown) {\n persistenceWarningShown = true;\n notify(\n context,\n `${support.LOG_PREFIX}: failed to persist footer stats; using in-memory stats for this process.`,\n );\n }\n }\n }\n\n async function flush(context: PoHeadlessExecutionContext, state: 'active' | 'closed' = 'active'): Promise<void> {\n if (persistTimer) clearTimeout(persistTimer);\n persistTimer = undefined;\n await refresh();\n await persist(context, state);\n await refresh();\n }\n\n function schedulePersist(context: PoHeadlessExecutionContext): void {\n if (persistTimer) clearTimeout(persistTimer);\n persistTimer = setTimeout(() => {\n persistTimer = undefined;\n void serialized(async () => {\n if (!closed) {\n await persist(context);\n await refresh();\n }\n }).catch((error) => notify(context, `Cache stats refresh failed: ${String(error)}`));\n }, PERSIST_DEBOUNCE_MS);\n persistTimer.unref?.();\n }\n\n async function rollover(context: PoHeadlessExecutionContext): Promise<void> {\n const day = support.currentLocalDay();\n let changed = false;\n for (const key of Object.keys(processStats)) {\n if (processStats[key]?.day !== day) {\n processStats[key] = support.emptyCacheStats(day);\n changed = true;\n }\n }\n if (changed) {\n shardCreatedAt = Date.now();\n lastStatus = undefined;\n await flush(context);\n }\n }\n\n function selectedModel(context: PoHeadlessExecutionContext): CacheModel | undefined {\n const selected = asModel(context.model);\n if (selected?.api === 'pi-virtual' && lastRoutedModel) {\n const physical = models.get(support.modelKey(lastRoutedModel)) ?? {\n ...lastRoutedModel,\n name: lastRoutedModel.name ?? lastRoutedModel.id,\n api: '',\n baseUrl: '',\n };\n return support.resolvePhysicalModel(physical, asModel(context.getModel?.(physical.provider, physical.id)));\n }\n return selected;\n }\n\n async function publish(context: PoHeadlessExecutionContext, model = selectedModel(context)): Promise<void> {\n await rollover(context);\n const adapter = support.selectAdapterForModel(model);\n const mode = support.footerStatsMode();\n let status: string | undefined;\n if (adapter && model) {\n const stats = support.selectFooterStatsForModel(mode, sessionHash, bySession, totals, model, processStats);\n status = support.formatCacheStats(adapter, stats ?? support.emptyCacheStats());\n if (support.buildFixSuggestion(model)) status += ' ⚠️ compat';\n } else if (context.model?.api === 'pi-virtual' || context.model?.provider === 'router') {\n if (lastStatus !== undefined) return;\n const entry =\n support.buildExactRouterStatusEntry(sessionHash, bySession, lastRoutedModel, totals, mode, processStats) ??\n support.findBestRouterModelStats(mode, sessionHash, bySession, totals, processStats);\n if (entry) status = support.formatCacheStats(entry.adapter, entry.stats);\n }\n status = support.prefixFooterStatus(status);\n if (status === lastStatus) return;\n lastStatus = status;\n context.client.setStatus(STATUS_KEY, status);\n }\n\n function diagnose(message: unknown, model: CacheModel | undefined, context: PoHeadlessExecutionContext): void {\n if (!model) return;\n const key = support.modelKey(model);\n const observations: [string, boolean, string][] = [\n [\n 'reasoning',\n support.hasReasoningProtocolRejectionErrorMessage(message) &&\n support.isReasoningProtocolRejectionForModel(message, model),\n `${key} returned a reasoning-protocol rejection. Review model-scoped thinkingFormat and supportsReasoningEffort compat. No configuration was changed automatically.`,\n ],\n [\n 'key',\n support.hasPromptCacheKeyUnsupportedErrorMessage(message) &&\n support.isPromptCacheKeyUnsupportedApplicable(model),\n `${key} rejected prompt_cache_key. Review a precise model-scoped repair. No configuration was changed automatically.`,\n ],\n [\n 'retention',\n support.hasPromptCacheRetentionUnsupportedErrorMessage(message) &&\n support.isExplicitPromptCacheRetentionUnsupportedApplicable(model),\n `${key} rejected prompt_cache_retention. ${support.getPromptCacheRetentionUnsupportedHint()}`,\n ],\n [\n 'ttl',\n support.hasAnthropicCacheTtlOrderError(message) && model.api === 'anthropic-messages',\n `${key} returned an Anthropic cache-control TTL ordering error. Review model-level supportsLongCacheRetention: false. No configuration was changed automatically.`,\n ],\n ];\n for (const [kind, applicable, text] of observations) {\n const observationKey = `${kind}:${key}`;\n if (!applicable || warnedErrors.has(observationKey)) continue;\n warnedErrors.add(observationKey);\n notify(context, `⚠️ ${support.LOG_PREFIX}: ${text}`);\n }\n }\n\n async function observe(message: unknown, context: PoHeadlessExecutionContext): Promise<void> {\n const record = typeof message === 'object' && message !== null ? (message as Record<string, unknown>) : {};\n const active = asModel(context.model);\n // Native virtual messages carry the dispatched catalog id in model. responseModel\n // may be an echoed alias that the registry does not know.\n const nativeVirtual = active?.api === 'pi-virtual';\n const identity = support.modelFromAssistantMessage(\n nativeVirtual ? { ...record, responseModel: record.model ?? record.responseModel } : message,\n active,\n );\n const registered = identity && asModel(context.getModel?.(identity.provider, identity.id));\n let model = nativeVirtual && identity ? support.resolvePhysicalModel(identity, registered) : registered || identity;\n diagnose(message, model, context);\n if (record.stopReason === 'error' || record.stopReason === 'aborted') return;\n model = support.consolidateDirectProviderStatsModel(model, active);\n const adapter =\n (nativeVirtual && model ? support.selectAdapterForModel(model) : undefined) ??\n support.selectAdapterForAssistantMessage(message, model ?? active);\n if (!adapter) return;\n const usage = adapter.normalizeUsage(message);\n let routeChanged = false;\n if (model && (active?.api === 'pi-virtual' || active?.provider === 'router')) {\n const next = { provider: model.provider, id: model.id, name: model.name };\n routeChanged = JSON.stringify(lastRoutedModel) !== JSON.stringify(next);\n lastRoutedModel = next;\n }\n if (model) {\n const key = support.modelKey(model);\n const samples = recentSamples.get(key) ?? [];\n samples.push({\n timestamp: Date.now(),\n hit: (usage?.cacheRead ?? 0) > 0,\n cachedInputTokens: usage?.cacheRead ?? 0,\n cacheWriteInputTokens: usage?.cacheWrite ?? 0,\n totalInputTokens: usage?.totalInput ?? 0,\n missingUsageFields:\n !usage ||\n (usage.cacheRead === 0 && usage.cacheWrite === 0 && usage.totalInput === 0) ||\n support.hasMissingUsageFields(message, adapter),\n });\n if (samples.length > MAX_RECENT_SAMPLES) samples.splice(0, samples.length - MAX_RECENT_SAMPLES);\n recentSamples.set(key, samples);\n }\n if (!usage) {\n if (routeChanged) schedulePersist(context);\n return;\n }\n await rollover(context);\n if (model) {\n const key = support.modelKey(model);\n const globalEpoch = await support.readGlobalStatsEpoch();\n const modelEpoch = await support.readModelStatsEpoch(key);\n if (globalEpoch !== currentGlobalEpoch) {\n currentGlobalEpoch = globalEpoch;\n processStats = {};\n modelEpochs.clear();\n }\n if (modelEpochs.get(key) !== modelEpoch) {\n delete processStats[key];\n modelEpochs.set(key, modelEpoch);\n }\n models.set(key, model);\n support.addUsageToCacheStats((processStats[key] ??= support.emptyCacheStats()), usage);\n }\n schedulePersist(context);\n await refresh();\n await publish(context, model);\n }\n\n async function shutdown(context: PoHeadlessExecutionContext): Promise<void> {\n if (closed) return;\n closed = true;\n try {\n if (started) await flush(context, 'closed');\n } finally {\n if (persistTimer) clearTimeout(persistTimer);\n persistTimer = undefined;\n releaseRetention?.();\n releaseRetention = undefined;\n context.client.setStatus(STATUS_KEY, undefined);\n }\n }\n\n const hooks: PoHeadlessHook[] = [\n {\n event: 'session_start',\n handle: (_event, context) =>\n serialized(async () => {\n if (started || closed) return;\n started = true;\n releaseRetention = acquireEnvironmentValue('PI_CACHE_RETENTION', 'long');\n await support.refreshFileConfig();\n currentGlobalEpoch = await support.readGlobalStatsEpoch();\n await support.removeLegacyStatsFiles();\n await refresh();\n await flush(context);\n await support.maybeCleanupStatsShardsV7();\n await refresh();\n await publish(context);\n }),\n },\n {\n event: 'tool_execution_end',\n handle: (event, context) =>\n serialized(async () => {\n if (typeof event.parentToolCallId === 'string' && event.parentToolCallId.trim()) return;\n if (started && !closed) {\n await support.refreshFileConfig();\n await refresh();\n await publish(context);\n }\n }),\n },\n {\n event: 'agent_settled',\n handle: (_event, context) =>\n serialized(async () => {\n if (started && !closed) {\n await support.refreshFileConfig();\n await refresh();\n await publish(context);\n }\n }),\n },\n {\n event: 'model_select',\n handle: (_event, context) =>\n serialized(async () => {\n if (!started || closed) return;\n await support.refreshFileConfig();\n const model = selectedModel(context);\n support.notifyCacheCompatIfNeeded(model, (text) => notify(context, text), warnedModels);\n await refresh();\n await publish(context, model);\n }),\n },\n {\n event: 'message_end',\n handle: (event, context) =>\n serialized(async () => {\n if (!started || closed) return;\n await support.refreshFileConfig();\n await observe(event.message, context);\n }),\n },\n { event: 'session_shutdown', handle: (_event, context) => serialized(() => shutdown(context)) },\n ];\n return {\n hooks,\n dispose: () => serialized(() => shutdown(initial)),\n snapshot: () => ({ sessionHash, processStats, bySession, totals, recentSamples }),\n };\n}\n","import { defineRoot } from '@agimon-ai/po-core/extensionFile';\nimport { requirePoFs } from '@agimon-ai/po-core/platform';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport { PromptCacheTelemetry } from '../../../../models/promptCacheTelemetry';\nimport { createCacheRuntime } from '../../../../services/cacheRuntime';\nimport { createNativeOptimizer } from '../../../../services/nativeOptimizer';\nimport { PromptCacheTelemetryService } from '../../../../services/promptCacheTelemetry';\n\nexport default defineRoot(({ agent, context: root }: PoServerPluginContext) => {\n if (!agent) throw new Error('Cache statistics require the native session host.');\n const telemetry = new PromptCacheTelemetry();\n const runtime = createCacheRuntime({ telemetry, now: Date.now }, agent.context.environment);\n const optimizer = createNativeOptimizer(agent.context, requirePoFs(root));\n return {\n value: {\n hooks: optimizer.hooks.map((hook) => {\n if (hook.event === 'session_start')\n return {\n ...hook,\n async handle(event, context) {\n await runtime.events.session_start(event, context);\n await hook.handle(event, context);\n },\n } satisfies typeof hook;\n if (hook.event === 'message_end')\n return {\n ...hook,\n async handle(event, context) {\n runtime.events.message_end(event, context);\n await hook.handle(event, context);\n },\n } satisfies typeof hook;\n return hook;\n }),\n },\n services: [\n (context) => {\n new PromptCacheTelemetryService(context, telemetry);\n },\n runtime.plugin,\n ],\n async onDispose() {\n try {\n await optimizer.dispose();\n } finally {\n runtime.dispose();\n }\n },\n };\n});\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\ntype CacheServerScope = Awaited<ReturnType<typeof import('../root.server').default>>['value'];\nexport default defineHook((context: WithRoot<PoServerPluginContext, CacheServerScope>) =>\n context.root.hooks.find((hook) => hook.event === 'agent_settled')!,\n);\n","import { type PoHeadlessHook } from '@agimon-ai/po-core/headless';\n\nimport { canonicalJson } from '../../../../../services/canonical';\nimport { sha256Base64Url } from '../../../../../services/digest';\nimport { createPromptCacheKey, createPromptCacheModelFingerprint } from '../../../../../services/namespace';\nimport { rewritePromptCacheKey } from '../../../../../services/providerPolicy';\nimport type { PromptCacheModelIdentity } from '../../../../../types/cache';\n\nfunction record(value: unknown): Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Readonly<Record<string, unknown>>)\n : {};\n}\n\nfunction modelIdentity(\n model: { provider: string; id: string; api?: string } | undefined,\n payload: unknown,\n): PromptCacheModelIdentity {\n const request = record(payload);\n return {\n virtualProvider: model?.provider,\n virtualModel: model?.id,\n api: model?.api,\n wireModel: typeof request.model === 'string' ? request.model : undefined,\n };\n}\n\nfunction cacheNamespace(context: { sessionId: string; selection: Record<string, unknown> }): string {\n return `dph_${sha256Base64Url(canonicalJson({ version: 1, session: context.sessionId, selection: context.selection }))}`;\n}\n\nexport const cacheHooks: PoHeadlessHook[] = [\n {\n event: 'before_provider_request',\n handle(event, execution) {\n const payload = record(event.payload);\n const identity = modelIdentity(event.model, payload);\n const modelFingerprint = createPromptCacheModelFingerprint(identity, sha256Base64Url);\n const key = createPromptCacheKey(\n cacheNamespace({\n sessionId: execution.sessionId,\n selection: execution.selection as unknown as Record<string, unknown>,\n }),\n 'parent',\n modelFingerprint,\n sha256Base64Url,\n );\n const rewritten = rewritePromptCacheKey(payload, identity.api, key, true);\n return rewritten === undefined ? undefined : { payload: rewritten };\n },\n },\n];\n","import { defineHook } from '@agimon-ai/po-core/extensionFile';\n\nimport { cacheHooks } from '../_lib/cacheHooks';\nexport default defineHook(cacheHooks.find((hook) => hook.event === 'before_provider_request')!);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\ntype CacheServerScope = Awaited<ReturnType<typeof import('../root.server').default>>['value'];\nexport default defineHook((context: WithRoot<PoServerPluginContext, CacheServerScope>) =>\n context.root.hooks.find((hook) => hook.event === 'message_end')!,\n);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\ntype CacheServerScope = Awaited<ReturnType<typeof import('../root.server').default>>['value'];\nexport default defineHook((context: WithRoot<PoServerPluginContext, CacheServerScope>) =>\n context.root.hooks.find((hook) => hook.event === 'model_select')!,\n);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\ntype CacheServerScope = Awaited<ReturnType<typeof import('../root.server').default>>['value'];\nexport default defineHook((context: WithRoot<PoServerPluginContext, CacheServerScope>) =>\n context.root.hooks.find((hook) => hook.event === 'session_shutdown')!,\n);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\ntype CacheServerScope = Awaited<ReturnType<typeof import('../root.server').default>>['value'];\nexport default defineHook((context: WithRoot<PoServerPluginContext, CacheServerScope>) =>\n context.root.hooks.find((hook) => hook.event === 'session_start')!,\n);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\ntype CacheServerScope = Awaited<ReturnType<typeof import('../root.server').default>>['value'];\nexport default defineHook((context: WithRoot<PoServerPluginContext, CacheServerScope>) =>\n context.root.hooks.find((hook) => hook.event === 'tool_execution_end')!,\n);\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineServerPlugin, type PoServerSessionPlugin } from '@agimon-ai/po-core/serverPlugin';\nimport { composeServerProviderOverrides } from '@agimon-ai/po-core/serverPlugin';\nimport { composeRootHooks, composeRootInjects } from '@agimon-ai/po-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport hookAgentSettled from '../src/extensions/workspaces/sessions/(backend)/hook/agent-settled.server';\nimport hookBeforeProviderRequest from '../src/extensions/workspaces/sessions/(backend)/hook/before-provider-request.server';\nimport hookMessageEnd from '../src/extensions/workspaces/sessions/(backend)/hook/message-end.server';\nimport hookModelSelect from '../src/extensions/workspaces/sessions/(backend)/hook/model-select.server';\nimport hookSessionShutdown from '../src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server';\nimport hookSessionStart from '../src/extensions/workspaces/sessions/(backend)/hook/session-start.server';\nimport hookToolExecutionEnd from '../src/extensions/workspaces/sessions/(backend)/hook/tool-execution-end.server';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const serverPlugin = defineServerPlugin({\n name: '@agimon-ai/po-cache',\n providerOverrides: composeServerProviderOverrides(rootSession),\n injects: composeRootInjects({ session: [rootSession] }),\n session: async (context) => {\n const scopeSession = await context.scopeRoot('session', rootSession, context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get hooks(): PoServerSessionPlugin['hooks'] { return [via({ event: 'agent_settled' }, at(hookAgentSettled, contextSession)), via({ event: 'before_provider_request' }, at(hookBeforeProviderRequest, contextSession)), via({ event: 'message_end' }, at(hookMessageEnd, contextSession)), via({ event: 'model_select' }, at(hookModelSelect, contextSession)), via({ event: 'session_shutdown' }, at(hookSessionShutdown, contextSession)), via({ event: 'session_start' }, at(hookSessionStart, contextSession)), via({ event: 'tool_execution_end' }, at(hookToolExecutionEnd, contextSession))]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): PoServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default serverPlugin;\n"],"mappings":"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"}