@dsh-cc/memory-consolidation 0.8.0-rc.1 → 0.8.0-rc.3

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.
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Dream dispatch diagnostics: a durable "why did the dream die" breadcrumb
3
+ * inside the memory directory. The file `.dream-last-error.json` carries the
4
+ * LATEST failure (overwrite, never append — failure is a cold path and one
5
+ * fresh record beats an unbounded log):
6
+ * `{ at, pid, sessionId, phase, detail }` where phase distinguishes the death
7
+ * modes: `dispatch-started` (spawn dispatched, outcome unknown = hang when the
8
+ * file is never overwritten), `dispatch-throw` (the dispatch threw; detail
9
+ * carries the error + stack), `outcome-failed` (the job settled as failed or
10
+ * killed; detail carries the job outcome).
11
+ *
12
+ * The write mirrors lock.ts/pressure.ts byte-for-byte (`fs.writeText(target,
13
+ * content, policy)` direct write) — it MUST NOT go through `writeMemoryFiles`,
14
+ * whose FILE_NAME whitelist rejects dotfiles/`.json`. Never throws: a
15
+ * diagnostic failure must not kill the dream path it is reporting on.
16
+ * @module @dsh-cc/memory-consolidation/diagnostics
17
+ */
18
+ import type { Context } from '@deepseek-ai/cordis';
19
+ import type { FileSystem } from '@deepseek-ai/dsh-fs';
20
+ import type { MemoryWritePolicy } from '@dsh-cc/memory';
21
+ /** Diagnostic filename inside the workspace memory directory. */
22
+ export declare const DREAM_DIAGNOSTIC_FILE = ".dream-last-error.json";
23
+ /** The death mode the entry records. */
24
+ export type DreamDiagnosticPhase = 'dispatch-started' | 'dispatch-throw' | 'outcome-failed';
25
+ /** One diagnostic record; written as `{ at, pid, ...entry }` JSON. */
26
+ export interface DreamDiagnosticEntry {
27
+ /** The owning session id (`agent.session.header.id`). */
28
+ sessionId: string;
29
+ phase: DreamDiagnosticPhase;
30
+ /** Human-readable error text (error + stack, or the job outcome detail). */
31
+ detail: string;
32
+ }
33
+ /**
34
+ * Overwrite `<dir>/.dream-last-error.json` with the entry. Best-effort: any
35
+ * failure is swallowed after a single `ctx.logger.warn` so diagnostics can
36
+ * never break a dream (plan §2.1, review Minor-3).
37
+ * @param ctx - the host context (logger only).
38
+ * @param fs - the filesystem seam.
39
+ * @param dir - the workspace memory directory holding the diagnostic file.
40
+ * @param policy - per-call sandbox policy for the write (same as the lock).
41
+ * @param entry - the phase/session/detail payload.
42
+ */
43
+ export declare function recordDreamDiagnostic(ctx: Context, fs: FileSystem, dir: string, policy: MemoryWritePolicy | undefined, entry: DreamDiagnosticEntry): Promise<void>;
44
+ //# sourceMappingURL=diagnostics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAY,MAAM,qBAAqB,CAAA;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAEvD,iEAAiE;AACjE,eAAO,MAAM,qBAAqB,2BAA2B,CAAA;AAE7D,wCAAwC;AACxC,MAAM,MAAM,oBAAoB,GAAG,kBAAkB,GAAG,gBAAgB,GAAG,gBAAgB,CAAA;AAE3F,sEAAsE;AACtE,MAAM,WAAW,oBAAoB;IACnC,yDAAyD;IACzD,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,oBAAoB,CAAA;IAC3B,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,OAAO,EACZ,EAAE,EAAE,UAAU,EACd,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,iBAAiB,GAAG,SAAS,EACrC,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAQf"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Dream dispatch diagnostics: a durable "why did the dream die" breadcrumb
3
+ * inside the memory directory. The file `.dream-last-error.json` carries the
4
+ * LATEST failure (overwrite, never append — failure is a cold path and one
5
+ * fresh record beats an unbounded log):
6
+ * `{ at, pid, sessionId, phase, detail }` where phase distinguishes the death
7
+ * modes: `dispatch-started` (spawn dispatched, outcome unknown = hang when the
8
+ * file is never overwritten), `dispatch-throw` (the dispatch threw; detail
9
+ * carries the error + stack), `outcome-failed` (the job settled as failed or
10
+ * killed; detail carries the job outcome).
11
+ *
12
+ * The write mirrors lock.ts/pressure.ts byte-for-byte (`fs.writeText(target,
13
+ * content, policy)` direct write) — it MUST NOT go through `writeMemoryFiles`,
14
+ * whose FILE_NAME whitelist rejects dotfiles/`.json`. Never throws: a
15
+ * diagnostic failure must not kill the dream path it is reporting on.
16
+ * @module @dsh-cc/memory-consolidation/diagnostics
17
+ */
18
+ import { join } from 'node:path';
19
+ /** Diagnostic filename inside the workspace memory directory. */
20
+ export const DREAM_DIAGNOSTIC_FILE = '.dream-last-error.json';
21
+ /**
22
+ * Overwrite `<dir>/.dream-last-error.json` with the entry. Best-effort: any
23
+ * failure is swallowed after a single `ctx.logger.warn` so diagnostics can
24
+ * never break a dream (plan §2.1, review Minor-3).
25
+ * @param ctx - the host context (logger only).
26
+ * @param fs - the filesystem seam.
27
+ * @param dir - the workspace memory directory holding the diagnostic file.
28
+ * @param policy - per-call sandbox policy for the write (same as the lock).
29
+ * @param entry - the phase/session/detail payload.
30
+ */
31
+ export async function recordDreamDiagnostic(ctx, fs, dir, policy, entry) {
32
+ try {
33
+ const target = await fs.resolve(join(dir, DREAM_DIAGNOSTIC_FILE));
34
+ const content = `${JSON.stringify({ at: Date.now(), pid: process.pid, ...entry })}\n`;
35
+ await fs.writeText(target, content, undefined, undefined, policy);
36
+ }
37
+ catch (err) {
38
+ ctx.logger.warn(`memory-consolidation: failed to write dream diagnostic: ${String(err)}`);
39
+ }
40
+ }
41
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAKhC,iEAAiE;AACjE,MAAM,CAAC,MAAM,qBAAqB,GAAG,wBAAwB,CAAA;AAc7D;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,GAAY,EACZ,EAAc,EACd,GAAW,EACX,MAAqC,EACrC,KAA2B;IAE3B,IAAI,CAAC;QACH,MAAM,MAAM,GAAa,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC,CAAA;QAC3E,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC,IAAI,CAAA;QACrF,MAAM,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;IACnE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,2DAA2D,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAC3F,CAAC;AACH,CAAC"}
package/lib/index.d.ts CHANGED
@@ -17,10 +17,13 @@
17
17
  */
18
18
  import type { Context } from '@deepseek-ai/cordis';
19
19
  import z from '@deepseek-ai/schemastery';
20
+ export { applyEntrypointFallback } from './memory-job.ts';
20
21
  export { LOCK_FILE, LOCK_STALE_MS, readLastConsolidatedAt, rollbackLock, tryAcquireLock } from './lock.ts';
21
22
  export { gatesPass, timeGatePasses, sessionGatePasses } from './gates.ts';
22
23
  export type { ConsolidationGateInput } from './gates.ts';
23
24
  export { MEMORY_AGENT_TOOLS, MEMORY_TOOL_FILTER } from './tools.ts';
25
+ export { DREAM_DIAGNOSTIC_FILE, recordDreamDiagnostic } from './diagnostics.ts';
26
+ export type { DreamDiagnosticEntry, DreamDiagnosticPhase } from './diagnostics.ts';
24
27
  export { buildConsolidationPrompt, buildExtractionPrompt } from './prompts.ts';
25
28
  export { MEMORY_WRITES_SCHEMA, WRITEBACK_MAX_FILE_BYTES, WRITEBACK_MAX_FILES, WRITEBACK_MAX_TOTAL_BYTES, memoryWritePolicy, validateMemoryWrites, writeMemoryFiles, } from '@dsh-cc/memory';
26
29
  export type { MemoryWrite, MemoryWritePolicy } from '@dsh-cc/memory';
@@ -45,21 +48,10 @@ export interface Config {
45
48
  pressureCooldownMinutes?: number;
46
49
  /** One-shot subagent provider for forks (default `fork`). */
47
50
  subagentProviderName?: string;
51
+ /** Session store root the gates scan (default `<DSH_HOME>/sessions`). */
52
+ sessionsRoot?: string;
48
53
  }
49
54
  export declare const Config: z<Config>;
50
- /**
51
- * Design §2.4 fallback: if the reported payload carries an over-limit
52
- * `MEMORY.md`, replace its content with the deterministic truncation output
53
- * (capped body + visible in-file warning banner) instead of failing the job.
54
- * Plain rejection would fail the dream, roll back the lock, and retry every
55
- * turn-end forever with zero durable output. Topic-file writes pass through
56
- * untouched; a compliant entrypoint is returned byte-identical. Takes the raw
57
- * structured payload (the entrypoint gate inside `validateMemoryWrites`
58
- * throws during validation, so the replacement must happen before it) and
59
- * returns a payload of the same shape; malformed payloads pass through and
60
- * are rejected by validation as usual.
61
- */
62
- export declare function applyEntrypointFallback(payload: unknown): unknown;
63
55
  /**
64
56
  * Register the consolidation plugin.
65
57
  * @param ctx - the host context with jobs, subagents, fs, and sessions.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,CAAC,MAAM,0BAA0B,CAAA;AAwBxC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,sBAAsB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAC1G,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACzE,YAAY,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AACxD,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AACnE,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAG9E,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,mBAAmB,EACnB,yBAAyB,EACzB,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,gBAAgB,CAAA;AACvB,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAEpE,eAAO,MAAM,IAAI,yBAAyB,CAAA;AAC1C,uEAAuE;AACvE,eAAO,MAAM,MAAM,UAAwB,CAAA;AAE3C,0CAA0C;AAC1C,MAAM,WAAW,MAAM;IACrB,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,+CAA+C;IAC/C,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,gDAAgD;IAChD,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,gEAAgE;IAChE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,qEAAqE;IACrE,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,6DAA6D;IAC7D,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED,eAAO,MAAM,MAAM,EAAE,CAAC,CAAC,MAAM,CAS3B,CAAA;AAuDF;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAajE;AA+ED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,GAAE,MAAW,GAAG,IAAI,CAmD7D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,CAAC,MAAM,0BAA0B,CAAA;AAUxC,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AASzD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,sBAAsB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAC1G,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACzE,YAAY,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AACxD,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AACnE,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAC/E,YAAY,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAClF,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAG9E,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,mBAAmB,EACnB,yBAAyB,EACzB,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,gBAAgB,CAAA;AACvB,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAEpE,eAAO,MAAM,IAAI,yBAAyB,CAAA;AAC1C,uEAAuE;AACvE,eAAO,MAAM,MAAM,UAAwB,CAAA;AAE3C,0CAA0C;AAC1C,MAAM,WAAW,MAAM;IACrB,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,+CAA+C;IAC/C,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,gDAAgD;IAChD,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,gEAAgE;IAChE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,qEAAqE;IACrE,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,6DAA6D;IAC7D,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,eAAO,MAAM,MAAM,EAAE,CAAC,CAAC,MAAM,CAU3B,CAAA;AAIF;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,GAAE,MAAW,GAAG,IAAI,CAkF7D"}
package/lib/index.js CHANGED
@@ -16,17 +16,22 @@
16
16
  * @module @dsh-cc/memory-consolidation
17
17
  */
18
18
  import { join } from 'node:path';
19
+ import * as zlib from 'node:zlib';
19
20
  import z from '@deepseek-ai/schemastery';
20
21
  import { delegationDepthOf } from '@deepseek-ai/dsh-subagent';
21
22
  import { defaultDshHome } from '@deepseek-ai/dsh-home-paths';
22
- import { MEMORY_TOOL_FILTER } from "./tools.js";
23
23
  import { buildConsolidationPrompt, buildExtractionPrompt } from "./prompts.js";
24
- import { gatesPass } from "./gates.js";
24
+ import { timeGatePasses, sessionGatePasses } from "./gates.js";
25
+ import { gateWindow, scanSessions } from "./session-scan.js";
25
26
  import { readLastConsolidatedAt, rollbackLock, tryAcquireLock, LOCK_STALE_MS } from "./lock.js";
26
- import { MEMORY_WRITES_SCHEMA, memoryWritePolicy, resolveWorkspaceMemoryDir, validateMemoryWrites, writeMemoryFiles, ENTRYPOINT_NAME, MAX_ENTRYPOINT_LINES, MAX_ENTRYPOINT_BYTES, truncateEntrypointContent, readPressure, markPressureForced, clearPressure, } from '@dsh-cc/memory';
27
+ import { startMemoryJob } from "./memory-job.js";
28
+ import { recordDreamDiagnostic } from "./diagnostics.js";
29
+ export { applyEntrypointFallback } from "./memory-job.js";
30
+ import { memoryWritePolicy, resolveWorkspaceMemoryDir, readPressure, markPressureForced, clearPressure, } from '@dsh-cc/memory';
27
31
  export { LOCK_FILE, LOCK_STALE_MS, readLastConsolidatedAt, rollbackLock, tryAcquireLock } from "./lock.js";
28
32
  export { gatesPass, timeGatePasses, sessionGatePasses } from "./gates.js";
29
33
  export { MEMORY_AGENT_TOOLS, MEMORY_TOOL_FILTER } from "./tools.js";
34
+ export { DREAM_DIAGNOSTIC_FILE, recordDreamDiagnostic } from "./diagnostics.js";
30
35
  export { buildConsolidationPrompt, buildExtractionPrompt } from "./prompts.js";
31
36
  // The write-back lives in @dsh-cc/memory (the memory directory owner);
32
37
  // re-exported here for consumers of the pre-move surface.
@@ -43,113 +48,8 @@ export const Config = z.object({
43
48
  lockStaleMs: z.number().default(LOCK_STALE_MS),
44
49
  pressureCooldownMinutes: z.number().default(60),
45
50
  subagentProviderName: z.string().default('fork'),
51
+ sessionsRoot: z.string(),
46
52
  });
47
- /**
48
- * Over-limit measurement for the entrypoint, identical to the write-side gate
49
- * semantics (trim → split('\n') → count; byteLength of the trimmed content).
50
- * @param content - a reported `MEMORY.md` body.
51
- */
52
- function entrypointOverLimit(content) {
53
- const trimmed = content.trim();
54
- return trimmed.split('\n').length > MAX_ENTRYPOINT_LINES
55
- || Buffer.byteLength(trimmed, 'utf8') > MAX_ENTRYPOINT_BYTES;
56
- }
57
- /**
58
- * Design §2.4 fallback: if the reported payload carries an over-limit
59
- * `MEMORY.md`, replace its content with the deterministic truncation output
60
- * (capped body + visible in-file warning banner) instead of failing the job.
61
- * Plain rejection would fail the dream, roll back the lock, and retry every
62
- * turn-end forever with zero durable output. Topic-file writes pass through
63
- * untouched; a compliant entrypoint is returned byte-identical. Takes the raw
64
- * structured payload (the entrypoint gate inside `validateMemoryWrites`
65
- * throws during validation, so the replacement must happen before it) and
66
- * returns a payload of the same shape; malformed payloads pass through and
67
- * are rejected by validation as usual.
68
- */
69
- export function applyEntrypointFallback(payload) {
70
- if (typeof payload !== 'object' || payload === null || Array.isArray(payload))
71
- return payload;
72
- const raw = payload.writes;
73
- if (!Array.isArray(raw))
74
- return payload;
75
- const writes = raw.map((entry) => {
76
- if (typeof entry !== 'object' || entry === null)
77
- return entry;
78
- const { path, content } = entry;
79
- if (path !== ENTRYPOINT_NAME || typeof content !== 'string' || !entrypointOverLimit(content)) {
80
- return entry;
81
- }
82
- return { ...entry, content: truncateEntrypointContent(content).content };
83
- });
84
- return { ...payload, writes };
85
- }
86
- /**
87
- * Start a memory-scoped forked subagent as a background job. The fork reports
88
- * its file set via `outputSchema`; on settlement the plugin validates the
89
- * batch and writes it host-side under a policy confined to `dir`. Resolves to
90
- * a control object with an abort hook and a settle promise (true only when
91
- * the reported writes were validated and persisted).
92
- */
93
- async function startMemoryJob(ctx, agent, dir, provider, label, prompt) {
94
- const jobs = ctx.get('jobs');
95
- const subagents = ctx.get('subagents');
96
- if (jobs === undefined || subagents === undefined) {
97
- return { abort: () => { }, settled: Promise.resolve(false) };
98
- }
99
- const fs = ctx.get('fs');
100
- const controller = new AbortController();
101
- // `subagents.start` is async upstream — awaiting it is what exposes the run's
102
- // `result` promise. Reading `run.result` on the un-awaited Promise throws
103
- // "Cannot read properties of undefined (reading 'then')" and poisons the
104
- // turn-stopping dispatch.
105
- const run = await subagents.start(provider, {
106
- label,
107
- signal: controller.signal,
108
- prompt: [{ type: 'text', text: prompt }],
109
- parent: agent,
110
- toolFilter: MEMORY_TOOL_FILTER,
111
- // Defense-in-depth recursion cap: the top-level listener already gates on
112
- // depth zero, so this fork's child never delegates. maxDepth is compared
113
- // against the CHILD's resolved depth (parent + 1); a top-level parent's
114
- // child resolves to 1 and passes, a grandchild to 2 is rejected.
115
- maxDepth: 1,
116
- outputSchema: MEMORY_WRITES_SCHEMA,
117
- });
118
- // Real job-done wiring: `done` maps the subagent outcome onto the JobHooks
119
- // contract (must never reject). Aborted → killed (rolls back the dream
120
- // lock); a non-completed stopReason, a missing/invalid payload, or a
121
- // write-back failure → failed with detail; a validated, persisted batch →
122
- // completed. All branches resolve.
123
- const done = run.result.then(async (res) => {
124
- if (controller.signal.aborted)
125
- return { status: 'killed' };
126
- if (res?.stopReason !== 'completed') {
127
- return { status: 'failed', detail: `memory fork ended with stopReason ${String(res?.stopReason)}` };
128
- }
129
- if (fs === undefined) {
130
- return { status: 'failed', detail: 'fs seam unavailable for memory write-back' };
131
- }
132
- try {
133
- const writes = validateMemoryWrites(applyEntrypointFallback(res.structured));
134
- await writeMemoryFiles(fs, dir, writes);
135
- return { status: 'completed' };
136
- }
137
- catch (err) {
138
- return { status: 'failed', detail: String(err) };
139
- }
140
- }, (err) => controller.signal.aborted ? { status: 'killed' } : { status: 'failed', detail: String(err) });
141
- const settled = done.then(o => o.status === 'completed');
142
- jobs.start({
143
- kind: 'subagent',
144
- label,
145
- owner: agent,
146
- run: () => ({
147
- cancel: (reason) => { controller.abort(reason); },
148
- done,
149
- }),
150
- });
151
- return { abort: (reason) => { controller.abort(reason); }, settled };
152
- }
153
53
  /**
154
54
  * Register the consolidation plugin.
155
55
  * @param ctx - the host context with jobs, subagents, fs, and sessions.
@@ -164,11 +64,40 @@ export function apply(ctx, config = {}) {
164
64
  const minHours = config.minHours ?? 24;
165
65
  const minSessions = config.minSessions ?? 5;
166
66
  const pressureCooldownMinutes = config.pressureCooldownMinutes ?? 60;
67
+ const sessionsRoot = config.sessionsRoot ?? join(defaultDshHome(), 'sessions');
167
68
  // Per-session extraction single-flight. Keyed by session id so each top-level
168
69
  // agent's in-flight flag and last-spawned event count are isolated.
169
70
  const flight = new Map();
170
71
  // One dream in flight across the whole plugin instance (per memory dir).
171
72
  let dreamInFlight = false;
73
+ // Scan memo (plan §3.4): caches the RAW unfiltered SessionScanResult for
74
+ // SCAN_MEMO_MS; the lastAt filter/count/hints are recomputed per call. It
75
+ // bounds the failure-path scan storm (lock rolled back → time gate keeps
76
+ // passing → every turn-end would otherwise rescan the store).
77
+ let memo = null;
78
+ // Once-per-process warn state (plan §3.5).
79
+ let warnedRoot = false;
80
+ let warnedZstd = false;
81
+ const scan = async () => {
82
+ const now = Date.now();
83
+ if (memo !== null && now - memo.at < SCAN_MEMO_MS) {
84
+ ctx.logger.debug({ event: 'memory:scan-memo-hit' });
85
+ return memo.result;
86
+ }
87
+ if (typeof zlib.createZstdDecompress !== 'function' && !warnedZstd) {
88
+ warnedZstd = true;
89
+ ctx.logger.warn('memory-consolidation: node:zlib zstd capability missing; dream gates fail closed');
90
+ }
91
+ const t0 = Date.now();
92
+ const result = await scanSessions(sessionsRoot);
93
+ ctx.logger.debug({ event: 'memory:scan', scanned: result.scanned, unreadable: result.unreadable, count: result.sessions.length, ms: Date.now() - t0 });
94
+ if (result.scanned === 0 && !warnedRoot) {
95
+ warnedRoot = true;
96
+ ctx.logger.warn(`memory-consolidation: sessions root unreadable or empty at ${sessionsRoot}`);
97
+ }
98
+ memo = { at: Date.now(), result };
99
+ return result;
100
+ };
172
101
  // Reset the flight state when this plugin fiber is disposed (hygiene / test
173
102
  // isolation). cordis `ctx.on` is typed strictly to `keyof Events`, so cleanup
174
103
  // is registered as a fiber effect rather than a 'dispose' listener.
@@ -201,13 +130,19 @@ export function apply(ctx, config = {}) {
201
130
  if (config.dreamEnabled ?? true) {
202
131
  if (!dreamInFlight) {
203
132
  dreamInFlight = true;
204
- void runDream(ctx, agent, home, provider, minHours, minSessions, pressureCooldownMinutes)
205
- .catch(() => { })
133
+ void runDream(ctx, agent, home, provider, minHours, minSessions, pressureCooldownMinutes, sessionsRoot, scan)
134
+ .catch((err) => { ctx.logger.warn(`memory-consolidation: dream dispatch failed: ${String(err)}`); })
206
135
  .finally(() => { dreamInFlight = false; });
207
136
  }
208
137
  }
209
138
  });
210
139
  }
140
+ /** Memo TTL for the raw session-scan result (plan §3.4). */
141
+ const SCAN_MEMO_MS = 30 * 60_000;
142
+ /** The agent's workspace cwd: where its memory directory is resolved from. */
143
+ function agentCwd(agent) {
144
+ return agent.session.header.cwd ?? process.cwd();
145
+ }
211
146
  /**
212
147
  * Whether an agent is top-level (not a delegated subagent). This is the root
213
148
  * fix for the extraction/dream recursion: a subagent's own turn-end must never
@@ -231,7 +166,7 @@ const INDEX_TRUNCATED_MARKER = '(index truncated; rely on MEMORY.md in-dir for t
231
166
  async function runExtraction(ctx, agent, home, provider) {
232
167
  // The extraction writes into the turning agent's repository directory —
233
168
  // the shared home root holds only explicitly-global memories.
234
- const dir = resolveWorkspaceMemoryDir(home, sessionTranscriptDir(agent));
169
+ const dir = resolveWorkspaceMemoryDir(home, agentCwd(agent));
235
170
  // Only model-visible surface events count toward the batch size.
236
171
  const surfaceCount = agent.session.snapshotEvents().filter((e) => SURFACE_EVENT_TYPES.has(e.type)).length;
237
172
  // The index read happens AFTER the in-flight/content gates (runExtraction is
@@ -302,86 +237,90 @@ async function readExistingIndex(ctx, dir) {
302
237
  return '';
303
238
  }
304
239
  }
305
- async function runDream(ctx, agent, home, provider, minHours, minSessions, pressureCooldownMinutes) {
240
+ async function runDream(ctx, agent, home, provider, minHours, minSessions, pressureCooldownMinutes, sessionsRoot, scan) {
306
241
  const fs = ctx.get('fs');
307
242
  if (fs === undefined)
308
243
  return;
309
- const dir = resolveWorkspaceMemoryDir(home, sessionTranscriptDir(agent));
244
+ const dir = resolveWorkspaceMemoryDir(home, agentCwd(agent));
310
245
  const now = Date.now();
311
246
  const policy = memoryWritePolicy(dir);
312
247
  const pressure = await readPressure(fs, dir);
313
248
  const lastAt = await readLastConsolidatedAt(fs, dir);
314
- const sessionIds = listNewSessions(ctx, lastAt);
249
+ let hints;
315
250
  if (pressure.armedAt > 0) {
316
251
  // Pressure mode: an armed marker bypasses the time/session gates. The
317
252
  // cooldown is measured from `lastForcedAt` (not `armedAt`) so a tight arm
318
253
  // loop of rejecting saves cannot spin dreams faster than the knob;
319
254
  // backwards clock skew (negative delta) counts as within-cooldown.
320
- if (now - pressure.lastForcedAt < pressureCooldownMinutes * 60_000)
255
+ if (now - pressure.lastForcedAt < pressureCooldownMinutes * 60_000) {
256
+ ctx.logger.debug({ event: 'memory:dream-gates', mode: 'pressure', lastAt, count: 0, minSessions, pass: false, reason: 'cooldown' });
321
257
  return;
258
+ }
322
259
  // Stamp BEFORE acquiring the lock: consumes the cooldown slot even if the
323
260
  // lock is held or the spawn never happens, making the crash-window spawn
324
261
  // storm structurally impossible. Failure keeps the marker with this stamp
325
262
  // so the next window retries.
326
263
  await markPressureForced(fs, dir, pressure.armedAt, now, policy);
264
+ // Scan AFTER the stamp (plan §3.2/§3.3): a zero scan skips the spawn with
265
+ // the marker still armed — the lock was never acquired, so there is
266
+ // nothing to roll back and the next cooldown window retries.
267
+ const scanResult = await scan();
268
+ const window = gateWindow(scanResult.sessions, lastAt);
269
+ ctx.logger.debug({ event: 'memory:dream-gates', mode: 'pressure', lastAt, count: window.count, minSessions, pass: true });
270
+ if (scanResult.scanned === 0)
271
+ return;
272
+ hints = window.hints;
327
273
  }
328
- else if (!gatesPass({
329
- lastConsolidatedAt: lastAt,
330
- now,
331
- minHours,
332
- sessionCount: sessionIds.length,
333
- minSessions,
334
- })) {
335
- return;
274
+ else {
275
+ // Periodic: the pure-arithmetic time gate runs FIRST, before any scan I/O;
276
+ // the session-count gate runs only on the scanned result.
277
+ if (!timeGatePasses(lastAt, now, minHours)) {
278
+ ctx.logger.debug({ event: 'memory:dream-gates', mode: 'periodic', lastAt, count: 0, minSessions, pass: false, reason: 'time' });
279
+ return;
280
+ }
281
+ const scanResult = await scan();
282
+ const window = gateWindow(scanResult.sessions, lastAt);
283
+ const pass = sessionGatePasses(window.count, minSessions);
284
+ ctx.logger.debug({ event: 'memory:dream-gates', mode: 'periodic', lastAt, count: window.count, minSessions, pass });
285
+ if (!pass)
286
+ return;
287
+ hints = window.hints;
336
288
  }
337
289
  const priorAt = await tryAcquireLock(fs, dir, process.pid, now, policy);
338
- if (priorAt === null)
290
+ if (priorAt === null) {
291
+ ctx.logger.warn(`memory-consolidation: consolidation lock held by a live holder in ${dir}`);
339
292
  return;
340
- const prompt = buildConsolidationPrompt(dir, sessionTranscriptDir(agent), sessionIds);
341
- const job = await startMemoryJob(ctx, agent, dir, provider, 'memory-consolidation', prompt);
342
- void job.settled.then((ok) => {
343
- if (!ok) {
344
- void rollbackLock(fs, dir, priorAt, policy);
345
- return;
346
- }
347
- // Success tombs the marker in BOTH modes: a successful periodic dream
348
- // rebuilds the index, so a stale pending marker is obsolete by definition.
349
- void clearPressure(fs, dir, now, policy);
350
- });
351
- }
352
- /** Live sessions are the transcripts available to review; absent sessions skip. */
353
- function listNewSessions(ctx, lastAt) {
354
- const sessions = ctx.get('sessions');
355
- if (sessions === undefined)
356
- return [];
357
- return sessions
358
- .list()
359
- // Subagent sessions (validated delegationDepth > 0) are excluded from both
360
- // the min-sessions count and the dream input: their content is already
361
- // covered by turn-end extraction. Absent/invalid depth is treated as 0.
362
- .filter(session => {
363
- const d = session.header?.delegationDepth;
364
- return !(Number.isSafeInteger(d) && d > 0);
365
- })
366
- .map(session => ({ id: session.id, at: sessionStartOf(session) }))
367
- .filter(session => session.at > lastAt)
368
- .sort((a, b) => a.at - b.at)
369
- .map(session => session.id);
370
- }
371
- /**
372
- * Session start epoch, defensively read from the header. The dream gate is
373
- * skip-oriented, so an unreadable or absent timestamp conservatively counts as
374
- * NEW (over-inclusion only costs a re-read). Accepted limitation: a session
375
- * created before `lastAt` but still active after it is excluded from the dream
376
- * input — turn-end extraction covers recent content; dream is a coarse
377
- * periodic pass.
378
- */
379
- function sessionStartOf(session) {
380
- const at = session.header?.createdAt;
381
- return Number.isSafeInteger(at) && at > 0 ? at : Number.MAX_SAFE_INTEGER;
382
- }
383
- /** The transcript directory is the agent's cwd. */
384
- function sessionTranscriptDir(agent) {
385
- return agent.session.header.cwd ?? process.cwd();
293
+ }
294
+ // Diagnostics + lock hygiene from here on: everything after the acquire can
295
+ // strand the lock (a startMemoryJob throw, an earlier silent death), so the
296
+ // whole spawn is wrapped and every failure leaves a durable breadcrumb
297
+ // before the rollback (plan §2.2, review Major-1/Major-2).
298
+ const sessionId = agent.session.header.id;
299
+ try {
300
+ await recordDreamDiagnostic(ctx, fs, dir, policy, { sessionId, phase: 'dispatch-started', detail: '' });
301
+ const prompt = buildConsolidationPrompt(dir, sessionsRoot, hints);
302
+ const job = await startMemoryJob(ctx, agent, dir, provider, 'memory-consolidation', prompt);
303
+ void job.done.then(async (outcome) => {
304
+ ctx.logger.debug({ event: 'memory:dream-outcome', status: outcome.status, detail: outcome.status === 'failed' ? outcome.detail : undefined });
305
+ if (outcome.status !== 'completed') {
306
+ await recordDreamDiagnostic(ctx, fs, dir, policy, {
307
+ sessionId,
308
+ phase: 'outcome-failed',
309
+ detail: outcome.status === 'failed' ? outcome.detail : outcome.status,
310
+ });
311
+ void rollbackLock(fs, dir, priorAt, policy);
312
+ return;
313
+ }
314
+ // Success tombs the marker in BOTH modes: a successful periodic dream
315
+ // rebuilds the index, so a stale pending marker is obsolete by definition.
316
+ void clearPressure(fs, dir, now, policy);
317
+ });
318
+ }
319
+ catch (err) {
320
+ const detail = err instanceof Error && err.stack ? `${String(err)}\n${err.stack}` : String(err);
321
+ await recordDreamDiagnostic(ctx, fs, dir, policy, { sessionId, phase: 'dispatch-throw', detail });
322
+ await rollbackLock(fs, dir, priorAt, policy);
323
+ ctx.logger.warn(`memory-consolidation: dream dispatch failed: ${detail}`);
324
+ }
386
325
  }
387
326
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * The jobs-seam spawn helper for memory forks (extraction and dream): starts
3
+ * the one-shot subagent as a background job and maps the settled outcome onto
4
+ * the JobHooks contract.
5
+ * @module @dsh-cc/memory-consolidation/memory-job
6
+ */
7
+ import type { Context } from '@deepseek-ai/cordis';
8
+ import type { Agent } from '@deepseek-ai/dsh-agent';
9
+ /** The job-done outcome: resolves only, per the JobHooks contract. */
10
+ export type JobOutcome = {
11
+ status: 'completed';
12
+ } | {
13
+ status: 'killed';
14
+ } | {
15
+ status: 'failed';
16
+ detail: string;
17
+ };
18
+ /**
19
+ * Design §2.4 fallback: if the reported payload carries an over-limit
20
+ * `MEMORY.md`, replace its content with the deterministic truncation output
21
+ * (capped body + visible in-file warning banner) instead of failing the job.
22
+ * Plain rejection would fail the dream, roll back the lock, and retry every
23
+ * turn-end forever with zero durable output. Topic-file writes pass through
24
+ * untouched; a compliant entrypoint is returned byte-identical. Takes the raw
25
+ * structured payload (the entrypoint gate inside `validateMemoryWrites`
26
+ * throws during validation, so the replacement must happen before it) and
27
+ * returns a payload of the same shape; malformed payloads pass through and
28
+ * are rejected by validation as usual.
29
+ */
30
+ export declare function applyEntrypointFallback(payload: unknown): unknown;
31
+ /**
32
+ * Start a memory-scoped forked subagent as a background job. The fork reports
33
+ * its file set via `outputSchema`; on settlement the plugin validates the
34
+ * batch and writes it host-side under a policy confined to `dir`. Resolves to
35
+ * a control object with an abort hook and a settle promise (true only when
36
+ * the reported writes were validated and persisted).
37
+ */
38
+ export declare function startMemoryJob(ctx: Context, agent: Agent, dir: string, provider: string, label: string, prompt: string): Promise<{
39
+ abort(reason?: string): void;
40
+ settled: Promise<boolean>;
41
+ done: Promise<JobOutcome>;
42
+ }>;
43
+ //# sourceMappingURL=memory-job.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-job.d.ts","sourceRoot":"","sources":["../src/memory-job.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAgDnD,sEAAsE;AACtE,MAAM,MAAM,UAAU,GAAG;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,QAAQ,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAc9G;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAajE;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,CAAA;CAAE,CAAC,CA6DjG"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * The jobs-seam spawn helper for memory forks (extraction and dream): starts
3
+ * the one-shot subagent as a background job and maps the settled outcome onto
4
+ * the JobHooks contract.
5
+ * @module @dsh-cc/memory-consolidation/memory-job
6
+ */
7
+ import { MEMORY_WRITES_SCHEMA, validateMemoryWrites, writeMemoryFiles, ENTRYPOINT_NAME, MAX_ENTRYPOINT_LINES, MAX_ENTRYPOINT_BYTES, truncateEntrypointContent, } from '@dsh-cc/memory';
8
+ import { MEMORY_TOOL_FILTER } from "./tools.js";
9
+ /**
10
+ * Over-limit measurement for the entrypoint, identical to the write-side gate
11
+ * semantics (trim → split('\n') → count; byteLength of the trimmed content).
12
+ * @param content - a reported `MEMORY.md` body.
13
+ */
14
+ function entrypointOverLimit(content) {
15
+ const trimmed = content.trim();
16
+ return trimmed.split('\n').length > MAX_ENTRYPOINT_LINES
17
+ || Buffer.byteLength(trimmed, 'utf8') > MAX_ENTRYPOINT_BYTES;
18
+ }
19
+ /**
20
+ * Design §2.4 fallback: if the reported payload carries an over-limit
21
+ * `MEMORY.md`, replace its content with the deterministic truncation output
22
+ * (capped body + visible in-file warning banner) instead of failing the job.
23
+ * Plain rejection would fail the dream, roll back the lock, and retry every
24
+ * turn-end forever with zero durable output. Topic-file writes pass through
25
+ * untouched; a compliant entrypoint is returned byte-identical. Takes the raw
26
+ * structured payload (the entrypoint gate inside `validateMemoryWrites`
27
+ * throws during validation, so the replacement must happen before it) and
28
+ * returns a payload of the same shape; malformed payloads pass through and
29
+ * are rejected by validation as usual.
30
+ */
31
+ export function applyEntrypointFallback(payload) {
32
+ if (typeof payload !== 'object' || payload === null || Array.isArray(payload))
33
+ return payload;
34
+ const raw = payload.writes;
35
+ if (!Array.isArray(raw))
36
+ return payload;
37
+ const writes = raw.map((entry) => {
38
+ if (typeof entry !== 'object' || entry === null)
39
+ return entry;
40
+ const { path, content } = entry;
41
+ if (path !== ENTRYPOINT_NAME || typeof content !== 'string' || !entrypointOverLimit(content)) {
42
+ return entry;
43
+ }
44
+ return { ...entry, content: truncateEntrypointContent(content).content };
45
+ });
46
+ return { ...payload, writes };
47
+ }
48
+ /**
49
+ * Start a memory-scoped forked subagent as a background job. The fork reports
50
+ * its file set via `outputSchema`; on settlement the plugin validates the
51
+ * batch and writes it host-side under a policy confined to `dir`. Resolves to
52
+ * a control object with an abort hook and a settle promise (true only when
53
+ * the reported writes were validated and persisted).
54
+ */
55
+ export async function startMemoryJob(ctx, agent, dir, provider, label, prompt) {
56
+ const jobs = ctx.get('jobs');
57
+ const subagents = ctx.get('subagents');
58
+ if (jobs === undefined || subagents === undefined) {
59
+ return { abort: () => { }, settled: Promise.resolve(false), done: Promise.resolve({ status: 'failed', detail: 'jobs/subagents seam unavailable' }) };
60
+ }
61
+ const fs = ctx.get('fs');
62
+ const controller = new AbortController();
63
+ // `subagents.start` is async upstream — awaiting it is what exposes the run's
64
+ // `result` promise. Reading `run.result` on the un-awaited Promise throws
65
+ // "Cannot read properties of undefined (reading 'then')" and poisons the
66
+ // turn-stopping dispatch.
67
+ const run = await subagents.start(provider, {
68
+ label,
69
+ signal: controller.signal,
70
+ prompt: [{ type: 'text', text: prompt }],
71
+ parent: agent,
72
+ toolFilter: MEMORY_TOOL_FILTER,
73
+ // Defense-in-depth recursion cap: the top-level listener already gates on
74
+ // depth zero, so this fork's child never delegates. maxDepth is compared
75
+ // against the CHILD's resolved depth (parent + 1); a top-level parent's
76
+ // child resolves to 1 and passes, a grandchild to 2 is rejected.
77
+ maxDepth: 1,
78
+ outputSchema: MEMORY_WRITES_SCHEMA,
79
+ });
80
+ // Real job-done wiring: `done` maps the subagent outcome onto the JobHooks
81
+ // contract (must never reject). Aborted → killed (rolls back the dream
82
+ // lock); a non-completed stopReason, a missing/invalid payload, or a
83
+ // write-back failure → failed with detail; a validated, persisted batch →
84
+ // completed. All branches resolve.
85
+ const done = run.result.then(async (res) => {
86
+ if (controller.signal.aborted)
87
+ return { status: 'killed' };
88
+ if (res?.stopReason !== 'completed') {
89
+ return { status: 'failed', detail: `memory fork ended with stopReason ${String(res?.stopReason)}` };
90
+ }
91
+ if (fs === undefined) {
92
+ return { status: 'failed', detail: 'fs seam unavailable for memory write-back' };
93
+ }
94
+ try {
95
+ const writes = validateMemoryWrites(applyEntrypointFallback(res.structured));
96
+ await writeMemoryFiles(fs, dir, writes);
97
+ return { status: 'completed' };
98
+ }
99
+ catch (err) {
100
+ return { status: 'failed', detail: String(err) };
101
+ }
102
+ }, (err) => controller.signal.aborted ? { status: 'killed' } : { status: 'failed', detail: String(err) });
103
+ const settled = done.then(o => o.status === 'completed');
104
+ jobs.start({
105
+ kind: 'subagent',
106
+ label,
107
+ owner: agent,
108
+ run: () => ({
109
+ cancel: (reason) => { controller.abort(reason); },
110
+ done,
111
+ }),
112
+ });
113
+ return { abort: (reason) => { controller.abort(reason); }, settled, done };
114
+ }
115
+ //# sourceMappingURL=memory-job.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-job.js","sourceRoot":"","sources":["../src/memory-job.ts"],"names":[],"mappings":"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"}
package/lib/prompts.d.ts CHANGED
@@ -22,9 +22,10 @@ export declare function buildExtractionPrompt(surfaceMessageCount: number, memor
22
22
  * Build the <system-reminder> user prompt that reviews past sessions and
23
23
  * consolidates them into the memory directory, returned as structured writes.
24
24
  * @param memoryDir - the memory directory being rewritten.
25
- * @param transcriptDir - the directory holding past session transcripts.
26
- * @param sessionHints - a list of session ids to review.
25
+ * @param sessionsRoot - the real session store root the hint ids live under.
26
+ * @param sessionHints - session ids marking the consolidation window (provenance
27
+ * hints only; transcripts are zstd-compressed and not readable by the fork).
27
28
  * @returns the prompt text.
28
29
  */
29
- export declare function buildConsolidationPrompt(memoryDir: string, transcriptDir: string, sessionHints: readonly string[]): string;
30
+ export declare function buildConsolidationPrompt(memoryDir: string, sessionsRoot: string, sessionHints: readonly string[]): string;
30
31
  //# sourceMappingURL=prompts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,mBAAmB,EAAE,MAAM,EAC3B,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GACpB,MAAM,CAeR;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,SAAS,MAAM,EAAE,GAC9B,MAAM,CAgBR"}
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,mBAAmB,EAAE,MAAM,EAC3B,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GACpB,MAAM,CAeR;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,SAAS,MAAM,EAAE,GAC9B,MAAM,CAgBR"}
package/lib/prompts.js CHANGED
@@ -40,24 +40,25 @@ export function buildExtractionPrompt(surfaceMessageCount, memoryDir, existingIn
40
40
  * Build the <system-reminder> user prompt that reviews past sessions and
41
41
  * consolidates them into the memory directory, returned as structured writes.
42
42
  * @param memoryDir - the memory directory being rewritten.
43
- * @param transcriptDir - the directory holding past session transcripts.
44
- * @param sessionHints - a list of session ids to review.
43
+ * @param sessionsRoot - the real session store root the hint ids live under.
44
+ * @param sessionHints - session ids marking the consolidation window (provenance
45
+ * hints only; transcripts are zstd-compressed and not readable by the fork).
45
46
  * @returns the prompt text.
46
47
  */
47
- export function buildConsolidationPrompt(memoryDir, transcriptDir, sessionHints) {
48
+ export function buildConsolidationPrompt(memoryDir, sessionsRoot, sessionHints) {
48
49
  return [
49
- `You are consolidating persistent memory from past sessions. Review the sessions listed below (transcripts in \`${transcriptDir}\`), distill durable facts, and rewrite the memory directory \`${memoryDir}\`.`,
50
+ `You are consolidating persistent memory from past sessions. Distill durable facts and rewrite the memory directory \`${memoryDir}\`.`,
50
51
  'The memory directory contains MEMORY.md (an index of topic files) and topic `.md` files with YAML frontmatter (name, description, type).',
51
52
  'Return the complete rewritten file set via the `structured_output` tool as `{ "writes": [{ "path", "content" }] }` — flat `.md` filenames with complete bodies. Only the files you return are written; omitted files stay unchanged on disk.',
52
53
  'Work in this order:',
53
54
  `1. Orient: list \`${memoryDir}\`, then read ${ENTRYPOINT_NAME} and the topic files it points at — that is your primary review material.`,
54
55
  '2. Verify against reality: the fork\'s working directory IS the session\'s workspace. Before keeping any load-bearing fact, check it against the current codebase (paths, commands, behavior) with read/grep/glob. On a contradiction between two memories, fix the wrong side. Delete facts referencing things that no longer exist.',
55
56
  '3. Normalize dates: convert every relative date ("yesterday", "last week") to the absolute date it referred to.',
56
- `4. Search transcripts narrowly: do NOT exhaustively read the session transcripts in \`${transcriptDir}\` — grep them only for things already suspected important (symbols, paths, error strings surfaced by the memory files).`,
57
+ `4. Treat the session hints below as provenance only: they mark which sessions the consolidation window covers. The fork cannot read transcripts (zstd) — never attempt to open or grep them.`,
57
58
  `5. Prune and index: rewrite ${ENTRYPOINT_NAME} as one line per topic, targeting under 140 lines (an index over 200 lines / 25 KB is rejected host-side, so stay well under). Move detail into topic files, organized by semantic topic, and keep still-true load-bearing facts.`,
58
59
  `You may use only: ${MEMORY_AGENT_TOOLS.join(', ')}.`,
59
60
  '',
60
- 'Sessions since the last consolidation:',
61
+ `Session provenance hints (ids under \`${sessionsRoot}\`):`,
61
62
  ...sessionHints.map(id => `- ${id}`),
62
63
  ].join('\n');
63
64
  }
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAE/C,wEAAwE;AACxE,MAAM,eAAe,GAAG,WAAW,CAAA;AAEnC;;;;;;;;GAQG;AACH,MAAM,UAAU,qBAAqB,CACnC,mBAA2B,EAC3B,SAAiB,EACjB,aAAqB;IAErB,OAAO;QACL,0CAA0C,mBAAmB,oFAAoF;QACjJ,0GAA0G;QAC1G,sGAAsG,SAAS,iKAAiK;QAChR,mJAAmJ;QACnJ,yCAAyC,eAAe,iEAAiE;QACzH,sJAAsJ;QACtJ,qBAAqB,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,SAAS,KAAK;QACxF,+HAA+H;QAC/H,gIAAgI;QAChI,EAAE;QACF,kBAAkB;QAClB,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY;KACxD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,wBAAwB,CACtC,SAAiB,EACjB,aAAqB,EACrB,YAA+B;IAE/B,OAAO;QACL,kHAAkH,aAAa,kEAAkE,SAAS,KAAK;QAC/M,0IAA0I;QAC1I,8OAA8O;QAC9O,qBAAqB;QACrB,qBAAqB,SAAS,iBAAiB,eAAe,2EAA2E;QACzI,uUAAuU;QACvU,iHAAiH;QACjH,yFAAyF,aAAa,0HAA0H;QAChO,+BAA+B,eAAe,mOAAmO;QACjR,qBAAqB,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;QACrD,EAAE;QACF,wCAAwC;QACxC,GAAG,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;KACrC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC"}
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAE/C,wEAAwE;AACxE,MAAM,eAAe,GAAG,WAAW,CAAA;AAEnC;;;;;;;;GAQG;AACH,MAAM,UAAU,qBAAqB,CACnC,mBAA2B,EAC3B,SAAiB,EACjB,aAAqB;IAErB,OAAO;QACL,0CAA0C,mBAAmB,oFAAoF;QACjJ,0GAA0G;QAC1G,sGAAsG,SAAS,iKAAiK;QAChR,mJAAmJ;QACnJ,yCAAyC,eAAe,iEAAiE;QACzH,sJAAsJ;QACtJ,qBAAqB,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,SAAS,KAAK;QACxF,+HAA+H;QAC/H,gIAAgI;QAChI,EAAE;QACF,kBAAkB;QAClB,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY;KACxD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,wBAAwB,CACtC,SAAiB,EACjB,YAAoB,EACpB,YAA+B;IAE/B,OAAO;QACL,wHAAwH,SAAS,KAAK;QACtI,0IAA0I;QAC1I,8OAA8O;QAC9O,qBAAqB;QACrB,qBAAqB,SAAS,iBAAiB,eAAe,2EAA2E;QACzI,uUAAuU;QACvU,iHAAiH;QACjH,8LAA8L;QAC9L,+BAA+B,eAAe,mOAAmO;QACjR,qBAAqB,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;QACrD,EAAE;QACF,yCAAyC,YAAY,MAAM;QAC3D,GAAG,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;KACrC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC"}
@@ -0,0 +1,28 @@
1
+ /** One session directory's classification, unfiltered by any gate window. */
2
+ export interface ScannedSession {
3
+ id: string;
4
+ createdAt: number;
5
+ sub: boolean;
6
+ }
7
+ export interface SessionScanResult {
8
+ /** All classifiable sessions, so the memo can be shared across repos. */
9
+ sessions: ScannedSession[];
10
+ /** Session directories seen, classifiable or not. */
11
+ scanned: number;
12
+ /** Directories skipped because no readable stream/header was found. */
13
+ unreadable: number;
14
+ }
15
+ /**
16
+ * Scan the session store: classify every depth-2 directory from its stream
17
+ * header. A missing/unreadable root yields a zeroed result, never an throw.
18
+ */
19
+ export declare function scanSessions(sessionsRoot: string): Promise<SessionScanResult>;
20
+ /**
21
+ * The gate window: qualify (`!sub && createdAt > lastAt`), count all
22
+ * qualifying, and select up to 50 hint ids, most-recent first. Pure.
23
+ */
24
+ export declare function gateWindow(sessions: readonly ScannedSession[], lastAt: number): {
25
+ count: number;
26
+ hints: string[];
27
+ };
28
+ //# sourceMappingURL=session-scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-scan.d.ts","sourceRoot":"","sources":["../src/session-scan.ts"],"names":[],"mappings":"AAwBA,6EAA6E;AAC7E,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,OAAO,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,yEAAyE;IACzE,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;CACpB;AAiFD;;;GAGG;AACH,wBAAsB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAqCnF;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACxB,QAAQ,EAAE,SAAS,cAAc,EAAE,EACnC,MAAM,EAAE,MAAM,GACb;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAOpC"}
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Session-store scanner: walk the dsh-cc sessions store and classify each
3
+ * session directory from its header line, unfiltered by any gate window.
4
+ *
5
+ * Layout: `<sessionsRoot>/<projectKey>/<sessionId>/<stream>`; any directory at
6
+ * depth 2 is treated as a session dir. Stream resolution mirrors
7
+ * session-forensics/src/scan.ts: prefer `session.v3.jsonl.zstd`, fall back to
8
+ * the legacy `session.jsonl.zstd` (the writer emits exactly one format per
9
+ * dir). Only the header line is needed, so the read is a bounded prefix
10
+ * (256 KiB compressed → 16 KiB decompressed) via `node:fs`/`node:zlib`
11
+ * in-process zstd — no fs seam (prefix reads are impossible over it) and no
12
+ * `zstd` CLI (plan §3.1, cold-review blockers #1/#2).
13
+ *
14
+ * Every failure is classified, never thrown: unreadable dirs count toward
15
+ * `unreadable`, a missing root or absent zstd capability yields a zeroed
16
+ * result.
17
+ * @module @dsh-cc/memory-consolidation/session-scan
18
+ */
19
+ import { createReadStream } from "node:fs";
20
+ import { readdir } from "node:fs/promises";
21
+ import { join } from "node:path";
22
+ import * as zlib from "node:zlib";
23
+ import { StringDecoder } from "node:string_decoder";
24
+ /** Compressed prefix window (bytes) read from the stream file. */
25
+ const READ_WINDOW = 256 * 1024;
26
+ /** Decompressed text budget: stop reading once the header must have surfaced. */
27
+ const TEXT_BUDGET = 16 * 1024;
28
+ const V3_STREAM = "session.v3.jsonl.zstd";
29
+ const LEGACY_STREAM = "session.jsonl.zstd";
30
+ function isSafeInt(value) {
31
+ return typeof value === "number" && Number.isSafeInteger(value);
32
+ }
33
+ /**
34
+ * Decompress a bounded prefix of the stream and return the first
35
+ * `type: "session"` JSONL header, or undefined when none surfaces within the
36
+ * budget / the stream is corrupt. Never rejects.
37
+ */
38
+ function readHeader(streamPath) {
39
+ // Capability check (plan §3.1): undated/nonstandard Node without in-process
40
+ // zstd fails closed here.
41
+ if (typeof zlib.createZstdDecompress !== "function")
42
+ return Promise.resolve(undefined);
43
+ return new Promise((resolve) => {
44
+ let text = "";
45
+ let settled = false;
46
+ const finish = (header) => {
47
+ if (settled)
48
+ return;
49
+ settled = true;
50
+ source.destroy();
51
+ zstd.destroy();
52
+ resolve(header);
53
+ };
54
+ const findHeader = () => {
55
+ for (const line of text.split("\n")) {
56
+ if (!line.includes('"type":"session"'))
57
+ continue;
58
+ try {
59
+ const entry = JSON.parse(line);
60
+ if (entry?.type === "session")
61
+ return entry;
62
+ }
63
+ catch {
64
+ // torn or non-JSON line: keep scanning
65
+ }
66
+ }
67
+ return undefined;
68
+ };
69
+ // StringDecoder (not chunk.toString) so a multibyte char split across
70
+ // streams can't inject U+FFFD and silently break the header JSON.parse.
71
+ const decoder = new StringDecoder("utf8");
72
+ const onChunk = (chunk) => {
73
+ text += decoder.write(chunk);
74
+ if (text.length >= TEXT_BUDGET)
75
+ finish(findHeader());
76
+ };
77
+ const source = createReadStream(streamPath, { start: 0, end: READ_WINDOW - 1 });
78
+ const zstd = zlib.createZstdDecompress();
79
+ source.pipe(zstd);
80
+ zstd.on("data", onChunk);
81
+ source.on("error", () => finish(undefined));
82
+ zstd.on("error", () => finish(undefined));
83
+ zstd.on("end", () => { text += decoder.end(); finish(findHeader()); });
84
+ });
85
+ }
86
+ /** Classify a header line per the pinned v3 contract, defensively. */
87
+ function classify(header, dirName) {
88
+ const data = header.data;
89
+ const createdRaw = header.createdAt ?? header.time ?? header.ts ?? header.timestamp;
90
+ // Missing/garbage timestamp counts as NEW (fails open to over-inclusion).
91
+ const createdAt = isSafeInt(createdRaw) ? createdRaw : Number.MAX_SAFE_INTEGER;
92
+ const depth = isSafeInt(header.delegationDepth)
93
+ ? header.delegationDepth
94
+ : isSafeInt(data?.delegationDepth)
95
+ ? data.delegationDepth
96
+ : 0;
97
+ const origin = header.origin ?? data?.origin;
98
+ return {
99
+ id: typeof header.id === "string" && header.id.length > 0 ? header.id : dirName,
100
+ createdAt,
101
+ sub: depth > 0 || origin === "subagent",
102
+ };
103
+ }
104
+ /**
105
+ * Scan the session store: classify every depth-2 directory from its stream
106
+ * header. A missing/unreadable root yields a zeroed result, never an throw.
107
+ */
108
+ export async function scanSessions(sessionsRoot) {
109
+ const zeroed = { sessions: [], scanned: 0, unreadable: 0 };
110
+ // Capability check (plan §3.1): undated/nonstandard Node without in-process
111
+ // zstd fails closed to a zeroed result.
112
+ if (typeof zlib.createZstdDecompress !== "function")
113
+ return zeroed;
114
+ try {
115
+ const projects = await readdir(sessionsRoot, { withFileTypes: true });
116
+ const sessions = [];
117
+ let scanned = 0;
118
+ let unreadable = 0;
119
+ for (const project of projects) {
120
+ if (!project.isDirectory())
121
+ continue;
122
+ const projectDir = join(sessionsRoot, project.name);
123
+ let entries;
124
+ try {
125
+ entries = await readdir(projectDir, { withFileTypes: true });
126
+ }
127
+ catch {
128
+ continue;
129
+ }
130
+ for (const entry of entries) {
131
+ if (!entry.isDirectory())
132
+ continue;
133
+ scanned++;
134
+ const sessionDir = join(projectDir, entry.name);
135
+ // Stream resolution mirrors session-forensics/src/scan.ts.
136
+ let header;
137
+ for (const stream of [V3_STREAM, LEGACY_STREAM]) {
138
+ header = await readHeader(join(sessionDir, stream));
139
+ if (header !== undefined)
140
+ break;
141
+ }
142
+ if (header === undefined)
143
+ unreadable++;
144
+ else
145
+ sessions.push(classify(header, entry.name));
146
+ }
147
+ }
148
+ return { sessions, scanned, unreadable };
149
+ }
150
+ catch {
151
+ return zeroed;
152
+ }
153
+ }
154
+ /**
155
+ * The gate window: qualify (`!sub && createdAt > lastAt`), count all
156
+ * qualifying, and select up to 50 hint ids, most-recent first. Pure.
157
+ */
158
+ export function gateWindow(sessions, lastAt) {
159
+ const qualifying = sessions.filter((s) => !s.sub && s.createdAt > lastAt);
160
+ const hints = [...qualifying]
161
+ .sort((a, b) => b.createdAt - a.createdAt)
162
+ .slice(0, 50)
163
+ .map((s) => s.id);
164
+ return { count: qualifying.length, hints };
165
+ }
166
+ //# sourceMappingURL=session-scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-scan.js","sourceRoot":"","sources":["../src/session-scan.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@dsh-cc/memory-consolidation",
3
3
  "description": "Background memory consolidation: turn-end extraction and three-gate dream rewrite",
4
- "version": "0.8.0-rc.1",
4
+ "version": "0.8.0-rc.3",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/dsh-cc/dsh-cc.git",
@@ -36,7 +36,7 @@
36
36
  "@deepseek-ai/schemastery": "^3.18.1"
37
37
  },
38
38
  "dependencies": {
39
- "@dsh-cc/memory": "^0.8.0-rc.1"
39
+ "@dsh-cc/memory": "^0.8.0-rc.3"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@deepseek-ai/cordis": "link:../../../../deepseek-harness/vendor/cordis",