@agimon-ai/doompi-cache 0.0.1-alpha.38 → 0.0.1-alpha.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api-contracts.cjs +7 -1
- package/dist/api-contracts.d.cts +1 -1
- package/dist/api-contracts.d.mts +1 -1
- package/dist/api-contracts.mjs +2 -1
- package/dist/env.cjs +7 -1
- package/dist/env.d.cts +1 -1
- package/dist/env.d.mts +1 -1
- package/dist/env.mjs +2 -1
- package/dist/extensions/pi.cjs +458 -1
- package/dist/extensions/pi.cjs.map +1 -1
- package/dist/extensions/pi.d.cts +3 -4
- package/dist/extensions/pi.d.cts.map +1 -1
- package/dist/extensions/pi.d.mts +3 -4
- package/dist/extensions/pi.d.mts.map +1 -1
- package/dist/extensions/pi.mjs +453 -1
- package/dist/extensions/pi.mjs.map +1 -1
- package/dist/extensions/server.cjs +23 -1
- package/dist/extensions/server.cjs.map +1 -1
- package/dist/extensions/server.d.cts +3 -3
- package/dist/extensions/server.d.cts.map +1 -1
- package/dist/extensions/server.d.mts +3 -3
- package/dist/extensions/server.d.mts.map +1 -1
- package/dist/extensions/server.mjs +18 -1
- package/dist/extensions/server.mjs.map +1 -1
- package/dist/index.cjs +22 -1
- package/dist/index.d.cts +7 -7
- package/dist/index.d.mts +7 -7
- package/dist/index.mjs +7 -1
- package/dist/pi-cache-optimizer-D5NlAlHL.cjs +7915 -0
- package/dist/{pi-cache-optimizer-DwxMItZw.cjs.map → pi-cache-optimizer-D5NlAlHL.cjs.map} +1 -1
- package/dist/pi-cache-optimizer-D8Cz8JHJ.mjs +7914 -0
- package/dist/{pi-cache-optimizer-Bw8uQdb8.mjs.map → pi-cache-optimizer-D8Cz8JHJ.mjs.map} +1 -1
- package/dist/src/constants/environment.cjs +14 -0
- package/dist/src/constants/environment.cjs.map +1 -0
- package/dist/src/constants/environment.d.cts.map +1 -0
- package/dist/src/constants/environment.d.mts.map +1 -0
- package/dist/src/constants/environment.mjs +10 -0
- package/dist/src/constants/environment.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/cacheHooks.cjs +47 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/cacheHooks.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/cacheHooks.mjs +47 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/cacheHooks.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/before-provider-request.server.cjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/before-provider-request.server.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/before-provider-request.server.mjs +8 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/before-provider-request.server.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.cjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.mjs +8 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.mjs.map +1 -0
- package/dist/src/models/promptCacheTelemetry.cjs +45 -0
- package/dist/src/models/promptCacheTelemetry.cjs.map +1 -0
- package/dist/src/models/promptCacheTelemetry.d.cts.map +1 -0
- package/dist/src/models/promptCacheTelemetry.d.mts.map +1 -0
- package/dist/src/models/promptCacheTelemetry.mjs +45 -0
- package/dist/src/models/promptCacheTelemetry.mjs.map +1 -0
- package/dist/src/schemas/apiContracts.cjs +13 -0
- package/dist/src/schemas/apiContracts.cjs.map +1 -0
- package/dist/{schemas → src/schemas}/apiContracts.d.cts.map +1 -1
- package/dist/{schemas → src/schemas}/apiContracts.d.mts.map +1 -1
- package/dist/src/schemas/apiContracts.mjs +13 -0
- package/dist/src/schemas/apiContracts.mjs.map +1 -0
- package/dist/src/services/canonical/index.cjs +28 -0
- package/dist/src/services/canonical/index.cjs.map +1 -0
- package/dist/src/services/canonical/index.d.cts.map +1 -0
- package/dist/src/services/canonical/index.d.mts.map +1 -0
- package/dist/src/services/canonical/index.mjs +27 -0
- package/dist/src/services/canonical/index.mjs.map +1 -0
- package/dist/src/services/digest/index.cjs +9 -0
- package/dist/src/services/digest/index.cjs.map +1 -0
- package/dist/{services → src/services}/digest/index.d.cts.map +1 -1
- package/dist/{services → src/services}/digest/index.d.mts.map +1 -1
- package/dist/src/services/digest/index.mjs +9 -0
- package/dist/src/services/digest/index.mjs.map +1 -0
- package/dist/src/services/namespace/index.cjs +78 -0
- package/dist/src/services/namespace/index.cjs.map +1 -0
- package/dist/src/services/namespace/index.d.cts.map +1 -0
- package/dist/src/services/namespace/index.d.mts.map +1 -0
- package/dist/src/services/namespace/index.mjs +74 -0
- package/dist/src/services/namespace/index.mjs.map +1 -0
- package/dist/src/services/promptCacheTelemetry/index.cjs +22 -0
- package/dist/src/services/promptCacheTelemetry/index.cjs.map +1 -0
- package/dist/src/services/promptCacheTelemetry/index.d.cts.map +1 -0
- package/dist/src/services/promptCacheTelemetry/index.d.mts.map +1 -0
- package/dist/src/services/promptCacheTelemetry/index.mjs +20 -0
- package/dist/src/services/promptCacheTelemetry/index.mjs.map +1 -0
- package/dist/src/services/providerPolicy/index.cjs +43 -0
- package/dist/src/services/providerPolicy/index.cjs.map +1 -0
- package/dist/src/services/providerPolicy/index.d.cts.map +1 -0
- package/dist/src/services/providerPolicy/index.d.mts.map +1 -0
- package/dist/src/services/providerPolicy/index.mjs +41 -0
- package/dist/src/services/providerPolicy/index.mjs.map +1 -0
- package/dist/src/types/cache.d.cts.map +1 -0
- package/dist/src/types/cache.d.mts.map +1 -0
- package/package.json +8 -7
- package/dist/constants/environment.cjs +0 -2
- package/dist/constants/environment.cjs.map +0 -1
- package/dist/constants/environment.d.cts.map +0 -1
- package/dist/constants/environment.d.mts.map +0 -1
- package/dist/constants/environment.mjs +0 -2
- package/dist/constants/environment.mjs.map +0 -1
- package/dist/controllers/cacheHooks.cjs +0 -2
- package/dist/controllers/cacheHooks.cjs.map +0 -1
- package/dist/controllers/cacheHooks.mjs +0 -2
- package/dist/controllers/cacheHooks.mjs.map +0 -1
- package/dist/models/promptCacheTelemetry.cjs +0 -2
- package/dist/models/promptCacheTelemetry.cjs.map +0 -1
- package/dist/models/promptCacheTelemetry.d.cts.map +0 -1
- package/dist/models/promptCacheTelemetry.d.mts.map +0 -1
- package/dist/models/promptCacheTelemetry.mjs +0 -2
- package/dist/models/promptCacheTelemetry.mjs.map +0 -1
- package/dist/pi-cache-optimizer-Bw8uQdb8.mjs +0 -65
- package/dist/pi-cache-optimizer-DwxMItZw.cjs +0 -65
- package/dist/schemas/apiContracts.cjs +0 -2
- package/dist/schemas/apiContracts.cjs.map +0 -1
- package/dist/schemas/apiContracts.mjs +0 -2
- package/dist/schemas/apiContracts.mjs.map +0 -1
- package/dist/services/canonical/index.cjs +0 -2
- package/dist/services/canonical/index.cjs.map +0 -1
- package/dist/services/canonical/index.d.cts.map +0 -1
- package/dist/services/canonical/index.d.mts.map +0 -1
- package/dist/services/canonical/index.mjs +0 -2
- package/dist/services/canonical/index.mjs.map +0 -1
- package/dist/services/digest/index.cjs +0 -2
- package/dist/services/digest/index.cjs.map +0 -1
- package/dist/services/digest/index.mjs +0 -2
- package/dist/services/digest/index.mjs.map +0 -1
- package/dist/services/namespace/index.cjs +0 -2
- package/dist/services/namespace/index.cjs.map +0 -1
- package/dist/services/namespace/index.d.cts.map +0 -1
- package/dist/services/namespace/index.d.mts.map +0 -1
- package/dist/services/namespace/index.mjs +0 -2
- package/dist/services/namespace/index.mjs.map +0 -1
- package/dist/services/promptCacheTelemetry/index.cjs +0 -2
- package/dist/services/promptCacheTelemetry/index.cjs.map +0 -1
- package/dist/services/promptCacheTelemetry/index.d.cts.map +0 -1
- package/dist/services/promptCacheTelemetry/index.d.mts.map +0 -1
- package/dist/services/promptCacheTelemetry/index.mjs +0 -2
- package/dist/services/promptCacheTelemetry/index.mjs.map +0 -1
- package/dist/services/providerPolicy/index.cjs +0 -2
- package/dist/services/providerPolicy/index.cjs.map +0 -1
- package/dist/services/providerPolicy/index.d.cts.map +0 -1
- package/dist/services/providerPolicy/index.d.mts.map +0 -1
- package/dist/services/providerPolicy/index.mjs +0 -2
- package/dist/services/providerPolicy/index.mjs.map +0 -1
- package/dist/types/cache.d.cts.map +0 -1
- package/dist/types/cache.d.mts.map +0 -1
- /package/dist/{constants → src/constants}/environment.d.cts +0 -0
- /package/dist/{constants → src/constants}/environment.d.mts +0 -0
- /package/dist/{models → src/models}/promptCacheTelemetry.d.cts +0 -0
- /package/dist/{models → src/models}/promptCacheTelemetry.d.mts +0 -0
- /package/dist/{schemas → src/schemas}/apiContracts.d.cts +0 -0
- /package/dist/{schemas → src/schemas}/apiContracts.d.mts +0 -0
- /package/dist/{services → src/services}/canonical/index.d.cts +0 -0
- /package/dist/{services → src/services}/canonical/index.d.mts +0 -0
- /package/dist/{services → src/services}/digest/index.d.cts +0 -0
- /package/dist/{services → src/services}/digest/index.d.mts +0 -0
- /package/dist/{services → src/services}/namespace/index.d.cts +0 -0
- /package/dist/{services → src/services}/namespace/index.d.mts +0 -0
- /package/dist/{services → src/services}/promptCacheTelemetry/index.d.cts +0 -0
- /package/dist/{services → src/services}/promptCacheTelemetry/index.d.mts +0 -0
- /package/dist/{services → src/services}/providerPolicy/index.d.cts +0 -0
- /package/dist/{services → src/services}/providerPolicy/index.d.mts +0 -0
- /package/dist/{types → src/types}/cache.d.cts +0 -0
- /package/dist/{types → src/types}/cache.d.mts +0 -0
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
let e=require("node:crypto"),t=require("node:fs/promises"),n=require("node:fs"),r=require("node:os"),i=require("node:path"),a=require("@earendil-works/pi-coding-agent");const o=`PI_CACHE_RETENTION`,s=`long`,c=Symbol.for(`pi.cache.optimizer.retention-baseline.v1`),l=Symbol(`pi-cache-optimizer.routed-fallback-model`);function u(e=process.env){return{wasSet:Object.prototype.hasOwnProperty.call(e,o),value:e[o]}}function d(e=process.env){(!e[o]||e[o]!==s)&&(e[o]=s)}function f(e,t=process.env){e.wasSet?t[o]=e.value:delete t[o]}function p(e){if(typeof e!=`object`||!e)return!1;let t=e;if(t.version!==1||typeof t.snapshot!=`object`||t.snapshot===null)return!1;let n=t.snapshot;return typeof n.wasSet==`boolean`&&(n.value===void 0||typeof n.value==`string`)}function m(e=process.env,t=globalThis){let n=t[c];if(p(n))return{...n.snapshot};let r=u(e);return t[c]={version:1,snapshot:{...r}},r}const h=m();d();const g=`pi-cache-optimizer`,_=(0,a.getAgentDir)(),v=(0,i.join)(_,`pi-cache-optimizer-stats.json`),y=(0,i.join)(_,`deepseek-cache-optimizer-stats.json`),ee=(0,i.join)(_,`pi-cache-optimizer-stats.d`),b=(0,i.join)(ee,`shards`),x=(0,i.join)(ee,`epochs`),te=(0,i.join)(x,`models`),ne=(0,i.join)(ee,`maintenance`),S=(0,i.join)(x,`global.json`),C=(0,i.join)(ne,`cleanup.lock`),w=(0,i.join)(ne,`last-cleanup`),T=(0,i.join)(_,`pi-cache-optimizer-config.json`),E=`pi-cache-optimizer-fix-receipt.json`,re=(0,i.join)(_,E),D=(0,i.join)(_,`pi-cache-optimizer-models-transaction.lock`),ie=[`deepseek`,`openai`,`claude`,`gemini`],ae=`PI_CACHE_OPTIMIZER_NO_PROMPT_REWRITE`,oe=`PI_CACHE_OPTIMIZER_TOOL_ORDER`,se=`PI_CACHE_OPTIMIZER_FOOTER_MODE`,ce=new Set([`sendSessionAffinityHeaders`,`supportsLongCacheRetention`,`requiresReasoningContentOnAssistantMessages`,`forceAdaptiveThinking`,`allowEmptySignature`,`thinkingFormat`,`supportsReasoningEffort`]),le=Symbol.for(`pi.routing.registry.v1`),ue=Symbol.for(`pi.cache.hints.v1`),de=Symbol.for(`pi.cache.optimizer.hints-owner.v1`),fe=Symbol.for(`pi.cache.optimizer.anthropic-ttl-fallback.v1`),pe=Symbol.for(`pi.cache.optimizer.reasoning-protocol-fallback.v1`);function me(){let e=globalThis,t=e[pe];if(t?.version===1&&t.modelKeys instanceof Set&&t.warnedModelKeys instanceof Set)return t;let n={version:1,modelKeys:new Set,warnedModelKeys:new Set};return e[pe]=n,n}function he(){let e=globalThis,t=e[fe];if(t?.version===1&&t.modelKeys instanceof Set&&t.warnedModelKeys instanceof Set)return t;let n={version:1,modelKeys:new Set,warnedModelKeys:new Set};return e[fe]=n,n}let O=!0,ge=!1,_e=0;function ve(){return _e}const ye=[`model`,`name`],be=/(^|[/\s:_-])o[1345]($|[-_.:/\s])/,xe=/(^|[/\s:_-])xai($|[-_.:/\s])/,Se=/(^|[/\s:_-])mi-?mo($|[-_.:/\s])/i,Ce=/(^|[/\s:_-])pplx($|[-_.:/\s])/i,we=/(^|[/\s:_-])nova($|[-_.:/\s])/i,k=/(^|[/\s:_-])mpt($|[-_.:/\s])/i,Te=/(^|[/\s:_-])aleph($|[-_.:/\s])/i,Ee=/(^|[\/\s:_-])arctic($|[\-_.:\/\s])/i,De=/(^|[\/\s:_-])aya($|[\-_.:\/\s])/i,Oe=/(^|[\/\s:_-])orion($|[\-_.:\/\s])/i;function ke(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/\"/g,`"`).replace(/'/g,`'`)}function Ae(e){let t=e.replace(/\\/g,`/`).toLowerCase(),n=t.split(`/`).pop();return n===`agents.md`||n===`claude.md`||n===`gemini.md`||n===`cursor.md`||t.startsWith(`.trellis/spec/`)||t.includes(`/.trellis/spec/`)}function je(e){return e===`openai-completions`||e===`openai-responses`||e===`anthropic-messages`||e===`google-generative-ai`||e===`google-vertex`||e===`bedrock-converse-stream`}function Me(e){return!!e&&je(e.api)&&!jn(e.api)}function Ne(e){let t=j(e);if(!t)return;if(U(t.name))return t.name;let n=j(t.function);if(U(n?.name))return n.name;let r=j(t.custom);if(U(r?.name))return r.name;let i=j(t.toolSpec);if(U(i?.name))return i.name}function Pe(e,t){return e.name<t.name?-1:e.name>t.name?1:e.index-t.index}function Fe(e){return j(e)!==void 0}function Ie(e,t){let n=j(e);if(!n)return!1;if(t===`openai-completions`){if(n.type===`function`){let e=j(n.function);return U(e?.name)&&Fe(e.parameters)}if(n.type===`custom`){let e=j(n.custom);return U(e?.name)&&Fe(e.format)}return!1}if(t===`openai-responses`)return n.type===`function`?U(n.name)&&Fe(n.parameters):n.type===`custom`&&U(n.name)&&Fe(n.format);if(t===`anthropic-messages`)return U(n.name)&&Fe(n.input_schema);if(t===`google-generative-ai`||t===`google-vertex`)return U(n.name)&&(Fe(n.parametersJsonSchema)||Fe(n.parameters));let r=j(n.toolSpec),i=j(r?.inputSchema);return U(r?.name)&&Fe(i?.json)}function Le(e){return Array.isArray(e)&&e.some(e=>{let t=j(e);return!!t&&Object.prototype.hasOwnProperty.call(t,`cache_control`)})}function Re(e,t){if(!Array.isArray(e)||Le(e)||t===`anthropic-messages`&&e.some(e=>{let t=j(e);return!!t&&Object.prototype.hasOwnProperty.call(t,`defer_loading`)}))return;let n=e.map((e,n)=>{if(Ie(e,t))return{name:Ne(e)??``,index:n}});if(n.some(e=>e===void 0))return;let r=[...n].sort(Pe);return{sortedIndices:r.map(e=>e.index),changed:r.some((e,t)=>e.index!==t)}}function ze(e,t){if(!je(t))return{payload:e,changed:!1};let n=j(e);if(!n)return{payload:e,changed:!1};if(t===`google-generative-ai`||t===`google-vertex`){let r=j(n.config),i=r?.tools;if(!Array.isArray(i)||i.length===0)return{payload:e,changed:!1};let a=[];for(let n=0;n<i.length;n++){let r=j(i[n]);if(!r||!Array.isArray(r.functionDeclarations))return{payload:e,changed:!1};let o=Re(r.functionDeclarations,t);if(!o)return{payload:e,changed:!1};o.changed&&a.push({kind:`google`,groupIndex:n,sortedIndices:o.sortedIndices})}if(a.length===0)return{payload:e,changed:!1};let o=[...i];for(let e of a){let t=e.groupIndex,n=j(i[t]),r=n.functionDeclarations;o[t]={...n,functionDeclarations:e.sortedIndices.map(e=>r[e])}}return{payload:{...n,config:{...r,tools:o}},changed:!0}}if(t===`bedrock-converse-stream`){let r=j(n.toolConfig),i=r?.tools,a=Re(i,t);return!a||!a.changed||!Array.isArray(i)?{payload:e,changed:!1}:{payload:{...n,toolConfig:{...r,tools:a.sortedIndices.map(e=>i[e])}},changed:!0}}let r=n.tools,i=Re(r,t);return!i||!i.changed||!Array.isArray(r)?{payload:e,changed:!1}:{payload:{...n,tools:i.sortedIndices.map(e=>r[e])},changed:!0}}function Be(e,t){return ze(e,t).payload}function Ve(e){let t=e.filter(e=>!e.disableModelInvocation);if(t.length===0)return``;let n=[`
|
|
2
|
-
|
|
3
|
-
The following skills provide specialized instructions for specific tasks.`,`Use the read tool to load a skill's file when the task matches its description.`,`When a skill file references a relative path, resolve it against the skill directory (parent of SKILL.md / dirname of the path) and use that absolute path in tool commands.`,``,`<available_skills>`];for(let e of t)n.push(` <skill>`),n.push(` <name>${ke(e.name)}</name>`),n.push(` <description>${ke(e.description)}</description>`),n.push(` <location>${ke(e.filePath)}</location>`),n.push(` </skill>`);return n.push(`</available_skills>`),n.join(`
|
|
4
|
-
`)}function He(e){let t=e.filter(e=>!e.disableModelInvocation);if(t.length===0)return``;let n=new Map;for(let e of t){let t=(0,i.dirname)(e.filePath),r=(0,i.dirname)(t),a=n.get(r)??[];a.push(e.name),n.set(r,a)}let r=[...n.entries()].sort(([e],[t])=>e<t?-1:+(e>t)),a=[``,``,`The following skills provide specialized instructions for specific tasks. When a skill name matches the task you are doing, read the SKILL.md at the listed location to load the full instructions. When a SKILL.md references a relative path, resolve it against the skill directory (parent of SKILL.md / dirname of the path) and use that absolute path in tool commands.`];for(let[e,t]of r){t.sort(),a.push(``),a.push(`Skills under ${e}/<name>/SKILL.md:`);let n=` `;for(let e=0;e<t.length;e++){let r=t[e],i=(n===` `?``:`, `)+r;n.length>2&&n.length+i.length>80?(a.push(`${n},`),n=` ${r}`):n+=i}n.length>2&&a.push(n)}return a.join(`
|
|
5
|
-
`)}function Ue(e,t){if(Zt(process.env.PI_CACHE_OPTIMIZER_NO_SKILL_COMPRESSION)||!t.skills||t.skills.length===0||t.skills.filter(e=>!e.disableModelInvocation).length<4)return e;let n=Ve(t.skills);if(!n||!e.includes(n))return e;let r=He(t.skills);return!r||r.length>=n.length?e:e.replace(n,r)}function We(e){let t=[];e.customPrompt&&t.push(e.customPrompt),e.appendSystemPrompt&&t.push(e.appendSystemPrompt);let n=(e.selectedTools??[`read`,`bash`,`edit`,`write`]).filter(t=>e.toolSnippets?.[t]).map(t=>`- ${t}: ${e.toolSnippets?.[t]}`);n.length>0&&t.push(`Available tools:\n${n.join(`
|
|
6
|
-
`)}`);for(let n of e.promptGuidelines??[]){let e=n.trim();e.length>0&&t.push(`- ${e}`)}for(let n of e.contextFiles??[])Ae(n.path)&&(t.push(`## ${n.path}\n\n${n.content}`),t.push(n.content));return e.skills&&e.skills.length>0&&(t.push(Ve(e.skills)),t.push(He(e.skills))),t}function Ge(e){let t=e.indexOf(`<session-overview>`);if(t===-1)return e;let n=e.indexOf(`</session-overview>`,t+18);if(n===-1)return e;let r=e.slice(0,t+18),i=e.slice(t+18,n),a=e.slice(n);return r+i.replace(/\n## RECENT COMMITS\n[\s\S]*?(?=\n## |$)/,``).replace(/\nWorking directory:[^\n]*/g,``).replace(/\nLine count:[^\n]*/g,``)+a}function Ke(e){let t=new Set,n=new Set,r=new Set;for(let n of e.matchAll(/<([a-z][a-z0-9_-]*)>/gi))t.add(n[1].toLowerCase());for(let t of e.matchAll(/<\/([a-z][a-z0-9_-]*)>/gi))n.add(t[1].toLowerCase());for(let t of e.matchAll(/<!--\s*([A-Z][A-Z0-9_-]*):(START|END)\s*-->/g))r.add(`${t[1]}:${t[2]}`);return{openingTags:t,closingTags:n,commentMarkers:r}}function qe(e,t){let n=[],r=new Set,i=e,a=[];for(let e of We(t)){let t=e.trim();!t||t.length<8||r.has(t)||(r.add(t),a.push(t))}let o=i,s=new Map;for(let e of a){let t=0,n=0;for(;n<o.length;){let r=o.indexOf(e,n);if(r<0||(t++,t>1))break;n=r+1}s.set(e,t)}for(let e of a){if(s.get(e)!==1)continue;let t=i.indexOf(e);t<0||(n.push(e),i=i.slice(0,t)+i.slice(t+e.length))}let c=n.join(`
|
|
7
|
-
|
|
8
|
-
`),l=i.trim();if(n.length===0)return{systemPrompt:e,stablePrefix:``,changed:!1};let u=c+(l.length>0?`
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
`+l:``),d=Ke(e),f=Ke(u);return[...d.openingTags].some(e=>!f.openingTags.has(e))||[...d.closingTags].some(e=>!f.closingTags.has(e))||[...d.commentMarkers].some(e=>!f.commentMarkers.has(e))?(ge=!0,{systemPrompt:e,stablePrefix:``,changed:!1}):{systemPrompt:u,stablePrefix:c,changed:!0}}function Je(e){let t=e?.trim();if(!t)return;let n=Array.from(t);return n.length<=64?t:n.slice(0,64).join(``)}function Ye(e){return Je(e.sessionManager.getSessionId())}function Xe(t){return(0,e.createHash)(`sha256`).update(t).digest(`hex`).slice(0,16)}function Ze(){return globalThis}function A(...e){for(let t of e)if(U(t))return t.trim()}function Qe(e){let t=e.sessionManager.getSessionId();return t?Xe(t):void 0}function $e(e){let t=j(e);return!!t&&U(t.virtualProvider)&&typeof t.resolveActiveRoute==`function`}function et(e){let t=j(e);return!!t&&t.version===1&&typeof t.registerRouter==`function`&&typeof t.getRouter==`function`}function tt(){let e=new Map;return{version:1,registerRouter(t){if(!$e(t))return()=>void 0;let n=t.virtualProvider.trim();return e.set(n,t),()=>{e.get(n)===t&&e.delete(n)}},getRouter(t){return e.get(t)}}}function nt(){let e=Ze()[le];return et(e)?e:void 0}function rt(){let e=nt();if(e)return e;let t=tt();return Ze()[le]=t,t}function it(e){return e===`planned`||e===`trying`||e===`selected`||e===`success`||e===`failed`?e:void 0}function at(e,t,n){let r=j(e);if(!r)return;let i=A(r.virtualProvider,t),a=A(r.virtualModelId,r.virtualModel,n),o=A(r.provider,r.upstreamProvider,r.targetProvider),s=A(r.modelId,r.upstreamModelId,r.targetModelId,r.responseModel);if(!i||!a||!o||!s)return;let c=bt(r.timestamp)??Date.now();return{virtualProvider:i,virtualModelId:a,provider:o,modelId:s,api:A(r.api),canonicalModelId:A(r.canonicalModelId),routeLabel:A(r.routeLabel,r.label),status:it(r.status),sessionIdHash:A(r.sessionIdHash),requestId:A(r.requestId),timestamp:c}}function ot(e,t){if(!e)return;let n=t?{sessionIdHash:Qe(t)}:void 0,r=nt()?.getRouter(e.provider);if(r)try{let t=at(r.resolveActiveRoute(e.id,n),e.provider,e.id);if(t)return t}catch(e){console.warn(`${g}: routing registry adapter failed`,e)}let i=Ze().__piCacheOptimizerRouter;if(i&&M(e.provider).includes(`router`))try{if(typeof i==`function`)return at(i(e.provider,e.id,n),e.provider,e.id);let t=j(i)?.resolveActiveRoute;return at(typeof t==`function`?t.call(i,e.id,n):i,e.provider,e.id)}catch(e){console.warn(`${g}: legacy routing global failed`,e);return}}function st(e,t){let n=t?.provider===e.provider&&t?.id===e.modelId;return{...n?t??{}:{},id:e.modelId,name:e.canonicalModelId??e.modelId,provider:e.provider,api:e.api??(n?t?.api:void 0)??``,baseUrl:n?t?.baseUrl??``:``,reasoning:n?t?.reasoning??!1:!1,input:n?t?.input??[`text`]:[`text`],cost:n?t?.cost??{input:0,output:0,cacheRead:0,cacheWrite:0}:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:n?t?.contextWindow??0:0,maxTokens:n?t?.maxTokens??0:0,compat:n?t?.compat:void 0,[l]:!0}}function ct(e,t,n){try{return e?.find?.(t,n)||(e?.getAvailable?.()??[]).find(e=>e.provider===t&&e.id===n)||(e?.getAll?.()??[]).find(e=>e.provider===t&&e.id===n)}catch{return}}function lt(e){return!!e&&e[l]===!0}function ut(e,t){let n=j(j(j(t)?.providers)?.[e.provider]),r=Ct(Array.isArray(n?.models)?n.models:void 0,e.id),i=r?.api??n?.api,a=r?.baseUrl??n?.baseUrl,o=U(e.api)?e.api:U(i)?i:e.api,s=U(e.baseUrl)?e.baseUrl:U(a)?a:e.baseUrl;return o===e.api&&s===e.baseUrl?e:{...e,api:o,baseUrl:s}}function dt(e,t){let n=ot(e,t);if(n)return ut(ct(t?.modelRegistry,n.provider,n.modelId)??st(n,e),Gt())}function ft(e,t){return e?Xi(e)||!!nt()?.getRouter(e.provider)||!!ot(e,t):!1}function pt(e){let t=j(e);return!!t&&t.version===1&&typeof t.getHints==`function`}function mt(){let e=Ze()[ue];return pt(e)?e:void 0}function ht(e){return e[de]=!0,e}function gt(e){return typeof e==`object`&&!!e&&e[de]===!0}function _t(e,t={}){let n=Ze(),r=n[ue];return n[ue]=e,()=>{n[ue]===e&&(r!==void 0&&!t.discardPrevious?.(r)?n[ue]=r:delete n[ue])}}function vt(e,t,n){return`${e}:${t}/${n}`}function yt(e){let t=e.indexOf(`:`);return t>=0?e.slice(t+1):e}function j(e){if(typeof e==`object`&&e&&!Array.isArray(e))return e}function M(e){return typeof e==`string`?e.toLowerCase():``}function bt(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function xt(e,t){let n=bt(e[t]);return n!==void 0&&n>=0?n:void 0}const St=[`openRouterRouting`,`vercelGatewayRouting`,`chatTemplateKwargs`,`chatTemplateArgs`];function Ct(e,t){if(e)for(let n=e.length-1;n>=0;n--){let r=j(e[n]);if(r?.id===t)return r}}function wt(...e){let t={};for(let n of e){if(!n)continue;let e=Object.fromEntries(St.map(e=>[e,j(t[e])]));Object.assign(t,n);for(let r of St){let i=e[r],a=j(n[r]);(i||a)&&(t[r]={...i,...a})}}return t}function Tt(e,t){let n=j(j(j(t)?.providers)?.[e.provider]),r=j(n?.compat),i=j(j(Ct(Array.isArray(n?.models)?n.models:void 0,e.id))?.compat),a=j(e.compat),o=j(j(j(n?.modelOverrides)?.[e.id])?.compat);return[...r?[{source:`provider`,compat:r}]:[],...i?[{source:`model`,compat:i}]:[],...a?[{source:`runtime`,compat:a}]:[],...o?[{source:`modelOverride`,compat:o}]:[]]}function Et(e,t){return wt(...Tt(e,t).map(({compat:e})=>e))}function Dt(e,t,n){let r;for(let i of Tt(e,t))Object.prototype.hasOwnProperty.call(i.compat,n)&&(r=i.source);return r}function Ot(e){return e===void 0||typeof e==`string`&&e.length>0}function kt(e){return e===void 0||typeof e==`boolean`}function At(e){return typeof e==`number`&&Number.isFinite(e)}function jt(e){let t=j(e);return!!t&&Object.values(t).every(e=>typeof e==`string`)}function Mt(e){let t=j(e);return t?[`off`,`minimal`,`low`,`medium`,`high`,`xhigh`,`max`].every(e=>t[e]===void 0||t[e]===null||typeof t[e]==`string`):!1}function Nt(e){let t=j(e);return!!t&&At(t.inputTokensAbove)&&At(t.input)&&At(t.output)&&At(t.cacheRead)&&At(t.cacheWrite)}function Pt(e,t){let n=j(e);if(!n)return!1;for(let e of[`input`,`output`,`cacheRead`,`cacheWrite`])if((!t||n[e]!==void 0)&&!At(n[e]))return!1;return n.tiers===void 0||Array.isArray(n.tiers)&&n.tiers.every(Nt)}function Ft(e){let t=j(e);return!(!t||!U(t.id)||!Ot(t.name)||!Ot(t.api)||!Ot(t.baseUrl)||!kt(t.reasoning)||!Bt(t.compat)||t.thinkingLevelMap!==void 0&&!Mt(t.thinkingLevelMap)||t.input!==void 0&&(!Array.isArray(t.input)||!t.input.every(e=>e===`text`||e===`image`))||t.cost!==void 0&&!Pt(t.cost,!1)||t.contextWindow!==void 0&&!At(t.contextWindow)||t.maxTokens!==void 0&&!At(t.maxTokens)||t.samplingParams!==void 0&&!j(t.samplingParams)||t.headers!==void 0&&!jt(t.headers))}function It(e){let t=j(e);return!(!t||!Bt(t.compat)||!Ot(t.name)||!kt(t.reasoning)||t.thinkingLevelMap!==void 0&&!Mt(t.thinkingLevelMap)||t.input!==void 0&&(!Array.isArray(t.input)||!t.input.every(e=>e===`text`||e===`image`))||t.cost!==void 0&&!Pt(t.cost,!0)||t.contextWindow!==void 0&&!At(t.contextWindow)||t.maxTokens!==void 0&&!At(t.maxTokens)||t.samplingParams!==void 0&&!j(t.samplingParams)||t.headers!==void 0&&!jt(t.headers))}function Lt(e){if([`supportsStore`,`supportsDeveloperRole`,`supportsReasoningEffort`,`supportsUsageInStreaming`,`requiresToolResultName`,`requiresAssistantAfterToolResult`,`requiresThinkingAsText`,`requiresReasoningContentOnAssistantMessages`,`supportsOpenAIGrammarTools`,`supportsStrictMode`,`sendSessionAffinityHeaders`,`supportsLongCacheRetention`].some(t=>!kt(e[t]))||e.maxTokensField!==void 0&&e.maxTokensField!==`max_completion_tokens`&&e.maxTokensField!==`max_tokens`||e.thinkingFormat!==void 0&&![`openai`,`openrouter`,`together`,`baseten`,`deepseek`,`zai`,`qwen`,`chat-template`,`qwen-chat-template`,`string-thinking`,`ant-ling`].includes(String(e.thinkingFormat))||e.cacheControlFormat!==void 0&&e.cacheControlFormat!==`anthropic`||e.deferredToolsMode!==void 0&&e.deferredToolsMode!==`kimi`||e.sessionAffinityFormat!==void 0&&![`openai`,`openai-nosession`,`openrouter`].includes(String(e.sessionAffinityFormat)))return!1;for(let t of St)if(e[t]!==void 0&&!j(e[t]))return!1;return!0}function Rt(e){return[`supportsDeveloperRole`,`supportsLongCacheRetention`,`supportsStrictMode`,`supportsOpenAIGrammarTools`,`supportsAdditionalTools`,`supportsToolSearch`].some(t=>!kt(e[t]))?!1:e.sessionAffinityFormat===void 0||[`openai`,`openai-nosession`,`openrouter`].includes(String(e.sessionAffinityFormat))}function zt(e){return[`supportsEagerToolInputStreaming`,`supportsLongCacheRetention`,`sendSessionAffinityHeaders`,`supportsCacheControlOnTools`,`supportsTemperature`,`forceAdaptiveThinking`,`allowEmptySignature`,`supportsStrictTools`,`supportsToolReferences`].every(t=>kt(e[t]))}function Bt(e){if(e===void 0)return!0;let t=j(e);return!!t&&(Lt(t)||Rt(t)||zt(t))}function Vt(e){let t=j(e),n=j(t?.providers);if(!t||!n)return!1;for(let e of Object.values(n)){let t=j(e);if(!t||!Ot(t.name)||!Ot(t.baseUrl)||!Ot(t.apiKey)||!Ot(t.api)||!kt(t.authHeader)||!Bt(t.compat)||t.oauth!==void 0&&t.oauth!==`radius`||t.headers!==void 0&&!jt(t.headers)||t.models!==void 0&&(!Array.isArray(t.models)||!t.models.every(Ft)))return!1;let n=t.modelOverrides===void 0?void 0:j(t.modelOverrides);if(t.modelOverrides!==void 0&&(!n||!Object.values(n).every(It)))return!1}return!0}let Ht;function Ut(){Ht=void 0}function Wt(){try{let e=(0,n.statSync)(J);return`${e.dev}:${e.ino}:${e.size}:${e.mtimeMs}:${e.ctimeMs}`}catch{return`missing`}}function Gt(){let e=Wt();if(Ht?.signature===e)return Ht.value;let t;if(e!==`missing`)try{let e=hs((0,n.readFileSync)(J,`utf8`));t=Vt(e)?e:void 0}catch{t=void 0}return Ht={signature:e,value:t},t}function N(e){return e?Et(e,Gt()):{}}function Kt(e,t){let n=t.toLowerCase();return Object.keys(e).some(e=>e.toLowerCase()===n)}function qt(e,t,n){return!Kt(e,t)&&(e[t]=n,!0)}function Jt(e,t,n,r,i=O,a){if(!i||!t||!U(n)||!wn(t.api)||!U(t.baseUrl)||ha(t))return!1;let o=r===void 0||a===void 0?Gt():void 0,s=r??Et(t,o),c=a??Dt(t,o,`sendSessionAffinityHeaders`)??(Object.prototype.hasOwnProperty.call(j(t.compat)??{},`sendSessionAffinityHeaders`)?`runtime`:void 0);if(s.sendSessionAffinityHeaders!==!0||c===`runtime`)return!1;let l=s.sessionAffinityFormat??(M(t.provider).includes(`openrouter`)||M(t.baseUrl).includes(`openrouter.ai`)?`openrouter`:`openai`),u=n.trim(),d=!1;return l===`openrouter`?qt(e,`x-session-id`,u):(l===`openai`&&(d=qt(e,`session_id`,u)||d),d=qt(e,`x-client-request-id`,u)||d,d=qt(e,`x-session-affinity`,u)||d,d)}function Yt(e,t,n=process.platform){let r=n.startsWith(`win`)?`\\`:`/`;return`${e.replace(/[\\/]+$/,``)}${r}${t}`}function Xt(e=process.platform,t=(0,a.getAgentDir)(),n=(0,r.homedir)()){let i=e.startsWith(`win`)?`\\`:`/`,o=t.replace(/[\\/]+/g,i),s=n.replace(/[\\/]+/g,i).replace(/[\\/]+$/,``),c=`${s}${i}`;if(o===s||o.startsWith(c)){let t=o.slice(s.length).replace(/^[\\/]+/,``),n=e.startsWith(`win`)?`%USERPROFILE%`:`~`;return t?`${n}${i}${t}`:n}return o}function P(e=process.platform,t=(0,a.getAgentDir)(),n=(0,r.homedir)()){return Yt(Xt(e,t,n),`models.json`,e)}function Zt(e){if(!e)return!1;let t=e.trim().toLowerCase();return t===`1`||t===`true`||t===`yes`||t===`on`}function Qt(e=process.env){return O&&Zt(e[oe])}function $t(e){if(typeof e!=`string`)return;let t=e.trim().toLowerCase();return t===`session`||t===`total`||t===`process`?t:void 0}const en=[`enable`,`disable`,`doctor`,`stats`,`config`,`compat`,`reset`,`fix`,`rollback`],tn=[`footer-mode`],nn=[`total`,`session`,`process`],rn=[`all`,`contributors`];function an(e,t,n=``){let r=t.trim().toLowerCase(),i=e.filter(e=>e.startsWith(r)).map(e=>({value:n?`${n} ${e}`:e,label:e}));return i.length>0?i:null}function on(e){if(typeof e!=`string`)return null;let t=e.trim(),n=t?t.split(/\s+/):[];if(n.length===0)return an(en,``);if(n.length===1){let e=n[0].toLowerCase();return e===`c`?[{value:`config`,label:`config`}]:e===`config`?an(tn,``,`config`):e===`stats`?an(rn,``,`stats`):an(en,n[0])}return n[0].toLowerCase()===`stats`?n.length===2?an(rn,n[1],`stats`):null:n[0].toLowerCase()===`config`?n.length===2?n[1].toLowerCase()===`footer-mode`?an(nn,``,`config footer-mode`):an(tn,n[1],`config`):n.length===3&&n[1].toLowerCase()===`footer-mode`?an(nn,n[2],`config footer-mode`):null:null}function sn(e){let t=j(e);if(!t||t.version!==1)return;let n=$t(t.footerMode);if(t.footerMode===void 0||n)return{version:1,...n?{footerMode:n}:{}}}function cn(e=T){try{let t=sn(JSON.parse((0,n.readFileSync)(e,`utf8`)));if(!t)throw Error(`invalid footer config schema`);return t.footerMode}catch(e){q(e)!==`ENOENT`&&console.warn(`${g}: failed to read footer config; using environment/default mode`,e);return}}async function ln(e,n=T){await(0,t.mkdir)((0,i.dirname)(n),{recursive:!0});let r={version:1,footerMode:e},a=`${n}.${process.pid}.${Date.now()}.tmp`;await(0,t.writeFile)(a,JSON.stringify(r,null,2)+`
|
|
13
|
-
`,`utf8`),await(0,t.rename)(a,n)}function un(e,t=process.env){if(e)return{mode:e,source:`config`};let n=$t(t[se]);return n?{mode:n,source:`env`}:{mode:`session`,source:`default`}}function dn(e=process.env,t=fn){return un(t,e).mode}let fn=cn();function pn(e){if(!e)return!1;let t=e.trim().toLowerCase();return t===`0`||t===`false`||t===`no`||t===`off`}function mn(){return!(!O||Zt(process.env.PI_CACHE_OPTIMIZER_NO_OPENAI_CACHE_KEY)||pn(process.env.PI_CACHE_OPTIMIZER_OPENAI_CACHE_KEY))}function hn(e,t=process.env){O=e,e?d(t):f(h,t)}function gn(){return O}function _n(){let e=O?`enabled`:`disabled`,t=[];return t.push(`Runtime state: ${e}`),t.push(`• Prompt rewrite: ${O&&!Zt(process.env[ae])?`on`:`off`}`),t.push(`• Deterministic tool ordering: ${Qt()?`on (verified built-in payloads, opt-in)`:`off`}`),t.push(`• OpenAI prompt_cache_key fallback: ${mn()?`on`:`off`}`),t.push(`• Footer cache stats: on${O?``:` (comparison mode)`}`),t.push(`• Compat warnings: ${O?`on`:`off`}`),t.push(`• ${o}: ${process.env[o]??`(unset)`}`),O?(Zt(process.env[ae])||!mn())&&t.push(`Some features are still disabled by environment variables.`):t.push(`This is a current-process switch. Run /reload or restart Pi to return to startup behavior.`),t}function vn(){return _n().join(`
|
|
14
|
-
`)}function F(e){return j(e)?.role===`assistant`}function yn(e){let t=j(e);return t?.role===`assistant`?t:void 0}function I(e){return e?[e.id,e.name].map(M).filter(Boolean):[]}function L(e){let t=j(e);return t?ye.map(e=>M(t[e])).filter(Boolean):[]}function R(e,t){return e.some(e=>t.some(t=>e.includes(t)))}function z(e,t,n){return R([...I(t),...L(e)],n)}function bn(e){return R(I(e),[`deepseek`])}function xn(e,t){return z(e,t,[`deepseek`])}function Sn(e){let t=M(e);return t===`openai-completions`||t===`openai-responses`}function Cn(e){return M(e)===`anthropic-messages`}function wn(e){return M(e)===`openai-completions`}function Tn(e){if(M(e?.provider)!==`llama.cpp`||!wn(e?.api))return!1;let t=N(e);return t.supportsStore===!1&&t.supportsDeveloperRole===!1&&t.supportsReasoningEffort===!1&&t.supportsUsageInStreaming===!1&&t.supportsStrictMode===!1&&t.maxTokensField===`max_tokens`&&t.sendSessionAffinityHeaders===void 0&&t.sessionAffinityFormat===void 0&&t.supportsLongCacheRetention===void 0}function En(e){return Sn(e?.api)}function Dn(e){let t=j(e);if(!t)return[];let n=[],r=e=>{let t=j(j(e)?.cache_control);t?.type===`ephemeral`&&n.push(t)};if(Array.isArray(t.tools))for(let e of t.tools)r(e);if(Array.isArray(t.system))for(let e of t.system)r(e);if(Array.isArray(t.messages))for(let e of t.messages){let t=j(e)?.content;if(Array.isArray(t))for(let e of t)r(e)}return n}function On(e){let t=!1;for(let n of Dn(e))n.ttl===`1h`&&(delete n.ttl,t=!0);return t}function kn(e){let t=yn(e);if(t?.stopReason!==`error`||typeof t.errorMessage!=`string`)return!1;let n=M(t.errorMessage);return n.includes(`cache_control`)&&n.includes(`ttl='1h'`)&&n.includes(`ttl='5m'`)&&n.includes(`must not come after`)}function An(e){let t=Dn(e),n=!1,r=!1;for(let e of t){let t=e.ttl;if(t===void 0||t===`5m`)n=!0;else if(t===`1h`&&n){r=!0;break}}return r?On(e):!1}function jn(e){let t=M(e);return t===`openai-codex-responses`||t===`openai-responses`||t===`azure-openai-responses`}function Mn(e){return M(e)===`mistral-conversations`}function Nn(e){return e.includes(`gpt-`)||e.includes(`chatgpt`)||be.test(e)}function Pn(e){return I(e).some(Nn)}function Fn(e,t){return[...I(t),...L(e)].some(Nn)}function In(e){return R(I(e),[`anthropic`,`claude`])}function Ln(e,t){return z(e,t,[`anthropic`,`claude`])}function Rn(e){return R(I(e),[`gemini`,`vertex`])}function zn(e,t){return z(e,t,[`gemini`,`vertex`])}const Bn=/(^|[\/\s:_-])(opus-4[.-][6-9]|opus-4-[1-9][0-9]|opus-([5-9]|[1-9][0-9]))($|[-_.:\/\s\[])/i,Vn=/(^|[\/\s:_-])(sonnet-4[.-][6-9]|sonnet-4-[1-9][0-9]|sonnet-([5-9]|[1-9][0-9]))($|[-_.:\/\s\[])/i,Hn=/(^|[\/\s:_-])fable-([5-9]|[1-9][0-9])($|[-_.:\/\s\[])/i;function Un(e){return e?I(e).some(e=>Bn.test(e)||Vn.test(e)||Hn.test(e)):!1}function Wn(e){if(!e)return!1;let t=M(e.provider),n=M(e.baseUrl);return t.includes(`kimi-coding`)||n.includes(`api.kimi.com/coding`)?I(e).some(e=>e===`k3`||e.includes(`kimi-k3`)||e.includes(`kimi k3`)||e.includes(`kimi-for-coding`)||e.includes(`kimi for coding`)):!1}function Gn(e){return Wn(e)?I(e).some(e=>e===`k3`||e===`kimi-k3`||e.startsWith(`kimi-k3-`)||e===`kimi k3`||e===`kimi-for-coding`||e===`kimi for coding`):!1}function Kn(e){return lt(e)&&!U(e.baseUrl)?!1:M(e.api)===`anthropic-messages`&&(Un(e)||Wn(e))}function qn(e){let t=N(e),n=[];return t.forceAdaptiveThinking!==!0&&n.push(`forceAdaptiveThinking`),Gn(e)&&t.allowEmptySignature!==!0&&n.push(`allowEmptySignature`),n}function Jn(e){let t={};return e.includes(`forceAdaptiveThinking`)&&(t.forceAdaptiveThinking=!0),e.includes(`allowEmptySignature`)&&(t.allowEmptySignature=!0),t}function Yn(e,t,n={}){let r=Jn(t);Object.keys(r).length>0&&(e.push(`Suggested fix:`),e.push(JSON.stringify(r,null,2))),e.push(`- forceAdaptiveThinking: true tells Pi to use adaptive thinking format`),e.push(` (thinking: {type: 'adaptive'}) instead of legacy budget tokens format.`),e.push(` Without this flag, Pi sends legacy thinking which adaptive-only upstreams reject.`),t.includes(`allowEmptySignature`)&&e.push(`- allowEmptySignature: true preserves Kimi Coding K3 thinking blocks whose replay signature is empty.`),Ia(e,n,r)}function Xn(e,t){let n=e.indexOf(`/`),r=n>0?e.slice(0,n):e,i=n>0?e.slice(n+1):void 0,a=P(),o=[`💡 pi-cache-optimizer: ${e} is an adaptive-generation model but merged compat lacks ${t.join(` and `)}.`,`Without the required compat, Pi may send legacy thinking or replay thinking blocks incorrectly.`,`Edit ${a} -> providers["${r}"] -> compat (at the same level as baseUrl/api/apiKey/models).`,``];return Yn(o,t,{providerLabel:r,modelId:i}),o.join(`
|
|
15
|
-
`)}function Zn(e){return R(I(e),[`kimi`])}function Qn(e,t){return z(e,t,[`kimi`])}function $n(e){return R(I(e),[`qwen`])}function er(e,t){return z(e,t,[`qwen`])}function tr(e){return R(I(e),[`glm`])}function nr(e,t){return z(e,t,[`glm`])}function rr(e){return R(I(e),[`minimax`])}function ir(e,t){return z(e,t,[`minimax`])}function ar(e){let t=I(e);return R(t,[`xiaomimimo`])||t.some(e=>Se.test(e))}function or(e,t){let n=[...I(t),...L(e)];return R(n,[`xiaomimimo`])||n.some(e=>Se.test(e))}function sr(e){return R(I(e),[`hunyuan`])}function cr(e,t){return z(e,t,[`hunyuan`])}function lr(e){return R(I(e),[`mistral`,`mixtral`,`codestral`])}function ur(e,t){return z(e,t,[`mistral`,`mixtral`,`codestral`])}function dr(e){let t=I(e);return R(t,[`grok`])||t.some(e=>xe.test(e))}function fr(e,t){let n=[...I(t),...L(e)];return R(n,[`grok`])||n.some(e=>xe.test(e))}function pr(e){return R(I(e),[`llama`])}function mr(e,t){return z(e,t,[`llama`])}function hr(e){return R(I(e),[`nemotron`])}function gr(e,t){return z(e,t,[`nemotron`])}function _r(e){return R(I(e),[`cohere`,`command-r`])}function vr(e,t){return z(e,t,[`cohere`,`command-r`])}const yr=/(^|[\/\s:_-])yi($|[\-_.:\/\s])/;function br(e){let t=I(e);return R(t,[`yi-`,`01-ai`,`zero-one`])||t.some(e=>yr.test(e))}function xr(e,t){let n=[...I(t),...L(e)];return R(n,[`yi-`,`01-ai`,`zero-one`])||n.some(e=>yr.test(e))}const Sr=/(^|[\/\s:_-])seed($|[\-_.:\/\s])/i;function Cr(e){let t=I(e);return R(t,[`doubao`,`豆包`,`volcengine`,`bytedance`,`byte-dance`])||t.some(e=>Sr.test(e))}function wr(e,t){let n=[...I(t),...L(e)];return R(n,[`doubao`,`豆包`,`volcengine`,`bytedance`,`byte-dance`])||n.some(e=>Sr.test(e))}function Tr(e){return R(I(e),[`ernie`,`wenxin`,`文心`,`yiyan`,`一言`,`baidu`])}function Er(e,t){return z(e,t,[`ernie`,`wenxin`,`文心`,`yiyan`,`一言`,`baidu`])}function Dr(e){return R(I(e),[`baichuan`,`百川`])}function Or(e,t){return z(e,t,[`baichuan`,`百川`])}function kr(e){return R(I(e),[`stepfun`,`step-`])}function Ar(e,t){return z(e,t,[`stepfun`,`step-`])}function jr(e){return R(I(e),[`spark`,`xinghuo`,`星火`,`iflytek`,`讯飞`])}function Mr(e,t){return z(e,t,[`spark`,`xinghuo`,`星火`,`iflytek`,`讯飞`])}function Nr(e){return R(I(e),[`internlm`,`intern-lm`,`书生`])}function Pr(e,t){return z(e,t,[`internlm`,`intern-lm`,`书生`])}function Fr(e){return R(I(e),[`gemma`])}function Ir(e,t){return z(e,t,[`gemma`])}const Lr=/(^|[\/\s:_-])phi($|[\-_.:\/\s])/i;function Rr(e){let t=I(e);return R(t,[`phi-`])||t.some(e=>Lr.test(e))}function zr(e,t){let n=[...I(t),...L(e)];return R(n,[`phi-`])||n.some(e=>Lr.test(e))}function Br(e){return R(I(e),[`jamba`,`ai21`])}function Vr(e,t){return z(e,t,[`jamba`,`ai21`])}function Hr(e){return R(I(e),[`solar`,`upstage`])}function Ur(e,t){return z(e,t,[`solar`,`upstage`])}function Wr(e){let t=I(e);return R(t,[`sonar`,`perplexity`])||t.some(e=>Ce.test(e))}function Gr(e,t){let n=[...I(t),...L(e)];return R(n,[`sonar`,`perplexity`])||n.some(e=>Ce.test(e))}function Kr(e){let t=I(e);return R(t,[`amazon-nova`])||t.some(e=>we.test(e))}function qr(e,t){let n=[...I(t),...L(e)];return R(n,[`amazon-nova`])||n.some(e=>we.test(e))}function Jr(e){return R(I(e),[`reka`])}function Yr(e,t){return z(e,t,[`reka`])}function Xr(e){return R(I(e),[`falcon`,`tiiuae`])}function Zr(e,t){return z(e,t,[`falcon`,`tiiuae`])}function Qr(e){return R(I(e),[`dbrx`,`databricks`])}function $r(e,t){return z(e,t,[`dbrx`,`databricks`])}function ei(e){let t=I(e);return R(t,[`mosaicml`,`mpt-`])||t.some(e=>k.test(e))}function ti(e,t){let n=[...I(t),...L(e)];return R(n,[`mosaicml`,`mpt-`])||n.some(e=>k.test(e))}function ni(e){return R(I(e),[`stablelm`,`stable-lm`,`stability-ai`])}function ri(e,t){return z(e,t,[`stablelm`,`stable-lm`,`stability-ai`])}function ii(e){return R(I(e),[`aquila`,`baai`])}function ai(e,t){return z(e,t,[`aquila`,`baai`])}function oi(e){return R(I(e),[`exaone`])}function si(e,t){return z(e,t,[`exaone`])}function ci(e){return R(I(e),[`hyperclova`,`clova-x`])}function li(e,t){return z(e,t,[`hyperclova`,`clova-x`])}function ui(e){let t=I(e);return R(t,[`luminous`,`aleph-alpha`])||t.some(e=>Te.test(e))}function di(e,t){let n=[...I(t),...L(e)];return R(n,[`luminous`,`aleph-alpha`])||n.some(e=>Te.test(e))}function fi(e){return R(I(e),[`nous`,`hermes`,`openhermes`])}function pi(e,t){return z(e,t,[`nous`,`hermes`,`openhermes`])}function mi(e){return R(I(e),[`granite`,`ibm-granite`])}function hi(e,t){return z(e,t,[`granite`,`ibm-granite`])}function gi(e){let t=I(e);return R(t,[`snowflake-arctic`])||t.some(e=>Ee.test(e))}function _i(e,t){let n=[...I(t),...L(e)];return R(n,[`snowflake-arctic`])||n.some(e=>Ee.test(e))}function vi(e){return R(I(e),[`pangu`,`pan-gu`,`盘古`,`huawei-pangu`])}function yi(e,t){return z(e,t,[`pangu`,`pan-gu`,`盘古`,`huawei-pangu`])}function bi(e){return R(I(e),[`sensenova`,`sense-nova`,`sensechat`,`商汤`])}function xi(e,t){return z(e,t,[`sensenova`,`sense-nova`,`sensechat`,`商汤`])}function Si(e){return R(I(e),[`360gpt`,`360-gpt`,`zhinao`,`智脑`])}function Ci(e,t){return z(e,t,[`360gpt`,`360-gpt`,`zhinao`,`智脑`])}function wi(e){return R(I(e),[`minicpm`,`mini-cpm`,`openbmb`])}function Ti(e,t){return z(e,t,[`minicpm`,`mini-cpm`,`openbmb`])}function Ei(e){return R(I(e),[`xverse`])}function Di(e,t){return z(e,t,[`xverse`])}function Oi(e){let t=I(e);return R(t,[`orionstar`,`orion-star`])||t.some(e=>Oe.test(e))}function ki(e,t){let n=[...I(t),...L(e)];return R(n,[`orionstar`,`orion-star`])||n.some(e=>Oe.test(e))}function Ai(e){return R(I(e),[`openchat`])}function ji(e,t){return z(e,t,[`openchat`])}function Mi(e){return R(I(e),[`vicuna`])}function Ni(e,t){return z(e,t,[`vicuna`])}function Pi(e){return R(I(e),[`wizardlm`,`wizard-lm`,`wizardcoder`,`wizard-coder`])}function Fi(e,t){return z(e,t,[`wizardlm`,`wizard-lm`,`wizardcoder`,`wizard-coder`])}function Ii(e){return R(I(e),[`zephyr`])}function Li(e,t){return z(e,t,[`zephyr`])}function Ri(e){return R(I(e),[`dolphin`])}function zi(e,t){return z(e,t,[`dolphin`])}function Bi(e){return R(I(e),[`openorca`,`open-orca`])}function Vi(e,t){return z(e,t,[`openorca`,`open-orca`])}function Hi(e){return R(I(e),[`starling`])}function Ui(e,t){return z(e,t,[`starling`])}function Wi(e){return R(I(e),[`bloom`,`bigscience`])}function Gi(e,t){return z(e,t,[`bloom`,`bigscience`])}function Ki(e){return R(I(e),[`rwkv`])}function qi(e,t){return z(e,t,[`rwkv`])}function Ji(e){let t=I(e);return R(t,[`aya-expanse`])||t.some(e=>De.test(e))}function Yi(e,t){let n=[...I(t),...L(e)];return R(n,[`aya-expanse`])||n.some(e=>De.test(e))}function B(e){return`${e.provider}/${e.id}`}function Xi(e){return M(e?.provider)===`router`}function Zi(e,t){let n=yn(e);if(!n)return t;let r=A(n.responseModel,n.model,t?.id),i=A(n.provider,t?.provider),a=A(n.api,t?.api)??``;if(!r||!i)return t;let o=U(t?.name)?t.name:void 0,s=!ft(t)&&i===t?.provider&&r===t?.id&&o!==void 0;return{...t??{},id:r,name:s?o:r,provider:i,api:a,baseUrl:t?.baseUrl??``,reasoning:t?.reasoning??!1,input:t?.input??[`text`],cost:t?.cost??{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:t?.contextWindow??0,maxTokens:t?.maxTokens??0}}const Qi=[`supportsStore`,`supportsDeveloperRole`,`supportsReasoningEffort`,`supportsUsageInStreaming`,`supportsStrictMode`,`maxTokensField`,`sendSessionAffinityHeaders`,`sessionAffinityFormat`,`supportsLongCacheRetention`,`thinkingFormat`,`requiresReasoningContentOnAssistantMessages`,`cacheControlFormat`,`forceAdaptiveThinking`,`allowEmptySignature`];function $i(e){let t=N(e),n={},r=n;for(let e of Qi){let n=t[e];n!==void 0&&(r[e]=n)}return n}function ea(e){if(!U(e))return``;try{let t=new URL(e);return t.username=``,t.password=``,t.search=``,t.hash=``,t.toString()}catch{return e.replace(RegExp(`//[^/?#\\s@]+@`),`//`).split(/[?#]/,1)[0]}}function ta(e){if(e)return{provider:e.provider,id:e.id,name:e.name,api:e.api,baseUrl:ea(e.baseUrl),compat:$i(e),reasoning:e.reasoning??!1,input:e.input??[`text`],cost:e.cost??{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:e.contextWindow??0,maxTokens:e.maxTokens??0}}function na(e){return`${e.provider}/${e.id}`}function ra(e,t,n){if(!e||!t||ft(t,n)||e.provider!==t.provider)return e;let r=Ja(e),i=Ja(t);return!r||!i||r!==i||e.id===t.id?e:{...e,id:t.id,name:t.name||t.id}}function ia(e){return j(yn(e)?.usage)}function aa(e,t){return j(e?.[t])}function oa(...e){for(let t of e){let e=bt(t);if(e!==void 0&&e>=0)return e}}function sa(e){return oa(e?.cached_tokens,e?.cachedTokens)}function ca(e){return oa(e?.cache_write_tokens,e?.cacheWriteTokens)}function la(e,t=!1){let n=ia(e);if(!n)return;let r=xt(n,`input`),i=xt(n,`cacheRead`),a=xt(n,`cacheWrite`);if(i===void 0&&a===void 0&&(r===void 0||!t))return;let o=(r??0)+(i??0)+(a??0),s=(i??0)+(a??0);return{cacheRead:i??0,cacheWrite:a??0,totalInput:o>=s?o:s}}function ua(e){let t=ia(e);if(!t)return;let n=oa(t.prompt_cache_hit_tokens);if(n===void 0)return;let r=oa(t.prompt_cache_miss_tokens);return{cacheRead:n,cacheWrite:0,totalInput:oa(t.prompt_tokens)??n+(r??0)}}function V(e){let t=ia(e);if(!t)return;let n=aa(t,`prompt_tokens_details`)??aa(t,`promptTokensDetails`),r=aa(t,`input_tokens_details`)??aa(t,`inputTokensDetails`),i=sa(n)??sa(r);if(i===void 0)return;let a=ca(n)??ca(r)??0;return{cacheRead:i,cacheWrite:a,totalInput:oa(t.prompt_tokens,t.promptTokens,t.input_tokens,t.inputTokens)??i+a}}function da(e){let t=ia(e);if(!t)return;let n=oa(t.cache_read_input_tokens,t.cacheReadInputTokens),r=oa(t.cache_creation_input_tokens,t.cacheCreationInputTokens);if(n===void 0&&r===void 0)return;let i=oa(t.input_tokens,t.inputTokens)??0;return{cacheRead:n??0,cacheWrite:r??0,totalInput:i+(n??0)+(r??0)}}function fa(e){let t=yn(e);if(!t)return;let n=j(t.usage),r=aa(t,`usageMetadata`)??aa(t,`usage_metadata`)??aa(n,`usageMetadata`)??aa(n,`usage_metadata`)??n;if(!r)return;let i=oa(r.cachedContentTokenCount,r.cached_content_token_count);if(i!==void 0)return{cacheRead:i,cacheWrite:0,totalInput:oa(r.promptTokenCount,r.prompt_token_count,r.inputTokenCount,r.input_token_count,n?.input_tokens,n?.inputTokens,n?.prompt_tokens,n?.promptTokens)??i}}function H(e,t,n={}){return la(e,n.allowInputOnlyPiUsage)??t(e)}function pa(e,t){let n=j(e),r=Je(t);if(n&&r&&!ma(n))return{...n,prompt_cache_key:r}}function ma(e){return U(e.prompt_cache_key)||U(e.promptCacheKey)}function U(e){return typeof e==`string`&&e.trim().length>0}function ha(e){let t=M(e.baseUrl).trim();if(!t)return M(e.provider)===`openai`;try{return new URL(t).hostname===`api.openai.com`}catch{return t===`api.openai.com`||t.startsWith(`api.openai.com/`)}}function ga(e){return U(e.baseUrl)&&!ha(e)}function _a(e){let t=N(e),n=[];return!Pn(e)||!wn(e.api)||!ga(e)||t.sendSessionAffinityHeaders!==!0&&n.push(`sendSessionAffinityHeaders`),n}function W(e){let t=N(e),n=[];return!wn(e.api)||!ga(e)||Tn(e)||t.sendSessionAffinityHeaders===void 0&&n.push(`sendSessionAffinityHeaders`),n}function va(e){let t=N(e),n=[];return!wn(e.api)||!ga(e)||Tn(e)||t.supportsLongCacheRetention!==!0&&n.push(`supportsLongCacheRetention`),n}function ya(e){let t={};return e.includes(`sendSessionAffinityHeaders`)&&(t.sendSessionAffinityHeaders=!0),t}function ba(){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."}function xa(e){let t=M(e);return t.includes(`prompt_cache_retention`)?[`unsupported parameter`,`unsupported_parameter`,`unknown parameter`,`not supported`,`unsupported field`,`extra inputs`,`not permitted`,`unrecognized`].some(e=>t.includes(e)):!1}function Sa(e){return e?xa(Object.entries(e).map(([e,t])=>`${e}: ${t}`).join(`
|
|
16
|
-
`)):!1}function Ca(e){let t=yn(e);return t?.stopReason===`error`&&xa(t.errorMessage)}function wa(e){let t=M(e).replace(/\s+/g,` `).trim();if(!t)return!1;let 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_])/,/(?:^|[^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_])/,/(?:^|[^a-z0-9_])(?:extra\s+inputs?|additional\s+(?:inputs?|parameters?))\s+(?:are\s+)?(?:not permitted|not allowed|unsupported)\s*[:=]?\s*["'`]?thinking["'`]?(?![a-z0-9_])/],r=-1;for(let e of n){let n=e.exec(t);n&&n.index+n[0].length>r&&(r=n.index+n[0].length)}if(r<0)return!1;let i=t.slice(r,r+260);return/\breasoning[_\.]effort\b/.test(i)?i.split(/[.;!?\n]/).some(e=>!/\breasoning[_\.]effort\b/.test(e)||/\b(?:do\s+not|don't|never|avoid)\s+(?:use|set|send|pass|provide)?\s*["'`]?reasoning[_\.]effort\b/.test(e)||/\breasoning[_\.]effort\b[^.;]{0,80}\b(?:must|should|may|do)\s+(?:not|never)\b/.test(e)||/\breasoning[_\.]effort\b[^.;]{0,80}\b(?:unsupported|disabled|unavailable|not\s+(?:supported|accepted|allowed|available|enabled|required|recommended|expected))\b/.test(e)?!1:[/(?:use|try|set|send|pass|provide)\s+(?:the\s+)?(?:top[- ]level\s+)?["'`]?reasoning[_\.]effort["'`]?(?![a-z0-9_])/,/(?:reasoning[_\.]effort)\b[^.;]{0,120}(?:instead|required|must\s+be|should\s+be|is\s+(?:supported|accepted|preferred|recommended|expected))\b/,/(?:parameter|field|option)\s+(?:is|should be)\s+["'`]?reasoning[_\.]effort["'`]?(?![a-z0-9_])/,/instead[^.;]{0,120}(?:use|try|set|send|pass|provide)\s+(?:the\s+)?["'`]?reasoning[_\.]effort["'`]?(?![a-z0-9_])/,/(?:replace|change|switch)\s+(?:the\s+)?["'`]?thinking["'`]?\s+(?:with|to)\s+["'`]?reasoning[_\.]effort["'`]?(?![a-z0-9_])/].some(t=>t.test(e))):!1}function Ta(e){return e?Object.entries(e).some(([e,t])=>wa(`${e}: ${t}`)):!1}function Ea(e){let t=e=>{if(typeof e==`number`&&Number.isInteger(e)&&e>=100&&e<=599)return e;if(typeof e==`string`&&/^\d{3}$/.test(e.trim())){let t=Number(e.trim());return t>=100&&t<=599?t:void 0}};for(let n of[`status`,`statusCode`,`httpStatus`,`httpStatusCode`]){let r=t(e[n]);if(r!==void 0)return r}let n=(e,r)=>{if(r>2)return;if(Array.isArray(e)){for(let t of e){let e=n(t,r+1);if(e!==void 0)return e}return}let i=j(e);if(i){for(let e of[`status`,`statusCode`,`httpStatus`,`httpStatusCode`,`code`]){let n=t(i[e]);if(n!==void 0)return n}for(let e of[`details`,`error`,`cause`,`diagnostics`]){let t=n(i[e],r+1);if(t!==void 0)return t}}};for(let t of[`diagnostics`,`diagnostic`,`details`,`error`,`cause`]){let r=n(e[t],0);if(r!==void 0)return r}if(typeof e.errorMessage==`string`){let t=e.errorMessage;for(let e of[/^\s*([1-5]\d{2})\b/,/^\s*(?:http(?:\s+status)?|status(?:\s+code)?)\s*[:(]?\s*([1-5]\d{2})\b/i,/^\s*[^():\n]{1,100}\(\s*([1-5]\d{2})\b/,/^\s*(?:error|api\s+error|provider\s+error|request\s+failed|http\s+error)\s*[:(]\s*([1-5]\d{2})\b/i]){let n=e.exec(t);if(n)return Number(n[1])}}}function Da(e){let t=yn(e);return!t||t.stopReason!==`error`?!1:Ea(t)===400&&wa(t.errorMessage)}function Oa(e){return!!e&&wn(e.api)&&bn(e)}function ka(e,t){if(!t||!Oa(t)||!Da(e))return!1;let n=yn(e);if(!n)return!1;let r=A(n.provider),i=A(n.responseModel,n.model);return(!r||r===t.provider)&&(!i||i===t.id)}async function Aa(e,t,n,r){let i=B(e);if(n.add(i),r.has(i))return;r.add(i);let a=await ac(),o=Zs(a)&&a.provider===e.provider&&a.modelId===e.id?`A matching confirmed fix receipt exists; run /cache-optimizer rollback to undo it safely.`:`Run /cache-optimizer fix to review a model-scoped repair.`;t.ui.notify(`⚠️ ${g}: ${i} rejected the configured reasoning format. ${o} No configuration was changed automatically.`,`warning`)}function ja(e){let t=B(e),n=t.indexOf(`/`);return{providerLabel:n>0?t.slice(0,n):t,modelId:e.id}}function Ma(...e){let t=e.filter(e=>e!==void 0);if(t.length===0)return;let n=t[0];return{providerLabel:n.providerLabel,modelId:n.modelId,compatKeys:Object.assign({},...t.map(e=>e.compatKeys)),forceModelLevel:t.some(e=>e.forceModelLevel===!0)}}function Na(e,t=!1){if(!t||!bn(e)||!wn(e.api))return;let n=N(e);if(n.thinkingFormat!==void 0&&n.thinkingFormat!==`deepseek`&&n.thinkingFormat!==`openai`)return;let r=ja(e),i={};if(n.thinkingFormat!==`openai`&&(i.thinkingFormat=`openai`),n.supportsReasoningEffort!==!0&&(i.supportsReasoningEffort=!0),n.requiresReasoningContentOnAssistantMessages===!0&&(i.requiresReasoningContentOnAssistantMessages=!1),Object.keys(i).length!==0)return{...r,compatKeys:i,forceModelLevel:!0}}function Pa(e,t){return{providers:{[e]:{compat:t}}}}function Fa(e,t,n){return{providers:{[e]:{modelOverrides:{[t]:{compat:n}}}}}}function Ia(e,t,n){let r=t.providerLabel;if(r){if(e.push(``),e.push(`If this channel has no models.json provider entry yet:`),e.push(`- Keep existing authentication as-is; do not copy credentials, tokens, or API keys.`),e.push(`- Add only cache/routing compat overrides in ${P()}.`),Object.keys(n).length===0){e.push(`- No safe copyable override is available for the missing flags shown above.`);return}e.push(`Provider-level minimal override:`),e.push(JSON.stringify(Pa(r,n),null,2)),t.modelId&&(e.push(`Single-model override (use this if only this model should change):`),e.push(JSON.stringify(Fa(r,t.modelId,n),null,2)))}}function La(e,t,n={}){let r=ya(t);Object.keys(r).length>0&&(n.includeJsonIntro!==!1&&e.push(`Safe default suggestion:`),e.push(JSON.stringify(r,null,2))),t.includes(`sendSessionAffinityHeaders`)&&e.push(`- sendSessionAffinityHeaders: recommended for third-party proxies when supported; it helps keep one Pi session on the same upstream/backend.`),Ia(e,n,r)}function Ra(e,t){t.includes(`supportsLongCacheRetention`)&&(e.push(``),e.push(`Optional (not required, not auto-fixed):`),e.push(`- supportsLongCacheRetention: enable only after your endpoint/proxy explicitly supports OpenAI long prompt cache retention.`),e.push(`- ${ba()}`))}function G(e,t){let n=e.indexOf(`/`),r=n>0?e.slice(0,n):e,i=n>0?e.slice(n+1):void 0,a=P(),o=[`💡 pi-cache-optimizer: ${e} is a third-party OpenAI-compatible proxy but merged compat lacks ${t.join(` and `)}.`,`Edit ${a} -> providers["${r}"] -> compat (at the same level as baseUrl/api/apiKey/models).`,``];return La(o,t,{providerLabel:r,modelId:i}),o.join(`
|
|
17
|
-
`)}function za(e){return bn(e)&&wn(e.api)&&N(e).thinkingFormat===`deepseek`}function Ba(e){if(!za(e))return[];let t=N(e),n=[];return t.requiresReasoningContentOnAssistantMessages!==!0&&n.push(`requiresReasoningContentOnAssistantMessages`),n}function Va(e){return za(e)}function Ha(e){return za(e)}function Ua(e){if(Kn(e))return qn(e);let t=W(e);return za(e)&&t.push(...Ba(e)),t}function Wa(e){let t={...ya(e)};return e.includes(`requiresReasoningContentOnAssistantMessages`)&&(t.requiresReasoningContentOnAssistantMessages=!0),t}function Ga(e,t,n={}){let r=Wa(t);Object.keys(r).length>0&&(e.push(`Recommended DeepSeek reasoning/replay compat snippet:`),e.push(JSON.stringify(r,null,2))),t.includes(`requiresReasoningContentOnAssistantMessages`)&&e.push(`- requiresReasoningContentOnAssistantMessages: true keeps replayed assistant turns compatible with an explicitly selected DeepSeek reasoning wire format.`),t.includes(`sendSessionAffinityHeaders`)&&e.push(`- sendSessionAffinityHeaders: recommended for third-party OpenAI-compatible proxies when supported; it helps keep one Pi session on the same upstream/backend.`),Ia(e,n,r)}function Ka(e,t){let n=e.indexOf(`/`),r=n>0?e.slice(0,n):e,i=n>0?e.slice(n+1):void 0,a=P(),o=[`💡 pi-cache-optimizer: ${e} is DeepSeek-like but merged compat lacks ${t.join(` and `)}.`,`Proxies may reduce or hide cache hits. Edit ${a} -> providers["${r}"] -> compat (at the same level as baseUrl/api/apiKey/models).`,``];return Ga(o,t,{providerLabel:r,modelId:i}),o.join(`
|
|
18
|
-
`)}const qa=[{id:`deepseek`,label:`DS cache`,matchesModel:bn,matchesAssistantMessage(e,t){return F(e)?xn(e,t):!1},normalizeUsage(e){return H(e,ua,{allowInputOnlyPiUsage:!0})},warningText(e){let t=Ua(e);if(t.length===0)return;let n=B(e);return za(e)?Ka(n,t):G(n,t)}},{id:`claude`,label:`Claude cache`,showCacheWrite:!0,matchesModel:In,matchesAssistantMessage(e,t){return F(e)?Ln(e,t):!1},normalizeUsage(e){return H(e,da)},warningText(e){if(In(e)&&Sn(e.api)&&!Tn(e)&&N(e).cacheControlFormat!==`anthropic`)return`💡 Cache optimizer: ${B(e)} looks Claude/Anthropic-like but OpenAI-compatible compat lacks cacheControlFormat: "anthropic". Pi may not place Anthropic cache_control breakpoints unless this endpoint supports and enables that compat flag.`}},{id:`openai`,label:`OpenAI cache`,matchesModel:Pn,matchesAssistantMessage(e,t){return F(e)?Fn(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`gemini`,label:`Gemini cache`,matchesModel:Rn,matchesAssistantMessage(e,t){return F(e)?zn(e,t):!1},normalizeUsage(e){return H(e,fa)}},{id:`openai`,label:`Kimi cache`,matchesModel:Zn,matchesAssistantMessage(e,t){return F(e)?Qn(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`Qwen cache`,matchesModel:$n,matchesAssistantMessage(e,t){return F(e)?er(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`GLM cache`,matchesModel:tr,matchesAssistantMessage(e,t){return F(e)?nr(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`MiniMax cache`,matchesModel:rr,matchesAssistantMessage(e,t){return F(e)?ir(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`Mimo cache`,matchesModel:ar,matchesAssistantMessage(e,t){return F(e)?or(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`Hunyuan cache`,matchesModel:sr,matchesAssistantMessage(e,t){return F(e)?cr(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`Mistral cache`,matchesModel:lr,matchesAssistantMessage(e,t){return F(e)?ur(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`Grok cache`,matchesModel:dr,matchesAssistantMessage(e,t){return F(e)?fr(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`Llama cache`,matchesModel:pr,matchesAssistantMessage(e,t){return F(e)?mr(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`Nemotron cache`,matchesModel:hr,matchesAssistantMessage(e,t){return F(e)?gr(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`Cohere cache`,matchesModel:_r,matchesAssistantMessage(e,t){return F(e)?vr(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`Yi cache`,matchesModel:br,matchesAssistantMessage(e,t){return F(e)?xr(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`Doubao cache`,matchesModel:Cr,matchesAssistantMessage(e,t){return F(e)?wr(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`ERNIE cache`,matchesModel:Tr,matchesAssistantMessage(e,t){return F(e)?Er(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`Baichuan cache`,matchesModel:Dr,matchesAssistantMessage(e,t){return F(e)?Or(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`StepFun cache`,matchesModel:kr,matchesAssistantMessage(e,t){return F(e)?Ar(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`Spark cache`,matchesModel:jr,matchesAssistantMessage(e,t){return F(e)?Mr(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`InternLM cache`,matchesModel:Nr,matchesAssistantMessage(e,t){return F(e)?Pr(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`Gemma cache`,matchesModel:Fr,matchesAssistantMessage(e,t){return F(e)?Ir(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`Phi cache`,matchesModel:Rr,matchesAssistantMessage(e,t){return F(e)?zr(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`Jamba cache`,matchesModel:Br,matchesAssistantMessage(e,t){return F(e)?Vr(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`Solar cache`,matchesModel:Hr,matchesAssistantMessage(e,t){return F(e)?Ur(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`Sonar cache`,matchesModel:Wr,matchesAssistantMessage(e,t){return F(e)?Gr(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`Nova cache`,matchesModel:Kr,matchesAssistantMessage(e,t){return F(e)?qr(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`Reka cache`,matchesModel:Jr,matchesAssistantMessage(e,t){return F(e)?Yr(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`Falcon cache`,matchesModel:Xr,matchesAssistantMessage(e,t){return F(e)?Zr(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`DBRX cache`,matchesModel:Qr,matchesAssistantMessage(e,t){return F(e)?$r(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`MPT cache`,matchesModel:ei,matchesAssistantMessage(e,t){return F(e)?ti(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`StableLM cache`,matchesModel:ni,matchesAssistantMessage(e,t){return F(e)?ri(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`Aquila cache`,matchesModel:ii,matchesAssistantMessage(e,t){return F(e)?ai(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`EXAONE cache`,matchesModel:oi,matchesAssistantMessage(e,t){return F(e)?si(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`HyperCLOVA cache`,matchesModel:ci,matchesAssistantMessage(e,t){return F(e)?li(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`Luminous cache`,matchesModel:ui,matchesAssistantMessage(e,t){return F(e)?di(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`Hermes cache`,matchesModel:fi,matchesAssistantMessage(e,t){return F(e)?pi(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`Granite cache`,matchesModel:mi,matchesAssistantMessage(e,t){return F(e)?hi(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`Arctic cache`,matchesModel:gi,matchesAssistantMessage(e,t){return F(e)?_i(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`Pangu cache`,matchesModel:vi,matchesAssistantMessage(e,t){return F(e)?yi(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`SenseNova cache`,matchesModel:bi,matchesAssistantMessage(e,t){return F(e)?xi(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`Zhinao cache`,matchesModel:Si,matchesAssistantMessage(e,t){return F(e)?Ci(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`MiniCPM cache`,matchesModel:wi,matchesAssistantMessage(e,t){return F(e)?Ti(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`XVERSE cache`,matchesModel:Ei,matchesAssistantMessage(e,t){return F(e)?Di(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`Orion cache`,matchesModel:Oi,matchesAssistantMessage(e,t){return F(e)?ki(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`OpenChat cache`,matchesModel:Ai,matchesAssistantMessage(e,t){return F(e)?ji(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`Vicuna cache`,matchesModel:Mi,matchesAssistantMessage(e,t){return F(e)?Ni(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`Wizard cache`,matchesModel:Pi,matchesAssistantMessage(e,t){return F(e)?Fi(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`Zephyr cache`,matchesModel:Ii,matchesAssistantMessage(e,t){return F(e)?Li(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`Dolphin cache`,matchesModel:Ri,matchesAssistantMessage(e,t){return F(e)?zi(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`OpenOrca cache`,matchesModel:Bi,matchesAssistantMessage(e,t){return F(e)?Vi(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`Starling cache`,matchesModel:Hi,matchesAssistantMessage(e,t){return F(e)?Ui(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`BLOOM cache`,matchesModel:Wi,matchesAssistantMessage(e,t){return F(e)?Gi(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`RWKV cache`,matchesModel:Ki,matchesAssistantMessage(e,t){return F(e)?qi(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}},{id:`openai`,label:`Aya cache`,matchesModel:Ji,matchesAssistantMessage(e,t){return F(e)?Yi(e,t):!1},normalizeUsage(e){return H(e,V)},warningText(e){let t=W(e);if(t.length!==0)return G(B(e),t)}}];function Ja(e){return qa.find(t=>t.matchesModel(e))}function Ya(e,t){let n=Zi(e,t);return qa.find(t=>t.matchesAssistantMessage(e,n))}function Xa(e,t,n){if(!e)return;if(Kn(e)){let r=qn(e);if(r.length>0){let i=`adaptive-thinking:${B(e)}`;n.has(i)||(n.add(i),t.ui.notify(Xn(B(e),r),`warning`))}}let r=Ja(e),i=r?.warningText?.(e);if(!r||!i)return;let a=`${r.id}:${B(e)}`;n.has(a)||(n.add(a),t.ui.notify(i,`warning`))}function Za(){let e=new Date;return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)}`}function K(e=Za()){return{day:e,totalRequests:0,hitRequests:0,cachedInputTokens:0,cacheWriteInputTokens:0,totalInputTokens:0}}function Qa(e=Za()){return Object.fromEntries(ie.map(t=>[t,K(e)]))}function $a(e,t){e.totalRequests+=1,t.cacheRead>0&&(e.hitRequests+=1),e.cachedInputTokens+=t.cacheRead,e.cacheWriteInputTokens+=t.cacheWrite,e.totalInputTokens+=t.totalInput}function eo(e){let t=Math.max(0,Math.round(e))/1e6;return t===0?`0M`:t<.001?`${t.toFixed(4)}M`:t<.01?`${t.toFixed(3)}M`:t>=10?`${t.toFixed(1)}M`:`${t.toFixed(2)}M`}function to(e,t){let n=t.totalInputTokens>0?t.cachedInputTokens/t.totalInputTokens*100:0,r=e.showCacheWrite&&t.cacheWriteInputTokens>0?`·write ${eo(t.cacheWriteInputTokens)}`:``;return`${e.label} ${t.hitRequests}/${t.totalRequests}·${eo(t.cachedInputTokens)}/${eo(t.totalInputTokens)} ${n.toFixed(1)}%${r}`}function no(e){return!e||e.startsWith(`· `)?e:`· ${e}`}function ro(e,t){return t<=0?`N/A`:`${Math.round(e/t*100)}%`}function io(e){let t=Math.max(0,Math.round(e))/1e6;return t===0?`0`:t<.01?t.toFixed(4):t>=10?t.toFixed(1):t.toFixed(2)}function ao(e,t){let n=ia(e);if(!n)return!0;let r=xt(n,`input`),i=xt(n,`cacheRead`),a=xt(n,`cacheWrite`);if(i!==void 0||a!==void 0||r!==void 0&&r>0)return!1;let o=t.normalizeUsage(e);return!o||o.cacheRead===0&&o.cacheWrite===0&&o.totalInput===0}function oo(e,t){let n=e.slice(-t);if(n.length===0)return`Recent ${t}: no samples yet`;let r=n.filter(e=>e.hit).length,i=n.reduce((e,t)=>e+t.cachedInputTokens,0),a=n.reduce((e,t)=>e+t.totalInputTokens,0),o=n.filter(e=>e.missingUsageFields).length;ro(r,n.length);let s=a>0?ro(i,a):`N/A`,c=`Recent ${n.length}/${t}: ${r}/${n.length} hits · ${s} tok cached`;return o>0&&(c+=` · ${o} missing usage`),c}function so(e){let t=e.totalInputTokens>0?e.cachedInputTokens/e.totalInputTokens*100:0;return`${e.hitRequests}/${e.totalRequests}·${eo(e.cachedInputTokens)}/${eo(e.totalInputTokens)} ${t.toFixed(1)}%`}function co(e,t){let n=e.indexOf(`/`);if(!(n<=0||n>=e.length-1))return So(t??{provider:e.slice(0,n),id:e.slice(n+1)})}function lo(e,t){return e.sort(([e],[n])=>e===t?-1:n===t?1:e.localeCompare(n))}function uo(e,t,n={}){let r=t?B(t):void 0,i={...e};t&&Ja(t)&&!i[r]&&(i[r]=K());let a=lo(Object.entries(i),r);if(a.length===0)return`ℹ️ No cache statistics recorded for the current session today.`;let o=[`Scope: current session`,`Day: ${Za()}`,`Models: ${a.length}`];for(let[e,t]of a){let r=co(e,n[e]),i=r?Ja(r):void 0;o.push(``,`── ${e} ──`,`Adapter: ${i?.label??`Unknown cache adapter`}`),o.push(`Requests: ${t.hitRequests} hit / ${t.totalRequests} total`),o.push(`Cached tokens: ${eo(t.cachedInputTokens)} / ${eo(t.totalInputTokens)} input · ${t.totalInputTokens>0?`${(t.cachedInputTokens/t.totalInputTokens*100).toFixed(1)}%`:`0.0%`}`),o.push(`Summary: ${so(t)}`),t.cacheWriteInputTokens>0&&o.push(`Cache write: ${eo(t.cacheWriteInputTokens)}`)}return o.join(`
|
|
19
|
-
`)}function fo(e){let t=lo(Object.entries(e.totalsByModel));if(t.length===0)return`ℹ️ No local cache statistics recorded today.`;let n=Object.keys(e.instancesBySession).length,r=Object.values(e.instancesBySession).reduce((e,t)=>e+t,0),i=[`Scope: all local sessions`,`Day: ${Za()}`,`Sessions: ${n}`,`Instances: ${r}`];for(let[n,r]of t){let t=co(n,e.modelRefsByKey[n]),a=t?Ja(t):void 0;i.push(``,`── ${n} ──`,`Adapter: ${a?.label??`Unknown cache adapter`}`),i.push(`Sessions: ${e.sessionsByModel[n]??0} · Instances: ${e.instancesByModel[n]??0}`),i.push(`Requests: ${r.hitRequests} hit / ${r.totalRequests} total`),i.push(`Cached tokens: ${eo(r.cachedInputTokens)} / ${eo(r.totalInputTokens)} input · ${r.totalInputTokens>0?`${(r.cachedInputTokens/r.totalInputTokens*100).toFixed(1)}%`:`0.0%`}`),i.push(`Summary: ${so(r)}`),r.cacheWriteInputTokens>0&&i.push(`Cache write: ${eo(r.cacheWriteInputTokens)}`)}return i.join(`
|
|
20
|
-
`)}function po(e,t,n){if(!t)return`ℹ️ No active model selected.`;let r=B(t),i=Object.entries(e.bySession).filter(([,e])=>e[r]).sort(([e],[t])=>e===n?-1:t===n?1:e.localeCompare(t));if(i.length===0)return`ℹ️ No contributors recorded for ${r} today.`;let a=[`Model: ${r}`,`Scope: contributing local sessions today`],o=0;for(let[t,s]of i){let i=t===n?`Current session`:`Other session ${++o}`;a.push(``,i,` Instances: ${e.instancesBySessionModel[t]?.[r]??0}`,` ${so(s[r])}`)}return a.join(`
|
|
21
|
-
`)}function mo(e,t,n,r){let i=[];if(!e||!t)return i.push(`ℹ️ No cache-adapter-matched model active. Select a model with a recognized provider family.`),i.join(`
|
|
22
|
-
`);let a=B(e),o=n??K();return i.push(`Model key: ${a}`),i.push(`Adapter: ${t.label}`),i.push(``),i.push(`── Today ──`),i.push(`Requests: ${o.hitRequests} hit / ${o.totalRequests} total · ${ro(o.hitRequests,o.totalRequests)}`),i.push(`Cached tokens: ${io(o.cachedInputTokens)}M / ${io(o.totalInputTokens)}M input · ${o.totalInputTokens>0?`${Math.round(o.cachedInputTokens/o.totalInputTokens*100)}%`:`N/A`}`),o.cacheWriteInputTokens>0&&i.push(`Cache write: ${io(o.cacheWriteInputTokens)}M tok`),i.push(``),i.push(`── Recent trend ──`),i.push(oo(r,10)),i.push(oo(r,30)),r.some(e=>e.missingUsageFields)&&(i.push(``),i.push(`⚠️ Some recent responses had missing or empty cache usage fields. Footer may under-report hits.`),i.push(` The proxy may not return prompt_cache_hit_tokens or usage.input/cacheRead in responses.`)),i.join(`
|
|
23
|
-
`)}function q(e){return typeof e==`object`&&e&&`code`in e?String(e.code):void 0}function ho(e){let t=j(e);if(!t||typeof t.day!=`string`||!/^\d{4}-\d{2}-\d{2}$/.test(t.day))return;let n=xt(t,`totalRequests`),r=xt(t,`hitRequests`),i=xt(t,`cachedInputTokens`),a=xt(t,`cacheWriteInputTokens`)??0,o=xt(t,`totalInputTokens`);if(!(n===void 0||r===void 0||i===void 0||o===void 0||r>n||i>o||a>o))return{day:t.day,totalRequests:n,hitRequests:r,cachedInputTokens:i,cacheWriteInputTokens:a,totalInputTokens:o}}function go(e){return{...e}}function _o(e,t){e.totalRequests+=t.totalRequests,e.hitRequests+=t.hitRequests,e.cachedInputTokens+=t.cachedInputTokens,e.cacheWriteInputTokens+=t.cacheWriteInputTokens,e.totalInputTokens+=t.totalInputTokens}function vo(e,t){return!e||t.day>e.day?go(t):(t.day<e.day||_o(e,t),e)}function yo(e){let t={};for(let[n,r]of Object.entries(e))t[yt(n)]=vo(t[yt(n)],r);return t}function bo(e){let t=j(e);if(!t)return;let n={};for(let[e,r]of Object.entries(t)){let t=ho(r);t&&(n[e]=t)}return n}function xo(e){let t=j(e),n=t?.provider,r=t?.id,i=t?.name;if(U(n)&&U(r))return{provider:n.trim(),id:r.trim(),name:U(i)?i.trim():r.trim()}}function So(e){return{id:e.id,name:e.name??e.id,provider:e.provider,api:``,baseUrl:``,reasoning:!1,input:[`text`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:0,maxTokens:0}}function Co(e,t,n,r,i,a={}){if(e===`total`)return r[B(i)];if(e===`process`)return a[B(i)];if(t)return n[vt(t,i.provider,i.id)]}function wo(e,t,n,r={},i=`total`,a={}){if(!e||!n)return;let o=So(n),s=Ja(o);if(s)return{model:o,adapter:s,stats:Co(i,e,t,r,o,a)??K()}}function To(e,t,n,r,i={}){let a=e===`total`?Object.entries(r):e===`process`?Object.entries(i):t?Object.entries(n).filter(([e])=>e.startsWith(`${t}:`)).map(([e,n])=>[e.slice(t.length+1),n]):[],o;for(let[e,t]of a){let n=e.indexOf(`/`);if(n<1||n>=e.length-1)continue;let r=So({provider:e.slice(0,n),id:e.slice(n+1)}),i=Ja(r);i&&(!o||t.totalRequests>o.total)&&(o={model:r,adapter:i,stats:t,total:t.totalRequests})}return o?{model:o.model,adapter:o.adapter,stats:o.stats}:void 0}function Eo(e){let t=j(e);if(t){if(t.version===4||t.version===5||t.version===6){let e={},n=j(t.legacyFamily);if(n)for(let t of ie){let r=ho(n[t]);r&&(e[t]=r)}let r={},i=j(t.sessions);if(i)for(let[e,t]of Object.entries(i)){let n=j(t);if(n)for(let[t,i]of Object.entries(n)){let n=ho(i);n&&(r[`${e}:${t}`]=n)}}let a={},o=j(t.lastRoutedModelBySession);if(o)for(let[e,t]of Object.entries(o)){let n=xo(t);n&&(a[e]=n)}return{statsByModel:r,totalsByModel:bo(t.totalsByModel)??yo(r),legacyFamily:e,lastRoutedModelBySession:a}}if(t.version===3){let e={},n=j(t.statsByModel);if(n)for(let[t,r]of Object.entries(n)){let n=ho(r);n&&(e[t]=n)}let r={},i=j(t.legacyFamily);if(i)for(let e of ie){let t=ho(i[e]);t&&(r[e]=t)}return{statsByModel:e,totalsByModel:yo(e),legacyFamily:r}}if(t.version===2){let e=j(t.statsByProvider),n={};if(e)for(let t of ie){let r=ho(e[t]);r&&(n[t]=r)}return{statsByModel:{},totalsByModel:{},legacyFamily:n}}if(t.version===1){let e=ho(t.stats);return e?{statsByModel:{},totalsByModel:{},legacyFamily:{deepseek:e}}:void 0}}}async function Do(){try{let e=await(0,t.readFile)(v,`utf8`);return Eo(JSON.parse(e))}catch(e){if(q(e)!==`ENOENT`){console.warn(`${g}: failed to read persisted cache stats`,e);return}}try{let e=await(0,t.readFile)(y,`utf8`),n=Eo(JSON.parse(e));if(n){try{await No(n);try{await(0,t.unlink)(y)}catch(e){q(e)!==`ENOENT`&&console.warn(`${g}: failed to remove legacy stats file`,e)}}catch(e){console.warn(`${g}: failed to migrate legacy cache stats`,e)}return n}}catch(e){q(e)!==`ENOENT`&&console.warn(`${g}: failed to read legacy cache stats`,e)}}function Oo(e,t){if(!e||!t)return{};let n=`${t}:`,r={};for(let[i,a]of Object.entries(e.statsByModel))i.startsWith(n)?r[i]=a:i.includes(`:`)?i.startsWith(`_nosession:`)&&(r[`${t}:${i.slice(11)}`]=a):r[`${t}:${i}`]=a;return r}function ko(e,t,n){let r={};for(let[t,n]of Object.entries(e))r[t]={...n};if(n!==void 0){let e=`${n}:`,i={};for(let[n,r]of Object.entries(t.statsByModel))n.startsWith(e)&&(i[n.slice(e.length)]=r);r[n]=i,delete r._nosession}else{let e={};for(let[n,i]of Object.entries(t.statsByModel)){let t=n.indexOf(`:`);if(t>=0){let e=n.slice(0,t),a=n.slice(t+1);r[e]||(r[e]={}),r[e][a]=i}else e[n]=i}Object.keys(e).length>0&&(r._nosession=e)}return r}function Ao(){let e=Promise.resolve();return t=>{let n=e.then(t);return e=n.catch(()=>void 0),n}}function jo(e,t,n={}){let r=n.replaceTotals?{...t}:{...e,...t};for(let e of n.deleteModelKeys??[])delete r[e];return r}function Mo(e,t,n){let r={...e},i=t.lastRoutedModelBySession??{};if(n!==void 0){let e=i[n];return e?r[n]=e:delete r[n],r}for(let[e,t]of Object.entries(i))r[e]=t;return r}async function No(e,n,r={}){await(0,t.mkdir)(_,{recursive:!0});let i={},a={},o={};try{let e=await(0,t.readFile)(v,`utf8`),n=Eo(JSON.parse(e));if(n){for(let[e,t]of Object.entries(n.statsByModel)){let n=e.indexOf(`:`);if(n>=0){let r=e.slice(0,n),a=e.slice(n+1);i[r]||(i[r]={}),i[r][a]=t}}a={...n.totalsByModel??{}},o={...n.lastRoutedModelBySession??{}}}}catch{}let s=ko(i,e,n),c=jo(a,e.totalsByModel,r),l=Mo(o,e,n),u={version:6,sessions:s,totalsByModel:c,legacyFamily:e.legacyFamily,...Object.keys(l).length>0?{lastRoutedModelBySession:l}:{}},d=`${v}.${process.pid}.${Date.now()}.tmp`;await(0,t.writeFile)(d,JSON.stringify(u,null,2)+`
|
|
24
|
-
`,`utf8`),await(0,t.rename)(d,v)}function Po(t){return(0,i.join)(te,`${(0,e.createHash)(`sha256`).update(t).digest(`hex`)}.json`)}function Fo(e){return`initial:${e}`}function Io(e){let t=j(e);return t?.version===1&&U(t.epoch)?t.epoch.trim():void 0}async function Lo(e,n){try{return Io(JSON.parse(await(0,t.readFile)(e,`utf8`)))??n}catch{return n}}async function Ro(){return Lo(S,Fo(`global`))}async function zo(e){return Lo(Po(e),Fo(`model:${e}`))}async function Bo(n,r){await(0,t.mkdir)((0,i.dirname)(n),{recursive:!0});let a=`${n}.${process.pid}.${Date.now()}.${(0,e.randomUUID)()}.tmp`;await(0,t.writeFile)(a,JSON.stringify({version:1,epoch:r,createdAt:Date.now()},null,2)+`
|
|
25
|
-
`,`utf8`),await(0,t.rename)(a,n)}async function Vo(){let t=`${Date.now()}-${(0,e.randomUUID)()}`;return await Bo(S,t),t}async function Ho(t){let n=`${Date.now()}-${(0,e.randomUUID)()}`;return await Bo(Po(t),n),n}function Uo(e){let t=j(e),n=j(t?.process),r=j(t?.lifecycle),i=j(t?.models);if(t?.version!==7||t.kind!==`pi-cache-optimizer-shard`||!U(t.instanceId)||!U(t.sessionHash)||!n||!Number.isInteger(n.pid)||!Number.isInteger(n.ppid)||typeof n.instanceStartedAt!=`number`||!r||r.state!==`active`&&r.state!==`closed`||typeof r.createdAt!=`number`||typeof r.updatedAt!=`number`||!U(t.day)||!/^\d{4}-\d{2}-\d{2}$/.test(t.day)||!U(t.globalEpoch)||!i)return;let a={};for(let[e,t]of Object.entries(i)){let n=j(t),r=ho(n?.stats);n&&r&&U(n.modelEpoch)&&U(n.provider)&&U(n.modelId)&&e===`${n.provider.trim()}/${n.modelId.trim()}`&&(a[e]={modelEpoch:n.modelEpoch.trim(),provider:n.provider.trim(),modelId:n.modelId.trim(),...U(n.modelName)?{modelName:n.modelName.trim()}:{},...U(n.api)?{api:n.api.trim()}:{},stats:r})}let o=xo(t.lastRoutedModel);return{version:7,kind:`pi-cache-optimizer-shard`,instanceId:t.instanceId.trim(),sessionHash:t.sessionHash.trim(),process:{pid:Number(n.pid),ppid:Number(n.ppid),instanceStartedAt:n.instanceStartedAt},lifecycle:{state:r.state,createdAt:r.createdAt,updatedAt:r.updatedAt,...typeof r.closedAt==`number`?{closedAt:r.closedAt}:{}},day:t.day,globalEpoch:t.globalEpoch.trim(),models:a,...o?{lastRoutedModel:o}:{}}}async function Wo(n,r){await(0,t.mkdir)((0,i.dirname)(n),{recursive:!0});let a=`${n}.${process.pid}.${Date.now()}.${(0,e.randomUUID)()}.tmp`;await(0,t.writeFile)(a,JSON.stringify(r,null,2)+`
|
|
26
|
-
`,`utf8`),await(0,t.rename)(a,n)}async function Go(e=b){let n;try{n=await(0,t.readdir)(e)}catch(e){if(q(e)===`ENOENT`)return[];throw e}let r=[];for(let a of n){if(!/^[0-9a-f-]+\.json$/i.test(a))continue;let n=(0,i.join)(e,a);try{let e=await(0,t.lstat)(n);if(!e.isFile()||e.isSymbolicLink())continue;let i=Uo(JSON.parse(await(0,t.readFile)(n,`utf8`))),o=a.slice(0,-5);i&&i.instanceId===o&&r.push(i)}catch{}}return r}async function Ko(e,t=Za()){let n=await Ro(),r=new Map,i={bySession:{},totalsByModel:{},instancesBySession:{},instancesBySessionModel:{},sessionsByModel:{},instancesByModel:{},modelRefsByKey:{},lastRoutedModelBySession:{}},a=new Map,o=new Map,s=new Map;for(let c of e){if(c.day!==t||c.globalEpoch!==n)continue;let e=!1;c.lastRoutedModel&&(a.get(c.sessionHash)??-1)<c.lifecycle.updatedAt&&(a.set(c.sessionHash,c.lifecycle.updatedAt),i.lastRoutedModelBySession[c.sessionHash]=c.lastRoutedModel);for(let[n,a]of Object.entries(c.models)){let l=r.get(n);if(l||(l=await zo(n),r.set(n,l)),a.modelEpoch!==l||a.stats.day!==t)continue;e=!0;let u=i.bySession[c.sessionHash]??={};u[n]=vo(u[n],a.stats),i.totalsByModel[n]=vo(i.totalsByModel[n],a.stats),i.instancesByModel[n]=(i.instancesByModel[n]??0)+1,(o.get(n)??-1)<c.lifecycle.updatedAt&&(o.set(n,c.lifecycle.updatedAt),i.modelRefsByKey[n]={provider:a.provider,id:a.modelId,name:a.modelName??a.modelId});let d=i.instancesBySessionModel[c.sessionHash]??={};d[n]=(d[n]??0)+1;let f=s.get(n)??new Set;f.add(c.sessionHash),s.set(n,f)}e&&(i.instancesBySession[c.sessionHash]=(i.instancesBySession[c.sessionHash]??0)+1)}for(let[e,t]of s)i.sessionsByModel[e]=t.size;return i}async function qo(e=b){return Ko(await Go(e))}function Jo(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(e){return q(e)===`EPERM`}}async function Yo(){for(let e of[v,y])try{await(0,t.unlink)(e)}catch(t){q(t)!==`ENOENT`&&console.warn(`${g}: failed to remove obsolete stats file ${e}`,t)}}async function Xo(e=Date.now(),n=b){let r;try{r=await(0,t.readdir)(n)}catch(e){return q(e)===`ENOENT`?0:Promise.reject(e)}let a=Za(),o=0;for(let s of r){let r=/^[0-9a-f-]+\.json$/i.test(s),c=s.endsWith(`.tmp`);if(!r&&!c)continue;let l=(0,i.join)(n,s);try{let n=await(0,t.lstat)(l);if(!n.isFile()||n.isSymbolicLink())continue;if(c){if(e-n.mtimeMs<864e5)continue}else{let r=Uo(JSON.parse(await(0,t.readFile)(l,`utf8`)));if(r?.day===a||e-(r?.lifecycle.updatedAt??n.mtimeMs)<1728e5||r?.lifecycle.state===`active`&&Jo(r.process.pid))continue}await(0,t.unlink)(l),o+=1}catch{}}return o}async function Zo(n=Date.now()){await(0,t.mkdir)(ne,{recursive:!0});try{if(n-(await(0,t.stat)(w)).mtimeMs<216e5)return}catch{}try{await(0,t.mkdir)(C)}catch(e){if(q(e)!==`EEXIST`)return;try{if(n-(await(0,t.stat)(C)).mtimeMs<=36e5)return;await(0,t.rm)(C,{recursive:!0,force:!0}),await(0,t.mkdir)(C)}catch{return}}try{await Xo(n);let r=`${w}.${process.pid}.${(0,e.randomUUID)()}.tmp`;await(0,t.writeFile)(r,`${n}\n`,`utf8`),await(0,t.rename)(r,w)}finally{await(0,t.rm)(C,{recursive:!0,force:!0})}}function Qo(e){return wn(e.api)&&ga(e)&&!Tn(e)}function $o(e){return Sn(e.api)&&ga(e)&&!Tn(e)&&N(e).supportsLongCacheRetention===!0}function es(e){return Sn(e.api)&&!ha(e)&&!Tn(e)}function ts(e){return!wn(e.api)||!ga(e)||Tn(e)?!1:N(e).sendSessionAffinityHeaders===!0}function ns(e){return!wn(e.api)||!ga(e)||Tn(e)?!1:N(e).sendSessionAffinityHeaders!==!0}function rs(e){let t=[],n=M(e.api),r=M(e.baseUrl||``),i=M(e.provider);if(n===`azure-openai-responses`||Mn(n)||!Sn(n)||!ga(e)||Tn(e))return t;if(r.includes(`openrouter.ai`)||r.includes(`openrouter`)||i.includes(`openrouter`)){let n=j(N(e).openRouterRouting),r=!!n?.only,i=!!n?.order;return t.push(`🔀 Router/channel: OpenRouter detected. OpenRouter is a multi-provider router; low cache hit rates are common when each turn lands on a different upstream provider.`),!r&&!i&&(t.push(` Suggestion: Add an openRouterRouting config to fix the upstream provider. Example for models.json -> providers["<providerId>"] -> compat:`),t.push(` { "sendSessionAffinityHeaders": true, "supportsLongCacheRetention": true, "openRouterRouting": { "only": ["<provider-slug>"] } }`),t.push(` Replace <provider-slug> with the actual OpenRouter provider slug (e.g. "openai", "anthropic").`),t.push(` Alternatively, use openRouterRouting.order: ["<provider-slug>", "..."] for fallback order. Only set supportsLongCacheRetention if your upstream supports long cache retention.`)),t}if(r.includes(`ai-gateway.vercel.sh`)||i.includes(`vercel`)||i.includes(`vercel-ai-gateway`)){let n=j(N(e).vercelGatewayRouting),r=!!n?.only,i=!!n?.order;return t.push(`🔀 Router/channel: Vercel AI Gateway detected. The gateway may route to different provider endpoints per request, reducing cache locality.`),!r&&!i&&(t.push(` Suggestion: Add a vercelGatewayRouting config to fix the upstream. Example for models.json -> providers["<providerId>"] -> compat:`),t.push(` { "sendSessionAffinityHeaders": true, "supportsLongCacheRetention": true, "vercelGatewayRouting": { "only": ["<provider-id>"] } }`),t.push(` Replace <provider-id> with the actual Vercel provider ID (e.g. "openai").`),t.push(` Only set supportsLongCacheRetention if your upstream supports it.`)),t}let a=[`litellm`,`oneapi`,`one-api`,`newapi`,`new-api`,`voapi`,`vo-api`];if(a.some(e=>r.includes(e))||a.some(e=>i.includes(e)))return t.push(`🔀 Router/channel: Self-hosted aggregation proxy detected (LiteLLM / OneAPI / NewAPI / VoAPI). These proxies route to multiple upstream accounts or instances, which can split the cache.`),t.push(` Suggestions:`),t.push(` • Ensure the proxy can fix to a single upstream per session (session_id affinity).`),t.push(` • Forward prompt_cache_key and session-affinity headers to the upstream.`),t.push(` • Return cache usage fields (prompt_cache_hit_tokens, etc.) in the response.`),t.push(` Safe compat default: { "sendSessionAffinityHeaders": true }`),t.push(` Add supportsLongCacheRetention only if the proxy explicitly supports prompt_cache_retention.`),t;if(n===`openai-completions`&&r){let n=Ua(e);return t.push(`🔀 Router/channel: Third-party OpenAI-compatible proxy. If cache hit rates are low:`),t.push(` • Verify the proxy routes to the same upstream account/instance per session.`),t.push(` • Ensure the proxy forwards prompt_cache_key and sends session-affinity headers.`),t.push(` • Check that the proxy returns cache usage fields (prompt_cache_hit_tokens etc.).`),n.length>0&&t.push(` • The compat flags above (${n.join(`, `)}) are recommended for cache stability.`),t}return t}function is(e){let t=M(e.api);return Mn(t)?[`ℹ️ Compat check not applicable for this model.`," Native Mistral `mistral-conversations` uses provider-native transport; OpenAI-compatible proxy compat flags do not apply."]:t===`azure-openai-responses`?[`ℹ️ Compat check not applicable for this model.`,` Native Azure OpenAI Responses uses the Responses transport; OpenAI-compatible proxy compat flags do not apply.`]:t===`openai-codex-responses`||t===`openai-responses`&&ha(e)?[`ℹ️ Compat check not applicable for this model.`,` Native Responses transports already use Pi core request handling; OpenAI-compatible proxy compat flags do not apply.`]:Sn(t)&&!U(e.baseUrl)?[`ℹ️ Compat check not applicable for this model.`,` Upstream endpoint metadata is unavailable; session-affinity header injection is disabled.`]:[`ℹ️ Compat check not applicable for this model.`]}function as(e,t={}){let n=[];n.push(`Provider: ${e.provider}`),n.push(`Model: ${e.id}`),e.name&&e.name!==e.id&&n.push(`Name: ${e.name}`),n.push(`API: ${e.api}`),n.push(`Base URL: ${e.baseUrl||`(default)`}`);let r=N(e);n.push(`Compat: ${JSON.stringify(r)}`);let i=Kn(e),a=Va(e),o=Ua(e),s=i?[]:va(e),c=ps(e),l=c?Object.keys(c.compatKeys):[],u=o.filter(e=>!l.includes(e));if(l.length>0&&n.push(`⚠️ Missing compat flags: ${l.join(`, `)}`),u.length>0&&n.push(`ℹ️ Optional: ${u.join(`, `)} (enable only if needed)`),o.length>0){let t=B(e),r=t.indexOf(`/`),c=r>0?t.slice(0,r):t,l=P();n.push(`Edit ${l} -> providers["${c}"] -> compat (same level as baseUrl/api/apiKey/models).`),i?Yn(n,o,{providerLabel:c,modelId:e.id}):a?(Ga(n,o,{providerLabel:c,modelId:e.id}),Ra(n,s)):(La(n,o,{providerLabel:c,modelId:e.id}),Ra(n,s))}else i||a||Qo(e)?(n.push(`✅ Compat fully configured.`),Ra(n,s)):n.push(...is(e));$o(e)&&(n.push(``),t.promptCacheRetention400?(n.push(`⚠️ A 400 response was observed while supportsLongCacheRetention is enabled.`),n.push(` ${ba()}`)):n.push(`ℹ️ Long retention is enabled. ${ba()}`)),t.anthropicTtlOrderError&&(n.push(``),n.push(`⚠️ An Anthropic cache-control TTL ordering error was observed for this model.`),n.push(` Runtime requests now fall back from 1h to the default 5-minute cache TTL.`),n.push(` Run /cache-optimizer fix to set model-level supportsLongCacheRetention: false in ${P()}.`)),ts(e)?(n.push(``),t.sessionAffinity403?(n.push(`⚠️ A 403 response was observed while sendSessionAffinityHeaders is enabled.`),n.push(` The proxy/CDN likely blocks Pi's custom session-affinity headers (session_id,`),n.push(` x-client-request-id, x-session-affinity). Run /cache-optimizer fix to`),n.push(` set sendSessionAffinityHeaders: false in ${P()}.`)):(n.push(`ℹ️ Session affinity headers are enabled. Some CDNs/WAFs block custom headers`),n.push(` (session_id, x-client-request-id, x-session-affinity) and return 403. If you`),n.push(` see 403 errors, run /cache-optimizer fix to set sendSessionAffinityHeaders: false.`))):ns(e)&&(n.push(``),t.openAISdkHeader403?(n.push(`⚠️ A 403 response was observed while sendSessionAffinityHeaders is not enabled.`),n.push(` The proxy/CDN may be blocking the OpenAI JS SDK request fingerprint`),n.push(` (for example User-Agent: OpenAI/JS ... or X-Stainless-* headers). This`),n.push(` is provider/WAF-specific; /cache-optimizer fix will not auto-write headers.`),n.push(` Manual workaround: add a provider-level headers.User-Agent override in ${P()}`),n.push(` only after testing the value with the affected provider.`)):(n.push(`ℹ️ If 403 persists after disabling sendSessionAffinityHeaders, some CDNs/WAFs`),n.push(` may block the OpenAI JS SDK User-Agent / X-Stainless-* headers. Test the`),n.push(` provider manually before adding a provider-level headers.User-Agent override.`)));let d=rs(e);if(d.length>0){n.push(``);for(let e of d)n.push(e)}if(_e>0){let e=Date.now()-_e,t=Math.floor(e/6e4);t<5&&(n.push(``),n.push(`⚠️ Recent prompt integrity issue detected:`),n.push(` Last detected ${t>0?`${t} min`:`${Math.floor(e/1e3)}s`} ago. The prompt reorder was`),n.push(` skipped on that turn to preserve structural markers.`),n.push(` Common causes: extension system prompt format change, substring collision.`),n.push(` Steps:`),n.push(` 1. Run /reload to reset (may clear transient issues).`),n.push(` 2. Set PI_CACHE_OPTIMIZER_NO_PROMPT_REWRITE=1 & /reload to disable reorder.`),n.push(` 3. If persistent, file an issue with this doctor output.`))}return n.join(`
|
|
27
|
-
`)}function os(e,t,n,r){let i=[],a=ps(e),o=a?Object.keys(a.compatKeys):[],s=rs(e),c=r.filter(e=>e.missingUsageFields).length,l=r.slice(-10),u=l.filter(e=>e.hit).length,d=l.length,f=l.reduce((e,t)=>e+t.cachedInputTokens,0),p=l.reduce((e,t)=>e+t.totalInputTokens,0),m=n??K(),h=o.length>0,g=s.length>0,_=c>0,v=m.totalInputTokens>0?Math.round(m.cachedInputTokens/m.totalInputTokens*100):0,y=h||_||m.totalRequests>3&&m.totalInputTokens>0&&m.cachedInputTokens/m.totalInputTokens<.3||d>=3&&u===0;if(!y&&!(g&&(h||_)))return i;if(i.push(``),i.push(`── Cache diagnosis ──`),h&&(i.push(`⚠️ Missing compat flags: ${o.join(`, `)}`),i.push(` These flags enable prompt caching and session-affinity routing.`),i.push(` Run /cache-optimizer compat for edit instructions.`)),g&&(h||_||y)&&i.push(`🔀 Router/channel proxy detected — see routing notes above.`),_&&(i.push(`⚠️ ${c}/${r.length} recent responses had missing/empty usage fields.`),i.push(` Footer may under-report cache hit rate.`),i.push(` Verify the proxy returns prompt-level usage (prompt_tokens, input_tokens_details).`)),d>0&&(p>0&&Math.round(f/p*100),u===0&&m.totalRequests>3&&v<30?(i.push(`📉 Cache hit rate is low: ${v}% today (${d} recent samples).`),i.push(` Likely causes: proxy routing to different backends per request,`),i.push(` or prompt prefix changes across turns.`),i.push(` Verify session affinity (sendSessionAffinityHeaders) and long cache retention.`)):v<30&&m.totalRequests>3&&(i.push(`📉 Cache hit rate is low: ${v}% today (${m.totalRequests} total requests).`),i.push(` Check compat flags and proxy upstream routing.`)),d>=3)){let e=oo(r,10);i.push(`📊 ${e}`)}return!h&&!g&&m.totalRequests>3&&v<30&&(i.push(`💡 Compat is configured but cache hit rate remains low.`),i.push(` Possible causes:`),i.push(` • Proxy still routes to multiple backends — check session affinity on the proxy side.`),i.push(` • Prompt prefix varies per turn — check dynamic context in system prompt.`),i.push(` • Provider does not return cache usage fields — footer can't measure hits.`)),i}function ss(e){let t=Ua(e),n=ps(e),r=n?Object.keys(n.compatKeys):[],i=t.filter(e=>!r.includes(e)),a=Kn(e),o=Va(e),s=a?[]:va(e),c=rs(e);if(t.length===0&&c.length===0&&s.length===0)return;let l=B(e),u=[];if(t.length>0){let n=l.indexOf(`/`),c=n>0?l.slice(0,n):l,d=P();u.push(`Active model: ${l}`),r.length>0&&u.push(`Safe-fixable: ${r.join(`, `)}`),i.length>0&&u.push(`Optional: ${i.join(`, `)} (enable only if needed)`),u.push(``),u.push(`Edit ${d} -> providers["${c}"] -> compat`),u.push(`(at the same level as baseUrl/api/apiKey/models).`),a?Yn(u,t,{providerLabel:c,modelId:e.id}):o?(Ga(u,t,{providerLabel:c,modelId:e.id}),Ra(u,s)):(La(u,t,{providerLabel:c,modelId:e.id}),Ra(u,s))}if((c.length>0||s.length>0)&&t.length===0&&(a||o||Qo(e)?(u.push(`✅ Compat fully configured.`),$o(e)&&u.push(ba()),ts(e)?u.push(`ℹ️ Session affinity headers are enabled. If you see 403 "blocked" errors,`,` the proxy/CDN may be blocking Pi's custom headers. Set sendSessionAffinityHeaders: false.`):ns(e)&&u.push(`ℹ️ If 403 persists with sendSessionAffinityHeaders disabled, the proxy/CDN may`,` be blocking the OpenAI JS SDK User-Agent / X-Stainless-* headers. Test a`,` provider-level headers.User-Agent override manually; /fix does not auto-write it.`),Ra(u,s)):u.push(...is(e)),u.push(``)),c.length>0){t.length>0&&u.push(``);for(let e of c)u.push(e)}return u.join(`
|
|
28
|
-
`)}const J=(0,i.join)(_,`models.json`);function cs(e){return e===` `||e===`
|
|
29
|
-
`||e===`\r`||e===` `}function Y(e,t){for(;t<e.length&&cs(e[t]);)t++;return t}function ls(e,t){if(e[t]!==`"`)return;let n=t+1,r=``;for(;n<e.length;){let t=e[n];if(t===`\\`){let t=e[n+1];if(t===void 0)return;if(t===`u`){let t=e.slice(n+2,n+6);if(!/^[0-9a-fA-F]{4}$/.test(t))return;r+=String.fromCharCode(parseInt(t,16)),n+=6}else r+=t===`n`?`
|
|
30
|
-
`:t===`t`?` `:t===`r`?`\r`:t===`b`?`\b`:t===`f`?`\f`:t,n+=2;continue}if(t===`"`)return{value:r,end:n+1};r+=t,n++}}function X(e,t){let n=e[t];if(n!==`{`&&n!==`[`)return;let r=0,i=t;for(;i<e.length;){let t=e[i];if(t===`"`){let t=ls(e,i);if(!t)return;i=t.end;continue}if(t===`{`||t===`[`)r++;else if((t===`}`||t===`]`)&&(r--,r===0))return i;i++}}function us(e,t){t=Y(e,t);let n=e[t];if(n===`"`)return ls(e,t)?.end;if(n===`{`||n===`[`){let n=X(e,t);return n===void 0?void 0:n+1}let r=t;for(;r<e.length&&!`,}]`.includes(e[r])&&!cs(e[r]);)r++;return r>t?r:void 0}function Z(e,t,n){if(e[t]!==`{`)return;let r=t+1,i,a=0;for(;r<e.length;){if(r=Y(e,r),r>=e.length)return;if(e[r]===`}`)return i;if(e[r]===`,`){r++;continue}if(e[r]!==`"`)return;let t=r,o=ls(e,r);if(!o||(r=Y(e,o.end),e[r]!==`:`))return;r=Y(e,r+1),o.value===n&&(a++,i={keyStart:t,valueStart:r,count:a});let s=us(e,r);if(s===void 0)return;r=s}}function ds(e,t){let n=e.lastIndexOf(`
|
|
31
|
-
`,t-1);n=n<0?0:n+1;let r=e.slice(n,t).match(/^[ \t]*/);return r?r[0]:``}function fs(e,t,n){let r=e.indexOf(`
|
|
32
|
-
`,t+1);if(r>=0&&r<n){let t=r+1,n=``;for(;t<e.length&&(e[t]===` `||e[t]===` `);)n+=e[t],t++;if(n.length>0)return n}return ds(e,t)+` `}function ps(e){let t=Ua(e);if(t.length===0)return;let n={};if(n=Kn(e)?Jn(t):Va(e)?Wa(t):ya(t),Object.keys(n).length===0)return;let r=B(e),i=r.indexOf(`/`);return{providerLabel:i>0?r.slice(0,i):r,modelId:e.id,compatKeys:n}}function Q(e){let t=[],n=0;for(;n<e.length;){let r=e[n];if(r===`"`){for(t.push(r),n++;n<e.length;){let r=e[n];if(t.push(r),n++,r===`\\`&&n<e.length)t.push(e[n]),n++;else if(r===`"`)break}continue}if(r===`/`&&n+1<e.length&&e[n+1]===`/`){for(t.push(` `,` `),n+=2;n<e.length&&e[n]!==`
|
|
33
|
-
`;)t.push(` `),n++;continue}if(r===`/`&&n+1<e.length&&e[n+1]===`*`){for(t.push(` `,` `),n+=2;n<e.length;){if(e[n]===`*`&&n+1<e.length&&e[n+1]===`/`){t.push(` `,` `),n+=2;break}t.push(e[n]===`
|
|
34
|
-
`?`
|
|
35
|
-
`:` `),n++}continue}t.push(r),n++}return t.join(``)}function ms(e){let t=e.split(``),n=0;for(;n<t.length;){if(t[n]===`"`){let t=ls(e,n);if(!t)break;n=t.end;continue}if(t[n]===`,`){let e=n+1;for(;e<t.length&&cs(t[e]);)e++;(t[e]===`}`||t[e]===`]`)&&(t[n]=` `)}n++}return t.join(``)}function hs(e){return JSON.parse(ms(Q(e)))}function gs(e,t,n,r){let i=j(j(j(e)?.providers)?.[t]);if(!i)return;let a=j(j(j(i.modelOverrides)?.[n])?.compat);if(a&&Object.prototype.hasOwnProperty.call(a,r))return{source:`modelOverride`,value:a[r]};let o=j(Ct(Array.isArray(i.models)?i.models:void 0,n)?.compat);if(o&&Object.prototype.hasOwnProperty.call(o,r))return{source:`model`,value:o[r]};let s=j(i.compat);if(s&&Object.prototype.hasOwnProperty.call(s,r))return{source:`provider`,value:s[r]}}function _s(e,t,n){return gs(e,t,n,`supportsLongCacheRetention`)?.value===!0}function vs(e,t,n){let r=Q(e),i=Y(r,0);if(r[i]!==`{`)return;let a=Z(r,i,`providers`);if(!a||a.count!==1)return;let o=Y(r,a.valueStart);if(r[o]!==`{`)return;let s=X(r,o);if(s===void 0)return;let c=Z(r,o,t);if(!c||c.count!==1||c.keyStart>s)return;let l=Y(r,c.valueStart);if(r[l]!==`{`)return;let u=X(r,l);if(u===void 0||u>s)return;let d=Z(r,l,`compat`);if(d?.count&&d.count>1)return;let f=Z(r,l,`models`);if(f?.count&&f.count>1)return;let p=-1,m=-1,h=-1,g=-1,_=-1,v=-1,y=0,ee=0,b=Z(r,l,`modelOverrides`);if(!(b?.count&&b.count>1)){if(b&&b.keyStart<u){let e=Y(r,b.valueStart);if(r[e]!==`{`)return;let t=X(r,e);if(t===void 0||t>u)return;p=e,m=t;let i=Z(r,e,n);if(y=i?.count??0,i?.count&&i.count>1)return;if(i&&i.keyStart<t){let e=Y(r,i.valueStart);if(r[e]!==`{`)return;let n=X(r,e);if(n===void 0||n>t)return;h=e,g=n;let a=Z(r,e,`compat`);if(ee=a?.count??0,a?.count&&a.count>1)return;if(a&&a.keyStart<n){let e=Y(r,a.valueStart);if(r[e]!==`{`)return;let t=X(r,e);if(t===void 0||t>n)return;_=e,v=t}}}return{providerKeyCount:c.count,modelOverridesKeyCount:b?.count??0,modelOverrideKeyCount:y,modelOverrideCompatKeyCount:ee,providerObjectBrace:l,providerObjectEnd:u,modelOverridesObjectBrace:p,modelOverridesObjectEnd:m,modelOverrideObjectBrace:h,modelOverrideObjectEnd:g,modelOverrideCompatBrace:_,modelOverrideCompatEnd:v}}}function ys(e,t,n){let r=Q(e),i=Y(r,0);if(r[i]!==`{`)return;let a=Z(r,i,`providers`);if(!a||a.count!==1)return;let o=Y(r,a.valueStart);if(r[o]!==`{`)return;let s=X(r,o);if(s===void 0)return;let c=Z(r,o,t);if(!c||c.count!==1||c.keyStart>s)return;let l=Y(r,c.valueStart);if(r[l]!==`{`)return;let u=X(r,l);if(u===void 0||u>s)return;let d=-1,f=-1,p=Z(r,l,`compat`),m=p?.count??0;if(p?.count&&p.count>1)return;if(p&&p.keyStart<u){let e=Y(r,p.valueStart);if(r[e]!==`{`)return;let t=X(r,e);if(t===void 0||t>u)return;d=e,f=t}let h=Z(r,l,`modelOverrides`);if(h?.count&&h.count>1)return;if(h){let e=Y(r,h.valueStart);if(r[e]!==`{`)return;let t=X(r,e);if(t===void 0||t>u)return;let i=Z(r,e,n);if(i?.count&&i.count>1)return;if(i){let e=Y(r,i.valueStart);if(r[e]!==`{`)return;let n=X(r,e);if(n===void 0||n>t)return;let a=Z(r,e,`compat`);if(a?.count&&a.count>1)return}}let g=vs(e,t,n),_=g?.modelOverrideObjectBrace??-1,v=g?.modelOverrideObjectEnd??-1,y=g?.modelOverrideCompatBrace??-1,ee=g?.modelOverrideCompatEnd??-1,b=Z(r,l,`models`);if(!b||b.count!==1||b.keyStart>u)return;let x=Y(r,b.valueStart);if(r[x]!==`[`)return;let te=X(r,x);if(te===void 0||te>u)return;x++;let ne=[],S=-1,C=-1,w=-1,T=-1,E=-1,re=0;for(;x<te;){if(x=Y(r,x),r[x]===`,`){x++;continue}if(x>=te||r[x]===`]`)break;if(r[x]!==`{`)return;let e=x,t=X(r,e);if(t===void 0||t>te)return;let i=Z(r,e,`id`);if(i?.count&&i.count>1)return;let a;if(i&&i.keyStart<t){let e=ls(r,Y(r,i.valueStart));e&&e.end<=t&&(a=e.value)}if(a!==void 0&&ne.push(a),a===n){S=e,C=t,w=-1,T=-1,E=-1;let n=Z(r,S,`compat`);if(re=n?.count??0,n?.count&&n.count>1)return;if(n&&n.keyStart<C){w=n.keyStart;let e=Y(r,n.valueStart);if(r[e]!==`{`)return;let t=X(r,e);if(t===void 0||t>C)return;T=e,E=t}}x=t+1}if(S<0||C<0)return;let D=e.lastIndexOf(`
|
|
36
|
-
`,S);D<0&&(D=0);let ie=e.slice(D,S).match(/^(\s*)/),ae=(ie?ie[1]:` `)+` `;return{modelObjectBrace:S,modelObjectEnd:C,compatKeyStart:w>=0?w:-1,compatObjectBrace:T,compatObjectEnd:E,indent:ae,providerObjectBrace:l,providerObjectEnd:u,providerCompatBrace:d,providerCompatEnd:f,modelOverrideObjectBrace:_,modelOverrideObjectEnd:v,modelOverrideCompatBrace:y,modelOverrideCompatEnd:ee,providerKeyCount:c.count,modelOverrideKeyCount:g?.modelOverrideKeyCount??0,modelCompatKeyCount:re,providerCompatKeyCount:m,allModelIds:ne}}function bs(e,t,n){let r=Q(e),i=Y(r,0);if(r[i]!==`{`)return;let a=Z(r,i,`providers`);if(!a||a.count!==1)return;let o=Y(r,a.valueStart);if(r[o]!==`{`)return;let s=X(r,o);if(s===void 0)return;let c=Z(r,o,t);if(!c)return{scenario:`provider_missing`,providersBrace:o,providersEnd:s};if(c.count!==1||c.keyStart>s)return;let l=Y(r,c.valueStart);if(r[l]!==`{`)return;let u=X(r,l);if(u===void 0||u>s)return;let d=Z(r,l,`models`);if(!(d?.count&&d.count>1)){if(d&&d.keyStart<u){let e=Y(r,d.valueStart);if(r[e]!==`[`)return;let t=X(r,e);if(t===void 0||t>u)return;let i=e+1,a=!1;for(;i<t;){if(i=Y(r,i),r[i]===`,`){i++;continue}if(i>=t||r[i]===`]`)break;if(r[i]!==`{`)return;let e=X(r,i);if(e===void 0||e>t)return;let o=Z(r,i,`id`);if(!o||o.count!==1)return;let s=ls(r,Y(r,o.valueStart));if(!s||s.end>e)return;if(s.value===n){a=!0;let e=Z(r,i,`compat`);if(e?.count&&e.count>1)return}i=e+1}return a?void 0:{scenario:`model_missing`,modelsEnd:t,providerBrace:l,providerEndBrace:u}}return{scenario:`provider_without_models`,providerBrace:l,providerEndBrace:u}}}function xs(e,t,n){let r=[],i=Object.entries(n).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>` ${JSON.stringify(e)}: ${JSON.stringify(t)}`);return r.push(`${JSON.stringify(e)}: {`),r.push(` "modelOverrides": {`),r.push(` ${JSON.stringify(t)}: {`),r.push(` "compat": {`),r.push(i.join(`,
|
|
37
|
-
`)),r.push(` }`),r.push(` }`),r.push(` }`),r.push(` }`),r.join(`
|
|
38
|
-
`)}function Ss(e,t,n,r){let i=vs(e,t,n);if(i?.modelOverrideObjectBrace!==void 0&&i.modelOverrideObjectBrace>=0)return{modifiedText:js(e,{providerKeyCount:i.providerKeyCount,modelObjectBrace:-1,modelObjectEnd:-1,compatKeyStart:-1,compatObjectBrace:-1,compatObjectEnd:-1,indent:``,providerObjectBrace:i.providerObjectBrace,providerObjectEnd:i.providerObjectEnd,providerCompatBrace:-1,providerCompatEnd:-1,modelOverrideObjectBrace:i.modelOverrideObjectBrace,modelOverrideObjectEnd:i.modelOverrideObjectEnd,modelOverrideCompatBrace:i.modelOverrideCompatBrace,modelOverrideCompatEnd:i.modelOverrideCompatEnd,modelOverrideKeyCount:i.modelOverrideKeyCount,modelCompatKeyCount:0,providerCompatKeyCount:0,allModelIds:[]},r,`modelOverride`),placementLabel:`providers["${t}"] -> modelOverrides["${n}"] -> compat`};let a=Object.entries(r).sort(([e],[t])=>e.localeCompare(t)),o=(e,t)=>{let r=e+t,i=r+t,o=a.map(([e,t])=>`${i}${JSON.stringify(e)}: ${JSON.stringify(t)}`).join(`,
|
|
39
|
-
`);return`${e}${JSON.stringify(n)}: {\n${r}"compat": {\n${o}\n${r}}\n${e}}`},s=(e,t)=>{let n=t-1;for(;n>=0&&cs(e[n]);)n--;return e[n]!==`{`&&e[n]!==`,`};if(i){let r=Q(e);if(i.modelOverridesObjectBrace>=0){let a=ds(e,i.modelOverridesObjectBrace),c=fs(e,i.modelOverridesObjectBrace,i.modelOverridesObjectEnd),l=c.length>a.length?c.slice(a.length):` `,u=`${s(r,i.modelOverridesObjectEnd)?`,`:``}\n${o(c,l)}\n${a}`;return{modifiedText:e.slice(0,i.modelOverridesObjectEnd)+u+e.slice(i.modelOverridesObjectEnd),placementLabel:`providers["${t}"] -> modelOverrides -> (new entry "${n}")`}}let a=ds(e,i.providerObjectBrace),c=fs(e,i.providerObjectBrace,i.providerObjectEnd),l=c.length>a.length?c.slice(a.length):` `,u=`\n${c}"modelOverrides": {\n${o(c+l,l)}\n${c}},`;return{modifiedText:e.slice(0,i.providerObjectBrace+1)+u+e.slice(i.providerObjectBrace+1),placementLabel:`providers["${t}"] -> (new modelOverrides entry "${n}")`}}let c=bs(e,t,n);if(!c||c.scenario!==`provider_missing`)return;let l=Q(e),u=ds(e,c.providersEnd),d=fs(e,c.providersBrace,c.providersEnd),f=d.length>u.length?d.slice(u.length):` `,p=d+f,m=p+f,h=`${s(l,c.providersEnd)?`,`:``}\n${d}${JSON.stringify(t)}: {\n${p}"modelOverrides": {\n${o(m,f)}\n${p}}\n${d}}\n${u}`;return{modifiedText:e.slice(0,c.providersEnd)+h+e.slice(c.providersEnd),placementLabel:`providers -> (new modelOverrides-only entry "${t}/${n}")`}}function Cs(e,t,n,r,i){let a=Q(e),o=t=>{let n=e.lastIndexOf(`
|
|
40
|
-
`,t),r=e.slice(n<0?0:n+1,t).match(/^(\s+)/);return r?r[1]:` `},s=Object.entries(i).sort(([e],[t])=>e.localeCompare(t)),c=e=>{if(s.length===1){let[e,t]=s[0];return`{ ${JSON.stringify(e)}: ${JSON.stringify(t)} }`}return`{
|
|
41
|
-
`+s.map(([t,n])=>`${e}${JSON.stringify(t)}: ${JSON.stringify(n)}`).join(`,
|
|
42
|
-
`)+`
|
|
43
|
-
`+e.slice(0,-2)+`}`};if(t.scenario===`model_missing`){let i=o(t.modelsEnd),s=i+i,l=s+i,u=l+i,d=a.slice(a.lastIndexOf(`[`,t.modelsEnd)+1,t.modelsEnd).trim().length>0,f=c(u),p=[d?`,`:``,s+`{`,l+`"id": ${JSON.stringify(r)},`,l+`"compat": `+f,s+`}`,i].filter(Boolean).join(`
|
|
44
|
-
`),m=t.modelsEnd,h=e.slice(0,m),g=e.slice(m);return{modifiedText:h+p+g,placementLabel:`providers["${n}"] -> models -> (new entry for "${r}")`}}if(t.scenario===`provider_missing`){let i=o(t.providersEnd),s=i+i,l=s+i,u=l+i,d=u+i,f=c(d),p=[a.slice(a.lastIndexOf(`{`,t.providersEnd)+1,t.providersEnd).trim().length>0?`,`:``,s+`"${n}": {`,l+`"models": [`,u+`{`,d+`"id": ${JSON.stringify(r)},`,d+`"compat": `+f,u+`}`,l+`]`,s+`}`,i].filter(Boolean).join(`
|
|
45
|
-
`),m=t.providersEnd,h=e.slice(0,m),g=e.slice(m);return{modifiedText:h+p+g,placementLabel:`providers -> (new entry "${n}")`}}let l=o(t.providerBrace),u=l+l,d=u+l,f=d+l,p=c(f),m=t.providerBrace+1,h=[``,u+`"models": [`,d+`{`,f+`"id": ${JSON.stringify(r)},`,f+`"compat": `+p,d+`}`,u+`],`,l].join(`
|
|
46
|
-
`);return{modifiedText:e.slice(0,m)+h+e.slice(m),placementLabel:`providers["${n}"] -> (new "models" array with "${r}")`}}function ws(e,t,n,r,i,a){try{let o=hs(e),s=hs(t),c=j(j(s)?.providers);if(!c)return`Modified file: providers object missing or invalid`;let l=j(c[n]);if(!l)return`Modified file: provider "${n}" not found`;let u=l.models,d=Array.isArray(u)?u.find(e=>j(e)?.id===r):void 0,f=j(j(l.modelOverrides)?.[r]);if(!d&&!f)return`Modified file: model or modelOverrides entry "${r}" not found in provider after insertion`;let p=a?Et(a,s):void 0;for(let[e,t]of Object.entries(i)){if(p){if(!Object.prototype.hasOwnProperty.call(p,e))return`Modified file: effective compat.${e} not found`;if(p[e]!==t)return`Modified file: effective compat.${e} wrong value: expected ${JSON.stringify(t)}, got ${JSON.stringify(p[e])}`;continue}let i=gs(s,n,r,e);if(!i)return`Modified file: effective compat.${e} not found`;if(i.value!==t)return`Modified file: effective compat.${e} wrong value: expected ${JSON.stringify(t)}, got ${JSON.stringify(i.value)} from ${i.source}`}let m=JSON.parse(JSON.stringify(s)),h=j(j(j(o)?.providers)?.[n]),g=j(m.providers);if(!g)return`Modified file: normalized providers object missing`;if(!h)delete g[n];else if(f){let e=j(g[n]),t=j(e?.modelOverrides),a=j(h.modelOverrides),o=j(a?.[r]);if(!e||!t)return`Modified file: modelOverrides["${r}"] missing during structure validation`;if(!o)delete t[r],a||delete e.modelOverrides;else{let e=j(t[r]);if(!e)return`Modified file: modelOverrides["${r}"] invalid`;let n=j(o.compat),a=j(e.compat);if(!n)delete e.compat;else{if(!a)return`Modified file: modelOverrides["${r}"].compat invalid`;for(let e of Object.keys(i))Object.prototype.hasOwnProperty.call(n,e)?a[e]=n[e]:delete a[e]}}}else{let e=j(g[n]),t=e?.models,i=h.models;if(!e||!Array.isArray(t))return`Modified file: provider "${n}".models missing during structure validation`;e.models=t.filter(e=>j(e)?.id!==r),Array.isArray(i)||delete e.models}if(!Ts(m,o,[]))return`Modified file: original structure was altered (data loss detected)`;let _=Q(t),v=X(_,Y(_,0));return v===void 0?`Modified file: root bracket mismatch`:Y(_,v+1)===_.length?null:`Modified file: trailing content after root object`}catch(e){return`Self-check error: ${e instanceof Error?e.message:String(e)}`}}function Ts(e,t,n){if(e===t)return!0;if(typeof e!=typeof t)return!1;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(!Ts(e[r],t[r],n))return!1;return!0}if(typeof e==`object`&&e&&typeof t==`object`&&t){let r=Object.keys(e).filter(e=>!n.includes(e)),i=Object.keys(t);if(r.length!==i.length)return!1;for(let i of r)if(!(i in t)||!Ts(e[i],t[i],n))return!1;return!0}return!1}const Es=new Set([`sendSessionAffinityHeaders`,`supportsLongCacheRetention`]);function Ds(e,t){return{provider:e,id:t,name:t}}function Os(e,t,n){let r=n.filter(Boolean);if(r.length<=1)return{placement:`provider`,reason:`this provider has only one model — provider-level compat is equivalent and easier to maintain`};let i=[];for(let n of Object.keys(e))if(!Es.has(n)){if(n===`forceAdaptiveThinking`){r.every(e=>{let n=Ds(t,e);return Un(n)||Wn(n)})||i.push(n);continue}if(n===`allowEmptySignature`){r.every(e=>Wn(Ds(t,e)))||i.push(n);continue}if(n===`thinkingFormat`||n===`requiresReasoningContentOnAssistantMessages`){i.push(n);continue}i.push(n)}return i.length===0?{placement:`provider`,reason:`all ${r.length} models in this provider are compatible with these flags`}:{placement:`model`,reason:`${i.join(`, `)} could break sibling models in this provider (${r.length} models total) — scoping to this model only`}}function ks(e,t,n,r){if(t<0||n<=t)return[];let i=Q(e);return r.filter(e=>{let r=Z(i,t,e);return!!r&&r.keyStart<n})}function As(e,t,n,r,i=!1){if(t.modelOverrideObjectBrace>=0)return{placement:`modelOverride`,reason:`an existing modelOverrides entry has Pi's highest precedence — repairing it directly`};if(i)return{placement:`modelOverride`,reason:`runtime-observed provider/model failure — using Pi's highest-precedence model override`};let a=Os(n,r,t.allModelIds),o=ks(e,t.compatObjectBrace,t.compatObjectEnd,Object.keys(n));return a.placement===`provider`&&o.length>0?{placement:`model`,reason:`model-level compat already contains ${o.join(`, `)} — repairing the active model override directly`}:a}function js(e,t,n,r=`model`){let i=r===`provider`?t.providerCompatBrace:r===`modelOverride`?t.modelOverrideCompatBrace:t.compatObjectBrace,a=r===`provider`?t.providerCompatEnd:r===`modelOverride`?t.modelOverrideCompatEnd:t.compatObjectEnd,o=r===`provider`?t.providerObjectBrace:r===`modelOverride`?t.modelOverrideObjectBrace:t.modelObjectBrace,s=Object.entries(n).sort(([e],[t])=>e.localeCompare(t)),c=(e,t)=>t.map(([t,n])=>`${e}${JSON.stringify(t)}: ${JSON.stringify(n)}`).join(`,
|
|
47
|
-
`),l=t=>{let n=e.lastIndexOf(`
|
|
48
|
-
`,t);n<0&&(n=-1);let r=e.slice(n+1,t).match(/^(\s*)/);return r?r[1]:``};if(i>=0&&a>i){let t=i+1,n=e.slice(t,a),r=n.trim().length>0,o=Q(e),u=l(i),d=n.match(/\r?\n([ \t]+)\S/),f=d?d[1]:u+` `,p=[],m=[];for(let[t,n]of s){let r=Z(o,i,t);if(r&&r.keyStart<a){let t=Y(o,r.valueStart),i=us(o,t);if(i!==void 0&&i<=a){let r=JSON.stringify(n);e.slice(t,i)!==r&&p.push({start:t,end:i,text:r});continue}}m.push([t,n])}if(m.length>0){let e=c(f,m);r?p.push({start:t,end:t,text:`\n${e},`}):p.push({start:t,end:a,text:`\n${e}\n${u}`})}return p.sort((e,t)=>t.start-e.start).reduce((e,t)=>e.slice(0,t.start)+t.text+e.slice(t.end),e)}let u=o+1,d=e.slice(u),f=l(o),p=d.match(/^\r?\n([ \t]+)\S/),m=p?p[1]:f+` `,h=`\n${m}"compat": {\n${c(m+(m.startsWith(f)&&m.length>f.length?m.slice(f.length):` `),s)}\n${m}},`;return e.slice(0,u)+h+d}function Ms(e,t,n,r,i,a=`model`,o){try{let u=hs(e),d=hs(t),f=j(j(d)?.providers);if(!f)return`Modified file: providers object missing or invalid`;let p=j(f[n]);if(!p)return`Modified file: provider "${n}" not found`;let m=p.models;if(!Array.isArray(m))return`Modified file: provider "${n}".models is not an array`;if(m.length===0)return`Modified file: provider "${n}".models is empty`;let h=m.find(e=>e.id===r);if(!h||typeof h!=`object`)return`Modified file: model "${r}" not found in provider`;let g=j(j(j(u)?.providers)?.[n]),_=(Array.isArray(g?.models)?g.models:void 0)?.find(e=>j(e)?.id===r),v=j(_);if(!g||!v)return`Original file: provider/model "${n}/${r}" not found`;let y=p.compat,ee=y&&typeof y==`object`&&!Array.isArray(y)?y:{},b=h.compat;if(b!==void 0&&(typeof b!=`object`||!b||Array.isArray(b)))return`Modified file: model "${r}" compat is not an object`;let x=b??{},te=j(j(p.modelOverrides)?.[r])?.compat;if(te!==void 0&&!j(te))return`Modified file: modelOverrides["${r}"].compat is not an object`;let ne=j(te)??{},S=o?Et(o,d):{...ee,...x,...ne};for(let[e,t]of Object.entries(i)){if(!(e in S))return`Modified file: compat.${e} not found at provider or model level (insertion failed)`;if(S[e]!==t)return`Modified file: effective compat.${e} has wrong value: expected ${JSON.stringify(t)}, got ${JSON.stringify(S[e])}`}let C=e=>a===`provider`&&e===g||a===`model`&&e===v||a===`modelOverride`&&e===j(j(g.modelOverrides)?.[r]);function s(e,t){let n=e===void 0?{}:j(e),r=j(t);if(!n||!r)return!1;let a=new Set([...Object.keys(n),...Object.keys(i)]),o=Object.keys(r);if(o.length!==a.size||o.some(e=>!a.has(e)))return!1;for(let e of a){if(Object.prototype.hasOwnProperty.call(i,e)){if(!Object.prototype.hasOwnProperty.call(r,e)||r[e]!==i[e])return!1;continue}if(!Object.prototype.hasOwnProperty.call(n,e)||!c(n[e],r[e]))return!1}return!0}function c(e,t){if(e===t)return!0;if(typeof e!=typeof t||e===null||t===null)return!1;if(Array.isArray(e)||Array.isArray(t))return!Array.isArray(e)||!Array.isArray(t)||e.length!==t.length?!1:e.every((e,n)=>c(e,t[n]));if(typeof e!=`object`)return!1;let n=e,r=t,i=Object.keys(n),a=Object.keys(r);return i.length!==a.length||a.some(e=>!Object.prototype.hasOwnProperty.call(n,e))?!1:i.every(e=>c(n[e],r[e]))}function l(e,t){if(e===t)return!0;if(typeof e!=typeof t||e===null||t===null)return!1;if(Array.isArray(e)||Array.isArray(t))return!Array.isArray(e)||!Array.isArray(t)||e.length!==t.length?!1:e.every((e,n)=>l(e,t[n]));if(typeof e!=`object`)return!1;let n=e,r=t;if(C(n)){let e=Object.keys(n).filter(e=>e!==`compat`),t=Object.keys(r).filter(e=>e!==`compat`);if(e.length!==t.length||t.some(e=>!Object.prototype.hasOwnProperty.call(n,e)))return!1;for(let t of e)if(!l(n[t],r[t]))return!1;return s(n.compat,r.compat)}let i=Object.keys(n),a=Object.keys(r);return i.length!==a.length||a.some(e=>!Object.prototype.hasOwnProperty.call(n,e))?!1:i.every(e=>l(n[e],r[e]))}if(!l(u,d))return`Modified file: original structure was altered (data loss detected)`;let w=Q(t),T=X(w,Y(w,0));return T===void 0?`Modified file: root bracket mismatch`:Y(w,T+1)===w.length?null:`Modified file: trailing non-whitespace content after root object`}catch(e){return`Self-check error: ${e instanceof Error?e.message:String(e)}`}}function Ns(e){return Object.entries(e).map(([e,t])=>` ${JSON.stringify(e)}: ${JSON.stringify(t)}`).join(`,
|
|
49
|
-
`)}let Ps=0;function Fs(e=new Date){return`${e.getUTCFullYear()}${String(e.getUTCMonth()+1).padStart(2,`0`)}${String(e.getUTCDate()).padStart(2,`0`)}T${String(e.getUTCHours()).padStart(2,`0`)}${String(e.getUTCMinutes()).padStart(2,`0`)}${String(e.getUTCSeconds()).padStart(2,`0`)}${String(e.getUTCMilliseconds()).padStart(3,`0`)}Z-${process.pid}-${Ps++}`}function Is(e,t){return`${e}.${process.pid}.${Date.now()}.${Ps++}.${t}.tmp`}function Ls(e,t){let n=Number(e.dev),r=Number(t.dev),i=Number(e.ino),a=Number(t.ino);return i===0||a===0||n===r&&i===a}async function Rs(e,n){let r=await(0,t.lstat)(e);if(r.isSymbolicLink()||!r.isFile())throw Error(`target is not a regular file; refusing atomic replacement`);if(n?.identity&&!Ls(n.identity,r))throw Error(`target changed during atomic replacement`);if(n?.mode!==void 0&&(r.mode&4095)!==n.mode)throw Error(`target access mode changed during atomic replacement`);if(n?.hash!==void 0&&$(await(0,t.readFile)(e,`utf8`))!==n.hash)throw Error(`target content changed during atomic replacement`);return r}async function zs(e,n,r,i,a,o){let s=await Rs(e,a),c=Is(e,i);try{await(0,t.writeFile)(c,n,{encoding:`utf8`,mode:r,flag:`wx`});let i=await(0,t.lstat)(c);if(i.isSymbolicLink()||!i.isFile())throw Error(`temporary replacement is not a regular file`);await(0,t.chmod)(c,r),await Rs(e,{...a,identity:s,mode:r}),o&&await o(),await Rs(e,{...a,identity:s,mode:r}),await(0,t.rename)(c,e)}catch(e){try{await(0,t.unlink)(c)}catch(e){q(e)!==`ENOENT`&&console.warn(`${g}: failed to remove temporary models.json file`,e)}throw e}}async function Bs(e,r,i,a,o){let s=await(0,t.lstat)(e);if(s.isSymbolicLink()||!s.isFile())throw Error(`backup is not a regular file; refusing atomic restore`);if(a?.backupHash!==void 0&&$(await(0,t.readFile)(e,`utf8`))!==a.backupHash)throw Error(`backup content changed during atomic restore`);let c=await Rs(r,a),l=Is(r,`restore`);try{await(0,t.copyFile)(e,l,n.constants.COPYFILE_EXCL);let s=await(0,t.lstat)(l);if(s.isSymbolicLink()||!s.isFile())throw Error(`temporary restore is not a regular file`);await(0,t.chmod)(l,i);let u=await(0,t.readFile)(l,`utf8`);if(a?.backupHash!==void 0&&$(u)!==a.backupHash)throw Error(`backup content changed during atomic restore`);await Rs(r,{...a,identity:c}),o&&await o(),await Rs(r,{...a,identity:c}),await(0,t.rename)(l,r)}catch(e){try{await(0,t.unlink)(l)}catch(e){q(e)!==`ENOENT`&&console.warn(`${g}: failed to remove temporary restore file`,e)}throw e}}function $(t){return(0,e.createHash)(`sha256`).update(t,`utf8`).digest(`hex`)}async function Vs(n){await(0,t.mkdir)(_,{recursive:!0});let r=Date.now()+5e3,i=(0,e.randomUUID)(),a=JSON.stringify({pid:process.pid,token:i}),o;for(;;)try{await(0,t.writeFile)(D,a,{encoding:`utf8`,mode:384,flag:`wx`});let e=await(0,t.lstat)(D);if(e.isSymbolicLink()||!e.isFile())throw Error(`models.json transaction lock path is unsafe`);o=e;break}catch(e){if(q(e)!==`EEXIST`)throw e;let n=await(0,t.lstat)(D).catch(()=>void 0);if(!n)continue;if(n.isSymbolicLink()||!n.isFile())throw Error(`models.json transaction lock path is unsafe`);let i;try{let e=j(JSON.parse(await(0,t.readFile)(D,`utf8`)));typeof e?.pid==`number`&&(i=e.pid)}catch{}if(Date.now()-n.mtimeMs>6e4&&(i===void 0||!Jo(i))){let e=await(0,t.lstat)(D).catch(()=>void 0);e&&Ls(n,e)&&await(0,t.unlink)(D).catch(e=>{if(q(e)!==`ENOENT`)throw e});continue}if(Date.now()>=r)throw Error(`another cache-optimizer models.json transaction is still running`);await new Promise(e=>setTimeout(e,25))}try{return await n()}finally{try{let e=await(0,t.lstat)(D);o&&!e.isSymbolicLink()&&e.isFile()&&Ls(o,e)&&await(0,t.readFile)(D,`utf8`)===a&&await(0,t.unlink)(D)}catch(e){q(e)!==`ENOENT`&&console.warn(`${g}: failed to remove models.json transaction lock`,e)}}}async function Hs(e){let n=await(0,t.lstat)(e.receiptPath);if(n.isSymbolicLink()||!n.isFile()||!Ls(e.identity,n))throw Error(`fix receipt changed since the rollback preview`);let r=await(0,t.readFile)(e.receiptPath,`utf8`),i=await(0,t.lstat)(e.receiptPath);if(i.isSymbolicLink()||!i.isFile()||!Ls(n,i)||$(r)!==e.hash)throw Error(`fix receipt changed since the rollback preview`)}async function Us(e,r,i,a={}){a.receiptGuard&&await Hs(a.receiptGuard);let o=await(0,t.lstat)(J);if(!o.isFile()||o.isSymbolicLink())throw Error(`models.json is not a regular file; no changes were made`);let s=o.mode&4095,c=a.purpose===`rollback`?`rollback`:`fix`;if(a.expectedCurrentMode!==void 0&&a.expectedCurrentMode!==s)throw Error(`models.json access mode changed since the ${c} preview; no changes were made`);let l=$(await(0,t.readFile)(J,`utf8`)),u=a.expectedCurrentHash??l,d=a.expectedBackupHash??u,f=async()=>{let e=await(0,t.lstat)(J);if(e.isSymbolicLink()||!e.isFile()||!Ls(o,e)||(e.mode&4095)!==s)throw Error(`models.json changed during ${c}; no changes were made`);if($(await(0,t.readFile)(J,`utf8`))!==u)throw Error(`models.json changed since the ${c} preview; no changes were made`)},p=async()=>{let e=await(0,t.lstat)(r);if(e.isSymbolicLink()||!e.isFile())throw Error(`models.json ${c} backup is not a regular file; no changes were made`);if(d!==void 0&&$(await(0,t.readFile)(r,`utf8`))!==d)throw Error(`models.json ${c} backup changed during preparation; no changes were made`)};await f(),await(0,t.copyFile)(J,r,n.constants.COPYFILE_EXCL);let m=await(0,t.lstat)(r);if(m.isSymbolicLink()||!m.isFile())throw Error(`models.json ${c} backup is not a regular file; no changes were made`);await(0,t.chmod)(r,s);let h=await(0,t.lstat)(r);if(h.isSymbolicLink()||!h.isFile()||!Ls(m,h))throw Error(`models.json ${c} backup changed during preparation; no changes were made`);await p();let g=$(e),_=!1,v=async()=>{let e=await(0,t.lstat)(J);if(e.isSymbolicLink()||!e.isFile()||(e.mode&4095)!==s||$(await(0,t.readFile)(J,`utf8`))!==g)throw Error(`models.json changed after ${c} replacement; refusing to overwrite user changes`);await p(),await Bs(r,J,s,{identity:e,hash:g,mode:s,backupHash:d});let n=await(0,t.lstat)(J);if(n.isSymbolicLink()||!n.isFile())throw Error(`models.json restore produced a non-regular file`);let i=await(0,t.readFile)(J,`utf8`);if(d!==void 0&&$(i)!==d)throw Error(`models.json restore did not match the transaction backup`)};try{await f(),await zs(J,e,s,a.purpose??`fix`,{identity:o,hash:u,mode:s}),_=!0;let n=await(0,t.lstat)(J);if(n.isSymbolicLink()||!n.isFile())throw Error(`models.json became a non-regular file during ${c} replacement`);let r=await(0,t.readFile)(J,`utf8`),l=i(r),d=n.mode&4095,p=$(r)===g?null:`models.json changed during ${c} replacement`,m=d===s?null:`models.json access mode changed from ${s.toString(8)} to ${d.toString(8)}`,h=l??p??m;return h===null?(await Rs(J,{identity:n,hash:g,mode:s}),a.receiptGuard&&await Hs(a.receiptGuard),await a.onCommitted?.(r),{ok:!0}):(await v(),_=!1,{ok:!1,postCheckError:h})}catch(e){if(_)try{await v(),_=!1}catch(t){throw AggregateError([e,t],`models.json fix failed and the atomic backup restore also failed`)}throw e}}async function Ws(e,t,n,r={}){return Vs(()=>Us(e,t,n,r))}function Gs(e){return e===null||typeof e==`string`||typeof e==`boolean`||typeof e==`number`&&Number.isFinite(e)}function Ks(e){let t=j(e);return!t||t.present===void 0?!1:t.present===!1?Object.keys(t).every(e=>e===`present`):t.present===!0&&Gs(t.value)&&Object.keys(t).every(e=>e===`present`||e===`value`)}function qs(e,t){return e.present===t.present?!e.present||e.value===t.value:!1}function Js(e){return e===`provider`||e===`model`||e===`modelOverride`}function Ys(e){return typeof e==`string`&&/^[0-9a-f]{64}$/i.test(e)}function Xs(e){return[`thinkingFormat`,`supportsReasoningEffort`,`requiresReasoningContentOnAssistantMessages`].some(t=>Object.prototype.hasOwnProperty.call(e.changedKeys,t))}function Zs(e){return e!==void 0&&e.status===void 0}function Qs(e=J){return`${e}.backup-cache-optimizer-rollback-${Fs()}`}function $s(e){return U(e)&&!/[\u0000-\u001f\u007f]/.test(e)}function ec(e){return typeof e==`number`&&Number.isSafeInteger(e)&&e>=0}function tc(e){let t=j(e);if(!t||t.version!==1||t.kind!==`pi-cache-optimizer-fix-receipt`)return;let n=new Set([`version`,`kind`,`transactionId`,`provider`,`modelId`,`placement`,`targetExistedBefore`,`changedKeys`,`beforeHash`,`afterHash`,`backupFile`,`createdAt`,`appliedAt`,`status`,`rolledBackAt`]);if(Object.keys(t).some(e=>!n.has(e))||!$s(t.transactionId)||!$s(t.provider)||!$s(t.modelId)||!Js(t.placement)||typeof t.targetExistedBefore!=`boolean`||!Ys(t.beforeHash)||!Ys(t.afterHash)||t.beforeHash===t.afterHash||!$s(t.backupFile)||(0,i.basename)(t.backupFile)!==t.backupFile||t.backupFile.includes(`..`)||!/^models\.json\.backup-cache-optimizer-/.test(t.backupFile))return;let r=typeof t.beforeHash==`string`?t.beforeHash.toLowerCase():``,a=typeof t.afterHash==`string`?t.afterHash.toLowerCase():``;if(r===a||!ec(t.createdAt)||!ec(t.appliedAt)||t.appliedAt<t.createdAt)return;let o=j(t.changedKeys);if(!o||Object.keys(o).length===0)return;let s={};for(let[e,t]of Object.entries(o)){if(!ce.has(e))return;let n=j(t);if(!n||!Ks(n.before)||!Ks(n.after)||qs(n.before,n.after))return;s[e]={before:n.before,after:n.after}}if((t.status===void 0||t.status===`rolled_back`)&&!(t.status===`rolled_back`&&(!ec(t.rolledBackAt)||t.rolledBackAt<t.appliedAt))&&(t.status!==void 0||t.rolledBackAt===void 0))return{version:1,kind:`pi-cache-optimizer-fix-receipt`,transactionId:t.transactionId.trim(),provider:t.provider.trim(),modelId:t.modelId.trim(),placement:t.placement,targetExistedBefore:t.targetExistedBefore,changedKeys:s,beforeHash:r,afterHash:a,backupFile:t.backupFile,createdAt:Number(t.createdAt),appliedAt:Number(t.appliedAt),...t.status===`rolled_back`?{status:`rolled_back`,rolledBackAt:Number(t.rolledBackAt)}:{}}}function nc(e,t=re){return(0,i.join)((0,i.dirname)(t),e.backupFile)}async function rc(e,n=re,r,a){if(!tc(e))throw Error(`invalid fix receipt`);if(r){if(r.receiptPath!==n)throw Error(`fix receipt path changed since the rollback preview`);await Hs(r)}await(0,t.mkdir)((0,i.dirname)(n),{recursive:!0});let o;try{let e=await(0,t.lstat)(n);if(e.isSymbolicLink()||!e.isFile())throw Error(`invalid fix receipt path`);o=e}catch(e){if(q(e)!==`ENOENT`)throw e}let s=Is(n,`receipt`);try{await(0,t.writeFile)(s,JSON.stringify(e,null,2)+`
|
|
50
|
-
`,{encoding:`utf8`,mode:384,flag:`wx`});let i=await(0,t.lstat)(s);if(i.isSymbolicLink()||!i.isFile())throw Error(`invalid temporary fix receipt`);await(0,t.chmod)(s,384),r&&await Hs(r);let c=async()=>{try{let e=await(0,t.lstat)(n);if(!o||!Ls(o,e))throw Error(`fix receipt changed during atomic write`)}catch(e){if(q(e)!==`ENOENT`||o)throw e}r&&await Hs(r)};await c(),a&&await a(),await c(),await(0,t.rename)(s,n)}catch(e){try{await(0,t.unlink)(s)}catch(e){q(e)!==`ENOENT`&&console.warn(`${g}: failed to remove temporary fix receipt`,e)}throw e}}async function ic(e=re){try{let n=await(0,t.lstat)(e);if(n.isSymbolicLink()||!n.isFile())return;let r=await(0,t.readFile)(e,`utf8`),i=await(0,t.lstat)(e);if(i.isSymbolicLink()||!i.isFile()||!Ls(n,i))return;let a=tc(JSON.parse(r));return a?{receipt:a,receiptPath:e,hash:$(r),identity:i}:void 0}catch{return}}async function ac(e=re){return(await ic(e))?.receipt}async function oc(e){let t=e.receipt;await rc({...t,status:`rolled_back`,rolledBackAt:Date.now()},e.receiptPath,e)}function sc(e,t,n,r){if(r===`modelOverride`){let r=vs(e,t,n);return!r||r.providerKeyCount!==1||r.modelOverridesKeyCount>1||r.modelOverrideKeyCount>1||r.modelOverrideCompatKeyCount>1?void 0:{targetExists:r.modelOverrideObjectBrace>=0,compatBrace:r.modelOverrideCompatBrace,compatEnd:r.modelOverrideCompatEnd}}let i=ys(e,t,n);if(i&&i.providerKeyCount===1&&i.allModelIds.filter(e=>e===n).length===1&&!(r===`provider`&&i.providerCompatKeyCount>1)&&!(r===`model`&&i.modelCompatKeyCount>1))return{targetExists:i.modelObjectBrace>=0,compatBrace:r===`provider`?i.providerCompatBrace:i.compatObjectBrace,compatEnd:r===`provider`?i.providerCompatEnd:i.compatObjectEnd}}function cc(e,t,n){if(!t||t.compatBrace<0||t.compatEnd<=t.compatBrace)return{present:!1};let r=Q(e),i=Z(r,t.compatBrace,n);if(!i||i.keyStart>=t.compatEnd)return{present:!1};if(i.count!==1)return;let a=Y(r,i.valueStart),o=us(r,a);if(!(o===void 0||o>t.compatEnd))try{let t=hs(e.slice(a,o));return Gs(t)?{present:!0,value:t}:void 0}catch{return}}function lc(t,n,r,a,o,s,c,l,u=Date.now()){let d=(0,i.basename)(l);if(!/^models\.json\.backup-cache-optimizer-/.test(d))return;let f=sc(t,r,a,o),p=sc(n,r,a,o);if(c&&!f?.targetExists||!p?.targetExists)return;let m={};for(let[e,r]of Object.entries(s)){if(!Gs(r))return;let i=cc(t,f,e),a=cc(n,p,e);if(!i||!a||!qs(a,{present:!0,value:r}))return;qs(i,a)||(m[e]={before:i,after:a})}if(Object.keys(m).length!==0)return tc({version:1,kind:`pi-cache-optimizer-fix-receipt`,transactionId:(0,e.randomUUID)(),provider:r,modelId:a,placement:o,targetExistedBefore:c,changedKeys:m,beforeHash:$(t),afterHash:$(n),backupFile:d,createdAt:u,appliedAt:u})}function uc(e,t,n){let r=e.slice(t,n).split(``),i=t,a=!1,o=!1,s=!1,c=!1;for(;i<n;){let n=e[i],l=e[i+1],u=i-t;if(a){(n===`
|
|
51
|
-
`||n===`\r`)&&(a=!1),i++;continue}if(o){n===`*`&&l===`/`?(i+=2,o=!1):i++;continue}if(s){if(n===`
|
|
52
|
-
`||n===`\r`){i++;continue}r[u]=` `,c?c=!1:n===`\\`?c=!0:n===`"`&&(s=!1),i++;continue}if(n===`"`)s=!0,r[u]=` `;else if(n===`/`&&l===`/`){a=!0,i+=2;continue}else if(n===`/`&&l===`*`){o=!0,i+=2;continue}else n!==`
|
|
53
|
-
`&&n!==`\r`&&(r[u]=` `);i++}return r.join(``)}function dc(e,t,n,r){let i=Q(e),a=Z(i,t,r);if(!a||a.keyStart>=n||a.count!==1)return;let o=Y(i,a.valueStart),s=us(i,o);if(s===void 0||s>n)return;let c=Y(i,s);if(i[c]===`,`)return{keyStart:a.keyStart,valueStart:o,valueEnd:s,removal:{start:a.keyStart,end:c+1,text:uc(e,a.keyStart,c+1)}};let l=a.keyStart-1;for(;l>=t&&cs(i[l]);)l--;let u=i[l]===`,`?l:a.keyStart;return{keyStart:a.keyStart,valueStart:o,valueEnd:s,removal:{start:u,end:s,text:uc(e,u,s)}}}function fc(e,t){if(!t.targetExistedBefore)return{error:`the fix created a new target entry and the file changed; refusing to remove user changes automatically`};let n=sc(e,t.provider,t.modelId,t.placement);if(!n?.targetExists)return{error:`the original target entry is missing or no longer safely locatable`};if(n.compatBrace<0||n.compatEnd<=n.compatBrace)return{error:`the target compat object is missing or no longer safely locatable`};let r=[];for(let[i,a]of Object.entries(t.changedKeys)){let t=cc(e,n,i);if(!t||!qs(t,a.after))return{error:`receipt-owned compat.${i} was changed after the fix; refusing to overwrite it`};let o=dc(e,n.compatBrace,n.compatEnd,i);if(!o)return{error:`receipt-owned compat.${i} is no longer safely locatable`};a.before.present?r.push({start:o.valueStart,end:o.valueEnd,text:JSON.stringify(a.before.value)}):r.push(o.removal)}let i=r.sort((e,t)=>t.start-e.start).reduce((e,t)=>e.slice(0,t.start)+t.text+e.slice(t.end),e);return{modifiedText:i,changed:i!==e}}function pc(e,t,n){if(n!==void 0&&$(e)!==n)return`rollback result hash did not match the expected pre-fix file`;try{hs(e)}catch{return`rollback result is not valid JSONC`}if(n!==void 0)return null;let r=sc(e,t.provider,t.modelId,t.placement);if(!r?.targetExists)return`rollback result lost the original target entry`;for(let[n,i]of Object.entries(t.changedKeys)){let t=cc(e,r,n);if(!t||!qs(t,i.before))return`rollback result did not restore compat.${n}`}return null}async function mc(e){let n=await(0,t.lstat)(e);if(n.isSymbolicLink()||!n.isFile())throw Error(`file is not a regular file`);let r=await(0,t.readFile)(e,`utf8`),i=await(0,t.lstat)(e);if(i.isSymbolicLink()||!i.isFile()||!Ls(n,i))throw Error(`file changed while it was being read`);return{text:r,mode:i.mode&4095}}async function hc(e,t=J){let n=e?.receipt;if(!e||!Zs(n))return{error:`No unapplied /cache-optimizer fix receipt was found.`};let r;try{r=await mc(t)}catch{return{error:`models.json is missing or is not a regular file; no changes were made.`}}let a=$(r.text),o=(0,i.join)((0,i.dirname)(t),n.backupFile),s=Qs(t);if(a===n.afterHash){let t;try{t=await mc(o)}catch{return{error:`The receipt backup is missing or is not a regular file; refusing to overwrite models.json.`}}if($(t.text)!==n.beforeHash)return{error:`The receipt backup hash does not match the recorded pre-fix file; refusing to overwrite models.json.`};try{hs(t.text)}catch{return{error:`The receipt backup is not valid JSONC; refusing to overwrite models.json.`}}return{receiptSnapshot:e,receipt:n,currentHash:a,modifiedText:t.text,expectedResultHash:n.beforeHash,mode:`exact`,fileMode:r.mode,originalBackupPath:o,rollbackBackupPath:s}}if(!n.targetExistedBefore)return{error:`models.json changed after the fix, and the fix created the target entry. Refusing to remove or overwrite unrelated user changes; use the recorded backup for manual guidance.`};try{hs(r.text)}catch{return{error:`models.json changed after the fix and is not valid JSONC; refusing to overwrite user changes. Use the recorded backup for manual guidance.`}}let c=fc(r.text,n);return`error`in c?{error:`models.json changed after the fix. ${c.error}. Use the recorded backup for manual guidance.`}:c.changed?{receiptSnapshot:e,receipt:n,currentHash:a,modifiedText:c.modifiedText,mode:`surgical`,fileMode:r.mode,originalBackupPath:o,rollbackBackupPath:s}:{error:`No receipt-owned change remains to roll back.`}}const gc={buildStableCandidates:We,optimizeSystemPrompt:qe,stripSessionOverviewChurn:Ge,extractStructuralMarkers:Ke,formatSkillsForPrompt:Ve,formatSkillsForPromptCompressed:He,compressSkillsInSystemPrompt:Ue,MIN_STABLE_CANDIDATE_LENGTH:8,SKILL_COMPRESSION_MIN_COUNT:4,NO_PROMPT_REWRITE_ENV:ae,isEnabledEnv:Zt,addOpenAIPromptCacheKey:pa,clampPromptCacheKey:Je,hasEffectivePromptCacheKey:ma,isNonEmptyString:U,shouldInjectOpenAIPromptCacheKey:mn,shouldInjectOpenAIPromptCacheKeyForModel:En,isOpenAICompatibleApi:Sn,isAnthropicMessagesApi:Cn,isOpenAICompatibleProxyApi:wn,collectAnthropicCacheControlsInWireOrder:Dn,downgradeAnthropicLongCacheControls:On,hasAnthropicCacheTtlOrderError:kn,normalizeAnthropicCacheControlTtlOrder:An,isPiBuiltInLlamaCppModel:Tn,isResponsesPromptRewriteBypassApi:jn,isMistralConversationsApi:Mn,isOpenAIFamilyModel:Pn,isOpenAIFamilyAssistantMessage:Fn,isOpenAIFamilyToken:Nn,describeMissingOpenAIFamilyProxyCompat:_a,describeMissingOpenAICompatibleProxyCompat:W,describeOptionalOpenAICompatibleProxyCompat:va,describeMissingDeepSeekCompat:Ba,isDeepSeekWireCompatApplicable:za,isDeepSeekCompatCheckApplicable:Va,hasExplicitDeepSeekReasoningProtocol:Ha,describeMissingCacheCompatForModel:Ua,buildDeepSeekCompatSuggestion:Wa,buildDeepSeekCompatWarningText:Ka,buildSafeOpenAIProxyCompatSuggestion:ya,getPromptCacheRetentionUnsupportedHint:ba,isOfficialOpenAIBaseUrl:ha,isKnownThirdPartyOpenAIEndpoint:ga,isCompatCheckApplicable:Qo,isPromptCacheRetention400Applicable:$o,isSessionAffinity403Applicable:ts,isOpenAISdkHeader403Applicable:ns,hasPromptCacheRetentionUnsupportedSignal:Sa,hasPromptCacheRetentionUnsupportedErrorMessage:Ca,hasReasoningProtocolRejectionText:wa,hasReasoningProtocolRejectionSignal:Ta,hasReasoningProtocolRejectionErrorMessage:Da,isReasoningProtocolRejectionSignalApplicable:Oa,isReasoningProtocolRejectionForModel:ka,buildReasoningProtocolFixSuggestion:Na,isKimiLikeModel:Zn,isKimiLikeAssistantMessage:Qn,isQwenLikeModel:$n,isQwenLikeAssistantMessage:er,isGLMLikeModel:tr,isGLMLikeAssistantMessage:nr,isMiniMaxLikeModel:rr,isMiniMaxLikeAssistantMessage:ir,isMimoLikeModel:ar,isMimoLikeAssistantMessage:or,isHunyuanLikeModel:sr,isHunyuanLikeAssistantMessage:cr,isMistralLikeModel:lr,isMistralLikeAssistantMessage:ur,isGrokLikeModel:dr,isGrokLikeAssistantMessage:fr,isLlamaLikeModel:pr,isLlamaLikeAssistantMessage:mr,isNemotronLikeModel:hr,isNemotronLikeAssistantMessage:gr,isCohereLikeModel:_r,isCohereLikeAssistantMessage:vr,isYiLikeModel:br,isYiLikeAssistantMessage:xr,isDoubaoLikeModel:Cr,isDoubaoLikeAssistantMessage:wr,isErnieLikeModel:Tr,isErnieLikeAssistantMessage:Er,isBaichuanLikeModel:Dr,isBaichuanLikeAssistantMessage:Or,isStepFunLikeModel:kr,isStepFunLikeAssistantMessage:Ar,isSparkLikeModel:jr,isSparkLikeAssistantMessage:Mr,isInternLMLikeModel:Nr,isInternLMLikeAssistantMessage:Pr,isGemmaLikeModel:Fr,isGemmaLikeAssistantMessage:Ir,isPhiLikeModel:Rr,isPhiLikeAssistantMessage:zr,isJambaLikeModel:Br,isJambaLikeAssistantMessage:Vr,isSolarLikeModel:Hr,isSolarLikeAssistantMessage:Ur,isPerplexityLikeModel:Wr,isPerplexityLikeAssistantMessage:Gr,isNovaLikeModel:Kr,isNovaLikeAssistantMessage:qr,isRekaLikeModel:Jr,isRekaLikeAssistantMessage:Yr,isFalconLikeModel:Xr,isFalconLikeAssistantMessage:Zr,isDbrxLikeModel:Qr,isDbrxLikeAssistantMessage:$r,isMptLikeModel:ei,isMptLikeAssistantMessage:ti,isStableLMLikeModel:ni,isStableLMLikeAssistantMessage:ri,isAquilaLikeModel:ii,isAquilaLikeAssistantMessage:ai,isExaoneLikeModel:oi,isExaoneLikeAssistantMessage:si,isHyperCLOVALikeModel:ci,isHyperCLOVALikeAssistantMessage:li,isLuminousLikeModel:ui,isLuminousLikeAssistantMessage:di,isHermesLikeModel:fi,isHermesLikeAssistantMessage:pi,isGraniteLikeModel:mi,isGraniteLikeAssistantMessage:hi,isArcticLikeModel:gi,isArcticLikeAssistantMessage:_i,isPanguLikeModel:vi,isPanguLikeAssistantMessage:yi,isSenseNovaLikeModel:bi,isSenseNovaLikeAssistantMessage:xi,isZhinaoLikeModel:Si,isZhinaoLikeAssistantMessage:Ci,isMiniCPMLikeModel:wi,isMiniCPMLikeAssistantMessage:Ti,isXVerseLikeModel:Ei,isXVerseLikeAssistantMessage:Di,isOrionLikeModel:Oi,isOrionLikeAssistantMessage:ki,isOpenChatLikeModel:Ai,isOpenChatLikeAssistantMessage:ji,isVicunaLikeModel:Mi,isVicunaLikeAssistantMessage:Ni,isWizardLikeModel:Pi,isWizardLikeAssistantMessage:Fi,isZephyrLikeModel:Ii,isZephyrLikeAssistantMessage:Li,isDolphinLikeModel:Ri,isDolphinLikeAssistantMessage:zi,isOpenOrcaLikeModel:Bi,isOpenOrcaLikeAssistantMessage:Vi,isStarlingLikeModel:Hi,isStarlingLikeAssistantMessage:Ui,isBloomLikeModel:Wi,isBloomLikeAssistantMessage:Gi,isRwkvLikeModel:Ki,isRwkvLikeAssistantMessage:qi,isAyaLikeModel:Ji,isAyaLikeAssistantMessage:Yi,selectAdapterForModel:Ja,selectAdapterForAssistantMessage:Ya,buildOpenAIProxyCompatWarningText:G,getModelIdNameTokenValues:I,getAssistantMessageModelTokenValues:L,mergeCacheCompat:wt,resolveEffectiveCompatFromConfig:Et,getEffectiveCompatValueSource:Dt,findLastExactModelDefinition:Ct,isValidModelsConfigForEffectiveCompat:Vt,addEffectiveSessionAffinityHeaders:Jt,getCompat:N,isKnownToolOrderApi:je,getToolNameForPayload:Ne,compareToolOrderEntries:Pe,isVerifiedToolForApi:Ie,normalizeToolsInPayload:ze,sortToolsInPayload:Be,modelKey:B,modelFromAssistantMessage:Zi,consolidateDirectProviderStatsModel:ra,getAgentDirDisplayPath:Xt,getModelsJsonDisplayPath:P,buildProviderCompatOverride:Pa,buildModelCompatOverride:Fa,captureCacheRetentionEnv:u,requestLongCacheRetention:d,restoreCacheRetentionEnv:f,setRuntimeOptimizerEnabled:hn,isRuntimeOptimizerEnabled:gn,getOptimizerRuntimeModeLines:_n,formatOptimizerRuntimeMode:vn,PI_CACHE_RETENTION_ENV:o,LONG_CACHE_RETENTION_VALUE:s,TOOL_ORDER_ENV:oe,isToolOrderEnabled:Qt,getLastPromptIntegrityWarningAt:ve,buildDoctorDiagnosis:as,buildCompatDiagnosis:ss,describeRouterChannelDiagnostics:rs,addUsageToCacheStats:$a,formatCacheStats:to,prefixFooterStatus:no,getCacheOptimizerArgumentCompletions:on,emptyCacheStats:K,emptyAllCacheStats:Qa,parseCacheStats:ho,parsePersistedCacheStats:Eo,deriveTotalsByModelFromSessionStats:yo,parsePersistedTotalsByModel:bo,MAX_RECENT_SAMPLES:50,buildStatsOutput:mo,buildSessionStatsOutput:uo,buildAllStatsOutput:fo,buildContributorsStatsOutput:po,formatCompactStats:so,buildLowHitDiagnosis:os,formatRecentTrendSummary:oo,formatHitRatio:ro,formatTokenM:io,hasMissingUsageFields:ao,keyForModelExt:na,hashSessionId:Xe,makeSessionModelKey:vt,modelKeyFromSessionKey:yt,filterRestorableStatsForSession:Oo,parsePersistedRoutedModelRef:xo,routedModelRefToPiModel:So,buildExactRouterStatusEntry:wo,findBestRouterModelStats:To,selectFooterStatsForModel:Co,parseFooterStatsMode:$t,parsePersistedCacheOptimizerConfig:sn,readPersistedFooterMode:cn,writePersistedFooterMode:ln,resolveFooterStatsMode:un,footerStatsMode:dn,CONFIG_FILE_PATH:T,FOOTER_MODE_ENV:se,PI_ROUTING_REGISTRY_SYMBOL:le,PI_CACHE_HINTS_SYMBOL:ue,REASONING_PROTOCOL_FALLBACK_SYMBOL:pe,ensureRoutingRegistry:rt,getRoutingRegistry:nt,parseRouteSnapshot:at,resolveActiveRouteSnapshot:ot,routeSnapshotToPiModel:st,isRoutedFallbackModel:lt,applyConfiguredTransportToModel:ut,resolveRouteModel:dt,isVirtualRoutingModel:ft,installCacheHintsService:_t,getCacheHintsService:mt,markOptimizerOwnedCacheHintsService:ht,isOptimizerOwnedCacheHintsService:gt,getOrCaptureCacheRetentionBaseline:m,PI_CACHE_RETENTION_BASELINE_SYMBOL:c,mergeCacheSessions:ko,mergeCacheTotals:jo,mergeLastRoutedModels:Mo,createSerializedAsyncRunner:Ao,writePersistedCacheStats:No,readPersistedCacheStats:Do,parsePersistedStatsShardV7:Uo,writeStatsShardV7:Wo,readValidStatsShardsV7:Go,aggregateStatsShardsV7:Ko,loadStatsShardAggregateV7:qo,cleanupStatsShardsV7:Xo,removeLegacyStatsFiles:Yo,readGlobalStatsEpoch:Ro,readModelStatsEpoch:zo,advanceGlobalStatsEpoch:Vo,advanceModelStatsEpoch:Ho,modelEpochPath:Po,STATE_FILE_PATH:v,LEGACY_STATE_FILE_PATH:y,SHARD_STATE_DIR:ee,FIX_RECEIPT_FILE_NAME:E,FIX_RECEIPT_PATH:re,SHARD_FILES_DIR:b,SHARD_GLOBAL_EPOCH_PATH:S,STATE_DIR:_,MODELS_JSON_PATH:J,stripJsoncComments:Q,stripJsoncTrailingCommas:ms,parseJsonc:hs,resolveExplicitCompatValue:gs,hasExplicitLongRetentionOptInFromConfig:_s,locateModelInJsonc:ys,locateModelOverrideInJsonc:vs,composeFixInsertion:js,selfCheckFix:Ms,analyzeModelsJsonForMissingEntry:bs,composeMissingEntryInsertion:Cs,composeModelOverrideInsertion:Ss,selfCheckMissingEntryInsertion:ws,decideFixPlacement:Os,chooseFixPlacement:As,findExistingCompatKeysInJsonc:ks,deepEqualIgnoringKeys:Ts,formatCompatKeysForInsertion:Ns,backupTimestamp:Fs,atomicReplaceTextFilePreservingMode:zs,atomicRestoreFileFromBackup:Bs,applyModelsJsonFixTransaction:Ws,hashText:$,parseModelsJsonFixReceipt:tc,isActionableModelsJsonFixReceipt:Zs,hasReceiptReasoningProtocolChange:Xs,createRollbackBackupPath:Qs,createModelsJsonFixReceipt:lc,writeModelsJsonFixReceipt:rc,readModelsJsonFixReceipt:ac,readModelsJsonFixReceiptSnapshot:ic,markModelsJsonFixReceiptRolledBack:oc,receiptBackupPath:nc,composeModelsJsonReceiptRollback:fc,validateModelsJsonRollback:pc,prepareModelsJsonRollback:hc,buildFixSuggestion:ps,isAdaptiveGenerationModel:Un,isKimiCodingAdaptiveModel:Wn,isKimiCodingEmptySignatureModel:Gn,isAdaptiveThinkingCompatApplicable:Kn,describeMissingAdaptiveThinkingCompat:qn,buildAdaptiveThinkingCompatSuggestion:Jn,buildAdaptiveThinkingCompatWarningText:Xn,appendAdaptiveThinkingCompatAdviceLines:Yn};function _c(r){let a=new Set,c=new Set,l=new Set,u=he(),p=u.modelKeys,m=u.warnedModelKeys,_=new Set,v=new Set,y=new Set,ee=new Set,x=me(),te=x.modelKeys,ne=x.warnedModelKeys,S={},C={},w={},T=Qa(),E,re=!1,D=null,oe=null,ce,le=Ao(),ue=(0,e.randomUUID)(),de=Date.now(),fe=(0,i.join)(b,`${ue}.json`),pe=new Map,ve=new Map,ye=new Map,be=Fo(`global`),xe=!1,Se=``,Ce=``,we=!1,k,Te,Ee,De=Date.now();function Oe(e){let t=B(e),n=t.indexOf(`/`),r=n>0?t.slice(0,n):t;if(p.has(t)||$o(e)&&c.has(t))return{providerLabel:r,modelId:e.id,compatKeys:{supportsLongCacheRetention:!1},forceModelLevel:!0};if(ts(e)&&_.has(t))return{providerLabel:r,modelId:e.id,compatKeys:{sendSessionAffinityHeaders:!1}}}function ke(e){let t=ps(e),n=Na(e,te.has(B(e))),r=Ma(Oe(e),n);return t?r?{providerLabel:t.providerLabel,modelId:t.modelId,compatKeys:{...t.compatKeys,...r.compatKeys},forceModelLevel:t.forceModelLevel||r.forceModelLevel}:t:r}let Ae=new Map;function je(e){let t=e.sessionManager.getSessionId();t&&(t!==Se||!we)&&(Se=t,Ce=Xe(t),we=!0,k=void 0)}let Ne=_t(ht({version:1,getHints(e){if(!O||Zt(process.env[ae]))return;let t=Te;if(t&&!(e.sessionIdHash&&t.sessionIdHash&&e.sessionIdHash!==t.sessionIdHash)&&!(e.virtualProvider&&t.virtualProvider&&e.virtualProvider!==t.virtualProvider)&&!(e.virtualModelId&&t.virtualModelId&&e.virtualModelId!==t.virtualModelId)&&!(e.upstreamProvider&&t.upstreamProvider&&e.upstreamProvider!==t.upstreamProvider)&&!(e.upstreamModelId&&t.upstreamModelId&&e.upstreamModelId!==t.upstreamModelId)&&!(e.api&&t.api&&e.api!==t.api))return{systemPrompt:t.systemPrompt,promptCacheKey:t.promptCacheKey,cacheRetention:t.cacheRetention}}}),{discardPrevious:gt});function Pe(e){return`${Ce||`_nosession`}:${e.provider}/${e.id}`}function Fe(e){let t=e.indexOf(`:`);return t>=0?e.slice(t+1):e}function Ie(e,t,n){let r=Ae.get(e);r||(r=[],Ae.set(e,r)),r.push({timestamp:Date.now(),hit:t.cacheRead>0,cachedInputTokens:t.cacheRead,cacheWriteInputTokens:t.cacheWrite,totalInputTokens:t.totalInput,missingUsageFields:n}),r.length>50&&r.splice(0,r.length-50)}function Le(e){return Ae.get(e)??[]}function Re(){Ae.clear()}async function Be(){let e=(await Go()).filter(e=>e.instanceId!==ue);we&&e.push(He());let t=await Ko(e),n=await Ro();if(be!==n)be=n,C={},ye.clear(),pe.clear(),ve.clear(),k=void 0;else for(let e of Object.keys(C)){let t=await zo(e);(ye.get(e)??Fo(`model:${e}`))!==t&&(delete C[e],ye.set(e,t),pe.delete(e),ve.delete(e))}S={};for(let[e,n]of Object.entries(t.bySession))for(let[t,r]of Object.entries(n))S[`${e}:${t}`]=r;return w=t.totalsByModel,we&&(k=t.lastRoutedModelBySession[Ce]),E=void 0,t}async function Ve(){be=await Ro();for(let e of Object.keys(C))ye.set(e,await zo(e))}function He(e=`active`){let t=Date.now(),n={};for(let[e,t]of Object.entries(C)){let r=e.indexOf(`/`);r<=0||r>=e.length-1||(n[e]={modelEpoch:ye.get(e)??Fo(`model:${e}`),provider:e.slice(0,r),modelId:e.slice(r+1),...ve.get(e)?{modelName:ve.get(e)}:{},...pe.get(e)?{api:pe.get(e)}:{},stats:go(t)})}return{version:7,kind:`pi-cache-optimizer-shard`,instanceId:ue,sessionHash:Ce||`_nosession`,process:{pid:process.pid,ppid:process.ppid,instanceStartedAt:de},lifecycle:{state:e,createdAt:De,updatedAt:t,...e===`closed`?{closedAt:t}:{}},day:Za(),globalEpoch:be,models:n,...k?{lastRoutedModel:{...k}}:{}}}function We(e,t){oe!==null&&clearTimeout(oe),oe=setTimeout(()=>{oe=null,Be().then(()=>pt(e,t??e?.model)).catch(()=>void 0)},250),oe.unref?.()}function Ke(e,t){if(e){let t=B(e),n=w[t];if(n)return n}let n=T[t.id];if(n)return n;let r=K();return T[t.id]=r,r}function Je(e){let t=S[e];if(t)return t;let n=K();return S[e]=n,n}function A(e){let t=B(e),n=C[t];if(n)return n;let r=K();return C[t]=r,r}function $e(e){let t=B(e),n=w[t];if(n)return n;let r=K();return w[t]=r,r}async function et(e){let t=B(e),n=await Ho(t);ye.set(t,n),delete C[t],delete w[t];for(let e of Object.keys(S))Fe(e)===t&&delete S[e];for(let e of Array.from(Ae.keys()))Fe(e)===t&&Ae.delete(e);E=void 0}async function tt(){be=await Vo(),S={},w={},C={},ye.clear(),pe.clear(),ve.clear(),Re(),k=void 0,E=void 0}function nt(e,t=`active`){let n=He(t);return le(async()=>{try{await Wo(fe,n)}catch(t){console.warn(`${g}: failed to persist cache stats shard`,t),re||(re=!0,e?.ui.notify(`${g}: failed to persist footer stats; using in-memory stats for this process.`,`warning`))}})}function it(e){D!==null&&clearTimeout(D),D=setTimeout(()=>{D=null,nt(e).then(()=>Be()).catch(()=>void 0)},2e3),D.unref?.()}async function at(e,t=`active`){D!==null&&(clearTimeout(D),D=null),await Be(),await nt(e,t),await Be()}async function lt(e){let t=Za(),n=!1;for(let e of Object.keys(C))C[e]?.day!==t&&(C[e]=K(t),n=!0);for(let e of ie){let r=T[e];r&&r.day!==t&&(T[e]=K(t),n=!0)}n&&(De=Date.now(),E=void 0,await Ve(),await at(e))}async function ut(e,n){je(n),E=void 0,C={},T=Qa(),ye.clear(),pe.clear(),ve.clear(),be=await Ro(),e===`reload`&&(_e=0,xe=!1,Re()),await Yo(),await(0,t.mkdir)(b,{recursive:!0}),await Be(),await at(n),await Zo(),await Be()}async function pt(e,t=e.model){je(e),await lt(e);let n=dt(t,e),r=n??t,i=Ja(r),a=!!n||ft(t,e),o,s=dn(),c=we?Ce:void 0;if(!i&&!n&&a){if(E!==void 0)return;let e=wo(c,S,k,w,s,C)??To(s,c,S,w,C);if(e){let t=to(e.adapter,e.stats);o=O?t:`Cache Optimizer disabled · ${t}`}}if(i){let e=to(i,(r?Co(s,c,S,w,r,C):void 0)??K());o=O?e:`Cache Optimizer disabled · ${e}`}ge&&o!==void 0&&(o+=` ⚠️ integrity`,ge=!1,_e=Date.now(),xe||(xe=!0,e.ui.notify(`⚠️ ${g}: A prompt structural marker was lost during reorder on this turn. The original prompt was used instead to preserve integrity.\n\nRecovery steps:\n1. Run /reload to reset (may clear transient issues).\n2. Set PI_CACHE_OPTIMIZER_NO_PROMPT_REWRITE=1 and /reload to disable reorder.\n3. If persistent, run /cache-optimizer doctor and file an issue (no API keys/prompts).`,`warning`))),O&&o!==void 0&&r&&ps(r)!==void 0&&(o+=` ⚠️ compat`),o=no(o),o!==E&&(E=o,e.ui.setStatus(`pi-cache-stats`,o))}rt();function mt(e){return _s(Gt(),e.provider,e.id)}r.on(`session_start`,async(e,t)=>{if(O&&d(),await ut(e.reason,t),t.mode===`tui`&&!ce)try{ce=(0,n.watch)(b,()=>We(t)),ce.unref?.()}catch{}await pt(t)}),r.on(`tool_execution_end`,async(e,t)=>{await Be(),await pt(t)}),r.on(`agent_settled`,async(e,t)=>{await Be(),await pt(t)}),r.on(`session_shutdown`,async(e,t)=>{try{await at(t,`closed`)}finally{oe!==null&&clearTimeout(oe),oe=null,ce?.close(),ce=void 0,Te=void 0,Ee=void 0,delete Ze().__piCacheOptimizerCacheKey__,Ne(),f(h)}}),r.on(`model_select`,async(e,t)=>{O&&Xa(dt(e.model,t)??e.model,t,a),await Be(),await pt(t,e.model)}),r.on(`before_agent_start`,async(e,t)=>{Te=void 0,delete Ze().__piCacheOptimizerCacheKey__;let n=ot(t.model,t),r=(n?ct(t.modelRegistry,n.provider,n.modelId)??st(n,t.model):void 0)??t.model;if(r&&jn(r.api)||!O||Zt(process.env[ae]))return{};let i=Ge(e.systemPrompt),a=Ue(i,e.systemPromptOptions),c=qe(a,e.systemPromptOptions),l=Ye(t),u=process.env[o]===s?s:void 0,d=e=>{Te={sessionIdHash:we?Ce:Qe(t),virtualProvider:n?.virtualProvider??t.model?.provider,virtualModelId:n?.virtualModelId??t.model?.id,upstreamProvider:n?.provider??r?.provider,upstreamModelId:n?.modelId??r?.id,api:r?.api,systemPrompt:e,promptCacheKey:l,cacheRetention:u,timestamp:Date.now()};let i=Ze();l?i.__piCacheOptimizerCacheKey__=l:delete i.__piCacheOptimizerCacheKey__};return c.changed&&c.systemPrompt.trim().length>0?(d(c.systemPrompt),{systemPrompt:c.systemPrompt}):a!==i&&a.trim().length>0?(d(a),{systemPrompt:a}):i!==e.systemPrompt&&i.trim().length>0?(d(i),{systemPrompt:i}):(d(e.systemPrompt),{})}),r.on(`before_provider_headers`,(e,t)=>{let n=dt(t.model,t)??t.model;Jt(e.headers,n,t.sessionManager.getSessionId())}),r.on(`before_provider_request`,(e,t)=>{let n=dt(t.model,t)??t.model;Ee=O?ta(n):void 0;let r=e.payload,i=!1;if(Qt()&&Me(n)){let e=ze(r,n.api);r=e.payload,i=e.changed}if(n&&Cn(n.api)&&!An(r)&&p.has(B(n))&&On(r),O){let e=j(r);e&&typeof e.prompt_cache_retention==`string`&&n&&(ha(n)||(c.has(B(n))?delete e.prompt_cache_retention:mt(n)||delete e.prompt_cache_retention))}return!mn()||!En(n)?i?r:void 0:pa(r,Ye(t))??(i?r:void 0)}),r.on(`after_provider_response`,async(e,t)=>{let n=Ee??dt(t.model,t)??t.model;if(!O||!n){Ee=void 0;return}if(Oa(n)&&e.status===400&&Ta(e.headers)&&await Aa(n,t,te,ne),e.status===400){if(!$o(n)||!Sa(e.headers))return;let r=B(n);if(c.add(r),l.has(r))return;l.add(r),t.ui.notify(`⚠️ ${g}: ${r} returned HTTP 400 while supportsLongCacheRetention is enabled. `+ba()+` Run /cache-optimizer doctor for the exact edit location.`,`warning`);return}if(e.status===403){let e=B(n);if(ts(n)){if(_.add(e),v.has(e))return;v.add(e),t.ui.notify(`⚠️ ${g}: ${e} returned HTTP 403 while sendSessionAffinityHeaders is enabled. The proxy/CDN may be blocking Pi's custom session-affinity headers (session_id, x-client-request-id, x-session-affinity). Run /cache-optimizer doctor for details and /cache-optimizer fix to set sendSessionAffinityHeaders: false.`,`warning`);return}if(ns(n)){if(y.add(e),ee.has(e))return;ee.add(e),t.ui.notify(`⚠️ ${g}: ${e} returned HTTP 403 even though sendSessionAffinityHeaders is not enabled. The proxy/CDN may be blocking the OpenAI JS SDK User-Agent / X-Stainless-* headers. Run /cache-optimizer doctor for manual diagnostic guidance; /cache-optimizer fix will not auto-write User-Agent headers.`,`warning`);return}}}),r.on(`message_end`,async(e,t)=>{je(t);let n=j(e.message),r=n?.role===`assistant`?Ee:void 0;if(n?.role===`assistant`&&(Ee=void 0),O&&Da(e.message)){let n=r??dt(t.model,t)??t.model,i=Zi(e.message,n)??n,a=i?ct(t.modelRegistry,i.provider,i.id)??i:void 0;ka(e.message,a)&&await Aa(a,t,te,ne)}if(O&&Ca(e.message)){let n=r??dt(t.model,t)??t.model,i=Zi(e.message,n)??n,a=i?ct(t.modelRegistry,i.provider,i.id)??i:void 0;if(a&&es(a)){let e=B(a);c.add(e),l.has(e)||(l.add(e),t.ui.notify(`⚠️ ${g}: ${e} rejected prompt_cache_retention. `+ba()+` Run /cache-optimizer doctor for the exact edit location.`,`warning`))}}if(kn(e.message)){let n=r??dt(t.model,t)??t.model,i=Zi(e.message,n)??n;if(i&&Cn(i.api)){let e=B(i);p.add(e),m.has(e)||(m.add(e),t.ui.notify(`⚠️ ${g}: ${e} returned an Anthropic cache-control TTL ordering error. The next request will fall back to the default 5-minute cache TTL. Run /cache-optimizer fix to set model-level supportsLongCacheRetention: false persistently.`,`warning`))}}let i=Ya(e.message,t.model);if(!i||n?.stopReason===`error`||n?.stopReason===`aborted`)return;let a=i.normalizeUsage(e.message),o=Zi(e.message,t.model)??t.model;o=ra(o,t.model,t);let s=!1;if(ft(t.model,t)&&o&&!ft(o,t)){let e={provider:o.provider,id:o.id,name:o.name||o.id};(!k||k.provider!==e.provider||k.id!==e.id||(k.name||k.id)!==(e.name||e.id))&&(k=e,s=!0)}if(o){let t=Pe(o),n=a===void 0||a.cacheRead===0&&a.cacheWrite===0&&a.totalInput===0||ao(e.message,i);Ie(t,a??{cacheRead:0,cacheWrite:0,totalInput:0},n)}if(!a){s&&it(t);return}if(await lt(t),o){let e=B(o),t=await Ro(),n=await zo(e);be!==t&&(be=t,C={},ye.clear()),ye.get(e)!==n&&(delete C[e],ye.set(e,n)),pe.set(e,o.api??``),ve.set(e,o.name||o.id),$a(Je(Pe(o)),a),$a(A(o),a),$a($e(o),a)}else $a(Ke(void 0,i),a);it(t),await Be(),await pt(t,o)});async function vt(e,n){je(n);let r=n.model,i=dt(r,n)??r,a=e.trim().toLowerCase().split(/\s+/).filter(Boolean),o=a[0]||`help`;if(o===`enable`)hn(!0),await tt(),await at(n),await pt(n,i),n.ui.notify(`✅ Pi Cache Optimizer enabled for this Pi process. Local footer stats were reset for before/after comparison.\n${vn()}`,`info`);else if(o===`disable`)hn(!1),Ee=void 0,await tt(),await at(n),await pt(n,i),n.ui.notify(`⏸️ Pi Cache Optimizer disabled for this Pi process. Local footer stats were reset and will keep collecting while disabled for comparison.\n${vn()}`,`warning`);else if(o===`doctor`){if(await Be(),!i){n.ui.notify(`No active model selected. Select a model first with /model or pi --model.`,`warning`);return}let e=as(i,{promptCacheRetention400:c.has(B(i)),anthropicTtlOrderError:p.has(B(i)),sessionAffinity403:_.has(B(i)),openAISdkHeader403:y.has(B(i))}),t=Ja(i),r=i?Pe(i):void 0,a=os(i,t,i?w[B(i)]:void 0,r?Le(r):[]),o=a.length>0?e+`
|
|
54
|
-
`+a.join(`
|
|
55
|
-
`):e;n.ui.notify(o,`info`)}else if(o===`stats`){let e=await Be(),t=a[1];if(t===`all`)n.ui.notify(fo(e),`info`);else if(t===`contributors`)n.ui.notify(po(e,i,we?Ce:void 0),`info`);else if(t)n.ui.notify(`Usage: /cache-optimizer stats [all|contributors]`,`info`);else{let t=we?e.bySession[Ce]??{}:{};n.ui.notify(uo(t,i,e.modelRefsByKey),`info`)}}else if(o===`config`){let e=a[1],t=a[2];if(e!==`footer-mode`||!t||![`session`,`total`,`process`].includes(t)){let e=un(fn);n.ui.notify(`Usage: /cache-optimizer config footer-mode total|session|process\nCurrent footer mode: ${e.mode} (${e.source})`,`info`);return}let r=t;try{await ln(r),fn=r,E=void 0,await pt(n,i);let e=un(fn);n.ui.notify(`✅ Footer mode set to ${e.mode}. Persistent config overrides ${se}.`,`info`)}catch(e){n.ui.notify(`❌ Could not update footer mode config: ${e instanceof Error?e.message:String(e)}`,`error`)}}else if(o===`compat`){if(!i){n.ui.notify(`No active model selected. Select a model first with /model or pi --model.`,`warning`);return}let e=ss(i);e?n.ui.notify(e,`warning`):n.ui.notify(Kn(i)||Va(i)||Qo(i)?`✅ Compat fully configured.`:is(i).join(`
|
|
56
|
-
`),`info`)}else if(o===`rollback`){if(!i){n.ui.notify(`No active model selected. Select a model first with /model or pi --model.`,`warning`);return}if(!n.hasUI){let e=await ac(),t=e&&Zs(e)?` The recorded backup is ${e.backupFile} next to ${P()}.`:` Check the recorded models.json backup manually if a fix receipt exists.`;n.ui.notify(`❌ Rollback requires interactive confirmation. No changes were made.
|
|
57
|
-
Run /cache-optimizer rollback in Pi's interactive UI.${t} Then run /reload.`,`warning`);return}let e=await ic(),t=e?.receipt;if(!e||!Zs(t)){n.ui.notify(`ℹ️ No unapplied /cache-optimizer fix receipt was found.`,`info`);return}if(t.provider!==i.provider||t.modelId!==i.id){n.ui.notify(`ℹ️ The latest fix receipt is for ${t.provider}/${t.modelId}, not the active model ${i.provider}/${i.id}. Switch to the matching model before running rollback. No changes were made.`,`warning`);return}let r=await hc(e);if(`error`in r){n.ui.notify(`ℹ️ ${r.error}`,`info`);return}let a=r.mode===`exact`?`restore the exact pre-fix models.json because the file is unchanged since the fix`:`restore only the receipt-owned compat scalar keys and preserve subsequent user changes`,o=[`Rollback transaction ${r.receipt.transactionId}:`,`Model: ${r.receipt.provider}/${r.receipt.modelId}`,`Action: ${a}.`,`A new rollback backup will be written to: ${r.rollbackBackupPath}`,`Comments, credentials, unrelated fields, and the existing access mode will be preserved.`,`Afterward, run /reload or restart Pi for the configuration change to take effect.`,``,`Proceed with rollback?`].join(`
|
|
58
|
-
`);if(!await n.ui.confirm(`Cache Optimizer — Rollback`,o)){n.ui.notify(`No changes were made. Rollback canceled by user.`,`info`);return}try{let e=await Ws(r.modifiedText,r.rollbackBackupPath,e=>pc(e,r.receipt,r.expectedResultHash),{expectedCurrentHash:r.currentHash,expectedCurrentMode:r.fileMode,receiptGuard:r.receiptSnapshot,purpose:`rollback`,onCommitted:async()=>{await oc(r.receiptSnapshot)}});if(`postCheckError`in e){n.ui.notify(`❌ Rollback self-check failed: ${e.postCheckError}\nThe rollback backup at ${r.rollbackBackupPath} was restored. No changes applied.`,`error`);return}Ut(),n.ui.notify(`✅ Rollback completed for ${r.receipt.provider}/${r.receipt.modelId}.\nRollback backup saved to: ${r.rollbackBackupPath}\nThe receipt was marked as rolled back. Run /reload or restart Pi for the change to take effect.`,`info`)}catch(e){n.ui.notify(`❌ Rollback failed: ${e instanceof Error?e.message:String(e)}\nNo automatic overwrite was performed; use the recorded backup for manual guidance.`,`error`)}}else if(o===`reset`){if(!i){n.ui.notify(`No active model selected. Select a model first with /model or pi --model.`,`warning`);return}if(!Ja(i)){n.ui.notify(`ℹ️ Active model does not match a cache adapter. No stats to reset.`,`info`);return}let e=B(i);await et(i),await at(n),await pt(n,i),n.ui.notify(`✅ Reset local footer cache stats for "${e}". Upstream provider prompt cache was not modified. New requests will start a fresh local stats bucket for this provider/model.`,`info`)}else if(o===`fix`){if(!i){n.ui.notify(`No active model selected. Select a model first with /model or pi --model.`,`warning`);return}let e=ke(i);if(!e){let e=B(i);n.ui.notify(`✅ Nothing to fix for "${e}". Compat already configured.`,`info`);return}if(!n.hasUI){let t=ss(i),r=xs(e.providerLabel,e.modelId,e.compatKeys),a=[`❌ Non-interactive terminal detected. Auto-fix requires UI confirmation.`,``,`Edit ${P()} and run /reload.`];c.has(B(i))&&a.push(``,`💡 This model returned HTTP 400 for prompt_cache_retention.`,`Create or edit the entry below to override supportsLongCacheRetention to false.`),p.has(B(i))&&a.push(``,`💡 This model returned an Anthropic cache-control TTL ordering error.`,`Create or edit the entry below to override supportsLongCacheRetention to false.`),_.has(B(i))&&a.push(``,`💡 This model returned HTTP 403 while sendSessionAffinityHeaders was enabled.`,`Create or edit the entry below to override sendSessionAffinityHeaders to false.`),a.push(``,`Add these compat keys at Pi's highest-precedence model override path:`,`providers["${e.providerLabel}"] -> modelOverrides -> "${e.modelId}" -> compat:`,Ns(e.compatKeys)),r.length>0&&a.push(``,`If the provider/model is missing (common for API-logged-in channels such as`,`opencode go), add a minimal entry under "providers" (keep existing auth as-is):`,``,r),t&&a.push(``,t),n.ui.notify(a.join(`
|
|
59
|
-
`),`warning`);return}let r;try{r=await(0,t.readFile)(J,`utf8`)}catch{n.ui.notify(`❌ Could not read ${J}. File may not exist.`,`error`);return}let a=ys(r,e.providerLabel,e.modelId);if(!a){let t=bs(r,e.providerLabel,e.modelId);if(t&&n.hasUI){let t=(vs(r,e.providerLabel,e.modelId)?.modelOverrideObjectBrace??-1)>=0,a=Ss(r,e.providerLabel,e.modelId,e.compatKeys);if(!a)n.ui.notify(`❌ Could not safely locate a modelOverrides insertion point.
|
|
60
|
-
Falling back to manual guidance. No changes were made.`,`error`);else{let o=ws(r,a.modifiedText,e.providerLabel,e.modelId,e.compatKeys,i);if(o!==null)n.ui.notify(`❌ Self-check would fail for auto-created entry: ${o}\nFalling back to manual guidance. No changes were made.`,`error`);else{let o=JSON.stringify(e.compatKeys,null,2),s=Fs(),l=`${J}.backup-cache-optimizer-${s}`,u=[`📝 Preview of changes to ${P()}:`,``,`Location: ${a.placementLabel}`,`Compat JSON to write:`,o,``,`⚠️ Risk notice:`,t?` 1. This updates the existing modelOverrides entry for "${e.modelId}". Existing auth is not affected.`:` 1. This creates a modelOverrides entry in models.json. Existing auth (e.g. login API tokens) is not affected.`,` 2. A timestamped backup will be written to: ${l}`,` 3. You must run /reload or restart Pi for the change to take effect.`,` 4. If the file contains comments or unusual formatting, please verify the result after write.`];if(c.has(B(i))&&u.push(``,`💡 This fix overrides supportsLongCacheRetention to false because`,`a 400 prompt_cache_retention error was observed for this model.`,`After applying and reloading, Pi will no longer send the`,`prompt_cache_retention parameter to this provider.`),u.push(``,`Apply these changes?`),await n.ui.confirm(t?`Cache Optimizer — Fix (model override)`:`Cache Optimizer — Fix (new override)`,u.join(`
|
|
61
|
-
`))){try{let o=lc(r,a.modifiedText,e.providerLabel,e.modelId,`modelOverride`,e.compatKeys,t,l);if(!o){n.ui.notify(`❌ Could not create a privacy-safe fix receipt. No changes were made.`,`error`);return}let s=await Ws(a.modifiedText,l,t=>ws(r,t,e.providerLabel,e.modelId,e.compatKeys,i),{expectedCurrentHash:$(r),purpose:`fix`,onCommitted:async()=>rc(o)});if(`postCheckError`in s){n.ui.notify(`❌ Post-write self-check failed: ${s.postCheckError}\nThe backup at ${l} has been restored. No changes applied.`,`error`);return}Ut(),n.ui.notify(`✅ Fix applied to ${P()}.\nBackup saved to: ${l}\nRun /reload or restart Pi for the change to take effect.`,`info`)}catch(e){n.ui.notify(`❌ Write failed: ${e instanceof Error?e.message:String(e)}\nBackup may be at: ${l}`,`error`)}return}n.ui.notify(`No changes were made. Canceled by user.`,`info`);return}}}let a=t?xs(e.providerLabel,e.modelId,e.compatKeys):Ns(e.compatKeys),o=[];t?t.scenario===`provider_missing`?o.push(`ℹ️ Provider "${e.providerLabel}" does not exist in ${P()}.`,`This is common for API-logged-in providers (e.g. /login ...).`,``,`Add the following minimal block under the "providers" key (keep your`,`existing authentication as-is):`):o.push(`ℹ️ Model "${e.modelId}" was not found in ${P()}`,`under providers["${e.providerLabel}"].`,``,`Add the following modelOverrides entry (keep existing auth):`):o.push(`❌ Could not locate model "${e.modelId}" or provider "${e.providerLabel}" in ${P()}.`,``,`Providers that were added via Pi /login API (e.g. opencode go) do not have`,`entries in models.json. You can create a minimal modelOverrides entry by hand:`),o.push(``,a,``,`Then save and run /reload.`),n.ui.notify(o.join(`
|
|
62
|
-
`),`warning`);return}let o=a.allModelIds.filter(t=>t===e.modelId).length;if(o>1){n.ui.notify(`❌ ${P()} contains ${o} custom model definitions with the exact id "${e.modelId}" under providers["${e.providerLabel}"].\nPi uses the last definition, but /cache-optimizer fix refuses an ambiguous duplicate-id edit. Remove or consolidate the duplicates, then run the command again.`,`error`);return}let s=As(r,a,e.compatKeys,e.providerLabel,e.forceModelLevel),l=s.placement===`modelOverride`&&a.modelOverrideObjectBrace<0,u=l?Ss(r,e.providerLabel,e.modelId,e.compatKeys):void 0;if(l&&!u){n.ui.notify(`❌ Could not safely create the highest-precedence model override. No changes were made.`,`error`);return}let d=u?.modifiedText??js(r,a,e.compatKeys,s.placement),f=l?ws(r,d,e.providerLabel,e.modelId,e.compatKeys,i):Ms(r,d,e.providerLabel,e.modelId,e.compatKeys,s.placement,i);if(f!==null){n.ui.notify(`❌ Self-check failed before write: ${f}\nNo changes were made. Manual edit required.`,`error`);return}let m=JSON.stringify(e.compatKeys,null,2),h=(s.placement===`provider`?a.providerCompatBrace>=0:s.placement===`modelOverride`?a.modelOverrideCompatBrace>=0:a.compatObjectBrace>=0)?`existing "compat" object`:`new "compat" object`,g=s.placement===`provider`?`providers["${e.providerLabel}"] -> compat (provider level, ${h})`:s.placement===`modelOverride`?`providers["${e.providerLabel}"] -> modelOverrides -> "${e.modelId}" -> compat (${h})`:`providers["${e.providerLabel}"] -> models -> "${e.modelId}" -> compat (model level, ${h})`,v=Fs(),y=`${J}.backup-cache-optimizer-${v}`,ee=s.placement===`provider`?` 1. This change applies to ALL ${a.allModelIds.length||1} model(s) in the "${e.providerLabel}" provider, across all sessions.`:` 1. This change affects ALL sessions using the "${e.providerLabel}" provider/channel (scoped to model "${e.modelId}").`,b=[`📝 Preview of changes to ${P()}:`,``,`Location: ${g}`,`Placement: ${s.placement} level — ${s.reason}`,`Compat JSON to write:`,m,``,`⚠️ Risk notice:`,ee,` 2. A timestamped backup will be written to: ${y}`,` 3. You must restart Pi / run /reload for the change to take effect.`,` 4. If the file contains comments or unusual formatting, please verify the result after write.`];if(c.has(B(i))&&b.push(``,`💡 This fix overrides supportsLongCacheRetention to false because`,`a 400 prompt_cache_retention error was observed for this model.`,`After applying and reloading, Pi will no longer send the`,`prompt_cache_retention parameter to this provider.`),b.push(``,`Apply these changes?`),!await n.ui.confirm(`Cache Optimizer — Fix`,b.join(`
|
|
63
|
-
`))){n.ui.notify(`No changes were made. Canceled by user.`,`info`);return}try{let t=lc(r,d,e.providerLabel,e.modelId,s.placement,e.compatKeys,!l,y);if(!t){n.ui.notify(`❌ Could not create a privacy-safe fix receipt. No changes were made.`,`error`);return}let a=await Ws(d,y,t=>l?ws(r,t,e.providerLabel,e.modelId,e.compatKeys,i):Ms(r,t,e.providerLabel,e.modelId,e.compatKeys,s.placement,i),{expectedCurrentHash:$(r),purpose:`fix`,onCommitted:async()=>rc(t)});if(`postCheckError`in a){n.ui.notify(`❌ Post-write self-check failed: ${a.postCheckError}\nThe backup at ${y} has been restored. No changes applied.`,`error`);return}Ut(),n.ui.notify(`✅ Fix applied to ${P()}.\nBackup saved to: ${y}\nRun /reload or restart Pi for the change to take effect.`,`info`)}catch(e){n.ui.notify(`❌ Write failed: ${e instanceof Error?e.message:String(e)}\nBackup may be at: ${y}`,`error`)}}else{if(n.hasUI){let e=[`Enable — Turn on runtime optimizations`,`Disable — Turn off runtime optimizations`,`Doctor — Show cache configuration`,`Stats — Show current-session model statistics`,`Compat — Show compat suggestion`,`Fix — Auto-fix compat issues (writes models.json)`,`Rollback — Undo the latest confirmed fix`,`Footer mode — Choose total, session, or process stats`,`Reset — Reset local provider/model stats`,`Cancel`],t=await n.ui.select(`Cache Optimizer`,e);if(t===e[0])await vt(`enable`,n);else if(t===e[1])await vt(`disable`,n);else if(t===e[2])await vt(`doctor`,n);else if(t===e[3])await vt(`stats`,n);else if(t===e[4])await vt(`compat`,n);else if(t===e[5])await vt(`fix`,n);else if(t===e[6])await vt(`rollback`,n);else if(t===e[7]){let e=[`session — Current Pi conversation session (default)`,`total — All local sessions today`,`process — Current extension instance only`,`Cancel`],t=await n.ui.select(`Footer cache stats mode`,e),r=t===e[0]?`session`:t===e[1]?`total`:t===e[2]?`process`:void 0;r&&await vt(`config footer-mode ${r}`,n)}else t===e[8]&&await vt(`reset`,n);return}let e=[];e.push(`📋 /cache-optimizer commands:`),e.push(` enable — Enable prompt/cache optimizations for this Pi process`),e.push(` disable — Disable prompt/cache optimizations for this Pi process`),e.push(` doctor — Show current model/provider/api/baseUrl/compat and low-hit diagnosis`),e.push(` stats — Show detailed statistics for every model in the current session`),e.push(` stats all — Show detailed totals for every model across all local sessions`),e.push(` stats contributors — Show per-session contributors for the active model`),e.push(` compat — Show compat suggestion with edit location`),e.push(` config footer-mode total|session|process — Persist the footer stats mode`),e.push(` fix — Auto-fix compat issues (writes models.json, requires UI)`),e.push(` rollback — Undo the latest confirmed fix (requires UI confirmation)`),e.push(` reset — Reset local provider/model stats for current model (does not affect upstream)`),e.push(``),e.push(vn());let t=un(fn);if(e.push(`Footer stats mode: ${t.mode} (${t.source})`),e.push(``),i){let t=B(i),n=Ua(i);if(n.length>0)e.push(`⚠️ Active model "${t}" missing compat: ${n.join(`, `)}`),e.push(`Run "/cache-optimizer compat" for edit instructions.`);else if(Kn(i)||Va(i)||Qo(i))e.push(`✅ Active model "${t}": compat fully configured.`);else{e.push(`ℹ️ Active model "${t}": compat check not applicable.`);let n=is(i).slice(1);for(let t of n)e.push(t)}}else e.push(`No active model selected.`);n.ui.notify(e.join(`
|
|
64
|
-
`),`info`)}}r.registerCommand(`cache-optimizer`,{description:`Configure and diagnose Pi cache behavior`,getArgumentCompletions:on,handler:vt})}exports.__internals_for_tests=gc,exports.default=_c;
|
|
65
|
-
//# sourceMappingURL=pi-cache-optimizer-DwxMItZw.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"apiContracts.cjs","names":["defineApiContract"],"sources":["../../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract } from '@agimon-ai/doompi-core/api-contracts';\n\n/** This facet contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */\nexport const apiContracts = defineApiContract({ version: 1, http: [], sockets: [], dynamic: [] });\nexport default apiContracts;\n"],"mappings":"AAGA,MAAa,GAAA,gDAAeA,CAAAA,CAAAA,kBAAAA,CAAkB,CAAE,QAAS,EAAG,KAAM,CAAC,EAAG,QAAS,CAAC,EAAG,QAAS,CAAC,CAAE,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"apiContracts.mjs","names":[],"sources":["../../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract } from '@agimon-ai/doompi-core/api-contracts';\n\n/** This facet contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */\nexport const apiContracts = defineApiContract({ version: 1, http: [], sockets: [], dynamic: [] });\nexport default apiContracts;\n"],"mappings":"yEAGA,MAAa,EAAe,EAAkB,CAAE,QAAS,EAAG,KAAM,CAAC,EAAG,QAAS,CAAC,EAAG,QAAS,CAAC,CAAE,CAAC"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
function e(e){if(!Number.isFinite(e))throw Error(`Prompt cache identity cannot contain a non-finite number.`);return Object.is(e,-0)?0:e}function t(n){if(n===null)return null;if(typeof n==`string`)return n.normalize(`NFC`);if(typeof n==`boolean`)return n;if(typeof n==`number`)return e(n);if(Array.isArray(n))return n.map(e=>t(e));if(typeof n!=`object`)throw Error(`Unsupported prompt cache identity value: ${typeof n}.`);let r=n,i={};for(let e of Object.keys(r).sort((e,t)=>e.localeCompare(t))){let n=r[e];n!==void 0&&(i[e.normalize(`NFC`)]=t(n))}return i}function n(e){return JSON.stringify(t(e))}exports.canonicalJson=n,exports.canonicalValue=t;
|
|
2
|
-
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../../../src/services/canonical/index.ts"],"sourcesContent":["export type CanonicalValue = null | boolean | number | string | readonly CanonicalValue[] | CanonicalObject;\n\nexport interface CanonicalObject {\n readonly [key: string]: CanonicalValue;\n}\n\nfunction canonicalNumber(value: number): number {\n if (!Number.isFinite(value)) throw new Error('Prompt cache identity cannot contain a non-finite number.');\n return Object.is(value, -0) ? 0 : value;\n}\n\nexport function canonicalValue(value: unknown): CanonicalValue {\n if (value === null) return null;\n if (typeof value === 'string') return value.normalize('NFC');\n if (typeof value === 'boolean') return value;\n if (typeof value === 'number') return canonicalNumber(value);\n if (Array.isArray(value)) return value.map((entry) => canonicalValue(entry));\n if (typeof value !== 'object') throw new Error(`Unsupported prompt cache identity value: ${typeof value}.`);\n\n const record = value as Readonly<Record<string, unknown>>;\n const result: Record<string, CanonicalValue> = {};\n for (const key of Object.keys(record).sort((left, right) => left.localeCompare(right))) {\n const entry = record[key];\n if (entry !== undefined) result[key.normalize('NFC')] = canonicalValue(entry);\n }\n return result;\n}\n\nexport function canonicalJson(value: unknown): string {\n return JSON.stringify(canonicalValue(value));\n}\n"],"mappings":"AAMA,SAAS,EAAgB,EAAuB,CAC9C,GAAI,CAAC,OAAO,SAAS,CAAK,EAAG,MAAU,MAAM,2DAA2D,EACxG,OAAO,OAAO,GAAG,EAAO,EAAE,EAAI,EAAI,CACpC,CAEA,SAAgB,EAAe,EAAgC,CAC7D,GAAI,IAAU,KAAM,OAAO,KAC3B,GAAI,OAAO,GAAU,SAAU,OAAO,EAAM,UAAU,KAAK,EAC3D,GAAI,OAAO,GAAU,UAAW,OAAO,EACvC,GAAI,OAAO,GAAU,SAAU,OAAO,EAAgB,CAAK,EAC3D,GAAI,MAAM,QAAQ,CAAK,EAAG,OAAO,EAAM,IAAK,GAAU,EAAe,CAAK,CAAC,EAC3E,GAAI,OAAO,GAAU,SAAU,MAAU,MAAM,4CAA4C,OAAO,EAAM,EAAE,EAE1G,IAAM,EAAS,EACT,EAAyC,CAAC,EAChD,IAAK,IAAM,KAAO,OAAO,KAAK,CAAM,CAAC,CAAC,MAAM,EAAM,IAAU,EAAK,cAAc,CAAK,CAAC,EAAG,CACtF,IAAM,EAAQ,EAAO,GACjB,IAAU,IAAA,KAAW,EAAO,EAAI,UAAU,KAAK,GAAK,EAAe,CAAK,EAC9E,CACA,OAAO,CACT,CAEA,SAAgB,EAAc,EAAwB,CACpD,OAAO,KAAK,UAAU,EAAe,CAAK,CAAC,CAC7C"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../../../src/services/canonical/index.ts"],"mappings":";YAAY,6DAA6D,mBAAmB;iBAE3E;YACL,cAAc;;wBAQV,eAAe,iBAAiB;wBAiBhC,cAAc"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/services/canonical/index.ts"],"mappings":";YAAY,6DAA6D,mBAAmB;iBAE3E;YACL,cAAc;;wBAQV,eAAe,iBAAiB;wBAiBhC,cAAc"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
function e(e){if(!Number.isFinite(e))throw Error(`Prompt cache identity cannot contain a non-finite number.`);return Object.is(e,-0)?0:e}function t(n){if(n===null)return null;if(typeof n==`string`)return n.normalize(`NFC`);if(typeof n==`boolean`)return n;if(typeof n==`number`)return e(n);if(Array.isArray(n))return n.map(e=>t(e));if(typeof n!=`object`)throw Error(`Unsupported prompt cache identity value: ${typeof n}.`);let r=n,i={};for(let e of Object.keys(r).sort((e,t)=>e.localeCompare(t))){let n=r[e];n!==void 0&&(i[e.normalize(`NFC`)]=t(n))}return i}function n(e){return JSON.stringify(t(e))}export{n as canonicalJson,t as canonicalValue};
|
|
2
|
-
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../../../src/services/canonical/index.ts"],"sourcesContent":["export type CanonicalValue = null | boolean | number | string | readonly CanonicalValue[] | CanonicalObject;\n\nexport interface CanonicalObject {\n readonly [key: string]: CanonicalValue;\n}\n\nfunction canonicalNumber(value: number): number {\n if (!Number.isFinite(value)) throw new Error('Prompt cache identity cannot contain a non-finite number.');\n return Object.is(value, -0) ? 0 : value;\n}\n\nexport function canonicalValue(value: unknown): CanonicalValue {\n if (value === null) return null;\n if (typeof value === 'string') return value.normalize('NFC');\n if (typeof value === 'boolean') return value;\n if (typeof value === 'number') return canonicalNumber(value);\n if (Array.isArray(value)) return value.map((entry) => canonicalValue(entry));\n if (typeof value !== 'object') throw new Error(`Unsupported prompt cache identity value: ${typeof value}.`);\n\n const record = value as Readonly<Record<string, unknown>>;\n const result: Record<string, CanonicalValue> = {};\n for (const key of Object.keys(record).sort((left, right) => left.localeCompare(right))) {\n const entry = record[key];\n if (entry !== undefined) result[key.normalize('NFC')] = canonicalValue(entry);\n }\n return result;\n}\n\nexport function canonicalJson(value: unknown): string {\n return JSON.stringify(canonicalValue(value));\n}\n"],"mappings":"AAMA,SAAS,EAAgB,EAAuB,CAC9C,GAAI,CAAC,OAAO,SAAS,CAAK,EAAG,MAAU,MAAM,2DAA2D,EACxG,OAAO,OAAO,GAAG,EAAO,EAAE,EAAI,EAAI,CACpC,CAEA,SAAgB,EAAe,EAAgC,CAC7D,GAAI,IAAU,KAAM,OAAO,KAC3B,GAAI,OAAO,GAAU,SAAU,OAAO,EAAM,UAAU,KAAK,EAC3D,GAAI,OAAO,GAAU,UAAW,OAAO,EACvC,GAAI,OAAO,GAAU,SAAU,OAAO,EAAgB,CAAK,EAC3D,GAAI,MAAM,QAAQ,CAAK,EAAG,OAAO,EAAM,IAAK,GAAU,EAAe,CAAK,CAAC,EAC3E,GAAI,OAAO,GAAU,SAAU,MAAU,MAAM,4CAA4C,OAAO,EAAM,EAAE,EAE1G,IAAM,EAAS,EACT,EAAyC,CAAC,EAChD,IAAK,IAAM,KAAO,OAAO,KAAK,CAAM,CAAC,CAAC,MAAM,EAAM,IAAU,EAAK,cAAc,CAAK,CAAC,EAAG,CACtF,IAAM,EAAQ,EAAO,GACjB,IAAU,IAAA,KAAW,EAAO,EAAI,UAAU,KAAK,GAAK,EAAe,CAAK,EAC9E,CACA,OAAO,CACT,CAEA,SAAgB,EAAc,EAAwB,CACpD,OAAO,KAAK,UAAU,EAAe,CAAK,CAAC,CAC7C"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["createHash"],"sources":["../../../src/services/digest/index.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\n\nexport function sha256Base64Url(value: string): string {\n return createHash('sha256').update(value).digest('base64url');\n}\n"],"mappings":"6BAEA,SAAgB,EAAgB,EAAuB,CACrD,OAAA,EAAOA,EAAAA,WAAAA,CAAW,QAAQ,CAAC,CAAC,OAAO,CAAK,CAAC,CAAC,OAAO,WAAW,CAC9D"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../../../src/services/digest/index.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\n\nexport function sha256Base64Url(value: string): string {\n return createHash('sha256').update(value).digest('base64url');\n}\n"],"mappings":"yCAEA,SAAgB,EAAgB,EAAuB,CACrD,OAAO,EAAW,QAAQ,CAAC,CAAC,OAAO,CAAK,CAAC,CAAC,OAAO,WAAW,CAC9D"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require("../canonical/index.cjs");function t(t,n,r){return`${t}${r(e.canonicalJson(n))}`}function n(e){return e?.trim().replaceAll(`\\`,`/`)||void 0}function r(e){return e.filter(({activation:e})=>e===`active`||e===`activating`).map(({source:e,id:t,modelContextVariant:n})=>({source:e,id:t,...n?{modelContextVariant:n}:{}})).sort((e,t)=>e.source.localeCompare(t.source)||e.id.localeCompare(t.id))}function i(e,n){return t(`dpr1_`,{version:1,rootSessionId:e},n)}function a(e,a){return t(`dpn1_`,{version:1,rootSession:i(e.rootSessionId,a),compositionFingerprint:e.compositionFingerprint??null,majorMode:e.majorMode,domains:[...e.domains],profile:e.profile??null,persona:n(e.persona)??null,minorModes:r(e.minorModes)},a)}function o(e,n){return t(`dch1_`,{version:1,systemPrompt:e.systemPrompt??null,tools:[...e.tools],excludedTools:[...e.excludedTools].sort((e,t)=>e.localeCompare(t)),extensions:[...e.extensions],inheritProjectContext:e.inheritProjectContext??null,inheritSkills:e.inheritSkills??null,fanout:e.fanout??null,structuredOutputSchema:e.structuredOutputSchema??null},n)}function s(e,n){return t(`dpm1_`,{version:1,virtualProvider:e.virtualProvider??null,virtualModel:e.virtualModel??null,api:e.api??null,baseUrl:e.baseUrl??null,wireModel:e.wireModel??null},n)}function c(e,n,r,i,a){return t(`dpc1_`,{version:1,parentNamespace:e,scope:n,childProjection:a??null,modelFingerprint:r},i)}exports.createChildPromptCacheProjection=o,exports.createParentPromptCacheNamespace=a,exports.createPromptCacheKey=c,exports.createPromptCacheModelFingerprint=s,exports.createRootSessionIdentity=i;
|
|
2
|
-
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["canonicalJson"],"sources":["../../../src/services/namespace/index.ts"],"sourcesContent":["import type {\n PromptCacheChildProjection,\n PromptCacheDigest,\n PromptCacheMinorModeState,\n PromptCacheModelIdentity,\n PromptCacheParentState,\n} from '../../types/cache';\nimport { canonicalJson } from '../canonical';\n\nconst KEY_PREFIX = 'dpc1_';\nconst PARENT_PREFIX = 'dpn1_';\nconst CHILD_PREFIX = 'dch1_';\nconst ROOT_PREFIX = 'dpr1_';\nconst MODEL_PREFIX = 'dpm1_';\n\nfunction digestIdentity(prefix: string, value: unknown, digest: PromptCacheDigest): string {\n return `${prefix}${digest(canonicalJson(value))}`;\n}\n\nfunction normalizedPersona(value: string | undefined): string | undefined {\n const normalized = value?.trim().replaceAll('\\\\', '/');\n return normalized || undefined;\n}\n\nfunction activeMinorModes(modes: readonly PromptCacheMinorModeState[]): readonly Record<string, string>[] {\n return modes\n .filter(({ activation }) => activation === 'active' || activation === 'activating')\n .map(({ source, id, modelContextVariant }) => ({\n source,\n id,\n ...(modelContextVariant ? { modelContextVariant } : {}),\n }))\n .sort((left, right) => left.source.localeCompare(right.source) || left.id.localeCompare(right.id));\n}\n\nexport function createRootSessionIdentity(rootSessionId: string, digest: PromptCacheDigest): string {\n return digestIdentity(ROOT_PREFIX, { version: 1, rootSessionId }, digest);\n}\n\nexport function createParentPromptCacheNamespace(state: PromptCacheParentState, digest: PromptCacheDigest): string {\n return digestIdentity(\n PARENT_PREFIX,\n {\n version: 1,\n rootSession: createRootSessionIdentity(state.rootSessionId, digest),\n compositionFingerprint: state.compositionFingerprint ?? null,\n majorMode: state.majorMode,\n domains: [...state.domains],\n profile: state.profile ?? null,\n persona: normalizedPersona(state.persona) ?? null,\n minorModes: activeMinorModes(state.minorModes),\n },\n digest,\n );\n}\n\nexport function createChildPromptCacheProjection(\n projection: PromptCacheChildProjection,\n digest: PromptCacheDigest,\n): string {\n return digestIdentity(\n CHILD_PREFIX,\n {\n version: 1,\n systemPrompt: projection.systemPrompt ?? null,\n tools: [...projection.tools],\n excludedTools: [...projection.excludedTools].sort((left, right) => left.localeCompare(right)),\n extensions: [...projection.extensions],\n inheritProjectContext: projection.inheritProjectContext ?? null,\n inheritSkills: projection.inheritSkills ?? null,\n fanout: projection.fanout ?? null,\n structuredOutputSchema: projection.structuredOutputSchema ?? null,\n },\n digest,\n );\n}\n\nexport function createPromptCacheModelFingerprint(model: PromptCacheModelIdentity, digest: PromptCacheDigest): string {\n return digestIdentity(\n MODEL_PREFIX,\n {\n version: 1,\n virtualProvider: model.virtualProvider ?? null,\n virtualModel: model.virtualModel ?? null,\n api: model.api ?? null,\n baseUrl: model.baseUrl ?? null,\n wireModel: model.wireModel ?? null,\n },\n digest,\n );\n}\n\nexport function createPromptCacheKey(\n parentNamespace: string,\n scope: 'parent' | 'child',\n modelFingerprint: string,\n digest: PromptCacheDigest,\n childProjection?: string,\n): string {\n return digestIdentity(\n KEY_PREFIX,\n {\n version: 1,\n parentNamespace,\n scope,\n childProjection: childProjection ?? null,\n modelFingerprint,\n },\n digest,\n );\n}\n"],"mappings":"0CAeA,SAAS,EAAe,EAAgB,EAAgB,EAAmC,CACzF,MAAO,GAAG,IAAS,EAAOA,EAAAA,cAAc,CAAK,CAAC,GAChD,CAEA,SAAS,EAAkB,EAA+C,CAExE,OADmB,GAAO,KAAK,CAAC,CAAC,WAAW,KAAM,GAAG,GAChC,IAAA,EACvB,CAEA,SAAS,EAAiB,EAAgF,CACxG,OAAO,EACJ,QAAQ,CAAE,gBAAiB,IAAe,UAAY,IAAe,YAAY,CAAC,CAClF,KAAK,CAAE,SAAQ,KAAI,0BAA2B,CAC7C,SACA,KACA,GAAI,EAAsB,CAAE,qBAAoB,EAAI,CAAC,CACvD,EAAE,CAAC,CACF,MAAM,EAAM,IAAU,EAAK,OAAO,cAAc,EAAM,MAAM,GAAK,EAAK,GAAG,cAAc,EAAM,EAAE,CAAC,CACrG,CAEA,SAAgB,EAA0B,EAAuB,EAAmC,CAClG,OAAO,EAAe,QAAa,CAAE,QAAS,EAAG,eAAc,EAAG,CAAM,CAC1E,CAEA,SAAgB,EAAiC,EAA+B,EAAmC,CACjH,OAAO,EACL,QACA,CACE,QAAS,EACT,YAAa,EAA0B,EAAM,cAAe,CAAM,EAClE,uBAAwB,EAAM,wBAA0B,KACxD,UAAW,EAAM,UACjB,QAAS,CAAC,GAAG,EAAM,OAAO,EAC1B,QAAS,EAAM,SAAW,KAC1B,QAAS,EAAkB,EAAM,OAAO,GAAK,KAC7C,WAAY,EAAiB,EAAM,UAAU,CAC/C,EACA,CACF,CACF,CAEA,SAAgB,EACd,EACA,EACQ,CACR,OAAO,EACL,QACA,CACE,QAAS,EACT,aAAc,EAAW,cAAgB,KACzC,MAAO,CAAC,GAAG,EAAW,KAAK,EAC3B,cAAe,CAAC,GAAG,EAAW,aAAa,CAAC,CAAC,MAAM,EAAM,IAAU,EAAK,cAAc,CAAK,CAAC,EAC5F,WAAY,CAAC,GAAG,EAAW,UAAU,EACrC,sBAAuB,EAAW,uBAAyB,KAC3D,cAAe,EAAW,eAAiB,KAC3C,OAAQ,EAAW,QAAU,KAC7B,uBAAwB,EAAW,wBAA0B,IAC/D,EACA,CACF,CACF,CAEA,SAAgB,EAAkC,EAAiC,EAAmC,CACpH,OAAO,EACL,QACA,CACE,QAAS,EACT,gBAAiB,EAAM,iBAAmB,KAC1C,aAAc,EAAM,cAAgB,KACpC,IAAK,EAAM,KAAO,KAClB,QAAS,EAAM,SAAW,KAC1B,UAAW,EAAM,WAAa,IAChC,EACA,CACF,CACF,CAEA,SAAgB,EACd,EACA,EACA,EACA,EACA,EACQ,CACR,OAAO,EACL,QACA,CACE,QAAS,EACT,kBACA,QACA,gBAAiB,GAAmB,KACpC,kBACF,EACA,CACF,CACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../../../src/services/namespace/index.ts"],"mappings":";;wBAmCgB,0BAA0B,uBAAuB,QAAQ;wBAIzD,iCAAiC,OAAO,wBAAwB,QAAQ;wBAiBxE,iCACd,YAAY,4BACZ,QAAQ;wBAmBM,kCAAkC,OAAO,0BAA0B,QAAQ;wBAe3E,qBACd,yBACA,2BACA,0BACA,QAAQ,mBACR"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/services/namespace/index.ts"],"mappings":";;wBAmCgB,0BAA0B,uBAAuB,QAAQ;wBAIzD,iCAAiC,OAAO,wBAAwB,QAAQ;wBAiBxE,iCACd,YAAY,4BACZ,QAAQ;wBAmBM,kCAAkC,OAAO,0BAA0B,QAAQ;wBAe3E,qBACd,yBACA,2BACA,0BACA,QAAQ,mBACR"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{canonicalJson as e}from"../canonical/index.mjs";function t(t,n,r){return`${t}${r(e(n))}`}function n(e){return e?.trim().replaceAll(`\\`,`/`)||void 0}function r(e){return e.filter(({activation:e})=>e===`active`||e===`activating`).map(({source:e,id:t,modelContextVariant:n})=>({source:e,id:t,...n?{modelContextVariant:n}:{}})).sort((e,t)=>e.source.localeCompare(t.source)||e.id.localeCompare(t.id))}function i(e,n){return t(`dpr1_`,{version:1,rootSessionId:e},n)}function a(e,a){return t(`dpn1_`,{version:1,rootSession:i(e.rootSessionId,a),compositionFingerprint:e.compositionFingerprint??null,majorMode:e.majorMode,domains:[...e.domains],profile:e.profile??null,persona:n(e.persona)??null,minorModes:r(e.minorModes)},a)}function o(e,n){return t(`dch1_`,{version:1,systemPrompt:e.systemPrompt??null,tools:[...e.tools],excludedTools:[...e.excludedTools].sort((e,t)=>e.localeCompare(t)),extensions:[...e.extensions],inheritProjectContext:e.inheritProjectContext??null,inheritSkills:e.inheritSkills??null,fanout:e.fanout??null,structuredOutputSchema:e.structuredOutputSchema??null},n)}function s(e,n){return t(`dpm1_`,{version:1,virtualProvider:e.virtualProvider??null,virtualModel:e.virtualModel??null,api:e.api??null,baseUrl:e.baseUrl??null,wireModel:e.wireModel??null},n)}function c(e,n,r,i,a){return t(`dpc1_`,{version:1,parentNamespace:e,scope:n,childProjection:a??null,modelFingerprint:r},i)}export{o as createChildPromptCacheProjection,a as createParentPromptCacheNamespace,c as createPromptCacheKey,s as createPromptCacheModelFingerprint,i as createRootSessionIdentity};
|
|
2
|
-
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../../../src/services/namespace/index.ts"],"sourcesContent":["import type {\n PromptCacheChildProjection,\n PromptCacheDigest,\n PromptCacheMinorModeState,\n PromptCacheModelIdentity,\n PromptCacheParentState,\n} from '../../types/cache';\nimport { canonicalJson } from '../canonical';\n\nconst KEY_PREFIX = 'dpc1_';\nconst PARENT_PREFIX = 'dpn1_';\nconst CHILD_PREFIX = 'dch1_';\nconst ROOT_PREFIX = 'dpr1_';\nconst MODEL_PREFIX = 'dpm1_';\n\nfunction digestIdentity(prefix: string, value: unknown, digest: PromptCacheDigest): string {\n return `${prefix}${digest(canonicalJson(value))}`;\n}\n\nfunction normalizedPersona(value: string | undefined): string | undefined {\n const normalized = value?.trim().replaceAll('\\\\', '/');\n return normalized || undefined;\n}\n\nfunction activeMinorModes(modes: readonly PromptCacheMinorModeState[]): readonly Record<string, string>[] {\n return modes\n .filter(({ activation }) => activation === 'active' || activation === 'activating')\n .map(({ source, id, modelContextVariant }) => ({\n source,\n id,\n ...(modelContextVariant ? { modelContextVariant } : {}),\n }))\n .sort((left, right) => left.source.localeCompare(right.source) || left.id.localeCompare(right.id));\n}\n\nexport function createRootSessionIdentity(rootSessionId: string, digest: PromptCacheDigest): string {\n return digestIdentity(ROOT_PREFIX, { version: 1, rootSessionId }, digest);\n}\n\nexport function createParentPromptCacheNamespace(state: PromptCacheParentState, digest: PromptCacheDigest): string {\n return digestIdentity(\n PARENT_PREFIX,\n {\n version: 1,\n rootSession: createRootSessionIdentity(state.rootSessionId, digest),\n compositionFingerprint: state.compositionFingerprint ?? null,\n majorMode: state.majorMode,\n domains: [...state.domains],\n profile: state.profile ?? null,\n persona: normalizedPersona(state.persona) ?? null,\n minorModes: activeMinorModes(state.minorModes),\n },\n digest,\n );\n}\n\nexport function createChildPromptCacheProjection(\n projection: PromptCacheChildProjection,\n digest: PromptCacheDigest,\n): string {\n return digestIdentity(\n CHILD_PREFIX,\n {\n version: 1,\n systemPrompt: projection.systemPrompt ?? null,\n tools: [...projection.tools],\n excludedTools: [...projection.excludedTools].sort((left, right) => left.localeCompare(right)),\n extensions: [...projection.extensions],\n inheritProjectContext: projection.inheritProjectContext ?? null,\n inheritSkills: projection.inheritSkills ?? null,\n fanout: projection.fanout ?? null,\n structuredOutputSchema: projection.structuredOutputSchema ?? null,\n },\n digest,\n );\n}\n\nexport function createPromptCacheModelFingerprint(model: PromptCacheModelIdentity, digest: PromptCacheDigest): string {\n return digestIdentity(\n MODEL_PREFIX,\n {\n version: 1,\n virtualProvider: model.virtualProvider ?? null,\n virtualModel: model.virtualModel ?? null,\n api: model.api ?? null,\n baseUrl: model.baseUrl ?? null,\n wireModel: model.wireModel ?? null,\n },\n digest,\n );\n}\n\nexport function createPromptCacheKey(\n parentNamespace: string,\n scope: 'parent' | 'child',\n modelFingerprint: string,\n digest: PromptCacheDigest,\n childProjection?: string,\n): string {\n return digestIdentity(\n KEY_PREFIX,\n {\n version: 1,\n parentNamespace,\n scope,\n childProjection: childProjection ?? null,\n modelFingerprint,\n },\n digest,\n );\n}\n"],"mappings":"uDAeA,SAAS,EAAe,EAAgB,EAAgB,EAAmC,CACzF,MAAO,GAAG,IAAS,EAAO,EAAc,CAAK,CAAC,GAChD,CAEA,SAAS,EAAkB,EAA+C,CAExE,OADmB,GAAO,KAAK,CAAC,CAAC,WAAW,KAAM,GAAG,GAChC,IAAA,EACvB,CAEA,SAAS,EAAiB,EAAgF,CACxG,OAAO,EACJ,QAAQ,CAAE,gBAAiB,IAAe,UAAY,IAAe,YAAY,CAAC,CAClF,KAAK,CAAE,SAAQ,KAAI,0BAA2B,CAC7C,SACA,KACA,GAAI,EAAsB,CAAE,qBAAoB,EAAI,CAAC,CACvD,EAAE,CAAC,CACF,MAAM,EAAM,IAAU,EAAK,OAAO,cAAc,EAAM,MAAM,GAAK,EAAK,GAAG,cAAc,EAAM,EAAE,CAAC,CACrG,CAEA,SAAgB,EAA0B,EAAuB,EAAmC,CAClG,OAAO,EAAe,QAAa,CAAE,QAAS,EAAG,eAAc,EAAG,CAAM,CAC1E,CAEA,SAAgB,EAAiC,EAA+B,EAAmC,CACjH,OAAO,EACL,QACA,CACE,QAAS,EACT,YAAa,EAA0B,EAAM,cAAe,CAAM,EAClE,uBAAwB,EAAM,wBAA0B,KACxD,UAAW,EAAM,UACjB,QAAS,CAAC,GAAG,EAAM,OAAO,EAC1B,QAAS,EAAM,SAAW,KAC1B,QAAS,EAAkB,EAAM,OAAO,GAAK,KAC7C,WAAY,EAAiB,EAAM,UAAU,CAC/C,EACA,CACF,CACF,CAEA,SAAgB,EACd,EACA,EACQ,CACR,OAAO,EACL,QACA,CACE,QAAS,EACT,aAAc,EAAW,cAAgB,KACzC,MAAO,CAAC,GAAG,EAAW,KAAK,EAC3B,cAAe,CAAC,GAAG,EAAW,aAAa,CAAC,CAAC,MAAM,EAAM,IAAU,EAAK,cAAc,CAAK,CAAC,EAC5F,WAAY,CAAC,GAAG,EAAW,UAAU,EACrC,sBAAuB,EAAW,uBAAyB,KAC3D,cAAe,EAAW,eAAiB,KAC3C,OAAQ,EAAW,QAAU,KAC7B,uBAAwB,EAAW,wBAA0B,IAC/D,EACA,CACF,CACF,CAEA,SAAgB,EAAkC,EAAiC,EAAmC,CACpH,OAAO,EACL,QACA,CACE,QAAS,EACT,gBAAiB,EAAM,iBAAmB,KAC1C,aAAc,EAAM,cAAgB,KACpC,IAAK,EAAM,KAAO,KAClB,QAAS,EAAM,SAAW,KAC1B,UAAW,EAAM,WAAa,IAChC,EACA,CACF,CACF,CAEA,SAAgB,EACd,EACA,EACA,EACA,EACA,EACQ,CACR,OAAO,EACL,QACA,CACE,QAAS,EACT,kBACA,QACA,gBAAiB,GAAmB,KACpC,kBACF,EACA,CACF,CACF"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
let e=require("@deepseek-ai/cordis");const t=`doom/prompt-cache-telemetry`;var n=class extends e.Service{telemetry;constructor(e,n){super(e,t),this.telemetry=n}snapshot(){return this.telemetry.snapshot()}};function r(e){return e.get(t)}exports.DOOM_PROMPT_CACHE_TELEMETRY_SERVICE=t,exports.PromptCacheTelemetryService=n,exports.readPromptCacheTelemetry=r;
|
|
2
|
-
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["Service"],"sources":["../../../src/services/promptCacheTelemetry/index.ts"],"sourcesContent":["import { type Context, Service } from '@deepseek-ai/cordis';\n\nimport type { PromptCacheTelemetryPort, PromptCacheTelemetrySnapshot } from '../../types/cache';\n\nexport const DOOM_PROMPT_CACHE_TELEMETRY_SERVICE = 'doom/prompt-cache-telemetry';\n\nexport class PromptCacheTelemetryService extends Service {\n constructor(\n context: Context,\n private readonly telemetry: PromptCacheTelemetryPort,\n ) {\n super(context, DOOM_PROMPT_CACHE_TELEMETRY_SERVICE);\n }\n\n snapshot(): PromptCacheTelemetrySnapshot {\n return this.telemetry.snapshot();\n }\n}\n\nexport function readPromptCacheTelemetry(context: Context): PromptCacheTelemetryService | undefined {\n return context.get(DOOM_PROMPT_CACHE_TELEMETRY_SERVICE) as PromptCacheTelemetryService | undefined;\n}\n\ndeclare module '@deepseek-ai/cordis' {\n interface Context {\n 'doom/prompt-cache-telemetry': PromptCacheTelemetryService;\n }\n}\n"],"mappings":"qCAIA,MAAa,EAAsC,8BAEnD,IAAa,EAAb,cAAiDA,EAAAA,OAAQ,CAGpC,UAFnB,YACE,EACA,EACA,CACA,MAAM,EAAS,CAAmC,EAFjC,KAAA,UAAA,CAGnB,CAEA,UAAyC,CACvC,OAAO,KAAK,UAAU,SAAS,CACjC,CACF,EAEA,SAAgB,EAAyB,EAA2D,CAClG,OAAO,EAAQ,IAAI,CAAmC,CACxD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../../../src/services/promptCacheTelemetry/index.ts"],"mappings":";;;qBAIa;qBAEA,oCAAoC;mBAG5B;EAFnB,YACE,SAAS,SACQ,WAAW;EAK9B,YAAY;;wBAKE,yBAAyB,SAAS,UAAU;;YAKhD;IACR,+BAA+B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/services/promptCacheTelemetry/index.ts"],"mappings":";;;qBAIa;qBAEA,oCAAoC;mBAG5B;EAFnB,YACE,SAAS,SACQ,WAAW;EAK9B,YAAY;;wBAKE,yBAAyB,SAAS,UAAU;;YAKhD;IACR,+BAA+B"}
|