@dsh-cc/memory 0.7.1 → 0.8.0-rc.2
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 +2 -2
- package/README.md +4 -0
- package/README.zh.md +3 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/pressure.d.ts +66 -0
- package/lib/pressure.d.ts.map +1 -0
- package/lib/pressure.js +110 -0
- package/lib/pressure.js.map +1 -0
- package/lib/save.d.ts.map +1 -1
- package/lib/save.js +57 -12
- package/lib/save.js.map +1 -1
- package/lib/truncate.d.ts.map +1 -1
- package/lib/truncate.js +20 -7
- package/lib/truncate.js.map +1 -1
- package/lib/writeback.d.ts +10 -1
- package/lib/writeback.d.ts.map +1 -1
- package/lib/writeback.js +16 -7
- package/lib/writeback.js.map +1 -1
- package/package.json +6 -6
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:
|
|
6
|
-
README.zh.md:
|
|
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[];
|
package/lib/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,CAAC,MAAM,0BAA0B,CAAA;AAExC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAElD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAE7C,OAAO,EAAE,yBAAyB,EAAE,eAAe,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AAEtH,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAE/C,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;AAEnB,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAEjK,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAE5G,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;AAElB,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,mBAAmB,EACnB,yBAAyB,EACzB,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,gBAAgB,CAAA;
|
|
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"}
|
package/lib/pressure.js
ADDED
|
@@ -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;
|
|
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
|
-
|
|
156
|
-
|
|
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
|
-
|
|
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
|
|
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":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"save.js","sourceRoot":"","sources":["../src/save.ts"],"names":[],"mappings":"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"}
|
package/lib/truncate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"truncate.d.ts","sourceRoot":"","sources":["../src/truncate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
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
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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`
|
package/lib/truncate.js.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/lib/writeback.d.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
package/lib/writeback.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writeback.d.ts","sourceRoot":"","sources":["../src/writeback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;
|
|
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
|
/**
|
package/lib/writeback.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writeback.js","sourceRoot":"","sources":["../src/writeback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;
|
|
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.
|
|
4
|
+
"version": "0.8.0-rc.2",
|
|
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.
|
|
45
|
-
"@dsh-cc/tools": "^0.
|
|
44
|
+
"@dsh-cc/model-aliases": "^0.8.0-rc.2",
|
|
45
|
+
"@dsh-cc/tools": "^0.8.0-rc.2"
|
|
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.
|
|
66
|
-
"@dsh-cc/
|
|
67
|
-
"@dsh-cc/
|
|
65
|
+
"@dsh-cc/model-aliases": "^0.8.0-rc.2",
|
|
66
|
+
"@dsh-cc/agent-loop-mock": "^0.1.0",
|
|
67
|
+
"@dsh-cc/tools": "^0.8.0-rc.2"
|
|
68
68
|
},
|
|
69
69
|
"publishConfig": {
|
|
70
70
|
"access": "public"
|