@narumitw/pi-codex-compact 0.53.1 → 0.53.3
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/chunks/{chunk-7H7JJ7ZV.js → chunk-BD6B7C5K.ts} +1 -1
- package/dist/chunks/{settings-menu-OAWFW2PH.js → settings-menu-SZZ437BH.ts} +2 -2
- package/dist/index.ts +8 -4
- package/dist/index.ts.map +4 -4
- package/package.json +5 -5
- package/src/remote-compact.ts +2 -2
- package/src/remote-v2.ts +2 -1
- /package/dist/chunks/{chunk-7H7JJ7ZV.js.map → chunk-BD6B7C5K.ts.map} +0 -0
- /package/dist/chunks/{settings-menu-OAWFW2PH.js.map → settings-menu-SZZ437BH.ts.map} +0 -0
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import {
|
|
4
4
|
resolveCompactionRouteForApi,
|
|
5
5
|
terminalText
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-BD6B7C5K.ts";
|
|
7
7
|
|
|
8
8
|
// src/settings-menu.ts
|
|
9
9
|
import { runMenu } from "@narumitw/pi-tui-kit";
|
|
@@ -205,4 +205,4 @@ export {
|
|
|
205
205
|
createCodexCompactMenu,
|
|
206
206
|
showCodexCompactMenu
|
|
207
207
|
};
|
|
208
|
-
//# sourceMappingURL=settings-menu-
|
|
208
|
+
//# sourceMappingURL=settings-menu-SZZ437BH.ts.map
|
package/dist/index.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import {
|
|
4
4
|
resolveCompactionRoute,
|
|
5
5
|
terminalText
|
|
6
|
-
} from "./chunks/chunk-
|
|
6
|
+
} from "./chunks/chunk-BD6B7C5K.ts";
|
|
7
7
|
|
|
8
8
|
// src/codex-compact.ts
|
|
9
9
|
import {
|
|
@@ -509,6 +509,9 @@ function createCheckpointDetails(input) {
|
|
|
509
509
|
return parsed;
|
|
510
510
|
}
|
|
511
511
|
|
|
512
|
+
// src/remote-compact.ts
|
|
513
|
+
import { normalizeContext } from "@earendil-works/pi-ai";
|
|
514
|
+
|
|
512
515
|
// src/remote-types.ts
|
|
513
516
|
function isJsonObject(value) {
|
|
514
517
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -741,7 +744,7 @@ async function requestResponsesCompact(request) {
|
|
|
741
744
|
dispatchInFlight = false;
|
|
742
745
|
}
|
|
743
746
|
};
|
|
744
|
-
const stream = request.provider.stream(request.model, request.context, {
|
|
747
|
+
const stream = request.provider.stream(request.model, normalizeContext(request.context), {
|
|
745
748
|
apiKey: request.apiKey,
|
|
746
749
|
headers: request.headers,
|
|
747
750
|
env: request.env,
|
|
@@ -782,6 +785,7 @@ async function requestResponsesCompact(request) {
|
|
|
782
785
|
}
|
|
783
786
|
|
|
784
787
|
// src/remote-v2.ts
|
|
788
|
+
import { normalizeContext as normalizeContext2 } from "@earendil-works/pi-ai";
|
|
785
789
|
async function requestRemoteCompactionV2(request) {
|
|
786
790
|
if (request.signal.aborted) throw abortError();
|
|
787
791
|
let sentInput;
|
|
@@ -802,7 +806,7 @@ async function requestRemoteCompactionV2(request) {
|
|
|
802
806
|
headers: response.headers
|
|
803
807
|
});
|
|
804
808
|
};
|
|
805
|
-
const stream = request.provider.stream(request.model, request.context, {
|
|
809
|
+
const stream = request.provider.stream(request.model, normalizeContext2(request.context), {
|
|
806
810
|
apiKey: request.apiKey,
|
|
807
811
|
headers: request.headers,
|
|
808
812
|
env: request.env,
|
|
@@ -1165,7 +1169,7 @@ function createCodexCompactExtension(options = {}) {
|
|
|
1165
1169
|
if (args.trim()) throw new Error("Usage: /codex-compact");
|
|
1166
1170
|
const ownerGeneration = generation;
|
|
1167
1171
|
const controller = sessionController;
|
|
1168
|
-
const { showCodexCompactMenu } = await import("./chunks/settings-menu-
|
|
1172
|
+
const { showCodexCompactMenu } = await import("./chunks/settings-menu-SZZ437BH.ts");
|
|
1169
1173
|
if (ownerGeneration !== generation || controller.signal.aborted) return;
|
|
1170
1174
|
await showCodexCompactMenu(settingsRuntime, ctx, {
|
|
1171
1175
|
signal: controller.signal,
|
package/dist/index.ts.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/codex-compact.ts", "../src/checkpoint.ts", "../src/protocol.ts", "../src/remote-
|
|
4
|
-
"sourcesContent": ["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { Api, Context, Model, Tool } from \"@earendil-works/pi-ai\";\nimport {\n buildContextEntries,\n buildSessionContext,\n convertToLlm,\n type ExtensionAPI,\n type ExtensionContext,\n type SessionBeforeCompactEvent,\n sessionEntryToContextMessages,\n} from \"@earendil-works/pi-coding-agent\";\nimport {\n buildReplacementHistory,\n type CodexCheckpointDetails,\n checkpointMarker,\n createCheckpointDetails,\n fallbackSummary,\n latestCheckpoint,\n projectCheckpointContext,\n} from \"./checkpoint.js\";\nimport { type CompactionRoute, resolveCompactionRoute } from \"./model-api.js\";\nimport { hasCheckpointMarker, rewriteCheckpointMarker } from \"./protocol.js\";\nimport { requestRemoteCompaction } from \"./remote.js\";\nimport {\n type CodexCompactSettings,\n type CodexCompactSettingsRuntime,\n type CodexCompactSettingsState,\n createCodexCompactSettingsRuntime,\n} from \"./settings.js\";\nimport { terminalText } from \"./terminal.js\";\n\nconst STATUS_KEY = \"codex-compact\";\n\nfunction activeCheckpoint(ctx: ExtensionContext) {\n return latestCheckpoint(ctx.sessionManager.getBranch());\n}\n\nfunction isCheckpointCompatible(\n details: CodexCheckpointDetails,\n model: Model<Api> | undefined,\n settings: CodexCompactSettings,\n): boolean {\n const route = resolveCompactionRoute(model, settings);\n return (\n route.kind === \"remote\" &&\n model !== undefined &&\n route.api === details.api &&\n route.profile === details.profile &&\n model.id === details.modelId\n );\n}\n\nfunction keptMessages(event: SessionBeforeCompactEvent): AgentMessage[] {\n const leafId = event.branchEntries.at(-1)?.id ?? null;\n const contextEntries = buildContextEntries(event.branchEntries, leafId);\n const keptIndex = contextEntries.findIndex((entry) => entry.id === event.preparation.firstKeptEntryId);\n if (keptIndex < 0) {\n throw new Error(\"Pi compaction cut point is not present in the active context\");\n }\n return contextEntries.slice(keptIndex).flatMap(sessionEntryToContextMessages);\n}\n\nfunction activeTools(pi: ExtensionAPI): Tool[] {\n const available = new Map(pi.getAllTools().map((tool) => [tool.name, tool]));\n return pi.getActiveTools().flatMap((name) => {\n const tool = available.get(name);\n return tool\n ? [\n {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n },\n ]\n : [];\n });\n}\n\nfunction projectedCurrentMessages(\n event: SessionBeforeCompactEvent,\n model: Model<Api>,\n route: Extract<CompactionRoute, { kind: \"remote\" }>,\n): { messages: AgentMessage[]; prior?: CodexCheckpointDetails } {\n const leafId = event.branchEntries.at(-1)?.id ?? null;\n const session = buildSessionContext(event.branchEntries, leafId);\n const prior = latestCheckpoint(event.branchEntries);\n if (!prior) return { messages: session.messages };\n if (\n prior.details.api !== route.api ||\n prior.details.profile !== route.profile ||\n prior.details.modelId !== model.id\n ) {\n throw new Error(\"The active opaque checkpoint belongs to a different Responses model\");\n }\n const projected = projectCheckpointContext(session.messages, prior.details, prior.entry.summary);\n if (!projected) {\n throw new Error(\"The previous opaque checkpoint could not be projected safely\");\n }\n return { messages: projected, prior: prior.details };\n}\n\nfunction notifyFailure(ctx: ExtensionContext, error: unknown, settings: CodexCompactSettings): void {\n if (!ctx.hasUI || !settings.notifyOnFallback) return;\n const message = terminalText(error instanceof Error ? error.message : String(error));\n ctx.ui.notify(`Responses compaction failed; using Pi compaction. ${message}`, \"warning\");\n}\n\nfunction sessionStillOwned(ctx: ExtensionContext, sessionId: string, signal: AbortSignal): boolean {\n return !signal.aborted && ctx.sessionManager.getSessionId() === sessionId;\n}\n\nasync function compactRemotely(\n pi: ExtensionAPI,\n event: SessionBeforeCompactEvent,\n ctx: ExtensionContext,\n settings: CodexCompactSettings,\n ownerSignal: AbortSignal,\n fetch?: typeof globalThis.fetch,\n) {\n const model = ctx.model;\n const route = resolveCompactionRoute(model, settings);\n if (route.kind === \"native\" || !model) return undefined;\n const signal = AbortSignal.any([event.signal, ownerSignal]);\n if (signal.aborted) return { cancel: true };\n const sessionId = ctx.sessionManager.getSessionId();\n ctx.ui.setStatus(STATUS_KEY, route.protocol === \"remote-v2\" ? \"Responses Remote V2\u2026\" : \"Responses Compact API\u2026\");\n try {\n const auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);\n if (!sessionStillOwned(ctx, sessionId, signal)) return { cancel: true };\n if (!auth.ok) throw new Error(auth.error);\n const provider = ctx.modelRegistry.getProvider(model.provider);\n if (!provider) throw new Error(\"The active Responses provider is unavailable\");\n const current = projectedCurrentMessages(event, model, route);\n const context: Context = {\n systemPrompt: ctx.getSystemPrompt(),\n messages: convertToLlm(current.messages),\n tools: activeTools(pi),\n };\n const response = await requestRemoteCompaction({\n provider,\n model,\n context,\n protocol: route.protocol,\n profile: route.profile,\n apiKey: auth.apiKey,\n headers: auth.headers,\n env: auth.env,\n signal,\n priorCheckpoint: current.prior\n ? {\n marker: checkpointMarker(current.prior.checkpointId),\n replacementHistory: current.prior.replacementHistory,\n }\n : undefined,\n requestTimeoutMs: settings.requestTimeoutMs,\n maxRetries: settings.maxRetries,\n fetch,\n });\n if (!sessionStillOwned(ctx, sessionId, signal)) return { cancel: true };\n const replacementHistory = buildReplacementHistory(\n response.compactedOutput?.slice(0, -1) ?? response.promptInput,\n response.item,\n { tokenBudget: settings.replacementTokenBudget },\n );\n const details = createCheckpointDetails({\n provider: model.provider,\n api: route.api,\n profile: route.profile,\n modelId: model.id,\n protocol: route.protocol,\n replacementHistory,\n keptMessages: keptMessages(event),\n });\n return {\n compaction: {\n summary: fallbackSummary(details.checkpointId),\n firstKeptEntryId: event.preparation.firstKeptEntryId,\n tokensBefore: event.preparation.tokensBefore,\n usage: response.usage,\n details,\n },\n };\n } catch (error) {\n if (signal.aborted || ctx.sessionManager.getSessionId() !== sessionId) {\n return { cancel: true };\n }\n notifyFailure(ctx, error, settings);\n return undefined;\n } finally {\n if (ctx.sessionManager.getSessionId() === sessionId) ctx.ui.setStatus(STATUS_KEY, undefined);\n }\n}\n\nexport function createCodexCompactExtension(\n options: { fetch?: typeof globalThis.fetch; settingsRuntime?: CodexCompactSettingsRuntime } = {},\n): (pi: ExtensionAPI) => void {\n return (pi) => {\n const providerWarnings = new Set<string>();\n const settingsRuntime = options.settingsRuntime ?? createCodexCompactSettingsRuntime();\n let sessionController = new AbortController();\n let generation = 0;\n\n pi.registerCommand(\"codex-compact\", {\n description: \"Compact now or configure Responses compaction\",\n handler: async (args, ctx) => {\n if (args.trim()) throw new Error(\"Usage: /codex-compact\");\n const ownerGeneration = generation;\n const controller = sessionController;\n const { showCodexCompactMenu } = await import(\"./settings-menu.js\");\n if (ownerGeneration !== generation || controller.signal.aborted) return;\n await showCodexCompactMenu(settingsRuntime, ctx, {\n signal: controller.signal,\n isCurrent: () => ownerGeneration === generation && !controller.signal.aborted,\n });\n },\n });\n\n pi.on(\"session_start\", async (_event, ctx) => {\n sessionController.abort();\n sessionController = new AbortController();\n generation += 1;\n const ownerGeneration = generation;\n const sessionId = ctx.sessionManager.getSessionId();\n providerWarnings.clear();\n let state: Readonly<CodexCompactSettingsState>;\n try {\n state = await settingsRuntime.reload(sessionController.signal);\n } catch (error) {\n if (sessionController.signal.aborted || ownerGeneration !== generation) return;\n if (ctx.hasUI) {\n ctx.ui.notify(\n `Could not load pi-codex-compact.json; using defaults. ${terminalText(error instanceof Error ? error.message : String(error))}`,\n \"warning\",\n );\n }\n return;\n }\n if (\n sessionController.signal.aborted ||\n ownerGeneration !== generation ||\n ctx.sessionManager.getSessionId() !== sessionId\n ) {\n return;\n }\n if (ctx.hasUI && state.kind === \"invalid\") {\n ctx.ui.notify(\n `Invalid pi-codex-compact.json; using defaults without overwriting it. ${terminalText(state.issue ?? \"unknown validation error\")}`,\n \"warning\",\n );\n }\n });\n\n pi.on(\"session_before_compact\", (event, ctx) =>\n compactRemotely(pi, event, ctx, settingsRuntime.get().settings, sessionController.signal, options.fetch),\n );\n\n pi.on(\"context\", (event, ctx) => {\n if (!settingsRuntime.get().settings.enabled) return undefined;\n const settings = settingsRuntime.get().settings;\n const checkpoint = activeCheckpoint(ctx);\n if (!checkpoint || !isCheckpointCompatible(checkpoint.details, ctx.model, settings)) return undefined;\n const messages = projectCheckpointContext(event.messages, checkpoint.details, checkpoint.entry.summary);\n return messages ? { messages } : undefined;\n });\n\n pi.on(\"before_provider_request\", (event, ctx) => {\n if (!settingsRuntime.get().settings.enabled) return undefined;\n const settings = settingsRuntime.get().settings;\n const checkpoint = activeCheckpoint(ctx);\n if (!checkpoint || !isCheckpointCompatible(checkpoint.details, ctx.model, settings)) return undefined;\n const marker = checkpointMarker(checkpoint.details.checkpointId);\n if (!hasCheckpointMarker(event.payload, marker)) return undefined;\n return rewriteCheckpointMarker(event.payload, marker, checkpoint.details.replacementHistory);\n });\n\n pi.on(\"model_select\", (event, ctx) => {\n if (!settingsRuntime.get().settings.enabled) return;\n const settings = settingsRuntime.get().settings;\n const checkpoint = activeCheckpoint(ctx);\n if (!checkpoint || isCheckpointCompatible(checkpoint.details, event.model, settings)) return;\n const key = `${ctx.sessionManager.getSessionId()}:${event.model.provider}:${event.model.id}`;\n if (providerWarnings.has(key)) return;\n providerWarnings.add(key);\n if (ctx.hasUI) {\n ctx.ui.notify(\n \"The active Responses checkpoint cannot replay on this model; Pi will expose only its fallback marker and retained recent messages.\",\n \"warning\",\n );\n }\n });\n\n pi.on(\"session_shutdown\", async (_event, ctx) => {\n generation += 1;\n sessionController.abort();\n providerWarnings.clear();\n ctx.ui.setStatus(STATUS_KEY, undefined);\n await settingsRuntime.flush();\n });\n };\n}\n\nexport default createCodexCompactExtension();\n", "import { createHash, randomUUID } from \"node:crypto\";\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { Api } from \"@earendil-works/pi-ai\";\nimport type { CompactionEntry, SessionEntry } from \"@earendil-works/pi-coding-agent\";\nimport type { RemoteCompactionProtocol, ResponsesCompactionProfile } from \"./model-api.js\";\nimport { type JsonObject, validateCompactionItem } from \"./protocol.js\";\n\nexport const CHECKPOINT_KIND = \"pi-codex-remote-compaction\";\nexport const CHECKPOINT_VERSION = 3;\nexport const REPLACEMENT_TOKEN_BUDGET = 64_000;\nexport const REPLACEMENT_BYTE_BUDGET = 8 * 1024 * 1024;\nconst MAX_MEDIA_ITEM_BYTES = 2 * 1024 * 1024;\nconst MAX_CHECKPOINT_DETAILS_BYTES = 10 * 1024 * 1024;\nconst MAX_CHECKPOINT_ID_LENGTH = 128;\nconst MAX_PROVIDER_ID_LENGTH = 256;\nconst MAX_API_ID_LENGTH = 256;\nconst MAX_MODEL_ID_LENGTH = 512;\nconst MAX_KEPT_FINGERPRINTS = 100_000;\n\nexport interface CodexCheckpointDetails {\n kind: typeof CHECKPOINT_KIND;\n version: typeof CHECKPOINT_VERSION;\n checkpointId: string;\n provider: string;\n api: Api;\n profile: ResponsesCompactionProfile;\n modelId: string;\n protocol: RemoteCompactionProtocol;\n replacementHistory: JsonObject[];\n keptMessageFingerprints: string[];\n createdAt: string;\n}\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction stableValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(stableValue);\n if (!isObject(value)) return value;\n return Object.fromEntries(\n Object.entries(value)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, child]) => [key, stableValue(child)]),\n );\n}\n\nfunction serializedBytes(value: unknown): number {\n return Buffer.byteLength(JSON.stringify(value), \"utf8\");\n}\n\nexport function fingerprintMessage(message: AgentMessage): string {\n return createHash(\"sha256\")\n .update(JSON.stringify(stableValue(message)))\n .digest(\"hex\");\n}\n\nexport function checkpointMarker(checkpointId: string): string {\n return [\n `[PI_CODEX_REMOTE_CHECKPOINT:${checkpointId}]`,\n \"Opaque checkpoint injection failed. Do not infer missing history; tell the user to re-enable\",\n \"@narumitw/pi-codex-compact with the same model and Responses API.\",\n ].join(\" \");\n}\n\nexport function fallbackSummary(checkpointId: string): string {\n return [\n `Responses compaction checkpoint ${checkpointId} stores the older history opaquely.`,\n \"Full replay requires @narumitw/pi-codex-compact and the same model through a compatible Responses provider.\",\n \"Without them, only Pi's retained recent messages remain available.\",\n ].join(\" \");\n}\n\nfunction markerMessage(checkpointId: string, timestamp: number): AgentMessage {\n return {\n role: \"user\",\n content: [{ type: \"text\", text: checkpointMarker(checkpointId) }],\n timestamp,\n };\n}\n\nexport function parseCheckpointDetails(value: unknown): CodexCheckpointDetails | undefined {\n if (!isObject(value)) return undefined;\n try {\n if (serializedBytes(value) > MAX_CHECKPOINT_DETAILS_BYTES) return undefined;\n } catch {\n return undefined;\n }\n const isVersionOne =\n value.version === 1 && value.api === \"openai-codex-responses\" && value.protocol === \"remote-compaction-v2\";\n const isVersionTwo =\n value.version === 2 &&\n (value.api === \"openai-codex-responses\" ||\n value.api === \"openai-responses\" ||\n value.api === \"azure-openai-responses\") &&\n (value.protocol === \"remote-v2\" || value.protocol === \"responses-compact\");\n const isVersionThree =\n value.version === CHECKPOINT_VERSION &&\n typeof value.api === \"string\" &&\n value.api.length > 0 &&\n value.api.length <= MAX_API_ID_LENGTH &&\n (value.profile === \"codex-responses-v1\" || value.profile === \"openai-responses-v1\") &&\n (value.protocol === \"remote-v2\" || value.protocol === \"responses-compact\");\n if (\n value.kind !== CHECKPOINT_KIND ||\n (!isVersionOne && !isVersionTwo && !isVersionThree) ||\n typeof value.checkpointId !== \"string\" ||\n value.checkpointId.length < 8 ||\n value.checkpointId.length > MAX_CHECKPOINT_ID_LENGTH ||\n typeof value.provider !== \"string\" ||\n value.provider.length === 0 ||\n value.provider.length > MAX_PROVIDER_ID_LENGTH ||\n typeof value.modelId !== \"string\" ||\n value.modelId.length === 0 ||\n value.modelId.length > MAX_MODEL_ID_LENGTH ||\n !Array.isArray(value.replacementHistory) ||\n !Array.isArray(value.keptMessageFingerprints) ||\n value.keptMessageFingerprints.length > MAX_KEPT_FINGERPRINTS ||\n typeof value.createdAt !== \"string\" ||\n value.createdAt.length > 64\n ) {\n return undefined;\n }\n const api = value.api as Api;\n const profile =\n api === \"openai-codex-responses\"\n ? \"codex-responses-v1\"\n : api === \"openai-responses\" || api === \"azure-openai-responses\"\n ? \"openai-responses-v1\"\n : value.profile;\n if (\n (profile !== \"codex-responses-v1\" && profile !== \"openai-responses-v1\") ||\n (api !== \"openai-codex-responses\" &&\n api !== \"openai-responses\" &&\n api !== \"azure-openai-responses\" &&\n profile !== \"codex-responses-v1\") ||\n (isVersionThree && value.profile !== profile)\n ) {\n return undefined;\n }\n if (\n value.replacementHistory.length === 0 ||\n !value.replacementHistory.every(isObject) ||\n !value.keptMessageFingerprints.every(\n (fingerprint) => typeof fingerprint === \"string\" && /^[a-f0-9]{64}$/.test(fingerprint),\n ) ||\n serializedBytes(value.replacementHistory) > REPLACEMENT_BYTE_BUDGET\n ) {\n return undefined;\n }\n const last = value.replacementHistory.at(-1);\n try {\n validateCompactionItem(last);\n } catch {\n return undefined;\n }\n return {\n kind: CHECKPOINT_KIND,\n version: CHECKPOINT_VERSION,\n checkpointId: value.checkpointId,\n provider: value.provider,\n api,\n profile,\n modelId: value.modelId,\n protocol: isVersionOne ? \"remote-v2\" : (value.protocol as RemoteCompactionProtocol),\n replacementHistory: structuredClone(value.replacementHistory),\n keptMessageFingerprints: [...value.keptMessageFingerprints],\n createdAt: value.createdAt,\n };\n}\n\nexport function latestCheckpoint(entries: readonly SessionEntry[]):\n | {\n entry: CompactionEntry<CodexCheckpointDetails>;\n details: CodexCheckpointDetails;\n }\n | undefined {\n for (let index = entries.length - 1; index >= 0; index--) {\n const entry = entries[index];\n if (entry.type !== \"compaction\") continue;\n const details = parseCheckpointDetails(entry.details);\n return details ? { entry: entry as CompactionEntry<CodexCheckpointDetails>, details } : undefined;\n }\n return undefined;\n}\n\nfunction isOlderCompactionSummary(message: AgentMessage, timestamp: number): boolean {\n return (\n message.role === \"compactionSummary\" &&\n Number.isFinite(message.timestamp) &&\n Number.isFinite(timestamp) &&\n message.timestamp < timestamp\n );\n}\n\nexport function projectCheckpointContext(\n messages: readonly AgentMessage[],\n details: CodexCheckpointDetails,\n checkpointSummary: string,\n): AgentMessage[] | undefined {\n const summaryIndex = messages.findIndex(\n (message) => message.role === \"compactionSummary\" && message.summary === checkpointSummary,\n );\n if (summaryIndex < 0) return undefined;\n const timestamp = messages[summaryIndex].timestamp;\n let messageIndex = summaryIndex + 1;\n let fingerprintIndex = 0;\n while (fingerprintIndex < details.keptMessageFingerprints.length) {\n if (messageIndex >= messages.length) return undefined;\n const message = messages[messageIndex];\n if (fingerprintMessage(message) === details.keptMessageFingerprints[fingerprintIndex]) {\n messageIndex += 1;\n fingerprintIndex += 1;\n continue;\n }\n if (isOlderCompactionSummary(message, timestamp)) {\n messageIndex += 1;\n continue;\n }\n return undefined;\n }\n while (messageIndex < messages.length && isOlderCompactionSummary(messages[messageIndex], timestamp)) {\n messageIndex += 1;\n }\n return [\n ...messages.slice(0, summaryIndex),\n markerMessage(details.checkpointId, timestamp),\n ...messages.slice(messageIndex),\n ];\n}\n\nfunction rawText(item: JsonObject): string {\n if (!Array.isArray(item.content)) return \"\";\n return item.content\n .flatMap((part) =>\n isObject(part) && typeof part.text === \"string\" && part.type === \"input_text\" ? [part.text] : [],\n )\n .join(\"\\n\");\n}\n\nfunction hasMedia(item: JsonObject): boolean {\n return Array.isArray(item.content) && item.content.some((part) => isObject(part) && part.type === \"input_image\");\n}\n\nfunction truncateTextItem(item: JsonObject, maxChars: number): JsonObject | undefined {\n if (!Array.isArray(item.content) || maxChars <= 32) return undefined;\n let remaining = maxChars - 16;\n const content = [...item.content].reverse().flatMap((part) => {\n if (!isObject(part) || part.type !== \"input_text\" || typeof part.text !== \"string\" || remaining <= 0) {\n return [];\n }\n const text = part.text.slice(-remaining);\n remaining -= text.length;\n return [{ ...part, text: `[truncated]\\n${text}` }];\n });\n if (content.length === 0) return undefined;\n return { ...item, content: content.reverse() };\n}\n\nexport function buildReplacementHistory(\n input: readonly unknown[],\n compactionItem: JsonObject,\n options: { tokenBudget?: number; byteBudget?: number } = {},\n): JsonObject[] {\n const tokenBudget = options.tokenBudget ?? REPLACEMENT_TOKEN_BUDGET;\n const byteBudget = options.byteBudget ?? REPLACEMENT_BYTE_BUDGET;\n const opaque = validateCompactionItem(compactionItem);\n let remainingBytes = byteBudget - serializedBytes(opaque);\n let remainingChars = tokenBudget * 4;\n if (remainingBytes <= 0) throw new Error(\"Opaque compaction item exceeds replacement history budget\");\n const retainedNewestFirst: JsonObject[] = [];\n const candidates = input.filter(\n (item): item is JsonObject => isObject(item) && item.role === \"user\" && item.type !== \"compaction_trigger\",\n );\n for (let index = candidates.length - 1; index >= 0; index--) {\n const candidate = candidates[index];\n const bytes = serializedBytes(candidate);\n if (hasMedia(candidate) && bytes > MAX_MEDIA_ITEM_BYTES) continue;\n const text = rawText(candidate);\n let retained = candidate;\n if (text.length > remainingChars) {\n if (hasMedia(candidate)) continue;\n const truncated = truncateTextItem(candidate, remainingChars);\n if (!truncated) continue;\n retained = truncated;\n }\n if (serializedBytes(retained) > remainingBytes) {\n if (hasMedia(retained)) continue;\n const maxCharsByBytes = Math.max(0, remainingBytes - 128);\n const truncated = truncateTextItem(retained, Math.min(remainingChars, maxCharsByBytes));\n if (!truncated || serializedBytes(truncated) > remainingBytes) continue;\n retained = truncated;\n }\n retainedNewestFirst.push(structuredClone(retained));\n remainingBytes -= serializedBytes(retained);\n remainingChars -= Math.min(remainingChars, rawText(retained).length);\n if (remainingBytes <= 128 || remainingChars <= 32) break;\n }\n return [...retainedNewestFirst.reverse(), opaque];\n}\n\nexport function createCheckpointDetails(input: {\n provider: string;\n api: Api;\n profile: ResponsesCompactionProfile;\n modelId: string;\n protocol: RemoteCompactionProtocol;\n replacementHistory: JsonObject[];\n keptMessages: readonly AgentMessage[];\n checkpointId?: string;\n createdAt?: string;\n}): CodexCheckpointDetails {\n const details: CodexCheckpointDetails = {\n kind: CHECKPOINT_KIND,\n version: CHECKPOINT_VERSION,\n checkpointId: input.checkpointId ?? randomUUID(),\n provider: input.provider,\n api: input.api,\n profile: input.profile,\n modelId: input.modelId,\n protocol: input.protocol,\n replacementHistory: structuredClone(input.replacementHistory),\n keptMessageFingerprints: input.keptMessages.map(fingerprintMessage),\n createdAt: input.createdAt ?? new Date().toISOString(),\n };\n const parsed = parseCheckpointDetails(details);\n if (!parsed) throw new Error(\"Created an invalid Codex checkpoint\");\n return parsed;\n}\n", "export const MAX_SSE_BYTES = 8 * 1024 * 1024;\nexport const MAX_COMPACT_JSON_BYTES = 8 * 1024 * 1024;\nexport const MAX_COMPACTION_ITEM_BYTES = 2 * 1024 * 1024;\n\nexport type JsonObject = Record<string, unknown>;\n\nexport class CodexCompactionProtocolError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CodexCompactionProtocolError\";\n }\n}\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction byteLength(value: unknown): number {\n return Buffer.byteLength(JSON.stringify(value), \"utf8\");\n}\n\nexport function isCompactionItem(value: unknown): value is JsonObject {\n return (\n isObject(value) &&\n value.type === \"compaction\" &&\n typeof value.encrypted_content === \"string\" &&\n value.encrypted_content.length > 0\n );\n}\n\nexport function validateCompactionItem(value: unknown, maxBytes = MAX_COMPACTION_ITEM_BYTES): JsonObject {\n if (!isCompactionItem(value)) {\n throw new CodexCompactionProtocolError(\"Remote response did not contain a valid compaction item\");\n }\n if (byteLength(value) > maxBytes) {\n throw new CodexCompactionProtocolError(\"Remote compaction item exceeded the size limit\");\n }\n return structuredClone(value);\n}\n\nexport interface CollectedCompaction {\n item: JsonObject;\n completedResponse?: JsonObject;\n}\n\nexport interface CollectedCompactResponse {\n item: JsonObject;\n output: JsonObject[];\n response: JsonObject;\n}\n\nfunction compactionItemsFromEvent(event: JsonObject): unknown[] {\n const items: unknown[] = [];\n if (event.type === \"response.output_item.done\" && isObject(event.item)) {\n items.push(event.item);\n }\n if (event.type === \"response.completed\" && isObject(event.response)) {\n const output = event.response.output;\n if (Array.isArray(output)) items.push(...output);\n }\n return items.filter((item) => isObject(item) && item.type === \"compaction\");\n}\n\nexport async function collectCompactionSse(\n stream: ReadableStream<Uint8Array>,\n options: {\n signal?: AbortSignal;\n maxBytes?: number;\n maxItemBytes?: number;\n } = {},\n): Promise<CollectedCompaction> {\n const maxBytes = options.maxBytes ?? MAX_SSE_BYTES;\n const reader = stream.getReader();\n const onAbort = () => {\n void reader.cancel(new DOMException(\"Compaction aborted\", \"AbortError\")).catch(() => undefined);\n };\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n const decoder = new TextDecoder();\n let bytes = 0;\n let pending = \"\";\n let dataLines: string[] = [];\n let completedResponse: JsonObject | undefined;\n const items = new Map<string, JsonObject>();\n\n const checkAbort = () => {\n if (options.signal?.aborted) throw new DOMException(\"Compaction aborted\", \"AbortError\");\n };\n const dispatch = () => {\n if (dataLines.length === 0) return;\n const data = dataLines.join(\"\\n\");\n dataLines = [];\n if (data === \"[DONE]\") return;\n let parsed: unknown;\n try {\n parsed = JSON.parse(data);\n } catch {\n throw new CodexCompactionProtocolError(\"Remote compaction returned malformed SSE JSON\");\n }\n if (!isObject(parsed)) return;\n if (parsed.type === \"response.completed\") {\n completedResponse = isObject(parsed.response) ? parsed.response : {};\n }\n for (const candidate of compactionItemsFromEvent(parsed)) {\n const item = validateCompactionItem(candidate, options.maxItemBytes);\n items.set(JSON.stringify(item), item);\n }\n };\n const processLine = (line: string) => {\n if (line === \"\") {\n dispatch();\n return;\n }\n if (line.startsWith(\":\")) return;\n if (line === \"data\") dataLines.push(\"\");\n else if (line.startsWith(\"data:\")) dataLines.push(line.slice(5).replace(/^ /, \"\"));\n };\n\n try {\n while (true) {\n checkAbort();\n const { done, value } = await reader.read();\n if (done) break;\n bytes += value.byteLength;\n if (bytes > maxBytes) {\n throw new CodexCompactionProtocolError(\"Remote compaction stream exceeded the size limit\");\n }\n pending += decoder.decode(value, { stream: true });\n let newline = pending.indexOf(\"\\n\");\n while (newline !== -1) {\n const rawLine = pending.slice(0, newline);\n pending = pending.slice(newline + 1);\n processLine(rawLine.endsWith(\"\\r\") ? rawLine.slice(0, -1) : rawLine);\n newline = pending.indexOf(\"\\n\");\n }\n }\n pending += decoder.decode();\n if (pending.length > 0) processLine(pending.endsWith(\"\\r\") ? pending.slice(0, -1) : pending);\n dispatch();\n checkAbort();\n } catch (error) {\n await reader.cancel(error).catch(() => undefined);\n throw error;\n } finally {\n options.signal?.removeEventListener(\"abort\", onAbort);\n reader.releaseLock();\n }\n\n if (!completedResponse) {\n throw new CodexCompactionProtocolError(\"Remote compaction stream ended without response.completed\");\n }\n if (items.size !== 1) {\n throw new CodexCompactionProtocolError(\n `Remote compaction returned ${items.size} distinct compaction items; expected exactly one`,\n );\n }\n return { item: [...items.values()][0], completedResponse };\n}\n\nfunction isRetainedCompactContent(value: unknown): value is JsonObject {\n if (!isObject(value)) return false;\n if (value.type === \"input_text\") return typeof value.text === \"string\";\n if (value.type !== \"input_image\") return false;\n if (\n value.detail !== undefined &&\n value.detail !== null &&\n value.detail !== \"auto\" &&\n value.detail !== \"low\" &&\n value.detail !== \"high\" &&\n value.detail !== \"original\"\n ) {\n return false;\n }\n if (\n (value.file_id !== undefined && value.file_id !== null && typeof value.file_id !== \"string\") ||\n (value.image_url !== undefined && value.image_url !== null && typeof value.image_url !== \"string\")\n ) {\n return false;\n }\n return (\n (typeof value.file_id === \"string\" && value.file_id.length > 0) ||\n (typeof value.image_url === \"string\" && value.image_url.length > 0)\n );\n}\n\nfunction isRetainedCompactMessage(value: unknown): value is JsonObject {\n return (\n isObject(value) &&\n value.role === \"user\" &&\n (value.type === undefined || value.type === \"message\") &&\n Array.isArray(value.content) &&\n value.content.length > 0 &&\n value.content.every(isRetainedCompactContent)\n );\n}\n\nexport function validateCompactedResponse(\n value: unknown,\n options: { maxBytes?: number; maxItemBytes?: number } = {},\n): CollectedCompactResponse {\n if (!isObject(value) || !Array.isArray(value.output)) {\n throw new CodexCompactionProtocolError(\"Responses Compact returned an invalid response object\");\n }\n const maxBytes = options.maxBytes ?? MAX_COMPACT_JSON_BYTES;\n const maxItemBytes = options.maxItemBytes ?? MAX_COMPACTION_ITEM_BYTES;\n if (byteLength(value) > maxBytes) {\n throw new CodexCompactionProtocolError(\"Responses Compact response exceeded the size limit\");\n }\n if (value.output.length === 0) {\n throw new CodexCompactionProtocolError(\"Responses Compact returned no output items\");\n }\n const output = value.output.map((item) => {\n if (!isObject(item)) {\n throw new CodexCompactionProtocolError(\"Responses Compact returned a non-object output item\");\n }\n if (byteLength(item) > maxItemBytes) {\n throw new CodexCompactionProtocolError(\"Responses Compact output item exceeded the size limit\");\n }\n return structuredClone(item);\n });\n const compactionItems = output.filter((item) => item.type === \"compaction\");\n if (compactionItems.length !== 1 || output.at(-1)?.type !== \"compaction\") {\n throw new CodexCompactionProtocolError(\n \"Responses Compact must return retained messages followed by one compaction item\",\n );\n }\n for (const item of output.slice(0, -1)) {\n if (!isRetainedCompactMessage(item)) {\n throw new CodexCompactionProtocolError(\"Responses Compact returned an unsupported retained output item\");\n }\n }\n const item = validateCompactionItem(output.at(-1), maxItemBytes);\n return { item, output: [...output.slice(0, -1), item], response: structuredClone(value) };\n}\n\nexport async function collectCompactResponse(\n response: Response,\n options: { signal?: AbortSignal; maxBytes?: number; maxItemBytes?: number } = {},\n): Promise<CollectedCompactResponse> {\n const maxBytes = options.maxBytes ?? MAX_COMPACT_JSON_BYTES;\n const declaredLength = Number(response.headers.get(\"content-length\"));\n if (Number.isFinite(declaredLength) && declaredLength > maxBytes) {\n const error = new CodexCompactionProtocolError(\"Responses Compact response exceeded the size limit\");\n await response.body?.cancel(error).catch(() => undefined);\n throw error;\n }\n if (!response.body) {\n throw new CodexCompactionProtocolError(\"Responses Compact response did not contain a body\");\n }\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let bytes = 0;\n const onAbort = () => {\n void reader.cancel(new DOMException(\"Compaction aborted\", \"AbortError\")).catch(() => undefined);\n };\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n try {\n while (true) {\n if (options.signal?.aborted) throw new DOMException(\"Compaction aborted\", \"AbortError\");\n const { done, value } = await reader.read();\n if (done) break;\n bytes += value.byteLength;\n if (bytes > maxBytes) {\n throw new CodexCompactionProtocolError(\"Responses Compact response exceeded the size limit\");\n }\n chunks.push(value);\n }\n if (options.signal?.aborted) throw new DOMException(\"Compaction aborted\", \"AbortError\");\n } catch (error) {\n await reader.cancel(error).catch(() => undefined);\n throw error;\n } finally {\n options.signal?.removeEventListener(\"abort\", onAbort);\n reader.releaseLock();\n }\n const body = new Uint8Array(bytes);\n let offset = 0;\n for (const chunk of chunks) {\n body.set(chunk, offset);\n offset += chunk.byteLength;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(new TextDecoder().decode(body));\n } catch {\n throw new CodexCompactionProtocolError(\"Responses Compact returned malformed JSON\");\n }\n return validateCompactedResponse(parsed, options);\n}\n\nfunction markerTextFromItem(item: unknown): string | undefined {\n if (!isObject(item) || item.role !== \"user\" || !Array.isArray(item.content)) return undefined;\n if (item.content.length !== 1) return undefined;\n const content = item.content[0];\n if (!isObject(content) || content.type !== \"input_text\" || typeof content.text !== \"string\") {\n return undefined;\n }\n return content.text;\n}\n\nexport function rewriteCheckpointMarker(\n payload: unknown,\n marker: string,\n replacementHistory: readonly unknown[],\n): JsonObject {\n if (!isObject(payload) || !Array.isArray(payload.input)) {\n throw new CodexCompactionProtocolError(\"Codex Responses payload is missing an input array\");\n }\n const matches = payload.input\n .map((item, index) => (markerTextFromItem(item) === marker ? index : -1))\n .filter((index) => index >= 0);\n if (matches.length !== 1) {\n throw new CodexCompactionProtocolError(\n `Provider payload contained ${matches.length} checkpoint markers; expected exactly one`,\n );\n }\n const index = matches[0];\n return {\n ...payload,\n input: [\n ...payload.input.slice(0, index),\n ...structuredClone(replacementHistory),\n ...payload.input.slice(index + 1),\n ],\n };\n}\n\nexport function appendCompactionTrigger(payload: unknown): JsonObject {\n if (!isObject(payload) || !Array.isArray(payload.input)) {\n throw new CodexCompactionProtocolError(\"Codex Responses payload is missing an input array\");\n }\n if (payload.input.some((item) => isObject(item) && item.type === \"compaction_trigger\")) {\n throw new CodexCompactionProtocolError(\"Provider payload already contains a compaction trigger\");\n }\n return { ...payload, input: [...payload.input, { type: \"compaction_trigger\" }] };\n}\n\nexport function expandRemoteCompactionPayload(\n payload: unknown,\n checkpoint?: { marker: string; replacementHistory: readonly unknown[] },\n): JsonObject {\n if (checkpoint) {\n return rewriteCheckpointMarker(payload, checkpoint.marker, checkpoint.replacementHistory);\n }\n if (!isObject(payload) || !Array.isArray(payload.input)) {\n throw new CodexCompactionProtocolError(\"Responses payload is missing an input array\");\n }\n return structuredClone(payload);\n}\n\nexport function prepareRemoteCompactionPayload(\n payload: unknown,\n checkpoint?: { marker: string; replacementHistory: readonly unknown[] },\n): JsonObject {\n return appendCompactionTrigger(expandRemoteCompactionPayload(payload, checkpoint));\n}\n\nexport function hasCheckpointMarker(payload: unknown, marker: string): boolean {\n return (\n isObject(payload) &&\n Array.isArray(payload.input) &&\n payload.input.some((item) => markerTextFromItem(item) === marker)\n );\n}\n", "import type { Api, Context, Model, Provider, ProviderHeaders, Usage } from \"@earendil-works/pi-ai\";\nimport type { RemoteCompactionProtocol, ResponsesCompactionProfile } from \"./model-api.js\";\nimport type { JsonObject } from \"./protocol.js\";\n\nexport interface PriorCheckpointPayload {\n marker: string;\n replacementHistory: readonly unknown[];\n}\n\nexport interface RemoteCompactionRequest {\n provider: Provider;\n model: Model<Api>;\n profile: ResponsesCompactionProfile;\n context: Context;\n protocol: RemoteCompactionProtocol;\n apiKey?: string;\n headers?: ProviderHeaders;\n env?: Record<string, string>;\n signal: AbortSignal;\n priorCheckpoint?: PriorCheckpointPayload;\n requestTimeoutMs?: number;\n maxRetries?: number;\n fetch?: typeof globalThis.fetch;\n}\n\nexport interface RemoteCompactionResponse {\n item: JsonObject;\n promptInput: JsonObject[];\n compactedOutput?: JsonObject[];\n usage: Usage;\n}\n\nexport function isJsonObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function abortError(): DOMException {\n return new DOMException(\"Compaction aborted\", \"AbortError\");\n}\n\nexport function assertPreparedInput(payload: JsonObject): JsonObject[] {\n if (!Array.isArray(payload.input) || !payload.input.every(isJsonObject)) {\n throw new Error(\"Prepared compaction payload has invalid input items\");\n }\n return structuredClone(payload.input);\n}\n", "import type { AssistantMessageEventStream, Usage } from \"@earendil-works/pi-ai\";\nimport { abortError } from \"./remote-types.js\";\n\nexport async function collectProviderUsage(stream: AssistantMessageEventStream, signal: AbortSignal): Promise<Usage> {\n let usage: Usage | undefined;\n for await (const event of stream) {\n if (signal.aborted) throw abortError();\n if (event.type === \"error\") {\n throw new Error(event.error.errorMessage ?? \"Responses compaction request failed\");\n }\n if (event.type === \"done\") usage = event.message.usage;\n }\n if (signal.aborted) throw abortError();\n if (!usage) throw new Error(\"Responses provider stream ended without completion usage\");\n return usage;\n}\n", "import type { Usage } from \"@earendil-works/pi-ai\";\nimport type { ResponsesCompactionProfile } from \"./model-api.js\";\nimport {\n CodexCompactionProtocolError,\n type CollectedCompactResponse,\n collectCompactResponse,\n expandRemoteCompactionPayload,\n type JsonObject,\n} from \"./protocol.js\";\nimport { collectProviderUsage } from \"./remote-shared.js\";\nimport {\n abortError,\n assertPreparedInput,\n isJsonObject,\n type RemoteCompactionRequest,\n type RemoteCompactionResponse,\n} from \"./remote-types.js\";\n\nconst OFFICIAL_COMPACT_FIELDS = [\n \"model\",\n \"input\",\n \"instructions\",\n \"previous_response_id\",\n \"prompt_cache_key\",\n \"prompt_cache_retention\",\n \"service_tier\",\n] as const;\n\nconst CODEX_COMPACT_FIELDS = [\n \"model\",\n \"input\",\n \"instructions\",\n \"tools\",\n \"parallel_tool_calls\",\n \"reasoning\",\n \"service_tier\",\n \"prompt_cache_key\",\n \"text\",\n \"access_programs\",\n] as const;\n\nfunction compactPayload(payload: JsonObject, profile: ResponsesCompactionProfile): JsonObject {\n const fields = profile === \"codex-responses-v1\" ? CODEX_COMPACT_FIELDS : OFFICIAL_COMPACT_FIELDS;\n const result: JsonObject = {};\n for (const field of fields) {\n if (Object.hasOwn(payload, field) && payload[field] !== undefined) {\n result[field] = structuredClone(payload[field]);\n }\n }\n if (typeof result.model !== \"string\" || result.model.length === 0) {\n throw new CodexCompactionProtocolError(\"Responses payload is missing a model\");\n }\n assertPreparedInput(result);\n return result;\n}\n\nfunction requestUrl(input: string | URL | Request): URL {\n return new URL(input instanceof Request ? input.url : String(input));\n}\n\nexport function responsesCompactUrl(input: string | URL | Request): URL {\n const original = requestUrl(input);\n if (!original.pathname.endsWith(\"/responses\")) {\n throw new CodexCompactionProtocolError(\"Provider request URL does not end with the Responses endpoint\");\n }\n const compact = new URL(original);\n compact.pathname = `${compact.pathname}/compact`;\n if (compact.origin !== original.origin) {\n throw new CodexCompactionProtocolError(\"Responses Compact URL changed origin\");\n }\n return compact;\n}\n\nfunction mergedHeaders(input: string | URL | Request, init?: RequestInit): Headers {\n const headers = new Headers(input instanceof Request ? input.headers : undefined);\n new Headers(init?.headers).forEach((value, name) => {\n headers.set(name, value);\n });\n headers.delete(\"content-encoding\");\n headers.delete(\"content-length\");\n headers.set(\"accept\", \"application/json\");\n headers.set(\"content-type\", \"application/json\");\n return headers;\n}\n\nfunction mergedSignal(\n input: string | URL | Request,\n init: RequestInit | undefined,\n ownerSignal: AbortSignal,\n): AbortSignal {\n const signals = [ownerSignal];\n if (input instanceof Request) signals.push(input.signal);\n if (init?.signal) signals.push(init.signal);\n return signals.length === 1 ? ownerSignal : AbortSignal.any(signals);\n}\n\nfunction nonRetryableBridgeFailure(error: unknown): Response {\n const message = error instanceof Error ? error.message : String(error);\n return Response.json(\n {\n error: {\n message,\n type: \"invalid_request_error\",\n code: \"invalid_compact_response\",\n },\n },\n { status: 400 },\n );\n}\n\nfunction nonNegativeInteger(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0;\n}\n\nfunction optionalUsageDetail(details: unknown, field: string): number {\n if (details === undefined || details === null) return 0;\n if (!isJsonObject(details)) {\n throw new CodexCompactionProtocolError(\"Responses Compact response has invalid usage details\");\n }\n const value = details[field];\n if (value === undefined || value === null) return 0;\n if (!nonNegativeInteger(value)) {\n throw new CodexCompactionProtocolError(`Responses Compact response has invalid usage detail ${field}`);\n }\n return value;\n}\n\nfunction validatedUsage(response: JsonObject): JsonObject {\n const usage = response.usage;\n if (!isJsonObject(usage)) {\n throw new CodexCompactionProtocolError(\"Responses Compact response is missing usage\");\n }\n for (const field of [\"input_tokens\", \"output_tokens\", \"total_tokens\"] as const) {\n if (!nonNegativeInteger(usage[field])) {\n throw new CodexCompactionProtocolError(`Responses Compact response has invalid ${field}`);\n }\n }\n const inputTokens = usage.input_tokens as number;\n const outputTokens = usage.output_tokens as number;\n const totalTokens = usage.total_tokens as number;\n const cachedTokens = optionalUsageDetail(usage.input_tokens_details, \"cached_tokens\");\n const cacheWriteTokens = optionalUsageDetail(usage.input_tokens_details, \"cache_write_tokens\");\n const reasoningTokens = optionalUsageDetail(usage.output_tokens_details, \"reasoning_tokens\");\n if (cachedTokens + cacheWriteTokens > inputTokens || reasoningTokens > outputTokens) {\n throw new CodexCompactionProtocolError(\"Responses Compact response has inconsistent usage details\");\n }\n if (totalTokens !== inputTokens + outputTokens) {\n throw new CodexCompactionProtocolError(\"Responses Compact response has inconsistent total usage\");\n }\n return structuredClone(usage);\n}\n\nfunction syntheticCompletion(result: CollectedCompactResponse, payload: JsonObject): Response {\n const completed = {\n id: typeof result.response.id === \"string\" ? result.response.id : \"resp_pi_compact_bridge\",\n object: \"response\",\n created_at:\n typeof result.response.created_at === \"number\" ? result.response.created_at : Math.floor(Date.now() / 1000),\n status: \"completed\",\n model: payload.model,\n output: [],\n parallel_tool_calls: false,\n tool_choice: \"auto\",\n tools: [],\n usage: validatedUsage(result.response),\n };\n const events = [\n { type: \"response.created\", response: { ...completed, status: \"in_progress\" } },\n { type: \"response.completed\", response: completed },\n ];\n return new Response(events.map((event) => `data: ${JSON.stringify(event)}\\n\\n`).join(\"\"), {\n status: 200,\n headers: { \"content-type\": \"text/event-stream\" },\n });\n}\n\nexport async function requestResponsesCompact(request: RemoteCompactionRequest): Promise<RemoteCompactionResponse> {\n if (request.signal.aborted) throw abortError();\n let preparedPayload: JsonObject | undefined;\n let sentInput: JsonObject[] | undefined;\n let compactResult: CollectedCompactResponse | undefined;\n let bridgeError: unknown;\n let dispatchInFlight = false;\n let successfulResponses = 0;\n const baseFetch = request.fetch ?? globalThis.fetch;\n const bridgeFetch: typeof globalThis.fetch = async (input, init) => {\n if (request.signal.aborted) throw abortError();\n if (successfulResponses > 0) {\n bridgeError = new CodexCompactionProtocolError(\"Provider dispatched again after Responses Compact succeeded\");\n return nonRetryableBridgeFailure(bridgeError);\n }\n if (dispatchInFlight) {\n bridgeError = new CodexCompactionProtocolError(\"Provider dispatched overlapping Responses Compact requests\");\n return nonRetryableBridgeFailure(bridgeError);\n }\n if (!preparedPayload) {\n bridgeError = new CodexCompactionProtocolError(\"Provider dispatched before exposing its request payload\");\n return nonRetryableBridgeFailure(bridgeError);\n }\n let compactUrl: URL;\n try {\n compactUrl = responsesCompactUrl(input);\n } catch (error) {\n bridgeError = error;\n return nonRetryableBridgeFailure(error);\n }\n const signal = mergedSignal(input, init, request.signal);\n dispatchInFlight = true;\n try {\n const response = await baseFetch(compactUrl, {\n ...init,\n method: \"POST\",\n headers: mergedHeaders(input, init),\n body: JSON.stringify(preparedPayload),\n signal,\n });\n if (!response.ok) return response;\n try {\n const result = await collectCompactResponse(response, { signal });\n successfulResponses += 1;\n if (successfulResponses !== 1) {\n throw new CodexCompactionProtocolError(\n \"Provider returned more than one successful Responses Compact response\",\n );\n }\n compactResult = result;\n return syntheticCompletion(result, preparedPayload);\n } catch (error) {\n bridgeError = error;\n return nonRetryableBridgeFailure(error);\n }\n } finally {\n dispatchInFlight = false;\n }\n };\n\n const stream = request.provider.stream(request.model, request.context, {\n apiKey: request.apiKey,\n headers: request.headers,\n env: request.env,\n signal: request.signal,\n transport: \"sse\",\n cacheRetention: \"none\",\n timeoutMs: request.requestTimeoutMs ?? 5 * 60 * 1000,\n maxRetries: request.maxRetries ?? 2,\n fetch: bridgeFetch,\n onPayload: (payload) => {\n if (preparedPayload) {\n throw new CodexCompactionProtocolError(\"Provider exposed more than one compaction request payload\");\n }\n const expanded = expandRemoteCompactionPayload(payload, request.priorCheckpoint);\n preparedPayload = compactPayload(expanded, request.profile);\n sentInput = assertPreparedInput(preparedPayload);\n return expanded;\n },\n });\n\n let usage: Usage;\n try {\n usage = await collectProviderUsage(stream, request.signal);\n } catch (error) {\n if (bridgeError) throw bridgeError;\n throw error;\n }\n if (request.signal.aborted) throw abortError();\n if (bridgeError) throw bridgeError;\n if (!preparedPayload || !sentInput || !compactResult || successfulResponses !== 1) {\n throw new CodexCompactionProtocolError(\"Provider did not complete exactly one Responses Compact request\");\n }\n return {\n item: compactResult.item,\n promptInput: sentInput,\n compactedOutput: compactResult.output,\n usage,\n };\n}\n", "import {\n CodexCompactionProtocolError,\n type CollectedCompaction,\n collectCompactionSse,\n prepareRemoteCompactionPayload,\n} from \"./protocol.js\";\nimport { collectProviderUsage } from \"./remote-shared.js\";\nimport {\n abortError,\n assertPreparedInput,\n type RemoteCompactionRequest,\n type RemoteCompactionResponse,\n} from \"./remote-types.js\";\n\nexport async function requestRemoteCompactionV2(request: RemoteCompactionRequest): Promise<RemoteCompactionResponse> {\n if (request.signal.aborted) throw abortError();\n let sentInput: ReturnType<typeof assertPreparedInput> | undefined;\n const inspections: Promise<{ ok: true; value: CollectedCompaction } | { ok: false; error: unknown }>[] = [];\n const baseFetch = request.fetch ?? globalThis.fetch;\n const inspectedFetch: typeof globalThis.fetch = async (input, init) => {\n const response = await baseFetch(input, init);\n if (!response.ok || !response.body) return response;\n const [providerBody, inspectionBody] = response.body.tee();\n const inspection = collectCompactionSse(inspectionBody, { signal: request.signal }).then(\n (value) => ({ ok: true as const, value }),\n (error: unknown) => ({ ok: false as const, error }),\n );\n inspections.push(inspection);\n return new Response(providerBody, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n });\n };\n\n const stream = request.provider.stream(request.model, request.context, {\n apiKey: request.apiKey,\n headers: request.headers,\n env: request.env,\n signal: request.signal,\n transport: \"sse\",\n cacheRetention: \"none\",\n timeoutMs: request.requestTimeoutMs ?? 5 * 60 * 1000,\n maxRetries: request.maxRetries ?? 2,\n fetch: inspectedFetch,\n onPayload: (payload) => {\n const prepared = prepareRemoteCompactionPayload(payload, request.priorCheckpoint);\n sentInput = assertPreparedInput(prepared).slice(0, -1);\n return prepared;\n },\n });\n\n const usage = await collectProviderUsage(stream, request.signal);\n if (!sentInput) {\n throw new CodexCompactionProtocolError(\"Provider did not expose a request payload\");\n }\n if (inspections.length !== 1) {\n throw new CodexCompactionProtocolError(\n `Provider exposed ${inspections.length} successful SSE responses; expected exactly one`,\n );\n }\n const inspection = await inspections[0];\n if (request.signal.aborted) throw abortError();\n if (!inspection.ok) throw inspection.error;\n return { item: inspection.value.item, promptInput: sentInput, usage };\n}\n", "import { requestResponsesCompact } from \"./remote-compact.js\";\nimport type { RemoteCompactionRequest, RemoteCompactionResponse } from \"./remote-types.js\";\nimport { requestRemoteCompactionV2 } from \"./remote-v2.js\";\n\nexport type {\n PriorCheckpointPayload,\n RemoteCompactionRequest,\n RemoteCompactionResponse,\n} from \"./remote-types.js\";\n\nexport function requestRemoteCompaction(request: RemoteCompactionRequest): Promise<RemoteCompactionResponse> {\n return request.protocol === \"responses-compact\"\n ? requestResponsesCompact(request)\n : requestRemoteCompactionV2(request);\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { constants } from \"node:fs\";\nimport { mkdir, open, rename, rm, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, join } from \"node:path\";\nimport { getAgentDir } from \"@earendil-works/pi-coding-agent\";\nimport type { RemoteCompactionProtocolSetting } from \"./model-api.js\";\n\nexport const CODEX_COMPACT_SETTINGS_FILE = \"pi-codex-compact.json\";\nexport const MAX_SETTINGS_BYTES = 64 * 1024;\n\nexport interface CodexCompactSettings {\n enabled: boolean;\n protocol: RemoteCompactionProtocolSetting;\n apiProfiles: Record<string, \"codex-responses-v1\">;\n requestTimeoutMs: number;\n maxRetries: number;\n replacementTokenBudget: number;\n notifyOnFallback: boolean;\n}\n\nexport const DEFAULT_CODEX_COMPACT_SETTINGS: Readonly<CodexCompactSettings> = Object.freeze({\n enabled: true,\n protocol: \"auto\",\n apiProfiles: {},\n requestTimeoutMs: 300_000,\n maxRetries: 2,\n replacementTokenBudget: 64_000,\n notifyOnFallback: true,\n});\n\nconst LIMITS = Object.freeze({\n requestTimeoutMs: { minimum: 30_000, maximum: 600_000 },\n maxRetries: { minimum: 0, maximum: 2 },\n replacementTokenBudget: { minimum: 8_000, maximum: 128_000 },\n});\n\nconst BUILT_IN_APIS = new Set([\n \"openai-completions\",\n \"mistral-conversations\",\n \"openai-codex-responses\",\n \"openai-responses\",\n \"azure-openai-responses\",\n \"anthropic-messages\",\n \"bedrock-converse-stream\",\n \"google-generative-ai\",\n \"google-vertex\",\n \"pi-messages\",\n]);\nconst MAX_API_PROFILE_ID_LENGTH = 256;\n\nexport interface CodexCompactSettingsState {\n kind: \"missing\" | \"loaded\" | \"invalid\";\n path: string;\n settings: CodexCompactSettings;\n document?: Record<string, unknown>;\n issue?: string;\n}\n\nexport interface CodexCompactSettingsRuntime {\n get(): Readonly<CodexCompactSettingsState>;\n reload(signal?: AbortSignal): Promise<Readonly<CodexCompactSettingsState>>;\n update(patch: Partial<CodexCompactSettings>, signal?: AbortSignal): Promise<Readonly<CodexCompactSettingsState>>;\n flush(): Promise<void>;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction validInteger(value: unknown, minimum: number, maximum: number): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= minimum && value <= maximum;\n}\n\nfunction hasWhitespaceOrControl(value: string): boolean {\n return [...value].some((character) => {\n const code = character.codePointAt(0) ?? 0;\n return code <= 0x20 || code === 0x7f;\n });\n}\n\nfunction normalizeApiProfiles(value: unknown): Record<string, \"codex-responses-v1\"> | undefined {\n if (\n !isRecord(value) ||\n (Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null)\n ) {\n return undefined;\n }\n const profiles: Record<string, \"codex-responses-v1\"> = {};\n for (const [api, profile] of Object.entries(value)) {\n if (\n api.length === 0 ||\n api.length > MAX_API_PROFILE_ID_LENGTH ||\n api.trim() !== api ||\n hasWhitespaceOrControl(api) ||\n BUILT_IN_APIS.has(api) ||\n api === \"__proto__\" ||\n api === \"constructor\" ||\n api === \"prototype\" ||\n profile !== \"codex-responses-v1\"\n ) {\n return undefined;\n }\n profiles[api] = profile;\n }\n return profiles;\n}\n\nexport function normalizeCodexCompactSettings(value: unknown): CodexCompactSettings | undefined {\n if (!isRecord(value)) return undefined;\n if (Object.hasOwn(value, \"enabled\") && typeof value.enabled !== \"boolean\") return undefined;\n if (\n Object.hasOwn(value, \"protocol\") &&\n value.protocol !== \"auto\" &&\n value.protocol !== \"remote-v2\" &&\n value.protocol !== \"responses-compact\"\n ) {\n return undefined;\n }\n if (Object.hasOwn(value, \"notifyOnFallback\") && typeof value.notifyOnFallback !== \"boolean\") {\n return undefined;\n }\n if (Object.hasOwn(value, \"apiProfiles\") && normalizeApiProfiles(value.apiProfiles) === undefined) return undefined;\n for (const [field, limits] of Object.entries(LIMITS) as [\n keyof typeof LIMITS,\n { minimum: number; maximum: number },\n ][]) {\n if (Object.hasOwn(value, field) && !validInteger(value[field], limits.minimum, limits.maximum)) {\n return undefined;\n }\n }\n return {\n enabled: typeof value.enabled === \"boolean\" ? value.enabled : DEFAULT_CODEX_COMPACT_SETTINGS.enabled,\n protocol:\n value.protocol === \"remote-v2\" || value.protocol === \"responses-compact\"\n ? value.protocol\n : DEFAULT_CODEX_COMPACT_SETTINGS.protocol,\n apiProfiles: normalizeApiProfiles(value.apiProfiles) ?? structuredClone(DEFAULT_CODEX_COMPACT_SETTINGS.apiProfiles),\n requestTimeoutMs:\n typeof value.requestTimeoutMs === \"number\"\n ? value.requestTimeoutMs\n : DEFAULT_CODEX_COMPACT_SETTINGS.requestTimeoutMs,\n maxRetries: typeof value.maxRetries === \"number\" ? value.maxRetries : DEFAULT_CODEX_COMPACT_SETTINGS.maxRetries,\n replacementTokenBudget:\n typeof value.replacementTokenBudget === \"number\"\n ? value.replacementTokenBudget\n : DEFAULT_CODEX_COMPACT_SETTINGS.replacementTokenBudget,\n notifyOnFallback:\n typeof value.notifyOnFallback === \"boolean\"\n ? value.notifyOnFallback\n : DEFAULT_CODEX_COMPACT_SETTINGS.notifyOnFallback,\n };\n}\n\nexport function codexCompactSettingsPath(): string {\n return join(getAgentDir(), CODEX_COMPACT_SETTINGS_FILE);\n}\n\nfunction aborted(signal?: AbortSignal): void {\n if (signal?.aborted) throw new DOMException(\"Settings operation aborted\", \"AbortError\");\n}\n\nexport async function loadCodexCompactSettings(\n path = codexCompactSettingsPath(),\n signal?: AbortSignal,\n): Promise<CodexCompactSettingsState> {\n aborted(signal);\n try {\n const handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);\n let text: string;\n try {\n const stats = await handle.stat();\n aborted(signal);\n if (!stats.isFile()) throw new Error(\"settings path is not a regular file\");\n if (stats.size > MAX_SETTINGS_BYTES) throw new Error(\"settings file exceeds 64 KiB\");\n text = await handle.readFile(\"utf8\");\n } finally {\n await handle.close();\n }\n aborted(signal);\n const document = JSON.parse(text) as unknown;\n const settings = normalizeCodexCompactSettings(document);\n if (!settings || !isRecord(document)) throw new Error(\"invalid settings shape or bounds\");\n return { kind: \"loaded\", path, settings, document };\n } catch (error) {\n if (signal?.aborted) throw error;\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return {\n kind: \"missing\",\n path,\n settings: { ...DEFAULT_CODEX_COMPACT_SETTINGS },\n document: {},\n };\n }\n return {\n kind: \"invalid\",\n path,\n settings: { ...DEFAULT_CODEX_COMPACT_SETTINGS },\n issue:\n isNodeError(error) && error.code === \"ELOOP\"\n ? \"symbolic links are not accepted\"\n : error instanceof Error\n ? error.message\n : String(error),\n };\n }\n}\n\nasync function savePatch(\n path: string,\n patch: Partial<CodexCompactSettings>,\n signal?: AbortSignal,\n): Promise<CodexCompactSettingsState> {\n const latest = await loadCodexCompactSettings(path, signal);\n if (latest.kind === \"invalid\") {\n throw new Error(\"Cannot overwrite an invalid pi-codex-compact.json; repair it and reload first\");\n }\n const document = { ...latest.document, ...patch };\n const settings = normalizeCodexCompactSettings(document);\n if (!settings) throw new Error(\"Refusing to save invalid Codex compaction settings\");\n const temporaryPath = join(dirname(path), `.${basename(path)}.${randomUUID()}.tmp`);\n await mkdir(dirname(path), { recursive: true });\n aborted(signal);\n try {\n await writeFile(temporaryPath, `${JSON.stringify(document, null, 2)}\\n`, {\n encoding: \"utf8\",\n flag: \"wx\",\n mode: 0o600,\n });\n aborted(signal);\n const current = await loadCodexCompactSettings(path, signal);\n if (\n current.kind === \"invalid\" ||\n current.kind !== latest.kind ||\n JSON.stringify(current.document) !== JSON.stringify(latest.document)\n ) {\n throw new Error(\"pi-codex-compact.json changed while saving; reopen settings and retry\");\n }\n await rename(temporaryPath, path);\n } finally {\n await rm(temporaryPath, { force: true }).catch(() => undefined);\n }\n return { kind: \"loaded\", path, settings, document };\n}\n\nexport function createCodexCompactSettingsRuntime(path = codexCompactSettingsPath()): CodexCompactSettingsRuntime {\n let state: CodexCompactSettingsState = {\n kind: \"missing\",\n path,\n settings: { ...DEFAULT_CODEX_COMPACT_SETTINGS },\n document: {},\n };\n let queue = Promise.resolve();\n const enqueue = <T>(operation: () => Promise<T>): Promise<T> => {\n const result = queue.then(operation, operation);\n queue = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n };\n return {\n get: () => structuredClone(state),\n reload: (signal) =>\n enqueue(async () => {\n state = await loadCodexCompactSettings(path, signal);\n return structuredClone(state);\n }),\n update: (patch, signal) =>\n enqueue(async () => {\n state = await savePatch(path, patch, signal);\n return structuredClone(state);\n }),\n flush: () => queue,\n };\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["item", "index", "isObject", "inspection", "randomUUID"]
|
|
3
|
+
"sources": ["../src/codex-compact.ts", "../src/checkpoint.ts", "../src/protocol.ts", "../src/remote-compact.ts", "../src/remote-types.ts", "../src/remote-shared.ts", "../src/remote-v2.ts", "../src/remote.ts", "../src/settings.ts"],
|
|
4
|
+
"sourcesContent": ["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { Api, Context, Model, Tool } from \"@earendil-works/pi-ai\";\nimport {\n buildContextEntries,\n buildSessionContext,\n convertToLlm,\n type ExtensionAPI,\n type ExtensionContext,\n type SessionBeforeCompactEvent,\n sessionEntryToContextMessages,\n} from \"@earendil-works/pi-coding-agent\";\nimport {\n buildReplacementHistory,\n type CodexCheckpointDetails,\n checkpointMarker,\n createCheckpointDetails,\n fallbackSummary,\n latestCheckpoint,\n projectCheckpointContext,\n} from \"./checkpoint.js\";\nimport { type CompactionRoute, resolveCompactionRoute } from \"./model-api.js\";\nimport { hasCheckpointMarker, rewriteCheckpointMarker } from \"./protocol.js\";\nimport { requestRemoteCompaction } from \"./remote.js\";\nimport {\n type CodexCompactSettings,\n type CodexCompactSettingsRuntime,\n type CodexCompactSettingsState,\n createCodexCompactSettingsRuntime,\n} from \"./settings.js\";\nimport { terminalText } from \"./terminal.js\";\n\nconst STATUS_KEY = \"codex-compact\";\n\nfunction activeCheckpoint(ctx: ExtensionContext) {\n return latestCheckpoint(ctx.sessionManager.getBranch());\n}\n\nfunction isCheckpointCompatible(\n details: CodexCheckpointDetails,\n model: Model<Api> | undefined,\n settings: CodexCompactSettings,\n): boolean {\n const route = resolveCompactionRoute(model, settings);\n return (\n route.kind === \"remote\" &&\n model !== undefined &&\n route.api === details.api &&\n route.profile === details.profile &&\n model.id === details.modelId\n );\n}\n\nfunction keptMessages(event: SessionBeforeCompactEvent): AgentMessage[] {\n const leafId = event.branchEntries.at(-1)?.id ?? null;\n const contextEntries = buildContextEntries(event.branchEntries, leafId);\n const keptIndex = contextEntries.findIndex((entry) => entry.id === event.preparation.firstKeptEntryId);\n if (keptIndex < 0) {\n throw new Error(\"Pi compaction cut point is not present in the active context\");\n }\n return contextEntries.slice(keptIndex).flatMap(sessionEntryToContextMessages);\n}\n\nfunction activeTools(pi: ExtensionAPI): Tool[] {\n const available = new Map(pi.getAllTools().map((tool) => [tool.name, tool]));\n return pi.getActiveTools().flatMap((name) => {\n const tool = available.get(name);\n return tool\n ? [\n {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n },\n ]\n : [];\n });\n}\n\nfunction projectedCurrentMessages(\n event: SessionBeforeCompactEvent,\n model: Model<Api>,\n route: Extract<CompactionRoute, { kind: \"remote\" }>,\n): { messages: AgentMessage[]; prior?: CodexCheckpointDetails } {\n const leafId = event.branchEntries.at(-1)?.id ?? null;\n const session = buildSessionContext(event.branchEntries, leafId);\n const prior = latestCheckpoint(event.branchEntries);\n if (!prior) return { messages: session.messages };\n if (\n prior.details.api !== route.api ||\n prior.details.profile !== route.profile ||\n prior.details.modelId !== model.id\n ) {\n throw new Error(\"The active opaque checkpoint belongs to a different Responses model\");\n }\n const projected = projectCheckpointContext(session.messages, prior.details, prior.entry.summary);\n if (!projected) {\n throw new Error(\"The previous opaque checkpoint could not be projected safely\");\n }\n return { messages: projected, prior: prior.details };\n}\n\nfunction notifyFailure(ctx: ExtensionContext, error: unknown, settings: CodexCompactSettings): void {\n if (!ctx.hasUI || !settings.notifyOnFallback) return;\n const message = terminalText(error instanceof Error ? error.message : String(error));\n ctx.ui.notify(`Responses compaction failed; using Pi compaction. ${message}`, \"warning\");\n}\n\nfunction sessionStillOwned(ctx: ExtensionContext, sessionId: string, signal: AbortSignal): boolean {\n return !signal.aborted && ctx.sessionManager.getSessionId() === sessionId;\n}\n\nasync function compactRemotely(\n pi: ExtensionAPI,\n event: SessionBeforeCompactEvent,\n ctx: ExtensionContext,\n settings: CodexCompactSettings,\n ownerSignal: AbortSignal,\n fetch?: typeof globalThis.fetch,\n) {\n const model = ctx.model;\n const route = resolveCompactionRoute(model, settings);\n if (route.kind === \"native\" || !model) return undefined;\n const signal = AbortSignal.any([event.signal, ownerSignal]);\n if (signal.aborted) return { cancel: true };\n const sessionId = ctx.sessionManager.getSessionId();\n ctx.ui.setStatus(STATUS_KEY, route.protocol === \"remote-v2\" ? \"Responses Remote V2\u2026\" : \"Responses Compact API\u2026\");\n try {\n const auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);\n if (!sessionStillOwned(ctx, sessionId, signal)) return { cancel: true };\n if (!auth.ok) throw new Error(auth.error);\n const provider = ctx.modelRegistry.getProvider(model.provider);\n if (!provider) throw new Error(\"The active Responses provider is unavailable\");\n const current = projectedCurrentMessages(event, model, route);\n const context: Context = {\n systemPrompt: ctx.getSystemPrompt(),\n messages: convertToLlm(current.messages),\n tools: activeTools(pi),\n };\n const response = await requestRemoteCompaction({\n provider,\n model,\n context,\n protocol: route.protocol,\n profile: route.profile,\n apiKey: auth.apiKey,\n headers: auth.headers,\n env: auth.env,\n signal,\n priorCheckpoint: current.prior\n ? {\n marker: checkpointMarker(current.prior.checkpointId),\n replacementHistory: current.prior.replacementHistory,\n }\n : undefined,\n requestTimeoutMs: settings.requestTimeoutMs,\n maxRetries: settings.maxRetries,\n fetch,\n });\n if (!sessionStillOwned(ctx, sessionId, signal)) return { cancel: true };\n const replacementHistory = buildReplacementHistory(\n response.compactedOutput?.slice(0, -1) ?? response.promptInput,\n response.item,\n { tokenBudget: settings.replacementTokenBudget },\n );\n const details = createCheckpointDetails({\n provider: model.provider,\n api: route.api,\n profile: route.profile,\n modelId: model.id,\n protocol: route.protocol,\n replacementHistory,\n keptMessages: keptMessages(event),\n });\n return {\n compaction: {\n summary: fallbackSummary(details.checkpointId),\n firstKeptEntryId: event.preparation.firstKeptEntryId,\n tokensBefore: event.preparation.tokensBefore,\n usage: response.usage,\n details,\n },\n };\n } catch (error) {\n if (signal.aborted || ctx.sessionManager.getSessionId() !== sessionId) {\n return { cancel: true };\n }\n notifyFailure(ctx, error, settings);\n return undefined;\n } finally {\n if (ctx.sessionManager.getSessionId() === sessionId) ctx.ui.setStatus(STATUS_KEY, undefined);\n }\n}\n\nexport function createCodexCompactExtension(\n options: { fetch?: typeof globalThis.fetch; settingsRuntime?: CodexCompactSettingsRuntime } = {},\n): (pi: ExtensionAPI) => void {\n return (pi) => {\n const providerWarnings = new Set<string>();\n const settingsRuntime = options.settingsRuntime ?? createCodexCompactSettingsRuntime();\n let sessionController = new AbortController();\n let generation = 0;\n\n pi.registerCommand(\"codex-compact\", {\n description: \"Compact now or configure Responses compaction\",\n handler: async (args, ctx) => {\n if (args.trim()) throw new Error(\"Usage: /codex-compact\");\n const ownerGeneration = generation;\n const controller = sessionController;\n const { showCodexCompactMenu } = await import(\"./settings-menu.js\");\n if (ownerGeneration !== generation || controller.signal.aborted) return;\n await showCodexCompactMenu(settingsRuntime, ctx, {\n signal: controller.signal,\n isCurrent: () => ownerGeneration === generation && !controller.signal.aborted,\n });\n },\n });\n\n pi.on(\"session_start\", async (_event, ctx) => {\n sessionController.abort();\n sessionController = new AbortController();\n generation += 1;\n const ownerGeneration = generation;\n const sessionId = ctx.sessionManager.getSessionId();\n providerWarnings.clear();\n let state: Readonly<CodexCompactSettingsState>;\n try {\n state = await settingsRuntime.reload(sessionController.signal);\n } catch (error) {\n if (sessionController.signal.aborted || ownerGeneration !== generation) return;\n if (ctx.hasUI) {\n ctx.ui.notify(\n `Could not load pi-codex-compact.json; using defaults. ${terminalText(error instanceof Error ? error.message : String(error))}`,\n \"warning\",\n );\n }\n return;\n }\n if (\n sessionController.signal.aborted ||\n ownerGeneration !== generation ||\n ctx.sessionManager.getSessionId() !== sessionId\n ) {\n return;\n }\n if (ctx.hasUI && state.kind === \"invalid\") {\n ctx.ui.notify(\n `Invalid pi-codex-compact.json; using defaults without overwriting it. ${terminalText(state.issue ?? \"unknown validation error\")}`,\n \"warning\",\n );\n }\n });\n\n pi.on(\"session_before_compact\", (event, ctx) =>\n compactRemotely(pi, event, ctx, settingsRuntime.get().settings, sessionController.signal, options.fetch),\n );\n\n pi.on(\"context\", (event, ctx) => {\n if (!settingsRuntime.get().settings.enabled) return undefined;\n const settings = settingsRuntime.get().settings;\n const checkpoint = activeCheckpoint(ctx);\n if (!checkpoint || !isCheckpointCompatible(checkpoint.details, ctx.model, settings)) return undefined;\n const messages = projectCheckpointContext(event.messages, checkpoint.details, checkpoint.entry.summary);\n return messages ? { messages } : undefined;\n });\n\n pi.on(\"before_provider_request\", (event, ctx) => {\n if (!settingsRuntime.get().settings.enabled) return undefined;\n const settings = settingsRuntime.get().settings;\n const checkpoint = activeCheckpoint(ctx);\n if (!checkpoint || !isCheckpointCompatible(checkpoint.details, ctx.model, settings)) return undefined;\n const marker = checkpointMarker(checkpoint.details.checkpointId);\n if (!hasCheckpointMarker(event.payload, marker)) return undefined;\n return rewriteCheckpointMarker(event.payload, marker, checkpoint.details.replacementHistory);\n });\n\n pi.on(\"model_select\", (event, ctx) => {\n if (!settingsRuntime.get().settings.enabled) return;\n const settings = settingsRuntime.get().settings;\n const checkpoint = activeCheckpoint(ctx);\n if (!checkpoint || isCheckpointCompatible(checkpoint.details, event.model, settings)) return;\n const key = `${ctx.sessionManager.getSessionId()}:${event.model.provider}:${event.model.id}`;\n if (providerWarnings.has(key)) return;\n providerWarnings.add(key);\n if (ctx.hasUI) {\n ctx.ui.notify(\n \"The active Responses checkpoint cannot replay on this model; Pi will expose only its fallback marker and retained recent messages.\",\n \"warning\",\n );\n }\n });\n\n pi.on(\"session_shutdown\", async (_event, ctx) => {\n generation += 1;\n sessionController.abort();\n providerWarnings.clear();\n ctx.ui.setStatus(STATUS_KEY, undefined);\n await settingsRuntime.flush();\n });\n };\n}\n\nexport default createCodexCompactExtension();\n", "import { createHash, randomUUID } from \"node:crypto\";\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { Api } from \"@earendil-works/pi-ai\";\nimport type { CompactionEntry, SessionEntry } from \"@earendil-works/pi-coding-agent\";\nimport type { RemoteCompactionProtocol, ResponsesCompactionProfile } from \"./model-api.js\";\nimport { type JsonObject, validateCompactionItem } from \"./protocol.js\";\n\nexport const CHECKPOINT_KIND = \"pi-codex-remote-compaction\";\nexport const CHECKPOINT_VERSION = 3;\nexport const REPLACEMENT_TOKEN_BUDGET = 64_000;\nexport const REPLACEMENT_BYTE_BUDGET = 8 * 1024 * 1024;\nconst MAX_MEDIA_ITEM_BYTES = 2 * 1024 * 1024;\nconst MAX_CHECKPOINT_DETAILS_BYTES = 10 * 1024 * 1024;\nconst MAX_CHECKPOINT_ID_LENGTH = 128;\nconst MAX_PROVIDER_ID_LENGTH = 256;\nconst MAX_API_ID_LENGTH = 256;\nconst MAX_MODEL_ID_LENGTH = 512;\nconst MAX_KEPT_FINGERPRINTS = 100_000;\n\nexport interface CodexCheckpointDetails {\n kind: typeof CHECKPOINT_KIND;\n version: typeof CHECKPOINT_VERSION;\n checkpointId: string;\n provider: string;\n api: Api;\n profile: ResponsesCompactionProfile;\n modelId: string;\n protocol: RemoteCompactionProtocol;\n replacementHistory: JsonObject[];\n keptMessageFingerprints: string[];\n createdAt: string;\n}\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction stableValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(stableValue);\n if (!isObject(value)) return value;\n return Object.fromEntries(\n Object.entries(value)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, child]) => [key, stableValue(child)]),\n );\n}\n\nfunction serializedBytes(value: unknown): number {\n return Buffer.byteLength(JSON.stringify(value), \"utf8\");\n}\n\nexport function fingerprintMessage(message: AgentMessage): string {\n return createHash(\"sha256\")\n .update(JSON.stringify(stableValue(message)))\n .digest(\"hex\");\n}\n\nexport function checkpointMarker(checkpointId: string): string {\n return [\n `[PI_CODEX_REMOTE_CHECKPOINT:${checkpointId}]`,\n \"Opaque checkpoint injection failed. Do not infer missing history; tell the user to re-enable\",\n \"@narumitw/pi-codex-compact with the same model and Responses API.\",\n ].join(\" \");\n}\n\nexport function fallbackSummary(checkpointId: string): string {\n return [\n `Responses compaction checkpoint ${checkpointId} stores the older history opaquely.`,\n \"Full replay requires @narumitw/pi-codex-compact and the same model through a compatible Responses provider.\",\n \"Without them, only Pi's retained recent messages remain available.\",\n ].join(\" \");\n}\n\nfunction markerMessage(checkpointId: string, timestamp: number): AgentMessage {\n return {\n role: \"user\",\n content: [{ type: \"text\", text: checkpointMarker(checkpointId) }],\n timestamp,\n };\n}\n\nexport function parseCheckpointDetails(value: unknown): CodexCheckpointDetails | undefined {\n if (!isObject(value)) return undefined;\n try {\n if (serializedBytes(value) > MAX_CHECKPOINT_DETAILS_BYTES) return undefined;\n } catch {\n return undefined;\n }\n const isVersionOne =\n value.version === 1 && value.api === \"openai-codex-responses\" && value.protocol === \"remote-compaction-v2\";\n const isVersionTwo =\n value.version === 2 &&\n (value.api === \"openai-codex-responses\" ||\n value.api === \"openai-responses\" ||\n value.api === \"azure-openai-responses\") &&\n (value.protocol === \"remote-v2\" || value.protocol === \"responses-compact\");\n const isVersionThree =\n value.version === CHECKPOINT_VERSION &&\n typeof value.api === \"string\" &&\n value.api.length > 0 &&\n value.api.length <= MAX_API_ID_LENGTH &&\n (value.profile === \"codex-responses-v1\" || value.profile === \"openai-responses-v1\") &&\n (value.protocol === \"remote-v2\" || value.protocol === \"responses-compact\");\n if (\n value.kind !== CHECKPOINT_KIND ||\n (!isVersionOne && !isVersionTwo && !isVersionThree) ||\n typeof value.checkpointId !== \"string\" ||\n value.checkpointId.length < 8 ||\n value.checkpointId.length > MAX_CHECKPOINT_ID_LENGTH ||\n typeof value.provider !== \"string\" ||\n value.provider.length === 0 ||\n value.provider.length > MAX_PROVIDER_ID_LENGTH ||\n typeof value.modelId !== \"string\" ||\n value.modelId.length === 0 ||\n value.modelId.length > MAX_MODEL_ID_LENGTH ||\n !Array.isArray(value.replacementHistory) ||\n !Array.isArray(value.keptMessageFingerprints) ||\n value.keptMessageFingerprints.length > MAX_KEPT_FINGERPRINTS ||\n typeof value.createdAt !== \"string\" ||\n value.createdAt.length > 64\n ) {\n return undefined;\n }\n const api = value.api as Api;\n const profile =\n api === \"openai-codex-responses\"\n ? \"codex-responses-v1\"\n : api === \"openai-responses\" || api === \"azure-openai-responses\"\n ? \"openai-responses-v1\"\n : value.profile;\n if (\n (profile !== \"codex-responses-v1\" && profile !== \"openai-responses-v1\") ||\n (api !== \"openai-codex-responses\" &&\n api !== \"openai-responses\" &&\n api !== \"azure-openai-responses\" &&\n profile !== \"codex-responses-v1\") ||\n (isVersionThree && value.profile !== profile)\n ) {\n return undefined;\n }\n if (\n value.replacementHistory.length === 0 ||\n !value.replacementHistory.every(isObject) ||\n !value.keptMessageFingerprints.every(\n (fingerprint) => typeof fingerprint === \"string\" && /^[a-f0-9]{64}$/.test(fingerprint),\n ) ||\n serializedBytes(value.replacementHistory) > REPLACEMENT_BYTE_BUDGET\n ) {\n return undefined;\n }\n const last = value.replacementHistory.at(-1);\n try {\n validateCompactionItem(last);\n } catch {\n return undefined;\n }\n return {\n kind: CHECKPOINT_KIND,\n version: CHECKPOINT_VERSION,\n checkpointId: value.checkpointId,\n provider: value.provider,\n api,\n profile,\n modelId: value.modelId,\n protocol: isVersionOne ? \"remote-v2\" : (value.protocol as RemoteCompactionProtocol),\n replacementHistory: structuredClone(value.replacementHistory),\n keptMessageFingerprints: [...value.keptMessageFingerprints],\n createdAt: value.createdAt,\n };\n}\n\nexport function latestCheckpoint(entries: readonly SessionEntry[]):\n | {\n entry: CompactionEntry<CodexCheckpointDetails>;\n details: CodexCheckpointDetails;\n }\n | undefined {\n for (let index = entries.length - 1; index >= 0; index--) {\n const entry = entries[index];\n if (entry.type !== \"compaction\") continue;\n const details = parseCheckpointDetails(entry.details);\n return details ? { entry: entry as CompactionEntry<CodexCheckpointDetails>, details } : undefined;\n }\n return undefined;\n}\n\nfunction isOlderCompactionSummary(message: AgentMessage, timestamp: number): boolean {\n return (\n message.role === \"compactionSummary\" &&\n Number.isFinite(message.timestamp) &&\n Number.isFinite(timestamp) &&\n message.timestamp < timestamp\n );\n}\n\nexport function projectCheckpointContext(\n messages: readonly AgentMessage[],\n details: CodexCheckpointDetails,\n checkpointSummary: string,\n): AgentMessage[] | undefined {\n const summaryIndex = messages.findIndex(\n (message) => message.role === \"compactionSummary\" && message.summary === checkpointSummary,\n );\n if (summaryIndex < 0) return undefined;\n const timestamp = messages[summaryIndex].timestamp;\n let messageIndex = summaryIndex + 1;\n let fingerprintIndex = 0;\n while (fingerprintIndex < details.keptMessageFingerprints.length) {\n if (messageIndex >= messages.length) return undefined;\n const message = messages[messageIndex];\n if (fingerprintMessage(message) === details.keptMessageFingerprints[fingerprintIndex]) {\n messageIndex += 1;\n fingerprintIndex += 1;\n continue;\n }\n if (isOlderCompactionSummary(message, timestamp)) {\n messageIndex += 1;\n continue;\n }\n return undefined;\n }\n while (messageIndex < messages.length && isOlderCompactionSummary(messages[messageIndex], timestamp)) {\n messageIndex += 1;\n }\n return [\n ...messages.slice(0, summaryIndex),\n markerMessage(details.checkpointId, timestamp),\n ...messages.slice(messageIndex),\n ];\n}\n\nfunction rawText(item: JsonObject): string {\n if (!Array.isArray(item.content)) return \"\";\n return item.content\n .flatMap((part) =>\n isObject(part) && typeof part.text === \"string\" && part.type === \"input_text\" ? [part.text] : [],\n )\n .join(\"\\n\");\n}\n\nfunction hasMedia(item: JsonObject): boolean {\n return Array.isArray(item.content) && item.content.some((part) => isObject(part) && part.type === \"input_image\");\n}\n\nfunction truncateTextItem(item: JsonObject, maxChars: number): JsonObject | undefined {\n if (!Array.isArray(item.content) || maxChars <= 32) return undefined;\n let remaining = maxChars - 16;\n const content = [...item.content].reverse().flatMap((part) => {\n if (!isObject(part) || part.type !== \"input_text\" || typeof part.text !== \"string\" || remaining <= 0) {\n return [];\n }\n const text = part.text.slice(-remaining);\n remaining -= text.length;\n return [{ ...part, text: `[truncated]\\n${text}` }];\n });\n if (content.length === 0) return undefined;\n return { ...item, content: content.reverse() };\n}\n\nexport function buildReplacementHistory(\n input: readonly unknown[],\n compactionItem: JsonObject,\n options: { tokenBudget?: number; byteBudget?: number } = {},\n): JsonObject[] {\n const tokenBudget = options.tokenBudget ?? REPLACEMENT_TOKEN_BUDGET;\n const byteBudget = options.byteBudget ?? REPLACEMENT_BYTE_BUDGET;\n const opaque = validateCompactionItem(compactionItem);\n let remainingBytes = byteBudget - serializedBytes(opaque);\n let remainingChars = tokenBudget * 4;\n if (remainingBytes <= 0) throw new Error(\"Opaque compaction item exceeds replacement history budget\");\n const retainedNewestFirst: JsonObject[] = [];\n const candidates = input.filter(\n (item): item is JsonObject => isObject(item) && item.role === \"user\" && item.type !== \"compaction_trigger\",\n );\n for (let index = candidates.length - 1; index >= 0; index--) {\n const candidate = candidates[index];\n const bytes = serializedBytes(candidate);\n if (hasMedia(candidate) && bytes > MAX_MEDIA_ITEM_BYTES) continue;\n const text = rawText(candidate);\n let retained = candidate;\n if (text.length > remainingChars) {\n if (hasMedia(candidate)) continue;\n const truncated = truncateTextItem(candidate, remainingChars);\n if (!truncated) continue;\n retained = truncated;\n }\n if (serializedBytes(retained) > remainingBytes) {\n if (hasMedia(retained)) continue;\n const maxCharsByBytes = Math.max(0, remainingBytes - 128);\n const truncated = truncateTextItem(retained, Math.min(remainingChars, maxCharsByBytes));\n if (!truncated || serializedBytes(truncated) > remainingBytes) continue;\n retained = truncated;\n }\n retainedNewestFirst.push(structuredClone(retained));\n remainingBytes -= serializedBytes(retained);\n remainingChars -= Math.min(remainingChars, rawText(retained).length);\n if (remainingBytes <= 128 || remainingChars <= 32) break;\n }\n return [...retainedNewestFirst.reverse(), opaque];\n}\n\nexport function createCheckpointDetails(input: {\n provider: string;\n api: Api;\n profile: ResponsesCompactionProfile;\n modelId: string;\n protocol: RemoteCompactionProtocol;\n replacementHistory: JsonObject[];\n keptMessages: readonly AgentMessage[];\n checkpointId?: string;\n createdAt?: string;\n}): CodexCheckpointDetails {\n const details: CodexCheckpointDetails = {\n kind: CHECKPOINT_KIND,\n version: CHECKPOINT_VERSION,\n checkpointId: input.checkpointId ?? randomUUID(),\n provider: input.provider,\n api: input.api,\n profile: input.profile,\n modelId: input.modelId,\n protocol: input.protocol,\n replacementHistory: structuredClone(input.replacementHistory),\n keptMessageFingerprints: input.keptMessages.map(fingerprintMessage),\n createdAt: input.createdAt ?? new Date().toISOString(),\n };\n const parsed = parseCheckpointDetails(details);\n if (!parsed) throw new Error(\"Created an invalid Codex checkpoint\");\n return parsed;\n}\n", "export const MAX_SSE_BYTES = 8 * 1024 * 1024;\nexport const MAX_COMPACT_JSON_BYTES = 8 * 1024 * 1024;\nexport const MAX_COMPACTION_ITEM_BYTES = 2 * 1024 * 1024;\n\nexport type JsonObject = Record<string, unknown>;\n\nexport class CodexCompactionProtocolError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CodexCompactionProtocolError\";\n }\n}\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction byteLength(value: unknown): number {\n return Buffer.byteLength(JSON.stringify(value), \"utf8\");\n}\n\nexport function isCompactionItem(value: unknown): value is JsonObject {\n return (\n isObject(value) &&\n value.type === \"compaction\" &&\n typeof value.encrypted_content === \"string\" &&\n value.encrypted_content.length > 0\n );\n}\n\nexport function validateCompactionItem(value: unknown, maxBytes = MAX_COMPACTION_ITEM_BYTES): JsonObject {\n if (!isCompactionItem(value)) {\n throw new CodexCompactionProtocolError(\"Remote response did not contain a valid compaction item\");\n }\n if (byteLength(value) > maxBytes) {\n throw new CodexCompactionProtocolError(\"Remote compaction item exceeded the size limit\");\n }\n return structuredClone(value);\n}\n\nexport interface CollectedCompaction {\n item: JsonObject;\n completedResponse?: JsonObject;\n}\n\nexport interface CollectedCompactResponse {\n item: JsonObject;\n output: JsonObject[];\n response: JsonObject;\n}\n\nfunction compactionItemsFromEvent(event: JsonObject): unknown[] {\n const items: unknown[] = [];\n if (event.type === \"response.output_item.done\" && isObject(event.item)) {\n items.push(event.item);\n }\n if (event.type === \"response.completed\" && isObject(event.response)) {\n const output = event.response.output;\n if (Array.isArray(output)) items.push(...output);\n }\n return items.filter((item) => isObject(item) && item.type === \"compaction\");\n}\n\nexport async function collectCompactionSse(\n stream: ReadableStream<Uint8Array>,\n options: {\n signal?: AbortSignal;\n maxBytes?: number;\n maxItemBytes?: number;\n } = {},\n): Promise<CollectedCompaction> {\n const maxBytes = options.maxBytes ?? MAX_SSE_BYTES;\n const reader = stream.getReader();\n const onAbort = () => {\n void reader.cancel(new DOMException(\"Compaction aborted\", \"AbortError\")).catch(() => undefined);\n };\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n const decoder = new TextDecoder();\n let bytes = 0;\n let pending = \"\";\n let dataLines: string[] = [];\n let completedResponse: JsonObject | undefined;\n const items = new Map<string, JsonObject>();\n\n const checkAbort = () => {\n if (options.signal?.aborted) throw new DOMException(\"Compaction aborted\", \"AbortError\");\n };\n const dispatch = () => {\n if (dataLines.length === 0) return;\n const data = dataLines.join(\"\\n\");\n dataLines = [];\n if (data === \"[DONE]\") return;\n let parsed: unknown;\n try {\n parsed = JSON.parse(data);\n } catch {\n throw new CodexCompactionProtocolError(\"Remote compaction returned malformed SSE JSON\");\n }\n if (!isObject(parsed)) return;\n if (parsed.type === \"response.completed\") {\n completedResponse = isObject(parsed.response) ? parsed.response : {};\n }\n for (const candidate of compactionItemsFromEvent(parsed)) {\n const item = validateCompactionItem(candidate, options.maxItemBytes);\n items.set(JSON.stringify(item), item);\n }\n };\n const processLine = (line: string) => {\n if (line === \"\") {\n dispatch();\n return;\n }\n if (line.startsWith(\":\")) return;\n if (line === \"data\") dataLines.push(\"\");\n else if (line.startsWith(\"data:\")) dataLines.push(line.slice(5).replace(/^ /, \"\"));\n };\n\n try {\n while (true) {\n checkAbort();\n const { done, value } = await reader.read();\n if (done) break;\n bytes += value.byteLength;\n if (bytes > maxBytes) {\n throw new CodexCompactionProtocolError(\"Remote compaction stream exceeded the size limit\");\n }\n pending += decoder.decode(value, { stream: true });\n let newline = pending.indexOf(\"\\n\");\n while (newline !== -1) {\n const rawLine = pending.slice(0, newline);\n pending = pending.slice(newline + 1);\n processLine(rawLine.endsWith(\"\\r\") ? rawLine.slice(0, -1) : rawLine);\n newline = pending.indexOf(\"\\n\");\n }\n }\n pending += decoder.decode();\n if (pending.length > 0) processLine(pending.endsWith(\"\\r\") ? pending.slice(0, -1) : pending);\n dispatch();\n checkAbort();\n } catch (error) {\n await reader.cancel(error).catch(() => undefined);\n throw error;\n } finally {\n options.signal?.removeEventListener(\"abort\", onAbort);\n reader.releaseLock();\n }\n\n if (!completedResponse) {\n throw new CodexCompactionProtocolError(\"Remote compaction stream ended without response.completed\");\n }\n if (items.size !== 1) {\n throw new CodexCompactionProtocolError(\n `Remote compaction returned ${items.size} distinct compaction items; expected exactly one`,\n );\n }\n return { item: [...items.values()][0], completedResponse };\n}\n\nfunction isRetainedCompactContent(value: unknown): value is JsonObject {\n if (!isObject(value)) return false;\n if (value.type === \"input_text\") return typeof value.text === \"string\";\n if (value.type !== \"input_image\") return false;\n if (\n value.detail !== undefined &&\n value.detail !== null &&\n value.detail !== \"auto\" &&\n value.detail !== \"low\" &&\n value.detail !== \"high\" &&\n value.detail !== \"original\"\n ) {\n return false;\n }\n if (\n (value.file_id !== undefined && value.file_id !== null && typeof value.file_id !== \"string\") ||\n (value.image_url !== undefined && value.image_url !== null && typeof value.image_url !== \"string\")\n ) {\n return false;\n }\n return (\n (typeof value.file_id === \"string\" && value.file_id.length > 0) ||\n (typeof value.image_url === \"string\" && value.image_url.length > 0)\n );\n}\n\nfunction isRetainedCompactMessage(value: unknown): value is JsonObject {\n return (\n isObject(value) &&\n value.role === \"user\" &&\n (value.type === undefined || value.type === \"message\") &&\n Array.isArray(value.content) &&\n value.content.length > 0 &&\n value.content.every(isRetainedCompactContent)\n );\n}\n\nexport function validateCompactedResponse(\n value: unknown,\n options: { maxBytes?: number; maxItemBytes?: number } = {},\n): CollectedCompactResponse {\n if (!isObject(value) || !Array.isArray(value.output)) {\n throw new CodexCompactionProtocolError(\"Responses Compact returned an invalid response object\");\n }\n const maxBytes = options.maxBytes ?? MAX_COMPACT_JSON_BYTES;\n const maxItemBytes = options.maxItemBytes ?? MAX_COMPACTION_ITEM_BYTES;\n if (byteLength(value) > maxBytes) {\n throw new CodexCompactionProtocolError(\"Responses Compact response exceeded the size limit\");\n }\n if (value.output.length === 0) {\n throw new CodexCompactionProtocolError(\"Responses Compact returned no output items\");\n }\n const output = value.output.map((item) => {\n if (!isObject(item)) {\n throw new CodexCompactionProtocolError(\"Responses Compact returned a non-object output item\");\n }\n if (byteLength(item) > maxItemBytes) {\n throw new CodexCompactionProtocolError(\"Responses Compact output item exceeded the size limit\");\n }\n return structuredClone(item);\n });\n const compactionItems = output.filter((item) => item.type === \"compaction\");\n if (compactionItems.length !== 1 || output.at(-1)?.type !== \"compaction\") {\n throw new CodexCompactionProtocolError(\n \"Responses Compact must return retained messages followed by one compaction item\",\n );\n }\n for (const item of output.slice(0, -1)) {\n if (!isRetainedCompactMessage(item)) {\n throw new CodexCompactionProtocolError(\"Responses Compact returned an unsupported retained output item\");\n }\n }\n const item = validateCompactionItem(output.at(-1), maxItemBytes);\n return { item, output: [...output.slice(0, -1), item], response: structuredClone(value) };\n}\n\nexport async function collectCompactResponse(\n response: Response,\n options: { signal?: AbortSignal; maxBytes?: number; maxItemBytes?: number } = {},\n): Promise<CollectedCompactResponse> {\n const maxBytes = options.maxBytes ?? MAX_COMPACT_JSON_BYTES;\n const declaredLength = Number(response.headers.get(\"content-length\"));\n if (Number.isFinite(declaredLength) && declaredLength > maxBytes) {\n const error = new CodexCompactionProtocolError(\"Responses Compact response exceeded the size limit\");\n await response.body?.cancel(error).catch(() => undefined);\n throw error;\n }\n if (!response.body) {\n throw new CodexCompactionProtocolError(\"Responses Compact response did not contain a body\");\n }\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let bytes = 0;\n const onAbort = () => {\n void reader.cancel(new DOMException(\"Compaction aborted\", \"AbortError\")).catch(() => undefined);\n };\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n try {\n while (true) {\n if (options.signal?.aborted) throw new DOMException(\"Compaction aborted\", \"AbortError\");\n const { done, value } = await reader.read();\n if (done) break;\n bytes += value.byteLength;\n if (bytes > maxBytes) {\n throw new CodexCompactionProtocolError(\"Responses Compact response exceeded the size limit\");\n }\n chunks.push(value);\n }\n if (options.signal?.aborted) throw new DOMException(\"Compaction aborted\", \"AbortError\");\n } catch (error) {\n await reader.cancel(error).catch(() => undefined);\n throw error;\n } finally {\n options.signal?.removeEventListener(\"abort\", onAbort);\n reader.releaseLock();\n }\n const body = new Uint8Array(bytes);\n let offset = 0;\n for (const chunk of chunks) {\n body.set(chunk, offset);\n offset += chunk.byteLength;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(new TextDecoder().decode(body));\n } catch {\n throw new CodexCompactionProtocolError(\"Responses Compact returned malformed JSON\");\n }\n return validateCompactedResponse(parsed, options);\n}\n\nfunction markerTextFromItem(item: unknown): string | undefined {\n if (!isObject(item) || item.role !== \"user\" || !Array.isArray(item.content)) return undefined;\n if (item.content.length !== 1) return undefined;\n const content = item.content[0];\n if (!isObject(content) || content.type !== \"input_text\" || typeof content.text !== \"string\") {\n return undefined;\n }\n return content.text;\n}\n\nexport function rewriteCheckpointMarker(\n payload: unknown,\n marker: string,\n replacementHistory: readonly unknown[],\n): JsonObject {\n if (!isObject(payload) || !Array.isArray(payload.input)) {\n throw new CodexCompactionProtocolError(\"Codex Responses payload is missing an input array\");\n }\n const matches = payload.input\n .map((item, index) => (markerTextFromItem(item) === marker ? index : -1))\n .filter((index) => index >= 0);\n if (matches.length !== 1) {\n throw new CodexCompactionProtocolError(\n `Provider payload contained ${matches.length} checkpoint markers; expected exactly one`,\n );\n }\n const index = matches[0];\n return {\n ...payload,\n input: [\n ...payload.input.slice(0, index),\n ...structuredClone(replacementHistory),\n ...payload.input.slice(index + 1),\n ],\n };\n}\n\nexport function appendCompactionTrigger(payload: unknown): JsonObject {\n if (!isObject(payload) || !Array.isArray(payload.input)) {\n throw new CodexCompactionProtocolError(\"Codex Responses payload is missing an input array\");\n }\n if (payload.input.some((item) => isObject(item) && item.type === \"compaction_trigger\")) {\n throw new CodexCompactionProtocolError(\"Provider payload already contains a compaction trigger\");\n }\n return { ...payload, input: [...payload.input, { type: \"compaction_trigger\" }] };\n}\n\nexport function expandRemoteCompactionPayload(\n payload: unknown,\n checkpoint?: { marker: string; replacementHistory: readonly unknown[] },\n): JsonObject {\n if (checkpoint) {\n return rewriteCheckpointMarker(payload, checkpoint.marker, checkpoint.replacementHistory);\n }\n if (!isObject(payload) || !Array.isArray(payload.input)) {\n throw new CodexCompactionProtocolError(\"Responses payload is missing an input array\");\n }\n return structuredClone(payload);\n}\n\nexport function prepareRemoteCompactionPayload(\n payload: unknown,\n checkpoint?: { marker: string; replacementHistory: readonly unknown[] },\n): JsonObject {\n return appendCompactionTrigger(expandRemoteCompactionPayload(payload, checkpoint));\n}\n\nexport function hasCheckpointMarker(payload: unknown, marker: string): boolean {\n return (\n isObject(payload) &&\n Array.isArray(payload.input) &&\n payload.input.some((item) => markerTextFromItem(item) === marker)\n );\n}\n", "import { normalizeContext, type Usage } from \"@earendil-works/pi-ai\";\nimport type { ResponsesCompactionProfile } from \"./model-api.js\";\nimport {\n CodexCompactionProtocolError,\n type CollectedCompactResponse,\n collectCompactResponse,\n expandRemoteCompactionPayload,\n type JsonObject,\n} from \"./protocol.js\";\nimport { collectProviderUsage } from \"./remote-shared.js\";\nimport {\n abortError,\n assertPreparedInput,\n isJsonObject,\n type RemoteCompactionRequest,\n type RemoteCompactionResponse,\n} from \"./remote-types.js\";\n\nconst OFFICIAL_COMPACT_FIELDS = [\n \"model\",\n \"input\",\n \"instructions\",\n \"previous_response_id\",\n \"prompt_cache_key\",\n \"prompt_cache_retention\",\n \"service_tier\",\n] as const;\n\nconst CODEX_COMPACT_FIELDS = [\n \"model\",\n \"input\",\n \"instructions\",\n \"tools\",\n \"parallel_tool_calls\",\n \"reasoning\",\n \"service_tier\",\n \"prompt_cache_key\",\n \"text\",\n \"access_programs\",\n] as const;\n\nfunction compactPayload(payload: JsonObject, profile: ResponsesCompactionProfile): JsonObject {\n const fields = profile === \"codex-responses-v1\" ? CODEX_COMPACT_FIELDS : OFFICIAL_COMPACT_FIELDS;\n const result: JsonObject = {};\n for (const field of fields) {\n if (Object.hasOwn(payload, field) && payload[field] !== undefined) {\n result[field] = structuredClone(payload[field]);\n }\n }\n if (typeof result.model !== \"string\" || result.model.length === 0) {\n throw new CodexCompactionProtocolError(\"Responses payload is missing a model\");\n }\n assertPreparedInput(result);\n return result;\n}\n\nfunction requestUrl(input: string | URL | Request): URL {\n return new URL(input instanceof Request ? input.url : String(input));\n}\n\nexport function responsesCompactUrl(input: string | URL | Request): URL {\n const original = requestUrl(input);\n if (!original.pathname.endsWith(\"/responses\")) {\n throw new CodexCompactionProtocolError(\"Provider request URL does not end with the Responses endpoint\");\n }\n const compact = new URL(original);\n compact.pathname = `${compact.pathname}/compact`;\n if (compact.origin !== original.origin) {\n throw new CodexCompactionProtocolError(\"Responses Compact URL changed origin\");\n }\n return compact;\n}\n\nfunction mergedHeaders(input: string | URL | Request, init?: RequestInit): Headers {\n const headers = new Headers(input instanceof Request ? input.headers : undefined);\n new Headers(init?.headers).forEach((value, name) => {\n headers.set(name, value);\n });\n headers.delete(\"content-encoding\");\n headers.delete(\"content-length\");\n headers.set(\"accept\", \"application/json\");\n headers.set(\"content-type\", \"application/json\");\n return headers;\n}\n\nfunction mergedSignal(\n input: string | URL | Request,\n init: RequestInit | undefined,\n ownerSignal: AbortSignal,\n): AbortSignal {\n const signals = [ownerSignal];\n if (input instanceof Request) signals.push(input.signal);\n if (init?.signal) signals.push(init.signal);\n return signals.length === 1 ? ownerSignal : AbortSignal.any(signals);\n}\n\nfunction nonRetryableBridgeFailure(error: unknown): Response {\n const message = error instanceof Error ? error.message : String(error);\n return Response.json(\n {\n error: {\n message,\n type: \"invalid_request_error\",\n code: \"invalid_compact_response\",\n },\n },\n { status: 400 },\n );\n}\n\nfunction nonNegativeInteger(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0;\n}\n\nfunction optionalUsageDetail(details: unknown, field: string): number {\n if (details === undefined || details === null) return 0;\n if (!isJsonObject(details)) {\n throw new CodexCompactionProtocolError(\"Responses Compact response has invalid usage details\");\n }\n const value = details[field];\n if (value === undefined || value === null) return 0;\n if (!nonNegativeInteger(value)) {\n throw new CodexCompactionProtocolError(`Responses Compact response has invalid usage detail ${field}`);\n }\n return value;\n}\n\nfunction validatedUsage(response: JsonObject): JsonObject {\n const usage = response.usage;\n if (!isJsonObject(usage)) {\n throw new CodexCompactionProtocolError(\"Responses Compact response is missing usage\");\n }\n for (const field of [\"input_tokens\", \"output_tokens\", \"total_tokens\"] as const) {\n if (!nonNegativeInteger(usage[field])) {\n throw new CodexCompactionProtocolError(`Responses Compact response has invalid ${field}`);\n }\n }\n const inputTokens = usage.input_tokens as number;\n const outputTokens = usage.output_tokens as number;\n const totalTokens = usage.total_tokens as number;\n const cachedTokens = optionalUsageDetail(usage.input_tokens_details, \"cached_tokens\");\n const cacheWriteTokens = optionalUsageDetail(usage.input_tokens_details, \"cache_write_tokens\");\n const reasoningTokens = optionalUsageDetail(usage.output_tokens_details, \"reasoning_tokens\");\n if (cachedTokens + cacheWriteTokens > inputTokens || reasoningTokens > outputTokens) {\n throw new CodexCompactionProtocolError(\"Responses Compact response has inconsistent usage details\");\n }\n if (totalTokens !== inputTokens + outputTokens) {\n throw new CodexCompactionProtocolError(\"Responses Compact response has inconsistent total usage\");\n }\n return structuredClone(usage);\n}\n\nfunction syntheticCompletion(result: CollectedCompactResponse, payload: JsonObject): Response {\n const completed = {\n id: typeof result.response.id === \"string\" ? result.response.id : \"resp_pi_compact_bridge\",\n object: \"response\",\n created_at:\n typeof result.response.created_at === \"number\" ? result.response.created_at : Math.floor(Date.now() / 1000),\n status: \"completed\",\n model: payload.model,\n output: [],\n parallel_tool_calls: false,\n tool_choice: \"auto\",\n tools: [],\n usage: validatedUsage(result.response),\n };\n const events = [\n { type: \"response.created\", response: { ...completed, status: \"in_progress\" } },\n { type: \"response.completed\", response: completed },\n ];\n return new Response(events.map((event) => `data: ${JSON.stringify(event)}\\n\\n`).join(\"\"), {\n status: 200,\n headers: { \"content-type\": \"text/event-stream\" },\n });\n}\n\nexport async function requestResponsesCompact(request: RemoteCompactionRequest): Promise<RemoteCompactionResponse> {\n if (request.signal.aborted) throw abortError();\n let preparedPayload: JsonObject | undefined;\n let sentInput: JsonObject[] | undefined;\n let compactResult: CollectedCompactResponse | undefined;\n let bridgeError: unknown;\n let dispatchInFlight = false;\n let successfulResponses = 0;\n const baseFetch = request.fetch ?? globalThis.fetch;\n const bridgeFetch: typeof globalThis.fetch = async (input, init) => {\n if (request.signal.aborted) throw abortError();\n if (successfulResponses > 0) {\n bridgeError = new CodexCompactionProtocolError(\"Provider dispatched again after Responses Compact succeeded\");\n return nonRetryableBridgeFailure(bridgeError);\n }\n if (dispatchInFlight) {\n bridgeError = new CodexCompactionProtocolError(\"Provider dispatched overlapping Responses Compact requests\");\n return nonRetryableBridgeFailure(bridgeError);\n }\n if (!preparedPayload) {\n bridgeError = new CodexCompactionProtocolError(\"Provider dispatched before exposing its request payload\");\n return nonRetryableBridgeFailure(bridgeError);\n }\n let compactUrl: URL;\n try {\n compactUrl = responsesCompactUrl(input);\n } catch (error) {\n bridgeError = error;\n return nonRetryableBridgeFailure(error);\n }\n const signal = mergedSignal(input, init, request.signal);\n dispatchInFlight = true;\n try {\n const response = await baseFetch(compactUrl, {\n ...init,\n method: \"POST\",\n headers: mergedHeaders(input, init),\n body: JSON.stringify(preparedPayload),\n signal,\n });\n if (!response.ok) return response;\n try {\n const result = await collectCompactResponse(response, { signal });\n successfulResponses += 1;\n if (successfulResponses !== 1) {\n throw new CodexCompactionProtocolError(\n \"Provider returned more than one successful Responses Compact response\",\n );\n }\n compactResult = result;\n return syntheticCompletion(result, preparedPayload);\n } catch (error) {\n bridgeError = error;\n return nonRetryableBridgeFailure(error);\n }\n } finally {\n dispatchInFlight = false;\n }\n };\n\n const stream = request.provider.stream(request.model, normalizeContext(request.context), {\n apiKey: request.apiKey,\n headers: request.headers,\n env: request.env,\n signal: request.signal,\n transport: \"sse\",\n cacheRetention: \"none\",\n timeoutMs: request.requestTimeoutMs ?? 5 * 60 * 1000,\n maxRetries: request.maxRetries ?? 2,\n fetch: bridgeFetch,\n onPayload: (payload) => {\n if (preparedPayload) {\n throw new CodexCompactionProtocolError(\"Provider exposed more than one compaction request payload\");\n }\n const expanded = expandRemoteCompactionPayload(payload, request.priorCheckpoint);\n preparedPayload = compactPayload(expanded, request.profile);\n sentInput = assertPreparedInput(preparedPayload);\n return expanded;\n },\n });\n\n let usage: Usage;\n try {\n usage = await collectProviderUsage(stream, request.signal);\n } catch (error) {\n if (bridgeError) throw bridgeError;\n throw error;\n }\n if (request.signal.aborted) throw abortError();\n if (bridgeError) throw bridgeError;\n if (!preparedPayload || !sentInput || !compactResult || successfulResponses !== 1) {\n throw new CodexCompactionProtocolError(\"Provider did not complete exactly one Responses Compact request\");\n }\n return {\n item: compactResult.item,\n promptInput: sentInput,\n compactedOutput: compactResult.output,\n usage,\n };\n}\n", "import type { Api, Context, Model, Provider, ProviderHeaders, Usage } from \"@earendil-works/pi-ai\";\nimport type { RemoteCompactionProtocol, ResponsesCompactionProfile } from \"./model-api.js\";\nimport type { JsonObject } from \"./protocol.js\";\n\nexport interface PriorCheckpointPayload {\n marker: string;\n replacementHistory: readonly unknown[];\n}\n\nexport interface RemoteCompactionRequest {\n provider: Provider;\n model: Model<Api>;\n profile: ResponsesCompactionProfile;\n context: Context;\n protocol: RemoteCompactionProtocol;\n apiKey?: string;\n headers?: ProviderHeaders;\n env?: Record<string, string>;\n signal: AbortSignal;\n priorCheckpoint?: PriorCheckpointPayload;\n requestTimeoutMs?: number;\n maxRetries?: number;\n fetch?: typeof globalThis.fetch;\n}\n\nexport interface RemoteCompactionResponse {\n item: JsonObject;\n promptInput: JsonObject[];\n compactedOutput?: JsonObject[];\n usage: Usage;\n}\n\nexport function isJsonObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function abortError(): DOMException {\n return new DOMException(\"Compaction aborted\", \"AbortError\");\n}\n\nexport function assertPreparedInput(payload: JsonObject): JsonObject[] {\n if (!Array.isArray(payload.input) || !payload.input.every(isJsonObject)) {\n throw new Error(\"Prepared compaction payload has invalid input items\");\n }\n return structuredClone(payload.input);\n}\n", "import type { AssistantMessageEventStream, Usage } from \"@earendil-works/pi-ai\";\nimport { abortError } from \"./remote-types.js\";\n\nexport async function collectProviderUsage(stream: AssistantMessageEventStream, signal: AbortSignal): Promise<Usage> {\n let usage: Usage | undefined;\n for await (const event of stream) {\n if (signal.aborted) throw abortError();\n if (event.type === \"error\") {\n throw new Error(event.error.errorMessage ?? \"Responses compaction request failed\");\n }\n if (event.type === \"done\") usage = event.message.usage;\n }\n if (signal.aborted) throw abortError();\n if (!usage) throw new Error(\"Responses provider stream ended without completion usage\");\n return usage;\n}\n", "import { normalizeContext } from \"@earendil-works/pi-ai\";\nimport {\n CodexCompactionProtocolError,\n type CollectedCompaction,\n collectCompactionSse,\n prepareRemoteCompactionPayload,\n} from \"./protocol.js\";\nimport { collectProviderUsage } from \"./remote-shared.js\";\nimport {\n abortError,\n assertPreparedInput,\n type RemoteCompactionRequest,\n type RemoteCompactionResponse,\n} from \"./remote-types.js\";\n\nexport async function requestRemoteCompactionV2(request: RemoteCompactionRequest): Promise<RemoteCompactionResponse> {\n if (request.signal.aborted) throw abortError();\n let sentInput: ReturnType<typeof assertPreparedInput> | undefined;\n const inspections: Promise<{ ok: true; value: CollectedCompaction } | { ok: false; error: unknown }>[] = [];\n const baseFetch = request.fetch ?? globalThis.fetch;\n const inspectedFetch: typeof globalThis.fetch = async (input, init) => {\n const response = await baseFetch(input, init);\n if (!response.ok || !response.body) return response;\n const [providerBody, inspectionBody] = response.body.tee();\n const inspection = collectCompactionSse(inspectionBody, { signal: request.signal }).then(\n (value) => ({ ok: true as const, value }),\n (error: unknown) => ({ ok: false as const, error }),\n );\n inspections.push(inspection);\n return new Response(providerBody, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n });\n };\n\n const stream = request.provider.stream(request.model, normalizeContext(request.context), {\n apiKey: request.apiKey,\n headers: request.headers,\n env: request.env,\n signal: request.signal,\n transport: \"sse\",\n cacheRetention: \"none\",\n timeoutMs: request.requestTimeoutMs ?? 5 * 60 * 1000,\n maxRetries: request.maxRetries ?? 2,\n fetch: inspectedFetch,\n onPayload: (payload) => {\n const prepared = prepareRemoteCompactionPayload(payload, request.priorCheckpoint);\n sentInput = assertPreparedInput(prepared).slice(0, -1);\n return prepared;\n },\n });\n\n const usage = await collectProviderUsage(stream, request.signal);\n if (!sentInput) {\n throw new CodexCompactionProtocolError(\"Provider did not expose a request payload\");\n }\n if (inspections.length !== 1) {\n throw new CodexCompactionProtocolError(\n `Provider exposed ${inspections.length} successful SSE responses; expected exactly one`,\n );\n }\n const inspection = await inspections[0];\n if (request.signal.aborted) throw abortError();\n if (!inspection.ok) throw inspection.error;\n return { item: inspection.value.item, promptInput: sentInput, usage };\n}\n", "import { requestResponsesCompact } from \"./remote-compact.js\";\nimport type { RemoteCompactionRequest, RemoteCompactionResponse } from \"./remote-types.js\";\nimport { requestRemoteCompactionV2 } from \"./remote-v2.js\";\n\nexport type {\n PriorCheckpointPayload,\n RemoteCompactionRequest,\n RemoteCompactionResponse,\n} from \"./remote-types.js\";\n\nexport function requestRemoteCompaction(request: RemoteCompactionRequest): Promise<RemoteCompactionResponse> {\n return request.protocol === \"responses-compact\"\n ? requestResponsesCompact(request)\n : requestRemoteCompactionV2(request);\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { constants } from \"node:fs\";\nimport { mkdir, open, rename, rm, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, join } from \"node:path\";\nimport { getAgentDir } from \"@earendil-works/pi-coding-agent\";\nimport type { RemoteCompactionProtocolSetting } from \"./model-api.js\";\n\nexport const CODEX_COMPACT_SETTINGS_FILE = \"pi-codex-compact.json\";\nexport const MAX_SETTINGS_BYTES = 64 * 1024;\n\nexport interface CodexCompactSettings {\n enabled: boolean;\n protocol: RemoteCompactionProtocolSetting;\n apiProfiles: Record<string, \"codex-responses-v1\">;\n requestTimeoutMs: number;\n maxRetries: number;\n replacementTokenBudget: number;\n notifyOnFallback: boolean;\n}\n\nexport const DEFAULT_CODEX_COMPACT_SETTINGS: Readonly<CodexCompactSettings> = Object.freeze({\n enabled: true,\n protocol: \"auto\",\n apiProfiles: {},\n requestTimeoutMs: 300_000,\n maxRetries: 2,\n replacementTokenBudget: 64_000,\n notifyOnFallback: true,\n});\n\nconst LIMITS = Object.freeze({\n requestTimeoutMs: { minimum: 30_000, maximum: 600_000 },\n maxRetries: { minimum: 0, maximum: 2 },\n replacementTokenBudget: { minimum: 8_000, maximum: 128_000 },\n});\n\nconst BUILT_IN_APIS = new Set([\n \"openai-completions\",\n \"mistral-conversations\",\n \"openai-codex-responses\",\n \"openai-responses\",\n \"azure-openai-responses\",\n \"anthropic-messages\",\n \"bedrock-converse-stream\",\n \"google-generative-ai\",\n \"google-vertex\",\n \"pi-messages\",\n]);\nconst MAX_API_PROFILE_ID_LENGTH = 256;\n\nexport interface CodexCompactSettingsState {\n kind: \"missing\" | \"loaded\" | \"invalid\";\n path: string;\n settings: CodexCompactSettings;\n document?: Record<string, unknown>;\n issue?: string;\n}\n\nexport interface CodexCompactSettingsRuntime {\n get(): Readonly<CodexCompactSettingsState>;\n reload(signal?: AbortSignal): Promise<Readonly<CodexCompactSettingsState>>;\n update(patch: Partial<CodexCompactSettings>, signal?: AbortSignal): Promise<Readonly<CodexCompactSettingsState>>;\n flush(): Promise<void>;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction validInteger(value: unknown, minimum: number, maximum: number): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= minimum && value <= maximum;\n}\n\nfunction hasWhitespaceOrControl(value: string): boolean {\n return [...value].some((character) => {\n const code = character.codePointAt(0) ?? 0;\n return code <= 0x20 || code === 0x7f;\n });\n}\n\nfunction normalizeApiProfiles(value: unknown): Record<string, \"codex-responses-v1\"> | undefined {\n if (\n !isRecord(value) ||\n (Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null)\n ) {\n return undefined;\n }\n const profiles: Record<string, \"codex-responses-v1\"> = {};\n for (const [api, profile] of Object.entries(value)) {\n if (\n api.length === 0 ||\n api.length > MAX_API_PROFILE_ID_LENGTH ||\n api.trim() !== api ||\n hasWhitespaceOrControl(api) ||\n BUILT_IN_APIS.has(api) ||\n api === \"__proto__\" ||\n api === \"constructor\" ||\n api === \"prototype\" ||\n profile !== \"codex-responses-v1\"\n ) {\n return undefined;\n }\n profiles[api] = profile;\n }\n return profiles;\n}\n\nexport function normalizeCodexCompactSettings(value: unknown): CodexCompactSettings | undefined {\n if (!isRecord(value)) return undefined;\n if (Object.hasOwn(value, \"enabled\") && typeof value.enabled !== \"boolean\") return undefined;\n if (\n Object.hasOwn(value, \"protocol\") &&\n value.protocol !== \"auto\" &&\n value.protocol !== \"remote-v2\" &&\n value.protocol !== \"responses-compact\"\n ) {\n return undefined;\n }\n if (Object.hasOwn(value, \"notifyOnFallback\") && typeof value.notifyOnFallback !== \"boolean\") {\n return undefined;\n }\n if (Object.hasOwn(value, \"apiProfiles\") && normalizeApiProfiles(value.apiProfiles) === undefined) return undefined;\n for (const [field, limits] of Object.entries(LIMITS) as [\n keyof typeof LIMITS,\n { minimum: number; maximum: number },\n ][]) {\n if (Object.hasOwn(value, field) && !validInteger(value[field], limits.minimum, limits.maximum)) {\n return undefined;\n }\n }\n return {\n enabled: typeof value.enabled === \"boolean\" ? value.enabled : DEFAULT_CODEX_COMPACT_SETTINGS.enabled,\n protocol:\n value.protocol === \"remote-v2\" || value.protocol === \"responses-compact\"\n ? value.protocol\n : DEFAULT_CODEX_COMPACT_SETTINGS.protocol,\n apiProfiles: normalizeApiProfiles(value.apiProfiles) ?? structuredClone(DEFAULT_CODEX_COMPACT_SETTINGS.apiProfiles),\n requestTimeoutMs:\n typeof value.requestTimeoutMs === \"number\"\n ? value.requestTimeoutMs\n : DEFAULT_CODEX_COMPACT_SETTINGS.requestTimeoutMs,\n maxRetries: typeof value.maxRetries === \"number\" ? value.maxRetries : DEFAULT_CODEX_COMPACT_SETTINGS.maxRetries,\n replacementTokenBudget:\n typeof value.replacementTokenBudget === \"number\"\n ? value.replacementTokenBudget\n : DEFAULT_CODEX_COMPACT_SETTINGS.replacementTokenBudget,\n notifyOnFallback:\n typeof value.notifyOnFallback === \"boolean\"\n ? value.notifyOnFallback\n : DEFAULT_CODEX_COMPACT_SETTINGS.notifyOnFallback,\n };\n}\n\nexport function codexCompactSettingsPath(): string {\n return join(getAgentDir(), CODEX_COMPACT_SETTINGS_FILE);\n}\n\nfunction aborted(signal?: AbortSignal): void {\n if (signal?.aborted) throw new DOMException(\"Settings operation aborted\", \"AbortError\");\n}\n\nexport async function loadCodexCompactSettings(\n path = codexCompactSettingsPath(),\n signal?: AbortSignal,\n): Promise<CodexCompactSettingsState> {\n aborted(signal);\n try {\n const handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);\n let text: string;\n try {\n const stats = await handle.stat();\n aborted(signal);\n if (!stats.isFile()) throw new Error(\"settings path is not a regular file\");\n if (stats.size > MAX_SETTINGS_BYTES) throw new Error(\"settings file exceeds 64 KiB\");\n text = await handle.readFile(\"utf8\");\n } finally {\n await handle.close();\n }\n aborted(signal);\n const document = JSON.parse(text) as unknown;\n const settings = normalizeCodexCompactSettings(document);\n if (!settings || !isRecord(document)) throw new Error(\"invalid settings shape or bounds\");\n return { kind: \"loaded\", path, settings, document };\n } catch (error) {\n if (signal?.aborted) throw error;\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return {\n kind: \"missing\",\n path,\n settings: { ...DEFAULT_CODEX_COMPACT_SETTINGS },\n document: {},\n };\n }\n return {\n kind: \"invalid\",\n path,\n settings: { ...DEFAULT_CODEX_COMPACT_SETTINGS },\n issue:\n isNodeError(error) && error.code === \"ELOOP\"\n ? \"symbolic links are not accepted\"\n : error instanceof Error\n ? error.message\n : String(error),\n };\n }\n}\n\nasync function savePatch(\n path: string,\n patch: Partial<CodexCompactSettings>,\n signal?: AbortSignal,\n): Promise<CodexCompactSettingsState> {\n const latest = await loadCodexCompactSettings(path, signal);\n if (latest.kind === \"invalid\") {\n throw new Error(\"Cannot overwrite an invalid pi-codex-compact.json; repair it and reload first\");\n }\n const document = { ...latest.document, ...patch };\n const settings = normalizeCodexCompactSettings(document);\n if (!settings) throw new Error(\"Refusing to save invalid Codex compaction settings\");\n const temporaryPath = join(dirname(path), `.${basename(path)}.${randomUUID()}.tmp`);\n await mkdir(dirname(path), { recursive: true });\n aborted(signal);\n try {\n await writeFile(temporaryPath, `${JSON.stringify(document, null, 2)}\\n`, {\n encoding: \"utf8\",\n flag: \"wx\",\n mode: 0o600,\n });\n aborted(signal);\n const current = await loadCodexCompactSettings(path, signal);\n if (\n current.kind === \"invalid\" ||\n current.kind !== latest.kind ||\n JSON.stringify(current.document) !== JSON.stringify(latest.document)\n ) {\n throw new Error(\"pi-codex-compact.json changed while saving; reopen settings and retry\");\n }\n await rename(temporaryPath, path);\n } finally {\n await rm(temporaryPath, { force: true }).catch(() => undefined);\n }\n return { kind: \"loaded\", path, settings, document };\n}\n\nexport function createCodexCompactSettingsRuntime(path = codexCompactSettingsPath()): CodexCompactSettingsRuntime {\n let state: CodexCompactSettingsState = {\n kind: \"missing\",\n path,\n settings: { ...DEFAULT_CODEX_COMPACT_SETTINGS },\n document: {},\n };\n let queue = Promise.resolve();\n const enqueue = <T>(operation: () => Promise<T>): Promise<T> => {\n const result = queue.then(operation, operation);\n queue = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n };\n return {\n get: () => structuredClone(state),\n reload: (signal) =>\n enqueue(async () => {\n state = await loadCodexCompactSettings(path, signal);\n return structuredClone(state);\n }),\n update: (patch, signal) =>\n enqueue(async () => {\n state = await savePatch(path, patch, signal);\n return structuredClone(state);\n }),\n flush: () => queue,\n };\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["item", "index", "isObject", "normalizeContext", "inspection", "normalizeContext", "randomUUID"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@narumitw/pi-codex-compact",
|
|
3
|
-
"version": "0.53.
|
|
3
|
+
"version": "0.53.3",
|
|
4
4
|
"description": "Responses compaction protocols for compatible Pi providers.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -40,10 +40,10 @@
|
|
|
40
40
|
"@earendil-works/pi-coding-agent": "*"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
|
-
"@earendil-works/pi-agent-core": "0.
|
|
44
|
-
"@earendil-works/pi-ai": "0.
|
|
45
|
-
"@earendil-works/pi-coding-agent": "0.
|
|
46
|
-
"@types/node": "26.
|
|
43
|
+
"@earendil-works/pi-agent-core": "0.86.0",
|
|
44
|
+
"@earendil-works/pi-ai": "0.86.0",
|
|
45
|
+
"@earendil-works/pi-coding-agent": "0.86.0",
|
|
46
|
+
"@types/node": "26.6.2",
|
|
47
47
|
"esbuild": "0.28.2",
|
|
48
48
|
"typescript": "7.0.2"
|
|
49
49
|
},
|
package/src/remote-compact.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { normalizeContext, type Usage } from "@earendil-works/pi-ai";
|
|
2
2
|
import type { ResponsesCompactionProfile } from "./model-api.js";
|
|
3
3
|
import {
|
|
4
4
|
CodexCompactionProtocolError,
|
|
@@ -234,7 +234,7 @@ export async function requestResponsesCompact(request: RemoteCompactionRequest):
|
|
|
234
234
|
}
|
|
235
235
|
};
|
|
236
236
|
|
|
237
|
-
const stream = request.provider.stream(request.model, request.context, {
|
|
237
|
+
const stream = request.provider.stream(request.model, normalizeContext(request.context), {
|
|
238
238
|
apiKey: request.apiKey,
|
|
239
239
|
headers: request.headers,
|
|
240
240
|
env: request.env,
|
package/src/remote-v2.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { normalizeContext } from "@earendil-works/pi-ai";
|
|
1
2
|
import {
|
|
2
3
|
CodexCompactionProtocolError,
|
|
3
4
|
type CollectedCompaction,
|
|
@@ -33,7 +34,7 @@ export async function requestRemoteCompactionV2(request: RemoteCompactionRequest
|
|
|
33
34
|
});
|
|
34
35
|
};
|
|
35
36
|
|
|
36
|
-
const stream = request.provider.stream(request.model, request.context, {
|
|
37
|
+
const stream = request.provider.stream(request.model, normalizeContext(request.context), {
|
|
37
38
|
apiKey: request.apiKey,
|
|
38
39
|
headers: request.headers,
|
|
39
40
|
env: request.env,
|
|
File without changes
|
|
File without changes
|