@fractalsynapse/dsh-chapters 0.0.0-stage → 0.2.21

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 (195) hide show
  1. package/LICENSE +14 -0
  2. package/README.md +76 -2
  3. package/cordis.patch.yml +363 -0
  4. package/docs/architecture.md +692 -0
  5. package/docs/autorun-guide.md +248 -0
  6. package/docs/backlog.md +2022 -0
  7. package/docs/contract.md +938 -0
  8. package/docs/development.md +990 -0
  9. package/docs/host-compaction-seam.md +225 -0
  10. package/docs/host-protected-head-ask.md +80 -0
  11. package/docs/knowledge-repo.md +1332 -0
  12. package/docs/plans-carriage.md +571 -0
  13. package/docs/project-state.md +642 -0
  14. package/docs/provider.md +98 -0
  15. package/docs/superpowers/plans/2026-10-17-chapters-save.md +198 -0
  16. package/docs/superpowers/plans/2026-11-02-chapter-removal.md +151 -0
  17. package/docs/superpowers/specs/2026-11-02-chapter-removal-design.md +115 -0
  18. package/docs/verify.md +561 -0
  19. package/lib/archive.d.ts +161 -0
  20. package/lib/archive.js +229 -0
  21. package/lib/archive.js.map +1 -0
  22. package/lib/arrival.d.ts +23 -0
  23. package/lib/arrival.js +125 -0
  24. package/lib/arrival.js.map +1 -0
  25. package/lib/artifact-query.d.ts +62 -0
  26. package/lib/artifact-query.js +187 -0
  27. package/lib/artifact-query.js.map +1 -0
  28. package/lib/attach.d.ts +46 -0
  29. package/lib/attach.js +120 -0
  30. package/lib/attach.js.map +1 -0
  31. package/lib/auto-save.d.ts +145 -0
  32. package/lib/auto-save.js +334 -0
  33. package/lib/auto-save.js.map +1 -0
  34. package/lib/aux-message.d.ts +17 -0
  35. package/lib/aux-message.js +20 -0
  36. package/lib/aux-message.js.map +1 -0
  37. package/lib/client.js +1419 -0
  38. package/lib/client.js.map +1 -0
  39. package/lib/codegraph.d.ts +76 -0
  40. package/lib/codegraph.js +190 -0
  41. package/lib/codegraph.js.map +1 -0
  42. package/lib/commands.d.ts +52 -0
  43. package/lib/commands.js +946 -0
  44. package/lib/commands.js.map +1 -0
  45. package/lib/compose.d.ts +30 -0
  46. package/lib/compose.js +185 -0
  47. package/lib/compose.js.map +1 -0
  48. package/lib/continue-core.d.ts +245 -0
  49. package/lib/continue-core.js +405 -0
  50. package/lib/continue-core.js.map +1 -0
  51. package/lib/diag.d.ts +55 -0
  52. package/lib/diag.js +186 -0
  53. package/lib/diag.js.map +1 -0
  54. package/lib/engine-core.d.ts +301 -0
  55. package/lib/engine-core.js +531 -0
  56. package/lib/engine-core.js.map +1 -0
  57. package/lib/engine-note.d.ts +35 -0
  58. package/lib/engine-note.js +32 -0
  59. package/lib/engine-note.js.map +1 -0
  60. package/lib/engine.d.ts +329 -0
  61. package/lib/engine.js +1179 -0
  62. package/lib/engine.js.map +1 -0
  63. package/lib/enrich-queue.d.ts +66 -0
  64. package/lib/enrich-queue.js +126 -0
  65. package/lib/enrich-queue.js.map +1 -0
  66. package/lib/enrich-store.d.ts +31 -0
  67. package/lib/enrich-store.js +103 -0
  68. package/lib/enrich-store.js.map +1 -0
  69. package/lib/enrich-wire.d.ts +163 -0
  70. package/lib/enrich-wire.js +353 -0
  71. package/lib/enrich-wire.js.map +1 -0
  72. package/lib/enrich.d.ts +102 -0
  73. package/lib/enrich.js +267 -0
  74. package/lib/enrich.js.map +1 -0
  75. package/lib/gitops.d.ts +107 -0
  76. package/lib/gitops.js +539 -0
  77. package/lib/gitops.js.map +1 -0
  78. package/lib/index.d.ts +241 -0
  79. package/lib/index.js +1162 -0
  80. package/lib/index.js.map +1 -0
  81. package/lib/indexing.d.ts +98 -0
  82. package/lib/indexing.js +223 -0
  83. package/lib/indexing.js.map +1 -0
  84. package/lib/injections.d.ts +90 -0
  85. package/lib/injections.js +165 -0
  86. package/lib/injections.js.map +1 -0
  87. package/lib/last-resort.d.ts +24 -0
  88. package/lib/last-resort.js +27 -0
  89. package/lib/last-resort.js.map +1 -0
  90. package/lib/log-shape.d.ts +38 -0
  91. package/lib/log-shape.js +93 -0
  92. package/lib/log-shape.js.map +1 -0
  93. package/lib/models-command.d.ts +74 -0
  94. package/lib/models-command.js +100 -0
  95. package/lib/models-command.js.map +1 -0
  96. package/lib/notice.d.ts +74 -0
  97. package/lib/notice.js +92 -0
  98. package/lib/notice.js.map +1 -0
  99. package/lib/plans.d.ts +154 -0
  100. package/lib/plans.js +315 -0
  101. package/lib/plans.js.map +1 -0
  102. package/lib/preset.d.ts +186 -0
  103. package/lib/preset.js +212 -0
  104. package/lib/preset.js.map +1 -0
  105. package/lib/prompt-keys.d.ts +7 -0
  106. package/lib/prompt-keys.js +8 -0
  107. package/lib/prompt-keys.js.map +1 -0
  108. package/lib/prompt-loop.d.ts +73 -0
  109. package/lib/prompt-loop.js +147 -0
  110. package/lib/prompt-loop.js.map +1 -0
  111. package/lib/prompt-push.d.ts +47 -0
  112. package/lib/prompt-push.js +115 -0
  113. package/lib/prompt-push.js.map +1 -0
  114. package/lib/prompt-runner.d.ts +48 -0
  115. package/lib/prompt-runner.js +90 -0
  116. package/lib/prompt-runner.js.map +1 -0
  117. package/lib/prompt-state.d.ts +142 -0
  118. package/lib/prompt-state.js +101 -0
  119. package/lib/prompt-state.js.map +1 -0
  120. package/lib/prompt.d.ts +270 -0
  121. package/lib/prompt.js +408 -0
  122. package/lib/prompt.js.map +1 -0
  123. package/lib/provider.d.ts +44 -0
  124. package/lib/provider.js +66 -0
  125. package/lib/provider.js.map +1 -0
  126. package/lib/redact.d.ts +24 -0
  127. package/lib/redact.js +85 -0
  128. package/lib/redact.js.map +1 -0
  129. package/lib/registry.d.ts +187 -0
  130. package/lib/registry.js +235 -0
  131. package/lib/registry.js.map +1 -0
  132. package/lib/removal.d.ts +159 -0
  133. package/lib/removal.js +556 -0
  134. package/lib/removal.js.map +1 -0
  135. package/lib/render.d.ts +97 -0
  136. package/lib/render.js +530 -0
  137. package/lib/render.js.map +1 -0
  138. package/lib/repair-run.d.ts +76 -0
  139. package/lib/repair-run.js +506 -0
  140. package/lib/repair-run.js.map +1 -0
  141. package/lib/repair.d.ts +208 -0
  142. package/lib/repair.js +357 -0
  143. package/lib/repair.js.map +1 -0
  144. package/lib/repo.d.ts +78 -0
  145. package/lib/repo.js +184 -0
  146. package/lib/repo.js.map +1 -0
  147. package/lib/rules-commands.d.ts +46 -0
  148. package/lib/rules-commands.js +379 -0
  149. package/lib/rules-commands.js.map +1 -0
  150. package/lib/rules.d.ts +267 -0
  151. package/lib/rules.js +478 -0
  152. package/lib/rules.js.map +1 -0
  153. package/lib/save-core.d.ts +72 -0
  154. package/lib/save-core.js +220 -0
  155. package/lib/save-core.js.map +1 -0
  156. package/lib/search.d.ts +112 -0
  157. package/lib/search.js +282 -0
  158. package/lib/search.js.map +1 -0
  159. package/lib/session-rules.d.ts +222 -0
  160. package/lib/session-rules.js +454 -0
  161. package/lib/session-rules.js.map +1 -0
  162. package/lib/signature.d.ts +45 -0
  163. package/lib/signature.js +199 -0
  164. package/lib/signature.js.map +1 -0
  165. package/lib/store.d.ts +156 -0
  166. package/lib/store.js +368 -0
  167. package/lib/store.js.map +1 -0
  168. package/lib/sync.d.ts +220 -0
  169. package/lib/sync.js +810 -0
  170. package/lib/sync.js.map +1 -0
  171. package/lib/tools.d.ts +113 -0
  172. package/lib/tools.js +1090 -0
  173. package/lib/tools.js.map +1 -0
  174. package/lib/treedx/client.d.ts +57 -0
  175. package/lib/treedx/client.js +82 -0
  176. package/lib/treedx/client.js.map +1 -0
  177. package/lib/treedx/provider.d.ts +39 -0
  178. package/lib/treedx/provider.js +479 -0
  179. package/lib/treedx/provider.js.map +1 -0
  180. package/lib/treedx/state.d.ts +27 -0
  181. package/lib/treedx/state.js +65 -0
  182. package/lib/treedx/state.js.map +1 -0
  183. package/lib/types.d.ts +210 -0
  184. package/lib/types.js +31 -0
  185. package/lib/types.js.map +1 -0
  186. package/lib/version.d.ts +9 -0
  187. package/lib/version.js +10 -0
  188. package/lib/version.js.map +1 -0
  189. package/lib/vocabulary.d.ts +41 -0
  190. package/lib/vocabulary.js +118 -0
  191. package/lib/vocabulary.js.map +1 -0
  192. package/lib/warnings.d.ts +10 -0
  193. package/lib/warnings.js +18 -0
  194. package/lib/warnings.js.map +1 -0
  195. package/package.json +151 -3
@@ -0,0 +1,334 @@
1
+ /**
2
+ * Door 5 — subagent settlement auto-save (issue #47).
3
+ *
4
+ * The host publishes a `subagent/end` lifecycle event for every settled child
5
+ * run (one-shot AND each residency epoch of a continuable child). This module
6
+ * turns each such settlement of a chapters-preset child into an archive through
7
+ * the SHARED save core (src/save-core.ts) — the same pipeline `/chapters-save`
8
+ * runs, never a second implementation.
9
+ *
10
+ * The seam facts this leans on are MEASURED, not assumed
11
+ * (spikes/subagent-end/FINDINGS.md, host-subagent-seam drift rows):
12
+ * - `end` fires synchronously from a microtask attached at spawn, strictly
13
+ * BEFORE the run holder's dispose continuation → a SYNCHRONOUS snapshot
14
+ * inside the listener sees the live child's complete log and header.
15
+ * - the child header is durable kernel state (`childSessionMeta`):
16
+ * `origin: 'subagent'`, `parentSession`, `agentPreset`, `delegationDepth`.
17
+ * The gate reads the HEADER, never an event scan (a synthetic child can
18
+ * complete turns without ever carrying `agent-preset/selected` — measured).
19
+ * - fallback arm: `sessionQuery.listEvents` + `listSessions` headers are
20
+ * ambient-readable after disposal (not capability-gated) — used only when
21
+ * the live handle is gone at emit.
22
+ *
23
+ * Containment is the signature-listener discipline: the emitter catches listener
24
+ * throws by contract, but we ALSO never let one lose knowledge silently — every
25
+ * non-archive is either a quiet, expected skip (wrong preset, no completed turn)
26
+ * or a LOUD warn (unreadable, save failed).
27
+ */
28
+ import { diagnosticWarn } from "./diag.js";
29
+ import { formatWarnings } from "./warnings.js";
30
+ import { isActiveChapter } from "./registry.js";
31
+ import { saveSession } from "./save-core.js";
32
+ import { lineageOf } from "./types.js";
33
+ const hasCompletedTurn = (events) => events.some((e) => e.type === 'turn/end');
34
+ /**
35
+ * The listener factory. Pure against injected reads — the real pipeline is wired
36
+ * by `wireSubagentAutoSave` below, and both are covered by
37
+ * tests/{unit,integration} rows. The callback itself is SYNCHRONOUS on the
38
+ * snapshot (that is the race-avoidance), chained asynchronously per child.
39
+ */
40
+ export function makeSubagentEndListener(deps) {
41
+ // Per-child promise chain: repeated settlements of the SAME child serialize
42
+ // (the watermark makes the second save only see the first's records); distinct
43
+ // children never queue against each other. Same pattern as the signature listener.
44
+ const chains = new Map();
45
+ return (info) => {
46
+ try {
47
+ const id = info?.id;
48
+ if (typeof id !== 'string' || id === '') {
49
+ deps.warn('subagent auto-save: settlement event without a child session id — nothing archived');
50
+ return;
51
+ }
52
+ // --- synchronous snapshot NOW: `end` strictly precedes disposal (measured).
53
+ let view;
54
+ try {
55
+ view = deps.liveChild(id);
56
+ }
57
+ catch (error) {
58
+ deps.warn(`subagent auto-save: live read failed for ${id}: ${String(error?.message ?? error)}`);
59
+ view = undefined;
60
+ }
61
+ const hadLiveHandle = view !== undefined;
62
+ const job = async () => {
63
+ let arm = 'live';
64
+ if (view === undefined && deps.durableChild !== undefined) {
65
+ try {
66
+ view = await deps.durableChild(id);
67
+ arm = 'durable';
68
+ }
69
+ catch (error) {
70
+ deps.warn(`subagent auto-save: durable read failed for ${id}: ${String(error?.message ?? error)}`);
71
+ }
72
+ }
73
+ if (view === undefined) {
74
+ deps.warn(`subagent auto-save: child ${id} unreadable at settlement (live handle ${hadLiveHandle ? 'read failed' : 'gone'}${deps.durableChild === undefined ? ', no durable arm available' : ', durable read empty'}) — its knowledge was NOT archived`);
75
+ deps.onSettled?.(id, 'skipped:unreadable');
76
+ return;
77
+ }
78
+ const suffix = arm === 'durable' ? '@durable' : '';
79
+ // Gates, in the order the docs state. Expected skips are quiet: this fires
80
+ // for EVERY subagent in the profile; a warn per non-chapters child would
81
+ // bury the anomalies that need a human.
82
+ if (view.header.origin !== 'subagent') {
83
+ deps.onSettled?.(id, `skipped:origin${suffix}`);
84
+ return;
85
+ }
86
+ if (view.header.agentPreset !== deps.presetId) {
87
+ deps.onSettled?.(id, `skipped:preset${suffix}`);
88
+ return;
89
+ }
90
+ if (!hasCompletedTurn(view.events)) {
91
+ deps.onSettled?.(id, `skipped:no-completed-turn${suffix}`);
92
+ return;
93
+ }
94
+ try {
95
+ const out = await deps.save(view);
96
+ // #58: 'payloadless' is an anomaly, not an expected skip — the child settled with a
97
+ // read that carried no bytes, so its knowledge is NOT archived. Loud, by the same
98
+ // containment rule as 'unreadable'. 'nothing-new'/'no-completed-turn' stay quiet.
99
+ if (out.skipped === 'payloadless') {
100
+ deps.warn(`subagent auto-save: ${id} settled with an archive that rendered nothing — NOT archived (a payload-less read, not a short conversation): ${out.warnings.join('; ')}`);
101
+ }
102
+ deps.onSettled?.(id, out.skipped === null ? `saved${suffix}` : `skipped:${out.skipped}${suffix}`);
103
+ }
104
+ catch (error) {
105
+ deps.warn(`subagent auto-save: archiving ${id} failed: ${String(error?.message ?? error)} — its knowledge was NOT archived`);
106
+ deps.onSettled?.(id, `failed${suffix}`);
107
+ }
108
+ };
109
+ const prev = chains.get(id);
110
+ const next = prev === undefined ? job() : prev.then(job);
111
+ chains.set(id, next);
112
+ void next.catch(() => undefined).finally(() => { if (chains.get(id) === next)
113
+ chains.delete(id); });
114
+ }
115
+ catch (error) {
116
+ // never-break containment, twice: the emitter catches us, we catch ourselves.
117
+ deps.warn(`subagent auto-save listener threw (contained): ${String(error?.message ?? error)}`);
118
+ }
119
+ };
120
+ }
121
+ /**
122
+ * Bind the listener to the host-plane services: `agents` for the live read,
123
+ * `sessionQuery` for the durable fallback, `saveSession` for the archive.
124
+ * Returns the callback to register with `ctx.on('subagent/end', …)`.
125
+ *
126
+ * ENRICHMENT DELIBERATELY ABSENT: settlement never runs the annotator — a
127
+ * ten-child fanout must not fire ten LLM drains; new chapters are pending work
128
+ * for the idle/afterPush ladders exactly like a `/chapters-save` that skipped
129
+ * the manual nudge. A test pins that nothing here calls runNow.
130
+ */
131
+ /**
132
+ * The ONE payload-bearing durable read (docs/contract.md § Durable reads, issue #58).
133
+ *
134
+ * Door 5 needs it because a continuable child is disposed before `subagent/end`; the repair door
135
+ * (`/chapters-repair`, #60) needs the same thing because re-deriving a chapter is worthless if the read
136
+ * returns metadata rows. Two copies of "read the log" is how 12 children were archived as empty shells
137
+ * and the seam still looked alive: `listEvents` succeeds, returns 10 correctly-typed
138
+ * `SessionEventRecord`s, and none of them has `data`. So this function is exported and pinned by a
139
+ * source-shape row that fails if a door starts reading the log by hand again.
140
+ */
141
+ export async function readDurableSession(get, sessionId, onError) {
142
+ const sq = get('sessionQuery');
143
+ if (sq?.readSession === undefined)
144
+ return undefined;
145
+ // #101, measured live: the kernel can REFUSE a session (`stored session "ch-…" is corrupt: …`) even
146
+ // though the bytes decode fine offline, because it validates against its own format rules. Left
147
+ // uncaught, that one refusal propagated out of a per-session loop and cancelled an audit of 49
148
+ // rows — one poison item stopping the rest, the same rule the finalize queue already obeys. So the
149
+ // read is contained here, in the one helper both planes share, and the caller is handed the reason:
150
+ // skipping must be reported, never silent (#61a).
151
+ let read;
152
+ try {
153
+ read = await sq.readSession(sessionId);
154
+ }
155
+ catch (error) {
156
+ onError?.(String(error?.message ?? error).slice(0, 200));
157
+ return undefined;
158
+ }
159
+ const events = read?.events;
160
+ if (!Array.isArray(events) || events.length === 0)
161
+ return undefined;
162
+ // The header rides the same observation as the bytes being archived — origin/agentPreset/cwd are
163
+ // never inferred from a second scan (and never from the events, which is the r28 lesson).
164
+ return { events, header: read.session ?? {} };
165
+ }
166
+ /**
167
+ * The seventh archive moment (#61, Amendment A): **a rooted child that has never archived.**
168
+ *
169
+ * Door 5 is keyed on `origin: 'subagent'`. A `ch-*` continuation child is NOT a subagent — its header
170
+ * says `origin: user` with a `parentSession` — so no moment was watching it at all. The field case was
171
+ * `ch-dc3be3ab`: 2,363 events, 414 tool calls, 2 completed turns, `chapters: []`, `reservations: {}`.
172
+ * Not a failed archive: one never attempted. Its knowledge sits in the log and is invisible to every
173
+ * search on the machine, which is precisely what this plugin exists to prevent.
174
+ *
175
+ * This is the PURE gate — the listener below only does I/O, so the decision is testable (and reviewable)
176
+ * without a host.
177
+ */
178
+ export function shouldForceChildArchive(input) {
179
+ if (!input.enabled)
180
+ return { fire: false, reason: 'childAutoArchive is off in config' };
181
+ if (input.header.agentPreset !== 'chapters')
182
+ return { fire: false, reason: 'not a chapters-preset session' };
183
+ // door 5 owns delegation; two doors on one child would double-write the same span
184
+ if (input.header.origin === 'subagent')
185
+ return { fire: false, reason: 'owned by subagent settlement (door 5)' };
186
+ // Only a ROOTED child: a session with no parent anywhere is the user's own session, whose doors are
187
+ // 1–3 (a human, a button, pressure) and which this plugin must not archive behind their back.
188
+ const parent = input.header.parentSession ?? input.lineageParent ?? '';
189
+ if (parent === undefined || parent === '') {
190
+ return { fire: false, reason: 'no lineage (header, registry row, or ch- id) — a root session, doors 1–3 own it' };
191
+ }
192
+ if (input.anchor <= 0)
193
+ return { fire: false, reason: 'no completed turn yet' };
194
+ if (input.chapterCount === 0) {
195
+ return { fire: true, reason: 'never archived — the hole #61 measured (2,363 events, chapters: [])' };
196
+ }
197
+ if (input.completedTurnsAboveWatermark < input.minTurns) {
198
+ return { fire: false, reason: `${input.completedTurnsAboveWatermark} unarchived turn(s) < childAutoArchiveMinTurns=${input.minTurns}` };
199
+ }
200
+ return { fire: true, reason: `${input.completedTurnsAboveWatermark} completed turns past the watermark (seq ${input.lastArchivedSeq})` };
201
+ }
202
+ /**
203
+ * The listener. Save-only — creates NO session and compacts NO surface, so the "no
204
+ * continuation-creating actions mid-step" rule is not engaged (the same reasoning that let door 5
205
+ * exist). Fires only on `turn/end`, reads the LIVE session's own payload-bearing events, and is
206
+ * watermark-idempotent: a re-run finds `nothing-new` and writes nothing.
207
+ */
208
+ export function makeChildArchiveListener(deps) {
209
+ const chains = new Map();
210
+ const section = (id, job) => {
211
+ const prev = chains.get(id) ?? Promise.resolve();
212
+ const next = prev.then(job, job);
213
+ chains.set(id, next.then(() => undefined, () => undefined));
214
+ };
215
+ return (session, event) => {
216
+ try {
217
+ if (event?.type !== 'turn/end')
218
+ return;
219
+ const s = session;
220
+ const id = s?.id;
221
+ const header = s?.header;
222
+ const cwd = header?.cwd;
223
+ if (id === undefined || header === undefined || cwd === undefined || typeof s?.snapshotEvents !== 'function')
224
+ return;
225
+ const events = [...(s.snapshotEvents())];
226
+ const anchor = [...events].reverse().find((e) => e.type === 'turn/end')?.seq ?? -1;
227
+ section(id, async () => {
228
+ // resolved ONCE per section: calling the getter twice would reopen the domain store inside a
229
+ // live turn boundary.
230
+ const store = await deps.store();
231
+ const state0 = await store.get(id);
232
+ const lastArchived = state0.chapters.reduce((m, c) => Math.max(m, c.endSeq), -1);
233
+ const completed = events.filter((e) => e.type === 'turn/end' && e.seq > lastArchived && e.seq <= anchor).length;
234
+ const gate = shouldForceChildArchive({
235
+ header,
236
+ lineageParent: state0.parentSession ?? (id.startsWith('ch-') ? 'continuation-id' : undefined),
237
+ // #255: removed stubs are not knowledge either — the gate counts what IS knowledge,
238
+ // through the ONE predicate (the watermark line above still reads ALL records by design).
239
+ chapterCount: state0.chapters.filter(isActiveChapter).length,
240
+ lastArchivedSeq: lastArchived,
241
+ anchor,
242
+ completedTurnsAboveWatermark: completed,
243
+ minTurns: deps.minTurns,
244
+ enabled: deps.enabled,
245
+ });
246
+ if (!gate.fire)
247
+ return;
248
+ const out = await saveSession({
249
+ events, sessionId: id, cwd, store, config: deps.wiring,
250
+ subagentOf: lineageOf(header),
251
+ });
252
+ if (out.records.length > 0) {
253
+ deps.ctx.logger?.info?.(`dsh-chapters: forced child archive ${id} (${out.records.length} chapter(s), seqs ${out.fromSeq}..${out.anchor}) — ${gate.reason}`);
254
+ // enrichment QUEUED, never run inline: this fires inside a live turn boundary.
255
+ deps.wiring.scheduler?.schedule(cwd, 'archive:save');
256
+ deps.onArchived?.(id, out.records.length);
257
+ }
258
+ else if (out.skipped !== 'nothing-new') {
259
+ // loud, per #61: a door that decided to archive and then did not must say why.
260
+ diagnosticWarn(deps.ctx.logger, 'child-archive', `${id} forced archive produced nothing (${out.skipped ?? 'unknown'}); ${formatWarnings(out.warnings, 3)}`);
261
+ }
262
+ });
263
+ }
264
+ catch (error) {
265
+ diagnosticWarn(deps.ctx.logger, 'child-archive', `listener failed: ${String(error?.message ?? error)}`);
266
+ }
267
+ };
268
+ }
269
+ export function wireSubagentAutoSave(ctx, store, wiring) {
270
+ const warn = (message) => {
271
+ // #54: the shared seam (logger warn + sink), not a second copy of the same three lines.
272
+ diagnosticWarn(ctx.logger, 'auto-save', message);
273
+ };
274
+ const liveChild = (sessionId) => {
275
+ const agents = ctx.get?.('agents');
276
+ const handle = agents?.get?.(sessionId);
277
+ const session = handle?.agent?.session ?? handle?.session;
278
+ if (session === undefined || typeof session.snapshotEvents !== 'function')
279
+ return undefined;
280
+ return { events: [...session.snapshotEvents()], header: (session.header ?? {}) };
281
+ };
282
+ /**
283
+ * The durable arm — and for a **continuable** child the ONLY arm, because the host disposes the
284
+ * handle before it emits `subagent/end` (`host-subagent-seam.test.ts` F4). It must return
285
+ * payload-bearing events, so it reads `sessionQuery.readSession` (cloned header +
286
+ * `snapshotSessionEvent` events, one call) and **not** `listEvents`, whose `SessionEventRecord`
287
+ * rows carry `seq`/`type`/`time`/`surface` and no `data` — the shape that archived 12 children
288
+ * as empty shells (#58; `docs/contract.md` § Durable reads).
289
+ */
290
+ const durableChild = (sessionId) => readDurableSession((name) => { try {
291
+ return ctx.get?.(name);
292
+ }
293
+ catch {
294
+ return undefined;
295
+ } }, sessionId);
296
+ const save = async (child) => {
297
+ const cwd = child.header.cwd;
298
+ if (cwd === undefined || cwd === '')
299
+ throw new Error('subagent child session has no workspace cwd — nowhere reachable to write');
300
+ const out = await saveSession({
301
+ events: child.events,
302
+ sessionId: child.header.id ?? '',
303
+ cwd,
304
+ store,
305
+ config: wiring,
306
+ subagentOf: lineageOf(child.header),
307
+ });
308
+ // Lineage: the child stays its OWN root, and that is deliberate (#47 decision, re-checked
309
+ // under #58). Two candidate reasons to `linkChild` it to the parent were tested and both fail:
310
+ // a subagent is never an ANCESTOR of anything the parent walks, so `buildIndex` would still
311
+ // omit it from the parent's TOC; and `rootSession` is the STORE DIRECTORY (`archive.ts:110`,
312
+ // `engine-core.ts:310`), so linking would silently re-home every child chapter into the
313
+ // parent's tree. Cross-session reachability is search's job — `buildLocalCorpus` walks every
314
+ // tree under the store root — and rule ancestry already reads the kernel header's parentSession
315
+ // (`session-rules.ruleAncestorSet`), which the frontmatter records from the same source.
316
+ if (out.skipped === null && out.records.length > 0 && cwd !== '') {
317
+ wiring.scheduler?.schedule(cwd, 'archive:autoSave');
318
+ }
319
+ // #58: `writeArchive` already says "N event(s) rendered no output"; dropping that array was
320
+ // why an entire door of empty archives ran for days with a clean log. Surface every warning.
321
+ for (const w of out.warnings)
322
+ warn(`subagent auto-save: ${child.header.id ?? '?'}: ${w}`);
323
+ return { archived: out.records.length, skipped: out.skipped, warnings: out.warnings };
324
+ };
325
+ return makeSubagentEndListener({
326
+ presetId: wiring.presetId,
327
+ liveChild,
328
+ durableChild,
329
+ save,
330
+ warn,
331
+ onSettled: (id, outcome) => { ctx.logger?.info?.(`dsh-chapters: subagent ${id} settled → ${outcome}`); },
332
+ });
333
+ }
334
+ //# sourceMappingURL=auto-save.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-save.js","sourceRoot":"","sources":["../src/auto-save.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * The one user-role message of an auxiliary, out-of-band model call.
3
+ *
4
+ * Several features ask a model a question without entering a session: the post-relief plot elicitation in
5
+ * `engine.ts`, the bar's suggestion generators in `index.ts`. Their payload is a single user message streamed through
6
+ * `ctx.llm.stream(...)` — it is never admitted to a session log, so it makes no producer claim and needs no
7
+ * `plugin:*` kind.
8
+ *
9
+ * That distinction is the point of this file. Session format v4 retired the catch-all `source.kind: 'plugin'`
10
+ * (`@deepseek-ai/dsh-llm`'s `MessageSourceMap`: *"there is no shared catch-all `plugin` kind"*), and a bare `plugin`
11
+ * is refused at row admission on 0.2.x (#43). Four aux call sites still carried the retired spelling and passed every
12
+ * gate for two host minors, because the repo type-checked against 0.1.5-rc.2 while the rig boots 0.2.0-rc.2
13
+ * (`tests/unit/host-dep-pinning.test.ts` now forbids that drift). One helper, one honest kind.
14
+ */
15
+ import { createUserMessage } from '@deepseek-ai/dsh-llm';
16
+ /** @param text - the auxiliary prompt, verbatim. @returns a user-role message for a one-off `llm.stream` call. */
17
+ export declare function auxPromptMessage(text: string): ReturnType<typeof createUserMessage>;
@@ -0,0 +1,20 @@
1
+ /**
2
+ * The one user-role message of an auxiliary, out-of-band model call.
3
+ *
4
+ * Several features ask a model a question without entering a session: the post-relief plot elicitation in
5
+ * `engine.ts`, the bar's suggestion generators in `index.ts`. Their payload is a single user message streamed through
6
+ * `ctx.llm.stream(...)` — it is never admitted to a session log, so it makes no producer claim and needs no
7
+ * `plugin:*` kind.
8
+ *
9
+ * That distinction is the point of this file. Session format v4 retired the catch-all `source.kind: 'plugin'`
10
+ * (`@deepseek-ai/dsh-llm`'s `MessageSourceMap`: *"there is no shared catch-all `plugin` kind"*), and a bare `plugin`
11
+ * is refused at row admission on 0.2.x (#43). Four aux call sites still carried the retired spelling and passed every
12
+ * gate for two host minors, because the repo type-checked against 0.1.5-rc.2 while the rig boots 0.2.0-rc.2
13
+ * (`tests/unit/host-dep-pinning.test.ts` now forbids that drift). One helper, one honest kind.
14
+ */
15
+ import { createUserMessage } from '@deepseek-ai/dsh-llm';
16
+ /** @param text - the auxiliary prompt, verbatim. @returns a user-role message for a one-off `llm.stream` call. */
17
+ export function auxPromptMessage(text) {
18
+ return createUserMessage({ content: [{ type: 'text', text }], source: { kind: 'user' } });
19
+ }
20
+ //# sourceMappingURL=aux-message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aux-message.js","sourceRoot":"","sources":["../src/aux-message.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAExD,kHAAkH;AAClH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAA;AAC3F,CAAC"}