@ponythewhite/base-context 1.0.9 → 1.0.11
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/CHANGELOG.md +19 -0
- package/dist/base-context-runtime/pyproject.toml +1 -1
- package/dist/base-context-runtime/uv.lock +1 -1
- package/dist/build-info.json +1 -1
- package/dist/bundle/{bundled-modules-5JRM6P4T.js → bundled-modules-PEFT72QN.js} +2 -2
- package/dist/bundle/{chunk-VVI3UKGR.js → chunk-JZHGOOFM.js} +87 -57
- package/dist/bundle/{chunk-NEHLB7JV.js → chunk-TOOVREMP.js} +596 -102
- package/dist/bundle/{cli-main-YUDBEYE2.js → cli-main-BRXGYTGK.js} +2 -2
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/{main-ZLGGAAGU.js → main-POUXGEL6.js} +2 -2
- package/dist/core/agent-session.d.ts +0 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +85 -45
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/canonical-context.d.ts +19 -3
- package/dist/core/canonical-context.d.ts.map +1 -1
- package/dist/core/canonical-context.js +245 -39
- package/dist/core/canonical-context.js.map +1 -1
- package/dist/core/context-epoch-copy.d.ts +1 -1
- package/dist/core/context-epoch-copy.d.ts.map +1 -1
- package/dist/core/context-epoch-copy.js +18 -7
- package/dist/core/context-epoch-copy.js.map +1 -1
- package/dist/core/context-epoch.d.ts +18 -3
- package/dist/core/context-epoch.d.ts.map +1 -1
- package/dist/core/context-epoch.js +13 -2
- package/dist/core/context-epoch.js.map +1 -1
- package/dist/core/context-tree.d.ts +1 -1
- package/dist/core/context-tree.d.ts.map +1 -1
- package/dist/core/context-tree.js +98 -8
- package/dist/core/context-tree.js.map +1 -1
- package/dist/core/history-index-worker.d.ts.map +1 -1
- package/dist/core/history-index-worker.js +59 -6
- package/dist/core/history-index-worker.js.map +1 -1
- package/dist/core/history-index.d.ts +17 -0
- package/dist/core/history-index.d.ts.map +1 -1
- package/dist/core/history-index.js +22 -0
- package/dist/core/history-index.js.map +1 -1
- package/dist/core/inference-coordinator.d.ts.map +1 -1
- package/dist/core/inference-coordinator.js +5 -1
- package/dist/core/inference-coordinator.js.map +1 -1
- package/dist/core/public-context.d.ts.map +1 -1
- package/dist/core/public-context.js +20 -8
- package/dist/core/public-context.js.map +1 -1
- package/dist/core/request-view-selection.d.ts +2 -1
- package/dist/core/request-view-selection.d.ts.map +1 -1
- package/dist/core/request-view-selection.js +29 -2
- package/dist/core/request-view-selection.js.map +1 -1
- package/dist/core/session-fork-messages.d.ts +5 -0
- package/dist/core/session-fork-messages.d.ts.map +1 -1
- package/dist/core/session-fork-messages.js +44 -0
- package/dist/core/session-fork-messages.js.map +1 -1
- package/dist/core/session-history-index.d.ts +5 -0
- package/dist/core/session-history-index.d.ts.map +1 -1
- package/dist/core/session-history-index.js +7 -0
- package/dist/core/session-history-index.js.map +1 -1
- package/dist/core/session-manager.d.ts +2 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +155 -13
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-tree.d.ts +9 -0
- package/dist/core/session-tree.d.ts.map +1 -1
- package/dist/core/session-tree.js +71 -11
- package/dist/core/session-tree.js.map +1 -1
- package/dist/modes/agent-connection/in-process-agent-connection.d.ts.map +1 -1
- package/dist/modes/agent-connection/in-process-agent-connection.js +4 -4
- package/dist/modes/agent-connection/in-process-agent-connection.js.map +1 -1
- package/dist/modes/daemon/daemon-mode.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-mode.js +19 -34
- package/dist/modes/daemon/daemon-mode.js.map +1 -1
- package/dist/modes/daemon/daemon-socket.d.ts +5 -0
- package/dist/modes/daemon/daemon-socket.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-socket.js +19 -0
- package/dist/modes/daemon/daemon-socket.js.map +1 -1
- package/dist/modes/daemon/daemon-supervisor.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-supervisor.js +6 -7
- package/dist/modes/daemon/daemon-supervisor.js.map +1 -1
- package/dist/modes/daemon/daemon-worker-client.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-worker-client.js +5 -5
- package/dist/modes/daemon/daemon-worker-client.js.map +1 -1
- package/package.json +4 -4
|
@@ -16,7 +16,7 @@ export interface CapturedEpochCopy {
|
|
|
16
16
|
}
|
|
17
17
|
export declare function captureEpochCopyEntry(entry: SessionEntry, source: Omit<CopiedEpochEntry, "updateTarget">): CopiedEpochEntry;
|
|
18
18
|
/** Rebuild only at the explicit copy boundary; later provider reads remain destination-only. */
|
|
19
|
-
export declare function rebuildCopiedContextEpoch(history: SessionHistoryReadScope, copied: CapturedEpochCopy, limits: SessionHistoryReadLimits): Promise<{
|
|
19
|
+
export declare function rebuildCopiedContextEpoch(history: SessionHistoryReadScope, copied: CapturedEpochCopy, limits: SessionHistoryReadLimits, metadataMaxBytes?: number): Promise<{
|
|
20
20
|
checkpoint: ContextEpochCheckpoint;
|
|
21
21
|
tokensBefore: number | null;
|
|
22
22
|
summary?: ContextEpochSummary;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-epoch-copy.d.ts","sourceRoot":"","sources":["../../src/core/context-epoch-copy.ts"],"names":[],"mappings":"AAEA,OAAO,EAEN,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EAIxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAElF,OAAO,EAEN,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAE5B,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAIzD,eAAO,MAAM,qBAAqB,eAAkC,CAAC;AAErE,6FAA6F;AAC7F,MAAM,WAAW,gBAChB,SAAQ,IAAI,CACX,kBAAkB,EAClB,IAAI,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,GAAG,eAAe,CAChG;IACD,QAAQ,CAAC,YAAY,CAAC,EAAE,mBAAmB,CAAC;CAC5C;AACD,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC9C,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,qBAAqB,CACpC,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE,cAAc,CAAC,GAC5C,gBAAgB,CAoBlB;AAED,gGAAgG;AAChG,wBAAsB,yBAAyB,CAC9C,OAAO,EAAE,uBAAuB,EAChC,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,wBAAwB,GAC9B,OAAO,CACT;IAAE,UAAU,EAAE,sBAAsB,CAAC;IAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,mBAAmB,CAAA;CAAE,GAAG,SAAS,CAC9G,CAqLA","sourcesContent":["import { isDeepStrictEqual } from \"node:util\";\nimport { stringifyBoundedJson } from \"./bounded-json.js\";\nimport {\n\tCONTEXT_EPOCH_DETAIL,\n\ttype ContextEpochCheckpoint,\n\ttype ContextEpochSummary,\n\ttype EpochViewReference,\n\treadContextEpoch,\n\tsnapshotContextEpoch,\n} from \"./context-epoch.js\";\nimport type { ContextUpdateTarget, IndexedSourceEvent } from \"./history-index.js\";\nimport type { SourceSnapshotRef } from \"./request-events.js\";\nimport {\n\thydrateCapturedHistoryEntry,\n\ttype SessionHistoryReadLimits,\n\ttype SessionHistoryReadScope,\n\ttype SessionHistoryReadView,\n} from \"./session-history-index.js\";\nimport type { SessionEntry } from \"./session-manager.js\";\nimport { compileTaskFrame, taskFrameLimits } from \"./task-frame.js\";\nimport { readTaskStateFromView } from \"./task-state-reader.js\";\n\nexport const readCopiedEpochSource = Symbol(\"readCopiedEpochSource\");\n\n/** Operation-local metadata from the actual old capture, not another body or epoch store. */\nexport interface CopiedEpochEntry\n\textends Pick<\n\t\tIndexedSourceEvent,\n\t\t\"id\" | \"parentId\" | \"kind\" | \"sequence\" | \"revision\" | \"locator\" | \"retention\" | \"qualification\"\n\t> {\n\treadonly updateTarget?: ContextUpdateTarget;\n}\nexport interface CapturedEpochCopy {\n\treadonly sessionId: string;\n\treadonly sessionFile?: string;\n\treadonly through: number;\n\treadonly entries: readonly CopiedEpochEntry[];\n\treadonly retained: boolean;\n}\n\nexport function captureEpochCopyEntry(\n\tentry: SessionEntry,\n\tsource: Omit<CopiedEpochEntry, \"updateTarget\">,\n): CopiedEpochEntry {\n\tconst updateTarget: ContextUpdateTarget | undefined =\n\t\tentry.type === \"message\"\n\t\t\t? entry.message.role === \"assistant\"\n\t\t\t\t? { kind: \"assistant-usage\", targetId: entry.id }\n\t\t\t\t: entry.message.role === \"toolResult\" && entry.message.toolName === \"ipython\"\n\t\t\t\t\t? { kind: \"ipython-sent-message\", toolCallId: entry.message.toolCallId }\n\t\t\t\t\t: undefined\n\t\t\t: undefined;\n\treturn {\n\t\tid: source.id,\n\t\tparentId: source.parentId,\n\t\tkind: source.kind,\n\t\tsequence: source.sequence,\n\t\trevision: source.revision,\n\t\tlocator: { ...source.locator },\n\t\tretention: source.retention,\n\t\tqualification: source.qualification,\n\t\t...(updateTarget ? { updateTarget } : {}),\n\t};\n}\n\n/** Rebuild only at the explicit copy boundary; later provider reads remain destination-only. */\nexport async function rebuildCopiedContextEpoch(\n\thistory: SessionHistoryReadScope,\n\tcopied: CapturedEpochCopy,\n\tlimits: SessionHistoryReadLimits,\n): Promise<\n\t{ checkpoint: ContextEpochCheckpoint; tokensBefore: number | null; summary?: ContextEpochSummary } | undefined\n> {\n\tconst view = history.branchContext;\n\tconst manifest = await view.contextManifest({ limit: 1 });\n\tif (manifest.selection !== \"known\") throw new Error(\"Copied context selection is unavailable\");\n\tconst selected = manifest.summaryRef;\n\tif (!selected) return;\n\tconst metadata = await view.get(selected.entryId);\n\tif (!metadata) throw new Error(\"Copied context summary source is unavailable\");\n\tconst hydrated = await hydrateCapturedHistoryEntry(metadata, limits.maxSourceBytes, view.readPayload);\n\tif (!hydrated || hydrated.entry.type !== \"compaction\") throw new Error(\"Copied context summary is unavailable\");\n\tconst entry = hydrated.entry;\n\tif (!entry.details || typeof entry.details !== \"object\" || !(CONTEXT_EPOCH_DETAIL in entry.details)) return;\n\tconst oldById = new Map<string, CopiedEpochEntry>();\n\tfor (const source of copied.entries) if (!oldById.has(source.id)) oldById.set(source.id, source);\n\tconst origin = oldById.get(entry.id);\n\tif (origin?.qualification !== \"native-context-epoch\" || hydrated.source.qualification !== \"native-context-epoch\")\n\t\tthrow new Error(\"Copied context epoch has no qualified source\");\n\tconst checkpoint = readContextEpoch(entry.details, limits.maxSourceBytes);\n\tif (checkpoint?.version === 6 || checkpoint?.version === 8)\n\t\tthrow new Error(\"Tool continuation recipes require their original native execution source\");\n\tif (!checkpoint || checkpoint.literalTailId !== entry.firstKeptEntryId || !view.atSnapshot)\n\t\tthrow new Error(\"Copied context epoch boundary is unavailable\");\n\tif (copied.entries.length > limits.maxEntries || checkpoint.views.length > limits.maxEntries)\n\t\tthrow new Error(\"Copied context epoch item budget exceeded\");\n\tstringifyBoundedJson(copied, limits.maxSourceBytes);\n\tconst oldByRevision = new Map([...oldById.values()].map((source) => [source.revision, source]));\n\tconst destination = new Map<string, IndexedSourceEvent>();\n\tfor (const source of oldById.values()) {\n\t\tconst actual = await history.get(source.id);\n\t\tif (actual) destination.set(source.id, actual);\n\t}\n\tconst prefixViews = new Map<string, SessionHistoryReadView>();\n\tconst prefix = async (source: SourceSnapshotRef): Promise<SessionHistoryReadView> => {\n\t\tif (\n\t\t\tsource.sessionId !== copied.sessionId ||\n\t\t\tsource.sessionFile !== copied.sessionFile ||\n\t\t\t!source.persistent ||\n\t\t\t!Number.isSafeInteger(source.sourceSequence) ||\n\t\t\tsource.sourceSequence < 0 ||\n\t\t\tsource.sourceSequence > copied.through\n\t\t)\n\t\t\tthrow new Error(\"Copied epoch recipe is outside the captured old source\");\n\t\tconst key = JSON.stringify(source);\n\t\tconst existing = prefixViews.get(key);\n\t\tif (existing) return existing;\n\t\tlet leafId = source.leafId;\n\t\tif (leafId !== null && (!oldById.has(leafId) || oldById.get(leafId)!.sequence > source.sourceSequence))\n\t\t\tthrow new Error(\"Copied epoch leaf is outside its captured prefix\");\n\t\tconst seen = new Set<string>();\n\t\twhile (leafId !== null && !destination.has(leafId)) {\n\t\t\tif (seen.has(leafId)) throw new Error(\"Copied epoch parent path is unresolved\");\n\t\t\tseen.add(leafId);\n\t\t\tconst old = oldById.get(leafId);\n\t\t\tif (!old) throw new Error(\"Copied epoch parent source is unavailable\");\n\t\t\tleafId = old.parentId;\n\t\t}\n\t\tconst rows = [...oldById.values()]\n\t\t\t.filter((old) => old.sequence <= source.sourceSequence)\n\t\t\t.flatMap((old) => {\n\t\t\t\tconst actual = destination.get(old.id);\n\t\t\t\treturn actual ? [actual] : [];\n\t\t\t});\n\t\tconst last = rows.reduce<IndexedSourceEvent | undefined>(\n\t\t\t(previous, actual) => (!previous || actual.sequence > previous.sequence ? actual : previous),\n\t\t\tundefined,\n\t\t);\n\t\tif (!last) throw new Error(\"Copied epoch prefix has no preserved source\");\n\t\tconst narrowed = await view.atSnapshot!({ ...view.source, leafId, sourceSequence: last.sequence });\n\t\tprefixViews.set(key, narrowed);\n\t\treturn narrowed;\n\t};\n\tawait prefix(checkpoint.source);\n\tconst copyReference = async <\n\t\tT extends EpochViewReference | NonNullable<ContextEpochCheckpoint[\"selectedSkills\"]>[number][\"view\"],\n\t>(\n\t\tpinned: T,\n\t): Promise<T> => {\n\t\tconst old = oldById.get(pinned.ref.entryId);\n\t\tif (\n\t\t\t!old ||\n\t\t\told.revision !== pinned.ref.revision ||\n\t\t\told.sequence !== pinned.ref.sequence ||\n\t\t\told.kind !== pinned.ref.kind ||\n\t\t\t!isDeepStrictEqual(old.locator, pinned.ref.locator)\n\t\t)\n\t\t\tthrow new Error(\"Copied epoch recipe does not match its captured source\");\n\t\tconst read = await prefix(pinned.source);\n\t\tconst actual = await read.get(old.id);\n\t\tif (!actual || actual.kind !== old.kind) throw new Error(\"Copied epoch view source is unavailable\");\n\t\tconst ref = {\n\t\t\tentryId: actual.id,\n\t\t\tsequence: actual.sequence,\n\t\t\tkind: pinned.ref.kind,\n\t\t\tlocator: { ...actual.locator },\n\t\t\trevision: actual.revision,\n\t\t\tauthority: actual.authority,\n\t\t\tqualification: actual.qualification,\n\t\t\tretention: actual.retention,\n\t\t};\n\t\tlet sourceRevision = actual.revision;\n\t\tif (ref.kind !== \"compaction\") {\n\t\t\tconst original: unknown = JSON.parse(pinned.sourceRevision);\n\t\t\tif (\n\t\t\t\t!Array.isArray(original) ||\n\t\t\t\toriginal[0] !== old.revision ||\n\t\t\t\toriginal.some((revision) => typeof revision !== \"string\")\n\t\t\t)\n\t\t\t\tthrow new Error(\"Copied epoch frozen revisions are unavailable\");\n\t\t\tconst updates = old.updateTarget ? (await read.contextUpdates(old.updateTarget)).refs : [];\n\t\t\tconst expected = original.slice(1).map((revision) => oldByRevision.get(revision));\n\t\t\tif (\n\t\t\t\texpected.some((source) => !source || source.sequence > pinned.source.sourceSequence) ||\n\t\t\t\t!isDeepStrictEqual(\n\t\t\t\t\texpected.map((source) => source!.id),\n\t\t\t\t\tupdates.map((source) => source.entryId),\n\t\t\t\t)\n\t\t\t)\n\t\t\t\tthrow new Error(\"Copied epoch update sources were not preserved\");\n\t\t\tsourceRevision = JSON.stringify([actual.revision, ...updates.map((update) => update.revision)]);\n\t\t} else if (pinned.sourceRevision !== old.revision || pinned.retainedMessageCount === undefined) {\n\t\t\tthrow new Error(\"Copied epoch summary source is unavailable\");\n\t\t}\n\t\treturn {\n\t\t\tsource: read.source,\n\t\t\tref,\n\t\t\tsourceRevision,\n\t\t\t...(pinned.retainedMessageCount === undefined ? {} : { retainedMessageCount: pinned.retainedMessageCount }),\n\t\t\t...(pinned.rendering === undefined ? {} : { rendering: pinned.rendering }),\n\t\t} as T;\n\t};\n\tconst views: EpochViewReference[] = [];\n\tfor (const pinned of checkpoint.views) views.push(await copyReference(pinned));\n\tconst selectedSkills: Array<NonNullable<ContextEpochCheckpoint[\"selectedSkills\"]>[number]> | undefined =\n\t\tcheckpoint.selectedSkills ? [] : undefined;\n\tfor (const skill of checkpoint.selectedSkills ?? [])\n\t\tselectedSkills!.push({ name: skill.name, view: await copyReference(skill.view) });\n\tif (!(await view.get(checkpoint.literalTailId))) throw new Error(\"Copied epoch literal tail is unavailable\");\n\tconst tasks = await readTaskStateFromView(view, {\n\t\tmaxItems: limits.maxEntries,\n\t\tmaxSourceBytes: limits.maxSourceBytes,\n\t\tmaxViewBytes: limits.maxSourceBytes,\n\t});\n\tconst taskFrame = compileTaskFrame(tasks, taskFrameLimits({ maxBytes: Math.min(16_384, limits.maxSourceBytes) }));\n\tconst lowered =\n\t\tcopied.retained || origin.retention === \"retained-import\" || hydrated.source.retention === \"retained-import\";\n\tconst inherited =\n\t\tcheckpoint.version === 5 && lowered ? { ...checkpoint, pendingRequestContract: undefined } : checkpoint;\n\tconst { replayContract, publicWindow: _publicWindow, continuation, ...unchanged } = inherited;\n\tconst rebuiltContinuation = continuation\n\t\t? {\n\t\t\t\tkind: continuation.kind,\n\t\t\t\tpublicTailThrough: (await prefix(continuation.publicTailThrough)).source,\n\t\t\t}\n\t\t: undefined;\n\tconst rebuilt = snapshotContextEpoch(\n\t\t{\n\t\t\t...unchanged,\n\t\t\tsource: view.source,\n\t\t\tviews,\n\t\t\t...(selectedSkills?.length ? { selectedSkills } : {}),\n\t\t\ttaskFrame,\n\t\t\tresourceRevision: undefined, // Explicit copies must capture their destination owner anew.\n\t\t\t...(rebuiltContinuation ? { continuation: rebuiltContinuation } : {}),\n\t\t\t...(!lowered && replayContract !== undefined ? { replayContract } : {}),\n\t\t},\n\t\tlimits.maxSourceBytes,\n\t);\n\treturn {\n\t\tcheckpoint: rebuilt,\n\t\ttokensBefore: entry.tokensBefore,\n\t\t...(checkpoint.includeSummary\n\t\t\t? {\n\t\t\t\t\tsummary: {\n\t\t\t\t\t\tsummary: entry.summary,\n\t\t\t\t\t\tdetails: { ...entry.details },\n\t\t\t\t\t\tfromHook: entry.fromHook,\n\t\t\t\t\t\tcustomInstructions: entry.customInstructions, // The copied original alone retains its model usage.\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"context-epoch-copy.d.ts","sourceRoot":"","sources":["../../src/core/context-epoch-copy.ts"],"names":[],"mappings":"AAEA,OAAO,EAEN,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EAIxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAElF,OAAO,EAEN,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAE5B,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAIzD,eAAO,MAAM,qBAAqB,eAAkC,CAAC;AAErE,6FAA6F;AAC7F,MAAM,WAAW,gBAChB,SAAQ,IAAI,CACX,kBAAkB,EAClB,IAAI,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,GAAG,eAAe,CAChG;IACD,QAAQ,CAAC,YAAY,CAAC,EAAE,mBAAmB,CAAC;CAC5C;AACD,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC9C,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,qBAAqB,CACpC,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE,cAAc,CAAC,GAC5C,gBAAgB,CAoBlB;AAED,gGAAgG;AAChG,wBAAsB,yBAAyB,CAC9C,OAAO,EAAE,uBAAuB,EAChC,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,wBAAwB,EAChC,gBAAgB,SAAwB,GACtC,OAAO,CACT;IAAE,UAAU,EAAE,sBAAsB,CAAC;IAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,mBAAmB,CAAA;CAAE,GAAG,SAAS,CAC9G,CA6LA","sourcesContent":["import { isDeepStrictEqual } from \"node:util\";\nimport { stringifyBoundedJson } from \"./bounded-json.js\";\nimport {\n\tCONTEXT_EPOCH_DETAIL,\n\ttype ContextEpochCheckpoint,\n\ttype ContextEpochSummary,\n\ttype EpochViewReference,\n\treadContextEpoch,\n\tsnapshotContextEpoch,\n} from \"./context-epoch.js\";\nimport type { ContextUpdateTarget, IndexedSourceEvent } from \"./history-index.js\";\nimport type { SourceSnapshotRef } from \"./request-events.js\";\nimport {\n\thydrateCapturedHistoryEntry,\n\ttype SessionHistoryReadLimits,\n\ttype SessionHistoryReadScope,\n\ttype SessionHistoryReadView,\n} from \"./session-history-index.js\";\nimport type { SessionEntry } from \"./session-manager.js\";\nimport { compileTaskFrame, taskFrameLimits } from \"./task-frame.js\";\nimport { readTaskStateFromView } from \"./task-state-reader.js\";\n\nexport const readCopiedEpochSource = Symbol(\"readCopiedEpochSource\");\n\n/** Operation-local metadata from the actual old capture, not another body or epoch store. */\nexport interface CopiedEpochEntry\n\textends Pick<\n\t\tIndexedSourceEvent,\n\t\t\"id\" | \"parentId\" | \"kind\" | \"sequence\" | \"revision\" | \"locator\" | \"retention\" | \"qualification\"\n\t> {\n\treadonly updateTarget?: ContextUpdateTarget;\n}\nexport interface CapturedEpochCopy {\n\treadonly sessionId: string;\n\treadonly sessionFile?: string;\n\treadonly through: number;\n\treadonly entries: readonly CopiedEpochEntry[];\n\treadonly retained: boolean;\n}\n\nexport function captureEpochCopyEntry(\n\tentry: SessionEntry,\n\tsource: Omit<CopiedEpochEntry, \"updateTarget\">,\n): CopiedEpochEntry {\n\tconst updateTarget: ContextUpdateTarget | undefined =\n\t\tentry.type === \"message\"\n\t\t\t? entry.message.role === \"assistant\"\n\t\t\t\t? { kind: \"assistant-usage\", targetId: entry.id }\n\t\t\t\t: entry.message.role === \"toolResult\" && entry.message.toolName === \"ipython\"\n\t\t\t\t\t? { kind: \"ipython-sent-message\", toolCallId: entry.message.toolCallId }\n\t\t\t\t\t: undefined\n\t\t\t: undefined;\n\treturn {\n\t\tid: source.id,\n\t\tparentId: source.parentId,\n\t\tkind: source.kind,\n\t\tsequence: source.sequence,\n\t\trevision: source.revision,\n\t\tlocator: { ...source.locator },\n\t\tretention: source.retention,\n\t\tqualification: source.qualification,\n\t\t...(updateTarget ? { updateTarget } : {}),\n\t};\n}\n\n/** Rebuild only at the explicit copy boundary; later provider reads remain destination-only. */\nexport async function rebuildCopiedContextEpoch(\n\thistory: SessionHistoryReadScope,\n\tcopied: CapturedEpochCopy,\n\tlimits: SessionHistoryReadLimits,\n\tmetadataMaxBytes = limits.maxSourceBytes,\n): Promise<\n\t{ checkpoint: ContextEpochCheckpoint; tokensBefore: number | null; summary?: ContextEpochSummary } | undefined\n> {\n\tconst view = history.branchContext;\n\tconst manifest = await view.contextManifest({ limit: 1 });\n\tif (manifest.selection !== \"known\") throw new Error(\"Copied context selection is unavailable\");\n\tconst selected = manifest.summaryRef;\n\tif (!selected) return;\n\tconst metadata = await view.get(selected.entryId);\n\tif (!metadata) throw new Error(\"Copied context summary source is unavailable\");\n\tconst hydrated = await hydrateCapturedHistoryEntry(metadata, limits.maxSourceBytes, view.readPayload);\n\tif (!hydrated || hydrated.entry.type !== \"compaction\") throw new Error(\"Copied context summary is unavailable\");\n\tconst entry = hydrated.entry;\n\tif (!entry.details || typeof entry.details !== \"object\" || !(CONTEXT_EPOCH_DETAIL in entry.details)) return;\n\tconst oldById = new Map<string, CopiedEpochEntry>();\n\tfor (const source of copied.entries) if (!oldById.has(source.id)) oldById.set(source.id, source);\n\tconst origin = oldById.get(entry.id);\n\tif (origin?.qualification !== \"native-context-epoch\" || hydrated.source.qualification !== \"native-context-epoch\")\n\t\tthrow new Error(\"Copied context epoch has no qualified source\");\n\tconst checkpoint = readContextEpoch(entry.details, limits.maxSourceBytes);\n\tif (checkpoint?.version === 6 || checkpoint?.version === 8)\n\t\tthrow new Error(\"Tool continuation recipes require their original native execution source\");\n\tif (!checkpoint || checkpoint.literalTailId !== entry.firstKeptEntryId || !view.atSnapshot)\n\t\tthrow new Error(\"Copied context epoch boundary is unavailable\");\n\tif (checkpoint.views.length > limits.maxEntries) throw new Error(\"Copied context epoch item budget exceeded\");\n\tstringifyBoundedJson(copied, metadataMaxBytes);\n\tconst oldByRevision = new Map([...oldById.values()].map((source) => [source.revision, source]));\n\tconst destination = new Map<string, IndexedSourceEvent>();\n\tlet after = 0;\n\tfor (;;) {\n\t\tconst page = await history.page(after, 128);\n\t\tif (page.indexedThrough < history.source.sourceSequence)\n\t\t\tthrow new Error(\"Copied context destination has incomplete index coverage\");\n\t\tfor (const actual of page.events) {\n\t\t\tif (!oldById.has(actual.id)) continue;\n\t\t\tif (destination.size >= limits.maxEntries) throw new Error(\"Copied context epoch item budget exceeded\");\n\t\t\tdestination.set(actual.id, actual);\n\t\t}\n\t\tif (page.nextAfter === null) break;\n\t\tafter = page.nextAfter;\n\t}\n\tconst prefixViews = new Map<string, SessionHistoryReadView>();\n\tconst prefix = async (source: SourceSnapshotRef): Promise<SessionHistoryReadView> => {\n\t\tif (\n\t\t\tsource.sessionId !== copied.sessionId ||\n\t\t\tsource.sessionFile !== copied.sessionFile ||\n\t\t\t!source.persistent ||\n\t\t\t!Number.isSafeInteger(source.sourceSequence) ||\n\t\t\tsource.sourceSequence < 0 ||\n\t\t\tsource.sourceSequence > copied.through\n\t\t)\n\t\t\tthrow new Error(\"Copied epoch recipe is outside the captured old source\");\n\t\tconst key = JSON.stringify(source);\n\t\tconst existing = prefixViews.get(key);\n\t\tif (existing) return existing;\n\t\tlet leafId = source.leafId;\n\t\tif (leafId !== null && (!oldById.has(leafId) || oldById.get(leafId)!.sequence > source.sourceSequence))\n\t\t\tthrow new Error(\"Copied epoch leaf is outside its captured prefix\");\n\t\tconst seen = new Set<string>();\n\t\twhile (leafId !== null && !destination.has(leafId)) {\n\t\t\tif (seen.has(leafId)) throw new Error(\"Copied epoch parent path is unresolved\");\n\t\t\tseen.add(leafId);\n\t\t\tconst old = oldById.get(leafId);\n\t\t\tif (!old) throw new Error(\"Copied epoch parent source is unavailable\");\n\t\t\tleafId = old.parentId;\n\t\t}\n\t\tconst rows = [...oldById.values()]\n\t\t\t.filter((old) => old.sequence <= source.sourceSequence)\n\t\t\t.flatMap((old) => {\n\t\t\t\tconst actual = destination.get(old.id);\n\t\t\t\treturn actual ? [actual] : [];\n\t\t\t});\n\t\tconst last = rows.reduce<IndexedSourceEvent | undefined>(\n\t\t\t(previous, actual) => (!previous || actual.sequence > previous.sequence ? actual : previous),\n\t\t\tundefined,\n\t\t);\n\t\tif (!last) throw new Error(\"Copied epoch prefix has no preserved source\");\n\t\tconst narrowed = await view.atSnapshot!({ ...view.source, leafId, sourceSequence: last.sequence });\n\t\tprefixViews.set(key, narrowed);\n\t\treturn narrowed;\n\t};\n\tawait prefix(checkpoint.source);\n\tconst copyReference = async <\n\t\tT extends EpochViewReference | NonNullable<ContextEpochCheckpoint[\"selectedSkills\"]>[number][\"view\"],\n\t>(\n\t\tpinned: T,\n\t): Promise<T> => {\n\t\tconst old = oldById.get(pinned.ref.entryId);\n\t\tif (\n\t\t\t!old ||\n\t\t\told.revision !== pinned.ref.revision ||\n\t\t\told.sequence !== pinned.ref.sequence ||\n\t\t\told.kind !== pinned.ref.kind ||\n\t\t\t!isDeepStrictEqual(old.locator, pinned.ref.locator)\n\t\t)\n\t\t\tthrow new Error(\"Copied epoch recipe does not match its captured source\");\n\t\tconst read = await prefix(pinned.source);\n\t\tconst actual = await read.get(old.id);\n\t\tif (!actual || actual.kind !== old.kind) throw new Error(\"Copied epoch view source is unavailable\");\n\t\tconst ref = {\n\t\t\tentryId: actual.id,\n\t\t\tsequence: actual.sequence,\n\t\t\tkind: pinned.ref.kind,\n\t\t\tlocator: { ...actual.locator },\n\t\t\trevision: actual.revision,\n\t\t\tauthority: actual.authority,\n\t\t\tqualification: actual.qualification,\n\t\t\tretention: actual.retention,\n\t\t};\n\t\tlet sourceRevision = actual.revision;\n\t\tif (ref.kind !== \"compaction\") {\n\t\t\tconst original: unknown = JSON.parse(pinned.sourceRevision);\n\t\t\tif (\n\t\t\t\t!Array.isArray(original) ||\n\t\t\t\toriginal[0] !== old.revision ||\n\t\t\t\toriginal.some((revision) => typeof revision !== \"string\")\n\t\t\t)\n\t\t\t\tthrow new Error(\"Copied epoch frozen revisions are unavailable\");\n\t\t\tconst updates = old.updateTarget ? (await read.contextUpdates(old.updateTarget)).refs : [];\n\t\t\tconst expected = original.slice(1).map((revision) => oldByRevision.get(revision));\n\t\t\tif (\n\t\t\t\texpected.some((source) => !source || source.sequence > pinned.source.sourceSequence) ||\n\t\t\t\t!isDeepStrictEqual(\n\t\t\t\t\texpected.map((source) => source!.id),\n\t\t\t\t\tupdates.map((source) => source.entryId),\n\t\t\t\t)\n\t\t\t)\n\t\t\t\tthrow new Error(\"Copied epoch update sources were not preserved\");\n\t\t\tsourceRevision = JSON.stringify([actual.revision, ...updates.map((update) => update.revision)]);\n\t\t} else if (pinned.sourceRevision !== old.revision || pinned.retainedMessageCount === undefined) {\n\t\t\tthrow new Error(\"Copied epoch summary source is unavailable\");\n\t\t}\n\t\treturn {\n\t\t\tsource: read.source,\n\t\t\tref,\n\t\t\tsourceRevision,\n\t\t\t...(pinned.retainedMessageCount === undefined ? {} : { retainedMessageCount: pinned.retainedMessageCount }),\n\t\t\t...(pinned.rendering === undefined ? {} : { rendering: pinned.rendering }),\n\t\t} as T;\n\t};\n\tconst views: EpochViewReference[] = [];\n\tfor (const pinned of checkpoint.views) views.push(await copyReference(pinned));\n\tconst selectedSkills: Array<NonNullable<ContextEpochCheckpoint[\"selectedSkills\"]>[number]> | undefined =\n\t\tcheckpoint.selectedSkills ? [] : undefined;\n\tfor (const skill of checkpoint.selectedSkills ?? [])\n\t\tselectedSkills!.push({ name: skill.name, view: await copyReference(skill.view) });\n\tif (!(await view.get(checkpoint.literalTailId))) throw new Error(\"Copied epoch literal tail is unavailable\");\n\tconst tasks = await readTaskStateFromView(view, {\n\t\tmaxItems: limits.maxEntries,\n\t\tmaxSourceBytes: limits.maxSourceBytes,\n\t\tmaxViewBytes: limits.maxSourceBytes,\n\t});\n\tconst taskFrame = compileTaskFrame(tasks, taskFrameLimits({ maxBytes: Math.min(16_384, limits.maxSourceBytes) }));\n\tconst lowered =\n\t\tcopied.retained || origin.retention === \"retained-import\" || hydrated.source.retention === \"retained-import\";\n\tconst inherited =\n\t\tcheckpoint.version === 5 && lowered ? { ...checkpoint, pendingRequestContract: undefined } : checkpoint;\n\tconst { replayContract, publicWindow: _publicWindow, continuation, ...unchanged } = inherited;\n\tconst rebuiltContinuation = continuation\n\t\t? {\n\t\t\t\tkind: continuation.kind,\n\t\t\t\tpublicTailThrough: (await prefix(continuation.publicTailThrough)).source,\n\t\t\t}\n\t\t: undefined;\n\tconst rebuilt = snapshotContextEpoch(\n\t\t{\n\t\t\t...unchanged,\n\t\t\tsource: view.source,\n\t\t\tviews,\n\t\t\t...(selectedSkills?.length ? { selectedSkills } : {}),\n\t\t\ttaskFrame,\n\t\t\tresourceRevision: undefined, // Explicit copies must capture their destination owner anew.\n\t\t\t...(rebuiltContinuation ? { continuation: rebuiltContinuation } : {}),\n\t\t\t...(!lowered && replayContract !== undefined ? { replayContract } : {}),\n\t\t},\n\t\tlimits.maxSourceBytes,\n\t);\n\treturn {\n\t\tcheckpoint: rebuilt,\n\t\ttokensBefore: entry.tokensBefore,\n\t\t...(checkpoint.includeSummary\n\t\t\t? {\n\t\t\t\t\tsummary: {\n\t\t\t\t\t\tsummary: entry.summary,\n\t\t\t\t\t\tdetails: { ...entry.details },\n\t\t\t\t\t\tfromHook: entry.fromHook,\n\t\t\t\t\t\tcustomInstructions: entry.customInstructions, // The copied original alone retains its model usage.\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t};\n}\n"]}
|
|
@@ -26,7 +26,7 @@ export function captureEpochCopyEntry(entry, source) {
|
|
|
26
26
|
};
|
|
27
27
|
}
|
|
28
28
|
/** Rebuild only at the explicit copy boundary; later provider reads remain destination-only. */
|
|
29
|
-
export async function rebuildCopiedContextEpoch(history, copied, limits) {
|
|
29
|
+
export async function rebuildCopiedContextEpoch(history, copied, limits, metadataMaxBytes = limits.maxSourceBytes) {
|
|
30
30
|
const view = history.branchContext;
|
|
31
31
|
const manifest = await view.contextManifest({ limit: 1 });
|
|
32
32
|
if (manifest.selection !== "known")
|
|
@@ -55,15 +55,26 @@ export async function rebuildCopiedContextEpoch(history, copied, limits) {
|
|
|
55
55
|
throw new Error("Tool continuation recipes require their original native execution source");
|
|
56
56
|
if (!checkpoint || checkpoint.literalTailId !== entry.firstKeptEntryId || !view.atSnapshot)
|
|
57
57
|
throw new Error("Copied context epoch boundary is unavailable");
|
|
58
|
-
if (
|
|
58
|
+
if (checkpoint.views.length > limits.maxEntries)
|
|
59
59
|
throw new Error("Copied context epoch item budget exceeded");
|
|
60
|
-
stringifyBoundedJson(copied,
|
|
60
|
+
stringifyBoundedJson(copied, metadataMaxBytes);
|
|
61
61
|
const oldByRevision = new Map([...oldById.values()].map((source) => [source.revision, source]));
|
|
62
62
|
const destination = new Map();
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
63
|
+
let after = 0;
|
|
64
|
+
for (;;) {
|
|
65
|
+
const page = await history.page(after, 128);
|
|
66
|
+
if (page.indexedThrough < history.source.sourceSequence)
|
|
67
|
+
throw new Error("Copied context destination has incomplete index coverage");
|
|
68
|
+
for (const actual of page.events) {
|
|
69
|
+
if (!oldById.has(actual.id))
|
|
70
|
+
continue;
|
|
71
|
+
if (destination.size >= limits.maxEntries)
|
|
72
|
+
throw new Error("Copied context epoch item budget exceeded");
|
|
73
|
+
destination.set(actual.id, actual);
|
|
74
|
+
}
|
|
75
|
+
if (page.nextAfter === null)
|
|
76
|
+
break;
|
|
77
|
+
after = page.nextAfter;
|
|
67
78
|
}
|
|
68
79
|
const prefixViews = new Map();
|
|
69
80
|
const prefix = async (source) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-epoch-copy.js","sourceRoot":"","sources":["../../src/core/context-epoch-copy.ts"],"names":[],"mappings":"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","sourcesContent":["import { isDeepStrictEqual } from \"node:util\";\nimport { stringifyBoundedJson } from \"./bounded-json.js\";\nimport {\n\tCONTEXT_EPOCH_DETAIL,\n\ttype ContextEpochCheckpoint,\n\ttype ContextEpochSummary,\n\ttype EpochViewReference,\n\treadContextEpoch,\n\tsnapshotContextEpoch,\n} from \"./context-epoch.js\";\nimport type { ContextUpdateTarget, IndexedSourceEvent } from \"./history-index.js\";\nimport type { SourceSnapshotRef } from \"./request-events.js\";\nimport {\n\thydrateCapturedHistoryEntry,\n\ttype SessionHistoryReadLimits,\n\ttype SessionHistoryReadScope,\n\ttype SessionHistoryReadView,\n} from \"./session-history-index.js\";\nimport type { SessionEntry } from \"./session-manager.js\";\nimport { compileTaskFrame, taskFrameLimits } from \"./task-frame.js\";\nimport { readTaskStateFromView } from \"./task-state-reader.js\";\n\nexport const readCopiedEpochSource = Symbol(\"readCopiedEpochSource\");\n\n/** Operation-local metadata from the actual old capture, not another body or epoch store. */\nexport interface CopiedEpochEntry\n\textends Pick<\n\t\tIndexedSourceEvent,\n\t\t\"id\" | \"parentId\" | \"kind\" | \"sequence\" | \"revision\" | \"locator\" | \"retention\" | \"qualification\"\n\t> {\n\treadonly updateTarget?: ContextUpdateTarget;\n}\nexport interface CapturedEpochCopy {\n\treadonly sessionId: string;\n\treadonly sessionFile?: string;\n\treadonly through: number;\n\treadonly entries: readonly CopiedEpochEntry[];\n\treadonly retained: boolean;\n}\n\nexport function captureEpochCopyEntry(\n\tentry: SessionEntry,\n\tsource: Omit<CopiedEpochEntry, \"updateTarget\">,\n): CopiedEpochEntry {\n\tconst updateTarget: ContextUpdateTarget | undefined =\n\t\tentry.type === \"message\"\n\t\t\t? entry.message.role === \"assistant\"\n\t\t\t\t? { kind: \"assistant-usage\", targetId: entry.id }\n\t\t\t\t: entry.message.role === \"toolResult\" && entry.message.toolName === \"ipython\"\n\t\t\t\t\t? { kind: \"ipython-sent-message\", toolCallId: entry.message.toolCallId }\n\t\t\t\t\t: undefined\n\t\t\t: undefined;\n\treturn {\n\t\tid: source.id,\n\t\tparentId: source.parentId,\n\t\tkind: source.kind,\n\t\tsequence: source.sequence,\n\t\trevision: source.revision,\n\t\tlocator: { ...source.locator },\n\t\tretention: source.retention,\n\t\tqualification: source.qualification,\n\t\t...(updateTarget ? { updateTarget } : {}),\n\t};\n}\n\n/** Rebuild only at the explicit copy boundary; later provider reads remain destination-only. */\nexport async function rebuildCopiedContextEpoch(\n\thistory: SessionHistoryReadScope,\n\tcopied: CapturedEpochCopy,\n\tlimits: SessionHistoryReadLimits,\n): Promise<\n\t{ checkpoint: ContextEpochCheckpoint; tokensBefore: number | null; summary?: ContextEpochSummary } | undefined\n> {\n\tconst view = history.branchContext;\n\tconst manifest = await view.contextManifest({ limit: 1 });\n\tif (manifest.selection !== \"known\") throw new Error(\"Copied context selection is unavailable\");\n\tconst selected = manifest.summaryRef;\n\tif (!selected) return;\n\tconst metadata = await view.get(selected.entryId);\n\tif (!metadata) throw new Error(\"Copied context summary source is unavailable\");\n\tconst hydrated = await hydrateCapturedHistoryEntry(metadata, limits.maxSourceBytes, view.readPayload);\n\tif (!hydrated || hydrated.entry.type !== \"compaction\") throw new Error(\"Copied context summary is unavailable\");\n\tconst entry = hydrated.entry;\n\tif (!entry.details || typeof entry.details !== \"object\" || !(CONTEXT_EPOCH_DETAIL in entry.details)) return;\n\tconst oldById = new Map<string, CopiedEpochEntry>();\n\tfor (const source of copied.entries) if (!oldById.has(source.id)) oldById.set(source.id, source);\n\tconst origin = oldById.get(entry.id);\n\tif (origin?.qualification !== \"native-context-epoch\" || hydrated.source.qualification !== \"native-context-epoch\")\n\t\tthrow new Error(\"Copied context epoch has no qualified source\");\n\tconst checkpoint = readContextEpoch(entry.details, limits.maxSourceBytes);\n\tif (checkpoint?.version === 6 || checkpoint?.version === 8)\n\t\tthrow new Error(\"Tool continuation recipes require their original native execution source\");\n\tif (!checkpoint || checkpoint.literalTailId !== entry.firstKeptEntryId || !view.atSnapshot)\n\t\tthrow new Error(\"Copied context epoch boundary is unavailable\");\n\tif (copied.entries.length > limits.maxEntries || checkpoint.views.length > limits.maxEntries)\n\t\tthrow new Error(\"Copied context epoch item budget exceeded\");\n\tstringifyBoundedJson(copied, limits.maxSourceBytes);\n\tconst oldByRevision = new Map([...oldById.values()].map((source) => [source.revision, source]));\n\tconst destination = new Map<string, IndexedSourceEvent>();\n\tfor (const source of oldById.values()) {\n\t\tconst actual = await history.get(source.id);\n\t\tif (actual) destination.set(source.id, actual);\n\t}\n\tconst prefixViews = new Map<string, SessionHistoryReadView>();\n\tconst prefix = async (source: SourceSnapshotRef): Promise<SessionHistoryReadView> => {\n\t\tif (\n\t\t\tsource.sessionId !== copied.sessionId ||\n\t\t\tsource.sessionFile !== copied.sessionFile ||\n\t\t\t!source.persistent ||\n\t\t\t!Number.isSafeInteger(source.sourceSequence) ||\n\t\t\tsource.sourceSequence < 0 ||\n\t\t\tsource.sourceSequence > copied.through\n\t\t)\n\t\t\tthrow new Error(\"Copied epoch recipe is outside the captured old source\");\n\t\tconst key = JSON.stringify(source);\n\t\tconst existing = prefixViews.get(key);\n\t\tif (existing) return existing;\n\t\tlet leafId = source.leafId;\n\t\tif (leafId !== null && (!oldById.has(leafId) || oldById.get(leafId)!.sequence > source.sourceSequence))\n\t\t\tthrow new Error(\"Copied epoch leaf is outside its captured prefix\");\n\t\tconst seen = new Set<string>();\n\t\twhile (leafId !== null && !destination.has(leafId)) {\n\t\t\tif (seen.has(leafId)) throw new Error(\"Copied epoch parent path is unresolved\");\n\t\t\tseen.add(leafId);\n\t\t\tconst old = oldById.get(leafId);\n\t\t\tif (!old) throw new Error(\"Copied epoch parent source is unavailable\");\n\t\t\tleafId = old.parentId;\n\t\t}\n\t\tconst rows = [...oldById.values()]\n\t\t\t.filter((old) => old.sequence <= source.sourceSequence)\n\t\t\t.flatMap((old) => {\n\t\t\t\tconst actual = destination.get(old.id);\n\t\t\t\treturn actual ? [actual] : [];\n\t\t\t});\n\t\tconst last = rows.reduce<IndexedSourceEvent | undefined>(\n\t\t\t(previous, actual) => (!previous || actual.sequence > previous.sequence ? actual : previous),\n\t\t\tundefined,\n\t\t);\n\t\tif (!last) throw new Error(\"Copied epoch prefix has no preserved source\");\n\t\tconst narrowed = await view.atSnapshot!({ ...view.source, leafId, sourceSequence: last.sequence });\n\t\tprefixViews.set(key, narrowed);\n\t\treturn narrowed;\n\t};\n\tawait prefix(checkpoint.source);\n\tconst copyReference = async <\n\t\tT extends EpochViewReference | NonNullable<ContextEpochCheckpoint[\"selectedSkills\"]>[number][\"view\"],\n\t>(\n\t\tpinned: T,\n\t): Promise<T> => {\n\t\tconst old = oldById.get(pinned.ref.entryId);\n\t\tif (\n\t\t\t!old ||\n\t\t\told.revision !== pinned.ref.revision ||\n\t\t\told.sequence !== pinned.ref.sequence ||\n\t\t\told.kind !== pinned.ref.kind ||\n\t\t\t!isDeepStrictEqual(old.locator, pinned.ref.locator)\n\t\t)\n\t\t\tthrow new Error(\"Copied epoch recipe does not match its captured source\");\n\t\tconst read = await prefix(pinned.source);\n\t\tconst actual = await read.get(old.id);\n\t\tif (!actual || actual.kind !== old.kind) throw new Error(\"Copied epoch view source is unavailable\");\n\t\tconst ref = {\n\t\t\tentryId: actual.id,\n\t\t\tsequence: actual.sequence,\n\t\t\tkind: pinned.ref.kind,\n\t\t\tlocator: { ...actual.locator },\n\t\t\trevision: actual.revision,\n\t\t\tauthority: actual.authority,\n\t\t\tqualification: actual.qualification,\n\t\t\tretention: actual.retention,\n\t\t};\n\t\tlet sourceRevision = actual.revision;\n\t\tif (ref.kind !== \"compaction\") {\n\t\t\tconst original: unknown = JSON.parse(pinned.sourceRevision);\n\t\t\tif (\n\t\t\t\t!Array.isArray(original) ||\n\t\t\t\toriginal[0] !== old.revision ||\n\t\t\t\toriginal.some((revision) => typeof revision !== \"string\")\n\t\t\t)\n\t\t\t\tthrow new Error(\"Copied epoch frozen revisions are unavailable\");\n\t\t\tconst updates = old.updateTarget ? (await read.contextUpdates(old.updateTarget)).refs : [];\n\t\t\tconst expected = original.slice(1).map((revision) => oldByRevision.get(revision));\n\t\t\tif (\n\t\t\t\texpected.some((source) => !source || source.sequence > pinned.source.sourceSequence) ||\n\t\t\t\t!isDeepStrictEqual(\n\t\t\t\t\texpected.map((source) => source!.id),\n\t\t\t\t\tupdates.map((source) => source.entryId),\n\t\t\t\t)\n\t\t\t)\n\t\t\t\tthrow new Error(\"Copied epoch update sources were not preserved\");\n\t\t\tsourceRevision = JSON.stringify([actual.revision, ...updates.map((update) => update.revision)]);\n\t\t} else if (pinned.sourceRevision !== old.revision || pinned.retainedMessageCount === undefined) {\n\t\t\tthrow new Error(\"Copied epoch summary source is unavailable\");\n\t\t}\n\t\treturn {\n\t\t\tsource: read.source,\n\t\t\tref,\n\t\t\tsourceRevision,\n\t\t\t...(pinned.retainedMessageCount === undefined ? {} : { retainedMessageCount: pinned.retainedMessageCount }),\n\t\t\t...(pinned.rendering === undefined ? {} : { rendering: pinned.rendering }),\n\t\t} as T;\n\t};\n\tconst views: EpochViewReference[] = [];\n\tfor (const pinned of checkpoint.views) views.push(await copyReference(pinned));\n\tconst selectedSkills: Array<NonNullable<ContextEpochCheckpoint[\"selectedSkills\"]>[number]> | undefined =\n\t\tcheckpoint.selectedSkills ? [] : undefined;\n\tfor (const skill of checkpoint.selectedSkills ?? [])\n\t\tselectedSkills!.push({ name: skill.name, view: await copyReference(skill.view) });\n\tif (!(await view.get(checkpoint.literalTailId))) throw new Error(\"Copied epoch literal tail is unavailable\");\n\tconst tasks = await readTaskStateFromView(view, {\n\t\tmaxItems: limits.maxEntries,\n\t\tmaxSourceBytes: limits.maxSourceBytes,\n\t\tmaxViewBytes: limits.maxSourceBytes,\n\t});\n\tconst taskFrame = compileTaskFrame(tasks, taskFrameLimits({ maxBytes: Math.min(16_384, limits.maxSourceBytes) }));\n\tconst lowered =\n\t\tcopied.retained || origin.retention === \"retained-import\" || hydrated.source.retention === \"retained-import\";\n\tconst inherited =\n\t\tcheckpoint.version === 5 && lowered ? { ...checkpoint, pendingRequestContract: undefined } : checkpoint;\n\tconst { replayContract, publicWindow: _publicWindow, continuation, ...unchanged } = inherited;\n\tconst rebuiltContinuation = continuation\n\t\t? {\n\t\t\t\tkind: continuation.kind,\n\t\t\t\tpublicTailThrough: (await prefix(continuation.publicTailThrough)).source,\n\t\t\t}\n\t\t: undefined;\n\tconst rebuilt = snapshotContextEpoch(\n\t\t{\n\t\t\t...unchanged,\n\t\t\tsource: view.source,\n\t\t\tviews,\n\t\t\t...(selectedSkills?.length ? { selectedSkills } : {}),\n\t\t\ttaskFrame,\n\t\t\tresourceRevision: undefined, // Explicit copies must capture their destination owner anew.\n\t\t\t...(rebuiltContinuation ? { continuation: rebuiltContinuation } : {}),\n\t\t\t...(!lowered && replayContract !== undefined ? { replayContract } : {}),\n\t\t},\n\t\tlimits.maxSourceBytes,\n\t);\n\treturn {\n\t\tcheckpoint: rebuilt,\n\t\ttokensBefore: entry.tokensBefore,\n\t\t...(checkpoint.includeSummary\n\t\t\t? {\n\t\t\t\t\tsummary: {\n\t\t\t\t\t\tsummary: entry.summary,\n\t\t\t\t\t\tdetails: { ...entry.details },\n\t\t\t\t\t\tfromHook: entry.fromHook,\n\t\t\t\t\t\tcustomInstructions: entry.customInstructions, // The copied original alone retains its model usage.\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"context-epoch-copy.js","sourceRoot":"","sources":["../../src/core/context-epoch-copy.ts"],"names":[],"mappings":"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","sourcesContent":["import { isDeepStrictEqual } from \"node:util\";\nimport { stringifyBoundedJson } from \"./bounded-json.js\";\nimport {\n\tCONTEXT_EPOCH_DETAIL,\n\ttype ContextEpochCheckpoint,\n\ttype ContextEpochSummary,\n\ttype EpochViewReference,\n\treadContextEpoch,\n\tsnapshotContextEpoch,\n} from \"./context-epoch.js\";\nimport type { ContextUpdateTarget, IndexedSourceEvent } from \"./history-index.js\";\nimport type { SourceSnapshotRef } from \"./request-events.js\";\nimport {\n\thydrateCapturedHistoryEntry,\n\ttype SessionHistoryReadLimits,\n\ttype SessionHistoryReadScope,\n\ttype SessionHistoryReadView,\n} from \"./session-history-index.js\";\nimport type { SessionEntry } from \"./session-manager.js\";\nimport { compileTaskFrame, taskFrameLimits } from \"./task-frame.js\";\nimport { readTaskStateFromView } from \"./task-state-reader.js\";\n\nexport const readCopiedEpochSource = Symbol(\"readCopiedEpochSource\");\n\n/** Operation-local metadata from the actual old capture, not another body or epoch store. */\nexport interface CopiedEpochEntry\n\textends Pick<\n\t\tIndexedSourceEvent,\n\t\t\"id\" | \"parentId\" | \"kind\" | \"sequence\" | \"revision\" | \"locator\" | \"retention\" | \"qualification\"\n\t> {\n\treadonly updateTarget?: ContextUpdateTarget;\n}\nexport interface CapturedEpochCopy {\n\treadonly sessionId: string;\n\treadonly sessionFile?: string;\n\treadonly through: number;\n\treadonly entries: readonly CopiedEpochEntry[];\n\treadonly retained: boolean;\n}\n\nexport function captureEpochCopyEntry(\n\tentry: SessionEntry,\n\tsource: Omit<CopiedEpochEntry, \"updateTarget\">,\n): CopiedEpochEntry {\n\tconst updateTarget: ContextUpdateTarget | undefined =\n\t\tentry.type === \"message\"\n\t\t\t? entry.message.role === \"assistant\"\n\t\t\t\t? { kind: \"assistant-usage\", targetId: entry.id }\n\t\t\t\t: entry.message.role === \"toolResult\" && entry.message.toolName === \"ipython\"\n\t\t\t\t\t? { kind: \"ipython-sent-message\", toolCallId: entry.message.toolCallId }\n\t\t\t\t\t: undefined\n\t\t\t: undefined;\n\treturn {\n\t\tid: source.id,\n\t\tparentId: source.parentId,\n\t\tkind: source.kind,\n\t\tsequence: source.sequence,\n\t\trevision: source.revision,\n\t\tlocator: { ...source.locator },\n\t\tretention: source.retention,\n\t\tqualification: source.qualification,\n\t\t...(updateTarget ? { updateTarget } : {}),\n\t};\n}\n\n/** Rebuild only at the explicit copy boundary; later provider reads remain destination-only. */\nexport async function rebuildCopiedContextEpoch(\n\thistory: SessionHistoryReadScope,\n\tcopied: CapturedEpochCopy,\n\tlimits: SessionHistoryReadLimits,\n\tmetadataMaxBytes = limits.maxSourceBytes,\n): Promise<\n\t{ checkpoint: ContextEpochCheckpoint; tokensBefore: number | null; summary?: ContextEpochSummary } | undefined\n> {\n\tconst view = history.branchContext;\n\tconst manifest = await view.contextManifest({ limit: 1 });\n\tif (manifest.selection !== \"known\") throw new Error(\"Copied context selection is unavailable\");\n\tconst selected = manifest.summaryRef;\n\tif (!selected) return;\n\tconst metadata = await view.get(selected.entryId);\n\tif (!metadata) throw new Error(\"Copied context summary source is unavailable\");\n\tconst hydrated = await hydrateCapturedHistoryEntry(metadata, limits.maxSourceBytes, view.readPayload);\n\tif (!hydrated || hydrated.entry.type !== \"compaction\") throw new Error(\"Copied context summary is unavailable\");\n\tconst entry = hydrated.entry;\n\tif (!entry.details || typeof entry.details !== \"object\" || !(CONTEXT_EPOCH_DETAIL in entry.details)) return;\n\tconst oldById = new Map<string, CopiedEpochEntry>();\n\tfor (const source of copied.entries) if (!oldById.has(source.id)) oldById.set(source.id, source);\n\tconst origin = oldById.get(entry.id);\n\tif (origin?.qualification !== \"native-context-epoch\" || hydrated.source.qualification !== \"native-context-epoch\")\n\t\tthrow new Error(\"Copied context epoch has no qualified source\");\n\tconst checkpoint = readContextEpoch(entry.details, limits.maxSourceBytes);\n\tif (checkpoint?.version === 6 || checkpoint?.version === 8)\n\t\tthrow new Error(\"Tool continuation recipes require their original native execution source\");\n\tif (!checkpoint || checkpoint.literalTailId !== entry.firstKeptEntryId || !view.atSnapshot)\n\t\tthrow new Error(\"Copied context epoch boundary is unavailable\");\n\tif (checkpoint.views.length > limits.maxEntries) throw new Error(\"Copied context epoch item budget exceeded\");\n\tstringifyBoundedJson(copied, metadataMaxBytes);\n\tconst oldByRevision = new Map([...oldById.values()].map((source) => [source.revision, source]));\n\tconst destination = new Map<string, IndexedSourceEvent>();\n\tlet after = 0;\n\tfor (;;) {\n\t\tconst page = await history.page(after, 128);\n\t\tif (page.indexedThrough < history.source.sourceSequence)\n\t\t\tthrow new Error(\"Copied context destination has incomplete index coverage\");\n\t\tfor (const actual of page.events) {\n\t\t\tif (!oldById.has(actual.id)) continue;\n\t\t\tif (destination.size >= limits.maxEntries) throw new Error(\"Copied context epoch item budget exceeded\");\n\t\t\tdestination.set(actual.id, actual);\n\t\t}\n\t\tif (page.nextAfter === null) break;\n\t\tafter = page.nextAfter;\n\t}\n\tconst prefixViews = new Map<string, SessionHistoryReadView>();\n\tconst prefix = async (source: SourceSnapshotRef): Promise<SessionHistoryReadView> => {\n\t\tif (\n\t\t\tsource.sessionId !== copied.sessionId ||\n\t\t\tsource.sessionFile !== copied.sessionFile ||\n\t\t\t!source.persistent ||\n\t\t\t!Number.isSafeInteger(source.sourceSequence) ||\n\t\t\tsource.sourceSequence < 0 ||\n\t\t\tsource.sourceSequence > copied.through\n\t\t)\n\t\t\tthrow new Error(\"Copied epoch recipe is outside the captured old source\");\n\t\tconst key = JSON.stringify(source);\n\t\tconst existing = prefixViews.get(key);\n\t\tif (existing) return existing;\n\t\tlet leafId = source.leafId;\n\t\tif (leafId !== null && (!oldById.has(leafId) || oldById.get(leafId)!.sequence > source.sourceSequence))\n\t\t\tthrow new Error(\"Copied epoch leaf is outside its captured prefix\");\n\t\tconst seen = new Set<string>();\n\t\twhile (leafId !== null && !destination.has(leafId)) {\n\t\t\tif (seen.has(leafId)) throw new Error(\"Copied epoch parent path is unresolved\");\n\t\t\tseen.add(leafId);\n\t\t\tconst old = oldById.get(leafId);\n\t\t\tif (!old) throw new Error(\"Copied epoch parent source is unavailable\");\n\t\t\tleafId = old.parentId;\n\t\t}\n\t\tconst rows = [...oldById.values()]\n\t\t\t.filter((old) => old.sequence <= source.sourceSequence)\n\t\t\t.flatMap((old) => {\n\t\t\t\tconst actual = destination.get(old.id);\n\t\t\t\treturn actual ? [actual] : [];\n\t\t\t});\n\t\tconst last = rows.reduce<IndexedSourceEvent | undefined>(\n\t\t\t(previous, actual) => (!previous || actual.sequence > previous.sequence ? actual : previous),\n\t\t\tundefined,\n\t\t);\n\t\tif (!last) throw new Error(\"Copied epoch prefix has no preserved source\");\n\t\tconst narrowed = await view.atSnapshot!({ ...view.source, leafId, sourceSequence: last.sequence });\n\t\tprefixViews.set(key, narrowed);\n\t\treturn narrowed;\n\t};\n\tawait prefix(checkpoint.source);\n\tconst copyReference = async <\n\t\tT extends EpochViewReference | NonNullable<ContextEpochCheckpoint[\"selectedSkills\"]>[number][\"view\"],\n\t>(\n\t\tpinned: T,\n\t): Promise<T> => {\n\t\tconst old = oldById.get(pinned.ref.entryId);\n\t\tif (\n\t\t\t!old ||\n\t\t\told.revision !== pinned.ref.revision ||\n\t\t\told.sequence !== pinned.ref.sequence ||\n\t\t\told.kind !== pinned.ref.kind ||\n\t\t\t!isDeepStrictEqual(old.locator, pinned.ref.locator)\n\t\t)\n\t\t\tthrow new Error(\"Copied epoch recipe does not match its captured source\");\n\t\tconst read = await prefix(pinned.source);\n\t\tconst actual = await read.get(old.id);\n\t\tif (!actual || actual.kind !== old.kind) throw new Error(\"Copied epoch view source is unavailable\");\n\t\tconst ref = {\n\t\t\tentryId: actual.id,\n\t\t\tsequence: actual.sequence,\n\t\t\tkind: pinned.ref.kind,\n\t\t\tlocator: { ...actual.locator },\n\t\t\trevision: actual.revision,\n\t\t\tauthority: actual.authority,\n\t\t\tqualification: actual.qualification,\n\t\t\tretention: actual.retention,\n\t\t};\n\t\tlet sourceRevision = actual.revision;\n\t\tif (ref.kind !== \"compaction\") {\n\t\t\tconst original: unknown = JSON.parse(pinned.sourceRevision);\n\t\t\tif (\n\t\t\t\t!Array.isArray(original) ||\n\t\t\t\toriginal[0] !== old.revision ||\n\t\t\t\toriginal.some((revision) => typeof revision !== \"string\")\n\t\t\t)\n\t\t\t\tthrow new Error(\"Copied epoch frozen revisions are unavailable\");\n\t\t\tconst updates = old.updateTarget ? (await read.contextUpdates(old.updateTarget)).refs : [];\n\t\t\tconst expected = original.slice(1).map((revision) => oldByRevision.get(revision));\n\t\t\tif (\n\t\t\t\texpected.some((source) => !source || source.sequence > pinned.source.sourceSequence) ||\n\t\t\t\t!isDeepStrictEqual(\n\t\t\t\t\texpected.map((source) => source!.id),\n\t\t\t\t\tupdates.map((source) => source.entryId),\n\t\t\t\t)\n\t\t\t)\n\t\t\t\tthrow new Error(\"Copied epoch update sources were not preserved\");\n\t\t\tsourceRevision = JSON.stringify([actual.revision, ...updates.map((update) => update.revision)]);\n\t\t} else if (pinned.sourceRevision !== old.revision || pinned.retainedMessageCount === undefined) {\n\t\t\tthrow new Error(\"Copied epoch summary source is unavailable\");\n\t\t}\n\t\treturn {\n\t\t\tsource: read.source,\n\t\t\tref,\n\t\t\tsourceRevision,\n\t\t\t...(pinned.retainedMessageCount === undefined ? {} : { retainedMessageCount: pinned.retainedMessageCount }),\n\t\t\t...(pinned.rendering === undefined ? {} : { rendering: pinned.rendering }),\n\t\t} as T;\n\t};\n\tconst views: EpochViewReference[] = [];\n\tfor (const pinned of checkpoint.views) views.push(await copyReference(pinned));\n\tconst selectedSkills: Array<NonNullable<ContextEpochCheckpoint[\"selectedSkills\"]>[number]> | undefined =\n\t\tcheckpoint.selectedSkills ? [] : undefined;\n\tfor (const skill of checkpoint.selectedSkills ?? [])\n\t\tselectedSkills!.push({ name: skill.name, view: await copyReference(skill.view) });\n\tif (!(await view.get(checkpoint.literalTailId))) throw new Error(\"Copied epoch literal tail is unavailable\");\n\tconst tasks = await readTaskStateFromView(view, {\n\t\tmaxItems: limits.maxEntries,\n\t\tmaxSourceBytes: limits.maxSourceBytes,\n\t\tmaxViewBytes: limits.maxSourceBytes,\n\t});\n\tconst taskFrame = compileTaskFrame(tasks, taskFrameLimits({ maxBytes: Math.min(16_384, limits.maxSourceBytes) }));\n\tconst lowered =\n\t\tcopied.retained || origin.retention === \"retained-import\" || hydrated.source.retention === \"retained-import\";\n\tconst inherited =\n\t\tcheckpoint.version === 5 && lowered ? { ...checkpoint, pendingRequestContract: undefined } : checkpoint;\n\tconst { replayContract, publicWindow: _publicWindow, continuation, ...unchanged } = inherited;\n\tconst rebuiltContinuation = continuation\n\t\t? {\n\t\t\t\tkind: continuation.kind,\n\t\t\t\tpublicTailThrough: (await prefix(continuation.publicTailThrough)).source,\n\t\t\t}\n\t\t: undefined;\n\tconst rebuilt = snapshotContextEpoch(\n\t\t{\n\t\t\t...unchanged,\n\t\t\tsource: view.source,\n\t\t\tviews,\n\t\t\t...(selectedSkills?.length ? { selectedSkills } : {}),\n\t\t\ttaskFrame,\n\t\t\tresourceRevision: undefined, // Explicit copies must capture their destination owner anew.\n\t\t\t...(rebuiltContinuation ? { continuation: rebuiltContinuation } : {}),\n\t\t\t...(!lowered && replayContract !== undefined ? { replayContract } : {}),\n\t\t},\n\t\tlimits.maxSourceBytes,\n\t);\n\treturn {\n\t\tcheckpoint: rebuilt,\n\t\ttokensBefore: entry.tokensBefore,\n\t\t...(checkpoint.includeSummary\n\t\t\t? {\n\t\t\t\t\tsummary: {\n\t\t\t\t\t\tsummary: entry.summary,\n\t\t\t\t\t\tdetails: { ...entry.details },\n\t\t\t\t\t\tfromHook: entry.fromHook,\n\t\t\t\t\t\tcustomInstructions: entry.customInstructions, // The copied original alone retains its model usage.\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t};\n}\n"]}
|
|
@@ -13,15 +13,26 @@ export declare const CONTEXT_TOOL_EPOCH_RENDERER = "native-canonical-epoch/6";
|
|
|
13
13
|
export declare const CONTEXT_SKILL_EPOCH_RENDERER = "native-canonical-epoch/7";
|
|
14
14
|
/** Source-backed summary with retained public tool groups, not a measured MAIN request. */
|
|
15
15
|
export declare const CONTEXT_TOOL_SUMMARY_RENDERER = "native-canonical-epoch/8";
|
|
16
|
+
/** Public recipes may record absent admission, never a fabricated execution outcome. */
|
|
17
|
+
export declare const CONTEXT_INTERRUPTED_TOOL_RENDERER = "native-canonical-epoch/9";
|
|
16
18
|
/** Descriptive, source-backed outcomes in the existing accepted epoch, not an execution store. */
|
|
17
19
|
export interface ToolContinuationGroup {
|
|
18
20
|
readonly assistantEntryId: string;
|
|
19
|
-
readonly calls: readonly {
|
|
21
|
+
readonly calls: readonly ({
|
|
22
|
+
readonly admission?: never;
|
|
20
23
|
readonly executionId: string;
|
|
21
24
|
readonly intent: Pick<IndexedSourceEvent, "id" | "sequence" | "revision">;
|
|
22
25
|
readonly outcome: "outcome_unknown" | "not_started" | "completed" | "failed";
|
|
23
26
|
readonly result?: Pick<IndexedSourceEvent, "id" | "sequence" | "revision">;
|
|
24
|
-
}
|
|
27
|
+
} | {
|
|
28
|
+
readonly admission: "absent";
|
|
29
|
+
/** Absence is scoped to this exact captured branch prefix, not external effects. */
|
|
30
|
+
readonly source: SourceSnapshotRef;
|
|
31
|
+
readonly executionId?: never;
|
|
32
|
+
readonly intent?: never;
|
|
33
|
+
readonly outcome?: never;
|
|
34
|
+
readonly result?: never;
|
|
35
|
+
})[];
|
|
25
36
|
}
|
|
26
37
|
export type ContextMode = "on" | "off";
|
|
27
38
|
/** Compatibility retained from an accepted native request, not measurement or replay credit. */
|
|
@@ -51,7 +62,7 @@ export interface EpochViewReference {
|
|
|
51
62
|
readonly rendering?: "public-history/1" | "public-tool-continuation/1";
|
|
52
63
|
}
|
|
53
64
|
interface ContextEpochFields {
|
|
54
|
-
readonly renderer: "native-canonical-epoch/1" | "native-canonical-epoch/2" | "native-canonical-epoch/3" | typeof CONTEXT_EPOCH_RENDERER | typeof CONTEXT_POLICY_EPOCH_RENDERER | typeof CONTEXT_TOOL_EPOCH_RENDERER | typeof CONTEXT_SKILL_EPOCH_RENDERER | typeof CONTEXT_TOOL_SUMMARY_RENDERER;
|
|
65
|
+
readonly renderer: "native-canonical-epoch/1" | "native-canonical-epoch/2" | "native-canonical-epoch/3" | typeof CONTEXT_EPOCH_RENDERER | typeof CONTEXT_POLICY_EPOCH_RENDERER | typeof CONTEXT_TOOL_EPOCH_RENDERER | typeof CONTEXT_SKILL_EPOCH_RENDERER | typeof CONTEXT_TOOL_SUMMARY_RENDERER | typeof CONTEXT_INTERRUPTED_TOOL_RENDERER;
|
|
55
66
|
readonly source: SourceSnapshotRef;
|
|
56
67
|
readonly includeSummary?: true;
|
|
57
68
|
/** Granted by an actual accepted adapter projection, never a caller profile name. */
|
|
@@ -108,6 +119,10 @@ export declare function assertContextRequestContract(contract: ContextEpochReque
|
|
|
108
119
|
export declare function snapshotContextEpoch<T extends ContextEpochCheckpoint>(value: T, maxBytes: number): T;
|
|
109
120
|
/** Called only after checking the source frame's genuine epoch qualification. */
|
|
110
121
|
export declare function readContextEpoch(details: unknown, maxBytes: number): ContextEpochCheckpoint | undefined;
|
|
122
|
+
/** This configuration cannot be persisted as an epoch; it may still be valid full-native input. */
|
|
123
|
+
export declare class UnsupportedContextEpochConfigurationError extends Error {
|
|
124
|
+
constructor();
|
|
125
|
+
}
|
|
111
126
|
/** Stable representation, not the changing input, an auth envelope, or a cache-hit claim. */
|
|
112
127
|
export declare function contextEpochRepresentation(request: ProviderRequestRepresentation, assessment: RequestTokenAssessment | undefined, maxBytes: number, unbudgetedPublic?: boolean, responseItemIdentity?: string): string;
|
|
113
128
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-epoch.d.ts","sourceRoot":"","sources":["../../src/core/context-epoch.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ProviderRequestRepresentation, RequestTokenAssessment, Usage } from \"@ponythewhite/base-context-ai\";\nimport { requestTokenRouteIdentity } from \"@ponythewhite/base-context-ai\";\nimport { stringifyBoundedJson } from \"./bounded-json.js\";\nimport type { ContextRef, IndexedSourceEvent } from \"./history-index.js\";\nimport type { SourceSnapshotRef } from \"./request-events.js\";\nimport { MAX_RESOURCE_REVISION_BYTES } from \"./resource-view.js\";\nimport type { SelectedSkillReference } from \"./selected-skills.js\";\nimport type { CompiledTaskFrame } from \"./task-frame.js\";\n\nexport const CONTEXT_EPOCH_DETAIL = \"baseContextEpoch\";\n/** Internal admission, not a field accepted by ordinary appendCompaction callers. */\nexport const appendContextEpoch = Symbol(\"appendContextEpoch\");\nexport const CONTEXT_EPOCH_RENDERER = \"native-canonical-epoch/4\";\nexport const CONTEXT_POLICY_EPOCH_RENDERER = \"native-canonical-epoch/5\";\nexport const CONTEXT_TOOL_EPOCH_RENDERER = \"native-canonical-epoch/6\";\n/** Selection-bearing v4/v5/v6 variants; older readers must refuse rather than drop these refs. */\nexport const CONTEXT_SKILL_EPOCH_RENDERER = \"native-canonical-epoch/7\";\n/** Source-backed summary with retained public tool groups, not a measured MAIN request. */\nexport const CONTEXT_TOOL_SUMMARY_RENDERER = \"native-canonical-epoch/8\";\n\n/** Descriptive, source-backed outcomes in the existing accepted epoch, not an execution store. */\nexport interface ToolContinuationGroup {\n\treadonly assistantEntryId: string;\n\treadonly calls: readonly {\n\t\treadonly executionId: string;\n\t\treadonly intent: Pick<IndexedSourceEvent, \"id\" | \"sequence\" | \"revision\">;\n\t\treadonly outcome: \"outcome_unknown\" | \"not_started\" | \"completed\" | \"failed\";\n\t\treadonly result?: Pick<IndexedSourceEvent, \"id\" | \"sequence\" | \"revision\">;\n\t}[];\n}\nexport type ContextMode = \"on\" | \"off\";\n\n/** Compatibility retained from an accepted native request, not measurement or replay credit. */\nexport interface ContextEpochRequestContract {\n\treadonly api: string;\n\treadonly provider: string;\n\treadonly route: string;\n\treadonly model: string;\n\treadonly replayContract: ContextReplayContract;\n}\nexport type ContextReplayContract = \"complete-context\" | \"message-groups\";\n\n/** An ordinary summary and its retained source recipes share the existing compaction ACK. */\nexport interface ContextEpochSummary {\n\treadonly summary: string;\n\treadonly details?: Record<string, unknown>;\n\treadonly fromHook?: boolean;\n\treadonly customInstructions?: string;\n\treadonly usage?: Usage;\n}\n\n/** A frozen read recipe, not a second copy of an archived message body. */\nexport interface EpochViewReference {\n\treadonly source: SourceSnapshotRef;\n\treadonly ref: ContextRef;\n\treadonly sourceRevision: string;\n\t/** Present only for an existing rendered compaction summary. */\n\treadonly retainedMessageCount?: number;\n\treadonly rendering?: \"public-history/1\" | \"public-tool-continuation/1\";\n}\n\ninterface ContextEpochFields {\n\treadonly renderer:\n\t\t| \"native-canonical-epoch/1\"\n\t\t| \"native-canonical-epoch/2\"\n\t\t| \"native-canonical-epoch/3\"\n\t\t| typeof CONTEXT_EPOCH_RENDERER\n\t\t| typeof CONTEXT_POLICY_EPOCH_RENDERER\n\t\t| typeof CONTEXT_TOOL_EPOCH_RENDERER\n\t\t| typeof CONTEXT_SKILL_EPOCH_RENDERER\n\t\t| typeof CONTEXT_TOOL_SUMMARY_RENDERER;\n\treadonly source: SourceSnapshotRef;\n\treadonly includeSummary?: true;\n\t/** Granted by an actual accepted adapter projection, never a caller profile name. */\n\treadonly replayContract?: ContextReplayContract;\n\t/** Actual adapter permission to leave completed native groups for a fresh public window. */\n\treadonly publicWindow?: true;\n\t/** Frozen public transition. Later native messages are not silently converted. */\n\treadonly continuation?: {\n\t\treadonly kind: \"harness-summary\" | \"portable-checkpoint\";\n\t\treadonly publicTailThrough: SourceSnapshotRef;\n\t};\n\treadonly views: readonly EpochViewReference[];\n\t/** Captured versions, not a body cache or authority inferred from transcript markup. */\n\treadonly selectedSkills?: readonly SelectedSkillReference[];\n\t/** v6 requests and v8 summaries retain whole public groups and their exact outcome refs. */\n\treadonly toolContinuations?: readonly ToolContinuationGroup[];\n\t/** Derived display only. The task reducer remains the authority for later changes. */\n\treadonly taskFrame?: CompiledTaskFrame;\n\t/** Accepted-state comparison only; saved metadata never establishes current resource liveness. */\n\treadonly resourceRevision?: string;\n\treadonly literalTailId: string;\n}\n\n/** v5 policy-only null is a mode ACK, not an ordinary summary or a measured request. */\nexport type ContextEpochCheckpoint = ContextEpochFields &\n\t(\n\t\t| {\n\t\t\t\treadonly version: 1 | 2 | 3 | 4 | 6;\n\t\t\t\treadonly representation: string | null;\n\t\t\t\treadonly mode?: never;\n\t\t\t\treadonly policyOnly?: never;\n\t\t\t\treadonly requestContract?: never;\n\t\t\t\treadonly pendingRequestContract?: never;\n\t\t }\n\t\t| {\n\t\t\t\treadonly version: 8;\n\t\t\t\treadonly mode: ContextMode;\n\t\t\t\treadonly representation: null;\n\t\t\t\treadonly includeSummary: true;\n\t\t\t\treadonly policyOnly?: never;\n\t\t\t\treadonly requestContract?: never;\n\t\t\t\treadonly pendingRequestContract?: never;\n\t\t }\n\t\t| {\n\t\t\t\treadonly version: 5;\n\t\t\t\treadonly mode: ContextMode;\n\t\t\t\treadonly representation: null;\n\t\t\t\treadonly policyOnly: true;\n\t\t\t\treadonly includeSummary?: never;\n\t\t\t\treadonly requestContract?: ContextEpochRequestContract;\n\t\t\t\treadonly pendingRequestContract?: true;\n\t\t }\n\t);\n\nexport function contextEpochMode(\n\tcheckpoint: ContextEpochCheckpoint | undefined,\n\tinitial: ContextMode = \"on\",\n): ContextMode {\n\treturn checkpoint ? (checkpoint.version === 5 || checkpoint.version === 8 ? checkpoint.mode : \"on\") : initial;\n}\n\nfunction isRequestContract(value: unknown): value is ContextEpochRequestContract {\n\tif (!value || typeof value !== \"object\") return false;\n\treturn (\n\t\t[\"api\", \"provider\", \"route\", \"model\"].every(\n\t\t\t(key) =>\n\t\t\t\tkey in value &&\n\t\t\t\ttypeof (value as Record<string, unknown>)[key] === \"string\" &&\n\t\t\t\t(value as Record<string, unknown>)[key] !== \"\",\n\t\t) &&\n\t\t\"replayContract\" in value &&\n\t\t(value.replayContract === \"complete-context\" || value.replayContract === \"message-groups\")\n\t);\n}\n\n/** Only call with a qualified checkpoint, never raw compaction marker data. */\nexport function retainedContextRequestContract(\n\tcheckpoint: ContextEpochCheckpoint | undefined,\n): ContextEpochRequestContract | undefined {\n\tif (!checkpoint) return;\n\tif (checkpoint.requestContract) return structuredClone(checkpoint.requestContract);\n\tif (!checkpoint.representation) return;\n\tconst accepted: unknown = JSON.parse(checkpoint.representation);\n\tif (!accepted || typeof accepted !== \"object\") throw new Error(\"Accepted context request contract is unavailable\");\n\tconst value = { ...accepted, replayContract: checkpoint.replayContract ?? \"complete-context\" };\n\tif (!isRequestContract(value)) throw new Error(\"Accepted context request contract is unavailable\");\n\treturn {\n\t\tapi: value.api,\n\t\tprovider: value.provider,\n\t\troute: value.route,\n\t\tmodel: value.model,\n\t\treplayContract: value.replayContract,\n\t};\n}\n\n/** Identity comes from the actual final native serialization, not a model/profile label. */\nexport function contextRequestContract(\n\trequest: ProviderRequestRepresentation,\n\treplayContract: ContextReplayContract,\n): ContextEpochRequestContract {\n\tconst route = requestTokenRouteIdentity(request.url);\n\tconst body: unknown = request.body === undefined ? undefined : JSON.parse(request.body);\n\tif (\n\t\t!route ||\n\t\t!body ||\n\t\ttypeof body !== \"object\" ||\n\t\t!(\"model\" in body) ||\n\t\ttypeof body.model !== \"string\" ||\n\t\t!body.model\n\t)\n\t\tthrow new Error(\"Native context request identity is unavailable\");\n\treturn { api: request.api, provider: request.provider, route, model: body.model, replayContract };\n}\n\nexport function assertContextRequestContract(\n\tcontract: ContextEpochRequestContract,\n\trequest: ProviderRequestRepresentation,\n\treplayContract: ContextReplayContract,\n): void {\n\tconst actual = contextRequestContract(request, replayContract);\n\tif (\n\t\tactual.api !== contract.api ||\n\t\tactual.provider !== contract.provider ||\n\t\tactual.route !== contract.route ||\n\t\tactual.model !== contract.model ||\n\t\tactual.replayContract !== contract.replayContract\n\t)\n\t\tthrow new Error(\"Retained context requires its accepted native request contract\");\n}\n\nexport function snapshotContextEpoch<T extends ContextEpochCheckpoint>(value: T, maxBytes: number): T {\n\treturn JSON.parse(stringifyBoundedJson(value, maxBytes)) as T;\n}\n\n/** Called only after checking the source frame's genuine epoch qualification. */\nexport function readContextEpoch(details: unknown, maxBytes: number): ContextEpochCheckpoint | undefined {\n\tif (!details || typeof details !== \"object\" || !(CONTEXT_EPOCH_DETAIL in details)) return;\n\tconst value: unknown = details[CONTEXT_EPOCH_DETAIL];\n\tif (\n\t\t!value ||\n\t\ttypeof value !== \"object\" ||\n\t\t!(\"version\" in value) ||\n\t\t!(\"renderer\" in value) ||\n\t\t!(\n\t\t\t(value.version === 1 && value.renderer === \"native-canonical-epoch/1\") ||\n\t\t\t(value.version === 2 && value.renderer === \"native-canonical-epoch/2\") ||\n\t\t\t(value.version === 3 && value.renderer === \"native-canonical-epoch/3\") ||\n\t\t\t(value.version === 4 && value.renderer === \"native-canonical-epoch/4\") ||\n\t\t\t(value.version === 5 && value.renderer === CONTEXT_POLICY_EPOCH_RENDERER) ||\n\t\t\t(value.version === 6 && value.renderer === CONTEXT_TOOL_EPOCH_RENDERER) ||\n\t\t\t(value.version === 8 && value.renderer === CONTEXT_TOOL_SUMMARY_RENDERER) ||\n\t\t\t([4, 5, 6].includes(value.version as number) && value.renderer === CONTEXT_SKILL_EPOCH_RENDERER)\n\t\t) ||\n\t\t(value.renderer === CONTEXT_SKILL_EPOCH_RENDERER || (value.version === 8 && \"selectedSkills\" in value)\n\t\t\t? !(\"selectedSkills\" in value) ||\n\t\t\t\t!Array.isArray(value.selectedSkills) ||\n\t\t\t\tvalue.selectedSkills.length === 0 ||\n\t\t\t\tvalue.selectedSkills.some(\n\t\t\t\t\t(item) =>\n\t\t\t\t\t\t!item ||\n\t\t\t\t\t\ttypeof item.name !== \"string\" ||\n\t\t\t\t\t\t!item.view ||\n\t\t\t\t\t\t![\"custom_message\", \"custom\"].includes(item.view.ref?.kind) ||\n\t\t\t\t\t\ttypeof item.view.sourceRevision !== \"string\",\n\t\t\t\t) ||\n\t\t\t\tnew Set(value.selectedSkills.map((item) => item.name)).size !== value.selectedSkills.length\n\t\t\t: \"selectedSkills\" in value) ||\n\t\t!(\"source\" in value) ||\n\t\t!value.source ||\n\t\t!(\"views\" in value) ||\n\t\t!Array.isArray(value.views) ||\n\t\t!(\"literalTailId\" in value) ||\n\t\ttypeof value.literalTailId !== \"string\" ||\n\t\t!(\"representation\" in value) ||\n\t\t(value.version === 5 || value.version === 8\n\t\t\t? !(\"mode\" in value) || (value.mode !== \"on\" && value.mode !== \"off\")\n\t\t\t: \"mode\" in value) ||\n\t\t(value.version === 8 &&\n\t\t\t(value.representation !== null || !(\"includeSummary\" in value) || value.includeSummary !== true)) ||\n\t\t(value.version === 5 &&\n\t\t\t(value.representation !== null || !(\"policyOnly\" in value) || value.policyOnly !== true)) ||\n\t\t(\"policyOnly\" in value &&\n\t\t\t(value.version !== 5 ||\n\t\t\t\tvalue.policyOnly !== true ||\n\t\t\t\tvalue.representation !== null ||\n\t\t\t\t\"includeSummary\" in value)) ||\n\t\t(\"pendingRequestContract\" in value &&\n\t\t\t(value.version !== 5 ||\n\t\t\t\t!(\"mode\" in value) ||\n\t\t\t\tvalue.mode !== \"off\" ||\n\t\t\t\tvalue.pendingRequestContract !== true ||\n\t\t\t\t\"requestContract\" in value)) ||\n\t\t(\"requestContract\" in value && (value.version !== 5 || !isRequestContract(value.requestContract))) ||\n\t\t!(\n\t\t\ttypeof value.representation === \"string\" ||\n\t\t\t(value.version === 5 && value.representation === null && \"policyOnly\" in value && value.policyOnly === true) ||\n\t\t\t((value.version === 2 || value.version === 3 || value.version === 4 || value.version === 8) &&\n\t\t\t\tvalue.representation === null &&\n\t\t\t\t\"includeSummary\" in value &&\n\t\t\t\tvalue.includeSummary === true)\n\t\t) ||\n\t\t(\"includeSummary\" in value &&\n\t\t\t((value.version !== 2 && value.version !== 3 && value.version !== 4 && value.version !== 8) ||\n\t\t\t\tvalue.includeSummary !== true ||\n\t\t\t\tvalue.representation !== null)) ||\n\t\t(\"replayContract\" in value &&\n\t\t\tvalue.replayContract !== \"complete-context\" &&\n\t\t\tvalue.replayContract !== \"message-groups\") ||\n\t\t(\"resourceRevision\" in value &&\n\t\t\t(typeof value.resourceRevision !== \"string\" ||\n\t\t\t\tBuffer.byteLength(value.resourceRevision, \"utf8\") > MAX_RESOURCE_REVISION_BYTES)) ||\n\t\t(\"publicWindow\" in value &&\n\t\t\t((value.version !== 3 &&\n\t\t\t\tvalue.version !== 4 &&\n\t\t\t\tvalue.version !== 5 &&\n\t\t\t\tvalue.version !== 6 &&\n\t\t\t\tvalue.version !== 8) ||\n\t\t\t\tvalue.publicWindow !== true)) ||\n\t\t(\"toolContinuations\" in value && value.version !== 6 && value.version !== 8) ||\n\t\t((value.version === 6 || value.version === 8) &&\n\t\t\t(!(\"toolContinuations\" in value) ||\n\t\t\t\t!Array.isArray(value.toolContinuations) ||\n\t\t\t\t!value.toolContinuations.length ||\n\t\t\t\t!(\"replayContract\" in value) ||\n\t\t\t\t(value.version === 6 &&\n\t\t\t\t\t(!(\"publicWindow\" in value) ||\n\t\t\t\t\t\tvalue.publicWindow !== true ||\n\t\t\t\t\t\tvalue.replayContract !== \"message-groups\")))) ||\n\t\t(\"continuation\" in value &&\n\t\t\t((value.version !== 3 &&\n\t\t\t\tvalue.version !== 4 &&\n\t\t\t\tvalue.version !== 5 &&\n\t\t\t\tvalue.version !== 6 &&\n\t\t\t\tvalue.version !== 8) ||\n\t\t\t\t!value.continuation ||\n\t\t\t\ttypeof value.continuation !== \"object\" ||\n\t\t\t\t!(\"kind\" in value.continuation) ||\n\t\t\t\t(value.continuation.kind !== \"harness-summary\" &&\n\t\t\t\t\t((value.version !== 4 && value.version !== 5 && value.version !== 6) ||\n\t\t\t\t\t\tvalue.continuation.kind !== \"portable-checkpoint\")) ||\n\t\t\t\t!(\"publicTailThrough\" in value.continuation) ||\n\t\t\t\t!value.continuation.publicTailThrough))\n\t)\n\t\tthrow new Error(\"Invalid committed context epoch\");\n\treturn snapshotContextEpoch(value as ContextEpochCheckpoint, maxBytes);\n}\n\n/** Stable representation, not the changing input, an auth envelope, or a cache-hit claim. */\nexport function contextEpochRepresentation(\n\trequest: ProviderRequestRepresentation,\n\tassessment: RequestTokenAssessment | undefined,\n\tmaxBytes: number,\n\tunbudgetedPublic = false,\n\tresponseItemIdentity?: string,\n): string {\n\tif (\n\t\t(!assessment && !unbudgetedPublic) ||\n\t\t(assessment &&\n\t\t\t(!assessment.profile ||\n\t\t\t\tassessment.limitSource !== \"explicit-profile\" ||\n\t\t\t\t!assessment.route ||\n\t\t\t\t!assessment.model)) ||\n\t\trequest.body === undefined\n\t)\n\t\tthrow new Error(\"Committed context epoch requires its explicit request profile\");\n\tconst identity = assessment ?? contextRequestContract(request, \"message-groups\");\n\tconst body: unknown = JSON.parse(request.body);\n\tif (!body || typeof body !== \"object\" || Array.isArray(body))\n\t\tthrow new Error(\"Context epoch request representation is unavailable\");\n\tconst configuration: Record<string, unknown> = {};\n\tconst fields = new Set([\n\t\t\"model\",\n\t\t\"instructions\",\n\t\t\"stream\",\n\t\t\"max_output_tokens\",\n\t\t\"max_tokens\",\n\t\t\"max_completion_tokens\",\n\t\t\"temperature\",\n\t\t\"top_p\",\n\t\t\"text\",\n\t\t\"tools\",\n\t\t\"tool_choice\",\n\t\t\"parallel_tool_calls\",\n\t\t\"store\",\n\t\t\"reasoning\",\n\t\t\"service_tier\",\n\t\t\"truncation\",\n\t\t\"include\",\n\t\t\"prompt_cache_retention\",\n\t\t\"stream_options\",\n\t]);\n\tif (\n\t\trequest.api === \"openai-completions\" &&\n\t\trequest.provider === \"deepseek\" &&\n\t\trequest.url === \"https://api.deepseek.com/chat/completions\" &&\n\t\tidentity.route === request.url &&\n\t\t\"model\" in body &&\n\t\tbody.model === \"deepseek-flash\" &&\n\t\tidentity.model === body.model\n\t) {\n\t\tfields.add(\"thinking\");\n\t\tfields.add(\"reasoning_effort\");\n\t}\n\tfor (const [key, value] of Object.entries(body)) {\n\t\tif ([\"input\", \"messages\", \"previous_response_id\", \"prompt_cache_key\"].includes(key)) continue;\n\t\t// Unknown payload extensions may contain private data or change the representation.\n\t\tif (!fields.has(key)) throw new Error(\"Unsupported context epoch request configuration\");\n\t\tconfiguration[key] = value;\n\t}\n\tconst input: unknown = \"input\" in body ? body.input : \"messages\" in body ? body.messages : undefined;\n\tif (!Array.isArray(input)) throw new Error(\"Context epoch request messages are unavailable\");\n\tconst policy = input.filter(\n\t\t(item: unknown) =>\n\t\t\titem && typeof item === \"object\" && \"role\" in item && (item.role === \"system\" || item.role === \"developer\"),\n\t);\n\treturn stringifyBoundedJson(\n\t\t{\n\t\t\trenderer: CONTEXT_EPOCH_RENDERER,\n\t\t\t...(responseItemIdentity ? { responseItemIdentity } : {}),\n\t\t\tapi: request.api,\n\t\t\tprovider: request.provider,\n\t\t\troute: identity.route,\n\t\t\tmodel: identity.model,\n\t\t\t...(assessment\n\t\t\t\t? {\n\t\t\t\t\t\tprofile: assessment.profile,\n\t\t\t\t\t\tcontextTokens: assessment.contextTokens,\n\t\t\t\t\t\toutputReserveTokens: assessment.outputReserveTokens,\n\t\t\t\t\t}\n\t\t\t\t: { budget: \"unbudgeted\" }),\n\t\t\tconfiguration,\n\t\t\tpolicy,\n\t\t},\n\t\tmaxBytes,\n\t);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"context-epoch.d.ts","sourceRoot":"","sources":["../../src/core/context-epoch.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ProviderRequestRepresentation, RequestTokenAssessment, Usage } from \"@ponythewhite/base-context-ai\";\nimport { requestTokenRouteIdentity } from \"@ponythewhite/base-context-ai\";\nimport { stringifyBoundedJson } from \"./bounded-json.js\";\nimport type { ContextRef, IndexedSourceEvent } from \"./history-index.js\";\nimport type { SourceSnapshotRef } from \"./request-events.js\";\nimport { MAX_RESOURCE_REVISION_BYTES } from \"./resource-view.js\";\nimport type { SelectedSkillReference } from \"./selected-skills.js\";\nimport type { CompiledTaskFrame } from \"./task-frame.js\";\n\nexport const CONTEXT_EPOCH_DETAIL = \"baseContextEpoch\";\n/** Internal admission, not a field accepted by ordinary appendCompaction callers. */\nexport const appendContextEpoch = Symbol(\"appendContextEpoch\");\nexport const CONTEXT_EPOCH_RENDERER = \"native-canonical-epoch/4\";\nexport const CONTEXT_POLICY_EPOCH_RENDERER = \"native-canonical-epoch/5\";\nexport const CONTEXT_TOOL_EPOCH_RENDERER = \"native-canonical-epoch/6\";\n/** Selection-bearing v4/v5/v6 variants; older readers must refuse rather than drop these refs. */\nexport const CONTEXT_SKILL_EPOCH_RENDERER = \"native-canonical-epoch/7\";\n/** Source-backed summary with retained public tool groups, not a measured MAIN request. */\nexport const CONTEXT_TOOL_SUMMARY_RENDERER = \"native-canonical-epoch/8\";\n/** Public recipes may record absent admission, never a fabricated execution outcome. */\nexport const CONTEXT_INTERRUPTED_TOOL_RENDERER = \"native-canonical-epoch/9\";\n\n/** Descriptive, source-backed outcomes in the existing accepted epoch, not an execution store. */\nexport interface ToolContinuationGroup {\n\treadonly assistantEntryId: string;\n\treadonly calls: readonly (\n\t\t| {\n\t\t\t\treadonly admission?: never;\n\t\t\t\treadonly executionId: string;\n\t\t\t\treadonly intent: Pick<IndexedSourceEvent, \"id\" | \"sequence\" | \"revision\">;\n\t\t\t\treadonly outcome: \"outcome_unknown\" | \"not_started\" | \"completed\" | \"failed\";\n\t\t\t\treadonly result?: Pick<IndexedSourceEvent, \"id\" | \"sequence\" | \"revision\">;\n\t\t }\n\t\t| {\n\t\t\t\treadonly admission: \"absent\";\n\t\t\t\t/** Absence is scoped to this exact captured branch prefix, not external effects. */\n\t\t\t\treadonly source: SourceSnapshotRef;\n\t\t\t\treadonly executionId?: never;\n\t\t\t\treadonly intent?: never;\n\t\t\t\treadonly outcome?: never;\n\t\t\t\treadonly result?: never;\n\t\t }\n\t)[];\n}\nexport type ContextMode = \"on\" | \"off\";\n\n/** Compatibility retained from an accepted native request, not measurement or replay credit. */\nexport interface ContextEpochRequestContract {\n\treadonly api: string;\n\treadonly provider: string;\n\treadonly route: string;\n\treadonly model: string;\n\treadonly replayContract: ContextReplayContract;\n}\nexport type ContextReplayContract = \"complete-context\" | \"message-groups\";\n\n/** An ordinary summary and its retained source recipes share the existing compaction ACK. */\nexport interface ContextEpochSummary {\n\treadonly summary: string;\n\treadonly details?: Record<string, unknown>;\n\treadonly fromHook?: boolean;\n\treadonly customInstructions?: string;\n\treadonly usage?: Usage;\n}\n\n/** A frozen read recipe, not a second copy of an archived message body. */\nexport interface EpochViewReference {\n\treadonly source: SourceSnapshotRef;\n\treadonly ref: ContextRef;\n\treadonly sourceRevision: string;\n\t/** Present only for an existing rendered compaction summary. */\n\treadonly retainedMessageCount?: number;\n\treadonly rendering?: \"public-history/1\" | \"public-tool-continuation/1\";\n}\n\ninterface ContextEpochFields {\n\treadonly renderer:\n\t\t| \"native-canonical-epoch/1\"\n\t\t| \"native-canonical-epoch/2\"\n\t\t| \"native-canonical-epoch/3\"\n\t\t| typeof CONTEXT_EPOCH_RENDERER\n\t\t| typeof CONTEXT_POLICY_EPOCH_RENDERER\n\t\t| typeof CONTEXT_TOOL_EPOCH_RENDERER\n\t\t| typeof CONTEXT_SKILL_EPOCH_RENDERER\n\t\t| typeof CONTEXT_TOOL_SUMMARY_RENDERER\n\t\t| typeof CONTEXT_INTERRUPTED_TOOL_RENDERER;\n\treadonly source: SourceSnapshotRef;\n\treadonly includeSummary?: true;\n\t/** Granted by an actual accepted adapter projection, never a caller profile name. */\n\treadonly replayContract?: ContextReplayContract;\n\t/** Actual adapter permission to leave completed native groups for a fresh public window. */\n\treadonly publicWindow?: true;\n\t/** Frozen public transition. Later native messages are not silently converted. */\n\treadonly continuation?: {\n\t\treadonly kind: \"harness-summary\" | \"portable-checkpoint\";\n\t\treadonly publicTailThrough: SourceSnapshotRef;\n\t};\n\treadonly views: readonly EpochViewReference[];\n\t/** Captured versions, not a body cache or authority inferred from transcript markup. */\n\treadonly selectedSkills?: readonly SelectedSkillReference[];\n\t/** v6 requests and v8 summaries retain whole public groups and their exact outcome refs. */\n\treadonly toolContinuations?: readonly ToolContinuationGroup[];\n\t/** Derived display only. The task reducer remains the authority for later changes. */\n\treadonly taskFrame?: CompiledTaskFrame;\n\t/** Accepted-state comparison only; saved metadata never establishes current resource liveness. */\n\treadonly resourceRevision?: string;\n\treadonly literalTailId: string;\n}\n\n/** v5 policy-only null is a mode ACK, not an ordinary summary or a measured request. */\nexport type ContextEpochCheckpoint = ContextEpochFields &\n\t(\n\t\t| {\n\t\t\t\treadonly version: 1 | 2 | 3 | 4 | 6;\n\t\t\t\treadonly representation: string | null;\n\t\t\t\treadonly mode?: never;\n\t\t\t\treadonly policyOnly?: never;\n\t\t\t\treadonly requestContract?: never;\n\t\t\t\treadonly pendingRequestContract?: never;\n\t\t }\n\t\t| {\n\t\t\t\treadonly version: 8;\n\t\t\t\treadonly mode: ContextMode;\n\t\t\t\treadonly representation: null;\n\t\t\t\treadonly includeSummary: true;\n\t\t\t\treadonly policyOnly?: never;\n\t\t\t\treadonly requestContract?: never;\n\t\t\t\treadonly pendingRequestContract?: never;\n\t\t }\n\t\t| {\n\t\t\t\treadonly version: 5;\n\t\t\t\treadonly mode: ContextMode;\n\t\t\t\treadonly representation: null;\n\t\t\t\treadonly policyOnly: true;\n\t\t\t\treadonly includeSummary?: never;\n\t\t\t\treadonly requestContract?: ContextEpochRequestContract;\n\t\t\t\treadonly pendingRequestContract?: true;\n\t\t }\n\t);\n\nexport function contextEpochMode(\n\tcheckpoint: ContextEpochCheckpoint | undefined,\n\tinitial: ContextMode = \"on\",\n): ContextMode {\n\treturn checkpoint ? (checkpoint.version === 5 || checkpoint.version === 8 ? checkpoint.mode : \"on\") : initial;\n}\n\nfunction isRequestContract(value: unknown): value is ContextEpochRequestContract {\n\tif (!value || typeof value !== \"object\") return false;\n\treturn (\n\t\t[\"api\", \"provider\", \"route\", \"model\"].every(\n\t\t\t(key) =>\n\t\t\t\tkey in value &&\n\t\t\t\ttypeof (value as Record<string, unknown>)[key] === \"string\" &&\n\t\t\t\t(value as Record<string, unknown>)[key] !== \"\",\n\t\t) &&\n\t\t\"replayContract\" in value &&\n\t\t(value.replayContract === \"complete-context\" || value.replayContract === \"message-groups\")\n\t);\n}\n\n/** Only call with a qualified checkpoint, never raw compaction marker data. */\nexport function retainedContextRequestContract(\n\tcheckpoint: ContextEpochCheckpoint | undefined,\n): ContextEpochRequestContract | undefined {\n\tif (!checkpoint) return;\n\tif (checkpoint.requestContract) return structuredClone(checkpoint.requestContract);\n\tif (!checkpoint.representation) return;\n\tconst accepted: unknown = JSON.parse(checkpoint.representation);\n\tif (!accepted || typeof accepted !== \"object\") throw new Error(\"Accepted context request contract is unavailable\");\n\tconst value = { ...accepted, replayContract: checkpoint.replayContract ?? \"complete-context\" };\n\tif (!isRequestContract(value)) throw new Error(\"Accepted context request contract is unavailable\");\n\treturn {\n\t\tapi: value.api,\n\t\tprovider: value.provider,\n\t\troute: value.route,\n\t\tmodel: value.model,\n\t\treplayContract: value.replayContract,\n\t};\n}\n\n/** Identity comes from the actual final native serialization, not a model/profile label. */\nexport function contextRequestContract(\n\trequest: ProviderRequestRepresentation,\n\treplayContract: ContextReplayContract,\n): ContextEpochRequestContract {\n\tconst route = requestTokenRouteIdentity(request.url);\n\tconst body: unknown = request.body === undefined ? undefined : JSON.parse(request.body);\n\tif (\n\t\t!route ||\n\t\t!body ||\n\t\ttypeof body !== \"object\" ||\n\t\t!(\"model\" in body) ||\n\t\ttypeof body.model !== \"string\" ||\n\t\t!body.model\n\t)\n\t\tthrow new Error(\"Native context request identity is unavailable\");\n\treturn { api: request.api, provider: request.provider, route, model: body.model, replayContract };\n}\n\nexport function assertContextRequestContract(\n\tcontract: ContextEpochRequestContract,\n\trequest: ProviderRequestRepresentation,\n\treplayContract: ContextReplayContract,\n): void {\n\tconst actual = contextRequestContract(request, replayContract);\n\tif (\n\t\tactual.api !== contract.api ||\n\t\tactual.provider !== contract.provider ||\n\t\tactual.route !== contract.route ||\n\t\tactual.model !== contract.model ||\n\t\tactual.replayContract !== contract.replayContract\n\t)\n\t\tthrow new Error(\"Retained context requires its accepted native request contract\");\n}\n\nexport function snapshotContextEpoch<T extends ContextEpochCheckpoint>(value: T, maxBytes: number): T {\n\treturn JSON.parse(stringifyBoundedJson(value, maxBytes)) as T;\n}\n\n/** Called only after checking the source frame's genuine epoch qualification. */\nexport function readContextEpoch(details: unknown, maxBytes: number): ContextEpochCheckpoint | undefined {\n\tif (!details || typeof details !== \"object\" || !(CONTEXT_EPOCH_DETAIL in details)) return;\n\tconst value: unknown = details[CONTEXT_EPOCH_DETAIL];\n\tif (\n\t\t!value ||\n\t\ttypeof value !== \"object\" ||\n\t\t!(\"version\" in value) ||\n\t\t!(\"renderer\" in value) ||\n\t\t!(\n\t\t\t(value.version === 1 && value.renderer === \"native-canonical-epoch/1\") ||\n\t\t\t(value.version === 2 && value.renderer === \"native-canonical-epoch/2\") ||\n\t\t\t(value.version === 3 && value.renderer === \"native-canonical-epoch/3\") ||\n\t\t\t(value.version === 4 && value.renderer === \"native-canonical-epoch/4\") ||\n\t\t\t(value.version === 5 && value.renderer === CONTEXT_POLICY_EPOCH_RENDERER) ||\n\t\t\t(value.version === 6 && value.renderer === CONTEXT_TOOL_EPOCH_RENDERER) ||\n\t\t\t(value.version === 8 && value.renderer === CONTEXT_TOOL_SUMMARY_RENDERER) ||\n\t\t\t([6, 8].includes(value.version as number) && value.renderer === CONTEXT_INTERRUPTED_TOOL_RENDERER) ||\n\t\t\t([4, 5, 6].includes(value.version as number) && value.renderer === CONTEXT_SKILL_EPOCH_RENDERER)\n\t\t) ||\n\t\t(value.renderer === CONTEXT_SKILL_EPOCH_RENDERER ||\n\t\t((value.version === 8 || value.renderer === CONTEXT_INTERRUPTED_TOOL_RENDERER) && \"selectedSkills\" in value)\n\t\t\t? !(\"selectedSkills\" in value) ||\n\t\t\t\t!Array.isArray(value.selectedSkills) ||\n\t\t\t\tvalue.selectedSkills.length === 0 ||\n\t\t\t\tvalue.selectedSkills.some(\n\t\t\t\t\t(item) =>\n\t\t\t\t\t\t!item ||\n\t\t\t\t\t\ttypeof item.name !== \"string\" ||\n\t\t\t\t\t\t!item.view ||\n\t\t\t\t\t\t![\"custom_message\", \"custom\"].includes(item.view.ref?.kind) ||\n\t\t\t\t\t\ttypeof item.view.sourceRevision !== \"string\",\n\t\t\t\t) ||\n\t\t\t\tnew Set(value.selectedSkills.map((item) => item.name)).size !== value.selectedSkills.length\n\t\t\t: \"selectedSkills\" in value) ||\n\t\t!(\"source\" in value) ||\n\t\t!value.source ||\n\t\t!(\"views\" in value) ||\n\t\t!Array.isArray(value.views) ||\n\t\t!(\"literalTailId\" in value) ||\n\t\ttypeof value.literalTailId !== \"string\" ||\n\t\t!(\"representation\" in value) ||\n\t\t(value.version === 5 || value.version === 8\n\t\t\t? !(\"mode\" in value) || (value.mode !== \"on\" && value.mode !== \"off\")\n\t\t\t: \"mode\" in value) ||\n\t\t(value.version === 8 &&\n\t\t\t(value.representation !== null || !(\"includeSummary\" in value) || value.includeSummary !== true)) ||\n\t\t(value.version === 5 &&\n\t\t\t(value.representation !== null || !(\"policyOnly\" in value) || value.policyOnly !== true)) ||\n\t\t(\"policyOnly\" in value &&\n\t\t\t(value.version !== 5 ||\n\t\t\t\tvalue.policyOnly !== true ||\n\t\t\t\tvalue.representation !== null ||\n\t\t\t\t\"includeSummary\" in value)) ||\n\t\t(\"pendingRequestContract\" in value &&\n\t\t\t(value.version !== 5 ||\n\t\t\t\t!(\"mode\" in value) ||\n\t\t\t\tvalue.mode !== \"off\" ||\n\t\t\t\tvalue.pendingRequestContract !== true ||\n\t\t\t\t\"requestContract\" in value)) ||\n\t\t(\"requestContract\" in value && (value.version !== 5 || !isRequestContract(value.requestContract))) ||\n\t\t!(\n\t\t\ttypeof value.representation === \"string\" ||\n\t\t\t(value.version === 5 && value.representation === null && \"policyOnly\" in value && value.policyOnly === true) ||\n\t\t\t((value.version === 2 || value.version === 3 || value.version === 4 || value.version === 8) &&\n\t\t\t\tvalue.representation === null &&\n\t\t\t\t\"includeSummary\" in value &&\n\t\t\t\tvalue.includeSummary === true)\n\t\t) ||\n\t\t(\"includeSummary\" in value &&\n\t\t\t((value.version !== 2 && value.version !== 3 && value.version !== 4 && value.version !== 8) ||\n\t\t\t\tvalue.includeSummary !== true ||\n\t\t\t\tvalue.representation !== null)) ||\n\t\t(\"replayContract\" in value &&\n\t\t\tvalue.replayContract !== \"complete-context\" &&\n\t\t\tvalue.replayContract !== \"message-groups\") ||\n\t\t(\"resourceRevision\" in value &&\n\t\t\t(typeof value.resourceRevision !== \"string\" ||\n\t\t\t\tBuffer.byteLength(value.resourceRevision, \"utf8\") > MAX_RESOURCE_REVISION_BYTES)) ||\n\t\t(\"publicWindow\" in value &&\n\t\t\t((value.version !== 3 &&\n\t\t\t\tvalue.version !== 4 &&\n\t\t\t\tvalue.version !== 5 &&\n\t\t\t\tvalue.version !== 6 &&\n\t\t\t\tvalue.version !== 8) ||\n\t\t\t\tvalue.publicWindow !== true)) ||\n\t\t(\"toolContinuations\" in value && value.version !== 6 && value.version !== 8) ||\n\t\t((value.version === 6 || value.version === 8) &&\n\t\t\t(!(\"toolContinuations\" in value) ||\n\t\t\t\t!Array.isArray(value.toolContinuations) ||\n\t\t\t\t!value.toolContinuations.length ||\n\t\t\t\t!(\"replayContract\" in value) ||\n\t\t\t\t(value.version === 6 &&\n\t\t\t\t\t(!(\"publicWindow\" in value) ||\n\t\t\t\t\t\tvalue.publicWindow !== true ||\n\t\t\t\t\t\tvalue.replayContract !== \"message-groups\")))) ||\n\t\t(\"continuation\" in value &&\n\t\t\t((value.version !== 3 &&\n\t\t\t\tvalue.version !== 4 &&\n\t\t\t\tvalue.version !== 5 &&\n\t\t\t\tvalue.version !== 6 &&\n\t\t\t\tvalue.version !== 8) ||\n\t\t\t\t!value.continuation ||\n\t\t\t\ttypeof value.continuation !== \"object\" ||\n\t\t\t\t!(\"kind\" in value.continuation) ||\n\t\t\t\t(value.continuation.kind !== \"harness-summary\" &&\n\t\t\t\t\t((value.version !== 4 && value.version !== 5 && value.version !== 6) ||\n\t\t\t\t\t\tvalue.continuation.kind !== \"portable-checkpoint\")) ||\n\t\t\t\t!(\"publicTailThrough\" in value.continuation) ||\n\t\t\t\t!value.continuation.publicTailThrough))\n\t)\n\t\tthrow new Error(\"Invalid committed context epoch\");\n\treturn snapshotContextEpoch(value as ContextEpochCheckpoint, maxBytes);\n}\n\n/** This configuration cannot be persisted as an epoch; it may still be valid full-native input. */\nexport class UnsupportedContextEpochConfigurationError extends Error {\n\tconstructor() {\n\t\tsuper(\"Unsupported context epoch request configuration\");\n\t\tthis.name = \"UnsupportedContextEpochConfigurationError\";\n\t}\n}\n\n/** Stable representation, not the changing input, an auth envelope, or a cache-hit claim. */\nexport function contextEpochRepresentation(\n\trequest: ProviderRequestRepresentation,\n\tassessment: RequestTokenAssessment | undefined,\n\tmaxBytes: number,\n\tunbudgetedPublic = false,\n\tresponseItemIdentity?: string,\n): string {\n\tif (\n\t\t(!assessment && !unbudgetedPublic) ||\n\t\t(assessment &&\n\t\t\t(!assessment.profile ||\n\t\t\t\tassessment.limitSource !== \"explicit-profile\" ||\n\t\t\t\t!assessment.route ||\n\t\t\t\t!assessment.model)) ||\n\t\trequest.body === undefined\n\t)\n\t\tthrow new Error(\"Committed context epoch requires its explicit request profile\");\n\tconst identity = assessment ?? contextRequestContract(request, \"message-groups\");\n\tconst body: unknown = JSON.parse(request.body);\n\tif (!body || typeof body !== \"object\" || Array.isArray(body))\n\t\tthrow new Error(\"Context epoch request representation is unavailable\");\n\tconst configuration: Record<string, unknown> = {};\n\tconst fields = new Set([\n\t\t\"model\",\n\t\t\"instructions\",\n\t\t\"stream\",\n\t\t\"max_output_tokens\",\n\t\t\"max_tokens\",\n\t\t\"max_completion_tokens\",\n\t\t\"temperature\",\n\t\t\"top_p\",\n\t\t\"text\",\n\t\t\"tools\",\n\t\t\"tool_choice\",\n\t\t\"parallel_tool_calls\",\n\t\t\"store\",\n\t\t\"reasoning\",\n\t\t\"service_tier\",\n\t\t\"truncation\",\n\t\t\"include\",\n\t\t\"prompt_cache_retention\",\n\t\t\"stream_options\",\n\t]);\n\tif (\n\t\trequest.api === \"openai-completions\" &&\n\t\trequest.provider === \"deepseek\" &&\n\t\trequest.url === \"https://api.deepseek.com/chat/completions\" &&\n\t\tidentity.route === request.url &&\n\t\t\"model\" in body &&\n\t\tbody.model === \"deepseek-flash\" &&\n\t\tidentity.model === body.model\n\t) {\n\t\tfields.add(\"thinking\");\n\t\tfields.add(\"reasoning_effort\");\n\t}\n\tfor (const [key, value] of Object.entries(body)) {\n\t\tif ([\"input\", \"messages\", \"previous_response_id\", \"prompt_cache_key\"].includes(key)) continue;\n\t\t// Unknown payload extensions may contain private data or change the representation.\n\t\tif (!fields.has(key)) throw new UnsupportedContextEpochConfigurationError();\n\t\tconfiguration[key] = value;\n\t}\n\tconst input: unknown = \"input\" in body ? body.input : \"messages\" in body ? body.messages : undefined;\n\tif (!Array.isArray(input)) throw new Error(\"Context epoch request messages are unavailable\");\n\tconst policy = input.filter(\n\t\t(item: unknown) =>\n\t\t\titem && typeof item === \"object\" && \"role\" in item && (item.role === \"system\" || item.role === \"developer\"),\n\t);\n\treturn stringifyBoundedJson(\n\t\t{\n\t\t\trenderer: CONTEXT_EPOCH_RENDERER,\n\t\t\t...(responseItemIdentity ? { responseItemIdentity } : {}),\n\t\t\tapi: request.api,\n\t\t\tprovider: request.provider,\n\t\t\troute: identity.route,\n\t\t\tmodel: identity.model,\n\t\t\t...(assessment\n\t\t\t\t? {\n\t\t\t\t\t\tprofile: assessment.profile,\n\t\t\t\t\t\tcontextTokens: assessment.contextTokens,\n\t\t\t\t\t\toutputReserveTokens: assessment.outputReserveTokens,\n\t\t\t\t\t}\n\t\t\t\t: { budget: \"unbudgeted\" }),\n\t\t\tconfiguration,\n\t\t\tpolicy,\n\t\t},\n\t\tmaxBytes,\n\t);\n}\n"]}
|
|
@@ -11,6 +11,8 @@ export const CONTEXT_TOOL_EPOCH_RENDERER = "native-canonical-epoch/6";
|
|
|
11
11
|
export const CONTEXT_SKILL_EPOCH_RENDERER = "native-canonical-epoch/7";
|
|
12
12
|
/** Source-backed summary with retained public tool groups, not a measured MAIN request. */
|
|
13
13
|
export const CONTEXT_TOOL_SUMMARY_RENDERER = "native-canonical-epoch/8";
|
|
14
|
+
/** Public recipes may record absent admission, never a fabricated execution outcome. */
|
|
15
|
+
export const CONTEXT_INTERRUPTED_TOOL_RENDERER = "native-canonical-epoch/9";
|
|
14
16
|
export function contextEpochMode(checkpoint, initial = "on") {
|
|
15
17
|
return checkpoint ? (checkpoint.version === 5 || checkpoint.version === 8 ? checkpoint.mode : "on") : initial;
|
|
16
18
|
}
|
|
@@ -86,8 +88,10 @@ export function readContextEpoch(details, maxBytes) {
|
|
|
86
88
|
(value.version === 5 && value.renderer === CONTEXT_POLICY_EPOCH_RENDERER) ||
|
|
87
89
|
(value.version === 6 && value.renderer === CONTEXT_TOOL_EPOCH_RENDERER) ||
|
|
88
90
|
(value.version === 8 && value.renderer === CONTEXT_TOOL_SUMMARY_RENDERER) ||
|
|
91
|
+
([6, 8].includes(value.version) && value.renderer === CONTEXT_INTERRUPTED_TOOL_RENDERER) ||
|
|
89
92
|
([4, 5, 6].includes(value.version) && value.renderer === CONTEXT_SKILL_EPOCH_RENDERER)) ||
|
|
90
|
-
(value.renderer === CONTEXT_SKILL_EPOCH_RENDERER ||
|
|
93
|
+
(value.renderer === CONTEXT_SKILL_EPOCH_RENDERER ||
|
|
94
|
+
((value.version === 8 || value.renderer === CONTEXT_INTERRUPTED_TOOL_RENDERER) && "selectedSkills" in value)
|
|
91
95
|
? !("selectedSkills" in value) ||
|
|
92
96
|
!Array.isArray(value.selectedSkills) ||
|
|
93
97
|
value.selectedSkills.length === 0 ||
|
|
@@ -174,6 +178,13 @@ export function readContextEpoch(details, maxBytes) {
|
|
|
174
178
|
throw new Error("Invalid committed context epoch");
|
|
175
179
|
return snapshotContextEpoch(value, maxBytes);
|
|
176
180
|
}
|
|
181
|
+
/** This configuration cannot be persisted as an epoch; it may still be valid full-native input. */
|
|
182
|
+
export class UnsupportedContextEpochConfigurationError extends Error {
|
|
183
|
+
constructor() {
|
|
184
|
+
super("Unsupported context epoch request configuration");
|
|
185
|
+
this.name = "UnsupportedContextEpochConfigurationError";
|
|
186
|
+
}
|
|
187
|
+
}
|
|
177
188
|
/** Stable representation, not the changing input, an auth envelope, or a cache-hit claim. */
|
|
178
189
|
export function contextEpochRepresentation(request, assessment, maxBytes, unbudgetedPublic = false, responseItemIdentity) {
|
|
179
190
|
if ((!assessment && !unbudgetedPublic) ||
|
|
@@ -225,7 +236,7 @@ export function contextEpochRepresentation(request, assessment, maxBytes, unbudg
|
|
|
225
236
|
continue;
|
|
226
237
|
// Unknown payload extensions may contain private data or change the representation.
|
|
227
238
|
if (!fields.has(key))
|
|
228
|
-
throw new
|
|
239
|
+
throw new UnsupportedContextEpochConfigurationError();
|
|
229
240
|
configuration[key] = value;
|
|
230
241
|
}
|
|
231
242
|
const input = "input" in body ? body.input : "messages" in body ? body.messages : undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-epoch.js","sourceRoot":"","sources":["../../src/core/context-epoch.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ProviderRequestRepresentation, RequestTokenAssessment, Usage } from \"@ponythewhite/base-context-ai\";\nimport { requestTokenRouteIdentity } from \"@ponythewhite/base-context-ai\";\nimport { stringifyBoundedJson } from \"./bounded-json.js\";\nimport type { ContextRef, IndexedSourceEvent } from \"./history-index.js\";\nimport type { SourceSnapshotRef } from \"./request-events.js\";\nimport { MAX_RESOURCE_REVISION_BYTES } from \"./resource-view.js\";\nimport type { SelectedSkillReference } from \"./selected-skills.js\";\nimport type { CompiledTaskFrame } from \"./task-frame.js\";\n\nexport const CONTEXT_EPOCH_DETAIL = \"baseContextEpoch\";\n/** Internal admission, not a field accepted by ordinary appendCompaction callers. */\nexport const appendContextEpoch = Symbol(\"appendContextEpoch\");\nexport const CONTEXT_EPOCH_RENDERER = \"native-canonical-epoch/4\";\nexport const CONTEXT_POLICY_EPOCH_RENDERER = \"native-canonical-epoch/5\";\nexport const CONTEXT_TOOL_EPOCH_RENDERER = \"native-canonical-epoch/6\";\n/** Selection-bearing v4/v5/v6 variants; older readers must refuse rather than drop these refs. */\nexport const CONTEXT_SKILL_EPOCH_RENDERER = \"native-canonical-epoch/7\";\n/** Source-backed summary with retained public tool groups, not a measured MAIN request. */\nexport const CONTEXT_TOOL_SUMMARY_RENDERER = \"native-canonical-epoch/8\";\n\n/** Descriptive, source-backed outcomes in the existing accepted epoch, not an execution store. */\nexport interface ToolContinuationGroup {\n\treadonly assistantEntryId: string;\n\treadonly calls: readonly {\n\t\treadonly executionId: string;\n\t\treadonly intent: Pick<IndexedSourceEvent, \"id\" | \"sequence\" | \"revision\">;\n\t\treadonly outcome: \"outcome_unknown\" | \"not_started\" | \"completed\" | \"failed\";\n\t\treadonly result?: Pick<IndexedSourceEvent, \"id\" | \"sequence\" | \"revision\">;\n\t}[];\n}\nexport type ContextMode = \"on\" | \"off\";\n\n/** Compatibility retained from an accepted native request, not measurement or replay credit. */\nexport interface ContextEpochRequestContract {\n\treadonly api: string;\n\treadonly provider: string;\n\treadonly route: string;\n\treadonly model: string;\n\treadonly replayContract: ContextReplayContract;\n}\nexport type ContextReplayContract = \"complete-context\" | \"message-groups\";\n\n/** An ordinary summary and its retained source recipes share the existing compaction ACK. */\nexport interface ContextEpochSummary {\n\treadonly summary: string;\n\treadonly details?: Record<string, unknown>;\n\treadonly fromHook?: boolean;\n\treadonly customInstructions?: string;\n\treadonly usage?: Usage;\n}\n\n/** A frozen read recipe, not a second copy of an archived message body. */\nexport interface EpochViewReference {\n\treadonly source: SourceSnapshotRef;\n\treadonly ref: ContextRef;\n\treadonly sourceRevision: string;\n\t/** Present only for an existing rendered compaction summary. */\n\treadonly retainedMessageCount?: number;\n\treadonly rendering?: \"public-history/1\" | \"public-tool-continuation/1\";\n}\n\ninterface ContextEpochFields {\n\treadonly renderer:\n\t\t| \"native-canonical-epoch/1\"\n\t\t| \"native-canonical-epoch/2\"\n\t\t| \"native-canonical-epoch/3\"\n\t\t| typeof CONTEXT_EPOCH_RENDERER\n\t\t| typeof CONTEXT_POLICY_EPOCH_RENDERER\n\t\t| typeof CONTEXT_TOOL_EPOCH_RENDERER\n\t\t| typeof CONTEXT_SKILL_EPOCH_RENDERER\n\t\t| typeof CONTEXT_TOOL_SUMMARY_RENDERER;\n\treadonly source: SourceSnapshotRef;\n\treadonly includeSummary?: true;\n\t/** Granted by an actual accepted adapter projection, never a caller profile name. */\n\treadonly replayContract?: ContextReplayContract;\n\t/** Actual adapter permission to leave completed native groups for a fresh public window. */\n\treadonly publicWindow?: true;\n\t/** Frozen public transition. Later native messages are not silently converted. */\n\treadonly continuation?: {\n\t\treadonly kind: \"harness-summary\" | \"portable-checkpoint\";\n\t\treadonly publicTailThrough: SourceSnapshotRef;\n\t};\n\treadonly views: readonly EpochViewReference[];\n\t/** Captured versions, not a body cache or authority inferred from transcript markup. */\n\treadonly selectedSkills?: readonly SelectedSkillReference[];\n\t/** v6 requests and v8 summaries retain whole public groups and their exact outcome refs. */\n\treadonly toolContinuations?: readonly ToolContinuationGroup[];\n\t/** Derived display only. The task reducer remains the authority for later changes. */\n\treadonly taskFrame?: CompiledTaskFrame;\n\t/** Accepted-state comparison only; saved metadata never establishes current resource liveness. */\n\treadonly resourceRevision?: string;\n\treadonly literalTailId: string;\n}\n\n/** v5 policy-only null is a mode ACK, not an ordinary summary or a measured request. */\nexport type ContextEpochCheckpoint = ContextEpochFields &\n\t(\n\t\t| {\n\t\t\t\treadonly version: 1 | 2 | 3 | 4 | 6;\n\t\t\t\treadonly representation: string | null;\n\t\t\t\treadonly mode?: never;\n\t\t\t\treadonly policyOnly?: never;\n\t\t\t\treadonly requestContract?: never;\n\t\t\t\treadonly pendingRequestContract?: never;\n\t\t }\n\t\t| {\n\t\t\t\treadonly version: 8;\n\t\t\t\treadonly mode: ContextMode;\n\t\t\t\treadonly representation: null;\n\t\t\t\treadonly includeSummary: true;\n\t\t\t\treadonly policyOnly?: never;\n\t\t\t\treadonly requestContract?: never;\n\t\t\t\treadonly pendingRequestContract?: never;\n\t\t }\n\t\t| {\n\t\t\t\treadonly version: 5;\n\t\t\t\treadonly mode: ContextMode;\n\t\t\t\treadonly representation: null;\n\t\t\t\treadonly policyOnly: true;\n\t\t\t\treadonly includeSummary?: never;\n\t\t\t\treadonly requestContract?: ContextEpochRequestContract;\n\t\t\t\treadonly pendingRequestContract?: true;\n\t\t }\n\t);\n\nexport function contextEpochMode(\n\tcheckpoint: ContextEpochCheckpoint | undefined,\n\tinitial: ContextMode = \"on\",\n): ContextMode {\n\treturn checkpoint ? (checkpoint.version === 5 || checkpoint.version === 8 ? checkpoint.mode : \"on\") : initial;\n}\n\nfunction isRequestContract(value: unknown): value is ContextEpochRequestContract {\n\tif (!value || typeof value !== \"object\") return false;\n\treturn (\n\t\t[\"api\", \"provider\", \"route\", \"model\"].every(\n\t\t\t(key) =>\n\t\t\t\tkey in value &&\n\t\t\t\ttypeof (value as Record<string, unknown>)[key] === \"string\" &&\n\t\t\t\t(value as Record<string, unknown>)[key] !== \"\",\n\t\t) &&\n\t\t\"replayContract\" in value &&\n\t\t(value.replayContract === \"complete-context\" || value.replayContract === \"message-groups\")\n\t);\n}\n\n/** Only call with a qualified checkpoint, never raw compaction marker data. */\nexport function retainedContextRequestContract(\n\tcheckpoint: ContextEpochCheckpoint | undefined,\n): ContextEpochRequestContract | undefined {\n\tif (!checkpoint) return;\n\tif (checkpoint.requestContract) return structuredClone(checkpoint.requestContract);\n\tif (!checkpoint.representation) return;\n\tconst accepted: unknown = JSON.parse(checkpoint.representation);\n\tif (!accepted || typeof accepted !== \"object\") throw new Error(\"Accepted context request contract is unavailable\");\n\tconst value = { ...accepted, replayContract: checkpoint.replayContract ?? \"complete-context\" };\n\tif (!isRequestContract(value)) throw new Error(\"Accepted context request contract is unavailable\");\n\treturn {\n\t\tapi: value.api,\n\t\tprovider: value.provider,\n\t\troute: value.route,\n\t\tmodel: value.model,\n\t\treplayContract: value.replayContract,\n\t};\n}\n\n/** Identity comes from the actual final native serialization, not a model/profile label. */\nexport function contextRequestContract(\n\trequest: ProviderRequestRepresentation,\n\treplayContract: ContextReplayContract,\n): ContextEpochRequestContract {\n\tconst route = requestTokenRouteIdentity(request.url);\n\tconst body: unknown = request.body === undefined ? undefined : JSON.parse(request.body);\n\tif (\n\t\t!route ||\n\t\t!body ||\n\t\ttypeof body !== \"object\" ||\n\t\t!(\"model\" in body) ||\n\t\ttypeof body.model !== \"string\" ||\n\t\t!body.model\n\t)\n\t\tthrow new Error(\"Native context request identity is unavailable\");\n\treturn { api: request.api, provider: request.provider, route, model: body.model, replayContract };\n}\n\nexport function assertContextRequestContract(\n\tcontract: ContextEpochRequestContract,\n\trequest: ProviderRequestRepresentation,\n\treplayContract: ContextReplayContract,\n): void {\n\tconst actual = contextRequestContract(request, replayContract);\n\tif (\n\t\tactual.api !== contract.api ||\n\t\tactual.provider !== contract.provider ||\n\t\tactual.route !== contract.route ||\n\t\tactual.model !== contract.model ||\n\t\tactual.replayContract !== contract.replayContract\n\t)\n\t\tthrow new Error(\"Retained context requires its accepted native request contract\");\n}\n\nexport function snapshotContextEpoch<T extends ContextEpochCheckpoint>(value: T, maxBytes: number): T {\n\treturn JSON.parse(stringifyBoundedJson(value, maxBytes)) as T;\n}\n\n/** Called only after checking the source frame's genuine epoch qualification. */\nexport function readContextEpoch(details: unknown, maxBytes: number): ContextEpochCheckpoint | undefined {\n\tif (!details || typeof details !== \"object\" || !(CONTEXT_EPOCH_DETAIL in details)) return;\n\tconst value: unknown = details[CONTEXT_EPOCH_DETAIL];\n\tif (\n\t\t!value ||\n\t\ttypeof value !== \"object\" ||\n\t\t!(\"version\" in value) ||\n\t\t!(\"renderer\" in value) ||\n\t\t!(\n\t\t\t(value.version === 1 && value.renderer === \"native-canonical-epoch/1\") ||\n\t\t\t(value.version === 2 && value.renderer === \"native-canonical-epoch/2\") ||\n\t\t\t(value.version === 3 && value.renderer === \"native-canonical-epoch/3\") ||\n\t\t\t(value.version === 4 && value.renderer === \"native-canonical-epoch/4\") ||\n\t\t\t(value.version === 5 && value.renderer === CONTEXT_POLICY_EPOCH_RENDERER) ||\n\t\t\t(value.version === 6 && value.renderer === CONTEXT_TOOL_EPOCH_RENDERER) ||\n\t\t\t(value.version === 8 && value.renderer === CONTEXT_TOOL_SUMMARY_RENDERER) ||\n\t\t\t([4, 5, 6].includes(value.version as number) && value.renderer === CONTEXT_SKILL_EPOCH_RENDERER)\n\t\t) ||\n\t\t(value.renderer === CONTEXT_SKILL_EPOCH_RENDERER || (value.version === 8 && \"selectedSkills\" in value)\n\t\t\t? !(\"selectedSkills\" in value) ||\n\t\t\t\t!Array.isArray(value.selectedSkills) ||\n\t\t\t\tvalue.selectedSkills.length === 0 ||\n\t\t\t\tvalue.selectedSkills.some(\n\t\t\t\t\t(item) =>\n\t\t\t\t\t\t!item ||\n\t\t\t\t\t\ttypeof item.name !== \"string\" ||\n\t\t\t\t\t\t!item.view ||\n\t\t\t\t\t\t![\"custom_message\", \"custom\"].includes(item.view.ref?.kind) ||\n\t\t\t\t\t\ttypeof item.view.sourceRevision !== \"string\",\n\t\t\t\t) ||\n\t\t\t\tnew Set(value.selectedSkills.map((item) => item.name)).size !== value.selectedSkills.length\n\t\t\t: \"selectedSkills\" in value) ||\n\t\t!(\"source\" in value) ||\n\t\t!value.source ||\n\t\t!(\"views\" in value) ||\n\t\t!Array.isArray(value.views) ||\n\t\t!(\"literalTailId\" in value) ||\n\t\ttypeof value.literalTailId !== \"string\" ||\n\t\t!(\"representation\" in value) ||\n\t\t(value.version === 5 || value.version === 8\n\t\t\t? !(\"mode\" in value) || (value.mode !== \"on\" && value.mode !== \"off\")\n\t\t\t: \"mode\" in value) ||\n\t\t(value.version === 8 &&\n\t\t\t(value.representation !== null || !(\"includeSummary\" in value) || value.includeSummary !== true)) ||\n\t\t(value.version === 5 &&\n\t\t\t(value.representation !== null || !(\"policyOnly\" in value) || value.policyOnly !== true)) ||\n\t\t(\"policyOnly\" in value &&\n\t\t\t(value.version !== 5 ||\n\t\t\t\tvalue.policyOnly !== true ||\n\t\t\t\tvalue.representation !== null ||\n\t\t\t\t\"includeSummary\" in value)) ||\n\t\t(\"pendingRequestContract\" in value &&\n\t\t\t(value.version !== 5 ||\n\t\t\t\t!(\"mode\" in value) ||\n\t\t\t\tvalue.mode !== \"off\" ||\n\t\t\t\tvalue.pendingRequestContract !== true ||\n\t\t\t\t\"requestContract\" in value)) ||\n\t\t(\"requestContract\" in value && (value.version !== 5 || !isRequestContract(value.requestContract))) ||\n\t\t!(\n\t\t\ttypeof value.representation === \"string\" ||\n\t\t\t(value.version === 5 && value.representation === null && \"policyOnly\" in value && value.policyOnly === true) ||\n\t\t\t((value.version === 2 || value.version === 3 || value.version === 4 || value.version === 8) &&\n\t\t\t\tvalue.representation === null &&\n\t\t\t\t\"includeSummary\" in value &&\n\t\t\t\tvalue.includeSummary === true)\n\t\t) ||\n\t\t(\"includeSummary\" in value &&\n\t\t\t((value.version !== 2 && value.version !== 3 && value.version !== 4 && value.version !== 8) ||\n\t\t\t\tvalue.includeSummary !== true ||\n\t\t\t\tvalue.representation !== null)) ||\n\t\t(\"replayContract\" in value &&\n\t\t\tvalue.replayContract !== \"complete-context\" &&\n\t\t\tvalue.replayContract !== \"message-groups\") ||\n\t\t(\"resourceRevision\" in value &&\n\t\t\t(typeof value.resourceRevision !== \"string\" ||\n\t\t\t\tBuffer.byteLength(value.resourceRevision, \"utf8\") > MAX_RESOURCE_REVISION_BYTES)) ||\n\t\t(\"publicWindow\" in value &&\n\t\t\t((value.version !== 3 &&\n\t\t\t\tvalue.version !== 4 &&\n\t\t\t\tvalue.version !== 5 &&\n\t\t\t\tvalue.version !== 6 &&\n\t\t\t\tvalue.version !== 8) ||\n\t\t\t\tvalue.publicWindow !== true)) ||\n\t\t(\"toolContinuations\" in value && value.version !== 6 && value.version !== 8) ||\n\t\t((value.version === 6 || value.version === 8) &&\n\t\t\t(!(\"toolContinuations\" in value) ||\n\t\t\t\t!Array.isArray(value.toolContinuations) ||\n\t\t\t\t!value.toolContinuations.length ||\n\t\t\t\t!(\"replayContract\" in value) ||\n\t\t\t\t(value.version === 6 &&\n\t\t\t\t\t(!(\"publicWindow\" in value) ||\n\t\t\t\t\t\tvalue.publicWindow !== true ||\n\t\t\t\t\t\tvalue.replayContract !== \"message-groups\")))) ||\n\t\t(\"continuation\" in value &&\n\t\t\t((value.version !== 3 &&\n\t\t\t\tvalue.version !== 4 &&\n\t\t\t\tvalue.version !== 5 &&\n\t\t\t\tvalue.version !== 6 &&\n\t\t\t\tvalue.version !== 8) ||\n\t\t\t\t!value.continuation ||\n\t\t\t\ttypeof value.continuation !== \"object\" ||\n\t\t\t\t!(\"kind\" in value.continuation) ||\n\t\t\t\t(value.continuation.kind !== \"harness-summary\" &&\n\t\t\t\t\t((value.version !== 4 && value.version !== 5 && value.version !== 6) ||\n\t\t\t\t\t\tvalue.continuation.kind !== \"portable-checkpoint\")) ||\n\t\t\t\t!(\"publicTailThrough\" in value.continuation) ||\n\t\t\t\t!value.continuation.publicTailThrough))\n\t)\n\t\tthrow new Error(\"Invalid committed context epoch\");\n\treturn snapshotContextEpoch(value as ContextEpochCheckpoint, maxBytes);\n}\n\n/** Stable representation, not the changing input, an auth envelope, or a cache-hit claim. */\nexport function contextEpochRepresentation(\n\trequest: ProviderRequestRepresentation,\n\tassessment: RequestTokenAssessment | undefined,\n\tmaxBytes: number,\n\tunbudgetedPublic = false,\n\tresponseItemIdentity?: string,\n): string {\n\tif (\n\t\t(!assessment && !unbudgetedPublic) ||\n\t\t(assessment &&\n\t\t\t(!assessment.profile ||\n\t\t\t\tassessment.limitSource !== \"explicit-profile\" ||\n\t\t\t\t!assessment.route ||\n\t\t\t\t!assessment.model)) ||\n\t\trequest.body === undefined\n\t)\n\t\tthrow new Error(\"Committed context epoch requires its explicit request profile\");\n\tconst identity = assessment ?? contextRequestContract(request, \"message-groups\");\n\tconst body: unknown = JSON.parse(request.body);\n\tif (!body || typeof body !== \"object\" || Array.isArray(body))\n\t\tthrow new Error(\"Context epoch request representation is unavailable\");\n\tconst configuration: Record<string, unknown> = {};\n\tconst fields = new Set([\n\t\t\"model\",\n\t\t\"instructions\",\n\t\t\"stream\",\n\t\t\"max_output_tokens\",\n\t\t\"max_tokens\",\n\t\t\"max_completion_tokens\",\n\t\t\"temperature\",\n\t\t\"top_p\",\n\t\t\"text\",\n\t\t\"tools\",\n\t\t\"tool_choice\",\n\t\t\"parallel_tool_calls\",\n\t\t\"store\",\n\t\t\"reasoning\",\n\t\t\"service_tier\",\n\t\t\"truncation\",\n\t\t\"include\",\n\t\t\"prompt_cache_retention\",\n\t\t\"stream_options\",\n\t]);\n\tif (\n\t\trequest.api === \"openai-completions\" &&\n\t\trequest.provider === \"deepseek\" &&\n\t\trequest.url === \"https://api.deepseek.com/chat/completions\" &&\n\t\tidentity.route === request.url &&\n\t\t\"model\" in body &&\n\t\tbody.model === \"deepseek-flash\" &&\n\t\tidentity.model === body.model\n\t) {\n\t\tfields.add(\"thinking\");\n\t\tfields.add(\"reasoning_effort\");\n\t}\n\tfor (const [key, value] of Object.entries(body)) {\n\t\tif ([\"input\", \"messages\", \"previous_response_id\", \"prompt_cache_key\"].includes(key)) continue;\n\t\t// Unknown payload extensions may contain private data or change the representation.\n\t\tif (!fields.has(key)) throw new Error(\"Unsupported context epoch request configuration\");\n\t\tconfiguration[key] = value;\n\t}\n\tconst input: unknown = \"input\" in body ? body.input : \"messages\" in body ? body.messages : undefined;\n\tif (!Array.isArray(input)) throw new Error(\"Context epoch request messages are unavailable\");\n\tconst policy = input.filter(\n\t\t(item: unknown) =>\n\t\t\titem && typeof item === \"object\" && \"role\" in item && (item.role === \"system\" || item.role === \"developer\"),\n\t);\n\treturn stringifyBoundedJson(\n\t\t{\n\t\t\trenderer: CONTEXT_EPOCH_RENDERER,\n\t\t\t...(responseItemIdentity ? { responseItemIdentity } : {}),\n\t\t\tapi: request.api,\n\t\t\tprovider: request.provider,\n\t\t\troute: identity.route,\n\t\t\tmodel: identity.model,\n\t\t\t...(assessment\n\t\t\t\t? {\n\t\t\t\t\t\tprofile: assessment.profile,\n\t\t\t\t\t\tcontextTokens: assessment.contextTokens,\n\t\t\t\t\t\toutputReserveTokens: assessment.outputReserveTokens,\n\t\t\t\t\t}\n\t\t\t\t: { budget: \"unbudgeted\" }),\n\t\t\tconfiguration,\n\t\t\tpolicy,\n\t\t},\n\t\tmaxBytes,\n\t);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"context-epoch.js","sourceRoot":"","sources":["../../src/core/context-epoch.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ProviderRequestRepresentation, RequestTokenAssessment, Usage } from \"@ponythewhite/base-context-ai\";\nimport { requestTokenRouteIdentity } from \"@ponythewhite/base-context-ai\";\nimport { stringifyBoundedJson } from \"./bounded-json.js\";\nimport type { ContextRef, IndexedSourceEvent } from \"./history-index.js\";\nimport type { SourceSnapshotRef } from \"./request-events.js\";\nimport { MAX_RESOURCE_REVISION_BYTES } from \"./resource-view.js\";\nimport type { SelectedSkillReference } from \"./selected-skills.js\";\nimport type { CompiledTaskFrame } from \"./task-frame.js\";\n\nexport const CONTEXT_EPOCH_DETAIL = \"baseContextEpoch\";\n/** Internal admission, not a field accepted by ordinary appendCompaction callers. */\nexport const appendContextEpoch = Symbol(\"appendContextEpoch\");\nexport const CONTEXT_EPOCH_RENDERER = \"native-canonical-epoch/4\";\nexport const CONTEXT_POLICY_EPOCH_RENDERER = \"native-canonical-epoch/5\";\nexport const CONTEXT_TOOL_EPOCH_RENDERER = \"native-canonical-epoch/6\";\n/** Selection-bearing v4/v5/v6 variants; older readers must refuse rather than drop these refs. */\nexport const CONTEXT_SKILL_EPOCH_RENDERER = \"native-canonical-epoch/7\";\n/** Source-backed summary with retained public tool groups, not a measured MAIN request. */\nexport const CONTEXT_TOOL_SUMMARY_RENDERER = \"native-canonical-epoch/8\";\n/** Public recipes may record absent admission, never a fabricated execution outcome. */\nexport const CONTEXT_INTERRUPTED_TOOL_RENDERER = \"native-canonical-epoch/9\";\n\n/** Descriptive, source-backed outcomes in the existing accepted epoch, not an execution store. */\nexport interface ToolContinuationGroup {\n\treadonly assistantEntryId: string;\n\treadonly calls: readonly (\n\t\t| {\n\t\t\t\treadonly admission?: never;\n\t\t\t\treadonly executionId: string;\n\t\t\t\treadonly intent: Pick<IndexedSourceEvent, \"id\" | \"sequence\" | \"revision\">;\n\t\t\t\treadonly outcome: \"outcome_unknown\" | \"not_started\" | \"completed\" | \"failed\";\n\t\t\t\treadonly result?: Pick<IndexedSourceEvent, \"id\" | \"sequence\" | \"revision\">;\n\t\t }\n\t\t| {\n\t\t\t\treadonly admission: \"absent\";\n\t\t\t\t/** Absence is scoped to this exact captured branch prefix, not external effects. */\n\t\t\t\treadonly source: SourceSnapshotRef;\n\t\t\t\treadonly executionId?: never;\n\t\t\t\treadonly intent?: never;\n\t\t\t\treadonly outcome?: never;\n\t\t\t\treadonly result?: never;\n\t\t }\n\t)[];\n}\nexport type ContextMode = \"on\" | \"off\";\n\n/** Compatibility retained from an accepted native request, not measurement or replay credit. */\nexport interface ContextEpochRequestContract {\n\treadonly api: string;\n\treadonly provider: string;\n\treadonly route: string;\n\treadonly model: string;\n\treadonly replayContract: ContextReplayContract;\n}\nexport type ContextReplayContract = \"complete-context\" | \"message-groups\";\n\n/** An ordinary summary and its retained source recipes share the existing compaction ACK. */\nexport interface ContextEpochSummary {\n\treadonly summary: string;\n\treadonly details?: Record<string, unknown>;\n\treadonly fromHook?: boolean;\n\treadonly customInstructions?: string;\n\treadonly usage?: Usage;\n}\n\n/** A frozen read recipe, not a second copy of an archived message body. */\nexport interface EpochViewReference {\n\treadonly source: SourceSnapshotRef;\n\treadonly ref: ContextRef;\n\treadonly sourceRevision: string;\n\t/** Present only for an existing rendered compaction summary. */\n\treadonly retainedMessageCount?: number;\n\treadonly rendering?: \"public-history/1\" | \"public-tool-continuation/1\";\n}\n\ninterface ContextEpochFields {\n\treadonly renderer:\n\t\t| \"native-canonical-epoch/1\"\n\t\t| \"native-canonical-epoch/2\"\n\t\t| \"native-canonical-epoch/3\"\n\t\t| typeof CONTEXT_EPOCH_RENDERER\n\t\t| typeof CONTEXT_POLICY_EPOCH_RENDERER\n\t\t| typeof CONTEXT_TOOL_EPOCH_RENDERER\n\t\t| typeof CONTEXT_SKILL_EPOCH_RENDERER\n\t\t| typeof CONTEXT_TOOL_SUMMARY_RENDERER\n\t\t| typeof CONTEXT_INTERRUPTED_TOOL_RENDERER;\n\treadonly source: SourceSnapshotRef;\n\treadonly includeSummary?: true;\n\t/** Granted by an actual accepted adapter projection, never a caller profile name. */\n\treadonly replayContract?: ContextReplayContract;\n\t/** Actual adapter permission to leave completed native groups for a fresh public window. */\n\treadonly publicWindow?: true;\n\t/** Frozen public transition. Later native messages are not silently converted. */\n\treadonly continuation?: {\n\t\treadonly kind: \"harness-summary\" | \"portable-checkpoint\";\n\t\treadonly publicTailThrough: SourceSnapshotRef;\n\t};\n\treadonly views: readonly EpochViewReference[];\n\t/** Captured versions, not a body cache or authority inferred from transcript markup. */\n\treadonly selectedSkills?: readonly SelectedSkillReference[];\n\t/** v6 requests and v8 summaries retain whole public groups and their exact outcome refs. */\n\treadonly toolContinuations?: readonly ToolContinuationGroup[];\n\t/** Derived display only. The task reducer remains the authority for later changes. */\n\treadonly taskFrame?: CompiledTaskFrame;\n\t/** Accepted-state comparison only; saved metadata never establishes current resource liveness. */\n\treadonly resourceRevision?: string;\n\treadonly literalTailId: string;\n}\n\n/** v5 policy-only null is a mode ACK, not an ordinary summary or a measured request. */\nexport type ContextEpochCheckpoint = ContextEpochFields &\n\t(\n\t\t| {\n\t\t\t\treadonly version: 1 | 2 | 3 | 4 | 6;\n\t\t\t\treadonly representation: string | null;\n\t\t\t\treadonly mode?: never;\n\t\t\t\treadonly policyOnly?: never;\n\t\t\t\treadonly requestContract?: never;\n\t\t\t\treadonly pendingRequestContract?: never;\n\t\t }\n\t\t| {\n\t\t\t\treadonly version: 8;\n\t\t\t\treadonly mode: ContextMode;\n\t\t\t\treadonly representation: null;\n\t\t\t\treadonly includeSummary: true;\n\t\t\t\treadonly policyOnly?: never;\n\t\t\t\treadonly requestContract?: never;\n\t\t\t\treadonly pendingRequestContract?: never;\n\t\t }\n\t\t| {\n\t\t\t\treadonly version: 5;\n\t\t\t\treadonly mode: ContextMode;\n\t\t\t\treadonly representation: null;\n\t\t\t\treadonly policyOnly: true;\n\t\t\t\treadonly includeSummary?: never;\n\t\t\t\treadonly requestContract?: ContextEpochRequestContract;\n\t\t\t\treadonly pendingRequestContract?: true;\n\t\t }\n\t);\n\nexport function contextEpochMode(\n\tcheckpoint: ContextEpochCheckpoint | undefined,\n\tinitial: ContextMode = \"on\",\n): ContextMode {\n\treturn checkpoint ? (checkpoint.version === 5 || checkpoint.version === 8 ? checkpoint.mode : \"on\") : initial;\n}\n\nfunction isRequestContract(value: unknown): value is ContextEpochRequestContract {\n\tif (!value || typeof value !== \"object\") return false;\n\treturn (\n\t\t[\"api\", \"provider\", \"route\", \"model\"].every(\n\t\t\t(key) =>\n\t\t\t\tkey in value &&\n\t\t\t\ttypeof (value as Record<string, unknown>)[key] === \"string\" &&\n\t\t\t\t(value as Record<string, unknown>)[key] !== \"\",\n\t\t) &&\n\t\t\"replayContract\" in value &&\n\t\t(value.replayContract === \"complete-context\" || value.replayContract === \"message-groups\")\n\t);\n}\n\n/** Only call with a qualified checkpoint, never raw compaction marker data. */\nexport function retainedContextRequestContract(\n\tcheckpoint: ContextEpochCheckpoint | undefined,\n): ContextEpochRequestContract | undefined {\n\tif (!checkpoint) return;\n\tif (checkpoint.requestContract) return structuredClone(checkpoint.requestContract);\n\tif (!checkpoint.representation) return;\n\tconst accepted: unknown = JSON.parse(checkpoint.representation);\n\tif (!accepted || typeof accepted !== \"object\") throw new Error(\"Accepted context request contract is unavailable\");\n\tconst value = { ...accepted, replayContract: checkpoint.replayContract ?? \"complete-context\" };\n\tif (!isRequestContract(value)) throw new Error(\"Accepted context request contract is unavailable\");\n\treturn {\n\t\tapi: value.api,\n\t\tprovider: value.provider,\n\t\troute: value.route,\n\t\tmodel: value.model,\n\t\treplayContract: value.replayContract,\n\t};\n}\n\n/** Identity comes from the actual final native serialization, not a model/profile label. */\nexport function contextRequestContract(\n\trequest: ProviderRequestRepresentation,\n\treplayContract: ContextReplayContract,\n): ContextEpochRequestContract {\n\tconst route = requestTokenRouteIdentity(request.url);\n\tconst body: unknown = request.body === undefined ? undefined : JSON.parse(request.body);\n\tif (\n\t\t!route ||\n\t\t!body ||\n\t\ttypeof body !== \"object\" ||\n\t\t!(\"model\" in body) ||\n\t\ttypeof body.model !== \"string\" ||\n\t\t!body.model\n\t)\n\t\tthrow new Error(\"Native context request identity is unavailable\");\n\treturn { api: request.api, provider: request.provider, route, model: body.model, replayContract };\n}\n\nexport function assertContextRequestContract(\n\tcontract: ContextEpochRequestContract,\n\trequest: ProviderRequestRepresentation,\n\treplayContract: ContextReplayContract,\n): void {\n\tconst actual = contextRequestContract(request, replayContract);\n\tif (\n\t\tactual.api !== contract.api ||\n\t\tactual.provider !== contract.provider ||\n\t\tactual.route !== contract.route ||\n\t\tactual.model !== contract.model ||\n\t\tactual.replayContract !== contract.replayContract\n\t)\n\t\tthrow new Error(\"Retained context requires its accepted native request contract\");\n}\n\nexport function snapshotContextEpoch<T extends ContextEpochCheckpoint>(value: T, maxBytes: number): T {\n\treturn JSON.parse(stringifyBoundedJson(value, maxBytes)) as T;\n}\n\n/** Called only after checking the source frame's genuine epoch qualification. */\nexport function readContextEpoch(details: unknown, maxBytes: number): ContextEpochCheckpoint | undefined {\n\tif (!details || typeof details !== \"object\" || !(CONTEXT_EPOCH_DETAIL in details)) return;\n\tconst value: unknown = details[CONTEXT_EPOCH_DETAIL];\n\tif (\n\t\t!value ||\n\t\ttypeof value !== \"object\" ||\n\t\t!(\"version\" in value) ||\n\t\t!(\"renderer\" in value) ||\n\t\t!(\n\t\t\t(value.version === 1 && value.renderer === \"native-canonical-epoch/1\") ||\n\t\t\t(value.version === 2 && value.renderer === \"native-canonical-epoch/2\") ||\n\t\t\t(value.version === 3 && value.renderer === \"native-canonical-epoch/3\") ||\n\t\t\t(value.version === 4 && value.renderer === \"native-canonical-epoch/4\") ||\n\t\t\t(value.version === 5 && value.renderer === CONTEXT_POLICY_EPOCH_RENDERER) ||\n\t\t\t(value.version === 6 && value.renderer === CONTEXT_TOOL_EPOCH_RENDERER) ||\n\t\t\t(value.version === 8 && value.renderer === CONTEXT_TOOL_SUMMARY_RENDERER) ||\n\t\t\t([6, 8].includes(value.version as number) && value.renderer === CONTEXT_INTERRUPTED_TOOL_RENDERER) ||\n\t\t\t([4, 5, 6].includes(value.version as number) && value.renderer === CONTEXT_SKILL_EPOCH_RENDERER)\n\t\t) ||\n\t\t(value.renderer === CONTEXT_SKILL_EPOCH_RENDERER ||\n\t\t((value.version === 8 || value.renderer === CONTEXT_INTERRUPTED_TOOL_RENDERER) && \"selectedSkills\" in value)\n\t\t\t? !(\"selectedSkills\" in value) ||\n\t\t\t\t!Array.isArray(value.selectedSkills) ||\n\t\t\t\tvalue.selectedSkills.length === 0 ||\n\t\t\t\tvalue.selectedSkills.some(\n\t\t\t\t\t(item) =>\n\t\t\t\t\t\t!item ||\n\t\t\t\t\t\ttypeof item.name !== \"string\" ||\n\t\t\t\t\t\t!item.view ||\n\t\t\t\t\t\t![\"custom_message\", \"custom\"].includes(item.view.ref?.kind) ||\n\t\t\t\t\t\ttypeof item.view.sourceRevision !== \"string\",\n\t\t\t\t) ||\n\t\t\t\tnew Set(value.selectedSkills.map((item) => item.name)).size !== value.selectedSkills.length\n\t\t\t: \"selectedSkills\" in value) ||\n\t\t!(\"source\" in value) ||\n\t\t!value.source ||\n\t\t!(\"views\" in value) ||\n\t\t!Array.isArray(value.views) ||\n\t\t!(\"literalTailId\" in value) ||\n\t\ttypeof value.literalTailId !== \"string\" ||\n\t\t!(\"representation\" in value) ||\n\t\t(value.version === 5 || value.version === 8\n\t\t\t? !(\"mode\" in value) || (value.mode !== \"on\" && value.mode !== \"off\")\n\t\t\t: \"mode\" in value) ||\n\t\t(value.version === 8 &&\n\t\t\t(value.representation !== null || !(\"includeSummary\" in value) || value.includeSummary !== true)) ||\n\t\t(value.version === 5 &&\n\t\t\t(value.representation !== null || !(\"policyOnly\" in value) || value.policyOnly !== true)) ||\n\t\t(\"policyOnly\" in value &&\n\t\t\t(value.version !== 5 ||\n\t\t\t\tvalue.policyOnly !== true ||\n\t\t\t\tvalue.representation !== null ||\n\t\t\t\t\"includeSummary\" in value)) ||\n\t\t(\"pendingRequestContract\" in value &&\n\t\t\t(value.version !== 5 ||\n\t\t\t\t!(\"mode\" in value) ||\n\t\t\t\tvalue.mode !== \"off\" ||\n\t\t\t\tvalue.pendingRequestContract !== true ||\n\t\t\t\t\"requestContract\" in value)) ||\n\t\t(\"requestContract\" in value && (value.version !== 5 || !isRequestContract(value.requestContract))) ||\n\t\t!(\n\t\t\ttypeof value.representation === \"string\" ||\n\t\t\t(value.version === 5 && value.representation === null && \"policyOnly\" in value && value.policyOnly === true) ||\n\t\t\t((value.version === 2 || value.version === 3 || value.version === 4 || value.version === 8) &&\n\t\t\t\tvalue.representation === null &&\n\t\t\t\t\"includeSummary\" in value &&\n\t\t\t\tvalue.includeSummary === true)\n\t\t) ||\n\t\t(\"includeSummary\" in value &&\n\t\t\t((value.version !== 2 && value.version !== 3 && value.version !== 4 && value.version !== 8) ||\n\t\t\t\tvalue.includeSummary !== true ||\n\t\t\t\tvalue.representation !== null)) ||\n\t\t(\"replayContract\" in value &&\n\t\t\tvalue.replayContract !== \"complete-context\" &&\n\t\t\tvalue.replayContract !== \"message-groups\") ||\n\t\t(\"resourceRevision\" in value &&\n\t\t\t(typeof value.resourceRevision !== \"string\" ||\n\t\t\t\tBuffer.byteLength(value.resourceRevision, \"utf8\") > MAX_RESOURCE_REVISION_BYTES)) ||\n\t\t(\"publicWindow\" in value &&\n\t\t\t((value.version !== 3 &&\n\t\t\t\tvalue.version !== 4 &&\n\t\t\t\tvalue.version !== 5 &&\n\t\t\t\tvalue.version !== 6 &&\n\t\t\t\tvalue.version !== 8) ||\n\t\t\t\tvalue.publicWindow !== true)) ||\n\t\t(\"toolContinuations\" in value && value.version !== 6 && value.version !== 8) ||\n\t\t((value.version === 6 || value.version === 8) &&\n\t\t\t(!(\"toolContinuations\" in value) ||\n\t\t\t\t!Array.isArray(value.toolContinuations) ||\n\t\t\t\t!value.toolContinuations.length ||\n\t\t\t\t!(\"replayContract\" in value) ||\n\t\t\t\t(value.version === 6 &&\n\t\t\t\t\t(!(\"publicWindow\" in value) ||\n\t\t\t\t\t\tvalue.publicWindow !== true ||\n\t\t\t\t\t\tvalue.replayContract !== \"message-groups\")))) ||\n\t\t(\"continuation\" in value &&\n\t\t\t((value.version !== 3 &&\n\t\t\t\tvalue.version !== 4 &&\n\t\t\t\tvalue.version !== 5 &&\n\t\t\t\tvalue.version !== 6 &&\n\t\t\t\tvalue.version !== 8) ||\n\t\t\t\t!value.continuation ||\n\t\t\t\ttypeof value.continuation !== \"object\" ||\n\t\t\t\t!(\"kind\" in value.continuation) ||\n\t\t\t\t(value.continuation.kind !== \"harness-summary\" &&\n\t\t\t\t\t((value.version !== 4 && value.version !== 5 && value.version !== 6) ||\n\t\t\t\t\t\tvalue.continuation.kind !== \"portable-checkpoint\")) ||\n\t\t\t\t!(\"publicTailThrough\" in value.continuation) ||\n\t\t\t\t!value.continuation.publicTailThrough))\n\t)\n\t\tthrow new Error(\"Invalid committed context epoch\");\n\treturn snapshotContextEpoch(value as ContextEpochCheckpoint, maxBytes);\n}\n\n/** This configuration cannot be persisted as an epoch; it may still be valid full-native input. */\nexport class UnsupportedContextEpochConfigurationError extends Error {\n\tconstructor() {\n\t\tsuper(\"Unsupported context epoch request configuration\");\n\t\tthis.name = \"UnsupportedContextEpochConfigurationError\";\n\t}\n}\n\n/** Stable representation, not the changing input, an auth envelope, or a cache-hit claim. */\nexport function contextEpochRepresentation(\n\trequest: ProviderRequestRepresentation,\n\tassessment: RequestTokenAssessment | undefined,\n\tmaxBytes: number,\n\tunbudgetedPublic = false,\n\tresponseItemIdentity?: string,\n): string {\n\tif (\n\t\t(!assessment && !unbudgetedPublic) ||\n\t\t(assessment &&\n\t\t\t(!assessment.profile ||\n\t\t\t\tassessment.limitSource !== \"explicit-profile\" ||\n\t\t\t\t!assessment.route ||\n\t\t\t\t!assessment.model)) ||\n\t\trequest.body === undefined\n\t)\n\t\tthrow new Error(\"Committed context epoch requires its explicit request profile\");\n\tconst identity = assessment ?? contextRequestContract(request, \"message-groups\");\n\tconst body: unknown = JSON.parse(request.body);\n\tif (!body || typeof body !== \"object\" || Array.isArray(body))\n\t\tthrow new Error(\"Context epoch request representation is unavailable\");\n\tconst configuration: Record<string, unknown> = {};\n\tconst fields = new Set([\n\t\t\"model\",\n\t\t\"instructions\",\n\t\t\"stream\",\n\t\t\"max_output_tokens\",\n\t\t\"max_tokens\",\n\t\t\"max_completion_tokens\",\n\t\t\"temperature\",\n\t\t\"top_p\",\n\t\t\"text\",\n\t\t\"tools\",\n\t\t\"tool_choice\",\n\t\t\"parallel_tool_calls\",\n\t\t\"store\",\n\t\t\"reasoning\",\n\t\t\"service_tier\",\n\t\t\"truncation\",\n\t\t\"include\",\n\t\t\"prompt_cache_retention\",\n\t\t\"stream_options\",\n\t]);\n\tif (\n\t\trequest.api === \"openai-completions\" &&\n\t\trequest.provider === \"deepseek\" &&\n\t\trequest.url === \"https://api.deepseek.com/chat/completions\" &&\n\t\tidentity.route === request.url &&\n\t\t\"model\" in body &&\n\t\tbody.model === \"deepseek-flash\" &&\n\t\tidentity.model === body.model\n\t) {\n\t\tfields.add(\"thinking\");\n\t\tfields.add(\"reasoning_effort\");\n\t}\n\tfor (const [key, value] of Object.entries(body)) {\n\t\tif ([\"input\", \"messages\", \"previous_response_id\", \"prompt_cache_key\"].includes(key)) continue;\n\t\t// Unknown payload extensions may contain private data or change the representation.\n\t\tif (!fields.has(key)) throw new UnsupportedContextEpochConfigurationError();\n\t\tconfiguration[key] = value;\n\t}\n\tconst input: unknown = \"input\" in body ? body.input : \"messages\" in body ? body.messages : undefined;\n\tif (!Array.isArray(input)) throw new Error(\"Context epoch request messages are unavailable\");\n\tconst policy = input.filter(\n\t\t(item: unknown) =>\n\t\t\titem && typeof item === \"object\" && \"role\" in item && (item.role === \"system\" || item.role === \"developer\"),\n\t);\n\treturn stringifyBoundedJson(\n\t\t{\n\t\t\trenderer: CONTEXT_EPOCH_RENDERER,\n\t\t\t...(responseItemIdentity ? { responseItemIdentity } : {}),\n\t\t\tapi: request.api,\n\t\t\tprovider: request.provider,\n\t\t\troute: identity.route,\n\t\t\tmodel: identity.model,\n\t\t\t...(assessment\n\t\t\t\t? {\n\t\t\t\t\t\tprofile: assessment.profile,\n\t\t\t\t\t\tcontextTokens: assessment.contextTokens,\n\t\t\t\t\t\toutputReserveTokens: assessment.outputReserveTokens,\n\t\t\t\t\t}\n\t\t\t\t: { budget: \"unbudgeted\" }),\n\t\t\tconfiguration,\n\t\t\tpolicy,\n\t\t},\n\t\tmaxBytes,\n\t);\n}\n"]}
|