@namzu/sdk 62.8.0 → 62.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/dist/compaction/plan.d.ts +12 -0
- package/dist/compaction/plan.d.ts.map +1 -1
- package/dist/compaction/plan.js +39 -11
- package/dist/compaction/plan.js.map +1 -1
- package/dist/compaction/salience/minhash.d.ts +9 -0
- package/dist/compaction/salience/minhash.d.ts.map +1 -1
- package/dist/compaction/salience/minhash.js +20 -0
- package/dist/compaction/salience/minhash.js.map +1 -1
- package/dist/compaction/salience/score.d.ts.map +1 -1
- package/dist/compaction/salience/score.js +87 -45
- package/dist/compaction/salience/score.js.map +1 -1
- package/dist/compaction/salience/working-set.d.ts +14 -0
- package/dist/compaction/salience/working-set.d.ts.map +1 -1
- package/dist/compaction/salience/working-set.js +84 -33
- package/dist/compaction/salience/working-set.js.map +1 -1
- package/dist/config/runtime.d.ts +2 -0
- package/dist/config/runtime.d.ts.map +1 -1
- package/dist/config/runtime.js +14 -0
- package/dist/config/runtime.js.map +1 -1
- package/dist/manager/session/turn-recorder.d.ts +25 -0
- package/dist/manager/session/turn-recorder.d.ts.map +1 -1
- package/dist/manager/session/turn-recorder.js +193 -17
- package/dist/manager/session/turn-recorder.js.map +1 -1
- package/dist/public-runtime.d.ts +1 -1
- package/dist/public-runtime.d.ts.map +1 -1
- package/dist/public-runtime.js +1 -1
- package/dist/public-runtime.js.map +1 -1
- package/dist/runtime/query/cancelled-before-start.js +1 -1
- package/dist/runtime/query/cancelled-before-start.js.map +1 -1
- package/dist/runtime/query/checkpoint.js +2 -1
- package/dist/runtime/query/checkpoint.js.map +1 -1
- package/dist/runtime/query/index.d.ts.map +1 -1
- package/dist/runtime/query/index.js +4 -1
- package/dist/runtime/query/index.js.map +1 -1
- package/dist/runtime/query/iteration/phases/compaction.d.ts.map +1 -1
- package/dist/runtime/query/iteration/phases/compaction.js +15 -1
- package/dist/runtime/query/iteration/phases/compaction.js.map +1 -1
- package/dist/runtime/query/prepare-turn.js +10 -4
- package/dist/runtime/query/prepare-turn.js.map +1 -1
- package/dist/store/session-log/core.d.ts +31 -1
- package/dist/store/session-log/core.d.ts.map +1 -1
- package/dist/store/session-log/core.js +95 -9
- package/dist/store/session-log/core.js.map +1 -1
- package/dist/store/session-log/disk.d.ts +2 -0
- package/dist/store/session-log/disk.d.ts.map +1 -1
- package/dist/store/session-log/disk.js +37 -0
- package/dist/store/session-log/disk.js.map +1 -1
- package/dist/store/session-log/fold.d.ts +9 -1
- package/dist/store/session-log/fold.d.ts.map +1 -1
- package/dist/store/session-log/fold.js +18 -2
- package/dist/store/session-log/fold.js.map +1 -1
- package/dist/store/session-log/incremental.d.ts +8 -0
- package/dist/store/session-log/incremental.d.ts.map +1 -1
- package/dist/store/session-log/incremental.js +7 -2
- package/dist/store/session-log/incremental.js.map +1 -1
- package/dist/store/session-log/index.d.ts +1 -0
- package/dist/store/session-log/index.d.ts.map +1 -1
- package/dist/store/session-log/index.js +1 -0
- package/dist/store/session-log/index.js.map +1 -1
- package/dist/store/session-log/verified-prefix.d.ts +46 -0
- package/dist/store/session-log/verified-prefix.d.ts.map +1 -0
- package/dist/store/session-log/verified-prefix.js +233 -0
- package/dist/store/session-log/verified-prefix.js.map +1 -0
- package/dist/types/session/records.d.ts +80 -1
- package/dist/types/session/records.d.ts.map +1 -1
- package/dist/types/session/records.js +22 -0
- package/dist/types/session/records.js.map +1 -1
- package/package.json +1 -1
- package/src/compaction/plan.ts +53 -11
- package/src/compaction/salience/minhash.ts +20 -0
- package/src/compaction/salience/score.ts +112 -43
- package/src/compaction/salience/working-set.ts +102 -31
- package/src/config/runtime.ts +14 -0
- package/src/manager/session/turn-recorder.ts +218 -15
- package/src/public-runtime.ts +1 -0
- package/src/runtime/query/cancelled-before-start.ts +1 -1
- package/src/runtime/query/checkpoint.ts +2 -1
- package/src/runtime/query/index.ts +4 -1
- package/src/runtime/query/iteration/phases/compaction.ts +18 -0
- package/src/runtime/query/prepare-turn.ts +10 -3
- package/src/store/session-log/core.ts +129 -10
- package/src/store/session-log/disk.ts +32 -0
- package/src/store/session-log/fold.ts +19 -2
- package/src/store/session-log/incremental.ts +15 -2
- package/src/store/session-log/index.ts +1 -0
- package/src/store/session-log/verified-prefix.ts +243 -0
- package/src/types/session/records.ts +25 -0
|
@@ -29,10 +29,7 @@ function firstSentence(text) {
|
|
|
29
29
|
export function isStubbedNarration(content) {
|
|
30
30
|
return typeof content === 'string' && content.includes(STUB_MARK);
|
|
31
31
|
}
|
|
32
|
-
|
|
33
|
-
const minTool = options.minToolResultChars ?? 1_000;
|
|
34
|
-
const minNarration = options.minNarrationChars ?? 240;
|
|
35
|
-
const preserve = new Set(options.preserveTools ?? []);
|
|
32
|
+
function evictionRules(messages, options) {
|
|
36
33
|
const toolNameByCallId = new Map();
|
|
37
34
|
for (const m of messages) {
|
|
38
35
|
if (m.role !== 'assistant')
|
|
@@ -41,39 +38,93 @@ export function planWorkingSet(messages, scored, options) {
|
|
|
41
38
|
toolNameByCallId.set(call.id, call.function.name);
|
|
42
39
|
}
|
|
43
40
|
}
|
|
41
|
+
return {
|
|
42
|
+
minTool: options.minToolResultChars ?? 1_000,
|
|
43
|
+
minNarration: options.minNarrationChars ?? 240,
|
|
44
|
+
preserve: new Set(options.preserveTools ?? []),
|
|
45
|
+
toolNameByCallId,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Whether the pass could clear or stub this message, ignoring only what
|
|
50
|
+
* protection decides (the floor, the recent turns, retained turns, a pair
|
|
51
|
+
* with a protected half) and what the score decides. The one place the
|
|
52
|
+
* eligibility rules live: {@link planWorkingSet} asks it of each unprotected
|
|
53
|
+
* message, and {@link hasEvictableMessage} asks it of every message.
|
|
54
|
+
*/
|
|
55
|
+
function evictionKind(m, tokens, rules) {
|
|
56
|
+
if (tokens === 0)
|
|
57
|
+
return null;
|
|
58
|
+
if (m.role === 'tool') {
|
|
59
|
+
const tool = m;
|
|
60
|
+
if (tool.isError || isClearedToolResult(tool.content))
|
|
61
|
+
return null;
|
|
62
|
+
if (rules.preserve.has(rules.toolNameByCallId.get(tool.toolCallId) ?? ''))
|
|
63
|
+
return null;
|
|
64
|
+
if (tokens * CHARS_PER_TOKEN < rules.minTool)
|
|
65
|
+
return null;
|
|
66
|
+
return 'clear';
|
|
67
|
+
}
|
|
68
|
+
if (m.role === 'assistant' && !Array.isArray(m.toolCalls)) {
|
|
69
|
+
const text = typeof m.content === 'string' ? m.content : '';
|
|
70
|
+
if (text.length < rules.minNarration || isStubbedNarration(text))
|
|
71
|
+
return null;
|
|
72
|
+
return 'stub';
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* A cheap count of whether anything at all is left for the pass to shed:
|
|
78
|
+
* false means {@link planWorkingSet} would return no action whatever the
|
|
79
|
+
* scores are, so scoring can be skipped. It leaves out the two protections
|
|
80
|
+
* that are only a position (the leading system run and the last
|
|
81
|
+
* `keepRecentMessages`); retained turns, tool-call pairs and the goal floor
|
|
82
|
+
* are not looked at. True is therefore only "go and look", and a false is
|
|
83
|
+
* exact.
|
|
84
|
+
*/
|
|
85
|
+
export function hasEvictableMessage(messages, options) {
|
|
86
|
+
const rules = evictionRules(messages, options);
|
|
87
|
+
let floorEnd = 0;
|
|
88
|
+
while (floorEnd < messages.length && messages[floorEnd]?.role === 'system')
|
|
89
|
+
floorEnd += 1;
|
|
90
|
+
const end = Math.max(floorEnd, messages.length - options.keepRecentMessages);
|
|
91
|
+
for (let i = floorEnd; i < end; i += 1) {
|
|
92
|
+
const m = messages[i];
|
|
93
|
+
if (evictionKind(m, estimateMessageTokens(m), rules) !== null)
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
/** The plan of a pass that sheds nothing: every message as it was. */
|
|
99
|
+
export function planNothingToShed(messages, options) {
|
|
100
|
+
return {
|
|
101
|
+
messages: [...messages],
|
|
102
|
+
actions: [],
|
|
103
|
+
clearedCount: 0,
|
|
104
|
+
stubbedCount: 0,
|
|
105
|
+
charsReclaimed: 0,
|
|
106
|
+
reclaimedTokens: 0,
|
|
107
|
+
reachedTarget: options.estimatedTokens - options.targetTokens <= 0,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
export function planWorkingSet(messages, scored, options) {
|
|
111
|
+
const rules = evictionRules(messages, options);
|
|
112
|
+
const { toolNameByCallId } = rules;
|
|
44
113
|
const candidates = [];
|
|
45
114
|
for (const s of scored) {
|
|
46
|
-
if (s.protected !== null
|
|
115
|
+
if (s.protected !== null)
|
|
47
116
|
continue;
|
|
48
117
|
const m = messages[s.index];
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
kind: 'clear',
|
|
60
|
-
salience: s.salience,
|
|
61
|
-
tokens: s.tokens,
|
|
62
|
-
goalBound: s.relevance >= 0.5 || s.utility >= 1,
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
else if (m.role === 'assistant' && !Array.isArray(m.toolCalls)) {
|
|
66
|
-
const text = typeof m.content === 'string' ? m.content : '';
|
|
67
|
-
if (text.length < minNarration || isStubbedNarration(text))
|
|
68
|
-
continue;
|
|
69
|
-
candidates.push({
|
|
70
|
-
index: s.index,
|
|
71
|
-
kind: 'stub',
|
|
72
|
-
salience: s.salience,
|
|
73
|
-
tokens: s.tokens,
|
|
74
|
-
goalBound: s.relevance >= 0.5 || s.utility >= 1,
|
|
75
|
-
});
|
|
76
|
-
}
|
|
118
|
+
const kind = evictionKind(m, s.tokens, rules);
|
|
119
|
+
if (kind === null)
|
|
120
|
+
continue;
|
|
121
|
+
candidates.push({
|
|
122
|
+
index: s.index,
|
|
123
|
+
kind,
|
|
124
|
+
salience: s.salience,
|
|
125
|
+
tokens: s.tokens,
|
|
126
|
+
goalBound: s.relevance >= 0.5 || s.utility >= 1,
|
|
127
|
+
});
|
|
77
128
|
}
|
|
78
129
|
candidates.sort((a, b) => a.salience - b.salience || b.tokens - a.tokens || a.index - b.index);
|
|
79
130
|
const maxSalience = candidates.reduce((m, c) => Math.max(m, c.salience), Number.NEGATIVE_INFINITY);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"working-set.js","sourceRoot":"","sources":["../../../src/compaction/salience/working-set.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAE3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAwChF,MAAM,SAAS,GAAG,WAAW,CAAA;AAE7B,SAAS,aAAa,CAAC,IAAY;IAClC,MAAM,KAAK,GAAG,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;IACzD,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;AAC7E,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IAClD,OAAO,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;AAClE,CAAC;
|
|
1
|
+
{"version":3,"file":"working-set.js","sourceRoot":"","sources":["../../../src/compaction/salience/working-set.ts"],"names":[],"mappings":"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"}
|
package/dist/config/runtime.d.ts
CHANGED
|
@@ -19,6 +19,7 @@ export declare const CompactionConfigSchema: z.ZodObject<{
|
|
|
19
19
|
"sliding-window": "sliding-window";
|
|
20
20
|
}>>;
|
|
21
21
|
softTarget: z.ZodOptional<z.ZodNumber>;
|
|
22
|
+
softTargetHeadroom: z.ZodOptional<z.ZodNumber>;
|
|
22
23
|
contextWindowTokens: z.ZodOptional<z.ZodNumber>;
|
|
23
24
|
triggerThreshold: z.ZodOptional<z.ZodNumber>;
|
|
24
25
|
autoCompactWindowTokens: z.ZodOptional<z.ZodNumber>;
|
|
@@ -104,6 +105,7 @@ export declare const RuntimeConfigSchema: z.ZodObject<{
|
|
|
104
105
|
"sliding-window": "sliding-window";
|
|
105
106
|
}>>;
|
|
106
107
|
softTarget: z.ZodOptional<z.ZodNumber>;
|
|
108
|
+
softTargetHeadroom: z.ZodOptional<z.ZodNumber>;
|
|
107
109
|
contextWindowTokens: z.ZodOptional<z.ZodNumber>;
|
|
108
110
|
triggerThreshold: z.ZodOptional<z.ZodNumber>;
|
|
109
111
|
autoCompactWindowTokens: z.ZodOptional<z.ZodNumber>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/config/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAE/D,OAAO,EAAE,mBAAmB,EAAE,CAAA;AAE9B,eAAO,MAAM,sBAAsB;;;;;;;;kBAUvB,CAAA;AAEZ,eAAO,MAAM,sBAAsB
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/config/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAE/D,OAAO,EAAE,mBAAmB,EAAE,CAAA;AAE9B,eAAO,MAAM,sBAAsB;;;;;;;;kBAUvB,CAAA;AAEZ,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA2LjC,CAAA;AAEF,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAErE,eAAO,MAAM,oBAAoB;;;;;;;iBAO/B,CAAA;AAEF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAEjE,eAAO,MAAM,uBAAuB;;;;;;iBAGlC,CAAA;AAEF,eAAO,MAAM,yBAAyB;;;;;;;;iBAKpC,CAAA;AAEF,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAA;AAE3E,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAY9B,CAAA;AAEF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAE/D,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,aAAa,CAAiC,CAAA"}
|
package/dist/config/runtime.js
CHANGED
|
@@ -29,6 +29,20 @@ export const CompactionConfigSchema = z.object({
|
|
|
29
29
|
* `triggerThreshold` summarises. The context is held around here.
|
|
30
30
|
*/
|
|
31
31
|
softTarget: z.number().min(0).max(1).optional(),
|
|
32
|
+
/**
|
|
33
|
+
* `salience` only: how far below `softTarget`, as a fraction of the
|
|
34
|
+
* window, a pass sheds. A pass still starts when the context reaches the
|
|
35
|
+
* soft target, but it then keeps shedding until the context is
|
|
36
|
+
* `softTargetHeadroom` of the window under it, so the next pass is needed
|
|
37
|
+
* only after that headroom has been used instead of on the next turn.
|
|
38
|
+
* Fewer passes, and the request is rewritten (a prompt cache's prefix
|
|
39
|
+
* broken) once per headroom instead of once per turn; the cost is that
|
|
40
|
+
* the context is held that much lower, so that much less history stays
|
|
41
|
+
* whole. The messages shed are the same ones in the same order, only
|
|
42
|
+
* earlier. Absent or `0`, the default, a pass sheds to the soft target
|
|
43
|
+
* and no further, exactly as before.
|
|
44
|
+
*/
|
|
45
|
+
softTargetHeadroom: z.number().min(0).max(1).optional(),
|
|
32
46
|
/**
|
|
33
47
|
* Optional model context-window size (tokens) the compaction trigger
|
|
34
48
|
* measures the CURRENT window against. NO default: when omitted the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/config/runtime.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/config/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -231,6 +231,13 @@ export declare class TurnRecorder {
|
|
|
231
231
|
pushMessage(message: Message, options?: {
|
|
232
232
|
readonly messageId?: MessageId;
|
|
233
233
|
readonly transient?: boolean;
|
|
234
|
+
/**
|
|
235
|
+
* The message is part of the history a resume restores, not a new
|
|
236
|
+
* one. While the resume's re-base is pending, a restored message with no
|
|
237
|
+
* id is held and nothing is reconciled; the first message that is not
|
|
238
|
+
* restored (or any other reconcile) re-bases once on the whole context.
|
|
239
|
+
*/
|
|
240
|
+
readonly restored?: boolean;
|
|
234
241
|
}): void;
|
|
235
242
|
/** Replace the context without replacing the turn; recorded as one `compaction`. */
|
|
236
243
|
replaceMessages(messages: readonly Message[]): void;
|
|
@@ -271,6 +278,18 @@ export declare function recordedTurnStart(log: SessionLog, turnId: TurnId): Prom
|
|
|
271
278
|
export declare function readFoldedHistory(log: SessionLog, options?: {
|
|
272
279
|
readonly throughSeq?: number;
|
|
273
280
|
}): Promise<RecordedMessage[]>;
|
|
281
|
+
/** Every message ever recorded, and the texts an edited one held before each edit. */
|
|
282
|
+
export interface EverRecordedMessages {
|
|
283
|
+
/** The latest text of each message, by its durable id. */
|
|
284
|
+
readonly latest: ReadonlyMap<MessageId, Message>;
|
|
285
|
+
/**
|
|
286
|
+
* Whether `id` held `message`'s text before a compaction edit. A
|
|
287
|
+
* `message_replaced` for the id forgets the texts before it: a guardrail's
|
|
288
|
+
* replacement is the settled answer. A spilled earlier text is read only
|
|
289
|
+
* when a comparison needs it.
|
|
290
|
+
*/
|
|
291
|
+
heldBeforeAnEdit(id: MessageId, message: Message): Promise<boolean>;
|
|
292
|
+
}
|
|
274
293
|
/**
|
|
275
294
|
* Every message this session's log has ever recorded, keyed by the durable
|
|
276
295
|
* id its `message` record gave it — including one a compaction has since
|
|
@@ -283,6 +302,12 @@ export declare function readFoldedHistory(log: SessionLog, options?: {
|
|
|
283
302
|
* recognise it by id — a caller's copy of it is reconciled by value instead.
|
|
284
303
|
*/
|
|
285
304
|
export declare function readEverRecordedMessages(log: SessionLog): Promise<ReadonlyMap<MessageId, Message>>;
|
|
305
|
+
/**
|
|
306
|
+
* {@link readEverRecordedMessages} plus what a host that cached the history
|
|
307
|
+
* before a compaction edit still holds, answered from the same reduction with
|
|
308
|
+
* no read of the log of its own.
|
|
309
|
+
*/
|
|
310
|
+
export declare function readEverRecordedMessageIndex(log: SessionLog): Promise<EverRecordedMessages>;
|
|
286
311
|
/**
|
|
287
312
|
* A session's audit trail: its `audit` records as {@link AuditEvent}s, in log
|
|
288
313
|
* order, each numbered among the session's audit entries. What
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turn-recorder.d.ts","sourceRoot":"","sources":["../../../src/manager/session/turn-recorder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"turn-recorder.d.ts","sourceRoot":"","sources":["../../../src/manager/session/turn-recorder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isDeepStrictEqual } from 'node:util';
|
|
1
2
|
import { AUTO_CONTINUATION_USER_MESSAGE, REASONING_CUT_USER_MESSAGE, } from '../../constants/continuation.js';
|
|
2
3
|
import { EMPTY_TOKEN_USAGE } from '../../constants/limits.js';
|
|
3
4
|
import { NAMZU } from '../../constants/telemetry/index.js';
|
|
@@ -32,6 +33,12 @@ function stampMessageId(message, id) {
|
|
|
32
33
|
else
|
|
33
34
|
message.id = id;
|
|
34
35
|
}
|
|
36
|
+
/** Two messages that differ only in their id and time are the same text. */
|
|
37
|
+
function sameStoredContent(a, b) {
|
|
38
|
+
const { id: _a, timestamp: _ta, ...restA } = a;
|
|
39
|
+
const { id: _b, timestamp: _tb, ...restB } = b;
|
|
40
|
+
return isDeepStrictEqual(JSON.parse(JSON.stringify(restA)), JSON.parse(JSON.stringify(restB)));
|
|
41
|
+
}
|
|
35
42
|
/** Default lease time-to-live: renewed at half-life while the turn runs. */
|
|
36
43
|
export const DEFAULT_TURN_LEASE_TTL_MS = 5 * 60_000;
|
|
37
44
|
/** Record types that may carry `turnId` only while the turn is active. */
|
|
@@ -152,6 +159,8 @@ export class TurnRecorder {
|
|
|
152
159
|
* these needs no re-basing, so no `compaction` record is written for it.
|
|
153
160
|
*/
|
|
154
161
|
#foldIdsAtResume;
|
|
162
|
+
/** What the log folds to for a message a replacement or an edit changed, as of the resume. */
|
|
163
|
+
#foldEditedAtResume = new Map();
|
|
155
164
|
/** When a resumed turn began: its `turn_started` record, not this process's start. */
|
|
156
165
|
#resumedTurnStartedAt;
|
|
157
166
|
constructor(config) {
|
|
@@ -720,6 +729,10 @@ export class TurnRecorder {
|
|
|
720
729
|
async #readResumedLog() {
|
|
721
730
|
await this.flush();
|
|
722
731
|
const fold = new SessionMessageFold();
|
|
732
|
+
// Whether the latest change to a message was a compaction edit: only
|
|
733
|
+
// that one is the recorder's to put back (a guardrail's replacement is
|
|
734
|
+
// the settled answer and the restored context is not allowed to undo it).
|
|
735
|
+
const latestChange = new Map();
|
|
723
736
|
for await (const entry of this.log.read()) {
|
|
724
737
|
const record = entry.record;
|
|
725
738
|
if (record.type === 'turn_started' && record.turnId === this.turnId) {
|
|
@@ -727,17 +740,29 @@ export class TurnRecorder {
|
|
|
727
740
|
if (Number.isFinite(at))
|
|
728
741
|
this.#resumedTurnStartedAt = at;
|
|
729
742
|
}
|
|
743
|
+
if (record.type === 'message_edited')
|
|
744
|
+
latestChange.set(record.targetMessageId, 'edited');
|
|
745
|
+
else if (record.type === 'message_replaced')
|
|
746
|
+
latestChange.set(record.targetMessageId, 'replaced');
|
|
730
747
|
fold.apply(record);
|
|
731
748
|
}
|
|
732
|
-
if (fold.spilledSummary)
|
|
733
|
-
return undefined;
|
|
734
749
|
const ids = [];
|
|
750
|
+
let allRecorded = !fold.spilledSummary;
|
|
751
|
+
this.#foldEditedAtResume.clear();
|
|
752
|
+
// Filled for every fold entry with an id, whether or not the fold also
|
|
753
|
+
// holds id-less entries (a summary): a restored context older than an edit
|
|
754
|
+
// is put right either way. An entry whose text is spilled is not
|
|
755
|
+
// compared, so a message edited to a spilled text is not put back.
|
|
735
756
|
for (const entry of fold.entries()) {
|
|
736
|
-
if (!entry.messageId)
|
|
737
|
-
|
|
757
|
+
if (!entry.messageId) {
|
|
758
|
+
allRecorded = false;
|
|
759
|
+
continue;
|
|
760
|
+
}
|
|
738
761
|
ids.push(entry.messageId);
|
|
762
|
+
if (latestChange.get(entry.messageId) === 'edited' && entry.spill === undefined)
|
|
763
|
+
this.#foldEditedAtResume.set(entry.messageId, entry.message);
|
|
739
764
|
}
|
|
740
|
-
return ids;
|
|
765
|
+
return allRecorded ? ids : undefined;
|
|
741
766
|
}
|
|
742
767
|
/** The recorded context is exactly what the log folds to: a resume changed nothing. */
|
|
743
768
|
#viewMatchesFold() {
|
|
@@ -956,6 +981,16 @@ export class TurnRecorder {
|
|
|
956
981
|
});
|
|
957
982
|
return;
|
|
958
983
|
}
|
|
984
|
+
if (options.restored && this.#rebasePending && this.#phase === 'active') {
|
|
985
|
+
// A restored message with no id (a compaction summary, the working-memory
|
|
986
|
+
// slot, a message the host added) can arrive before the recorded ones.
|
|
987
|
+
// Reconciling now would re-base the fold on a context holding only it and
|
|
988
|
+
// drop the recorded messages that follow; hold it as an id-less view entry
|
|
989
|
+
// and let the first reconciliation after the whole context is in place
|
|
990
|
+
// write one `compaction` that keeps the recorded ids after it.
|
|
991
|
+
this.#view.push({ message });
|
|
992
|
+
return;
|
|
993
|
+
}
|
|
959
994
|
this.#syncMessages();
|
|
960
995
|
}
|
|
961
996
|
/** Replace the context without replacing the turn; recorded as one `compaction`. */
|
|
@@ -990,6 +1025,106 @@ export class TurnRecorder {
|
|
|
990
1025
|
stampMessageId(message, id);
|
|
991
1026
|
return id;
|
|
992
1027
|
}
|
|
1028
|
+
/**
|
|
1029
|
+
* A compaction pass edits one message by replacing its object with a copy
|
|
1030
|
+
* that has other content (`{ ...message, content }`). The copy still carries
|
|
1031
|
+
* the id the original was stamped with, but the recorder's own indexes are
|
|
1032
|
+
* keyed by object identity, so without this it would see an unknown message
|
|
1033
|
+
* and record every message after it again. A live object that is not in the
|
|
1034
|
+
* view, whose `id` is that of a recorded view entry whose own object has left
|
|
1035
|
+
* the context, is that same message edited: one `message_edited` record
|
|
1036
|
+
* carries its new content and the view entry follows the new object.
|
|
1037
|
+
*
|
|
1038
|
+
* Only an id claimed by exactly one live object is taken, so two copies of
|
|
1039
|
+
* one message are never both treated as its edit. Anything else is left to
|
|
1040
|
+
* the callers, which record it as a new message.
|
|
1041
|
+
*/
|
|
1042
|
+
#absorbEdits() {
|
|
1043
|
+
if (this.#phase !== 'active')
|
|
1044
|
+
return;
|
|
1045
|
+
const live = this.#turn.messages;
|
|
1046
|
+
const inContext = new Set(live);
|
|
1047
|
+
let orphans;
|
|
1048
|
+
for (const entry of this.#view) {
|
|
1049
|
+
if (entry.id === undefined || entry.transient || inContext.has(entry.message))
|
|
1050
|
+
continue;
|
|
1051
|
+
orphans ??= new Map();
|
|
1052
|
+
orphans.set(entry.id, entry);
|
|
1053
|
+
}
|
|
1054
|
+
if (orphans === undefined)
|
|
1055
|
+
return;
|
|
1056
|
+
const known = new Set(this.#view.map((entry) => entry.message));
|
|
1057
|
+
const claimed = new Map();
|
|
1058
|
+
for (const message of live) {
|
|
1059
|
+
if (known.has(message) || this.#transient.has(message))
|
|
1060
|
+
continue;
|
|
1061
|
+
const id = message.id;
|
|
1062
|
+
if (id === undefined || !orphans.has(id))
|
|
1063
|
+
continue;
|
|
1064
|
+
const list = claimed.get(id);
|
|
1065
|
+
if (list)
|
|
1066
|
+
list.push(message);
|
|
1067
|
+
else
|
|
1068
|
+
claimed.set(id, [message]);
|
|
1069
|
+
}
|
|
1070
|
+
const turnId = this.turnId;
|
|
1071
|
+
for (const [id, messages] of claimed) {
|
|
1072
|
+
const message = messages[0];
|
|
1073
|
+
const entry = orphans.get(id);
|
|
1074
|
+
if (messages.length !== 1 || message.role !== entry.message.role)
|
|
1075
|
+
continue;
|
|
1076
|
+
// `previous` is the live object the view holds: a message mutated in place
|
|
1077
|
+
// and then replaced by a copy of itself is adopted without a record, and
|
|
1078
|
+
// the fold keeps the text it recorded.
|
|
1079
|
+
const previous = entry.message;
|
|
1080
|
+
entry.message = message;
|
|
1081
|
+
this.#ids.set(message, id);
|
|
1082
|
+
this.#recorded.set(message, id);
|
|
1083
|
+
// A copy with the same text (a structured clone, a re-parsed message)
|
|
1084
|
+
// is adopted as is: the fold already shows that content.
|
|
1085
|
+
if (sameStoredContent(previous, message))
|
|
1086
|
+
continue;
|
|
1087
|
+
void this.#enqueue(() => this.#append({
|
|
1088
|
+
type: 'message_edited',
|
|
1089
|
+
turnId,
|
|
1090
|
+
targetMessageId: id,
|
|
1091
|
+
content: message,
|
|
1092
|
+
ignorable: true,
|
|
1093
|
+
reason: 'compaction',
|
|
1094
|
+
})).catch(() => undefined);
|
|
1095
|
+
}
|
|
1096
|
+
}
|
|
1097
|
+
/**
|
|
1098
|
+
* A resume restores the context a checkpoint holds, which can predate a
|
|
1099
|
+
* compaction edit written after it. The ids still match, so the log is not
|
|
1100
|
+
* re-based; but the fold then shows the edited text of a message the context
|
|
1101
|
+
* holds as it was. One `message_edited` per such message makes the fold show
|
|
1102
|
+
* the context the resume actually runs with.
|
|
1103
|
+
*/
|
|
1104
|
+
#recordDriftFromFold() {
|
|
1105
|
+
const edited = this.#foldEditedAtResume;
|
|
1106
|
+
if (edited.size === 0)
|
|
1107
|
+
return;
|
|
1108
|
+
const turnId = this.turnId;
|
|
1109
|
+
for (const entry of this.#view) {
|
|
1110
|
+
if (entry.id === undefined || entry.transient)
|
|
1111
|
+
continue;
|
|
1112
|
+
const folded = edited.get(entry.id);
|
|
1113
|
+
if (folded === undefined || sameStoredContent(folded, entry.message))
|
|
1114
|
+
continue;
|
|
1115
|
+
const message = entry.message;
|
|
1116
|
+
const id = entry.id;
|
|
1117
|
+
void this.#enqueue(() => this.#append({
|
|
1118
|
+
type: 'message_edited',
|
|
1119
|
+
turnId,
|
|
1120
|
+
targetMessageId: id,
|
|
1121
|
+
content: message,
|
|
1122
|
+
ignorable: true,
|
|
1123
|
+
reason: 'resume',
|
|
1124
|
+
})).catch(() => undefined);
|
|
1125
|
+
}
|
|
1126
|
+
edited.clear();
|
|
1127
|
+
}
|
|
993
1128
|
/**
|
|
994
1129
|
* Reconcile the context with the log. Nothing is written before the turn
|
|
995
1130
|
* begins or after it pauses or settles.
|
|
@@ -1003,9 +1138,15 @@ export class TurnRecorder {
|
|
|
1003
1138
|
this.#foldIdsAtResume = undefined;
|
|
1004
1139
|
if (!unchanged) {
|
|
1005
1140
|
this.#recordCompaction();
|
|
1141
|
+
// Kept ids whose restored text differs from the edited text the fold
|
|
1142
|
+
// holds get their record; entries re-recorded under fresh ids are not
|
|
1143
|
+
// in the map and are skipped.
|
|
1144
|
+
this.#recordDriftFromFold();
|
|
1006
1145
|
return;
|
|
1007
1146
|
}
|
|
1147
|
+
this.#recordDriftFromFold();
|
|
1008
1148
|
}
|
|
1149
|
+
this.#absorbEdits();
|
|
1009
1150
|
const live = this.#turn.messages;
|
|
1010
1151
|
const view = this.#view;
|
|
1011
1152
|
let prefix = 0;
|
|
@@ -1041,6 +1182,7 @@ export class TurnRecorder {
|
|
|
1041
1182
|
* log order, the whole context becomes the summary.
|
|
1042
1183
|
*/
|
|
1043
1184
|
#recordCompaction() {
|
|
1185
|
+
this.#absorbEdits();
|
|
1044
1186
|
const live = this.#turn.messages;
|
|
1045
1187
|
const byMessage = new Map(this.#view.map((entry) => [entry.message, entry]));
|
|
1046
1188
|
const next = live.map((message) => {
|
|
@@ -1300,6 +1442,9 @@ async function recordedMessages(log, fold) {
|
|
|
1300
1442
|
}
|
|
1301
1443
|
return out;
|
|
1302
1444
|
}
|
|
1445
|
+
function recordedContent(record) {
|
|
1446
|
+
return { content: record.content, ...(record.spill ? { spill: record.spill } : {}) };
|
|
1447
|
+
}
|
|
1303
1448
|
/**
|
|
1304
1449
|
* Every message this session's log has ever recorded, keyed by the durable
|
|
1305
1450
|
* id its `message` record gave it — including one a compaction has since
|
|
@@ -1312,26 +1457,40 @@ async function recordedMessages(log, fold) {
|
|
|
1312
1457
|
* recognise it by id — a caller's copy of it is reconciled by value instead.
|
|
1313
1458
|
*/
|
|
1314
1459
|
export async function readEverRecordedMessages(log) {
|
|
1460
|
+
return (await readEverRecordedMessageIndex(log)).latest;
|
|
1461
|
+
}
|
|
1462
|
+
/**
|
|
1463
|
+
* {@link readEverRecordedMessages} plus what a host that cached the history
|
|
1464
|
+
* before a compaction edit still holds, answered from the same reduction with
|
|
1465
|
+
* no read of the log of its own.
|
|
1466
|
+
*/
|
|
1467
|
+
export async function readEverRecordedMessageIndex(log) {
|
|
1315
1468
|
return foldSessionLog(log, {
|
|
1316
1469
|
name: 'ever-recorded-messages',
|
|
1317
1470
|
mode: 'strict',
|
|
1318
|
-
create: () => new Map(),
|
|
1319
|
-
apply: (latest, entry) => {
|
|
1471
|
+
create: () => ({ latest: new Map(), earlier: new Map() }),
|
|
1472
|
+
apply: ({ latest, earlier }, entry) => {
|
|
1320
1473
|
const record = entry.record;
|
|
1321
1474
|
if (record.type === 'message') {
|
|
1322
|
-
latest.set(record.messageId,
|
|
1323
|
-
content: record.content,
|
|
1324
|
-
...(record.spill ? { spill: record.spill } : {}),
|
|
1325
|
-
});
|
|
1475
|
+
latest.set(record.messageId, recordedContent(record));
|
|
1326
1476
|
}
|
|
1327
1477
|
else if (record.type === 'message_replaced') {
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1478
|
+
earlier.delete(record.targetMessageId);
|
|
1479
|
+
latest.set(record.targetMessageId, recordedContent(record));
|
|
1480
|
+
}
|
|
1481
|
+
else if (record.type === 'message_edited') {
|
|
1482
|
+
const before = latest.get(record.targetMessageId);
|
|
1483
|
+
if (before !== undefined) {
|
|
1484
|
+
const held = earlier.get(record.targetMessageId);
|
|
1485
|
+
if (held)
|
|
1486
|
+
held.push(before);
|
|
1487
|
+
else
|
|
1488
|
+
earlier.set(record.targetMessageId, [before]);
|
|
1489
|
+
}
|
|
1490
|
+
latest.set(record.targetMessageId, recordedContent(record));
|
|
1332
1491
|
}
|
|
1333
1492
|
},
|
|
1334
|
-
result: async (latest) => {
|
|
1493
|
+
result: async ({ latest, earlier }) => {
|
|
1335
1494
|
const resolved = new Map();
|
|
1336
1495
|
for (const [id, entry] of latest) {
|
|
1337
1496
|
// Copied: the map this is read from is shared with the next call.
|
|
@@ -1340,7 +1499,24 @@ export async function readEverRecordedMessages(log) {
|
|
|
1340
1499
|
: structuredClone(entry.content);
|
|
1341
1500
|
resolved.set(id, withMessageId(content, id));
|
|
1342
1501
|
}
|
|
1343
|
-
|
|
1502
|
+
// A snapshot: the arrays are advanced in place by the next call. The
|
|
1503
|
+
// entries in them are never changed once made.
|
|
1504
|
+
const held = new Map();
|
|
1505
|
+
for (const [id, list] of earlier)
|
|
1506
|
+
held.set(id, [...list]);
|
|
1507
|
+
return {
|
|
1508
|
+
latest: resolved,
|
|
1509
|
+
async heldBeforeAnEdit(id, message) {
|
|
1510
|
+
for (const entry of held.get(id) ?? []) {
|
|
1511
|
+
const content = entry.spill
|
|
1512
|
+
? JSON.parse(await log.readSpill(entry.spill))
|
|
1513
|
+
: entry.content;
|
|
1514
|
+
if (sameStoredContent(content, message))
|
|
1515
|
+
return true;
|
|
1516
|
+
}
|
|
1517
|
+
return false;
|
|
1518
|
+
},
|
|
1519
|
+
};
|
|
1344
1520
|
},
|
|
1345
1521
|
});
|
|
1346
1522
|
}
|