@cortexkit/opencode-magic-context 0.49.30 → 0.49.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{context-vnfr6d7t.js → context-9a0f8mzh.js} +142 -13
- package/dist/features/magic-context/dreamer/map-memories-prompt.d.ts +3 -3
- package/dist/features/magic-context/dreamer/map-memories-prompt.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/task-executor.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/verify.d.ts +13 -17
- package/dist/features/magic-context/dreamer/verify.d.ts.map +1 -1
- package/dist/features/magic-context/storage-native-replay.d.ts +2 -0
- package/dist/features/magic-context/storage-native-replay.d.ts.map +1 -1
- package/dist/hooks/magic-context/apply-operations.d.ts +11 -1
- package/dist/hooks/magic-context/apply-operations.d.ts.map +1 -1
- package/dist/hooks/magic-context/tag-messages.d.ts +2 -0
- package/dist/hooks/magic-context/tag-messages.d.ts.map +1 -1
- package/dist/hooks/magic-context/transform-postprocess-phase.d.ts +2 -0
- package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
- package/dist/hooks/magic-context/transform.d.ts +11 -0
- package/dist/hooks/magic-context/transform.d.ts.map +1 -1
- package/dist/{index-69gd2scx.js → index-0bjktrjt.js} +2 -2
- package/dist/{index-ekzzw66a.js → index-22e7khnr.js} +23 -18
- package/dist/{index-k0dpkyn7.js → index-kmayq4kq.js} +1 -0
- package/dist/{index-vzz570j8.js → index-qathsvz2.js} +3 -1
- package/dist/{index-adr4vfys.js → index-y6ynjghv.js} +1 -1
- package/dist/index.js +8 -8
- package/dist/{recomp-orchestrator-w3pjp33d.js → recomp-orchestrator-ynehxbya.js} +2 -2
- package/dist/shared/tag-transcript.d.ts +4 -1
- package/dist/shared/tag-transcript.d.ts.map +1 -1
- package/dist/shared/transcript.d.ts +3 -1
- package/dist/shared/transcript.d.ts.map +1 -1
- package/dist/{transform-postprocess-phase-6ccazq85.js → transform-postprocess-phase-50h70ft8.js} +2 -2
- package/dist/v2/{context-wx4sfhgr.js → context-cdqw9jex.js} +161 -25
- package/dist/v2/fold/owner.d.ts +4 -0
- package/dist/v2/fold/owner.d.ts.map +1 -1
- package/dist/v2/hooks/context.d.ts.map +1 -1
- package/dist/v2/hooks/types.d.ts +3 -0
- package/dist/v2/hooks/types.d.ts.map +1 -1
- package/dist/v2/{recomp-orchestrator-wb28kr9k.js → recomp-orchestrator-kdxr4tx8.js} +1 -1
- package/dist/v2/{server-k33t88h3.js → server-rdjgz95f.js} +1 -0
- package/dist/v2/server.js +2 -2
- package/dist/v2/{wrapup-orchestrator-2t0pdqzm.js → wrapup-orchestrator-prfvyqbb.js} +1 -1
- package/dist/{wrapup-orchestrator-kjmkms5g.js → wrapup-orchestrator-4zhkcsz0.js} +3 -3
- package/package.json +1 -1
- package/src/shared/tag-transcript.ts +34 -5
- package/src/shared/transcript.ts +1 -1
|
@@ -304,7 +304,7 @@ import {
|
|
|
304
304
|
startCompartmentAgent,
|
|
305
305
|
setRecompStarting2,
|
|
306
306
|
setRecompTerminal2
|
|
307
|
-
} from "./server-
|
|
307
|
+
} from "./server-rdjgz95f.js";
|
|
308
308
|
import {
|
|
309
309
|
resolveHistorianModel2
|
|
310
310
|
} from "./server-5kym00ag.js";
|
|
@@ -7640,6 +7640,7 @@ function prepareLegacyToolSkeletonConversions(db, sessionId, targets, options =
|
|
|
7640
7640
|
});
|
|
7641
7641
|
};
|
|
7642
7642
|
const rows = readRows(db);
|
|
7643
|
+
options.prepareRemovals?.(rows);
|
|
7643
7644
|
const converted = new Map;
|
|
7644
7645
|
for (const row of rows) {
|
|
7645
7646
|
const target = targets.get(row.tagNumber);
|
|
@@ -11990,6 +11991,7 @@ async function runPostTransformPhase(args) {
|
|
|
11990
11991
|
emergencyReclaimedTokens,
|
|
11991
11992
|
droppedCount,
|
|
11992
11993
|
emergency,
|
|
11994
|
+
prefixMutationPermitted: isCacheBustingPass,
|
|
11993
11995
|
bustedThisPass,
|
|
11994
11996
|
prefixTrimStatus: deliveredPrefix?.prefixTrimStatus ?? null,
|
|
11995
11997
|
thinkingBindingRecovery,
|
|
@@ -19656,6 +19658,15 @@ function createTransform(deps) {
|
|
|
19656
19658
|
db,
|
|
19657
19659
|
sessionID: sessionId
|
|
19658
19660
|
}) : undefined;
|
|
19661
|
+
const hostEstimate = deps.hostInputEstimate?.(sessionId);
|
|
19662
|
+
const hostOverWindow = fullFeatureMode && !compactionOff && resolvedContextLimit !== undefined && resolvedContextLimit > 0 && hostEstimate !== undefined && Number.isFinite(hostEstimate.tokens) && Number.isFinite(hostEstimate.pressureTokens) && hostEstimate.tokens > resolvedContextLimit;
|
|
19663
|
+
if (hostOverWindow) {
|
|
19664
|
+
contextUsageEarly = {
|
|
19665
|
+
inputTokens: Math.max(contextUsageEarly.inputTokens, hostEstimate.pressureTokens),
|
|
19666
|
+
percentage: Math.max(100, contextUsageEarly.percentage, hostEstimate.pressureTokens / resolvedContextLimit * 100)
|
|
19667
|
+
};
|
|
19668
|
+
usagePercentageSynthetic = true;
|
|
19669
|
+
}
|
|
19659
19670
|
let unmanagedOverWindowPass = null;
|
|
19660
19671
|
const unmanagedOverWindowCarried = unmanagedOverWindowSessions.has(sessionId);
|
|
19661
19672
|
if (fullFeatureMode && !compactionOff && typeof resolvedContextLimit === "number" && resolvedContextLimit > 0 && (unmanagedOverWindowCarried || isFirstTransformPassForSession && getLastCompartmentEndMessage(db, sessionId) < 0 && getMaxDroppedTagNumber2(db, sessionId) === 0)) {
|
|
@@ -20198,7 +20209,7 @@ Historian previously failed ${historianFailureState.failureCount} time(s), so Ma
|
|
|
20198
20209
|
bustReason: calibrationBustReason,
|
|
20199
20210
|
onAdopt: (message) => sessionLog2(sessionId, message)
|
|
20200
20211
|
});
|
|
20201
|
-
let contextUsageFromEstimate =
|
|
20212
|
+
let contextUsageFromEstimate = hostOverWindow;
|
|
20202
20213
|
if (contextUsage.inputTokens <= 0 && protectionCacheBustingPass) {
|
|
20203
20214
|
const overflowRecoveryPass = usagePercentageSynthetic || emergencyRecoveryArmed;
|
|
20204
20215
|
const savedProviderReading = overflowRecoveryPass ? null : savedProviderReadingForPass({
|
|
@@ -20752,6 +20763,7 @@ Historian previously failed ${historianFailureState.failureCount} time(s), so Ma
|
|
|
20752
20763
|
sessionId,
|
|
20753
20764
|
systemPromptHash: sessionMeta.systemPromptHash
|
|
20754
20765
|
});
|
|
20766
|
+
deps.onPassPermission?.(sessionId, postTransformResult.prefixMutationPermitted);
|
|
20755
20767
|
};
|
|
20756
20768
|
const timedTransform = (input, output) => withTransformTimingSummary(() => transform(input, output));
|
|
20757
20769
|
return Object.assign(timedTransform, {
|
|
@@ -24010,7 +24022,7 @@ function registerRpcHandlers(rpcServer, args) {
|
|
|
24010
24022
|
const db = readDatabase();
|
|
24011
24023
|
if (!db)
|
|
24012
24024
|
return { ok: false, error: "db unavailable" };
|
|
24013
|
-
const { runManagedRecomp } = await importPluginModule(() => import("./recomp-orchestrator-
|
|
24025
|
+
const { runManagedRecomp } = await importPluginModule(() => import("./recomp-orchestrator-kdxr4tx8.js"));
|
|
24014
24026
|
const { sendIgnoredMessage } = await importPluginModule(() => import("./send-session-notification-x5nzy34v.js"));
|
|
24015
24027
|
log2(`[rpc] recomp requested for session ${sessionId}`);
|
|
24016
24028
|
if (!args.client && !args.hiddenCompletionExecutor) {
|
|
@@ -24095,7 +24107,7 @@ function registerRpcHandlers(rpcServer, args) {
|
|
|
24095
24107
|
const db = readDatabase();
|
|
24096
24108
|
if (!db)
|
|
24097
24109
|
return { ok: false, error: "db unavailable" };
|
|
24098
|
-
const { runManagedWrapup } = await importPluginModule(() => import("./wrapup-orchestrator-
|
|
24110
|
+
const { runManagedWrapup } = await importPluginModule(() => import("./wrapup-orchestrator-prfvyqbb.js"));
|
|
24099
24111
|
const model = liveSessionState.liveModelBySession.get(sessionId);
|
|
24100
24112
|
const contextLimit = model ? resolveContextLimit(model.providerID, model.modelID, { db, sessionID: sessionId }) : 128000;
|
|
24101
24113
|
const ctx = {
|
|
@@ -25208,8 +25220,14 @@ class FoldOwner {
|
|
|
25208
25220
|
async observe(args) {
|
|
25209
25221
|
return this.serial(args.sessionID, async () => {
|
|
25210
25222
|
let state = await this.read(args.sessionID);
|
|
25223
|
+
if (state?.rendered && state.rendered.id !== args.rendered.id)
|
|
25224
|
+
state = undefined;
|
|
25211
25225
|
let changed = !state;
|
|
25212
|
-
const
|
|
25226
|
+
const observedSha = foldDigest(JSON.stringify(args.rendered));
|
|
25227
|
+
const rendered = structuredClone(args.rendered);
|
|
25228
|
+
if (state?.withoutRecentContext && state.withoutRecentContext === rendered.id)
|
|
25229
|
+
stripCheckpointRecentContext(rendered, args.summary);
|
|
25230
|
+
const renderedSha = foldDigest(JSON.stringify(rendered));
|
|
25213
25231
|
if (!state) {
|
|
25214
25232
|
args.onHard("boot_recovery");
|
|
25215
25233
|
state = {
|
|
@@ -25220,10 +25238,10 @@ class FoldOwner {
|
|
|
25220
25238
|
};
|
|
25221
25239
|
}
|
|
25222
25240
|
const reason = args.cutSeq < state.watermark ? "host_cut_before_watermark" : state.submittedSha !== foldDigest(args.summary) || state.renderedSha && state.renderedSha !== renderedSha ? "host_rerender" : undefined;
|
|
25223
|
-
if (reason && state.rejectedSha !==
|
|
25241
|
+
if (reason && state.rejectedSha !== observedSha) {
|
|
25224
25242
|
args.onHard(reason);
|
|
25225
25243
|
state.reason = reason;
|
|
25226
|
-
state.rejectedSha =
|
|
25244
|
+
state.rejectedSha = observedSha;
|
|
25227
25245
|
changed = true;
|
|
25228
25246
|
}
|
|
25229
25247
|
if (state.cutSeq === undefined && args.cutSeq >= state.watermark) {
|
|
@@ -25231,7 +25249,7 @@ class FoldOwner {
|
|
|
25231
25249
|
changed = true;
|
|
25232
25250
|
}
|
|
25233
25251
|
if (!state.rendered && reason !== "host_cut_before_watermark") {
|
|
25234
|
-
state.rendered =
|
|
25252
|
+
state.rendered = rendered;
|
|
25235
25253
|
state.renderedSha = renderedSha;
|
|
25236
25254
|
state.renderedSummary = args.summary;
|
|
25237
25255
|
changed = true;
|
|
@@ -25241,6 +25259,50 @@ class FoldOwner {
|
|
|
25241
25259
|
return state;
|
|
25242
25260
|
});
|
|
25243
25261
|
}
|
|
25262
|
+
async stripRecentContext(sessionID, checkpointID) {
|
|
25263
|
+
return this.serial(sessionID, async () => {
|
|
25264
|
+
const state = await this.read(sessionID);
|
|
25265
|
+
if (!state?.rendered || state.rendered.id !== checkpointID)
|
|
25266
|
+
return;
|
|
25267
|
+
if (state.withoutRecentContext === checkpointID)
|
|
25268
|
+
return state;
|
|
25269
|
+
if (!stripCheckpointRecentContext(state.rendered, state.renderedSummary ?? state.submitted))
|
|
25270
|
+
return state;
|
|
25271
|
+
state.withoutRecentContext = checkpointID;
|
|
25272
|
+
state.renderedSha = foldDigest(JSON.stringify(state.rendered));
|
|
25273
|
+
await this.storage.set(this.key(sessionID), state);
|
|
25274
|
+
return state;
|
|
25275
|
+
});
|
|
25276
|
+
}
|
|
25277
|
+
}
|
|
25278
|
+
function stripCheckpointRecentContext(message, summary) {
|
|
25279
|
+
let changed = false;
|
|
25280
|
+
for (const part of message.content) {
|
|
25281
|
+
if (part.type !== "text" || typeof part.text !== "string")
|
|
25282
|
+
continue;
|
|
25283
|
+
const summaryStart = part.text.indexOf("<summary>");
|
|
25284
|
+
if (summaryStart < 0)
|
|
25285
|
+
continue;
|
|
25286
|
+
const summaryText = part.text.indexOf(summary, summaryStart + "<summary>".length);
|
|
25287
|
+
if (summaryText < 0)
|
|
25288
|
+
continue;
|
|
25289
|
+
const start = part.text.indexOf("</summary>", summaryText + summary.length) + "</summary>".length;
|
|
25290
|
+
const end = part.text.lastIndexOf("</conversation-checkpoint>");
|
|
25291
|
+
if (start < "</summary>".length || end < start)
|
|
25292
|
+
continue;
|
|
25293
|
+
const suffix = part.text.slice(start, end);
|
|
25294
|
+
if (!/^\s*<recent-context>[\s\S]*<\/recent-context>\s*$/.test(suffix))
|
|
25295
|
+
continue;
|
|
25296
|
+
part.text = `${part.text.slice(0, start)}
|
|
25297
|
+
${part.text.slice(end)}`;
|
|
25298
|
+
changed = true;
|
|
25299
|
+
}
|
|
25300
|
+
if (changed && message.metadata && typeof message.metadata === "object") {
|
|
25301
|
+
const metadata = { ...message.metadata };
|
|
25302
|
+
delete metadata.recent;
|
|
25303
|
+
message.metadata = metadata;
|
|
25304
|
+
}
|
|
25305
|
+
return changed;
|
|
25244
25306
|
}
|
|
25245
25307
|
|
|
25246
25308
|
// src/v2/fold/memory-cache.ts
|
|
@@ -32200,7 +32262,6 @@ function parseMapMemoriesManifest(text) {
|
|
|
32200
32262
|
}
|
|
32201
32263
|
function validateMapMemoriesManifest(text, expectedIds) {
|
|
32202
32264
|
const parsed = parseMapMemoriesManifest(text);
|
|
32203
|
-
assertParsedManifestNonEmpty(parsed.length, expectedIds.size, text, "mappings", "memory");
|
|
32204
32265
|
assertNoDuplicateManifestIds(parsed.filter((entry) => expectedIds.has(entry.id)).map((entry) => entry.id), "mappings");
|
|
32205
32266
|
return parsed;
|
|
32206
32267
|
}
|
|
@@ -34414,8 +34475,7 @@ function parsePartialVerifyManifest(text, expectedIds) {
|
|
|
34414
34475
|
var VERIFY_BATCH_SIZE = 5;
|
|
34415
34476
|
var VERIFY_TOKENS_PER_MEMORY = 1e5;
|
|
34416
34477
|
var VERIFY_RUN_TOKEN_BUDGET = 2500000;
|
|
34417
|
-
var
|
|
34418
|
-
var VERIFY_IN_FLIGHT_GRACE_MS = 120000;
|
|
34478
|
+
var VERIFY_BATCH_DEFAULT_MS = 240000;
|
|
34419
34479
|
function verifyBatchTokenBudget(size, configured) {
|
|
34420
34480
|
return Math.min(configured ?? Number.MAX_SAFE_INTEGER, size * VERIFY_TOKENS_PER_MEMORY);
|
|
34421
34481
|
}
|
|
@@ -34445,8 +34505,8 @@ function validateVerifyCompletion(messages, text, expectedIds, responseText = te
|
|
|
34445
34505
|
}
|
|
34446
34506
|
var IDENTICAL_PROVIDER_FAILURE_BATCH_LIMIT = 2;
|
|
34447
34507
|
var VERIFY_BATCH_FLOOR_MS = 30000;
|
|
34448
|
-
function computeVerifyBatchSliceMs(remainingMs,
|
|
34449
|
-
return Math.min(remainingMs,
|
|
34508
|
+
function computeVerifyBatchSliceMs(remainingMs, batchesRemaining) {
|
|
34509
|
+
return Math.min(remainingMs, Math.max(VERIFY_BATCH_DEFAULT_MS, remainingMs / Math.max(1, batchesRemaining)));
|
|
34450
34510
|
}
|
|
34451
34511
|
function closeBroadCycle(args, cycleStartAt) {
|
|
34452
34512
|
if (!args.forceBroad || cycleStartAt === undefined)
|
|
@@ -34470,7 +34530,6 @@ async function runVerify(args) {
|
|
|
34470
34530
|
}
|
|
34471
34531
|
async function runVerifyWithCooldown(args) {
|
|
34472
34532
|
const runStartedAt = Date.now();
|
|
34473
|
-
const sliceDeadline = runStartedAt + VERIFY_RUN_SLICE_MS;
|
|
34474
34533
|
const result = {
|
|
34475
34534
|
verified: 0,
|
|
34476
34535
|
updated: 0,
|
|
@@ -34518,12 +34577,10 @@ async function runVerifyWithCooldown(args) {
|
|
|
34518
34577
|
try {
|
|
34519
34578
|
for (let i = 0;i < batches.length; i += 1) {
|
|
34520
34579
|
const now = Date.now();
|
|
34521
|
-
const
|
|
34522
|
-
|
|
34523
|
-
const remainingMs = Math.max(0, hardStop - now);
|
|
34524
|
-
if (now >= startCutoff) {
|
|
34580
|
+
const remainingMs = Math.max(0, args.deadline - now);
|
|
34581
|
+
if (now >= args.deadline) {
|
|
34525
34582
|
result.stopReason = "deadline";
|
|
34526
|
-
log2(`[dreamer] ${args.forceBroad ? "verify-broad" : "verify"}: stopping before batch ${i + 1}/${batches.length} — the run deadline passed ${now -
|
|
34583
|
+
log2(`[dreamer] ${args.forceBroad ? "verify-broad" : "verify"}: stopping before batch ${i + 1}/${batches.length} — the run deadline passed ${now - args.deadline}ms ago`);
|
|
34527
34584
|
break;
|
|
34528
34585
|
}
|
|
34529
34586
|
if (remainingMs < VERIFY_BATCH_FLOOR_MS) {
|
|
@@ -35462,7 +35519,7 @@ function createDreamTaskExecutor(deps) {
|
|
|
35462
35519
|
return { status: "failed", transient: true, error };
|
|
35463
35520
|
}
|
|
35464
35521
|
const processed = result.mapped + result.independent;
|
|
35465
|
-
if (processed > 0) {
|
|
35522
|
+
if (processed > 0 || result.failure === undefined) {
|
|
35466
35523
|
const progress = `map-memories: committed ${processed} mapping(s) (mapped ${result.mapped}, independent ${result.independent}); ${result.remaining} remain`;
|
|
35467
35524
|
recordRun("completed", null, { progress });
|
|
35468
35525
|
return { status: "completed" };
|
|
@@ -53183,6 +53240,28 @@ ${baseline}
|
|
|
53183
53240
|
draft.messages.splice(0, draft.messages.length, checkpoint, ...draft.messages.filter((message) => message !== first));
|
|
53184
53241
|
return true;
|
|
53185
53242
|
}
|
|
53243
|
+
function estimateCheckpointRequest(draft) {
|
|
53244
|
+
let toolDefinitionTokens = 0;
|
|
53245
|
+
for (const tool of Object.values(draft.tools)) {
|
|
53246
|
+
const schema = JSON.stringify(tool.input);
|
|
53247
|
+
if (schema === undefined)
|
|
53248
|
+
throw new Error("Checkpoint request has an unserializable tool schema");
|
|
53249
|
+
toolDefinitionTokens += estimateTokens(tool.description) + estimateTokens(schema);
|
|
53250
|
+
}
|
|
53251
|
+
const estimateDraft = {
|
|
53252
|
+
...draft,
|
|
53253
|
+
messages: draft.messages.map((message) => HEAD_IDS.some((id) => message.id === id) ? { ...message, id: undefined } : message)
|
|
53254
|
+
};
|
|
53255
|
+
return estimateFinalWireInputTokens({
|
|
53256
|
+
messages: adaptPayload(estimateDraft).messages,
|
|
53257
|
+
toolDefinitionTokens,
|
|
53258
|
+
systemPromptTokens: estimateTokens(JSON.stringify(draft.system)),
|
|
53259
|
+
providerID: draft.model.providerID,
|
|
53260
|
+
modelID: draft.model.id,
|
|
53261
|
+
agentName: draft.agent,
|
|
53262
|
+
sessionId: draft.sessionID
|
|
53263
|
+
});
|
|
53264
|
+
}
|
|
53186
53265
|
var HIDDEN_SESSION_ERROR_GRACE_MS = 50;
|
|
53187
53266
|
var STORE_POOL_DISPOSE_WAIT_MS = 1000;
|
|
53188
53267
|
function isBlockingV2TransformError(error) {
|
|
@@ -54015,7 +54094,7 @@ async function registerContext(context) {
|
|
|
54015
54094
|
await context.session.hook("compaction", async (draft) => {
|
|
54016
54095
|
const hiddenSummary = hiddenChildHook.compactionSummary(draft.sessionID, draft.agent);
|
|
54017
54096
|
if (hiddenSummary !== undefined) {
|
|
54018
|
-
draft.result = { summary: hiddenSummary };
|
|
54097
|
+
draft.result = { summary: hiddenSummary, metadata: { keepID: undefined } };
|
|
54019
54098
|
return;
|
|
54020
54099
|
}
|
|
54021
54100
|
if (compactionOff)
|
|
@@ -54040,7 +54119,7 @@ async function registerContext(context) {
|
|
|
54040
54119
|
previousCut: reader.latestCompaction(draft.sessionID),
|
|
54041
54120
|
summary
|
|
54042
54121
|
})) {
|
|
54043
|
-
draft.result = { summary };
|
|
54122
|
+
draft.result = { summary, metadata: { keepID: undefined } };
|
|
54044
54123
|
return;
|
|
54045
54124
|
}
|
|
54046
54125
|
}
|
|
@@ -54056,7 +54135,7 @@ async function registerContext(context) {
|
|
|
54056
54135
|
materialize: () => moduleBaseline ?? materialize(draft)
|
|
54057
54136
|
});
|
|
54058
54137
|
sessionLog2(draft.sessionID, `v2 compaction hook: fired answered=true source=${source}`);
|
|
54059
|
-
draft.result = { summary: fold.submitted };
|
|
54138
|
+
draft.result = { summary: fold.submitted, metadata: { keepID: undefined } };
|
|
54060
54139
|
} catch (cause) {
|
|
54061
54140
|
await refuseBeforeProvider(context.session, draft.sessionID, "compaction-fold", cause);
|
|
54062
54141
|
throw new V2ContextRefusal("Magic Context could not preserve the host checkpoint.", {
|
|
@@ -54102,6 +54181,8 @@ async function registerContext(context) {
|
|
|
54102
54181
|
...args.messages.filter((message) => message !== args.incoming)
|
|
54103
54182
|
];
|
|
54104
54183
|
};
|
|
54184
|
+
const checkpointPassPermissions = new Map;
|
|
54185
|
+
const checkpointInputEstimates = new Map;
|
|
54105
54186
|
const initializeTransform = (database) => transform ??= createTransform({
|
|
54106
54187
|
...createV2TransformFeatureDeps(config, compactionOff, directory, embeddings.ensureRegistered),
|
|
54107
54188
|
cacheTtlConfig: config.cache_ttl,
|
|
@@ -54111,6 +54192,10 @@ async function registerContext(context) {
|
|
|
54111
54192
|
tagger,
|
|
54112
54193
|
...createV2ThresholdDeps(config),
|
|
54113
54194
|
contextUsageMap: usage,
|
|
54195
|
+
hostInputEstimate: (sessionID) => checkpointInputEstimates.get(sessionID),
|
|
54196
|
+
onPassPermission: (sessionID, permission) => {
|
|
54197
|
+
checkpointPassPermissions.set(sessionID, permission);
|
|
54198
|
+
},
|
|
54114
54199
|
compactionOff,
|
|
54115
54200
|
storeGeneration: "v2",
|
|
54116
54201
|
normalizeRestoredAssistantText: (text, providerID) => stripCopiedTagNotation(text, providerID === "anthropic"),
|
|
@@ -54532,6 +54617,21 @@ async function registerContext(context) {
|
|
|
54532
54617
|
}
|
|
54533
54618
|
const mapped = adaptPayload(draft, admitted, messageTimes, anchorTimesOnly);
|
|
54534
54619
|
bindSystemDateRequestIdentity(mapped, draft);
|
|
54620
|
+
checkpointPassPermissions.delete(draft.sessionID);
|
|
54621
|
+
checkpointInputEstimates.delete(draft.sessionID);
|
|
54622
|
+
if (checkpoint && submitted !== undefined) {
|
|
54623
|
+
const projected = structuredClone(checkpoint);
|
|
54624
|
+
if (stripCheckpointRecentContext(projected, submitted)) {
|
|
54625
|
+
const estimate = estimateCheckpointRequest({
|
|
54626
|
+
...draft,
|
|
54627
|
+
messages: [checkpoint, ...draft.messages]
|
|
54628
|
+
});
|
|
54629
|
+
checkpointInputEstimates.set(draft.sessionID, {
|
|
54630
|
+
tokens: estimate.tokens,
|
|
54631
|
+
pressureTokens: estimate.pressureTokens ?? estimate.tokens
|
|
54632
|
+
});
|
|
54633
|
+
}
|
|
54634
|
+
}
|
|
54535
54635
|
await createMessagesTransformHandler({
|
|
54536
54636
|
magicContext: { "experimental.chat.messages.transform": transform },
|
|
54537
54637
|
compactionOff,
|
|
@@ -54540,6 +54640,14 @@ async function registerContext(context) {
|
|
|
54540
54640
|
rustReplayParticipant: () => transform?.getRustReplayParticipant() ?? null
|
|
54541
54641
|
})({}, mapped);
|
|
54542
54642
|
mapped.commit();
|
|
54643
|
+
const checkpointPermission = checkpointPassPermissions.get(draft.sessionID);
|
|
54644
|
+
checkpointPassPermissions.delete(draft.sessionID);
|
|
54645
|
+
checkpointInputEstimates.delete(draft.sessionID);
|
|
54646
|
+
if (checkpoint?.id && checkpointPermission && replayHead === undefined) {
|
|
54647
|
+
const stripped = await folds.stripRecentContext(draft.sessionID, checkpoint.id);
|
|
54648
|
+
if (stripped?.rendered)
|
|
54649
|
+
checkpoint = structuredClone(stripped.rendered);
|
|
54650
|
+
}
|
|
54543
54651
|
stageOpenCodeV2TransformDecision({
|
|
54544
54652
|
sessionId: draft.sessionID,
|
|
54545
54653
|
responseAfterSequence
|
|
@@ -54618,17 +54726,45 @@ async function registerContext(context) {
|
|
|
54618
54726
|
}
|
|
54619
54727
|
}
|
|
54620
54728
|
};
|
|
54729
|
+
const refuseOversizedCheckpoint = async (draft) => {
|
|
54730
|
+
const hasCheckpoint = draft.messages.some((message) => message.content.some((part) => part.type === "text" && typeof part.text === "string" && part.text.startsWith("<conversation-checkpoint>")));
|
|
54731
|
+
const limit = draft.model.limit?.input ?? draft.model.limit?.context;
|
|
54732
|
+
if (!hasCheckpoint || !limit)
|
|
54733
|
+
return;
|
|
54734
|
+
let estimate;
|
|
54735
|
+
try {
|
|
54736
|
+
estimate = estimateCheckpointRequest(draft);
|
|
54737
|
+
} catch (cause) {
|
|
54738
|
+
await refuseBeforeProvider(context.session, draft.sessionID, "checkpoint-fit-estimate", cause);
|
|
54739
|
+
throw new V2ContextRefusal("Magic Context could not size the host checkpoint.", {
|
|
54740
|
+
cause
|
|
54741
|
+
});
|
|
54742
|
+
}
|
|
54743
|
+
if (estimate.tokens <= limit)
|
|
54744
|
+
return;
|
|
54745
|
+
await refuseBeforeProvider(context.session, draft.sessionID, "checkpoint-over-window");
|
|
54746
|
+
throw new V2ContextRefusal("Magic Context refused an oversized host checkpoint.");
|
|
54747
|
+
};
|
|
54621
54748
|
await context.session.hook("context", (draft) => withSqliteTransformPass2(async () => {
|
|
54622
54749
|
const anchor = generateReplayAnchor(draft.messages);
|
|
54623
|
-
|
|
54750
|
+
try {
|
|
54751
|
+
await runManagedContext(draft);
|
|
54752
|
+
if (!compactionOff)
|
|
54753
|
+
await refuseOversizedCheckpoint(draft);
|
|
54754
|
+
} finally {
|
|
54755
|
+
checkpointInputEstimates.delete(draft.sessionID);
|
|
54756
|
+
checkpointPassPermissions.delete(draft.sessionID);
|
|
54757
|
+
}
|
|
54624
54758
|
if (!compactionOff)
|
|
54625
54759
|
generateReplay.capture(draft, anchor);
|
|
54626
54760
|
else
|
|
54627
54761
|
sessionLog2(draft.sessionID, "generate replay capture skipped: compaction-disabled");
|
|
54628
54762
|
}));
|
|
54629
54763
|
await context.session.hook("generate", async (draft) => {
|
|
54630
|
-
if (!compactionOff && !deletedSessions.has(draft.sessionID))
|
|
54764
|
+
if (!compactionOff && !deletedSessions.has(draft.sessionID)) {
|
|
54631
54765
|
generateReplay.apply(draft);
|
|
54766
|
+
await refuseOversizedCheckpoint(draft);
|
|
54767
|
+
}
|
|
54632
54768
|
});
|
|
54633
54769
|
withoutSqliteTransformPass2(() => warmModelLimitCacheFromCatalog(context));
|
|
54634
54770
|
const rpcLiveSessionState = createV2RpcLiveSessionState({
|
package/dist/v2/fold/owner.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ export interface FoldIdentity {
|
|
|
8
8
|
rendered?: V2Message;
|
|
9
9
|
renderedSha?: string;
|
|
10
10
|
renderedSummary?: string;
|
|
11
|
+
withoutRecentContext?: string;
|
|
11
12
|
rejectedSha?: string;
|
|
12
13
|
reason?: "host_rerender" | "host_cut_before_watermark" | "boot_recovery";
|
|
13
14
|
}
|
|
@@ -36,5 +37,8 @@ export declare class FoldOwner {
|
|
|
36
37
|
rendered: V2Message;
|
|
37
38
|
onHard: (reason: NonNullable<FoldIdentity["reason"]>) => void;
|
|
38
39
|
}): Promise<FoldIdentity>;
|
|
40
|
+
stripRecentContext(sessionID: string, checkpointID: string): Promise<FoldIdentity | undefined>;
|
|
39
41
|
}
|
|
42
|
+
/** Remove the host's rendered recent transcript, preserving the supplied summary. */
|
|
43
|
+
export declare function stripCheckpointRecentContext(message: V2Message, summary: string): boolean;
|
|
40
44
|
//# sourceMappingURL=owner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"owner.d.ts","sourceRoot":"","sources":["../../../src/v2/fold/owner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3D,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,WAAqD,CAAC;AAC9F,MAAM,WAAW,YAAY;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,eAAe,GAAG,2BAA2B,GAAG,eAAe,CAAC;CAC5E;AAED;;;;GAIG;AACH,qBAAa,SAAS;IAEN,OAAO,CAAC,QAAQ,CAAC,OAAO;IADpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuC;gBAClC,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC;YAC5C,MAAM;IAUpB,OAAO,CAAC,GAAG;IAGL,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAG1D,MAAM,CAAC,IAAI,EAAE;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,MAAM,CAAC;KAC7B,GAAG,OAAO,CAAC,YAAY,CAAC;IAoBnB,OAAO,CAAC,IAAI,EAAE;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,SAAS,CAAC;QACpB,MAAM,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,KAAK,IAAI,CAAC;KACjE,GAAG,OAAO,CAAC,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"owner.d.ts","sourceRoot":"","sources":["../../../src/v2/fold/owner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3D,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,WAAqD,CAAC;AAC9F,MAAM,WAAW,YAAY;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,eAAe,GAAG,2BAA2B,GAAG,eAAe,CAAC;CAC5E;AAED;;;;GAIG;AACH,qBAAa,SAAS;IAEN,OAAO,CAAC,QAAQ,CAAC,OAAO;IADpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuC;gBAClC,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC;YAC5C,MAAM;IAUpB,OAAO,CAAC,GAAG;IAGL,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAG1D,MAAM,CAAC,IAAI,EAAE;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,MAAM,CAAC;KAC7B,GAAG,OAAO,CAAC,YAAY,CAAC;IAoBnB,OAAO,CAAC,IAAI,EAAE;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,SAAS,CAAC;QACpB,MAAM,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,KAAK,IAAI,CAAC;KACjE,GAAG,OAAO,CAAC,YAAY,CAAC;IAmDnB,kBAAkB,CACpB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACrB,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;CAoBvC;AAED,qFAAqF;AACrF,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAyBzF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/v2/hooks/context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAqExD,OAAO,EACH,KAAK,qBAAqB,EAE7B,MAAM,mDAAmD,CAAC;AA8B3D,OAAO,EAAE,6BAA6B,EAAE,MAAM,8CAA8C,CAAC;AAC7F,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,qCAAqC,CAAC;AA2B1F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAGH,KAAK,oBAAoB,EAC5B,MAAM,qCAAqC,CAAC;AAG7C,OAAO,EACH,KAAK,QAAQ,EAKhB,MAAM,qBAAqB,CAAC;AA6B7B,OAAO,EAAkB,KAAK,aAAa,EAAqB,MAAM,iBAAiB,CAAC;AA+CxF,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAa,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/v2/hooks/context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAqExD,OAAO,EACH,KAAK,qBAAqB,EAE7B,MAAM,mDAAmD,CAAC;AA8B3D,OAAO,EAAE,6BAA6B,EAAE,MAAM,8CAA8C,CAAC;AAC7F,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,qCAAqC,CAAC;AA2B1F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAGH,KAAK,oBAAoB,EAC5B,MAAM,qCAAqC,CAAC;AAG7C,OAAO,EACH,KAAK,QAAQ,EAKhB,MAAM,qBAAqB,CAAC;AA6B7B,OAAO,EAAkB,KAAK,aAAa,EAAqB,MAAM,iBAAiB,CAAC;AA+CxF,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAa,MAAM,SAAS,CAAC;AA0EpE,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAQlE;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAChC,EAAE,EAAE,QAAQ,EACZ,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,kBAAkB,GAAG,eAAe,CAAC,EACjE,SAAS,EAAE,MAAM,GAClB,qBAAqB,GAAG,SAAS,CAanC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,uBAAuB,CACzC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,EAC1C,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC,CAcf;AA4BD,wBAAgB,eAAe,CAC3B,OAAO,EAAE,SAAS,EAClB,oBAAoB,EAAE,aAAa,CAAC,iBAAiB,CAAC,GAAG,EAAE,EAC3D,oBAAoB,EAAE,WAAW,CAAC,aAAa,CAAC,iCAAiC,CAAC,CAAC,EACnF,UAAU,EAAE,WAAW,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC,GAC7D,QAAQ,CACP,IAAI,CACA,aAAa,EACX,iBAAiB,GACjB,iCAAiC,GACjC,wBAAwB,GACxB,2BAA2B,GAC3B,mBAAmB,GACnB,aAAa,GACb,mBAAmB,GACnB,YAAY,CACjB,CACJ,CAiCA;AAED,KAAK,iBAAiB,GAAG,IAAI,CACzB,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC,QAAQ,CAAC,EACrD,8BAA8B,GAAG,0BAA0B,CAC9D,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,qBAAqB,CACjC,MAAM,EAAE,iBAAiB,GAC1B,IAAI,CAAC,aAAa,EAAE,WAAW,GAAG,4BAA4B,GAAG,wBAAwB,CAAC,CAS5F;AAyBD;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAKhF;AAED,2EAA2E;AAC3E,wBAAgB,aAAa,CACzB,MAAM,EAAE,OAAO,EACf,UAAU,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,GACrC,KAAK,CAAC;IACL,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/D,CAAC,CAyCD;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAElE;AAED,4EAA4E;AAC5E,wBAAgB,yBAAyB,CACrC,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,oBAAoB,EAC7B,MAAM,EAAE,mBAAmB,GAAG,SAAS,EACvC,iBAAiB,UAAO,GACzB,IAAI,CAsBN;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAqBnE;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,mBAAmB,CACrC,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,6BAA6B,CAAC,EAAE,SAAS,CAAC,EAC/E,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,WAAW,GAAG,OAAO,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAC,GACrF,OAAO,CAAC,IAAI,CAAC,CAwCf;AAuBD,wBAAsB,eAAe,CAAC,OAAO,EAAE,SAAS;;eAywEvD"}
|
package/dist/v2/hooks/types.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/v2/hooks/types.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,SAAS;IACtB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACxC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AACD,MAAM,WAAW,cAAc;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE;QACH,UAAU,EAAE,MAAM,CAAC;QACnB,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KAChE,CAAC;IACF,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACvC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC/D,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/v2/hooks/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -4873,6 +4873,7 @@ function decodePiContentDecision(value) {
|
|
|
4873
4873
|
// src/features/magic-context/storage-native-replay.ts
|
|
4874
4874
|
var NATIVE_TOOL_INPUTS = "native tool inputs";
|
|
4875
4875
|
var NATIVE_REASONING_IDS = "native reasoning ids";
|
|
4876
|
+
var nativeWriteBarriers = new WeakMap;
|
|
4876
4877
|
function invalidPersistedReplayState(lane, sessionId) {
|
|
4877
4878
|
return new Error(`invalid persisted ${lane} state for session ${sessionId}`);
|
|
4878
4879
|
}
|
package/dist/v2/server.js
CHANGED
|
@@ -7874,7 +7874,7 @@ var require_src2 = __commonJS(function(exports, module) {
|
|
|
7874
7874
|
// package.json
|
|
7875
7875
|
var package_default = {
|
|
7876
7876
|
name: "@cortexkit/opencode-magic-context",
|
|
7877
|
-
version: "0.49.
|
|
7877
|
+
version: "0.49.31",
|
|
7878
7878
|
type: "module",
|
|
7879
7879
|
description: "OpenCode plugin for Magic Context — cross-session memory and context management",
|
|
7880
7880
|
main: "dist/index.js",
|
|
@@ -8195,7 +8195,7 @@ async function setup(context) {
|
|
|
8195
8195
|
if (claimStorageBackupWarningCheck() && isMagicContextStorageOutsideEngram(storageDir)) {
|
|
8196
8196
|
log2(`[magic-context] Magic Context storage is at ${storageDir}, outside the folder Engram backs up (~/.local/share/cortexkit/magic-context). It is not included in CortexKit backups.`);
|
|
8197
8197
|
}
|
|
8198
|
-
const { registerContext } = await import("./context-
|
|
8198
|
+
const { registerContext } = await import("./context-cdqw9jex.js");
|
|
8199
8199
|
setHarness2("opencode2");
|
|
8200
8200
|
bindStaleBuildNotice({}, import.meta.url, "opencode2");
|
|
8201
8201
|
const duties = await registerContext(context);
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
runManagedWrapup2
|
|
3
|
-
} from "./index-
|
|
4
|
-
import"./index-
|
|
5
|
-
import"./index-
|
|
3
|
+
} from "./index-0bjktrjt.js";
|
|
4
|
+
import"./index-y6ynjghv.js";
|
|
5
|
+
import"./index-kmayq4kq.js";
|
|
6
6
|
import"./index-qgh1qwjj.js";
|
|
7
7
|
import"./index-pe6b4bhs.js";
|
|
8
8
|
import"./index-4s4zq97n.js";
|
package/package.json
CHANGED
|
@@ -76,6 +76,8 @@ import type { Transcript, TranscriptMessage, TranscriptPart } from "./transcript
|
|
|
76
76
|
export { TEXT_TAG_IDENTITY_MARKER };
|
|
77
77
|
|
|
78
78
|
export interface TagTranscriptOptions {
|
|
79
|
+
/** Independently validated text sources; does not authorize tool accounting reuse. */
|
|
80
|
+
reuseTextMessageIds?: ReadonlySet<string>;
|
|
79
81
|
/** Keep tag-only assistant slots inert when their original text must survive stripping. */
|
|
80
82
|
preserveTagOnlyAssistantText?: boolean;
|
|
81
83
|
/**
|
|
@@ -125,6 +127,8 @@ export interface TagTranscriptResult {
|
|
|
125
127
|
targets: Map<number, TagTarget>;
|
|
126
128
|
}
|
|
127
129
|
|
|
130
|
+
type PersistedDropTag = Pick<TagEntry, "tagNumber" | "messageId" | "type" | "toolOwnerMessageId">;
|
|
131
|
+
|
|
128
132
|
/**
|
|
129
133
|
* Bind durable drops to a saved request without tagging it again. Recovery must
|
|
130
134
|
* not allocate identities, inject prefixes, or write accounting while the store
|
|
@@ -132,7 +136,7 @@ export interface TagTranscriptResult {
|
|
|
132
136
|
*/
|
|
133
137
|
export function buildPersistedDropTargets(
|
|
134
138
|
transcript: Transcript,
|
|
135
|
-
tags: readonly
|
|
139
|
+
tags: readonly PersistedDropTag[],
|
|
136
140
|
options: { allowReasoningPrefixRewrite?: boolean } = {},
|
|
137
141
|
): Map<number, TagTarget> {
|
|
138
142
|
const targets = new Map<number, TagTarget>();
|
|
@@ -147,7 +151,7 @@ export function buildPersistedDropTargets(
|
|
|
147
151
|
const byNumber = new Map(tags.map((tag) => [tag.tagNumber, tag]));
|
|
148
152
|
const aggregates = new Map<
|
|
149
153
|
string,
|
|
150
|
-
{ tag?:
|
|
154
|
+
{ tag?: PersistedDropTag; occurrences: ToolOccurrence[]; reasoning: boolean }
|
|
151
155
|
>();
|
|
152
156
|
const pending = new Map<string, string[]>();
|
|
153
157
|
const resolved = new Map<string, string>();
|
|
@@ -421,7 +425,10 @@ export function tagTranscript(
|
|
|
421
425
|
skipPrefixInjection,
|
|
422
426
|
preserveTagOnlyAssistantText: options.preserveTagOnlyAssistantText,
|
|
423
427
|
entryFingerprint: options.entryFingerprintByMessageId?.get(messageId) ?? null,
|
|
424
|
-
reuseIdentity:
|
|
428
|
+
reuseIdentity:
|
|
429
|
+
reuseIdentity ||
|
|
430
|
+
options.reuseTextMessageIds?.has(messageId) === true ||
|
|
431
|
+
contentDerivedTextIds !== undefined,
|
|
425
432
|
timing,
|
|
426
433
|
textIdentitySourceCache: options.textIdentitySourceCache,
|
|
427
434
|
textTokenCache: options.textTokenCache,
|
|
@@ -512,6 +519,11 @@ export function tagTranscript(
|
|
|
512
519
|
timing,
|
|
513
520
|
options.toolTokenCache,
|
|
514
521
|
tokenCacheKey,
|
|
522
|
+
{
|
|
523
|
+
byteSize: existing.maxByteSize,
|
|
524
|
+
tokenCount: existing.maxTokenCount,
|
|
525
|
+
inputTokenCount: existing.inputTokenCount,
|
|
526
|
+
},
|
|
515
527
|
);
|
|
516
528
|
text = accounting.text;
|
|
517
529
|
if (part.kind === "tool_result") {
|
|
@@ -627,6 +639,7 @@ export function tagTranscript(
|
|
|
627
639
|
timing,
|
|
628
640
|
options.toolTokenCache,
|
|
629
641
|
tokenCacheKey,
|
|
642
|
+
tagger.getToolTagAccounting(sessionId, callId, messageId),
|
|
630
643
|
);
|
|
631
644
|
text = accounting.text;
|
|
632
645
|
const outputByteSize = part.kind === "tool_result" ? accounting.byteSize : 0;
|
|
@@ -784,12 +797,23 @@ function readAggregateToolAccounting(
|
|
|
784
797
|
timing: TagTranscriptTiming | undefined,
|
|
785
798
|
tokenCache?: Map<string, { text: string; tokenCount: number }>,
|
|
786
799
|
tokenCacheKey?: string,
|
|
800
|
+
persisted?: { byteSize: number; tokenCount: number | null; inputTokenCount: number | null },
|
|
787
801
|
): AggregateToolAccounting {
|
|
788
802
|
const text = part.getText() ?? "";
|
|
789
803
|
const byteSize = getToolPartByteSize(part, text);
|
|
790
|
-
|
|
804
|
+
// Persisted tool-result accounting tracks the largest byte size seen. Skip
|
|
805
|
+
// output tokenization when that size has not grown and a count is stored;
|
|
806
|
+
// known input counts also need no tokenization. Growth and missing counts still
|
|
807
|
+
// use the counting path, even if the owning message ID was not eligible for
|
|
808
|
+
// tag reuse through options.reuseMessageIds.
|
|
809
|
+
const metadata = part.getToolMetadata({
|
|
810
|
+
skipInputTokenCount: persisted?.inputTokenCount != null,
|
|
811
|
+
});
|
|
791
812
|
let tokenCount = 0;
|
|
792
|
-
if (
|
|
813
|
+
if (
|
|
814
|
+
part.kind === "tool_result" &&
|
|
815
|
+
(!persisted || persisted.tokenCount === null || byteSize > persisted.byteSize)
|
|
816
|
+
) {
|
|
793
817
|
const tokenStart = timing ? performance.now() : 0;
|
|
794
818
|
tokenCount = getCachedToolPartTokenCount(part, text, tokenCache, tokenCacheKey);
|
|
795
819
|
if (timing) timing.tokenCounting += performance.now() - tokenStart;
|
|
@@ -1423,6 +1447,11 @@ function buildAggregateTarget(
|
|
|
1423
1447
|
},
|
|
1424
1448
|
// Open invocations still belong to the current turn; only complete arcs reclaim.
|
|
1425
1449
|
prepareDrop: () => !occurrences.some((occ) => occ.part.canRemove?.() === "defer"),
|
|
1450
|
+
prepareReplayDrop: () => {
|
|
1451
|
+
if (complete() && !requiresToolArcSkeleton) {
|
|
1452
|
+
for (const occ of occurrences) occ.part.canRemove?.();
|
|
1453
|
+
}
|
|
1454
|
+
},
|
|
1426
1455
|
canDrop: () => complete() && !occurrences.some((occ) => occ.part.hasUserAnswer?.()),
|
|
1427
1456
|
requiresToolArcSkeleton,
|
|
1428
1457
|
// Non-mutating read of the invocation input (the tool_use occurrence
|
package/src/shared/transcript.ts
CHANGED
|
@@ -139,7 +139,7 @@ export interface TranscriptPart {
|
|
|
139
139
|
*
|
|
140
140
|
* For non-tool parts both byte fields are undefined/0.
|
|
141
141
|
*/
|
|
142
|
-
getToolMetadata(): {
|
|
142
|
+
getToolMetadata(options?: { skipInputTokenCount?: boolean }): {
|
|
143
143
|
toolName: string | undefined;
|
|
144
144
|
inputByteSize: number;
|
|
145
145
|
inputTokenCount: number;
|