@remnic/core 9.3.762 → 9.3.764

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.
Files changed (124) hide show
  1. package/dist/access-admin-ops-surface.d.ts +2 -2
  2. package/dist/access-admin-ops-surface.js +5 -5
  3. package/dist/access-boundary.d.ts +2 -2
  4. package/dist/access-boundary.js +6 -6
  5. package/dist/access-cli.js +26 -26
  6. package/dist/access-http.d.ts +2 -2
  7. package/dist/access-http.js +10 -10
  8. package/dist/access-identity-continuity-surface.d.ts +1 -1
  9. package/dist/access-identity-continuity-surface.js +5 -5
  10. package/dist/access-lcm-surface.d.ts +2 -2
  11. package/dist/access-lcm-surface.js +5 -5
  12. package/dist/access-mcp.d.ts +2 -2
  13. package/dist/access-mcp.js +9 -9
  14. package/dist/access-observe-write-surface.d.ts +2 -2
  15. package/dist/access-observe-write-surface.js +5 -5
  16. package/dist/access-operations-batch.js +7 -7
  17. package/dist/access-operations.d.ts +2 -2
  18. package/dist/access-operations.js +8 -8
  19. package/dist/access-recall-surface.d.ts +2 -2
  20. package/dist/access-recall-surface.js +5 -5
  21. package/dist/{access-service-CaWJP_f6.d.ts → access-service-CAoJ4qN8.d.ts} +1 -1
  22. package/dist/access-service.d.ts +2 -2
  23. package/dist/access-service.js +5 -5
  24. package/dist/access-surface-catalog.d.ts +2 -2
  25. package/dist/bootstrap.d.ts +1 -1
  26. package/dist/briefing.js +3 -3
  27. package/dist/causal-consolidation.js +4 -4
  28. package/dist/{chunk-OQ6F3WBX.js → chunk-2RLECZ6J.js} +2 -2
  29. package/dist/{chunk-DB647OZ4.js → chunk-2V6CTSSA.js} +13 -13
  30. package/dist/{chunk-2KYXXMTE.js → chunk-422OELQ3.js} +4 -4
  31. package/dist/{chunk-DPZ5GJMD.js → chunk-5JF4DIKZ.js} +2 -2
  32. package/dist/{chunk-ZTBH2OHD.js → chunk-AS2NRB45.js} +2 -2
  33. package/dist/{chunk-JU6BKZHX.js → chunk-CGLRKKMF.js} +3 -3
  34. package/dist/{chunk-HDFS6RWQ.js → chunk-CVINPTKG.js} +2 -2
  35. package/dist/{chunk-P7W4CDX6.js → chunk-DTTVX6EO.js} +11 -3
  36. package/dist/chunk-DTTVX6EO.js.map +1 -0
  37. package/dist/{chunk-HDYFNXVO.js → chunk-IVFIYAIP.js} +2 -2
  38. package/dist/{chunk-QPFO54VC.js → chunk-KXG7HHIQ.js} +2 -2
  39. package/dist/{chunk-ESDBHQY6.js → chunk-N3QDLE2N.js} +5 -5
  40. package/dist/{chunk-4HYJETVO.js → chunk-N4ZA2I7M.js} +2 -2
  41. package/dist/{chunk-TEKTCF2V.js → chunk-NDXJJKT2.js} +2 -2
  42. package/dist/{chunk-2PGB63VU.js → chunk-NFWTMM2M.js} +2 -2
  43. package/dist/{chunk-PNFN7SIN.js → chunk-OX272PBW.js} +2 -2
  44. package/dist/{chunk-WAIMHMO3.js → chunk-P6ZZ4GX4.js} +3 -3
  45. package/dist/{chunk-HMUEAKSD.js → chunk-QPTP6SKC.js} +2 -2
  46. package/dist/{chunk-VHYFY3JI.js → chunk-R3K4CXPR.js} +2 -2
  47. package/dist/{chunk-EDC7RZCW.js → chunk-RIOJRLJ6.js} +25 -55
  48. package/dist/chunk-RIOJRLJ6.js.map +1 -0
  49. package/dist/{chunk-TIWRP5NW.js → chunk-RJCQPRLB.js} +4 -4
  50. package/dist/{chunk-IIURIWJG.js → chunk-SFNQDXXL.js} +9 -5
  51. package/dist/chunk-SFNQDXXL.js.map +1 -0
  52. package/dist/{chunk-MB5RSUW6.js → chunk-SXN3LCUT.js} +114 -28
  53. package/dist/chunk-SXN3LCUT.js.map +1 -0
  54. package/dist/{chunk-LAJIXABF.js → chunk-UQEE4H6Z.js} +12 -12
  55. package/dist/chunk-UQEE4H6Z.js.map +1 -0
  56. package/dist/{chunk-ES3GAMSQ.js → chunk-VKHZFF5P.js} +2 -2
  57. package/dist/{chunk-KZWUJC7Y.js → chunk-X7HTU4HO.js} +2 -2
  58. package/dist/{chunk-QWIE43BS.js → chunk-YDYC6PIS.js} +2 -2
  59. package/dist/{cli-CvWpIbMD.d.ts → cli-WRmxvfc_.d.ts} +2 -2
  60. package/dist/cli.d.ts +3 -3
  61. package/dist/cli.js +20 -20
  62. package/dist/compounding/engine.js +3 -3
  63. package/dist/connectors/codex-materialize-runner.js +3 -3
  64. package/dist/connectors/index.js +3 -3
  65. package/dist/entity-retrieval.js +3 -3
  66. package/dist/explicit-capture.d.ts +1 -1
  67. package/dist/index.d.ts +4 -4
  68. package/dist/index.js +26 -26
  69. package/dist/maintenance/memory-governance.js +3 -3
  70. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +3 -3
  71. package/dist/maintenance/rebuild-memory-projection.js +4 -4
  72. package/dist/mcp-memory-inspector-app.d.ts +2 -2
  73. package/dist/memory-projection-store.d.ts +6 -2
  74. package/dist/memory-projection-store.js +9 -3
  75. package/dist/namespaces/migrate.js +4 -4
  76. package/dist/namespaces/storage.js +3 -3
  77. package/dist/operator-toolkit.js +7 -7
  78. package/dist/orchestration/maintenance.js +5 -5
  79. package/dist/{orchestrator-C04Q4Zao.d.ts → orchestrator-Y9wyG4jK.d.ts} +102 -15
  80. package/dist/orchestrator.d.ts +1 -1
  81. package/dist/orchestrator.js +26 -26
  82. package/dist/{purge-6ATBGT77.js → purge-IHRX4Z7X.js} +7 -1
  83. package/dist/purge-IHRX4Z7X.js.map +1 -0
  84. package/dist/semantic-consolidation.js +4 -4
  85. package/dist/semantic-rule-promotion.js +3 -3
  86. package/dist/semantic-rule-verifier.js +3 -3
  87. package/dist/storage.js +2 -2
  88. package/dist/verified-recall.js +3 -3
  89. package/package.json +2 -2
  90. package/src/access-service.ts +7 -7
  91. package/src/maintenance/purge.test.ts +76 -0
  92. package/src/maintenance/purge.ts +3 -0
  93. package/src/maintenance/rebuild-memory-projection.ts +5 -1
  94. package/src/memory-projection-store.ts +143 -35
  95. package/src/orchestration/recall-introspection.ts +3 -12
  96. package/src/orchestrator.ts +9 -57
  97. package/src/storage.ts +8 -8
  98. package/dist/chunk-EDC7RZCW.js.map +0 -1
  99. package/dist/chunk-IIURIWJG.js.map +0 -1
  100. package/dist/chunk-LAJIXABF.js.map +0 -1
  101. package/dist/chunk-MB5RSUW6.js.map +0 -1
  102. package/dist/chunk-P7W4CDX6.js.map +0 -1
  103. package/dist/purge-6ATBGT77.js.map +0 -1
  104. /package/dist/{chunk-OQ6F3WBX.js.map → chunk-2RLECZ6J.js.map} +0 -0
  105. /package/dist/{chunk-DB647OZ4.js.map → chunk-2V6CTSSA.js.map} +0 -0
  106. /package/dist/{chunk-2KYXXMTE.js.map → chunk-422OELQ3.js.map} +0 -0
  107. /package/dist/{chunk-DPZ5GJMD.js.map → chunk-5JF4DIKZ.js.map} +0 -0
  108. /package/dist/{chunk-ZTBH2OHD.js.map → chunk-AS2NRB45.js.map} +0 -0
  109. /package/dist/{chunk-JU6BKZHX.js.map → chunk-CGLRKKMF.js.map} +0 -0
  110. /package/dist/{chunk-HDFS6RWQ.js.map → chunk-CVINPTKG.js.map} +0 -0
  111. /package/dist/{chunk-HDYFNXVO.js.map → chunk-IVFIYAIP.js.map} +0 -0
  112. /package/dist/{chunk-QPFO54VC.js.map → chunk-KXG7HHIQ.js.map} +0 -0
  113. /package/dist/{chunk-ESDBHQY6.js.map → chunk-N3QDLE2N.js.map} +0 -0
  114. /package/dist/{chunk-4HYJETVO.js.map → chunk-N4ZA2I7M.js.map} +0 -0
  115. /package/dist/{chunk-TEKTCF2V.js.map → chunk-NDXJJKT2.js.map} +0 -0
  116. /package/dist/{chunk-2PGB63VU.js.map → chunk-NFWTMM2M.js.map} +0 -0
  117. /package/dist/{chunk-PNFN7SIN.js.map → chunk-OX272PBW.js.map} +0 -0
  118. /package/dist/{chunk-WAIMHMO3.js.map → chunk-P6ZZ4GX4.js.map} +0 -0
  119. /package/dist/{chunk-HMUEAKSD.js.map → chunk-QPTP6SKC.js.map} +0 -0
  120. /package/dist/{chunk-VHYFY3JI.js.map → chunk-R3K4CXPR.js.map} +0 -0
  121. /package/dist/{chunk-TIWRP5NW.js.map → chunk-RJCQPRLB.js.map} +0 -0
  122. /package/dist/{chunk-ES3GAMSQ.js.map → chunk-VKHZFF5P.js.map} +0 -0
  123. /package/dist/{chunk-KZWUJC7Y.js.map → chunk-X7HTU4HO.js.map} +0 -0
  124. /package/dist/{chunk-QWIE43BS.js.map → chunk-YDYC6PIS.js.map} +0 -0
@@ -2,6 +2,8 @@ import {
2
2
  MEMORY_PROJECTION_SCHEMA_VERSION,
3
3
  getMemoryProjectionPath,
4
4
  initializeMemoryProjectionDb,
5
+ isProjectedMemoryPathValid,
6
+ markProjectedMemoryPathInvalid,
5
7
  memoryCurrentSelectExpressions,
6
8
  parseCurrentRow,
7
9
  parseTimelineRows,
@@ -11,14 +13,17 @@ import {
11
13
  readProjectedMemoryBrowse,
12
14
  readProjectedMemoryState,
13
15
  readProjectedMemoryTimeline,
14
- readProjectedNativeKnowledgeChunks
15
- } from "./chunk-MB5RSUW6.js";
16
+ readProjectedNativeKnowledgeChunks,
17
+ updateProjectedMemoryPath
18
+ } from "./chunk-SXN3LCUT.js";
16
19
  import "./chunk-6KYMPV2O.js";
17
20
  import "./chunk-PZ5AY32C.js";
18
21
  export {
19
22
  MEMORY_PROJECTION_SCHEMA_VERSION,
20
23
  getMemoryProjectionPath,
21
24
  initializeMemoryProjectionDb,
25
+ isProjectedMemoryPathValid,
26
+ markProjectedMemoryPathInvalid,
22
27
  memoryCurrentSelectExpressions,
23
28
  parseCurrentRow,
24
29
  parseTimelineRows,
@@ -28,6 +33,7 @@ export {
28
33
  readProjectedMemoryBrowse,
29
34
  readProjectedMemoryState,
30
35
  readProjectedMemoryTimeline,
31
- readProjectedNativeKnowledgeChunks
36
+ readProjectedNativeKnowledgeChunks,
37
+ updateProjectedMemoryPath
32
38
  };
33
39
  //# sourceMappingURL=memory-projection-store.js.map
@@ -2,8 +2,8 @@ import {
2
2
  listNamespaces,
3
3
  runNamespaceMigration,
4
4
  verifyNamespaces
5
- } from "../chunk-QPFO54VC.js";
6
- import "../chunk-PNFN7SIN.js";
5
+ } from "../chunk-KXG7HHIQ.js";
6
+ import "../chunk-OX272PBW.js";
7
7
  import "../chunk-BRYPUVJU.js";
8
8
  import "../chunk-NKP6II6G.js";
9
9
  import "../chunk-WRFKZEO6.js";
@@ -23,7 +23,7 @@ import "../chunk-K43PI6DQ.js";
23
23
  import "../chunk-YNQ6DFSV.js";
24
24
  import "../chunk-O75CRYGF.js";
25
25
  import "../chunk-3ONXXHQO.js";
26
- import "../chunk-P7W4CDX6.js";
26
+ import "../chunk-DTTVX6EO.js";
27
27
  import "../chunk-M7XQSUBB.js";
28
28
  import "../chunk-L2B3EE7B.js";
29
29
  import "../chunk-5UZXUTVO.js";
@@ -39,7 +39,7 @@ import "../chunk-AWJ2FHCF.js";
39
39
  import "../chunk-42JKGUFJ.js";
40
40
  import "../chunk-RULE4VG5.js";
41
41
  import "../chunk-SCU65EZI.js";
42
- import "../chunk-MB5RSUW6.js";
42
+ import "../chunk-SXN3LCUT.js";
43
43
  import "../chunk-6KYMPV2O.js";
44
44
  import "../chunk-DM2T26WE.js";
45
45
  import "../chunk-LDXUBPMO.js";
@@ -2,9 +2,9 @@ import {
2
2
  NamespaceStorageRouter,
3
3
  resolveDefaultNamespaceRoot,
4
4
  resolveNamespaceStorageRoot
5
- } from "../chunk-PNFN7SIN.js";
5
+ } from "../chunk-OX272PBW.js";
6
6
  import "../chunk-EGGE52UU.js";
7
- import "../chunk-P7W4CDX6.js";
7
+ import "../chunk-DTTVX6EO.js";
8
8
  import "../chunk-M7XQSUBB.js";
9
9
  import "../chunk-L2B3EE7B.js";
10
10
  import "../chunk-5UZXUTVO.js";
@@ -20,7 +20,7 @@ import "../chunk-AWJ2FHCF.js";
20
20
  import "../chunk-42JKGUFJ.js";
21
21
  import "../chunk-RULE4VG5.js";
22
22
  import "../chunk-SCU65EZI.js";
23
- import "../chunk-MB5RSUW6.js";
23
+ import "../chunk-SXN3LCUT.js";
24
24
  import "../chunk-6KYMPV2O.js";
25
25
  import "../chunk-DM2T26WE.js";
26
26
  import "../chunk-LDXUBPMO.js";
@@ -13,10 +13,10 @@ import {
13
13
  summarizeProvenanceCoverage,
14
14
  summarizeTierDistribution,
15
15
  summarizeTombstoneStatus
16
- } from "./chunk-ESDBHQY6.js";
17
- import "./chunk-2PGB63VU.js";
18
- import "./chunk-QPFO54VC.js";
19
- import "./chunk-PNFN7SIN.js";
16
+ } from "./chunk-N3QDLE2N.js";
17
+ import "./chunk-NFWTMM2M.js";
18
+ import "./chunk-KXG7HHIQ.js";
19
+ import "./chunk-OX272PBW.js";
20
20
  import "./chunk-KFY3SGN7.js";
21
21
  import "./chunk-CMTINOFS.js";
22
22
  import "./chunk-BVKCV2ZY.js";
@@ -42,7 +42,7 @@ import "./chunk-5CEJH5ZN.js";
42
42
  import "./chunk-AER6MT24.js";
43
43
  import "./chunk-CINZGPSJ.js";
44
44
  import "./chunk-EGGE52UU.js";
45
- import "./chunk-HDYFNXVO.js";
45
+ import "./chunk-IVFIYAIP.js";
46
46
  import "./chunk-DCWIQFNA.js";
47
47
  import "./chunk-XBZQRZ6G.js";
48
48
  import "./chunk-KCQA46NR.js";
@@ -54,7 +54,7 @@ import "./chunk-3ONXXHQO.js";
54
54
  import "./chunk-EHQ5HO5T.js";
55
55
  import "./chunk-2LSZVONP.js";
56
56
  import "./chunk-DEUNUKTD.js";
57
- import "./chunk-P7W4CDX6.js";
57
+ import "./chunk-DTTVX6EO.js";
58
58
  import "./chunk-M7XQSUBB.js";
59
59
  import "./chunk-L2B3EE7B.js";
60
60
  import "./chunk-5UZXUTVO.js";
@@ -70,7 +70,7 @@ import "./chunk-AWJ2FHCF.js";
70
70
  import "./chunk-42JKGUFJ.js";
71
71
  import "./chunk-RULE4VG5.js";
72
72
  import "./chunk-SCU65EZI.js";
73
- import "./chunk-MB5RSUW6.js";
73
+ import "./chunk-SXN3LCUT.js";
74
74
  import "./chunk-6KYMPV2O.js";
75
75
  import "./chunk-DM2T26WE.js";
76
76
  import "./chunk-LDXUBPMO.js";
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  MaintenanceScheduler
3
- } from "../chunk-QWIE43BS.js";
3
+ } from "../chunk-YDYC6PIS.js";
4
4
  import "../chunk-666A3MOW.js";
5
- import "../chunk-2PGB63VU.js";
6
- import "../chunk-PNFN7SIN.js";
5
+ import "../chunk-NFWTMM2M.js";
6
+ import "../chunk-OX272PBW.js";
7
7
  import "../chunk-BAVVI5GP.js";
8
8
  import "../chunk-EGGE52UU.js";
9
9
  import "../chunk-O75CRYGF.js";
10
- import "../chunk-P7W4CDX6.js";
10
+ import "../chunk-DTTVX6EO.js";
11
11
  import "../chunk-M7XQSUBB.js";
12
12
  import "../chunk-L2B3EE7B.js";
13
13
  import "../chunk-5UZXUTVO.js";
@@ -23,7 +23,7 @@ import "../chunk-AWJ2FHCF.js";
23
23
  import "../chunk-42JKGUFJ.js";
24
24
  import "../chunk-RULE4VG5.js";
25
25
  import "../chunk-SCU65EZI.js";
26
- import "../chunk-MB5RSUW6.js";
26
+ import "../chunk-SXN3LCUT.js";
27
27
  import "../chunk-6KYMPV2O.js";
28
28
  import "../chunk-DM2T26WE.js";
29
29
  import "../chunk-LDXUBPMO.js";
@@ -1596,6 +1596,107 @@ declare class GraphRecallCoordinator {
1596
1596
  private graphSeedPathsWithinDeadline;
1597
1597
  }
1598
1598
 
1599
+ /**
1600
+ * Recall-introspection coordinator — extracted from the orchestrator
1601
+ * (issue #1526, seam 21).
1602
+ *
1603
+ * Owns the recall observability surfaces:
1604
+ * - last-intent / last-graph-recall / last-QMD-recall snapshot
1605
+ * recording, reading, and explain rendering
1606
+ * - console faithfulness distribution
1607
+ * - background direct-answer tier annotation (observation mode, #518)
1608
+ *
1609
+ * Behavior-preserving move from orchestrator.ts. The orchestrator keeps
1610
+ * thin delegating methods; all member access flows back through
1611
+ * RecallIntrospectionDeps live accessors/arrows (late-binding rule,
1612
+ * seams 18–20).
1613
+ */
1614
+
1615
+ interface RecallIntrospectionDeps {
1616
+ annotateDirectAnswerTier(prompt: string, sessionKey: string, namespaces: string[], expectedIdentity: {
1617
+ writeNonce?: string;
1618
+ traceId?: string;
1619
+ recordedAt?: string;
1620
+ } | undefined, caps: CapabilitySet, _parentAbortSignal?: AbortSignal): Promise<void>;
1621
+ readonly config: PluginConfig;
1622
+ directAnswerObservationChain: Promise<void>;
1623
+ effectiveCronRecallInstructionHeavyTokenCap(): number;
1624
+ readonly faithfulnessCounters: FaithfulnessGateCounters;
1625
+ getCodingContextForSession(sessionKey: string | undefined): CodingContext | null;
1626
+ getStorage(namespace?: string): Promise<StorageManager>;
1627
+ readonly graphRecallCoordinator: GraphRecallCoordinator;
1628
+ readonly lastRecall: LastRecallStore;
1629
+ trackRecallBackgroundWrite(promise: Promise<void>, label: string): void;
1630
+ resolveStateDirForNamespace(namespace: string): Promise<string>;
1631
+ readonly storageRouter: NamespaceStorageRouter;
1632
+ }
1633
+ declare class RecallIntrospectionCoordinator {
1634
+ private readonly deps;
1635
+ constructor(deps: RecallIntrospectionDeps);
1636
+ /**
1637
+ * Faithfulness gate verdict distribution (issue #1576). Consumed by the
1638
+ * console-state aggregator so `remnic doctor` can render how the gate is
1639
+ * performing. Returns a fresh object so callers cannot mutate the
1640
+ * internal counters. Returns `undefined` when the gate is off so the
1641
+ * console-state snapshot omits the faithfulness block entirely (cursor
1642
+ * review: an all-zero block would otherwise always be truthy and leak
1643
+ * into snapshots that document it as absent-when-off).
1644
+ */
1645
+ getConsoleFaithfulnessDistribution(): FaithfulnessGateCounters | undefined;
1646
+ getLastGraphRecallSnapshot(namespace?: string): Promise<GraphRecallSnapshot | null>;
1647
+ getLastIntentSnapshot(namespace?: string): Promise<IntentDebugSnapshot | null>;
1648
+ getLastQmdRecallSnapshot(namespace?: string): Promise<QmdRecallSnapshot | null>;
1649
+ explainLastGraphRecall(options?: {
1650
+ namespace?: string;
1651
+ maxExpanded?: number;
1652
+ }): Promise<string>;
1653
+ explainLastIntent(options?: {
1654
+ namespace?: string;
1655
+ }): Promise<string>;
1656
+ explainLastQmdRecall(options?: {
1657
+ namespace?: string;
1658
+ maxResults?: number;
1659
+ }): Promise<string>;
1660
+ /**
1661
+ * Await the in-flight observation-mode direct-answer annotation chain.
1662
+ * Resolves to true when settled, false on timeout.
1663
+ */
1664
+ waitForDirectAnswerObservationIdle(timeoutMs?: number): Promise<boolean>;
1665
+ enqueueDirectAnswerObservation(prompt: string, sessionKey: string, namespaceOverride: string | undefined, principalOverride: string | undefined, caps: CapabilitySet, namespacesEnabled: boolean): void;
1666
+ annotateDirectAnswerTier(prompt: string, sessionKey: string, namespaces: string[], expectedIdentity: {
1667
+ writeNonce?: string;
1668
+ traceId?: string;
1669
+ recordedAt?: string;
1670
+ } | undefined, caps: CapabilitySet, _parentAbortSignal?: AbortSignal): Promise<void>;
1671
+ recordLastGraphRecallSnapshot(options: {
1672
+ storage: StorageManager;
1673
+ prompt: string;
1674
+ recallMode: RecallPlanMode;
1675
+ recallNamespaces: string[];
1676
+ seedPaths: string[];
1677
+ expandedPaths: GraphRecallExpandedEntry[];
1678
+ status: "completed" | "skipped" | "aborted";
1679
+ reason?: string;
1680
+ shadowMode?: boolean;
1681
+ queryIntent: MemoryIntent;
1682
+ seedResults?: GraphRecallRankedResult[];
1683
+ finalResults?: GraphRecallRankedResult[];
1684
+ shadowComparison?: GraphRecallShadowComparison;
1685
+ }): Promise<void>;
1686
+ recordLastIntentSnapshot(options: {
1687
+ storage: StorageManager;
1688
+ snapshot: IntentDebugSnapshot;
1689
+ }): Promise<void>;
1690
+ recordLastQmdRecallSnapshot(options: {
1691
+ storage: StorageManager;
1692
+ snapshot: QmdRecallSnapshot;
1693
+ }): Promise<void>;
1694
+ recordLastIntentSnapshotForNamespace(options: {
1695
+ namespace: string;
1696
+ snapshot: IntentDebugSnapshot;
1697
+ }): Promise<void>;
1698
+ }
1699
+
1599
1700
  /**
1600
1701
  * Orchestrator module-level helpers — relocated from orchestrator.ts
1601
1702
  * (issue #1526, seam 25).
@@ -2469,20 +2570,6 @@ declare class Orchestrator {
2469
2570
  appendMemoryActionEvent(event: Omit<MemoryActionEvent, "timestamp"> & {
2470
2571
  timestamp?: string;
2471
2572
  }): Promise<boolean>;
2472
- getLastGraphRecallSnapshot(namespace?: string): Promise<GraphRecallSnapshot | null>;
2473
- getLastIntentSnapshot(namespace?: string): Promise<IntentDebugSnapshot | null>;
2474
- getLastQmdRecallSnapshot(namespace?: string): Promise<QmdRecallSnapshot | null>;
2475
- explainLastGraphRecall(options?: {
2476
- namespace?: string;
2477
- maxExpanded?: number;
2478
- }): Promise<string>;
2479
- explainLastIntent(options?: {
2480
- namespace?: string;
2481
- }): Promise<string>;
2482
- explainLastQmdRecall(options?: {
2483
- namespace?: string;
2484
- maxResults?: number;
2485
- }): Promise<string>;
2486
2573
  private searchConversationRecallResults;
2487
2574
  private formatConversationRecallSection;
2488
2575
  getConversationIndexHealth(): Promise<{
@@ -2619,7 +2706,7 @@ declare class Orchestrator {
2619
2706
  * Lazy + accessor-wired (late-binding rule, seams 18–20).
2620
2707
  */
2621
2708
  private _recallIntrospectionCoordinator;
2622
- private get recallIntrospectionCoordinator();
2709
+ get recallIntrospection(): RecallIntrospectionCoordinator;
2623
2710
  /**
2624
2711
  * Orchestrator-init coordinator (issue #1526 seam 22). Owns
2625
2712
  * initialize/deferredInitialize/startupSearchSync. Lazy + accessor-wired
@@ -8,7 +8,7 @@ import './summarizer.js';
8
8
  import './local-llm.js';
9
9
  import './fallback-llm.js';
10
10
  import './orchestration/maintenance.js';
11
- export { Q as BulkImportBatchIngestResult, T as BulkImportBatchPartialFailureError, U as COMPACTION_SIGNAL_MAX_AGE_MS, V as DaySummaryGatherOptions, X as ExtractionRunResult, Y as GraphRecallRankedResult, Z as GraphRecallShadowComparison, G as GraphRecallSnapshot, I as IntentDebugSnapshot, O as Orchestrator, _ as QmdRecallSnapshot, $ as QueryAwarePrefilter, a0 as RecallInvocationOptions, a1 as RecallModeDecision, a2 as appendMemoryToGraphContext, a3 as applyQueryAwareCandidateFilter, a4 as blendGraphExpandedRecallScore, a5 as buildCompressionGuidelinesMarkdown, a6 as buildMemoryPathById, a7 as computeArtifactCandidateFetchLimit, a8 as computeArtifactRecallLimit, a9 as computeQmdHybridFetchLimit, t as defaultWorkspaceDir, aa as deriveTopicsFromExtraction, ab as filterHourlySummaryMarkdownForLocalDay, ac as filterRecallCandidates, ad as formatDateInTimeZone, ae as graphPathRelativeToStorage, af as hasIdentityRecoveryIntent, ag as isArtifactMemoryPath, ah as lifecycleRecallScoreAdjustment, ai as mapRecallSourceToXrayServedBy, aj as mergeArtifactRecallCandidates, ak as mergeGraphExpandedResults, al as normalizeIanaTimeZone, am as parseFiniteDate, an as parseGraphRecallRankedResults, ao as parseMemoryIntentSnapshot, ap as parseQmdRecallResults, aq as qmdStartupCollectionCheckWithTimeout, ar as raceRecallAbort, as as resolveEffectiveIdentityInjectionMode, at as resolveEffectiveRecallMode, au as resolvePersistedMemoryRelativePath, av as resolveRecallModeDecision, aw as resolveRecallModeDecisionAsync, ax as resolveRecentThreadMemoryPaths, E as sanitizeSessionKeyForFilename, ay as shouldFilterLifecycleRecallCandidate, az as splitTurnsBySourceValidAt, aA as summarizeGraphShadowComparison, aB as targetSourceValidAtSortMs, aC as throwIfRecallAborted, aD as tokenizeRecallQuery, aE as utcDateKeysForLocalDay } from './orchestrator-C04Q4Zao.js';
11
+ export { Q as BulkImportBatchIngestResult, T as BulkImportBatchPartialFailureError, U as COMPACTION_SIGNAL_MAX_AGE_MS, V as DaySummaryGatherOptions, X as ExtractionRunResult, Y as GraphRecallRankedResult, Z as GraphRecallShadowComparison, G as GraphRecallSnapshot, I as IntentDebugSnapshot, O as Orchestrator, _ as QmdRecallSnapshot, $ as QueryAwarePrefilter, a0 as RecallInvocationOptions, a1 as RecallModeDecision, a2 as appendMemoryToGraphContext, a3 as applyQueryAwareCandidateFilter, a4 as blendGraphExpandedRecallScore, a5 as buildCompressionGuidelinesMarkdown, a6 as buildMemoryPathById, a7 as computeArtifactCandidateFetchLimit, a8 as computeArtifactRecallLimit, a9 as computeQmdHybridFetchLimit, t as defaultWorkspaceDir, aa as deriveTopicsFromExtraction, ab as filterHourlySummaryMarkdownForLocalDay, ac as filterRecallCandidates, ad as formatDateInTimeZone, ae as graphPathRelativeToStorage, af as hasIdentityRecoveryIntent, ag as isArtifactMemoryPath, ah as lifecycleRecallScoreAdjustment, ai as mapRecallSourceToXrayServedBy, aj as mergeArtifactRecallCandidates, ak as mergeGraphExpandedResults, al as normalizeIanaTimeZone, am as parseFiniteDate, an as parseGraphRecallRankedResults, ao as parseMemoryIntentSnapshot, ap as parseQmdRecallResults, aq as qmdStartupCollectionCheckWithTimeout, ar as raceRecallAbort, as as resolveEffectiveIdentityInjectionMode, at as resolveEffectiveRecallMode, au as resolvePersistedMemoryRelativePath, av as resolveRecallModeDecision, aw as resolveRecallModeDecisionAsync, ax as resolveRecentThreadMemoryPaths, E as sanitizeSessionKeyForFilename, ay as shouldFilterLifecycleRecallCandidate, az as splitTurnsBySourceValidAt, aA as summarizeGraphShadowComparison, aB as targetSourceValidAtSortMs, aC as throwIfRecallAborted, aD as tokenizeRecallQuery, aE as utcDateKeysForLocalDay } from './orchestrator-Y9wyG4jK.js';
12
12
  export { formatCompressionGuidelinesForRecall } from './orchestration/compression-guideline-coordinator.js';
13
13
  import './live-connectors-runner.js';
14
14
  import './model-registry.js';
@@ -43,12 +43,12 @@ import {
43
43
  throwIfRecallAborted,
44
44
  tokenizeRecallQuery,
45
45
  utcDateKeysForLocalDay
46
- } from "./chunk-EDC7RZCW.js";
46
+ } from "./chunk-RIOJRLJ6.js";
47
47
  import "./chunk-IBAU2RZN.js";
48
48
  import {
49
49
  formatCompressionGuidelinesForRecall
50
50
  } from "./chunk-5QANTTY2.js";
51
- import "./chunk-QWIE43BS.js";
51
+ import "./chunk-YDYC6PIS.js";
52
52
  import "./chunk-I74SUMNI.js";
53
53
  import "./chunk-ILNPU5W5.js";
54
54
  import "./chunk-7HYPN2GC.js";
@@ -66,7 +66,7 @@ import "./chunk-O7GOFAM3.js";
66
66
  import "./chunk-KBL3JJR6.js";
67
67
  import "./chunk-ABP6QMVM.js";
68
68
  import "./chunk-HW5EF6LV.js";
69
- import "./chunk-HMUEAKSD.js";
69
+ import "./chunk-QPTP6SKC.js";
70
70
  import "./chunk-JRZV3767.js";
71
71
  import "./chunk-4DLFJJOQ.js";
72
72
  import "./chunk-V5OCT34X.js";
@@ -119,13 +119,13 @@ import "./chunk-3NN73CM7.js";
119
119
  import "./chunk-Q6IP2ARR.js";
120
120
  import "./chunk-6HEM6HTQ.js";
121
121
  import "./chunk-OSMBC3JU.js";
122
- import "./chunk-ZTBH2OHD.js";
122
+ import "./chunk-AS2NRB45.js";
123
123
  import "./chunk-FIOYURII.js";
124
124
  import "./chunk-LUPVCGYK.js";
125
125
  import "./chunk-PYPOFEMK.js";
126
126
  import "./chunk-LOPZ2DWR.js";
127
127
  import "./chunk-VEWZZM3H.js";
128
- import "./chunk-DB647OZ4.js";
128
+ import "./chunk-2V6CTSSA.js";
129
129
  import "./chunk-MC4FJXPA.js";
130
130
  import "./chunk-LQHDIS7L.js";
131
131
  import "./chunk-7F7Z6MOS.js";
@@ -149,18 +149,18 @@ import "./chunk-EEC4PCG5.js";
149
149
  import "./chunk-WMWVO45V.js";
150
150
  import "./chunk-D6RIFG4O.js";
151
151
  import "./chunk-JCK7V6SN.js";
152
- import "./chunk-TEKTCF2V.js";
153
- import "./chunk-IIURIWJG.js";
152
+ import "./chunk-NDXJJKT2.js";
153
+ import "./chunk-SFNQDXXL.js";
154
154
  import "./chunk-KJTKLXTH.js";
155
155
  import "./chunk-CKITWVWJ.js";
156
156
  import "./chunk-OUELRE5E.js";
157
157
  import "./chunk-GQL52GQ5.js";
158
158
  import "./chunk-2F6NP3NT.js";
159
159
  import "./chunk-TERNBNJB.js";
160
- import "./chunk-4HYJETVO.js";
160
+ import "./chunk-N4ZA2I7M.js";
161
161
  import "./chunk-QRDOSYOR.js";
162
- import "./chunk-KZWUJC7Y.js";
163
- import "./chunk-ES3GAMSQ.js";
162
+ import "./chunk-X7HTU4HO.js";
163
+ import "./chunk-VKHZFF5P.js";
164
164
  import "./chunk-TGQ2NTWH.js";
165
165
  import "./chunk-4XL3CVII.js";
166
166
  import "./chunk-ZRWB5D4H.js";
@@ -168,10 +168,10 @@ import "./chunk-GY3SKOS4.js";
168
168
  import "./chunk-SFQ6QNL7.js";
169
169
  import "./chunk-DANV2HTH.js";
170
170
  import "./chunk-33JBK2XP.js";
171
- import "./chunk-ESDBHQY6.js";
172
- import "./chunk-2PGB63VU.js";
173
- import "./chunk-QPFO54VC.js";
174
- import "./chunk-PNFN7SIN.js";
171
+ import "./chunk-N3QDLE2N.js";
172
+ import "./chunk-NFWTMM2M.js";
173
+ import "./chunk-KXG7HHIQ.js";
174
+ import "./chunk-OX272PBW.js";
175
175
  import "./chunk-KFY3SGN7.js";
176
176
  import "./chunk-3T74IZB3.js";
177
177
  import "./chunk-CMTINOFS.js";
@@ -193,8 +193,8 @@ import "./chunk-LMDRGRJ2.js";
193
193
  import "./chunk-OD4FM2U7.js";
194
194
  import "./chunk-3I4FUAVJ.js";
195
195
  import "./chunk-OKTXM5H4.js";
196
- import "./chunk-HDFS6RWQ.js";
197
- import "./chunk-OQ6F3WBX.js";
196
+ import "./chunk-CVINPTKG.js";
197
+ import "./chunk-2RLECZ6J.js";
198
198
  import "./chunk-UUH4YQOF.js";
199
199
  import "./chunk-JLNBQWZ2.js";
200
200
  import "./chunk-3UXOZBHV.js";
@@ -216,7 +216,7 @@ import "./chunk-KD3QD3A5.js";
216
216
  import "./chunk-VGUOEDTU.js";
217
217
  import "./chunk-H3FZVNRN.js";
218
218
  import "./chunk-OADWQ5CR.js";
219
- import "./chunk-2KYXXMTE.js";
219
+ import "./chunk-422OELQ3.js";
220
220
  import "./chunk-7WV3F5DQ.js";
221
221
  import "./chunk-SEDEKFYQ.js";
222
222
  import "./chunk-JBPKEARU.js";
@@ -225,10 +225,10 @@ import "./chunk-J64TK33U.js";
225
225
  import "./chunk-RSUYKGGZ.js";
226
226
  import "./chunk-42NQ7AVG.js";
227
227
  import "./chunk-7RXCMVFQ.js";
228
- import "./chunk-WAIMHMO3.js";
228
+ import "./chunk-P6ZZ4GX4.js";
229
229
  import "./chunk-D24OXEPB.js";
230
- import "./chunk-JU6BKZHX.js";
231
- import "./chunk-TIWRP5NW.js";
230
+ import "./chunk-CGLRKKMF.js";
231
+ import "./chunk-RJCQPRLB.js";
232
232
  import "./chunk-ZQNCHPTZ.js";
233
233
  import "./chunk-YF6FMLBT.js";
234
234
  import "./chunk-EEKDRAWX.js";
@@ -236,8 +236,8 @@ import "./chunk-DJECGBBM.js";
236
236
  import "./chunk-35NN3ZFA.js";
237
237
  import "./chunk-T4WDJPEZ.js";
238
238
  import "./chunk-2MR3MFQB.js";
239
- import "./chunk-DPZ5GJMD.js";
240
- import "./chunk-LAJIXABF.js";
239
+ import "./chunk-5JF4DIKZ.js";
240
+ import "./chunk-UQEE4H6Z.js";
241
241
  import "./chunk-GDASG7NC.js";
242
242
  import "./chunk-GDB4J2H3.js";
243
243
  import "./chunk-M5QKGHCR.js";
@@ -265,7 +265,7 @@ import "./chunk-5CEJH5ZN.js";
265
265
  import "./chunk-AER6MT24.js";
266
266
  import "./chunk-CINZGPSJ.js";
267
267
  import "./chunk-EGGE52UU.js";
268
- import "./chunk-HDYFNXVO.js";
268
+ import "./chunk-IVFIYAIP.js";
269
269
  import "./chunk-DCWIQFNA.js";
270
270
  import "./chunk-XBZQRZ6G.js";
271
271
  import "./chunk-KCQA46NR.js";
@@ -288,8 +288,8 @@ import "./chunk-EHQ5HO5T.js";
288
288
  import "./chunk-2LSZVONP.js";
289
289
  import "./chunk-DEUNUKTD.js";
290
290
  import "./chunk-SQNED75R.js";
291
- import "./chunk-VHYFY3JI.js";
292
- import "./chunk-P7W4CDX6.js";
291
+ import "./chunk-R3K4CXPR.js";
292
+ import "./chunk-DTTVX6EO.js";
293
293
  import "./chunk-M7XQSUBB.js";
294
294
  import "./chunk-L2B3EE7B.js";
295
295
  import "./chunk-5UZXUTVO.js";
@@ -305,7 +305,7 @@ import "./chunk-AWJ2FHCF.js";
305
305
  import "./chunk-42JKGUFJ.js";
306
306
  import "./chunk-RULE4VG5.js";
307
307
  import "./chunk-SCU65EZI.js";
308
- import "./chunk-MB5RSUW6.js";
308
+ import "./chunk-SXN3LCUT.js";
309
309
  import "./chunk-6KYMPV2O.js";
310
310
  import "./chunk-DM2T26WE.js";
311
311
  import "./chunk-LDXUBPMO.js";
@@ -1,3 +1,7 @@
1
+ import {
2
+ markProjectedMemoryPathInvalid
3
+ } from "./chunk-SXN3LCUT.js";
4
+ import "./chunk-6KYMPV2O.js";
1
5
  import "./chunk-PZ5AY32C.js";
2
6
 
3
7
  // src/maintenance/purge.ts
@@ -125,11 +129,13 @@ async function purgeMemories(options) {
125
129
  await unlink(candidate.path);
126
130
  actuallyPurged.push(candidate);
127
131
  addCollectionForCandidate(candidate);
132
+ markProjectedMemoryPathInvalid(storage.dir, candidate.id);
128
133
  } catch (err) {
129
134
  const message = err instanceof Error ? err.message : String(err);
130
135
  if (hasErrorCode(err, "ENOENT")) {
131
136
  alreadyAbsent.push(candidate);
132
137
  addCollectionForCandidate(candidate);
138
+ markProjectedMemoryPathInvalid(storage.dir, candidate.id);
133
139
  } else {
134
140
  errors.push({ id: candidate.id, path: candidate.path, error: message });
135
141
  }
@@ -202,4 +208,4 @@ async function purgeMemories(options) {
202
208
  export {
203
209
  purgeMemories
204
210
  };
205
- //# sourceMappingURL=purge-6ATBGT77.js.map
211
+ //# sourceMappingURL=purge-IHRX4Z7X.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/maintenance/purge.ts"],"sourcesContent":["/**\n * Operator-facing bulk hard-delete (issue #686 retention-completion).\n *\n * `purgeMemories(opts)` hard-deletes memories that are:\n * - older than `olderThanMs` (measured against `updated ?? created`), AND\n * - in the specified tier (`\"cold\"` or `\"all\"`), AND\n * - optionally in `status: \"forgotten\"` only (when `forgottenOnly` is true)\n *\n * Hard-delete means:\n * 1. Remove the file from disk.\n * 2. Trigger a QMD collection update so the index no longer contains it.\n * 3. Append a purge audit entry to the observation ledger.\n *\n * `dryRun: true` (the default) reports what *would* be deleted without\n * actually removing anything — callers must opt into mutations by\n * setting `dryRun: false`.\n *\n * The CLI surface enforces an explicit `--confirm yes` guard and\n * defaults to `--dry-run` to make accidental data loss impossible.\n */\n\nimport path from \"node:path\";\nimport { appendFile, mkdir, unlink } from \"node:fs/promises\";\nimport type { StorageManager } from \"../storage.js\";\nimport type { MemoryFile } from \"../types.js\";\nimport { markProjectedMemoryPathInvalid } from \"../memory-projection-store.js\";\nimport type { SearchBackend } from \"../search/port.js\";\n\nexport type PurgeTierFilter = \"cold\" | \"all\";\n\nexport interface PurgeMemoriesOptions {\n storage: StorageManager;\n /**\n * Only memories whose `updated ?? created` timestamp is older than this\n * value (in milliseconds, Unix epoch) will be candidates.\n */\n olderThanMs: number;\n /**\n * `\"cold\"` — only memories in the cold tier (files under `.../cold/`).\n * `\"all\"` — memories in any tier (hot, cold, or archived).\n * Default: `\"cold\"`.\n */\n tier?: PurgeTierFilter;\n /**\n * When `true`, only memories with `status === \"forgotten\"` are candidates.\n * Default: `false` (purge by age + tier regardless of status).\n */\n forgottenOnly?: boolean;\n /** When `true` (default), report candidates but do not delete. */\n dryRun?: boolean;\n /**\n * Optional QMD backend. When supplied and `dryRun === false`, a\n * `updateCollection` call is issued after each deletion so the index stays\n * consistent. Pass `undefined` or omit to skip index maintenance (e.g. in\n * tests that don't have a live QMD instance).\n */\n qmd?: SearchBackend;\n /** Hot-tier QMD collection name (default: `\"openclaw-engram\"`). */\n hotCollection?: string;\n /** Cold-tier QMD collection name (default: `\"openclaw-engram-cold\"`). */\n coldCollection?: string;\n /** Optional hook for long-lived hosts to clear their live dedupe mirror after purge hash cleanup. */\n afterFactHashRemoval?: () => void | Promise<void>;\n /** Optional shutdown signal forwarded to QMD collection refreshes. */\n signal?: AbortSignal;\n /** Override clock for tests. */\n now?: () => Date;\n}\n\nexport interface PurgeCandidate {\n id: string;\n path: string;\n tier: \"hot\" | \"cold\" | \"archive\";\n status: string;\n updatedOrCreated: string;\n ageMs: number;\n}\n\nexport interface PurgeMemoriesResult {\n dryRun: boolean;\n tier: PurgeTierFilter;\n olderThanMs: number;\n candidates: PurgeCandidate[];\n purgedCount: number;\n alreadyAbsentCount: number;\n errorCount: number;\n errors: Array<{ id: string; path: string; error: string }>;\n}\n\nfunction hasErrorCode(err: unknown, code: string): boolean {\n return typeof err === \"object\" && err !== null && \"code\" in err && (err as { code?: unknown }).code === code;\n}\n\nfunction resolveTimestamp(memory: MemoryFile): string {\n const fm = memory.frontmatter as unknown as Record<string, unknown>;\n const updated = typeof fm.updated === \"string\" ? (fm.updated as string) : \"\";\n const created = typeof fm.created === \"string\" ? (fm.created as string) : \"\";\n return updated.length > 0 ? updated : created;\n}\n\nasync function logPurgeAudit(\n storage: StorageManager,\n candidates: PurgeCandidate[],\n now: Date,\n event: \"PURGE_DELETE_INTENT\" | \"PURGE_HARD_DELETE\" | \"PURGE_ALREADY_ABSENT\" = \"PURGE_HARD_DELETE\",\n): Promise<void> {\n if (candidates.length === 0) return;\n const ledgerDir = path.join(storage.dir, \"state\", \"observation-ledger\");\n await mkdir(ledgerDir, { recursive: true });\n const ledgerPath = path.join(ledgerDir, \"purge-audit.jsonl\");\n const entries = candidates.map((c) =>\n JSON.stringify({\n event,\n timestamp: now.toISOString(),\n memoryId: c.id,\n path: c.path,\n tier: c.tier,\n status: c.status,\n updatedOrCreated: c.updatedOrCreated,\n }),\n );\n if (entries.length > 0) {\n await appendFile(ledgerPath, `${entries.join(\"\\n\")}\\n`, \"utf-8\");\n }\n}\n\nexport async function purgeMemories(\n options: PurgeMemoriesOptions,\n): Promise<PurgeMemoriesResult> {\n const {\n storage,\n olderThanMs,\n tier = \"cold\",\n forgottenOnly = false,\n dryRun = true,\n qmd,\n hotCollection = \"openclaw-engram\",\n coldCollection = \"openclaw-engram-cold\",\n } = options;\n\n if (!Number.isFinite(olderThanMs) || olderThanMs <= 0) {\n throw new Error(\"olderThanMs must be a finite positive number\");\n }\n\n const now = (options.now ?? (() => new Date()))();\n const nowMs = now.getTime();\n\n // Collect all memories from applicable tiers\n const [hotMemories, coldMemories, archivedMemories] = await Promise.all([\n tier === \"all\" ? storage.readAllMemories() : Promise.resolve([]),\n storage.readAllColdMemories(),\n tier === \"all\" ? storage.readArchivedMemories() : Promise.resolve([]),\n ]);\n\n const poolEntries: Array<{ memory: MemoryFile; resolvedTier: \"hot\" | \"cold\" | \"archive\" }> = [];\n\n if (tier === \"all\") {\n for (const m of hotMemories) {\n poolEntries.push({ memory: m, resolvedTier: \"hot\" });\n }\n for (const m of archivedMemories) {\n poolEntries.push({ memory: m, resolvedTier: \"archive\" });\n }\n }\n for (const m of coldMemories) {\n poolEntries.push({ memory: m, resolvedTier: \"cold\" });\n }\n\n // Build candidate list\n const candidates: PurgeCandidate[] = [];\n const candidateMemoriesById = new Map<string, MemoryFile>();\n for (const { memory, resolvedTier } of poolEntries) {\n const ts = resolveTimestamp(memory);\n if (ts.length === 0) continue;\n\n const tsMs = Date.parse(ts);\n if (!Number.isFinite(tsMs)) continue;\n\n const ageMs = nowMs - tsMs;\n if (ageMs < olderThanMs) continue;\n\n const fm = memory.frontmatter as unknown as Record<string, unknown>;\n const status: string =\n typeof fm.status === \"string\" ? (fm.status as string) : \"active\";\n\n if (forgottenOnly && status !== \"forgotten\") continue;\n\n candidates.push({\n id: memory.frontmatter.id,\n path: memory.path,\n tier: resolvedTier,\n status,\n updatedOrCreated: ts,\n ageMs,\n });\n candidateMemoriesById.set(memory.frontmatter.id, memory);\n }\n\n if (dryRun) {\n return {\n dryRun: true,\n tier,\n olderThanMs,\n candidates,\n purgedCount: 0,\n alreadyAbsentCount: 0,\n errorCount: 0,\n errors: [],\n };\n }\n\n // Hard-delete phase\n const errors: Array<{ id: string; path: string; error: string }> = [];\n try {\n await logPurgeAudit(storage, candidates, now, \"PURGE_DELETE_INTENT\");\n } catch (auditErr) {\n errors.push({\n id: \"(purge-audit)\",\n path: path.join(storage.dir, \"state\", \"observation-ledger\", \"purge-audit.jsonl\"),\n error: auditErr instanceof Error ? auditErr.message : String(auditErr),\n });\n }\n\n const actuallyPurged: PurgeCandidate[] = [];\n const alreadyAbsent: PurgeCandidate[] = [];\n const collectionsToUpdate = new Set<string>();\n const addCollectionForCandidate = (candidate: PurgeCandidate) => {\n if (candidate.tier === \"cold\") {\n collectionsToUpdate.add(coldCollection);\n } else if (candidate.tier === \"hot\") {\n collectionsToUpdate.add(hotCollection);\n }\n };\n\n for (const candidate of candidates) {\n try {\n await unlink(candidate.path);\n actuallyPurged.push(candidate);\n addCollectionForCandidate(candidate);\n markProjectedMemoryPathInvalid(storage.dir, candidate.id);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n // ENOENT is fine — already gone\n if (hasErrorCode(err, \"ENOENT\")) {\n alreadyAbsent.push(candidate);\n addCollectionForCandidate(candidate);\n markProjectedMemoryPathInvalid(storage.dir, candidate.id);\n } else {\n errors.push({ id: candidate.id, path: candidate.path, error: message });\n }\n }\n }\n\n const recordPostDeleteAudit = async (\n purgedCandidates: PurgeCandidate[],\n event: \"PURGE_HARD_DELETE\" | \"PURGE_ALREADY_ABSENT\",\n ) => {\n try {\n await logPurgeAudit(storage, purgedCandidates, now, event);\n } catch (auditErr) {\n errors.push({\n id: \"(purge-audit)\",\n path: path.join(storage.dir, \"state\", \"observation-ledger\", \"purge-audit.jsonl\"),\n error: auditErr instanceof Error ? auditErr.message : String(auditErr),\n });\n }\n };\n await recordPostDeleteAudit(actuallyPurged, \"PURGE_HARD_DELETE\");\n await recordPostDeleteAudit(alreadyAbsent, \"PURGE_ALREADY_ABSENT\");\n\n const resolvedPurges = [...actuallyPurged, ...alreadyAbsent];\n\n const invalidateTierCaches = (\n storage as unknown as {\n invalidateMemoryCachesForTiers?: (tiers: Iterable<\"hot\" | \"cold\" | \"archive\">) => void;\n }\n ).invalidateMemoryCachesForTiers;\n if (typeof invalidateTierCaches === \"function\") {\n invalidateTierCaches.call(storage, new Set(resolvedPurges.map((candidate) => candidate.tier)));\n } else if (typeof (storage as unknown as { invalidateAllMemoriesCacheForDir?: () => void }).invalidateAllMemoriesCacheForDir === \"function\") {\n (storage as unknown as { invalidateAllMemoriesCacheForDir: () => void }).invalidateAllMemoriesCacheForDir();\n }\n\n // Update QMD index for affected collections\n if (qmd) {\n for (const collection of collectionsToUpdate) {\n try {\n if (typeof qmd.updateCollectionStrict === \"function\") {\n await qmd.updateCollectionStrict(collection, { signal: options.signal });\n } else {\n await qmd.updateCollection(collection, { signal: options.signal });\n }\n } catch (indexErr) {\n // Non-fatal — operator can re-index manually\n errors.push({\n id: \"(qmd-update)\",\n path: collection,\n error: indexErr instanceof Error ? indexErr.message : String(indexErr),\n });\n }\n }\n }\n\n const purgedFactMemories = resolvedPurges\n .map((candidate) => candidateMemoriesById.get(candidate.id))\n .filter((memory): memory is MemoryFile => memory?.frontmatter.category === \"fact\");\n if (purgedFactMemories.length > 0) {\n const removeFactHashes = (\n storage as unknown as {\n removeFactContentHashesForMemories?: (memories: MemoryFile[]) => Promise<void>;\n }\n ).removeFactContentHashesForMemories;\n if (typeof removeFactHashes === \"function\") {\n try {\n await removeFactHashes.call(storage, purgedFactMemories);\n await options.afterFactHashRemoval?.();\n } catch (hashErr) {\n errors.push({\n id: \"(fact-hash-index)\",\n path: path.join(storage.dir, \"state\", \"fact-hashes.txt\"),\n error: hashErr instanceof Error ? hashErr.message : String(hashErr),\n });\n }\n }\n }\n\n return {\n dryRun: false,\n tier,\n olderThanMs,\n candidates,\n purgedCount: actuallyPurged.length,\n alreadyAbsentCount: alreadyAbsent.length,\n errorCount: errors.length,\n errors,\n };\n}\n"],"mappings":"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","names":[]}
@@ -7,14 +7,14 @@ import {
7
7
  materializeAfterSemanticConsolidation,
8
8
  parseConsolidationResponse,
9
9
  parseOperatorAwareConsolidationResponse
10
- } from "./chunk-HDFS6RWQ.js";
11
- import "./chunk-OQ6F3WBX.js";
10
+ } from "./chunk-CVINPTKG.js";
11
+ import "./chunk-2RLECZ6J.js";
12
12
  import "./chunk-UUH4YQOF.js";
13
13
  import {
14
14
  resolveExtensionsRoot
15
15
  } from "./chunk-JLNBQWZ2.js";
16
16
  import "./chunk-3UXOZBHV.js";
17
- import "./chunk-P7W4CDX6.js";
17
+ import "./chunk-DTTVX6EO.js";
18
18
  import "./chunk-M7XQSUBB.js";
19
19
  import "./chunk-L2B3EE7B.js";
20
20
  import "./chunk-5UZXUTVO.js";
@@ -30,7 +30,7 @@ import "./chunk-AWJ2FHCF.js";
30
30
  import "./chunk-42JKGUFJ.js";
31
31
  import "./chunk-RULE4VG5.js";
32
32
  import "./chunk-SCU65EZI.js";
33
- import "./chunk-MB5RSUW6.js";
33
+ import "./chunk-SXN3LCUT.js";
34
34
  import "./chunk-6KYMPV2O.js";
35
35
  import "./chunk-DM2T26WE.js";
36
36
  import "./chunk-LDXUBPMO.js";
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  promoteSemanticRuleFromMemory,
3
3
  setSemanticRulePromotionTestHooks
4
- } from "./chunk-KZWUJC7Y.js";
5
- import "./chunk-P7W4CDX6.js";
4
+ } from "./chunk-X7HTU4HO.js";
5
+ import "./chunk-DTTVX6EO.js";
6
6
  import "./chunk-M7XQSUBB.js";
7
7
  import "./chunk-L2B3EE7B.js";
8
8
  import "./chunk-5UZXUTVO.js";
@@ -18,7 +18,7 @@ import "./chunk-AWJ2FHCF.js";
18
18
  import "./chunk-42JKGUFJ.js";
19
19
  import "./chunk-RULE4VG5.js";
20
20
  import "./chunk-SCU65EZI.js";
21
- import "./chunk-MB5RSUW6.js";
21
+ import "./chunk-SXN3LCUT.js";
22
22
  import "./chunk-6KYMPV2O.js";
23
23
  import "./chunk-DM2T26WE.js";
24
24
  import "./chunk-LDXUBPMO.js";
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  compareVerifiedSemanticRuleResults,
3
3
  searchVerifiedSemanticRules
4
- } from "./chunk-ES3GAMSQ.js";
5
- import "./chunk-P7W4CDX6.js";
4
+ } from "./chunk-VKHZFF5P.js";
5
+ import "./chunk-DTTVX6EO.js";
6
6
  import "./chunk-M7XQSUBB.js";
7
7
  import "./chunk-L2B3EE7B.js";
8
8
  import "./chunk-5UZXUTVO.js";
@@ -18,7 +18,7 @@ import "./chunk-AWJ2FHCF.js";
18
18
  import "./chunk-42JKGUFJ.js";
19
19
  import "./chunk-RULE4VG5.js";
20
20
  import "./chunk-SCU65EZI.js";
21
- import "./chunk-MB5RSUW6.js";
21
+ import "./chunk-SXN3LCUT.js";
22
22
  import "./chunk-6KYMPV2O.js";
23
23
  import "./chunk-DM2T26WE.js";
24
24
  import "./chunk-LDXUBPMO.js";
package/dist/storage.js CHANGED
@@ -16,7 +16,7 @@ import {
16
16
  parseFrontmatter,
17
17
  parseFrontmatterStringValue,
18
18
  serializeEntityFile
19
- } from "./chunk-P7W4CDX6.js";
19
+ } from "./chunk-DTTVX6EO.js";
20
20
  import "./chunk-M7XQSUBB.js";
21
21
  import "./chunk-L2B3EE7B.js";
22
22
  import "./chunk-5UZXUTVO.js";
@@ -34,7 +34,7 @@ import "./chunk-AWJ2FHCF.js";
34
34
  import "./chunk-42JKGUFJ.js";
35
35
  import "./chunk-RULE4VG5.js";
36
36
  import "./chunk-SCU65EZI.js";
37
- import "./chunk-MB5RSUW6.js";
37
+ import "./chunk-SXN3LCUT.js";
38
38
  import "./chunk-6KYMPV2O.js";
39
39
  import "./chunk-DM2T26WE.js";
40
40
  import "./chunk-LDXUBPMO.js";
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  compareVerifiedEpisodeResults,
3
3
  searchVerifiedEpisodes
4
- } from "./chunk-4HYJETVO.js";
4
+ } from "./chunk-N4ZA2I7M.js";
5
5
  import "./chunk-7FL4CNPV.js";
6
- import "./chunk-P7W4CDX6.js";
6
+ import "./chunk-DTTVX6EO.js";
7
7
  import "./chunk-M7XQSUBB.js";
8
8
  import "./chunk-L2B3EE7B.js";
9
9
  import "./chunk-5UZXUTVO.js";
@@ -19,7 +19,7 @@ import "./chunk-AWJ2FHCF.js";
19
19
  import "./chunk-42JKGUFJ.js";
20
20
  import "./chunk-RULE4VG5.js";
21
21
  import "./chunk-SCU65EZI.js";
22
- import "./chunk-MB5RSUW6.js";
22
+ import "./chunk-SXN3LCUT.js";
23
23
  import "./chunk-6KYMPV2O.js";
24
24
  import "./chunk-DM2T26WE.js";
25
25
  import "./chunk-LDXUBPMO.js";