@remnic/core 9.3.755 → 9.3.756

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 (181) hide show
  1. package/dist/access-admin-ops-surface.d.ts +1 -1
  2. package/dist/access-admin-ops-surface.js +34 -34
  3. package/dist/access-boundary.d.ts +1 -1
  4. package/dist/access-boundary.js +35 -35
  5. package/dist/access-cli.js +83 -83
  6. package/dist/access-http.d.ts +1 -1
  7. package/dist/access-http.js +44 -44
  8. package/dist/access-lcm-surface.d.ts +1 -1
  9. package/dist/access-lcm-surface.js +34 -34
  10. package/dist/access-mcp.d.ts +1 -1
  11. package/dist/access-mcp.js +41 -41
  12. package/dist/access-observe-write-surface.d.ts +225 -0
  13. package/dist/access-observe-write-surface.js +128 -0
  14. package/dist/access-operations-batch.js +38 -38
  15. package/dist/access-operations.d.ts +1 -1
  16. package/dist/access-operations.js +40 -40
  17. package/dist/access-recall-surface.d.ts +1 -1
  18. package/dist/access-recall-surface.js +34 -34
  19. package/dist/access-schema.d.ts +2 -2
  20. package/dist/access-schema.js +3 -3
  21. package/dist/{access-service-C3jkLi2U.d.ts → access-service-CJwcDoQp.d.ts} +4 -5
  22. package/dist/access-service.d.ts +1 -1
  23. package/dist/access-service.js +34 -34
  24. package/dist/access-surface-catalog.d.ts +1 -1
  25. package/dist/active-recall.js +1 -1
  26. package/dist/adapters/index.js +4 -4
  27. package/dist/adapters/registry.js +2 -2
  28. package/dist/{auto-sync-G4YKBPOU.js → auto-sync-RZO5ZPHR.js} +3 -3
  29. package/dist/briefing.js +7 -7
  30. package/dist/{capsule-crypto-CZJSLEFG.js → capsule-crypto-FFWJ4X4A.js} +2 -2
  31. package/dist/causal-behavior.js +2 -2
  32. package/dist/causal-chain.js +2 -2
  33. package/dist/causal-consolidation.js +15 -15
  34. package/dist/causal-retrieval.js +2 -2
  35. package/dist/causal-trajectory.js +1 -1
  36. package/dist/{chunk-M5QKGHCR.js → chunk-3I2IASNK.js} +2 -2
  37. package/dist/{chunk-OCFITZRV.js → chunk-4AC57RCM.js} +4 -4
  38. package/dist/{chunk-3DOD6ICJ.js → chunk-4I45UZ4V.js} +5 -5
  39. package/dist/{chunk-TAPSNIMA.js → chunk-5CEJH5ZN.js} +4 -4
  40. package/dist/{chunk-I6IAJCJS.js → chunk-5VWRYFQE.js} +7 -7
  41. package/dist/{chunk-4LQUYBZM.js → chunk-5ZKT7WTR.js} +7 -7
  42. package/dist/{chunk-VL5QHTJI.js → chunk-6DA5BBLS.js} +117 -117
  43. package/dist/{chunk-LFKEFIJA.js → chunk-6DXXIXED.js} +4 -4
  44. package/dist/{chunk-XBM5DG4O.js → chunk-7APVFQ34.js} +680 -595
  45. package/dist/chunk-7APVFQ34.js.map +1 -0
  46. package/dist/{chunk-NCNOYM6F.js → chunk-7CFGXWYX.js} +2 -2
  47. package/dist/{chunk-TJATYB3F.js → chunk-A6XCHI53.js} +5 -5
  48. package/dist/{chunk-UQJ6YTKR.js → chunk-BTH6MQJT.js} +7 -7
  49. package/dist/{chunk-G7LCG56O.js → chunk-CXW6Y7SI.js} +4 -4
  50. package/dist/{chunk-GCEV6SXP.js → chunk-DWDDQLSZ.js} +2298 -2218
  51. package/dist/chunk-DWDDQLSZ.js.map +1 -0
  52. package/dist/{chunk-DS4QM6I7.js → chunk-EEKDRAWX.js} +4 -4
  53. package/dist/{chunk-I3UWEZTK.js → chunk-EF3VFQC4.js} +2 -2
  54. package/dist/{chunk-437S3G37.js → chunk-EJJQDP3H.js} +1 -1
  55. package/dist/{chunk-FQLM6ZUP.js → chunk-EVVLGYHR.js} +3 -3
  56. package/dist/{chunk-GGYUR4M2.js → chunk-GBXP62CL.js} +10 -10
  57. package/dist/{chunk-N4AGSRVA.js → chunk-GG6G2RYR.js} +9 -9
  58. package/dist/{chunk-JITAVROY.js → chunk-H2T4OJNI.js} +4 -4
  59. package/dist/{chunk-2MR3MFQB.js → chunk-JTYM4HPA.js} +2 -2
  60. package/dist/{chunk-LD53WPMU.js → chunk-LQ6JI4VH.js} +4 -4
  61. package/dist/{chunk-GPFXPC2V.js → chunk-NG2NHB4C.js} +7 -7
  62. package/dist/{chunk-CIDGUFAL.js → chunk-NLXKSM46.js} +2 -2
  63. package/dist/{chunk-T6WHI3JW.js → chunk-OLAVQS6S.js} +6 -6
  64. package/dist/{chunk-ER3CCWK2.js → chunk-ORAK3LNZ.js} +2 -2
  65. package/dist/{chunk-PJ7DIEFC.js → chunk-PBZQVVLG.js} +5 -5
  66. package/dist/{chunk-PJQMISPD.js → chunk-PPAEJXVF.js} +5 -5
  67. package/dist/{chunk-GMWKWA6N.js → chunk-PRX77NPC.js} +5 -5
  68. package/dist/{chunk-24463PIV.js → chunk-PS572XYO.js} +2 -2
  69. package/dist/{chunk-KKOCFUI5.js → chunk-REZ4TUD2.js} +10 -10
  70. package/dist/{chunk-2QSZNTDO.js → chunk-RKNJBZ55.js} +4 -4
  71. package/dist/{chunk-V5UV7BOA.js → chunk-SQNED75R.js} +1 -1
  72. package/dist/{chunk-FLVL4L3L.js → chunk-TCKP4EHY.js} +2 -2
  73. package/dist/{chunk-SP42M3XP.js → chunk-TXV3I2O6.js} +7 -7
  74. package/dist/{chunk-S6UCPBPL.js → chunk-UNV6ZGTS.js} +2 -2
  75. package/dist/{chunk-2BFLDH5F.js → chunk-WEPWY4HB.js} +2 -2
  76. package/dist/{chunk-YQGHW5ML.js → chunk-WRFKZEO6.js} +4 -4
  77. package/dist/{chunk-XCXN3D2U.js → chunk-Y4TAFMUE.js} +6 -6
  78. package/dist/{chunk-H6S3DJVE.js → chunk-YMGQXBPS.js} +2 -2
  79. package/dist/{chunk-T422SYM6.js → chunk-ZUDM75KG.js} +5 -5
  80. package/dist/{chunk-XD6JVK5P.js → chunk-ZUHD6XZZ.js} +43 -43
  81. package/dist/{chunk-FOJY75BL.js → chunk-ZW5SZ3TH.js} +12 -12
  82. package/dist/{cli-BJQ2ahrh.d.ts → cli-cZyANcmY.d.ts} +1 -1
  83. package/dist/cli.d.ts +2 -2
  84. package/dist/cli.js +59 -59
  85. package/dist/compounding/engine.js +8 -8
  86. package/dist/config.js +1 -1
  87. package/dist/connectors/codex-materialize-runner.js +8 -8
  88. package/dist/connectors/index.js +9 -9
  89. package/dist/contradiction/index.js +2 -2
  90. package/dist/{contradiction-scan-2SODRNUF.js → contradiction-scan-3FJYWS3G.js} +3 -3
  91. package/dist/contradiction-scan-3FJYWS3G.js.map +1 -0
  92. package/dist/conversation-index/backend.js +2 -2
  93. package/dist/entity-retrieval.js +8 -8
  94. package/dist/extraction.js +2 -2
  95. package/dist/index.d.ts +2 -2
  96. package/dist/index.js +126 -126
  97. package/dist/lcm/engine.js +2 -2
  98. package/dist/lcm/index.js +2 -2
  99. package/dist/maintenance/memory-governance.js +8 -8
  100. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +7 -7
  101. package/dist/maintenance/rebuild-memory-projection.js +9 -9
  102. package/dist/mcp-memory-inspector-app.d.ts +1 -1
  103. package/dist/namespaces/migrate.js +18 -18
  104. package/dist/namespaces/search.js +9 -9
  105. package/dist/namespaces/storage.js +9 -9
  106. package/dist/operator-toolkit.js +24 -24
  107. package/dist/orchestration/maintenance.js +12 -12
  108. package/dist/orchestrator.js +82 -82
  109. package/dist/resume-bundles.js +2 -2
  110. package/dist/schemas.d.ts +10 -10
  111. package/dist/search/factory.js +8 -8
  112. package/dist/search/index.js +8 -8
  113. package/dist/search/lancedb-backend.js +2 -2
  114. package/dist/search/meilisearch-backend.js +2 -2
  115. package/dist/search/orama-backend.js +2 -2
  116. package/dist/semantic-consolidation.js +11 -11
  117. package/dist/semantic-rule-promotion.js +7 -7
  118. package/dist/semantic-rule-verifier.js +8 -8
  119. package/dist/shared-context/manager.d.ts +2 -2
  120. package/dist/storage.d.ts +60 -78
  121. package/dist/storage.js +14 -6
  122. package/dist/summarizer.js +2 -2
  123. package/dist/transfer/backup.js +2 -2
  124. package/dist/transfer/capsule-export.js +2 -2
  125. package/dist/transfer/capsule-import.js +2 -2
  126. package/dist/transfer/types.d.ts +12 -12
  127. package/dist/verified-recall.js +8 -8
  128. package/package.json +2 -2
  129. package/src/access-observe-write-surface.ts +1007 -0
  130. package/src/access-service.ts +48 -794
  131. package/src/orchestration/self-deps.ts +9 -1
  132. package/src/storage/entity-store.ts +4 -2
  133. package/src/storage/memory-read-store.ts +756 -0
  134. package/src/storage.ts +67 -627
  135. package/dist/chunk-GCEV6SXP.js.map +0 -1
  136. package/dist/chunk-XBM5DG4O.js.map +0 -1
  137. /package/dist/{capsule-crypto-CZJSLEFG.js.map → access-observe-write-surface.js.map} +0 -0
  138. /package/dist/{auto-sync-G4YKBPOU.js.map → auto-sync-RZO5ZPHR.js.map} +0 -0
  139. /package/dist/{contradiction-scan-2SODRNUF.js.map → capsule-crypto-FFWJ4X4A.js.map} +0 -0
  140. /package/dist/{chunk-M5QKGHCR.js.map → chunk-3I2IASNK.js.map} +0 -0
  141. /package/dist/{chunk-OCFITZRV.js.map → chunk-4AC57RCM.js.map} +0 -0
  142. /package/dist/{chunk-3DOD6ICJ.js.map → chunk-4I45UZ4V.js.map} +0 -0
  143. /package/dist/{chunk-TAPSNIMA.js.map → chunk-5CEJH5ZN.js.map} +0 -0
  144. /package/dist/{chunk-I6IAJCJS.js.map → chunk-5VWRYFQE.js.map} +0 -0
  145. /package/dist/{chunk-4LQUYBZM.js.map → chunk-5ZKT7WTR.js.map} +0 -0
  146. /package/dist/{chunk-VL5QHTJI.js.map → chunk-6DA5BBLS.js.map} +0 -0
  147. /package/dist/{chunk-LFKEFIJA.js.map → chunk-6DXXIXED.js.map} +0 -0
  148. /package/dist/{chunk-NCNOYM6F.js.map → chunk-7CFGXWYX.js.map} +0 -0
  149. /package/dist/{chunk-TJATYB3F.js.map → chunk-A6XCHI53.js.map} +0 -0
  150. /package/dist/{chunk-UQJ6YTKR.js.map → chunk-BTH6MQJT.js.map} +0 -0
  151. /package/dist/{chunk-G7LCG56O.js.map → chunk-CXW6Y7SI.js.map} +0 -0
  152. /package/dist/{chunk-DS4QM6I7.js.map → chunk-EEKDRAWX.js.map} +0 -0
  153. /package/dist/{chunk-I3UWEZTK.js.map → chunk-EF3VFQC4.js.map} +0 -0
  154. /package/dist/{chunk-437S3G37.js.map → chunk-EJJQDP3H.js.map} +0 -0
  155. /package/dist/{chunk-FQLM6ZUP.js.map → chunk-EVVLGYHR.js.map} +0 -0
  156. /package/dist/{chunk-GGYUR4M2.js.map → chunk-GBXP62CL.js.map} +0 -0
  157. /package/dist/{chunk-N4AGSRVA.js.map → chunk-GG6G2RYR.js.map} +0 -0
  158. /package/dist/{chunk-JITAVROY.js.map → chunk-H2T4OJNI.js.map} +0 -0
  159. /package/dist/{chunk-2MR3MFQB.js.map → chunk-JTYM4HPA.js.map} +0 -0
  160. /package/dist/{chunk-LD53WPMU.js.map → chunk-LQ6JI4VH.js.map} +0 -0
  161. /package/dist/{chunk-GPFXPC2V.js.map → chunk-NG2NHB4C.js.map} +0 -0
  162. /package/dist/{chunk-CIDGUFAL.js.map → chunk-NLXKSM46.js.map} +0 -0
  163. /package/dist/{chunk-T6WHI3JW.js.map → chunk-OLAVQS6S.js.map} +0 -0
  164. /package/dist/{chunk-ER3CCWK2.js.map → chunk-ORAK3LNZ.js.map} +0 -0
  165. /package/dist/{chunk-PJ7DIEFC.js.map → chunk-PBZQVVLG.js.map} +0 -0
  166. /package/dist/{chunk-PJQMISPD.js.map → chunk-PPAEJXVF.js.map} +0 -0
  167. /package/dist/{chunk-GMWKWA6N.js.map → chunk-PRX77NPC.js.map} +0 -0
  168. /package/dist/{chunk-24463PIV.js.map → chunk-PS572XYO.js.map} +0 -0
  169. /package/dist/{chunk-KKOCFUI5.js.map → chunk-REZ4TUD2.js.map} +0 -0
  170. /package/dist/{chunk-2QSZNTDO.js.map → chunk-RKNJBZ55.js.map} +0 -0
  171. /package/dist/{chunk-V5UV7BOA.js.map → chunk-SQNED75R.js.map} +0 -0
  172. /package/dist/{chunk-FLVL4L3L.js.map → chunk-TCKP4EHY.js.map} +0 -0
  173. /package/dist/{chunk-SP42M3XP.js.map → chunk-TXV3I2O6.js.map} +0 -0
  174. /package/dist/{chunk-S6UCPBPL.js.map → chunk-UNV6ZGTS.js.map} +0 -0
  175. /package/dist/{chunk-2BFLDH5F.js.map → chunk-WEPWY4HB.js.map} +0 -0
  176. /package/dist/{chunk-YQGHW5ML.js.map → chunk-WRFKZEO6.js.map} +0 -0
  177. /package/dist/{chunk-XCXN3D2U.js.map → chunk-Y4TAFMUE.js.map} +0 -0
  178. /package/dist/{chunk-H6S3DJVE.js.map → chunk-YMGQXBPS.js.map} +0 -0
  179. /package/dist/{chunk-T422SYM6.js.map → chunk-ZUDM75KG.js.map} +0 -0
  180. /package/dist/{chunk-XD6JVK5P.js.map → chunk-ZUHD6XZZ.js.map} +0 -0
  181. /package/dist/{chunk-FOJY75BL.js.map → chunk-ZW5SZ3TH.js.map} +0 -0
@@ -1,32 +1,31 @@
1
1
  import {
2
2
  compareVerifiedSemanticRuleResults,
3
3
  searchVerifiedSemanticRules
4
- } from "./chunk-XCXN3D2U.js";
5
- import "./chunk-ZBJMUXZH.js";
6
- import "./chunk-XBM5DG4O.js";
4
+ } from "./chunk-Y4TAFMUE.js";
5
+ import "./chunk-7APVFQ34.js";
7
6
  import "./chunk-M7XQSUBB.js";
8
7
  import "./chunk-L2B3EE7B.js";
9
8
  import "./chunk-5UZXUTVO.js";
10
9
  import "./chunk-5GPPACXK.js";
11
10
  import "./chunk-TKZ3AL5V.js";
12
11
  import "./chunk-6CIAGZ6X.js";
12
+ import "./chunk-J6A3CX5N.js";
13
13
  import "./chunk-SVOZFLIQ.js";
14
14
  import "./chunk-LTJAMRGI.js";
15
- import "./chunk-J6A3CX5N.js";
16
15
  import "./chunk-JS2HKKOK.js";
16
+ import "./chunk-RULE4VG5.js";
17
17
  import "./chunk-SCU65EZI.js";
18
18
  import "./chunk-MB5RSUW6.js";
19
19
  import "./chunk-6KYMPV2O.js";
20
20
  import "./chunk-AWJ2FHCF.js";
21
21
  import "./chunk-42JKGUFJ.js";
22
- import "./chunk-RULE4VG5.js";
23
- import "./chunk-DM2T26WE.js";
24
22
  import "./chunk-LDXUBPMO.js";
23
+ import "./chunk-DM2T26WE.js";
25
24
  import "./chunk-2OZ2JEUP.js";
26
25
  import "./chunk-AAD2ZS6P.js";
26
+ import "./chunk-W5H6ZRPT.js";
27
27
  import "./chunk-G7D6GZ5J.js";
28
28
  import "./chunk-VF4XKTX3.js";
29
- import "./chunk-W5H6ZRPT.js";
30
29
  import "./chunk-5J4OL7TJ.js";
31
30
  import "./chunk-IQVQJJL7.js";
32
31
  import "./chunk-VL7DP3OW.js";
@@ -35,12 +34,13 @@ import "./chunk-RGMVMVMF.js";
35
34
  import "./chunk-N7RWREIQ.js";
36
35
  import "./chunk-OEHCMALU.js";
37
36
  import "./chunk-PHK3HARR.js";
38
- import "./chunk-4DJQYKMN.js";
39
37
  import "./chunk-5GKPFL3S.js";
38
+ import "./chunk-4DJQYKMN.js";
40
39
  import "./chunk-EYIEWJNI.js";
41
40
  import "./chunk-JUC24CTX.js";
42
41
  import "./chunk-6MKAMLQL.js";
43
42
  import "./chunk-JAKIDQB2.js";
43
+ import "./chunk-ZBJMUXZH.js";
44
44
  import "./chunk-NU3CSQ4H.js";
45
45
  import "./chunk-J2HSAU72.js";
46
46
  import "./chunk-A6XUJE5D.js";
@@ -19,8 +19,8 @@ declare const SharedFeedbackEntrySchema: z.ZodObject<{
19
19
  refs: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
20
20
  }, "strip", z.ZodTypeAny, {
21
21
  decision: "rejected" | "approved" | "approved_with_feedback";
22
- reason: string;
23
22
  date: string;
23
+ reason: string;
24
24
  agent: string;
25
25
  workflow?: string | undefined;
26
26
  tags?: string[] | undefined;
@@ -33,8 +33,8 @@ declare const SharedFeedbackEntrySchema: z.ZodObject<{
33
33
  evidenceWindowEnd?: string | undefined;
34
34
  }, {
35
35
  decision: "rejected" | "approved" | "approved_with_feedback";
36
- reason: string;
37
36
  date: string;
37
+ reason: string;
38
38
  agent: string;
39
39
  workflow?: string | undefined;
40
40
  tags?: string[] | undefined;
package/dist/storage.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { P as PluginConfig, u as MemoryStatus, h as MemoryCategory, ae as ImportanceScore, ar as MemoryLink, q as MemoryFrontmatter, F as FaithfulnessFrontmatter, J as ProvenanceSource, M as MemoryFile, a7 as EntityStructuredSection, as as BufferState, at as MetaState, a2 as MemoryActionEvent, w as MemoryLifecycleEvent, X as BufferSurpriseEvent, B as BehaviorSignalEvent, a3 as CompressionGuidelineOptimizerState, aa as ContinuityIncidentOpenInput, a8 as ContinuityIncidentRecord, a9 as ContinuityIncidentCloseInput, ab as ContinuityImprovementLoop, ad as ContinuityLoopUpsertInput, ac as ContinuityLoopReviewInput, au as FileHygieneConfig, av as EntityRelationship, aw as EntityActivityEntry, E as EntityFile, ax as AccessTrackingEntry, v as MemoryProjectionCurrentState, ay as MemorySummary, aq as TopicScore, az as EntityTimelineEntry } from './types-D1iBqhJA.js';
1
+ import { M as MemoryFile, P as PluginConfig, u as MemoryStatus, h as MemoryCategory, ae as ImportanceScore, ar as MemoryLink, q as MemoryFrontmatter, F as FaithfulnessFrontmatter, J as ProvenanceSource, a7 as EntityStructuredSection, as as BufferState, at as MetaState, a2 as MemoryActionEvent, w as MemoryLifecycleEvent, X as BufferSurpriseEvent, B as BehaviorSignalEvent, a3 as CompressionGuidelineOptimizerState, aa as ContinuityIncidentOpenInput, a8 as ContinuityIncidentRecord, a9 as ContinuityIncidentCloseInput, ab as ContinuityImprovementLoop, ad as ContinuityLoopUpsertInput, ac as ContinuityLoopReviewInput, au as FileHygieneConfig, av as EntityRelationship, aw as EntityActivityEntry, E as EntityFile, ax as AccessTrackingEntry, v as MemoryProjectionCurrentState, ay as MemorySummary, aq as TopicScore, az as EntityTimelineEntry } from './types-D1iBqhJA.js';
2
2
  import { VersioningConfig } from './page-versioning.js';
3
3
  import { ConsolidationOperator } from './consolidation-operator.js';
4
4
  import { ProjectedMemoryBrowseOptions, ProjectedMemoryBrowsePage, readProjectedGovernanceRecord } from './memory-projection-store.js';
@@ -294,6 +294,12 @@ interface MemoryLifecycleEventWriteOptions {
294
294
  relatedMemoryIds?: string[];
295
295
  correlationId?: string;
296
296
  }
297
+ declare function parseFrontmatterStringValue(rawValue: string | undefined): string | undefined;
298
+ declare function parseFrontmatter(raw: string): {
299
+ frontmatter: MemoryFrontmatter;
300
+ content: string;
301
+ } | null;
302
+ declare function normalizeFrontmatterForPath(frontmatter: MemoryFrontmatter, pathRel: string, content?: string): MemoryFrontmatter;
297
303
  /**
298
304
  * Normalize an entity name to a canonical form.
299
305
  * Strips non-alphanumeric chars, collapses hyphens, removes type prefix duplication.
@@ -376,6 +382,20 @@ declare function parseEntityFile(content: string, entitySchemas?: PluginConfig["
376
382
  */
377
383
  declare function serializeEntityFile(entity: EntityFile, entitySchemas?: PluginConfig["entitySchemas"]): string;
378
384
  declare function buildEntitySchemaCacheKey(entitySchemas?: PluginConfig["entitySchemas"]): string;
385
+ /**
386
+ * Full-schema type guard for a `BUFFER_SURPRISE` telemetry row
387
+ * (issue #563 PR 3).
388
+ *
389
+ * The reader applies `limit` over the count of VALID rows, so
390
+ * applying only a partial check (e.g. "has a finite surpriseScore")
391
+ * and then deferring the rest of validation to
392
+ * `reportBufferSurpriseDistribution` would silently count
393
+ * schema-incomplete rows toward the limit, pushing genuinely-valid
394
+ * earlier rows out of the report window. Validate everything the
395
+ * downstream report requires at read time so the limit semantics and
396
+ * the distribution semantics stay consistent.
397
+ */
398
+ declare function isValidBufferSurpriseEvent(value: unknown): value is BufferSurpriseEvent;
379
399
  /** Result of {@link StorageManager.writeMemory} (issue #1645). Carries the
380
400
  * persisted id PLUS the non-resurrection tombstone-block outcome (#1579) so
381
401
  * post-write callers can observe it — NEVER a silent no-op (rule 34). */
@@ -395,17 +415,37 @@ declare class StorageManager {
395
415
  private artifactIndexCache;
396
416
  /** Read by storage/entity-store.ts (decomposition), hence not `private`. */
397
417
  static readonly KNOWLEDGE_INDEX_CACHE_TTL_MS = 600000;
398
- private static readonly ARTIFACT_INDEX_CACHE_TTL_MS;
418
+ /** Read by storage/memory-read-store.ts (decomposition). */
419
+ static readonly ARTIFACT_INDEX_CACHE_TTL_MS = 60000;
399
420
  private static readonly artifactWriteVersionByDir;
400
421
  private static readonly memoryStatusVersionByDir;
401
422
  private static readonly secureStoreEntityCacheKeyIds;
402
423
  private static nextSecureStoreEntityCacheKeyId;
403
424
  private static readonly coldWriteVersionByDir;
404
425
  private static readonly allMemoriesInFlight;
405
- private static readonly COLD_SCAN_CACHE_TTL_MS;
406
- private static readonly coldMemoriesCache;
407
- private static readonly QUESTIONS_CACHE_TTL_MS;
408
- private static readonly questionsCache;
426
+ /** Read by storage/memory-read-store.ts (decomposition). */
427
+ static readonly COLD_SCAN_CACHE_TTL_MS = 30000;
428
+ /** Read by storage/memory-read-store.ts (decomposition). */
429
+ static readonly coldMemoriesCache: Map<string, {
430
+ memories: MemoryFile[];
431
+ loadedAt: number;
432
+ coldVersion: number;
433
+ }>;
434
+ /** Read by storage/memory-read-store.ts (decomposition). */
435
+ static readonly QUESTIONS_CACHE_TTL_MS = 60000;
436
+ /** Read by storage/memory-read-store.ts (decomposition). */
437
+ static readonly questionsCache: Map<string, {
438
+ questions: Array<{
439
+ id: string;
440
+ question: string;
441
+ context: string;
442
+ priority: number;
443
+ resolved: boolean;
444
+ created: string;
445
+ filePath: string;
446
+ }>;
447
+ loadedAt: number;
448
+ }>;
409
449
  private factHashIndex;
410
450
  private factHashIndexLoadPromise;
411
451
  private factHashIndexAuthoritative;
@@ -503,7 +543,20 @@ declare class StorageManager {
503
543
  */
504
544
  snapshotForProvenance(filePath: string): Promise<string | null>;
505
545
  constructor(baseDir: string, entitySchemas?: PluginConfig["entitySchemas"]);
546
+ /**
547
+ * The LIVE class object of this instance (issue #1809 review of the
548
+ * storage decomposition): extracted store modules must read/write the
549
+ * shared static caches (questionsCache, coldMemoriesCache, ...) through
550
+ * the SAME class binding the host methods use. Referencing the imported
551
+ * `StorageManager` symbol from a split bundle chunk can yield a second
552
+ * class copy with its own statics, split-braining the caches
553
+ * (resolveQuestion clears copy A while readQuestions reads copy B).
554
+ */
555
+ get storageManagerClass(): typeof StorageManager;
506
556
  /** The root directory of this storage instance. */
557
+ /** MemoryReadStore (storage.ts decomposition). Lazy; selfDeps live wiring. */
558
+ private _memoryReadStore;
559
+ private get memoryReadStore();
507
560
  /** EntityStore (storage.ts decomposition). Lazy; selfDeps live wiring. */
508
561
  private _entityStore;
509
562
  private get entityStore();
@@ -526,10 +579,6 @@ declare class StorageManager {
526
579
  writeWearableDayTranscript(sourceId: string, date: string, serialized: string): Promise<void>;
527
580
  /** Read a stored day transcript; null when the day has no file. */
528
581
  readWearableDayTranscript(sourceId: string, date: string): Promise<string | null>;
529
- /**
530
- * List stored transcript days, newest first, optionally scoped to one
531
- * source. Non-transcript files in the tree are ignored.
532
- */
533
582
  listWearableTranscriptDays(sourceId?: string): Promise<Array<{
534
583
  source: string;
535
584
  date: string;
@@ -901,39 +950,12 @@ declare class StorageManager {
901
950
  filePaths: string[];
902
951
  }>;
903
952
  private _readAllMemoriesFromDisk;
904
- /**
905
- * Read all memories from the cold tier by scanning the entire cold/ root
906
- * tree. Previously this only scanned cold/facts/ and cold/corrections/, but
907
- * structuredAttributes can appear on any MemoryCategory (preference, decision,
908
- * entity, etc.). buildTierMemoryPath now routes each category to its own
909
- * cold/<dir>/ subtree via the shared categoryDirName() chokepoint (issue
910
- * #1546), so cold decisions/preferences/... live outside cold/facts/.
911
- * Scanning the full coldRoot covers every category dir and guards against
912
- * files placed in unexpected subdirectories during manual operations or future
913
- * refactors.
914
- *
915
- * Broadened in PR #402 round-6 (Finding UTsP): scanning only facts/ and
916
- * corrections/ was a narrower-than-necessary subset of the cold directory
917
- * tree. Correctness trumps the minor performance difference — cold scans
918
- * already happen at most once per supersession write.
919
- *
920
- * Used by applyTemporalSupersession so that memories already demoted to
921
- * cold/ can still be marked superseded when a newer hot fact arrives.
922
- *
923
- * Cached with a TTL (Finding UOGi, PR #402 round-6): back-to-back
924
- * structured-attribute writes in the same burst reuse the cached result
925
- * instead of re-scanning the cold tree on every call. The cache is
926
- * invalidated whenever a write calls invalidateAllMemoriesCache() (which
927
- * covers any hot→cold demotion that changes cold-tier contents) and
928
- * expires after COLD_SCAN_CACHE_TTL_MS as a safety net.
929
- */
930
953
  readAllColdMemories(): Promise<MemoryFile[]>;
931
954
  /**
932
955
  * Read archived memory markdown files under archive/.
933
956
  * Used by long-term recall fallback when hot recall has no hits.
934
957
  */
935
958
  readArchivedMemories(): Promise<MemoryFile[]>;
936
- /** Read a single memory file by its absolute path. Returns null if unreadable. */
937
959
  readMemoryByPath(filePath: string): Promise<MemoryFile | null>;
938
960
  private resolveTierRootDir;
939
961
  private resolveMemoryDateDir;
@@ -990,47 +1012,7 @@ declare class StorageManager {
990
1012
  saveMeta(state: MetaState): Promise<void>;
991
1013
  appendMemoryActionEvents(events: MemoryActionEvent[]): Promise<number>;
992
1014
  appendMemoryLifecycleEvents(events: MemoryLifecycleEvent[]): Promise<number>;
993
- /**
994
- * Append a batch of `BUFFER_SURPRISE` telemetry events (issue #563 PR 3).
995
- *
996
- * Each event records a single buffer flush decision driven by the
997
- * surprise gate. The ledger is consumed by
998
- * `reportBufferSurpriseDistribution` (Doctor report) and by downstream
999
- * benchmark analysis. This method is fire-and-forget by contract:
1000
- * callers log but do not fail the hot path if the append throws.
1001
- */
1002
1015
  appendBufferSurpriseEvents(events: BufferSurpriseEvent[]): Promise<number>;
1003
- /**
1004
- * Read the buffer-surprise ledger, most recent rows last.
1005
- *
1006
- * `limit` bounds the number of **valid rows** returned (not the
1007
- * number of raw lines parsed). We parse every row, discard malformed
1008
- * ones, then take the tail — so a partial/truncated trailing line
1009
- * (the common failure mode after an interrupted append) cannot hide
1010
- * otherwise-valid recent data above it.
1011
- *
1012
- * Non-positive / non-integer / non-finite limits return `[]` rather
1013
- * than the entire file, matching the other ledger readers in this
1014
- * class and protecting against `slice(-0.5)` → `slice(-0)` silently
1015
- * devolving into an unbounded parse.
1016
- *
1017
- * # Performance note
1018
- *
1019
- * For very large ledgers (issue #563 follow-up), a tail-first reader
1020
- * would avoid parsing the full file when only a recent window is
1021
- * needed. We keep the full-scan implementation here because:
1022
- *
1023
- * - the ledger is opt-in (flag off by default), so early deployments
1024
- * accumulate rows slowly;
1025
- * - telemetry rows are small (~200 bytes), so even 100k rows parse
1026
- * in well under a second;
1027
- * - the governance archive/cleanup flow can trim the ledger when
1028
- * size becomes a concern, reusing the existing maintenance hooks.
1029
- *
1030
- * Swap to a chunked tail-reader if production logs show this is a
1031
- * hot path — leaving that work for a follow-up keeps this PR scoped
1032
- * to correctness, not optimization.
1033
- */
1034
1016
  readBufferSurpriseEvents(options?: {
1035
1017
  limit?: number;
1036
1018
  }): Promise<BufferSurpriseEvent[]>;
@@ -1261,4 +1243,4 @@ declare class StorageManager {
1261
1243
  private appendGeneratedMemoryLifecycleEventFailOpen;
1262
1244
  }
1263
1245
 
1264
- export { ContentHashIndex, type MemoryLifecycleEventWriteOptions, type MemoryWriteResult, type ReextractJobRequest, StorageManager, buildEntitySchemaCacheKey, compareEntityTimestamps, compileEntityFacts, countEntityStructuredFacts, fingerprintEntityStructuredFacts, isEntitySynthesisStale, normalizeAttributePairs, normalizeEntityName, normalizeStructuredSectionFacts, parseEntityFile, serializeEntityFile };
1246
+ export { ContentHashIndex, type MemoryLifecycleEventWriteOptions, type MemoryWriteResult, type ReextractJobRequest, StorageManager, buildEntitySchemaCacheKey, compareEntityTimestamps, compileEntityFacts, countEntityStructuredFacts, fingerprintEntityStructuredFacts, isEntitySynthesisStale, isValidBufferSurpriseEvent, normalizeAttributePairs, normalizeEntityName, normalizeFrontmatterForPath, normalizeStructuredSectionFacts, parseEntityFile, parseFrontmatter, parseFrontmatterStringValue, serializeEntityFile };
package/dist/storage.js CHANGED
@@ -7,37 +7,41 @@ import {
7
7
  countEntityStructuredFacts,
8
8
  fingerprintEntityStructuredFacts,
9
9
  isEntitySynthesisStale,
10
+ isValidBufferSurpriseEvent,
10
11
  normalizeAttributePairs,
11
12
  normalizeEntityName,
13
+ normalizeFrontmatterForPath,
12
14
  normalizeStructuredSectionFacts,
13
15
  parseEntityFile,
16
+ parseFrontmatter,
17
+ parseFrontmatterStringValue,
14
18
  serializeEntityFile
15
- } from "./chunk-XBM5DG4O.js";
19
+ } from "./chunk-7APVFQ34.js";
16
20
  import "./chunk-M7XQSUBB.js";
17
21
  import "./chunk-L2B3EE7B.js";
18
22
  import "./chunk-5UZXUTVO.js";
19
23
  import "./chunk-5GPPACXK.js";
20
24
  import "./chunk-TKZ3AL5V.js";
21
25
  import "./chunk-6CIAGZ6X.js";
26
+ import "./chunk-J6A3CX5N.js";
22
27
  import {
23
28
  stripAttributesSuffix
24
29
  } from "./chunk-SVOZFLIQ.js";
25
30
  import "./chunk-LTJAMRGI.js";
26
- import "./chunk-J6A3CX5N.js";
27
31
  import "./chunk-JS2HKKOK.js";
32
+ import "./chunk-RULE4VG5.js";
28
33
  import "./chunk-SCU65EZI.js";
29
34
  import "./chunk-MB5RSUW6.js";
30
35
  import "./chunk-6KYMPV2O.js";
31
36
  import "./chunk-AWJ2FHCF.js";
32
37
  import "./chunk-42JKGUFJ.js";
33
- import "./chunk-RULE4VG5.js";
34
- import "./chunk-DM2T26WE.js";
35
38
  import "./chunk-LDXUBPMO.js";
39
+ import "./chunk-DM2T26WE.js";
36
40
  import "./chunk-2OZ2JEUP.js";
37
41
  import "./chunk-AAD2ZS6P.js";
42
+ import "./chunk-W5H6ZRPT.js";
38
43
  import "./chunk-G7D6GZ5J.js";
39
44
  import "./chunk-VF4XKTX3.js";
40
- import "./chunk-W5H6ZRPT.js";
41
45
  import "./chunk-5J4OL7TJ.js";
42
46
  import "./chunk-IQVQJJL7.js";
43
47
  import "./chunk-VL7DP3OW.js";
@@ -46,8 +50,8 @@ import "./chunk-RGMVMVMF.js";
46
50
  import "./chunk-N7RWREIQ.js";
47
51
  import "./chunk-OEHCMALU.js";
48
52
  import "./chunk-PHK3HARR.js";
49
- import "./chunk-4DJQYKMN.js";
50
53
  import "./chunk-5GKPFL3S.js";
54
+ import "./chunk-4DJQYKMN.js";
51
55
  import "./chunk-EYIEWJNI.js";
52
56
  import "./chunk-JUC24CTX.js";
53
57
  import "./chunk-6MKAMLQL.js";
@@ -67,10 +71,14 @@ export {
67
71
  countEntityStructuredFacts,
68
72
  fingerprintEntityStructuredFacts,
69
73
  isEntitySynthesisStale,
74
+ isValidBufferSurpriseEvent,
70
75
  normalizeAttributePairs,
71
76
  normalizeEntityName,
77
+ normalizeFrontmatterForPath,
72
78
  normalizeStructuredSectionFacts,
73
79
  parseEntityFile,
80
+ parseFrontmatter,
81
+ parseFrontmatterStringValue,
74
82
  serializeEntityFile,
75
83
  stripAttributesSuffix
76
84
  };
@@ -1,13 +1,12 @@
1
1
  import {
2
2
  HourlySummarizer
3
- } from "./chunk-PJQMISPD.js";
3
+ } from "./chunk-PPAEJXVF.js";
4
4
  import "./chunk-3FAMU5TX.js";
5
5
  import "./chunk-PWFWCGOO.js";
6
6
  import "./chunk-DBSMLRTO.js";
7
7
  import "./chunk-S4DDLTPX.js";
8
8
  import "./chunk-FF4KLI5W.js";
9
9
  import "./chunk-O75CRYGF.js";
10
- import "./chunk-VSF7AAGE.js";
11
10
  import "./chunk-LTJAMRGI.js";
12
11
  import "./chunk-5J4OL7TJ.js";
13
12
  import "./chunk-IQVQJJL7.js";
@@ -15,6 +14,7 @@ import "./chunk-VL7DP3OW.js";
15
14
  import "./chunk-L2EXJQJP.js";
16
15
  import "./chunk-RGMVMVMF.js";
17
16
  import "./chunk-N7RWREIQ.js";
17
+ import "./chunk-VSF7AAGE.js";
18
18
  import "./chunk-EYIEWJNI.js";
19
19
  import "./chunk-JUC24CTX.js";
20
20
  import "./chunk-NU3CSQ4H.js";
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  backupMemoryDir
3
- } from "../chunk-2BFLDH5F.js";
3
+ } from "../chunk-WEPWY4HB.js";
4
4
  import "../chunk-765K3SAT.js";
5
- import "../chunk-437S3G37.js";
5
+ import "../chunk-EJJQDP3H.js";
6
6
  import "../chunk-GWTFLF2P.js";
7
7
  import "../chunk-UKJAGEXH.js";
8
8
  import "../chunk-FP2373TW.js";
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  exportCapsule,
3
3
  isValidCapsuleSince
4
- } from "../chunk-FLVL4L3L.js";
4
+ } from "../chunk-TCKP4EHY.js";
5
5
  import "../chunk-WEHSQBFR.js";
6
- import "../chunk-437S3G37.js";
6
+ import "../chunk-EJJQDP3H.js";
7
7
  import "../chunk-GWTFLF2P.js";
8
8
  import "../chunk-UKJAGEXH.js";
9
9
  import "../chunk-FP2373TW.js";
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  importCapsule
3
- } from "../chunk-M5QKGHCR.js";
3
+ } from "../chunk-3I2IASNK.js";
4
4
  import "../chunk-VF4XKTX3.js";
5
5
  import "../chunk-WEHSQBFR.js";
6
- import "../chunk-437S3G37.js";
6
+ import "../chunk-EJJQDP3H.js";
7
7
  import "../chunk-GWTFLF2P.js";
8
8
  import "../chunk-UKJAGEXH.js";
9
9
  import "../chunk-FP2373TW.js";
@@ -321,8 +321,8 @@ declare const CapsuleBlockSchema: z.ZodObject<{
321
321
  peerProfiles: boolean;
322
322
  };
323
323
  id: string;
324
- description: string;
325
324
  version: string;
325
+ description: string;
326
326
  parentCapsule: string | null;
327
327
  retrievalPolicy: {
328
328
  tierWeights: Record<string, number>;
@@ -342,8 +342,8 @@ declare const CapsuleBlockSchema: z.ZodObject<{
342
342
  peerProfiles: boolean;
343
343
  };
344
344
  id: string;
345
- description: string;
346
345
  version: string;
346
+ description: string;
347
347
  parentCapsule: string | null;
348
348
  retrievalPolicy: {
349
349
  tierWeights: Record<string, number>;
@@ -472,8 +472,8 @@ declare const ExportManifestV2Schema: z.ZodObject<{
472
472
  peerProfiles: boolean;
473
473
  };
474
474
  id: string;
475
- description: string;
476
475
  version: string;
476
+ description: string;
477
477
  parentCapsule: string | null;
478
478
  retrievalPolicy: {
479
479
  tierWeights: Record<string, number>;
@@ -493,8 +493,8 @@ declare const ExportManifestV2Schema: z.ZodObject<{
493
493
  peerProfiles: boolean;
494
494
  };
495
495
  id: string;
496
- description: string;
497
496
  version: string;
497
+ description: string;
498
498
  parentCapsule: string | null;
499
499
  retrievalPolicy: {
500
500
  tierWeights: Record<string, number>;
@@ -526,8 +526,8 @@ declare const ExportManifestV2Schema: z.ZodObject<{
526
526
  peerProfiles: boolean;
527
527
  };
528
528
  id: string;
529
- description: string;
530
529
  version: string;
530
+ description: string;
531
531
  parentCapsule: string | null;
532
532
  retrievalPolicy: {
533
533
  tierWeights: Record<string, number>;
@@ -559,8 +559,8 @@ declare const ExportManifestV2Schema: z.ZodObject<{
559
559
  peerProfiles: boolean;
560
560
  };
561
561
  id: string;
562
- description: string;
563
562
  version: string;
563
+ description: string;
564
564
  parentCapsule: string | null;
565
565
  retrievalPolicy: {
566
566
  tierWeights: Record<string, number>;
@@ -691,8 +691,8 @@ declare const ExportBundleV2Schema: z.ZodObject<{
691
691
  peerProfiles: boolean;
692
692
  };
693
693
  id: string;
694
- description: string;
695
694
  version: string;
695
+ description: string;
696
696
  parentCapsule: string | null;
697
697
  retrievalPolicy: {
698
698
  tierWeights: Record<string, number>;
@@ -712,8 +712,8 @@ declare const ExportBundleV2Schema: z.ZodObject<{
712
712
  peerProfiles: boolean;
713
713
  };
714
714
  id: string;
715
- description: string;
716
715
  version: string;
716
+ description: string;
717
717
  parentCapsule: string | null;
718
718
  retrievalPolicy: {
719
719
  tierWeights: Record<string, number>;
@@ -745,8 +745,8 @@ declare const ExportBundleV2Schema: z.ZodObject<{
745
745
  peerProfiles: boolean;
746
746
  };
747
747
  id: string;
748
- description: string;
749
748
  version: string;
749
+ description: string;
750
750
  parentCapsule: string | null;
751
751
  retrievalPolicy: {
752
752
  tierWeights: Record<string, number>;
@@ -778,8 +778,8 @@ declare const ExportBundleV2Schema: z.ZodObject<{
778
778
  peerProfiles: boolean;
779
779
  };
780
780
  id: string;
781
- description: string;
782
781
  version: string;
782
+ description: string;
783
783
  parentCapsule: string | null;
784
784
  retrievalPolicy: {
785
785
  tierWeights: Record<string, number>;
@@ -823,8 +823,8 @@ declare const ExportBundleV2Schema: z.ZodObject<{
823
823
  peerProfiles: boolean;
824
824
  };
825
825
  id: string;
826
- description: string;
827
826
  version: string;
827
+ description: string;
828
828
  parentCapsule: string | null;
829
829
  retrievalPolicy: {
830
830
  tierWeights: Record<string, number>;
@@ -862,8 +862,8 @@ declare const ExportBundleV2Schema: z.ZodObject<{
862
862
  peerProfiles: boolean;
863
863
  };
864
864
  id: string;
865
- description: string;
866
865
  version: string;
866
+ description: string;
867
867
  parentCapsule: string | null;
868
868
  retrievalPolicy: {
869
869
  tierWeights: Record<string, number>;
@@ -1,33 +1,32 @@
1
1
  import {
2
2
  compareVerifiedEpisodeResults,
3
3
  searchVerifiedEpisodes
4
- } from "./chunk-T6WHI3JW.js";
4
+ } from "./chunk-OLAVQS6S.js";
5
5
  import "./chunk-7FL4CNPV.js";
6
- import "./chunk-ZBJMUXZH.js";
7
- import "./chunk-XBM5DG4O.js";
6
+ import "./chunk-7APVFQ34.js";
8
7
  import "./chunk-M7XQSUBB.js";
9
8
  import "./chunk-L2B3EE7B.js";
10
9
  import "./chunk-5UZXUTVO.js";
11
10
  import "./chunk-5GPPACXK.js";
12
11
  import "./chunk-TKZ3AL5V.js";
13
12
  import "./chunk-6CIAGZ6X.js";
13
+ import "./chunk-J6A3CX5N.js";
14
14
  import "./chunk-SVOZFLIQ.js";
15
15
  import "./chunk-LTJAMRGI.js";
16
- import "./chunk-J6A3CX5N.js";
17
16
  import "./chunk-JS2HKKOK.js";
17
+ import "./chunk-RULE4VG5.js";
18
18
  import "./chunk-SCU65EZI.js";
19
19
  import "./chunk-MB5RSUW6.js";
20
20
  import "./chunk-6KYMPV2O.js";
21
21
  import "./chunk-AWJ2FHCF.js";
22
22
  import "./chunk-42JKGUFJ.js";
23
- import "./chunk-RULE4VG5.js";
24
- import "./chunk-DM2T26WE.js";
25
23
  import "./chunk-LDXUBPMO.js";
24
+ import "./chunk-DM2T26WE.js";
26
25
  import "./chunk-2OZ2JEUP.js";
27
26
  import "./chunk-AAD2ZS6P.js";
27
+ import "./chunk-W5H6ZRPT.js";
28
28
  import "./chunk-G7D6GZ5J.js";
29
29
  import "./chunk-VF4XKTX3.js";
30
- import "./chunk-W5H6ZRPT.js";
31
30
  import "./chunk-5J4OL7TJ.js";
32
31
  import "./chunk-IQVQJJL7.js";
33
32
  import "./chunk-VL7DP3OW.js";
@@ -36,12 +35,13 @@ import "./chunk-RGMVMVMF.js";
36
35
  import "./chunk-N7RWREIQ.js";
37
36
  import "./chunk-OEHCMALU.js";
38
37
  import "./chunk-PHK3HARR.js";
39
- import "./chunk-4DJQYKMN.js";
40
38
  import "./chunk-5GKPFL3S.js";
39
+ import "./chunk-4DJQYKMN.js";
41
40
  import "./chunk-EYIEWJNI.js";
42
41
  import "./chunk-JUC24CTX.js";
43
42
  import "./chunk-6MKAMLQL.js";
44
43
  import "./chunk-JAKIDQB2.js";
44
+ import "./chunk-ZBJMUXZH.js";
45
45
  import "./chunk-NU3CSQ4H.js";
46
46
  import "./chunk-J2HSAU72.js";
47
47
  import "./chunk-A6XUJE5D.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remnic/core",
3
- "version": "9.3.755",
3
+ "version": "9.3.756",
4
4
  "description": "Framework-agnostic Remnic memory engine — orchestrator, storage, extraction, search, trust zones",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -3000,7 +3000,7 @@
3000
3000
  "core"
3001
3001
  ],
3002
3002
  "peerDependencies": {
3003
- "@remnic/coding-graph": "^9.3.755"
3003
+ "@remnic/coding-graph": "^9.3.756"
3004
3004
  },
3005
3005
  "peerDependenciesMeta": {
3006
3006
  "@remnic/coding-graph": {