@agimon-ai/po-cache 0.0.0-alpha.0

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.
Files changed (39) hide show
  1. package/LICENSE +46 -0
  2. package/README.md +77 -0
  3. package/dist/apiContracts.cjs +17 -0
  4. package/dist/apiContracts.cjs.map +1 -0
  5. package/dist/apiContracts.d.mts +53 -0
  6. package/dist/apiContracts.d.mts.map +1 -0
  7. package/dist/apiContracts.mjs +13 -0
  8. package/dist/apiContracts.mjs.map +1 -0
  9. package/dist/env.cjs +7 -0
  10. package/dist/env.d.mts +8 -0
  11. package/dist/env.d.mts.map +1 -0
  12. package/dist/env.mjs +2 -0
  13. package/dist/environment-CRhmV8ze.cjs +39 -0
  14. package/dist/environment-CRhmV8ze.cjs.map +1 -0
  15. package/dist/environment-vyw-n84h.mjs +10 -0
  16. package/dist/environment-vyw-n84h.mjs.map +1 -0
  17. package/dist/extensions/mcp.cjs +26 -0
  18. package/dist/extensions/mcp.cjs.map +1 -0
  19. package/dist/extensions/mcp.d.mts +5 -0
  20. package/dist/extensions/mcp.d.mts.map +1 -0
  21. package/dist/extensions/mcp.mjs +21 -0
  22. package/dist/extensions/mcp.mjs.map +1 -0
  23. package/dist/extensions/server.cjs +3706 -0
  24. package/dist/extensions/server.cjs.map +1 -0
  25. package/dist/extensions/server.d.mts +5 -0
  26. package/dist/extensions/server.d.mts.map +1 -0
  27. package/dist/extensions/server.mjs +3701 -0
  28. package/dist/extensions/server.mjs.map +1 -0
  29. package/dist/index.cjs +17 -0
  30. package/dist/index.d.mts +116 -0
  31. package/dist/index.d.mts.map +1 -0
  32. package/dist/index.mjs +2 -0
  33. package/dist/promptCacheTelemetry-BU1fIhb8.cjs +289 -0
  34. package/dist/promptCacheTelemetry-BU1fIhb8.cjs.map +1 -0
  35. package/dist/promptCacheTelemetry-CguL1ZqT.mjs +200 -0
  36. package/dist/promptCacheTelemetry-CguL1ZqT.mjs.map +1 -0
  37. package/llms.txt +11 -0
  38. package/package.json +114 -0
  39. package/src/prompts/po-use-cache/SKILL.md +13 -0
package/dist/index.cjs ADDED
@@ -0,0 +1,17 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_promptCacheTelemetry = require("./promptCacheTelemetry-BU1fIhb8.cjs");
3
+ exports.DOOM_PROMPT_CACHE_TELEMETRY_SERVICE = require_promptCacheTelemetry.DOOM_PROMPT_CACHE_TELEMETRY_SERVICE;
4
+ exports.PromptCacheTelemetry = require_promptCacheTelemetry.PromptCacheTelemetry;
5
+ exports.PromptCacheTelemetryService = require_promptCacheTelemetry.PromptCacheTelemetryService;
6
+ exports.canonicalJson = require_promptCacheTelemetry.canonicalJson;
7
+ exports.canonicalValue = require_promptCacheTelemetry.canonicalValue;
8
+ exports.classifyPromptCacheCapability = require_promptCacheTelemetry.classifyPromptCacheCapability;
9
+ exports.createChildPromptCacheProjection = require_promptCacheTelemetry.createChildPromptCacheProjection;
10
+ exports.createParentPromptCacheNamespace = require_promptCacheTelemetry.createParentPromptCacheNamespace;
11
+ exports.createPromptCacheKey = require_promptCacheTelemetry.createPromptCacheKey;
12
+ exports.createPromptCacheModelFingerprint = require_promptCacheTelemetry.createPromptCacheModelFingerprint;
13
+ exports.createRootSessionIdentity = require_promptCacheTelemetry.createRootSessionIdentity;
14
+ exports.readPromptCacheTelemetry = require_promptCacheTelemetry.readPromptCacheTelemetry;
15
+ exports.requestedPromptCacheRetention = require_promptCacheTelemetry.requestedPromptCacheRetention;
16
+ exports.rewritePromptCacheKey = require_promptCacheTelemetry.rewritePromptCacheKey;
17
+ exports.sha256Base64Url = require_promptCacheTelemetry.sha256Base64Url;
@@ -0,0 +1,116 @@
1
+ import { Context, Service } from "@deepseek-ai/cordis";
2
+ //#region src/services/digest/index.d.ts
3
+ export declare function sha256Base64Url(value: string): string;
4
+ //#endregion
5
+ //#region src/types/cache.d.ts
6
+ type PromptCacheCapabilityClass = 'key-and-long-retention' | 'key-only' | 'marker-only' | 'automatic' | 'unknown';
7
+ interface PromptCacheMinorModeState {
8
+ readonly source: string;
9
+ readonly id: string;
10
+ readonly activation: string;
11
+ readonly modelContextVariant?: string;
12
+ }
13
+ interface PromptCacheParentState {
14
+ readonly rootSessionId: string;
15
+ readonly compositionFingerprint?: string;
16
+ readonly majorMode: string;
17
+ readonly domains: readonly string[];
18
+ readonly profile?: string;
19
+ readonly persona?: string;
20
+ readonly minorModes: readonly PromptCacheMinorModeState[];
21
+ }
22
+ interface PromptCacheChildProjection {
23
+ readonly systemPrompt?: string;
24
+ readonly tools: readonly string[];
25
+ readonly excludedTools: readonly string[];
26
+ readonly extensions: readonly string[];
27
+ readonly inheritProjectContext?: boolean;
28
+ readonly inheritSkills?: boolean;
29
+ readonly fanout?: boolean;
30
+ readonly structuredOutputSchema?: unknown;
31
+ }
32
+ interface PromptCacheModelIdentity {
33
+ readonly virtualProvider?: string;
34
+ readonly virtualModel?: string;
35
+ readonly api?: string;
36
+ readonly baseUrl?: string;
37
+ readonly wireModel?: string;
38
+ }
39
+ interface PromptCacheDigest {
40
+ (value: string): string;
41
+ }
42
+ interface PromptCacheUsage {
43
+ readonly cacheRead: number;
44
+ readonly cacheWrite: number;
45
+ readonly totalInput: number;
46
+ }
47
+ interface PromptCacheObservation extends PromptCacheUsage {
48
+ readonly namespace: string;
49
+ readonly modelFingerprint: string;
50
+ readonly observedAt: number;
51
+ }
52
+ interface PromptCacheRequestStatus {
53
+ readonly capability: PromptCacheCapabilityClass;
54
+ readonly namespace?: string;
55
+ readonly modelFingerprint?: string;
56
+ readonly requestedRetention?: string;
57
+ readonly keySuffix?: string;
58
+ }
59
+ interface PromptCacheTelemetrySnapshot extends PromptCacheRequestStatus {
60
+ readonly residency: 'unknown';
61
+ readonly observations: readonly PromptCacheObservation[];
62
+ readonly lastObservation?: PromptCacheObservation;
63
+ }
64
+ interface PromptCacheTelemetryPort {
65
+ beginRequest(status: PromptCacheRequestStatus): void;
66
+ observe(usage: PromptCacheUsage, observedAt: number): void;
67
+ snapshot(): PromptCacheTelemetrySnapshot;
68
+ reset(): void;
69
+ }
70
+ //#endregion
71
+ //#region src/services/promptCacheTelemetry/index.d.ts
72
+ export declare const DOOM_PROMPT_CACHE_TELEMETRY_SERVICE = "doom/prompt-cache-telemetry";
73
+ export declare class PromptCacheTelemetryService extends Service {
74
+ private readonly telemetry;
75
+ constructor(context: Context, telemetry: PromptCacheTelemetryPort);
76
+ snapshot(): PromptCacheTelemetrySnapshot;
77
+ }
78
+ export declare function readPromptCacheTelemetry(context: Context): PromptCacheTelemetryService | undefined;
79
+ declare module '@deepseek-ai/cordis' {
80
+ interface Context {
81
+ 'doom/prompt-cache-telemetry': PromptCacheTelemetryService;
82
+ }
83
+ }
84
+ //#endregion
85
+ //#region src/services/canonical/index.d.ts
86
+ type CanonicalValue = null | boolean | number | string | readonly CanonicalValue[] | CanonicalObject;
87
+ interface CanonicalObject {
88
+ readonly [key: string]: CanonicalValue;
89
+ }
90
+ export declare function canonicalValue(value: unknown): CanonicalValue;
91
+ export declare function canonicalJson(value: unknown): string;
92
+ //#endregion
93
+ //#region src/services/namespace/index.d.ts
94
+ export declare function createRootSessionIdentity(rootSessionId: string, digest: PromptCacheDigest): string;
95
+ export declare function createParentPromptCacheNamespace(state: PromptCacheParentState, digest: PromptCacheDigest): string;
96
+ export declare function createChildPromptCacheProjection(projection: PromptCacheChildProjection, digest: PromptCacheDigest): string;
97
+ export declare function createPromptCacheModelFingerprint(model: PromptCacheModelIdentity, digest: PromptCacheDigest): string;
98
+ export declare function createPromptCacheKey(parentNamespace: string, scope: 'parent' | 'child', modelFingerprint: string, digest: PromptCacheDigest, childProjection?: string): string;
99
+ //#endregion
100
+ //#region src/services/providerPolicy/index.d.ts
101
+ export declare function classifyPromptCacheCapability(model: PromptCacheModelIdentity): PromptCacheCapabilityClass;
102
+ export declare function rewritePromptCacheKey(payload: unknown, api: string | undefined, key: string, enabled: boolean): Record<string, unknown> | undefined;
103
+ export declare function requestedPromptCacheRetention(payload: unknown): string | undefined;
104
+ //#endregion
105
+ //#region src/models/promptCacheTelemetry.d.ts
106
+ export declare class PromptCacheTelemetry implements PromptCacheTelemetryPort {
107
+ #private;
108
+ constructor(limit?: number);
109
+ beginRequest(status: PromptCacheRequestStatus): void;
110
+ observe(usage: PromptCacheUsage, observedAt: number): void;
111
+ snapshot(): PromptCacheTelemetrySnapshot;
112
+ reset(): void;
113
+ }
114
+ //#endregion
115
+ export type { CanonicalObject, CanonicalValue, PromptCacheCapabilityClass, PromptCacheChildProjection, PromptCacheDigest, PromptCacheMinorModeState, PromptCacheModelIdentity, PromptCacheObservation, PromptCacheParentState, PromptCacheRequestStatus, PromptCacheTelemetryPort, PromptCacheTelemetrySnapshot, PromptCacheUsage };
116
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/services/digest/index.ts","../src/types/cache.ts","../src/services/promptCacheTelemetry/index.ts","../src/services/canonical/index.ts","../src/services/namespace/index.ts","../src/services/providerPolicy/index.ts","../src/models/promptCacheTelemetry.ts"],"mappings":";;wBAEgB,gBAAgB;;;KCFpB;UAOK;WACN;WACA;WACA;WACA;;UAGM;WACN;WACA;WACA;WACA;WACA;WACA;WACA,qBAAqB;;UAGf;WACN;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;UAGM;WACN;WACA;WACA;WACA;WACA;;UAGM;GACd;;UAGc;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;;;;qBCzEW;qBAEA,oCAAoC;mBAG5B;EAFnB,YACE,SAAS,SACQ,WAAW;EAK9B,YAAY;;wBAKE,yBAAyB,SAAS,UAAU;;YAKhD;IACR,+BAA+B;;;;;KCzBvB,6DAA6D,mBAAmB;UAE3E;YACL,cAAc;;wBAQV,eAAe,iBAAiB;wBAiBhC,cAAc;;;wBCOd,0BAA0B,uBAAuB,QAAQ;wBAIzD,iCAAiC,OAAO,wBAAwB,QAAQ;wBAiBxE,iCACd,YAAY,4BACZ,QAAQ;wBAmBM,kCAAkC,OAAO,0BAA0B,QAAQ;wBAe3E,qBACd,yBACA,2BACA,0BACA,QAAQ,mBACR;;;wBCjFc,8BAA8B,OAAO,2BAA2B;wBAUhE,sBACd,kBACA,yBACA,aACA,mBACC;wBAOa,8BAA8B;;;qBC5BjC,gCAAgC;;EAK3C,YAAY;EAMZ,aAAa,QAAQ;EAIrB,QAAQ,OAAO,kBAAkB;EAkBjC,YAAY;EAUZ"}
package/dist/index.mjs ADDED
@@ -0,0 +1,2 @@
1
+ import { a as createChildPromptCacheProjection, c as createPromptCacheModelFingerprint, d as canonicalValue, f as DOOM_PROMPT_CACHE_TELEMETRY_SERVICE, h as sha256Base64Url, i as rewritePromptCacheKey, l as createRootSessionIdentity, m as readPromptCacheTelemetry, n as classifyPromptCacheCapability, o as createParentPromptCacheNamespace, p as PromptCacheTelemetryService, r as requestedPromptCacheRetention, s as createPromptCacheKey, t as PromptCacheTelemetry, u as canonicalJson } from "./promptCacheTelemetry-CguL1ZqT.mjs";
2
+ export { DOOM_PROMPT_CACHE_TELEMETRY_SERVICE, PromptCacheTelemetry, PromptCacheTelemetryService, canonicalJson, canonicalValue, classifyPromptCacheCapability, createChildPromptCacheProjection, createParentPromptCacheNamespace, createPromptCacheKey, createPromptCacheModelFingerprint, createRootSessionIdentity, readPromptCacheTelemetry, requestedPromptCacheRetention, rewritePromptCacheKey, sha256Base64Url };
@@ -0,0 +1,289 @@
1
+ let node_crypto = require("node:crypto");
2
+ let _deepseek_ai_cordis = require("@deepseek-ai/cordis");
3
+ //#region src/services/digest/index.ts
4
+ function sha256Base64Url(value) {
5
+ return (0, node_crypto.createHash)("sha256").update(value).digest("base64url");
6
+ }
7
+ //#endregion
8
+ //#region src/services/promptCacheTelemetry/index.ts
9
+ const DOOM_PROMPT_CACHE_TELEMETRY_SERVICE = "doom/prompt-cache-telemetry";
10
+ var PromptCacheTelemetryService = class extends _deepseek_ai_cordis.Service {
11
+ telemetry;
12
+ constructor(context, telemetry) {
13
+ super(context, DOOM_PROMPT_CACHE_TELEMETRY_SERVICE);
14
+ this.telemetry = telemetry;
15
+ }
16
+ snapshot() {
17
+ return this.telemetry.snapshot();
18
+ }
19
+ };
20
+ function readPromptCacheTelemetry(context) {
21
+ return context.get(DOOM_PROMPT_CACHE_TELEMETRY_SERVICE);
22
+ }
23
+ //#endregion
24
+ //#region src/services/canonical/index.ts
25
+ function canonicalNumber(value) {
26
+ if (!Number.isFinite(value)) throw new Error("Prompt cache identity cannot contain a non-finite number.");
27
+ return Object.is(value, -0) ? 0 : value;
28
+ }
29
+ function canonicalValue(value) {
30
+ if (value === null) return null;
31
+ if (typeof value === "string") return value.normalize("NFC");
32
+ if (typeof value === "boolean") return value;
33
+ if (typeof value === "number") return canonicalNumber(value);
34
+ if (Array.isArray(value)) return value.map((entry) => canonicalValue(entry));
35
+ if (typeof value !== "object") throw new Error(`Unsupported prompt cache identity value: ${typeof value}.`);
36
+ const record = value;
37
+ const result = {};
38
+ for (const key of Object.keys(record).sort((left, right) => left.localeCompare(right))) {
39
+ const entry = record[key];
40
+ if (entry !== void 0) result[key.normalize("NFC")] = canonicalValue(entry);
41
+ }
42
+ return result;
43
+ }
44
+ function canonicalJson(value) {
45
+ return JSON.stringify(canonicalValue(value));
46
+ }
47
+ //#endregion
48
+ //#region src/services/namespace/index.ts
49
+ const KEY_PREFIX = "dpc1_";
50
+ const PARENT_PREFIX = "dpn1_";
51
+ const CHILD_PREFIX = "dch1_";
52
+ const ROOT_PREFIX = "dpr1_";
53
+ const MODEL_PREFIX = "dpm1_";
54
+ function digestIdentity(prefix, value, digest) {
55
+ return `${prefix}${digest(canonicalJson(value))}`;
56
+ }
57
+ function normalizedPersona(value) {
58
+ return value?.trim().replaceAll("\\", "/") || void 0;
59
+ }
60
+ function activeMinorModes(modes) {
61
+ return modes.filter(({ activation }) => activation === "active" || activation === "activating").map(({ source, id, modelContextVariant }) => ({
62
+ source,
63
+ id,
64
+ ...modelContextVariant ? { modelContextVariant } : {}
65
+ })).sort((left, right) => left.source.localeCompare(right.source) || left.id.localeCompare(right.id));
66
+ }
67
+ function createRootSessionIdentity(rootSessionId, digest) {
68
+ return digestIdentity(ROOT_PREFIX, {
69
+ version: 1,
70
+ rootSessionId
71
+ }, digest);
72
+ }
73
+ function createParentPromptCacheNamespace(state, digest) {
74
+ return digestIdentity(PARENT_PREFIX, {
75
+ version: 1,
76
+ rootSession: createRootSessionIdentity(state.rootSessionId, digest),
77
+ compositionFingerprint: state.compositionFingerprint ?? null,
78
+ majorMode: state.majorMode,
79
+ domains: [...state.domains],
80
+ profile: state.profile ?? null,
81
+ persona: normalizedPersona(state.persona) ?? null,
82
+ minorModes: activeMinorModes(state.minorModes)
83
+ }, digest);
84
+ }
85
+ function createChildPromptCacheProjection(projection, digest) {
86
+ return digestIdentity(CHILD_PREFIX, {
87
+ version: 1,
88
+ systemPrompt: projection.systemPrompt ?? null,
89
+ tools: [...projection.tools],
90
+ excludedTools: [...projection.excludedTools].sort((left, right) => left.localeCompare(right)),
91
+ extensions: [...projection.extensions],
92
+ inheritProjectContext: projection.inheritProjectContext ?? null,
93
+ inheritSkills: projection.inheritSkills ?? null,
94
+ fanout: projection.fanout ?? null,
95
+ structuredOutputSchema: projection.structuredOutputSchema ?? null
96
+ }, digest);
97
+ }
98
+ function createPromptCacheModelFingerprint(model, digest) {
99
+ return digestIdentity(MODEL_PREFIX, {
100
+ version: 1,
101
+ virtualProvider: model.virtualProvider ?? null,
102
+ virtualModel: model.virtualModel ?? null,
103
+ api: model.api ?? null,
104
+ baseUrl: model.baseUrl ?? null,
105
+ wireModel: model.wireModel ?? null
106
+ }, digest);
107
+ }
108
+ function createPromptCacheKey(parentNamespace, scope, modelFingerprint, digest, childProjection) {
109
+ return digestIdentity(KEY_PREFIX, {
110
+ version: 1,
111
+ parentNamespace,
112
+ scope,
113
+ childProjection: childProjection ?? null,
114
+ modelFingerprint
115
+ }, digest);
116
+ }
117
+ //#endregion
118
+ //#region src/services/providerPolicy/index.ts
119
+ const ROUTING_KEY_APIS = /* @__PURE__ */ new Set([
120
+ "openai-completions",
121
+ "openai-responses",
122
+ "openai-codex-responses",
123
+ "azure-openai-responses"
124
+ ]);
125
+ const MARKER_APIS = /* @__PURE__ */ new Set(["anthropic-messages", "bedrock-converse-stream"]);
126
+ const AUTOMATIC_APIS = /* @__PURE__ */ new Set([
127
+ "google-generative-ai",
128
+ "google-vertex",
129
+ "google-vertex-anthropic"
130
+ ]);
131
+ function isRecord(value) {
132
+ return typeof value === "object" && value !== null && !Array.isArray(value);
133
+ }
134
+ function classifyPromptCacheCapability(model) {
135
+ if (model.api === "openai-responses" || model.api === "openai-completions") return model.virtualProvider === "openai" ? "key-and-long-retention" : "key-only";
136
+ if (model.api && ROUTING_KEY_APIS.has(model.api)) return "key-only";
137
+ if (model.api && MARKER_APIS.has(model.api)) return "marker-only";
138
+ if (model.api && AUTOMATIC_APIS.has(model.api)) return "automatic";
139
+ return "unknown";
140
+ }
141
+ function rewritePromptCacheKey(payload, api, key, enabled) {
142
+ if (!enabled || !api || !ROUTING_KEY_APIS.has(api) || !isRecord(payload)) return void 0;
143
+ const current = payload.prompt_cache_key;
144
+ if (typeof current !== "string" || !current.trim() || current === key) return void 0;
145
+ return {
146
+ ...payload,
147
+ prompt_cache_key: key
148
+ };
149
+ }
150
+ function requestedPromptCacheRetention(payload) {
151
+ if (!isRecord(payload)) return void 0;
152
+ const retention = payload.prompt_cache_retention;
153
+ return typeof retention === "string" && retention.trim() ? retention.trim() : void 0;
154
+ }
155
+ //#endregion
156
+ //#region src/models/promptCacheTelemetry.ts
157
+ const DEFAULT_OBSERVATION_LIMIT = 64;
158
+ var PromptCacheTelemetry = class {
159
+ #limit;
160
+ #request = { capability: "unknown" };
161
+ #observations = [];
162
+ constructor(limit = DEFAULT_OBSERVATION_LIMIT) {
163
+ if (!Number.isInteger(limit) || limit < 1) throw new Error("Prompt cache telemetry limit must be a positive integer.");
164
+ this.#limit = limit;
165
+ }
166
+ beginRequest(status) {
167
+ this.#request = { ...status };
168
+ }
169
+ observe(usage, observedAt) {
170
+ const namespace = this.#request.namespace;
171
+ const modelFingerprint = this.#request.modelFingerprint;
172
+ if (!namespace || !modelFingerprint) return;
173
+ this.#observations.push({
174
+ namespace,
175
+ modelFingerprint,
176
+ cacheRead: usage.cacheRead,
177
+ cacheWrite: usage.cacheWrite,
178
+ totalInput: usage.totalInput,
179
+ observedAt
180
+ });
181
+ if (this.#observations.length > this.#limit) this.#observations.splice(0, this.#observations.length - this.#limit);
182
+ }
183
+ snapshot() {
184
+ const observations = [...this.#observations];
185
+ return {
186
+ ...this.#request,
187
+ residency: "unknown",
188
+ observations,
189
+ ...observations.length > 0 ? { lastObservation: observations.at(-1) } : {}
190
+ };
191
+ }
192
+ reset() {
193
+ this.#request = { capability: "unknown" };
194
+ this.#observations = [];
195
+ }
196
+ };
197
+ //#endregion
198
+ Object.defineProperty(exports, "DOOM_PROMPT_CACHE_TELEMETRY_SERVICE", {
199
+ enumerable: true,
200
+ get: function() {
201
+ return DOOM_PROMPT_CACHE_TELEMETRY_SERVICE;
202
+ }
203
+ });
204
+ Object.defineProperty(exports, "PromptCacheTelemetry", {
205
+ enumerable: true,
206
+ get: function() {
207
+ return PromptCacheTelemetry;
208
+ }
209
+ });
210
+ Object.defineProperty(exports, "PromptCacheTelemetryService", {
211
+ enumerable: true,
212
+ get: function() {
213
+ return PromptCacheTelemetryService;
214
+ }
215
+ });
216
+ Object.defineProperty(exports, "canonicalJson", {
217
+ enumerable: true,
218
+ get: function() {
219
+ return canonicalJson;
220
+ }
221
+ });
222
+ Object.defineProperty(exports, "canonicalValue", {
223
+ enumerable: true,
224
+ get: function() {
225
+ return canonicalValue;
226
+ }
227
+ });
228
+ Object.defineProperty(exports, "classifyPromptCacheCapability", {
229
+ enumerable: true,
230
+ get: function() {
231
+ return classifyPromptCacheCapability;
232
+ }
233
+ });
234
+ Object.defineProperty(exports, "createChildPromptCacheProjection", {
235
+ enumerable: true,
236
+ get: function() {
237
+ return createChildPromptCacheProjection;
238
+ }
239
+ });
240
+ Object.defineProperty(exports, "createParentPromptCacheNamespace", {
241
+ enumerable: true,
242
+ get: function() {
243
+ return createParentPromptCacheNamespace;
244
+ }
245
+ });
246
+ Object.defineProperty(exports, "createPromptCacheKey", {
247
+ enumerable: true,
248
+ get: function() {
249
+ return createPromptCacheKey;
250
+ }
251
+ });
252
+ Object.defineProperty(exports, "createPromptCacheModelFingerprint", {
253
+ enumerable: true,
254
+ get: function() {
255
+ return createPromptCacheModelFingerprint;
256
+ }
257
+ });
258
+ Object.defineProperty(exports, "createRootSessionIdentity", {
259
+ enumerable: true,
260
+ get: function() {
261
+ return createRootSessionIdentity;
262
+ }
263
+ });
264
+ Object.defineProperty(exports, "readPromptCacheTelemetry", {
265
+ enumerable: true,
266
+ get: function() {
267
+ return readPromptCacheTelemetry;
268
+ }
269
+ });
270
+ Object.defineProperty(exports, "requestedPromptCacheRetention", {
271
+ enumerable: true,
272
+ get: function() {
273
+ return requestedPromptCacheRetention;
274
+ }
275
+ });
276
+ Object.defineProperty(exports, "rewritePromptCacheKey", {
277
+ enumerable: true,
278
+ get: function() {
279
+ return rewritePromptCacheKey;
280
+ }
281
+ });
282
+ Object.defineProperty(exports, "sha256Base64Url", {
283
+ enumerable: true,
284
+ get: function() {
285
+ return sha256Base64Url;
286
+ }
287
+ });
288
+
289
+ //# sourceMappingURL=promptCacheTelemetry-BU1fIhb8.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promptCacheTelemetry-BU1fIhb8.cjs","names":["createHash","Service"],"sources":["../src/services/digest/index.ts","../src/services/promptCacheTelemetry/index.ts","../src/services/canonical/index.ts","../src/services/namespace/index.ts","../src/services/providerPolicy/index.ts","../src/models/promptCacheTelemetry.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\n\nexport function sha256Base64Url(value: string): string {\n return createHash('sha256').update(value).digest('base64url');\n}\n","import { type Context, Service } from '@deepseek-ai/cordis';\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","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","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 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"],"mappings":"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"}
@@ -0,0 +1,200 @@
1
+ import { createHash } from "node:crypto";
2
+ import { Service } from "@deepseek-ai/cordis";
3
+ //#region src/services/digest/index.ts
4
+ function sha256Base64Url(value) {
5
+ return createHash("sha256").update(value).digest("base64url");
6
+ }
7
+ //#endregion
8
+ //#region src/services/promptCacheTelemetry/index.ts
9
+ const DOOM_PROMPT_CACHE_TELEMETRY_SERVICE = "doom/prompt-cache-telemetry";
10
+ var PromptCacheTelemetryService = class extends Service {
11
+ telemetry;
12
+ constructor(context, telemetry) {
13
+ super(context, DOOM_PROMPT_CACHE_TELEMETRY_SERVICE);
14
+ this.telemetry = telemetry;
15
+ }
16
+ snapshot() {
17
+ return this.telemetry.snapshot();
18
+ }
19
+ };
20
+ function readPromptCacheTelemetry(context) {
21
+ return context.get(DOOM_PROMPT_CACHE_TELEMETRY_SERVICE);
22
+ }
23
+ //#endregion
24
+ //#region src/services/canonical/index.ts
25
+ function canonicalNumber(value) {
26
+ if (!Number.isFinite(value)) throw new Error("Prompt cache identity cannot contain a non-finite number.");
27
+ return Object.is(value, -0) ? 0 : value;
28
+ }
29
+ function canonicalValue(value) {
30
+ if (value === null) return null;
31
+ if (typeof value === "string") return value.normalize("NFC");
32
+ if (typeof value === "boolean") return value;
33
+ if (typeof value === "number") return canonicalNumber(value);
34
+ if (Array.isArray(value)) return value.map((entry) => canonicalValue(entry));
35
+ if (typeof value !== "object") throw new Error(`Unsupported prompt cache identity value: ${typeof value}.`);
36
+ const record = value;
37
+ const result = {};
38
+ for (const key of Object.keys(record).sort((left, right) => left.localeCompare(right))) {
39
+ const entry = record[key];
40
+ if (entry !== void 0) result[key.normalize("NFC")] = canonicalValue(entry);
41
+ }
42
+ return result;
43
+ }
44
+ function canonicalJson(value) {
45
+ return JSON.stringify(canonicalValue(value));
46
+ }
47
+ //#endregion
48
+ //#region src/services/namespace/index.ts
49
+ const KEY_PREFIX = "dpc1_";
50
+ const PARENT_PREFIX = "dpn1_";
51
+ const CHILD_PREFIX = "dch1_";
52
+ const ROOT_PREFIX = "dpr1_";
53
+ const MODEL_PREFIX = "dpm1_";
54
+ function digestIdentity(prefix, value, digest) {
55
+ return `${prefix}${digest(canonicalJson(value))}`;
56
+ }
57
+ function normalizedPersona(value) {
58
+ return value?.trim().replaceAll("\\", "/") || void 0;
59
+ }
60
+ function activeMinorModes(modes) {
61
+ return modes.filter(({ activation }) => activation === "active" || activation === "activating").map(({ source, id, modelContextVariant }) => ({
62
+ source,
63
+ id,
64
+ ...modelContextVariant ? { modelContextVariant } : {}
65
+ })).sort((left, right) => left.source.localeCompare(right.source) || left.id.localeCompare(right.id));
66
+ }
67
+ function createRootSessionIdentity(rootSessionId, digest) {
68
+ return digestIdentity(ROOT_PREFIX, {
69
+ version: 1,
70
+ rootSessionId
71
+ }, digest);
72
+ }
73
+ function createParentPromptCacheNamespace(state, digest) {
74
+ return digestIdentity(PARENT_PREFIX, {
75
+ version: 1,
76
+ rootSession: createRootSessionIdentity(state.rootSessionId, digest),
77
+ compositionFingerprint: state.compositionFingerprint ?? null,
78
+ majorMode: state.majorMode,
79
+ domains: [...state.domains],
80
+ profile: state.profile ?? null,
81
+ persona: normalizedPersona(state.persona) ?? null,
82
+ minorModes: activeMinorModes(state.minorModes)
83
+ }, digest);
84
+ }
85
+ function createChildPromptCacheProjection(projection, digest) {
86
+ return digestIdentity(CHILD_PREFIX, {
87
+ version: 1,
88
+ systemPrompt: projection.systemPrompt ?? null,
89
+ tools: [...projection.tools],
90
+ excludedTools: [...projection.excludedTools].sort((left, right) => left.localeCompare(right)),
91
+ extensions: [...projection.extensions],
92
+ inheritProjectContext: projection.inheritProjectContext ?? null,
93
+ inheritSkills: projection.inheritSkills ?? null,
94
+ fanout: projection.fanout ?? null,
95
+ structuredOutputSchema: projection.structuredOutputSchema ?? null
96
+ }, digest);
97
+ }
98
+ function createPromptCacheModelFingerprint(model, digest) {
99
+ return digestIdentity(MODEL_PREFIX, {
100
+ version: 1,
101
+ virtualProvider: model.virtualProvider ?? null,
102
+ virtualModel: model.virtualModel ?? null,
103
+ api: model.api ?? null,
104
+ baseUrl: model.baseUrl ?? null,
105
+ wireModel: model.wireModel ?? null
106
+ }, digest);
107
+ }
108
+ function createPromptCacheKey(parentNamespace, scope, modelFingerprint, digest, childProjection) {
109
+ return digestIdentity(KEY_PREFIX, {
110
+ version: 1,
111
+ parentNamespace,
112
+ scope,
113
+ childProjection: childProjection ?? null,
114
+ modelFingerprint
115
+ }, digest);
116
+ }
117
+ //#endregion
118
+ //#region src/services/providerPolicy/index.ts
119
+ const ROUTING_KEY_APIS = /* @__PURE__ */ new Set([
120
+ "openai-completions",
121
+ "openai-responses",
122
+ "openai-codex-responses",
123
+ "azure-openai-responses"
124
+ ]);
125
+ const MARKER_APIS = /* @__PURE__ */ new Set(["anthropic-messages", "bedrock-converse-stream"]);
126
+ const AUTOMATIC_APIS = /* @__PURE__ */ new Set([
127
+ "google-generative-ai",
128
+ "google-vertex",
129
+ "google-vertex-anthropic"
130
+ ]);
131
+ function isRecord(value) {
132
+ return typeof value === "object" && value !== null && !Array.isArray(value);
133
+ }
134
+ function classifyPromptCacheCapability(model) {
135
+ if (model.api === "openai-responses" || model.api === "openai-completions") return model.virtualProvider === "openai" ? "key-and-long-retention" : "key-only";
136
+ if (model.api && ROUTING_KEY_APIS.has(model.api)) return "key-only";
137
+ if (model.api && MARKER_APIS.has(model.api)) return "marker-only";
138
+ if (model.api && AUTOMATIC_APIS.has(model.api)) return "automatic";
139
+ return "unknown";
140
+ }
141
+ function rewritePromptCacheKey(payload, api, key, enabled) {
142
+ if (!enabled || !api || !ROUTING_KEY_APIS.has(api) || !isRecord(payload)) return void 0;
143
+ const current = payload.prompt_cache_key;
144
+ if (typeof current !== "string" || !current.trim() || current === key) return void 0;
145
+ return {
146
+ ...payload,
147
+ prompt_cache_key: key
148
+ };
149
+ }
150
+ function requestedPromptCacheRetention(payload) {
151
+ if (!isRecord(payload)) return void 0;
152
+ const retention = payload.prompt_cache_retention;
153
+ return typeof retention === "string" && retention.trim() ? retention.trim() : void 0;
154
+ }
155
+ //#endregion
156
+ //#region src/models/promptCacheTelemetry.ts
157
+ const DEFAULT_OBSERVATION_LIMIT = 64;
158
+ var PromptCacheTelemetry = class {
159
+ #limit;
160
+ #request = { capability: "unknown" };
161
+ #observations = [];
162
+ constructor(limit = DEFAULT_OBSERVATION_LIMIT) {
163
+ if (!Number.isInteger(limit) || limit < 1) throw new Error("Prompt cache telemetry limit must be a positive integer.");
164
+ this.#limit = limit;
165
+ }
166
+ beginRequest(status) {
167
+ this.#request = { ...status };
168
+ }
169
+ observe(usage, observedAt) {
170
+ const namespace = this.#request.namespace;
171
+ const modelFingerprint = this.#request.modelFingerprint;
172
+ if (!namespace || !modelFingerprint) return;
173
+ this.#observations.push({
174
+ namespace,
175
+ modelFingerprint,
176
+ cacheRead: usage.cacheRead,
177
+ cacheWrite: usage.cacheWrite,
178
+ totalInput: usage.totalInput,
179
+ observedAt
180
+ });
181
+ if (this.#observations.length > this.#limit) this.#observations.splice(0, this.#observations.length - this.#limit);
182
+ }
183
+ snapshot() {
184
+ const observations = [...this.#observations];
185
+ return {
186
+ ...this.#request,
187
+ residency: "unknown",
188
+ observations,
189
+ ...observations.length > 0 ? { lastObservation: observations.at(-1) } : {}
190
+ };
191
+ }
192
+ reset() {
193
+ this.#request = { capability: "unknown" };
194
+ this.#observations = [];
195
+ }
196
+ };
197
+ //#endregion
198
+ export { createChildPromptCacheProjection as a, createPromptCacheModelFingerprint as c, canonicalValue as d, DOOM_PROMPT_CACHE_TELEMETRY_SERVICE as f, sha256Base64Url as h, rewritePromptCacheKey as i, createRootSessionIdentity as l, readPromptCacheTelemetry as m, classifyPromptCacheCapability as n, createParentPromptCacheNamespace as o, PromptCacheTelemetryService as p, requestedPromptCacheRetention as r, createPromptCacheKey as s, PromptCacheTelemetry as t, canonicalJson as u };
199
+
200
+ //# sourceMappingURL=promptCacheTelemetry-CguL1ZqT.mjs.map