@corenel/harness 0.12.0 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/audit/recorder.d.ts +6 -1
- package/dist/audit/recorder.d.ts.map +1 -1
- package/dist/audit/recorder.js +9 -2
- package/dist/audit/recorder.js.map +1 -1
- package/dist/audit/runAudit.d.ts.map +1 -1
- package/dist/audit/runAudit.js +2 -0
- package/dist/audit/runAudit.js.map +1 -1
- package/dist/conversation.d.ts +33 -0
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +44 -1
- package/dist/conversation.js.map +1 -1
- package/dist/core/compactHistory.d.ts +27 -18
- package/dist/core/compactHistory.d.ts.map +1 -1
- package/dist/core/compactHistory.js +106 -40
- package/dist/core/compactHistory.js.map +1 -1
- package/dist/core/fileChanges.d.ts +18 -0
- package/dist/core/fileChanges.d.ts.map +1 -0
- package/dist/core/fileChanges.js +85 -0
- package/dist/core/fileChanges.js.map +1 -0
- package/dist/core/foldBlocks.d.ts +43 -0
- package/dist/core/foldBlocks.d.ts.map +1 -0
- package/dist/core/foldBlocks.js +114 -0
- package/dist/core/foldBlocks.js.map +1 -0
- package/dist/core/foldTypes.d.ts +25 -0
- package/dist/core/foldTypes.d.ts.map +1 -0
- package/dist/core/foldTypes.js +2 -0
- package/dist/core/foldTypes.js.map +1 -0
- package/dist/core/loop.d.ts +29 -5
- package/dist/core/loop.d.ts.map +1 -1
- package/dist/core/loop.js +166 -70
- package/dist/core/loop.js.map +1 -1
- package/dist/core/recovery.d.ts +1 -0
- package/dist/core/recovery.d.ts.map +1 -1
- package/dist/core/recovery.js +12 -0
- package/dist/core/recovery.js.map +1 -1
- package/dist/core/spawn.d.ts +4 -0
- package/dist/core/spawn.d.ts.map +1 -1
- package/dist/core/spawn.js +11 -4
- package/dist/core/spawn.js.map +1 -1
- package/dist/core/summarize.d.ts +9 -3
- package/dist/core/summarize.d.ts.map +1 -1
- package/dist/core/summarize.js +97 -42
- package/dist/core/summarize.js.map +1 -1
- package/dist/dag/executeNode.d.ts +5 -0
- package/dist/dag/executeNode.d.ts.map +1 -1
- package/dist/dag/executeNode.js +5 -1
- package/dist/dag/executeNode.js.map +1 -1
- package/dist/guardrail/permission-service.d.ts.map +1 -1
- package/dist/guardrail/permission-service.js +11 -2
- package/dist/guardrail/permission-service.js.map +1 -1
- package/dist/guardrail/serialize.d.ts.map +1 -1
- package/dist/guardrail/serialize.js +4 -0
- package/dist/guardrail/serialize.js.map +1 -1
- package/dist/guardrail/validate.d.ts.map +1 -1
- package/dist/guardrail/validate.js +3 -1
- package/dist/guardrail/validate.js.map +1 -1
- package/dist/orchestrator/record.d.ts +94 -5
- package/dist/orchestrator/record.d.ts.map +1 -1
- package/dist/orchestrator/record.js +186 -5
- package/dist/orchestrator/record.js.map +1 -1
- package/dist/orchestrator/sidecarTools.d.ts +5 -0
- package/dist/orchestrator/sidecarTools.d.ts.map +1 -1
- package/dist/orchestrator/sidecarTools.js +53 -15
- package/dist/orchestrator/sidecarTools.js.map +1 -1
- package/dist/prompts/library/defaults.generated.js +2 -2
- package/dist/prompts/library/defaults.generated.js.map +1 -1
- package/dist/sessions/directivesStore.d.ts +9 -0
- package/dist/sessions/directivesStore.d.ts.map +1 -0
- package/dist/sessions/directivesStore.js +54 -0
- package/dist/sessions/directivesStore.js.map +1 -0
- package/dist/sessions/fileSessionStore.d.ts +2 -2
- package/dist/sessions/fileSessionStore.d.ts.map +1 -1
- package/dist/sessions/fileSessionStore.js +19 -8
- package/dist/sessions/fileSessionStore.js.map +1 -1
- package/dist/sessions/foldStorage.d.ts +15 -0
- package/dist/sessions/foldStorage.d.ts.map +1 -0
- package/dist/sessions/foldStorage.js +121 -0
- package/dist/sessions/foldStorage.js.map +1 -0
- package/dist/sessions/jsonl.d.ts +6 -0
- package/dist/sessions/jsonl.d.ts.map +1 -1
- package/dist/sessions/jsonl.js +15 -1
- package/dist/sessions/jsonl.js.map +1 -1
- package/dist/sidecar/deviceKeys.d.ts +75 -0
- package/dist/sidecar/deviceKeys.d.ts.map +1 -0
- package/dist/sidecar/deviceKeys.js +142 -0
- package/dist/sidecar/deviceKeys.js.map +1 -0
- package/dist/sidecar/host.d.ts +144 -24
- package/dist/sidecar/host.d.ts.map +1 -1
- package/dist/sidecar/host.js +306 -16
- package/dist/sidecar/host.js.map +1 -1
- package/dist/sidecar/identity.d.ts +41 -17
- package/dist/sidecar/identity.d.ts.map +1 -1
- package/dist/sidecar/identity.js +10 -21
- package/dist/sidecar/identity.js.map +1 -1
- package/dist/sidecar/server.d.ts +197 -28
- package/dist/sidecar/server.d.ts.map +1 -1
- package/dist/sidecar/server.js +701 -110
- package/dist/sidecar/server.js.map +1 -1
- package/dist/sidecar/testing.d.ts +97 -0
- package/dist/sidecar/testing.d.ts.map +1 -0
- package/dist/sidecar/testing.js +259 -0
- package/dist/sidecar/testing.js.map +1 -0
- package/dist/sidecar/wsChannel.d.ts +8 -1
- package/dist/sidecar/wsChannel.d.ts.map +1 -1
- package/dist/sidecar/wsChannel.js +17 -1
- package/dist/sidecar/wsChannel.js.map +1 -1
- package/dist/tools/callAgent.d.ts.map +1 -1
- package/dist/tools/callAgent.js +33 -13
- package/dist/tools/callAgent.js.map +1 -1
- package/dist/tools/foldTools.d.ts +5 -0
- package/dist/tools/foldTools.d.ts.map +1 -0
- package/dist/tools/foldTools.js +123 -0
- package/dist/tools/foldTools.js.map +1 -0
- package/dist/tools/orchestration.js +1 -1
- package/dist/tools/orchestration.js.map +1 -1
- package/dist/tools/skillTool.d.ts.map +1 -1
- package/dist/tools/skillTool.js +7 -2
- package/dist/tools/skillTool.js.map +1 -1
- package/package.json +2 -2
package/dist/audit/recorder.d.ts
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
|
-
import type { AgentEvent, AuditDraft, AuditHost, DecisionEvent, NodeEvent } from '@corenel/protocol';
|
|
1
|
+
import type { AgentEvent, AuditDraft, AuditHost, DecisionEvent, NodeEvent, RunOrigin } from '@corenel/protocol';
|
|
2
2
|
export interface AuditRunContext {
|
|
3
3
|
host: AuditHost;
|
|
4
4
|
session?: string;
|
|
5
5
|
run?: string;
|
|
6
6
|
agent?: string;
|
|
7
7
|
model?: string;
|
|
8
|
+
/** The VERIFIED user id that started the run. Stamped on every line, so a
|
|
9
|
+
* callee's lines carry the root's requester (they share this recorder). */
|
|
10
|
+
requester?: string;
|
|
11
|
+
/** Why the run exists. Stamped on every line, like `requester`. */
|
|
12
|
+
origin?: RunOrigin;
|
|
8
13
|
}
|
|
9
14
|
export interface AuditRecorder {
|
|
10
15
|
onEvent(e: AgentEvent): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recorder.d.ts","sourceRoot":"","sources":["../../audit/recorder.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"recorder.d.ts","sourceRoot":"","sources":["../../audit/recorder.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAIhH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAChF;+EAC2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;AACD,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC7B,WAAW,CAAC,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAChC,UAAU,CAAC,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IACnC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B;;;oBAGgB;IAChB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AA0CD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACxC,GAAG,EAAE,eAAe,CAAC;IACrB,IAAI,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,MAAM,CAAA;KAAE,CAAC;IAClD,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3C,GAAG,aAAa,CA6IhB"}
|
package/dist/audit/recorder.js
CHANGED
|
@@ -20,7 +20,13 @@ export function createAuditRecorder(opts) {
|
|
|
20
20
|
const ids = opts.ids ?? { trace: newTraceId, span: newSpanId };
|
|
21
21
|
const hash = opts.hash ?? argsHash;
|
|
22
22
|
const trace = ids.trace();
|
|
23
|
-
const base = {
|
|
23
|
+
const base = {
|
|
24
|
+
v: 1, trace, host: opts.ctx.host,
|
|
25
|
+
...(opts.ctx.session ? { session: opts.ctx.session } : {}),
|
|
26
|
+
...(opts.ctx.run ? { run: opts.ctx.run } : {}),
|
|
27
|
+
...(opts.ctx.requester ? { requester: opts.ctx.requester } : {}),
|
|
28
|
+
...(opts.ctx.origin ? { origin: opts.ctx.origin } : {}),
|
|
29
|
+
};
|
|
24
30
|
const iso = () => new Date(now()).toISOString();
|
|
25
31
|
/** Never let a caller-supplied `emit` break the recorder: a throw is
|
|
26
32
|
* caught and swallowed on the spot, per call -- there is no retry or
|
|
@@ -164,7 +170,8 @@ export function createAuditRecorder(opts) {
|
|
|
164
170
|
const f = (e.nodeId ? children.get(e.nodeId) : undefined) ?? root;
|
|
165
171
|
safeEmit(draft(f, { span: ids.span(), parent: f.span, kind: 'permission', phase: 'point',
|
|
166
172
|
'gen_ai.tool.name': e.subject.name, level: e.level, decision: e.decision,
|
|
167
|
-
decidedBy: e.by, ...(e.policy ? { policy: e.policy } : {})
|
|
173
|
+
decidedBy: e.by, ...(e.policy ? { policy: e.policy } : {}),
|
|
174
|
+
...(e.answeredBy ? { answeredBy: e.answeredBy } : {}) }));
|
|
168
175
|
});
|
|
169
176
|
},
|
|
170
177
|
finish(outcome) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recorder.js","sourceRoot":"","sources":["../../audit/recorder.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"recorder.js","sourceRoot":"","sources":["../../audit/recorder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runAudit.d.ts","sourceRoot":"","sources":["../../audit/runAudit.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAc,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACzG,OAAO,EAA2C,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAC3F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEtC;;qDAEqD;AACrD,MAAM,WAAW,eAAe;IAC9B,kFAAkF;IAClF,MAAM,CAAC,GAAG,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAC5D,QAAQ,IAAI,aAAa,CAAC;CAC3B;AAED;yBACyB;AACzB,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAE1C,iFAAiF;AACjF,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC,UAAU,EAAE;IAAE,IAAI,EAAE,kBAAkB,CAAA;CAAE,CAAC,CAAC;AAErF,MAAM,WAAW,QAAQ;IACvB,OAAO,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC7B,WAAW,CAAC,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAChC,UAAU,CAAC,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IACnC;;6EAEyE;IACzE,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC;CAC/D;AAuCD;;;;+DAI+D;AAC/D,wBAAgB,aAAa,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,EAAE,GAAG,EAAE,eAAe,GAAG;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,QAAQ,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"runAudit.d.ts","sourceRoot":"","sources":["../../audit/runAudit.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAc,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACzG,OAAO,EAA2C,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAC3F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEtC;;qDAEqD;AACrD,MAAM,WAAW,eAAe;IAC9B,kFAAkF;IAClF,MAAM,CAAC,GAAG,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAC5D,QAAQ,IAAI,aAAa,CAAC;CAC3B;AAED;yBACyB;AACzB,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAE1C,iFAAiF;AACjF,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC,UAAU,EAAE;IAAE,IAAI,EAAE,kBAAkB,CAAA;CAAE,CAAC,CAAC;AAErF,MAAM,WAAW,QAAQ;IACvB,OAAO,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC7B,WAAW,CAAC,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAChC,UAAU,CAAC,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IACnC;;6EAEyE;IACzE,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC;CAC/D;AAuCD;;;;+DAI+D;AAC/D,wBAAgB,aAAa,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,EAAE,GAAG,EAAE,eAAe,GAAG;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,QAAQ,GAAG,IAAI,CAiEnH"}
|
package/dist/audit/runAudit.js
CHANGED
|
@@ -53,6 +53,8 @@ export function startRunAudit(host, ctx) {
|
|
|
53
53
|
...(ctx.session ? { session: ctx.session } : {}),
|
|
54
54
|
...(ctx.agent ? { agent: ctx.agent } : {}),
|
|
55
55
|
...(ctx.model ? { model: ctx.model } : {}),
|
|
56
|
+
...(ctx.requester ? { requester: ctx.requester } : {}),
|
|
57
|
+
...(ctx.origin ? { origin: ctx.origin } : {}),
|
|
56
58
|
},
|
|
57
59
|
emit: (d) => {
|
|
58
60
|
if (state.released)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runAudit.js","sourceRoot":"","sources":["../../audit/runAudit.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"runAudit.js","sourceRoot":"","sources":["../../audit/runAudit.ts"],"names":[],"mappings":"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"}
|
package/dist/conversation.d.ts
CHANGED
|
@@ -29,6 +29,18 @@ export interface ConversationTurn {
|
|
|
29
29
|
* about the conversation in front of you, and because the file only exists
|
|
30
30
|
* for a run that had a session to write beside. Absent on every other turn. */
|
|
31
31
|
checkpoint?: string;
|
|
32
|
+
/** Set on a COMPACTION SEAM whose run returned: that run's message array as it
|
|
33
|
+
* stood when the run ended (system messages dropped) -- the folded head, the
|
|
34
|
+
* kept tail, and everything the run appended. Later sends start from the
|
|
35
|
+
* newest seam's view instead of the raw transcript; without it the fold was
|
|
36
|
+
* thrown away when the run returned and every later send re-folded the whole
|
|
37
|
+
* history. The raw turns stay in the transcript for the person and for recall.
|
|
38
|
+
* Absent on every other turn, and on a seam whose run threw. */
|
|
39
|
+
foldedView?: ChatCompletionMessageParam[];
|
|
40
|
+
/** Set beside `foldedView`: the id of the user turn whose run produced it.
|
|
41
|
+
* Turns at or before it are represented by the view and are not sent again;
|
|
42
|
+
* included turns after it are sent after the view. */
|
|
43
|
+
foldedThrough?: string;
|
|
32
44
|
/** What the turn's mutating tool calls OBSERVABLY changed, from the loop's
|
|
33
45
|
* `turn-verified` event. Runtime data shown beside the reply; absent when the
|
|
34
46
|
* turn made no mutating calls. */
|
|
@@ -49,6 +61,27 @@ export interface ConversationTurn {
|
|
|
49
61
|
* reports (a seam is an unsent note; counting it would inflate the very number
|
|
50
62
|
* the panel exists to give), and the runtime writes them. */
|
|
51
63
|
export declare function isCheckpointTurn(t: ConversationTurn): boolean;
|
|
64
|
+
/** Where a conversation's history is folded: the newest COMPACTION SEAM that
|
|
65
|
+
* carries a usable view, the index of the user turn that view was folded
|
|
66
|
+
* through, and the view itself. */
|
|
67
|
+
export interface FoldPoint {
|
|
68
|
+
seamIndex: number;
|
|
69
|
+
throughIndex: number;
|
|
70
|
+
view: ChatCompletionMessageParam[];
|
|
71
|
+
}
|
|
72
|
+
/** The fold point a send starts from, or null when the transcript goes raw.
|
|
73
|
+
*
|
|
74
|
+
* The newest seam with a view whose `foldedThrough` turn still exists. A view
|
|
75
|
+
* whose user turn is gone is skipped for the one before it: sent, it would
|
|
76
|
+
* stand for turns that are no longer there, with nothing after it. ONE rule,
|
|
77
|
+
* shared by the runtime that builds the request and every surface that reports
|
|
78
|
+
* or edits what the request carries, so the two cannot disagree. */
|
|
79
|
+
export declare function foldPoint(turns: ConversationTurn[]): FoldPoint | null;
|
|
80
|
+
/** Is the turn at `index` folded: represented by the view, and no longer sent
|
|
81
|
+
* on its own? True for every non-seam turn at or before the fold point's user
|
|
82
|
+
* turn. Including or dropping such a turn changes nothing that is sent. Pass a
|
|
83
|
+
* precomputed `fp` when asking about many turns; `null` means "no fold". */
|
|
84
|
+
export declare function isFoldedTurn(turns: ConversationTurn[], index: number, fp?: FoldPoint | null): boolean;
|
|
52
85
|
/**
|
|
53
86
|
* A stored session's `messages` as conversation turns.
|
|
54
87
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../conversation.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AACpF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,qFAAqF;AACrF,MAAM,WAAW,SAAS;IACxB;oEACgE;IAChE,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,iFAAiF;IACjF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;+EAC+E;AAC/E,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,0BAA0B,EAAE,CAAC;IACvC,4EAA4E;IAC5E,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;;;mFAI+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;sCAEkC;IAClC,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC;yEACqE;IACrE,eAAe,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC3D;AAED;;;;;;;6DAO6D;AAC7D,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAG7D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../conversation.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AACpF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,qFAAqF;AACrF,MAAM,WAAW,SAAS;IACxB;oEACgE;IAChE,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,iFAAiF;IACjF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;+EAC+E;AAC/E,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,0BAA0B,EAAE,CAAC;IACvC,4EAA4E;IAC5E,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;;;mFAI+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;oEAMgE;IAChE,UAAU,CAAC,EAAE,0BAA0B,EAAE,CAAC;IAC1C;;0DAEsD;IACtD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;sCAEkC;IAClC,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC;yEACqE;IACrE,eAAe,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC3D;AAED;;;;;;;6DAO6D;AAC7D,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAG7D;AAED;;mCAEmC;AACnC,MAAM,WAAW,SAAS;IAAG,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,0BAA0B,EAAE,CAAA;CAAE;AAE1G;;;;;;oEAMoE;AACpE,wBAAgB,SAAS,CAAC,KAAK,EAAE,gBAAgB,EAAE,GAAG,SAAS,GAAG,IAAI,CASrE;AAED;;;4EAG4E;AAC5E,wBAAgB,YAAY,CAAC,KAAK,EAAE,gBAAgB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,SAAS,GAAG,IAAI,GAAG,OAAO,CAKrG;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,EAAE,CA+BzE"}
|
package/dist/conversation.js
CHANGED
|
@@ -11,6 +11,36 @@ export function isCheckpointTurn(t) {
|
|
|
11
11
|
const first = t.messages[0];
|
|
12
12
|
return typeof first?.content === 'string' && first.content.startsWith(CHECKPOINT_MARKER);
|
|
13
13
|
}
|
|
14
|
+
/** The fold point a send starts from, or null when the transcript goes raw.
|
|
15
|
+
*
|
|
16
|
+
* The newest seam with a view whose `foldedThrough` turn still exists. A view
|
|
17
|
+
* whose user turn is gone is skipped for the one before it: sent, it would
|
|
18
|
+
* stand for turns that are no longer there, with nothing after it. ONE rule,
|
|
19
|
+
* shared by the runtime that builds the request and every surface that reports
|
|
20
|
+
* or edits what the request carries, so the two cannot disagree. */
|
|
21
|
+
export function foldPoint(turns) {
|
|
22
|
+
for (let i = turns.length - 1; i >= 0; i--) {
|
|
23
|
+
const view = turns[i].foldedView;
|
|
24
|
+
if (!view)
|
|
25
|
+
continue;
|
|
26
|
+
const through = turns.findIndex((t) => t.id === turns[i].foldedThrough);
|
|
27
|
+
if (through < 0)
|
|
28
|
+
continue;
|
|
29
|
+
return { seamIndex: i, throughIndex: through, view };
|
|
30
|
+
}
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
/** Is the turn at `index` folded: represented by the view, and no longer sent
|
|
34
|
+
* on its own? True for every non-seam turn at or before the fold point's user
|
|
35
|
+
* turn. Including or dropping such a turn changes nothing that is sent. Pass a
|
|
36
|
+
* precomputed `fp` when asking about many turns; `null` means "no fold". */
|
|
37
|
+
export function isFoldedTurn(turns, index, fp) {
|
|
38
|
+
const point = fp === undefined ? foldPoint(turns) : fp;
|
|
39
|
+
if (!point || index < 0 || index > point.throughIndex)
|
|
40
|
+
return false;
|
|
41
|
+
const t = turns[index];
|
|
42
|
+
return !!t && !isCheckpointTurn(t);
|
|
43
|
+
}
|
|
14
44
|
/**
|
|
15
45
|
* A stored session's `messages` as conversation turns.
|
|
16
46
|
*
|
|
@@ -29,6 +59,19 @@ export function turnsFromSessionMessages(raw) {
|
|
|
29
59
|
if (items.every((m) => Array.isArray(m.messages)))
|
|
30
60
|
return items;
|
|
31
61
|
const turns = [];
|
|
62
|
+
/* A MIXED list -- a browser save of a flat chat keeps the synthetic ids it
|
|
63
|
+
* read (`stored-0`, `stored-2`), then a daemon appends flat messages -- can
|
|
64
|
+
* put a new flat turn at an index whose `stored-<i>` a nested turn already
|
|
65
|
+
* holds. Two turns with one id is how a merge by id loses one, so a taken id
|
|
66
|
+
* gets a deterministic suffix: the same list always reads back the same. */
|
|
67
|
+
const taken = new Set(items.filter((m) => Array.isArray(m.messages)).map((m) => String(m.id)));
|
|
68
|
+
const freeId = (base) => {
|
|
69
|
+
let id = base;
|
|
70
|
+
for (let n = 1; taken.has(id); n++)
|
|
71
|
+
id = `${base}-${n}`;
|
|
72
|
+
taken.add(id);
|
|
73
|
+
return id;
|
|
74
|
+
};
|
|
32
75
|
let current = null;
|
|
33
76
|
items.forEach((m, i) => {
|
|
34
77
|
if (Array.isArray(m.messages)) {
|
|
@@ -37,7 +80,7 @@ export function turnsFromSessionMessages(raw) {
|
|
|
37
80
|
return;
|
|
38
81
|
}
|
|
39
82
|
if (!current || m.role === 'user') {
|
|
40
|
-
current = { id: `stored-${i}
|
|
83
|
+
current = { id: freeId(`stored-${i}`), included: true, messages: [] };
|
|
41
84
|
turns.push(current);
|
|
42
85
|
}
|
|
43
86
|
current.messages.push(m);
|
package/dist/conversation.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation.js","sourceRoot":"","sources":["../conversation.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"conversation.js","sourceRoot":"","sources":["../conversation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,31 +1,38 @@
|
|
|
1
1
|
import type { ChatCompletionMessageParam } from 'openai/resources/chat/completions';
|
|
2
|
+
import { type FoldSummary } from './foldBlocks';
|
|
3
|
+
export { CHECKPOINT_MARKER, ANCHOR_MARKER } from './foldBlocks';
|
|
2
4
|
export interface CompactHistoryOptions {
|
|
3
5
|
/** Summarizes the collapsed stretch. Injected so the partitioning is testable
|
|
4
6
|
* without a model call. */
|
|
5
|
-
summarize: (collapsed: ChatCompletionMessageParam[]) => Promise<
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
summarize: (collapsed: ChatCompletionMessageParam[]) => Promise<FoldSummary>;
|
|
8
|
+
contextWindow: number;
|
|
9
|
+
/** DIRECTIVES.md content when the host has one; wins over the in-context block. */
|
|
10
|
+
directivesOverride?: string[] | null;
|
|
11
|
+
/** Whether recall_history exists, so the fold notice may name it. */
|
|
12
|
+
recallAvailable?: boolean;
|
|
10
13
|
/** Byte size past which a user message's own content is offloaded rather than
|
|
11
14
|
* kept inline. Requires `offload`. */
|
|
12
15
|
offloadOverBytes?: number;
|
|
13
16
|
/** Records oversized user content and returns the pointer to leave in its
|
|
14
17
|
* place — the same treatment rung 1 gives an oversized tool result. */
|
|
15
18
|
offload?: (content: string) => Promise<string>;
|
|
19
|
+
now?: () => Date;
|
|
16
20
|
}
|
|
17
21
|
export interface CompactHistoryResult {
|
|
18
22
|
/** The rebuilt message array to send from here on. */
|
|
19
23
|
messages: ChatCompletionMessageParam[];
|
|
20
|
-
/**
|
|
21
|
-
|
|
24
|
+
/** This fold's own summary (one entry), for CHECKPOINT.md and the event. */
|
|
25
|
+
summary: string;
|
|
26
|
+
/** The full merged directive list now in context, for DIRECTIVES.md. */
|
|
27
|
+
directives: string[];
|
|
28
|
+
/** The raw messages handed to the summarizer (older users and every folded
|
|
29
|
+
* non-user message, never this module's own blocks), for ARCHIVE.jsonl. */
|
|
30
|
+
collapsed: ChatCompletionMessageParam[];
|
|
31
|
+
/** How many conversation messages the fold removed: the collapsed ones. Not
|
|
32
|
+
* input length minus output length, which goes negative whenever the blocks
|
|
33
|
+
* a fold writes back outnumber what it removed. */
|
|
34
|
+
collapsedCount: number;
|
|
22
35
|
}
|
|
23
|
-
/** The marker every checkpoint message starts with, so a later pass can
|
|
24
|
-
* recognize one it already wrote instead of collapsing it again. */
|
|
25
|
-
export declare const CHECKPOINT_MARKER = "[checkpoint] ";
|
|
26
|
-
/** The marker every anchor message starts with. An anchor is context ABOUT the
|
|
27
|
-
* user message that follows it, not something the assistant said. */
|
|
28
|
-
export declare const ANCHOR_MARKER = "[anchor] ";
|
|
29
36
|
/** Window fill ratio at which history compaction becomes worth its cost.
|
|
30
37
|
* High on purpose: see the one-shot reasoning at the top of this file. */
|
|
31
38
|
export declare const COMPACT_AT_FILL = 0.86;
|
|
@@ -33,7 +40,7 @@ export declare const COMPACT_AT_FILL = 0.86;
|
|
|
33
40
|
* window is genuinely close to full, AND there is bulk to remove. A compaction
|
|
34
41
|
* that reduces nothing still invalidates the whole prefix, so "nothing to
|
|
35
42
|
* collapse" is a refusal, not a no-op. */
|
|
36
|
-
export declare function shouldCompact(fill: number, messages: ChatCompletionMessageParam[]): boolean;
|
|
43
|
+
export declare function shouldCompact(fill: number, messages: ChatCompletionMessageParam[], contextWindow?: number): boolean;
|
|
37
44
|
/** Fill must fall back below this before compaction re-arms. */
|
|
38
45
|
export declare const REARM_BELOW_FILL = 0.6;
|
|
39
46
|
/** How much the window must refill, ABOVE where the last compaction left it,
|
|
@@ -66,19 +73,21 @@ export declare function afterCompaction(): CompactGate;
|
|
|
66
73
|
* here. That is the right direction to be wrong in, since the cost of reading
|
|
67
74
|
* high is a compaction nobody needed. */
|
|
68
75
|
export declare function estimateFill(messages: ChatCompletionMessageParam[], contextWindow: number | undefined): number;
|
|
69
|
-
|
|
76
|
+
/** The token estimate `estimateFill` divides by the window: what a caller
|
|
77
|
+
* measuring the same messages against several windows computes once. */
|
|
78
|
+
export declare function estimateTokens(messages: ChatCompletionMessageParam[]): number;
|
|
79
|
+
export declare function compactionDecision(fill: number, messages: ChatCompletionMessageParam[], gate: CompactGate, contextWindow?: number): {
|
|
70
80
|
compact: boolean;
|
|
71
81
|
next: CompactGate;
|
|
72
82
|
};
|
|
73
|
-
export declare function compactHistory(messages: ChatCompletionMessageParam[], opts: CompactHistoryOptions): Promise<CompactHistoryResult>;
|
|
83
|
+
export declare function compactHistory(messages: ChatCompletionMessageParam[], opts: CompactHistoryOptions): Promise<CompactHistoryResult | null>;
|
|
74
84
|
/** An anchor or checkpoint a compaction wrote — bookkeeping ABOUT the
|
|
75
85
|
* conversation rather than part of it. Exported because a caller that has to
|
|
76
86
|
* tell "what this run added" from "what a rewrite inserted" cannot do it by
|
|
77
87
|
* position: a rewrite puts fresh objects into the array at arbitrary places. */
|
|
78
88
|
export declare const isCompactionMarker: typeof isOwnMarker;
|
|
79
|
-
/** An anchor or
|
|
89
|
+
/** An anchor, checkpoint or directives block this module wrote on an earlier pass. Dropped and
|
|
80
90
|
* rewritten each time rather than accumulated: the newest checkpoint already
|
|
81
91
|
* subsumes what the older ones recorded. */
|
|
82
92
|
declare function isOwnMarker(m: ChatCompletionMessageParam): boolean;
|
|
83
|
-
export {};
|
|
84
93
|
//# sourceMappingURL=compactHistory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compactHistory.d.ts","sourceRoot":"","sources":["../../core/compactHistory.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"compactHistory.d.ts","sourceRoot":"","sources":["../../core/compactHistory.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAEpF,OAAO,EAGuC,KAAK,WAAW,EAC7D,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAEhE,MAAM,WAAW,qBAAqB;IACpC;+BAC2B;IAC3B,SAAS,EAAE,CAAC,SAAS,EAAE,0BAA0B,EAAE,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7E,aAAa,EAAE,MAAM,CAAC;IACtB,mFAAmF;IACnF,kBAAkB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACrC,qEAAqE;IACrE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;0CACsC;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;2EACuE;IACvE,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/C,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,sDAAsD;IACtD,QAAQ,EAAE,0BAA0B,EAAE,CAAC;IACvC,4EAA4E;IAC5E,OAAO,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB;+EAC2E;IAC3E,SAAS,EAAE,0BAA0B,EAAE,CAAC;IACxC;;uDAEmD;IACnD,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;0EAC0E;AAC1E,eAAO,MAAM,eAAe,OAAO,CAAC;AAqBpC;;;0CAG0C;AAC1C,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,0BAA0B,EAAE,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAOnH;AAED,gEAAgE;AAChE,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC;kDACkD;AAClD,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAErC;;;;;;;wEAOwE;AACxE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED;qEACqE;AACrE,wBAAgB,eAAe,IAAI,WAAW,CAE7C;AAyBD;;;;;;;;;;yCAUyC;AACzC,wBAAgB,YAAY,CAAC,QAAQ,EAAE,0BAA0B,EAAE,EAAE,aAAa,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAG9G;AAED;wEACwE;AACxE,wBAAgB,cAAc,CAAC,QAAQ,EAAE,0BAA0B,EAAE,GAAG,MAAM,CAI7E;AA+BD,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,0BAA0B,EAAE,EACtC,IAAI,EAAE,WAAW,EACjB,aAAa,CAAC,EAAE,MAAM,GACrB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,WAAW,CAAA;CAAE,CAQzC;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,0BAA0B,EAAE,EACtC,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CA8EtC;AAeD;;;gFAGgF;AAChF,eAAO,MAAM,kBAAkB,oBAAc,CAAC;AAY9C;;4CAE4C;AAC5C,iBAAS,WAAW,CAAC,CAAC,EAAE,0BAA0B,GAAG,OAAO,CAK3D"}
|
|
@@ -10,23 +10,44 @@
|
|
|
10
10
|
* trims a little each turn therefore pays full reprocessing every turn and saves
|
|
11
11
|
* almost nothing. One shot, high threshold, large payoff. */
|
|
12
12
|
import { isContextNote } from './contextPressure.js';
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
export const CHECKPOINT_MARKER = '[checkpoint] ';
|
|
16
|
-
/** The marker every anchor message starts with. An anchor is context ABOUT the
|
|
17
|
-
* user message that follows it, not something the assistant said. */
|
|
18
|
-
export const ANCHOR_MARKER = '[anchor] ';
|
|
13
|
+
import { CHECKPOINT_MARKER, ANCHOR_MARKER, DIRECTIVES_MARKER, DIRECTIVES_SHARE, SUMMARY_SHARE, USER_TAIL_SHARE, shareChars, mergeDirectives, renderDirectivesBlock, parseDirectivesBlock, renderSummaryBlock, parseSummaryBlock, trimEntries, anchorText, } from './foldBlocks.js';
|
|
14
|
+
export { CHECKPOINT_MARKER, ANCHOR_MARKER } from './foldBlocks.js';
|
|
19
15
|
/** Window fill ratio at which history compaction becomes worth its cost.
|
|
20
16
|
* High on purpose: see the one-shot reasoning at the top of this file. */
|
|
21
17
|
export const COMPACT_AT_FILL = 0.86;
|
|
18
|
+
/** Indices (into `convo`) of the user messages kept verbatim: newest first,
|
|
19
|
+
* while they fit the budget; the newest is always kept. */
|
|
20
|
+
function keptUserTail(convo, budgetChars) {
|
|
21
|
+
const kept = new Set();
|
|
22
|
+
let used = 0;
|
|
23
|
+
for (let i = convo.length - 1; i >= 0; i--) {
|
|
24
|
+
if (convo[i].role !== 'user')
|
|
25
|
+
continue;
|
|
26
|
+
const size = messageChars(convo[i]);
|
|
27
|
+
if (kept.size > 0 && used + size > budgetChars)
|
|
28
|
+
break;
|
|
29
|
+
kept.add(i);
|
|
30
|
+
used += size;
|
|
31
|
+
}
|
|
32
|
+
return kept;
|
|
33
|
+
}
|
|
34
|
+
function conversational(m) {
|
|
35
|
+
return m.role !== 'system' && !isOwnMarker(m) && !isContextNote(m);
|
|
36
|
+
}
|
|
22
37
|
/** Whether compacting now is worth rewriting the cached prefix. Two gates: the
|
|
23
38
|
* window is genuinely close to full, AND there is bulk to remove. A compaction
|
|
24
39
|
* that reduces nothing still invalidates the whole prefix, so "nothing to
|
|
25
40
|
* collapse" is a refusal, not a no-op. */
|
|
26
|
-
export function shouldCompact(fill, messages) {
|
|
41
|
+
export function shouldCompact(fill, messages, contextWindow) {
|
|
27
42
|
if (fill < COMPACT_AT_FILL)
|
|
28
43
|
return false;
|
|
29
|
-
|
|
44
|
+
const convo = messages.filter(conversational);
|
|
45
|
+
if (convo.some((m) => m.role !== 'user'))
|
|
46
|
+
return true;
|
|
47
|
+
if (!contextWindow)
|
|
48
|
+
return false;
|
|
49
|
+
const users = convo.filter((m) => m.role === 'user');
|
|
50
|
+
return keptUserTail(convo, shareChars(USER_TAIL_SHARE, contextWindow)).size < users.length;
|
|
30
51
|
}
|
|
31
52
|
/** Fill must fall back below this before compaction re-arms. */
|
|
32
53
|
export const REARM_BELOW_FILL = 0.6;
|
|
@@ -77,10 +98,15 @@ function messageChars(m) {
|
|
|
77
98
|
export function estimateFill(messages, contextWindow) {
|
|
78
99
|
if (!contextWindow || contextWindow <= 0)
|
|
79
100
|
return 0;
|
|
101
|
+
return Math.min(1, estimateTokens(messages) / contextWindow);
|
|
102
|
+
}
|
|
103
|
+
/** The token estimate `estimateFill` divides by the window: what a caller
|
|
104
|
+
* measuring the same messages against several windows computes once. */
|
|
105
|
+
export function estimateTokens(messages) {
|
|
80
106
|
let chars = 0;
|
|
81
107
|
for (const m of messages)
|
|
82
108
|
chars += messageChars(m);
|
|
83
|
-
return
|
|
109
|
+
return chars / 4;
|
|
84
110
|
}
|
|
85
111
|
/* The gate, with hysteresis.
|
|
86
112
|
*
|
|
@@ -95,9 +121,9 @@ export function estimateFill(messages, contextWindow) {
|
|
|
95
121
|
*
|
|
96
122
|
* RE-ARMING ON PROGRESS, NOT ON A MARK. The first version re-armed only below
|
|
97
123
|
* REARM_BELOW_FILL, which assumed a compaction always drains past that mark.
|
|
98
|
-
* Nothing guarantees it:
|
|
99
|
-
*
|
|
100
|
-
* conversation with large pastes that
|
|
124
|
+
* Nothing guarantees it: the kept user tail is size-budgeted, but a fold's floor
|
|
125
|
+
* is still system + that tail + directives + the summary, and in a long
|
|
126
|
+
* conversation with large pastes that can clear 0.6. Landing anywhere in
|
|
101
127
|
* [0.6, 0.86) left the latch stuck SHUT FOREVER -- fill only grows from there,
|
|
102
128
|
* so it could never fall back under the mark, and the run compacted exactly
|
|
103
129
|
* once before marching into the wall it was supposed to prevent. Silently: a
|
|
@@ -111,13 +137,13 @@ export function estimateFill(messages, contextWindow) {
|
|
|
111
137
|
* the gate still does nothing -- which remains the right answer, because a
|
|
112
138
|
* second compaction so soon has almost nothing left to remove and would charge
|
|
113
139
|
* a full prefix rewrite to discover that. */
|
|
114
|
-
export function compactionDecision(fill, messages, gate) {
|
|
140
|
+
export function compactionDecision(fill, messages, gate, contextWindow) {
|
|
115
141
|
if (!gate.armed) {
|
|
116
142
|
const drained = fill < REARM_BELOW_FILL;
|
|
117
143
|
const regrown = gate.floor !== null && fill >= gate.floor + REARM_ON_REGROWTH;
|
|
118
144
|
return { compact: false, next: { ...gate, armed: drained || regrown } };
|
|
119
145
|
}
|
|
120
|
-
if (!shouldCompact(fill, messages))
|
|
146
|
+
if (!shouldCompact(fill, messages, contextWindow))
|
|
121
147
|
return { compact: false, next: gate };
|
|
122
148
|
return { compact: true, next: afterCompaction() };
|
|
123
149
|
}
|
|
@@ -129,42 +155,80 @@ export async function compactHistory(messages, opts) {
|
|
|
129
155
|
const tail = messages.length ? messages[messages.length - 1] : undefined;
|
|
130
156
|
const pending = tail && isUnansweredToolCall(tail) ? tail : null;
|
|
131
157
|
const body = pending ? messages.slice(0, -1) : messages;
|
|
158
|
+
const w = opts.contextWindow;
|
|
132
159
|
const system = body.filter((m) => m.role === 'system');
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
* and letting it into the summarizer's input would write it into the
|
|
136
|
-
* checkpoint as though it were something that happened in the conversation.
|
|
137
|
-
* The agent gets a fresh one on the next crossing if it earns it. */
|
|
138
|
-
const collapsed = body.filter((m) => m.role !== 'system' && m.role !== 'user' && !isContextNote(m));
|
|
139
|
-
const kept = [];
|
|
140
|
-
let answered = null;
|
|
160
|
+
let prevDirectives = [];
|
|
161
|
+
let prevSummary = { folds: 0, entries: [] };
|
|
141
162
|
for (const m of body) {
|
|
142
|
-
|
|
143
|
-
* things to re-anchor. An anchor is an assistant message with string
|
|
144
|
-
* content, so a naive walk picks up the previous compaction's anchors and
|
|
145
|
-
* anchors those — a real run produced
|
|
146
|
-
* "[anchor] answering: [anchor] answering: [anchor] answering: ...".
|
|
147
|
-
* These are bookkeeping about the conversation, not part of it. */
|
|
148
|
-
if (isOwnMarker(m) || isContextNote(m))
|
|
163
|
+
if (m.role !== 'assistant' || typeof m.content !== 'string')
|
|
149
164
|
continue;
|
|
150
|
-
|
|
151
|
-
|
|
165
|
+
const d = parseDirectivesBlock(m.content);
|
|
166
|
+
if (d) {
|
|
167
|
+
prevDirectives = d;
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
if (m.content.startsWith(CHECKPOINT_MARKER))
|
|
171
|
+
prevSummary = parseSummaryBlock(m.content) ?? prevSummary;
|
|
172
|
+
}
|
|
173
|
+
/* Our own blocks and stale pressure notices are not part of the conversation:
|
|
174
|
+
* the summary block is carried forward verbatim (never re-summarized), and a
|
|
175
|
+
* pressure notice is a fact about the window this fold is emptying. */
|
|
176
|
+
const convo = body.filter(conversational);
|
|
177
|
+
const kept = keptUserTail(convo, shareChars(USER_TAIL_SHARE, w));
|
|
178
|
+
const collapsed = convo.filter((m, i) => !(m.role === 'user' && kept.has(i)));
|
|
179
|
+
/* Nothing to collapse (e.g. one huge newest user message): a fold would only
|
|
180
|
+
* invent a summary and rewrite the cached prefix for no gain. */
|
|
181
|
+
if (!collapsed.length)
|
|
182
|
+
return null;
|
|
183
|
+
const folded = await opts.summarize(collapsed);
|
|
184
|
+
const base = opts.directivesOverride ?? prevDirectives;
|
|
185
|
+
const directives = mergeDirectives(base, folded.directives, shareChars(DIRECTIVES_SHARE, w));
|
|
186
|
+
const at = (opts.now ?? (() => new Date()))().toISOString();
|
|
187
|
+
const folds = prevSummary.folds + 1;
|
|
188
|
+
const recall = !!opts.recallAvailable;
|
|
189
|
+
/* The share bounds the whole rendered block, so the fixed head and notice come off the budget first. */
|
|
190
|
+
const overhead = renderSummaryBlock({ folds, entries: [] }, { recall }).length;
|
|
191
|
+
const entries = trimEntries([...prevSummary.entries, { at, body: folded.summary }], Math.max(0, shareChars(SUMMARY_SHARE, w) - overhead));
|
|
192
|
+
const summaryBlock = renderSummaryBlock({ folds, entries }, { recall });
|
|
193
|
+
const tailOut = [];
|
|
194
|
+
let answered = null;
|
|
195
|
+
for (let i = 0; i < convo.length; i++) {
|
|
196
|
+
const m = convo[i];
|
|
197
|
+
if (m.role === 'assistant' && typeof m.content === 'string' && m.content.trim()) {
|
|
198
|
+
answered = m.content;
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
152
201
|
if (m.role !== 'user')
|
|
153
202
|
continue;
|
|
154
|
-
|
|
155
|
-
|
|
203
|
+
const replyTo = answered;
|
|
204
|
+
answered = null;
|
|
205
|
+
if (!kept.has(i))
|
|
206
|
+
continue;
|
|
207
|
+
const a = anchorText(replyTo);
|
|
208
|
+
if (a)
|
|
209
|
+
tailOut.push({ role: 'assistant', content: `${ANCHOR_MARKER}${a}` });
|
|
210
|
+
else if (replyTo === null) {
|
|
211
|
+
/* The answered turn may have been folded away by an earlier fold, which
|
|
212
|
+
* left its anchor directly in front of this user. Carry it as-is. */
|
|
213
|
+
const prev = body[body.indexOf(m) - 1];
|
|
214
|
+
if (prev && prev.role === 'assistant' && typeof prev.content === 'string' && prev.content.startsWith(ANCHOR_MARKER)) {
|
|
215
|
+
tailOut.push({ role: 'assistant', content: prev.content });
|
|
216
|
+
}
|
|
156
217
|
}
|
|
157
|
-
|
|
218
|
+
tailOut.push(await offloadIfOversized(m, opts));
|
|
158
219
|
}
|
|
159
|
-
const summary = await opts.summarize(collapsed);
|
|
160
220
|
return {
|
|
161
221
|
messages: [
|
|
162
222
|
...system,
|
|
163
|
-
{ role: 'assistant', content:
|
|
164
|
-
|
|
223
|
+
...(directives.length ? [{ role: 'assistant', content: renderDirectivesBlock(directives) }] : []),
|
|
224
|
+
{ role: 'assistant', content: summaryBlock },
|
|
225
|
+
...tailOut,
|
|
165
226
|
...(pending ? [pending] : []),
|
|
166
227
|
],
|
|
167
|
-
|
|
228
|
+
summary: folded.summary,
|
|
229
|
+
directives,
|
|
230
|
+
collapsed,
|
|
231
|
+
collapsedCount: collapsed.length,
|
|
168
232
|
};
|
|
169
233
|
}
|
|
170
234
|
/** A user turn's DECISION text is small and stays verbatim; a pasted log is
|
|
@@ -192,13 +256,15 @@ export const isCompactionMarker = isOwnMarker;
|
|
|
192
256
|
* conflating them silently truncates every `appended` count taken after a
|
|
193
257
|
* notice fired, and the host then persists a partial tail. One predicate, two
|
|
194
258
|
* very different jobs -- loop.contextPressure.test.ts pins the difference. */
|
|
195
|
-
/** An anchor or
|
|
259
|
+
/** An anchor, checkpoint or directives block this module wrote on an earlier pass. Dropped and
|
|
196
260
|
* rewritten each time rather than accumulated: the newest checkpoint already
|
|
197
261
|
* subsumes what the older ones recorded. */
|
|
198
262
|
function isOwnMarker(m) {
|
|
199
263
|
if (m.role !== 'assistant' || typeof m.content !== 'string')
|
|
200
264
|
return false;
|
|
201
|
-
return m.content.startsWith(ANCHOR_MARKER)
|
|
265
|
+
return m.content.startsWith(ANCHOR_MARKER)
|
|
266
|
+
|| m.content.startsWith(CHECKPOINT_MARKER)
|
|
267
|
+
|| m.content.startsWith(DIRECTIVES_MARKER);
|
|
202
268
|
}
|
|
203
269
|
function isUnansweredToolCall(m) {
|
|
204
270
|
return m.role === 'assistant' && Array.isArray(m.tool_calls) && m.tool_calls.length > 0;
|