@agimon-ai/doompi-cache 0.0.1-alpha.46 → 0.0.1-alpha.48
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{src/schemas/apiContracts.cjs → apiContracts.cjs} +5 -1
- package/dist/apiContracts.cjs.map +1 -0
- package/dist/{src/schemas/apiContracts.d.mts.map → apiContracts.d.mts.map} +1 -1
- package/dist/{src/schemas/apiContracts.mjs → apiContracts.mjs} +1 -1
- package/dist/apiContracts.mjs.map +1 -0
- package/dist/extensions/mcp.cjs +5 -5
- package/dist/extensions/mcp.cjs.map +1 -1
- package/dist/extensions/mcp.d.mts +1 -1
- package/dist/extensions/mcp.d.mts.map +1 -1
- package/dist/extensions/mcp.mjs +2 -2
- package/dist/extensions/mcp.mjs.map +1 -1
- package/dist/extensions/pi.cjs +7 -7
- package/dist/extensions/pi.cjs.map +1 -1
- package/dist/extensions/pi.d.mts +1 -1
- package/dist/extensions/pi.d.mts.map +1 -1
- package/dist/extensions/pi.mjs +3 -3
- package/dist/extensions/pi.mjs.map +1 -1
- package/dist/extensions/server.cjs +2 -2
- package/dist/extensions/server.cjs.map +1 -1
- package/dist/extensions/server.d.mts +1 -1
- package/dist/extensions/server.d.mts.map +1 -1
- package/dist/extensions/server.mjs +1 -1
- package/dist/extensions/server.mjs.map +1 -1
- package/dist/index.cjs +19 -19
- package/dist/index.mjs +2 -2
- package/dist/{pi-cache-optimizer-DjqO0Quf.mjs → pi-cache-optimizer-CZiEEQG9.mjs} +2 -2
- package/dist/pi-cache-optimizer-CZiEEQG9.mjs.map +1 -0
- package/dist/{pi-cache-optimizer-wNhYQVri.cjs → pi-cache-optimizer-atA1RVPZ.cjs} +2 -2
- package/dist/pi-cache-optimizer-atA1RVPZ.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/cacheHooks.cjs +5 -5
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/cacheHooks.cjs.map +1 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/cacheHooks.mjs +1 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/before-provider-request.server.cjs +1 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/before-provider-request.server.cjs.map +1 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/before-provider-request.server.mjs +1 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/before-provider-request.server.mjs.map +1 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.cjs +1 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.cjs.map +1 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.mjs +1 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.mjs.map +1 -1
- package/package.json +9 -9
- package/dist/api-contracts.cjs +0 -7
- package/dist/api-contracts.d.cts +0 -2
- package/dist/api-contracts.d.mts +0 -2
- package/dist/api-contracts.mjs +0 -2
- package/dist/env.d.cts +0 -2
- package/dist/extensions/mcp.d.cts +0 -5
- package/dist/extensions/mcp.d.cts.map +0 -1
- package/dist/extensions/pi.d.cts +0 -42
- package/dist/extensions/pi.d.cts.map +0 -1
- package/dist/extensions/server.d.cts +0 -5
- package/dist/extensions/server.d.cts.map +0 -1
- package/dist/index.d.cts +0 -8
- package/dist/pi-cache-optimizer-DjqO0Quf.mjs.map +0 -1
- package/dist/pi-cache-optimizer-wNhYQVri.cjs.map +0 -1
- package/dist/src/constants/environment.d.cts +0 -8
- package/dist/src/constants/environment.d.cts.map +0 -1
- package/dist/src/models/promptCacheTelemetry.d.cts +0 -12
- package/dist/src/models/promptCacheTelemetry.d.cts.map +0 -1
- package/dist/src/schemas/apiContracts.cjs.map +0 -1
- package/dist/src/schemas/apiContracts.d.cts +0 -53
- package/dist/src/schemas/apiContracts.d.cts.map +0 -1
- package/dist/src/schemas/apiContracts.mjs.map +0 -1
- package/dist/src/services/canonical/index.d.cts +0 -9
- package/dist/src/services/canonical/index.d.cts.map +0 -1
- package/dist/src/services/digest/index.d.cts +0 -4
- package/dist/src/services/digest/index.d.cts.map +0 -1
- package/dist/src/services/namespace/index.d.cts +0 -9
- package/dist/src/services/namespace/index.d.cts.map +0 -1
- package/dist/src/services/promptCacheTelemetry/index.d.cts +0 -17
- package/dist/src/services/promptCacheTelemetry/index.d.cts.map +0 -1
- package/dist/src/services/providerPolicy/index.d.cts +0 -7
- package/dist/src/services/providerPolicy/index.d.cts.map +0 -1
- package/dist/src/types/cache.d.cts +0 -67
- package/dist/src/types/cache.d.cts.map +0 -1
- /package/dist/{src/schemas/apiContracts.d.mts → apiContracts.d.mts} +0 -0
|
@@ -1,6 +1,10 @@
|
|
|
1
|
+
Object.defineProperties(exports, {
|
|
2
|
+
__esModule: { value: true },
|
|
3
|
+
[Symbol.toStringTag]: { value: "Module" }
|
|
4
|
+
});
|
|
1
5
|
//#region src/schemas/apiContracts.ts
|
|
2
6
|
/** This facet contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */
|
|
3
|
-
const apiContracts = (0, require("@agimon-ai/doompi-core/
|
|
7
|
+
const apiContracts = (0, require("@agimon-ai/doompi-core/apiContracts").defineApiContract)({
|
|
4
8
|
version: 1,
|
|
5
9
|
http: [],
|
|
6
10
|
sockets: [],
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiContracts.cjs","names":["defineApiContract"],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract } from '@agimon-ai/doompi-core/apiContracts';\n\n/** This facet contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */\nexport const apiContracts = defineApiContract({ version: 1, http: [], sockets: [], dynamic: [] });\nexport default apiContracts;\n"],"mappings":";;;;;;AAGA,MAAa,gBAAA,gDAAeA,CAAAA,CAAAA,kBAAAA,CAAkB;CAAE,SAAS;CAAG,MAAM,CAAC;CAAG,SAAS,CAAC;CAAG,SAAS,CAAC;AAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiContracts.d.mts","names":[],"sources":["
|
|
1
|
+
{"version":3,"file":"apiContracts.d.mts","names":[],"sources":["../src/schemas/apiContracts.ts"],"mappings":";;qBAGa"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { defineApiContract } from "@agimon-ai/doompi-core/
|
|
1
|
+
import { defineApiContract } from "@agimon-ai/doompi-core/apiContracts";
|
|
2
2
|
//#region src/schemas/apiContracts.ts
|
|
3
3
|
/** This facet contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */
|
|
4
4
|
const apiContracts = defineApiContract({
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiContracts.mjs","names":[],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract } from '@agimon-ai/doompi-core/apiContracts';\n\n/** This facet contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */\nexport const apiContracts = defineApiContract({ version: 1, http: [], sockets: [], dynamic: [] });\nexport default apiContracts;\n"],"mappings":";;;AAGA,MAAa,eAAe,kBAAkB;CAAE,SAAS;CAAG,MAAM,CAAC;CAAG,SAAS,CAAC;CAAG,SAAS,CAAC;AAAE,CAAC"}
|
package/dist/extensions/mcp.cjs
CHANGED
|
@@ -2,18 +2,18 @@ Object.defineProperties(exports, {
|
|
|
2
2
|
__esModule: { value: true },
|
|
3
3
|
[Symbol.toStringTag]: { value: "Module" }
|
|
4
4
|
});
|
|
5
|
-
let
|
|
6
|
-
let
|
|
5
|
+
let _agimon_ai_doompi_core_mcpFacet = require("@agimon-ai/doompi-core/mcpFacet");
|
|
6
|
+
let _agimon_ai_doompi_core_serverFacet = require("@agimon-ai/doompi-core/serverFacet");
|
|
7
7
|
//#region src/extensions/workspaces/sessions/(backend)/skill/doompi-use-cache.mcp.ts
|
|
8
|
-
var doompi_use_cache_mcp_default = (0,
|
|
8
|
+
var doompi_use_cache_mcp_default = (0, _agimon_ai_doompi_core_mcpFacet.defineMcpSkill)({
|
|
9
9
|
name: "doompi-use-cache",
|
|
10
10
|
description: "Inspect DoomPi provider prompt cache policy, routing identity, and provider-observed usage.",
|
|
11
|
-
read: () => (0,
|
|
11
|
+
read: () => (0, _agimon_ai_doompi_core_serverFacet.readPackageResource)(require("url").pathToFileURL(__filename).href, "src/prompts/doompi-use-cache/SKILL.md")
|
|
12
12
|
});
|
|
13
13
|
//#endregion
|
|
14
14
|
//#region generated/mcp.ts
|
|
15
15
|
const at = (value, context) => typeof value === "function" ? value(context) : value;
|
|
16
|
-
const mcp = (0,
|
|
16
|
+
const mcp = (0, _agimon_ai_doompi_core_mcpFacet.defineMcpPlugin)({
|
|
17
17
|
name: "@agimon-ai/doompi-cache",
|
|
18
18
|
session: (context) => ({ get skills() {
|
|
19
19
|
return [at(doompi_use_cache_mcp_default, context)];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.cjs","names":["defineMcpSkill","readPackageResource","defineMcpPlugin","skillDoompiUseCache"],"sources":["../../src/extensions/workspaces/sessions/(backend)/skill/doompi-use-cache.mcp.ts","../../generated/mcp.ts"],"sourcesContent":["import { defineMcpSkill } from '@agimon-ai/doompi-core/
|
|
1
|
+
{"version":3,"file":"mcp.cjs","names":["defineMcpSkill","readPackageResource","defineMcpPlugin","skillDoompiUseCache"],"sources":["../../src/extensions/workspaces/sessions/(backend)/skill/doompi-use-cache.mcp.ts","../../generated/mcp.ts"],"sourcesContent":["import { defineMcpSkill } from '@agimon-ai/doompi-core/mcpFacet';\nimport { readPackageResource } from '@agimon-ai/doompi-core/serverFacet';\n\nexport default defineMcpSkill({\n name: 'doompi-use-cache',\n description: 'Inspect DoomPi provider prompt cache policy, routing identity, and provider-observed usage.',\n read: () => readPackageResource(import.meta.url, 'src/prompts/doompi-use-cache/SKILL.md'),\n});\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineMcpPlugin, type DoomMcpSessionPlugin } from '@agimon-ai/doompi-core/mcpFacet';\n\nimport skillDoompiUseCache from '../src/extensions/workspaces/sessions/(backend)/skill/doompi-use-cache.mcp';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\n\nexport const mcp = defineMcpPlugin({\n name: '@agimon-ai/doompi-cache',\n session: (context) => ({\n get skills(): DoomMcpSessionPlugin['skills'] { return [at(skillDoompiUseCache, context)]; },\n }) satisfies DoomMcpSessionPlugin,\n});\n\nexport default mcp;\n"],"mappings":";;;;;;;AAGA,IAAA,gCAAA,GAAeA,gCAAAA,eAAAA,CAAe;CAC5B,MAAM;CACN,aAAa;CACb,aAAA,GAAYC,mCAAAA,oBAAAA,CAAAA,QAAAA,KAAAA,CAAAA,CAAAA,cAAAA,UAAAA,CAAAA,CAAAA,MAAqC,uCAAuC;AAC1F,CAAC;;;ACDD,MAAM,MAAY,OAA0B,YAC1C,OAAO,UAAU,aAAc,MAAwB,OAAO,IAAI;AAEpE,MAAa,OAAA,GAAMC,gCAAAA,gBAAAA,CAAgB;CACjC,MAAM;CACN,UAAU,aAAa,EACrB,IAAI,SAAyC;EAAE,OAAO,CAAC,GAAGC,8BAAqB,OAAO,CAAC;CAAG,EAC5F;AACF,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region generated/mcp.d.ts
|
|
2
|
-
export declare const mcp: import("@agimon-ai/doompi-core/
|
|
2
|
+
export declare const mcp: import("@agimon-ai/doompi-core/mcpFacet").DoomMcpPluginDefinition;
|
|
3
3
|
//#endregion
|
|
4
4
|
export { mcp as default };
|
|
5
5
|
//# sourceMappingURL=mcp.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.d.mts","names":[],"sources":["../../generated/mcp.ts"],"mappings":";qBASa
|
|
1
|
+
{"version":3,"file":"mcp.d.mts","names":[],"sources":["../../generated/mcp.ts"],"mappings":";qBASa,+CAAG"}
|
package/dist/extensions/mcp.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { defineMcpPlugin, defineMcpSkill } from "@agimon-ai/doompi-core/
|
|
2
|
-
import { readPackageResource } from "@agimon-ai/doompi-core/
|
|
1
|
+
import { defineMcpPlugin, defineMcpSkill } from "@agimon-ai/doompi-core/mcpFacet";
|
|
2
|
+
import { readPackageResource } from "@agimon-ai/doompi-core/serverFacet";
|
|
3
3
|
//#region src/extensions/workspaces/sessions/(backend)/skill/doompi-use-cache.mcp.ts
|
|
4
4
|
var doompi_use_cache_mcp_default = defineMcpSkill({
|
|
5
5
|
name: "doompi-use-cache",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.mjs","names":["skillDoompiUseCache"],"sources":["../../src/extensions/workspaces/sessions/(backend)/skill/doompi-use-cache.mcp.ts","../../generated/mcp.ts"],"sourcesContent":["import { defineMcpSkill } from '@agimon-ai/doompi-core/
|
|
1
|
+
{"version":3,"file":"mcp.mjs","names":["skillDoompiUseCache"],"sources":["../../src/extensions/workspaces/sessions/(backend)/skill/doompi-use-cache.mcp.ts","../../generated/mcp.ts"],"sourcesContent":["import { defineMcpSkill } from '@agimon-ai/doompi-core/mcpFacet';\nimport { readPackageResource } from '@agimon-ai/doompi-core/serverFacet';\n\nexport default defineMcpSkill({\n name: 'doompi-use-cache',\n description: 'Inspect DoomPi provider prompt cache policy, routing identity, and provider-observed usage.',\n read: () => readPackageResource(import.meta.url, 'src/prompts/doompi-use-cache/SKILL.md'),\n});\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineMcpPlugin, type DoomMcpSessionPlugin } from '@agimon-ai/doompi-core/mcpFacet';\n\nimport skillDoompiUseCache from '../src/extensions/workspaces/sessions/(backend)/skill/doompi-use-cache.mcp';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\n\nexport const mcp = defineMcpPlugin({\n name: '@agimon-ai/doompi-cache',\n session: (context) => ({\n get skills(): DoomMcpSessionPlugin['skills'] { return [at(skillDoompiUseCache, context)]; },\n }) satisfies DoomMcpSessionPlugin,\n});\n\nexport default mcp;\n"],"mappings":";;;AAGA,IAAA,+BAAe,eAAe;CAC5B,MAAM;CACN,aAAa;CACb,YAAY,oBAAoB,YAAY,KAAK,uCAAuC;AAC1F,CAAC;;;ACDD,MAAM,MAAY,OAA0B,YAC1C,OAAO,UAAU,aAAc,MAAwB,OAAO,IAAI;AAEpE,MAAa,MAAM,gBAAgB;CACjC,MAAM;CACN,UAAU,aAAa,EACrB,IAAI,SAAyC;EAAE,OAAO,CAAC,GAAGA,8BAAqB,OAAO,CAAC;CAAG,EAC5F;AACF,CAAC"}
|
package/dist/extensions/pi.cjs
CHANGED
|
@@ -2,8 +2,8 @@ Object.defineProperties(exports, {
|
|
|
2
2
|
__esModule: { value: true },
|
|
3
3
|
[Symbol.toStringTag]: { value: "Module" }
|
|
4
4
|
});
|
|
5
|
-
let
|
|
6
|
-
let
|
|
5
|
+
let _agimon_ai_doompi_core_piExtension = require("@agimon-ai/doompi-core/piExtension");
|
|
6
|
+
let _agimon_ai_doompi_core_extensionFile = require("@agimon-ai/doompi-core/extensionFile");
|
|
7
7
|
let _agimon_ai_doompi_config_harnessStore = require("@agimon-ai/doompi-config/harnessStore");
|
|
8
8
|
let _agimon_ai_doompi_minor_mode = require("@agimon-ai/doompi-minor-mode");
|
|
9
9
|
let node_crypto = require("node:crypto");
|
|
@@ -411,12 +411,12 @@ var PromptCacheTelemetryService = class extends _deepseek_ai_cordis.Service {
|
|
|
411
411
|
};
|
|
412
412
|
//#endregion
|
|
413
413
|
//#region src/extensions/workspaces/sessions/(backend)/root.cli.ts
|
|
414
|
-
var root_cli_default = (0,
|
|
414
|
+
var root_cli_default = (0, _agimon_ai_doompi_core_extensionFile.defineRoot)(async ({ pi, options }) => {
|
|
415
415
|
const dependencies = options ?? {
|
|
416
416
|
telemetry: new PromptCacheTelemetry(),
|
|
417
417
|
now: Date.now
|
|
418
418
|
};
|
|
419
|
-
const optimizer = await Promise.resolve().then(() => require("../pi-cache-optimizer-
|
|
419
|
+
const optimizer = await Promise.resolve().then(() => require("../pi-cache-optimizer-atA1RVPZ.cjs"));
|
|
420
420
|
if (typeof optimizer.default !== "function") throw new Error("Pi Cache Optimizer does not provide an extension factory.");
|
|
421
421
|
await optimizer.default(pi);
|
|
422
422
|
const runtime = createCacheRuntime(dependencies, optimizer);
|
|
@@ -430,7 +430,7 @@ var root_cli_default = (0, _agimon_ai_doompi_core_extension_file.defineRoot)(asy
|
|
|
430
430
|
});
|
|
431
431
|
//#endregion
|
|
432
432
|
//#region src/extensions/workspaces/sessions/(backend)/resource/doompi-use-cache.cli.ts
|
|
433
|
-
var doompi_use_cache_cli_default = (0,
|
|
433
|
+
var doompi_use_cache_cli_default = (0, _agimon_ai_doompi_core_extensionFile.defineResource)({
|
|
434
434
|
source: PACKAGE_SOURCE,
|
|
435
435
|
moduleUrl: require("url").pathToFileURL(__filename).href,
|
|
436
436
|
skills: [CACHE_HELP_SKILL]
|
|
@@ -438,14 +438,14 @@ var doompi_use_cache_cli_default = (0, _agimon_ai_doompi_core_extension_file.def
|
|
|
438
438
|
//#endregion
|
|
439
439
|
//#region generated/pi.ts
|
|
440
440
|
const at = (value, context) => typeof value === "function" ? value(context) : value;
|
|
441
|
-
const extension = (0,
|
|
441
|
+
const extension = (0, _agimon_ai_doompi_core_piExtension.definePiExtension)("@agimon-ai/doompi-cache", async (context) => {
|
|
442
442
|
const scopeSession = await root_cli_default(context);
|
|
443
443
|
const contextSession = {
|
|
444
444
|
...context,
|
|
445
445
|
root: scopeSession.value
|
|
446
446
|
};
|
|
447
447
|
return {
|
|
448
|
-
...(0,
|
|
448
|
+
...(0, _agimon_ai_doompi_core_extensionFile.composeRootHooks)(scopeSession),
|
|
449
449
|
get resources() {
|
|
450
450
|
return [at(doompi_use_cache_cli_default, contextSession)];
|
|
451
451
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pi.cjs","names":["createHash","recordValue","getHarnessState","DOOM_MINOR_MODE_CATALOG_SERVICE","readMinorModeCatalog","Service","defineRoot","defineResource","definePiExtension","rootSession","composeRootHooks","resourceDoompiUseCache"],"sources":["../../src/models/promptCacheTelemetry.ts","../../src/constants/cache.ts","../../src/constants/environment.ts","../../src/services/digest/index.ts","../../src/services/environment/index.ts","../../src/services/canonical/index.ts","../../src/services/namespace/index.ts","../../src/services/optimizerPolicy/index.ts","../../src/services/promptCacheUsage/index.ts","../../src/services/providerPolicy/index.ts","../../src/services/cacheRuntime/index.ts","../../src/services/promptCacheTelemetry/index.ts","../../src/extensions/workspaces/sessions/(backend)/root.cli.ts","../../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-cache.cli.ts","../../generated/pi.ts"],"sourcesContent":["import type {\n PromptCacheObservation,\n PromptCacheRequestStatus,\n PromptCacheTelemetryPort,\n PromptCacheTelemetrySnapshot,\n PromptCacheUsage,\n} from '../types/cache';\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","export const PACKAGE_SOURCE = '@agimon-ai/doompi-cache';\nexport const KEY_SUFFIX_LENGTH = 8;\nexport const CACHE_HELP_SKILL = {\n name: 'doompi-use-cache',\n description: 'Inspect DoomPi provider prompt cache policy, routing identity, and provider-observed 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 { createHash } from 'node:crypto';\n\nexport function sha256Base64Url(value: string): string {\n return createHash('sha256').update(value).digest('base64url');\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","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';\nimport { canonicalJson } from '../canonical';\n\nconst KEY_PREFIX = 'dpc1_';\nconst PARENT_PREFIX = 'dpn1_';\nconst CHILD_PREFIX = 'dch1_';\nconst ROOT_PREFIX = 'dpr1_';\nconst MODEL_PREFIX = 'dpm1_';\n\nfunction digestIdentity(prefix: string, value: unknown, digest: PromptCacheDigest): string {\n return `${prefix}${digest(canonicalJson(value))}`;\n}\n\nfunction normalizedPersona(value: string | undefined): string | undefined {\n const normalized = value?.trim().replaceAll('\\\\', '/');\n return normalized || undefined;\n}\n\nfunction activeMinorModes(modes: readonly PromptCacheMinorModeState[]): readonly Record<string, string>[] {\n return modes\n .filter(({ activation }) => activation === 'active' || activation === 'activating')\n .map(({ source, id, modelContextVariant }) => ({\n source,\n id,\n ...(modelContextVariant ? { modelContextVariant } : {}),\n }))\n .sort((left, right) => left.source.localeCompare(right.source) || left.id.localeCompare(right.id));\n}\n\nexport function createRootSessionIdentity(rootSessionId: string, digest: PromptCacheDigest): string {\n return digestIdentity(ROOT_PREFIX, { version: 1, rootSessionId }, digest);\n}\n\nexport function createParentPromptCacheNamespace(state: PromptCacheParentState, digest: PromptCacheDigest): string {\n return digestIdentity(\n PARENT_PREFIX,\n {\n version: 1,\n rootSession: createRootSessionIdentity(state.rootSessionId, digest),\n compositionFingerprint: state.compositionFingerprint ?? null,\n majorMode: state.majorMode,\n domains: [...state.domains],\n profile: state.profile ?? null,\n persona: normalizedPersona(state.persona) ?? null,\n minorModes: activeMinorModes(state.minorModes),\n },\n digest,\n );\n}\n\nexport function createChildPromptCacheProjection(\n projection: PromptCacheChildProjection,\n digest: PromptCacheDigest,\n): string {\n return digestIdentity(\n CHILD_PREFIX,\n {\n version: 1,\n systemPrompt: projection.systemPrompt ?? null,\n tools: [...projection.tools],\n excludedTools: [...projection.excludedTools].sort((left, right) => left.localeCompare(right)),\n extensions: [...projection.extensions],\n inheritProjectContext: projection.inheritProjectContext ?? null,\n inheritSkills: projection.inheritSkills ?? null,\n fanout: projection.fanout ?? null,\n structuredOutputSchema: projection.structuredOutputSchema ?? null,\n },\n digest,\n );\n}\n\nexport function createPromptCacheModelFingerprint(model: PromptCacheModelIdentity, digest: PromptCacheDigest): string {\n return digestIdentity(\n MODEL_PREFIX,\n {\n version: 1,\n virtualProvider: model.virtualProvider ?? null,\n virtualModel: model.virtualModel ?? null,\n api: model.api ?? null,\n baseUrl: model.baseUrl ?? null,\n wireModel: model.wireModel ?? null,\n },\n digest,\n );\n}\n\nexport function createPromptCacheKey(\n parentNamespace: string,\n scope: 'parent' | 'child',\n modelFingerprint: string,\n digest: PromptCacheDigest,\n childProjection?: string,\n): string {\n return digestIdentity(\n KEY_PREFIX,\n {\n version: 1,\n parentNamespace,\n scope,\n childProjection: childProjection ?? null,\n modelFingerprint,\n },\n digest,\n );\n}\n","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 { PromptCacheUsage } from '../../types/cache';\n\nfunction recordValue(value: unknown): Readonly<Record<string, unknown>> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Readonly<Record<string, unknown>>)\n : undefined;\n}\n\nfunction nonNegativeNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : undefined;\n}\n\nfunction firstNumber(...values: readonly unknown[]): number | undefined {\n for (const value of values) {\n const number = nonNegativeNumber(value);\n if (number !== undefined) return number;\n }\n return undefined;\n}\n\nfunction normalizedUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const cacheRead = nonNegativeNumber(usage.cacheRead);\n const cacheWrite = nonNegativeNumber(usage.cacheWrite);\n if (cacheRead === undefined && cacheWrite === undefined) return undefined;\n const input = nonNegativeNumber(usage.input) ?? 0;\n return {\n cacheRead: cacheRead ?? 0,\n cacheWrite: cacheWrite ?? 0,\n totalInput: input + (cacheRead ?? 0) + (cacheWrite ?? 0),\n };\n}\n\nfunction openAiUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const promptDetails = recordValue(usage.prompt_tokens_details) ?? recordValue(usage.promptTokensDetails);\n const inputDetails = recordValue(usage.input_tokens_details) ?? recordValue(usage.inputTokensDetails);\n const cacheRead = firstNumber(\n promptDetails?.cached_tokens,\n promptDetails?.cachedTokens,\n inputDetails?.cached_tokens,\n inputDetails?.cachedTokens,\n );\n const cacheWrite = firstNumber(\n promptDetails?.cache_write_tokens,\n promptDetails?.cacheWriteTokens,\n inputDetails?.cache_write_tokens,\n inputDetails?.cacheWriteTokens,\n );\n if (cacheRead === undefined && cacheWrite === undefined) return undefined;\n const floor = (cacheRead ?? 0) + (cacheWrite ?? 0);\n const reportedTotal = firstNumber(usage.prompt_tokens, usage.promptTokens, usage.input_tokens, usage.inputTokens);\n return {\n cacheRead: cacheRead ?? 0,\n cacheWrite: cacheWrite ?? 0,\n totalInput: Math.max(reportedTotal ?? floor, floor),\n };\n}\n\nfunction anthropicUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const cacheRead = firstNumber(usage.cache_read_input_tokens, usage.cacheReadInputTokens);\n const cacheWrite = firstNumber(usage.cache_creation_input_tokens, usage.cacheCreationInputTokens);\n if (cacheRead === undefined && cacheWrite === undefined) return undefined;\n const input = firstNumber(usage.input_tokens, usage.inputTokens) ?? 0;\n return {\n cacheRead: cacheRead ?? 0,\n cacheWrite: cacheWrite ?? 0,\n totalInput: input + (cacheRead ?? 0) + (cacheWrite ?? 0),\n };\n}\n\nfunction geminiUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const metadata = recordValue(usage.usage_metadata) ?? recordValue(usage.usageMetadata) ?? usage;\n const cacheRead = firstNumber(metadata.cachedContentTokenCount, metadata.cached_content_token_count);\n if (cacheRead === undefined) return undefined;\n const totalInput = firstNumber(\n metadata.promptTokenCount,\n metadata.prompt_token_count,\n usage.input_tokens,\n usage.inputTokens,\n usage.prompt_tokens,\n usage.promptTokens,\n );\n return { cacheRead, cacheWrite: 0, totalInput: Math.max(totalInput ?? cacheRead, cacheRead) };\n}\n\n/** Normalize only usage values carried by a provider-produced assistant message. */\nexport function normalizePromptCacheUsage(message: unknown): PromptCacheUsage | undefined {\n const messageRecord = recordValue(message);\n const usage = recordValue(messageRecord?.usage);\n if (!usage) return undefined;\n return normalizedUsage(usage) ?? openAiUsage(usage) ?? anthropicUsage(usage) ?? geminiUsage(usage);\n}\n","import type { PromptCacheCapabilityClass, PromptCacheModelIdentity } from '../../types/cache';\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 { getHarnessState } from '@agimon-ai/doompi-config/harnessStore';\nimport {\n DOOM_MINOR_MODE_CATALOG_SERVICE,\n readMinorModeCatalog,\n type MinorModeRecord,\n} from '@agimon-ai/doompi-minor-mode';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionContext } from '@earendil-works/pi-coding-agent';\n\nimport { KEY_SUFFIX_LENGTH } from '../../constants/cache';\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 '../../constants/environment';\nimport type { PromptCacheMinorModeState, PromptCacheModelIdentity } from '../../types/cache';\nimport type { CacheExtensionDependencies } from '../../types/extension';\nimport { sha256Base64Url } from '../digest';\nimport { OwnedEnvironmentValue } from '../environment';\nimport {\n createParentPromptCacheNamespace,\n createPromptCacheKey,\n createPromptCacheModelFingerprint,\n createRootSessionIdentity,\n} from '../namespace';\nimport { optimizerAllowsPromptCacheKey } from '../optimizerPolicy';\nimport { normalizePromptCacheUsage } from '../promptCacheUsage';\nimport { classifyPromptCacheCapability, requestedPromptCacheRetention, rewritePromptCacheKey } from '../providerPolicy';\nimport type { CacheRuntime, OptimizerModule } from './type';\n\ntype BeforeProviderEvent = { readonly payload?: unknown };\ntype MessageEndEvent = { readonly message?: unknown };\ntype MinorModeStateWithVariant = MinorModeRecord['state'] & { readonly modelContextVariant?: string };\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\nexport function createCacheRuntime(dependencies: CacheExtensionDependencies, optimizer: OptimizerModule): CacheRuntime {\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 const plugin = (cordis: Context): void => {\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 return {\n plugin,\n events: {\n session_start: (_event, ctx) => {\n if (!isProjectedChild) {\n rootSessionId = stringValue(ctx.sessionManager.getSessionId());\n refreshParentNamespace();\n }\n },\n\n 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(\n event.payload,\n identity.api,\n key,\n optimizerAllowsPromptCacheKey(optimizer),\n );\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 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 dispose: () => {\n parentNamespaceEnvironment.restore();\n rootSessionEnvironment.restore();\n dependencies.telemetry.reset();\n },\n };\n}\n","import { type Context, Service } from '@deepseek-ai/cordis';\n\nimport type { PromptCacheTelemetryPort, PromptCacheTelemetrySnapshot } from '../../types/cache';\n\nexport const DOOM_PROMPT_CACHE_TELEMETRY_SERVICE = 'doom/prompt-cache-telemetry';\n\nexport class PromptCacheTelemetryService extends Service {\n constructor(\n context: Context,\n private readonly telemetry: PromptCacheTelemetryPort,\n ) {\n super(context, DOOM_PROMPT_CACHE_TELEMETRY_SERVICE);\n }\n\n snapshot(): PromptCacheTelemetrySnapshot {\n return this.telemetry.snapshot();\n }\n}\n\nexport function readPromptCacheTelemetry(context: Context): PromptCacheTelemetryService | undefined {\n return context.get(DOOM_PROMPT_CACHE_TELEMETRY_SERVICE) as PromptCacheTelemetryService | undefined;\n}\n\ndeclare module '@deepseek-ai/cordis' {\n interface Context {\n 'doom/prompt-cache-telemetry': PromptCacheTelemetryService;\n }\n}\n","import { defineRoot } from '@agimon-ai/doompi-core/extension-file';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/pi-extension';\n\nimport { PromptCacheTelemetry } from '../../../../models/promptCacheTelemetry';\nimport { createCacheRuntime } from '../../../../services/cacheRuntime';\nimport type { OptimizerModule } from '../../../../services/cacheRuntime/type';\nimport { PromptCacheTelemetryService } from '../../../../services/promptCacheTelemetry';\nimport type { CacheExtensionDependencies } from '../../../../types/extension';\nexport default defineRoot(async ({ pi, options }: PiPluginContext<CacheExtensionDependencies>) => {\n const dependencies = options ?? { telemetry: new PromptCacheTelemetry(), now: Date.now };\n const optimizer: OptimizerModule = await import('#doompi-cache-optimizer-source');\n if (typeof optimizer.default !== 'function')\n throw new Error('Pi Cache Optimizer does not provide an extension factory.');\n await optimizer.default(pi);\n const runtime = createCacheRuntime(dependencies, optimizer);\n return {\n value: runtime,\n services: [\n (context: PiPluginContext['context']) => {\n new PromptCacheTelemetryService(context, dependencies.telemetry);\n },\n runtime.plugin,\n ],\n onDispose: () => runtime.dispose(),\n };\n});\n","import { defineResource } from '@agimon-ai/doompi-core/extension-file';\n\nimport { CACHE_HELP_SKILL, PACKAGE_SOURCE } from '../../../../../constants/cache';\nexport default defineResource({ source: PACKAGE_SOURCE, moduleUrl: import.meta.url, skills: [CACHE_HELP_SKILL] });\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { definePiExtension, type PiPluginContext, type PiPluginContributions } from '@agimon-ai/doompi-core/pi-extension';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extension-file';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.cli';\nimport resourceDoompiUseCache from '../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-cache.cli';\n\ntype OptionsOf<T> = T extends (context: PiPluginContext<infer Options>) => unknown ? Options : never;\ntype InferredOptions = Exclude<OptionsOf<typeof rootSession> | OptionsOf<typeof resourceDoompiUseCache>, undefined>;\ntype Intersect<Union> =\n (Union extends unknown ? (value: Union) => void : never) extends (value: infer Value) => void ? Value : never;\ntype ExtensionOptions = [InferredOptions] extends [never] ? undefined : Intersect<InferredOptions>;\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\n\nexport const extension = definePiExtension<ExtensionOptions>('@agimon-ai/doompi-cache', async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get resources(): PiPluginContributions['resources'] { return [at(resourceDoompiUseCache, contextSession)]; },\n services: [...(scopeSession.services ?? [])],\n };\n});\n\nexport default extension;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pi.cjs","names":["createHash","recordValue","getHarnessState","DOOM_MINOR_MODE_CATALOG_SERVICE","readMinorModeCatalog","Service","defineRoot","defineResource","definePiExtension","rootSession","composeRootHooks","resourceDoompiUseCache"],"sources":["../../src/models/promptCacheTelemetry.ts","../../src/constants/cache.ts","../../src/constants/environment.ts","../../src/services/digest/index.ts","../../src/services/environment/index.ts","../../src/services/canonical/index.ts","../../src/services/namespace/index.ts","../../src/services/optimizerPolicy/index.ts","../../src/services/promptCacheUsage/index.ts","../../src/services/providerPolicy/index.ts","../../src/services/cacheRuntime/index.ts","../../src/services/promptCacheTelemetry/index.ts","../../src/extensions/workspaces/sessions/(backend)/root.cli.ts","../../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-cache.cli.ts","../../generated/pi.ts"],"sourcesContent":["import type {\n PromptCacheObservation,\n PromptCacheRequestStatus,\n PromptCacheTelemetryPort,\n PromptCacheTelemetrySnapshot,\n PromptCacheUsage,\n} from '../types/cache';\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","export const PACKAGE_SOURCE = '@agimon-ai/doompi-cache';\nexport const KEY_SUFFIX_LENGTH = 8;\nexport const CACHE_HELP_SKILL = {\n name: 'doompi-use-cache',\n description: 'Inspect DoomPi provider prompt cache policy, routing identity, and provider-observed 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 { createHash } from 'node:crypto';\n\nexport function sha256Base64Url(value: string): string {\n return createHash('sha256').update(value).digest('base64url');\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","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';\nimport { canonicalJson } from '../canonical';\n\nconst KEY_PREFIX = 'dpc1_';\nconst PARENT_PREFIX = 'dpn1_';\nconst CHILD_PREFIX = 'dch1_';\nconst ROOT_PREFIX = 'dpr1_';\nconst MODEL_PREFIX = 'dpm1_';\n\nfunction digestIdentity(prefix: string, value: unknown, digest: PromptCacheDigest): string {\n return `${prefix}${digest(canonicalJson(value))}`;\n}\n\nfunction normalizedPersona(value: string | undefined): string | undefined {\n const normalized = value?.trim().replaceAll('\\\\', '/');\n return normalized || undefined;\n}\n\nfunction activeMinorModes(modes: readonly PromptCacheMinorModeState[]): readonly Record<string, string>[] {\n return modes\n .filter(({ activation }) => activation === 'active' || activation === 'activating')\n .map(({ source, id, modelContextVariant }) => ({\n source,\n id,\n ...(modelContextVariant ? { modelContextVariant } : {}),\n }))\n .sort((left, right) => left.source.localeCompare(right.source) || left.id.localeCompare(right.id));\n}\n\nexport function createRootSessionIdentity(rootSessionId: string, digest: PromptCacheDigest): string {\n return digestIdentity(ROOT_PREFIX, { version: 1, rootSessionId }, digest);\n}\n\nexport function createParentPromptCacheNamespace(state: PromptCacheParentState, digest: PromptCacheDigest): string {\n return digestIdentity(\n PARENT_PREFIX,\n {\n version: 1,\n rootSession: createRootSessionIdentity(state.rootSessionId, digest),\n compositionFingerprint: state.compositionFingerprint ?? null,\n majorMode: state.majorMode,\n domains: [...state.domains],\n profile: state.profile ?? null,\n persona: normalizedPersona(state.persona) ?? null,\n minorModes: activeMinorModes(state.minorModes),\n },\n digest,\n );\n}\n\nexport function createChildPromptCacheProjection(\n projection: PromptCacheChildProjection,\n digest: PromptCacheDigest,\n): string {\n return digestIdentity(\n CHILD_PREFIX,\n {\n version: 1,\n systemPrompt: projection.systemPrompt ?? null,\n tools: [...projection.tools],\n excludedTools: [...projection.excludedTools].sort((left, right) => left.localeCompare(right)),\n extensions: [...projection.extensions],\n inheritProjectContext: projection.inheritProjectContext ?? null,\n inheritSkills: projection.inheritSkills ?? null,\n fanout: projection.fanout ?? null,\n structuredOutputSchema: projection.structuredOutputSchema ?? null,\n },\n digest,\n );\n}\n\nexport function createPromptCacheModelFingerprint(model: PromptCacheModelIdentity, digest: PromptCacheDigest): string {\n return digestIdentity(\n MODEL_PREFIX,\n {\n version: 1,\n virtualProvider: model.virtualProvider ?? null,\n virtualModel: model.virtualModel ?? null,\n api: model.api ?? null,\n baseUrl: model.baseUrl ?? null,\n wireModel: model.wireModel ?? null,\n },\n digest,\n );\n}\n\nexport function createPromptCacheKey(\n parentNamespace: string,\n scope: 'parent' | 'child',\n modelFingerprint: string,\n digest: PromptCacheDigest,\n childProjection?: string,\n): string {\n return digestIdentity(\n KEY_PREFIX,\n {\n version: 1,\n parentNamespace,\n scope,\n childProjection: childProjection ?? null,\n modelFingerprint,\n },\n digest,\n );\n}\n","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 { PromptCacheUsage } from '../../types/cache';\n\nfunction recordValue(value: unknown): Readonly<Record<string, unknown>> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Readonly<Record<string, unknown>>)\n : undefined;\n}\n\nfunction nonNegativeNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : undefined;\n}\n\nfunction firstNumber(...values: readonly unknown[]): number | undefined {\n for (const value of values) {\n const number = nonNegativeNumber(value);\n if (number !== undefined) return number;\n }\n return undefined;\n}\n\nfunction normalizedUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const cacheRead = nonNegativeNumber(usage.cacheRead);\n const cacheWrite = nonNegativeNumber(usage.cacheWrite);\n if (cacheRead === undefined && cacheWrite === undefined) return undefined;\n const input = nonNegativeNumber(usage.input) ?? 0;\n return {\n cacheRead: cacheRead ?? 0,\n cacheWrite: cacheWrite ?? 0,\n totalInput: input + (cacheRead ?? 0) + (cacheWrite ?? 0),\n };\n}\n\nfunction openAiUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const promptDetails = recordValue(usage.prompt_tokens_details) ?? recordValue(usage.promptTokensDetails);\n const inputDetails = recordValue(usage.input_tokens_details) ?? recordValue(usage.inputTokensDetails);\n const cacheRead = firstNumber(\n promptDetails?.cached_tokens,\n promptDetails?.cachedTokens,\n inputDetails?.cached_tokens,\n inputDetails?.cachedTokens,\n );\n const cacheWrite = firstNumber(\n promptDetails?.cache_write_tokens,\n promptDetails?.cacheWriteTokens,\n inputDetails?.cache_write_tokens,\n inputDetails?.cacheWriteTokens,\n );\n if (cacheRead === undefined && cacheWrite === undefined) return undefined;\n const floor = (cacheRead ?? 0) + (cacheWrite ?? 0);\n const reportedTotal = firstNumber(usage.prompt_tokens, usage.promptTokens, usage.input_tokens, usage.inputTokens);\n return {\n cacheRead: cacheRead ?? 0,\n cacheWrite: cacheWrite ?? 0,\n totalInput: Math.max(reportedTotal ?? floor, floor),\n };\n}\n\nfunction anthropicUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const cacheRead = firstNumber(usage.cache_read_input_tokens, usage.cacheReadInputTokens);\n const cacheWrite = firstNumber(usage.cache_creation_input_tokens, usage.cacheCreationInputTokens);\n if (cacheRead === undefined && cacheWrite === undefined) return undefined;\n const input = firstNumber(usage.input_tokens, usage.inputTokens) ?? 0;\n return {\n cacheRead: cacheRead ?? 0,\n cacheWrite: cacheWrite ?? 0,\n totalInput: input + (cacheRead ?? 0) + (cacheWrite ?? 0),\n };\n}\n\nfunction geminiUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const metadata = recordValue(usage.usage_metadata) ?? recordValue(usage.usageMetadata) ?? usage;\n const cacheRead = firstNumber(metadata.cachedContentTokenCount, metadata.cached_content_token_count);\n if (cacheRead === undefined) return undefined;\n const totalInput = firstNumber(\n metadata.promptTokenCount,\n metadata.prompt_token_count,\n usage.input_tokens,\n usage.inputTokens,\n usage.prompt_tokens,\n usage.promptTokens,\n );\n return { cacheRead, cacheWrite: 0, totalInput: Math.max(totalInput ?? cacheRead, cacheRead) };\n}\n\n/** Normalize only usage values carried by a provider-produced assistant message. */\nexport function normalizePromptCacheUsage(message: unknown): PromptCacheUsage | undefined {\n const messageRecord = recordValue(message);\n const usage = recordValue(messageRecord?.usage);\n if (!usage) return undefined;\n return normalizedUsage(usage) ?? openAiUsage(usage) ?? anthropicUsage(usage) ?? geminiUsage(usage);\n}\n","import type { PromptCacheCapabilityClass, PromptCacheModelIdentity } from '../../types/cache';\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 { getHarnessState } from '@agimon-ai/doompi-config/harnessStore';\nimport {\n DOOM_MINOR_MODE_CATALOG_SERVICE,\n readMinorModeCatalog,\n type MinorModeRecord,\n} from '@agimon-ai/doompi-minor-mode';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionContext } from '@earendil-works/pi-coding-agent';\n\nimport { KEY_SUFFIX_LENGTH } from '../../constants/cache';\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 '../../constants/environment';\nimport type { PromptCacheMinorModeState, PromptCacheModelIdentity } from '../../types/cache';\nimport type { CacheExtensionDependencies } from '../../types/extension';\nimport { sha256Base64Url } from '../digest';\nimport { OwnedEnvironmentValue } from '../environment';\nimport {\n createParentPromptCacheNamespace,\n createPromptCacheKey,\n createPromptCacheModelFingerprint,\n createRootSessionIdentity,\n} from '../namespace';\nimport { optimizerAllowsPromptCacheKey } from '../optimizerPolicy';\nimport { normalizePromptCacheUsage } from '../promptCacheUsage';\nimport { classifyPromptCacheCapability, requestedPromptCacheRetention, rewritePromptCacheKey } from '../providerPolicy';\nimport type { CacheRuntime, OptimizerModule } from './type';\n\ntype BeforeProviderEvent = { readonly payload?: unknown };\ntype MessageEndEvent = { readonly message?: unknown };\ntype MinorModeStateWithVariant = MinorModeRecord['state'] & { readonly modelContextVariant?: string };\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\nexport function createCacheRuntime(dependencies: CacheExtensionDependencies, optimizer: OptimizerModule): CacheRuntime {\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 const plugin = (cordis: Context): void => {\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 return {\n plugin,\n events: {\n session_start: (_event, ctx) => {\n if (!isProjectedChild) {\n rootSessionId = stringValue(ctx.sessionManager.getSessionId());\n refreshParentNamespace();\n }\n },\n\n 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(\n event.payload,\n identity.api,\n key,\n optimizerAllowsPromptCacheKey(optimizer),\n );\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 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 dispose: () => {\n parentNamespaceEnvironment.restore();\n rootSessionEnvironment.restore();\n dependencies.telemetry.reset();\n },\n };\n}\n","import { type Context, Service } from '@deepseek-ai/cordis';\n\nimport type { PromptCacheTelemetryPort, PromptCacheTelemetrySnapshot } from '../../types/cache';\n\nexport const DOOM_PROMPT_CACHE_TELEMETRY_SERVICE = 'doom/prompt-cache-telemetry';\n\nexport class PromptCacheTelemetryService extends Service {\n constructor(\n context: Context,\n private readonly telemetry: PromptCacheTelemetryPort,\n ) {\n super(context, DOOM_PROMPT_CACHE_TELEMETRY_SERVICE);\n }\n\n snapshot(): PromptCacheTelemetrySnapshot {\n return this.telemetry.snapshot();\n }\n}\n\nexport function readPromptCacheTelemetry(context: Context): PromptCacheTelemetryService | undefined {\n return context.get(DOOM_PROMPT_CACHE_TELEMETRY_SERVICE) as PromptCacheTelemetryService | undefined;\n}\n\ndeclare module '@deepseek-ai/cordis' {\n interface Context {\n 'doom/prompt-cache-telemetry': PromptCacheTelemetryService;\n }\n}\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport { PromptCacheTelemetry } from '../../../../models/promptCacheTelemetry';\nimport { createCacheRuntime } from '../../../../services/cacheRuntime';\nimport type { OptimizerModule } from '../../../../services/cacheRuntime/type';\nimport { PromptCacheTelemetryService } from '../../../../services/promptCacheTelemetry';\nimport type { CacheExtensionDependencies } from '../../../../types/extension';\nexport default defineRoot(async ({ pi, options }: PiPluginContext<CacheExtensionDependencies>) => {\n const dependencies = options ?? { telemetry: new PromptCacheTelemetry(), now: Date.now };\n const optimizer: OptimizerModule = await import('#doompi-cache-optimizer-source');\n if (typeof optimizer.default !== 'function')\n throw new Error('Pi Cache Optimizer does not provide an extension factory.');\n await optimizer.default(pi);\n const runtime = createCacheRuntime(dependencies, optimizer);\n return {\n value: runtime,\n services: [\n (context: PiPluginContext['context']) => {\n new PromptCacheTelemetryService(context, dependencies.telemetry);\n },\n runtime.plugin,\n ],\n onDispose: () => runtime.dispose(),\n };\n});\n","import { defineResource } from '@agimon-ai/doompi-core/extensionFile';\n\nimport { CACHE_HELP_SKILL, PACKAGE_SOURCE } from '../../../../../constants/cache';\nexport default defineResource({ source: PACKAGE_SOURCE, moduleUrl: import.meta.url, skills: [CACHE_HELP_SKILL] });\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { definePiExtension, type PiPluginContext, type PiPluginContributions } from '@agimon-ai/doompi-core/piExtension';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.cli';\nimport resourceDoompiUseCache from '../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-cache.cli';\n\ntype OptionsOf<T> = T extends (context: PiPluginContext<infer Options>) => unknown ? Options : never;\ntype InferredOptions = Exclude<OptionsOf<typeof rootSession> | OptionsOf<typeof resourceDoompiUseCache>, undefined>;\ntype Intersect<Union> =\n (Union extends unknown ? (value: Union) => void : never) extends (value: infer Value) => void ? Value : never;\ntype ExtensionOptions = [InferredOptions] extends [never] ? undefined : Intersect<InferredOptions>;\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\n\nexport const extension = definePiExtension<ExtensionOptions>('@agimon-ai/doompi-cache', async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get resources(): PiPluginContributions['resources'] { return [at(resourceDoompiUseCache, contextSession)]; },\n services: [...(scopeSession.services ?? [])],\n };\n});\n\nexport default extension;\n"],"mappings":"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"}
|
package/dist/extensions/pi.d.mts
CHANGED
|
@@ -36,7 +36,7 @@ interface CacheExtensionDependencies {
|
|
|
36
36
|
}
|
|
37
37
|
//#endregion
|
|
38
38
|
//#region generated/pi.d.ts
|
|
39
|
-
export declare const extension: import("@agimon-ai/doompi-core/
|
|
39
|
+
export declare const extension: import("@agimon-ai/doompi-core/runtimePiExtension").DefinedPiExtension<CacheExtensionDependencies>;
|
|
40
40
|
//#endregion
|
|
41
41
|
export { extension as default };
|
|
42
42
|
//# sourceMappingURL=pi.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pi.d.mts","names":[],"sources":["../../src/types/cache.ts","../../src/types/extension.ts","../../generated/pi.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;;;;qBCaE,
|
|
1
|
+
{"version":3,"file":"pi.d.mts","names":[],"sources":["../../src/types/cache.ts","../../src/types/extension.ts","../../generated/pi.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;;;;qBCaE,+DAAS,mBAAT"}
|
package/dist/extensions/pi.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { definePiExtension } from "@agimon-ai/doompi-core/
|
|
2
|
-
import { composeRootHooks, defineResource, defineRoot } from "@agimon-ai/doompi-core/
|
|
1
|
+
import { definePiExtension } from "@agimon-ai/doompi-core/piExtension";
|
|
2
|
+
import { composeRootHooks, defineResource, defineRoot } from "@agimon-ai/doompi-core/extensionFile";
|
|
3
3
|
import { getHarnessState } from "@agimon-ai/doompi-config/harnessStore";
|
|
4
4
|
import { DOOM_MINOR_MODE_CATALOG_SERVICE, readMinorModeCatalog } from "@agimon-ai/doompi-minor-mode";
|
|
5
5
|
import { createHash } from "node:crypto";
|
|
@@ -412,7 +412,7 @@ var root_cli_default = defineRoot(async ({ pi, options }) => {
|
|
|
412
412
|
telemetry: new PromptCacheTelemetry(),
|
|
413
413
|
now: Date.now
|
|
414
414
|
};
|
|
415
|
-
const optimizer = await import("../pi-cache-optimizer-
|
|
415
|
+
const optimizer = await import("../pi-cache-optimizer-CZiEEQG9.mjs");
|
|
416
416
|
if (typeof optimizer.default !== "function") throw new Error("Pi Cache Optimizer does not provide an extension factory.");
|
|
417
417
|
await optimizer.default(pi);
|
|
418
418
|
const runtime = createCacheRuntime(dependencies, optimizer);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pi.mjs","names":["recordValue","rootSession","resourceDoompiUseCache"],"sources":["../../src/models/promptCacheTelemetry.ts","../../src/constants/cache.ts","../../src/constants/environment.ts","../../src/services/digest/index.ts","../../src/services/environment/index.ts","../../src/services/canonical/index.ts","../../src/services/namespace/index.ts","../../src/services/optimizerPolicy/index.ts","../../src/services/promptCacheUsage/index.ts","../../src/services/providerPolicy/index.ts","../../src/services/cacheRuntime/index.ts","../../src/services/promptCacheTelemetry/index.ts","../../src/extensions/workspaces/sessions/(backend)/root.cli.ts","../../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-cache.cli.ts","../../generated/pi.ts"],"sourcesContent":["import type {\n PromptCacheObservation,\n PromptCacheRequestStatus,\n PromptCacheTelemetryPort,\n PromptCacheTelemetrySnapshot,\n PromptCacheUsage,\n} from '../types/cache';\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","export const PACKAGE_SOURCE = '@agimon-ai/doompi-cache';\nexport const KEY_SUFFIX_LENGTH = 8;\nexport const CACHE_HELP_SKILL = {\n name: 'doompi-use-cache',\n description: 'Inspect DoomPi provider prompt cache policy, routing identity, and provider-observed 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 { createHash } from 'node:crypto';\n\nexport function sha256Base64Url(value: string): string {\n return createHash('sha256').update(value).digest('base64url');\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","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';\nimport { canonicalJson } from '../canonical';\n\nconst KEY_PREFIX = 'dpc1_';\nconst PARENT_PREFIX = 'dpn1_';\nconst CHILD_PREFIX = 'dch1_';\nconst ROOT_PREFIX = 'dpr1_';\nconst MODEL_PREFIX = 'dpm1_';\n\nfunction digestIdentity(prefix: string, value: unknown, digest: PromptCacheDigest): string {\n return `${prefix}${digest(canonicalJson(value))}`;\n}\n\nfunction normalizedPersona(value: string | undefined): string | undefined {\n const normalized = value?.trim().replaceAll('\\\\', '/');\n return normalized || undefined;\n}\n\nfunction activeMinorModes(modes: readonly PromptCacheMinorModeState[]): readonly Record<string, string>[] {\n return modes\n .filter(({ activation }) => activation === 'active' || activation === 'activating')\n .map(({ source, id, modelContextVariant }) => ({\n source,\n id,\n ...(modelContextVariant ? { modelContextVariant } : {}),\n }))\n .sort((left, right) => left.source.localeCompare(right.source) || left.id.localeCompare(right.id));\n}\n\nexport function createRootSessionIdentity(rootSessionId: string, digest: PromptCacheDigest): string {\n return digestIdentity(ROOT_PREFIX, { version: 1, rootSessionId }, digest);\n}\n\nexport function createParentPromptCacheNamespace(state: PromptCacheParentState, digest: PromptCacheDigest): string {\n return digestIdentity(\n PARENT_PREFIX,\n {\n version: 1,\n rootSession: createRootSessionIdentity(state.rootSessionId, digest),\n compositionFingerprint: state.compositionFingerprint ?? null,\n majorMode: state.majorMode,\n domains: [...state.domains],\n profile: state.profile ?? null,\n persona: normalizedPersona(state.persona) ?? null,\n minorModes: activeMinorModes(state.minorModes),\n },\n digest,\n );\n}\n\nexport function createChildPromptCacheProjection(\n projection: PromptCacheChildProjection,\n digest: PromptCacheDigest,\n): string {\n return digestIdentity(\n CHILD_PREFIX,\n {\n version: 1,\n systemPrompt: projection.systemPrompt ?? null,\n tools: [...projection.tools],\n excludedTools: [...projection.excludedTools].sort((left, right) => left.localeCompare(right)),\n extensions: [...projection.extensions],\n inheritProjectContext: projection.inheritProjectContext ?? null,\n inheritSkills: projection.inheritSkills ?? null,\n fanout: projection.fanout ?? null,\n structuredOutputSchema: projection.structuredOutputSchema ?? null,\n },\n digest,\n );\n}\n\nexport function createPromptCacheModelFingerprint(model: PromptCacheModelIdentity, digest: PromptCacheDigest): string {\n return digestIdentity(\n MODEL_PREFIX,\n {\n version: 1,\n virtualProvider: model.virtualProvider ?? null,\n virtualModel: model.virtualModel ?? null,\n api: model.api ?? null,\n baseUrl: model.baseUrl ?? null,\n wireModel: model.wireModel ?? null,\n },\n digest,\n );\n}\n\nexport function createPromptCacheKey(\n parentNamespace: string,\n scope: 'parent' | 'child',\n modelFingerprint: string,\n digest: PromptCacheDigest,\n childProjection?: string,\n): string {\n return digestIdentity(\n KEY_PREFIX,\n {\n version: 1,\n parentNamespace,\n scope,\n childProjection: childProjection ?? null,\n modelFingerprint,\n },\n digest,\n );\n}\n","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 { PromptCacheUsage } from '../../types/cache';\n\nfunction recordValue(value: unknown): Readonly<Record<string, unknown>> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Readonly<Record<string, unknown>>)\n : undefined;\n}\n\nfunction nonNegativeNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : undefined;\n}\n\nfunction firstNumber(...values: readonly unknown[]): number | undefined {\n for (const value of values) {\n const number = nonNegativeNumber(value);\n if (number !== undefined) return number;\n }\n return undefined;\n}\n\nfunction normalizedUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const cacheRead = nonNegativeNumber(usage.cacheRead);\n const cacheWrite = nonNegativeNumber(usage.cacheWrite);\n if (cacheRead === undefined && cacheWrite === undefined) return undefined;\n const input = nonNegativeNumber(usage.input) ?? 0;\n return {\n cacheRead: cacheRead ?? 0,\n cacheWrite: cacheWrite ?? 0,\n totalInput: input + (cacheRead ?? 0) + (cacheWrite ?? 0),\n };\n}\n\nfunction openAiUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const promptDetails = recordValue(usage.prompt_tokens_details) ?? recordValue(usage.promptTokensDetails);\n const inputDetails = recordValue(usage.input_tokens_details) ?? recordValue(usage.inputTokensDetails);\n const cacheRead = firstNumber(\n promptDetails?.cached_tokens,\n promptDetails?.cachedTokens,\n inputDetails?.cached_tokens,\n inputDetails?.cachedTokens,\n );\n const cacheWrite = firstNumber(\n promptDetails?.cache_write_tokens,\n promptDetails?.cacheWriteTokens,\n inputDetails?.cache_write_tokens,\n inputDetails?.cacheWriteTokens,\n );\n if (cacheRead === undefined && cacheWrite === undefined) return undefined;\n const floor = (cacheRead ?? 0) + (cacheWrite ?? 0);\n const reportedTotal = firstNumber(usage.prompt_tokens, usage.promptTokens, usage.input_tokens, usage.inputTokens);\n return {\n cacheRead: cacheRead ?? 0,\n cacheWrite: cacheWrite ?? 0,\n totalInput: Math.max(reportedTotal ?? floor, floor),\n };\n}\n\nfunction anthropicUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const cacheRead = firstNumber(usage.cache_read_input_tokens, usage.cacheReadInputTokens);\n const cacheWrite = firstNumber(usage.cache_creation_input_tokens, usage.cacheCreationInputTokens);\n if (cacheRead === undefined && cacheWrite === undefined) return undefined;\n const input = firstNumber(usage.input_tokens, usage.inputTokens) ?? 0;\n return {\n cacheRead: cacheRead ?? 0,\n cacheWrite: cacheWrite ?? 0,\n totalInput: input + (cacheRead ?? 0) + (cacheWrite ?? 0),\n };\n}\n\nfunction geminiUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const metadata = recordValue(usage.usage_metadata) ?? recordValue(usage.usageMetadata) ?? usage;\n const cacheRead = firstNumber(metadata.cachedContentTokenCount, metadata.cached_content_token_count);\n if (cacheRead === undefined) return undefined;\n const totalInput = firstNumber(\n metadata.promptTokenCount,\n metadata.prompt_token_count,\n usage.input_tokens,\n usage.inputTokens,\n usage.prompt_tokens,\n usage.promptTokens,\n );\n return { cacheRead, cacheWrite: 0, totalInput: Math.max(totalInput ?? cacheRead, cacheRead) };\n}\n\n/** Normalize only usage values carried by a provider-produced assistant message. */\nexport function normalizePromptCacheUsage(message: unknown): PromptCacheUsage | undefined {\n const messageRecord = recordValue(message);\n const usage = recordValue(messageRecord?.usage);\n if (!usage) return undefined;\n return normalizedUsage(usage) ?? openAiUsage(usage) ?? anthropicUsage(usage) ?? geminiUsage(usage);\n}\n","import type { PromptCacheCapabilityClass, PromptCacheModelIdentity } from '../../types/cache';\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 { getHarnessState } from '@agimon-ai/doompi-config/harnessStore';\nimport {\n DOOM_MINOR_MODE_CATALOG_SERVICE,\n readMinorModeCatalog,\n type MinorModeRecord,\n} from '@agimon-ai/doompi-minor-mode';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionContext } from '@earendil-works/pi-coding-agent';\n\nimport { KEY_SUFFIX_LENGTH } from '../../constants/cache';\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 '../../constants/environment';\nimport type { PromptCacheMinorModeState, PromptCacheModelIdentity } from '../../types/cache';\nimport type { CacheExtensionDependencies } from '../../types/extension';\nimport { sha256Base64Url } from '../digest';\nimport { OwnedEnvironmentValue } from '../environment';\nimport {\n createParentPromptCacheNamespace,\n createPromptCacheKey,\n createPromptCacheModelFingerprint,\n createRootSessionIdentity,\n} from '../namespace';\nimport { optimizerAllowsPromptCacheKey } from '../optimizerPolicy';\nimport { normalizePromptCacheUsage } from '../promptCacheUsage';\nimport { classifyPromptCacheCapability, requestedPromptCacheRetention, rewritePromptCacheKey } from '../providerPolicy';\nimport type { CacheRuntime, OptimizerModule } from './type';\n\ntype BeforeProviderEvent = { readonly payload?: unknown };\ntype MessageEndEvent = { readonly message?: unknown };\ntype MinorModeStateWithVariant = MinorModeRecord['state'] & { readonly modelContextVariant?: string };\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\nexport function createCacheRuntime(dependencies: CacheExtensionDependencies, optimizer: OptimizerModule): CacheRuntime {\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 const plugin = (cordis: Context): void => {\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 return {\n plugin,\n events: {\n session_start: (_event, ctx) => {\n if (!isProjectedChild) {\n rootSessionId = stringValue(ctx.sessionManager.getSessionId());\n refreshParentNamespace();\n }\n },\n\n 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(\n event.payload,\n identity.api,\n key,\n optimizerAllowsPromptCacheKey(optimizer),\n );\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 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 dispose: () => {\n parentNamespaceEnvironment.restore();\n rootSessionEnvironment.restore();\n dependencies.telemetry.reset();\n },\n };\n}\n","import { type Context, Service } from '@deepseek-ai/cordis';\n\nimport type { PromptCacheTelemetryPort, PromptCacheTelemetrySnapshot } from '../../types/cache';\n\nexport const DOOM_PROMPT_CACHE_TELEMETRY_SERVICE = 'doom/prompt-cache-telemetry';\n\nexport class PromptCacheTelemetryService extends Service {\n constructor(\n context: Context,\n private readonly telemetry: PromptCacheTelemetryPort,\n ) {\n super(context, DOOM_PROMPT_CACHE_TELEMETRY_SERVICE);\n }\n\n snapshot(): PromptCacheTelemetrySnapshot {\n return this.telemetry.snapshot();\n }\n}\n\nexport function readPromptCacheTelemetry(context: Context): PromptCacheTelemetryService | undefined {\n return context.get(DOOM_PROMPT_CACHE_TELEMETRY_SERVICE) as PromptCacheTelemetryService | undefined;\n}\n\ndeclare module '@deepseek-ai/cordis' {\n interface Context {\n 'doom/prompt-cache-telemetry': PromptCacheTelemetryService;\n }\n}\n","import { defineRoot } from '@agimon-ai/doompi-core/extension-file';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/pi-extension';\n\nimport { PromptCacheTelemetry } from '../../../../models/promptCacheTelemetry';\nimport { createCacheRuntime } from '../../../../services/cacheRuntime';\nimport type { OptimizerModule } from '../../../../services/cacheRuntime/type';\nimport { PromptCacheTelemetryService } from '../../../../services/promptCacheTelemetry';\nimport type { CacheExtensionDependencies } from '../../../../types/extension';\nexport default defineRoot(async ({ pi, options }: PiPluginContext<CacheExtensionDependencies>) => {\n const dependencies = options ?? { telemetry: new PromptCacheTelemetry(), now: Date.now };\n const optimizer: OptimizerModule = await import('#doompi-cache-optimizer-source');\n if (typeof optimizer.default !== 'function')\n throw new Error('Pi Cache Optimizer does not provide an extension factory.');\n await optimizer.default(pi);\n const runtime = createCacheRuntime(dependencies, optimizer);\n return {\n value: runtime,\n services: [\n (context: PiPluginContext['context']) => {\n new PromptCacheTelemetryService(context, dependencies.telemetry);\n },\n runtime.plugin,\n ],\n onDispose: () => runtime.dispose(),\n };\n});\n","import { defineResource } from '@agimon-ai/doompi-core/extension-file';\n\nimport { CACHE_HELP_SKILL, PACKAGE_SOURCE } from '../../../../../constants/cache';\nexport default defineResource({ source: PACKAGE_SOURCE, moduleUrl: import.meta.url, skills: [CACHE_HELP_SKILL] });\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { definePiExtension, type PiPluginContext, type PiPluginContributions } from '@agimon-ai/doompi-core/pi-extension';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extension-file';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.cli';\nimport resourceDoompiUseCache from '../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-cache.cli';\n\ntype OptionsOf<T> = T extends (context: PiPluginContext<infer Options>) => unknown ? Options : never;\ntype InferredOptions = Exclude<OptionsOf<typeof rootSession> | OptionsOf<typeof resourceDoompiUseCache>, undefined>;\ntype Intersect<Union> =\n (Union extends unknown ? (value: Union) => void : never) extends (value: infer Value) => void ? Value : never;\ntype ExtensionOptions = [InferredOptions] extends [never] ? undefined : Intersect<InferredOptions>;\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\n\nexport const extension = definePiExtension<ExtensionOptions>('@agimon-ai/doompi-cache', async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get resources(): PiPluginContributions['resources'] { return [at(resourceDoompiUseCache, contextSession)]; },\n services: [...(scopeSession.services ?? [])],\n };\n});\n\nexport default extension;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pi.mjs","names":["recordValue","rootSession","resourceDoompiUseCache"],"sources":["../../src/models/promptCacheTelemetry.ts","../../src/constants/cache.ts","../../src/constants/environment.ts","../../src/services/digest/index.ts","../../src/services/environment/index.ts","../../src/services/canonical/index.ts","../../src/services/namespace/index.ts","../../src/services/optimizerPolicy/index.ts","../../src/services/promptCacheUsage/index.ts","../../src/services/providerPolicy/index.ts","../../src/services/cacheRuntime/index.ts","../../src/services/promptCacheTelemetry/index.ts","../../src/extensions/workspaces/sessions/(backend)/root.cli.ts","../../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-cache.cli.ts","../../generated/pi.ts"],"sourcesContent":["import type {\n PromptCacheObservation,\n PromptCacheRequestStatus,\n PromptCacheTelemetryPort,\n PromptCacheTelemetrySnapshot,\n PromptCacheUsage,\n} from '../types/cache';\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","export const PACKAGE_SOURCE = '@agimon-ai/doompi-cache';\nexport const KEY_SUFFIX_LENGTH = 8;\nexport const CACHE_HELP_SKILL = {\n name: 'doompi-use-cache',\n description: 'Inspect DoomPi provider prompt cache policy, routing identity, and provider-observed 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 { createHash } from 'node:crypto';\n\nexport function sha256Base64Url(value: string): string {\n return createHash('sha256').update(value).digest('base64url');\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","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';\nimport { canonicalJson } from '../canonical';\n\nconst KEY_PREFIX = 'dpc1_';\nconst PARENT_PREFIX = 'dpn1_';\nconst CHILD_PREFIX = 'dch1_';\nconst ROOT_PREFIX = 'dpr1_';\nconst MODEL_PREFIX = 'dpm1_';\n\nfunction digestIdentity(prefix: string, value: unknown, digest: PromptCacheDigest): string {\n return `${prefix}${digest(canonicalJson(value))}`;\n}\n\nfunction normalizedPersona(value: string | undefined): string | undefined {\n const normalized = value?.trim().replaceAll('\\\\', '/');\n return normalized || undefined;\n}\n\nfunction activeMinorModes(modes: readonly PromptCacheMinorModeState[]): readonly Record<string, string>[] {\n return modes\n .filter(({ activation }) => activation === 'active' || activation === 'activating')\n .map(({ source, id, modelContextVariant }) => ({\n source,\n id,\n ...(modelContextVariant ? { modelContextVariant } : {}),\n }))\n .sort((left, right) => left.source.localeCompare(right.source) || left.id.localeCompare(right.id));\n}\n\nexport function createRootSessionIdentity(rootSessionId: string, digest: PromptCacheDigest): string {\n return digestIdentity(ROOT_PREFIX, { version: 1, rootSessionId }, digest);\n}\n\nexport function createParentPromptCacheNamespace(state: PromptCacheParentState, digest: PromptCacheDigest): string {\n return digestIdentity(\n PARENT_PREFIX,\n {\n version: 1,\n rootSession: createRootSessionIdentity(state.rootSessionId, digest),\n compositionFingerprint: state.compositionFingerprint ?? null,\n majorMode: state.majorMode,\n domains: [...state.domains],\n profile: state.profile ?? null,\n persona: normalizedPersona(state.persona) ?? null,\n minorModes: activeMinorModes(state.minorModes),\n },\n digest,\n );\n}\n\nexport function createChildPromptCacheProjection(\n projection: PromptCacheChildProjection,\n digest: PromptCacheDigest,\n): string {\n return digestIdentity(\n CHILD_PREFIX,\n {\n version: 1,\n systemPrompt: projection.systemPrompt ?? null,\n tools: [...projection.tools],\n excludedTools: [...projection.excludedTools].sort((left, right) => left.localeCompare(right)),\n extensions: [...projection.extensions],\n inheritProjectContext: projection.inheritProjectContext ?? null,\n inheritSkills: projection.inheritSkills ?? null,\n fanout: projection.fanout ?? null,\n structuredOutputSchema: projection.structuredOutputSchema ?? null,\n },\n digest,\n );\n}\n\nexport function createPromptCacheModelFingerprint(model: PromptCacheModelIdentity, digest: PromptCacheDigest): string {\n return digestIdentity(\n MODEL_PREFIX,\n {\n version: 1,\n virtualProvider: model.virtualProvider ?? null,\n virtualModel: model.virtualModel ?? null,\n api: model.api ?? null,\n baseUrl: model.baseUrl ?? null,\n wireModel: model.wireModel ?? null,\n },\n digest,\n );\n}\n\nexport function createPromptCacheKey(\n parentNamespace: string,\n scope: 'parent' | 'child',\n modelFingerprint: string,\n digest: PromptCacheDigest,\n childProjection?: string,\n): string {\n return digestIdentity(\n KEY_PREFIX,\n {\n version: 1,\n parentNamespace,\n scope,\n childProjection: childProjection ?? null,\n modelFingerprint,\n },\n digest,\n );\n}\n","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 { PromptCacheUsage } from '../../types/cache';\n\nfunction recordValue(value: unknown): Readonly<Record<string, unknown>> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Readonly<Record<string, unknown>>)\n : undefined;\n}\n\nfunction nonNegativeNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : undefined;\n}\n\nfunction firstNumber(...values: readonly unknown[]): number | undefined {\n for (const value of values) {\n const number = nonNegativeNumber(value);\n if (number !== undefined) return number;\n }\n return undefined;\n}\n\nfunction normalizedUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const cacheRead = nonNegativeNumber(usage.cacheRead);\n const cacheWrite = nonNegativeNumber(usage.cacheWrite);\n if (cacheRead === undefined && cacheWrite === undefined) return undefined;\n const input = nonNegativeNumber(usage.input) ?? 0;\n return {\n cacheRead: cacheRead ?? 0,\n cacheWrite: cacheWrite ?? 0,\n totalInput: input + (cacheRead ?? 0) + (cacheWrite ?? 0),\n };\n}\n\nfunction openAiUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const promptDetails = recordValue(usage.prompt_tokens_details) ?? recordValue(usage.promptTokensDetails);\n const inputDetails = recordValue(usage.input_tokens_details) ?? recordValue(usage.inputTokensDetails);\n const cacheRead = firstNumber(\n promptDetails?.cached_tokens,\n promptDetails?.cachedTokens,\n inputDetails?.cached_tokens,\n inputDetails?.cachedTokens,\n );\n const cacheWrite = firstNumber(\n promptDetails?.cache_write_tokens,\n promptDetails?.cacheWriteTokens,\n inputDetails?.cache_write_tokens,\n inputDetails?.cacheWriteTokens,\n );\n if (cacheRead === undefined && cacheWrite === undefined) return undefined;\n const floor = (cacheRead ?? 0) + (cacheWrite ?? 0);\n const reportedTotal = firstNumber(usage.prompt_tokens, usage.promptTokens, usage.input_tokens, usage.inputTokens);\n return {\n cacheRead: cacheRead ?? 0,\n cacheWrite: cacheWrite ?? 0,\n totalInput: Math.max(reportedTotal ?? floor, floor),\n };\n}\n\nfunction anthropicUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const cacheRead = firstNumber(usage.cache_read_input_tokens, usage.cacheReadInputTokens);\n const cacheWrite = firstNumber(usage.cache_creation_input_tokens, usage.cacheCreationInputTokens);\n if (cacheRead === undefined && cacheWrite === undefined) return undefined;\n const input = firstNumber(usage.input_tokens, usage.inputTokens) ?? 0;\n return {\n cacheRead: cacheRead ?? 0,\n cacheWrite: cacheWrite ?? 0,\n totalInput: input + (cacheRead ?? 0) + (cacheWrite ?? 0),\n };\n}\n\nfunction geminiUsage(usage: Readonly<Record<string, unknown>>): PromptCacheUsage | undefined {\n const metadata = recordValue(usage.usage_metadata) ?? recordValue(usage.usageMetadata) ?? usage;\n const cacheRead = firstNumber(metadata.cachedContentTokenCount, metadata.cached_content_token_count);\n if (cacheRead === undefined) return undefined;\n const totalInput = firstNumber(\n metadata.promptTokenCount,\n metadata.prompt_token_count,\n usage.input_tokens,\n usage.inputTokens,\n usage.prompt_tokens,\n usage.promptTokens,\n );\n return { cacheRead, cacheWrite: 0, totalInput: Math.max(totalInput ?? cacheRead, cacheRead) };\n}\n\n/** Normalize only usage values carried by a provider-produced assistant message. */\nexport function normalizePromptCacheUsage(message: unknown): PromptCacheUsage | undefined {\n const messageRecord = recordValue(message);\n const usage = recordValue(messageRecord?.usage);\n if (!usage) return undefined;\n return normalizedUsage(usage) ?? openAiUsage(usage) ?? anthropicUsage(usage) ?? geminiUsage(usage);\n}\n","import type { PromptCacheCapabilityClass, PromptCacheModelIdentity } from '../../types/cache';\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 { getHarnessState } from '@agimon-ai/doompi-config/harnessStore';\nimport {\n DOOM_MINOR_MODE_CATALOG_SERVICE,\n readMinorModeCatalog,\n type MinorModeRecord,\n} from '@agimon-ai/doompi-minor-mode';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionContext } from '@earendil-works/pi-coding-agent';\n\nimport { KEY_SUFFIX_LENGTH } from '../../constants/cache';\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 '../../constants/environment';\nimport type { PromptCacheMinorModeState, PromptCacheModelIdentity } from '../../types/cache';\nimport type { CacheExtensionDependencies } from '../../types/extension';\nimport { sha256Base64Url } from '../digest';\nimport { OwnedEnvironmentValue } from '../environment';\nimport {\n createParentPromptCacheNamespace,\n createPromptCacheKey,\n createPromptCacheModelFingerprint,\n createRootSessionIdentity,\n} from '../namespace';\nimport { optimizerAllowsPromptCacheKey } from '../optimizerPolicy';\nimport { normalizePromptCacheUsage } from '../promptCacheUsage';\nimport { classifyPromptCacheCapability, requestedPromptCacheRetention, rewritePromptCacheKey } from '../providerPolicy';\nimport type { CacheRuntime, OptimizerModule } from './type';\n\ntype BeforeProviderEvent = { readonly payload?: unknown };\ntype MessageEndEvent = { readonly message?: unknown };\ntype MinorModeStateWithVariant = MinorModeRecord['state'] & { readonly modelContextVariant?: string };\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\nexport function createCacheRuntime(dependencies: CacheExtensionDependencies, optimizer: OptimizerModule): CacheRuntime {\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 const plugin = (cordis: Context): void => {\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 return {\n plugin,\n events: {\n session_start: (_event, ctx) => {\n if (!isProjectedChild) {\n rootSessionId = stringValue(ctx.sessionManager.getSessionId());\n refreshParentNamespace();\n }\n },\n\n 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(\n event.payload,\n identity.api,\n key,\n optimizerAllowsPromptCacheKey(optimizer),\n );\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 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 dispose: () => {\n parentNamespaceEnvironment.restore();\n rootSessionEnvironment.restore();\n dependencies.telemetry.reset();\n },\n };\n}\n","import { type Context, Service } from '@deepseek-ai/cordis';\n\nimport type { PromptCacheTelemetryPort, PromptCacheTelemetrySnapshot } from '../../types/cache';\n\nexport const DOOM_PROMPT_CACHE_TELEMETRY_SERVICE = 'doom/prompt-cache-telemetry';\n\nexport class PromptCacheTelemetryService extends Service {\n constructor(\n context: Context,\n private readonly telemetry: PromptCacheTelemetryPort,\n ) {\n super(context, DOOM_PROMPT_CACHE_TELEMETRY_SERVICE);\n }\n\n snapshot(): PromptCacheTelemetrySnapshot {\n return this.telemetry.snapshot();\n }\n}\n\nexport function readPromptCacheTelemetry(context: Context): PromptCacheTelemetryService | undefined {\n return context.get(DOOM_PROMPT_CACHE_TELEMETRY_SERVICE) as PromptCacheTelemetryService | undefined;\n}\n\ndeclare module '@deepseek-ai/cordis' {\n interface Context {\n 'doom/prompt-cache-telemetry': PromptCacheTelemetryService;\n }\n}\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport { PromptCacheTelemetry } from '../../../../models/promptCacheTelemetry';\nimport { createCacheRuntime } from '../../../../services/cacheRuntime';\nimport type { OptimizerModule } from '../../../../services/cacheRuntime/type';\nimport { PromptCacheTelemetryService } from '../../../../services/promptCacheTelemetry';\nimport type { CacheExtensionDependencies } from '../../../../types/extension';\nexport default defineRoot(async ({ pi, options }: PiPluginContext<CacheExtensionDependencies>) => {\n const dependencies = options ?? { telemetry: new PromptCacheTelemetry(), now: Date.now };\n const optimizer: OptimizerModule = await import('#doompi-cache-optimizer-source');\n if (typeof optimizer.default !== 'function')\n throw new Error('Pi Cache Optimizer does not provide an extension factory.');\n await optimizer.default(pi);\n const runtime = createCacheRuntime(dependencies, optimizer);\n return {\n value: runtime,\n services: [\n (context: PiPluginContext['context']) => {\n new PromptCacheTelemetryService(context, dependencies.telemetry);\n },\n runtime.plugin,\n ],\n onDispose: () => runtime.dispose(),\n };\n});\n","import { defineResource } from '@agimon-ai/doompi-core/extensionFile';\n\nimport { CACHE_HELP_SKILL, PACKAGE_SOURCE } from '../../../../../constants/cache';\nexport default defineResource({ source: PACKAGE_SOURCE, moduleUrl: import.meta.url, skills: [CACHE_HELP_SKILL] });\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { definePiExtension, type PiPluginContext, type PiPluginContributions } from '@agimon-ai/doompi-core/piExtension';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.cli';\nimport resourceDoompiUseCache from '../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-cache.cli';\n\ntype OptionsOf<T> = T extends (context: PiPluginContext<infer Options>) => unknown ? Options : never;\ntype InferredOptions = Exclude<OptionsOf<typeof rootSession> | OptionsOf<typeof resourceDoompiUseCache>, undefined>;\ntype Intersect<Union> =\n (Union extends unknown ? (value: Union) => void : never) extends (value: infer Value) => void ? Value : never;\ntype ExtensionOptions = [InferredOptions] extends [never] ? undefined : Intersect<InferredOptions>;\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\n\nexport const extension = definePiExtension<ExtensionOptions>('@agimon-ai/doompi-cache', async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get resources(): PiPluginContributions['resources'] { return [at(resourceDoompiUseCache, contextSession)]; },\n services: [...(scopeSession.services ?? [])],\n };\n});\n\nexport default extension;\n"],"mappings":"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"}
|
|
@@ -4,14 +4,14 @@ Object.defineProperties(exports, {
|
|
|
4
4
|
});
|
|
5
5
|
const require_before_provider_request_server = require("../src/extensions/workspaces/sessions/(backend)/hook/before-provider-request.server.cjs");
|
|
6
6
|
const require_session_shutdown_server = require("../src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.cjs");
|
|
7
|
-
let
|
|
7
|
+
let _agimon_ai_doompi_core_serverFacet = require("@agimon-ai/doompi-core/serverFacet");
|
|
8
8
|
//#region generated/server.ts
|
|
9
9
|
const at = (value, context) => typeof value === "function" ? value(context) : value;
|
|
10
10
|
const via = (identity, value) => ({
|
|
11
11
|
...identity,
|
|
12
12
|
...value
|
|
13
13
|
});
|
|
14
|
-
const facet = (0,
|
|
14
|
+
const facet = (0, _agimon_ai_doompi_core_serverFacet.defineServerPlugin)({
|
|
15
15
|
name: "@agimon-ai/doompi-cache",
|
|
16
16
|
session: (context) => ({ get hooks() {
|
|
17
17
|
return [via({ event: "before_provider_request" }, at(require_before_provider_request_server.default, context)), via({ event: "session_shutdown" }, at(require_session_shutdown_server.default, context))];
|