@treeseed/dsh-chapters 0.1.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/LICENSE +14 -0
- package/README.md +644 -0
- package/cordis.patch.yml +88 -0
- package/docs/architecture.md +460 -0
- package/docs/contract.md +375 -0
- package/docs/development.md +437 -0
- package/docs/host-compaction-seam.md +117 -0
- package/docs/knowledge-repo.md +730 -0
- package/docs/provider.md +98 -0
- package/docs/verify.md +200 -0
- package/lib/archive.d.ts +88 -0
- package/lib/archive.js +114 -0
- package/lib/archive.js.map +1 -0
- package/lib/arrival.d.ts +23 -0
- package/lib/arrival.js +86 -0
- package/lib/arrival.js.map +1 -0
- package/lib/artifact-query.d.ts +53 -0
- package/lib/artifact-query.js +130 -0
- package/lib/artifact-query.js.map +1 -0
- package/lib/client.js +234 -0
- package/lib/client.js.map +1 -0
- package/lib/commands.d.ts +28 -0
- package/lib/commands.js +305 -0
- package/lib/commands.js.map +1 -0
- package/lib/compose.d.ts +30 -0
- package/lib/compose.js +131 -0
- package/lib/compose.js.map +1 -0
- package/lib/continue-core.d.ts +153 -0
- package/lib/continue-core.js +252 -0
- package/lib/continue-core.js.map +1 -0
- package/lib/engine-core.d.ts +219 -0
- package/lib/engine-core.js +405 -0
- package/lib/engine-core.js.map +1 -0
- package/lib/engine.d.ts +211 -0
- package/lib/engine.js +571 -0
- package/lib/engine.js.map +1 -0
- package/lib/enrich-queue.d.ts +66 -0
- package/lib/enrich-queue.js +100 -0
- package/lib/enrich-queue.js.map +1 -0
- package/lib/enrich-store.d.ts +31 -0
- package/lib/enrich-store.js +103 -0
- package/lib/enrich-store.js.map +1 -0
- package/lib/enrich-wire.d.ts +73 -0
- package/lib/enrich-wire.js +209 -0
- package/lib/enrich-wire.js.map +1 -0
- package/lib/enrich.d.ts +73 -0
- package/lib/enrich.js +150 -0
- package/lib/enrich.js.map +1 -0
- package/lib/gitops.d.ts +107 -0
- package/lib/gitops.js +539 -0
- package/lib/gitops.js.map +1 -0
- package/lib/index.d.ts +81 -0
- package/lib/index.js +305 -0
- package/lib/index.js.map +1 -0
- package/lib/indexing.d.ts +85 -0
- package/lib/indexing.js +212 -0
- package/lib/indexing.js.map +1 -0
- package/lib/injections.d.ts +66 -0
- package/lib/injections.js +83 -0
- package/lib/injections.js.map +1 -0
- package/lib/notice.d.ts +60 -0
- package/lib/notice.js +84 -0
- package/lib/notice.js.map +1 -0
- package/lib/provider.d.ts +44 -0
- package/lib/provider.js +66 -0
- package/lib/provider.js.map +1 -0
- package/lib/redact.d.ts +24 -0
- package/lib/redact.js +85 -0
- package/lib/redact.js.map +1 -0
- package/lib/registry.d.ts +120 -0
- package/lib/registry.js +130 -0
- package/lib/registry.js.map +1 -0
- package/lib/render.d.ts +40 -0
- package/lib/render.js +280 -0
- package/lib/render.js.map +1 -0
- package/lib/repo.d.ts +78 -0
- package/lib/repo.js +184 -0
- package/lib/repo.js.map +1 -0
- package/lib/rules-commands.d.ts +24 -0
- package/lib/rules-commands.js +138 -0
- package/lib/rules-commands.js.map +1 -0
- package/lib/rules.d.ts +90 -0
- package/lib/rules.js +185 -0
- package/lib/rules.js.map +1 -0
- package/lib/search.d.ts +48 -0
- package/lib/search.js +152 -0
- package/lib/search.js.map +1 -0
- package/lib/signature.d.ts +28 -0
- package/lib/signature.js +149 -0
- package/lib/signature.js.map +1 -0
- package/lib/store.d.ts +130 -0
- package/lib/store.js +235 -0
- package/lib/store.js.map +1 -0
- package/lib/sync.d.ts +183 -0
- package/lib/sync.js +719 -0
- package/lib/sync.js.map +1 -0
- package/lib/tools.d.ts +84 -0
- package/lib/tools.js +581 -0
- package/lib/tools.js.map +1 -0
- package/lib/treedx/client.d.ts +57 -0
- package/lib/treedx/client.js +82 -0
- package/lib/treedx/client.js.map +1 -0
- package/lib/treedx/provider.d.ts +39 -0
- package/lib/treedx/provider.js +479 -0
- package/lib/treedx/provider.js.map +1 -0
- package/lib/treedx/state.d.ts +27 -0
- package/lib/treedx/state.js +65 -0
- package/lib/treedx/state.js.map +1 -0
- package/lib/types.d.ts +100 -0
- package/lib/types.js +19 -0
- package/lib/types.js.map +1 -0
- package/lib/vocabulary.d.ts +41 -0
- package/lib/vocabulary.js +118 -0
- package/lib/vocabulary.js.map +1 -0
- package/package.json +132 -0
- package/presets/chapters/agent.cordis.yml +272 -0
- package/presets/chapters/preset.yml +3 -0
- package/presets/probe-roots/agent.cordis.yml +11 -0
- package/presets/probe-roots/preset.yml +3 -0
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
import { chapterTopics } from "./signature.js";
|
|
2
|
+
import { estimateTokens, renderChapter, renderIndex } from "./render.js";
|
|
3
|
+
import { slugify } from "./archive.js";
|
|
4
|
+
/** provider tag written into `compaction/summary` — our event-scan discriminator. */
|
|
5
|
+
export const CHAPTERS_PROVIDER = 'dsh-chapters';
|
|
6
|
+
export const DETERMINISTIC_MODEL = 'deterministic';
|
|
7
|
+
/** Framing tags the host's summarizer wraps checkpoints in (compaction-basic summarizer.ts:21-22). */
|
|
8
|
+
export const SUMMARY_OPEN_TAG = '<compacted-summary>';
|
|
9
|
+
export const SUMMARY_CLOSE_TAG = '</compacted-summary>';
|
|
10
|
+
export const ENGINE_CONFIG_DEFAULTS = {
|
|
11
|
+
artifactStoreRoot: '.dsh-chapters',
|
|
12
|
+
chapterTokenTarget: 8000,
|
|
13
|
+
toolResultDeferFloorTokens: 200,
|
|
14
|
+
mergeThreshold: 0.3,
|
|
15
|
+
chapterLimit: 8000,
|
|
16
|
+
toolResultArtifactTokens: 8000,
|
|
17
|
+
elicitedPlot: true,
|
|
18
|
+
};
|
|
19
|
+
// ---------------------------------------------------------------- text helpers
|
|
20
|
+
const messageText = (msg) => (msg?.content ?? []).filter((b) => b.type === 'text').map((b) => b.text ?? '').join('\n');
|
|
21
|
+
/** Every `<compacted-summary>…</compacted-summary>` block in the region, in order. */
|
|
22
|
+
export function extractCheckpointBlocks(messages) {
|
|
23
|
+
const blocks = [];
|
|
24
|
+
for (const msg of messages) {
|
|
25
|
+
const text = messageText(msg);
|
|
26
|
+
let from = 0;
|
|
27
|
+
for (;;) {
|
|
28
|
+
const open = text.indexOf(SUMMARY_OPEN_TAG, from);
|
|
29
|
+
if (open === -1)
|
|
30
|
+
break;
|
|
31
|
+
const close = text.indexOf(SUMMARY_CLOSE_TAG, open);
|
|
32
|
+
if (close === -1) {
|
|
33
|
+
blocks.push(text.slice(open + SUMMARY_OPEN_TAG.length));
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
blocks.push(text.slice(open + SUMMARY_OPEN_TAG.length, close));
|
|
37
|
+
from = close + SUMMARY_CLOSE_TAG.length;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return blocks;
|
|
41
|
+
}
|
|
42
|
+
/** `N. [Title](path) — summary` as rendered by renderIndex; the accumulation format. */
|
|
43
|
+
const BULLET = /^\s*\d+\.\s+\[(.*?)\]\((.*?)\)\s+—\s+(.*)$/;
|
|
44
|
+
/**
|
|
45
|
+
* Merge-forward: parse prior bullets out of every checkpoint block. Lines that
|
|
46
|
+
* are not our bullet format (e.g. an LLM summary produced by `basic` before
|
|
47
|
+
* this engine took over) are returned as verbatim carry-overs — dropping them
|
|
48
|
+
* would be exactly the loss this plugin exists to prevent.
|
|
49
|
+
*/
|
|
50
|
+
export function parseTocState(blocks) {
|
|
51
|
+
const bullets = [];
|
|
52
|
+
const carriedProse = [];
|
|
53
|
+
const seen = new Set();
|
|
54
|
+
for (const block of blocks) {
|
|
55
|
+
let blockHadBullets = false;
|
|
56
|
+
for (const line of block.split('\n')) {
|
|
57
|
+
const m = BULLET.exec(line);
|
|
58
|
+
if (m === null)
|
|
59
|
+
continue;
|
|
60
|
+
blockHadBullets = true;
|
|
61
|
+
const bullet = { title: m[1], path: m[2], summary: m[3] };
|
|
62
|
+
if (seen.has(bullet.path))
|
|
63
|
+
continue; // accumulation dedups by path; numbers may repeat across roots
|
|
64
|
+
seen.add(bullet.path);
|
|
65
|
+
bullets.push(bullet);
|
|
66
|
+
}
|
|
67
|
+
if (!blockHadBullets && block.trim().length > 0)
|
|
68
|
+
carriedProse.push(block.trim());
|
|
69
|
+
}
|
|
70
|
+
return { bullets, carriedProse };
|
|
71
|
+
}
|
|
72
|
+
// ---------------------------------------------------------------- transaction scanning
|
|
73
|
+
/**
|
|
74
|
+
* The open transaction's compactionId: the latest `compaction/start` with no
|
|
75
|
+
* later `compaction/end` carrying the same id. The base appends the start
|
|
76
|
+
* BEFORE awaiting summarize (region.ts:211) and the durable lock admits only
|
|
77
|
+
* one open transaction per session — so a backward scan finds exactly it.
|
|
78
|
+
*/
|
|
79
|
+
export function findOpenCompactionId(session) {
|
|
80
|
+
const closed = new Set();
|
|
81
|
+
for (let seq = session.seq - 1; seq >= 0; seq -= 1) {
|
|
82
|
+
const ev = session.eventAt(seq);
|
|
83
|
+
const raw = ev?.data?.compactionId;
|
|
84
|
+
const cid = typeof raw === 'string' && raw.length > 0 ? raw : null;
|
|
85
|
+
if (ev?.type === 'compaction/end' && cid !== null) {
|
|
86
|
+
closed.add(cid);
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
if (ev?.type === 'compaction/start' && cid !== null && !closed.has(cid))
|
|
90
|
+
return cid;
|
|
91
|
+
}
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
/** All OUR finalized-or-not summary events (provider-tagged), oldest first. */
|
|
95
|
+
export function scanChaptersSummaries(session) {
|
|
96
|
+
const out = [];
|
|
97
|
+
for (let seq = 0; seq < session.seq; seq += 1) {
|
|
98
|
+
const ev = session.eventAt(seq);
|
|
99
|
+
if (ev?.type !== 'compaction/summary')
|
|
100
|
+
continue;
|
|
101
|
+
if (ev.data?.provider !== CHAPTERS_PROVIDER)
|
|
102
|
+
continue;
|
|
103
|
+
const cid = ev.data?.compactionId;
|
|
104
|
+
const shadowed = ev.data?.shadowedSeqs;
|
|
105
|
+
if (typeof cid !== 'string' || !Array.isArray(shadowed))
|
|
106
|
+
continue;
|
|
107
|
+
out.push({ compactionId: cid, summarySeq: seq, shadowedSeqs: shadowed.map(Number) });
|
|
108
|
+
}
|
|
109
|
+
return out;
|
|
110
|
+
}
|
|
111
|
+
// ---------------------------------------------------------------- citation resolution
|
|
112
|
+
/**
|
|
113
|
+
* Follow `tool/result` replacement chains to the first version (the un-pruned
|
|
114
|
+
* original). Only single-cited tool results qualify — a compaction checkpoint
|
|
115
|
+
* `user/message` also carries sourceEventSeqs, and following THOSE would pull
|
|
116
|
+
* lifecycle bookkeeping into chapter bodies.
|
|
117
|
+
*/
|
|
118
|
+
export function resolveOriginalEvent(session, seq) {
|
|
119
|
+
let cursor = seq;
|
|
120
|
+
const guard = new Set();
|
|
121
|
+
for (;;) {
|
|
122
|
+
if (guard.has(cursor))
|
|
123
|
+
throw new Error(`resolveOriginalEvent: citation cycle at seq ${cursor}`);
|
|
124
|
+
guard.add(cursor);
|
|
125
|
+
const ev = session.eventAt(cursor);
|
|
126
|
+
if (ev === undefined)
|
|
127
|
+
throw new Error(`resolveOriginalEvent: missing event at ${cursor}`);
|
|
128
|
+
if (ev.type !== 'tool/result')
|
|
129
|
+
return ev;
|
|
130
|
+
const cited = ev.sourceEventSeqs;
|
|
131
|
+
if (cited === undefined || cited.length !== 1)
|
|
132
|
+
return ev;
|
|
133
|
+
cursor = cited[0];
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
const HARNESS_PROSE = /^\s*(<system-reminder>|system reminder\b|current runtime context\.|\[workspace instructions?\b|this session is running under)/i;
|
|
137
|
+
/** Deterministic title/summary from region content. Never model-authored (invariant 4 — the model is absent). */
|
|
138
|
+
export function deriveIdentity(messages, hasCheckpoint) {
|
|
139
|
+
// Title source: the first USER message that is actual human/agent prose.
|
|
140
|
+
// Harness injections (system reminders, runtime-context snapshots) ride as
|
|
141
|
+
// user messages too — an earlier fork titled a chapter "System reminder 1"
|
|
142
|
+
// from a runtime snapshot that happened to open the span. Skip them; the
|
|
143
|
+
// r29 command tests pin this behavior.
|
|
144
|
+
const firstUser = messages.find((m) => m.role === 'user'
|
|
145
|
+
&& !messageText(m).includes(SUMMARY_OPEN_TAG)
|
|
146
|
+
&& !HARNESS_PROSE.test(messageText(m).trimStart()));
|
|
147
|
+
const userCount = messages.filter((m) => m.role === 'user').length;
|
|
148
|
+
const assistantCount = messages.filter((m) => m.role === 'assistant').length;
|
|
149
|
+
const headLine = firstUser === undefined ? '' : messageText(firstUser).split('\n')[0].trim();
|
|
150
|
+
const title = headLine.length > 0
|
|
151
|
+
? headLine.length > 72 ? `${headLine.slice(0, 72)}…` : headLine
|
|
152
|
+
: hasCheckpoint ? 'Earlier history' : 'Conversation span';
|
|
153
|
+
return {
|
|
154
|
+
title,
|
|
155
|
+
summary: `${userCount} user / ${assistantCount} assistant messages (${estimateTokens(messages.map(messageText).join(' '))} est tokens)`,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/** Workspace-relative chapter path for a reserved number. */
|
|
159
|
+
export const chapterPathFor = (config, rootSession, number, title) => `${config.artifactStoreRoot.replace(/\/+$/, '')}/${rootSession}/chapters/${String(number).padStart(3, '0')}-${slugify(title)}.md`;
|
|
160
|
+
/**
|
|
161
|
+
* Map the prepared summarize input back to the log seqs it was built from
|
|
162
|
+
* (the host builds region messages as `deriveEventMessage(eventAt(seq))` for
|
|
163
|
+
* the shadowed selection). Returns null — meaning "use the legacy
|
|
164
|
+
* single-chapter path" — whenever the Session lacks the mapping API, nothing
|
|
165
|
+
* matches, or MORE THAN ONE contiguous run matches (duplicate small
|
|
166
|
+
* messages are common; guessing a wrong span would cite chapters that never
|
|
167
|
+
* cover their seqs, and an honest legacy chapter beats that).
|
|
168
|
+
*/
|
|
169
|
+
export function reconstructShadowedSeqs(session, input) {
|
|
170
|
+
const nodes = session.surface?.nodes;
|
|
171
|
+
const derive = session.deriveEventMessage;
|
|
172
|
+
if (nodes === undefined || nodes.length === 0 || derive === undefined)
|
|
173
|
+
return null;
|
|
174
|
+
let region = input.messages;
|
|
175
|
+
if (region[0]?.role === 'system')
|
|
176
|
+
region = region.slice(1); // the prepended system head
|
|
177
|
+
if (region.length === 0)
|
|
178
|
+
return null;
|
|
179
|
+
const encoded = region.map((m) => JSON.stringify(m));
|
|
180
|
+
const matches = [];
|
|
181
|
+
for (let start = 0; start < nodes.length && matches.length < 2; start += 1) {
|
|
182
|
+
const seqs = [];
|
|
183
|
+
let mi = 0;
|
|
184
|
+
let ok = true;
|
|
185
|
+
for (let ni = start; ni < nodes.length && mi < encoded.length; ni += 1) {
|
|
186
|
+
const ev = session.eventAt(nodes[ni].seq);
|
|
187
|
+
if (ev === undefined)
|
|
188
|
+
continue;
|
|
189
|
+
const msg = derive(ev);
|
|
190
|
+
if (msg === null || msg === undefined)
|
|
191
|
+
continue;
|
|
192
|
+
if (JSON.stringify(msg) !== encoded[mi]) {
|
|
193
|
+
ok = false;
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
seqs.push(ev.seq);
|
|
197
|
+
mi += 1;
|
|
198
|
+
}
|
|
199
|
+
if (ok && mi === encoded.length && seqs.length > 0)
|
|
200
|
+
matches.push(seqs);
|
|
201
|
+
}
|
|
202
|
+
return matches.length === 1 ? matches[0] : null;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* The summarize-time plan: merge prior bullets, derive this span's identity,
|
|
206
|
+
* reserve numbers (attempt-keyed by the OPEN transaction's compactionId),
|
|
207
|
+
* build the TOC. Pure given the state; the caller persists the returned
|
|
208
|
+
* state change BEFORE this text can ever be cited.
|
|
209
|
+
*
|
|
210
|
+
* `composition` (r29): topic-sequential ranges from the composer (record
|
|
211
|
+
* §4.2), spanning the whole selected region head-to-tail (the adapter
|
|
212
|
+
* absorbs any strays). Present => reserve one number per chapter and cite
|
|
213
|
+
* them all; absent => the legacy single-chapter identity path, unchanged.
|
|
214
|
+
*/
|
|
215
|
+
export function planSummarize(session, state, input, config, reserveFn,
|
|
216
|
+
/** Required: the caller fails loudly when no `compaction/start` is open. */
|
|
217
|
+
compactionId, composition = null,
|
|
218
|
+
/** Model-authored plot note carried into this checkpoint (may be null). */
|
|
219
|
+
plot = null) {
|
|
220
|
+
const blocks = extractCheckpointBlocks(input.messages);
|
|
221
|
+
const { bullets, carriedProse } = parseTocState(blocks);
|
|
222
|
+
const identity = deriveIdentity(input.messages, blocks.length > 0);
|
|
223
|
+
const attemptId = `compaction:${compactionId}`;
|
|
224
|
+
if (composition !== null && composition.length > 0) {
|
|
225
|
+
const reserved = reserveFn(state, attemptId, composition.length);
|
|
226
|
+
const usedPaths = new Set();
|
|
227
|
+
const chapters = composition.map((range, i) => {
|
|
228
|
+
const number = reserved.numbers[i];
|
|
229
|
+
let path = chapterPathFor(config, state.rootSession, number, range.title);
|
|
230
|
+
// Mirror writeArchive's collision rule so the cited path can never dangle.
|
|
231
|
+
if (usedPaths.has(path))
|
|
232
|
+
path = path.replace(/\.md$/, `-${number}.md`);
|
|
233
|
+
usedPaths.add(path);
|
|
234
|
+
return { number, path, title: range.title, summary: range.summary, startSeq: range.startSeq, endSeq: range.endSeq };
|
|
235
|
+
});
|
|
236
|
+
const allBullets = [...bullets, ...chapters.map((c) => ({ title: c.title, path: c.path, summary: c.summary }))];
|
|
237
|
+
const index = renderIndex(allBullets);
|
|
238
|
+
const quote = (p) => p.split('\n').map((l) => `> ${l}`).join('\n');
|
|
239
|
+
const composedParts = [
|
|
240
|
+
`Chapter archive: ${allBullets.length} chapter(s) under ${config.artifactStoreRoot}/ — verbatim text; reload any with the read tool on its path.`,
|
|
241
|
+
'Tool results shown as head+…+tail in the replaced history were archived in full; oversized ones are file references inside the chapter.',
|
|
242
|
+
index,
|
|
243
|
+
];
|
|
244
|
+
if (carriedProse.length > 0) {
|
|
245
|
+
composedParts.push('Earlier summary carried forward (not chapter-formatted):', ...carriedProse.map(quote));
|
|
246
|
+
}
|
|
247
|
+
return {
|
|
248
|
+
plan: {
|
|
249
|
+
tocText: composedParts.join('\n\n'),
|
|
250
|
+
numbers: reserved.numbers,
|
|
251
|
+
chapter: { title: chapters[0].title, summary: chapters[0].summary, path: chapters[0].path },
|
|
252
|
+
chapters,
|
|
253
|
+
},
|
|
254
|
+
state: reserved.state,
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
const reserved = reserveFn(state, attemptId, 1);
|
|
258
|
+
const number = reserved.numbers[0];
|
|
259
|
+
const path = chapterPathFor(config, state.rootSession, number, identity.title);
|
|
260
|
+
const allBullets = [...bullets, { title: identity.title, path, summary: identity.summary }];
|
|
261
|
+
const index = renderIndex(allBullets);
|
|
262
|
+
const quote = (p) => p.split('\n').map((l) => `> ${l}`).join('\n');
|
|
263
|
+
const parts = [
|
|
264
|
+
`Chapter archive: ${allBullets.length} chapter(s) under ${config.artifactStoreRoot}/ — verbatim text; reload any with the read tool on its path.`,
|
|
265
|
+
'Tool results shown as head+…+tail in the replaced history were archived in full; oversized ones are file references inside the chapter.',
|
|
266
|
+
index,
|
|
267
|
+
];
|
|
268
|
+
if (carriedProse.length > 0) {
|
|
269
|
+
parts.push('Earlier summary carried forward (not chapter-formatted):', ...carriedProse.map(quote));
|
|
270
|
+
}
|
|
271
|
+
const plotSection = plot !== null && plot.trim() !== ''
|
|
272
|
+
? `Working plot (model-authored, carried across this checkpoint):\n\nPLOT: ${plot.trim()}\n\n(If it has gone stale, revise it in your next reply.)`
|
|
273
|
+
: null;
|
|
274
|
+
const tocText = plotSection === null ? parts.join('\n\n') : `${plotSection}\n\n${parts.join('\n\n')}`;
|
|
275
|
+
return {
|
|
276
|
+
plan: {
|
|
277
|
+
tocText,
|
|
278
|
+
numbers: reserved.numbers,
|
|
279
|
+
chapter: { title: identity.title, summary: identity.summary, path },
|
|
280
|
+
},
|
|
281
|
+
state: reserved.state,
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* The plot note (architecture.md amendment 2026-09-19): a short forward-
|
|
286
|
+
* maintained statement of what the agent is MID-WAY through, authored by the
|
|
287
|
+
* model itself and carried forward across every in-place checkpoint.
|
|
288
|
+
*/
|
|
289
|
+
export const PLOT_MARKER = 'PLOT:';
|
|
290
|
+
/**
|
|
291
|
+
* Latest plot paragraph in the region about to be shadowed. Assistant text
|
|
292
|
+
* wins; a PLOT carried in an earlier checkpoint (user-role, plugin-sourced)
|
|
293
|
+
* is the fallback, so the thread survives repeatedly shadowed chains.
|
|
294
|
+
* Returns the paragraph text WITHOUT the marker line, capped at maxChars.
|
|
295
|
+
*/
|
|
296
|
+
export function extractPlot(messages, maxChars = 900) {
|
|
297
|
+
const scan = (roleWanted) => {
|
|
298
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
299
|
+
const m = messages[i];
|
|
300
|
+
if (roleWanted !== 'any' && m.role !== roleWanted)
|
|
301
|
+
continue;
|
|
302
|
+
const text = messageText(messages[i]);
|
|
303
|
+
const at = text.lastIndexOf(PLOT_MARKER);
|
|
304
|
+
if (at === -1)
|
|
305
|
+
continue;
|
|
306
|
+
const rest = text.slice(at + PLOT_MARKER.length);
|
|
307
|
+
const para = rest.split(/\n\s*\n/)[0].trim();
|
|
308
|
+
if (para.length === 0)
|
|
309
|
+
continue;
|
|
310
|
+
return para.length > maxChars ? para.slice(0, maxChars) + '…' : para;
|
|
311
|
+
}
|
|
312
|
+
return null;
|
|
313
|
+
};
|
|
314
|
+
return scan('assistant') ?? scan('any');
|
|
315
|
+
}
|
|
316
|
+
// ---------------------------------------------------------------- finalization
|
|
317
|
+
/**
|
|
318
|
+
* Post-commit: render the chapter body for one compaction from the durable
|
|
319
|
+
* log (citation-resolved), and return the record to commit. The caller writes
|
|
320
|
+
* files (via archive.writeArchive) and persists state; this stays pure over
|
|
321
|
+
* the event data so the pruner-composition rule is testable.
|
|
322
|
+
*/
|
|
323
|
+
export function buildFinalizedChapter(session, shadowedSeqs, plan, config) {
|
|
324
|
+
const events = shadowedSeqs.map((seq) => {
|
|
325
|
+
const ev = resolveOriginalEvent(session, seq);
|
|
326
|
+
if (ev === undefined)
|
|
327
|
+
throw new Error(`buildFinalizedChapter: event vanished at ${seq}`);
|
|
328
|
+
return ev;
|
|
329
|
+
});
|
|
330
|
+
const lo = Math.min(...shadowedSeqs, ...events.map((e) => e.seq));
|
|
331
|
+
const hi = Math.max(...shadowedSeqs, ...events.map((e) => e.seq));
|
|
332
|
+
return renderChapter(events, {
|
|
333
|
+
title: plan.chapter.title,
|
|
334
|
+
summary: plan.chapter.summary,
|
|
335
|
+
startSeq: lo,
|
|
336
|
+
endSeq: hi,
|
|
337
|
+
}, {
|
|
338
|
+
chapterTokenTarget: config.chapterTokenTarget,
|
|
339
|
+
toolResultDeferFloorTokens: config.toolResultDeferFloorTokens,
|
|
340
|
+
}, [], chapterTopics(events, lo, hi));
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Render the manifest's chapters (r29) — authoritative ranges, no
|
|
344
|
+
* recomposition (the TOC cited them). A plan without composed chapters
|
|
345
|
+
* returns the legacy single render. Mismatch between manifest and the
|
|
346
|
+
* committed shadowed span is a LOUD error: the finalizer defers and warns,
|
|
347
|
+
* never silently archives the wrong content.
|
|
348
|
+
*/
|
|
349
|
+
export function buildFinalizedChapters(session, shadowedSeqs, plan, config) {
|
|
350
|
+
const composed = plan.chapters;
|
|
351
|
+
if (composed === undefined || composed.length === 0) {
|
|
352
|
+
return [buildFinalizedChapter(session, shadowedSeqs, plan, config)];
|
|
353
|
+
}
|
|
354
|
+
const events = shadowedSeqs.map((seq) => {
|
|
355
|
+
const ev = resolveOriginalEvent(session, seq);
|
|
356
|
+
if (ev === undefined)
|
|
357
|
+
throw new Error(`buildFinalizedChapters: event vanished at ${seq}`);
|
|
358
|
+
return ev;
|
|
359
|
+
});
|
|
360
|
+
const shadowMin = Math.min(...shadowedSeqs);
|
|
361
|
+
const shadowMax = Math.max(...shadowedSeqs);
|
|
362
|
+
const last = composed[composed.length - 1];
|
|
363
|
+
if (composed[0].startSeq > shadowMin || last.endSeq < shadowMax) {
|
|
364
|
+
throw new Error(`buildFinalizedChapters: manifest [${composed[0].startSeq}..${last.endSeq}] does not cover shadowed [${shadowMin}..${shadowMax}] — reconstruction drift`);
|
|
365
|
+
}
|
|
366
|
+
const renderCfg = {
|
|
367
|
+
chapterTokenTarget: config.chapterTokenTarget,
|
|
368
|
+
toolResultDeferFloorTokens: config.toolResultDeferFloorTokens,
|
|
369
|
+
};
|
|
370
|
+
return composed.map((ch) => {
|
|
371
|
+
const inRange = events.filter((e) => e.seq >= ch.startSeq && e.seq <= ch.endSeq);
|
|
372
|
+
if (inRange.length === 0) {
|
|
373
|
+
throw new Error(`buildFinalizedChapters: chapter ${ch.number} [${ch.startSeq}..${ch.endSeq}] holds no shadowed events`);
|
|
374
|
+
}
|
|
375
|
+
return renderChapter(inRange, {
|
|
376
|
+
title: ch.title,
|
|
377
|
+
summary: ch.summary,
|
|
378
|
+
startSeq: Math.min(...inRange.map((e) => e.seq)),
|
|
379
|
+
endSeq: Math.max(...inRange.map((e) => e.seq)),
|
|
380
|
+
}, renderCfg, [], chapterTopics(inRange, ch.startSeq, ch.endSeq));
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
/** The registry record shape written post-writeArchive for an engine chapter. */
|
|
384
|
+
export function engineRecord(plan, shadowedSeqs, rendered, writtenPath, sha256hex) {
|
|
385
|
+
return {
|
|
386
|
+
number: plan.numbers[0],
|
|
387
|
+
path: writtenPath,
|
|
388
|
+
title: plan.chapter.title,
|
|
389
|
+
summary: plan.chapter.summary,
|
|
390
|
+
startSeq: rendered.range.startSeq,
|
|
391
|
+
endSeq: rendered.range.endSeq,
|
|
392
|
+
topics: rendered.topics,
|
|
393
|
+
messages: rendered.stats.messages,
|
|
394
|
+
shadowedSeqs: [...shadowedSeqs],
|
|
395
|
+
sha256: sha256hex,
|
|
396
|
+
estimatedTokens: rendered.stats.estimatedTokens,
|
|
397
|
+
artifacts: rendered.artifacts.map((a) => ({ path: a.path, sha256: a.sha256, bytes: a.bytes })),
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
/** Numbers the plan reserved, or null when the manifest disagrees (corruption). */
|
|
401
|
+
export function assertReservationMatchesPlan(state, compactionId, plan) {
|
|
402
|
+
const got = state.reservations[`compaction:${compactionId}`];
|
|
403
|
+
return got !== undefined && got.length === plan.numbers.length && got.every((n, i) => n === plan.numbers[i]);
|
|
404
|
+
}
|
|
405
|
+
//# sourceMappingURL=engine-core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine-core.js","sourceRoot":"","sources":["../src/engine-core.ts"],"names":[],"mappings":"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"}
|
package/lib/engine.d.ts
ADDED
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ChaptersCompactionEngine — the cordis-facing adapter over the pure
|
|
3
|
+
* engine-core logic. Mounted INSIDE a preset realm's compaction group (never
|
|
4
|
+
* the host plane beside `basic`: two engines double-fire across planes,
|
|
5
|
+
* FINDINGS § Phase 0b), it overrides exactly the sanctioned hook plus the two
|
|
6
|
+
* entry points whose results the finalizer needs.
|
|
7
|
+
*
|
|
8
|
+
* Everything decision-shaped lives in engine-core.ts, where it is
|
|
9
|
+
* harness-free testable. This file is glue: service resolution, durable
|
|
10
|
+
* reads/writes, and the never-break-the-caller containment the base's own
|
|
11
|
+
* listeners already model.
|
|
12
|
+
*/
|
|
13
|
+
import { BasicCompactionEngine } from '@deepseek-ai/dsh-compaction-basic';
|
|
14
|
+
import type { BasicCompactionConfig } from '@deepseek-ai/dsh-compaction-basic';
|
|
15
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
16
|
+
import type { Agent } from '@deepseek-ai/dsh-agent';
|
|
17
|
+
import type { CompactionResult, CompactionTrigger } from '@deepseek-ai/dsh-compaction';
|
|
18
|
+
import type { CommandId } from '@deepseek-ai/dsh-commands/brand';
|
|
19
|
+
import z from '@deepseek-ai/schemastery';
|
|
20
|
+
import { type SummarizeInputLike, type SummarizeResultLike } from './engine-core.ts';
|
|
21
|
+
/** Row config: the base's keys (so realm rows validate) plus the archive's own. */
|
|
22
|
+
export interface ChaptersRowConfig extends BasicCompactionConfig {
|
|
23
|
+
artifactStoreRoot?: string;
|
|
24
|
+
chapterTokenTarget?: number;
|
|
25
|
+
toolResultDeferFloorTokens?: number;
|
|
26
|
+
mergeThreshold?: number;
|
|
27
|
+
chapterLimit?: number;
|
|
28
|
+
syncDebounceMs?: number;
|
|
29
|
+
toolResultArtifactTokens?: number;
|
|
30
|
+
elicitedPlot?: boolean;
|
|
31
|
+
enrichmentEnabled?: boolean;
|
|
32
|
+
enrichmentModel?: string;
|
|
33
|
+
enrichmentTrigger?: 'afterPush' | 'idle' | 'both' | 'manual';
|
|
34
|
+
enrichmentIdleMs?: number;
|
|
35
|
+
enrichmentBatchCap?: number;
|
|
36
|
+
vocabApply?: boolean;
|
|
37
|
+
vocabCoMin?: number;
|
|
38
|
+
vocabOverlapMin?: number;
|
|
39
|
+
treedxFetchTimeoutMs?: number;
|
|
40
|
+
treedxWorkspaceTtlSeconds?: number;
|
|
41
|
+
treedxLeaseRetries?: number;
|
|
42
|
+
treedxLeaseRetryDelayMs?: number;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Per-turn deterministic signature listener (knowledge-repo.md §4.1), as a
|
|
46
|
+
* plain factory so the LOGIC is unit-testable against the real host Session
|
|
47
|
+
* shape without a full cordis Service context. Never-break containment: the
|
|
48
|
+
* handler reports through `warn`, it never throws into the session.
|
|
49
|
+
*
|
|
50
|
+
* r28 found the load-bearing fact: the host Session is a CLASS exposing
|
|
51
|
+
* snapshotEvents() — a `.events` property does not exist, and the first cut
|
|
52
|
+
* read `.events`, no-op'd silently in every real boot, and passed its L0
|
|
53
|
+
* test because the test stubbed the shape that does not exist.
|
|
54
|
+
*/
|
|
55
|
+
export declare function makeSignatureListener(deps: {
|
|
56
|
+
store: () => Promise<{
|
|
57
|
+
store: import('./store.ts').RegistryStore;
|
|
58
|
+
}>;
|
|
59
|
+
warn: (error: unknown) => void;
|
|
60
|
+
onCollected?: (id: string, sig: {
|
|
61
|
+
seqs: number[];
|
|
62
|
+
paths: string[];
|
|
63
|
+
terms: string[];
|
|
64
|
+
size: number;
|
|
65
|
+
}) => void;
|
|
66
|
+
}): (session: unknown, event: unknown) => void;
|
|
67
|
+
/**
|
|
68
|
+
* Pull-on-first-turn (§5.1) as a plain factory, same testability discipline
|
|
69
|
+
* as the signature listener. Process-scoped "first turn seen" — a resumed
|
|
70
|
+
* old session pulling once more is harmless and bounded.
|
|
71
|
+
*/
|
|
72
|
+
export declare function makeFirstTurnPullListener(deps: {
|
|
73
|
+
pull: (cwd: string) => Promise<unknown>;
|
|
74
|
+
}): (session: unknown, event: unknown) => void;
|
|
75
|
+
export declare class ChaptersCompactionEngine extends BasicCompactionEngine {
|
|
76
|
+
#private;
|
|
77
|
+
static inject: string[];
|
|
78
|
+
static Config: z<Schemastery.ObjectS<{
|
|
79
|
+
thresholdRatio: z<number, number>;
|
|
80
|
+
retainRatio: z<number, number>;
|
|
81
|
+
retainTokens: z<number, number>;
|
|
82
|
+
summarizationProvider: z<string, string>;
|
|
83
|
+
summarizationModel: z<string, string>;
|
|
84
|
+
maxTokens: z<number, number>;
|
|
85
|
+
compactionRetries: z<number, number>;
|
|
86
|
+
maxOverflowRetries: z<number, number>;
|
|
87
|
+
modelPolicies: z<({
|
|
88
|
+
provider?: string | null;
|
|
89
|
+
model?: string | null;
|
|
90
|
+
thresholdRatio?: number | null;
|
|
91
|
+
retainRatio?: number | null;
|
|
92
|
+
retainTokens?: number | null;
|
|
93
|
+
summarizationProvider?: string | null;
|
|
94
|
+
summarizationModel?: string | null;
|
|
95
|
+
maxTokens?: number | null;
|
|
96
|
+
compactionRetries?: number | null;
|
|
97
|
+
maxOverflowRetries?: number | null;
|
|
98
|
+
} & import("@deepseek-ai/cosmokit").Dict)[], Schemastery.ObjectT<{
|
|
99
|
+
provider: z<string, string>;
|
|
100
|
+
model: z<string, string>;
|
|
101
|
+
thresholdRatio: z<number, number>;
|
|
102
|
+
retainRatio: z<number, number>;
|
|
103
|
+
retainTokens: z<number, number>;
|
|
104
|
+
summarizationProvider: z<string, string>;
|
|
105
|
+
summarizationModel: z<string, string>;
|
|
106
|
+
maxTokens: z<number, number>;
|
|
107
|
+
compactionRetries: z<number, number>;
|
|
108
|
+
maxOverflowRetries: z<number, number>;
|
|
109
|
+
}>[]>;
|
|
110
|
+
auto: z<boolean, boolean>;
|
|
111
|
+
artifactStoreRoot: z<string, string>;
|
|
112
|
+
chapterTokenTarget: z<number, number>;
|
|
113
|
+
toolResultDeferFloorTokens: z<number, number>;
|
|
114
|
+
mergeThreshold: z<number, number>;
|
|
115
|
+
chapterLimit: z<number, number>;
|
|
116
|
+
syncDebounceMs: z<number, number>;
|
|
117
|
+
toolResultArtifactTokens: z<number, number>;
|
|
118
|
+
elicitedPlot: z<boolean, boolean>;
|
|
119
|
+
enrichmentEnabled: z<boolean, boolean>;
|
|
120
|
+
enrichmentModel: z<string, string>;
|
|
121
|
+
enrichmentTrigger: z<string, string>;
|
|
122
|
+
enrichmentIdleMs: z<number, number>;
|
|
123
|
+
enrichmentBatchCap: z<number, number>;
|
|
124
|
+
vocabApply: z<boolean, boolean>;
|
|
125
|
+
vocabCoMin: z<number, number>;
|
|
126
|
+
vocabOverlapMin: z<number, number>;
|
|
127
|
+
treedxFetchTimeoutMs: z<number, number>;
|
|
128
|
+
treedxWorkspaceTtlSeconds: z<number, number>;
|
|
129
|
+
treedxLeaseRetries: z<number, number>;
|
|
130
|
+
treedxLeaseRetryDelayMs: z<number, number>;
|
|
131
|
+
}>, Schemastery.ObjectT<{
|
|
132
|
+
thresholdRatio: z<number, number>;
|
|
133
|
+
retainRatio: z<number, number>;
|
|
134
|
+
retainTokens: z<number, number>;
|
|
135
|
+
summarizationProvider: z<string, string>;
|
|
136
|
+
summarizationModel: z<string, string>;
|
|
137
|
+
maxTokens: z<number, number>;
|
|
138
|
+
compactionRetries: z<number, number>;
|
|
139
|
+
maxOverflowRetries: z<number, number>;
|
|
140
|
+
modelPolicies: z<({
|
|
141
|
+
provider?: string | null;
|
|
142
|
+
model?: string | null;
|
|
143
|
+
thresholdRatio?: number | null;
|
|
144
|
+
retainRatio?: number | null;
|
|
145
|
+
retainTokens?: number | null;
|
|
146
|
+
summarizationProvider?: string | null;
|
|
147
|
+
summarizationModel?: string | null;
|
|
148
|
+
maxTokens?: number | null;
|
|
149
|
+
compactionRetries?: number | null;
|
|
150
|
+
maxOverflowRetries?: number | null;
|
|
151
|
+
} & import("@deepseek-ai/cosmokit").Dict)[], Schemastery.ObjectT<{
|
|
152
|
+
provider: z<string, string>;
|
|
153
|
+
model: z<string, string>;
|
|
154
|
+
thresholdRatio: z<number, number>;
|
|
155
|
+
retainRatio: z<number, number>;
|
|
156
|
+
retainTokens: z<number, number>;
|
|
157
|
+
summarizationProvider: z<string, string>;
|
|
158
|
+
summarizationModel: z<string, string>;
|
|
159
|
+
maxTokens: z<number, number>;
|
|
160
|
+
compactionRetries: z<number, number>;
|
|
161
|
+
maxOverflowRetries: z<number, number>;
|
|
162
|
+
}>[]>;
|
|
163
|
+
auto: z<boolean, boolean>;
|
|
164
|
+
artifactStoreRoot: z<string, string>;
|
|
165
|
+
chapterTokenTarget: z<number, number>;
|
|
166
|
+
toolResultDeferFloorTokens: z<number, number>;
|
|
167
|
+
mergeThreshold: z<number, number>;
|
|
168
|
+
chapterLimit: z<number, number>;
|
|
169
|
+
syncDebounceMs: z<number, number>;
|
|
170
|
+
toolResultArtifactTokens: z<number, number>;
|
|
171
|
+
elicitedPlot: z<boolean, boolean>;
|
|
172
|
+
enrichmentEnabled: z<boolean, boolean>;
|
|
173
|
+
enrichmentModel: z<string, string>;
|
|
174
|
+
enrichmentTrigger: z<string, string>;
|
|
175
|
+
enrichmentIdleMs: z<number, number>;
|
|
176
|
+
enrichmentBatchCap: z<number, number>;
|
|
177
|
+
vocabApply: z<boolean, boolean>;
|
|
178
|
+
vocabCoMin: z<number, number>;
|
|
179
|
+
vocabOverlapMin: z<number, number>;
|
|
180
|
+
treedxFetchTimeoutMs: z<number, number>;
|
|
181
|
+
treedxWorkspaceTtlSeconds: z<number, number>;
|
|
182
|
+
treedxLeaseRetries: z<number, number>;
|
|
183
|
+
treedxLeaseRetryDelayMs: z<number, number>;
|
|
184
|
+
}>>;
|
|
185
|
+
private readonly chaptersConfig;
|
|
186
|
+
private storePromise;
|
|
187
|
+
constructor(ctx: Context, config?: ChaptersRowConfig);
|
|
188
|
+
/**
|
|
189
|
+
* Per-turn deterministic signatures at turn/end (knowledge-repo §4.1):
|
|
190
|
+
* synchronous extraction, async store append, and never-break containment —
|
|
191
|
+
* a signature failure must never touch the compaction path (AGENTS hard
|
|
192
|
+
* rule: the listener reports, it never throws into the session). The base
|
|
193
|
+
* engine's own listeners model the same shape.
|
|
194
|
+
*/
|
|
195
|
+
/** The realm's own scheduler (§5): same code as the host plane's; the file
|
|
196
|
+
* lock and debounce keep the two honest against each other. */
|
|
197
|
+
private syncDebounceMs;
|
|
198
|
+
private vocabCfg;
|
|
199
|
+
private enrichCfg;
|
|
200
|
+
private enrichPromise;
|
|
201
|
+
private lastCwd;
|
|
202
|
+
private lastRoute;
|
|
203
|
+
private schedulerPromise;
|
|
204
|
+
/** Lazy, once. `storageDomain` is a host-plane singleton the realm resolves;
|
|
205
|
+
* acquire (never bare-open): a mounted tools-plugin may already own the reservation. */
|
|
206
|
+
private store;
|
|
207
|
+
protected summarize(input: SummarizeInputLike, agent: unknown, _signal?: AbortSignal): Promise<SummarizeResultLike>;
|
|
208
|
+
compactIfNeeded(agent: Agent, trigger: CompactionTrigger, signal: AbortSignal): Promise<CompactionResult | null>;
|
|
209
|
+
compactNow(agent: Agent, signal: AbortSignal, sourceCommandId?: CommandId): Promise<CompactionResult | null>;
|
|
210
|
+
}
|
|
211
|
+
export default ChaptersCompactionEngine;
|