@agimon-ai/doompi-cache 0.0.1-alpha.2 → 0.0.1-alpha.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -22
- package/dist/extensions/pi.cjs +1 -2
- package/dist/extensions/pi.cjs.map +1 -1
- package/dist/extensions/pi.d.cts.map +1 -1
- package/dist/extensions/pi.d.mts.map +1 -1
- package/dist/extensions/pi.mjs +1 -2
- package/dist/extensions/pi.mjs.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +1 -2
- package/dist/index.d.mts +1 -2
- package/dist/index.mjs +1 -1
- package/dist/pi-cache-optimizer-D5_7O2Zu.mjs +59 -0
- package/dist/pi-cache-optimizer-D5_7O2Zu.mjs.map +1 -0
- package/dist/pi-cache-optimizer-DXfBHbvW.cjs +59 -0
- package/dist/pi-cache-optimizer-DXfBHbvW.cjs.map +1 -0
- package/llms.txt +1 -1
- package/package.json +16 -8
- package/src/prompts/doompi-use-cache/SKILL.md +1 -2
- package/dist/pi-cache-optimizer-B7B911Pz.cjs +0 -54
- package/dist/pi-cache-optimizer-B7B911Pz.cjs.map +0 -1
- package/dist/pi-cache-optimizer-CjPVk06Q.mjs +0 -54
- package/dist/pi-cache-optimizer-CjPVk06Q.mjs.map +0 -1
- package/dist/services/status.cjs +0 -3
- package/dist/services/status.cjs.map +0 -1
- package/dist/services/status.d.cts +0 -6
- package/dist/services/status.d.cts.map +0 -1
- package/dist/services/status.d.mts +0 -6
- package/dist/services/status.d.mts.map +0 -1
- package/dist/services/status.mjs +0 -3
- package/dist/services/status.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -1,45 +1,50 @@
|
|
|
1
1
|
# @agimon-ai/doompi-cache
|
|
2
2
|
|
|
3
|
-
Provider prompt
|
|
3
|
+
Provider prompt-cache policy and deterministic routing for DoomPi.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
DoomPi loads this package as fixed core. It derives stable provider cache keys from the active
|
|
6
|
+
session composition and applies them only to supported provider requests. The package can also run
|
|
7
|
+
as a standalone [Pi](https://www.npmjs.com/package/@earendil-works/pi-coding-agent) extension.
|
|
8
|
+
|
|
9
|
+
> **Alpha:** cache routing and provider integration may change between releases.
|
|
6
10
|
|
|
7
11
|
## Requirements
|
|
8
12
|
|
|
9
13
|
- Node.js 22.19.0 or newer
|
|
10
|
-
-
|
|
14
|
+
- Pi 0.84.4 for standalone extension use
|
|
11
15
|
|
|
12
16
|
## Install
|
|
13
17
|
|
|
14
|
-
|
|
15
|
-
pi install npm:@agimon-ai/doompi-cache
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
The package declares its Pi extension entry, so Pi loads it after installation. DoomPi users can include the package through their normal profile and domain composition instead.
|
|
18
|
+
A DoomPi installation already includes this package. Do not add it to `.doom/modes.yaml`.
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
To load it directly in Pi:
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
```text
|
|
25
|
-
/doom-cache
|
|
22
|
+
```bash
|
|
23
|
+
pi install npm:@agimon-ai/doompi-cache
|
|
26
24
|
```
|
|
27
25
|
|
|
28
|
-
|
|
26
|
+
Pi reads the extension entry from `package.json.pi.extensions` and loads it after installation.
|
|
29
27
|
|
|
30
28
|
## Package behavior
|
|
31
29
|
|
|
32
|
-
DoomPi derives an opaque provider cache key from stable model-visible state
|
|
30
|
+
DoomPi derives an opaque provider cache key from stable model-visible state: the composition
|
|
31
|
+
fingerprint, ordered domains, profile, persona, active minor modes, effective model, and child prompt
|
|
32
|
+
projection. Returning to equivalent state restores the same key. Provider expiry or eviction can
|
|
33
|
+
still make the cache cold.
|
|
33
34
|
|
|
34
|
-
The Pi extension rewrites only a nonblank cache key already emitted for an allowlisted OpenAI-family
|
|
35
|
+
The Pi extension rewrites only a nonblank cache key already emitted for an allowlisted OpenAI-family
|
|
36
|
+
wire API. It preserves supported retention and provider cache markers, does not add unsupported
|
|
37
|
+
fields to proxies, and reports only provider-observed token usage. Telemetry reports current
|
|
38
|
+
provider residency as `unknown`.
|
|
35
39
|
|
|
36
40
|
## Help
|
|
37
41
|
|
|
38
|
-
The published package includes `llms.txt` and
|
|
39
|
-
|
|
40
|
-
Help
|
|
42
|
+
The published package includes `llms.txt` and `src/prompts/doompi-use-cache/SKILL.md`. While DoomPi
|
|
43
|
+
Help is active, the extension adds `doompi-use-cache` to the live Help catalog. The contribution
|
|
44
|
+
follows Help provider replacement and is removed when the extension shuts down.
|
|
41
45
|
|
|
42
|
-
|
|
46
|
+
Help is optional. The standalone Pi extension does not require DoomPi Help or another DoomPi runtime
|
|
47
|
+
service.
|
|
43
48
|
|
|
44
49
|
## Public API
|
|
45
50
|
|
|
@@ -56,7 +61,8 @@ import {
|
|
|
56
61
|
} from '@agimon-ai/doompi-cache/env';
|
|
57
62
|
```
|
|
58
63
|
|
|
59
|
-
The Pi host entry is
|
|
64
|
+
The Pi host entry is `@agimon-ai/doompi-cache/extensions/pi`. Importing the root API does not install
|
|
65
|
+
the extension.
|
|
60
66
|
|
|
61
67
|
## Development
|
|
62
68
|
|
|
@@ -69,7 +75,8 @@ pnpm exec vibe-lint check .
|
|
|
69
75
|
npm pack --dry-run
|
|
70
76
|
```
|
|
71
77
|
|
|
72
|
-
The
|
|
78
|
+
The live OpenAI canary is opt-in. It reports provider `cached_tokens`; a cold result does not fail
|
|
79
|
+
the test deterministically:
|
|
73
80
|
|
|
74
81
|
```bash
|
|
75
82
|
DOOMPI_CACHE_LIVE_OPENAI=1 \
|
package/dist/extensions/pi.cjs
CHANGED
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});let e=require("@agimon-ai/doompi-config/harnessStore"),t=require("@agimon-ai/doompi-extension-contracts/cordis-host"),n=require("@agimon-ai/doompi-extension-contracts/help"),r=require("@agimon-ai/doompi-extension-contracts/mode"),i=require("node:crypto"),a=require("@deepseek-ai/cordis");
|
|
2
|
-
`)}function c(e,t){e.registerCommand(`doom-cache`,{description:`Show provider prompt cache status`,handler:async(e,n)=>{n.hasUI&&n.ui.notify(s(t.snapshot()),`info`)}})}var l=class{#e;#t={capability:`unknown`};#n=[];constructor(e=64){if(!Number.isInteger(e)||e<1)throw Error(`Prompt cache telemetry limit must be a positive integer.`);this.#e=e}beginRequest(e){this.#t={...e}}observe(e,t){let n=this.#t.namespace,r=this.#t.modelFingerprint;!n||!r||(this.#n.push({namespace:n,modelFingerprint:r,cacheRead:e.cacheRead,cacheWrite:e.cacheWrite,totalInput:e.totalInput,observedAt:t}),this.#n.length>this.#e&&this.#n.splice(0,this.#n.length-this.#e))}snapshot(){let e=[...this.#n];return{...this.#t,residency:`unknown`,observations:e,...e.length>0?{lastObservation:e.at(-1)}:{}}}reset(){this.#t={capability:`unknown`},this.#n=[]}};function u(e={}){return{telemetry:e.telemetry??new l,now:e.now??Date.now}}var d=class{#e;#t;#n;#r;constructor(e,t=process.env){this.#t=e,this.#e=t,this.#n={present:Object.hasOwn(t,e),value:t[e]}}set(e){this.#e[this.#t]=e,this.#r=e}restore(){this.#r!==void 0&&this.#e[this.#t]===this.#r&&(this.#n.present?this.#e[this.#t]=this.#n.value:delete this.#e[this.#t],this.#r=void 0)}};function f(e){return(0,i.createHash)(`sha256`).update(e).digest(`base64url`)}var p=class extends a.Service{telemetry;constructor(e,t){super(e,`doom/prompt-cache-telemetry`),this.telemetry=t}snapshot(){return this.telemetry.snapshot()}};function m(e){if(!Number.isFinite(e))throw Error(`Prompt cache identity cannot contain a non-finite number.`);return Object.is(e,-0)?0:e}function h(e){if(e===null)return null;if(typeof e==`string`)return e.normalize(`NFC`);if(typeof e==`boolean`)return e;if(typeof e==`number`)return m(e);if(Array.isArray(e))return e.map(e=>h(e));if(typeof e!=`object`)throw Error(`Unsupported prompt cache identity value: ${typeof e}.`);let t=e,n={};for(let e of Object.keys(t).sort((e,t)=>e.localeCompare(t))){let r=t[e];r!==void 0&&(n[e.normalize(`NFC`)]=h(r))}return n}function g(e){return JSON.stringify(h(e))}function _(e,t,n){return`${e}${n(g(t))}`}function v(e){return e?.trim().replaceAll(`\\`,`/`)||void 0}function y(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 b(e,t){return _(`dpr1_`,{version:1,rootSessionId:e},t)}function x(e,t){return _(`dpn1_`,{version:1,rootSession:b(e.rootSessionId,t),compositionFingerprint:e.compositionFingerprint??null,majorMode:e.majorMode,domains:[...e.domains],profile:e.profile??null,persona:v(e.persona)??null,minorModes:y(e.minorModes)},t)}function S(e,t){return _(`dpm1_`,{version:1,virtualProvider:e.virtualProvider??null,virtualModel:e.virtualModel??null,api:e.api??null,baseUrl:e.baseUrl??null,wireModel:e.wireModel??null},t)}function C(e,t,n,r,i){return _(`dpc1_`,{version:1,parentNamespace:e,scope:t,childProjection:i??null,modelFingerprint:n},r)}function w(e){let t=e.__internals_for_tests;return typeof t?.isRuntimeOptimizerEnabled==`function`&&typeof t.shouldInjectOpenAIPromptCacheKey==`function`&&t.isRuntimeOptimizerEnabled()&&t.shouldInjectOpenAIPromptCacheKey()}const T=new Set([`openai-completions`,`openai-responses`,`openai-codex-responses`,`azure-openai-responses`]),E=new Set([`anthropic-messages`,`bedrock-converse-stream`]),D=new Set([`google-generative-ai`,`google-vertex`,`google-vertex-anthropic`]);function O(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function k(e){return e.api===`openai-responses`||e.api===`openai-completions`?e.virtualProvider===`openai`?`key-and-long-retention`:`key-only`:e.api&&T.has(e.api)?`key-only`:e.api&&E.has(e.api)?`marker-only`:e.api&&D.has(e.api)?`automatic`:`unknown`}function A(e,t,n,r){if(!r||!t||!T.has(t)||!O(e))return;let i=e.prompt_cache_key;if(!(typeof i!=`string`||!i.trim()||i===n))return{...e,prompt_cache_key:n}}function j(e){if(!O(e))return;let t=e.prompt_cache_retention;return typeof t==`string`&&t.trim()?t.trim():void 0}function M(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:void 0}function N(e){return typeof e==`number`&&Number.isFinite(e)&&e>=0?e:void 0}function P(...e){for(let t of e){let e=N(t);if(e!==void 0)return e}}function F(e){let t=N(e.cacheRead),n=N(e.cacheWrite);if(t===void 0&&n===void 0)return;let r=N(e.input)??0;return{cacheRead:t??0,cacheWrite:n??0,totalInput:r+(t??0)+(n??0)}}function I(e){let t=M(e.prompt_tokens_details)??M(e.promptTokensDetails),n=M(e.input_tokens_details)??M(e.inputTokensDetails),r=P(t?.cached_tokens,t?.cachedTokens,n?.cached_tokens,n?.cachedTokens),i=P(t?.cache_write_tokens,t?.cacheWriteTokens,n?.cache_write_tokens,n?.cacheWriteTokens);if(r===void 0&&i===void 0)return;let a=(r??0)+(i??0),o=P(e.prompt_tokens,e.promptTokens,e.input_tokens,e.inputTokens);return{cacheRead:r??0,cacheWrite:i??0,totalInput:Math.max(o??a,a)}}function L(e){let t=P(e.cache_read_input_tokens,e.cacheReadInputTokens),n=P(e.cache_creation_input_tokens,e.cacheCreationInputTokens);if(t===void 0&&n===void 0)return;let r=P(e.input_tokens,e.inputTokens)??0;return{cacheRead:t??0,cacheWrite:n??0,totalInput:r+(t??0)+(n??0)}}function R(e){let t=M(e.usage_metadata)??M(e.usageMetadata)??e,n=P(t.cachedContentTokenCount,t.cached_content_token_count);if(n===void 0)return;let r=P(t.promptTokenCount,t.prompt_token_count,e.input_tokens,e.inputTokens,e.prompt_tokens,e.promptTokens);return{cacheRead:n,cacheWrite:0,totalInput:Math.max(r??n,n)}}function z(e){let t=M(M(e)?.usage);if(t)return F(t)??I(t)??L(t)??R(t)}const B=`DOOMPI_PROMPT_CACHE_PARENT_NAMESPACE`,V=`@agimon-ai/doompi-cache`;function H(e){return typeof e==`string`&&e.trim()?e.trim():void 0}function U(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:void 0}function W(e){let t=e.state;return{source:e.descriptor.source,id:e.descriptor.id,activation:t.activation,...t.modelContextVariant?{modelContextVariant:t.modelContextVariant}:{}}}function G(e,t){let n=U(e.model),r=U(t);return{virtualProvider:H(n?.provider),virtualModel:H(n?.id),api:H(n?.api),baseUrl:H(n?.baseUrl),wireModel:H(r?.model)}}function K(e){let t=U(e);return t?.stopReason===`error`||t?.stopReason===`aborted`}function q(e){return j(e)??(process.env.PI_CACHE_RETENTION===`long`?`long`:void 0)}function J(t,n,i,a){let o=new d(B),s=new d(`DOOMPI_PROMPT_CACHE_ROOT_SESSION`),l=H(process.env[B]),u=H(process.env.DOOMPI_PROMPT_CACHE_CHILD_PROJECTION),p=!!(l&&u),m,h=l,g=[],_=()=>{if(p)return h;if(!m)return;let t=(0,e.getHarnessState)();return h=x({rootSessionId:m,compositionFingerprint:t.compositionFingerprint,majorMode:t.majorMode,domains:t.domains,profile:t.profile,persona:t.personaFile,minorModes:g},f),o.set(h),s.set(b(m,f)),h};return t.inject([r.DOOM_MINOR_MODE_CATALOG_SERVICE],e=>{if(p)return;let t=(0,r.readMinorModeCatalog)(e);if(!t)return;let n=()=>{g=t.getSnapshot().modes.map(W),_()};return n(),t.subscribe(n)}),c(n,i.telemetry),n.on(`session_start`,(e,t)=>{p||(m=H(t.sessionManager.getSessionId()),_())}),n.on(`before_provider_request`,(e,t)=>{let n=p?l:_();if(!n)return;let r=G(t,e.payload),o=S(r,f),s=C(n,p?`child`:`parent`,o,f,u),c=A(e.payload,r.api,s,w(a));return i.telemetry.beginRequest({capability:k(r),namespace:n,modelFingerprint:o,requestedRetention:q(c??e.payload),...c?{keySuffix:s.slice(-8)}:{}}),c}),n.on(`message_end`,e=>{if(K(e.message))return;let t=z(e.message);t&&i.telemetry.observe(t,i.now())}),()=>{o.restore(),s.restore(),i.telemetry.reset()}}function Y(e,t){e.inject([n.DOOM_HELP_SERVICE],e=>{let t=(0,n.requireDoomHelpService)(e).register({source:V,moduleUrl:require("url").pathToFileURL(__filename).href,skills:[{name:`doompi-use-cache`,description:`Inspect DoomPi provider prompt cache policy, routing identity, and provider-observed usage.`}]});return()=>t.dispose()}),e.effect(function*(){new p(e,t.dependencies.telemetry),yield J(e,t.pi,t.dependencies,t.optimizer)},V)}async function X(e,n=u()){let r=await Promise.resolve().then(()=>require("../pi-cache-optimizer-B7B911Pz.cjs"));if(typeof r.default!=`function`)throw Error(`Pi Cache Optimizer does not export an extension factory.`);await r.default(e);let i=await(0,t.connectDoomCordisHost)(e,V),a=i.root.plugin(Y,{pi:e,dependencies:n,optimizer:r});try{await a}catch(e){try{await a.dispose()}finally{await i.dispose()}throw e}let o;e.on(`session_shutdown`,()=>o??=(async()=>{try{await a.dispose()}finally{await i.dispose()}})())}exports.activateCacheExtension=X,exports.default=X;
|
|
1
|
+
Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});let e=require("@agimon-ai/doompi-config/harnessStore"),t=require("@agimon-ai/doompi-extension-contracts/cordis-host"),n=require("@agimon-ai/doompi-extension-contracts/help"),r=require("@agimon-ai/doompi-extension-contracts/mode"),i=require("node:crypto"),a=require("@deepseek-ai/cordis");var o=class{#e;#t={capability:`unknown`};#n=[];constructor(e=64){if(!Number.isInteger(e)||e<1)throw Error(`Prompt cache telemetry limit must be a positive integer.`);this.#e=e}beginRequest(e){this.#t={...e}}observe(e,t){let n=this.#t.namespace,r=this.#t.modelFingerprint;!n||!r||(this.#n.push({namespace:n,modelFingerprint:r,cacheRead:e.cacheRead,cacheWrite:e.cacheWrite,totalInput:e.totalInput,observedAt:t}),this.#n.length>this.#e&&this.#n.splice(0,this.#n.length-this.#e))}snapshot(){let e=[...this.#n];return{...this.#t,residency:`unknown`,observations:e,...e.length>0?{lastObservation:e.at(-1)}:{}}}reset(){this.#t={capability:`unknown`},this.#n=[]}};function s(e={}){return{telemetry:e.telemetry??new o,now:e.now??Date.now}}var c=class{#e;#t;#n;#r;constructor(e,t=process.env){this.#t=e,this.#e=t,this.#n={present:Object.hasOwn(t,e),value:t[e]}}set(e){this.#e[this.#t]=e,this.#r=e}restore(){this.#r!==void 0&&this.#e[this.#t]===this.#r&&(this.#n.present?this.#e[this.#t]=this.#n.value:delete this.#e[this.#t],this.#r=void 0)}};function l(e){return(0,i.createHash)(`sha256`).update(e).digest(`base64url`)}var u=class extends a.Service{telemetry;constructor(e,t){super(e,`doom/prompt-cache-telemetry`),this.telemetry=t}snapshot(){return this.telemetry.snapshot()}};function d(e){if(!Number.isFinite(e))throw Error(`Prompt cache identity cannot contain a non-finite number.`);return Object.is(e,-0)?0:e}function f(e){if(e===null)return null;if(typeof e==`string`)return e.normalize(`NFC`);if(typeof e==`boolean`)return e;if(typeof e==`number`)return d(e);if(Array.isArray(e))return e.map(e=>f(e));if(typeof e!=`object`)throw Error(`Unsupported prompt cache identity value: ${typeof e}.`);let t=e,n={};for(let e of Object.keys(t).sort((e,t)=>e.localeCompare(t))){let r=t[e];r!==void 0&&(n[e.normalize(`NFC`)]=f(r))}return n}function p(e){return JSON.stringify(f(e))}function m(e,t,n){return`${e}${n(p(t))}`}function h(e){return e?.trim().replaceAll(`\\`,`/`)||void 0}function g(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 _(e,t){return m(`dpr1_`,{version:1,rootSessionId:e},t)}function v(e,t){return m(`dpn1_`,{version:1,rootSession:_(e.rootSessionId,t),compositionFingerprint:e.compositionFingerprint??null,majorMode:e.majorMode,domains:[...e.domains],profile:e.profile??null,persona:h(e.persona)??null,minorModes:g(e.minorModes)},t)}function y(e,t){return m(`dpm1_`,{version:1,virtualProvider:e.virtualProvider??null,virtualModel:e.virtualModel??null,api:e.api??null,baseUrl:e.baseUrl??null,wireModel:e.wireModel??null},t)}function b(e,t,n,r,i){return m(`dpc1_`,{version:1,parentNamespace:e,scope:t,childProjection:i??null,modelFingerprint:n},r)}function x(e){let t=e.__internals_for_tests;return typeof t?.isRuntimeOptimizerEnabled==`function`&&typeof t.shouldInjectOpenAIPromptCacheKey==`function`&&t.isRuntimeOptimizerEnabled()&&t.shouldInjectOpenAIPromptCacheKey()}const S=new Set([`openai-completions`,`openai-responses`,`openai-codex-responses`,`azure-openai-responses`]),C=new Set([`anthropic-messages`,`bedrock-converse-stream`]),w=new Set([`google-generative-ai`,`google-vertex`,`google-vertex-anthropic`]);function T(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function E(e){return e.api===`openai-responses`||e.api===`openai-completions`?e.virtualProvider===`openai`?`key-and-long-retention`:`key-only`:e.api&&S.has(e.api)?`key-only`:e.api&&C.has(e.api)?`marker-only`:e.api&&w.has(e.api)?`automatic`:`unknown`}function D(e,t,n,r){if(!r||!t||!S.has(t)||!T(e))return;let i=e.prompt_cache_key;if(!(typeof i!=`string`||!i.trim()||i===n))return{...e,prompt_cache_key:n}}function O(e){if(!T(e))return;let t=e.prompt_cache_retention;return typeof t==`string`&&t.trim()?t.trim():void 0}function k(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:void 0}function A(e){return typeof e==`number`&&Number.isFinite(e)&&e>=0?e:void 0}function j(...e){for(let t of e){let e=A(t);if(e!==void 0)return e}}function M(e){let t=A(e.cacheRead),n=A(e.cacheWrite);if(t===void 0&&n===void 0)return;let r=A(e.input)??0;return{cacheRead:t??0,cacheWrite:n??0,totalInput:r+(t??0)+(n??0)}}function N(e){let t=k(e.prompt_tokens_details)??k(e.promptTokensDetails),n=k(e.input_tokens_details)??k(e.inputTokensDetails),r=j(t?.cached_tokens,t?.cachedTokens,n?.cached_tokens,n?.cachedTokens),i=j(t?.cache_write_tokens,t?.cacheWriteTokens,n?.cache_write_tokens,n?.cacheWriteTokens);if(r===void 0&&i===void 0)return;let a=(r??0)+(i??0),o=j(e.prompt_tokens,e.promptTokens,e.input_tokens,e.inputTokens);return{cacheRead:r??0,cacheWrite:i??0,totalInput:Math.max(o??a,a)}}function P(e){let t=j(e.cache_read_input_tokens,e.cacheReadInputTokens),n=j(e.cache_creation_input_tokens,e.cacheCreationInputTokens);if(t===void 0&&n===void 0)return;let r=j(e.input_tokens,e.inputTokens)??0;return{cacheRead:t??0,cacheWrite:n??0,totalInput:r+(t??0)+(n??0)}}function F(e){let t=k(e.usage_metadata)??k(e.usageMetadata)??e,n=j(t.cachedContentTokenCount,t.cached_content_token_count);if(n===void 0)return;let r=j(t.promptTokenCount,t.prompt_token_count,e.input_tokens,e.inputTokens,e.prompt_tokens,e.promptTokens);return{cacheRead:n,cacheWrite:0,totalInput:Math.max(r??n,n)}}function I(e){let t=k(k(e)?.usage);if(t)return M(t)??N(t)??P(t)??F(t)}const L=`DOOMPI_PROMPT_CACHE_PARENT_NAMESPACE`,R=`@agimon-ai/doompi-cache`;function z(e){return typeof e==`string`&&e.trim()?e.trim():void 0}function B(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:void 0}function V(e){let t=e.state;return{source:e.descriptor.source,id:e.descriptor.id,activation:t.activation,...t.modelContextVariant?{modelContextVariant:t.modelContextVariant}:{}}}function H(e,t){let n=B(e.model),r=B(t);return{virtualProvider:z(n?.provider),virtualModel:z(n?.id),api:z(n?.api),baseUrl:z(n?.baseUrl),wireModel:z(r?.model)}}function U(e){let t=B(e);return t?.stopReason===`error`||t?.stopReason===`aborted`}function W(e){return O(e)??(process.env.PI_CACHE_RETENTION===`long`?`long`:void 0)}function G(t,n,i,a){let o=new c(L),s=new c(`DOOMPI_PROMPT_CACHE_ROOT_SESSION`),u=z(process.env[L]),d=z(process.env.DOOMPI_PROMPT_CACHE_CHILD_PROJECTION),f=!!(u&&d),p,m=u,h=[],g=()=>{if(f)return m;if(!p)return;let t=(0,e.getHarnessState)();return m=v({rootSessionId:p,compositionFingerprint:t.compositionFingerprint,majorMode:t.majorMode,domains:t.domains,profile:t.profile,persona:t.personaFile,minorModes:h},l),o.set(m),s.set(_(p,l)),m};return t.inject([r.DOOM_MINOR_MODE_CATALOG_SERVICE],e=>{if(f)return;let t=(0,r.readMinorModeCatalog)(e);if(!t)return;let n=()=>{h=t.getSnapshot().modes.map(V),g()};return n(),t.subscribe(n)}),n.on(`session_start`,(e,t)=>{f||(p=z(t.sessionManager.getSessionId()),g())}),n.on(`before_provider_request`,(e,t)=>{let n=f?u:g();if(!n)return;let r=H(t,e.payload),o=y(r,l),s=b(n,f?`child`:`parent`,o,l,d),c=D(e.payload,r.api,s,x(a));return i.telemetry.beginRequest({capability:E(r),namespace:n,modelFingerprint:o,requestedRetention:W(c??e.payload),...c?{keySuffix:s.slice(-8)}:{}}),c}),n.on(`message_end`,e=>{if(U(e.message))return;let t=I(e.message);t&&i.telemetry.observe(t,i.now())}),()=>{o.restore(),s.restore(),i.telemetry.reset()}}function K(e,t){e.inject([n.DOOM_HELP_SERVICE],e=>{let t=(0,n.requireDoomHelpService)(e).register({source:R,moduleUrl:require("url").pathToFileURL(__filename).href,skills:[{name:`doompi-use-cache`,description:`Inspect DoomPi provider prompt cache policy, routing identity, and provider-observed usage.`}]});return()=>t.dispose()}),e.effect(function*(){new u(e,t.dependencies.telemetry),yield G(e,t.pi,t.dependencies,t.optimizer)},R)}async function q(e,n=s()){let r=await Promise.resolve().then(()=>require("../pi-cache-optimizer-DXfBHbvW.cjs"));if(typeof r.default!=`function`)throw Error(`Pi Cache Optimizer does not export an extension factory.`);await r.default(e);let i=await(0,t.connectDoomCordisHost)(e,R),a=i.root.plugin(K,{pi:e,dependencies:n,optimizer:r});try{await a}catch(e){try{await a.dispose()}finally{await i.dispose()}throw e}let o;e.on(`session_shutdown`,()=>o??=(async()=>{try{await a.dispose()}finally{await i.dispose()}})())}exports.activateCacheExtension=q,exports.default=q;
|
|
3
2
|
//# sourceMappingURL=pi.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pi.cjs","names":["#limit","#request","#observations","#environment","#name","#baseline","#ownedValue","createHash","Service","recordValue","getHarnessState","DOOM_MINOR_MODE_CATALOG_SERVICE","readMinorModeCatalog","DOOM_HELP_SERVICE","requireDoomHelpService","connectDoomCordisHost"],"sources":["../../src/services/status.ts","../../src/commands/doomCacheCommand.ts","../../src/services/telemetry.ts","../../src/container/index.ts","../../src/adapters/node/environment.ts","../../src/adapters/node/digest.ts","../../src/providers/promptCacheTelemetry.ts","../../src/services/canonical.ts","../../src/services/namespace.ts","../../src/services/optimizerPolicy.ts","../../src/services/providerPolicy.ts","../../src/services/promptCacheUsage.ts","../../src/types/environment.ts","../../src/adapters/pi/extension.ts"],"sourcesContent":["import type { PromptCacheTelemetrySnapshot } from '../types/cache.ts';\n\nfunction observationLine(snapshot: PromptCacheTelemetrySnapshot): string {\n const observation = snapshot.lastObservation;\n if (!observation) return 'Last provider observation: none';\n return `Last provider observation: cacheRead=${observation.cacheRead}, cacheWrite=${observation.cacheWrite}, input=${observation.totalInput}`;\n}\n\nexport function formatPromptCacheStatus(snapshot: PromptCacheTelemetrySnapshot): string {\n return [\n 'DoomPi provider prompt cache',\n `Capability: ${snapshot.capability}`,\n `Requested retention: ${snapshot.requestedRetention ?? 'provider default'}`,\n `Namespace key: ${snapshot.keySuffix ? `…${snapshot.keySuffix}` : 'unavailable'}`,\n observationLine(snapshot),\n 'Current provider residency: unknown',\n 'UI CH and optimizer counters are aggregate reuse metrics, not residency guarantees.',\n ].join('\\n');\n}\n","import type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\nimport { formatPromptCacheStatus } from '../services/status.ts';\nimport type { PromptCacheTelemetryPort } from '../types/cache.ts';\n\nexport const COMMAND_NAME = 'doom-cache';\nexport const COMMAND_DESCRIPTION = 'Show provider prompt cache status';\n\nexport function registerCacheCommand(\n pi: Pick<ExtensionAPI, 'registerCommand'>,\n telemetry: PromptCacheTelemetryPort,\n): void {\n pi.registerCommand(COMMAND_NAME, {\n description: COMMAND_DESCRIPTION,\n handler: async (_args, ctx) => {\n if (ctx.hasUI) ctx.ui.notify(formatPromptCacheStatus(telemetry.snapshot()), 'info');\n },\n });\n}\n","import type {\n PromptCacheObservation,\n PromptCacheRequestStatus,\n PromptCacheTelemetryPort,\n PromptCacheTelemetrySnapshot,\n PromptCacheUsage,\n} from '../types/cache.ts';\n\nconst DEFAULT_OBSERVATION_LIMIT = 64;\n\nexport class PromptCacheTelemetry implements PromptCacheTelemetryPort {\n readonly #limit: number;\n #request: PromptCacheRequestStatus = { capability: 'unknown' };\n #observations: PromptCacheObservation[] = [];\n\n constructor(limit: number = DEFAULT_OBSERVATION_LIMIT) {\n if (!Number.isInteger(limit) || limit < 1)\n throw new Error('Prompt cache telemetry limit must be a positive integer.');\n this.#limit = limit;\n }\n\n beginRequest(status: PromptCacheRequestStatus): void {\n this.#request = { ...status };\n }\n\n observe(usage: PromptCacheUsage, observedAt: number): void {\n const namespace = this.#request.namespace;\n const modelFingerprint = this.#request.modelFingerprint;\n if (!namespace || !modelFingerprint) return;\n\n this.#observations.push({\n namespace,\n modelFingerprint,\n cacheRead: usage.cacheRead,\n cacheWrite: usage.cacheWrite,\n totalInput: usage.totalInput,\n observedAt,\n });\n if (this.#observations.length > this.#limit) {\n this.#observations.splice(0, this.#observations.length - this.#limit);\n }\n }\n\n snapshot(): PromptCacheTelemetrySnapshot {\n const observations = [...this.#observations];\n return {\n ...this.#request,\n residency: 'unknown',\n observations,\n ...(observations.length > 0 ? { lastObservation: observations.at(-1) } : {}),\n };\n }\n\n reset(): void {\n this.#request = { capability: 'unknown' };\n this.#observations = [];\n }\n}\n","import { PromptCacheTelemetry } from '../services/telemetry.ts';\nimport type { CacheExtensionDependencies } from '../types/extension.ts';\n\nexport function createCacheContainer(overrides: Partial<CacheExtensionDependencies> = {}): CacheExtensionDependencies {\n return {\n telemetry: overrides.telemetry ?? new PromptCacheTelemetry(),\n now: overrides.now ?? Date.now,\n };\n}\n","interface EnvironmentSnapshot {\n readonly present: boolean;\n readonly value?: string;\n}\n\nexport class OwnedEnvironmentValue {\n readonly #environment: NodeJS.ProcessEnv;\n readonly #name: string;\n readonly #baseline: EnvironmentSnapshot;\n #ownedValue?: string;\n\n constructor(name: string, environment: NodeJS.ProcessEnv = process.env) {\n this.#name = name;\n this.#environment = environment;\n this.#baseline = {\n present: Object.hasOwn(environment, name),\n value: environment[name],\n };\n }\n\n set(value: string): void {\n this.#environment[this.#name] = value;\n this.#ownedValue = value;\n }\n\n restore(): void {\n if (this.#ownedValue === undefined || this.#environment[this.#name] !== this.#ownedValue) return;\n if (this.#baseline.present) this.#environment[this.#name] = this.#baseline.value;\n else delete this.#environment[this.#name];\n this.#ownedValue = undefined;\n }\n}\n","import { createHash } from 'node:crypto';\n\nexport function sha256Base64Url(value: string): string {\n return createHash('sha256').update(value).digest('base64url');\n}\n","import { type Context, Service } from '@deepseek-ai/cordis';\nimport type { PromptCacheTelemetryPort, PromptCacheTelemetrySnapshot } from '../types/cache.ts';\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","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","import type {\n PromptCacheChildProjection,\n PromptCacheDigest,\n PromptCacheMinorModeState,\n PromptCacheModelIdentity,\n PromptCacheParentState,\n} from '../types/cache.ts';\nimport { canonicalJson } from './canonical.ts';\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","export interface PromptCacheOptimizerRuntime {\n readonly __internals_for_tests?: {\n readonly isRuntimeOptimizerEnabled?: () => boolean;\n readonly shouldInjectOpenAIPromptCacheKey?: () => boolean;\n };\n}\n\n/** Fail closed unless the pinned optimizer confirms both runtime and key routing are enabled. */\nexport function optimizerAllowsPromptCacheKey(optimizer: PromptCacheOptimizerRuntime): boolean {\n const internals = optimizer.__internals_for_tests;\n return (\n typeof internals?.isRuntimeOptimizerEnabled === 'function' &&\n typeof internals.shouldInjectOpenAIPromptCacheKey === 'function' &&\n internals.isRuntimeOptimizerEnabled() &&\n internals.shouldInjectOpenAIPromptCacheKey()\n );\n}\n","import type { PromptCacheCapabilityClass, PromptCacheModelIdentity } from '../types/cache.ts';\n\nconst ROUTING_KEY_APIS = new Set([\n 'openai-completions',\n 'openai-responses',\n 'openai-codex-responses',\n 'azure-openai-responses',\n]);\n\nconst MARKER_APIS = new Set(['anthropic-messages', 'bedrock-converse-stream']);\nconst AUTOMATIC_APIS = new Set(['google-generative-ai', 'google-vertex', 'google-vertex-anthropic']);\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function classifyPromptCacheCapability(model: PromptCacheModelIdentity): PromptCacheCapabilityClass {\n if (model.api === 'openai-responses' || model.api === 'openai-completions') {\n return model.virtualProvider === 'openai' ? 'key-and-long-retention' : 'key-only';\n }\n if (model.api && ROUTING_KEY_APIS.has(model.api)) return 'key-only';\n if (model.api && MARKER_APIS.has(model.api)) return 'marker-only';\n if (model.api && AUTOMATIC_APIS.has(model.api)) return 'automatic';\n return 'unknown';\n}\n\nexport function rewritePromptCacheKey(\n payload: unknown,\n api: string | undefined,\n key: string,\n enabled: boolean,\n): Record<string, unknown> | undefined {\n if (!enabled || !api || !ROUTING_KEY_APIS.has(api) || !isRecord(payload)) return undefined;\n const current = payload.prompt_cache_key;\n if (typeof current !== 'string' || !current.trim() || current === key) return undefined;\n return { ...payload, prompt_cache_key: key };\n}\n\nexport function requestedPromptCacheRetention(payload: unknown): string | undefined {\n if (!isRecord(payload)) return undefined;\n const retention = payload.prompt_cache_retention;\n return typeof retention === 'string' && retention.trim() ? retention.trim() : undefined;\n}\n","import type { PromptCacheUsage } from '../types/cache.ts';\n\nfunction recordValue(value: unknown): Readonly<Record<string, unknown>> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Readonly<Record<string, unknown>>)\n : undefined;\n}\n\nfunction nonNegativeNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : undefined;\n}\n\nfunction firstNumber(...values: readonly unknown[]): number | undefined {\n for (const value of values) {\n const number = nonNegativeNumber(value);\n if (number !== undefined) return number;\n }\n return undefined;\n}\n\nfunction normalizedUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const cacheRead = nonNegativeNumber(usage.cacheRead);\n const cacheWrite = nonNegativeNumber(usage.cacheWrite);\n if (cacheRead === undefined && cacheWrite === undefined) return undefined;\n const input = nonNegativeNumber(usage.input) ?? 0;\n return {\n cacheRead: cacheRead ?? 0,\n cacheWrite: cacheWrite ?? 0,\n totalInput: input + (cacheRead ?? 0) + (cacheWrite ?? 0),\n };\n}\n\nfunction openAiUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const promptDetails = recordValue(usage.prompt_tokens_details) ?? recordValue(usage.promptTokensDetails);\n const inputDetails = recordValue(usage.input_tokens_details) ?? recordValue(usage.inputTokensDetails);\n const cacheRead = firstNumber(\n promptDetails?.cached_tokens,\n promptDetails?.cachedTokens,\n inputDetails?.cached_tokens,\n inputDetails?.cachedTokens,\n );\n const cacheWrite = firstNumber(\n promptDetails?.cache_write_tokens,\n promptDetails?.cacheWriteTokens,\n inputDetails?.cache_write_tokens,\n inputDetails?.cacheWriteTokens,\n );\n if (cacheRead === undefined && cacheWrite === undefined) return undefined;\n const floor = (cacheRead ?? 0) + (cacheWrite ?? 0);\n const reportedTotal = firstNumber(usage.prompt_tokens, usage.promptTokens, usage.input_tokens, usage.inputTokens);\n return {\n cacheRead: cacheRead ?? 0,\n cacheWrite: cacheWrite ?? 0,\n totalInput: Math.max(reportedTotal ?? floor, floor),\n };\n}\n\nfunction anthropicUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const cacheRead = firstNumber(usage.cache_read_input_tokens, usage.cacheReadInputTokens);\n const cacheWrite = firstNumber(usage.cache_creation_input_tokens, usage.cacheCreationInputTokens);\n if (cacheRead === undefined && cacheWrite === undefined) return undefined;\n const input = firstNumber(usage.input_tokens, usage.inputTokens) ?? 0;\n return {\n cacheRead: cacheRead ?? 0,\n cacheWrite: cacheWrite ?? 0,\n totalInput: input + (cacheRead ?? 0) + (cacheWrite ?? 0),\n };\n}\n\nfunction geminiUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const metadata = recordValue(usage.usage_metadata) ?? recordValue(usage.usageMetadata) ?? usage;\n const cacheRead = firstNumber(metadata.cachedContentTokenCount, metadata.cached_content_token_count);\n if (cacheRead === undefined) return undefined;\n const totalInput = firstNumber(\n metadata.promptTokenCount,\n metadata.prompt_token_count,\n usage.input_tokens,\n usage.inputTokens,\n usage.prompt_tokens,\n usage.promptTokens,\n );\n return { cacheRead, cacheWrite: 0, totalInput: Math.max(totalInput ?? cacheRead, cacheRead) };\n}\n\n/** Normalize only usage values carried by a provider-produced assistant message. */\nexport function normalizePromptCacheUsage(message: unknown): PromptCacheUsage | undefined {\n const messageRecord = recordValue(message);\n const usage = recordValue(messageRecord?.usage);\n if (!usage) return undefined;\n return normalizedUsage(usage) ?? openAiUsage(usage) ?? anthropicUsage(usage) ?? geminiUsage(usage);\n}\n","export const DOOMPI_PROMPT_CACHE_PARENT_NAMESPACE_ENV = 'DOOMPI_PROMPT_CACHE_PARENT_NAMESPACE';\nexport const DOOMPI_PROMPT_CACHE_ROOT_SESSION_ENV = 'DOOMPI_PROMPT_CACHE_ROOT_SESSION';\nexport const DOOMPI_PROMPT_CACHE_CHILD_PROJECTION_ENV = 'DOOMPI_PROMPT_CACHE_CHILD_PROJECTION';\nexport const PI_CACHE_RETENTION_ENV = 'PI_CACHE_RETENTION';\nexport const PI_CACHE_RETENTION_LONG = 'long';\n","import { getHarnessState } from '@agimon-ai/doompi-config/harnessStore';\nimport { connectDoomCordisHost } from '@agimon-ai/doompi-extension-contracts/cordis-host';\nimport { DOOM_HELP_SERVICE, requireDoomHelpService } from '@agimon-ai/doompi-extension-contracts/help';\nimport {\n DOOM_MINOR_MODE_CATALOG_SERVICE,\n readMinorModeCatalog,\n type MinorModeRecord,\n} from '@agimon-ai/doompi-extension-contracts/mode';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext } from '@earendil-works/pi-coding-agent';\nimport { registerCacheCommand } from '../../commands/doomCacheCommand.ts';\nimport { createCacheContainer } from '../../container/index.ts';\nimport { OwnedEnvironmentValue } from '../node/environment.ts';\nimport { sha256Base64Url } from '../node/digest.ts';\nimport { PromptCacheTelemetryService } from '../../providers/promptCacheTelemetry.ts';\nimport {\n createParentPromptCacheNamespace,\n createPromptCacheKey,\n createPromptCacheModelFingerprint,\n createRootSessionIdentity,\n} from '../../services/namespace.ts';\nimport { optimizerAllowsPromptCacheKey } from '../../services/optimizerPolicy.ts';\nimport {\n classifyPromptCacheCapability,\n requestedPromptCacheRetention,\n rewritePromptCacheKey,\n} from '../../services/providerPolicy.ts';\nimport { normalizePromptCacheUsage } from '../../services/promptCacheUsage.ts';\nimport type { PromptCacheMinorModeState, PromptCacheModelIdentity } from '../../types/cache.ts';\nimport {\n DOOMPI_PROMPT_CACHE_CHILD_PROJECTION_ENV,\n DOOMPI_PROMPT_CACHE_PARENT_NAMESPACE_ENV,\n DOOMPI_PROMPT_CACHE_ROOT_SESSION_ENV,\n PI_CACHE_RETENTION_ENV,\n PI_CACHE_RETENTION_LONG,\n} from '../../types/environment.ts';\nimport type { CacheExtensionDependencies } from '../../types/extension.ts';\n\nconst PACKAGE_SOURCE = '@agimon-ai/doompi-cache';\nconst KEY_SUFFIX_LENGTH = 8;\n\ntype BeforeProviderEvent = { readonly payload?: unknown };\ntype MessageEndEvent = { readonly message?: unknown };\ntype MinorModeStateWithVariant = MinorModeRecord['state'] & { readonly modelContextVariant?: string };\ntype OptimizerModule = typeof import('#doompi-cache-optimizer-source');\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nfunction recordValue(value: unknown): Readonly<Record<string, unknown>> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Readonly<Record<string, unknown>>)\n : undefined;\n}\n\nfunction minorModeState(record: MinorModeRecord): PromptCacheMinorModeState {\n const state = record.state as MinorModeStateWithVariant;\n return {\n source: record.descriptor.source,\n id: record.descriptor.id,\n activation: state.activation,\n ...(state.modelContextVariant ? { modelContextVariant: state.modelContextVariant } : {}),\n };\n}\n\nfunction modelIdentity(ctx: ExtensionContext, payload: unknown): PromptCacheModelIdentity {\n const model = recordValue(ctx.model);\n const request = recordValue(payload);\n return {\n virtualProvider: stringValue(model?.provider),\n virtualModel: stringValue(model?.id),\n api: stringValue(model?.api),\n baseUrl: stringValue(model?.baseUrl),\n wireModel: stringValue(request?.model),\n };\n}\n\nfunction isErrorMessage(message: unknown): boolean {\n const record = recordValue(message);\n return record?.stopReason === 'error' || record?.stopReason === 'aborted';\n}\n\nfunction requestedRetention(payload: unknown): string | undefined {\n return (\n requestedPromptCacheRetention(payload) ??\n (process.env[PI_CACHE_RETENTION_ENV] === PI_CACHE_RETENTION_LONG ? PI_CACHE_RETENTION_LONG : undefined)\n );\n}\n\nfunction installCacheRuntime(\n cordis: Context,\n pi: ExtensionAPI,\n dependencies: CacheExtensionDependencies,\n optimizer: OptimizerModule,\n): () => void {\n const parentNamespaceEnvironment = new OwnedEnvironmentValue(DOOMPI_PROMPT_CACHE_PARENT_NAMESPACE_ENV);\n const rootSessionEnvironment = new OwnedEnvironmentValue(DOOMPI_PROMPT_CACHE_ROOT_SESSION_ENV);\n const projectedParentNamespace = stringValue(process.env[DOOMPI_PROMPT_CACHE_PARENT_NAMESPACE_ENV]);\n const childProjection = stringValue(process.env[DOOMPI_PROMPT_CACHE_CHILD_PROJECTION_ENV]);\n const isProjectedChild = Boolean(projectedParentNamespace && childProjection);\n let rootSessionId: string | undefined;\n let parentNamespace = projectedParentNamespace;\n let minorModes: readonly PromptCacheMinorModeState[] = [];\n\n const refreshParentNamespace = (): string | undefined => {\n if (isProjectedChild) return parentNamespace;\n if (!rootSessionId) return undefined;\n const harness = getHarnessState();\n parentNamespace = createParentPromptCacheNamespace(\n {\n rootSessionId,\n compositionFingerprint: harness.compositionFingerprint,\n majorMode: harness.majorMode,\n domains: harness.domains,\n profile: harness.profile,\n persona: harness.personaFile,\n minorModes,\n },\n sha256Base64Url,\n );\n parentNamespaceEnvironment.set(parentNamespace);\n rootSessionEnvironment.set(createRootSessionIdentity(rootSessionId, sha256Base64Url));\n return parentNamespace;\n };\n\n cordis.inject([DOOM_MINOR_MODE_CATALOG_SERVICE], (context) => {\n if (isProjectedChild) return undefined;\n const catalog = readMinorModeCatalog(context);\n if (!catalog) return undefined;\n const refreshModes = (): void => {\n minorModes = catalog.getSnapshot().modes.map(minorModeState);\n refreshParentNamespace();\n };\n refreshModes();\n return catalog.subscribe(refreshModes);\n });\n\n registerCacheCommand(pi, dependencies.telemetry);\n\n pi.on('session_start', (_event, ctx) => {\n if (!isProjectedChild) {\n rootSessionId = stringValue(ctx.sessionManager.getSessionId());\n refreshParentNamespace();\n }\n });\n\n pi.on('before_provider_request', (event: BeforeProviderEvent, ctx: ExtensionContext) => {\n const namespace = isProjectedChild ? projectedParentNamespace : refreshParentNamespace();\n if (!namespace) return undefined;\n\n const identity = modelIdentity(ctx, event.payload);\n const modelFingerprint = createPromptCacheModelFingerprint(identity, sha256Base64Url);\n const key = createPromptCacheKey(\n namespace,\n isProjectedChild ? 'child' : 'parent',\n modelFingerprint,\n sha256Base64Url,\n childProjection,\n );\n const rewritten = rewritePromptCacheKey(event.payload, identity.api, key, optimizerAllowsPromptCacheKey(optimizer));\n dependencies.telemetry.beginRequest({\n capability: classifyPromptCacheCapability(identity),\n namespace,\n modelFingerprint,\n requestedRetention: requestedRetention(rewritten ?? event.payload),\n ...(rewritten ? { keySuffix: key.slice(-KEY_SUFFIX_LENGTH) } : {}),\n });\n return rewritten;\n });\n\n pi.on('message_end', (event: MessageEndEvent) => {\n if (isErrorMessage(event.message)) return;\n const usage = normalizePromptCacheUsage(event.message);\n if (usage) dependencies.telemetry.observe(usage, dependencies.now());\n });\n\n return () => {\n parentNamespaceEnvironment.restore();\n rootSessionEnvironment.restore();\n dependencies.telemetry.reset();\n };\n}\n\ninterface CachePluginConfig {\n readonly pi: ExtensionAPI;\n readonly dependencies: CacheExtensionDependencies;\n readonly optimizer: OptimizerModule;\n}\n\nfunction cachePlugin(cordis: Context, config: CachePluginConfig): void {\n cordis.inject([DOOM_HELP_SERVICE], (helpContext) => {\n const contribution = requireDoomHelpService(helpContext).register({\n source: PACKAGE_SOURCE,\n moduleUrl: import.meta.url,\n skills: [\n {\n name: 'doompi-use-cache',\n description: 'Inspect DoomPi provider prompt cache policy, routing identity, and provider-observed usage.',\n },\n ],\n });\n return () => contribution.dispose();\n });\n cordis.effect(function* () {\n new PromptCacheTelemetryService(cordis, config.dependencies.telemetry);\n yield installCacheRuntime(cordis, config.pi, config.dependencies, config.optimizer);\n }, PACKAGE_SOURCE);\n}\n\nexport async function activateCacheExtension(\n pi: ExtensionAPI,\n dependencies: CacheExtensionDependencies = createCacheContainer(),\n): Promise<void> {\n const optimizer = await import('#doompi-cache-optimizer-source');\n if (typeof optimizer.default !== 'function')\n throw new Error('Pi Cache Optimizer does not export an extension factory.');\n await optimizer.default(pi);\n\n const connection = await connectDoomCordisHost(pi, PACKAGE_SOURCE);\n const fiber = connection.root.plugin(cachePlugin, { pi, dependencies, optimizer });\n try {\n await fiber;\n } catch (error) {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n throw error;\n }\n\n let disposal: Promise<void> | undefined;\n pi.on(\n 'session_shutdown',\n () =>\n (disposal ??= (async () => {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n })()),\n );\n}\n\nexport default activateCacheExtension;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pi.cjs","names":["#limit","#request","#observations","#environment","#name","#baseline","#ownedValue","createHash","Service","recordValue","getHarnessState","DOOM_MINOR_MODE_CATALOG_SERVICE","readMinorModeCatalog","DOOM_HELP_SERVICE","requireDoomHelpService","connectDoomCordisHost"],"sources":["../../src/services/telemetry.ts","../../src/container/index.ts","../../src/adapters/node/environment.ts","../../src/adapters/node/digest.ts","../../src/providers/promptCacheTelemetry.ts","../../src/services/canonical.ts","../../src/services/namespace.ts","../../src/services/optimizerPolicy.ts","../../src/services/providerPolicy.ts","../../src/services/promptCacheUsage.ts","../../src/types/environment.ts","../../src/adapters/pi/extension.ts"],"sourcesContent":["import type {\n PromptCacheObservation,\n PromptCacheRequestStatus,\n PromptCacheTelemetryPort,\n PromptCacheTelemetrySnapshot,\n PromptCacheUsage,\n} from '../types/cache.ts';\n\nconst DEFAULT_OBSERVATION_LIMIT = 64;\n\nexport class PromptCacheTelemetry implements PromptCacheTelemetryPort {\n readonly #limit: number;\n #request: PromptCacheRequestStatus = { capability: 'unknown' };\n #observations: PromptCacheObservation[] = [];\n\n constructor(limit: number = DEFAULT_OBSERVATION_LIMIT) {\n if (!Number.isInteger(limit) || limit < 1)\n throw new Error('Prompt cache telemetry limit must be a positive integer.');\n this.#limit = limit;\n }\n\n beginRequest(status: PromptCacheRequestStatus): void {\n this.#request = { ...status };\n }\n\n observe(usage: PromptCacheUsage, observedAt: number): void {\n const namespace = this.#request.namespace;\n const modelFingerprint = this.#request.modelFingerprint;\n if (!namespace || !modelFingerprint) return;\n\n this.#observations.push({\n namespace,\n modelFingerprint,\n cacheRead: usage.cacheRead,\n cacheWrite: usage.cacheWrite,\n totalInput: usage.totalInput,\n observedAt,\n });\n if (this.#observations.length > this.#limit) {\n this.#observations.splice(0, this.#observations.length - this.#limit);\n }\n }\n\n snapshot(): PromptCacheTelemetrySnapshot {\n const observations = [...this.#observations];\n return {\n ...this.#request,\n residency: 'unknown',\n observations,\n ...(observations.length > 0 ? { lastObservation: observations.at(-1) } : {}),\n };\n }\n\n reset(): void {\n this.#request = { capability: 'unknown' };\n this.#observations = [];\n }\n}\n","import { PromptCacheTelemetry } from '../services/telemetry.ts';\nimport type { CacheExtensionDependencies } from '../types/extension.ts';\n\nexport function createCacheContainer(overrides: Partial<CacheExtensionDependencies> = {}): CacheExtensionDependencies {\n return {\n telemetry: overrides.telemetry ?? new PromptCacheTelemetry(),\n now: overrides.now ?? Date.now,\n };\n}\n","interface EnvironmentSnapshot {\n readonly present: boolean;\n readonly value?: string;\n}\n\nexport class OwnedEnvironmentValue {\n readonly #environment: NodeJS.ProcessEnv;\n readonly #name: string;\n readonly #baseline: EnvironmentSnapshot;\n #ownedValue?: string;\n\n constructor(name: string, environment: NodeJS.ProcessEnv = process.env) {\n this.#name = name;\n this.#environment = environment;\n this.#baseline = {\n present: Object.hasOwn(environment, name),\n value: environment[name],\n };\n }\n\n set(value: string): void {\n this.#environment[this.#name] = value;\n this.#ownedValue = value;\n }\n\n restore(): void {\n if (this.#ownedValue === undefined || this.#environment[this.#name] !== this.#ownedValue) return;\n if (this.#baseline.present) this.#environment[this.#name] = this.#baseline.value;\n else delete this.#environment[this.#name];\n this.#ownedValue = undefined;\n }\n}\n","import { createHash } from 'node:crypto';\n\nexport function sha256Base64Url(value: string): string {\n return createHash('sha256').update(value).digest('base64url');\n}\n","import { type Context, Service } from '@deepseek-ai/cordis';\nimport type { PromptCacheTelemetryPort, PromptCacheTelemetrySnapshot } from '../types/cache.ts';\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","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","import type {\n PromptCacheChildProjection,\n PromptCacheDigest,\n PromptCacheMinorModeState,\n PromptCacheModelIdentity,\n PromptCacheParentState,\n} from '../types/cache.ts';\nimport { canonicalJson } from './canonical.ts';\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","export interface PromptCacheOptimizerRuntime {\n readonly __internals_for_tests?: {\n readonly isRuntimeOptimizerEnabled?: () => boolean;\n readonly shouldInjectOpenAIPromptCacheKey?: () => boolean;\n };\n}\n\n/** Fail closed unless the pinned optimizer confirms both runtime and key routing are enabled. */\nexport function optimizerAllowsPromptCacheKey(optimizer: PromptCacheOptimizerRuntime): boolean {\n const internals = optimizer.__internals_for_tests;\n return (\n typeof internals?.isRuntimeOptimizerEnabled === 'function' &&\n typeof internals.shouldInjectOpenAIPromptCacheKey === 'function' &&\n internals.isRuntimeOptimizerEnabled() &&\n internals.shouldInjectOpenAIPromptCacheKey()\n );\n}\n","import type { PromptCacheCapabilityClass, PromptCacheModelIdentity } from '../types/cache.ts';\n\nconst ROUTING_KEY_APIS = new Set([\n 'openai-completions',\n 'openai-responses',\n 'openai-codex-responses',\n 'azure-openai-responses',\n]);\n\nconst MARKER_APIS = new Set(['anthropic-messages', 'bedrock-converse-stream']);\nconst AUTOMATIC_APIS = new Set(['google-generative-ai', 'google-vertex', 'google-vertex-anthropic']);\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function classifyPromptCacheCapability(model: PromptCacheModelIdentity): PromptCacheCapabilityClass {\n if (model.api === 'openai-responses' || model.api === 'openai-completions') {\n return model.virtualProvider === 'openai' ? 'key-and-long-retention' : 'key-only';\n }\n if (model.api && ROUTING_KEY_APIS.has(model.api)) return 'key-only';\n if (model.api && MARKER_APIS.has(model.api)) return 'marker-only';\n if (model.api && AUTOMATIC_APIS.has(model.api)) return 'automatic';\n return 'unknown';\n}\n\nexport function rewritePromptCacheKey(\n payload: unknown,\n api: string | undefined,\n key: string,\n enabled: boolean,\n): Record<string, unknown> | undefined {\n if (!enabled || !api || !ROUTING_KEY_APIS.has(api) || !isRecord(payload)) return undefined;\n const current = payload.prompt_cache_key;\n if (typeof current !== 'string' || !current.trim() || current === key) return undefined;\n return { ...payload, prompt_cache_key: key };\n}\n\nexport function requestedPromptCacheRetention(payload: unknown): string | undefined {\n if (!isRecord(payload)) return undefined;\n const retention = payload.prompt_cache_retention;\n return typeof retention === 'string' && retention.trim() ? retention.trim() : undefined;\n}\n","import type { PromptCacheUsage } from '../types/cache.ts';\n\nfunction recordValue(value: unknown): Readonly<Record<string, unknown>> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Readonly<Record<string, unknown>>)\n : undefined;\n}\n\nfunction nonNegativeNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : undefined;\n}\n\nfunction firstNumber(...values: readonly unknown[]): number | undefined {\n for (const value of values) {\n const number = nonNegativeNumber(value);\n if (number !== undefined) return number;\n }\n return undefined;\n}\n\nfunction normalizedUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const cacheRead = nonNegativeNumber(usage.cacheRead);\n const cacheWrite = nonNegativeNumber(usage.cacheWrite);\n if (cacheRead === undefined && cacheWrite === undefined) return undefined;\n const input = nonNegativeNumber(usage.input) ?? 0;\n return {\n cacheRead: cacheRead ?? 0,\n cacheWrite: cacheWrite ?? 0,\n totalInput: input + (cacheRead ?? 0) + (cacheWrite ?? 0),\n };\n}\n\nfunction openAiUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const promptDetails = recordValue(usage.prompt_tokens_details) ?? recordValue(usage.promptTokensDetails);\n const inputDetails = recordValue(usage.input_tokens_details) ?? recordValue(usage.inputTokensDetails);\n const cacheRead = firstNumber(\n promptDetails?.cached_tokens,\n promptDetails?.cachedTokens,\n inputDetails?.cached_tokens,\n inputDetails?.cachedTokens,\n );\n const cacheWrite = firstNumber(\n promptDetails?.cache_write_tokens,\n promptDetails?.cacheWriteTokens,\n inputDetails?.cache_write_tokens,\n inputDetails?.cacheWriteTokens,\n );\n if (cacheRead === undefined && cacheWrite === undefined) return undefined;\n const floor = (cacheRead ?? 0) + (cacheWrite ?? 0);\n const reportedTotal = firstNumber(usage.prompt_tokens, usage.promptTokens, usage.input_tokens, usage.inputTokens);\n return {\n cacheRead: cacheRead ?? 0,\n cacheWrite: cacheWrite ?? 0,\n totalInput: Math.max(reportedTotal ?? floor, floor),\n };\n}\n\nfunction anthropicUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const cacheRead = firstNumber(usage.cache_read_input_tokens, usage.cacheReadInputTokens);\n const cacheWrite = firstNumber(usage.cache_creation_input_tokens, usage.cacheCreationInputTokens);\n if (cacheRead === undefined && cacheWrite === undefined) return undefined;\n const input = firstNumber(usage.input_tokens, usage.inputTokens) ?? 0;\n return {\n cacheRead: cacheRead ?? 0,\n cacheWrite: cacheWrite ?? 0,\n totalInput: input + (cacheRead ?? 0) + (cacheWrite ?? 0),\n };\n}\n\nfunction geminiUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const metadata = recordValue(usage.usage_metadata) ?? recordValue(usage.usageMetadata) ?? usage;\n const cacheRead = firstNumber(metadata.cachedContentTokenCount, metadata.cached_content_token_count);\n if (cacheRead === undefined) return undefined;\n const totalInput = firstNumber(\n metadata.promptTokenCount,\n metadata.prompt_token_count,\n usage.input_tokens,\n usage.inputTokens,\n usage.prompt_tokens,\n usage.promptTokens,\n );\n return { cacheRead, cacheWrite: 0, totalInput: Math.max(totalInput ?? cacheRead, cacheRead) };\n}\n\n/** Normalize only usage values carried by a provider-produced assistant message. */\nexport function normalizePromptCacheUsage(message: unknown): PromptCacheUsage | undefined {\n const messageRecord = recordValue(message);\n const usage = recordValue(messageRecord?.usage);\n if (!usage) return undefined;\n return normalizedUsage(usage) ?? openAiUsage(usage) ?? anthropicUsage(usage) ?? geminiUsage(usage);\n}\n","export const DOOMPI_PROMPT_CACHE_PARENT_NAMESPACE_ENV = 'DOOMPI_PROMPT_CACHE_PARENT_NAMESPACE';\nexport const DOOMPI_PROMPT_CACHE_ROOT_SESSION_ENV = 'DOOMPI_PROMPT_CACHE_ROOT_SESSION';\nexport const DOOMPI_PROMPT_CACHE_CHILD_PROJECTION_ENV = 'DOOMPI_PROMPT_CACHE_CHILD_PROJECTION';\nexport const PI_CACHE_RETENTION_ENV = 'PI_CACHE_RETENTION';\nexport const PI_CACHE_RETENTION_LONG = 'long';\n","import { getHarnessState } from '@agimon-ai/doompi-config/harnessStore';\nimport { connectDoomCordisHost } from '@agimon-ai/doompi-extension-contracts/cordis-host';\nimport { DOOM_HELP_SERVICE, requireDoomHelpService } from '@agimon-ai/doompi-extension-contracts/help';\nimport {\n DOOM_MINOR_MODE_CATALOG_SERVICE,\n readMinorModeCatalog,\n type MinorModeRecord,\n} from '@agimon-ai/doompi-extension-contracts/mode';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext } from '@earendil-works/pi-coding-agent';\nimport { createCacheContainer } from '../../container/index.ts';\nimport { OwnedEnvironmentValue } from '../node/environment.ts';\nimport { sha256Base64Url } from '../node/digest.ts';\nimport { PromptCacheTelemetryService } from '../../providers/promptCacheTelemetry.ts';\nimport {\n createParentPromptCacheNamespace,\n createPromptCacheKey,\n createPromptCacheModelFingerprint,\n createRootSessionIdentity,\n} from '../../services/namespace.ts';\nimport { optimizerAllowsPromptCacheKey } from '../../services/optimizerPolicy.ts';\nimport {\n classifyPromptCacheCapability,\n requestedPromptCacheRetention,\n rewritePromptCacheKey,\n} from '../../services/providerPolicy.ts';\nimport { normalizePromptCacheUsage } from '../../services/promptCacheUsage.ts';\nimport type { PromptCacheMinorModeState, PromptCacheModelIdentity } from '../../types/cache.ts';\nimport {\n DOOMPI_PROMPT_CACHE_CHILD_PROJECTION_ENV,\n DOOMPI_PROMPT_CACHE_PARENT_NAMESPACE_ENV,\n DOOMPI_PROMPT_CACHE_ROOT_SESSION_ENV,\n PI_CACHE_RETENTION_ENV,\n PI_CACHE_RETENTION_LONG,\n} from '../../types/environment.ts';\nimport type { CacheExtensionDependencies } from '../../types/extension.ts';\n\nconst PACKAGE_SOURCE = '@agimon-ai/doompi-cache';\nconst KEY_SUFFIX_LENGTH = 8;\n\ntype BeforeProviderEvent = { readonly payload?: unknown };\ntype MessageEndEvent = { readonly message?: unknown };\ntype MinorModeStateWithVariant = MinorModeRecord['state'] & { readonly modelContextVariant?: string };\ntype OptimizerModule = typeof import('#doompi-cache-optimizer-source');\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nfunction recordValue(value: unknown): Readonly<Record<string, unknown>> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Readonly<Record<string, unknown>>)\n : undefined;\n}\n\nfunction minorModeState(record: MinorModeRecord): PromptCacheMinorModeState {\n const state = record.state as MinorModeStateWithVariant;\n return {\n source: record.descriptor.source,\n id: record.descriptor.id,\n activation: state.activation,\n ...(state.modelContextVariant ? { modelContextVariant: state.modelContextVariant } : {}),\n };\n}\n\nfunction modelIdentity(ctx: ExtensionContext, payload: unknown): PromptCacheModelIdentity {\n const model = recordValue(ctx.model);\n const request = recordValue(payload);\n return {\n virtualProvider: stringValue(model?.provider),\n virtualModel: stringValue(model?.id),\n api: stringValue(model?.api),\n baseUrl: stringValue(model?.baseUrl),\n wireModel: stringValue(request?.model),\n };\n}\n\nfunction isErrorMessage(message: unknown): boolean {\n const record = recordValue(message);\n return record?.stopReason === 'error' || record?.stopReason === 'aborted';\n}\n\nfunction requestedRetention(payload: unknown): string | undefined {\n return (\n requestedPromptCacheRetention(payload) ??\n (process.env[PI_CACHE_RETENTION_ENV] === PI_CACHE_RETENTION_LONG ? PI_CACHE_RETENTION_LONG : undefined)\n );\n}\n\nfunction installCacheRuntime(\n cordis: Context,\n pi: ExtensionAPI,\n dependencies: CacheExtensionDependencies,\n optimizer: OptimizerModule,\n): () => void {\n const parentNamespaceEnvironment = new OwnedEnvironmentValue(DOOMPI_PROMPT_CACHE_PARENT_NAMESPACE_ENV);\n const rootSessionEnvironment = new OwnedEnvironmentValue(DOOMPI_PROMPT_CACHE_ROOT_SESSION_ENV);\n const projectedParentNamespace = stringValue(process.env[DOOMPI_PROMPT_CACHE_PARENT_NAMESPACE_ENV]);\n const childProjection = stringValue(process.env[DOOMPI_PROMPT_CACHE_CHILD_PROJECTION_ENV]);\n const isProjectedChild = Boolean(projectedParentNamespace && childProjection);\n let rootSessionId: string | undefined;\n let parentNamespace = projectedParentNamespace;\n let minorModes: readonly PromptCacheMinorModeState[] = [];\n\n const refreshParentNamespace = (): string | undefined => {\n if (isProjectedChild) return parentNamespace;\n if (!rootSessionId) return undefined;\n const harness = getHarnessState();\n parentNamespace = createParentPromptCacheNamespace(\n {\n rootSessionId,\n compositionFingerprint: harness.compositionFingerprint,\n majorMode: harness.majorMode,\n domains: harness.domains,\n profile: harness.profile,\n persona: harness.personaFile,\n minorModes,\n },\n sha256Base64Url,\n );\n parentNamespaceEnvironment.set(parentNamespace);\n rootSessionEnvironment.set(createRootSessionIdentity(rootSessionId, sha256Base64Url));\n return parentNamespace;\n };\n\n cordis.inject([DOOM_MINOR_MODE_CATALOG_SERVICE], (context) => {\n if (isProjectedChild) return undefined;\n const catalog = readMinorModeCatalog(context);\n if (!catalog) return undefined;\n const refreshModes = (): void => {\n minorModes = catalog.getSnapshot().modes.map(minorModeState);\n refreshParentNamespace();\n };\n refreshModes();\n return catalog.subscribe(refreshModes);\n });\n\n pi.on('session_start', (_event, ctx) => {\n if (!isProjectedChild) {\n rootSessionId = stringValue(ctx.sessionManager.getSessionId());\n refreshParentNamespace();\n }\n });\n\n pi.on('before_provider_request', (event: BeforeProviderEvent, ctx: ExtensionContext) => {\n const namespace = isProjectedChild ? projectedParentNamespace : refreshParentNamespace();\n if (!namespace) return undefined;\n\n const identity = modelIdentity(ctx, event.payload);\n const modelFingerprint = createPromptCacheModelFingerprint(identity, sha256Base64Url);\n const key = createPromptCacheKey(\n namespace,\n isProjectedChild ? 'child' : 'parent',\n modelFingerprint,\n sha256Base64Url,\n childProjection,\n );\n const rewritten = rewritePromptCacheKey(event.payload, identity.api, key, optimizerAllowsPromptCacheKey(optimizer));\n dependencies.telemetry.beginRequest({\n capability: classifyPromptCacheCapability(identity),\n namespace,\n modelFingerprint,\n requestedRetention: requestedRetention(rewritten ?? event.payload),\n ...(rewritten ? { keySuffix: key.slice(-KEY_SUFFIX_LENGTH) } : {}),\n });\n return rewritten;\n });\n\n pi.on('message_end', (event: MessageEndEvent) => {\n if (isErrorMessage(event.message)) return;\n const usage = normalizePromptCacheUsage(event.message);\n if (usage) dependencies.telemetry.observe(usage, dependencies.now());\n });\n\n return () => {\n parentNamespaceEnvironment.restore();\n rootSessionEnvironment.restore();\n dependencies.telemetry.reset();\n };\n}\n\ninterface CachePluginConfig {\n readonly pi: ExtensionAPI;\n readonly dependencies: CacheExtensionDependencies;\n readonly optimizer: OptimizerModule;\n}\n\nfunction cachePlugin(cordis: Context, config: CachePluginConfig): void {\n cordis.inject([DOOM_HELP_SERVICE], (helpContext) => {\n const contribution = requireDoomHelpService(helpContext).register({\n source: PACKAGE_SOURCE,\n moduleUrl: import.meta.url,\n skills: [\n {\n name: 'doompi-use-cache',\n description: 'Inspect DoomPi provider prompt cache policy, routing identity, and provider-observed usage.',\n },\n ],\n });\n return () => contribution.dispose();\n });\n cordis.effect(function* () {\n new PromptCacheTelemetryService(cordis, config.dependencies.telemetry);\n yield installCacheRuntime(cordis, config.pi, config.dependencies, config.optimizer);\n }, PACKAGE_SOURCE);\n}\n\nexport async function activateCacheExtension(\n pi: ExtensionAPI,\n dependencies: CacheExtensionDependencies = createCacheContainer(),\n): Promise<void> {\n const optimizer = await import('#doompi-cache-optimizer-source');\n if (typeof optimizer.default !== 'function')\n throw new Error('Pi Cache Optimizer does not export an extension factory.');\n await optimizer.default(pi);\n\n const connection = await connectDoomCordisHost(pi, PACKAGE_SOURCE);\n const fiber = connection.root.plugin(cachePlugin, { pi, dependencies, optimizer });\n try {\n await fiber;\n } catch (error) {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n throw error;\n }\n\n let disposal: Promise<void> | undefined;\n pi.on(\n 'session_shutdown',\n () =>\n (disposal ??= (async () => {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n })()),\n );\n}\n\nexport default activateCacheExtension;\n"],"mappings":"+XAUA,IAAa,EAAb,KAAsE,CACpE,GACA,GAAqC,CAAE,WAAY,SAAU,EAC7D,GAA0C,CAAC,EAE3C,YAAY,EAAgB,GAA2B,CACrD,GAAI,CAAC,OAAO,UAAU,CAAK,GAAK,EAAQ,EACtC,MAAU,MAAM,0DAA0D,EAC5E,KAAKA,GAAS,CAChB,CAEA,aAAa,EAAwC,CACnD,KAAKC,GAAW,CAAE,GAAG,CAAO,CAC9B,CAEA,QAAQ,EAAyB,EAA0B,CACzD,IAAM,EAAY,KAAKA,GAAS,UAC1B,EAAmB,KAAKA,GAAS,iBACnC,CAAC,GAAa,CAAC,IAEnB,KAAKC,GAAc,KAAK,CACtB,YACA,mBACA,UAAW,EAAM,UACjB,WAAY,EAAM,WAClB,WAAY,EAAM,WAClB,YACF,CAAC,EACG,KAAKA,GAAc,OAAS,KAAKF,IACnC,KAAKE,GAAc,OAAO,EAAG,KAAKA,GAAc,OAAS,KAAKF,EAAM,EAExE,CAEA,UAAyC,CACvC,IAAM,EAAe,CAAC,GAAG,KAAKE,EAAa,EAC3C,MAAO,CACL,GAAG,KAAKD,GACR,UAAW,UACX,eACA,GAAI,EAAa,OAAS,EAAI,CAAE,gBAAiB,EAAa,GAAG,EAAE,CAAE,EAAI,CAAC,CAC5E,CACF,CAEA,OAAc,CACZ,KAAKA,GAAW,CAAE,WAAY,SAAU,EACxC,KAAKC,GAAgB,CAAC,CACxB,CACF,ECtDA,SAAgB,EAAqB,EAAiD,CAAC,EAA+B,CACpH,MAAO,CACL,UAAW,EAAU,WAAa,IAAI,EACtC,IAAK,EAAU,KAAO,KAAK,GAC7B,CACF,CCHA,IAAa,EAAb,KAAmC,CACjC,GACA,GACA,GACA,GAEA,YAAY,EAAc,EAAiC,QAAQ,IAAK,CACtE,KAAKE,GAAQ,EACb,KAAKD,GAAe,EACpB,KAAKE,GAAY,CACf,QAAS,OAAO,OAAO,EAAa,CAAI,EACxC,MAAO,EAAY,EACrB,CACF,CAEA,IAAI,EAAqB,CACvB,KAAKF,GAAa,KAAKC,IAAS,EAChC,KAAKE,GAAc,CACrB,CAEA,SAAgB,CACV,KAAKA,KAAgB,IAAA,IAAa,KAAKH,GAAa,KAAKC,MAAW,KAAKE,KACzE,KAAKD,GAAU,QAAS,KAAKF,GAAa,KAAKC,IAAS,KAAKC,GAAU,MACtE,OAAO,KAAKF,GAAa,KAAKC,IACnC,KAAKE,GAAc,IAAA,GACrB,CACF,EC7BA,SAAgB,EAAgB,EAAuB,CACrD,OAAA,EAAOC,EAAAA,WAAAA,CAAW,QAAQ,CAAC,CAAC,OAAO,CAAK,CAAC,CAAC,OAAO,WAAW,CAC9D,CCCA,IAAa,EAAb,cAAiDC,EAAAA,OAAQ,CAGpC,UAFnB,YACE,EACA,EACA,CACA,MAAM,EAAS,6BAAmC,EAFjC,KAAA,UAAA,CAGnB,CAEA,UAAyC,CACvC,OAAO,KAAK,UAAU,SAAS,CACjC,CACF,ECVA,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,CCfA,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,CAuBA,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,CCtGA,SAAgB,EAA8B,EAAiD,CAC7F,IAAM,EAAY,EAAU,sBAC5B,OACE,OAAO,GAAW,2BAA8B,YAChD,OAAO,EAAU,kCAAqC,YACtD,EAAU,0BAA0B,GACpC,EAAU,iCAAiC,CAE/C,CCdA,MAAM,EAAmB,IAAI,IAAI,CAC/B,qBACA,mBACA,yBACA,wBACF,CAAC,EAEK,EAAc,IAAI,IAAI,CAAC,qBAAsB,yBAAyB,CAAC,EACvE,EAAiB,IAAI,IAAI,CAAC,uBAAwB,gBAAiB,yBAAyB,CAAC,EAEnG,SAAS,EAAS,EAA4D,CAC5E,OAAO,OAAO,GAAU,YAAY,GAAkB,CAAC,MAAM,QAAQ,CAAK,CAC5E,CAEA,SAAgB,EAA8B,EAA6D,CAOzG,OANI,EAAM,MAAQ,oBAAsB,EAAM,MAAQ,qBAC7C,EAAM,kBAAoB,SAAW,yBAA2B,WAErE,EAAM,KAAO,EAAiB,IAAI,EAAM,GAAG,EAAU,WACrD,EAAM,KAAO,EAAY,IAAI,EAAM,GAAG,EAAU,cAChD,EAAM,KAAO,EAAe,IAAI,EAAM,GAAG,EAAU,YAChD,SACT,CAEA,SAAgB,EACd,EACA,EACA,EACA,EACqC,CACrC,GAAI,CAAC,GAAW,CAAC,GAAO,CAAC,EAAiB,IAAI,CAAG,GAAK,CAAC,EAAS,CAAO,EAAG,OAC1E,IAAM,EAAU,EAAQ,iBACpB,YAAO,GAAY,UAAY,CAAC,EAAQ,KAAK,GAAK,IAAY,GAClE,MAAO,CAAE,GAAG,EAAS,iBAAkB,CAAI,CAC7C,CAEA,SAAgB,EAA8B,EAAsC,CAClF,GAAI,CAAC,EAAS,CAAO,EAAG,OACxB,IAAM,EAAY,EAAQ,uBAC1B,OAAO,OAAO,GAAc,UAAY,EAAU,KAAK,EAAI,EAAU,KAAK,EAAI,IAAA,EAChF,CCxCA,SAASC,EAAY,EAA+D,CAClF,OAAO,OAAO,GAAU,UAAY,GAAkB,CAAC,MAAM,QAAQ,CAAK,EACrE,EACD,IAAA,EACN,CAEA,SAAS,EAAkB,EAAoC,CAC7D,OAAO,OAAO,GAAU,UAAY,OAAO,SAAS,CAAK,GAAK,GAAS,EAAI,EAAQ,IAAA,EACrF,CAEA,SAAS,EAAY,GAAG,EAAgD,CACtE,IAAK,IAAM,KAAS,EAAQ,CAC1B,IAAM,EAAS,EAAkB,CAAK,EACtC,GAAI,IAAW,IAAA,GAAW,OAAO,CACnC,CAEF,CAEA,SAAS,EAAgB,EAAwE,CAC/F,IAAM,EAAY,EAAkB,EAAM,SAAS,EAC7C,EAAa,EAAkB,EAAM,UAAU,EACrD,GAAI,IAAc,IAAA,IAAa,IAAe,IAAA,GAAW,OACzD,IAAM,EAAQ,EAAkB,EAAM,KAAK,GAAK,EAChD,MAAO,CACL,UAAW,GAAa,EACxB,WAAY,GAAc,EAC1B,WAAY,GAAS,GAAa,IAAM,GAAc,EACxD,CACF,CAEA,SAAS,EAAY,EAAwE,CAC3F,IAAM,EAAgBA,EAAY,EAAM,qBAAqB,GAAKA,EAAY,EAAM,mBAAmB,EACjG,EAAeA,EAAY,EAAM,oBAAoB,GAAKA,EAAY,EAAM,kBAAkB,EAC9F,EAAY,EAChB,GAAe,cACf,GAAe,aACf,GAAc,cACd,GAAc,YAChB,EACM,EAAa,EACjB,GAAe,mBACf,GAAe,iBACf,GAAc,mBACd,GAAc,gBAChB,EACA,GAAI,IAAc,IAAA,IAAa,IAAe,IAAA,GAAW,OACzD,IAAM,GAAS,GAAa,IAAM,GAAc,GAC1C,EAAgB,EAAY,EAAM,cAAe,EAAM,aAAc,EAAM,aAAc,EAAM,WAAW,EAChH,MAAO,CACL,UAAW,GAAa,EACxB,WAAY,GAAc,EAC1B,WAAY,KAAK,IAAI,GAAiB,EAAO,CAAK,CACpD,CACF,CAEA,SAAS,EAAe,EAAwE,CAC9F,IAAM,EAAY,EAAY,EAAM,wBAAyB,EAAM,oBAAoB,EACjF,EAAa,EAAY,EAAM,4BAA6B,EAAM,wBAAwB,EAChG,GAAI,IAAc,IAAA,IAAa,IAAe,IAAA,GAAW,OACzD,IAAM,EAAQ,EAAY,EAAM,aAAc,EAAM,WAAW,GAAK,EACpE,MAAO,CACL,UAAW,GAAa,EACxB,WAAY,GAAc,EAC1B,WAAY,GAAS,GAAa,IAAM,GAAc,EACxD,CACF,CAEA,SAAS,EAAY,EAAwE,CAC3F,IAAM,EAAWA,EAAY,EAAM,cAAc,GAAKA,EAAY,EAAM,aAAa,GAAK,EACpF,EAAY,EAAY,EAAS,wBAAyB,EAAS,0BAA0B,EACnG,GAAI,IAAc,IAAA,GAAW,OAC7B,IAAM,EAAa,EACjB,EAAS,iBACT,EAAS,mBACT,EAAM,aACN,EAAM,YACN,EAAM,cACN,EAAM,YACR,EACA,MAAO,CAAE,YAAW,WAAY,EAAG,WAAY,KAAK,IAAI,GAAc,EAAW,CAAS,CAAE,CAC9F,CAGA,SAAgB,EAA0B,EAAgD,CAExF,IAAM,EAAQA,EADQA,EAAY,CACI,CAAC,EAAE,KAAK,EACzC,KACL,OAAO,EAAgB,CAAK,GAAK,EAAY,CAAK,GAAK,EAAe,CAAK,GAAK,EAAY,CAAK,CACnG,CC1FA,MAAa,EAA2C,uCCqClD,EAAiB,0BAQvB,SAAS,EAAY,EAAoC,CACvD,OAAO,OAAO,GAAU,UAAY,EAAM,KAAK,EAAI,EAAM,KAAK,EAAI,IAAA,EACpE,CAEA,SAAS,EAAY,EAA+D,CAClF,OAAO,OAAO,GAAU,UAAY,GAAkB,CAAC,MAAM,QAAQ,CAAK,EACrE,EACD,IAAA,EACN,CAEA,SAAS,EAAe,EAAoD,CAC1E,IAAM,EAAQ,EAAO,MACrB,MAAO,CACL,OAAQ,EAAO,WAAW,OAC1B,GAAI,EAAO,WAAW,GACtB,WAAY,EAAM,WAClB,GAAI,EAAM,oBAAsB,CAAE,oBAAqB,EAAM,mBAAoB,EAAI,CAAC,CACxF,CACF,CAEA,SAAS,EAAc,EAAuB,EAA4C,CACxF,IAAM,EAAQ,EAAY,EAAI,KAAK,EAC7B,EAAU,EAAY,CAAO,EACnC,MAAO,CACL,gBAAiB,EAAY,GAAO,QAAQ,EAC5C,aAAc,EAAY,GAAO,EAAE,EACnC,IAAK,EAAY,GAAO,GAAG,EAC3B,QAAS,EAAY,GAAO,OAAO,EACnC,UAAW,EAAY,GAAS,KAAK,CACvC,CACF,CAEA,SAAS,EAAe,EAA2B,CACjD,IAAM,EAAS,EAAY,CAAO,EAClC,OAAO,GAAQ,aAAe,SAAW,GAAQ,aAAe,SAClE,CAEA,SAAS,EAAmB,EAAsC,CAChE,OACE,EAA8B,CAAO,IACpC,QAAQ,IAAA,qBAAA,OAAA,OAAoF,IAAA,GAEjG,CAEA,SAAS,EACP,EACA,EACA,EACA,EACY,CACZ,IAAM,EAA6B,IAAI,EAAsB,CAAwC,EAC/F,EAAyB,IAAI,EAAsB,kCAAoC,EACvF,EAA2B,EAAY,QAAQ,IAAI,EAAyC,EAC5F,EAAkB,EAAY,QAAQ,IAAI,oCAAyC,EACnF,EAAmB,GAAQ,GAA4B,GACzD,EACA,EAAkB,EAClB,EAAmD,CAAC,EAElD,MAAmD,CACvD,GAAI,EAAkB,OAAO,EAC7B,GAAI,CAAC,EAAe,OACpB,IAAM,GAAA,EAAUC,EAAAA,gBAAAA,CAAgB,EAehC,MAdA,GAAkB,EAChB,CACE,gBACA,uBAAwB,EAAQ,uBAChC,UAAW,EAAQ,UACnB,QAAS,EAAQ,QACjB,QAAS,EAAQ,QACjB,QAAS,EAAQ,YACjB,YACF,EACA,CACF,EACA,EAA2B,IAAI,CAAe,EAC9C,EAAuB,IAAI,EAA0B,EAAe,CAAe,CAAC,EAC7E,CACT,EAmDA,OAjDA,EAAO,OAAO,CAACC,EAAAA,+BAA+B,EAAI,GAAY,CAC5D,GAAI,EAAkB,OACtB,IAAM,GAAA,EAAUC,EAAAA,qBAAAA,CAAqB,CAAO,EAC5C,GAAI,CAAC,EAAS,OACd,IAAM,MAA2B,CAC/B,EAAa,EAAQ,YAAY,CAAC,CAAC,MAAM,IAAI,CAAc,EAC3D,EAAuB,CACzB,EAEA,OADA,EAAa,EACN,EAAQ,UAAU,CAAY,CACvC,CAAC,EAED,EAAG,GAAG,iBAAkB,EAAQ,IAAQ,CACjC,IACH,EAAgB,EAAY,EAAI,eAAe,aAAa,CAAC,EAC7D,EAAuB,EAE3B,CAAC,EAED,EAAG,GAAG,2BAA4B,EAA4B,IAA0B,CACtF,IAAM,EAAY,EAAmB,EAA2B,EAAuB,EACvF,GAAI,CAAC,EAAW,OAEhB,IAAM,EAAW,EAAc,EAAK,EAAM,OAAO,EAC3C,EAAmB,EAAkC,EAAU,CAAe,EAC9E,EAAM,EACV,EACA,EAAmB,QAAU,SAC7B,EACA,EACA,CACF,EACM,EAAY,EAAsB,EAAM,QAAS,EAAS,IAAK,EAAK,EAA8B,CAAS,CAAC,EAQlH,OAPA,EAAa,UAAU,aAAa,CAClC,WAAY,EAA8B,CAAQ,EAClD,YACA,mBACA,mBAAoB,EAAmB,GAAa,EAAM,OAAO,EACjE,GAAI,EAAY,CAAE,UAAW,EAAI,MAAM,EAAkB,CAAE,EAAI,CAAC,CAClE,CAAC,EACM,CACT,CAAC,EAED,EAAG,GAAG,cAAgB,GAA2B,CAC/C,GAAI,EAAe,EAAM,OAAO,EAAG,OACnC,IAAM,EAAQ,EAA0B,EAAM,OAAO,EACjD,GAAO,EAAa,UAAU,QAAQ,EAAO,EAAa,IAAI,CAAC,CACrE,CAAC,MAEY,CACX,EAA2B,QAAQ,EACnC,EAAuB,QAAQ,EAC/B,EAAa,UAAU,MAAM,CAC/B,CACF,CAQA,SAAS,EAAY,EAAiB,EAAiC,CACrE,EAAO,OAAO,CAACC,EAAAA,iBAAiB,EAAI,GAAgB,CAClD,IAAM,GAAA,EAAeC,EAAAA,uBAAAA,CAAuB,CAAW,CAAC,CAAC,SAAS,CAChE,OAAQ,EACR,UAAA,QAAA,KAAA,CAAA,CAAA,cAAA,UAAA,CAAA,CAAA,KACA,OAAQ,CACN,CACE,KAAM,mBACN,YAAa,6FACf,CACF,CACF,CAAC,EACD,UAAa,EAAa,QAAQ,CACpC,CAAC,EACD,EAAO,OAAO,WAAa,CACzB,IAAI,EAA4B,EAAQ,EAAO,aAAa,SAAS,EACrE,MAAM,EAAoB,EAAQ,EAAO,GAAI,EAAO,aAAc,EAAO,SAAS,CACpF,EAAG,CAAc,CACnB,CAEA,eAAsB,EACpB,EACA,EAA2C,EAAqB,EACjD,CACf,IAAM,EAAY,MAAA,QAAA,QAAA,CAAA,CAAA,SAAA,QAAM,oCAAA,CAAA,EACxB,GAAI,OAAO,EAAU,SAAY,WAC/B,MAAU,MAAM,0DAA0D,EAC5E,MAAM,EAAU,QAAQ,CAAE,EAE1B,IAAM,EAAa,MAAA,EAAMC,EAAAA,sBAAAA,CAAsB,EAAI,CAAc,EAC3D,EAAQ,EAAW,KAAK,OAAO,EAAa,CAAE,KAAI,eAAc,WAAU,CAAC,EACjF,GAAI,CACF,MAAM,CACR,OAAS,EAAO,CACd,GAAI,CACF,MAAM,EAAM,QAAQ,CACtB,QAAU,CACR,MAAM,EAAW,QAAQ,CAC3B,CACA,MAAM,CACR,CAEA,IAAI,EACJ,EAAG,GACD,uBAEG,KAAc,SAAY,CACzB,GAAI,CACF,MAAM,EAAM,QAAQ,CACtB,QAAU,CACR,MAAM,EAAW,QAAQ,CAC3B,CACF,EAAA,CAAG,CACP,CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pi.d.cts","names":[],"sources":["../../src/types/cache.ts","../../src/types/extension.ts","../../src/adapters/pi/extension.ts"],"mappings":";;KAAY;UA+CK;WACN;WACA;WACA;;UAGM,+BAA+B;WACrC;WACA;WACA;;UAGM;WACN,YAAY;WACZ;WACA;WACA;WACA;;UAGM,qCAAqC;WAC3C;WACA,uBAAuB;WACvB,kBAAkB;;UAGZ;EACf,aAAa,QAAQ;EACrB,QAAQ,OAAO,kBAAkB;EACjC,YAAY;EACZ;;;;UC3Ee;WACN,WAAW;WACX;;;;
|
|
1
|
+
{"version":3,"file":"pi.d.cts","names":[],"sources":["../../src/types/cache.ts","../../src/types/extension.ts","../../src/adapters/pi/extension.ts"],"mappings":";;KAAY;UA+CK;WACN;WACA;WACA;;UAGM,+BAA+B;WACrC;WACA;WACA;;UAGM;WACN,YAAY;WACZ;WACA;WACA;WACA;;UAGM,qCAAqC;WAC3C;WACA,uBAAuB;WACvB,kBAAkB;;UAGZ;EACf,aAAa,QAAQ;EACrB,QAAQ,OAAO,kBAAkB;EACjC,YAAY;EACZ;;;;UC3Ee;WACN,WAAW;WACX;;;;iBC2MW,uBACpB,IAAI,cACJ,eAAc,6BACb"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pi.d.mts","names":[],"sources":["../../src/types/cache.ts","../../src/types/extension.ts","../../src/adapters/pi/extension.ts"],"mappings":";;KAAY;UA+CK;WACN;WACA;WACA;;UAGM,+BAA+B;WACrC;WACA;WACA;;UAGM;WACN,YAAY;WACZ;WACA;WACA;WACA;;UAGM,qCAAqC;WAC3C;WACA,uBAAuB;WACvB,kBAAkB;;UAGZ;EACf,aAAa,QAAQ;EACrB,QAAQ,OAAO,kBAAkB;EACjC,YAAY;EACZ;;;;UC3Ee;WACN,WAAW;WACX;;;;
|
|
1
|
+
{"version":3,"file":"pi.d.mts","names":[],"sources":["../../src/types/cache.ts","../../src/types/extension.ts","../../src/adapters/pi/extension.ts"],"mappings":";;KAAY;UA+CK;WACN;WACA;WACA;;UAGM,+BAA+B;WACrC;WACA;WACA;;UAGM;WACN,YAAY;WACZ;WACA;WACA;WACA;;UAGM,qCAAqC;WAC3C;WACA,uBAAuB;WACvB,kBAAkB;;UAGZ;EACf,aAAa,QAAQ;EACrB,QAAQ,OAAO,kBAAkB;EACjC,YAAY;EACZ;;;;UC3Ee;WACN,WAAW;WACX;;;;iBC2MW,uBACpB,IAAI,cACJ,eAAc,6BACb"}
|
package/dist/extensions/pi.mjs
CHANGED
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
import{getHarnessState as e}from"@agimon-ai/doompi-config/harnessStore";import{connectDoomCordisHost as t}from"@agimon-ai/doompi-extension-contracts/cordis-host";import{DOOM_HELP_SERVICE as n,requireDoomHelpService as r}from"@agimon-ai/doompi-extension-contracts/help";import{DOOM_MINOR_MODE_CATALOG_SERVICE as i,readMinorModeCatalog as a}from"@agimon-ai/doompi-extension-contracts/mode";import{createHash as o}from"node:crypto";import{Service as s}from"@deepseek-ai/cordis";
|
|
2
|
-
`)}function u(e,t){e.registerCommand(`doom-cache`,{description:`Show provider prompt cache status`,handler:async(e,n)=>{n.hasUI&&n.ui.notify(l(t.snapshot()),`info`)}})}var d=class{#e;#t={capability:`unknown`};#n=[];constructor(e=64){if(!Number.isInteger(e)||e<1)throw Error(`Prompt cache telemetry limit must be a positive integer.`);this.#e=e}beginRequest(e){this.#t={...e}}observe(e,t){let n=this.#t.namespace,r=this.#t.modelFingerprint;!n||!r||(this.#n.push({namespace:n,modelFingerprint:r,cacheRead:e.cacheRead,cacheWrite:e.cacheWrite,totalInput:e.totalInput,observedAt:t}),this.#n.length>this.#e&&this.#n.splice(0,this.#n.length-this.#e))}snapshot(){let e=[...this.#n];return{...this.#t,residency:`unknown`,observations:e,...e.length>0?{lastObservation:e.at(-1)}:{}}}reset(){this.#t={capability:`unknown`},this.#n=[]}};function f(e={}){return{telemetry:e.telemetry??new d,now:e.now??Date.now}}var p=class{#e;#t;#n;#r;constructor(e,t=process.env){this.#t=e,this.#e=t,this.#n={present:Object.hasOwn(t,e),value:t[e]}}set(e){this.#e[this.#t]=e,this.#r=e}restore(){this.#r!==void 0&&this.#e[this.#t]===this.#r&&(this.#n.present?this.#e[this.#t]=this.#n.value:delete this.#e[this.#t],this.#r=void 0)}};function m(e){return o(`sha256`).update(e).digest(`base64url`)}var h=class extends s{telemetry;constructor(e,t){super(e,`doom/prompt-cache-telemetry`),this.telemetry=t}snapshot(){return this.telemetry.snapshot()}};function g(e){if(!Number.isFinite(e))throw Error(`Prompt cache identity cannot contain a non-finite number.`);return Object.is(e,-0)?0:e}function _(e){if(e===null)return null;if(typeof e==`string`)return e.normalize(`NFC`);if(typeof e==`boolean`)return e;if(typeof e==`number`)return g(e);if(Array.isArray(e))return e.map(e=>_(e));if(typeof e!=`object`)throw Error(`Unsupported prompt cache identity value: ${typeof e}.`);let t=e,n={};for(let e of Object.keys(t).sort((e,t)=>e.localeCompare(t))){let r=t[e];r!==void 0&&(n[e.normalize(`NFC`)]=_(r))}return n}function v(e){return JSON.stringify(_(e))}function y(e,t,n){return`${e}${n(v(t))}`}function b(e){return e?.trim().replaceAll(`\\`,`/`)||void 0}function x(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 S(e,t){return y(`dpr1_`,{version:1,rootSessionId:e},t)}function C(e,t){return y(`dpn1_`,{version:1,rootSession:S(e.rootSessionId,t),compositionFingerprint:e.compositionFingerprint??null,majorMode:e.majorMode,domains:[...e.domains],profile:e.profile??null,persona:b(e.persona)??null,minorModes:x(e.minorModes)},t)}function w(e,t){return y(`dpm1_`,{version:1,virtualProvider:e.virtualProvider??null,virtualModel:e.virtualModel??null,api:e.api??null,baseUrl:e.baseUrl??null,wireModel:e.wireModel??null},t)}function T(e,t,n,r,i){return y(`dpc1_`,{version:1,parentNamespace:e,scope:t,childProjection:i??null,modelFingerprint:n},r)}function E(e){let t=e.__internals_for_tests;return typeof t?.isRuntimeOptimizerEnabled==`function`&&typeof t.shouldInjectOpenAIPromptCacheKey==`function`&&t.isRuntimeOptimizerEnabled()&&t.shouldInjectOpenAIPromptCacheKey()}const D=new Set([`openai-completions`,`openai-responses`,`openai-codex-responses`,`azure-openai-responses`]),O=new Set([`anthropic-messages`,`bedrock-converse-stream`]),k=new Set([`google-generative-ai`,`google-vertex`,`google-vertex-anthropic`]);function A(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function j(e){return e.api===`openai-responses`||e.api===`openai-completions`?e.virtualProvider===`openai`?`key-and-long-retention`:`key-only`:e.api&&D.has(e.api)?`key-only`:e.api&&O.has(e.api)?`marker-only`:e.api&&k.has(e.api)?`automatic`:`unknown`}function M(e,t,n,r){if(!r||!t||!D.has(t)||!A(e))return;let i=e.prompt_cache_key;if(!(typeof i!=`string`||!i.trim()||i===n))return{...e,prompt_cache_key:n}}function N(e){if(!A(e))return;let t=e.prompt_cache_retention;return typeof t==`string`&&t.trim()?t.trim():void 0}function P(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:void 0}function F(e){return typeof e==`number`&&Number.isFinite(e)&&e>=0?e:void 0}function I(...e){for(let t of e){let e=F(t);if(e!==void 0)return e}}function L(e){let t=F(e.cacheRead),n=F(e.cacheWrite);if(t===void 0&&n===void 0)return;let r=F(e.input)??0;return{cacheRead:t??0,cacheWrite:n??0,totalInput:r+(t??0)+(n??0)}}function R(e){let t=P(e.prompt_tokens_details)??P(e.promptTokensDetails),n=P(e.input_tokens_details)??P(e.inputTokensDetails),r=I(t?.cached_tokens,t?.cachedTokens,n?.cached_tokens,n?.cachedTokens),i=I(t?.cache_write_tokens,t?.cacheWriteTokens,n?.cache_write_tokens,n?.cacheWriteTokens);if(r===void 0&&i===void 0)return;let a=(r??0)+(i??0),o=I(e.prompt_tokens,e.promptTokens,e.input_tokens,e.inputTokens);return{cacheRead:r??0,cacheWrite:i??0,totalInput:Math.max(o??a,a)}}function z(e){let t=I(e.cache_read_input_tokens,e.cacheReadInputTokens),n=I(e.cache_creation_input_tokens,e.cacheCreationInputTokens);if(t===void 0&&n===void 0)return;let r=I(e.input_tokens,e.inputTokens)??0;return{cacheRead:t??0,cacheWrite:n??0,totalInput:r+(t??0)+(n??0)}}function B(e){let t=P(e.usage_metadata)??P(e.usageMetadata)??e,n=I(t.cachedContentTokenCount,t.cached_content_token_count);if(n===void 0)return;let r=I(t.promptTokenCount,t.prompt_token_count,e.input_tokens,e.inputTokens,e.prompt_tokens,e.promptTokens);return{cacheRead:n,cacheWrite:0,totalInput:Math.max(r??n,n)}}function V(e){let t=P(P(e)?.usage);if(t)return L(t)??R(t)??z(t)??B(t)}const H=`DOOMPI_PROMPT_CACHE_PARENT_NAMESPACE`,U=`@agimon-ai/doompi-cache`;function W(e){return typeof e==`string`&&e.trim()?e.trim():void 0}function G(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:void 0}function K(e){let t=e.state;return{source:e.descriptor.source,id:e.descriptor.id,activation:t.activation,...t.modelContextVariant?{modelContextVariant:t.modelContextVariant}:{}}}function q(e,t){let n=G(e.model),r=G(t);return{virtualProvider:W(n?.provider),virtualModel:W(n?.id),api:W(n?.api),baseUrl:W(n?.baseUrl),wireModel:W(r?.model)}}function J(e){let t=G(e);return t?.stopReason===`error`||t?.stopReason===`aborted`}function Y(e){return N(e)??(process.env.PI_CACHE_RETENTION===`long`?`long`:void 0)}function X(t,n,r,o){let s=new p(H),c=new p(`DOOMPI_PROMPT_CACHE_ROOT_SESSION`),l=W(process.env[H]),d=W(process.env.DOOMPI_PROMPT_CACHE_CHILD_PROJECTION),f=!!(l&&d),h,g=l,_=[],v=()=>{if(f)return g;if(!h)return;let t=e();return g=C({rootSessionId:h,compositionFingerprint:t.compositionFingerprint,majorMode:t.majorMode,domains:t.domains,profile:t.profile,persona:t.personaFile,minorModes:_},m),s.set(g),c.set(S(h,m)),g};return t.inject([i],e=>{if(f)return;let t=a(e);if(!t)return;let n=()=>{_=t.getSnapshot().modes.map(K),v()};return n(),t.subscribe(n)}),u(n,r.telemetry),n.on(`session_start`,(e,t)=>{f||(h=W(t.sessionManager.getSessionId()),v())}),n.on(`before_provider_request`,(e,t)=>{let n=f?l:v();if(!n)return;let i=q(t,e.payload),a=w(i,m),s=T(n,f?`child`:`parent`,a,m,d),c=M(e.payload,i.api,s,E(o));return r.telemetry.beginRequest({capability:j(i),namespace:n,modelFingerprint:a,requestedRetention:Y(c??e.payload),...c?{keySuffix:s.slice(-8)}:{}}),c}),n.on(`message_end`,e=>{if(J(e.message))return;let t=V(e.message);t&&r.telemetry.observe(t,r.now())}),()=>{s.restore(),c.restore(),r.telemetry.reset()}}function Z(e,t){e.inject([n],e=>{let t=r(e).register({source:U,moduleUrl:import.meta.url,skills:[{name:`doompi-use-cache`,description:`Inspect DoomPi provider prompt cache policy, routing identity, and provider-observed usage.`}]});return()=>t.dispose()}),e.effect(function*(){new h(e,t.dependencies.telemetry),yield X(e,t.pi,t.dependencies,t.optimizer)},U)}async function Q(e,n=f()){let r=await import(`../pi-cache-optimizer-CjPVk06Q.mjs`);if(typeof r.default!=`function`)throw Error(`Pi Cache Optimizer does not export an extension factory.`);await r.default(e);let i=await t(e,U),a=i.root.plugin(Z,{pi:e,dependencies:n,optimizer:r});try{await a}catch(e){try{await a.dispose()}finally{await i.dispose()}throw e}let o;e.on(`session_shutdown`,()=>o??=(async()=>{try{await a.dispose()}finally{await i.dispose()}})())}export{Q as activateCacheExtension,Q as default};
|
|
1
|
+
import{getHarnessState as e}from"@agimon-ai/doompi-config/harnessStore";import{connectDoomCordisHost as t}from"@agimon-ai/doompi-extension-contracts/cordis-host";import{DOOM_HELP_SERVICE as n,requireDoomHelpService as r}from"@agimon-ai/doompi-extension-contracts/help";import{DOOM_MINOR_MODE_CATALOG_SERVICE as i,readMinorModeCatalog as a}from"@agimon-ai/doompi-extension-contracts/mode";import{createHash as o}from"node:crypto";import{Service as s}from"@deepseek-ai/cordis";var c=class{#e;#t={capability:`unknown`};#n=[];constructor(e=64){if(!Number.isInteger(e)||e<1)throw Error(`Prompt cache telemetry limit must be a positive integer.`);this.#e=e}beginRequest(e){this.#t={...e}}observe(e,t){let n=this.#t.namespace,r=this.#t.modelFingerprint;!n||!r||(this.#n.push({namespace:n,modelFingerprint:r,cacheRead:e.cacheRead,cacheWrite:e.cacheWrite,totalInput:e.totalInput,observedAt:t}),this.#n.length>this.#e&&this.#n.splice(0,this.#n.length-this.#e))}snapshot(){let e=[...this.#n];return{...this.#t,residency:`unknown`,observations:e,...e.length>0?{lastObservation:e.at(-1)}:{}}}reset(){this.#t={capability:`unknown`},this.#n=[]}};function l(e={}){return{telemetry:e.telemetry??new c,now:e.now??Date.now}}var u=class{#e;#t;#n;#r;constructor(e,t=process.env){this.#t=e,this.#e=t,this.#n={present:Object.hasOwn(t,e),value:t[e]}}set(e){this.#e[this.#t]=e,this.#r=e}restore(){this.#r!==void 0&&this.#e[this.#t]===this.#r&&(this.#n.present?this.#e[this.#t]=this.#n.value:delete this.#e[this.#t],this.#r=void 0)}};function d(e){return o(`sha256`).update(e).digest(`base64url`)}var f=class extends s{telemetry;constructor(e,t){super(e,`doom/prompt-cache-telemetry`),this.telemetry=t}snapshot(){return this.telemetry.snapshot()}};function p(e){if(!Number.isFinite(e))throw Error(`Prompt cache identity cannot contain a non-finite number.`);return Object.is(e,-0)?0:e}function m(e){if(e===null)return null;if(typeof e==`string`)return e.normalize(`NFC`);if(typeof e==`boolean`)return e;if(typeof e==`number`)return p(e);if(Array.isArray(e))return e.map(e=>m(e));if(typeof e!=`object`)throw Error(`Unsupported prompt cache identity value: ${typeof e}.`);let t=e,n={};for(let e of Object.keys(t).sort((e,t)=>e.localeCompare(t))){let r=t[e];r!==void 0&&(n[e.normalize(`NFC`)]=m(r))}return n}function h(e){return JSON.stringify(m(e))}function g(e,t,n){return`${e}${n(h(t))}`}function _(e){return e?.trim().replaceAll(`\\`,`/`)||void 0}function v(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 y(e,t){return g(`dpr1_`,{version:1,rootSessionId:e},t)}function b(e,t){return g(`dpn1_`,{version:1,rootSession:y(e.rootSessionId,t),compositionFingerprint:e.compositionFingerprint??null,majorMode:e.majorMode,domains:[...e.domains],profile:e.profile??null,persona:_(e.persona)??null,minorModes:v(e.minorModes)},t)}function x(e,t){return g(`dpm1_`,{version:1,virtualProvider:e.virtualProvider??null,virtualModel:e.virtualModel??null,api:e.api??null,baseUrl:e.baseUrl??null,wireModel:e.wireModel??null},t)}function S(e,t,n,r,i){return g(`dpc1_`,{version:1,parentNamespace:e,scope:t,childProjection:i??null,modelFingerprint:n},r)}function C(e){let t=e.__internals_for_tests;return typeof t?.isRuntimeOptimizerEnabled==`function`&&typeof t.shouldInjectOpenAIPromptCacheKey==`function`&&t.isRuntimeOptimizerEnabled()&&t.shouldInjectOpenAIPromptCacheKey()}const w=new Set([`openai-completions`,`openai-responses`,`openai-codex-responses`,`azure-openai-responses`]),T=new Set([`anthropic-messages`,`bedrock-converse-stream`]),E=new Set([`google-generative-ai`,`google-vertex`,`google-vertex-anthropic`]);function D(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function O(e){return e.api===`openai-responses`||e.api===`openai-completions`?e.virtualProvider===`openai`?`key-and-long-retention`:`key-only`:e.api&&w.has(e.api)?`key-only`:e.api&&T.has(e.api)?`marker-only`:e.api&&E.has(e.api)?`automatic`:`unknown`}function k(e,t,n,r){if(!r||!t||!w.has(t)||!D(e))return;let i=e.prompt_cache_key;if(!(typeof i!=`string`||!i.trim()||i===n))return{...e,prompt_cache_key:n}}function A(e){if(!D(e))return;let t=e.prompt_cache_retention;return typeof t==`string`&&t.trim()?t.trim():void 0}function j(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:void 0}function M(e){return typeof e==`number`&&Number.isFinite(e)&&e>=0?e:void 0}function N(...e){for(let t of e){let e=M(t);if(e!==void 0)return e}}function P(e){let t=M(e.cacheRead),n=M(e.cacheWrite);if(t===void 0&&n===void 0)return;let r=M(e.input)??0;return{cacheRead:t??0,cacheWrite:n??0,totalInput:r+(t??0)+(n??0)}}function F(e){let t=j(e.prompt_tokens_details)??j(e.promptTokensDetails),n=j(e.input_tokens_details)??j(e.inputTokensDetails),r=N(t?.cached_tokens,t?.cachedTokens,n?.cached_tokens,n?.cachedTokens),i=N(t?.cache_write_tokens,t?.cacheWriteTokens,n?.cache_write_tokens,n?.cacheWriteTokens);if(r===void 0&&i===void 0)return;let a=(r??0)+(i??0),o=N(e.prompt_tokens,e.promptTokens,e.input_tokens,e.inputTokens);return{cacheRead:r??0,cacheWrite:i??0,totalInput:Math.max(o??a,a)}}function I(e){let t=N(e.cache_read_input_tokens,e.cacheReadInputTokens),n=N(e.cache_creation_input_tokens,e.cacheCreationInputTokens);if(t===void 0&&n===void 0)return;let r=N(e.input_tokens,e.inputTokens)??0;return{cacheRead:t??0,cacheWrite:n??0,totalInput:r+(t??0)+(n??0)}}function L(e){let t=j(e.usage_metadata)??j(e.usageMetadata)??e,n=N(t.cachedContentTokenCount,t.cached_content_token_count);if(n===void 0)return;let r=N(t.promptTokenCount,t.prompt_token_count,e.input_tokens,e.inputTokens,e.prompt_tokens,e.promptTokens);return{cacheRead:n,cacheWrite:0,totalInput:Math.max(r??n,n)}}function R(e){let t=j(j(e)?.usage);if(t)return P(t)??F(t)??I(t)??L(t)}const z=`DOOMPI_PROMPT_CACHE_PARENT_NAMESPACE`,B=`@agimon-ai/doompi-cache`;function V(e){return typeof e==`string`&&e.trim()?e.trim():void 0}function H(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:void 0}function U(e){let t=e.state;return{source:e.descriptor.source,id:e.descriptor.id,activation:t.activation,...t.modelContextVariant?{modelContextVariant:t.modelContextVariant}:{}}}function W(e,t){let n=H(e.model),r=H(t);return{virtualProvider:V(n?.provider),virtualModel:V(n?.id),api:V(n?.api),baseUrl:V(n?.baseUrl),wireModel:V(r?.model)}}function G(e){let t=H(e);return t?.stopReason===`error`||t?.stopReason===`aborted`}function K(e){return A(e)??(process.env.PI_CACHE_RETENTION===`long`?`long`:void 0)}function q(t,n,r,o){let s=new u(z),c=new u(`DOOMPI_PROMPT_CACHE_ROOT_SESSION`),l=V(process.env[z]),f=V(process.env.DOOMPI_PROMPT_CACHE_CHILD_PROJECTION),p=!!(l&&f),m,h=l,g=[],_=()=>{if(p)return h;if(!m)return;let t=e();return h=b({rootSessionId:m,compositionFingerprint:t.compositionFingerprint,majorMode:t.majorMode,domains:t.domains,profile:t.profile,persona:t.personaFile,minorModes:g},d),s.set(h),c.set(y(m,d)),h};return t.inject([i],e=>{if(p)return;let t=a(e);if(!t)return;let n=()=>{g=t.getSnapshot().modes.map(U),_()};return n(),t.subscribe(n)}),n.on(`session_start`,(e,t)=>{p||(m=V(t.sessionManager.getSessionId()),_())}),n.on(`before_provider_request`,(e,t)=>{let n=p?l:_();if(!n)return;let i=W(t,e.payload),a=x(i,d),s=S(n,p?`child`:`parent`,a,d,f),c=k(e.payload,i.api,s,C(o));return r.telemetry.beginRequest({capability:O(i),namespace:n,modelFingerprint:a,requestedRetention:K(c??e.payload),...c?{keySuffix:s.slice(-8)}:{}}),c}),n.on(`message_end`,e=>{if(G(e.message))return;let t=R(e.message);t&&r.telemetry.observe(t,r.now())}),()=>{s.restore(),c.restore(),r.telemetry.reset()}}function J(e,t){e.inject([n],e=>{let t=r(e).register({source:B,moduleUrl:import.meta.url,skills:[{name:`doompi-use-cache`,description:`Inspect DoomPi provider prompt cache policy, routing identity, and provider-observed usage.`}]});return()=>t.dispose()}),e.effect(function*(){new f(e,t.dependencies.telemetry),yield q(e,t.pi,t.dependencies,t.optimizer)},B)}async function Y(e,n=l()){let r=await import(`../pi-cache-optimizer-D5_7O2Zu.mjs`);if(typeof r.default!=`function`)throw Error(`Pi Cache Optimizer does not export an extension factory.`);await r.default(e);let i=await t(e,B),a=i.root.plugin(J,{pi:e,dependencies:n,optimizer:r});try{await a}catch(e){try{await a.dispose()}finally{await i.dispose()}throw e}let o;e.on(`session_shutdown`,()=>o??=(async()=>{try{await a.dispose()}finally{await i.dispose()}})())}export{Y as activateCacheExtension,Y as default};
|
|
3
2
|
//# sourceMappingURL=pi.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pi.mjs","names":["#limit","#request","#observations","#environment","#name","#baseline","#ownedValue","recordValue"],"sources":["../../src/services/status.ts","../../src/commands/doomCacheCommand.ts","../../src/services/telemetry.ts","../../src/container/index.ts","../../src/adapters/node/environment.ts","../../src/adapters/node/digest.ts","../../src/providers/promptCacheTelemetry.ts","../../src/services/canonical.ts","../../src/services/namespace.ts","../../src/services/optimizerPolicy.ts","../../src/services/providerPolicy.ts","../../src/services/promptCacheUsage.ts","../../src/types/environment.ts","../../src/adapters/pi/extension.ts"],"sourcesContent":["import type { PromptCacheTelemetrySnapshot } from '../types/cache.ts';\n\nfunction observationLine(snapshot: PromptCacheTelemetrySnapshot): string {\n const observation = snapshot.lastObservation;\n if (!observation) return 'Last provider observation: none';\n return `Last provider observation: cacheRead=${observation.cacheRead}, cacheWrite=${observation.cacheWrite}, input=${observation.totalInput}`;\n}\n\nexport function formatPromptCacheStatus(snapshot: PromptCacheTelemetrySnapshot): string {\n return [\n 'DoomPi provider prompt cache',\n `Capability: ${snapshot.capability}`,\n `Requested retention: ${snapshot.requestedRetention ?? 'provider default'}`,\n `Namespace key: ${snapshot.keySuffix ? `…${snapshot.keySuffix}` : 'unavailable'}`,\n observationLine(snapshot),\n 'Current provider residency: unknown',\n 'UI CH and optimizer counters are aggregate reuse metrics, not residency guarantees.',\n ].join('\\n');\n}\n","import type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\nimport { formatPromptCacheStatus } from '../services/status.ts';\nimport type { PromptCacheTelemetryPort } from '../types/cache.ts';\n\nexport const COMMAND_NAME = 'doom-cache';\nexport const COMMAND_DESCRIPTION = 'Show provider prompt cache status';\n\nexport function registerCacheCommand(\n pi: Pick<ExtensionAPI, 'registerCommand'>,\n telemetry: PromptCacheTelemetryPort,\n): void {\n pi.registerCommand(COMMAND_NAME, {\n description: COMMAND_DESCRIPTION,\n handler: async (_args, ctx) => {\n if (ctx.hasUI) ctx.ui.notify(formatPromptCacheStatus(telemetry.snapshot()), 'info');\n },\n });\n}\n","import type {\n PromptCacheObservation,\n PromptCacheRequestStatus,\n PromptCacheTelemetryPort,\n PromptCacheTelemetrySnapshot,\n PromptCacheUsage,\n} from '../types/cache.ts';\n\nconst DEFAULT_OBSERVATION_LIMIT = 64;\n\nexport class PromptCacheTelemetry implements PromptCacheTelemetryPort {\n readonly #limit: number;\n #request: PromptCacheRequestStatus = { capability: 'unknown' };\n #observations: PromptCacheObservation[] = [];\n\n constructor(limit: number = DEFAULT_OBSERVATION_LIMIT) {\n if (!Number.isInteger(limit) || limit < 1)\n throw new Error('Prompt cache telemetry limit must be a positive integer.');\n this.#limit = limit;\n }\n\n beginRequest(status: PromptCacheRequestStatus): void {\n this.#request = { ...status };\n }\n\n observe(usage: PromptCacheUsage, observedAt: number): void {\n const namespace = this.#request.namespace;\n const modelFingerprint = this.#request.modelFingerprint;\n if (!namespace || !modelFingerprint) return;\n\n this.#observations.push({\n namespace,\n modelFingerprint,\n cacheRead: usage.cacheRead,\n cacheWrite: usage.cacheWrite,\n totalInput: usage.totalInput,\n observedAt,\n });\n if (this.#observations.length > this.#limit) {\n this.#observations.splice(0, this.#observations.length - this.#limit);\n }\n }\n\n snapshot(): PromptCacheTelemetrySnapshot {\n const observations = [...this.#observations];\n return {\n ...this.#request,\n residency: 'unknown',\n observations,\n ...(observations.length > 0 ? { lastObservation: observations.at(-1) } : {}),\n };\n }\n\n reset(): void {\n this.#request = { capability: 'unknown' };\n this.#observations = [];\n }\n}\n","import { PromptCacheTelemetry } from '../services/telemetry.ts';\nimport type { CacheExtensionDependencies } from '../types/extension.ts';\n\nexport function createCacheContainer(overrides: Partial<CacheExtensionDependencies> = {}): CacheExtensionDependencies {\n return {\n telemetry: overrides.telemetry ?? new PromptCacheTelemetry(),\n now: overrides.now ?? Date.now,\n };\n}\n","interface EnvironmentSnapshot {\n readonly present: boolean;\n readonly value?: string;\n}\n\nexport class OwnedEnvironmentValue {\n readonly #environment: NodeJS.ProcessEnv;\n readonly #name: string;\n readonly #baseline: EnvironmentSnapshot;\n #ownedValue?: string;\n\n constructor(name: string, environment: NodeJS.ProcessEnv = process.env) {\n this.#name = name;\n this.#environment = environment;\n this.#baseline = {\n present: Object.hasOwn(environment, name),\n value: environment[name],\n };\n }\n\n set(value: string): void {\n this.#environment[this.#name] = value;\n this.#ownedValue = value;\n }\n\n restore(): void {\n if (this.#ownedValue === undefined || this.#environment[this.#name] !== this.#ownedValue) return;\n if (this.#baseline.present) this.#environment[this.#name] = this.#baseline.value;\n else delete this.#environment[this.#name];\n this.#ownedValue = undefined;\n }\n}\n","import { createHash } from 'node:crypto';\n\nexport function sha256Base64Url(value: string): string {\n return createHash('sha256').update(value).digest('base64url');\n}\n","import { type Context, Service } from '@deepseek-ai/cordis';\nimport type { PromptCacheTelemetryPort, PromptCacheTelemetrySnapshot } from '../types/cache.ts';\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","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","import type {\n PromptCacheChildProjection,\n PromptCacheDigest,\n PromptCacheMinorModeState,\n PromptCacheModelIdentity,\n PromptCacheParentState,\n} from '../types/cache.ts';\nimport { canonicalJson } from './canonical.ts';\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","export interface PromptCacheOptimizerRuntime {\n readonly __internals_for_tests?: {\n readonly isRuntimeOptimizerEnabled?: () => boolean;\n readonly shouldInjectOpenAIPromptCacheKey?: () => boolean;\n };\n}\n\n/** Fail closed unless the pinned optimizer confirms both runtime and key routing are enabled. */\nexport function optimizerAllowsPromptCacheKey(optimizer: PromptCacheOptimizerRuntime): boolean {\n const internals = optimizer.__internals_for_tests;\n return (\n typeof internals?.isRuntimeOptimizerEnabled === 'function' &&\n typeof internals.shouldInjectOpenAIPromptCacheKey === 'function' &&\n internals.isRuntimeOptimizerEnabled() &&\n internals.shouldInjectOpenAIPromptCacheKey()\n );\n}\n","import type { PromptCacheCapabilityClass, PromptCacheModelIdentity } from '../types/cache.ts';\n\nconst ROUTING_KEY_APIS = new Set([\n 'openai-completions',\n 'openai-responses',\n 'openai-codex-responses',\n 'azure-openai-responses',\n]);\n\nconst MARKER_APIS = new Set(['anthropic-messages', 'bedrock-converse-stream']);\nconst AUTOMATIC_APIS = new Set(['google-generative-ai', 'google-vertex', 'google-vertex-anthropic']);\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function classifyPromptCacheCapability(model: PromptCacheModelIdentity): PromptCacheCapabilityClass {\n if (model.api === 'openai-responses' || model.api === 'openai-completions') {\n return model.virtualProvider === 'openai' ? 'key-and-long-retention' : 'key-only';\n }\n if (model.api && ROUTING_KEY_APIS.has(model.api)) return 'key-only';\n if (model.api && MARKER_APIS.has(model.api)) return 'marker-only';\n if (model.api && AUTOMATIC_APIS.has(model.api)) return 'automatic';\n return 'unknown';\n}\n\nexport function rewritePromptCacheKey(\n payload: unknown,\n api: string | undefined,\n key: string,\n enabled: boolean,\n): Record<string, unknown> | undefined {\n if (!enabled || !api || !ROUTING_KEY_APIS.has(api) || !isRecord(payload)) return undefined;\n const current = payload.prompt_cache_key;\n if (typeof current !== 'string' || !current.trim() || current === key) return undefined;\n return { ...payload, prompt_cache_key: key };\n}\n\nexport function requestedPromptCacheRetention(payload: unknown): string | undefined {\n if (!isRecord(payload)) return undefined;\n const retention = payload.prompt_cache_retention;\n return typeof retention === 'string' && retention.trim() ? retention.trim() : undefined;\n}\n","import type { PromptCacheUsage } from '../types/cache.ts';\n\nfunction recordValue(value: unknown): Readonly<Record<string, unknown>> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Readonly<Record<string, unknown>>)\n : undefined;\n}\n\nfunction nonNegativeNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : undefined;\n}\n\nfunction firstNumber(...values: readonly unknown[]): number | undefined {\n for (const value of values) {\n const number = nonNegativeNumber(value);\n if (number !== undefined) return number;\n }\n return undefined;\n}\n\nfunction normalizedUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const cacheRead = nonNegativeNumber(usage.cacheRead);\n const cacheWrite = nonNegativeNumber(usage.cacheWrite);\n if (cacheRead === undefined && cacheWrite === undefined) return undefined;\n const input = nonNegativeNumber(usage.input) ?? 0;\n return {\n cacheRead: cacheRead ?? 0,\n cacheWrite: cacheWrite ?? 0,\n totalInput: input + (cacheRead ?? 0) + (cacheWrite ?? 0),\n };\n}\n\nfunction openAiUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const promptDetails = recordValue(usage.prompt_tokens_details) ?? recordValue(usage.promptTokensDetails);\n const inputDetails = recordValue(usage.input_tokens_details) ?? recordValue(usage.inputTokensDetails);\n const cacheRead = firstNumber(\n promptDetails?.cached_tokens,\n promptDetails?.cachedTokens,\n inputDetails?.cached_tokens,\n inputDetails?.cachedTokens,\n );\n const cacheWrite = firstNumber(\n promptDetails?.cache_write_tokens,\n promptDetails?.cacheWriteTokens,\n inputDetails?.cache_write_tokens,\n inputDetails?.cacheWriteTokens,\n );\n if (cacheRead === undefined && cacheWrite === undefined) return undefined;\n const floor = (cacheRead ?? 0) + (cacheWrite ?? 0);\n const reportedTotal = firstNumber(usage.prompt_tokens, usage.promptTokens, usage.input_tokens, usage.inputTokens);\n return {\n cacheRead: cacheRead ?? 0,\n cacheWrite: cacheWrite ?? 0,\n totalInput: Math.max(reportedTotal ?? floor, floor),\n };\n}\n\nfunction anthropicUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const cacheRead = firstNumber(usage.cache_read_input_tokens, usage.cacheReadInputTokens);\n const cacheWrite = firstNumber(usage.cache_creation_input_tokens, usage.cacheCreationInputTokens);\n if (cacheRead === undefined && cacheWrite === undefined) return undefined;\n const input = firstNumber(usage.input_tokens, usage.inputTokens) ?? 0;\n return {\n cacheRead: cacheRead ?? 0,\n cacheWrite: cacheWrite ?? 0,\n totalInput: input + (cacheRead ?? 0) + (cacheWrite ?? 0),\n };\n}\n\nfunction geminiUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const metadata = recordValue(usage.usage_metadata) ?? recordValue(usage.usageMetadata) ?? usage;\n const cacheRead = firstNumber(metadata.cachedContentTokenCount, metadata.cached_content_token_count);\n if (cacheRead === undefined) return undefined;\n const totalInput = firstNumber(\n metadata.promptTokenCount,\n metadata.prompt_token_count,\n usage.input_tokens,\n usage.inputTokens,\n usage.prompt_tokens,\n usage.promptTokens,\n );\n return { cacheRead, cacheWrite: 0, totalInput: Math.max(totalInput ?? cacheRead, cacheRead) };\n}\n\n/** Normalize only usage values carried by a provider-produced assistant message. */\nexport function normalizePromptCacheUsage(message: unknown): PromptCacheUsage | undefined {\n const messageRecord = recordValue(message);\n const usage = recordValue(messageRecord?.usage);\n if (!usage) return undefined;\n return normalizedUsage(usage) ?? openAiUsage(usage) ?? anthropicUsage(usage) ?? geminiUsage(usage);\n}\n","export const DOOMPI_PROMPT_CACHE_PARENT_NAMESPACE_ENV = 'DOOMPI_PROMPT_CACHE_PARENT_NAMESPACE';\nexport const DOOMPI_PROMPT_CACHE_ROOT_SESSION_ENV = 'DOOMPI_PROMPT_CACHE_ROOT_SESSION';\nexport const DOOMPI_PROMPT_CACHE_CHILD_PROJECTION_ENV = 'DOOMPI_PROMPT_CACHE_CHILD_PROJECTION';\nexport const PI_CACHE_RETENTION_ENV = 'PI_CACHE_RETENTION';\nexport const PI_CACHE_RETENTION_LONG = 'long';\n","import { getHarnessState } from '@agimon-ai/doompi-config/harnessStore';\nimport { connectDoomCordisHost } from '@agimon-ai/doompi-extension-contracts/cordis-host';\nimport { DOOM_HELP_SERVICE, requireDoomHelpService } from '@agimon-ai/doompi-extension-contracts/help';\nimport {\n DOOM_MINOR_MODE_CATALOG_SERVICE,\n readMinorModeCatalog,\n type MinorModeRecord,\n} from '@agimon-ai/doompi-extension-contracts/mode';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext } from '@earendil-works/pi-coding-agent';\nimport { registerCacheCommand } from '../../commands/doomCacheCommand.ts';\nimport { createCacheContainer } from '../../container/index.ts';\nimport { OwnedEnvironmentValue } from '../node/environment.ts';\nimport { sha256Base64Url } from '../node/digest.ts';\nimport { PromptCacheTelemetryService } from '../../providers/promptCacheTelemetry.ts';\nimport {\n createParentPromptCacheNamespace,\n createPromptCacheKey,\n createPromptCacheModelFingerprint,\n createRootSessionIdentity,\n} from '../../services/namespace.ts';\nimport { optimizerAllowsPromptCacheKey } from '../../services/optimizerPolicy.ts';\nimport {\n classifyPromptCacheCapability,\n requestedPromptCacheRetention,\n rewritePromptCacheKey,\n} from '../../services/providerPolicy.ts';\nimport { normalizePromptCacheUsage } from '../../services/promptCacheUsage.ts';\nimport type { PromptCacheMinorModeState, PromptCacheModelIdentity } from '../../types/cache.ts';\nimport {\n DOOMPI_PROMPT_CACHE_CHILD_PROJECTION_ENV,\n DOOMPI_PROMPT_CACHE_PARENT_NAMESPACE_ENV,\n DOOMPI_PROMPT_CACHE_ROOT_SESSION_ENV,\n PI_CACHE_RETENTION_ENV,\n PI_CACHE_RETENTION_LONG,\n} from '../../types/environment.ts';\nimport type { CacheExtensionDependencies } from '../../types/extension.ts';\n\nconst PACKAGE_SOURCE = '@agimon-ai/doompi-cache';\nconst KEY_SUFFIX_LENGTH = 8;\n\ntype BeforeProviderEvent = { readonly payload?: unknown };\ntype MessageEndEvent = { readonly message?: unknown };\ntype MinorModeStateWithVariant = MinorModeRecord['state'] & { readonly modelContextVariant?: string };\ntype OptimizerModule = typeof import('#doompi-cache-optimizer-source');\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nfunction recordValue(value: unknown): Readonly<Record<string, unknown>> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Readonly<Record<string, unknown>>)\n : undefined;\n}\n\nfunction minorModeState(record: MinorModeRecord): PromptCacheMinorModeState {\n const state = record.state as MinorModeStateWithVariant;\n return {\n source: record.descriptor.source,\n id: record.descriptor.id,\n activation: state.activation,\n ...(state.modelContextVariant ? { modelContextVariant: state.modelContextVariant } : {}),\n };\n}\n\nfunction modelIdentity(ctx: ExtensionContext, payload: unknown): PromptCacheModelIdentity {\n const model = recordValue(ctx.model);\n const request = recordValue(payload);\n return {\n virtualProvider: stringValue(model?.provider),\n virtualModel: stringValue(model?.id),\n api: stringValue(model?.api),\n baseUrl: stringValue(model?.baseUrl),\n wireModel: stringValue(request?.model),\n };\n}\n\nfunction isErrorMessage(message: unknown): boolean {\n const record = recordValue(message);\n return record?.stopReason === 'error' || record?.stopReason === 'aborted';\n}\n\nfunction requestedRetention(payload: unknown): string | undefined {\n return (\n requestedPromptCacheRetention(payload) ??\n (process.env[PI_CACHE_RETENTION_ENV] === PI_CACHE_RETENTION_LONG ? PI_CACHE_RETENTION_LONG : undefined)\n );\n}\n\nfunction installCacheRuntime(\n cordis: Context,\n pi: ExtensionAPI,\n dependencies: CacheExtensionDependencies,\n optimizer: OptimizerModule,\n): () => void {\n const parentNamespaceEnvironment = new OwnedEnvironmentValue(DOOMPI_PROMPT_CACHE_PARENT_NAMESPACE_ENV);\n const rootSessionEnvironment = new OwnedEnvironmentValue(DOOMPI_PROMPT_CACHE_ROOT_SESSION_ENV);\n const projectedParentNamespace = stringValue(process.env[DOOMPI_PROMPT_CACHE_PARENT_NAMESPACE_ENV]);\n const childProjection = stringValue(process.env[DOOMPI_PROMPT_CACHE_CHILD_PROJECTION_ENV]);\n const isProjectedChild = Boolean(projectedParentNamespace && childProjection);\n let rootSessionId: string | undefined;\n let parentNamespace = projectedParentNamespace;\n let minorModes: readonly PromptCacheMinorModeState[] = [];\n\n const refreshParentNamespace = (): string | undefined => {\n if (isProjectedChild) return parentNamespace;\n if (!rootSessionId) return undefined;\n const harness = getHarnessState();\n parentNamespace = createParentPromptCacheNamespace(\n {\n rootSessionId,\n compositionFingerprint: harness.compositionFingerprint,\n majorMode: harness.majorMode,\n domains: harness.domains,\n profile: harness.profile,\n persona: harness.personaFile,\n minorModes,\n },\n sha256Base64Url,\n );\n parentNamespaceEnvironment.set(parentNamespace);\n rootSessionEnvironment.set(createRootSessionIdentity(rootSessionId, sha256Base64Url));\n return parentNamespace;\n };\n\n cordis.inject([DOOM_MINOR_MODE_CATALOG_SERVICE], (context) => {\n if (isProjectedChild) return undefined;\n const catalog = readMinorModeCatalog(context);\n if (!catalog) return undefined;\n const refreshModes = (): void => {\n minorModes = catalog.getSnapshot().modes.map(minorModeState);\n refreshParentNamespace();\n };\n refreshModes();\n return catalog.subscribe(refreshModes);\n });\n\n registerCacheCommand(pi, dependencies.telemetry);\n\n pi.on('session_start', (_event, ctx) => {\n if (!isProjectedChild) {\n rootSessionId = stringValue(ctx.sessionManager.getSessionId());\n refreshParentNamespace();\n }\n });\n\n pi.on('before_provider_request', (event: BeforeProviderEvent, ctx: ExtensionContext) => {\n const namespace = isProjectedChild ? projectedParentNamespace : refreshParentNamespace();\n if (!namespace) return undefined;\n\n const identity = modelIdentity(ctx, event.payload);\n const modelFingerprint = createPromptCacheModelFingerprint(identity, sha256Base64Url);\n const key = createPromptCacheKey(\n namespace,\n isProjectedChild ? 'child' : 'parent',\n modelFingerprint,\n sha256Base64Url,\n childProjection,\n );\n const rewritten = rewritePromptCacheKey(event.payload, identity.api, key, optimizerAllowsPromptCacheKey(optimizer));\n dependencies.telemetry.beginRequest({\n capability: classifyPromptCacheCapability(identity),\n namespace,\n modelFingerprint,\n requestedRetention: requestedRetention(rewritten ?? event.payload),\n ...(rewritten ? { keySuffix: key.slice(-KEY_SUFFIX_LENGTH) } : {}),\n });\n return rewritten;\n });\n\n pi.on('message_end', (event: MessageEndEvent) => {\n if (isErrorMessage(event.message)) return;\n const usage = normalizePromptCacheUsage(event.message);\n if (usage) dependencies.telemetry.observe(usage, dependencies.now());\n });\n\n return () => {\n parentNamespaceEnvironment.restore();\n rootSessionEnvironment.restore();\n dependencies.telemetry.reset();\n };\n}\n\ninterface CachePluginConfig {\n readonly pi: ExtensionAPI;\n readonly dependencies: CacheExtensionDependencies;\n readonly optimizer: OptimizerModule;\n}\n\nfunction cachePlugin(cordis: Context, config: CachePluginConfig): void {\n cordis.inject([DOOM_HELP_SERVICE], (helpContext) => {\n const contribution = requireDoomHelpService(helpContext).register({\n source: PACKAGE_SOURCE,\n moduleUrl: import.meta.url,\n skills: [\n {\n name: 'doompi-use-cache',\n description: 'Inspect DoomPi provider prompt cache policy, routing identity, and provider-observed usage.',\n },\n ],\n });\n return () => contribution.dispose();\n });\n cordis.effect(function* () {\n new PromptCacheTelemetryService(cordis, config.dependencies.telemetry);\n yield installCacheRuntime(cordis, config.pi, config.dependencies, config.optimizer);\n }, PACKAGE_SOURCE);\n}\n\nexport async function activateCacheExtension(\n pi: ExtensionAPI,\n dependencies: CacheExtensionDependencies = createCacheContainer(),\n): Promise<void> {\n const optimizer = await import('#doompi-cache-optimizer-source');\n if (typeof optimizer.default !== 'function')\n throw new Error('Pi Cache Optimizer does not export an extension factory.');\n await optimizer.default(pi);\n\n const connection = await connectDoomCordisHost(pi, PACKAGE_SOURCE);\n const fiber = connection.root.plugin(cachePlugin, { pi, dependencies, optimizer });\n try {\n await fiber;\n } catch (error) {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n throw error;\n }\n\n let disposal: Promise<void> | undefined;\n pi.on(\n 'session_shutdown',\n () =>\n (disposal ??= (async () => {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n })()),\n );\n}\n\nexport default activateCacheExtension;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pi.mjs","names":["#limit","#request","#observations","#environment","#name","#baseline","#ownedValue","recordValue"],"sources":["../../src/services/telemetry.ts","../../src/container/index.ts","../../src/adapters/node/environment.ts","../../src/adapters/node/digest.ts","../../src/providers/promptCacheTelemetry.ts","../../src/services/canonical.ts","../../src/services/namespace.ts","../../src/services/optimizerPolicy.ts","../../src/services/providerPolicy.ts","../../src/services/promptCacheUsage.ts","../../src/types/environment.ts","../../src/adapters/pi/extension.ts"],"sourcesContent":["import type {\n PromptCacheObservation,\n PromptCacheRequestStatus,\n PromptCacheTelemetryPort,\n PromptCacheTelemetrySnapshot,\n PromptCacheUsage,\n} from '../types/cache.ts';\n\nconst DEFAULT_OBSERVATION_LIMIT = 64;\n\nexport class PromptCacheTelemetry implements PromptCacheTelemetryPort {\n readonly #limit: number;\n #request: PromptCacheRequestStatus = { capability: 'unknown' };\n #observations: PromptCacheObservation[] = [];\n\n constructor(limit: number = DEFAULT_OBSERVATION_LIMIT) {\n if (!Number.isInteger(limit) || limit < 1)\n throw new Error('Prompt cache telemetry limit must be a positive integer.');\n this.#limit = limit;\n }\n\n beginRequest(status: PromptCacheRequestStatus): void {\n this.#request = { ...status };\n }\n\n observe(usage: PromptCacheUsage, observedAt: number): void {\n const namespace = this.#request.namespace;\n const modelFingerprint = this.#request.modelFingerprint;\n if (!namespace || !modelFingerprint) return;\n\n this.#observations.push({\n namespace,\n modelFingerprint,\n cacheRead: usage.cacheRead,\n cacheWrite: usage.cacheWrite,\n totalInput: usage.totalInput,\n observedAt,\n });\n if (this.#observations.length > this.#limit) {\n this.#observations.splice(0, this.#observations.length - this.#limit);\n }\n }\n\n snapshot(): PromptCacheTelemetrySnapshot {\n const observations = [...this.#observations];\n return {\n ...this.#request,\n residency: 'unknown',\n observations,\n ...(observations.length > 0 ? { lastObservation: observations.at(-1) } : {}),\n };\n }\n\n reset(): void {\n this.#request = { capability: 'unknown' };\n this.#observations = [];\n }\n}\n","import { PromptCacheTelemetry } from '../services/telemetry.ts';\nimport type { CacheExtensionDependencies } from '../types/extension.ts';\n\nexport function createCacheContainer(overrides: Partial<CacheExtensionDependencies> = {}): CacheExtensionDependencies {\n return {\n telemetry: overrides.telemetry ?? new PromptCacheTelemetry(),\n now: overrides.now ?? Date.now,\n };\n}\n","interface EnvironmentSnapshot {\n readonly present: boolean;\n readonly value?: string;\n}\n\nexport class OwnedEnvironmentValue {\n readonly #environment: NodeJS.ProcessEnv;\n readonly #name: string;\n readonly #baseline: EnvironmentSnapshot;\n #ownedValue?: string;\n\n constructor(name: string, environment: NodeJS.ProcessEnv = process.env) {\n this.#name = name;\n this.#environment = environment;\n this.#baseline = {\n present: Object.hasOwn(environment, name),\n value: environment[name],\n };\n }\n\n set(value: string): void {\n this.#environment[this.#name] = value;\n this.#ownedValue = value;\n }\n\n restore(): void {\n if (this.#ownedValue === undefined || this.#environment[this.#name] !== this.#ownedValue) return;\n if (this.#baseline.present) this.#environment[this.#name] = this.#baseline.value;\n else delete this.#environment[this.#name];\n this.#ownedValue = undefined;\n }\n}\n","import { createHash } from 'node:crypto';\n\nexport function sha256Base64Url(value: string): string {\n return createHash('sha256').update(value).digest('base64url');\n}\n","import { type Context, Service } from '@deepseek-ai/cordis';\nimport type { PromptCacheTelemetryPort, PromptCacheTelemetrySnapshot } from '../types/cache.ts';\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","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","import type {\n PromptCacheChildProjection,\n PromptCacheDigest,\n PromptCacheMinorModeState,\n PromptCacheModelIdentity,\n PromptCacheParentState,\n} from '../types/cache.ts';\nimport { canonicalJson } from './canonical.ts';\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","export interface PromptCacheOptimizerRuntime {\n readonly __internals_for_tests?: {\n readonly isRuntimeOptimizerEnabled?: () => boolean;\n readonly shouldInjectOpenAIPromptCacheKey?: () => boolean;\n };\n}\n\n/** Fail closed unless the pinned optimizer confirms both runtime and key routing are enabled. */\nexport function optimizerAllowsPromptCacheKey(optimizer: PromptCacheOptimizerRuntime): boolean {\n const internals = optimizer.__internals_for_tests;\n return (\n typeof internals?.isRuntimeOptimizerEnabled === 'function' &&\n typeof internals.shouldInjectOpenAIPromptCacheKey === 'function' &&\n internals.isRuntimeOptimizerEnabled() &&\n internals.shouldInjectOpenAIPromptCacheKey()\n );\n}\n","import type { PromptCacheCapabilityClass, PromptCacheModelIdentity } from '../types/cache.ts';\n\nconst ROUTING_KEY_APIS = new Set([\n 'openai-completions',\n 'openai-responses',\n 'openai-codex-responses',\n 'azure-openai-responses',\n]);\n\nconst MARKER_APIS = new Set(['anthropic-messages', 'bedrock-converse-stream']);\nconst AUTOMATIC_APIS = new Set(['google-generative-ai', 'google-vertex', 'google-vertex-anthropic']);\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function classifyPromptCacheCapability(model: PromptCacheModelIdentity): PromptCacheCapabilityClass {\n if (model.api === 'openai-responses' || model.api === 'openai-completions') {\n return model.virtualProvider === 'openai' ? 'key-and-long-retention' : 'key-only';\n }\n if (model.api && ROUTING_KEY_APIS.has(model.api)) return 'key-only';\n if (model.api && MARKER_APIS.has(model.api)) return 'marker-only';\n if (model.api && AUTOMATIC_APIS.has(model.api)) return 'automatic';\n return 'unknown';\n}\n\nexport function rewritePromptCacheKey(\n payload: unknown,\n api: string | undefined,\n key: string,\n enabled: boolean,\n): Record<string, unknown> | undefined {\n if (!enabled || !api || !ROUTING_KEY_APIS.has(api) || !isRecord(payload)) return undefined;\n const current = payload.prompt_cache_key;\n if (typeof current !== 'string' || !current.trim() || current === key) return undefined;\n return { ...payload, prompt_cache_key: key };\n}\n\nexport function requestedPromptCacheRetention(payload: unknown): string | undefined {\n if (!isRecord(payload)) return undefined;\n const retention = payload.prompt_cache_retention;\n return typeof retention === 'string' && retention.trim() ? retention.trim() : undefined;\n}\n","import type { PromptCacheUsage } from '../types/cache.ts';\n\nfunction recordValue(value: unknown): Readonly<Record<string, unknown>> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Readonly<Record<string, unknown>>)\n : undefined;\n}\n\nfunction nonNegativeNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : undefined;\n}\n\nfunction firstNumber(...values: readonly unknown[]): number | undefined {\n for (const value of values) {\n const number = nonNegativeNumber(value);\n if (number !== undefined) return number;\n }\n return undefined;\n}\n\nfunction normalizedUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const cacheRead = nonNegativeNumber(usage.cacheRead);\n const cacheWrite = nonNegativeNumber(usage.cacheWrite);\n if (cacheRead === undefined && cacheWrite === undefined) return undefined;\n const input = nonNegativeNumber(usage.input) ?? 0;\n return {\n cacheRead: cacheRead ?? 0,\n cacheWrite: cacheWrite ?? 0,\n totalInput: input + (cacheRead ?? 0) + (cacheWrite ?? 0),\n };\n}\n\nfunction openAiUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const promptDetails = recordValue(usage.prompt_tokens_details) ?? recordValue(usage.promptTokensDetails);\n const inputDetails = recordValue(usage.input_tokens_details) ?? recordValue(usage.inputTokensDetails);\n const cacheRead = firstNumber(\n promptDetails?.cached_tokens,\n promptDetails?.cachedTokens,\n inputDetails?.cached_tokens,\n inputDetails?.cachedTokens,\n );\n const cacheWrite = firstNumber(\n promptDetails?.cache_write_tokens,\n promptDetails?.cacheWriteTokens,\n inputDetails?.cache_write_tokens,\n inputDetails?.cacheWriteTokens,\n );\n if (cacheRead === undefined && cacheWrite === undefined) return undefined;\n const floor = (cacheRead ?? 0) + (cacheWrite ?? 0);\n const reportedTotal = firstNumber(usage.prompt_tokens, usage.promptTokens, usage.input_tokens, usage.inputTokens);\n return {\n cacheRead: cacheRead ?? 0,\n cacheWrite: cacheWrite ?? 0,\n totalInput: Math.max(reportedTotal ?? floor, floor),\n };\n}\n\nfunction anthropicUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const cacheRead = firstNumber(usage.cache_read_input_tokens, usage.cacheReadInputTokens);\n const cacheWrite = firstNumber(usage.cache_creation_input_tokens, usage.cacheCreationInputTokens);\n if (cacheRead === undefined && cacheWrite === undefined) return undefined;\n const input = firstNumber(usage.input_tokens, usage.inputTokens) ?? 0;\n return {\n cacheRead: cacheRead ?? 0,\n cacheWrite: cacheWrite ?? 0,\n totalInput: input + (cacheRead ?? 0) + (cacheWrite ?? 0),\n };\n}\n\nfunction geminiUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const metadata = recordValue(usage.usage_metadata) ?? recordValue(usage.usageMetadata) ?? usage;\n const cacheRead = firstNumber(metadata.cachedContentTokenCount, metadata.cached_content_token_count);\n if (cacheRead === undefined) return undefined;\n const totalInput = firstNumber(\n metadata.promptTokenCount,\n metadata.prompt_token_count,\n usage.input_tokens,\n usage.inputTokens,\n usage.prompt_tokens,\n usage.promptTokens,\n );\n return { cacheRead, cacheWrite: 0, totalInput: Math.max(totalInput ?? cacheRead, cacheRead) };\n}\n\n/** Normalize only usage values carried by a provider-produced assistant message. */\nexport function normalizePromptCacheUsage(message: unknown): PromptCacheUsage | undefined {\n const messageRecord = recordValue(message);\n const usage = recordValue(messageRecord?.usage);\n if (!usage) return undefined;\n return normalizedUsage(usage) ?? openAiUsage(usage) ?? anthropicUsage(usage) ?? geminiUsage(usage);\n}\n","export const DOOMPI_PROMPT_CACHE_PARENT_NAMESPACE_ENV = 'DOOMPI_PROMPT_CACHE_PARENT_NAMESPACE';\nexport const DOOMPI_PROMPT_CACHE_ROOT_SESSION_ENV = 'DOOMPI_PROMPT_CACHE_ROOT_SESSION';\nexport const DOOMPI_PROMPT_CACHE_CHILD_PROJECTION_ENV = 'DOOMPI_PROMPT_CACHE_CHILD_PROJECTION';\nexport const PI_CACHE_RETENTION_ENV = 'PI_CACHE_RETENTION';\nexport const PI_CACHE_RETENTION_LONG = 'long';\n","import { getHarnessState } from '@agimon-ai/doompi-config/harnessStore';\nimport { connectDoomCordisHost } from '@agimon-ai/doompi-extension-contracts/cordis-host';\nimport { DOOM_HELP_SERVICE, requireDoomHelpService } from '@agimon-ai/doompi-extension-contracts/help';\nimport {\n DOOM_MINOR_MODE_CATALOG_SERVICE,\n readMinorModeCatalog,\n type MinorModeRecord,\n} from '@agimon-ai/doompi-extension-contracts/mode';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext } from '@earendil-works/pi-coding-agent';\nimport { createCacheContainer } from '../../container/index.ts';\nimport { OwnedEnvironmentValue } from '../node/environment.ts';\nimport { sha256Base64Url } from '../node/digest.ts';\nimport { PromptCacheTelemetryService } from '../../providers/promptCacheTelemetry.ts';\nimport {\n createParentPromptCacheNamespace,\n createPromptCacheKey,\n createPromptCacheModelFingerprint,\n createRootSessionIdentity,\n} from '../../services/namespace.ts';\nimport { optimizerAllowsPromptCacheKey } from '../../services/optimizerPolicy.ts';\nimport {\n classifyPromptCacheCapability,\n requestedPromptCacheRetention,\n rewritePromptCacheKey,\n} from '../../services/providerPolicy.ts';\nimport { normalizePromptCacheUsage } from '../../services/promptCacheUsage.ts';\nimport type { PromptCacheMinorModeState, PromptCacheModelIdentity } from '../../types/cache.ts';\nimport {\n DOOMPI_PROMPT_CACHE_CHILD_PROJECTION_ENV,\n DOOMPI_PROMPT_CACHE_PARENT_NAMESPACE_ENV,\n DOOMPI_PROMPT_CACHE_ROOT_SESSION_ENV,\n PI_CACHE_RETENTION_ENV,\n PI_CACHE_RETENTION_LONG,\n} from '../../types/environment.ts';\nimport type { CacheExtensionDependencies } from '../../types/extension.ts';\n\nconst PACKAGE_SOURCE = '@agimon-ai/doompi-cache';\nconst KEY_SUFFIX_LENGTH = 8;\n\ntype BeforeProviderEvent = { readonly payload?: unknown };\ntype MessageEndEvent = { readonly message?: unknown };\ntype MinorModeStateWithVariant = MinorModeRecord['state'] & { readonly modelContextVariant?: string };\ntype OptimizerModule = typeof import('#doompi-cache-optimizer-source');\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nfunction recordValue(value: unknown): Readonly<Record<string, unknown>> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Readonly<Record<string, unknown>>)\n : undefined;\n}\n\nfunction minorModeState(record: MinorModeRecord): PromptCacheMinorModeState {\n const state = record.state as MinorModeStateWithVariant;\n return {\n source: record.descriptor.source,\n id: record.descriptor.id,\n activation: state.activation,\n ...(state.modelContextVariant ? { modelContextVariant: state.modelContextVariant } : {}),\n };\n}\n\nfunction modelIdentity(ctx: ExtensionContext, payload: unknown): PromptCacheModelIdentity {\n const model = recordValue(ctx.model);\n const request = recordValue(payload);\n return {\n virtualProvider: stringValue(model?.provider),\n virtualModel: stringValue(model?.id),\n api: stringValue(model?.api),\n baseUrl: stringValue(model?.baseUrl),\n wireModel: stringValue(request?.model),\n };\n}\n\nfunction isErrorMessage(message: unknown): boolean {\n const record = recordValue(message);\n return record?.stopReason === 'error' || record?.stopReason === 'aborted';\n}\n\nfunction requestedRetention(payload: unknown): string | undefined {\n return (\n requestedPromptCacheRetention(payload) ??\n (process.env[PI_CACHE_RETENTION_ENV] === PI_CACHE_RETENTION_LONG ? PI_CACHE_RETENTION_LONG : undefined)\n );\n}\n\nfunction installCacheRuntime(\n cordis: Context,\n pi: ExtensionAPI,\n dependencies: CacheExtensionDependencies,\n optimizer: OptimizerModule,\n): () => void {\n const parentNamespaceEnvironment = new OwnedEnvironmentValue(DOOMPI_PROMPT_CACHE_PARENT_NAMESPACE_ENV);\n const rootSessionEnvironment = new OwnedEnvironmentValue(DOOMPI_PROMPT_CACHE_ROOT_SESSION_ENV);\n const projectedParentNamespace = stringValue(process.env[DOOMPI_PROMPT_CACHE_PARENT_NAMESPACE_ENV]);\n const childProjection = stringValue(process.env[DOOMPI_PROMPT_CACHE_CHILD_PROJECTION_ENV]);\n const isProjectedChild = Boolean(projectedParentNamespace && childProjection);\n let rootSessionId: string | undefined;\n let parentNamespace = projectedParentNamespace;\n let minorModes: readonly PromptCacheMinorModeState[] = [];\n\n const refreshParentNamespace = (): string | undefined => {\n if (isProjectedChild) return parentNamespace;\n if (!rootSessionId) return undefined;\n const harness = getHarnessState();\n parentNamespace = createParentPromptCacheNamespace(\n {\n rootSessionId,\n compositionFingerprint: harness.compositionFingerprint,\n majorMode: harness.majorMode,\n domains: harness.domains,\n profile: harness.profile,\n persona: harness.personaFile,\n minorModes,\n },\n sha256Base64Url,\n );\n parentNamespaceEnvironment.set(parentNamespace);\n rootSessionEnvironment.set(createRootSessionIdentity(rootSessionId, sha256Base64Url));\n return parentNamespace;\n };\n\n cordis.inject([DOOM_MINOR_MODE_CATALOG_SERVICE], (context) => {\n if (isProjectedChild) return undefined;\n const catalog = readMinorModeCatalog(context);\n if (!catalog) return undefined;\n const refreshModes = (): void => {\n minorModes = catalog.getSnapshot().modes.map(minorModeState);\n refreshParentNamespace();\n };\n refreshModes();\n return catalog.subscribe(refreshModes);\n });\n\n pi.on('session_start', (_event, ctx) => {\n if (!isProjectedChild) {\n rootSessionId = stringValue(ctx.sessionManager.getSessionId());\n refreshParentNamespace();\n }\n });\n\n pi.on('before_provider_request', (event: BeforeProviderEvent, ctx: ExtensionContext) => {\n const namespace = isProjectedChild ? projectedParentNamespace : refreshParentNamespace();\n if (!namespace) return undefined;\n\n const identity = modelIdentity(ctx, event.payload);\n const modelFingerprint = createPromptCacheModelFingerprint(identity, sha256Base64Url);\n const key = createPromptCacheKey(\n namespace,\n isProjectedChild ? 'child' : 'parent',\n modelFingerprint,\n sha256Base64Url,\n childProjection,\n );\n const rewritten = rewritePromptCacheKey(event.payload, identity.api, key, optimizerAllowsPromptCacheKey(optimizer));\n dependencies.telemetry.beginRequest({\n capability: classifyPromptCacheCapability(identity),\n namespace,\n modelFingerprint,\n requestedRetention: requestedRetention(rewritten ?? event.payload),\n ...(rewritten ? { keySuffix: key.slice(-KEY_SUFFIX_LENGTH) } : {}),\n });\n return rewritten;\n });\n\n pi.on('message_end', (event: MessageEndEvent) => {\n if (isErrorMessage(event.message)) return;\n const usage = normalizePromptCacheUsage(event.message);\n if (usage) dependencies.telemetry.observe(usage, dependencies.now());\n });\n\n return () => {\n parentNamespaceEnvironment.restore();\n rootSessionEnvironment.restore();\n dependencies.telemetry.reset();\n };\n}\n\ninterface CachePluginConfig {\n readonly pi: ExtensionAPI;\n readonly dependencies: CacheExtensionDependencies;\n readonly optimizer: OptimizerModule;\n}\n\nfunction cachePlugin(cordis: Context, config: CachePluginConfig): void {\n cordis.inject([DOOM_HELP_SERVICE], (helpContext) => {\n const contribution = requireDoomHelpService(helpContext).register({\n source: PACKAGE_SOURCE,\n moduleUrl: import.meta.url,\n skills: [\n {\n name: 'doompi-use-cache',\n description: 'Inspect DoomPi provider prompt cache policy, routing identity, and provider-observed usage.',\n },\n ],\n });\n return () => contribution.dispose();\n });\n cordis.effect(function* () {\n new PromptCacheTelemetryService(cordis, config.dependencies.telemetry);\n yield installCacheRuntime(cordis, config.pi, config.dependencies, config.optimizer);\n }, PACKAGE_SOURCE);\n}\n\nexport async function activateCacheExtension(\n pi: ExtensionAPI,\n dependencies: CacheExtensionDependencies = createCacheContainer(),\n): Promise<void> {\n const optimizer = await import('#doompi-cache-optimizer-source');\n if (typeof optimizer.default !== 'function')\n throw new Error('Pi Cache Optimizer does not export an extension factory.');\n await optimizer.default(pi);\n\n const connection = await connectDoomCordisHost(pi, PACKAGE_SOURCE);\n const fiber = connection.root.plugin(cachePlugin, { pi, dependencies, optimizer });\n try {\n await fiber;\n } catch (error) {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n throw error;\n }\n\n let disposal: Promise<void> | undefined;\n pi.on(\n 'session_shutdown',\n () =>\n (disposal ??= (async () => {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n })()),\n );\n}\n\nexport default activateCacheExtension;\n"],"mappings":"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"}
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./adapters/node/digest.cjs"),t=require("./providers/promptCacheTelemetry.cjs"),n=require("./services/canonical.cjs"),r=require("./services/namespace.cjs"),i=require("./services/providerPolicy.cjs"),a=require("./services/
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./adapters/node/digest.cjs"),t=require("./providers/promptCacheTelemetry.cjs"),n=require("./services/canonical.cjs"),r=require("./services/namespace.cjs"),i=require("./services/providerPolicy.cjs"),a=require("./services/telemetry.cjs");exports.DOOM_PROMPT_CACHE_TELEMETRY_SERVICE=t.DOOM_PROMPT_CACHE_TELEMETRY_SERVICE,exports.PromptCacheTelemetry=a.PromptCacheTelemetry,exports.PromptCacheTelemetryService=t.PromptCacheTelemetryService,exports.canonicalJson=n.canonicalJson,exports.canonicalValue=n.canonicalValue,exports.classifyPromptCacheCapability=i.classifyPromptCacheCapability,exports.createChildPromptCacheProjection=r.createChildPromptCacheProjection,exports.createParentPromptCacheNamespace=r.createParentPromptCacheNamespace,exports.createPromptCacheKey=r.createPromptCacheKey,exports.createPromptCacheModelFingerprint=r.createPromptCacheModelFingerprint,exports.createRootSessionIdentity=r.createRootSessionIdentity,exports.readPromptCacheTelemetry=t.readPromptCacheTelemetry,exports.requestedPromptCacheRetention=i.requestedPromptCacheRetention,exports.rewritePromptCacheKey=i.rewritePromptCacheKey,exports.sha256Base64Url=e.sha256Base64Url;
|
package/dist/index.d.cts
CHANGED
|
@@ -4,6 +4,5 @@ import { DOOM_PROMPT_CACHE_TELEMETRY_SERVICE, PromptCacheTelemetryService, readP
|
|
|
4
4
|
import { CanonicalObject, CanonicalValue, canonicalJson, canonicalValue } from "./services/canonical.cjs";
|
|
5
5
|
import { createChildPromptCacheProjection, createParentPromptCacheNamespace, createPromptCacheKey, createPromptCacheModelFingerprint, createRootSessionIdentity } from "./services/namespace.cjs";
|
|
6
6
|
import { classifyPromptCacheCapability, requestedPromptCacheRetention, rewritePromptCacheKey } from "./services/providerPolicy.cjs";
|
|
7
|
-
import { formatPromptCacheStatus } from "./services/status.cjs";
|
|
8
7
|
import { PromptCacheTelemetry } from "./services/telemetry.cjs";
|
|
9
|
-
export { type CanonicalObject, type CanonicalValue, DOOM_PROMPT_CACHE_TELEMETRY_SERVICE, type PromptCacheCapabilityClass, type PromptCacheChildProjection, type PromptCacheDigest, type PromptCacheMinorModeState, type PromptCacheModelIdentity, type PromptCacheObservation, type PromptCacheParentState, type PromptCacheRequestStatus, PromptCacheTelemetry, type PromptCacheTelemetryPort, PromptCacheTelemetryService, type PromptCacheTelemetrySnapshot, type PromptCacheUsage, canonicalJson, canonicalValue, classifyPromptCacheCapability, createChildPromptCacheProjection, createParentPromptCacheNamespace, createPromptCacheKey, createPromptCacheModelFingerprint, createRootSessionIdentity,
|
|
8
|
+
export { type CanonicalObject, type CanonicalValue, DOOM_PROMPT_CACHE_TELEMETRY_SERVICE, type PromptCacheCapabilityClass, type PromptCacheChildProjection, type PromptCacheDigest, type PromptCacheMinorModeState, type PromptCacheModelIdentity, type PromptCacheObservation, type PromptCacheParentState, type PromptCacheRequestStatus, PromptCacheTelemetry, type PromptCacheTelemetryPort, PromptCacheTelemetryService, type PromptCacheTelemetrySnapshot, type PromptCacheUsage, canonicalJson, canonicalValue, classifyPromptCacheCapability, createChildPromptCacheProjection, createParentPromptCacheNamespace, createPromptCacheKey, createPromptCacheModelFingerprint, createRootSessionIdentity, readPromptCacheTelemetry, requestedPromptCacheRetention, rewritePromptCacheKey, sha256Base64Url };
|