@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/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
@@ -1 +1 @@
1
- {"version":3,"file":"launchd.d.ts","sourceRoot":"","sources":["../src/launchd.ts"],"names":[],"mappings":"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"}
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 environmentArguments = Object.entries(input.environment)
55
- .sort(([left], [right]) => left.localeCompare(right))
56
- .map(([key, value]) => `${key}=${value}`);
57
- const programArguments = [
58
- "/usr/bin/env",
59
- "-i",
60
- ...environmentArguments,
61
- input.nodePath,
62
- input.cliPath,
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
@@ -1 +1 @@
1
- {"version":3,"file":"launchd.js","sourceRoot":"","sources":["../src/launchd.ts"],"names":[],"mappings":"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"}
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.localeCompare(right))
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":"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"}
1
+ {"version":3,"file":"managed-runtime-packages.js","sourceRoot":"","sources":["../src/managed-runtime-packages.ts"],"names":[],"mappings":"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"}
@@ -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":"AA6CA,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;CACzB;AAoBD,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CA2EpF;AA2FD,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"}
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"}
@@ -1,5 +1,7 @@
1
- import { readdir, readFile, realpath, stat } from "node:fs/promises";
2
- import { basename, isAbsolute, join, relative, resolve } from "node:path";
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, or adopt-replay."));
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\`.`));