@ponythewhite/base-context 1.0.10 → 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 +11 -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-MX6YNAM2.js → bundled-modules-PEFT72QN.js} +2 -2
- package/dist/bundle/{chunk-UHLGPYMI.js → chunk-JZHGOOFM.js} +68 -18
- package/dist/bundle/{chunk-CDXQNS5P.js → chunk-TOOVREMP.js} +498 -82
- package/dist/bundle/{cli-main-D7W3WWCV.js → cli-main-BRXGYTGK.js} +2 -2
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/{main-5J3QBZ5Y.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 +130 -9
- 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 +4 -0
- package/dist/core/context-epoch.d.ts.map +1 -1
- package/dist/core/context-epoch.js +8 -1
- 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/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 +4 -4
- package/dist/modes/daemon/daemon-mode.js.map +1 -1
- package/package.json +4 -4
|
@@ -32,6 +32,12 @@ export class PublicContextBudgetError extends RequestTokenBudgetError {
|
|
|
32
32
|
this.#summaryCapacity = summaryCapacity;
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
|
+
// Only publicBudgetFailure can grant this authority to the exact error it creates.
|
|
36
|
+
// Constructing a public error or copying its descriptive fields grants nothing.
|
|
37
|
+
const recoveryCompactionAuthorizations = new WeakMap();
|
|
38
|
+
export function getRecoveryCompactionAuthorization(error) {
|
|
39
|
+
return error ? recoveryCompactionAuthorizations.get(error) : undefined;
|
|
40
|
+
}
|
|
35
41
|
export function captureRequestViewBoundary(messages, commit, validate, fixedPrepare, isSourceCurrent) {
|
|
36
42
|
const source = getCanonicalViewSelectionSource(messages);
|
|
37
43
|
if (!source)
|
|
@@ -162,7 +168,7 @@ function publicBudgetFailure(boundary, messages, request, projection, budget, as
|
|
|
162
168
|
});
|
|
163
169
|
};
|
|
164
170
|
const minimum = withRequestBody(request, JSON.stringify({ ...body, [inputKey]: retainedInput(new Set()) }));
|
|
165
|
-
|
|
171
|
+
const error = new PublicContextBudgetError(boundary.source, assessment, original, budget.measure(minimum), (context.taskFrame?.messages.length ?? 0) > 1, JSON.stringify([
|
|
166
172
|
boundary.source.sessionId,
|
|
167
173
|
boundary.source.sessionFile,
|
|
168
174
|
source.units.map((unit) => [unit.id, unit.sourceRevision]),
|
|
@@ -188,6 +194,24 @@ function publicBudgetFailure(boundary, messages, request, projection, budget, as
|
|
|
188
194
|
? undefined
|
|
189
195
|
: Math.floor(measured.availableInputTokens - measured.estimatedInputTokens);
|
|
190
196
|
}, boundary.isSourceCurrent);
|
|
197
|
+
if (projection.replayContract === "message-groups") {
|
|
198
|
+
const originalContext = getCanonicalEpochContext(boundary.messages);
|
|
199
|
+
const recoveries = boundary.units.flatMap((unit, index) => unit.kind === "recovery" && originalContext.references[index] ? [originalContext.references[index]] : []);
|
|
200
|
+
if (recoveries.length) {
|
|
201
|
+
recoveryCompactionAuthorizations.set(error, {
|
|
202
|
+
source: originalContext.source,
|
|
203
|
+
recoveries,
|
|
204
|
+
resourceRevision: originalContext.resourceRevision,
|
|
205
|
+
// Do not extend a partial public conversion to native groups the encoder did not replace.
|
|
206
|
+
publicWindow: messages !== boundary.messages &&
|
|
207
|
+
projection.publicWindow === true &&
|
|
208
|
+
boundary.units.every((unit, index) => !["recovery", "replay-group"].includes(unit.kind) ||
|
|
209
|
+
context.references[index]?.rendering !== undefined),
|
|
210
|
+
isSourceCurrent: boundary.isSourceCurrent,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return error;
|
|
191
215
|
}
|
|
192
216
|
/** Check the actual final mapping without selecting, converting, or committing another view. */
|
|
193
217
|
export async function prepareFixedRequestView(boundary, request, projection, assessment) {
|
|
@@ -284,7 +308,10 @@ export async function selectRequestView(boundary, request, projection, budget, a
|
|
|
284
308
|
const inputKey = requestInputKey(request, projection);
|
|
285
309
|
if ((budget && full?.limitSource !== "explicit-profile") || !inputKey)
|
|
286
310
|
return;
|
|
287
|
-
if (!budget &&
|
|
311
|
+
if (!budget &&
|
|
312
|
+
!boundary.requiresEpoch &&
|
|
313
|
+
!boundary.recoveryContractRequested &&
|
|
314
|
+
!boundary.pendingPublicMessageGroups?.length)
|
|
288
315
|
return;
|
|
289
316
|
const payload = JSON.parse(request.body);
|
|
290
317
|
const input = payload[inputKey];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-view-selection.js","sourceRoot":"","sources":["../../src/core/request-view-selection.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@ponythewhite/base-context-agent\";\nimport {\n\ttype Context,\n\ttype ProviderRequestProjection,\n\ttype ProviderRequestPublicMessage,\n\ttype ProviderRequestRepresentation,\n\ttype RequestTokenAssessment,\n\tRequestTokenBudgetError,\n\ttype RequestTokenBudgetEvaluator,\n\twithRequestBody,\n} from \"@ponythewhite/base-context-ai\";\nimport {\n\ttype CanonicalViewSelectionSource,\n\tcaptureCanonicalRequestMessages,\n\tgetCanonicalEpochContext,\n\tgetCanonicalViewSelectionSource,\n\tpreparePublicContextWindow,\n\tprepareToolContinuationWindow,\n} from \"./canonical-context.js\";\nimport { convertToLlm } from \"./messages.js\";\nimport type { ContextEpochEntryRef, SourceSnapshotRef } from \"./request-events.js\";\nimport { bindMessageReplayUnits, closeViewSelection, prepareViewSelection } from \"./view-units.js\";\n\n/** Actual adapter-public measurement, not a verdict about the opaque native request. */\nexport class PublicContextBudgetError extends RequestTokenBudgetError {\n\treadonly source: SourceSnapshotRef;\n\t#compactionKey?: string;\n\t#summaryCapacity?: (retained: ReadonlySet<string>, wrapper: string) => number | undefined;\n\n\tremainingSummaryTokens(retained: ReadonlySet<string>, wrapper: string): number | undefined {\n\t\treturn this.#summaryCapacity?.(retained, wrapper);\n\t}\n\n\tgetCompactionKey(): string | undefined {\n\t\treturn this.#compactionKey;\n\t}\n\n\tconstructor(\n\t\tsource: SourceSnapshotRef,\n\t\tassessment: RequestTokenAssessment,\n\t\treadonly originalAssessment: RequestTokenAssessment,\n\t\treadonly mandatoryAssessment?: RequestTokenAssessment,\n\t\treadonly taskFrameRebaseAvailable = false,\n\t\tcompactionKey?: string,\n\t\tsummaryCapacity?: (retained: ReadonlySet<string>, wrapper: string) => number | undefined,\n\t\treadonly isSourceCurrent?: () => boolean,\n\t) {\n\t\tsuper(assessment);\n\t\tthis.name = \"PublicContextBudgetError\";\n\t\tif (mandatoryAssessment?.status === \"over-budget\")\n\t\t\tthis.message =\n\t\t\t\t\"Context capacity exceeded: instructions, tools, mandatory evidence and output allowance cannot fit. Summarizing unrelated history cannot resolve this request.\";\n\t\tthis.source = Object.freeze({ ...source });\n\t\tthis.#compactionKey = compactionKey;\n\t\tthis.#summaryCapacity = summaryCapacity;\n\t}\n}\n\nexport interface RequestViewCandidate {\n\t/** Session-local Responses ID namespace; a new owner requires a fresh representation. */\n\treadonly responseItemIdentity?: string;\n\treadonly source: SourceSnapshotRef;\n\treadonly selectedUnitIds: readonly string[];\n\treadonly request: ProviderRequestRepresentation;\n\treadonly projection: ProviderRequestProjection;\n\t// Absent only for mandatory full-view admission without a configured token budget.\n\treadonly assessment: RequestTokenAssessment | undefined;\n\treadonly originalAssessment: RequestTokenAssessment | undefined;\n\t/** Exact public messages represented by the accepted candidate, with captured source recipes. */\n\treadonly publicMessages?: readonly AgentMessage[];\n}\n\n/** Root resolves only after its canonical epoch checkpoint ACK. This module owns no epoch state. */\nexport type RequestViewCommit = (\n\tcandidate: RequestViewCandidate,\n) => Promise<ContextEpochEntryRef | undefined> | Promise<void>;\nexport type RequestViewValidate = (\n\trequest: ProviderRequestRepresentation,\n\tassessment: RequestTokenAssessment | undefined,\n) => void;\n\nexport type RequestViewFixedPrepare = (\n\trequest: ProviderRequestRepresentation,\n\tprojection: ProviderRequestProjection,\n\tassessment: RequestTokenAssessment | undefined,\n) => ContextEpochEntryRef | void | Promise<ContextEpochEntryRef | undefined> | Promise<void>;\n\nexport interface CapturedRequestViewBoundary extends CanonicalViewSelectionSource {\n\treadonly responseItemIdentity?: string;\n\treadonly messages: readonly AgentMessage[];\n\t/** Provider logical positions mapped to the unchanged canonical messages/units. */\n\treadonly providerMessageIndices: readonly number[];\n\treadonly providerPendingPublicMessageGroups?: readonly (readonly number[])[];\n\treadonly commit: RequestViewCommit;\n\treadonly validate?: RequestViewValidate;\n\treadonly fixedPrepare?: RequestViewFixedPrepare;\n\treadonly isSourceCurrent?: () => boolean;\n}\n\nexport function captureRequestViewBoundary(\n\tmessages: readonly AgentMessage[],\n\tcommit: RequestViewCommit,\n\tvalidate?: RequestViewValidate,\n\tfixedPrepare?: RequestViewFixedPrepare,\n\tisSourceCurrent?: () => boolean,\n): CapturedRequestViewBoundary {\n\tconst source = getCanonicalViewSelectionSource(messages);\n\tif (!source) throw new Error(\"Request view boundary requires compiled canonical messages\");\n\tconst providerMessageIndices = messages.flatMap((message, index) => convertToLlm([message]).map(() => index));\n\treturn {\n\t\t...source,\n\t\tmessages: captureCanonicalRequestMessages(messages),\n\t\tproviderMessageIndices,\n\t\t...(source.pendingPublicMessageGroups\n\t\t\t? {\n\t\t\t\t\tproviderPendingPublicMessageGroups: source.pendingPublicMessageGroups.map((group) =>\n\t\t\t\t\t\tgroup.map((index) => providerMessageIndex(providerMessageIndices, index)),\n\t\t\t\t\t),\n\t\t\t\t}\n\t\t\t: {}),\n\t\tcommit,\n\t\tvalidate,\n\t\tfixedPrepare,\n\t\tisSourceCurrent,\n\t};\n}\n\nfunction providerMessageIndex(indices: readonly number[], canonicalIndex: number): number {\n\tconst index = indices.indexOf(canonicalIndex);\n\tif (index < 0) throw new Error(\"Provider projection cannot address a filtered canonical message\");\n\treturn index;\n}\n\n/** Keep canonical UI barriers while translating the native serializer's provider-only positions. */\nfunction canonicalRequestProjection(\n\tboundary: CapturedRequestViewBoundary,\n\tprojection: ProviderRequestProjection,\n): ProviderRequestProjection {\n\tconst indices = boundary.providerMessageIndices;\n\tif (indices.length === boundary.messages.length) return projection;\n\tconst canonicalIndex = (index: number): number => {\n\t\tconst canonical = indices[index];\n\t\tif (canonical === undefined) throw new Error(\"Provider projection message index is outside its captured view\");\n\t\treturn canonical;\n\t};\n\treturn {\n\t\t...projection,\n\t\tmessageIndices: projection.messageIndices.map((index) => (index === null ? null : canonicalIndex(index))),\n\t\t...(projection.optionalMessageIndices\n\t\t\t? { optionalMessageIndices: projection.optionalMessageIndices.map(canonicalIndex) }\n\t\t\t: {}),\n\t\t...(projection.generatedMessageIndices\n\t\t\t? { generatedMessageIndices: projection.generatedMessageIndices.map(canonicalIndex) }\n\t\t\t: {}),\n\t\t...(projection.publicMessageGroups\n\t\t\t? { publicMessageGroups: projection.publicMessageGroups.map((group) => group.map(canonicalIndex)) }\n\t\t\t: {}),\n\t\t...(projection.pendingPublicMessageGroups\n\t\t\t? {\n\t\t\t\t\tpendingPublicMessageGroups: projection.pendingPublicMessageGroups.map((group) =>\n\t\t\t\t\t\tgroup.map(canonicalIndex),\n\t\t\t\t\t),\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(projection.encodePublicWindow\n\t\t\t? {\n\t\t\t\t\tencodePublicWindow: (replacements: readonly ProviderRequestPublicMessage[]) => {\n\t\t\t\t\t\tconst encoded = projection.encodePublicWindow!(\n\t\t\t\t\t\t\treplacements.map((replacement) => ({\n\t\t\t\t\t\t\t\t...replacement,\n\t\t\t\t\t\t\t\tmessageIndex: providerMessageIndex(indices, replacement.messageIndex),\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\tencoded && { ...encoded, projection: canonicalRequestProjection(boundary, encoded.projection) }\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t};\n}\n\nexport function matchesRequestView(\n\tboundary: CapturedRequestViewBoundary,\n\tsource: SourceSnapshotRef,\n\tcontext: Context,\n): boolean {\n\tconst expected = boundary.source;\n\tif (\n\t\texpected.sessionId !== source.sessionId ||\n\t\texpected.sessionFile !== source.sessionFile ||\n\t\texpected.leafId !== source.leafId ||\n\t\texpected.sourceSequence !== source.sourceSequence\n\t)\n\t\treturn false;\n\tconst rendered = convertToLlm([...boundary.messages]);\n\treturn (\n\t\tboundary.messages.length === boundary.units.length &&\n\t\trendered.length === boundary.providerMessageIndices.length &&\n\t\tJSON.stringify(rendered) === JSON.stringify(context.messages)\n\t);\n}\n\n/** Projection kinds describe their actual provider body, never an OpenAI-format route alias. */\nfunction requestInputKey(\n\trequest: ProviderRequestRepresentation,\n\tprojection: ProviderRequestProjection,\n): \"input\" | \"messages\" | undefined {\n\tif (\n\t\t(request.api === \"openai-responses\" || request.api === \"openai-codex-responses\") &&\n\t\t(projection.kind === \"openai-responses-text-v1\" || projection.kind === \"openai-responses-replay-v1\")\n\t)\n\t\treturn \"input\";\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\tprojection.kind === \"deepseek-completions-text-tools-v1\" &&\n\t\trequest.body !== undefined &&\n\t\tJSON.parse(request.body).model === \"deepseek-flash\"\n\t)\n\t\treturn \"messages\";\n\treturn undefined;\n}\n\n/** A lower bound for compaction: fixed policy, current tail and required recorded evidence. */\nfunction publicBudgetFailure(\n\tboundary: CapturedRequestViewBoundary,\n\tmessages: readonly AgentMessage[],\n\trequest: ProviderRequestRepresentation,\n\tprojection: ProviderRequestProjection,\n\tbudget: RequestTokenBudgetEvaluator,\n\tassessment: RequestTokenAssessment,\n\toriginal: RequestTokenAssessment,\n): PublicContextBudgetError {\n\tconst context = getCanonicalEpochContext(messages)!;\n\tconst source = getCanonicalViewSelectionSource(messages)!;\n\tconst toolEntries = new Set(\n\t\tcontext.toolContinuations?.flatMap((group) => [\n\t\t\tgroup.assistantEntryId,\n\t\t\t...group.calls.flatMap((call) => (call.result ? [call.result.id] : [])),\n\t\t]),\n\t);\n\tlet tailSequence = -1;\n\tfor (const reference of context.references)\n\t\tif (reference && reference.ref.kind !== \"compaction\")\n\t\t\ttailSequence = Math.max(tailSequence, reference.ref.sequence);\n\tconst required = new Set(\n\t\tsource.units.flatMap((unit, index) => {\n\t\t\tconst reference = context.references[index];\n\t\t\treturn [\"task-frame\", \"resource-view\", \"recovery\"].includes(unit.kind) ||\n\t\t\t\tunit.id === \"native-selected-skill-versions\" ||\n\t\t\t\t(reference && (reference.ref.sequence === tailSequence || toolEntries.has(reference.ref.entryId)))\n\t\t\t\t? [index]\n\t\t\t\t: [];\n\t\t}),\n\t);\n\tconst inputKey = requestInputKey(request, projection)!;\n\tconst body = JSON.parse(request.body!) as Record<string, unknown>;\n\tconst input = body[inputKey];\n\tif (!Array.isArray(input) || input.length !== projection.messageIndices.length)\n\t\treturn new PublicContextBudgetError(\n\t\t\tboundary.source,\n\t\t\tassessment,\n\t\t\toriginal,\n\t\t\tundefined,\n\t\t\tfalse,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tboundary.isSourceCurrent,\n\t\t);\n\tconst graph = prepareViewSelection(source.units, boundary.limits);\n\tconst retainedInput = (retained: ReadonlySet<string>) => {\n\t\tconst roots = source.units\n\t\t\t.filter((_, index) => required.has(index) || retained.has(context.references[index]?.ref.entryId ?? \"\"))\n\t\t\t.map((unit) => unit.id);\n\t\tconst selected = new Set(graph.close(roots).map((unit) => unit.id));\n\t\treturn input.filter((_, index) => {\n\t\t\tconst messageIndex = projection.messageIndices[index];\n\t\t\treturn messageIndex === null || selected.has(source.units[messageIndex].id);\n\t\t});\n\t};\n\tconst minimum = withRequestBody(request, JSON.stringify({ ...body, [inputKey]: retainedInput(new Set()) }));\n\treturn new PublicContextBudgetError(\n\t\tboundary.source,\n\t\tassessment,\n\t\toriginal,\n\t\tbudget.measure(minimum),\n\t\t(context.taskFrame?.messages.length ?? 0) > 1,\n\t\tJSON.stringify([\n\t\t\tboundary.source.sessionId,\n\t\t\tboundary.source.sessionFile,\n\t\t\tsource.units.map((unit) => [unit.id, unit.sourceRevision]),\n\t\t\tassessment.api,\n\t\t\tassessment.provider,\n\t\t\tassessment.model,\n\t\t\tassessment.route,\n\t\t\tassessment.profile,\n\t\t\tassessment.availableInputTokens,\n\t\t\tassessment.outputReserveTokens,\n\t\t]),\n\t\t(retained, wrapper) => {\n\t\t\t// Meter only; this synthetic empty summary is never admitted or sent.\n\t\t\tconst summary =\n\t\t\t\tinputKey === \"messages\"\n\t\t\t\t\t? { role: \"user\", content: wrapper }\n\t\t\t\t\t: { role: \"user\", content: [{ type: \"input_text\", text: wrapper }] };\n\t\t\tconst kept = retainedInput(retained);\n\t\t\tconst position = kept.findIndex((item) => item?.role !== \"system\" && item?.role !== \"developer\");\n\t\t\tkept.splice(position < 0 ? kept.length : position, 0, summary);\n\t\t\tconst measured = budget.measure(withRequestBody(request, JSON.stringify({ ...body, [inputKey]: kept })));\n\t\t\treturn measured.status === \"unknown\" ||\n\t\t\t\tmeasured.availableInputTokens === null ||\n\t\t\t\tmeasured.estimatedInputTokens === null\n\t\t\t\t? undefined\n\t\t\t\t: Math.floor(measured.availableInputTokens - measured.estimatedInputTokens);\n\t\t},\n\t\tboundary.isSourceCurrent,\n\t);\n}\n\n/** Check the actual final mapping without selecting, converting, or committing another view. */\nexport async function prepareFixedRequestView(\n\tboundary: CapturedRequestViewBoundary,\n\trequest: ProviderRequestRepresentation,\n\tprojection: ProviderRequestProjection,\n\tassessment: RequestTokenAssessment | undefined,\n) {\n\tprojection = canonicalRequestProjection(boundary, projection);\n\tconst inputKey = requestInputKey(request, projection);\n\tconst payload = JSON.parse(request.body!) as Record<string, unknown> | null;\n\tconst input = inputKey && payload ? payload[inputKey] : undefined;\n\tif (!Array.isArray(input) || input.length !== projection.messageIndices.length)\n\t\tthrow new Error(\"Fixed context requires its final provider projection\");\n\tif (\n\t\tprojection.kind === \"openai-responses-text-v1\" &&\n\t\tboundary.messages.some(\n\t\t\t(message) =>\n\t\t\t\tmessage.role === \"toolResult\" ||\n\t\t\t\t(message.role === \"assistant\" && (message.content.length !== 1 || message.content[0].type !== \"text\")),\n\t\t)\n\t)\n\t\tthrow new Error(\"Fixed context requires its native replay adapter\");\n\tconst units = bindMessageReplayUnits(\n\t\tboundary.messages,\n\t\tboundary.units,\n\t\tboundary.limits,\n\t\tprojection.replayContract ?? \"complete-context\",\n\t);\n\tcloseViewSelection(\n\t\tunits,\n\t\tunits.map((unit) => unit.id),\n\t\tboundary.limits,\n\t);\n\treturn await boundary.fixedPrepare!(request, projection, assessment);\n}\n\n/** Reuse the same legal omission policy for native and already-converted public requests. */\nasync function offerOptionalSubset(\n\tmessages: readonly AgentMessage[],\n\tunits: CanonicalViewSelectionSource[\"units\"],\n\tselection: ReturnType<typeof prepareViewSelection>,\n\trequest: ProviderRequestRepresentation,\n\tprojection: ProviderRequestProjection,\n\tbudget: RequestTokenBudgetEvaluator,\n\toffer: (\n\t\tids: readonly string[],\n\t\trequest: ProviderRequestRepresentation,\n\t\tprojection: ProviderRequestProjection,\n\t\tassessment: RequestTokenAssessment,\n\t) => Promise<unknown>,\n): Promise<string | undefined> {\n\tconst inputKey = requestInputKey(request, projection);\n\tif (!inputKey) return;\n\tconst payload = JSON.parse(request.body!) as Record<string, unknown>;\n\tconst input = payload[inputKey];\n\tif (!Array.isArray(input) || input.length !== projection.messageIndices.length) return;\n\tlet latestAssistant = -1;\n\tfor (const [index, message] of messages.entries()) if (message.role === \"assistant\") latestAssistant = index;\n\tconst retained = new Set(projection.messageIndices.slice(0, request.retainedPrefix?.inputItems ?? 0));\n\tconst projectedOptional =\n\t\tprojection.kind !== \"openai-responses-text-v1\" ? new Set(projection.optionalMessageIndices ?? []) : undefined;\n\tconst optional = units.filter((unit, index) => {\n\t\tconst message = messages[index];\n\t\treturn (\n\t\t\tindex !== latestAssistant &&\n\t\t\t!retained.has(index) &&\n\t\t\t(!projectedOptional || projectedOptional.has(index)) &&\n\t\t\tunit.kind === \"literal\" &&\n\t\t\tunit.authority === \"assistant-public\" &&\n\t\t\tmessage.role === \"assistant\" &&\n\t\t\tmessage.stopReason === \"stop\" &&\n\t\t\tmessage.content.length === 1 &&\n\t\t\tmessage.content[0].type === \"text\"\n\t\t);\n\t});\n\tconst generatedPositions = new Map<string, number>();\n\tconst generated =\n\t\tprojection.generatedMessageIndices ??\n\t\tmessages.flatMap((message, index) =>\n\t\t\tmessage.role === \"assistant\" &&\n\t\t\tmessage.content.some((block) => block.type === \"text\" && block.textSignature === undefined)\n\t\t\t\t? [index]\n\t\t\t\t: [],\n\t\t);\n\tfor (const index of generated) generatedPositions.set(units[index].id, index);\n\t// All user inputs, the latest assistant, fixed/TaskFrame/recovery units and errors stay selected.\n\tconst selected = new Set(units.map((unit) => unit.id));\n\tfor (const unit of optional) {\n\t\tselected.delete(unit.id);\n\t\tconst closed = selection.close([...selected]);\n\t\t// Normal Responses rendering uses msg_<message index> for unsigned assistants.\n\t\t// Reject any subset that would change a retained generated item ID on reconstruction.\n\t\tif (closed.some((item, index) => generatedPositions.has(item.id) && generatedPositions.get(item.id) !== index))\n\t\t\tcontinue;\n\t\tconst closedIds = new Set(closed.map((item) => item.id));\n\t\tconst keepItem = (index: number) => {\n\t\t\tconst messageIndex = projection.messageIndices[index];\n\t\t\treturn messageIndex === null || closedIds.has(units[messageIndex].id);\n\t\t};\n\t\tconst body = JSON.stringify({ ...payload, [inputKey]: input.filter((_, index) => keepItem(index)) });\n\t\tconst candidateRequest = { ...request, body };\n\t\tconst assessment = budget.measure(candidateRequest);\n\t\tif (assessment.status !== \"within-estimate\") continue;\n\t\tawait offer(\n\t\t\tclosed.map((item) => item.id),\n\t\t\tcandidateRequest,\n\t\t\t{\n\t\t\t\t...projection,\n\t\t\t\tmessageIndices: projection.messageIndices.filter((_, index) => keepItem(index)),\n\t\t\t\t...(projection.optionalMessageIndices\n\t\t\t\t\t? {\n\t\t\t\t\t\t\toptionalMessageIndices: projection.optionalMessageIndices.filter((index) =>\n\t\t\t\t\t\t\t\tclosedIds.has(units[index].id),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t\t...(projection.generatedMessageIndices\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tgeneratedMessageIndices: projection.generatedMessageIndices.filter((index) =>\n\t\t\t\t\t\t\t\tclosedIds.has(units[index].id),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t},\n\t\t\tassessment,\n\t\t);\n\t\treturn body;\n\t}\n\treturn;\n}\n\n/** Only the actual serializer's established replay contract authorizes historical-literal omission. */\nexport async function selectRequestView(\n\tboundary: CapturedRequestViewBoundary,\n\trequest: ProviderRequestRepresentation,\n\tprojection: ProviderRequestProjection,\n\tbudget: RequestTokenBudgetEvaluator | undefined,\n\tallowShrink: boolean,\n\tfinalizeMeasurement?: (\n\t\trequest: ProviderRequestRepresentation,\n\t\tassessment: RequestTokenAssessment | undefined,\n\t) => Promise<RequestTokenAssessment | undefined>,\n): Promise<string | undefined> {\n\tprojection = canonicalRequestProjection(boundary, projection);\n\tlet full = budget?.measure(request);\n\tconst inputKey = requestInputKey(request, projection);\n\tif ((budget && full?.limitSource !== \"explicit-profile\") || !inputKey) return;\n\tif (!budget && !boundary.requiresEpoch && !boundary.pendingPublicMessageGroups?.length) return;\n\tconst payload = JSON.parse(request.body!) as Record<string, unknown>;\n\tconst input = payload[inputKey];\n\tif (!Array.isArray(input) || input.length !== projection.messageIndices.length) return;\n\t// Resolve a near-limit estimate before discarding a stable native prefix. Original\n\t// protected tool groups must first pass their public conversion below.\n\tif (\n\t\tfull?.status === \"over-budget\" &&\n\t\t!boundary.pendingPublicMessageGroups?.length &&\n\t\t!projection.pendingPublicMessageGroups?.length\n\t)\n\t\tfull = (await finalizeMeasurement?.(request, full)) ?? full;\n\n\t// Absence is complete-context; a profile or tool-shaped message is never group authority.\n\tconst replayContract = projection.replayContract ?? \"complete-context\";\n\tif (\n\t\tprojection.kind === \"openai-responses-text-v1\" &&\n\t\tboundary.messages.some(\n\t\t\t(message) =>\n\t\t\t\tmessage.role === \"toolResult\" ||\n\t\t\t\t(message.role === \"assistant\" && (message.content.length !== 1 || message.content[0].type !== \"text\")),\n\t\t)\n\t)\n\t\treturn;\n\tconst units = bindMessageReplayUnits(\n\t\tboundary.messages,\n\t\tboundary.units,\n\t\tboundary.limits,\n\t\treplayContract,\n\t\tboundary.pendingPublicMessageGroups,\n\t);\n\tconst selection = prepareViewSelection(units, boundary.limits);\n\tconst offer = async (\n\t\tselectedUnitIds: readonly string[],\n\t\tcandidateRequest: ProviderRequestRepresentation,\n\t\tcandidateProjection: ProviderRequestProjection,\n\t\tassessment: RequestTokenAssessment | undefined,\n\t\tpublicMessages?: readonly AgentMessage[],\n\t) => {\n\t\tassessment = (await finalizeMeasurement?.(candidateRequest, assessment)) ?? assessment;\n\t\tif (budget && assessment) {\n\t\t\tif (assessment.status === \"over-budget\" && full)\n\t\t\t\tthrow publicBudgetFailure(\n\t\t\t\t\tboundary,\n\t\t\t\t\tpublicMessages ?? boundary.messages,\n\t\t\t\t\tcandidateRequest,\n\t\t\t\t\tcandidateProjection,\n\t\t\t\t\tbudget,\n\t\t\t\t\tassessment,\n\t\t\t\t\tfull,\n\t\t\t\t);\n\t\t\tbudget.assert(assessment);\n\t\t}\n\t\treturn boundary.commit(\n\t\t\tObject.freeze({\n\t\t\t\t...(boundary.responseItemIdentity ? { responseItemIdentity: boundary.responseItemIdentity } : {}),\n\t\t\t\tsource: Object.freeze({ ...boundary.source }),\n\t\t\t\tselectedUnitIds: Object.freeze([...selectedUnitIds]),\n\t\t\t\trequest: Object.freeze({ ...candidateRequest }),\n\t\t\t\tprojection: Object.freeze({\n\t\t\t\t\t...candidateProjection,\n\t\t\t\t\treplayContract,\n\t\t\t\t\tmessageIndices: Object.freeze([...candidateProjection.messageIndices]),\n\t\t\t\t\t...(candidateProjection.optionalMessageIndices\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\toptionalMessageIndices: Object.freeze([...candidateProjection.optionalMessageIndices]),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {}),\n\t\t\t\t\t...(candidateProjection.generatedMessageIndices\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tgeneratedMessageIndices: Object.freeze([...candidateProjection.generatedMessageIndices]),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {}),\n\t\t\t\t}),\n\t\t\t\tassessment,\n\t\t\t\toriginalAssessment: full,\n\t\t\t\t...(publicMessages ? { publicMessages } : {}),\n\t\t\t}),\n\t\t);\n\t};\n\tconst offerPublicSubset = async (\n\t\tmessages: readonly AgentMessage[],\n\t\trequest: ProviderRequestRepresentation,\n\t\tprojection: ProviderRequestProjection,\n\t): Promise<string | undefined> => {\n\t\tif (!allowShrink || !budget || replayContract !== \"message-groups\") return;\n\t\tconst source = getCanonicalViewSelectionSource(messages)!;\n\t\tconst units = bindMessageReplayUnits(messages, source.units, boundary.limits, replayContract);\n\t\treturn offerOptionalSubset(\n\t\t\tmessages,\n\t\t\tunits,\n\t\t\tprepareViewSelection(units, boundary.limits),\n\t\t\trequest,\n\t\t\tprojection,\n\t\t\tbudget,\n\t\t\t(ids, candidate, mapping, assessment) => offer(ids, candidate, mapping, assessment, messages),\n\t\t);\n\t};\n\tif (boundary.pendingPublicMessageGroups?.length) {\n\t\tif (\n\t\t\treplayContract !== \"message-groups\" ||\n\t\t\t!projection.publicWindow ||\n\t\t\t!projection.encodePublicWindow ||\n\t\t\tJSON.stringify(projection.pendingPublicMessageGroups) !== JSON.stringify(boundary.pendingPublicMessageGroups)\n\t\t)\n\t\t\tthrow new Error(\"Original tool group requires current native adapter public conversion\");\n\t\tconst publicView = prepareToolContinuationWindow(boundary.messages);\n\t\tconst encoded = projection.encodePublicWindow(publicView.replacements);\n\t\tif (!encoded || encoded.projection.pendingPublicMessageGroups?.length)\n\t\t\tthrow new Error(\"Native adapter did not convert the whole required tool group\");\n\t\tconst publicSource = getCanonicalViewSelectionSource(publicView.messages)!;\n\t\tconst publicUnits = bindMessageReplayUnits(\n\t\t\tpublicView.messages,\n\t\t\tpublicSource.units,\n\t\t\tboundary.limits,\n\t\t\treplayContract,\n\t\t);\n\t\tconst closed = closeViewSelection(\n\t\t\tpublicUnits,\n\t\t\tpublicUnits.map((unit) => unit.id),\n\t\t\tboundary.limits,\n\t\t);\n\t\tlet assessment = budget?.measure(encoded.request);\n\t\tif (assessment?.status === \"over-budget\")\n\t\t\tassessment = (await finalizeMeasurement?.(encoded.request, assessment)) ?? assessment;\n\t\tif (assessment && full) {\n\t\t\tif (assessment.status === \"over-budget\") {\n\t\t\t\tconst subset = await offerPublicSubset(publicView.messages, encoded.request, encoded.projection);\n\t\t\t\tif (subset !== undefined) return subset;\n\t\t\t\tthrow publicBudgetFailure(\n\t\t\t\t\tboundary,\n\t\t\t\t\tpublicView.messages,\n\t\t\t\t\tencoded.request,\n\t\t\t\t\tencoded.projection,\n\t\t\t\t\tbudget!,\n\t\t\t\t\tassessment,\n\t\t\t\t\tfull,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (assessment.status !== \"within-estimate\")\n\t\t\t\tthrow new Error(\"Tool continuation public request exceeds its token budget\");\n\t\t}\n\t\tawait offer(\n\t\t\tclosed.map((unit) => unit.id),\n\t\t\tencoded.request,\n\t\t\tencoded.projection,\n\t\t\tassessment,\n\t\t\tpublicView.messages,\n\t\t);\n\t\treturn encoded.request.body;\n\t}\n\tif (projection.pendingPublicMessageGroups?.length)\n\t\tthrow new Error(\"Adapter pending group has no original owned source plan\");\n\t// Without a configured budget, admit only the exact full native view. Never shrink it.\n\tif (!budget) {\n\t\tconst closed = selection.close(units.map((unit) => unit.id));\n\t\tawait offer(\n\t\t\tclosed.map((unit) => unit.id),\n\t\t\trequest,\n\t\t\tprojection,\n\t\t\tundefined,\n\t\t);\n\t\treturn request.body;\n\t}\n\tif (!full) return;\n\tconst offerPublicWindow = async (): Promise<string | undefined> => {\n\t\tif (\n\t\t\t!allowShrink ||\n\t\t\treplayContract !== \"message-groups\" ||\n\t\t\t!projection.publicWindow ||\n\t\t\t!projection.encodePublicWindow\n\t\t)\n\t\t\treturn;\n\t\tconst closed = selection.close(units.map((unit) => unit.id));\n\t\tlet firstMessageIndex = 0;\n\t\tif (\n\t\t\tfull.status === \"unknown\" &&\n\t\t\tfull.unknown.length === 1 &&\n\t\t\tfull.unknown[0] === \"media, opaque or unsupported replay token coverage unknown\"\n\t\t) {\n\t\t\t// Credited items are not part of the unknown input. Keep original projection indices.\n\t\t\tconst firstUnmeteredItem = request.retainedPrefix?.inputItems ?? 0;\n\t\t\tconst reasoningItemIndex = input.findIndex(\n\t\t\t\t(item, index) => index >= firstUnmeteredItem && item?.type === \"reasoning\",\n\t\t\t);\n\t\t\tconst messageIndex = projection.messageIndices[reasoningItemIndex];\n\t\t\tconst group =\n\t\t\t\tmessageIndex == null\n\t\t\t\t\t? undefined\n\t\t\t\t\t: projection.publicMessageGroups?.find((members) => members.includes(messageIndex));\n\t\t\t// The adapter still accepts only complete groups; earlier meterable groups stay native.\n\t\t\tfirstMessageIndex = group ? Math.min(...group) : 0;\n\t\t}\n\t\tconst publicView = preparePublicContextWindow(boundary.messages, firstMessageIndex);\n\t\tif (!publicView) {\n\t\t\t// Keep the original measured refusal when no public conversion can be offered.\n\t\t\t// This is not a new recovery signal or permission to reprepare again.\n\t\t\tif (full.status === \"over-budget\") throw new RequestTokenBudgetError(full);\n\t\t\treturn;\n\t\t}\n\t\tconst encoded = projection.encodePublicWindow(publicView.replacements);\n\t\tif (!encoded) return;\n\t\tlet assessment = budget.measure(encoded.request);\n\t\tif (assessment.status === \"over-budget\")\n\t\t\tassessment = (await finalizeMeasurement?.(encoded.request, assessment)) ?? assessment;\n\t\tif (assessment.status === \"over-budget\") {\n\t\t\tconst subset = await offerPublicSubset(publicView.messages, encoded.request, encoded.projection);\n\t\t\tif (subset !== undefined) return subset;\n\t\t\tthrow publicBudgetFailure(\n\t\t\t\tboundary,\n\t\t\t\tpublicView.messages,\n\t\t\t\tencoded.request,\n\t\t\t\tencoded.projection,\n\t\t\t\tbudget,\n\t\t\t\tassessment,\n\t\t\t\tfull,\n\t\t\t);\n\t\t}\n\t\tif (assessment.status !== \"within-estimate\") return;\n\t\tawait offer(\n\t\t\tclosed.map((unit) => unit.id),\n\t\t\tencoded.request,\n\t\t\tencoded.projection,\n\t\t\tassessment,\n\t\t\tpublicView.messages,\n\t\t);\n\t\treturn encoded.request.body;\n\t};\n\tif (full.status === \"within-estimate\") {\n\t\tconst closed = selection.close(units.map((unit) => unit.id));\n\t\tawait offer(\n\t\t\tclosed.map((unit) => unit.id),\n\t\t\trequest,\n\t\t\tprojection,\n\t\t\tfull,\n\t\t);\n\t\treturn request.body;\n\t}\n\tif (!allowShrink || replayContract !== \"message-groups\") return;\n\tif (full.status !== \"over-budget\") return offerPublicWindow();\n\tconst subset = await offerOptionalSubset(boundary.messages, units, selection, request, projection, budget, offer);\n\tif (subset !== undefined) return subset;\n\treturn offerPublicWindow();\n}\n"]}
|
|
1
|
+
{"version":3,"file":"request-view-selection.js","sourceRoot":"","sources":["../../src/core/request-view-selection.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@ponythewhite/base-context-agent\";\nimport {\n\ttype Context,\n\ttype ProviderRequestProjection,\n\ttype ProviderRequestPublicMessage,\n\ttype ProviderRequestRepresentation,\n\ttype RequestTokenAssessment,\n\tRequestTokenBudgetError,\n\ttype RequestTokenBudgetEvaluator,\n\twithRequestBody,\n} from \"@ponythewhite/base-context-ai\";\nimport {\n\ttype CanonicalViewSelectionSource,\n\tcaptureCanonicalRequestMessages,\n\tgetCanonicalEpochContext,\n\tgetCanonicalViewSelectionSource,\n\tpreparePublicContextWindow,\n\tprepareToolContinuationWindow,\n\ttype RecoveryCompactionAuthorization,\n} from \"./canonical-context.js\";\nimport { convertToLlm } from \"./messages.js\";\nimport type { ContextEpochEntryRef, SourceSnapshotRef } from \"./request-events.js\";\nimport { bindMessageReplayUnits, closeViewSelection, prepareViewSelection } from \"./view-units.js\";\n\n/** Actual adapter-public measurement, not a verdict about the opaque native request. */\nexport class PublicContextBudgetError extends RequestTokenBudgetError {\n\treadonly source: SourceSnapshotRef;\n\t#compactionKey?: string;\n\t#summaryCapacity?: (retained: ReadonlySet<string>, wrapper: string) => number | undefined;\n\n\tremainingSummaryTokens(retained: ReadonlySet<string>, wrapper: string): number | undefined {\n\t\treturn this.#summaryCapacity?.(retained, wrapper);\n\t}\n\n\tgetCompactionKey(): string | undefined {\n\t\treturn this.#compactionKey;\n\t}\n\n\tconstructor(\n\t\tsource: SourceSnapshotRef,\n\t\tassessment: RequestTokenAssessment,\n\t\treadonly originalAssessment: RequestTokenAssessment,\n\t\treadonly mandatoryAssessment?: RequestTokenAssessment,\n\t\treadonly taskFrameRebaseAvailable = false,\n\t\tcompactionKey?: string,\n\t\tsummaryCapacity?: (retained: ReadonlySet<string>, wrapper: string) => number | undefined,\n\t\treadonly isSourceCurrent?: () => boolean,\n\t) {\n\t\tsuper(assessment);\n\t\tthis.name = \"PublicContextBudgetError\";\n\t\tif (mandatoryAssessment?.status === \"over-budget\")\n\t\t\tthis.message =\n\t\t\t\t\"Context capacity exceeded: instructions, tools, mandatory evidence and output allowance cannot fit. Summarizing unrelated history cannot resolve this request.\";\n\t\tthis.source = Object.freeze({ ...source });\n\t\tthis.#compactionKey = compactionKey;\n\t\tthis.#summaryCapacity = summaryCapacity;\n\t}\n}\n\n// Only publicBudgetFailure can grant this authority to the exact error it creates.\n// Constructing a public error or copying its descriptive fields grants nothing.\nconst recoveryCompactionAuthorizations = new WeakMap<PublicContextBudgetError, RecoveryCompactionAuthorization>();\n\nexport function getRecoveryCompactionAuthorization(\n\terror: PublicContextBudgetError | undefined,\n): RecoveryCompactionAuthorization | undefined {\n\treturn error ? recoveryCompactionAuthorizations.get(error) : undefined;\n}\n\nexport interface RequestViewCandidate {\n\t/** Session-local Responses ID namespace; a new owner requires a fresh representation. */\n\treadonly responseItemIdentity?: string;\n\treadonly source: SourceSnapshotRef;\n\treadonly selectedUnitIds: readonly string[];\n\treadonly request: ProviderRequestRepresentation;\n\treadonly projection: ProviderRequestProjection;\n\t// Absent only for mandatory full-view admission without a configured token budget.\n\treadonly assessment: RequestTokenAssessment | undefined;\n\treadonly originalAssessment: RequestTokenAssessment | undefined;\n\t/** Exact public messages represented by the accepted candidate, with captured source recipes. */\n\treadonly publicMessages?: readonly AgentMessage[];\n}\n\n/** Root resolves only after its canonical epoch checkpoint ACK. This module owns no epoch state. */\nexport type RequestViewCommit = (\n\tcandidate: RequestViewCandidate,\n) => Promise<ContextEpochEntryRef | undefined> | Promise<void>;\nexport type RequestViewValidate = (\n\trequest: ProviderRequestRepresentation,\n\tassessment: RequestTokenAssessment | undefined,\n) => void;\n\nexport type RequestViewFixedPrepare = (\n\trequest: ProviderRequestRepresentation,\n\tprojection: ProviderRequestProjection,\n\tassessment: RequestTokenAssessment | undefined,\n) => ContextEpochEntryRef | void | Promise<ContextEpochEntryRef | undefined> | Promise<void>;\n\nexport interface CapturedRequestViewBoundary extends CanonicalViewSelectionSource {\n\treadonly responseItemIdentity?: string;\n\treadonly messages: readonly AgentMessage[];\n\t/** Provider logical positions mapped to the unchanged canonical messages/units. */\n\treadonly providerMessageIndices: readonly number[];\n\treadonly providerPendingPublicMessageGroups?: readonly (readonly number[])[];\n\treadonly commit: RequestViewCommit;\n\treadonly validate?: RequestViewValidate;\n\treadonly fixedPrepare?: RequestViewFixedPrepare;\n\treadonly isSourceCurrent?: () => boolean;\n}\n\nexport function captureRequestViewBoundary(\n\tmessages: readonly AgentMessage[],\n\tcommit: RequestViewCommit,\n\tvalidate?: RequestViewValidate,\n\tfixedPrepare?: RequestViewFixedPrepare,\n\tisSourceCurrent?: () => boolean,\n): CapturedRequestViewBoundary {\n\tconst source = getCanonicalViewSelectionSource(messages);\n\tif (!source) throw new Error(\"Request view boundary requires compiled canonical messages\");\n\tconst providerMessageIndices = messages.flatMap((message, index) => convertToLlm([message]).map(() => index));\n\treturn {\n\t\t...source,\n\t\tmessages: captureCanonicalRequestMessages(messages),\n\t\tproviderMessageIndices,\n\t\t...(source.pendingPublicMessageGroups\n\t\t\t? {\n\t\t\t\t\tproviderPendingPublicMessageGroups: source.pendingPublicMessageGroups.map((group) =>\n\t\t\t\t\t\tgroup.map((index) => providerMessageIndex(providerMessageIndices, index)),\n\t\t\t\t\t),\n\t\t\t\t}\n\t\t\t: {}),\n\t\tcommit,\n\t\tvalidate,\n\t\tfixedPrepare,\n\t\tisSourceCurrent,\n\t};\n}\n\nfunction providerMessageIndex(indices: readonly number[], canonicalIndex: number): number {\n\tconst index = indices.indexOf(canonicalIndex);\n\tif (index < 0) throw new Error(\"Provider projection cannot address a filtered canonical message\");\n\treturn index;\n}\n\n/** Keep canonical UI barriers while translating the native serializer's provider-only positions. */\nfunction canonicalRequestProjection(\n\tboundary: CapturedRequestViewBoundary,\n\tprojection: ProviderRequestProjection,\n): ProviderRequestProjection {\n\tconst indices = boundary.providerMessageIndices;\n\tif (indices.length === boundary.messages.length) return projection;\n\tconst canonicalIndex = (index: number): number => {\n\t\tconst canonical = indices[index];\n\t\tif (canonical === undefined) throw new Error(\"Provider projection message index is outside its captured view\");\n\t\treturn canonical;\n\t};\n\treturn {\n\t\t...projection,\n\t\tmessageIndices: projection.messageIndices.map((index) => (index === null ? null : canonicalIndex(index))),\n\t\t...(projection.optionalMessageIndices\n\t\t\t? { optionalMessageIndices: projection.optionalMessageIndices.map(canonicalIndex) }\n\t\t\t: {}),\n\t\t...(projection.generatedMessageIndices\n\t\t\t? { generatedMessageIndices: projection.generatedMessageIndices.map(canonicalIndex) }\n\t\t\t: {}),\n\t\t...(projection.publicMessageGroups\n\t\t\t? { publicMessageGroups: projection.publicMessageGroups.map((group) => group.map(canonicalIndex)) }\n\t\t\t: {}),\n\t\t...(projection.pendingPublicMessageGroups\n\t\t\t? {\n\t\t\t\t\tpendingPublicMessageGroups: projection.pendingPublicMessageGroups.map((group) =>\n\t\t\t\t\t\tgroup.map(canonicalIndex),\n\t\t\t\t\t),\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(projection.encodePublicWindow\n\t\t\t? {\n\t\t\t\t\tencodePublicWindow: (replacements: readonly ProviderRequestPublicMessage[]) => {\n\t\t\t\t\t\tconst encoded = projection.encodePublicWindow!(\n\t\t\t\t\t\t\treplacements.map((replacement) => ({\n\t\t\t\t\t\t\t\t...replacement,\n\t\t\t\t\t\t\t\tmessageIndex: providerMessageIndex(indices, replacement.messageIndex),\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\tencoded && { ...encoded, projection: canonicalRequestProjection(boundary, encoded.projection) }\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t};\n}\n\nexport function matchesRequestView(\n\tboundary: CapturedRequestViewBoundary,\n\tsource: SourceSnapshotRef,\n\tcontext: Context,\n): boolean {\n\tconst expected = boundary.source;\n\tif (\n\t\texpected.sessionId !== source.sessionId ||\n\t\texpected.sessionFile !== source.sessionFile ||\n\t\texpected.leafId !== source.leafId ||\n\t\texpected.sourceSequence !== source.sourceSequence\n\t)\n\t\treturn false;\n\tconst rendered = convertToLlm([...boundary.messages]);\n\treturn (\n\t\tboundary.messages.length === boundary.units.length &&\n\t\trendered.length === boundary.providerMessageIndices.length &&\n\t\tJSON.stringify(rendered) === JSON.stringify(context.messages)\n\t);\n}\n\n/** Projection kinds describe their actual provider body, never an OpenAI-format route alias. */\nfunction requestInputKey(\n\trequest: ProviderRequestRepresentation,\n\tprojection: ProviderRequestProjection,\n): \"input\" | \"messages\" | undefined {\n\tif (\n\t\t(request.api === \"openai-responses\" || request.api === \"openai-codex-responses\") &&\n\t\t(projection.kind === \"openai-responses-text-v1\" || projection.kind === \"openai-responses-replay-v1\")\n\t)\n\t\treturn \"input\";\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\tprojection.kind === \"deepseek-completions-text-tools-v1\" &&\n\t\trequest.body !== undefined &&\n\t\tJSON.parse(request.body).model === \"deepseek-flash\"\n\t)\n\t\treturn \"messages\";\n\treturn undefined;\n}\n\n/** A lower bound for compaction: fixed policy, current tail and required recorded evidence. */\nfunction publicBudgetFailure(\n\tboundary: CapturedRequestViewBoundary,\n\tmessages: readonly AgentMessage[],\n\trequest: ProviderRequestRepresentation,\n\tprojection: ProviderRequestProjection,\n\tbudget: RequestTokenBudgetEvaluator,\n\tassessment: RequestTokenAssessment,\n\toriginal: RequestTokenAssessment,\n): PublicContextBudgetError {\n\tconst context = getCanonicalEpochContext(messages)!;\n\tconst source = getCanonicalViewSelectionSource(messages)!;\n\tconst toolEntries = new Set(\n\t\tcontext.toolContinuations?.flatMap((group) => [\n\t\t\tgroup.assistantEntryId,\n\t\t\t...group.calls.flatMap((call) => (call.result ? [call.result.id] : [])),\n\t\t]),\n\t);\n\tlet tailSequence = -1;\n\tfor (const reference of context.references)\n\t\tif (reference && reference.ref.kind !== \"compaction\")\n\t\t\ttailSequence = Math.max(tailSequence, reference.ref.sequence);\n\tconst required = new Set(\n\t\tsource.units.flatMap((unit, index) => {\n\t\t\tconst reference = context.references[index];\n\t\t\treturn [\"task-frame\", \"resource-view\", \"recovery\"].includes(unit.kind) ||\n\t\t\t\tunit.id === \"native-selected-skill-versions\" ||\n\t\t\t\t(reference && (reference.ref.sequence === tailSequence || toolEntries.has(reference.ref.entryId)))\n\t\t\t\t? [index]\n\t\t\t\t: [];\n\t\t}),\n\t);\n\tconst inputKey = requestInputKey(request, projection)!;\n\tconst body = JSON.parse(request.body!) as Record<string, unknown>;\n\tconst input = body[inputKey];\n\tif (!Array.isArray(input) || input.length !== projection.messageIndices.length)\n\t\treturn new PublicContextBudgetError(\n\t\t\tboundary.source,\n\t\t\tassessment,\n\t\t\toriginal,\n\t\t\tundefined,\n\t\t\tfalse,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tboundary.isSourceCurrent,\n\t\t);\n\tconst graph = prepareViewSelection(source.units, boundary.limits);\n\tconst retainedInput = (retained: ReadonlySet<string>) => {\n\t\tconst roots = source.units\n\t\t\t.filter((_, index) => required.has(index) || retained.has(context.references[index]?.ref.entryId ?? \"\"))\n\t\t\t.map((unit) => unit.id);\n\t\tconst selected = new Set(graph.close(roots).map((unit) => unit.id));\n\t\treturn input.filter((_, index) => {\n\t\t\tconst messageIndex = projection.messageIndices[index];\n\t\t\treturn messageIndex === null || selected.has(source.units[messageIndex].id);\n\t\t});\n\t};\n\tconst minimum = withRequestBody(request, JSON.stringify({ ...body, [inputKey]: retainedInput(new Set()) }));\n\tconst error = new PublicContextBudgetError(\n\t\tboundary.source,\n\t\tassessment,\n\t\toriginal,\n\t\tbudget.measure(minimum),\n\t\t(context.taskFrame?.messages.length ?? 0) > 1,\n\t\tJSON.stringify([\n\t\t\tboundary.source.sessionId,\n\t\t\tboundary.source.sessionFile,\n\t\t\tsource.units.map((unit) => [unit.id, unit.sourceRevision]),\n\t\t\tassessment.api,\n\t\t\tassessment.provider,\n\t\t\tassessment.model,\n\t\t\tassessment.route,\n\t\t\tassessment.profile,\n\t\t\tassessment.availableInputTokens,\n\t\t\tassessment.outputReserveTokens,\n\t\t]),\n\t\t(retained, wrapper) => {\n\t\t\t// Meter only; this synthetic empty summary is never admitted or sent.\n\t\t\tconst summary =\n\t\t\t\tinputKey === \"messages\"\n\t\t\t\t\t? { role: \"user\", content: wrapper }\n\t\t\t\t\t: { role: \"user\", content: [{ type: \"input_text\", text: wrapper }] };\n\t\t\tconst kept = retainedInput(retained);\n\t\t\tconst position = kept.findIndex((item) => item?.role !== \"system\" && item?.role !== \"developer\");\n\t\t\tkept.splice(position < 0 ? kept.length : position, 0, summary);\n\t\t\tconst measured = budget.measure(withRequestBody(request, JSON.stringify({ ...body, [inputKey]: kept })));\n\t\t\treturn measured.status === \"unknown\" ||\n\t\t\t\tmeasured.availableInputTokens === null ||\n\t\t\t\tmeasured.estimatedInputTokens === null\n\t\t\t\t? undefined\n\t\t\t\t: Math.floor(measured.availableInputTokens - measured.estimatedInputTokens);\n\t\t},\n\t\tboundary.isSourceCurrent,\n\t);\n\tif (projection.replayContract === \"message-groups\") {\n\t\tconst originalContext = getCanonicalEpochContext(boundary.messages)!;\n\t\tconst recoveries = boundary.units.flatMap((unit, index) =>\n\t\t\tunit.kind === \"recovery\" && originalContext.references[index] ? [originalContext.references[index]!] : [],\n\t\t);\n\t\tif (recoveries.length) {\n\t\t\trecoveryCompactionAuthorizations.set(error, {\n\t\t\t\tsource: originalContext.source,\n\t\t\t\trecoveries,\n\t\t\t\tresourceRevision: originalContext.resourceRevision,\n\t\t\t\t// Do not extend a partial public conversion to native groups the encoder did not replace.\n\t\t\t\tpublicWindow:\n\t\t\t\t\tmessages !== boundary.messages &&\n\t\t\t\t\tprojection.publicWindow === true &&\n\t\t\t\t\tboundary.units.every(\n\t\t\t\t\t\t(unit, index) =>\n\t\t\t\t\t\t\t![\"recovery\", \"replay-group\"].includes(unit.kind) ||\n\t\t\t\t\t\t\tcontext.references[index]?.rendering !== undefined,\n\t\t\t\t\t),\n\t\t\t\tisSourceCurrent: boundary.isSourceCurrent,\n\t\t\t});\n\t\t}\n\t}\n\treturn error;\n}\n\n/** Check the actual final mapping without selecting, converting, or committing another view. */\nexport async function prepareFixedRequestView(\n\tboundary: CapturedRequestViewBoundary,\n\trequest: ProviderRequestRepresentation,\n\tprojection: ProviderRequestProjection,\n\tassessment: RequestTokenAssessment | undefined,\n) {\n\tprojection = canonicalRequestProjection(boundary, projection);\n\tconst inputKey = requestInputKey(request, projection);\n\tconst payload = JSON.parse(request.body!) as Record<string, unknown> | null;\n\tconst input = inputKey && payload ? payload[inputKey] : undefined;\n\tif (!Array.isArray(input) || input.length !== projection.messageIndices.length)\n\t\tthrow new Error(\"Fixed context requires its final provider projection\");\n\tif (\n\t\tprojection.kind === \"openai-responses-text-v1\" &&\n\t\tboundary.messages.some(\n\t\t\t(message) =>\n\t\t\t\tmessage.role === \"toolResult\" ||\n\t\t\t\t(message.role === \"assistant\" && (message.content.length !== 1 || message.content[0].type !== \"text\")),\n\t\t)\n\t)\n\t\tthrow new Error(\"Fixed context requires its native replay adapter\");\n\tconst units = bindMessageReplayUnits(\n\t\tboundary.messages,\n\t\tboundary.units,\n\t\tboundary.limits,\n\t\tprojection.replayContract ?? \"complete-context\",\n\t);\n\tcloseViewSelection(\n\t\tunits,\n\t\tunits.map((unit) => unit.id),\n\t\tboundary.limits,\n\t);\n\treturn await boundary.fixedPrepare!(request, projection, assessment);\n}\n\n/** Reuse the same legal omission policy for native and already-converted public requests. */\nasync function offerOptionalSubset(\n\tmessages: readonly AgentMessage[],\n\tunits: CanonicalViewSelectionSource[\"units\"],\n\tselection: ReturnType<typeof prepareViewSelection>,\n\trequest: ProviderRequestRepresentation,\n\tprojection: ProviderRequestProjection,\n\tbudget: RequestTokenBudgetEvaluator,\n\toffer: (\n\t\tids: readonly string[],\n\t\trequest: ProviderRequestRepresentation,\n\t\tprojection: ProviderRequestProjection,\n\t\tassessment: RequestTokenAssessment,\n\t) => Promise<unknown>,\n): Promise<string | undefined> {\n\tconst inputKey = requestInputKey(request, projection);\n\tif (!inputKey) return;\n\tconst payload = JSON.parse(request.body!) as Record<string, unknown>;\n\tconst input = payload[inputKey];\n\tif (!Array.isArray(input) || input.length !== projection.messageIndices.length) return;\n\tlet latestAssistant = -1;\n\tfor (const [index, message] of messages.entries()) if (message.role === \"assistant\") latestAssistant = index;\n\tconst retained = new Set(projection.messageIndices.slice(0, request.retainedPrefix?.inputItems ?? 0));\n\tconst projectedOptional =\n\t\tprojection.kind !== \"openai-responses-text-v1\" ? new Set(projection.optionalMessageIndices ?? []) : undefined;\n\tconst optional = units.filter((unit, index) => {\n\t\tconst message = messages[index];\n\t\treturn (\n\t\t\tindex !== latestAssistant &&\n\t\t\t!retained.has(index) &&\n\t\t\t(!projectedOptional || projectedOptional.has(index)) &&\n\t\t\tunit.kind === \"literal\" &&\n\t\t\tunit.authority === \"assistant-public\" &&\n\t\t\tmessage.role === \"assistant\" &&\n\t\t\tmessage.stopReason === \"stop\" &&\n\t\t\tmessage.content.length === 1 &&\n\t\t\tmessage.content[0].type === \"text\"\n\t\t);\n\t});\n\tconst generatedPositions = new Map<string, number>();\n\tconst generated =\n\t\tprojection.generatedMessageIndices ??\n\t\tmessages.flatMap((message, index) =>\n\t\t\tmessage.role === \"assistant\" &&\n\t\t\tmessage.content.some((block) => block.type === \"text\" && block.textSignature === undefined)\n\t\t\t\t? [index]\n\t\t\t\t: [],\n\t\t);\n\tfor (const index of generated) generatedPositions.set(units[index].id, index);\n\t// All user inputs, the latest assistant, fixed/TaskFrame/recovery units and errors stay selected.\n\tconst selected = new Set(units.map((unit) => unit.id));\n\tfor (const unit of optional) {\n\t\tselected.delete(unit.id);\n\t\tconst closed = selection.close([...selected]);\n\t\t// Normal Responses rendering uses msg_<message index> for unsigned assistants.\n\t\t// Reject any subset that would change a retained generated item ID on reconstruction.\n\t\tif (closed.some((item, index) => generatedPositions.has(item.id) && generatedPositions.get(item.id) !== index))\n\t\t\tcontinue;\n\t\tconst closedIds = new Set(closed.map((item) => item.id));\n\t\tconst keepItem = (index: number) => {\n\t\t\tconst messageIndex = projection.messageIndices[index];\n\t\t\treturn messageIndex === null || closedIds.has(units[messageIndex].id);\n\t\t};\n\t\tconst body = JSON.stringify({ ...payload, [inputKey]: input.filter((_, index) => keepItem(index)) });\n\t\tconst candidateRequest = { ...request, body };\n\t\tconst assessment = budget.measure(candidateRequest);\n\t\tif (assessment.status !== \"within-estimate\") continue;\n\t\tawait offer(\n\t\t\tclosed.map((item) => item.id),\n\t\t\tcandidateRequest,\n\t\t\t{\n\t\t\t\t...projection,\n\t\t\t\tmessageIndices: projection.messageIndices.filter((_, index) => keepItem(index)),\n\t\t\t\t...(projection.optionalMessageIndices\n\t\t\t\t\t? {\n\t\t\t\t\t\t\toptionalMessageIndices: projection.optionalMessageIndices.filter((index) =>\n\t\t\t\t\t\t\t\tclosedIds.has(units[index].id),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t\t...(projection.generatedMessageIndices\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tgeneratedMessageIndices: projection.generatedMessageIndices.filter((index) =>\n\t\t\t\t\t\t\t\tclosedIds.has(units[index].id),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t},\n\t\t\tassessment,\n\t\t);\n\t\treturn body;\n\t}\n\treturn;\n}\n\n/** Only the actual serializer's established replay contract authorizes historical-literal omission. */\nexport async function selectRequestView(\n\tboundary: CapturedRequestViewBoundary,\n\trequest: ProviderRequestRepresentation,\n\tprojection: ProviderRequestProjection,\n\tbudget: RequestTokenBudgetEvaluator | undefined,\n\tallowShrink: boolean,\n\tfinalizeMeasurement?: (\n\t\trequest: ProviderRequestRepresentation,\n\t\tassessment: RequestTokenAssessment | undefined,\n\t) => Promise<RequestTokenAssessment | undefined>,\n): Promise<string | undefined> {\n\tprojection = canonicalRequestProjection(boundary, projection);\n\tlet full = budget?.measure(request);\n\tconst inputKey = requestInputKey(request, projection);\n\tif ((budget && full?.limitSource !== \"explicit-profile\") || !inputKey) return;\n\tif (\n\t\t!budget &&\n\t\t!boundary.requiresEpoch &&\n\t\t!boundary.recoveryContractRequested &&\n\t\t!boundary.pendingPublicMessageGroups?.length\n\t)\n\t\treturn;\n\tconst payload = JSON.parse(request.body!) as Record<string, unknown>;\n\tconst input = payload[inputKey];\n\tif (!Array.isArray(input) || input.length !== projection.messageIndices.length) return;\n\t// Resolve a near-limit estimate before discarding a stable native prefix. Original\n\t// protected tool groups must first pass their public conversion below.\n\tif (\n\t\tfull?.status === \"over-budget\" &&\n\t\t!boundary.pendingPublicMessageGroups?.length &&\n\t\t!projection.pendingPublicMessageGroups?.length\n\t)\n\t\tfull = (await finalizeMeasurement?.(request, full)) ?? full;\n\n\t// Absence is complete-context; a profile or tool-shaped message is never group authority.\n\tconst replayContract = projection.replayContract ?? \"complete-context\";\n\tif (\n\t\tprojection.kind === \"openai-responses-text-v1\" &&\n\t\tboundary.messages.some(\n\t\t\t(message) =>\n\t\t\t\tmessage.role === \"toolResult\" ||\n\t\t\t\t(message.role === \"assistant\" && (message.content.length !== 1 || message.content[0].type !== \"text\")),\n\t\t)\n\t)\n\t\treturn;\n\tconst units = bindMessageReplayUnits(\n\t\tboundary.messages,\n\t\tboundary.units,\n\t\tboundary.limits,\n\t\treplayContract,\n\t\tboundary.pendingPublicMessageGroups,\n\t);\n\tconst selection = prepareViewSelection(units, boundary.limits);\n\tconst offer = async (\n\t\tselectedUnitIds: readonly string[],\n\t\tcandidateRequest: ProviderRequestRepresentation,\n\t\tcandidateProjection: ProviderRequestProjection,\n\t\tassessment: RequestTokenAssessment | undefined,\n\t\tpublicMessages?: readonly AgentMessage[],\n\t) => {\n\t\tassessment = (await finalizeMeasurement?.(candidateRequest, assessment)) ?? assessment;\n\t\tif (budget && assessment) {\n\t\t\tif (assessment.status === \"over-budget\" && full)\n\t\t\t\tthrow publicBudgetFailure(\n\t\t\t\t\tboundary,\n\t\t\t\t\tpublicMessages ?? boundary.messages,\n\t\t\t\t\tcandidateRequest,\n\t\t\t\t\tcandidateProjection,\n\t\t\t\t\tbudget,\n\t\t\t\t\tassessment,\n\t\t\t\t\tfull,\n\t\t\t\t);\n\t\t\tbudget.assert(assessment);\n\t\t}\n\t\treturn boundary.commit(\n\t\t\tObject.freeze({\n\t\t\t\t...(boundary.responseItemIdentity ? { responseItemIdentity: boundary.responseItemIdentity } : {}),\n\t\t\t\tsource: Object.freeze({ ...boundary.source }),\n\t\t\t\tselectedUnitIds: Object.freeze([...selectedUnitIds]),\n\t\t\t\trequest: Object.freeze({ ...candidateRequest }),\n\t\t\t\tprojection: Object.freeze({\n\t\t\t\t\t...candidateProjection,\n\t\t\t\t\treplayContract,\n\t\t\t\t\tmessageIndices: Object.freeze([...candidateProjection.messageIndices]),\n\t\t\t\t\t...(candidateProjection.optionalMessageIndices\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\toptionalMessageIndices: Object.freeze([...candidateProjection.optionalMessageIndices]),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {}),\n\t\t\t\t\t...(candidateProjection.generatedMessageIndices\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tgeneratedMessageIndices: Object.freeze([...candidateProjection.generatedMessageIndices]),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {}),\n\t\t\t\t}),\n\t\t\t\tassessment,\n\t\t\t\toriginalAssessment: full,\n\t\t\t\t...(publicMessages ? { publicMessages } : {}),\n\t\t\t}),\n\t\t);\n\t};\n\tconst offerPublicSubset = async (\n\t\tmessages: readonly AgentMessage[],\n\t\trequest: ProviderRequestRepresentation,\n\t\tprojection: ProviderRequestProjection,\n\t): Promise<string | undefined> => {\n\t\tif (!allowShrink || !budget || replayContract !== \"message-groups\") return;\n\t\tconst source = getCanonicalViewSelectionSource(messages)!;\n\t\tconst units = bindMessageReplayUnits(messages, source.units, boundary.limits, replayContract);\n\t\treturn offerOptionalSubset(\n\t\t\tmessages,\n\t\t\tunits,\n\t\t\tprepareViewSelection(units, boundary.limits),\n\t\t\trequest,\n\t\t\tprojection,\n\t\t\tbudget,\n\t\t\t(ids, candidate, mapping, assessment) => offer(ids, candidate, mapping, assessment, messages),\n\t\t);\n\t};\n\tif (boundary.pendingPublicMessageGroups?.length) {\n\t\tif (\n\t\t\treplayContract !== \"message-groups\" ||\n\t\t\t!projection.publicWindow ||\n\t\t\t!projection.encodePublicWindow ||\n\t\t\tJSON.stringify(projection.pendingPublicMessageGroups) !== JSON.stringify(boundary.pendingPublicMessageGroups)\n\t\t)\n\t\t\tthrow new Error(\"Original tool group requires current native adapter public conversion\");\n\t\tconst publicView = prepareToolContinuationWindow(boundary.messages);\n\t\tconst encoded = projection.encodePublicWindow(publicView.replacements);\n\t\tif (!encoded || encoded.projection.pendingPublicMessageGroups?.length)\n\t\t\tthrow new Error(\"Native adapter did not convert the whole required tool group\");\n\t\tconst publicSource = getCanonicalViewSelectionSource(publicView.messages)!;\n\t\tconst publicUnits = bindMessageReplayUnits(\n\t\t\tpublicView.messages,\n\t\t\tpublicSource.units,\n\t\t\tboundary.limits,\n\t\t\treplayContract,\n\t\t);\n\t\tconst closed = closeViewSelection(\n\t\t\tpublicUnits,\n\t\t\tpublicUnits.map((unit) => unit.id),\n\t\t\tboundary.limits,\n\t\t);\n\t\tlet assessment = budget?.measure(encoded.request);\n\t\tif (assessment?.status === \"over-budget\")\n\t\t\tassessment = (await finalizeMeasurement?.(encoded.request, assessment)) ?? assessment;\n\t\tif (assessment && full) {\n\t\t\tif (assessment.status === \"over-budget\") {\n\t\t\t\tconst subset = await offerPublicSubset(publicView.messages, encoded.request, encoded.projection);\n\t\t\t\tif (subset !== undefined) return subset;\n\t\t\t\tthrow publicBudgetFailure(\n\t\t\t\t\tboundary,\n\t\t\t\t\tpublicView.messages,\n\t\t\t\t\tencoded.request,\n\t\t\t\t\tencoded.projection,\n\t\t\t\t\tbudget!,\n\t\t\t\t\tassessment,\n\t\t\t\t\tfull,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (assessment.status !== \"within-estimate\")\n\t\t\t\tthrow new Error(\"Tool continuation public request exceeds its token budget\");\n\t\t}\n\t\tawait offer(\n\t\t\tclosed.map((unit) => unit.id),\n\t\t\tencoded.request,\n\t\t\tencoded.projection,\n\t\t\tassessment,\n\t\t\tpublicView.messages,\n\t\t);\n\t\treturn encoded.request.body;\n\t}\n\tif (projection.pendingPublicMessageGroups?.length)\n\t\tthrow new Error(\"Adapter pending group has no original owned source plan\");\n\t// Without a configured budget, admit only the exact full native view. Never shrink it.\n\tif (!budget) {\n\t\tconst closed = selection.close(units.map((unit) => unit.id));\n\t\tawait offer(\n\t\t\tclosed.map((unit) => unit.id),\n\t\t\trequest,\n\t\t\tprojection,\n\t\t\tundefined,\n\t\t);\n\t\treturn request.body;\n\t}\n\tif (!full) return;\n\tconst offerPublicWindow = async (): Promise<string | undefined> => {\n\t\tif (\n\t\t\t!allowShrink ||\n\t\t\treplayContract !== \"message-groups\" ||\n\t\t\t!projection.publicWindow ||\n\t\t\t!projection.encodePublicWindow\n\t\t)\n\t\t\treturn;\n\t\tconst closed = selection.close(units.map((unit) => unit.id));\n\t\tlet firstMessageIndex = 0;\n\t\tif (\n\t\t\tfull.status === \"unknown\" &&\n\t\t\tfull.unknown.length === 1 &&\n\t\t\tfull.unknown[0] === \"media, opaque or unsupported replay token coverage unknown\"\n\t\t) {\n\t\t\t// Credited items are not part of the unknown input. Keep original projection indices.\n\t\t\tconst firstUnmeteredItem = request.retainedPrefix?.inputItems ?? 0;\n\t\t\tconst reasoningItemIndex = input.findIndex(\n\t\t\t\t(item, index) => index >= firstUnmeteredItem && item?.type === \"reasoning\",\n\t\t\t);\n\t\t\tconst messageIndex = projection.messageIndices[reasoningItemIndex];\n\t\t\tconst group =\n\t\t\t\tmessageIndex == null\n\t\t\t\t\t? undefined\n\t\t\t\t\t: projection.publicMessageGroups?.find((members) => members.includes(messageIndex));\n\t\t\t// The adapter still accepts only complete groups; earlier meterable groups stay native.\n\t\t\tfirstMessageIndex = group ? Math.min(...group) : 0;\n\t\t}\n\t\tconst publicView = preparePublicContextWindow(boundary.messages, firstMessageIndex);\n\t\tif (!publicView) {\n\t\t\t// Keep the original measured refusal when no public conversion can be offered.\n\t\t\t// This is not a new recovery signal or permission to reprepare again.\n\t\t\tif (full.status === \"over-budget\") throw new RequestTokenBudgetError(full);\n\t\t\treturn;\n\t\t}\n\t\tconst encoded = projection.encodePublicWindow(publicView.replacements);\n\t\tif (!encoded) return;\n\t\tlet assessment = budget.measure(encoded.request);\n\t\tif (assessment.status === \"over-budget\")\n\t\t\tassessment = (await finalizeMeasurement?.(encoded.request, assessment)) ?? assessment;\n\t\tif (assessment.status === \"over-budget\") {\n\t\t\tconst subset = await offerPublicSubset(publicView.messages, encoded.request, encoded.projection);\n\t\t\tif (subset !== undefined) return subset;\n\t\t\tthrow publicBudgetFailure(\n\t\t\t\tboundary,\n\t\t\t\tpublicView.messages,\n\t\t\t\tencoded.request,\n\t\t\t\tencoded.projection,\n\t\t\t\tbudget,\n\t\t\t\tassessment,\n\t\t\t\tfull,\n\t\t\t);\n\t\t}\n\t\tif (assessment.status !== \"within-estimate\") return;\n\t\tawait offer(\n\t\t\tclosed.map((unit) => unit.id),\n\t\t\tencoded.request,\n\t\t\tencoded.projection,\n\t\t\tassessment,\n\t\t\tpublicView.messages,\n\t\t);\n\t\treturn encoded.request.body;\n\t};\n\tif (full.status === \"within-estimate\") {\n\t\tconst closed = selection.close(units.map((unit) => unit.id));\n\t\tawait offer(\n\t\t\tclosed.map((unit) => unit.id),\n\t\t\trequest,\n\t\t\tprojection,\n\t\t\tfull,\n\t\t);\n\t\treturn request.body;\n\t}\n\tif (!allowShrink || replayContract !== \"message-groups\") return;\n\tif (full.status !== \"over-budget\") return offerPublicWindow();\n\tconst subset = await offerOptionalSubset(boundary.messages, units, selection, request, projection, budget, offer);\n\tif (subset !== undefined) return subset;\n\treturn offerPublicWindow();\n}\n"]}
|
|
@@ -10,4 +10,9 @@ export declare function readUserMessagesForForking(manager: ReadonlySessionManag
|
|
|
10
10
|
entryId: string;
|
|
11
11
|
text: string;
|
|
12
12
|
}>>;
|
|
13
|
+
/** UI picker limits cover user-message candidates, not unrelated archive payloads. */
|
|
14
|
+
export declare function readVisibleUserMessagesForForking(manager: ReadonlySessionManager, limits?: SessionHistoryReadLimits): Promise<Array<{
|
|
15
|
+
entryId: string;
|
|
16
|
+
text: string;
|
|
17
|
+
}>>;
|
|
13
18
|
//# sourceMappingURL=session-fork-messages.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-fork-messages.d.ts","sourceRoot":"","sources":["../../src/core/session-fork-messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAC3E,OAAO,KAAK,EAAE,sBAAsB,
|
|
1
|
+
{"version":3,"file":"session-fork-messages.d.ts","sourceRoot":"","sources":["../../src/core/session-fork-messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAC3E,OAAO,KAAK,EAAE,sBAAsB,EAAgB,MAAM,sBAAsB,CAAC;AAEjF,eAAO,MAAM,2BAA2B,EAAE,QAAQ,CAAC,wBAAwB,CAGzE,CAAC;AAEH;;;;GAIG;AACH,wBAAsB,0BAA0B,CAC/C,OAAO,EAAE,sBAAsB,EAC/B,MAAM,GAAE,wBAAsD,GAC5D,OAAO,CAAC,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAMnD;AAoBD,sFAAsF;AACtF,wBAAsB,iCAAiC,CACtD,OAAO,EAAE,sBAAsB,EAC/B,MAAM,GAAE,wBAAsD,GAC5D,OAAO,CAAC,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAwCnD","sourcesContent":["import type { SessionHistoryReadLimits } from \"./session-history-index.js\";\nimport type { ReadonlySessionManager, SessionEntry } from \"./session-manager.js\";\n\nexport const DEFAULT_FORK_MESSAGE_LIMITS: Readonly<SessionHistoryReadLimits> = Object.freeze({\n\tmaxEntries: 16_384,\n\tmaxSourceBytes: 64 * 1024 * 1024,\n});\n\n/**\n * Complete source order, including other branches; refuse rather than return a clipped picker.\n * Limits count all entries before text filtering. Native bytes are frame bytes;\n * resident bytes are serialized header/entry JSON, not a heap estimate.\n */\nexport async function readUserMessagesForForking(\n\tmanager: ReadonlySessionManager,\n\tlimits: SessionHistoryReadLimits = DEFAULT_FORK_MESSAGE_LIMITS,\n): Promise<Array<{ entryId: string; text: string }>> {\n\tconst capturedLimits = { ...limits };\n\tconst entries = manager.supportsCapturedHistoryReads()\n\t\t? (await manager.materializeSourceHistory(capturedLimits)).entries.map(({ entry }) => entry)\n\t\t: manager.materializeResidentHistory(capturedLimits).entries;\n\treturn projectUserMessages(entries);\n}\n\nfunction projectUserMessages(entries: readonly SessionEntry[]): Array<{ entryId: string; text: string }> {\n\tconst result: Array<{ entryId: string; text: string }> = [];\n\tfor (const entry of entries) {\n\t\tif (entry.type !== \"message\" || entry.message.role !== \"user\") continue;\n\t\tconst content = entry.message.content;\n\t\tlet text = \"\";\n\t\tif (typeof content === \"string\") text = content;\n\t\telse if (Array.isArray(content)) {\n\t\t\ttext = content\n\t\t\t\t.filter((part) => part.type === \"text\")\n\t\t\t\t.map((part) => part.text)\n\t\t\t\t.join(\"\");\n\t\t}\n\t\tif (text) result.push({ entryId: entry.id, text });\n\t}\n\treturn result;\n}\n\n/** UI picker limits cover user-message candidates, not unrelated archive payloads. */\nexport async function readVisibleUserMessagesForForking(\n\tmanager: ReadonlySessionManager,\n\tlimits: SessionHistoryReadLimits = DEFAULT_FORK_MESSAGE_LIMITS,\n): Promise<Array<{ entryId: string; text: string }>> {\n\tconst { maxEntries, maxSourceBytes } = limits;\n\tif (\n\t\t!Number.isSafeInteger(maxEntries) ||\n\t\tmaxEntries <= 0 ||\n\t\t!Number.isSafeInteger(maxSourceBytes) ||\n\t\tmaxSourceBytes <= 0\n\t)\n\t\tthrow new Error(\"Invalid history materialization limits\");\n\tif (!manager.supportsCapturedHistoryReads())\n\t\treturn readUserMessagesForForking(manager, { maxEntries, maxSourceBytes });\n\treturn manager.readSourceHistory(async (history) => {\n\t\tconst entries: SessionEntry[] = [];\n\t\tlet sourceBytes = 0;\n\t\tlet after = 0;\n\t\tfor (;;) {\n\t\t\tconst page = await history.page(after);\n\t\t\tif (page.indexedThrough < history.source.sourceSequence)\n\t\t\t\tthrow new Error(\"Captured history has incomplete index coverage\");\n\t\t\tfor (const reference of page.events) {\n\t\t\t\t// The index classifies assistant/runtime messages; hydrated user roles are still checked below.\n\t\t\t\tif (\n\t\t\t\t\treference.kind !== \"message\" ||\n\t\t\t\t\treference.authority === \"assistant\" ||\n\t\t\t\t\treference.authority === \"runtime\"\n\t\t\t\t)\n\t\t\t\t\tcontinue;\n\t\t\t\tif (entries.length >= maxEntries) throw new Error(\"History entry budget exceeded\");\n\t\t\t\tif (sourceBytes + reference.locator.length > maxSourceBytes)\n\t\t\t\t\tthrow new Error(\"History source byte budget exceeded\");\n\t\t\t\tconst hydrated = await history.hydrateEntry(reference.id, maxSourceBytes - sourceBytes);\n\t\t\t\tif (!hydrated) throw new Error(\"Fork message source is unavailable\");\n\t\t\t\tsourceBytes += reference.locator.length;\n\t\t\t\tentries.push(hydrated.entry);\n\t\t\t}\n\t\t\tif (page.nextAfter === null) break;\n\t\t\tafter = page.nextAfter;\n\t\t}\n\t\treturn projectUserMessages(entries);\n\t});\n}\n"]}
|
|
@@ -12,6 +12,9 @@ export async function readUserMessagesForForking(manager, limits = DEFAULT_FORK_
|
|
|
12
12
|
const entries = manager.supportsCapturedHistoryReads()
|
|
13
13
|
? (await manager.materializeSourceHistory(capturedLimits)).entries.map(({ entry }) => entry)
|
|
14
14
|
: manager.materializeResidentHistory(capturedLimits).entries;
|
|
15
|
+
return projectUserMessages(entries);
|
|
16
|
+
}
|
|
17
|
+
function projectUserMessages(entries) {
|
|
15
18
|
const result = [];
|
|
16
19
|
for (const entry of entries) {
|
|
17
20
|
if (entry.type !== "message" || entry.message.role !== "user")
|
|
@@ -31,4 +34,45 @@ export async function readUserMessagesForForking(manager, limits = DEFAULT_FORK_
|
|
|
31
34
|
}
|
|
32
35
|
return result;
|
|
33
36
|
}
|
|
37
|
+
/** UI picker limits cover user-message candidates, not unrelated archive payloads. */
|
|
38
|
+
export async function readVisibleUserMessagesForForking(manager, limits = DEFAULT_FORK_MESSAGE_LIMITS) {
|
|
39
|
+
const { maxEntries, maxSourceBytes } = limits;
|
|
40
|
+
if (!Number.isSafeInteger(maxEntries) ||
|
|
41
|
+
maxEntries <= 0 ||
|
|
42
|
+
!Number.isSafeInteger(maxSourceBytes) ||
|
|
43
|
+
maxSourceBytes <= 0)
|
|
44
|
+
throw new Error("Invalid history materialization limits");
|
|
45
|
+
if (!manager.supportsCapturedHistoryReads())
|
|
46
|
+
return readUserMessagesForForking(manager, { maxEntries, maxSourceBytes });
|
|
47
|
+
return manager.readSourceHistory(async (history) => {
|
|
48
|
+
const entries = [];
|
|
49
|
+
let sourceBytes = 0;
|
|
50
|
+
let after = 0;
|
|
51
|
+
for (;;) {
|
|
52
|
+
const page = await history.page(after);
|
|
53
|
+
if (page.indexedThrough < history.source.sourceSequence)
|
|
54
|
+
throw new Error("Captured history has incomplete index coverage");
|
|
55
|
+
for (const reference of page.events) {
|
|
56
|
+
// The index classifies assistant/runtime messages; hydrated user roles are still checked below.
|
|
57
|
+
if (reference.kind !== "message" ||
|
|
58
|
+
reference.authority === "assistant" ||
|
|
59
|
+
reference.authority === "runtime")
|
|
60
|
+
continue;
|
|
61
|
+
if (entries.length >= maxEntries)
|
|
62
|
+
throw new Error("History entry budget exceeded");
|
|
63
|
+
if (sourceBytes + reference.locator.length > maxSourceBytes)
|
|
64
|
+
throw new Error("History source byte budget exceeded");
|
|
65
|
+
const hydrated = await history.hydrateEntry(reference.id, maxSourceBytes - sourceBytes);
|
|
66
|
+
if (!hydrated)
|
|
67
|
+
throw new Error("Fork message source is unavailable");
|
|
68
|
+
sourceBytes += reference.locator.length;
|
|
69
|
+
entries.push(hydrated.entry);
|
|
70
|
+
}
|
|
71
|
+
if (page.nextAfter === null)
|
|
72
|
+
break;
|
|
73
|
+
after = page.nextAfter;
|
|
74
|
+
}
|
|
75
|
+
return projectUserMessages(entries);
|
|
76
|
+
});
|
|
77
|
+
}
|
|
34
78
|
//# sourceMappingURL=session-fork-messages.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-fork-messages.js","sourceRoot":"","sources":["../../src/core/session-fork-messages.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,2BAA2B,GAAuC,MAAM,CAAC,MAAM,CAAC;IAC5F,UAAU,EAAE,MAAM;IAClB,cAAc,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;CAChC,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC/C,OAA+B,EAC/B,MAAM,GAA6B,2BAA2B,EACV;IACpD,MAAM,cAAc,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;IACrC,MAAM,OAAO,GAAG,OAAO,CAAC,4BAA4B,EAAE;QACrD,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,wBAAwB,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC;QAC5F,CAAC,CAAC,OAAO,CAAC,0BAA0B,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC;IAC9D,MAAM,MAAM,GAA6C,EAAE,CAAC;IAC5D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM;YAAE,SAAS;QACxE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QACtC,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,IAAI,GAAG,OAAO,CAAC;aAC3C,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,IAAI,GAAG,OAAO;iBACZ,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC;iBACtC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;iBACxB,IAAI,CAAC,EAAE,CAAC,CAAC;QACZ,CAAC;QACD,IAAI,IAAI;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,MAAM,CAAC;AAAA,CACd","sourcesContent":["import type { SessionHistoryReadLimits } from \"./session-history-index.js\";\nimport type { ReadonlySessionManager } from \"./session-manager.js\";\n\nexport const DEFAULT_FORK_MESSAGE_LIMITS: Readonly<SessionHistoryReadLimits> = Object.freeze({\n\tmaxEntries: 16_384,\n\tmaxSourceBytes: 64 * 1024 * 1024,\n});\n\n/**\n * Complete source order, including other branches; refuse rather than return a clipped picker.\n * Limits count all entries before text filtering. Native bytes are frame bytes;\n * resident bytes are serialized header/entry JSON, not a heap estimate.\n */\nexport async function readUserMessagesForForking(\n\tmanager: ReadonlySessionManager,\n\tlimits: SessionHistoryReadLimits = DEFAULT_FORK_MESSAGE_LIMITS,\n): Promise<Array<{ entryId: string; text: string }>> {\n\tconst capturedLimits = { ...limits };\n\tconst entries = manager.supportsCapturedHistoryReads()\n\t\t? (await manager.materializeSourceHistory(capturedLimits)).entries.map(({ entry }) => entry)\n\t\t: manager.materializeResidentHistory(capturedLimits).entries;\n\tconst result: Array<{ entryId: string; text: string }> = [];\n\tfor (const entry of entries) {\n\t\tif (entry.type !== \"message\" || entry.message.role !== \"user\") continue;\n\t\tconst content = entry.message.content;\n\t\tlet text = \"\";\n\t\tif (typeof content === \"string\") text = content;\n\t\telse if (Array.isArray(content)) {\n\t\t\ttext = content\n\t\t\t\t.filter((part) => part.type === \"text\")\n\t\t\t\t.map((part) => part.text)\n\t\t\t\t.join(\"\");\n\t\t}\n\t\tif (text) result.push({ entryId: entry.id, text });\n\t}\n\treturn result;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"session-fork-messages.js","sourceRoot":"","sources":["../../src/core/session-fork-messages.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SessionHistoryReadLimits } from \"./session-history-index.js\";\nimport type { ReadonlySessionManager, SessionEntry } from \"./session-manager.js\";\n\nexport const DEFAULT_FORK_MESSAGE_LIMITS: Readonly<SessionHistoryReadLimits> = Object.freeze({\n\tmaxEntries: 16_384,\n\tmaxSourceBytes: 64 * 1024 * 1024,\n});\n\n/**\n * Complete source order, including other branches; refuse rather than return a clipped picker.\n * Limits count all entries before text filtering. Native bytes are frame bytes;\n * resident bytes are serialized header/entry JSON, not a heap estimate.\n */\nexport async function readUserMessagesForForking(\n\tmanager: ReadonlySessionManager,\n\tlimits: SessionHistoryReadLimits = DEFAULT_FORK_MESSAGE_LIMITS,\n): Promise<Array<{ entryId: string; text: string }>> {\n\tconst capturedLimits = { ...limits };\n\tconst entries = manager.supportsCapturedHistoryReads()\n\t\t? (await manager.materializeSourceHistory(capturedLimits)).entries.map(({ entry }) => entry)\n\t\t: manager.materializeResidentHistory(capturedLimits).entries;\n\treturn projectUserMessages(entries);\n}\n\nfunction projectUserMessages(entries: readonly SessionEntry[]): Array<{ entryId: string; text: string }> {\n\tconst result: Array<{ entryId: string; text: string }> = [];\n\tfor (const entry of entries) {\n\t\tif (entry.type !== \"message\" || entry.message.role !== \"user\") continue;\n\t\tconst content = entry.message.content;\n\t\tlet text = \"\";\n\t\tif (typeof content === \"string\") text = content;\n\t\telse if (Array.isArray(content)) {\n\t\t\ttext = content\n\t\t\t\t.filter((part) => part.type === \"text\")\n\t\t\t\t.map((part) => part.text)\n\t\t\t\t.join(\"\");\n\t\t}\n\t\tif (text) result.push({ entryId: entry.id, text });\n\t}\n\treturn result;\n}\n\n/** UI picker limits cover user-message candidates, not unrelated archive payloads. */\nexport async function readVisibleUserMessagesForForking(\n\tmanager: ReadonlySessionManager,\n\tlimits: SessionHistoryReadLimits = DEFAULT_FORK_MESSAGE_LIMITS,\n): Promise<Array<{ entryId: string; text: string }>> {\n\tconst { maxEntries, maxSourceBytes } = limits;\n\tif (\n\t\t!Number.isSafeInteger(maxEntries) ||\n\t\tmaxEntries <= 0 ||\n\t\t!Number.isSafeInteger(maxSourceBytes) ||\n\t\tmaxSourceBytes <= 0\n\t)\n\t\tthrow new Error(\"Invalid history materialization limits\");\n\tif (!manager.supportsCapturedHistoryReads())\n\t\treturn readUserMessagesForForking(manager, { maxEntries, maxSourceBytes });\n\treturn manager.readSourceHistory(async (history) => {\n\t\tconst entries: SessionEntry[] = [];\n\t\tlet sourceBytes = 0;\n\t\tlet after = 0;\n\t\tfor (;;) {\n\t\t\tconst page = await history.page(after);\n\t\t\tif (page.indexedThrough < history.source.sourceSequence)\n\t\t\t\tthrow new Error(\"Captured history has incomplete index coverage\");\n\t\t\tfor (const reference of page.events) {\n\t\t\t\t// The index classifies assistant/runtime messages; hydrated user roles are still checked below.\n\t\t\t\tif (\n\t\t\t\t\treference.kind !== \"message\" ||\n\t\t\t\t\treference.authority === \"assistant\" ||\n\t\t\t\t\treference.authority === \"runtime\"\n\t\t\t\t)\n\t\t\t\t\tcontinue;\n\t\t\t\tif (entries.length >= maxEntries) throw new Error(\"History entry budget exceeded\");\n\t\t\t\tif (sourceBytes + reference.locator.length > maxSourceBytes)\n\t\t\t\t\tthrow new Error(\"History source byte budget exceeded\");\n\t\t\t\tconst hydrated = await history.hydrateEntry(reference.id, maxSourceBytes - sourceBytes);\n\t\t\t\tif (!hydrated) throw new Error(\"Fork message source is unavailable\");\n\t\t\t\tsourceBytes += reference.locator.length;\n\t\t\t\tentries.push(hydrated.entry);\n\t\t\t}\n\t\t\tif (page.nextAfter === null) break;\n\t\t\tafter = page.nextAfter;\n\t\t}\n\t\treturn projectUserMessages(entries);\n\t});\n}\n"]}
|
|
@@ -3,6 +3,7 @@ import { type BranchBootstrapState, type ContextManifestOptions, type ContextMan
|
|
|
3
3
|
import type { BoundRequestSink, SourceSnapshotRef } from "./request-events.js";
|
|
4
4
|
import type { SessionJournalState } from "./session-journal-owner.js";
|
|
5
5
|
import type { SessionEntry } from "./session-manager.js";
|
|
6
|
+
import type { SessionUsageSummary } from "./usage.js";
|
|
6
7
|
/** One source/branch frontier shared by every operation in a captured request. */
|
|
7
8
|
export interface SessionHistoryReadView {
|
|
8
9
|
readonly source: SourceSnapshotRef;
|
|
@@ -62,6 +63,8 @@ export interface SessionHistoryReadScope {
|
|
|
62
63
|
/** Explicit whole-source relations, clipped to this captured prefix. */
|
|
63
64
|
sourceLabel(targetId: string): Promise<IndexedSourceEvent | undefined>;
|
|
64
65
|
sourceAssistantUsage(targetId: string): Promise<IndexedSourceEvent | undefined>;
|
|
66
|
+
/** All source update revisions for a target, including off-branch records, in bounded pages. */
|
|
67
|
+
sourceContextUpdates(target: ContextUpdateTarget, after?: number): Promise<HistoryIndexPage>;
|
|
65
68
|
/** Exact sent-message refs on the original captured parent branch, even before a tool result. */
|
|
66
69
|
ipythonSentMessages(toolCallId: string, options?: IpythonSentMessagesOptions): Promise<IpythonSentMessagesPage>;
|
|
67
70
|
get(id: string): Promise<IndexedSourceEvent | undefined>;
|
|
@@ -99,6 +102,8 @@ export declare class SessionHistoryIndex {
|
|
|
99
102
|
synchronize(snapshot: SessionJournalState): Promise<HistoryIndex>;
|
|
100
103
|
/** Internal current-owner bootstrap; never substitutes current facts for an older captured prefix. */
|
|
101
104
|
currentSourceBootstrap(snapshot: SessionJournalState): Promise<SourceBootstrapState>;
|
|
105
|
+
/** Caller holds the owner queue until the exact current projection is read. */
|
|
106
|
+
currentSourceUsage(snapshot: SessionJournalState): Promise<SessionUsageSummary | undefined>;
|
|
102
107
|
/** Finish accepted indexing, then wait for the external worker to close. */
|
|
103
108
|
close(): Promise<void>;
|
|
104
109
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-history-index.d.ts","sourceRoot":"","sources":["../../src/core/session-history-index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype CanonicalPayloadCursor,\n\ttype CanonicalPayloadFragment,\n\tMAX_CANONICAL_PAYLOAD_PART_BYTES,\n} from \"./canonical-payload-parts.js\";\nimport {\n\ttype BranchBootstrapState,\n\ttype ContextManifestOptions,\n\ttype ContextManifestPage,\n\ttype ContextUpdates,\n\ttype ContextUpdateTarget,\n\tHistoryIndex,\n\ttype HistoryIndexPage,\n\ttype HistoryPayloadReadOptions,\n\ttype IndexedSourceEvent,\n\ttype IpythonSentMessagesOptions,\n\ttype IpythonSentMessagesPage,\n\ttype ParentPathOptions,\n\ttype ParentPathPage,\n\ttype SourceBootstrapState,\n\ttype TaskEvidenceOptions,\n\ttype TaskEvidencePage,\n} from \"./history-index.js\";\nimport type { BoundRequestSink, SourceSnapshotRef } from \"./request-events.js\";\nimport type { SessionJournalState } from \"./session-journal-owner.js\";\nimport type { SessionEntry } from \"./session-manager.js\";\n\n/** One source/branch frontier shared by every operation in a captured request. */\nexport interface SessionHistoryReadView {\n\treadonly source: SourceSnapshotRef;\n\t/** A narrower ancestor/prefix on this same capture; its lifetime never outlives the parent read. */\n\tatSnapshot?(source: SourceSnapshotRef): Promise<SessionHistoryReadView>;\n\tcontextManifest(options?: ContextManifestOptions): Promise<ContextManifestPage>;\n\tcontextUpdates(target: ContextUpdateTarget): Promise<ContextUpdates>;\n\treadContextUpdatePayload(\n\t\tid: string,\n\t\ttarget: ContextUpdateTarget,\n\t\toptions?: HistoryPayloadReadOptions,\n\t): Promise<CanonicalPayloadFragment | undefined>;\n\tget(id: string): Promise<IndexedSourceEvent | undefined>;\n\tpage(after?: number, limit?: number, options?: { scan?: boolean }): Promise<HistoryIndexPage>;\n\tsearch(query: string, limit?: number): Promise<HistoryIndexPage>;\n\ttaskEvidence(options?: TaskEvidenceOptions): Promise<TaskEvidencePage>;\n\treadPayload(id: string, options?: HistoryPayloadReadOptions): Promise<CanonicalPayloadFragment | undefined>;\n}\n\nexport interface BoundHistoryReadSink<View> extends Omit<BoundRequestSink, \"readHistory\"> {\n\treadHistory<T>(read: (view: View) => Promise<T>): Promise<T>;\n}\n\nexport interface BoundSessionRequestSink extends BoundHistoryReadSink<SessionHistoryReadView> {}\n\nexport interface SessionHistoryReadLimits {\n\tmaxEntries: number;\n\t/** Canonical frame bytes, not a decoded heap or tokenizer estimate. */\n\tmaxSourceBytes: number;\n}\n\nexport interface HydratedSessionHistoryEntry {\n\tentry: SessionEntry;\n\t/** Includes the exact locator/revision and lowering-only retention outside the payload. */\n\tsource: IndexedSourceEvent;\n}\n\nexport interface MaterializedSessionHistory {\n\tsource: SourceSnapshotRef;\n\tscope: \"branch\" | \"source\";\n\tentries: HydratedSessionHistoryEntry[];\n\tsourceBytes: number;\n}\n\n/** Bootstrap refs and booleans from the same pinned branch used for exact hydration. */\nexport interface SessionBranchBootstrapState extends BranchBootstrapState {\n\treadonly source: SourceSnapshotRef;\n}\n\n/** Exact parent-chain metadata from one captured canonical source and leaf. */\nexport interface SessionParentPathPage extends ParentPathPage {\n\treadonly source: SourceSnapshotRef;\n}\n\n/** Consume iterators inside the owning read callback. Materialized results are detached. */\nexport interface SessionHistoryReadScope {\n\treadonly source: SourceSnapshotRef;\n\treadonly scope: \"branch\" | \"source\";\n\treadonly branchContext: SessionHistoryReadView;\n\t/** Select the captured branch even when invoked from an explicit whole-source scope. */\n\tbranchBootstrap(): Promise<SessionBranchBootstrapState>;\n\t/** Chronological parent chain only; attached request evidence is not an ancestor. */\n\tparentPath(options?: ParentPathOptions): Promise<SessionParentPathPage>;\n\t/** Source scope only: use another leaf without changing the captured source or branchContext. */\n\tparentPathFrom(leafId: string | null, options?: ParentPathOptions): Promise<SessionParentPathPage>;\n\t/** Explicit whole-source relations, clipped to this captured prefix. */\n\tsourceLabel(targetId: string): Promise<IndexedSourceEvent | undefined>;\n\tsourceAssistantUsage(targetId: string): Promise<IndexedSourceEvent | undefined>;\n\t/** Exact sent-message refs on the original captured parent branch, even before a tool result. */\n\tipythonSentMessages(toolCallId: string, options?: IpythonSentMessagesOptions): Promise<IpythonSentMessagesPage>;\n\tget(id: string): Promise<IndexedSourceEvent | undefined>;\n\tpage(after?: number, limit?: number): Promise<HistoryIndexPage>;\n\tsearch(query: string, limit?: number): Promise<HistoryIndexPage>;\n\treadPayload(id: string, options?: HistoryPayloadReadOptions): Promise<CanonicalPayloadFragment | undefined>;\n\thydrateEntry(id: string, maxSourceBytes: number): Promise<HydratedSessionHistoryEntry | undefined>;\n\titerateEntries(limits: SessionHistoryReadLimits): AsyncGenerator<HydratedSessionHistoryEntry>;\n\tmaterialize(limits: SessionHistoryReadLimits): Promise<MaterializedSessionHistory>;\n}\n\nexport type HistoryReadQuery = <T>(operation: () => Promise<T>) => Promise<T>;\n\n/** Existing inference/request views remain strictly branch-scoped. */\nexport function createBranchHistoryReadView(\n\tindex: HistoryIndex,\n\tsource: SourceSnapshotRef,\n\tquery: HistoryReadQuery,\n): SessionHistoryReadView {\n\tconst sessionId = source.sessionId;\n\tconst scope = { leafId: source.leafId, through: source.sourceSequence };\n\treturn Object.freeze({\n\t\tsource,\n\t\tatSnapshot: async (requested: SourceSnapshotRef) => {\n\t\t\tconst captured = Object.freeze({ ...requested });\n\t\t\tif (\n\t\t\t\tcaptured.sessionId !== sessionId ||\n\t\t\t\tcaptured.sessionFile !== source.sessionFile ||\n\t\t\t\tcaptured.persistent !== source.persistent ||\n\t\t\t\t!Number.isSafeInteger(captured.sourceSequence) ||\n\t\t\t\tcaptured.sourceSequence < 0 ||\n\t\t\t\tcaptured.sourceSequence > source.sourceSequence\n\t\t\t)\n\t\t\t\tthrow new Error(\"Context epoch snapshot is outside its captured source\");\n\t\t\tif (captured.leafId !== null) {\n\t\t\t\tconst leaf = await query(() => index.get(sessionId, captured.leafId!, scope));\n\t\t\t\tif (!leaf || leaf.sequence > captured.sourceSequence)\n\t\t\t\t\tthrow new Error(\"Context epoch snapshot is outside its captured branch\");\n\t\t\t}\n\t\t\treturn createBranchHistoryReadView(index, captured, query);\n\t\t},\n\t\tcontextManifest: (options: ContextManifestOptions = {}) =>\n\t\t\tquery(() => index.contextManifest(sessionId, scope, options)),\n\t\tcontextUpdates: (target: ContextUpdateTarget) => query(() => index.contextUpdates(sessionId, scope, target)),\n\t\treadContextUpdatePayload: (id: string, target: ContextUpdateTarget, options: HistoryPayloadReadOptions = {}) =>\n\t\t\tquery(() => index.readContextUpdatePayload(sessionId, id, scope, target, options)),\n\t\tget: (id: string) => query(() => index.get(sessionId, id, scope)),\n\t\tpage: (after = 0, limit = 64, options: { scan?: boolean } = {}) =>\n\t\t\tquery(() => index.page(sessionId, after, scope.through, limit, scope, options)),\n\t\tsearch: (text: string, limit = 16) => query(() => index.search(sessionId, text, scope.through, limit, scope)),\n\t\ttaskEvidence: (options: TaskEvidenceOptions = {}) => query(() => index.taskEvidence(sessionId, scope, options)),\n\t\treadPayload: (id: string, options: HistoryPayloadReadOptions = {}) =>\n\t\t\tquery(() => index.readPayload(sessionId, id, scope, options)),\n\t});\n}\n\nfunction positiveLimit(value: number): boolean {\n\treturn Number.isSafeInteger(value) && value > 0;\n}\n\n/** Reuse the same bounded payload/identity hydration for a captured branch adapter. */\nexport async function hydrateCapturedHistoryEntry(\n\tmetadata: IndexedSourceEvent,\n\tmaxSourceBytes: number,\n\treadPayload: SessionHistoryReadView[\"readPayload\"],\n): Promise<HydratedSessionHistoryEntry> {\n\tif (metadata.locator.length > maxSourceBytes) throw new Error(\"History entry source byte budget exceeded\");\n\tconst chunks: string[] = [];\n\tlet bytes = 0;\n\tlet cursor: CanonicalPayloadCursor | undefined;\n\tdo {\n\t\tconst fragment = await readPayload(metadata.id, {\n\t\t\tcursor,\n\t\t\tmaxBytes: Math.min(MAX_CANONICAL_PAYLOAD_PART_BYTES, maxSourceBytes - bytes),\n\t\t});\n\t\tif (!fragment) throw new Error(\"Captured history entry payload is unavailable\");\n\t\tbytes += fragment.byteLength;\n\t\tif (bytes > maxSourceBytes) throw new Error(\"History entry source byte budget exceeded\");\n\t\tchunks.push(fragment.text);\n\t\tcursor = fragment.nextCursor ?? undefined;\n\t} while (cursor);\n\tconst entry = JSON.parse(chunks.join(\"\")) as SessionEntry;\n\tif (\n\t\t!entry ||\n\t\ttypeof entry !== \"object\" ||\n\t\tentry.id !== metadata.id ||\n\t\tentry.type !== metadata.kind ||\n\t\tentry.parentId !== metadata.parentId\n\t)\n\t\tthrow new Error(\"Canonical history entry does not match indexed identity\");\n\treturn { entry, source: metadata };\n}\n\n/** Source access is selected explicitly, never by widening a coordinator's branch view. */\nexport function createSessionHistoryReadScope(\n\tindex: HistoryIndex,\n\tsource: SourceSnapshotRef,\n\tquery: HistoryReadQuery,\n\tscope: \"branch\" | \"source\",\n): SessionHistoryReadScope {\n\tconst sessionId = source.sessionId;\n\tconst branch = { leafId: source.leafId, through: source.sourceSequence };\n\tconst get = (id: string) =>\n\t\tquery(() =>\n\t\t\tscope === \"branch\" ? index.get(sessionId, id, branch) : index.getSource(sessionId, id, source.sourceSequence),\n\t\t);\n\tconst page = (after = 0, limit = 64) =>\n\t\tquery(() => index.page(sessionId, after, source.sourceSequence, limit, scope === \"branch\" ? branch : undefined));\n\tconst readPayload = (id: string, options: HistoryPayloadReadOptions = {}) =>\n\t\tquery(() =>\n\t\t\tscope === \"branch\"\n\t\t\t\t? index.readPayload(sessionId, id, branch, options)\n\t\t\t\t: index.readSourcePayload(sessionId, id, source.sourceSequence, options),\n\t\t);\n\n\tconst hydrate = (metadata: IndexedSourceEvent, maxSourceBytes: number) =>\n\t\thydrateCapturedHistoryEntry(metadata, maxSourceBytes, readPayload);\n\n\tasync function* iterateEntries(limits: SessionHistoryReadLimits): AsyncGenerator<HydratedSessionHistoryEntry> {\n\t\tconst { maxEntries, maxSourceBytes } = limits;\n\t\tif (!positiveLimit(maxEntries) || !positiveLimit(maxSourceBytes))\n\t\t\tthrow new Error(\"Invalid history materialization limits\");\n\t\tlet after = 0;\n\t\tlet entries = 0;\n\t\tlet sourceBytes = 0;\n\t\twhile (true) {\n\t\t\tconst selected = await page(after, Math.min(64, maxEntries - entries + 1));\n\t\t\tif (selected.indexedThrough < source.sourceSequence)\n\t\t\t\tthrow new Error(\"Captured history has incomplete index coverage\");\n\t\t\tfor (const metadata of selected.events) {\n\t\t\t\tif (++entries > maxEntries) throw new Error(\"History entry budget exceeded\");\n\t\t\t\tif (sourceBytes + metadata.locator.length > maxSourceBytes)\n\t\t\t\t\tthrow new Error(\"History source byte budget exceeded\");\n\t\t\t\tconst hydrated = await hydrate(metadata, maxSourceBytes - sourceBytes);\n\t\t\t\tsourceBytes += metadata.locator.length;\n\t\t\t\tyield hydrated;\n\t\t\t}\n\t\t\tif (selected.nextAfter === null) return;\n\t\t\tafter = selected.nextAfter;\n\t\t}\n\t}\n\n\treturn Object.freeze({\n\t\tsource,\n\t\tscope,\n\t\tbranchContext: createBranchHistoryReadView(index, source, query),\n\t\tbranchBootstrap: () => query(async () => ({ ...(await index.branchBootstrap(sessionId, branch)), source })),\n\t\tparentPath: (options: ParentPathOptions = {}) =>\n\t\t\tquery(async () => ({ ...(await index.parentPath(sessionId, branch, options)), source })),\n\t\tparentPathFrom: (leafId: string | null, options: ParentPathOptions = {}) =>\n\t\t\tquery(async () => {\n\t\t\t\tif (scope !== \"source\") throw new Error(\"Parent path selection requires a source-scoped history read\");\n\t\t\t\treturn {\n\t\t\t\t\t...(await index.parentPath(sessionId, { leafId, through: source.sourceSequence }, options)),\n\t\t\t\t\tsource,\n\t\t\t\t};\n\t\t\t}),\n\t\tsourceLabel: (targetId: string) => query(() => index.sourceLabel(sessionId, targetId, source.sourceSequence)),\n\t\tsourceAssistantUsage: (targetId: string) =>\n\t\t\tquery(() => index.sourceAssistantUsage(sessionId, targetId, source.sourceSequence)),\n\t\tipythonSentMessages: (toolCallId: string, options: IpythonSentMessagesOptions = {}) =>\n\t\t\tquery(() => index.ipythonSentMessages(sessionId, branch, toolCallId, options)),\n\t\tget,\n\t\tpage,\n\t\tsearch: (text: string, limit = 16) =>\n\t\t\tquery(() =>\n\t\t\t\tindex.search(sessionId, text, source.sourceSequence, limit, scope === \"branch\" ? branch : undefined),\n\t\t\t),\n\t\treadPayload,\n\t\thydrateEntry: async (id: string, maxSourceBytes: number) => {\n\t\t\tif (!positiveLimit(maxSourceBytes)) throw new Error(\"Invalid history entry source byte budget\");\n\t\t\tconst metadata = await get(id);\n\t\t\treturn metadata ? hydrate(metadata, maxSourceBytes) : undefined;\n\t\t},\n\t\titerateEntries: (limits: SessionHistoryReadLimits) => iterateEntries({ ...limits }),\n\t\tmaterialize: async (limits: SessionHistoryReadLimits) => {\n\t\t\tconst entries: HydratedSessionHistoryEntry[] = [];\n\t\t\tlet sourceBytes = 0;\n\t\t\tfor await (const entry of iterateEntries(limits)) {\n\t\t\t\tentries.push(entry);\n\t\t\t\tsourceBytes += entry.source.locator.length;\n\t\t\t}\n\t\t\treturn { source, scope, entries, sourceBytes };\n\t\t},\n\t});\n}\n\n/** A derived, coalescing feed. Canonical source ACKs do not depend on index availability. */\nexport class SessionHistoryIndex {\n\tprivate index?: HistoryIndex;\n\tprivate latest?: SessionJournalState;\n\tprivate indexedThrough = -1;\n\tprivate pumping?: Promise<void>;\n\tprivate failure?: unknown;\n\tprivate closing?: Promise<void>;\n\n\tconstructor(\n\t\tprivate readonly sessionId: string,\n\t\tprivate readonly path: string,\n\t) {}\n\n\t/** Retain at most one newer snapshot while the external worker indexes a prefix. */\n\tpublish(snapshot: SessionJournalState): void {\n\t\tif (this.closing) return;\n\t\tif (!this.latest || snapshot.nextSequence > this.latest.nextSequence) this.latest = { ...snapshot };\n\t\tthis.start();\n\t}\n\n\tprivate needsWork(): boolean {\n\t\treturn this.latest !== undefined && this.indexedThrough < this.latest.nextSequence - 1;\n\t}\n\n\tprivate start(): void {\n\t\tif (this.pumping || !this.needsWork()) return;\n\t\tthis.failure = undefined;\n\t\tconst job = this.pump();\n\t\tthis.pumping = job;\n\t\tvoid job.then(() => {\n\t\t\tthis.pumping = undefined;\n\t\t\tif (!this.failure && this.needsWork()) this.start();\n\t\t});\n\t}\n\n\tprivate async pump(): Promise<void> {\n\t\twhile (this.latest && this.needsWork()) {\n\t\t\tconst snapshot = this.latest;\n\t\t\ttry {\n\t\t\t\tthis.index ??= await HistoryIndex.open(this.path);\n\t\t\t\tconst frontier = await this.index.syncSource(this.sessionId, snapshot);\n\t\t\t\tthis.indexedThrough = frontier.indexedThrough;\n\t\t\t} catch (error) {\n\t\t\t\tthis.failure = error;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Callers must apply their captured sequence/branch scope to the following query. */\n\tasync synchronize(snapshot: SessionJournalState): Promise<HistoryIndex> {\n\t\tif (this.closing) throw new Error(\"Session history index is closing\");\n\t\tthis.publish(snapshot);\n\t\twhile (this.indexedThrough < snapshot.nextSequence - 1) {\n\t\t\tconst job = this.pumping;\n\t\t\tif (!job) throw this.failure ?? new Error(\"Session history index has incomplete coverage\");\n\t\t\tawait job;\n\t\t}\n\t\tif (!this.index) throw new Error(\"Session history index is unavailable\");\n\t\treturn this.index;\n\t}\n\n\t/** Internal current-owner bootstrap; never substitutes current facts for an older captured prefix. */\n\tasync currentSourceBootstrap(snapshot: SessionJournalState): Promise<SourceBootstrapState> {\n\t\tconst captured = { ...snapshot };\n\t\tconst index = await this.synchronize(captured);\n\t\treturn index.currentSourceBootstrap(this.sessionId, captured);\n\t}\n\n\t/** Finish accepted indexing, then wait for the external worker to close. */\n\tclose(): Promise<void> {\n\t\tthis.closing ??= (async () => {\n\t\t\twhile (this.pumping) await this.pumping;\n\t\t\tawait this.index?.close();\n\t\t})();\n\t\treturn this.closing;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"session-history-index.d.ts","sourceRoot":"","sources":["../../src/core/session-history-index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype CanonicalPayloadCursor,\n\ttype CanonicalPayloadFragment,\n\tMAX_CANONICAL_PAYLOAD_PART_BYTES,\n} from \"./canonical-payload-parts.js\";\nimport {\n\ttype BranchBootstrapState,\n\ttype ContextManifestOptions,\n\ttype ContextManifestPage,\n\ttype ContextUpdates,\n\ttype ContextUpdateTarget,\n\tHistoryIndex,\n\ttype HistoryIndexPage,\n\ttype HistoryPayloadReadOptions,\n\ttype IndexedSourceEvent,\n\ttype IpythonSentMessagesOptions,\n\ttype IpythonSentMessagesPage,\n\ttype ParentPathOptions,\n\ttype ParentPathPage,\n\ttype SourceBootstrapState,\n\ttype TaskEvidenceOptions,\n\ttype TaskEvidencePage,\n} from \"./history-index.js\";\nimport type { BoundRequestSink, SourceSnapshotRef } from \"./request-events.js\";\nimport type { SessionJournalState } from \"./session-journal-owner.js\";\nimport type { SessionEntry } from \"./session-manager.js\";\nimport type { SessionUsageSummary } from \"./usage.js\";\n\n/** One source/branch frontier shared by every operation in a captured request. */\nexport interface SessionHistoryReadView {\n\treadonly source: SourceSnapshotRef;\n\t/** A narrower ancestor/prefix on this same capture; its lifetime never outlives the parent read. */\n\tatSnapshot?(source: SourceSnapshotRef): Promise<SessionHistoryReadView>;\n\tcontextManifest(options?: ContextManifestOptions): Promise<ContextManifestPage>;\n\tcontextUpdates(target: ContextUpdateTarget): Promise<ContextUpdates>;\n\treadContextUpdatePayload(\n\t\tid: string,\n\t\ttarget: ContextUpdateTarget,\n\t\toptions?: HistoryPayloadReadOptions,\n\t): Promise<CanonicalPayloadFragment | undefined>;\n\tget(id: string): Promise<IndexedSourceEvent | undefined>;\n\tpage(after?: number, limit?: number, options?: { scan?: boolean }): Promise<HistoryIndexPage>;\n\tsearch(query: string, limit?: number): Promise<HistoryIndexPage>;\n\ttaskEvidence(options?: TaskEvidenceOptions): Promise<TaskEvidencePage>;\n\treadPayload(id: string, options?: HistoryPayloadReadOptions): Promise<CanonicalPayloadFragment | undefined>;\n}\n\nexport interface BoundHistoryReadSink<View> extends Omit<BoundRequestSink, \"readHistory\"> {\n\treadHistory<T>(read: (view: View) => Promise<T>): Promise<T>;\n}\n\nexport interface BoundSessionRequestSink extends BoundHistoryReadSink<SessionHistoryReadView> {}\n\nexport interface SessionHistoryReadLimits {\n\tmaxEntries: number;\n\t/** Canonical frame bytes, not a decoded heap or tokenizer estimate. */\n\tmaxSourceBytes: number;\n}\n\nexport interface HydratedSessionHistoryEntry {\n\tentry: SessionEntry;\n\t/** Includes the exact locator/revision and lowering-only retention outside the payload. */\n\tsource: IndexedSourceEvent;\n}\n\nexport interface MaterializedSessionHistory {\n\tsource: SourceSnapshotRef;\n\tscope: \"branch\" | \"source\";\n\tentries: HydratedSessionHistoryEntry[];\n\tsourceBytes: number;\n}\n\n/** Bootstrap refs and booleans from the same pinned branch used for exact hydration. */\nexport interface SessionBranchBootstrapState extends BranchBootstrapState {\n\treadonly source: SourceSnapshotRef;\n}\n\n/** Exact parent-chain metadata from one captured canonical source and leaf. */\nexport interface SessionParentPathPage extends ParentPathPage {\n\treadonly source: SourceSnapshotRef;\n}\n\n/** Consume iterators inside the owning read callback. Materialized results are detached. */\nexport interface SessionHistoryReadScope {\n\treadonly source: SourceSnapshotRef;\n\treadonly scope: \"branch\" | \"source\";\n\treadonly branchContext: SessionHistoryReadView;\n\t/** Select the captured branch even when invoked from an explicit whole-source scope. */\n\tbranchBootstrap(): Promise<SessionBranchBootstrapState>;\n\t/** Chronological parent chain only; attached request evidence is not an ancestor. */\n\tparentPath(options?: ParentPathOptions): Promise<SessionParentPathPage>;\n\t/** Source scope only: use another leaf without changing the captured source or branchContext. */\n\tparentPathFrom(leafId: string | null, options?: ParentPathOptions): Promise<SessionParentPathPage>;\n\t/** Explicit whole-source relations, clipped to this captured prefix. */\n\tsourceLabel(targetId: string): Promise<IndexedSourceEvent | undefined>;\n\tsourceAssistantUsage(targetId: string): Promise<IndexedSourceEvent | undefined>;\n\t/** All source update revisions for a target, including off-branch records, in bounded pages. */\n\tsourceContextUpdates(target: ContextUpdateTarget, after?: number): Promise<HistoryIndexPage>;\n\t/** Exact sent-message refs on the original captured parent branch, even before a tool result. */\n\tipythonSentMessages(toolCallId: string, options?: IpythonSentMessagesOptions): Promise<IpythonSentMessagesPage>;\n\tget(id: string): Promise<IndexedSourceEvent | undefined>;\n\tpage(after?: number, limit?: number): Promise<HistoryIndexPage>;\n\tsearch(query: string, limit?: number): Promise<HistoryIndexPage>;\n\treadPayload(id: string, options?: HistoryPayloadReadOptions): Promise<CanonicalPayloadFragment | undefined>;\n\thydrateEntry(id: string, maxSourceBytes: number): Promise<HydratedSessionHistoryEntry | undefined>;\n\titerateEntries(limits: SessionHistoryReadLimits): AsyncGenerator<HydratedSessionHistoryEntry>;\n\tmaterialize(limits: SessionHistoryReadLimits): Promise<MaterializedSessionHistory>;\n}\n\nexport type HistoryReadQuery = <T>(operation: () => Promise<T>) => Promise<T>;\n\n/** Existing inference/request views remain strictly branch-scoped. */\nexport function createBranchHistoryReadView(\n\tindex: HistoryIndex,\n\tsource: SourceSnapshotRef,\n\tquery: HistoryReadQuery,\n): SessionHistoryReadView {\n\tconst sessionId = source.sessionId;\n\tconst scope = { leafId: source.leafId, through: source.sourceSequence };\n\treturn Object.freeze({\n\t\tsource,\n\t\tatSnapshot: async (requested: SourceSnapshotRef) => {\n\t\t\tconst captured = Object.freeze({ ...requested });\n\t\t\tif (\n\t\t\t\tcaptured.sessionId !== sessionId ||\n\t\t\t\tcaptured.sessionFile !== source.sessionFile ||\n\t\t\t\tcaptured.persistent !== source.persistent ||\n\t\t\t\t!Number.isSafeInteger(captured.sourceSequence) ||\n\t\t\t\tcaptured.sourceSequence < 0 ||\n\t\t\t\tcaptured.sourceSequence > source.sourceSequence\n\t\t\t)\n\t\t\t\tthrow new Error(\"Context epoch snapshot is outside its captured source\");\n\t\t\tif (captured.leafId !== null) {\n\t\t\t\tconst leaf = await query(() => index.get(sessionId, captured.leafId!, scope));\n\t\t\t\tif (!leaf || leaf.sequence > captured.sourceSequence)\n\t\t\t\t\tthrow new Error(\"Context epoch snapshot is outside its captured branch\");\n\t\t\t}\n\t\t\treturn createBranchHistoryReadView(index, captured, query);\n\t\t},\n\t\tcontextManifest: (options: ContextManifestOptions = {}) =>\n\t\t\tquery(() => index.contextManifest(sessionId, scope, options)),\n\t\tcontextUpdates: (target: ContextUpdateTarget) => query(() => index.contextUpdates(sessionId, scope, target)),\n\t\treadContextUpdatePayload: (id: string, target: ContextUpdateTarget, options: HistoryPayloadReadOptions = {}) =>\n\t\t\tquery(() => index.readContextUpdatePayload(sessionId, id, scope, target, options)),\n\t\tget: (id: string) => query(() => index.get(sessionId, id, scope)),\n\t\tpage: (after = 0, limit = 64, options: { scan?: boolean } = {}) =>\n\t\t\tquery(() => index.page(sessionId, after, scope.through, limit, scope, options)),\n\t\tsearch: (text: string, limit = 16) => query(() => index.search(sessionId, text, scope.through, limit, scope)),\n\t\ttaskEvidence: (options: TaskEvidenceOptions = {}) => query(() => index.taskEvidence(sessionId, scope, options)),\n\t\treadPayload: (id: string, options: HistoryPayloadReadOptions = {}) =>\n\t\t\tquery(() => index.readPayload(sessionId, id, scope, options)),\n\t});\n}\n\nfunction positiveLimit(value: number): boolean {\n\treturn Number.isSafeInteger(value) && value > 0;\n}\n\n/** Reuse the same bounded payload/identity hydration for a captured branch adapter. */\nexport async function hydrateCapturedHistoryEntry(\n\tmetadata: IndexedSourceEvent,\n\tmaxSourceBytes: number,\n\treadPayload: SessionHistoryReadView[\"readPayload\"],\n): Promise<HydratedSessionHistoryEntry> {\n\tif (metadata.locator.length > maxSourceBytes) throw new Error(\"History entry source byte budget exceeded\");\n\tconst chunks: string[] = [];\n\tlet bytes = 0;\n\tlet cursor: CanonicalPayloadCursor | undefined;\n\tdo {\n\t\tconst fragment = await readPayload(metadata.id, {\n\t\t\tcursor,\n\t\t\tmaxBytes: Math.min(MAX_CANONICAL_PAYLOAD_PART_BYTES, maxSourceBytes - bytes),\n\t\t});\n\t\tif (!fragment) throw new Error(\"Captured history entry payload is unavailable\");\n\t\tbytes += fragment.byteLength;\n\t\tif (bytes > maxSourceBytes) throw new Error(\"History entry source byte budget exceeded\");\n\t\tchunks.push(fragment.text);\n\t\tcursor = fragment.nextCursor ?? undefined;\n\t} while (cursor);\n\tconst entry = JSON.parse(chunks.join(\"\")) as SessionEntry;\n\tif (\n\t\t!entry ||\n\t\ttypeof entry !== \"object\" ||\n\t\tentry.id !== metadata.id ||\n\t\tentry.type !== metadata.kind ||\n\t\tentry.parentId !== metadata.parentId\n\t)\n\t\tthrow new Error(\"Canonical history entry does not match indexed identity\");\n\treturn { entry, source: metadata };\n}\n\n/** Source access is selected explicitly, never by widening a coordinator's branch view. */\nexport function createSessionHistoryReadScope(\n\tindex: HistoryIndex,\n\tsource: SourceSnapshotRef,\n\tquery: HistoryReadQuery,\n\tscope: \"branch\" | \"source\",\n): SessionHistoryReadScope {\n\tconst sessionId = source.sessionId;\n\tconst branch = { leafId: source.leafId, through: source.sourceSequence };\n\tconst get = (id: string) =>\n\t\tquery(() =>\n\t\t\tscope === \"branch\" ? index.get(sessionId, id, branch) : index.getSource(sessionId, id, source.sourceSequence),\n\t\t);\n\tconst page = (after = 0, limit = 64) =>\n\t\tquery(() => index.page(sessionId, after, source.sourceSequence, limit, scope === \"branch\" ? branch : undefined));\n\tconst readPayload = (id: string, options: HistoryPayloadReadOptions = {}) =>\n\t\tquery(() =>\n\t\t\tscope === \"branch\"\n\t\t\t\t? index.readPayload(sessionId, id, branch, options)\n\t\t\t\t: index.readSourcePayload(sessionId, id, source.sourceSequence, options),\n\t\t);\n\n\tconst hydrate = (metadata: IndexedSourceEvent, maxSourceBytes: number) =>\n\t\thydrateCapturedHistoryEntry(metadata, maxSourceBytes, readPayload);\n\n\tasync function* iterateEntries(limits: SessionHistoryReadLimits): AsyncGenerator<HydratedSessionHistoryEntry> {\n\t\tconst { maxEntries, maxSourceBytes } = limits;\n\t\tif (!positiveLimit(maxEntries) || !positiveLimit(maxSourceBytes))\n\t\t\tthrow new Error(\"Invalid history materialization limits\");\n\t\tlet after = 0;\n\t\tlet entries = 0;\n\t\tlet sourceBytes = 0;\n\t\twhile (true) {\n\t\t\tconst selected = await page(after, Math.min(64, maxEntries - entries + 1));\n\t\t\tif (selected.indexedThrough < source.sourceSequence)\n\t\t\t\tthrow new Error(\"Captured history has incomplete index coverage\");\n\t\t\tfor (const metadata of selected.events) {\n\t\t\t\tif (++entries > maxEntries) throw new Error(\"History entry budget exceeded\");\n\t\t\t\tif (sourceBytes + metadata.locator.length > maxSourceBytes)\n\t\t\t\t\tthrow new Error(\"History source byte budget exceeded\");\n\t\t\t\tconst hydrated = await hydrate(metadata, maxSourceBytes - sourceBytes);\n\t\t\t\tsourceBytes += metadata.locator.length;\n\t\t\t\tyield hydrated;\n\t\t\t}\n\t\t\tif (selected.nextAfter === null) return;\n\t\t\tafter = selected.nextAfter;\n\t\t}\n\t}\n\n\treturn Object.freeze({\n\t\tsource,\n\t\tscope,\n\t\tbranchContext: createBranchHistoryReadView(index, source, query),\n\t\tbranchBootstrap: () => query(async () => ({ ...(await index.branchBootstrap(sessionId, branch)), source })),\n\t\tparentPath: (options: ParentPathOptions = {}) =>\n\t\t\tquery(async () => ({ ...(await index.parentPath(sessionId, branch, options)), source })),\n\t\tparentPathFrom: (leafId: string | null, options: ParentPathOptions = {}) =>\n\t\t\tquery(async () => {\n\t\t\t\tif (scope !== \"source\") throw new Error(\"Parent path selection requires a source-scoped history read\");\n\t\t\t\treturn {\n\t\t\t\t\t...(await index.parentPath(sessionId, { leafId, through: source.sourceSequence }, options)),\n\t\t\t\t\tsource,\n\t\t\t\t};\n\t\t\t}),\n\t\tsourceLabel: (targetId: string) => query(() => index.sourceLabel(sessionId, targetId, source.sourceSequence)),\n\t\tsourceAssistantUsage: (targetId: string) =>\n\t\t\tquery(() => index.sourceAssistantUsage(sessionId, targetId, source.sourceSequence)),\n\t\tsourceContextUpdates: (target: ContextUpdateTarget, after = 0) =>\n\t\t\tquery(() => index.sourceContextUpdates(sessionId, target, source.sourceSequence, after)),\n\t\tipythonSentMessages: (toolCallId: string, options: IpythonSentMessagesOptions = {}) =>\n\t\t\tquery(() => index.ipythonSentMessages(sessionId, branch, toolCallId, options)),\n\t\tget,\n\t\tpage,\n\t\tsearch: (text: string, limit = 16) =>\n\t\t\tquery(() =>\n\t\t\t\tindex.search(sessionId, text, source.sourceSequence, limit, scope === \"branch\" ? branch : undefined),\n\t\t\t),\n\t\treadPayload,\n\t\thydrateEntry: async (id: string, maxSourceBytes: number) => {\n\t\t\tif (!positiveLimit(maxSourceBytes)) throw new Error(\"Invalid history entry source byte budget\");\n\t\t\tconst metadata = await get(id);\n\t\t\treturn metadata ? hydrate(metadata, maxSourceBytes) : undefined;\n\t\t},\n\t\titerateEntries: (limits: SessionHistoryReadLimits) => iterateEntries({ ...limits }),\n\t\tmaterialize: async (limits: SessionHistoryReadLimits) => {\n\t\t\tconst entries: HydratedSessionHistoryEntry[] = [];\n\t\t\tlet sourceBytes = 0;\n\t\t\tfor await (const entry of iterateEntries(limits)) {\n\t\t\t\tentries.push(entry);\n\t\t\t\tsourceBytes += entry.source.locator.length;\n\t\t\t}\n\t\t\treturn { source, scope, entries, sourceBytes };\n\t\t},\n\t});\n}\n\n/** A derived, coalescing feed. Canonical source ACKs do not depend on index availability. */\nexport class SessionHistoryIndex {\n\tprivate index?: HistoryIndex;\n\tprivate latest?: SessionJournalState;\n\tprivate indexedThrough = -1;\n\tprivate pumping?: Promise<void>;\n\tprivate failure?: unknown;\n\tprivate closing?: Promise<void>;\n\n\tconstructor(\n\t\tprivate readonly sessionId: string,\n\t\tprivate readonly path: string,\n\t) {}\n\n\t/** Retain at most one newer snapshot while the external worker indexes a prefix. */\n\tpublish(snapshot: SessionJournalState): void {\n\t\tif (this.closing) return;\n\t\tif (!this.latest || snapshot.nextSequence > this.latest.nextSequence) this.latest = { ...snapshot };\n\t\tthis.start();\n\t}\n\n\tprivate needsWork(): boolean {\n\t\treturn this.latest !== undefined && this.indexedThrough < this.latest.nextSequence - 1;\n\t}\n\n\tprivate start(): void {\n\t\tif (this.pumping || !this.needsWork()) return;\n\t\tthis.failure = undefined;\n\t\tconst job = this.pump();\n\t\tthis.pumping = job;\n\t\tvoid job.then(() => {\n\t\t\tthis.pumping = undefined;\n\t\t\tif (!this.failure && this.needsWork()) this.start();\n\t\t});\n\t}\n\n\tprivate async pump(): Promise<void> {\n\t\twhile (this.latest && this.needsWork()) {\n\t\t\tconst snapshot = this.latest;\n\t\t\ttry {\n\t\t\t\tthis.index ??= await HistoryIndex.open(this.path);\n\t\t\t\tconst frontier = await this.index.syncSource(this.sessionId, snapshot);\n\t\t\t\tthis.indexedThrough = frontier.indexedThrough;\n\t\t\t} catch (error) {\n\t\t\t\tthis.failure = error;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Callers must apply their captured sequence/branch scope to the following query. */\n\tasync synchronize(snapshot: SessionJournalState): Promise<HistoryIndex> {\n\t\tif (this.closing) throw new Error(\"Session history index is closing\");\n\t\tthis.publish(snapshot);\n\t\twhile (this.indexedThrough < snapshot.nextSequence - 1) {\n\t\t\tconst job = this.pumping;\n\t\t\tif (!job) throw this.failure ?? new Error(\"Session history index has incomplete coverage\");\n\t\t\tawait job;\n\t\t}\n\t\tif (!this.index) throw new Error(\"Session history index is unavailable\");\n\t\treturn this.index;\n\t}\n\n\t/** Internal current-owner bootstrap; never substitutes current facts for an older captured prefix. */\n\tasync currentSourceBootstrap(snapshot: SessionJournalState): Promise<SourceBootstrapState> {\n\t\tconst captured = { ...snapshot };\n\t\tconst index = await this.synchronize(captured);\n\t\treturn index.currentSourceBootstrap(this.sessionId, captured);\n\t}\n\n\t/** Caller holds the owner queue until the exact current projection is read. */\n\tasync currentSourceUsage(snapshot: SessionJournalState): Promise<SessionUsageSummary | undefined> {\n\t\tconst captured = { ...snapshot };\n\t\tconst index = await this.synchronize(captured);\n\t\treturn index.currentSourceUsage(this.sessionId, captured);\n\t}\n\n\t/** Finish accepted indexing, then wait for the external worker to close. */\n\tclose(): Promise<void> {\n\t\tthis.closing ??= (async () => {\n\t\t\twhile (this.pumping) await this.pumping;\n\t\t\tawait this.index?.close();\n\t\t})();\n\t\treturn this.closing;\n\t}\n}\n"]}
|
|
@@ -115,6 +115,7 @@ export function createSessionHistoryReadScope(index, source, query, scope) {
|
|
|
115
115
|
}),
|
|
116
116
|
sourceLabel: (targetId) => query(() => index.sourceLabel(sessionId, targetId, source.sourceSequence)),
|
|
117
117
|
sourceAssistantUsage: (targetId) => query(() => index.sourceAssistantUsage(sessionId, targetId, source.sourceSequence)),
|
|
118
|
+
sourceContextUpdates: (target, after = 0) => query(() => index.sourceContextUpdates(sessionId, target, source.sourceSequence, after)),
|
|
118
119
|
ipythonSentMessages: (toolCallId, options = {}) => query(() => index.ipythonSentMessages(sessionId, branch, toolCallId, options)),
|
|
119
120
|
get,
|
|
120
121
|
page,
|
|
@@ -210,6 +211,12 @@ export class SessionHistoryIndex {
|
|
|
210
211
|
const index = await this.synchronize(captured);
|
|
211
212
|
return index.currentSourceBootstrap(this.sessionId, captured);
|
|
212
213
|
}
|
|
214
|
+
/** Caller holds the owner queue until the exact current projection is read. */
|
|
215
|
+
async currentSourceUsage(snapshot) {
|
|
216
|
+
const captured = { ...snapshot };
|
|
217
|
+
const index = await this.synchronize(captured);
|
|
218
|
+
return index.currentSourceUsage(this.sessionId, captured);
|
|
219
|
+
}
|
|
213
220
|
/** Finish accepted indexing, then wait for the external worker to close. */
|
|
214
221
|
close() {
|
|
215
222
|
this.closing ??= (async () => {
|