@narumitw/pi-codex-compact 0.51.3 → 0.53.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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.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\tbuildContextEntries,\n\tbuildSessionContext,\n\tconvertToLlm,\n\ttype ExtensionAPI,\n\ttype ExtensionContext,\n\ttype SessionBeforeCompactEvent,\n\tsessionEntryToContextMessages,\n} from \"@earendil-works/pi-coding-agent\";\nimport {\n\tbuildReplacementHistory,\n\ttype CodexCheckpointDetails,\n\tcheckpointMarker,\n\tcreateCheckpointDetails,\n\tfallbackSummary,\n\tlatestCheckpoint,\n\tprojectCheckpointContext,\n} from \"./checkpoint.js\";\nimport { usesCodexResponsesApi } from \"./model-api.js\";\nimport { hasCheckpointMarker, rewriteCheckpointMarker } from \"./protocol.js\";\nimport { requestRemoteCompaction } from \"./remote.js\";\nimport {\n\ttype CodexCompactSettings,\n\ttype CodexCompactSettingsRuntime,\n\ttype CodexCompactSettingsState,\n\tcreateCodexCompactSettingsRuntime,\n} from \"./settings.js\";\n\nconst STATUS_KEY = \"codex-compact\";\n\nfunction activeCheckpoint(ctx: ExtensionContext) {\n\treturn latestCheckpoint(ctx.sessionManager.getBranch());\n}\n\nfunction isCheckpointCompatible(\n\tdetails: CodexCheckpointDetails,\n\tmodel: Model<Api> | undefined,\n): model is Model<\"openai-codex-responses\"> {\n\treturn usesCodexResponsesApi(model) && model.id === details.modelId;\n}\n\nfunction keptMessages(event: SessionBeforeCompactEvent): AgentMessage[] {\n\tconst leafId = event.branchEntries.at(-1)?.id ?? null;\n\tconst contextEntries = buildContextEntries(event.branchEntries, leafId);\n\tconst keptIndex = contextEntries.findIndex(\n\t\t(entry) => entry.id === event.preparation.firstKeptEntryId,\n\t);\n\tif (keptIndex < 0) {\n\t\tthrow new Error(\"Pi compaction cut point is not present in the active context\");\n\t}\n\treturn contextEntries.slice(keptIndex).flatMap(sessionEntryToContextMessages);\n}\n\nfunction activeTools(pi: ExtensionAPI): Tool[] {\n\tconst enabled = new Set(pi.getActiveTools());\n\treturn pi\n\t\t.getAllTools()\n\t\t.filter((tool) => enabled.has(tool.name))\n\t\t.map((tool) => ({\n\t\t\tname: tool.name,\n\t\t\tdescription: tool.description,\n\t\t\tparameters: tool.parameters,\n\t\t}));\n}\n\nfunction projectedCurrentMessages(\n\tevent: SessionBeforeCompactEvent,\n\tmodel: Model<\"openai-codex-responses\">,\n): { messages: AgentMessage[]; prior?: CodexCheckpointDetails } {\n\tconst leafId = event.branchEntries.at(-1)?.id ?? null;\n\tconst session = buildSessionContext(event.branchEntries, leafId);\n\tconst prior = latestCheckpoint(event.branchEntries);\n\tif (!prior) return { messages: session.messages };\n\tif (prior.details.modelId !== model.id) {\n\t\tthrow new Error(\"The active opaque checkpoint belongs to a different Codex model\");\n\t}\n\tconst projected = projectCheckpointContext(session.messages, prior.details, prior.entry.summary);\n\tif (!projected) {\n\t\tthrow new Error(\"The previous opaque checkpoint could not be projected safely\");\n\t}\n\treturn { messages: projected, prior: prior.details };\n}\n\nfunction notifyFailure(\n\tctx: ExtensionContext,\n\terror: unknown,\n\tsettings: CodexCompactSettings,\n): void {\n\tif (!ctx.hasUI || !settings.notifyOnFallback) return;\n\tconst message = error instanceof Error ? error.message : String(error);\n\tctx.ui.notify(`Codex remote compaction failed; using Pi compaction. ${message}`, \"warning\");\n}\n\nfunction sessionStillOwned(ctx: ExtensionContext, sessionId: string, signal: AbortSignal): boolean {\n\treturn !signal.aborted && ctx.sessionManager.getSessionId() === sessionId;\n}\n\nasync function compactRemotely(\n\tpi: ExtensionAPI,\n\tevent: SessionBeforeCompactEvent,\n\tctx: ExtensionContext,\n\tsettings: CodexCompactSettings,\n\tfetch?: typeof globalThis.fetch,\n) {\n\tconst model = ctx.model;\n\tif (!settings.enabled || !usesCodexResponsesApi(model)) return undefined;\n\tconst sessionId = ctx.sessionManager.getSessionId();\n\tctx.ui.setStatus(STATUS_KEY, \"Codex remote compaction\u2026\");\n\ttry {\n\t\tconst auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);\n\t\tif (!sessionStillOwned(ctx, sessionId, event.signal)) return { cancel: true };\n\t\tif (!auth.ok) throw new Error(auth.error);\n\t\tconst provider = ctx.modelRegistry.getProvider(model.provider);\n\t\tif (!provider) throw new Error(\"The active Codex Responses provider is unavailable\");\n\t\tconst current = projectedCurrentMessages(event, model);\n\t\tconst context: Context = {\n\t\t\tsystemPrompt: ctx.getSystemPrompt(),\n\t\t\tmessages: convertToLlm(current.messages),\n\t\t\ttools: activeTools(pi),\n\t\t};\n\t\tconst response = await requestRemoteCompaction({\n\t\t\tprovider,\n\t\t\tmodel,\n\t\t\tcontext,\n\t\t\tapiKey: auth.apiKey,\n\t\t\theaders: auth.headers,\n\t\t\tenv: auth.env,\n\t\t\tsignal: event.signal,\n\t\t\tpriorCheckpoint: current.prior\n\t\t\t\t? {\n\t\t\t\t\t\tmarker: checkpointMarker(current.prior.checkpointId),\n\t\t\t\t\t\treplacementHistory: current.prior.replacementHistory,\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\t\t\trequestTimeoutMs: settings.requestTimeoutMs,\n\t\t\tmaxRetries: settings.maxRetries,\n\t\t\tfetch,\n\t\t});\n\t\tif (!sessionStillOwned(ctx, sessionId, event.signal)) return { cancel: true };\n\t\tconst replacementHistory = buildReplacementHistory(response.promptInput, response.item, {\n\t\t\ttokenBudget: settings.replacementTokenBudget,\n\t\t});\n\t\tconst details = createCheckpointDetails({\n\t\t\tprovider: model.provider,\n\t\t\tmodelId: model.id,\n\t\t\treplacementHistory,\n\t\t\tkeptMessages: keptMessages(event),\n\t\t});\n\t\treturn {\n\t\t\tcompaction: {\n\t\t\t\tsummary: fallbackSummary(details.checkpointId),\n\t\t\t\tfirstKeptEntryId: event.preparation.firstKeptEntryId,\n\t\t\t\ttokensBefore: event.preparation.tokensBefore,\n\t\t\t\tusage: response.usage,\n\t\t\t\tdetails,\n\t\t\t},\n\t\t};\n\t} catch (error) {\n\t\tif (event.signal.aborted || ctx.sessionManager.getSessionId() !== sessionId) {\n\t\t\treturn { cancel: true };\n\t\t}\n\t\tnotifyFailure(ctx, error, settings);\n\t\treturn undefined;\n\t} finally {\n\t\tif (ctx.sessionManager.getSessionId() === sessionId) ctx.ui.setStatus(STATUS_KEY, undefined);\n\t}\n}\n\nexport function createCodexCompactExtension(\n\toptions: { fetch?: typeof globalThis.fetch; settingsRuntime?: CodexCompactSettingsRuntime } = {},\n): (pi: ExtensionAPI) => void {\n\treturn (pi) => {\n\t\tconst providerWarnings = new Set<string>();\n\t\tconst settingsRuntime = options.settingsRuntime ?? createCodexCompactSettingsRuntime();\n\t\tlet sessionController = new AbortController();\n\t\tlet generation = 0;\n\n\t\tpi.registerCommand(\"codex-compact\", {\n\t\t\tdescription: \"Compact now or configure Codex Remote Compaction V2\",\n\t\t\thandler: async (_args, ctx) => {\n\t\t\t\tconst ownerGeneration = generation;\n\t\t\t\tconst controller = sessionController;\n\t\t\t\tconst { showCodexCompactMenu } = await import(\"./settings-menu.js\");\n\t\t\t\tif (ownerGeneration !== generation || controller.signal.aborted) return;\n\t\t\t\tawait showCodexCompactMenu(settingsRuntime, ctx, {\n\t\t\t\t\tsignal: controller.signal,\n\t\t\t\t\tisCurrent: () => ownerGeneration === generation && !controller.signal.aborted,\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\n\t\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\t\tsessionController.abort();\n\t\t\tsessionController = new AbortController();\n\t\t\tgeneration += 1;\n\t\t\tconst ownerGeneration = generation;\n\t\t\tconst sessionId = ctx.sessionManager.getSessionId();\n\t\t\tproviderWarnings.clear();\n\t\t\tlet state: Readonly<CodexCompactSettingsState>;\n\t\t\ttry {\n\t\t\t\tstate = await settingsRuntime.reload(sessionController.signal);\n\t\t\t} catch (error) {\n\t\t\t\tif (sessionController.signal.aborted || ownerGeneration !== generation) return;\n\t\t\t\tif (ctx.hasUI) {\n\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t`Could not load pi-codex-compact.json; using defaults. ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t\t\"warning\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (\n\t\t\t\tsessionController.signal.aborted ||\n\t\t\t\townerGeneration !== generation ||\n\t\t\t\tctx.sessionManager.getSessionId() !== sessionId\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (ctx.hasUI && state.kind === \"invalid\") {\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t`Invalid pi-codex-compact.json; using defaults without overwriting it. ${state.issue}`,\n\t\t\t\t\t\"warning\",\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\n\t\tpi.on(\"session_before_compact\", (event, ctx) =>\n\t\t\tcompactRemotely(pi, event, ctx, settingsRuntime.get().settings, options.fetch),\n\t\t);\n\n\t\tpi.on(\"context\", (event, ctx) => {\n\t\t\tif (!settingsRuntime.get().settings.enabled) return undefined;\n\t\t\tconst checkpoint = activeCheckpoint(ctx);\n\t\t\tif (!checkpoint || !isCheckpointCompatible(checkpoint.details, ctx.model)) return undefined;\n\t\t\tconst messages = projectCheckpointContext(\n\t\t\t\tevent.messages,\n\t\t\t\tcheckpoint.details,\n\t\t\t\tcheckpoint.entry.summary,\n\t\t\t);\n\t\t\treturn messages ? { messages } : undefined;\n\t\t});\n\n\t\tpi.on(\"before_provider_request\", (event, ctx) => {\n\t\t\tif (!settingsRuntime.get().settings.enabled) return undefined;\n\t\t\tconst checkpoint = activeCheckpoint(ctx);\n\t\t\tif (!checkpoint || !isCheckpointCompatible(checkpoint.details, ctx.model)) return undefined;\n\t\t\tconst marker = checkpointMarker(checkpoint.details.checkpointId);\n\t\t\tif (!hasCheckpointMarker(event.payload, marker)) return undefined;\n\t\t\treturn rewriteCheckpointMarker(event.payload, marker, checkpoint.details.replacementHistory);\n\t\t});\n\n\t\tpi.on(\"model_select\", (event, ctx) => {\n\t\t\tif (!settingsRuntime.get().settings.enabled) return;\n\t\t\tconst checkpoint = activeCheckpoint(ctx);\n\t\t\tif (!checkpoint || isCheckpointCompatible(checkpoint.details, event.model)) return;\n\t\t\tconst key = `${ctx.sessionManager.getSessionId()}:${event.model.provider}:${event.model.id}`;\n\t\t\tif (providerWarnings.has(key)) return;\n\t\t\tproviderWarnings.add(key);\n\t\t\tif (ctx.hasUI) {\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\"The active Codex checkpoint cannot replay on this model; Pi will expose only its fallback marker and retained recent messages.\",\n\t\t\t\t\t\"warning\",\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\n\t\tpi.on(\"session_shutdown\", async (_event, ctx) => {\n\t\t\tgeneration += 1;\n\t\t\tsessionController.abort();\n\t\t\tproviderWarnings.clear();\n\t\t\tctx.ui.setStatus(STATUS_KEY, undefined);\n\t\t\tawait settingsRuntime.flush();\n\t\t});\n\t};\n}\n\nexport default createCodexCompactExtension();\n", "import { createHash, randomUUID } from \"node:crypto\";\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { CompactionEntry, SessionEntry } from \"@earendil-works/pi-coding-agent\";\nimport { type JsonObject, validateCompactionItem } from \"./protocol.js\";\n\nexport const CHECKPOINT_KIND = \"pi-codex-remote-compaction\";\nexport const CHECKPOINT_VERSION = 1;\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_PROVIDER_ID_LENGTH = 256;\n\nexport interface CodexCheckpointDetails {\n\tkind: typeof CHECKPOINT_KIND;\n\tversion: typeof CHECKPOINT_VERSION;\n\tcheckpointId: string;\n\tprovider: string;\n\tapi: \"openai-codex-responses\";\n\tmodelId: string;\n\tprotocol: \"remote-compaction-v2\";\n\treplacementHistory: JsonObject[];\n\tkeptMessageFingerprints: string[];\n\tcreatedAt: string;\n}\n\nfunction isObject(value: unknown): value is JsonObject {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction stableValue(value: unknown): unknown {\n\tif (Array.isArray(value)) return value.map(stableValue);\n\tif (!isObject(value)) return value;\n\treturn Object.fromEntries(\n\t\tObject.entries(value)\n\t\t\t.sort(([left], [right]) => left.localeCompare(right))\n\t\t\t.map(([key, child]) => [key, stableValue(child)]),\n\t);\n}\n\nfunction serializedBytes(value: unknown): number {\n\treturn Buffer.byteLength(JSON.stringify(value), \"utf8\");\n}\n\nexport function fingerprintMessage(message: AgentMessage): string {\n\treturn createHash(\"sha256\")\n\t\t.update(JSON.stringify(stableValue(message)))\n\t\t.digest(\"hex\");\n}\n\nexport function checkpointMarker(checkpointId: string): string {\n\treturn [\n\t\t`[PI_CODEX_REMOTE_CHECKPOINT:${checkpointId}]`,\n\t\t\"Opaque checkpoint injection failed. Do not infer missing history; tell the user to re-enable\",\n\t\t\"@narumitw/pi-codex-compact with a model using the openai-codex-responses API.\",\n\t].join(\" \");\n}\n\nexport function fallbackSummary(checkpointId: string): string {\n\treturn [\n\t\t`OpenAI Codex Remote Compaction V2 checkpoint ${checkpointId} stores the older history opaquely.`,\n\t\t\"Full replay requires @narumitw/pi-codex-compact and the same model through a compatible Codex Responses provider.\",\n\t\t\"Without them, only Pi's retained recent messages remain available.\",\n\t].join(\" \");\n}\n\nfunction markerMessage(checkpointId: string, timestamp: number): AgentMessage {\n\treturn {\n\t\trole: \"user\",\n\t\tcontent: [{ type: \"text\", text: checkpointMarker(checkpointId) }],\n\t\ttimestamp,\n\t};\n}\n\nexport function parseCheckpointDetails(value: unknown): CodexCheckpointDetails | undefined {\n\tif (!isObject(value)) return undefined;\n\tif (\n\t\tvalue.kind !== CHECKPOINT_KIND ||\n\t\tvalue.version !== CHECKPOINT_VERSION ||\n\t\ttypeof value.checkpointId !== \"string\" ||\n\t\tvalue.checkpointId.length < 8 ||\n\t\ttypeof value.provider !== \"string\" ||\n\t\tvalue.provider.length === 0 ||\n\t\tvalue.provider.length > MAX_PROVIDER_ID_LENGTH ||\n\t\tvalue.api !== \"openai-codex-responses\" ||\n\t\ttypeof value.modelId !== \"string\" ||\n\t\tvalue.protocol !== \"remote-compaction-v2\" ||\n\t\t!Array.isArray(value.replacementHistory) ||\n\t\t!Array.isArray(value.keptMessageFingerprints) ||\n\t\ttypeof value.createdAt !== \"string\"\n\t) {\n\t\treturn undefined;\n\t}\n\tif (\n\t\tvalue.replacementHistory.length === 0 ||\n\t\t!value.replacementHistory.every(isObject) ||\n\t\t!value.keptMessageFingerprints.every(\n\t\t\t(fingerprint) => typeof fingerprint === \"string\" && /^[a-f0-9]{64}$/.test(fingerprint),\n\t\t) ||\n\t\tserializedBytes(value.replacementHistory) > REPLACEMENT_BYTE_BUDGET\n\t) {\n\t\treturn undefined;\n\t}\n\tconst last = value.replacementHistory.at(-1);\n\ttry {\n\t\tvalidateCompactionItem(last);\n\t} catch {\n\t\treturn undefined;\n\t}\n\treturn structuredClone(value) as unknown as CodexCheckpointDetails;\n}\n\nexport function latestCheckpoint(entries: readonly SessionEntry[]):\n\t| {\n\t\t\tentry: CompactionEntry<CodexCheckpointDetails>;\n\t\t\tdetails: CodexCheckpointDetails;\n\t }\n\t| undefined {\n\tfor (let index = entries.length - 1; index >= 0; index--) {\n\t\tconst entry = entries[index];\n\t\tif (entry.type !== \"compaction\") continue;\n\t\tconst details = parseCheckpointDetails(entry.details);\n\t\treturn details\n\t\t\t? { entry: entry as CompactionEntry<CodexCheckpointDetails>, details }\n\t\t\t: undefined;\n\t}\n\treturn undefined;\n}\n\nfunction isOlderCompactionSummary(message: AgentMessage, timestamp: number): boolean {\n\treturn (\n\t\tmessage.role === \"compactionSummary\" &&\n\t\tNumber.isFinite(message.timestamp) &&\n\t\tNumber.isFinite(timestamp) &&\n\t\tmessage.timestamp < timestamp\n\t);\n}\n\nexport function projectCheckpointContext(\n\tmessages: readonly AgentMessage[],\n\tdetails: CodexCheckpointDetails,\n\tcheckpointSummary: string,\n): AgentMessage[] | undefined {\n\tconst summaryIndex = messages.findIndex(\n\t\t(message) => message.role === \"compactionSummary\" && message.summary === checkpointSummary,\n\t);\n\tif (summaryIndex < 0) return undefined;\n\tconst timestamp = messages[summaryIndex].timestamp;\n\tlet messageIndex = summaryIndex + 1;\n\tlet fingerprintIndex = 0;\n\twhile (fingerprintIndex < details.keptMessageFingerprints.length) {\n\t\tif (messageIndex >= messages.length) return undefined;\n\t\tconst message = messages[messageIndex];\n\t\tif (fingerprintMessage(message) === details.keptMessageFingerprints[fingerprintIndex]) {\n\t\t\tmessageIndex += 1;\n\t\t\tfingerprintIndex += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (isOlderCompactionSummary(message, timestamp)) {\n\t\t\tmessageIndex += 1;\n\t\t\tcontinue;\n\t\t}\n\t\treturn undefined;\n\t}\n\twhile (\n\t\tmessageIndex < messages.length &&\n\t\tisOlderCompactionSummary(messages[messageIndex], timestamp)\n\t) {\n\t\tmessageIndex += 1;\n\t}\n\treturn [\n\t\t...messages.slice(0, summaryIndex),\n\t\tmarkerMessage(details.checkpointId, timestamp),\n\t\t...messages.slice(messageIndex),\n\t];\n}\n\nfunction rawText(item: JsonObject): string {\n\tif (!Array.isArray(item.content)) return \"\";\n\treturn item.content\n\t\t.flatMap((part) =>\n\t\t\tisObject(part) && typeof part.text === \"string\" && part.type === \"input_text\"\n\t\t\t\t? [part.text]\n\t\t\t\t: [],\n\t\t)\n\t\t.join(\"\\n\");\n}\n\nfunction hasMedia(item: JsonObject): boolean {\n\treturn (\n\t\tArray.isArray(item.content) &&\n\t\titem.content.some((part) => isObject(part) && part.type === \"input_image\")\n\t);\n}\n\nfunction truncateTextItem(item: JsonObject, maxChars: number): JsonObject | undefined {\n\tif (!Array.isArray(item.content) || maxChars <= 32) return undefined;\n\tlet remaining = maxChars - 16;\n\tconst content = [...item.content].reverse().flatMap((part) => {\n\t\tif (\n\t\t\t!isObject(part) ||\n\t\t\tpart.type !== \"input_text\" ||\n\t\t\ttypeof part.text !== \"string\" ||\n\t\t\tremaining <= 0\n\t\t) {\n\t\t\treturn [];\n\t\t}\n\t\tconst text = part.text.slice(-remaining);\n\t\tremaining -= text.length;\n\t\treturn [{ ...part, text: `[truncated]\\n${text}` }];\n\t});\n\tif (content.length === 0) return undefined;\n\treturn { ...item, content: content.reverse() };\n}\n\nexport function buildReplacementHistory(\n\tinput: readonly unknown[],\n\tcompactionItem: JsonObject,\n\toptions: { tokenBudget?: number; byteBudget?: number } = {},\n): JsonObject[] {\n\tconst tokenBudget = options.tokenBudget ?? REPLACEMENT_TOKEN_BUDGET;\n\tconst byteBudget = options.byteBudget ?? REPLACEMENT_BYTE_BUDGET;\n\tconst opaque = validateCompactionItem(compactionItem);\n\tlet remainingBytes = byteBudget - serializedBytes(opaque);\n\tlet remainingChars = tokenBudget * 4;\n\tif (remainingBytes <= 0)\n\t\tthrow new Error(\"Opaque compaction item exceeds replacement history budget\");\n\tconst retainedNewestFirst: JsonObject[] = [];\n\tconst candidates = input.filter(\n\t\t(item): item is JsonObject =>\n\t\t\tisObject(item) && item.role === \"user\" && item.type !== \"compaction_trigger\",\n\t);\n\tfor (let index = candidates.length - 1; index >= 0; index--) {\n\t\tconst candidate = candidates[index];\n\t\tconst bytes = serializedBytes(candidate);\n\t\tif (hasMedia(candidate) && bytes > MAX_MEDIA_ITEM_BYTES) continue;\n\t\tconst text = rawText(candidate);\n\t\tlet retained = candidate;\n\t\tif (text.length > remainingChars) {\n\t\t\tif (hasMedia(candidate)) continue;\n\t\t\tconst truncated = truncateTextItem(candidate, remainingChars);\n\t\t\tif (!truncated) continue;\n\t\t\tretained = truncated;\n\t\t}\n\t\tif (serializedBytes(retained) > remainingBytes) {\n\t\t\tif (hasMedia(retained)) continue;\n\t\t\tconst maxCharsByBytes = Math.max(0, remainingBytes - 128);\n\t\t\tconst truncated = truncateTextItem(retained, Math.min(remainingChars, maxCharsByBytes));\n\t\t\tif (!truncated || serializedBytes(truncated) > remainingBytes) continue;\n\t\t\tretained = truncated;\n\t\t}\n\t\tretainedNewestFirst.push(structuredClone(retained));\n\t\tremainingBytes -= serializedBytes(retained);\n\t\tremainingChars -= Math.min(remainingChars, rawText(retained).length);\n\t\tif (remainingBytes <= 128 || remainingChars <= 32) break;\n\t}\n\treturn [...retainedNewestFirst.reverse(), opaque];\n}\n\nexport function createCheckpointDetails(input: {\n\tprovider: string;\n\tmodelId: string;\n\treplacementHistory: JsonObject[];\n\tkeptMessages: readonly AgentMessage[];\n\tcheckpointId?: string;\n\tcreatedAt?: string;\n}): CodexCheckpointDetails {\n\tconst details: CodexCheckpointDetails = {\n\t\tkind: CHECKPOINT_KIND,\n\t\tversion: CHECKPOINT_VERSION,\n\t\tcheckpointId: input.checkpointId ?? randomUUID(),\n\t\tprovider: input.provider,\n\t\tapi: \"openai-codex-responses\",\n\t\tmodelId: input.modelId,\n\t\tprotocol: \"remote-compaction-v2\",\n\t\treplacementHistory: structuredClone(input.replacementHistory),\n\t\tkeptMessageFingerprints: input.keptMessages.map(fingerprintMessage),\n\t\tcreatedAt: input.createdAt ?? new Date().toISOString(),\n\t};\n\tconst parsed = parseCheckpointDetails(details);\n\tif (!parsed) throw new Error(\"Created an invalid Codex checkpoint\");\n\treturn parsed;\n}\n", "export const MAX_SSE_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\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"CodexCompactionProtocolError\";\n\t}\n}\n\nfunction isObject(value: unknown): value is JsonObject {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction byteLength(value: unknown): number {\n\treturn Buffer.byteLength(JSON.stringify(value), \"utf8\");\n}\n\nexport function isCompactionItem(value: unknown): value is JsonObject {\n\treturn (\n\t\tisObject(value) &&\n\t\tvalue.type === \"compaction\" &&\n\t\ttypeof value.encrypted_content === \"string\" &&\n\t\tvalue.encrypted_content.length > 0\n\t);\n}\n\nexport function validateCompactionItem(\n\tvalue: unknown,\n\tmaxBytes = MAX_COMPACTION_ITEM_BYTES,\n): JsonObject {\n\tif (!isCompactionItem(value)) {\n\t\tthrow new CodexCompactionProtocolError(\n\t\t\t\"Remote response did not contain a valid compaction item\",\n\t\t);\n\t}\n\tif (byteLength(value) > maxBytes) {\n\t\tthrow new CodexCompactionProtocolError(\"Remote compaction item exceeded the size limit\");\n\t}\n\treturn structuredClone(value);\n}\n\nexport interface CollectedCompaction {\n\titem: JsonObject;\n\tcompletedResponse?: JsonObject;\n}\n\nfunction compactionItemsFromEvent(event: JsonObject): unknown[] {\n\tconst items: unknown[] = [];\n\tif (event.type === \"response.output_item.done\" && isObject(event.item)) {\n\t\titems.push(event.item);\n\t}\n\tif (event.type === \"response.completed\" && isObject(event.response)) {\n\t\tconst output = event.response.output;\n\t\tif (Array.isArray(output)) items.push(...output);\n\t}\n\treturn items.filter((item) => isObject(item) && item.type === \"compaction\");\n}\n\nexport async function collectCompactionSse(\n\tstream: ReadableStream<Uint8Array>,\n\toptions: {\n\t\tsignal?: AbortSignal;\n\t\tmaxBytes?: number;\n\t\tmaxItemBytes?: number;\n\t} = {},\n): Promise<CollectedCompaction> {\n\tconst maxBytes = options.maxBytes ?? MAX_SSE_BYTES;\n\tconst reader = stream.getReader();\n\tconst onAbort = () => {\n\t\tvoid reader.cancel(new DOMException(\"Compaction aborted\", \"AbortError\")).catch(() => undefined);\n\t};\n\toptions.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\tconst decoder = new TextDecoder();\n\tlet bytes = 0;\n\tlet pending = \"\";\n\tlet dataLines: string[] = [];\n\tlet completedResponse: JsonObject | undefined;\n\tconst items = new Map<string, JsonObject>();\n\n\tconst checkAbort = () => {\n\t\tif (options.signal?.aborted) throw new DOMException(\"Compaction aborted\", \"AbortError\");\n\t};\n\tconst dispatch = () => {\n\t\tif (dataLines.length === 0) return;\n\t\tconst data = dataLines.join(\"\\n\");\n\t\tdataLines = [];\n\t\tif (data === \"[DONE]\") return;\n\t\tlet parsed: unknown;\n\t\ttry {\n\t\t\tparsed = JSON.parse(data);\n\t\t} catch {\n\t\t\tthrow new CodexCompactionProtocolError(\"Remote compaction returned malformed SSE JSON\");\n\t\t}\n\t\tif (!isObject(parsed)) return;\n\t\tif (parsed.type === \"response.completed\") {\n\t\t\tcompletedResponse = isObject(parsed.response) ? parsed.response : {};\n\t\t}\n\t\tfor (const candidate of compactionItemsFromEvent(parsed)) {\n\t\t\tconst item = validateCompactionItem(candidate, options.maxItemBytes);\n\t\t\titems.set(JSON.stringify(item), item);\n\t\t}\n\t};\n\tconst processLine = (line: string) => {\n\t\tif (line === \"\") {\n\t\t\tdispatch();\n\t\t\treturn;\n\t\t}\n\t\tif (line.startsWith(\":\")) return;\n\t\tif (line === \"data\") dataLines.push(\"\");\n\t\telse if (line.startsWith(\"data:\")) dataLines.push(line.slice(5).replace(/^ /, \"\"));\n\t};\n\n\ttry {\n\t\twhile (true) {\n\t\t\tcheckAbort();\n\t\t\tconst { done, value } = await reader.read();\n\t\t\tif (done) break;\n\t\t\tbytes += value.byteLength;\n\t\t\tif (bytes > maxBytes) {\n\t\t\t\tthrow new CodexCompactionProtocolError(\"Remote compaction stream exceeded the size limit\");\n\t\t\t}\n\t\t\tpending += decoder.decode(value, { stream: true });\n\t\t\tlet newline = pending.indexOf(\"\\n\");\n\t\t\twhile (newline !== -1) {\n\t\t\t\tconst rawLine = pending.slice(0, newline);\n\t\t\t\tpending = pending.slice(newline + 1);\n\t\t\t\tprocessLine(rawLine.endsWith(\"\\r\") ? rawLine.slice(0, -1) : rawLine);\n\t\t\t\tnewline = pending.indexOf(\"\\n\");\n\t\t\t}\n\t\t}\n\t\tpending += decoder.decode();\n\t\tif (pending.length > 0) processLine(pending.endsWith(\"\\r\") ? pending.slice(0, -1) : pending);\n\t\tdispatch();\n\t\tcheckAbort();\n\t} catch (error) {\n\t\tawait reader.cancel(error).catch(() => undefined);\n\t\tthrow error;\n\t} finally {\n\t\toptions.signal?.removeEventListener(\"abort\", onAbort);\n\t\treader.releaseLock();\n\t}\n\n\tif (!completedResponse) {\n\t\tthrow new CodexCompactionProtocolError(\n\t\t\t\"Remote compaction stream ended without response.completed\",\n\t\t);\n\t}\n\tif (items.size !== 1) {\n\t\tthrow new CodexCompactionProtocolError(\n\t\t\t`Remote compaction returned ${items.size} distinct compaction items; expected exactly one`,\n\t\t);\n\t}\n\treturn { item: [...items.values()][0], completedResponse };\n}\n\nfunction markerTextFromItem(item: unknown): string | undefined {\n\tif (!isObject(item) || item.role !== \"user\" || !Array.isArray(item.content)) return undefined;\n\tif (item.content.length !== 1) return undefined;\n\tconst content = item.content[0];\n\tif (!isObject(content) || content.type !== \"input_text\" || typeof content.text !== \"string\") {\n\t\treturn undefined;\n\t}\n\treturn content.text;\n}\n\nexport function rewriteCheckpointMarker(\n\tpayload: unknown,\n\tmarker: string,\n\treplacementHistory: readonly unknown[],\n): JsonObject {\n\tif (!isObject(payload) || !Array.isArray(payload.input)) {\n\t\tthrow new CodexCompactionProtocolError(\"Codex Responses payload is missing an input array\");\n\t}\n\tconst matches = payload.input\n\t\t.map((item, index) => (markerTextFromItem(item) === marker ? index : -1))\n\t\t.filter((index) => index >= 0);\n\tif (matches.length !== 1) {\n\t\tthrow new CodexCompactionProtocolError(\n\t\t\t`Provider payload contained ${matches.length} checkpoint markers; expected exactly one`,\n\t\t);\n\t}\n\tconst index = matches[0];\n\treturn {\n\t\t...payload,\n\t\tinput: [\n\t\t\t...payload.input.slice(0, index),\n\t\t\t...structuredClone(replacementHistory),\n\t\t\t...payload.input.slice(index + 1),\n\t\t],\n\t};\n}\n\nexport function appendCompactionTrigger(payload: unknown): JsonObject {\n\tif (!isObject(payload) || !Array.isArray(payload.input)) {\n\t\tthrow new CodexCompactionProtocolError(\"Codex Responses payload is missing an input array\");\n\t}\n\tif (payload.input.some((item) => isObject(item) && item.type === \"compaction_trigger\")) {\n\t\tthrow new CodexCompactionProtocolError(\n\t\t\t\"Provider payload already contains a compaction trigger\",\n\t\t);\n\t}\n\treturn { ...payload, input: [...payload.input, { type: \"compaction_trigger\" }] };\n}\n\nexport function prepareRemoteCompactionPayload(\n\tpayload: unknown,\n\tcheckpoint?: { marker: string; replacementHistory: readonly unknown[] },\n): JsonObject {\n\tconst expanded = checkpoint\n\t\t? rewriteCheckpointMarker(payload, checkpoint.marker, checkpoint.replacementHistory)\n\t\t: payload;\n\treturn appendCompactionTrigger(expanded);\n}\n\nexport function hasCheckpointMarker(payload: unknown, marker: string): boolean {\n\treturn (\n\t\tisObject(payload) &&\n\t\tArray.isArray(payload.input) &&\n\t\tpayload.input.some((item) => markerTextFromItem(item) === marker)\n\t);\n}\n", "import type { Context, Model, Provider, ProviderHeaders, Usage } from \"@earendil-works/pi-ai\";\nimport {\n\tCodexCompactionProtocolError,\n\ttype CollectedCompaction,\n\tcollectCompactionSse,\n\ttype JsonObject,\n\tprepareRemoteCompactionPayload,\n} from \"./protocol.js\";\n\ninterface PriorCheckpointPayload {\n\tmarker: string;\n\treplacementHistory: readonly unknown[];\n}\n\nexport interface RemoteCompactionRequest {\n\tprovider: Provider;\n\tmodel: Model<\"openai-codex-responses\">;\n\tcontext: Context;\n\tapiKey?: string;\n\theaders?: ProviderHeaders;\n\tenv?: Record<string, string>;\n\tsignal: AbortSignal;\n\tpriorCheckpoint?: PriorCheckpointPayload;\n\trequestTimeoutMs?: number;\n\tmaxRetries?: number;\n\tfetch?: typeof globalThis.fetch;\n}\n\nexport interface RemoteCompactionResponse {\n\titem: JsonObject;\n\tpromptInput: JsonObject[];\n\tusage: Usage;\n}\n\nconst EMPTY_USAGE: Usage = {\n\tinput: 0,\n\toutput: 0,\n\tcacheRead: 0,\n\tcacheWrite: 0,\n\ttotalTokens: 0,\n\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n};\n\nfunction isObject(value: unknown): value is JsonObject {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction abortError(): DOMException {\n\treturn new DOMException(\"Compaction aborted\", \"AbortError\");\n}\n\nexport async function requestRemoteCompaction(\n\trequest: RemoteCompactionRequest,\n): Promise<RemoteCompactionResponse> {\n\tif (request.signal.aborted) throw abortError();\n\tlet sentInput: JsonObject[] | undefined;\n\tconst inspections: Promise<\n\t\t{ ok: true; value: CollectedCompaction } | { ok: false; error: unknown }\n\t>[] = [];\n\tconst baseFetch = request.fetch ?? globalThis.fetch;\n\tconst inspectedFetch: typeof globalThis.fetch = async (input, init) => {\n\t\tconst response = await baseFetch(input, init);\n\t\tif (!response.ok || !response.body) return response;\n\t\tconst [providerBody, inspectionBody] = response.body.tee();\n\t\tconst inspection = collectCompactionSse(inspectionBody, { signal: request.signal }).then(\n\t\t\t(value) => ({ ok: true as const, value }),\n\t\t\t(error: unknown) => ({ ok: false as const, error }),\n\t\t);\n\t\tinspections.push(inspection);\n\t\treturn new Response(providerBody, {\n\t\t\tstatus: response.status,\n\t\t\tstatusText: response.statusText,\n\t\t\theaders: response.headers,\n\t\t});\n\t};\n\n\tconst stream = request.provider.stream(request.model, request.context, {\n\t\tapiKey: request.apiKey,\n\t\theaders: request.headers,\n\t\tenv: request.env,\n\t\tsignal: request.signal,\n\t\ttransport: \"sse\",\n\t\tcacheRetention: \"none\",\n\t\ttimeoutMs: request.requestTimeoutMs ?? 5 * 60 * 1000,\n\t\tmaxRetries: request.maxRetries ?? 2,\n\t\tfetch: inspectedFetch,\n\t\tonPayload: (payload) => {\n\t\t\tconst prepared = prepareRemoteCompactionPayload(payload, request.priorCheckpoint);\n\t\t\tif (!Array.isArray(prepared.input) || !prepared.input.every(isObject)) {\n\t\t\t\tthrow new CodexCompactionProtocolError(\n\t\t\t\t\t\"Prepared compaction payload has invalid input items\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tsentInput = structuredClone(prepared.input.slice(0, -1)) as JsonObject[];\n\t\t\treturn prepared;\n\t\t},\n\t});\n\n\tlet usage = EMPTY_USAGE;\n\tfor await (const event of stream) {\n\t\tif (request.signal.aborted) throw abortError();\n\t\tif (event.type === \"error\") {\n\t\t\tthrow new Error(event.error.errorMessage ?? \"Codex remote compaction request failed\");\n\t\t}\n\t\tif (event.type === \"done\") usage = event.message.usage;\n\t}\n\tif (request.signal.aborted) throw abortError();\n\tif (!sentInput)\n\t\tthrow new CodexCompactionProtocolError(\"Provider did not expose a request payload\");\n\tif (inspections.length === 0) {\n\t\tthrow new CodexCompactionProtocolError(\"Provider response did not expose an SSE body\");\n\t}\n\tconst inspection = await inspections.at(-1);\n\tif (request.signal.aborted) throw abortError();\n\tif (!inspection?.ok) throw inspection?.error ?? new Error(\"Remote compaction inspection failed\");\n\treturn { item: inspection.value.item, promptInput: sentInput, usage };\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\";\n\nexport const CODEX_COMPACT_SETTINGS_FILE = \"pi-codex-compact.json\";\nexport const MAX_SETTINGS_BYTES = 64 * 1024;\n\nexport interface CodexCompactSettings {\n\tenabled: boolean;\n\trequestTimeoutMs: number;\n\tmaxRetries: number;\n\treplacementTokenBudget: number;\n\tnotifyOnFallback: boolean;\n}\n\nexport const DEFAULT_CODEX_COMPACT_SETTINGS: Readonly<CodexCompactSettings> = Object.freeze({\n\tenabled: true,\n\trequestTimeoutMs: 300_000,\n\tmaxRetries: 2,\n\treplacementTokenBudget: 64_000,\n\tnotifyOnFallback: true,\n});\n\nconst LIMITS = Object.freeze({\n\trequestTimeoutMs: { minimum: 30_000, maximum: 600_000 },\n\tmaxRetries: { minimum: 0, maximum: 2 },\n\treplacementTokenBudget: { minimum: 8_000, maximum: 128_000 },\n});\n\nexport interface CodexCompactSettingsState {\n\tkind: \"missing\" | \"loaded\" | \"invalid\";\n\tpath: string;\n\tsettings: CodexCompactSettings;\n\tdocument?: Record<string, unknown>;\n\tissue?: string;\n}\n\nexport interface CodexCompactSettingsRuntime {\n\tget(): Readonly<CodexCompactSettingsState>;\n\treload(signal?: AbortSignal): Promise<Readonly<CodexCompactSettingsState>>;\n\tupdate(\n\t\tpatch: Partial<CodexCompactSettings>,\n\t\tsignal?: AbortSignal,\n\t): Promise<Readonly<CodexCompactSettingsState>>;\n\tflush(): Promise<void>;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction validInteger(value: unknown, minimum: number, maximum: number): value is number {\n\treturn (\n\t\ttypeof value === \"number\" && Number.isSafeInteger(value) && value >= minimum && value <= maximum\n\t);\n}\n\nexport function normalizeCodexCompactSettings(value: unknown): CodexCompactSettings | undefined {\n\tif (!isRecord(value)) return undefined;\n\tif (Object.hasOwn(value, \"enabled\") && typeof value.enabled !== \"boolean\") return undefined;\n\tif (Object.hasOwn(value, \"notifyOnFallback\") && typeof value.notifyOnFallback !== \"boolean\") {\n\t\treturn undefined;\n\t}\n\tfor (const [field, limits] of Object.entries(LIMITS) as Array<\n\t\t[keyof typeof LIMITS, { minimum: number; maximum: number }]\n\t>) {\n\t\tif (\n\t\t\tObject.hasOwn(value, field) &&\n\t\t\t!validInteger(value[field], limits.minimum, limits.maximum)\n\t\t) {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\treturn {\n\t\tenabled:\n\t\t\ttypeof value.enabled === \"boolean\" ? value.enabled : DEFAULT_CODEX_COMPACT_SETTINGS.enabled,\n\t\trequestTimeoutMs:\n\t\t\ttypeof value.requestTimeoutMs === \"number\"\n\t\t\t\t? value.requestTimeoutMs\n\t\t\t\t: DEFAULT_CODEX_COMPACT_SETTINGS.requestTimeoutMs,\n\t\tmaxRetries:\n\t\t\ttypeof value.maxRetries === \"number\"\n\t\t\t\t? value.maxRetries\n\t\t\t\t: DEFAULT_CODEX_COMPACT_SETTINGS.maxRetries,\n\t\treplacementTokenBudget:\n\t\t\ttypeof value.replacementTokenBudget === \"number\"\n\t\t\t\t? value.replacementTokenBudget\n\t\t\t\t: DEFAULT_CODEX_COMPACT_SETTINGS.replacementTokenBudget,\n\t\tnotifyOnFallback:\n\t\t\ttypeof value.notifyOnFallback === \"boolean\"\n\t\t\t\t? value.notifyOnFallback\n\t\t\t\t: DEFAULT_CODEX_COMPACT_SETTINGS.notifyOnFallback,\n\t};\n}\n\nexport function codexCompactSettingsPath(): string {\n\treturn join(getAgentDir(), CODEX_COMPACT_SETTINGS_FILE);\n}\n\nfunction aborted(signal?: AbortSignal): void {\n\tif (signal?.aborted) throw new DOMException(\"Settings operation aborted\", \"AbortError\");\n}\n\nexport async function loadCodexCompactSettings(\n\tpath = codexCompactSettingsPath(),\n\tsignal?: AbortSignal,\n): Promise<CodexCompactSettingsState> {\n\taborted(signal);\n\ttry {\n\t\tconst handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);\n\t\tlet text: string;\n\t\ttry {\n\t\t\tconst stats = await handle.stat();\n\t\t\taborted(signal);\n\t\t\tif (!stats.isFile()) throw new Error(\"settings path is not a regular file\");\n\t\t\tif (stats.size > MAX_SETTINGS_BYTES) throw new Error(\"settings file exceeds 64 KiB\");\n\t\t\ttext = await handle.readFile(\"utf8\");\n\t\t} finally {\n\t\t\tawait handle.close();\n\t\t}\n\t\taborted(signal);\n\t\tconst document = JSON.parse(text) as unknown;\n\t\tconst settings = normalizeCodexCompactSettings(document);\n\t\tif (!settings || !isRecord(document)) throw new Error(\"invalid settings shape or bounds\");\n\t\treturn { kind: \"loaded\", path, settings, document };\n\t} catch (error) {\n\t\tif (signal?.aborted) throw error;\n\t\tif (isNodeError(error) && error.code === \"ENOENT\") {\n\t\t\treturn {\n\t\t\t\tkind: \"missing\",\n\t\t\t\tpath,\n\t\t\t\tsettings: { ...DEFAULT_CODEX_COMPACT_SETTINGS },\n\t\t\t\tdocument: {},\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tkind: \"invalid\",\n\t\t\tpath,\n\t\t\tsettings: { ...DEFAULT_CODEX_COMPACT_SETTINGS },\n\t\t\tissue:\n\t\t\t\tisNodeError(error) && error.code === \"ELOOP\"\n\t\t\t\t\t? \"symbolic links are not accepted\"\n\t\t\t\t\t: error instanceof Error\n\t\t\t\t\t\t? error.message\n\t\t\t\t\t\t: String(error),\n\t\t};\n\t}\n}\n\nasync function savePatch(\n\tpath: string,\n\tpatch: Partial<CodexCompactSettings>,\n\tsignal?: AbortSignal,\n): Promise<CodexCompactSettingsState> {\n\tconst latest = await loadCodexCompactSettings(path, signal);\n\tif (latest.kind === \"invalid\") {\n\t\tthrow new Error(\n\t\t\t\"Cannot overwrite an invalid pi-codex-compact.json; repair it and reload first\",\n\t\t);\n\t}\n\tconst document = { ...latest.document, ...patch };\n\tconst settings = normalizeCodexCompactSettings(document);\n\tif (!settings) throw new Error(\"Refusing to save invalid Codex compaction settings\");\n\tconst temporaryPath = join(dirname(path), `.${basename(path)}.${randomUUID()}.tmp`);\n\tawait mkdir(dirname(path), { recursive: true });\n\taborted(signal);\n\ttry {\n\t\tawait writeFile(temporaryPath, `${JSON.stringify(document, null, 2)}\\n`, {\n\t\t\tencoding: \"utf8\",\n\t\t\tflag: \"wx\",\n\t\t\tmode: 0o600,\n\t\t});\n\t\taborted(signal);\n\t\tconst current = await loadCodexCompactSettings(path, signal);\n\t\tif (\n\t\t\tcurrent.kind === \"invalid\" ||\n\t\t\tcurrent.kind !== latest.kind ||\n\t\t\tJSON.stringify(current.document) !== JSON.stringify(latest.document)\n\t\t) {\n\t\t\tthrow new Error(\"pi-codex-compact.json changed while saving; reopen settings and retry\");\n\t\t}\n\t\tawait rename(temporaryPath, path);\n\t} finally {\n\t\tawait rm(temporaryPath, { force: true }).catch(() => undefined);\n\t}\n\treturn { kind: \"loaded\", path, settings, document };\n}\n\nexport function createCodexCompactSettingsRuntime(\n\tpath = codexCompactSettingsPath(),\n): CodexCompactSettingsRuntime {\n\tlet state: CodexCompactSettingsState = {\n\t\tkind: \"missing\",\n\t\tpath,\n\t\tsettings: { ...DEFAULT_CODEX_COMPACT_SETTINGS },\n\t\tdocument: {},\n\t};\n\tlet queue = Promise.resolve();\n\tconst enqueue = <T>(operation: () => Promise<T>): Promise<T> => {\n\t\tconst result = queue.then(operation, operation);\n\t\tqueue = result.then(\n\t\t\t() => undefined,\n\t\t\t() => undefined,\n\t\t);\n\t\treturn result;\n\t};\n\treturn {\n\t\tget: () => structuredClone(state),\n\t\treload: (signal) =>\n\t\t\tenqueue(async () => {\n\t\t\t\tstate = await loadCodexCompactSettings(path, signal);\n\t\t\t\treturn structuredClone(state);\n\t\t\t}),\n\t\tupdate: (patch, signal) =>\n\t\t\tenqueue(async () => {\n\t\t\t\tstate = await savePatch(path, patch, signal);\n\t\t\t\treturn structuredClone(state);\n\t\t\t}),\n\t\tflush: () => queue,\n\t};\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n\treturn error instanceof Error && \"code\" in error;\n}\n"],
5
- "mappings": "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",
6
- "names": ["index", "isObject", "isObject", "inspection", "randomUUID"]
3
+ "sources": ["../src/codex-compact.ts", "../src/checkpoint.ts", "../src/protocol.ts", "../src/remote-types.ts", "../src/remote-shared.ts", "../src/remote-compact.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 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": ";;;;;;;;AAEA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EAIA;AAAA,OACK;;;ACVP,SAAS,YAAY,kBAAkB;;;ACAhC,IAAM,gBAAgB,IAAI,OAAO;AACjC,IAAM,yBAAyB,IAAI,OAAO;AAC1C,IAAM,4BAA4B,IAAI,OAAO;AAI7C,IAAM,+BAAN,cAA2C,MAAM;AAAA,EACtD,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEA,SAAS,SAAS,OAAqC;AACrD,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,WAAW,OAAwB;AAC1C,SAAO,OAAO,WAAW,KAAK,UAAU,KAAK,GAAG,MAAM;AACxD;AAEO,SAAS,iBAAiB,OAAqC;AACpE,SACE,SAAS,KAAK,KACd,MAAM,SAAS,gBACf,OAAO,MAAM,sBAAsB,YACnC,MAAM,kBAAkB,SAAS;AAErC;AAEO,SAAS,uBAAuB,OAAgB,WAAW,2BAAuC;AACvG,MAAI,CAAC,iBAAiB,KAAK,GAAG;AAC5B,UAAM,IAAI,6BAA6B,yDAAyD;AAAA,EAClG;AACA,MAAI,WAAW,KAAK,IAAI,UAAU;AAChC,UAAM,IAAI,6BAA6B,gDAAgD;AAAA,EACzF;AACA,SAAO,gBAAgB,KAAK;AAC9B;AAaA,SAAS,yBAAyB,OAA8B;AAC9D,QAAM,QAAmB,CAAC;AAC1B,MAAI,MAAM,SAAS,+BAA+B,SAAS,MAAM,IAAI,GAAG;AACtE,UAAM,KAAK,MAAM,IAAI;AAAA,EACvB;AACA,MAAI,MAAM,SAAS,wBAAwB,SAAS,MAAM,QAAQ,GAAG;AACnE,UAAM,SAAS,MAAM,SAAS;AAC9B,QAAI,MAAM,QAAQ,MAAM,EAAG,OAAM,KAAK,GAAG,MAAM;AAAA,EACjD;AACA,SAAO,MAAM,OAAO,CAAC,SAAS,SAAS,IAAI,KAAK,KAAK,SAAS,YAAY;AAC5E;AAEA,eAAsB,qBACpB,QACA,UAII,CAAC,GACyB;AAC9B,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,SAAS,OAAO,UAAU;AAChC,QAAM,UAAU,MAAM;AACpB,SAAK,OAAO,OAAO,IAAI,aAAa,sBAAsB,YAAY,CAAC,EAAE,MAAM,MAAM,MAAS;AAAA,EAChG;AACA,UAAQ,QAAQ,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AACjE,QAAM,UAAU,IAAI,YAAY;AAChC,MAAI,QAAQ;AACZ,MAAI,UAAU;AACd,MAAI,YAAsB,CAAC;AAC3B,MAAI;AACJ,QAAM,QAAQ,oBAAI,IAAwB;AAE1C,QAAM,aAAa,MAAM;AACvB,QAAI,QAAQ,QAAQ,QAAS,OAAM,IAAI,aAAa,sBAAsB,YAAY;AAAA,EACxF;AACA,QAAM,WAAW,MAAM;AACrB,QAAI,UAAU,WAAW,EAAG;AAC5B,UAAM,OAAO,UAAU,KAAK,IAAI;AAChC,gBAAY,CAAC;AACb,QAAI,SAAS,SAAU;AACvB,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,IAAI;AAAA,IAC1B,QAAQ;AACN,YAAM,IAAI,6BAA6B,+CAA+C;AAAA,IACxF;AACA,QAAI,CAAC,SAAS,MAAM,EAAG;AACvB,QAAI,OAAO,SAAS,sBAAsB;AACxC,0BAAoB,SAAS,OAAO,QAAQ,IAAI,OAAO,WAAW,CAAC;AAAA,IACrE;AACA,eAAW,aAAa,yBAAyB,MAAM,GAAG;AACxD,YAAM,OAAO,uBAAuB,WAAW,QAAQ,YAAY;AACnE,YAAM,IAAI,KAAK,UAAU,IAAI,GAAG,IAAI;AAAA,IACtC;AAAA,EACF;AACA,QAAM,cAAc,CAAC,SAAiB;AACpC,QAAI,SAAS,IAAI;AACf,eAAS;AACT;AAAA,IACF;AACA,QAAI,KAAK,WAAW,GAAG,EAAG;AAC1B,QAAI,SAAS,OAAQ,WAAU,KAAK,EAAE;AAAA,aAC7B,KAAK,WAAW,OAAO,EAAG,WAAU,KAAK,KAAK,MAAM,CAAC,EAAE,QAAQ,MAAM,EAAE,CAAC;AAAA,EACnF;AAEA,MAAI;AACF,WAAO,MAAM;AACX,iBAAW;AACX,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AACV,eAAS,MAAM;AACf,UAAI,QAAQ,UAAU;AACpB,cAAM,IAAI,6BAA6B,kDAAkD;AAAA,MAC3F;AACA,iBAAW,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AACjD,UAAI,UAAU,QAAQ,QAAQ,IAAI;AAClC,aAAO,YAAY,IAAI;AACrB,cAAM,UAAU,QAAQ,MAAM,GAAG,OAAO;AACxC,kBAAU,QAAQ,MAAM,UAAU,CAAC;AACnC,oBAAY,QAAQ,SAAS,IAAI,IAAI,QAAQ,MAAM,GAAG,EAAE,IAAI,OAAO;AACnE,kBAAU,QAAQ,QAAQ,IAAI;AAAA,MAChC;AAAA,IACF;AACA,eAAW,QAAQ,OAAO;AAC1B,QAAI,QAAQ,SAAS,EAAG,aAAY,QAAQ,SAAS,IAAI,IAAI,QAAQ,MAAM,GAAG,EAAE,IAAI,OAAO;AAC3F,aAAS;AACT,eAAW;AAAA,EACb,SAAS,OAAO;AACd,UAAM,OAAO,OAAO,KAAK,EAAE,MAAM,MAAM,MAAS;AAChD,UAAM;AAAA,EACR,UAAE;AACA,YAAQ,QAAQ,oBAAoB,SAAS,OAAO;AACpD,WAAO,YAAY;AAAA,EACrB;AAEA,MAAI,CAAC,mBAAmB;AACtB,UAAM,IAAI,6BAA6B,2DAA2D;AAAA,EACpG;AACA,MAAI,MAAM,SAAS,GAAG;AACpB,UAAM,IAAI;AAAA,MACR,8BAA8B,MAAM,IAAI;AAAA,IAC1C;AAAA,EACF;AACA,SAAO,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,EAAE,CAAC,GAAG,kBAAkB;AAC3D;AAEA,SAAS,yBAAyB,OAAqC;AACrE,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO;AAC7B,MAAI,MAAM,SAAS,aAAc,QAAO,OAAO,MAAM,SAAS;AAC9D,MAAI,MAAM,SAAS,cAAe,QAAO;AACzC,MACE,MAAM,WAAW,UACjB,MAAM,WAAW,QACjB,MAAM,WAAW,UACjB,MAAM,WAAW,SACjB,MAAM,WAAW,UACjB,MAAM,WAAW,YACjB;AACA,WAAO;AAAA,EACT;AACA,MACG,MAAM,YAAY,UAAa,MAAM,YAAY,QAAQ,OAAO,MAAM,YAAY,YAClF,MAAM,cAAc,UAAa,MAAM,cAAc,QAAQ,OAAO,MAAM,cAAc,UACzF;AACA,WAAO;AAAA,EACT;AACA,SACG,OAAO,MAAM,YAAY,YAAY,MAAM,QAAQ,SAAS,KAC5D,OAAO,MAAM,cAAc,YAAY,MAAM,UAAU,SAAS;AAErE;AAEA,SAAS,yBAAyB,OAAqC;AACrE,SACE,SAAS,KAAK,KACd,MAAM,SAAS,WACd,MAAM,SAAS,UAAa,MAAM,SAAS,cAC5C,MAAM,QAAQ,MAAM,OAAO,KAC3B,MAAM,QAAQ,SAAS,KACvB,MAAM,QAAQ,MAAM,wBAAwB;AAEhD;AAEO,SAAS,0BACd,OACA,UAAwD,CAAC,GAC/B;AAC1B,MAAI,CAAC,SAAS,KAAK,KAAK,CAAC,MAAM,QAAQ,MAAM,MAAM,GAAG;AACpD,UAAM,IAAI,6BAA6B,uDAAuD;AAAA,EAChG;AACA,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,eAAe,QAAQ,gBAAgB;AAC7C,MAAI,WAAW,KAAK,IAAI,UAAU;AAChC,UAAM,IAAI,6BAA6B,oDAAoD;AAAA,EAC7F;AACA,MAAI,MAAM,OAAO,WAAW,GAAG;AAC7B,UAAM,IAAI,6BAA6B,4CAA4C;AAAA,EACrF;AACA,QAAM,SAAS,MAAM,OAAO,IAAI,CAACA,UAAS;AACxC,QAAI,CAAC,SAASA,KAAI,GAAG;AACnB,YAAM,IAAI,6BAA6B,qDAAqD;AAAA,IAC9F;AACA,QAAI,WAAWA,KAAI,IAAI,cAAc;AACnC,YAAM,IAAI,6BAA6B,uDAAuD;AAAA,IAChG;AACA,WAAO,gBAAgBA,KAAI;AAAA,EAC7B,CAAC;AACD,QAAM,kBAAkB,OAAO,OAAO,CAACA,UAASA,MAAK,SAAS,YAAY;AAC1E,MAAI,gBAAgB,WAAW,KAAK,OAAO,GAAG,EAAE,GAAG,SAAS,cAAc;AACxE,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,aAAWA,SAAQ,OAAO,MAAM,GAAG,EAAE,GAAG;AACtC,QAAI,CAAC,yBAAyBA,KAAI,GAAG;AACnC,YAAM,IAAI,6BAA6B,gEAAgE;AAAA,IACzG;AAAA,EACF;AACA,QAAM,OAAO,uBAAuB,OAAO,GAAG,EAAE,GAAG,YAAY;AAC/D,SAAO,EAAE,MAAM,QAAQ,CAAC,GAAG,OAAO,MAAM,GAAG,EAAE,GAAG,IAAI,GAAG,UAAU,gBAAgB,KAAK,EAAE;AAC1F;AAEA,eAAsB,uBACpB,UACA,UAA8E,CAAC,GAC5C;AACnC,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,iBAAiB,OAAO,SAAS,QAAQ,IAAI,gBAAgB,CAAC;AACpE,MAAI,OAAO,SAAS,cAAc,KAAK,iBAAiB,UAAU;AAChE,UAAM,QAAQ,IAAI,6BAA6B,oDAAoD;AACnG,UAAM,SAAS,MAAM,OAAO,KAAK,EAAE,MAAM,MAAM,MAAS;AACxD,UAAM;AAAA,EACR;AACA,MAAI,CAAC,SAAS,MAAM;AAClB,UAAM,IAAI,6BAA6B,mDAAmD;AAAA,EAC5F;AACA,QAAM,SAAS,SAAS,KAAK,UAAU;AACvC,QAAM,SAAuB,CAAC;AAC9B,MAAI,QAAQ;AACZ,QAAM,UAAU,MAAM;AACpB,SAAK,OAAO,OAAO,IAAI,aAAa,sBAAsB,YAAY,CAAC,EAAE,MAAM,MAAM,MAAS;AAAA,EAChG;AACA,UAAQ,QAAQ,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AACjE,MAAI;AACF,WAAO,MAAM;AACX,UAAI,QAAQ,QAAQ,QAAS,OAAM,IAAI,aAAa,sBAAsB,YAAY;AACtF,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AACV,eAAS,MAAM;AACf,UAAI,QAAQ,UAAU;AACpB,cAAM,IAAI,6BAA6B,oDAAoD;AAAA,MAC7F;AACA,aAAO,KAAK,KAAK;AAAA,IACnB;AACA,QAAI,QAAQ,QAAQ,QAAS,OAAM,IAAI,aAAa,sBAAsB,YAAY;AAAA,EACxF,SAAS,OAAO;AACd,UAAM,OAAO,OAAO,KAAK,EAAE,MAAM,MAAM,MAAS;AAChD,UAAM;AAAA,EACR,UAAE;AACA,YAAQ,QAAQ,oBAAoB,SAAS,OAAO;AACpD,WAAO,YAAY;AAAA,EACrB;AACA,QAAM,OAAO,IAAI,WAAW,KAAK;AACjC,MAAI,SAAS;AACb,aAAW,SAAS,QAAQ;AAC1B,SAAK,IAAI,OAAO,MAAM;AACtB,cAAU,MAAM;AAAA,EAClB;AACA,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,IAAI,YAAY,EAAE,OAAO,IAAI,CAAC;AAAA,EACpD,QAAQ;AACN,UAAM,IAAI,6BAA6B,2CAA2C;AAAA,EACpF;AACA,SAAO,0BAA0B,QAAQ,OAAO;AAClD;AAEA,SAAS,mBAAmB,MAAmC;AAC7D,MAAI,CAAC,SAAS,IAAI,KAAK,KAAK,SAAS,UAAU,CAAC,MAAM,QAAQ,KAAK,OAAO,EAAG,QAAO;AACpF,MAAI,KAAK,QAAQ,WAAW,EAAG,QAAO;AACtC,QAAM,UAAU,KAAK,QAAQ,CAAC;AAC9B,MAAI,CAAC,SAAS,OAAO,KAAK,QAAQ,SAAS,gBAAgB,OAAO,QAAQ,SAAS,UAAU;AAC3F,WAAO;AAAA,EACT;AACA,SAAO,QAAQ;AACjB;AAEO,SAAS,wBACd,SACA,QACA,oBACY;AACZ,MAAI,CAAC,SAAS,OAAO,KAAK,CAAC,MAAM,QAAQ,QAAQ,KAAK,GAAG;AACvD,UAAM,IAAI,6BAA6B,mDAAmD;AAAA,EAC5F;AACA,QAAM,UAAU,QAAQ,MACrB,IAAI,CAAC,MAAMC,WAAW,mBAAmB,IAAI,MAAM,SAASA,SAAQ,EAAG,EACvE,OAAO,CAACA,WAAUA,UAAS,CAAC;AAC/B,MAAI,QAAQ,WAAW,GAAG;AACxB,UAAM,IAAI;AAAA,MACR,8BAA8B,QAAQ,MAAM;AAAA,IAC9C;AAAA,EACF;AACA,QAAM,QAAQ,QAAQ,CAAC;AACvB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,OAAO;AAAA,MACL,GAAG,QAAQ,MAAM,MAAM,GAAG,KAAK;AAAA,MAC/B,GAAG,gBAAgB,kBAAkB;AAAA,MACrC,GAAG,QAAQ,MAAM,MAAM,QAAQ,CAAC;AAAA,IAClC;AAAA,EACF;AACF;AAEO,SAAS,wBAAwB,SAA8B;AACpE,MAAI,CAAC,SAAS,OAAO,KAAK,CAAC,MAAM,QAAQ,QAAQ,KAAK,GAAG;AACvD,UAAM,IAAI,6BAA6B,mDAAmD;AAAA,EAC5F;AACA,MAAI,QAAQ,MAAM,KAAK,CAAC,SAAS,SAAS,IAAI,KAAK,KAAK,SAAS,oBAAoB,GAAG;AACtF,UAAM,IAAI,6BAA6B,wDAAwD;AAAA,EACjG;AACA,SAAO,EAAE,GAAG,SAAS,OAAO,CAAC,GAAG,QAAQ,OAAO,EAAE,MAAM,qBAAqB,CAAC,EAAE;AACjF;AAEO,SAAS,8BACd,SACA,YACY;AACZ,MAAI,YAAY;AACd,WAAO,wBAAwB,SAAS,WAAW,QAAQ,WAAW,kBAAkB;AAAA,EAC1F;AACA,MAAI,CAAC,SAAS,OAAO,KAAK,CAAC,MAAM,QAAQ,QAAQ,KAAK,GAAG;AACvD,UAAM,IAAI,6BAA6B,6CAA6C;AAAA,EACtF;AACA,SAAO,gBAAgB,OAAO;AAChC;AAEO,SAAS,+BACd,SACA,YACY;AACZ,SAAO,wBAAwB,8BAA8B,SAAS,UAAU,CAAC;AACnF;AAEO,SAAS,oBAAoB,SAAkB,QAAyB;AAC7E,SACE,SAAS,OAAO,KAChB,MAAM,QAAQ,QAAQ,KAAK,KAC3B,QAAQ,MAAM,KAAK,CAAC,SAAS,mBAAmB,IAAI,MAAM,MAAM;AAEpE;;;ADnWO,IAAM,kBAAkB;AACxB,IAAM,qBAAqB;AAC3B,IAAM,2BAA2B;AACjC,IAAM,0BAA0B,IAAI,OAAO;AAClD,IAAM,uBAAuB,IAAI,OAAO;AACxC,IAAM,+BAA+B,KAAK,OAAO;AACjD,IAAM,2BAA2B;AACjC,IAAM,yBAAyB;AAC/B,IAAM,oBAAoB;AAC1B,IAAM,sBAAsB;AAC5B,IAAM,wBAAwB;AAgB9B,SAASC,UAAS,OAAqC;AACrD,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,YAAY,OAAyB;AAC5C,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,IAAI,WAAW;AACtD,MAAI,CAACA,UAAS,KAAK,EAAG,QAAO;AAC7B,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,KAAK,EACjB,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,KAAK,cAAc,KAAK,CAAC,EACnD,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC;AAAA,EACpD;AACF;AAEA,SAAS,gBAAgB,OAAwB;AAC/C,SAAO,OAAO,WAAW,KAAK,UAAU,KAAK,GAAG,MAAM;AACxD;AAEO,SAAS,mBAAmB,SAA+B;AAChE,SAAO,WAAW,QAAQ,EACvB,OAAO,KAAK,UAAU,YAAY,OAAO,CAAC,CAAC,EAC3C,OAAO,KAAK;AACjB;AAEO,SAAS,iBAAiB,cAA8B;AAC7D,SAAO;AAAA,IACL,+BAA+B,YAAY;AAAA,IAC3C;AAAA,IACA;AAAA,EACF,EAAE,KAAK,GAAG;AACZ;AAEO,SAAS,gBAAgB,cAA8B;AAC5D,SAAO;AAAA,IACL,mCAAmC,YAAY;AAAA,IAC/C;AAAA,IACA;AAAA,EACF,EAAE,KAAK,GAAG;AACZ;AAEA,SAAS,cAAc,cAAsB,WAAiC;AAC5E,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,iBAAiB,YAAY,EAAE,CAAC;AAAA,IAChE;AAAA,EACF;AACF;AAEO,SAAS,uBAAuB,OAAoD;AACzF,MAAI,CAACA,UAAS,KAAK,EAAG,QAAO;AAC7B,MAAI;AACF,QAAI,gBAAgB,KAAK,IAAI,6BAA8B,QAAO;AAAA,EACpE,QAAQ;AACN,WAAO;AAAA,EACT;AACA,QAAM,eACJ,MAAM,YAAY,KAAK,MAAM,QAAQ,4BAA4B,MAAM,aAAa;AACtF,QAAM,eACJ,MAAM,YAAY,MACjB,MAAM,QAAQ,4BACb,MAAM,QAAQ,sBACd,MAAM,QAAQ,8BACf,MAAM,aAAa,eAAe,MAAM,aAAa;AACxD,QAAM,iBACJ,MAAM,YAAY,sBAClB,OAAO,MAAM,QAAQ,YACrB,MAAM,IAAI,SAAS,KACnB,MAAM,IAAI,UAAU,sBACnB,MAAM,YAAY,wBAAwB,MAAM,YAAY,2BAC5D,MAAM,aAAa,eAAe,MAAM,aAAa;AACxD,MACE,MAAM,SAAS,mBACd,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,kBACpC,OAAO,MAAM,iBAAiB,YAC9B,MAAM,aAAa,SAAS,KAC5B,MAAM,aAAa,SAAS,4BAC5B,OAAO,MAAM,aAAa,YAC1B,MAAM,SAAS,WAAW,KAC1B,MAAM,SAAS,SAAS,0BACxB,OAAO,MAAM,YAAY,YACzB,MAAM,QAAQ,WAAW,KACzB,MAAM,QAAQ,SAAS,uBACvB,CAAC,MAAM,QAAQ,MAAM,kBAAkB,KACvC,CAAC,MAAM,QAAQ,MAAM,uBAAuB,KAC5C,MAAM,wBAAwB,SAAS,yBACvC,OAAO,MAAM,cAAc,YAC3B,MAAM,UAAU,SAAS,IACzB;AACA,WAAO;AAAA,EACT;AACA,QAAM,MAAM,MAAM;AAClB,QAAM,UACJ,QAAQ,2BACJ,uBACA,QAAQ,sBAAsB,QAAQ,2BACpC,wBACA,MAAM;AACd,MACG,YAAY,wBAAwB,YAAY,yBAChD,QAAQ,4BACP,QAAQ,sBACR,QAAQ,4BACR,YAAY,wBACb,kBAAkB,MAAM,YAAY,SACrC;AACA,WAAO;AAAA,EACT;AACA,MACE,MAAM,mBAAmB,WAAW,KACpC,CAAC,MAAM,mBAAmB,MAAMA,SAAQ,KACxC,CAAC,MAAM,wBAAwB;AAAA,IAC7B,CAAC,gBAAgB,OAAO,gBAAgB,YAAY,iBAAiB,KAAK,WAAW;AAAA,EACvF,KACA,gBAAgB,MAAM,kBAAkB,IAAI,yBAC5C;AACA,WAAO;AAAA,EACT;AACA,QAAM,OAAO,MAAM,mBAAmB,GAAG,EAAE;AAC3C,MAAI;AACF,2BAAuB,IAAI;AAAA,EAC7B,QAAQ;AACN,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,cAAc,MAAM;AAAA,IACpB,UAAU,MAAM;AAAA,IAChB;AAAA,IACA;AAAA,IACA,SAAS,MAAM;AAAA,IACf,UAAU,eAAe,cAAe,MAAM;AAAA,IAC9C,oBAAoB,gBAAgB,MAAM,kBAAkB;AAAA,IAC5D,yBAAyB,CAAC,GAAG,MAAM,uBAAuB;AAAA,IAC1D,WAAW,MAAM;AAAA,EACnB;AACF;AAEO,SAAS,iBAAiB,SAKnB;AACZ,WAAS,QAAQ,QAAQ,SAAS,GAAG,SAAS,GAAG,SAAS;AACxD,UAAM,QAAQ,QAAQ,KAAK;AAC3B,QAAI,MAAM,SAAS,aAAc;AACjC,UAAM,UAAU,uBAAuB,MAAM,OAAO;AACpD,WAAO,UAAU,EAAE,OAAyD,QAAQ,IAAI;AAAA,EAC1F;AACA,SAAO;AACT;AAEA,SAAS,yBAAyB,SAAuB,WAA4B;AACnF,SACE,QAAQ,SAAS,uBACjB,OAAO,SAAS,QAAQ,SAAS,KACjC,OAAO,SAAS,SAAS,KACzB,QAAQ,YAAY;AAExB;AAEO,SAAS,yBACd,UACA,SACA,mBAC4B;AAC5B,QAAM,eAAe,SAAS;AAAA,IAC5B,CAAC,YAAY,QAAQ,SAAS,uBAAuB,QAAQ,YAAY;AAAA,EAC3E;AACA,MAAI,eAAe,EAAG,QAAO;AAC7B,QAAM,YAAY,SAAS,YAAY,EAAE;AACzC,MAAI,eAAe,eAAe;AAClC,MAAI,mBAAmB;AACvB,SAAO,mBAAmB,QAAQ,wBAAwB,QAAQ;AAChE,QAAI,gBAAgB,SAAS,OAAQ,QAAO;AAC5C,UAAM,UAAU,SAAS,YAAY;AACrC,QAAI,mBAAmB,OAAO,MAAM,QAAQ,wBAAwB,gBAAgB,GAAG;AACrF,sBAAgB;AAChB,0BAAoB;AACpB;AAAA,IACF;AACA,QAAI,yBAAyB,SAAS,SAAS,GAAG;AAChD,sBAAgB;AAChB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,SAAO,eAAe,SAAS,UAAU,yBAAyB,SAAS,YAAY,GAAG,SAAS,GAAG;AACpG,oBAAgB;AAAA,EAClB;AACA,SAAO;AAAA,IACL,GAAG,SAAS,MAAM,GAAG,YAAY;AAAA,IACjC,cAAc,QAAQ,cAAc,SAAS;AAAA,IAC7C,GAAG,SAAS,MAAM,YAAY;AAAA,EAChC;AACF;AAEA,SAAS,QAAQ,MAA0B;AACzC,MAAI,CAAC,MAAM,QAAQ,KAAK,OAAO,EAAG,QAAO;AACzC,SAAO,KAAK,QACT;AAAA,IAAQ,CAAC,SACRA,UAAS,IAAI,KAAK,OAAO,KAAK,SAAS,YAAY,KAAK,SAAS,eAAe,CAAC,KAAK,IAAI,IAAI,CAAC;AAAA,EACjG,EACC,KAAK,IAAI;AACd;AAEA,SAAS,SAAS,MAA2B;AAC3C,SAAO,MAAM,QAAQ,KAAK,OAAO,KAAK,KAAK,QAAQ,KAAK,CAAC,SAASA,UAAS,IAAI,KAAK,KAAK,SAAS,aAAa;AACjH;AAEA,SAAS,iBAAiB,MAAkB,UAA0C;AACpF,MAAI,CAAC,MAAM,QAAQ,KAAK,OAAO,KAAK,YAAY,GAAI,QAAO;AAC3D,MAAI,YAAY,WAAW;AAC3B,QAAM,UAAU,CAAC,GAAG,KAAK,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,SAAS;AAC5D,QAAI,CAACA,UAAS,IAAI,KAAK,KAAK,SAAS,gBAAgB,OAAO,KAAK,SAAS,YAAY,aAAa,GAAG;AACpG,aAAO,CAAC;AAAA,IACV;AACA,UAAM,OAAO,KAAK,KAAK,MAAM,CAAC,SAAS;AACvC,iBAAa,KAAK;AAClB,WAAO,CAAC,EAAE,GAAG,MAAM,MAAM;AAAA,EAAgB,IAAI,GAAG,CAAC;AAAA,EACnD,CAAC;AACD,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,SAAO,EAAE,GAAG,MAAM,SAAS,QAAQ,QAAQ,EAAE;AAC/C;AAEO,SAAS,wBACd,OACA,gBACA,UAAyD,CAAC,GAC5C;AACd,QAAM,cAAc,QAAQ,eAAe;AAC3C,QAAM,aAAa,QAAQ,cAAc;AACzC,QAAM,SAAS,uBAAuB,cAAc;AACpD,MAAI,iBAAiB,aAAa,gBAAgB,MAAM;AACxD,MAAI,iBAAiB,cAAc;AACnC,MAAI,kBAAkB,EAAG,OAAM,IAAI,MAAM,2DAA2D;AACpG,QAAM,sBAAoC,CAAC;AAC3C,QAAM,aAAa,MAAM;AAAA,IACvB,CAAC,SAA6BA,UAAS,IAAI,KAAK,KAAK,SAAS,UAAU,KAAK,SAAS;AAAA,EACxF;AACA,WAAS,QAAQ,WAAW,SAAS,GAAG,SAAS,GAAG,SAAS;AAC3D,UAAM,YAAY,WAAW,KAAK;AAClC,UAAM,QAAQ,gBAAgB,SAAS;AACvC,QAAI,SAAS,SAAS,KAAK,QAAQ,qBAAsB;AACzD,UAAM,OAAO,QAAQ,SAAS;AAC9B,QAAI,WAAW;AACf,QAAI,KAAK,SAAS,gBAAgB;AAChC,UAAI,SAAS,SAAS,EAAG;AACzB,YAAM,YAAY,iBAAiB,WAAW,cAAc;AAC5D,UAAI,CAAC,UAAW;AAChB,iBAAW;AAAA,IACb;AACA,QAAI,gBAAgB,QAAQ,IAAI,gBAAgB;AAC9C,UAAI,SAAS,QAAQ,EAAG;AACxB,YAAM,kBAAkB,KAAK,IAAI,GAAG,iBAAiB,GAAG;AACxD,YAAM,YAAY,iBAAiB,UAAU,KAAK,IAAI,gBAAgB,eAAe,CAAC;AACtF,UAAI,CAAC,aAAa,gBAAgB,SAAS,IAAI,eAAgB;AAC/D,iBAAW;AAAA,IACb;AACA,wBAAoB,KAAK,gBAAgB,QAAQ,CAAC;AAClD,sBAAkB,gBAAgB,QAAQ;AAC1C,sBAAkB,KAAK,IAAI,gBAAgB,QAAQ,QAAQ,EAAE,MAAM;AACnE,QAAI,kBAAkB,OAAO,kBAAkB,GAAI;AAAA,EACrD;AACA,SAAO,CAAC,GAAG,oBAAoB,QAAQ,GAAG,MAAM;AAClD;AAEO,SAAS,wBAAwB,OAUb;AACzB,QAAM,UAAkC;AAAA,IACtC,MAAM;AAAA,IACN,SAAS;AAAA,IACT,cAAc,MAAM,gBAAgB,WAAW;AAAA,IAC/C,UAAU,MAAM;AAAA,IAChB,KAAK,MAAM;AAAA,IACX,SAAS,MAAM;AAAA,IACf,SAAS,MAAM;AAAA,IACf,UAAU,MAAM;AAAA,IAChB,oBAAoB,gBAAgB,MAAM,kBAAkB;AAAA,IAC5D,yBAAyB,MAAM,aAAa,IAAI,kBAAkB;AAAA,IAClE,WAAW,MAAM,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,EACvD;AACA,QAAM,SAAS,uBAAuB,OAAO;AAC7C,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,qCAAqC;AAClE,SAAO;AACT;;;AExSO,SAAS,aAAa,OAAqC;AAChE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEO,SAAS,aAA2B;AACzC,SAAO,IAAI,aAAa,sBAAsB,YAAY;AAC5D;AAEO,SAAS,oBAAoB,SAAmC;AACrE,MAAI,CAAC,MAAM,QAAQ,QAAQ,KAAK,KAAK,CAAC,QAAQ,MAAM,MAAM,YAAY,GAAG;AACvE,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AACA,SAAO,gBAAgB,QAAQ,KAAK;AACtC;;;AC1CA,eAAsB,qBAAqB,QAAqC,QAAqC;AACnH,MAAI;AACJ,mBAAiB,SAAS,QAAQ;AAChC,QAAI,OAAO,QAAS,OAAM,WAAW;AACrC,QAAI,MAAM,SAAS,SAAS;AAC1B,YAAM,IAAI,MAAM,MAAM,MAAM,gBAAgB,qCAAqC;AAAA,IACnF;AACA,QAAI,MAAM,SAAS,OAAQ,SAAQ,MAAM,QAAQ;AAAA,EACnD;AACA,MAAI,OAAO,QAAS,OAAM,WAAW;AACrC,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,0DAA0D;AACtF,SAAO;AACT;;;ACGA,IAAM,0BAA0B;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,uBAAuB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,eAAe,SAAqB,SAAiD;AAC5F,QAAM,SAAS,YAAY,uBAAuB,uBAAuB;AACzE,QAAM,SAAqB,CAAC;AAC5B,aAAW,SAAS,QAAQ;AAC1B,QAAI,OAAO,OAAO,SAAS,KAAK,KAAK,QAAQ,KAAK,MAAM,QAAW;AACjE,aAAO,KAAK,IAAI,gBAAgB,QAAQ,KAAK,CAAC;AAAA,IAChD;AAAA,EACF;AACA,MAAI,OAAO,OAAO,UAAU,YAAY,OAAO,MAAM,WAAW,GAAG;AACjE,UAAM,IAAI,6BAA6B,sCAAsC;AAAA,EAC/E;AACA,sBAAoB,MAAM;AAC1B,SAAO;AACT;AAEA,SAAS,WAAW,OAAoC;AACtD,SAAO,IAAI,IAAI,iBAAiB,UAAU,MAAM,MAAM,OAAO,KAAK,CAAC;AACrE;AAEO,SAAS,oBAAoB,OAAoC;AACtE,QAAM,WAAW,WAAW,KAAK;AACjC,MAAI,CAAC,SAAS,SAAS,SAAS,YAAY,GAAG;AAC7C,UAAM,IAAI,6BAA6B,+DAA+D;AAAA,EACxG;AACA,QAAM,UAAU,IAAI,IAAI,QAAQ;AAChC,UAAQ,WAAW,GAAG,QAAQ,QAAQ;AACtC,MAAI,QAAQ,WAAW,SAAS,QAAQ;AACtC,UAAM,IAAI,6BAA6B,sCAAsC;AAAA,EAC/E;AACA,SAAO;AACT;AAEA,SAAS,cAAc,OAA+B,MAA6B;AACjF,QAAM,UAAU,IAAI,QAAQ,iBAAiB,UAAU,MAAM,UAAU,MAAS;AAChF,MAAI,QAAQ,MAAM,OAAO,EAAE,QAAQ,CAAC,OAAO,SAAS;AAClD,YAAQ,IAAI,MAAM,KAAK;AAAA,EACzB,CAAC;AACD,UAAQ,OAAO,kBAAkB;AACjC,UAAQ,OAAO,gBAAgB;AAC/B,UAAQ,IAAI,UAAU,kBAAkB;AACxC,UAAQ,IAAI,gBAAgB,kBAAkB;AAC9C,SAAO;AACT;AAEA,SAAS,aACP,OACA,MACA,aACa;AACb,QAAM,UAAU,CAAC,WAAW;AAC5B,MAAI,iBAAiB,QAAS,SAAQ,KAAK,MAAM,MAAM;AACvD,MAAI,MAAM,OAAQ,SAAQ,KAAK,KAAK,MAAM;AAC1C,SAAO,QAAQ,WAAW,IAAI,cAAc,YAAY,IAAI,OAAO;AACrE;AAEA,SAAS,0BAA0B,OAA0B;AAC3D,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,SAAO,SAAS;AAAA,IACd;AAAA,MACE,OAAO;AAAA,QACL;AAAA,QACA,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,EAAE,QAAQ,IAAI;AAAA,EAChB;AACF;AAEA,SAAS,mBAAmB,OAAiC;AAC3D,SAAO,OAAO,UAAU,YAAY,OAAO,cAAc,KAAK,KAAK,SAAS;AAC9E;AAEA,SAAS,oBAAoB,SAAkB,OAAuB;AACpE,MAAI,YAAY,UAAa,YAAY,KAAM,QAAO;AACtD,MAAI,CAAC,aAAa,OAAO,GAAG;AAC1B,UAAM,IAAI,6BAA6B,sDAAsD;AAAA,EAC/F;AACA,QAAM,QAAQ,QAAQ,KAAK;AAC3B,MAAI,UAAU,UAAa,UAAU,KAAM,QAAO;AAClD,MAAI,CAAC,mBAAmB,KAAK,GAAG;AAC9B,UAAM,IAAI,6BAA6B,uDAAuD,KAAK,EAAE;AAAA,EACvG;AACA,SAAO;AACT;AAEA,SAAS,eAAe,UAAkC;AACxD,QAAM,QAAQ,SAAS;AACvB,MAAI,CAAC,aAAa,KAAK,GAAG;AACxB,UAAM,IAAI,6BAA6B,6CAA6C;AAAA,EACtF;AACA,aAAW,SAAS,CAAC,gBAAgB,iBAAiB,cAAc,GAAY;AAC9E,QAAI,CAAC,mBAAmB,MAAM,KAAK,CAAC,GAAG;AACrC,YAAM,IAAI,6BAA6B,0CAA0C,KAAK,EAAE;AAAA,IAC1F;AAAA,EACF;AACA,QAAM,cAAc,MAAM;AAC1B,QAAM,eAAe,MAAM;AAC3B,QAAM,cAAc,MAAM;AAC1B,QAAM,eAAe,oBAAoB,MAAM,sBAAsB,eAAe;AACpF,QAAM,mBAAmB,oBAAoB,MAAM,sBAAsB,oBAAoB;AAC7F,QAAM,kBAAkB,oBAAoB,MAAM,uBAAuB,kBAAkB;AAC3F,MAAI,eAAe,mBAAmB,eAAe,kBAAkB,cAAc;AACnF,UAAM,IAAI,6BAA6B,2DAA2D;AAAA,EACpG;AACA,MAAI,gBAAgB,cAAc,cAAc;AAC9C,UAAM,IAAI,6BAA6B,yDAAyD;AAAA,EAClG;AACA,SAAO,gBAAgB,KAAK;AAC9B;AAEA,SAAS,oBAAoB,QAAkC,SAA+B;AAC5F,QAAM,YAAY;AAAA,IAChB,IAAI,OAAO,OAAO,SAAS,OAAO,WAAW,OAAO,SAAS,KAAK;AAAA,IAClE,QAAQ;AAAA,IACR,YACE,OAAO,OAAO,SAAS,eAAe,WAAW,OAAO,SAAS,aAAa,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAAA,IAC5G,QAAQ;AAAA,IACR,OAAO,QAAQ;AAAA,IACf,QAAQ,CAAC;AAAA,IACT,qBAAqB;AAAA,IACrB,aAAa;AAAA,IACb,OAAO,CAAC;AAAA,IACR,OAAO,eAAe,OAAO,QAAQ;AAAA,EACvC;AACA,QAAM,SAAS;AAAA,IACb,EAAE,MAAM,oBAAoB,UAAU,EAAE,GAAG,WAAW,QAAQ,cAAc,EAAE;AAAA,IAC9E,EAAE,MAAM,sBAAsB,UAAU,UAAU;AAAA,EACpD;AACA,SAAO,IAAI,SAAS,OAAO,IAAI,CAAC,UAAU,SAAS,KAAK,UAAU,KAAK,CAAC;AAAA;AAAA,CAAM,EAAE,KAAK,EAAE,GAAG;AAAA,IACxF,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,oBAAoB;AAAA,EACjD,CAAC;AACH;AAEA,eAAsB,wBAAwB,SAAqE;AACjH,MAAI,QAAQ,OAAO,QAAS,OAAM,WAAW;AAC7C,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI,mBAAmB;AACvB,MAAI,sBAAsB;AAC1B,QAAM,YAAY,QAAQ,SAAS,WAAW;AAC9C,QAAM,cAAuC,OAAO,OAAO,SAAS;AAClE,QAAI,QAAQ,OAAO,QAAS,OAAM,WAAW;AAC7C,QAAI,sBAAsB,GAAG;AAC3B,oBAAc,IAAI,6BAA6B,6DAA6D;AAC5G,aAAO,0BAA0B,WAAW;AAAA,IAC9C;AACA,QAAI,kBAAkB;AACpB,oBAAc,IAAI,6BAA6B,4DAA4D;AAC3G,aAAO,0BAA0B,WAAW;AAAA,IAC9C;AACA,QAAI,CAAC,iBAAiB;AACpB,oBAAc,IAAI,6BAA6B,yDAAyD;AACxG,aAAO,0BAA0B,WAAW;AAAA,IAC9C;AACA,QAAI;AACJ,QAAI;AACF,mBAAa,oBAAoB,KAAK;AAAA,IACxC,SAAS,OAAO;AACd,oBAAc;AACd,aAAO,0BAA0B,KAAK;AAAA,IACxC;AACA,UAAM,SAAS,aAAa,OAAO,MAAM,QAAQ,MAAM;AACvD,uBAAmB;AACnB,QAAI;AACF,YAAM,WAAW,MAAM,UAAU,YAAY;AAAA,QAC3C,GAAG;AAAA,QACH,QAAQ;AAAA,QACR,SAAS,cAAc,OAAO,IAAI;AAAA,QAClC,MAAM,KAAK,UAAU,eAAe;AAAA,QACpC;AAAA,MACF,CAAC;AACD,UAAI,CAAC,SAAS,GAAI,QAAO;AACzB,UAAI;AACF,cAAM,SAAS,MAAM,uBAAuB,UAAU,EAAE,OAAO,CAAC;AAChE,+BAAuB;AACvB,YAAI,wBAAwB,GAAG;AAC7B,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AACA,wBAAgB;AAChB,eAAO,oBAAoB,QAAQ,eAAe;AAAA,MACpD,SAAS,OAAO;AACd,sBAAc;AACd,eAAO,0BAA0B,KAAK;AAAA,MACxC;AAAA,IACF,UAAE;AACA,yBAAmB;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,SAAS,QAAQ,SAAS,OAAO,QAAQ,OAAO,QAAQ,SAAS;AAAA,IACrE,QAAQ,QAAQ;AAAA,IAChB,SAAS,QAAQ;AAAA,IACjB,KAAK,QAAQ;AAAA,IACb,QAAQ,QAAQ;AAAA,IAChB,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,WAAW,QAAQ,oBAAoB,IAAI,KAAK;AAAA,IAChD,YAAY,QAAQ,cAAc;AAAA,IAClC,OAAO;AAAA,IACP,WAAW,CAAC,YAAY;AACtB,UAAI,iBAAiB;AACnB,cAAM,IAAI,6BAA6B,2DAA2D;AAAA,MACpG;AACA,YAAM,WAAW,8BAA8B,SAAS,QAAQ,eAAe;AAC/E,wBAAkB,eAAe,UAAU,QAAQ,OAAO;AAC1D,kBAAY,oBAAoB,eAAe;AAC/C,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,MAAI;AACJ,MAAI;AACF,YAAQ,MAAM,qBAAqB,QAAQ,QAAQ,MAAM;AAAA,EAC3D,SAAS,OAAO;AACd,QAAI,YAAa,OAAM;AACvB,UAAM;AAAA,EACR;AACA,MAAI,QAAQ,OAAO,QAAS,OAAM,WAAW;AAC7C,MAAI,YAAa,OAAM;AACvB,MAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,iBAAiB,wBAAwB,GAAG;AACjF,UAAM,IAAI,6BAA6B,iEAAiE;AAAA,EAC1G;AACA,SAAO;AAAA,IACL,MAAM,cAAc;AAAA,IACpB,aAAa;AAAA,IACb,iBAAiB,cAAc;AAAA,IAC/B;AAAA,EACF;AACF;;;ACrQA,eAAsB,0BAA0B,SAAqE;AACnH,MAAI,QAAQ,OAAO,QAAS,OAAM,WAAW;AAC7C,MAAI;AACJ,QAAM,cAAmG,CAAC;AAC1G,QAAM,YAAY,QAAQ,SAAS,WAAW;AAC9C,QAAM,iBAA0C,OAAO,OAAO,SAAS;AACrE,UAAM,WAAW,MAAM,UAAU,OAAO,IAAI;AAC5C,QAAI,CAAC,SAAS,MAAM,CAAC,SAAS,KAAM,QAAO;AAC3C,UAAM,CAAC,cAAc,cAAc,IAAI,SAAS,KAAK,IAAI;AACzD,UAAMC,cAAa,qBAAqB,gBAAgB,EAAE,QAAQ,QAAQ,OAAO,CAAC,EAAE;AAAA,MAClF,CAAC,WAAW,EAAE,IAAI,MAAe,MAAM;AAAA,MACvC,CAAC,WAAoB,EAAE,IAAI,OAAgB,MAAM;AAAA,IACnD;AACA,gBAAY,KAAKA,WAAU;AAC3B,WAAO,IAAI,SAAS,cAAc;AAAA,MAChC,QAAQ,SAAS;AAAA,MACjB,YAAY,SAAS;AAAA,MACrB,SAAS,SAAS;AAAA,IACpB,CAAC;AAAA,EACH;AAEA,QAAM,SAAS,QAAQ,SAAS,OAAO,QAAQ,OAAO,QAAQ,SAAS;AAAA,IACrE,QAAQ,QAAQ;AAAA,IAChB,SAAS,QAAQ;AAAA,IACjB,KAAK,QAAQ;AAAA,IACb,QAAQ,QAAQ;AAAA,IAChB,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,WAAW,QAAQ,oBAAoB,IAAI,KAAK;AAAA,IAChD,YAAY,QAAQ,cAAc;AAAA,IAClC,OAAO;AAAA,IACP,WAAW,CAAC,YAAY;AACtB,YAAM,WAAW,+BAA+B,SAAS,QAAQ,eAAe;AAChF,kBAAY,oBAAoB,QAAQ,EAAE,MAAM,GAAG,EAAE;AACrD,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,QAAM,QAAQ,MAAM,qBAAqB,QAAQ,QAAQ,MAAM;AAC/D,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,6BAA6B,2CAA2C;AAAA,EACpF;AACA,MAAI,YAAY,WAAW,GAAG;AAC5B,UAAM,IAAI;AAAA,MACR,oBAAoB,YAAY,MAAM;AAAA,IACxC;AAAA,EACF;AACA,QAAM,aAAa,MAAM,YAAY,CAAC;AACtC,MAAI,QAAQ,OAAO,QAAS,OAAM,WAAW;AAC7C,MAAI,CAAC,WAAW,GAAI,OAAM,WAAW;AACrC,SAAO,EAAE,MAAM,WAAW,MAAM,MAAM,aAAa,WAAW,MAAM;AACtE;;;ACvDO,SAAS,wBAAwB,SAAqE;AAC3G,SAAO,QAAQ,aAAa,sBACxB,wBAAwB,OAAO,IAC/B,0BAA0B,OAAO;AACvC;;;ACdA,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,iBAAiB;AAC1B,SAAS,OAAO,MAAM,QAAQ,IAAI,iBAAiB;AACnD,SAAS,UAAU,SAAS,YAAY;AACxC,SAAS,mBAAmB;AAGrB,IAAM,8BAA8B;AACpC,IAAM,qBAAqB,KAAK;AAYhC,IAAM,iCAAiE,OAAO,OAAO;AAAA,EAC1F,SAAS;AAAA,EACT,UAAU;AAAA,EACV,aAAa,CAAC;AAAA,EACd,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,wBAAwB;AAAA,EACxB,kBAAkB;AACpB,CAAC;AAED,IAAM,SAAS,OAAO,OAAO;AAAA,EAC3B,kBAAkB,EAAE,SAAS,KAAQ,SAAS,IAAQ;AAAA,EACtD,YAAY,EAAE,SAAS,GAAG,SAAS,EAAE;AAAA,EACrC,wBAAwB,EAAE,SAAS,KAAO,SAAS,MAAQ;AAC7D,CAAC;AAED,IAAM,gBAAgB,oBAAI,IAAI;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,4BAA4B;AAiBlC,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,aAAa,OAAgB,SAAiB,SAAkC;AACvF,SAAO,OAAO,UAAU,YAAY,OAAO,cAAc,KAAK,KAAK,SAAS,WAAW,SAAS;AAClG;AAEA,SAAS,uBAAuB,OAAwB;AACtD,SAAO,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,cAAc;AACpC,UAAM,OAAO,UAAU,YAAY,CAAC,KAAK;AACzC,WAAO,QAAQ,MAAQ,SAAS;AAAA,EAClC,CAAC;AACH;AAEA,SAAS,qBAAqB,OAAkE;AAC9F,MACE,CAAC,SAAS,KAAK,KACd,OAAO,eAAe,KAAK,MAAM,OAAO,aAAa,OAAO,eAAe,KAAK,MAAM,MACvF;AACA,WAAO;AAAA,EACT;AACA,QAAM,WAAiD,CAAC;AACxD,aAAW,CAAC,KAAK,OAAO,KAAK,OAAO,QAAQ,KAAK,GAAG;AAClD,QACE,IAAI,WAAW,KACf,IAAI,SAAS,6BACb,IAAI,KAAK,MAAM,OACf,uBAAuB,GAAG,KAC1B,cAAc,IAAI,GAAG,KACrB,QAAQ,eACR,QAAQ,iBACR,QAAQ,eACR,YAAY,sBACZ;AACA,aAAO;AAAA,IACT;AACA,aAAS,GAAG,IAAI;AAAA,EAClB;AACA,SAAO;AACT;AAEO,SAAS,8BAA8B,OAAkD;AAC9F,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO;AAC7B,MAAI,OAAO,OAAO,OAAO,SAAS,KAAK,OAAO,MAAM,YAAY,UAAW,QAAO;AAClF,MACE,OAAO,OAAO,OAAO,UAAU,KAC/B,MAAM,aAAa,UACnB,MAAM,aAAa,eACnB,MAAM,aAAa,qBACnB;AACA,WAAO;AAAA,EACT;AACA,MAAI,OAAO,OAAO,OAAO,kBAAkB,KAAK,OAAO,MAAM,qBAAqB,WAAW;AAC3F,WAAO;AAAA,EACT;AACA,MAAI,OAAO,OAAO,OAAO,aAAa,KAAK,qBAAqB,MAAM,WAAW,MAAM,OAAW,QAAO;AACzG,aAAW,CAAC,OAAO,MAAM,KAAK,OAAO,QAAQ,MAAM,GAG9C;AACH,QAAI,OAAO,OAAO,OAAO,KAAK,KAAK,CAAC,aAAa,MAAM,KAAK,GAAG,OAAO,SAAS,OAAO,OAAO,GAAG;AAC9F,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AAAA,IACL,SAAS,OAAO,MAAM,YAAY,YAAY,MAAM,UAAU,+BAA+B;AAAA,IAC7F,UACE,MAAM,aAAa,eAAe,MAAM,aAAa,sBACjD,MAAM,WACN,+BAA+B;AAAA,IACrC,aAAa,qBAAqB,MAAM,WAAW,KAAK,gBAAgB,+BAA+B,WAAW;AAAA,IAClH,kBACE,OAAO,MAAM,qBAAqB,WAC9B,MAAM,mBACN,+BAA+B;AAAA,IACrC,YAAY,OAAO,MAAM,eAAe,WAAW,MAAM,aAAa,+BAA+B;AAAA,IACrG,wBACE,OAAO,MAAM,2BAA2B,WACpC,MAAM,yBACN,+BAA+B;AAAA,IACrC,kBACE,OAAO,MAAM,qBAAqB,YAC9B,MAAM,mBACN,+BAA+B;AAAA,EACvC;AACF;AAEO,SAAS,2BAAmC;AACjD,SAAO,KAAK,YAAY,GAAG,2BAA2B;AACxD;AAEA,SAAS,QAAQ,QAA4B;AAC3C,MAAI,QAAQ,QAAS,OAAM,IAAI,aAAa,8BAA8B,YAAY;AACxF;AAEA,eAAsB,yBACpB,OAAO,yBAAyB,GAChC,QACoC;AACpC,UAAQ,MAAM;AACd,MAAI;AACF,UAAM,SAAS,MAAM,KAAK,MAAM,UAAU,WAAW,UAAU,UAAU;AACzE,QAAI;AACJ,QAAI;AACF,YAAM,QAAQ,MAAM,OAAO,KAAK;AAChC,cAAQ,MAAM;AACd,UAAI,CAAC,MAAM,OAAO,EAAG,OAAM,IAAI,MAAM,qCAAqC;AAC1E,UAAI,MAAM,OAAO,mBAAoB,OAAM,IAAI,MAAM,8BAA8B;AACnF,aAAO,MAAM,OAAO,SAAS,MAAM;AAAA,IACrC,UAAE;AACA,YAAM,OAAO,MAAM;AAAA,IACrB;AACA,YAAQ,MAAM;AACd,UAAM,WAAW,KAAK,MAAM,IAAI;AAChC,UAAM,WAAW,8BAA8B,QAAQ;AACvD,QAAI,CAAC,YAAY,CAAC,SAAS,QAAQ,EAAG,OAAM,IAAI,MAAM,kCAAkC;AACxF,WAAO,EAAE,MAAM,UAAU,MAAM,UAAU,SAAS;AAAA,EACpD,SAAS,OAAO;AACd,QAAI,QAAQ,QAAS,OAAM;AAC3B,QAAI,YAAY,KAAK,KAAK,MAAM,SAAS,UAAU;AACjD,aAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,QACA,UAAU,EAAE,GAAG,+BAA+B;AAAA,QAC9C,UAAU,CAAC;AAAA,MACb;AAAA,IACF;AACA,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,UAAU,EAAE,GAAG,+BAA+B;AAAA,MAC9C,OACE,YAAY,KAAK,KAAK,MAAM,SAAS,UACjC,oCACA,iBAAiB,QACf,MAAM,UACN,OAAO,KAAK;AAAA,IACtB;AAAA,EACF;AACF;AAEA,eAAe,UACb,MACA,OACA,QACoC;AACpC,QAAM,SAAS,MAAM,yBAAyB,MAAM,MAAM;AAC1D,MAAI,OAAO,SAAS,WAAW;AAC7B,UAAM,IAAI,MAAM,+EAA+E;AAAA,EACjG;AACA,QAAM,WAAW,EAAE,GAAG,OAAO,UAAU,GAAG,MAAM;AAChD,QAAM,WAAW,8BAA8B,QAAQ;AACvD,MAAI,CAAC,SAAU,OAAM,IAAI,MAAM,oDAAoD;AACnF,QAAM,gBAAgB,KAAK,QAAQ,IAAI,GAAG,IAAI,SAAS,IAAI,CAAC,IAAIA,YAAW,CAAC,MAAM;AAClF,QAAM,MAAM,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9C,UAAQ,MAAM;AACd,MAAI;AACF,UAAM,UAAU,eAAe,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,GAAM;AAAA,MACvE,UAAU;AAAA,MACV,MAAM;AAAA,MACN,MAAM;AAAA,IACR,CAAC;AACD,YAAQ,MAAM;AACd,UAAM,UAAU,MAAM,yBAAyB,MAAM,MAAM;AAC3D,QACE,QAAQ,SAAS,aACjB,QAAQ,SAAS,OAAO,QACxB,KAAK,UAAU,QAAQ,QAAQ,MAAM,KAAK,UAAU,OAAO,QAAQ,GACnE;AACA,YAAM,IAAI,MAAM,uEAAuE;AAAA,IACzF;AACA,UAAM,OAAO,eAAe,IAAI;AAAA,EAClC,UAAE;AACA,UAAM,GAAG,eAAe,EAAE,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM,MAAS;AAAA,EAChE;AACA,SAAO,EAAE,MAAM,UAAU,MAAM,UAAU,SAAS;AACpD;AAEO,SAAS,kCAAkC,OAAO,yBAAyB,GAAgC;AAChH,MAAI,QAAmC;AAAA,IACrC,MAAM;AAAA,IACN;AAAA,IACA,UAAU,EAAE,GAAG,+BAA+B;AAAA,IAC9C,UAAU,CAAC;AAAA,EACb;AACA,MAAI,QAAQ,QAAQ,QAAQ;AAC5B,QAAM,UAAU,CAAI,cAA4C;AAC9D,UAAM,SAAS,MAAM,KAAK,WAAW,SAAS;AAC9C,YAAQ,OAAO;AAAA,MACb,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AACA,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,KAAK,MAAM,gBAAgB,KAAK;AAAA,IAChC,QAAQ,CAAC,WACP,QAAQ,YAAY;AAClB,cAAQ,MAAM,yBAAyB,MAAM,MAAM;AACnD,aAAO,gBAAgB,KAAK;AAAA,IAC9B,CAAC;AAAA,IACH,QAAQ,CAAC,OAAO,WACd,QAAQ,YAAY;AAClB,cAAQ,MAAM,UAAU,MAAM,OAAO,MAAM;AAC3C,aAAO,gBAAgB,KAAK;AAAA,IAC9B,CAAC;AAAA,IACH,OAAO,MAAM;AAAA,EACf;AACF;AAEA,SAAS,YAAY,OAAgD;AACnE,SAAO,iBAAiB,SAAS,UAAU;AAC7C;;;ARvPA,IAAM,aAAa;AAEnB,SAAS,iBAAiB,KAAuB;AAC/C,SAAO,iBAAiB,IAAI,eAAe,UAAU,CAAC;AACxD;AAEA,SAAS,uBACP,SACA,OACA,UACS;AACT,QAAM,QAAQ,uBAAuB,OAAO,QAAQ;AACpD,SACE,MAAM,SAAS,YACf,UAAU,UACV,MAAM,QAAQ,QAAQ,OACtB,MAAM,YAAY,QAAQ,WAC1B,MAAM,OAAO,QAAQ;AAEzB;AAEA,SAAS,aAAa,OAAkD;AACtE,QAAM,SAAS,MAAM,cAAc,GAAG,EAAE,GAAG,MAAM;AACjD,QAAM,iBAAiB,oBAAoB,MAAM,eAAe,MAAM;AACtE,QAAM,YAAY,eAAe,UAAU,CAAC,UAAU,MAAM,OAAO,MAAM,YAAY,gBAAgB;AACrG,MAAI,YAAY,GAAG;AACjB,UAAM,IAAI,MAAM,8DAA8D;AAAA,EAChF;AACA,SAAO,eAAe,MAAM,SAAS,EAAE,QAAQ,6BAA6B;AAC9E;AAEA,SAAS,YAAY,IAA0B;AAC7C,QAAM,YAAY,IAAI,IAAI,GAAG,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,MAAM,IAAI,CAAC,CAAC;AAC3E,SAAO,GAAG,eAAe,EAAE,QAAQ,CAAC,SAAS;AAC3C,UAAM,OAAO,UAAU,IAAI,IAAI;AAC/B,WAAO,OACH;AAAA,MACE;AAAA,QACE,MAAM,KAAK;AAAA,QACX,aAAa,KAAK;AAAA,QAClB,YAAY,KAAK;AAAA,MACnB;AAAA,IACF,IACA,CAAC;AAAA,EACP,CAAC;AACH;AAEA,SAAS,yBACP,OACA,OACA,OAC8D;AAC9D,QAAM,SAAS,MAAM,cAAc,GAAG,EAAE,GAAG,MAAM;AACjD,QAAM,UAAU,oBAAoB,MAAM,eAAe,MAAM;AAC/D,QAAM,QAAQ,iBAAiB,MAAM,aAAa;AAClD,MAAI,CAAC,MAAO,QAAO,EAAE,UAAU,QAAQ,SAAS;AAChD,MACE,MAAM,QAAQ,QAAQ,MAAM,OAC5B,MAAM,QAAQ,YAAY,MAAM,WAChC,MAAM,QAAQ,YAAY,MAAM,IAChC;AACA,UAAM,IAAI,MAAM,qEAAqE;AAAA,EACvF;AACA,QAAM,YAAY,yBAAyB,QAAQ,UAAU,MAAM,SAAS,MAAM,MAAM,OAAO;AAC/F,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,8DAA8D;AAAA,EAChF;AACA,SAAO,EAAE,UAAU,WAAW,OAAO,MAAM,QAAQ;AACrD;AAEA,SAAS,cAAc,KAAuB,OAAgB,UAAsC;AAClG,MAAI,CAAC,IAAI,SAAS,CAAC,SAAS,iBAAkB;AAC9C,QAAM,UAAU,aAAa,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACnF,MAAI,GAAG,OAAO,qDAAqD,OAAO,IAAI,SAAS;AACzF;AAEA,SAAS,kBAAkB,KAAuB,WAAmB,QAA8B;AACjG,SAAO,CAAC,OAAO,WAAW,IAAI,eAAe,aAAa,MAAM;AAClE;AAEA,eAAe,gBACb,IACA,OACA,KACA,UACA,aACA,OACA;AACA,QAAM,QAAQ,IAAI;AAClB,QAAM,QAAQ,uBAAuB,OAAO,QAAQ;AACpD,MAAI,MAAM,SAAS,YAAY,CAAC,MAAO,QAAO;AAC9C,QAAM,SAAS,YAAY,IAAI,CAAC,MAAM,QAAQ,WAAW,CAAC;AAC1D,MAAI,OAAO,QAAS,QAAO,EAAE,QAAQ,KAAK;AAC1C,QAAM,YAAY,IAAI,eAAe,aAAa;AAClD,MAAI,GAAG,UAAU,YAAY,MAAM,aAAa,cAAc,8BAAyB,6BAAwB;AAC/G,MAAI;AACF,UAAM,OAAO,MAAM,IAAI,cAAc,oBAAoB,KAAK;AAC9D,QAAI,CAAC,kBAAkB,KAAK,WAAW,MAAM,EAAG,QAAO,EAAE,QAAQ,KAAK;AACtE,QAAI,CAAC,KAAK,GAAI,OAAM,IAAI,MAAM,KAAK,KAAK;AACxC,UAAM,WAAW,IAAI,cAAc,YAAY,MAAM,QAAQ;AAC7D,QAAI,CAAC,SAAU,OAAM,IAAI,MAAM,8CAA8C;AAC7E,UAAM,UAAU,yBAAyB,OAAO,OAAO,KAAK;AAC5D,UAAM,UAAmB;AAAA,MACvB,cAAc,IAAI,gBAAgB;AAAA,MAClC,UAAU,aAAa,QAAQ,QAAQ;AAAA,MACvC,OAAO,YAAY,EAAE;AAAA,IACvB;AACA,UAAM,WAAW,MAAM,wBAAwB;AAAA,MAC7C;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU,MAAM;AAAA,MAChB,SAAS,MAAM;AAAA,MACf,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,KAAK,KAAK;AAAA,MACV;AAAA,MACA,iBAAiB,QAAQ,QACrB;AAAA,QACE,QAAQ,iBAAiB,QAAQ,MAAM,YAAY;AAAA,QACnD,oBAAoB,QAAQ,MAAM;AAAA,MACpC,IACA;AAAA,MACJ,kBAAkB,SAAS;AAAA,MAC3B,YAAY,SAAS;AAAA,MACrB;AAAA,IACF,CAAC;AACD,QAAI,CAAC,kBAAkB,KAAK,WAAW,MAAM,EAAG,QAAO,EAAE,QAAQ,KAAK;AACtE,UAAM,qBAAqB;AAAA,MACzB,SAAS,iBAAiB,MAAM,GAAG,EAAE,KAAK,SAAS;AAAA,MACnD,SAAS;AAAA,MACT,EAAE,aAAa,SAAS,uBAAuB;AAAA,IACjD;AACA,UAAM,UAAU,wBAAwB;AAAA,MACtC,UAAU,MAAM;AAAA,MAChB,KAAK,MAAM;AAAA,MACX,SAAS,MAAM;AAAA,MACf,SAAS,MAAM;AAAA,MACf,UAAU,MAAM;AAAA,MAChB;AAAA,MACA,cAAc,aAAa,KAAK;AAAA,IAClC,CAAC;AACD,WAAO;AAAA,MACL,YAAY;AAAA,QACV,SAAS,gBAAgB,QAAQ,YAAY;AAAA,QAC7C,kBAAkB,MAAM,YAAY;AAAA,QACpC,cAAc,MAAM,YAAY;AAAA,QAChC,OAAO,SAAS;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,QAAI,OAAO,WAAW,IAAI,eAAe,aAAa,MAAM,WAAW;AACrE,aAAO,EAAE,QAAQ,KAAK;AAAA,IACxB;AACA,kBAAc,KAAK,OAAO,QAAQ;AAClC,WAAO;AAAA,EACT,UAAE;AACA,QAAI,IAAI,eAAe,aAAa,MAAM,UAAW,KAAI,GAAG,UAAU,YAAY,MAAS;AAAA,EAC7F;AACF;AAEO,SAAS,4BACd,UAA8F,CAAC,GACnE;AAC5B,SAAO,CAAC,OAAO;AACb,UAAM,mBAAmB,oBAAI,IAAY;AACzC,UAAM,kBAAkB,QAAQ,mBAAmB,kCAAkC;AACrF,QAAI,oBAAoB,IAAI,gBAAgB;AAC5C,QAAI,aAAa;AAEjB,OAAG,gBAAgB,iBAAiB;AAAA,MAClC,aAAa;AAAA,MACb,SAAS,OAAO,MAAM,QAAQ;AAC5B,YAAI,KAAK,KAAK,EAAG,OAAM,IAAI,MAAM,uBAAuB;AACxD,cAAM,kBAAkB;AACxB,cAAM,aAAa;AACnB,cAAM,EAAE,qBAAqB,IAAI,MAAM,OAAO,oCAAoB;AAClE,YAAI,oBAAoB,cAAc,WAAW,OAAO,QAAS;AACjE,cAAM,qBAAqB,iBAAiB,KAAK;AAAA,UAC/C,QAAQ,WAAW;AAAA,UACnB,WAAW,MAAM,oBAAoB,cAAc,CAAC,WAAW,OAAO;AAAA,QACxE,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,OAAG,GAAG,iBAAiB,OAAO,QAAQ,QAAQ;AAC5C,wBAAkB,MAAM;AACxB,0BAAoB,IAAI,gBAAgB;AACxC,oBAAc;AACd,YAAM,kBAAkB;AACxB,YAAM,YAAY,IAAI,eAAe,aAAa;AAClD,uBAAiB,MAAM;AACvB,UAAI;AACJ,UAAI;AACF,gBAAQ,MAAM,gBAAgB,OAAO,kBAAkB,MAAM;AAAA,MAC/D,SAAS,OAAO;AACd,YAAI,kBAAkB,OAAO,WAAW,oBAAoB,WAAY;AACxE,YAAI,IAAI,OAAO;AACb,cAAI,GAAG;AAAA,YACL,yDAAyD,aAAa,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,CAAC;AAAA,YAC7H;AAAA,UACF;AAAA,QACF;AACA;AAAA,MACF;AACA,UACE,kBAAkB,OAAO,WACzB,oBAAoB,cACpB,IAAI,eAAe,aAAa,MAAM,WACtC;AACA;AAAA,MACF;AACA,UAAI,IAAI,SAAS,MAAM,SAAS,WAAW;AACzC,YAAI,GAAG;AAAA,UACL,yEAAyE,aAAa,MAAM,SAAS,0BAA0B,CAAC;AAAA,UAChI;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,OAAG;AAAA,MAAG;AAAA,MAA0B,CAAC,OAAO,QACtC,gBAAgB,IAAI,OAAO,KAAK,gBAAgB,IAAI,EAAE,UAAU,kBAAkB,QAAQ,QAAQ,KAAK;AAAA,IACzG;AAEA,OAAG,GAAG,WAAW,CAAC,OAAO,QAAQ;AAC/B,UAAI,CAAC,gBAAgB,IAAI,EAAE,SAAS,QAAS,QAAO;AACpD,YAAM,WAAW,gBAAgB,IAAI,EAAE;AACvC,YAAM,aAAa,iBAAiB,GAAG;AACvC,UAAI,CAAC,cAAc,CAAC,uBAAuB,WAAW,SAAS,IAAI,OAAO,QAAQ,EAAG,QAAO;AAC5F,YAAM,WAAW,yBAAyB,MAAM,UAAU,WAAW,SAAS,WAAW,MAAM,OAAO;AACtG,aAAO,WAAW,EAAE,SAAS,IAAI;AAAA,IACnC,CAAC;AAED,OAAG,GAAG,2BAA2B,CAAC,OAAO,QAAQ;AAC/C,UAAI,CAAC,gBAAgB,IAAI,EAAE,SAAS,QAAS,QAAO;AACpD,YAAM,WAAW,gBAAgB,IAAI,EAAE;AACvC,YAAM,aAAa,iBAAiB,GAAG;AACvC,UAAI,CAAC,cAAc,CAAC,uBAAuB,WAAW,SAAS,IAAI,OAAO,QAAQ,EAAG,QAAO;AAC5F,YAAM,SAAS,iBAAiB,WAAW,QAAQ,YAAY;AAC/D,UAAI,CAAC,oBAAoB,MAAM,SAAS,MAAM,EAAG,QAAO;AACxD,aAAO,wBAAwB,MAAM,SAAS,QAAQ,WAAW,QAAQ,kBAAkB;AAAA,IAC7F,CAAC;AAED,OAAG,GAAG,gBAAgB,CAAC,OAAO,QAAQ;AACpC,UAAI,CAAC,gBAAgB,IAAI,EAAE,SAAS,QAAS;AAC7C,YAAM,WAAW,gBAAgB,IAAI,EAAE;AACvC,YAAM,aAAa,iBAAiB,GAAG;AACvC,UAAI,CAAC,cAAc,uBAAuB,WAAW,SAAS,MAAM,OAAO,QAAQ,EAAG;AACtF,YAAM,MAAM,GAAG,IAAI,eAAe,aAAa,CAAC,IAAI,MAAM,MAAM,QAAQ,IAAI,MAAM,MAAM,EAAE;AAC1F,UAAI,iBAAiB,IAAI,GAAG,EAAG;AAC/B,uBAAiB,IAAI,GAAG;AACxB,UAAI,IAAI,OAAO;AACb,YAAI,GAAG;AAAA,UACL;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,OAAG,GAAG,oBAAoB,OAAO,QAAQ,QAAQ;AAC/C,oBAAc;AACd,wBAAkB,MAAM;AACxB,uBAAiB,MAAM;AACvB,UAAI,GAAG,UAAU,YAAY,MAAS;AACtC,YAAM,gBAAgB,MAAM;AAAA,IAC9B,CAAC;AAAA,EACH;AACF;AAEA,IAAO,wBAAQ,4BAA4B;",
6
+ "names": ["item", "index", "isObject", "inspection", "randomUUID"]
7
7
  }
package/package.json CHANGED
@@ -1,59 +1,55 @@
1
1
  {
2
- "name": "@narumitw/pi-codex-compact",
3
- "version": "0.51.3",
4
- "description": "Codex Remote Compaction V2 for compatible Pi providers.",
5
- "type": "module",
6
- "license": "MIT",
7
- "private": false,
8
- "keywords": [
9
- "pi-package",
10
- "pi-extension",
11
- "pi",
12
- "codex",
13
- "compaction",
14
- "openai"
15
- ],
16
- "files": [
17
- "src",
18
- "dist",
19
- "README.md",
20
- "LICENSE"
21
- ],
22
- "pi": {
23
- "extensions": [
24
- "./dist/index.ts"
25
- ]
26
- },
27
- "piExtension": {
28
- "lifecycle": "stable"
29
- },
30
- "scripts": {
31
- "build": "node scripts/build-runtime.mjs",
32
- "check": "npm run build && biome check --vcs-use-ignore-file=false src test scripts package.json tsconfig.json README.md && npm run typecheck",
33
- "format": "biome check --write --vcs-use-ignore-file=false src test scripts package.json tsconfig.json README.md",
34
- "prepack": "npm run build",
35
- "typecheck": "tsc --noEmit"
36
- },
37
- "dependencies": {
38
- "@narumitw/pi-tui-kit": "^0.59.0"
39
- },
40
- "peerDependencies": {
41
- "@earendil-works/pi-agent-core": "*",
42
- "@earendil-works/pi-ai": "*",
43
- "@earendil-works/pi-coding-agent": "*"
44
- },
45
- "devDependencies": {
46
- "@biomejs/biome": "2.5.10",
47
- "@earendil-works/pi-agent-core": "0.84.3",
48
- "@earendil-works/pi-ai": "0.84.3",
49
- "@earendil-works/pi-coding-agent": "0.84.3",
50
- "@types/node": "26.2.0",
51
- "esbuild": "0.28.2",
52
- "typescript": "7.0.2"
53
- },
54
- "repository": {
55
- "type": "git",
56
- "url": "https://github.com/narumiruna/pi-extensions",
57
- "directory": "packages/pi-codex-compact"
58
- }
2
+ "name": "@narumitw/pi-codex-compact",
3
+ "version": "0.53.0",
4
+ "description": "Responses compaction protocols for compatible Pi providers.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "private": false,
8
+ "keywords": [
9
+ "pi-package",
10
+ "pi-extension",
11
+ "pi",
12
+ "codex",
13
+ "compaction",
14
+ "openai"
15
+ ],
16
+ "files": [
17
+ "src",
18
+ "dist",
19
+ "README.md",
20
+ "LICENSE"
21
+ ],
22
+ "pi": {
23
+ "extensions": [
24
+ "./dist/index.ts"
25
+ ]
26
+ },
27
+ "scripts": {
28
+ "build": "node scripts/build-runtime.mjs",
29
+ "check": "npm run build && biome check --vcs-use-ignore-file=false src test scripts package.json tsconfig.json README.md && npm run typecheck",
30
+ "format": "biome check --write --vcs-use-ignore-file=false src test scripts package.json tsconfig.json README.md",
31
+ "prepack": "npm run build",
32
+ "typecheck": "tsc --noEmit"
33
+ },
34
+ "dependencies": {
35
+ "@narumitw/pi-tui-kit": "^0.59.0"
36
+ },
37
+ "peerDependencies": {
38
+ "@earendil-works/pi-agent-core": "*",
39
+ "@earendil-works/pi-ai": "*",
40
+ "@earendil-works/pi-coding-agent": "*"
41
+ },
42
+ "devDependencies": {
43
+ "@earendil-works/pi-agent-core": "0.85.1",
44
+ "@earendil-works/pi-ai": "0.85.1",
45
+ "@earendil-works/pi-coding-agent": "0.85.1",
46
+ "@types/node": "26.4.1",
47
+ "esbuild": "0.28.2",
48
+ "typescript": "7.0.2"
49
+ },
50
+ "repository": {
51
+ "type": "git",
52
+ "url": "https://github.com/narumiruna/pi-extensions",
53
+ "directory": "packages/pi-codex-compact"
54
+ }
59
55
  }