@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.
Files changed (119) hide show
  1. package/LICENSE +14 -0
  2. package/README.md +644 -0
  3. package/cordis.patch.yml +88 -0
  4. package/docs/architecture.md +460 -0
  5. package/docs/contract.md +375 -0
  6. package/docs/development.md +437 -0
  7. package/docs/host-compaction-seam.md +117 -0
  8. package/docs/knowledge-repo.md +730 -0
  9. package/docs/provider.md +98 -0
  10. package/docs/verify.md +200 -0
  11. package/lib/archive.d.ts +88 -0
  12. package/lib/archive.js +114 -0
  13. package/lib/archive.js.map +1 -0
  14. package/lib/arrival.d.ts +23 -0
  15. package/lib/arrival.js +86 -0
  16. package/lib/arrival.js.map +1 -0
  17. package/lib/artifact-query.d.ts +53 -0
  18. package/lib/artifact-query.js +130 -0
  19. package/lib/artifact-query.js.map +1 -0
  20. package/lib/client.js +234 -0
  21. package/lib/client.js.map +1 -0
  22. package/lib/commands.d.ts +28 -0
  23. package/lib/commands.js +305 -0
  24. package/lib/commands.js.map +1 -0
  25. package/lib/compose.d.ts +30 -0
  26. package/lib/compose.js +131 -0
  27. package/lib/compose.js.map +1 -0
  28. package/lib/continue-core.d.ts +153 -0
  29. package/lib/continue-core.js +252 -0
  30. package/lib/continue-core.js.map +1 -0
  31. package/lib/engine-core.d.ts +219 -0
  32. package/lib/engine-core.js +405 -0
  33. package/lib/engine-core.js.map +1 -0
  34. package/lib/engine.d.ts +211 -0
  35. package/lib/engine.js +571 -0
  36. package/lib/engine.js.map +1 -0
  37. package/lib/enrich-queue.d.ts +66 -0
  38. package/lib/enrich-queue.js +100 -0
  39. package/lib/enrich-queue.js.map +1 -0
  40. package/lib/enrich-store.d.ts +31 -0
  41. package/lib/enrich-store.js +103 -0
  42. package/lib/enrich-store.js.map +1 -0
  43. package/lib/enrich-wire.d.ts +73 -0
  44. package/lib/enrich-wire.js +209 -0
  45. package/lib/enrich-wire.js.map +1 -0
  46. package/lib/enrich.d.ts +73 -0
  47. package/lib/enrich.js +150 -0
  48. package/lib/enrich.js.map +1 -0
  49. package/lib/gitops.d.ts +107 -0
  50. package/lib/gitops.js +539 -0
  51. package/lib/gitops.js.map +1 -0
  52. package/lib/index.d.ts +81 -0
  53. package/lib/index.js +305 -0
  54. package/lib/index.js.map +1 -0
  55. package/lib/indexing.d.ts +85 -0
  56. package/lib/indexing.js +212 -0
  57. package/lib/indexing.js.map +1 -0
  58. package/lib/injections.d.ts +66 -0
  59. package/lib/injections.js +83 -0
  60. package/lib/injections.js.map +1 -0
  61. package/lib/notice.d.ts +60 -0
  62. package/lib/notice.js +84 -0
  63. package/lib/notice.js.map +1 -0
  64. package/lib/provider.d.ts +44 -0
  65. package/lib/provider.js +66 -0
  66. package/lib/provider.js.map +1 -0
  67. package/lib/redact.d.ts +24 -0
  68. package/lib/redact.js +85 -0
  69. package/lib/redact.js.map +1 -0
  70. package/lib/registry.d.ts +120 -0
  71. package/lib/registry.js +130 -0
  72. package/lib/registry.js.map +1 -0
  73. package/lib/render.d.ts +40 -0
  74. package/lib/render.js +280 -0
  75. package/lib/render.js.map +1 -0
  76. package/lib/repo.d.ts +78 -0
  77. package/lib/repo.js +184 -0
  78. package/lib/repo.js.map +1 -0
  79. package/lib/rules-commands.d.ts +24 -0
  80. package/lib/rules-commands.js +138 -0
  81. package/lib/rules-commands.js.map +1 -0
  82. package/lib/rules.d.ts +90 -0
  83. package/lib/rules.js +185 -0
  84. package/lib/rules.js.map +1 -0
  85. package/lib/search.d.ts +48 -0
  86. package/lib/search.js +152 -0
  87. package/lib/search.js.map +1 -0
  88. package/lib/signature.d.ts +28 -0
  89. package/lib/signature.js +149 -0
  90. package/lib/signature.js.map +1 -0
  91. package/lib/store.d.ts +130 -0
  92. package/lib/store.js +235 -0
  93. package/lib/store.js.map +1 -0
  94. package/lib/sync.d.ts +183 -0
  95. package/lib/sync.js +719 -0
  96. package/lib/sync.js.map +1 -0
  97. package/lib/tools.d.ts +84 -0
  98. package/lib/tools.js +581 -0
  99. package/lib/tools.js.map +1 -0
  100. package/lib/treedx/client.d.ts +57 -0
  101. package/lib/treedx/client.js +82 -0
  102. package/lib/treedx/client.js.map +1 -0
  103. package/lib/treedx/provider.d.ts +39 -0
  104. package/lib/treedx/provider.js +479 -0
  105. package/lib/treedx/provider.js.map +1 -0
  106. package/lib/treedx/state.d.ts +27 -0
  107. package/lib/treedx/state.js +65 -0
  108. package/lib/treedx/state.js.map +1 -0
  109. package/lib/types.d.ts +100 -0
  110. package/lib/types.js +19 -0
  111. package/lib/types.js.map +1 -0
  112. package/lib/vocabulary.d.ts +41 -0
  113. package/lib/vocabulary.js +118 -0
  114. package/lib/vocabulary.js.map +1 -0
  115. package/package.json +132 -0
  116. package/presets/chapters/agent.cordis.yml +272 -0
  117. package/presets/chapters/preset.yml +3 -0
  118. package/presets/probe-roots/agent.cordis.yml +11 -0
  119. 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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"}
@@ -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;