@mono-agent/agent-app 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -1
- package/dist/background-runtime.d.ts +32 -0
- package/dist/background-runtime.d.ts.map +1 -1
- package/dist/background-runtime.js +396 -36
- package/dist/background-runtime.js.map +1 -1
- package/dist/background-snapshot-key.d.ts +2 -0
- package/dist/background-snapshot-key.d.ts.map +1 -1
- package/dist/background-snapshot-key.js +32 -1
- package/dist/background-snapshot-key.js.map +1 -1
- package/dist/channels.js +18 -3
- package/dist/channels.js.map +1 -1
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +61 -0
- package/dist/cli.js.map +1 -1
- package/dist/launchd.d.ts +2 -0
- package/dist/launchd.d.ts.map +1 -1
- package/dist/launchd.js +46 -17
- package/dist/launchd.js.map +1 -1
- package/dist/managed-runtime-packages.js +1 -1
- package/dist/managed-runtime-packages.js.map +1 -1
- package/dist/memory-command.d.ts +6 -0
- package/dist/memory-command.d.ts.map +1 -1
- package/dist/memory-command.js +363 -3
- package/dist/memory-command.js.map +1 -1
- package/package.json +15 -15
- package/skills/mono-agent-composer/references/config-blueprint.md +7 -1
- package/skills/mono-agent-composer/references/discovery-questions.md +1 -1
- package/skills/mono-agent-composer/references/feature-coverage.md +2 -2
- package/skills/mono-agent-composer/references/playbooks.md +3 -3
package/dist/launchd.d.ts
CHANGED
|
@@ -50,6 +50,8 @@ export declare function escapeXml(value: string): string;
|
|
|
50
50
|
* process.env. Only the explicit, non-secret operational allowlist is restored.
|
|
51
51
|
*/
|
|
52
52
|
export declare function buildPlistXml(input: PlistInput): string;
|
|
53
|
+
/** Exact argv persisted by the managed LaunchAgent producer. */
|
|
54
|
+
export declare function buildLaunchdProgramArguments(input: PlistInput): readonly string[];
|
|
53
55
|
/**
|
|
54
56
|
* PATH for the background worker: the launching shell's PATH (so the user's
|
|
55
57
|
* toolchain is reachable) plus Homebrew/usr-local in case launchd started from
|
package/dist/launchd.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launchd.d.ts","sourceRoot":"","sources":["../src/launchd.ts"],"names":[],"mappings":"AAOA;;;;GAIG;AAEH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;AAEpF,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,4EAA4E;IAC5E,QAAQ,CAAC,0BAA0B,EAAE,MAAM,CAAC;IAC5C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,+DAA+D;IAC/D,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAOD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAW7D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,MAA+B,GAAG,YAAY,CAUlG;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO/C;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"launchd.d.ts","sourceRoot":"","sources":["../src/launchd.ts"],"names":[],"mappings":"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"}
|
package/dist/launchd.js
CHANGED
|
@@ -51,23 +51,15 @@ export function escapeXml(value) {
|
|
|
51
51
|
* process.env. Only the explicit, non-secret operational allowlist is restored.
|
|
52
52
|
*/
|
|
53
53
|
export function buildPlistXml(input) {
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
"
|
|
59
|
-
"
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
"start",
|
|
64
|
-
"--foreground",
|
|
65
|
-
"--config",
|
|
66
|
-
input.configPath,
|
|
67
|
-
...(input.envFile === undefined ? [] : ["--env-file", input.envFile]),
|
|
68
|
-
"--expected-background-snapshot",
|
|
69
|
-
input.expectedBackgroundSnapshot,
|
|
70
|
-
];
|
|
54
|
+
const programArguments = buildLaunchdProgramArguments(input);
|
|
55
|
+
for (const [name, value] of [
|
|
56
|
+
["launchd label", input.label],
|
|
57
|
+
["working directory", input.cwd],
|
|
58
|
+
["stdout path", input.stdoutPath],
|
|
59
|
+
["stderr path", input.stderrPath],
|
|
60
|
+
]) {
|
|
61
|
+
assertControlFree(value, name);
|
|
62
|
+
}
|
|
71
63
|
const argsXml = programArguments.map((arg) => ` <string>${escapeXml(arg)}</string>`).join("\n");
|
|
72
64
|
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
73
65
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
@@ -100,6 +92,43 @@ ${argsXml}
|
|
|
100
92
|
</plist>
|
|
101
93
|
`;
|
|
102
94
|
}
|
|
95
|
+
/** Exact argv persisted by the managed LaunchAgent producer. */
|
|
96
|
+
export function buildLaunchdProgramArguments(input) {
|
|
97
|
+
const environmentArguments = Object.entries(input.environment)
|
|
98
|
+
.sort(([left], [right]) => compareCodeUnits(left, right))
|
|
99
|
+
.map(([key, value]) => {
|
|
100
|
+
if (!/^[A-Za-z_][A-Za-z0-9_]*$/u.test(key)) {
|
|
101
|
+
throw new Error("Launchd environment names must use the portable identifier grammar.");
|
|
102
|
+
}
|
|
103
|
+
assertControlFree(value, `launchd environment ${key}`);
|
|
104
|
+
return `${key}=${value}`;
|
|
105
|
+
});
|
|
106
|
+
const arguments_ = [
|
|
107
|
+
"/usr/bin/env",
|
|
108
|
+
"-i",
|
|
109
|
+
...environmentArguments,
|
|
110
|
+
input.nodePath,
|
|
111
|
+
input.cliPath,
|
|
112
|
+
"start",
|
|
113
|
+
"--foreground",
|
|
114
|
+
"--config",
|
|
115
|
+
input.configPath,
|
|
116
|
+
...(input.envFile === undefined ? [] : ["--env-file", input.envFile]),
|
|
117
|
+
"--expected-background-snapshot",
|
|
118
|
+
input.expectedBackgroundSnapshot,
|
|
119
|
+
];
|
|
120
|
+
for (const argument of arguments_)
|
|
121
|
+
assertControlFree(argument, "launchd program argument");
|
|
122
|
+
return arguments_;
|
|
123
|
+
}
|
|
124
|
+
function assertControlFree(value, label) {
|
|
125
|
+
if (/[\u0000-\u001f\u007f]/u.test(value)) {
|
|
126
|
+
throw new Error(`${label} must not contain control characters.`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function compareCodeUnits(left, right) {
|
|
130
|
+
return left < right ? -1 : left > right ? 1 : 0;
|
|
131
|
+
}
|
|
103
132
|
/**
|
|
104
133
|
* PATH for the background worker: the launching shell's PATH (so the user's
|
|
105
134
|
* toolchain is reachable) plus Homebrew/usr-local in case launchd started from
|
package/dist/launchd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launchd.js","sourceRoot":"","sources":["../src/launchd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AA4CzD,MAAM,YAAY,GAAG,gBAAgB,CAAC;AACtC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAC9B,MAAM,aAAa,GAAG,gEAAgE,CAAC;AACvF,MAAM,WAAW,GAAG,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,CAAC;AAE5D;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAAkB;IACnD,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;SACvC,WAAW,EAAE;SACb,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC;SAC7B,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;SACxB,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC;SAC5B,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACxB,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7E,OAAO,GAAG,YAAY,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,OAAe,oBAAoB,EAAE;IAClF,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;IACpD,OAAO;QACL,eAAe;QACf,MAAM;QACN,SAAS,EAAE,OAAO,CAAC,eAAe,EAAE,GAAG,KAAK,QAAQ,CAAC;QACrD,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,KAAK,UAAU,CAAC;QAC/C,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,KAAK,UAAU,CAAC;KAChD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,OAAO,KAAK;SACT,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC;SACvB,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;SACtB,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;SACtB,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC;SACxB,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC9B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,KAAiB;IAC7C,MAAM,oBAAoB,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC;SAC3D,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"launchd.js","sourceRoot":"","sources":["../src/launchd.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,7 +24,7 @@ export async function resolveConfiguredManagedRuntimePackages(input) {
|
|
|
24
24
|
const appBase = import.meta.url;
|
|
25
25
|
const cwdBase = pathToFileURL(join(cwd, "package.json")).href;
|
|
26
26
|
const resolved = await Promise.all([...requirements]
|
|
27
|
-
.sort(([left], [right]) => left
|
|
27
|
+
.sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0)
|
|
28
28
|
.map(async ([packageName, allowCwdFallback]) => ({
|
|
29
29
|
packageName,
|
|
30
30
|
packageSource: await resolveInstalledPackageRoot(packageName, allowCwdFallback ? [cwdBase, appBase] : [appBase]),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"managed-runtime-packages.js","sourceRoot":"","sources":["../src/managed-runtime-packages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,mCAAmC,EAAE,MAAM,sBAAsB,CAAC;AAE3E,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAQrE,0FAA0F;AAC1F,MAAM,CAAC,KAAK,UAAU,uCAAuC,CAC3D,KAAyC;IAEzC,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAClD,mCAAmC,CAAC,KAAK,CAAC,UAAU,CAAC;QACrD,iBAAiB,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;KACzE,CAAC,CAAC;IACH,MAAM,YAAY,GAAG,IAAI,GAAG,EAAmB,CAAC;IAChD,KAAK,MAAM,WAAW,IAAI,eAAe;QAAE,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAChF,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,KAAK,aAAa,EAAE,CAAC;QAC7C,uEAAuE;QACvE,wEAAwE;QACxE,wEAAwE;QACxE,YAAY,CAAC,GAAG,CAAC,0BAA0B,EAAE,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IAChC,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC;SACjD,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"managed-runtime-packages.js","sourceRoot":"","sources":["../src/managed-runtime-packages.ts"],"names":[],"mappings":"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"}
|
package/dist/memory-command.d.ts
CHANGED
|
@@ -6,9 +6,15 @@ export interface RunMemoryCommandInput {
|
|
|
6
6
|
readonly json: boolean;
|
|
7
7
|
readonly strict: boolean;
|
|
8
8
|
readonly limit?: number;
|
|
9
|
+
readonly idsFile?: string;
|
|
10
|
+
readonly reason?: string;
|
|
11
|
+
readonly planPath?: string;
|
|
12
|
+
readonly backupPath?: string;
|
|
9
13
|
}
|
|
10
14
|
export declare function runMemoryCommand(input: RunMemoryCommandInput): Promise<number>;
|
|
11
15
|
type ReplayAdoptionFailureCode = "replay_adoption_usage" | "replay_adoption_config_invalid" | "replay_adoption_requires_bujo" | "replay_adoption_agent_running" | "replay_adoption_failed";
|
|
12
16
|
export declare function writeReplayAdoptionCliFailure(json: boolean, code: ReplayAdoptionFailureCode): void;
|
|
17
|
+
export type MemoryForgetFailureCode = "forget_requires_bujo" | "forget_usage" | "forget_config_invalid" | "forget_prepare_failed" | "forget_apply_failed" | "forget_apply_failed_recovered" | "forget_apply_recovery_failed" | "forget_restore_failed";
|
|
18
|
+
export declare function writeMemoryForgetFailure(json: boolean, operation: string, code: MemoryForgetFailureCode, recovered?: boolean, backupPath?: string): void;
|
|
13
19
|
export {};
|
|
14
20
|
//# sourceMappingURL=memory-command.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-command.d.ts","sourceRoot":"","sources":["../src/memory-command.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"memory-command.d.ts","sourceRoot":"","sources":["../src/memory-command.ts"],"names":[],"mappings":"AA6DA,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACjD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAkCD,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAqFpF;AAiHD,KAAK,yBAAyB,GAC1B,uBAAuB,GACvB,gCAAgC,GAChC,+BAA+B,GAC/B,+BAA+B,GAC/B,wBAAwB,CAAC;AAU7B,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,yBAAyB,GAAG,IAAI,CAalG;AAuCD,MAAM,MAAM,uBAAuB,GAC/B,sBAAsB,GACtB,cAAc,GACd,uBAAuB,GACvB,uBAAuB,GACvB,qBAAqB,GACrB,+BAA+B,GAC/B,8BAA8B,GAC9B,uBAAuB,CAAC;AAiU5B,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,OAAO,EACb,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,uBAAuB,EAC7B,SAAS,UAAQ,EACjB,UAAU,CAAC,EAAE,MAAM,GAClB,IAAI,CAkBN"}
|
package/dist/memory-command.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { constants } from "node:fs";
|
|
3
|
+
import { lstat, mkdir, open as openFile, readFile, readdir, realpath, rm, stat, writeFile, } from "node:fs/promises";
|
|
4
|
+
import { basename, dirname, isAbsolute, join, relative, resolve } from "node:path";
|
|
3
5
|
import { resolveSupermemoryContainer } from "@mono-agent/config";
|
|
4
6
|
import { listTraceSources } from "@mono-agent/observability";
|
|
5
7
|
import { isAppCoreConfigError, loadAppCoreConfig, resolveAppTraceRegistryDir, resolveGlobalTraceRegistryDir, } from "./app-config.js";
|
|
@@ -12,6 +14,10 @@ const INTAKE_ID_RE = /^[a-f0-9]{64}$/u;
|
|
|
12
14
|
const INTAKE_REASON_RE = /^[a-z0-9][a-z0-9_-]{0,63}$/u;
|
|
13
15
|
const MEMORY_HEALTH_SCHEMA_VERSION = 1;
|
|
14
16
|
const REPLAY_ADOPTION_SCHEMA_VERSION = 1;
|
|
17
|
+
const MEMORY_FORGET_SCHEMA_VERSION = 1;
|
|
18
|
+
const MAX_FORGET_IDS = 32;
|
|
19
|
+
const MAX_FORGET_PLAN_BYTES = 1024 * 1024;
|
|
20
|
+
const MEMORY_ID_RE = /^[A-Za-z0-9][A-Za-z0-9:._-]{0,127}$/u;
|
|
15
21
|
const EMPTY_HEALTH_COUNTS = Object.freeze({
|
|
16
22
|
pending: 0,
|
|
17
23
|
due: 0,
|
|
@@ -29,6 +35,10 @@ export async function runMemoryCommand(input) {
|
|
|
29
35
|
writeReplayAdoptionCliFailure(input.json, "replay_adoption_usage");
|
|
30
36
|
return 2;
|
|
31
37
|
}
|
|
38
|
+
if (input.positionals[0] === "forget") {
|
|
39
|
+
writeMemoryForgetFailure(input.json, input.positionals[1] ?? "unknown", "forget_usage");
|
|
40
|
+
return 2;
|
|
41
|
+
}
|
|
32
42
|
process.stderr.write(ui.errorLine(usageError));
|
|
33
43
|
return 2;
|
|
34
44
|
}
|
|
@@ -48,6 +58,10 @@ export async function runMemoryCommand(input) {
|
|
|
48
58
|
writeReplayAdoptionCliFailure(input.json, "replay_adoption_requires_bujo");
|
|
49
59
|
return 1;
|
|
50
60
|
}
|
|
61
|
+
if (subcommand === "forget") {
|
|
62
|
+
writeMemoryForgetFailure(input.json, rest[0] ?? "unknown", "forget_requires_bujo");
|
|
63
|
+
return 1;
|
|
64
|
+
}
|
|
51
65
|
writeNoMemory(context.configPath, input.json);
|
|
52
66
|
return 0;
|
|
53
67
|
}
|
|
@@ -90,9 +104,11 @@ export async function runMemoryCommand(input) {
|
|
|
90
104
|
return await runIndexTransition(context, "rollback", input.json);
|
|
91
105
|
case "adopt-replay":
|
|
92
106
|
return await runReplayAdoption(context, input.json);
|
|
107
|
+
case "forget":
|
|
108
|
+
return await runMemoryForget(context, rest, input);
|
|
93
109
|
default:
|
|
94
110
|
process.stderr.write(ui.errorLine(`Unknown memory subcommand \`${subcommand}\`.`));
|
|
95
|
-
process.stderr.write(ui.hint("Expected stats, today, show <date>, search <query>, top, audit, inspect [id], retry [id], resolve <id> <reason>, rebuild, rollback,
|
|
111
|
+
process.stderr.write(ui.hint("Expected stats, today, show <date>, search <query>, top, audit, inspect [id], retry [id], resolve <id> <reason>, rebuild, rollback, adopt-replay, or forget prepare|apply|restore."));
|
|
96
112
|
return 2;
|
|
97
113
|
}
|
|
98
114
|
}
|
|
@@ -137,6 +153,28 @@ function memoryCommandUsageError(input) {
|
|
|
137
153
|
return INTAKE_REASON_RE.test(rest[1] ?? "")
|
|
138
154
|
? undefined
|
|
139
155
|
: "memory resolve reason must be a 1-64 character lowercase slug.";
|
|
156
|
+
case "forget": {
|
|
157
|
+
const operation = rest[0];
|
|
158
|
+
if (rest.length !== 1 || (operation !== "prepare" && operation !== "apply" && operation !== "restore")) {
|
|
159
|
+
return "Usage: mono-agent memory forget prepare|apply|restore with the required operation flags.";
|
|
160
|
+
}
|
|
161
|
+
if (operation === "prepare") {
|
|
162
|
+
return input.idsFile !== undefined && input.reason !== undefined && input.planPath !== undefined
|
|
163
|
+
&& input.backupPath === undefined && INTAKE_REASON_RE.test(input.reason)
|
|
164
|
+
? undefined
|
|
165
|
+
: "Usage: mono-agent memory forget prepare --ids-file <file> --reason <lowercase-slug> --plan <file>.";
|
|
166
|
+
}
|
|
167
|
+
if (operation === "apply") {
|
|
168
|
+
return input.planPath !== undefined && input.idsFile === undefined && input.reason === undefined
|
|
169
|
+
&& input.backupPath === undefined
|
|
170
|
+
? undefined
|
|
171
|
+
: "Usage: mono-agent memory forget apply --plan <file>.";
|
|
172
|
+
}
|
|
173
|
+
return input.backupPath !== undefined && input.idsFile === undefined && input.reason === undefined
|
|
174
|
+
&& input.planPath === undefined
|
|
175
|
+
? undefined
|
|
176
|
+
: "Usage: mono-agent memory forget restore --backup <dir>.";
|
|
177
|
+
}
|
|
140
178
|
default:
|
|
141
179
|
return undefined;
|
|
142
180
|
}
|
|
@@ -226,6 +264,324 @@ function publicReplayAdoptionResult(result) {
|
|
|
226
264
|
function isSafeAggregateCount(value) {
|
|
227
265
|
return Number.isSafeInteger(value) && value >= 0;
|
|
228
266
|
}
|
|
267
|
+
class MemoryForgetOperationError extends Error {
|
|
268
|
+
code;
|
|
269
|
+
recovered;
|
|
270
|
+
backupPath;
|
|
271
|
+
constructor(code, recovered = false, backupPath) {
|
|
272
|
+
super(code);
|
|
273
|
+
this.code = code;
|
|
274
|
+
this.recovered = recovered;
|
|
275
|
+
this.backupPath = backupPath;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
const MEMORY_FORGET_FAILURE_MESSAGES = Object.freeze({
|
|
279
|
+
forget_requires_bujo: "Memory forget requires a configured built-in BuJo store with embeddings.",
|
|
280
|
+
forget_usage: "Memory forget arguments are invalid.",
|
|
281
|
+
forget_config_invalid: "Memory forget requires a valid private configuration.",
|
|
282
|
+
forget_prepare_failed: "Forget-plan preparation failed without changing the memory store.",
|
|
283
|
+
forget_apply_failed: "Forget-plan application failed before a recoverable backup was available.",
|
|
284
|
+
forget_apply_failed_recovered: "Forget-plan application failed and the complete pre-apply backup was restored.",
|
|
285
|
+
forget_apply_recovery_failed: "Forget-plan application failed and automatic recovery could not be verified; keep the agent stopped and restore the reported backup manually.",
|
|
286
|
+
forget_restore_failed: "Backup restore was refused or failed; the current memory store was not intentionally overwritten.",
|
|
287
|
+
});
|
|
288
|
+
async function runMemoryForget(context, rest, input) {
|
|
289
|
+
const operation = rest[0];
|
|
290
|
+
const memory = context.config.memory;
|
|
291
|
+
if (memory === undefined || (memory.backend ?? "bujo") === "supermemory"
|
|
292
|
+
|| memory.mode !== "bujo" || memory.embeddings === undefined) {
|
|
293
|
+
writeMemoryForgetFailure(input.json, operation, "forget_requires_bujo");
|
|
294
|
+
return 1;
|
|
295
|
+
}
|
|
296
|
+
try {
|
|
297
|
+
const bujo = await loadBujoModule();
|
|
298
|
+
const root = bujo.resolveExplicitMemoryForgetRoot(resolve(context.cwd, memory.path));
|
|
299
|
+
if (operation === "prepare") {
|
|
300
|
+
const result = await prepareMemoryForgetPlan(context, root, input);
|
|
301
|
+
write(input.json, result, () => renderMemoryForgetResult(result));
|
|
302
|
+
return 0;
|
|
303
|
+
}
|
|
304
|
+
if (operation === "apply") {
|
|
305
|
+
const result = await applyMemoryForgetPlan(context, root, input.planPath);
|
|
306
|
+
write(input.json, result, () => renderMemoryForgetResult(result));
|
|
307
|
+
return 0;
|
|
308
|
+
}
|
|
309
|
+
const result = await restoreMemoryForgetBackup(context, root, input.backupPath);
|
|
310
|
+
write(input.json, result, () => renderMemoryForgetResult(result));
|
|
311
|
+
return 0;
|
|
312
|
+
}
|
|
313
|
+
catch (error) {
|
|
314
|
+
const failure = error instanceof MemoryForgetOperationError
|
|
315
|
+
? error
|
|
316
|
+
: new MemoryForgetOperationError(operation === "prepare"
|
|
317
|
+
? "forget_prepare_failed"
|
|
318
|
+
: operation === "restore"
|
|
319
|
+
? "forget_restore_failed"
|
|
320
|
+
: "forget_apply_failed");
|
|
321
|
+
writeMemoryForgetFailure(input.json, operation, failure.code, failure.recovered, failure.backupPath);
|
|
322
|
+
return 1;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
async function prepareMemoryForgetPlan(context, root, input) {
|
|
326
|
+
const idsFile = resolve(context.cwd, input.idsFile);
|
|
327
|
+
const planPath = await canonicalProspectivePath(resolve(context.cwd, input.planPath));
|
|
328
|
+
if (isSameOrUnderDirectory(root, planPath)) {
|
|
329
|
+
throw new MemoryForgetOperationError("forget_prepare_failed");
|
|
330
|
+
}
|
|
331
|
+
const memoryIds = await readMemoryIds(idsFile);
|
|
332
|
+
const bujo = await loadBujoModule();
|
|
333
|
+
bujo.previewCanonicalExplicitForgetMemories(root, memoryIds);
|
|
334
|
+
const payload = {
|
|
335
|
+
schemaVersion: MEMORY_FORGET_SCHEMA_VERSION,
|
|
336
|
+
operation: "forget",
|
|
337
|
+
rootFingerprint: memoryRootFingerprint(root),
|
|
338
|
+
sourceFingerprint: bujo.readBujoCanonicalSourceFingerprint(root),
|
|
339
|
+
reason: input.reason,
|
|
340
|
+
createdAt: new Date().toISOString(),
|
|
341
|
+
memoryIds,
|
|
342
|
+
};
|
|
343
|
+
const plan = { ...payload, planDigest: memoryForgetPlanDigest(payload) };
|
|
344
|
+
await writePrivateJsonExclusive(planPath, plan);
|
|
345
|
+
return {
|
|
346
|
+
schemaVersion: MEMORY_FORGET_SCHEMA_VERSION,
|
|
347
|
+
operation: "forget-prepare",
|
|
348
|
+
status: "prepared",
|
|
349
|
+
count: memoryIds.length,
|
|
350
|
+
planPath,
|
|
351
|
+
planDigest: plan.planDigest,
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
async function applyMemoryForgetPlan(context, root, rawPlanPath) {
|
|
355
|
+
const planPath = resolve(context.cwd, rawPlanPath);
|
|
356
|
+
const canonicalPlanPath = await canonicalProspectivePath(planPath);
|
|
357
|
+
if (isSameOrUnderDirectory(root, canonicalPlanPath)) {
|
|
358
|
+
throw new MemoryForgetOperationError("forget_apply_failed");
|
|
359
|
+
}
|
|
360
|
+
const plan = await readMemoryForgetPlan(planPath);
|
|
361
|
+
const bujo = await loadBujoModule();
|
|
362
|
+
if (plan.rootFingerprint !== memoryRootFingerprint(root)) {
|
|
363
|
+
throw new MemoryForgetOperationError("forget_apply_failed");
|
|
364
|
+
}
|
|
365
|
+
// Preserve the user-facing same-config diagnostic; the package transaction
|
|
366
|
+
// independently enforces the authoritative shared-root writer lease.
|
|
367
|
+
await assertNoLiveConfiguredAgent(context.configPath, await memoryRegistryDirs(context));
|
|
368
|
+
const settings = previewRecallSettings(context.config);
|
|
369
|
+
if (settings === undefined || "supermemory" in settings || settings.embeddings === undefined) {
|
|
370
|
+
throw new MemoryForgetOperationError("forget_apply_failed");
|
|
371
|
+
}
|
|
372
|
+
const { createMemoryEmbeddingProvider } = await loadMemoryRecallModule();
|
|
373
|
+
const embeddings = await createMemoryEmbeddingProvider(settings.embeddings);
|
|
374
|
+
try {
|
|
375
|
+
const result = await bujo.applyExplicitMemoryForget({
|
|
376
|
+
root,
|
|
377
|
+
ids: plan.memoryIds,
|
|
378
|
+
expectedRootFingerprint: plan.rootFingerprint,
|
|
379
|
+
expectedSourceFingerprint: plan.sourceFingerprint,
|
|
380
|
+
planDigest: plan.planDigest,
|
|
381
|
+
embeddings,
|
|
382
|
+
dimension: settings.embeddings.dim ?? 768,
|
|
383
|
+
});
|
|
384
|
+
return {
|
|
385
|
+
schemaVersion: MEMORY_FORGET_SCHEMA_VERSION,
|
|
386
|
+
operation: "forget-apply",
|
|
387
|
+
status: "applied",
|
|
388
|
+
count: result.forgotten,
|
|
389
|
+
sourceFingerprint: result.sourceFingerprint,
|
|
390
|
+
backupPath: result.backupPath,
|
|
391
|
+
planDigest: plan.planDigest,
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
catch (error) {
|
|
395
|
+
if (error instanceof bujo.ExplicitMemoryForgetError) {
|
|
396
|
+
if (error.code === "apply_failed_recovered") {
|
|
397
|
+
throw new MemoryForgetOperationError("forget_apply_failed_recovered", true, error.backupPath);
|
|
398
|
+
}
|
|
399
|
+
if (error.code === "apply_recovery_failed") {
|
|
400
|
+
throw new MemoryForgetOperationError("forget_apply_recovery_failed", false, error.backupPath);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
throw new MemoryForgetOperationError("forget_apply_failed");
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
async function restoreMemoryForgetBackup(context, root, rawBackupPath) {
|
|
407
|
+
const bujo = await loadBujoModule();
|
|
408
|
+
try {
|
|
409
|
+
const result = await bujo.restoreExplicitMemoryForget({
|
|
410
|
+
root,
|
|
411
|
+
backupPath: resolve(context.cwd, rawBackupPath),
|
|
412
|
+
expectedRootFingerprint: memoryRootFingerprint(root),
|
|
413
|
+
});
|
|
414
|
+
return {
|
|
415
|
+
schemaVersion: MEMORY_FORGET_SCHEMA_VERSION,
|
|
416
|
+
operation: "forget-restore",
|
|
417
|
+
status: "restored",
|
|
418
|
+
backupPath: result.backupPath,
|
|
419
|
+
sourceFingerprint: result.sourceFingerprint,
|
|
420
|
+
planDigest: result.planDigest,
|
|
421
|
+
};
|
|
422
|
+
}
|
|
423
|
+
catch {
|
|
424
|
+
throw new MemoryForgetOperationError("forget_restore_failed");
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
async function readMemoryIds(path) {
|
|
428
|
+
const raw = await readPinnedFile(path, MAX_FORGET_PLAN_BYTES, false);
|
|
429
|
+
const ids = raw.split(/\r?\n/gu).map((id) => id.trim()).filter((id) => id.length > 0).sort();
|
|
430
|
+
if (ids.length === 0 || ids.length > MAX_FORGET_IDS || new Set(ids).size !== ids.length
|
|
431
|
+
|| ids.some((id) => !MEMORY_ID_RE.test(id))) {
|
|
432
|
+
throw new MemoryForgetOperationError("forget_prepare_failed");
|
|
433
|
+
}
|
|
434
|
+
return ids;
|
|
435
|
+
}
|
|
436
|
+
function memoryForgetPlanDigest(payload) {
|
|
437
|
+
return createHash("sha256").update(JSON.stringify(payload)).digest("hex");
|
|
438
|
+
}
|
|
439
|
+
function memoryRootFingerprint(root) {
|
|
440
|
+
return createHash("sha256").update(root).digest("hex");
|
|
441
|
+
}
|
|
442
|
+
async function readMemoryForgetPlan(path) {
|
|
443
|
+
const value = await readPrivateJson(path, MAX_FORGET_PLAN_BYTES);
|
|
444
|
+
if (!isObject(value)
|
|
445
|
+
|| !hasExactKeys(value, [
|
|
446
|
+
"createdAt",
|
|
447
|
+
"memoryIds",
|
|
448
|
+
"operation",
|
|
449
|
+
"planDigest",
|
|
450
|
+
"reason",
|
|
451
|
+
"rootFingerprint",
|
|
452
|
+
"schemaVersion",
|
|
453
|
+
"sourceFingerprint",
|
|
454
|
+
])
|
|
455
|
+
|| value.schemaVersion !== MEMORY_FORGET_SCHEMA_VERSION
|
|
456
|
+
|| value.operation !== "forget"
|
|
457
|
+
|| !isSha256(value.rootFingerprint)
|
|
458
|
+
|| !isSha256(value.sourceFingerprint)
|
|
459
|
+
|| typeof value.reason !== "string" || !INTAKE_REASON_RE.test(value.reason)
|
|
460
|
+
|| typeof value.createdAt !== "string" || !isCanonicalIso(value.createdAt)
|
|
461
|
+
|| !Array.isArray(value.memoryIds) || value.memoryIds.length === 0
|
|
462
|
+
|| value.memoryIds.length > MAX_FORGET_IDS
|
|
463
|
+
|| value.memoryIds.some((id) => typeof id !== "string" || !MEMORY_ID_RE.test(id))
|
|
464
|
+
|| new Set(value.memoryIds).size !== value.memoryIds.length
|
|
465
|
+
|| typeof value.planDigest !== "string" || !isSha256(value.planDigest)) {
|
|
466
|
+
throw new MemoryForgetOperationError("forget_apply_failed");
|
|
467
|
+
}
|
|
468
|
+
const payload = {
|
|
469
|
+
schemaVersion: MEMORY_FORGET_SCHEMA_VERSION,
|
|
470
|
+
operation: "forget",
|
|
471
|
+
rootFingerprint: value.rootFingerprint,
|
|
472
|
+
sourceFingerprint: value.sourceFingerprint,
|
|
473
|
+
reason: value.reason,
|
|
474
|
+
createdAt: value.createdAt,
|
|
475
|
+
memoryIds: value.memoryIds,
|
|
476
|
+
};
|
|
477
|
+
if (value.planDigest !== memoryForgetPlanDigest(payload)) {
|
|
478
|
+
throw new MemoryForgetOperationError("forget_apply_failed");
|
|
479
|
+
}
|
|
480
|
+
return { ...payload, planDigest: value.planDigest };
|
|
481
|
+
}
|
|
482
|
+
async function writePrivateJsonExclusive(path, value) {
|
|
483
|
+
const handle = await openFile(path, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | (constants.O_NOFOLLOW ?? 0), 0o600);
|
|
484
|
+
try {
|
|
485
|
+
await handle.writeFile(`${JSON.stringify(value, null, 2)}\n`, "utf8");
|
|
486
|
+
await handle.sync();
|
|
487
|
+
const opened = await handle.stat();
|
|
488
|
+
const current = await lstat(path);
|
|
489
|
+
assertPinnedFile(opened, current, path, true, MAX_FORGET_PLAN_BYTES);
|
|
490
|
+
}
|
|
491
|
+
finally {
|
|
492
|
+
await handle.close();
|
|
493
|
+
}
|
|
494
|
+
await fsyncParentDirectory(path);
|
|
495
|
+
}
|
|
496
|
+
async function readPrivateJson(path, maxBytes) {
|
|
497
|
+
return JSON.parse(await readPinnedFile(path, maxBytes, true));
|
|
498
|
+
}
|
|
499
|
+
async function readPinnedFile(path, maxBytes, ownerPrivate) {
|
|
500
|
+
const before = await lstat(path);
|
|
501
|
+
const handle = await openFile(path, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0));
|
|
502
|
+
try {
|
|
503
|
+
const opened = await handle.stat();
|
|
504
|
+
assertPinnedFile(before, opened, path, ownerPrivate, maxBytes);
|
|
505
|
+
const content = await handle.readFile("utf8");
|
|
506
|
+
const after = await handle.stat();
|
|
507
|
+
const current = await lstat(path);
|
|
508
|
+
assertPinnedFile(opened, after, path, ownerPrivate, maxBytes);
|
|
509
|
+
assertPinnedFile(opened, current, path, ownerPrivate, maxBytes);
|
|
510
|
+
if (opened.size !== after.size || opened.mtimeMs !== after.mtimeMs || opened.ctimeMs !== after.ctimeMs) {
|
|
511
|
+
throw new Error("private artifact changed while it was read");
|
|
512
|
+
}
|
|
513
|
+
return content;
|
|
514
|
+
}
|
|
515
|
+
finally {
|
|
516
|
+
await handle.close();
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
function assertPinnedFile(expected, actual, path, ownerPrivate, maxBytes) {
|
|
520
|
+
const uid = typeof process.getuid === "function" ? process.getuid() : undefined;
|
|
521
|
+
if (!actual.isFile() || actual.isSymbolicLink() || actual.nlink !== 1 || actual.size > maxBytes
|
|
522
|
+
|| expected.dev !== actual.dev || expected.ino !== actual.ino
|
|
523
|
+
|| (ownerPrivate && (actual.mode & 0o077) !== 0)
|
|
524
|
+
|| (uid !== undefined && actual.uid !== uid)) {
|
|
525
|
+
throw new Error(`private artifact is unsafe: ${path}`);
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
async function fsyncParentDirectory(path) {
|
|
529
|
+
const handle = await openFile(dirname(path), constants.O_RDONLY);
|
|
530
|
+
try {
|
|
531
|
+
await handle.sync();
|
|
532
|
+
}
|
|
533
|
+
finally {
|
|
534
|
+
await handle.close();
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
async function canonicalProspectivePath(path) {
|
|
538
|
+
const parent = await realpath(dirname(path));
|
|
539
|
+
return join(parent, basename(path));
|
|
540
|
+
}
|
|
541
|
+
function isSameOrUnderDirectory(parent, child) {
|
|
542
|
+
return parent === child || isUnderDirectory(parent, child);
|
|
543
|
+
}
|
|
544
|
+
function isObject(value) {
|
|
545
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
546
|
+
}
|
|
547
|
+
function hasExactKeys(value, keys) {
|
|
548
|
+
return JSON.stringify(Object.keys(value).sort()) === JSON.stringify([...keys].sort());
|
|
549
|
+
}
|
|
550
|
+
function isSha256(value) {
|
|
551
|
+
return typeof value === "string" && /^[a-f0-9]{64}$/u.test(value);
|
|
552
|
+
}
|
|
553
|
+
function isCanonicalIso(value) {
|
|
554
|
+
const timestamp = Date.parse(value);
|
|
555
|
+
return Number.isFinite(timestamp) && new Date(timestamp).toISOString() === value;
|
|
556
|
+
}
|
|
557
|
+
export function writeMemoryForgetFailure(json, operation, code, recovered = false, backupPath) {
|
|
558
|
+
const safeOperation = operation === "prepare" || operation === "apply" || operation === "restore"
|
|
559
|
+
? operation
|
|
560
|
+
: "unknown";
|
|
561
|
+
const result = {
|
|
562
|
+
schemaVersion: MEMORY_FORGET_SCHEMA_VERSION,
|
|
563
|
+
operation: `forget-${safeOperation}`,
|
|
564
|
+
status: "failed",
|
|
565
|
+
code,
|
|
566
|
+
message: MEMORY_FORGET_FAILURE_MESSAGES[code],
|
|
567
|
+
...(recovered ? { recovered: true } : {}),
|
|
568
|
+
...(backupPath === undefined ? {} : { backupPath }),
|
|
569
|
+
};
|
|
570
|
+
if (json) {
|
|
571
|
+
write(true, result, () => "");
|
|
572
|
+
return;
|
|
573
|
+
}
|
|
574
|
+
process.stderr.write(ui.errorLine(`[${code}] ${result.message}`));
|
|
575
|
+
}
|
|
576
|
+
function renderMemoryForgetResult(result) {
|
|
577
|
+
return `${ui.banner("mono-agent memory", result.operation)}\n${ui.keyValue([
|
|
578
|
+
["status", result.status],
|
|
579
|
+
...(result.count === undefined ? [] : [["count", String(result.count)]]),
|
|
580
|
+
...(result.planPath === undefined ? [] : [["plan", result.planPath]]),
|
|
581
|
+
...(result.backupPath === undefined ? [] : [["backup", result.backupPath]]),
|
|
582
|
+
...(result.sourceFingerprint === undefined ? [] : [["source fingerprint", result.sourceFingerprint]]),
|
|
583
|
+
])}\n`;
|
|
584
|
+
}
|
|
229
585
|
function notConfiguredHealthReport(now = new Date()) {
|
|
230
586
|
return {
|
|
231
587
|
schemaVersion: MEMORY_HEALTH_SCHEMA_VERSION,
|
|
@@ -571,6 +927,10 @@ async function loadMemoryCommandContext(input) {
|
|
|
571
927
|
writeReplayAdoptionCliFailure(input.json, "replay_adoption_config_invalid");
|
|
572
928
|
return { code: 1 };
|
|
573
929
|
}
|
|
930
|
+
if (input.positionals[0] === "forget") {
|
|
931
|
+
writeMemoryForgetFailure(input.json, input.positionals[1] ?? "unknown", "forget_config_invalid");
|
|
932
|
+
return { code: 1 };
|
|
933
|
+
}
|
|
574
934
|
if (isAppCoreConfigError(error)) {
|
|
575
935
|
process.stderr.write(ui.errorLine(error.message));
|
|
576
936
|
process.stderr.write(ui.hint(`Fix ${configPath}, then re-run \`mono-agent memory\`.`));
|