@dsh-cc/memory 0.7.1 → 0.8.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.i18n.yaml CHANGED
@@ -2,5 +2,5 @@
2
2
  # side as of the last confirmed-consistent state. Both languages carry equal authority;
3
3
  # after editing either side, bring the other along and re-record with:
4
4
  # pnpm check:readme --write
5
- README.md: 5c653d39110ddd01d00204132d043d01731dea27
6
- README.zh.md: ed05645dd389b503dd185af848210d2d1bac6564
5
+ README.md: 5e85c29e8a230de04be8abbb456126b6e5a440a5
6
+ README.zh.md: 1b99b6b4a9b97a61433d389430a4af8c08b2ee68
package/README.md CHANGED
@@ -129,6 +129,10 @@ entrypoint truncation caps and the five-file recall ceiling.
129
129
  - `validateMemoryWrites(input)` / `writeMemoryFiles(fs, dir, writes)` /
130
130
  `memoryWritePolicy(dir)` / `MEMORY_WRITES_SCHEMA` — the host-side write-back
131
131
  shared with `dsh-memory-consolidation`.
132
+ - `readPressure(fs, dir)` / `armPressure(fs, dir, now, policy?)` /
133
+ `markPressureForced(...)` / `clearPressure(...)` / `PRESSURE_FILE` — the
134
+ consolidation-pressure marker (`.consolidation-needed`) that queues a forced
135
+ dream when the index gate signals pressure.
132
136
  - `MemoryRecall` — the pre-step recall coordinator.
133
137
  - `truncateEntrypointContent(raw)` — apply the line/byte caps.
134
138
  - `resolveMemoryHome`, `resolveWorkspaceMemoryDir`, `canonicalMemoryRoot`,
package/README.zh.md CHANGED
@@ -102,6 +102,9 @@ await ctx.plugin(memory, { memoryHome: '/tmp/mem' })
102
102
  - `validateMemoryWrites(input)` / `writeMemoryFiles(fs, dir, writes)` /
103
103
  `memoryWritePolicy(dir)` / `MEMORY_WRITES_SCHEMA` —— 与
104
104
  `dsh-memory-consolidation` 共用的 host 侧写回。
105
+ - `readPressure(fs, dir)` / `armPressure(fs, dir, now, policy?)` /
106
+ `markPressureForced(...)` / `clearPressure(...)` / `PRESSURE_FILE` ——
107
+ 整合压力标记(`.consolidation-needed`):索引门产生压力时排队一次强制 dream。
105
108
  - `MemoryRecall` —— pre-step 召回协调器。
106
109
  - `truncateEntrypointContent(raw)` —— 施加行/字节上限。
107
110
  - `resolveMemoryHome`、`resolveWorkspaceMemoryDir`、`canonicalMemoryRoot`、
package/lib/index.d.ts CHANGED
@@ -30,6 +30,8 @@ export { MEMORY_SAVE_TOOL, MEMORY_SAVE_SCOPES, MemorySaveError, pointerLine, reg
30
30
  export type { MemorySaveArgs } from './save.ts';
31
31
  export { MEMORY_WRITES_SCHEMA, WRITEBACK_MAX_FILE_BYTES, WRITEBACK_MAX_FILES, WRITEBACK_MAX_TOTAL_BYTES, memoryWritePolicy, validateMemoryWrites, writeMemoryFiles, } from './writeback.ts';
32
32
  export type { MemoryWrite, MemoryWritePolicy } from './writeback.ts';
33
+ export { PRESSURE_FILE, readPressure, armPressure, markPressureForced, clearPressure } from './pressure.ts';
34
+ export type { PressureState } from './pressure.ts';
33
35
  export declare const name = "memory";
34
36
  /** Core services required for section registration and event listeners. */
35
37
  export declare const inject: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,CAAC,MAAM,0BAA0B,CAAA;AAQxC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EAAE,yBAAyB,EAAE,eAAe,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AACtH,YAAY,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AACzD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAC1D,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAC/C,YAAY,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AACrD,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,yBAAyB,EACzB,mBAAmB,EACnB,WAAW,EACX,KAAK,EACL,WAAW,EACX,kBAAkB,EAClB,YAAY,EACZ,oBAAoB,GACrB,MAAM,YAAY,CAAA;AACnB,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AACpE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AACjK,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAC5G,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAClE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,eAAe,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAC/J,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,WAAW,EACX,sBAAsB,EACtB,eAAe,EACf,aAAa,GACd,MAAM,WAAW,CAAA;AAClB,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAC/C,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,WAAW,CAAA;AAC5B,2EAA2E;AAC3E,eAAO,MAAM,MAAM,UAAmB,CAAA;AAEtC,mCAAmC;AACnC,MAAM,WAAW,MAAM;IACrB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,+EAA+E;IAC/E,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,8DAA8D;IAC9D,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,kEAAkE;IAClE,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,oEAAoE;IACpE,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED,eAAO,MAAM,MAAM,EAAE,CAAC,CAAC,MAAM,CAQ3B,CAAA;AAkBF;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,GAAE,MAAW,GAAG,IAAI,CAiC7D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/lib/index.js CHANGED
@@ -25,6 +25,7 @@ export { MemoryRecall, SubagentMemorySelector, MAX_RECALL_MEMORIES, RECALL_FILES
25
25
  export { TeamMemoryError, sanitizePathKey, resolveTeamMemoryRoot, validateTeamMemKey, readTeamMemFile, TEAM_MEMORY_DIR, TEAM_ENTRYPOINT_NAME } from "./team.js";
26
26
  export { MEMORY_SAVE_TOOL, MEMORY_SAVE_SCOPES, MemorySaveError, pointerLine, registerMemorySaveTool, renderTopicFile, upsertPointer, } from "./save.js";
27
27
  export { MEMORY_WRITES_SCHEMA, WRITEBACK_MAX_FILE_BYTES, WRITEBACK_MAX_FILES, WRITEBACK_MAX_TOTAL_BYTES, memoryWritePolicy, validateMemoryWrites, writeMemoryFiles, } from "./writeback.js";
28
+ export { PRESSURE_FILE, readPressure, armPressure, markPressureForced, clearPressure } from "./pressure.js";
28
29
  export const name = 'memory';
29
30
  /** Core services required for section registration and event listeners. */
30
31
  export const inject = ['systemPrompt'];
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,66 @@
1
+ /**
2
+ * The consolidation-pressure marker: a durable "index is over pressure, queue
3
+ * a forced dream" flag inside the memory directory.
4
+ *
5
+ * The file `.consolidation-needed` carries `<armedAtMs>\n<lastForcedAtMs>\n`
6
+ * (two lines, mirroring the lock file's `<pid>\n<at>\n` convention). The fs
7
+ * seam exposes no remove, so "clear" is a tombstone write (`armedAt = 0`)
8
+ * exactly like `rollbackLock`; `lastForcedAt` survives so the consumer's
9
+ * cooldown still applies to a fresh arm. Every writer is best-effort: arming
10
+ * must never break a save and marker hygiene must never break a dream.
11
+ * @module @dsh-cc/memory/pressure
12
+ */
13
+ import type { FileSystem } from '@deepseek-ai/dsh-fs';
14
+ import type { MemoryWritePolicy } from './writeback.ts';
15
+ /** Pressure marker filename inside the memory directory. */
16
+ export declare const PRESSURE_FILE = ".consolidation-needed";
17
+ /** Parsed marker state; zeros mean absent/cleared. */
18
+ export interface PressureState {
19
+ /** Epoch of the latest arming; `> 0` means pressure is pending. */
20
+ armedAt: number;
21
+ /** Epoch of the last forced launch (cooldown reference); 0 when never. */
22
+ lastForcedAt: number;
23
+ }
24
+ /**
25
+ * Best-effort read of the pressure marker. Any failure (absent file,
26
+ * unreadable, corrupt content) yields zeros — "no pressure pending".
27
+ * @param fs - the filesystem seam.
28
+ * @param dir - the memory directory holding the marker.
29
+ */
30
+ export declare function readPressure(fs: FileSystem, dir: string): Promise<PressureState>;
31
+ /**
32
+ * Arm the pressure marker with `now` as `armedAt`, preserving the previous
33
+ * `lastForcedAt` when recoverable (else 0). Re-reads the marker immediately
34
+ * before writing so a concurrent forced launch's fresh stamp is not clobbered
35
+ * (a residual single-iteration race is accepted and bounded). Best-effort:
36
+ * returns whether the write landed, so callers that promise "consolidation
37
+ * queued" in model-visible text can gate that sentence on it.
38
+ * @param fs - the filesystem seam.
39
+ * @param dir - the memory directory holding the marker.
40
+ * @param now - the epoch stamped as `armedAt`.
41
+ * @param policy - per-call sandbox policy for the marker write.
42
+ */
43
+ export declare function armPressure(fs: FileSystem, dir: string, now: number, policy?: MemoryWritePolicy): Promise<boolean>;
44
+ /**
45
+ * Stamp `lastForcedAt = now` while keeping `armedAt` (consumes one cooldown
46
+ * slot). Called by the consumer BEFORE lock acquisition so a held lock or a
47
+ * killed spawn still throttles the next attempt. Best-effort: failures are
48
+ * swallowed so a marker-hygiene problem never breaks a dream.
49
+ * @param fs - the filesystem seam.
50
+ * @param dir - the memory directory holding the marker.
51
+ * @param armedAt - the armed epoch to carry through unchanged.
52
+ * @param now - the epoch stamped as `lastForcedAt`.
53
+ * @param policy - per-call sandbox policy for the marker write.
54
+ */
55
+ export declare function markPressureForced(fs: FileSystem, dir: string, armedAt: number, now: number, policy?: MemoryWritePolicy): Promise<void>;
56
+ /**
57
+ * Tombstone the marker (`armedAt = 0`, `lastForcedAt = now`) after a
58
+ * successful consolidation; the cooldown timestamp survives so a fresh arm
59
+ * still waits out the remainder of the window. Best-effort.
60
+ * @param fs - the filesystem seam.
61
+ * @param dir - the memory directory holding the marker.
62
+ * @param now - the epoch stamped as the surviving `lastForcedAt`.
63
+ * @param policy - per-call sandbox policy for the marker write.
64
+ */
65
+ export declare function clearPressure(fs: FileSystem, dir: string, now: number, policy?: MemoryWritePolicy): Promise<void>;
66
+ //# sourceMappingURL=pressure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pressure.d.ts","sourceRoot":"","sources":["../src/pressure.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAY,MAAM,qBAAqB,CAAA;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAEvD,4DAA4D;AAC5D,eAAO,MAAM,aAAa,0BAA0B,CAAA;AAEpD,sDAAsD;AACtD,MAAM,WAAW,aAAa;IAC5B,mEAAmE;IACnE,OAAO,EAAE,MAAM,CAAA;IACf,0EAA0E;IAC1E,YAAY,EAAE,MAAM,CAAA;CACrB;AAoBD;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAQtF;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,WAAW,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,CAgBxH;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAI7I;AAED;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAIvH"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * The consolidation-pressure marker: a durable "index is over pressure, queue
3
+ * a forced dream" flag inside the memory directory.
4
+ *
5
+ * The file `.consolidation-needed` carries `<armedAtMs>\n<lastForcedAtMs>\n`
6
+ * (two lines, mirroring the lock file's `<pid>\n<at>\n` convention). The fs
7
+ * seam exposes no remove, so "clear" is a tombstone write (`armedAt = 0`)
8
+ * exactly like `rollbackLock`; `lastForcedAt` survives so the consumer's
9
+ * cooldown still applies to a fresh arm. Every writer is best-effort: arming
10
+ * must never break a save and marker hygiene must never break a dream.
11
+ * @module @dsh-cc/memory/pressure
12
+ */
13
+ import { join } from 'node:path';
14
+ /** Pressure marker filename inside the memory directory. */
15
+ export const PRESSURE_FILE = '.consolidation-needed';
16
+ /** Content of the marker file: `<armedAtMs>\n<lastForcedAtMs>\n`. */
17
+ const format = (armedAt, lastForcedAt) => `${armedAt}\n${lastForcedAt}\n`;
18
+ /** Mirror of lock.ts's tolerant parse: any finite number, else 0. */
19
+ function parse(content) {
20
+ const [armedRaw, forcedRaw] = content.trim().split('\n');
21
+ const of = (raw) => raw !== undefined && Number.isFinite(Number(raw)) ? Number(raw) : 0;
22
+ return { armedAt: of(armedRaw), lastForcedAt: of(forcedRaw) };
23
+ }
24
+ /** Resolve the marker target and whether it exists. */
25
+ async function pressureTarget(fs, dir) {
26
+ const target = await fs.resolve(join(dir, PRESSURE_FILE));
27
+ const info = await fs.stat(target);
28
+ return { target, absent: info === undefined };
29
+ }
30
+ /**
31
+ * Best-effort read of the pressure marker. Any failure (absent file,
32
+ * unreadable, corrupt content) yields zeros — "no pressure pending".
33
+ * @param fs - the filesystem seam.
34
+ * @param dir - the memory directory holding the marker.
35
+ */
36
+ export async function readPressure(fs, dir) {
37
+ try {
38
+ const { target, absent } = await pressureTarget(fs, dir);
39
+ if (absent)
40
+ return { armedAt: 0, lastForcedAt: 0 };
41
+ return parse(await fs.readText(target));
42
+ }
43
+ catch {
44
+ return { armedAt: 0, lastForcedAt: 0 };
45
+ }
46
+ }
47
+ /**
48
+ * Arm the pressure marker with `now` as `armedAt`, preserving the previous
49
+ * `lastForcedAt` when recoverable (else 0). Re-reads the marker immediately
50
+ * before writing so a concurrent forced launch's fresh stamp is not clobbered
51
+ * (a residual single-iteration race is accepted and bounded). Best-effort:
52
+ * returns whether the write landed, so callers that promise "consolidation
53
+ * queued" in model-visible text can gate that sentence on it.
54
+ * @param fs - the filesystem seam.
55
+ * @param dir - the memory directory holding the marker.
56
+ * @param now - the epoch stamped as `armedAt`.
57
+ * @param policy - per-call sandbox policy for the marker write.
58
+ */
59
+ export async function armPressure(fs, dir, now, policy) {
60
+ try {
61
+ const { target, absent } = await pressureTarget(fs, dir);
62
+ let lastForcedAt = 0;
63
+ if (!absent) {
64
+ try {
65
+ lastForcedAt = parse(await fs.readText(target)).lastForcedAt;
66
+ }
67
+ catch {
68
+ // Corrupt marker: treat as never-forced, arming still proceeds.
69
+ }
70
+ }
71
+ await fs.writeText(target, format(now, lastForcedAt), undefined, undefined, policy);
72
+ return true;
73
+ }
74
+ catch {
75
+ return false;
76
+ }
77
+ }
78
+ /**
79
+ * Stamp `lastForcedAt = now` while keeping `armedAt` (consumes one cooldown
80
+ * slot). Called by the consumer BEFORE lock acquisition so a held lock or a
81
+ * killed spawn still throttles the next attempt. Best-effort: failures are
82
+ * swallowed so a marker-hygiene problem never breaks a dream.
83
+ * @param fs - the filesystem seam.
84
+ * @param dir - the memory directory holding the marker.
85
+ * @param armedAt - the armed epoch to carry through unchanged.
86
+ * @param now - the epoch stamped as `lastForcedAt`.
87
+ * @param policy - per-call sandbox policy for the marker write.
88
+ */
89
+ export async function markPressureForced(fs, dir, armedAt, now, policy) {
90
+ const target = await fs.resolve(join(dir, PRESSURE_FILE)).catch(() => undefined);
91
+ if (target === undefined)
92
+ return;
93
+ await fs.writeText(target, format(armedAt, now), undefined, undefined, policy).catch(() => { });
94
+ }
95
+ /**
96
+ * Tombstone the marker (`armedAt = 0`, `lastForcedAt = now`) after a
97
+ * successful consolidation; the cooldown timestamp survives so a fresh arm
98
+ * still waits out the remainder of the window. Best-effort.
99
+ * @param fs - the filesystem seam.
100
+ * @param dir - the memory directory holding the marker.
101
+ * @param now - the epoch stamped as the surviving `lastForcedAt`.
102
+ * @param policy - per-call sandbox policy for the marker write.
103
+ */
104
+ export async function clearPressure(fs, dir, now, policy) {
105
+ const target = await fs.resolve(join(dir, PRESSURE_FILE)).catch(() => undefined);
106
+ if (target === undefined)
107
+ return;
108
+ await fs.writeText(target, format(0, now), undefined, undefined, policy).catch(() => { });
109
+ }
110
+ //# sourceMappingURL=pressure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pressure.js","sourceRoot":"","sources":["../src/pressure.ts"],"names":[],"mappings":"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"}
package/lib/save.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../src/save.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAQlD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAEjD,gCAAgC;AAChC,eAAO,MAAM,gBAAgB,gBAAgB,CAAA;AAO7C,kCAAkC;AAClC,eAAO,MAAM,kBAAkB,kCAAmC,CAAA;AAElE,qEAAqE;AACrE,qBAAa,eAAgB,SAAQ,KAAK;CAAG;AAE7C,MAAM,WAAW,cAAc;IAC7B,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAA;IACZ,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAA;IACZ,gEAAgE;IAChE,WAAW,EAAE,MAAM,CAAA;IACnB,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAA;IACZ,kHAAkH;IAClH,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,kEAAkE;AAClE,wBAAgB,eAAe,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAW5D;AAED,qFAAqF;AACrF,wBAAgB,WAAW,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAExD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,MAAM,CAW9E;AA4BD;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,aAAa,GACrB,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAmF1B"}
1
+ {"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../src/save.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AASlD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAEjD,gCAAgC;AAChC,eAAO,MAAM,gBAAgB,gBAAgB,CAAA;AAe7C,kCAAkC;AAClC,eAAO,MAAM,kBAAkB,kCAAmC,CAAA;AAElE,qEAAqE;AACrE,qBAAa,eAAgB,SAAQ,KAAK;CAAG;AAE7C,MAAM,WAAW,cAAc;IAC7B,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAA;IACZ,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAA;IACZ,gEAAgE;IAChE,WAAW,EAAE,MAAM,CAAA;IACnB,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAA;IACZ,kHAAkH;IAClH,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,kEAAkE;AAClE,wBAAgB,eAAe,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAW5D;AAED,qFAAqF;AACrF,wBAAgB,WAAW,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAExD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,MAAM,CAW9E;AA4BD;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,aAAa,GACrB,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CA6H1B"}
package/lib/save.js CHANGED
@@ -11,10 +11,12 @@
11
11
  * @module @dsh-cc/memory/save
12
12
  */
13
13
  import { join } from 'node:path';
14
+ import { Buffer } from 'node:buffer';
14
15
  import { defineTool } from '@dsh-cc/tools';
15
16
  import { MEMORY_TYPES } from "./types.js";
16
- import { ENTRYPOINT_NAME } from "./truncate.js";
17
- import { validateMemoryWrites, writeMemoryFiles } from "./writeback.js";
17
+ import { ENTRYPOINT_NAME, MAX_ENTRYPOINT_BYTES, MAX_ENTRYPOINT_LINES } from "./truncate.js";
18
+ import { validateMemoryWrites, writeMemoryFiles, memoryWritePolicy } from "./writeback.js";
19
+ import { armPressure } from "./pressure.js";
18
20
  import { cwdOf, resolveWorkspaceMemoryDir } from "./paths.js";
19
21
  /** The registered tool name. */
20
22
  export const MEMORY_SAVE_TOOL = 'memory_save';
@@ -22,6 +24,13 @@ export const MEMORY_SAVE_TOOL = 'memory_save';
22
24
  const NAME_RULE = /^[a-z0-9][a-z0-9-]*$/;
23
25
  /** One-line relevance description cap. */
24
26
  const MAX_DESCRIPTION_CHARS = 200;
27
+ /**
28
+ * Appended to the model-visible rejection/warning text when the pressure
29
+ * marker was actually armed. Gated on the arm's success: a swallowed write
30
+ * failure must leave the original text — a false promise is the exact
31
+ * model-trust failure this sentence exists to close.
32
+ */
33
+ const QUEUED_SENTENCE = ' A forced consolidation has been queued; the next turn-end will run it, bypassing the usual periodic gates.';
25
34
  /** Where a saved memory lands. */
26
35
  export const MEMORY_SAVE_SCOPES = ['workspace', 'global'];
27
36
  /** A model-visible save failure (maps to an isError tool result). */
@@ -152,14 +161,8 @@ export function registerMemorySaveTool(ctx, home, section) {
152
161
  ? home
153
162
  : resolveWorkspaceMemoryDir(home, exec.agent !== undefined ? cwdOf(exec.agent) : process.cwd());
154
163
  const filename = `${args.name}.md`;
155
- const writes = [
156
- { path: filename, content: renderTopicFile(args) },
157
- ];
158
- // Reuse the write-back validator so tool saves and fork reports share
159
- // one security boundary (filename rule + size caps).
160
- const validated = validateMemoryWrites({ writes });
161
- // Upsert the index pointer first from the CURRENT entrypoint body, then
162
- // write both files under the policy confined to the memory directory.
164
+ // Read the index BEFORE validating so the gate sees the resulting
165
+ // entrypoint (topic file + upserted pointer validated as one batch).
163
166
  let entrypoint = '';
164
167
  try {
165
168
  entrypoint = await fs.readText(await fs.resolve(join(dir, ENTRYPOINT_NAME)));
@@ -167,12 +170,54 @@ export function registerMemorySaveTool(ctx, home, section) {
167
170
  catch {
168
171
  // No index yet — the upsert starts from an empty body.
169
172
  }
170
- validated.push({ path: ENTRYPOINT_NAME, content: upsertPointer(entrypoint, args) });
173
+ const trimmed = entrypoint.trim();
174
+ const preExistingOverLimit = trimmed.split('\n').length > MAX_ENTRYPOINT_LINES
175
+ || Buffer.byteLength(trimmed, 'utf8') > MAX_ENTRYPOINT_BYTES;
176
+ // Reuse the write-back validator so tool saves and fork reports share
177
+ // one security boundary (filename rule + size caps + index gate). An
178
+ // index that was ALREADY over-limit fail-opens: the save did not cause
179
+ // the overflow, and rejecting would brick every save with no repair
180
+ // path (a consolidation run compacts it instead).
181
+ const validated = await (async () => {
182
+ try {
183
+ return validateMemoryWrites({
184
+ writes: [
185
+ { path: filename, content: renderTopicFile(args) },
186
+ { path: ENTRYPOINT_NAME, content: upsertPointer(entrypoint, args) },
187
+ ],
188
+ }, { allowOverLimitEntrypoint: preExistingOverLimit });
189
+ }
190
+ catch (error) {
191
+ // Push-over rejection: arm the forced-dream marker. WORKSPACE scope
192
+ // only on purpose — the global directory has no dream coverage, so
193
+ // a marker there would be orphan state and the queued sentence a
194
+ // lie. A swallowed arm failure rethrows the original error.
195
+ if (error instanceof Error && error.message.includes('would exceed its cap')
196
+ && args.scope !== 'global'
197
+ && await armPressure(fs, dir, Date.now(), memoryWritePolicy(dir))) {
198
+ throw new MemorySaveError(`${error.message}${QUEUED_SENTENCE}`);
199
+ }
200
+ throw error;
201
+ }
202
+ })();
171
203
  await writeMemoryFiles(fs, dir, validated);
172
204
  await section.refresh(exec.agent);
205
+ let message = `Saved memory "${args.name}" (${args.type}) to ${filename} and updated ${ENTRYPOINT_NAME}.`;
206
+ if (preExistingOverLimit) {
207
+ message += ` WARNING: ${ENTRYPOINT_NAME} was already over its ${MAX_ENTRYPOINT_LINES}-line/`
208
+ + `${MAX_ENTRYPOINT_BYTES}-byte cap before this save; tail entries are invisible until `
209
+ + 'consolidation compacts it.';
210
+ // Legacy fail-open over-limit: queue the repair here too. Again
211
+ // workspace-scope only (see the rejection arm point above), and the
212
+ // sentence is appended only when the marker write actually landed.
213
+ if (args.scope !== 'global'
214
+ && await armPressure(fs, dir, Date.now(), memoryWritePolicy(dir))) {
215
+ message += QUEUED_SENTENCE;
216
+ }
217
+ }
173
218
  return {
174
219
  path: join(dir, filename),
175
- message: `Saved memory "${args.name}" (${args.type}) to ${filename} and updated ${ENTRYPOINT_NAME}.`,
220
+ message,
176
221
  };
177
222
  },
178
223
  }));
package/lib/save.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"save.js","sourceRoot":"","sources":["../src/save.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"save.js","sourceRoot":"","sources":["../src/save.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"truncate.d.ts","sourceRoot":"","sources":["../src/truncate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,kEAAkE;AAClE,eAAO,MAAM,eAAe,cAAc,CAAA;AAE1C,yCAAyC;AACzC,eAAO,MAAM,oBAAoB,MAAM,CAAA;AAEvC,2EAA2E;AAC3E,eAAO,MAAM,oBAAoB,QAAS,CAAA;AAE1C,8CAA8C;AAC9C,MAAM,WAAW,oBAAoB;IACnC,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAA;IACf,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAA;IACjB,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAA;IACjB,kCAAkC;IAClC,gBAAgB,EAAE,OAAO,CAAA;IACzB,4EAA4E;IAC5E,gBAAgB,EAAE,OAAO,CAAA;CAC1B;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,CAoC3E"}
1
+ {"version":3,"file":"truncate.d.ts","sourceRoot":"","sources":["../src/truncate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,kEAAkE;AAClE,eAAO,MAAM,eAAe,cAAc,CAAA;AAE1C,yCAAyC;AACzC,eAAO,MAAM,oBAAoB,MAAM,CAAA;AAEvC,2EAA2E;AAC3E,eAAO,MAAM,oBAAoB,QAAS,CAAA;AAU1C,8CAA8C;AAC9C,MAAM,WAAW,oBAAoB;IACnC,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAA;IACf,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAA;IACjB,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAA;IACjB,kCAAkC;IAClC,gBAAgB,EAAE,OAAO,CAAA;IACzB,4EAA4E;IAC5E,gBAAgB,EAAE,OAAO,CAAA;CAC1B;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,CAuC3E"}
package/lib/truncate.js CHANGED
@@ -4,12 +4,20 @@
4
4
  * runaway index cannot flood the system prompt.
5
5
  * @module @dsh-cc/memory/truncate
6
6
  */
7
+ import { Buffer } from 'node:buffer';
7
8
  /** The always-loaded index filename inside a memory directory. */
8
9
  export const ENTRYPOINT_NAME = 'MEMORY.md';
9
10
  /** Line cap for the entrypoint index. */
10
11
  export const MAX_ENTRYPOINT_LINES = 200;
11
12
  /** Byte cap for the entrypoint index (long lines are the failure mode). */
12
13
  export const MAX_ENTRYPOINT_BYTES = 25_000;
14
+ /**
15
+ * Body caps for the truncated output: the appended warning banner adds ~2
16
+ * lines / ~250 bytes, so the body is capped below the entrypoint limits and
17
+ * the truncation output always satisfies the write-side gate.
18
+ */
19
+ const BODY_LINE_CAP = MAX_ENTRYPOINT_LINES - 2;
20
+ const BODY_BYTE_CAP = MAX_ENTRYPOINT_BYTES - 256;
13
21
  /**
14
22
  * Truncate MEMORY.md content to the line AND byte caps. Line-truncates first
15
23
  * (a natural boundary), then byte-truncates at the last newline before the cap
@@ -22,19 +30,24 @@ export function truncateEntrypointContent(raw) {
22
30
  const trimmed = raw.trim();
23
31
  const contentLines = trimmed.split('\n');
24
32
  const lineCount = contentLines.length;
25
- const byteCount = trimmed.length;
33
+ const byteCount = Buffer.byteLength(trimmed, 'utf8');
26
34
  const wasLineTruncated = lineCount > MAX_ENTRYPOINT_LINES;
27
35
  const wasByteTruncated = byteCount > MAX_ENTRYPOINT_BYTES;
28
36
  if (!wasLineTruncated && !wasByteTruncated) {
29
37
  return { content: trimmed, lineCount, byteCount, wasLineTruncated, wasByteTruncated };
30
38
  }
31
- let truncated = wasLineTruncated
32
- ? contentLines.slice(0, MAX_ENTRYPOINT_LINES).join('\n')
33
- : trimmed;
34
- if (truncated.length > MAX_ENTRYPOINT_BYTES) {
35
- const cutAt = truncated.lastIndexOf('\n', MAX_ENTRYPOINT_BYTES);
36
- truncated = truncated.slice(0, cutAt > 0 ? cutAt : MAX_ENTRYPOINT_BYTES);
39
+ // Byte-accurate slicing: accumulate whole lines (never mid-character) while
40
+ // the running UTF-8 byte total fits the body budget.
41
+ const bodyLines = [];
42
+ let runningBytes = 0;
43
+ for (const line of contentLines.slice(0, BODY_LINE_CAP)) {
44
+ const cost = Buffer.byteLength(line, 'utf8') + (bodyLines.length > 0 ? 1 : 0);
45
+ if (runningBytes + cost > BODY_BYTE_CAP)
46
+ break;
47
+ bodyLines.push(line);
48
+ runningBytes += cost;
37
49
  }
50
+ const truncated = bodyLines.join('\n');
38
51
  const size = byteCount >= 1024 ? `${(byteCount / 1024).toFixed(1)}KB` : `${byteCount}B`;
39
52
  const reason = wasByteTruncated && !wasLineTruncated
40
53
  ? `${size} (limit: 25KB) — index entries are too long`
@@ -1 +1 @@
1
- {"version":3,"file":"truncate.js","sourceRoot":"","sources":["../src/truncate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,kEAAkE;AAClE,MAAM,CAAC,MAAM,eAAe,GAAG,WAAW,CAAA;AAE1C,yCAAyC;AACzC,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,CAAA;AAEvC,2EAA2E;AAC3E,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAA;AAgB1C;;;;;;;GAOG;AACH,MAAM,UAAU,yBAAyB,CAAC,GAAW;IACnD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAA;IAC1B,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACxC,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAA;IACrC,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAA;IAEhC,MAAM,gBAAgB,GAAG,SAAS,GAAG,oBAAoB,CAAA;IACzD,MAAM,gBAAgB,GAAG,SAAS,GAAG,oBAAoB,CAAA;IAEzD,IAAI,CAAC,gBAAgB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC3C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAA;IACvF,CAAC;IAED,IAAI,SAAS,GAAG,gBAAgB;QAC9B,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACxD,CAAC,CAAC,OAAO,CAAA;IAEX,IAAI,SAAS,CAAC,MAAM,GAAG,oBAAoB,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAA;QAC/D,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAA;IAC1E,CAAC;IAED,MAAM,IAAI,GAAG,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,CAAA;IACvF,MAAM,MAAM,GAAG,gBAAgB,IAAI,CAAC,gBAAgB;QAClD,CAAC,CAAC,GAAG,IAAI,6CAA6C;QACtD,CAAC,CAAC,gBAAgB,IAAI,CAAC,gBAAgB;YACrC,CAAC,CAAC,GAAG,SAAS,kBAAkB,oBAAoB,GAAG;YACvD,CAAC,CAAC,GAAG,SAAS,cAAc,IAAI,EAAE,CAAA;IAEtC,OAAO;QACL,OAAO,EAAE,GAAG,SAAS,kBAAkB,eAAe,OAAO,MAAM,8GAA8G;QACjL,SAAS;QACT,SAAS;QACT,gBAAgB;QAChB,gBAAgB;KACjB,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"truncate.js","sourceRoot":"","sources":["../src/truncate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,kEAAkE;AAClE,MAAM,CAAC,MAAM,eAAe,GAAG,WAAW,CAAA;AAE1C,yCAAyC;AACzC,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,CAAA;AAEvC,2EAA2E;AAC3E,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAA;AAE1C;;;;GAIG;AACH,MAAM,aAAa,GAAG,oBAAoB,GAAG,CAAC,CAAA;AAC9C,MAAM,aAAa,GAAG,oBAAoB,GAAG,GAAG,CAAA;AAgBhD;;;;;;;GAOG;AACH,MAAM,UAAU,yBAAyB,CAAC,GAAW;IACnD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAA;IAC1B,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACxC,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAA;IACrC,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IAEpD,MAAM,gBAAgB,GAAG,SAAS,GAAG,oBAAoB,CAAA;IACzD,MAAM,gBAAgB,GAAG,SAAS,GAAG,oBAAoB,CAAA;IAEzD,IAAI,CAAC,gBAAgB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC3C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAA;IACvF,CAAC;IAED,4EAA4E;IAC5E,qDAAqD;IACrD,MAAM,SAAS,GAAa,EAAE,CAAA;IAC9B,IAAI,YAAY,GAAG,CAAC,CAAA;IACpB,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC7E,IAAI,YAAY,GAAG,IAAI,GAAG,aAAa;YAAE,MAAK;QAC9C,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACpB,YAAY,IAAI,IAAI,CAAA;IACtB,CAAC;IACD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAEtC,MAAM,IAAI,GAAG,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,CAAA;IACvF,MAAM,MAAM,GAAG,gBAAgB,IAAI,CAAC,gBAAgB;QAClD,CAAC,CAAC,GAAG,IAAI,6CAA6C;QACtD,CAAC,CAAC,gBAAgB,IAAI,CAAC,gBAAgB;YACrC,CAAC,CAAC,GAAG,SAAS,kBAAkB,oBAAoB,GAAG;YACvD,CAAC,CAAC,GAAG,SAAS,cAAc,IAAI,EAAE,CAAA;IAEtC,OAAO;QACL,OAAO,EAAE,GAAG,SAAS,kBAAkB,eAAe,OAAO,MAAM,8GAA8G;QACjL,SAAS;QACT,SAAS;QACT,gBAAgB;QAChB,gBAAgB;KACjB,CAAA;AACH,CAAC"}
@@ -71,7 +71,16 @@ export declare function memoryWritePolicy(dir: string): MemoryWritePolicy;
71
71
  * @param input - the raw `structured` value captured from the fork.
72
72
  * @returns the validated writes.
73
73
  */
74
- export declare function validateMemoryWrites(input: unknown): MemoryWrite[];
74
+ /** Options for {@link validateMemoryWrites}. */
75
+ export interface ValidateMemoryWritesOptions {
76
+ /**
77
+ * Fail-open for `memory_save` against an index that was ALREADY over the
78
+ * entrypoint cap before the write (the save did not cause the overflow, and
79
+ * rejecting would brick every save with no repair path). Default strict.
80
+ */
81
+ readonly allowOverLimitEntrypoint?: boolean;
82
+ }
83
+ export declare function validateMemoryWrites(input: unknown, opts?: ValidateMemoryWritesOptions): MemoryWrite[];
75
84
  /**
76
85
  * Validate, then write the batch inside the memory directory under the
77
86
  * confined per-call policy. Writes are sequential so a mid-batch failure
@@ -1 +1 @@
1
- {"version":3,"file":"writeback.d.ts","sourceRoot":"","sources":["../src/writeback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAErD,kFAAkF;AAClF,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED,gEAAgE;AAChE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;CAkBvB,CAAA;AAEV,+CAA+C;AAC/C,eAAO,MAAM,mBAAmB,KAAK,CAAA;AACrC,yCAAyC;AACzC,eAAO,MAAM,wBAAwB,QAAY,CAAA;AACjD,4CAA4C;AAC5C,eAAO,MAAM,yBAAyB,QAAa,CAAA;AASnD;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAA;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;CAC/B;AAED,mFAAmF;AACnF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAEhE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,EAAE,CAuClE;AAED;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,UAAU,EACd,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,SAAS,WAAW,EAAE,GAC7B,OAAO,CAAC,MAAM,EAAE,CAAC,CASnB"}
1
+ {"version":3,"file":"writeback.d.ts","sourceRoot":"","sources":["../src/writeback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAGrD,kFAAkF;AAClF,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED,gEAAgE;AAChE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;CAkBvB,CAAA;AAEV,+CAA+C;AAC/C,eAAO,MAAM,mBAAmB,KAAK,CAAA;AACrC,yCAAyC;AACzC,eAAO,MAAM,wBAAwB,QAAY,CAAA;AACjD,4CAA4C;AAC5C,eAAO,MAAM,yBAAyB,QAAa,CAAA;AASnD;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAA;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;CAC/B;AAED,mFAAmF;AACnF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAEhE;AAED;;;;;GAKG;AACH,gDAAgD;AAChD,MAAM,WAAW,2BAA2B;IAC1C;;;;OAIG;IACH,QAAQ,CAAC,wBAAwB,CAAC,EAAE,OAAO,CAAA;CAC5C;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,EACd,IAAI,CAAC,EAAE,2BAA2B,GACjC,WAAW,EAAE,CAsDf;AAED;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,UAAU,EACd,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,SAAS,WAAW,EAAE,GAC7B,OAAO,CAAC,MAAM,EAAE,CAAC,CASnB"}
package/lib/writeback.js CHANGED
@@ -16,7 +16,9 @@
16
16
  * fork that produced them.
17
17
  * @module @dsh-cc/memory-consolidation/writeback
18
18
  */
19
+ import { Buffer } from 'node:buffer';
19
20
  import { join } from 'node:path';
21
+ import { ENTRYPOINT_NAME, MAX_ENTRYPOINT_BYTES, MAX_ENTRYPOINT_LINES } from "./truncate.js";
20
22
  /** The structured-output contract every memory fork reports. */
21
23
  export const MEMORY_WRITES_SCHEMA = {
22
24
  type: 'object',
@@ -53,13 +55,7 @@ const FILE_NAME = /^[A-Za-z0-9][A-Za-z0-9._-]*\.md$/;
53
55
  export function memoryWritePolicy(dir) {
54
56
  return { mode: 'workspace-write', workspaceRoot: dir };
55
57
  }
56
- /**
57
- * Validate a fork's structured payload into a writable batch. Throws with a
58
- * precise reason on ANY violation; an empty `writes` array is a valid no-op.
59
- * @param input - the raw `structured` value captured from the fork.
60
- * @returns the validated writes.
61
- */
62
- export function validateMemoryWrites(input) {
58
+ export function validateMemoryWrites(input, opts) {
63
59
  if (typeof input !== 'object' || input === null || Array.isArray(input)) {
64
60
  throw new Error('memory fork output must be an object with a "writes" array');
65
61
  }
@@ -97,6 +93,19 @@ export function validateMemoryWrites(input) {
97
93
  if (total > WRITEBACK_MAX_TOTAL_BYTES) {
98
94
  throw new Error(`memory batch is ${total} bytes, over the ${WRITEBACK_MAX_TOTAL_BYTES} cap`);
99
95
  }
96
+ const entrypoint = writes.find(w => w.path === ENTRYPOINT_NAME);
97
+ if (entrypoint !== undefined && opts?.allowOverLimitEntrypoint !== true) {
98
+ const trimmed = entrypoint.content.trim();
99
+ const lines = trimmed.split('\n').length;
100
+ const bytes = Buffer.byteLength(trimmed, 'utf8');
101
+ if (lines > MAX_ENTRYPOINT_LINES || bytes > MAX_ENTRYPOINT_BYTES) {
102
+ throw new Error(`${ENTRYPOINT_NAME} index would exceed its cap (${lines} lines / ${bytes} bytes; `
103
+ + `limits: ${MAX_ENTRYPOINT_LINES} lines / ${MAX_ENTRYPOINT_BYTES} bytes). `
104
+ + 'Rewrite the index to target under 140 lines, one line per entry: move detail into topic files, '
105
+ + 'merge or drop stale entries. To update without growing the index, overwrite an existing memory '
106
+ + "(same name); if this is not genuinely cross-workspace, save with scope 'workspace'.");
107
+ }
108
+ }
100
109
  return writes;
101
110
  }
102
111
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"writeback.js","sourceRoot":"","sources":["../src/writeback.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"writeback.js","sourceRoot":"","sources":["../src/writeback.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@dsh-cc/memory",
3
3
  "description": "Claude Code-style file-based memory: memdir format, system-prompt section, and dynamic recall",
4
- "version": "0.7.1",
4
+ "version": "0.8.0-rc.1",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/dsh-cc/dsh-cc.git",
@@ -41,8 +41,8 @@
41
41
  "@deepseek-ai/schemastery": "^3.18.1"
42
42
  },
43
43
  "dependencies": {
44
- "@dsh-cc/model-aliases": "^0.7.1",
45
- "@dsh-cc/tools": "^0.7.1"
44
+ "@dsh-cc/model-aliases": "^0.8.0-rc.1",
45
+ "@dsh-cc/tools": "^0.8.0-rc.1"
46
46
  },
47
47
  "devDependencies": {
48
48
  "@deepseek-ai/cordis": "link:../../../../deepseek-harness/vendor/cordis",
@@ -62,9 +62,9 @@
62
62
  "@deepseek-ai/dsh-session-persistence-jsonl": "link:../../../../deepseek-harness/packages/session/session-persistence-jsonl",
63
63
  "@deepseek-ai/dsh-subagent-spawn-in-process": "link:../../../../deepseek-harness/packages/subagent/subagent-spawn-in-process",
64
64
  "@deepseek-ai/dsh-subagent-fork-in-process": "link:../../../../deepseek-harness/packages/subagent/subagent-fork-in-process",
65
- "@dsh-cc/model-aliases": "^0.7.1",
66
- "@dsh-cc/tools": "^0.7.1",
67
- "@dsh-cc/agent-loop-mock": "^0.1.0"
65
+ "@dsh-cc/agent-loop-mock": "^0.1.0",
66
+ "@dsh-cc/tools": "^0.8.0-rc.1",
67
+ "@dsh-cc/model-aliases": "^0.8.0-rc.1"
68
68
  },
69
69
  "publishConfig": {
70
70
  "access": "public"