@corenel/harness 0.13.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.
Files changed (65) hide show
  1. package/dist/audit/recorder.d.ts +6 -1
  2. package/dist/audit/recorder.d.ts.map +1 -1
  3. package/dist/audit/recorder.js +9 -2
  4. package/dist/audit/recorder.js.map +1 -1
  5. package/dist/audit/runAudit.d.ts.map +1 -1
  6. package/dist/audit/runAudit.js +2 -0
  7. package/dist/audit/runAudit.js.map +1 -1
  8. package/dist/conversation.d.ts +33 -0
  9. package/dist/conversation.d.ts.map +1 -1
  10. package/dist/conversation.js +44 -1
  11. package/dist/conversation.js.map +1 -1
  12. package/dist/core/compactHistory.d.ts +27 -18
  13. package/dist/core/compactHistory.d.ts.map +1 -1
  14. package/dist/core/compactHistory.js +106 -40
  15. package/dist/core/compactHistory.js.map +1 -1
  16. package/dist/core/foldBlocks.d.ts +43 -0
  17. package/dist/core/foldBlocks.d.ts.map +1 -0
  18. package/dist/core/foldBlocks.js +114 -0
  19. package/dist/core/foldBlocks.js.map +1 -0
  20. package/dist/core/foldTypes.d.ts +25 -0
  21. package/dist/core/foldTypes.d.ts.map +1 -0
  22. package/dist/core/foldTypes.js +2 -0
  23. package/dist/core/foldTypes.js.map +1 -0
  24. package/dist/core/loop.d.ts +19 -5
  25. package/dist/core/loop.d.ts.map +1 -1
  26. package/dist/core/loop.js +140 -69
  27. package/dist/core/loop.js.map +1 -1
  28. package/dist/core/recovery.d.ts +1 -0
  29. package/dist/core/recovery.d.ts.map +1 -1
  30. package/dist/core/recovery.js +12 -0
  31. package/dist/core/recovery.js.map +1 -1
  32. package/dist/core/summarize.d.ts +9 -3
  33. package/dist/core/summarize.d.ts.map +1 -1
  34. package/dist/core/summarize.js +97 -42
  35. package/dist/core/summarize.js.map +1 -1
  36. package/dist/guardrail/permission-service.d.ts.map +1 -1
  37. package/dist/guardrail/permission-service.js +11 -2
  38. package/dist/guardrail/permission-service.js.map +1 -1
  39. package/dist/sessions/directivesStore.d.ts +9 -0
  40. package/dist/sessions/directivesStore.d.ts.map +1 -0
  41. package/dist/sessions/directivesStore.js +54 -0
  42. package/dist/sessions/directivesStore.js.map +1 -0
  43. package/dist/sessions/fileSessionStore.d.ts +2 -2
  44. package/dist/sessions/fileSessionStore.d.ts.map +1 -1
  45. package/dist/sessions/fileSessionStore.js +19 -8
  46. package/dist/sessions/fileSessionStore.js.map +1 -1
  47. package/dist/sessions/foldStorage.d.ts +15 -0
  48. package/dist/sessions/foldStorage.d.ts.map +1 -0
  49. package/dist/sessions/foldStorage.js +121 -0
  50. package/dist/sessions/foldStorage.js.map +1 -0
  51. package/dist/sessions/jsonl.d.ts +6 -0
  52. package/dist/sessions/jsonl.d.ts.map +1 -1
  53. package/dist/sessions/jsonl.js +15 -1
  54. package/dist/sessions/jsonl.js.map +1 -1
  55. package/dist/sidecar/server.d.ts.map +1 -1
  56. package/dist/sidecar/server.js +11 -1
  57. package/dist/sidecar/server.js.map +1 -1
  58. package/dist/tools/foldTools.d.ts +5 -0
  59. package/dist/tools/foldTools.d.ts.map +1 -0
  60. package/dist/tools/foldTools.js +123 -0
  61. package/dist/tools/foldTools.js.map +1 -0
  62. package/dist/tools/skillTool.d.ts.map +1 -1
  63. package/dist/tools/skillTool.js +7 -2
  64. package/dist/tools/skillTool.js.map +1 -1
  65. package/package.json +2 -2
@@ -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;AAIrG,MAAM,WAAW,eAAe;IAAG,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,CAAA;CAAE;AACpH,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,CAsIhB"}
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"}
@@ -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 = { v: 1, trace, host: opts.ctx.host, ...(opts.ctx.session ? { session: opts.ctx.session } : {}), ...(opts.ctx.run ? { run: opts.ctx.run } : {}) };
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":"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"}
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,CA+DnH"}
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"}
@@ -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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"}
@@ -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,CAmBzE"}
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"}
@@ -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}`, included: true, messages: [] };
83
+ current = { id: freeId(`stored-${i}`), included: true, messages: [] };
41
84
  turns.push(current);
42
85
  }
43
86
  current.messages.push(m);
@@ -1 +1 @@
1
- {"version":3,"file":"conversation.js","sourceRoot":"","sources":["../conversation.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAyC1D;;;;;;;6DAO6D;AAC7D,MAAM,UAAU,gBAAgB,CAAC,CAAmB;IAClD,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5B,OAAO,OAAO,KAAK,EAAE,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;AAC3F,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,wBAAwB,CAAC,GAAY;IACnD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAgC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;IAC5F,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAAE,OAAO,KAAsC,CAAC;IACjG,MAAM,KAAK,GAAuB,EAAE,CAAC;IACrC,IAAI,OAAO,GAA4B,IAAI,CAAC;IAC5C,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACrB,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9B,OAAO,GAAG,IAAI,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,CAAgC,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QACD,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAClC,OAAO,GAAG,EAAE,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;YAC9D,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC;QACD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAA0C,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,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<string>;
6
- /** Produces the one-line referent for a preserved user message: what it was
7
- * answering. `answered` is the nearest preceding assistant turn, or null when
8
- * the user opened the conversation. Omit to preserve user messages bare. */
9
- anchor?: (user: ChatCompletionMessageParam, answered: ChatCompletionMessageParam | null) => Promise<string>;
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
- /** The durable checkpoint body, destined for a file in the project. */
21
- checkpoint: string;
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
- export declare function compactionDecision(fill: number, messages: ChatCompletionMessageParam[], gate: CompactGate): {
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 checkpoint this module wrote on an earlier pass. Dropped and
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;AAGpF,MAAM,WAAW,qBAAqB;IACpC;+BAC2B;IAC3B,SAAS,EAAE,CAAC,SAAS,EAAE,0BAA0B,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACxE;;gFAE4E;IAC5E,MAAM,CAAC,EAAE,CACP,IAAI,EAAE,0BAA0B,EAChC,QAAQ,EAAE,0BAA0B,GAAG,IAAI,KACxC,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB;0CACsC;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;2EACuE;IACvE,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAChD;AAED,MAAM,WAAW,oBAAoB;IACnC,sDAAsD;IACtD,QAAQ,EAAE,0BAA0B,EAAE,CAAC;IACvC,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;oEACoE;AACpE,eAAO,MAAM,iBAAiB,kBAAkB,CAAC;AAEjD;qEACqE;AACrE,eAAO,MAAM,aAAa,cAAc,CAAC;AAEzC;0EAC0E;AAC1E,eAAO,MAAM,eAAe,OAAO,CAAC;AAEpC;;;0CAG0C;AAC1C,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,0BAA0B,EAAE,GAAG,OAAO,CAG3F;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,CAK9G;AA+BD,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,0BAA0B,EAAE,EACtC,IAAI,EAAE,WAAW,GAChB;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,CAAC,CA8C/B;AAeD;;;gFAGgF;AAChF,eAAO,MAAM,kBAAkB,oBAAc,CAAC;AAY9C;;4CAE4C;AAC5C,iBAAS,WAAW,CAAC,CAAC,EAAE,0BAA0B,GAAG,OAAO,CAG3D"}
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
- /** The marker every checkpoint message starts with, so a later pass can
14
- * recognize one it already wrote instead of collapsing it again. */
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
- return messages.some((m) => m.role !== 'system' && m.role !== 'user');
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 Math.min(1, chars / 4 / contextWindow);
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: this codebase keeps EVERY user message verbatim, so a
99
- * compaction's floor is system + all user turns + the checkpoint, and in a long
100
- * conversation with large pastes that clears 0.6 easily. Landing anywhere in
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
- /* A stale pressure notice is DROPPED, not summarized. "Context is 80% full"
134
- * is a fact about the window this compaction is in the middle of emptying,
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
- /* Skip THIS MODULE'S OWN messages, both as anchor candidates and as
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
- if (m.role === 'assistant' && typeof m.content === 'string')
151
- answered = m;
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
- if (opts.anchor) {
155
- kept.push({ role: 'assistant', content: `${ANCHOR_MARKER}${await opts.anchor(m, answered)}` });
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
- kept.push(await offloadIfOversized(m, opts));
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: `${CHECKPOINT_MARKER}${summary}` },
164
- ...kept,
223
+ ...(directives.length ? [{ role: 'assistant', content: renderDirectivesBlock(directives) }] : []),
224
+ { role: 'assistant', content: summaryBlock },
225
+ ...tailOut,
165
226
  ...(pending ? [pending] : []),
166
227
  ],
167
- checkpoint: summary,
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 checkpoint this module wrote on an earlier pass. Dropped and
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) || m.content.startsWith(CHECKPOINT_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;