@remnic/core 9.69.52 → 9.69.54

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 (146) hide show
  1. package/dist/access-admin-ops-surface.d.ts +1 -1
  2. package/dist/access-admin-ops-surface.js +4 -4
  3. package/dist/access-authorization-probe.d.ts +1 -1
  4. package/dist/access-authorization-probe.js +5 -5
  5. package/dist/access-boundary.d.ts +1 -1
  6. package/dist/access-boundary.js +4 -4
  7. package/dist/access-cli.js +23 -23
  8. package/dist/access-extraction-force-flush.d.ts +1 -1
  9. package/dist/access-extraction-force-flush.js +4 -4
  10. package/dist/access-http-briefing.d.ts +1 -1
  11. package/dist/access-http-briefing.js +5 -5
  12. package/dist/access-http-lcm-compaction.d.ts +1 -1
  13. package/dist/access-http-lifecycle-flush.d.ts +1 -1
  14. package/dist/access-http-offline-stream.d.ts +1 -1
  15. package/dist/access-http-query.js +4 -4
  16. package/dist/access-http.d.ts +2 -2
  17. package/dist/access-http.js +16 -16
  18. package/dist/access-identity-continuity-surface.js +4 -4
  19. package/dist/access-lcm-surface.d.ts +1 -1
  20. package/dist/access-lcm-surface.js +4 -4
  21. package/dist/access-mcp-shared-context-tools.d.ts +1 -1
  22. package/dist/access-mcp.d.ts +1 -1
  23. package/dist/access-mcp.js +11 -11
  24. package/dist/access-namespace-preflight.js +4 -4
  25. package/dist/access-observe-write-surface.d.ts +1 -1
  26. package/dist/access-observe-write-surface.js +4 -4
  27. package/dist/access-operations-batch.js +5 -5
  28. package/dist/access-operations.d.ts +1 -1
  29. package/dist/access-operations.js +10 -10
  30. package/dist/access-recall-concurrency.d.ts +1 -1
  31. package/dist/access-recall-concurrency.js +4 -4
  32. package/dist/access-recall-response.d.ts +1 -1
  33. package/dist/access-recall-response.js +4 -4
  34. package/dist/access-recall-surface.d.ts +1 -1
  35. package/dist/access-recall-surface.js +4 -4
  36. package/dist/access-schema.d.ts +113 -113
  37. package/dist/{access-service-CUNM5RfA.d.ts → access-service-H-qEdnSs.d.ts} +64 -64
  38. package/dist/access-service-helpers.d.ts +1 -1
  39. package/dist/access-service.d.ts +1 -1
  40. package/dist/access-service.js +4 -4
  41. package/dist/access-surface-catalog.d.ts +1 -1
  42. package/dist/access-surface-catalog.js +6 -6
  43. package/dist/active-recall.js +1 -1
  44. package/dist/{chunk-TEQQQTQS.js → chunk-2HJKAVAS.js} +2 -2
  45. package/dist/{chunk-SEQ6DWXD.js → chunk-5IKW2VP6.js} +2 -2
  46. package/dist/{chunk-HWT6KRGS.js → chunk-6UEM5EOB.js} +2 -2
  47. package/dist/{chunk-UCY4EHAG.js → chunk-A4TQFNRX.js} +3 -3
  48. package/dist/{chunk-72N2P44O.js → chunk-ARRKSBQU.js} +2 -2
  49. package/dist/{chunk-WBW34YCJ.js → chunk-BCXZ4BDS.js} +2 -2
  50. package/dist/{chunk-V5BU5PVE.js → chunk-CO7KBRPF.js} +2 -2
  51. package/dist/{chunk-HG42J2EX.js → chunk-EQNZC3BH.js} +2 -2
  52. package/dist/{chunk-35EH6KW4.js → chunk-EYK3UHAP.js} +2 -2
  53. package/dist/{chunk-DCRK7I5E.js → chunk-HUQMVI3A.js} +93 -4
  54. package/dist/chunk-HUQMVI3A.js.map +1 -0
  55. package/dist/{chunk-UVZBDIJX.js → chunk-KGY6F4VJ.js} +488 -48
  56. package/dist/chunk-KGY6F4VJ.js.map +1 -0
  57. package/dist/{chunk-U6CMLAP4.js → chunk-M7HFDWOS.js} +2 -2
  58. package/dist/{chunk-2UDAABV6.js → chunk-MTJUIIM4.js} +2 -2
  59. package/dist/{chunk-GRX6YH4E.js → chunk-MXTCV3B5.js} +2 -2
  60. package/dist/{chunk-MSTKJI5T.js → chunk-OKOG5MXF.js} +590 -684
  61. package/dist/chunk-OKOG5MXF.js.map +1 -0
  62. package/dist/{chunk-6KCQNFDQ.js → chunk-SOOWBRMH.js} +8 -8
  63. package/dist/{chunk-72AV2H3R.js → chunk-U3NBO4IX.js} +39 -3
  64. package/dist/chunk-U3NBO4IX.js.map +1 -0
  65. package/dist/{chunk-EW3Y73MN.js → chunk-UJBIWY5M.js} +2 -2
  66. package/dist/{chunk-SVUUOLKM.js → chunk-VMKAA5SU.js} +2 -2
  67. package/dist/{chunk-JE4H2QBO.js → chunk-WJ5KWJLK.js} +2 -2
  68. package/dist/{chunk-UQTXER7M.js → chunk-ZADYEZY4.js} +2 -2
  69. package/dist/{chunk-2INZSV27.js → chunk-ZANEMAEV.js} +2 -2
  70. package/dist/{chunk-SOFATSHJ.js → chunk-ZHV6FGVF.js} +8 -8
  71. package/dist/{cli-CCc34xV7.d.ts → cli-VGDSn2zY.d.ts} +1 -1
  72. package/dist/cli.d.ts +2 -2
  73. package/dist/cli.js +20 -20
  74. package/dist/config.js +1 -1
  75. package/dist/deep-recall-http-glue.d.ts +1 -1
  76. package/dist/deep-recall-mcp-tools.d.ts +1 -1
  77. package/dist/directory-sidecars.d.ts +30 -7
  78. package/dist/directory-sidecars.js +5 -1
  79. package/dist/external-wiki-access.d.ts +1 -1
  80. package/dist/external-wiki-access.js +5 -5
  81. package/dist/external-wiki-mcp-tools.d.ts +1 -1
  82. package/dist/index.d.ts +819 -721
  83. package/dist/index.js +35 -25
  84. package/dist/mcp-memory-inspector-app.d.ts +1 -1
  85. package/dist/memory-browse-http-glue.d.ts +1 -1
  86. package/dist/memory-browse-mcp-tools.d.ts +1 -1
  87. package/dist/memory-browse-operations.js +5 -5
  88. package/dist/memory-browse.js +3 -3
  89. package/dist/memory-subject-cli.d.ts +1 -1
  90. package/dist/memory-subject.d.ts +1 -1
  91. package/dist/operator-toolkit.js +2 -2
  92. package/dist/orchestrator.js +23 -23
  93. package/dist/{public-http-UWVcqMcb.d.ts → public-http-P0cnHzYB.d.ts} +1 -1
  94. package/dist/recall-navigation-http-glue.d.ts +1 -1
  95. package/dist/recall-navigation-mcp-tools.d.ts +1 -1
  96. package/dist/recall-navigation-operations.js +5 -5
  97. package/dist/recall-navigation.js +4 -4
  98. package/dist/recall-state-view-admission.js +3 -3
  99. package/dist/resume-bundles.js +2 -2
  100. package/dist/schemas.d.ts +160 -160
  101. package/dist/shared-context/manager.d.ts +8 -8
  102. package/dist/support-passport/index.d.ts +4 -4
  103. package/dist/support-passport/index.js +7 -7
  104. package/dist/transfer/types.d.ts +78 -78
  105. package/dist/who-knows-cli.d.ts +1 -1
  106. package/dist/who-knows.d.ts +1 -1
  107. package/package.json +2 -2
  108. package/src/activity/index.ts +2 -0
  109. package/src/activity/timeline/index.ts +1 -0
  110. package/src/activity/timeline/week-dashboard.test.ts +362 -0
  111. package/src/activity/timeline/week-dashboard.ts +273 -0
  112. package/src/activity/timeline/weekly.ts +2 -1
  113. package/src/directory-sidecars.test.ts +113 -0
  114. package/src/directory-sidecars.ts +70 -8
  115. package/src/experience/session-experience-mining.test.ts +186 -0
  116. package/src/experience/session-experience-mining.ts +90 -0
  117. package/src/lifecycle/seed-graduation.test.ts +209 -0
  118. package/src/lifecycle/seed-graduation.ts +94 -11
  119. package/src/orchestration/persistence-index.ts +50 -0
  120. package/src/orchestration/recall-recognition-index.test.ts +249 -0
  121. package/src/orchestration/recall-recognition-index.ts +169 -0
  122. package/src/procedural/procedure-miner.ts +8 -6
  123. package/src/testing/subjects/recall-recognition-index.test.ts +97 -0
  124. package/dist/chunk-72AV2H3R.js.map +0 -1
  125. package/dist/chunk-DCRK7I5E.js.map +0 -1
  126. package/dist/chunk-MSTKJI5T.js.map +0 -1
  127. package/dist/chunk-UVZBDIJX.js.map +0 -1
  128. /package/dist/{chunk-TEQQQTQS.js.map → chunk-2HJKAVAS.js.map} +0 -0
  129. /package/dist/{chunk-SEQ6DWXD.js.map → chunk-5IKW2VP6.js.map} +0 -0
  130. /package/dist/{chunk-HWT6KRGS.js.map → chunk-6UEM5EOB.js.map} +0 -0
  131. /package/dist/{chunk-UCY4EHAG.js.map → chunk-A4TQFNRX.js.map} +0 -0
  132. /package/dist/{chunk-72N2P44O.js.map → chunk-ARRKSBQU.js.map} +0 -0
  133. /package/dist/{chunk-WBW34YCJ.js.map → chunk-BCXZ4BDS.js.map} +0 -0
  134. /package/dist/{chunk-V5BU5PVE.js.map → chunk-CO7KBRPF.js.map} +0 -0
  135. /package/dist/{chunk-HG42J2EX.js.map → chunk-EQNZC3BH.js.map} +0 -0
  136. /package/dist/{chunk-35EH6KW4.js.map → chunk-EYK3UHAP.js.map} +0 -0
  137. /package/dist/{chunk-U6CMLAP4.js.map → chunk-M7HFDWOS.js.map} +0 -0
  138. /package/dist/{chunk-2UDAABV6.js.map → chunk-MTJUIIM4.js.map} +0 -0
  139. /package/dist/{chunk-GRX6YH4E.js.map → chunk-MXTCV3B5.js.map} +0 -0
  140. /package/dist/{chunk-6KCQNFDQ.js.map → chunk-SOOWBRMH.js.map} +0 -0
  141. /package/dist/{chunk-EW3Y73MN.js.map → chunk-UJBIWY5M.js.map} +0 -0
  142. /package/dist/{chunk-SVUUOLKM.js.map → chunk-VMKAA5SU.js.map} +0 -0
  143. /package/dist/{chunk-JE4H2QBO.js.map → chunk-WJ5KWJLK.js.map} +0 -0
  144. /package/dist/{chunk-UQTXER7M.js.map → chunk-ZADYEZY4.js.map} +0 -0
  145. /package/dist/{chunk-2INZSV27.js.map → chunk-ZANEMAEV.js.map} +0 -0
  146. /package/dist/{chunk-SOFATSHJ.js.map → chunk-ZHV6FGVF.js.map} +0 -0
@@ -21,10 +21,10 @@ import {
21
21
  } from "./chunk-TTFJQ5B5.js";
22
22
  import {
23
23
  handleSupportPassportOwnerHttp
24
- } from "./chunk-WBW34YCJ.js";
24
+ } from "./chunk-BCXZ4BDS.js";
25
25
  import {
26
26
  buildSupportPassportPublicRequestHandler
27
- } from "./chunk-UQTXER7M.js";
27
+ } from "./chunk-ZADYEZY4.js";
28
28
  import {
29
29
  handleMcpGetSse
30
30
  } from "./chunk-SRT6SHVZ.js";
@@ -37,10 +37,10 @@ import {
37
37
  processChatMessage,
38
38
  sessionBelongsToPrincipal,
39
39
  subscribeChatTranscript
40
- } from "./chunk-U6CMLAP4.js";
40
+ } from "./chunk-M7HFDWOS.js";
41
41
  import {
42
42
  RelayMissionStoreError
43
- } from "./chunk-UCY4EHAG.js";
43
+ } from "./chunk-A4TQFNRX.js";
44
44
  import {
45
45
  executeResolution,
46
46
  isValidResolutionVerb
@@ -65,7 +65,7 @@ import {
65
65
  } from "./chunk-AYHNTYVG.js";
66
66
  import {
67
67
  respondBriefingHttp
68
- } from "./chunk-SVUUOLKM.js";
68
+ } from "./chunk-VMKAA5SU.js";
69
69
  import {
70
70
  maybeHandleLifecycleFlush
71
71
  } from "./chunk-TIDEL77O.js";
@@ -76,11 +76,11 @@ import {
76
76
  authorizationProbeNamespaces,
77
77
  authorizationProbeRequiresPrincipalNamespace,
78
78
  probeOperationAuthorization
79
- } from "./chunk-HG42J2EX.js";
79
+ } from "./chunk-EQNZC3BH.js";
80
80
  import {
81
81
  getOperation,
82
82
  resolveQueryNamespaceWritablePreflight
83
- } from "./chunk-DCRK7I5E.js";
83
+ } from "./chunk-HUQMVI3A.js";
84
84
  import {
85
85
  handleWhoKnowsHttpQuery
86
86
  } from "./chunk-43IQRLEF.js";
@@ -3599,4 +3599,4 @@ export {
3599
3599
  resolveDefaultAdminConsolePublicDir,
3600
3600
  EngramAccessHttpServer
3601
3601
  };
3602
- //# sourceMappingURL=chunk-6KCQNFDQ.js.map
3602
+ //# sourceMappingURL=chunk-SOOWBRMH.js.map
@@ -20,6 +20,7 @@ import { lstatSync, readFileSync, readdirSync, statSync, unlinkSync } from "fs";
20
20
  import path from "path";
21
21
  var DIRECTORY_SIDECAR_BASENAME = "overview.md";
22
22
  var DIRECTORY_SIDECAR_MARKER = "<!-- remnic-directory-sidecar -->";
23
+ var NEIGHBORHOOD_ABSTRACT_LABEL = "Neighborhood:";
23
24
  var ABSTRACT_MAX_CHARS = 256;
24
25
  var OVERVIEW_MAX_CHARS = 4e3;
25
26
  var DEFAULT_QUERY_LIMIT = 5;
@@ -280,7 +281,7 @@ async function findDirectorySidecarsForQuery(memoryDir, query, options = {}) {
280
281
  const matches = [];
281
282
  for (const root of scopeRoots(scope)) {
282
283
  for (const dir of collectSidecarDirs(root)) {
283
- const sidecar = await loadDirectorySidecar(dir);
284
+ const sidecar = await loadDirectorySidecar(dir, { refresh: options.refresh });
284
285
  if (!sidecar) continue;
285
286
  const abstractLower = sidecar.abstract.toLowerCase();
286
287
  const overviewLower = sidecar.overview.toLowerCase();
@@ -296,16 +297,51 @@ async function findDirectorySidecarsForQuery(memoryDir, query, options = {}) {
296
297
  const limit = options.limit ?? DEFAULT_QUERY_LIMIT;
297
298
  return matches.filter((candidate) => !matches.some((other) => other.dir.startsWith(`${candidate.dir}${path.sep}`))).slice(0, limit);
298
299
  }
300
+ function attachNeighborhoodAbstract(snippet, abstract) {
301
+ const line = `${NEIGHBORHOOD_ABSTRACT_LABEL} ${abstract}`;
302
+ if (snippet === line || snippet.startsWith(`${line}
303
+ `)) return snippet;
304
+ return snippet.length === 0 ? line : `${line}
305
+ ${snippet}`;
306
+ }
307
+ function mostSpecificSidecarForHit(memoryDir, hitPath, matches) {
308
+ if (path.basename(hitPath) === DIRECTORY_SIDECAR_BASENAME) return null;
309
+ const abs = path.isAbsolute(hitPath) ? path.resolve(hitPath) : path.resolve(memoryDir, hitPath);
310
+ let best = null;
311
+ for (const match of matches) {
312
+ const rel = path.relative(match.dir, abs);
313
+ if (rel === "" || rel.startsWith("..") || path.isAbsolute(rel)) continue;
314
+ if (best === null || match.dir.length > best.dir.length) best = match;
315
+ }
316
+ return best;
317
+ }
318
+ async function applyDirectorySidecarDrillDown(memoryDir, query, hits, options = {}) {
319
+ if (options.enabled !== true) return [...hits];
320
+ const matches = await findDirectorySidecarsForQuery(memoryDir, query, {
321
+ namespace: options.namespace,
322
+ refresh: false
323
+ });
324
+ const fresh = matches.filter((match) => match.fresh && match.abstract.length > 0);
325
+ if (fresh.length === 0) return [...hits];
326
+ return hits.map((hit) => {
327
+ const match = mostSpecificSidecarForHit(memoryDir, hit.path, fresh);
328
+ if (!match) return hit;
329
+ const snippet = attachNeighborhoodAbstract(hit.snippet, match.abstract);
330
+ return snippet === hit.snippet ? hit : { ...hit, snippet };
331
+ });
332
+ }
299
333
 
300
334
  export {
301
335
  DIRECTORY_SIDECAR_BASENAME,
302
336
  DIRECTORY_SIDECAR_MARKER,
337
+ NEIGHBORHOOD_ABSTRACT_LABEL,
303
338
  parseDirectorySidecarsEnabled,
304
339
  directoryFingerprint,
305
340
  directorySidecarAncestry,
306
341
  runDirectorySidecarMaintenance,
307
342
  refreshDirectorySidecarsAfterWrite,
308
343
  loadDirectorySidecar,
309
- findDirectorySidecarsForQuery
344
+ findDirectorySidecarsForQuery,
345
+ applyDirectorySidecarDrillDown
310
346
  };
311
- //# sourceMappingURL=chunk-72AV2H3R.js.map
347
+ //# sourceMappingURL=chunk-U3NBO4IX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/directory-sidecars.ts"],"sourcesContent":["/**\n * @remnic/core — per-directory abstract/overview sidecars (issue #2977).\n *\n * One derived `overview.md` per memory directory (category roots and every\n * directory beneath them, including `namespaces/<ns>/` subtrees), rendered\n * bottom-up from existing memory content:\n *\n * - the ABSTRACT is a single line (<=256 chars) composed from child titles;\n * - the OVERVIEW body lists one preview line per child memory and embeds\n * each child DIRECTORY's abstract, so a parent summarizes its subtree\n * without embedding full child overviews.\n *\n * Determinism: no LLM, no embeddings. Content is assembled with the same\n * preview machinery the OKF index files use (`normalizeProjectionPreview`).\n *\n * Invalidation: each sidecar stores a content-free fingerprint of its subtree\n * (child name|size|mtime for files, recursive fingerprints for child dirs).\n * Any add/edit/delete anywhere below a directory changes its fingerprint, so\n * `loadDirectorySidecar` can detect staleness with `readdir`+`stat` alone and\n * refresh without reading child memory files first. Eager regeneration runs\n * through {@link runDirectorySidecarMaintenance}; lazy refresh on read covers\n * direct-write paths that bypass scheduled maintenance (Gotcha #43).\n *\n * Isolation: sidecars are derived artifacts, excluded from generic recall via\n * `isGenericRecallExcludedPath` (basename match, the same tradeoff OKF makes\n * for `index.md`/`log.md`) while staying full-text searchable. Files at the\n * sidecar path WITHOUT the marker are user content: never overwritten, never\n * removed.\n *\n * Layer 2: {@link refreshDirectorySidecarsAfterWrite} refreshes only the\n * changed directory and its category ancestors. `enabled: false` is a\n * proven no-op (no reads, no writes).\n *\n * Layer 3 (this slice): {@link applyDirectorySidecarDrillDown} scores\n * fresh sidecars and attaches the winning directory's abstract to hits.\n * `enabled` stays a function argument — not a parseConfig key (`config.ts`\n * and `types.ts` are at their file-size ratchets). Retrieval never writes.\n * xray trajectory, storage write-hook, parseConfig wiring, and LLM\n * summarization remain later layers on #2977.\n */\n\nimport { createHash } from \"node:crypto\";\nimport { lstatSync, readFileSync, readdirSync, statSync, unlinkSync } from \"node:fs\";\nimport path from \"node:path\";\n\nimport { coerceBooleanLike } from \"./connectors/coerce.js\";\nimport { writeFileAtomically } from \"./maintenance/atomic-file.js\";\nimport { normalizeProjectionPreview } from \"./memory-projection-format.js\";\nimport { OKF_RESERVED_BASENAMES } from \"./okf/type-mapping.js\";\nimport { RECALL_FALLBACK_DIRS } from \"./utils/category-dir.js\";\n\nexport const DIRECTORY_SIDECAR_BASENAME = \"overview.md\";\nexport const DIRECTORY_SIDECAR_MARKER = \"<!-- remnic-directory-sidecar -->\";\n/** Prefix prepended to a hit snippet when a fresh directory abstract attaches. */\nexport const NEIGHBORHOOD_ABSTRACT_LABEL = \"Neighborhood:\";\n\nconst ABSTRACT_MAX_CHARS = 256;\nconst OVERVIEW_MAX_CHARS = 4000;\nconst DEFAULT_QUERY_LIMIT = 5;\nconst CATEGORY_ROOTS: ReadonlySet<string> = new Set(RECALL_FALLBACK_DIRS);\n\n/** Config fields this slice owns. Mix into `PluginConfig` in a later layer. */\nexport interface DirectorySidecarSettings {\n /** Populate sidecars on memory writes. Default false. */\n directorySidecarsEnabled: boolean;\n}\n\n/** Strict off-default: only an explicit true/\"true\"/1 opts in. */\nexport function parseDirectorySidecarsEnabled(raw: unknown): boolean {\n return coerceBooleanLike(raw, \"directorySidecarsEnabled\") === true;\n}\n\n/** Basenames never treated as child memories (ours plus OKF's reserved ones). */\nconst RESERVED_CHILD_BASENAMES: Readonly<Record<string, true>> = Object.freeze({\n ...OKF_RESERVED_BASENAMES,\n [DIRECTORY_SIDECAR_BASENAME]: true,\n});\n\nexport interface DirectorySidecar {\n /** Absolute directory the sidecar describes. */\n readonly dir: string;\n /** Single-line L0 abstract (<=256 chars). */\n readonly abstract: string;\n /** Abstract plus the per-child preview body (<=4000 chars). */\n readonly overview: string;\n /** Number of memory `.md` children in this directory. */\n readonly childCount: number;\n /** False when the stored fingerprint no longer matches the subtree. */\n readonly fresh: boolean;\n}\n\nexport interface DirectorySidecarMatch extends DirectorySidecar {\n readonly score: number;\n}\n\n/** Minimal hit shape drill-down mutates. Extra fields pass through. */\nexport interface DirectorySidecarHit {\n path: string;\n snippet: string;\n score: number;\n}\n\nexport interface DirectorySidecarReport {\n written: string[];\n removed: string[];\n}\n\ninterface ParsedSidecar {\n abstract: string;\n overview: string;\n childCount: number;\n fingerprint: string;\n}\n\nfunction listEntries(dir: string) {\n try {\n return readdirSync(dir, { withFileTypes: true });\n } catch {\n return [];\n }\n}\n\n/** Root check that refuses symlinks (fs-boundary rule, PRs #1938/#1999). */\nfunction isRealDirectory(entryPath: string): boolean {\n try {\n const stats = lstatSync(entryPath);\n return !stats.isSymbolicLink() && stats.isDirectory();\n } catch {\n return false;\n }\n}\n\nfunction memoryChildren(dir: string): string[] {\n // Dirent.isFile() is false for symlinks, so a linked memory never enters the corpus.\n return listEntries(dir)\n .filter((entry) => entry.isFile() && !RESERVED_CHILD_BASENAMES[entry.name] && entry.name.endsWith(\".md\"))\n .map((entry) => entry.name)\n .sort((a, b) => a.localeCompare(b));\n}\n\nfunction directoryChildren(dir: string): string[] {\n // Dirent.isDirectory() is false for symlinks (fs-boundary rule, PRs #1938/#1999).\n return listEntries(dir)\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name)\n .sort((a, b) => a.localeCompare(b));\n}\n\n/**\n * Content-free subtree fingerprint: sha256 over sorted child descriptors.\n * Files contribute `name|size|mtimeMs`; directories contribute their own\n * recursive fingerprint, so any change below a directory invalidates every\n * ancestor. Reads no file contents.\n */\nexport function directoryFingerprint(dir: string): string {\n const hash = createHash(\"sha256\");\n for (const name of memoryChildren(dir)) {\n try {\n const stats = statSync(path.join(dir, name));\n hash.update(`f|${name}|${stats.size}|${Math.trunc(stats.mtimeMs)}\\n`);\n } catch {\n hash.update(`f|${name}|missing\\n`);\n }\n }\n for (const name of directoryChildren(dir)) {\n hash.update(`d|${name}|${directoryFingerprint(path.join(dir, name))}\\n`);\n }\n return hash.digest(\"hex\");\n}\n\nfunction readFileOrNull(target: string): string | null {\n try {\n return readFileSync(target, \"utf8\");\n } catch {\n return null;\n }\n}\n\nfunction parseSidecar(content: string): ParsedSidecar | null {\n if (!content.startsWith(DIRECTORY_SIDECAR_MARKER)) return null;\n const fingerprint = /^fingerprint: ([0-9a-f]{64})$/m.exec(content)?.[1];\n if (!fingerprint) return null;\n const abstract = /^## Abstract\\n([^\\n]+)$/m.exec(content)?.[1] ?? \"\";\n const overviewStart = content.indexOf(\"## Abstract\");\n const overview =\n overviewStart === -1 ? \"\" : content.slice(overviewStart, overviewStart + OVERVIEW_MAX_CHARS).trim();\n // The `* name — preview` child bullets are the rendered child count.\n const childCount = (content.match(/^\\* .+$/gm) ?? []).length;\n return { abstract, overview, childCount, fingerprint };\n}\n\nfunction sidecarPath(dir: string): string {\n return path.join(dir, DIRECTORY_SIDECAR_BASENAME);\n}\n\nfunction renderSidecar(dir: string, fingerprint: string, childAbstracts: Map<string, string>): string | null {\n const children = memoryChildren(dir);\n const childDirs = directoryChildren(dir).filter((name) => childAbstracts.has(path.join(dir, name)));\n if (children.length === 0 && childDirs.length === 0) return null;\n\n const previews = children.map((name) => {\n try {\n return normalizeProjectionPreview(readFileSync(path.join(dir, name), \"utf8\"), 120);\n } catch {\n return \"\";\n }\n });\n const titles = children.map(\n (name, index) => previews[index].split(\" \").slice(0, 8).join(\" \") || name.replace(/\\.md$/, \"\"),\n );\n const abstract = normalizeProjectionPreview(\n `${path.basename(dir)}/ — ${children.length} memories: ${titles.slice(0, 5).join(\" · \")}`,\n ABSTRACT_MAX_CHARS,\n );\n\n const lines = [\n DIRECTORY_SIDECAR_MARKER,\n `fingerprint: ${fingerprint}`,\n `# ${path.basename(dir)}/ overview`,\n \"\",\n \"## Abstract\",\n abstract,\n \"\",\n \"## Children\",\n ];\n for (const [index, name] of children.entries()) {\n lines.push(`* ${name} — ${previews[index]}`);\n }\n for (const name of childDirs) {\n lines.push(`### ${name}/`);\n lines.push(childAbstracts.get(path.join(dir, name)) ?? \"\");\n }\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\n/** Scope roots whose category subtrees carry sidecars: the memory root plus every namespace root. */\nfunction scopeRoots(memoryDir: string): string[] {\n const roots = [memoryDir];\n const namespacesRoot = path.join(memoryDir, \"namespaces\");\n for (const entry of listEntries(namespacesRoot)) {\n if (entry.isDirectory() && isRealDirectory(path.join(namespacesRoot, entry.name))) {\n roots.push(path.join(namespacesRoot, entry.name));\n }\n }\n return roots;\n}\n\n/**\n * Every directory that should carry a sidecar, deepest first (post-order) so\n * parents render after their children and can embed child abstracts.\n */\nfunction collectSidecarDirs(scopeRoot: string): string[] {\n const dirs: string[] = [];\n const walk = (dir: string, isCategoryRoot: boolean): boolean => {\n let carries = memoryChildren(dir).length > 0;\n for (const name of directoryChildren(dir)) {\n carries = walk(path.join(dir, name), false) || carries;\n }\n // A directory that stopped carrying memories must still be visited so its\n // orphaned sidecar can be pruned or rewritten (cache-invalidation completeness).\n const hasSidecar = readFileOrNull(sidecarPath(dir))?.startsWith(DIRECTORY_SIDECAR_MARKER) === true;\n if (isCategoryRoot || carries || hasSidecar) dirs.push(dir);\n return carries;\n };\n for (const category of RECALL_FALLBACK_DIRS) {\n const categoryDir = path.join(scopeRoot, category);\n if (!isRealDirectory(categoryDir)) continue;\n walk(categoryDir, true);\n }\n return dirs;\n}\n\nasync function syncSidecarDir(\n dir: string,\n enabled: boolean,\n childAbstracts: Map<string, string>,\n written: string[],\n removed: string[],\n): Promise<void> {\n const target = sidecarPath(dir);\n const raw = readFileOrNull(target);\n const existing = raw !== null && raw.startsWith(DIRECTORY_SIDECAR_MARKER) ? raw : null;\n if (!enabled) {\n if (existing !== null) {\n unlinkSync(target);\n removed.push(target);\n }\n return;\n }\n const next = renderSidecar(dir, directoryFingerprint(dir), childAbstracts);\n if (next === null) {\n if (existing !== null) {\n unlinkSync(target);\n removed.push(target);\n }\n return;\n }\n const parsedNext = parseSidecar(next);\n if (parsedNext) childAbstracts.set(dir, parsedNext.abstract);\n if (raw === next) return;\n if (existing === null && raw !== null) return; // user-authored file: hands off\n await writeFileAtomically(target, next);\n written.push(target);\n}\n\nfunction childAbstractsFromDisk(dir: string): Map<string, string> {\n const abstracts = new Map<string, string>();\n for (const name of directoryChildren(dir)) {\n const childDir = path.join(dir, name);\n const parsed = parseSidecar(readFileOrNull(sidecarPath(childDir)) ?? \"\");\n if (parsed) abstracts.set(childDir, parsed.abstract);\n }\n return abstracts;\n}\n\n/**\n * Category-root ancestry of a changed memory path, deepest first.\n * Paths outside a recall category return `[]` so writes to `state/` or\n * `namespaces/<ns>/` itself never mint a sidecar.\n */\nexport function directorySidecarAncestry(memoryDir: string, changedPath: string): string[] {\n const root = path.resolve(memoryDir);\n const abs = path.isAbsolute(changedPath) ? path.resolve(changedPath) : path.resolve(root, changedPath);\n const rel = path.relative(root, abs);\n if (rel.startsWith(\"..\") || path.isAbsolute(rel)) return [];\n const parts = rel.split(path.sep).filter(Boolean);\n const dirParts = isRealDirectory(abs) ? parts : parts.slice(0, -1);\n let categoryAt = -1;\n if (dirParts[0] === \"namespaces\" && dirParts.length >= 3 && CATEGORY_ROOTS.has(dirParts[2] ?? \"\")) {\n categoryAt = 2;\n } else if (CATEGORY_ROOTS.has(dirParts[0] ?? \"\")) {\n categoryAt = 0;\n }\n if (categoryAt === -1) return [];\n const dirs: string[] = [];\n for (let i = dirParts.length; i > categoryAt; i--) {\n dirs.push(path.join(root, ...dirParts.slice(0, i)));\n }\n return dirs;\n}\n\n/**\n * Regenerates directory sidecars incrementally. Unchanged sidecars are left\n * untouched; emptied directories lose theirs; user files at the sidecar path\n * (no marker) are never written or removed. With `enabled: false` every\n * generated sidecar is removed — the OKF index-maintenance contract.\n */\nexport async function runDirectorySidecarMaintenance(\n memoryDir: string,\n enabled: boolean,\n): Promise<DirectorySidecarReport> {\n const written: string[] = [];\n const removed: string[] = [];\n for (const scope of scopeRoots(memoryDir)) {\n const childAbstracts = new Map<string, string>();\n for (const dir of collectSidecarDirs(scope)) {\n await syncSidecarDir(dir, enabled, childAbstracts, written, removed);\n }\n }\n return { written, removed };\n}\n\n/**\n * Incremental write-path refresh: only the changed directory and its\n * category ancestors, using the same fingerprint/render path as maintenance.\n * `enabled: false` returns immediately — no readdir, no writes.\n */\nexport async function refreshDirectorySidecarsAfterWrite(\n memoryDir: string,\n changedPath: string,\n enabled: boolean,\n): Promise<DirectorySidecarReport> {\n if (!enabled) return { written: [], removed: [] };\n const written: string[] = [];\n const removed: string[] = [];\n for (const dir of directorySidecarAncestry(memoryDir, changedPath)) {\n await syncSidecarDir(dir, true, childAbstractsFromDisk(dir), written, removed);\n }\n return { written, removed };\n}\n\n/**\n * Read a directory's sidecar for retrieval. By default a stale sidecar is\n * refreshed in place (child directories first), which is what makes direct\n * writes that bypass maintenance still converge. With `{ refresh: false }`\n * the stored sidecar is returned as-is with `fresh: false` so callers can\n * observe staleness without writes.\n */\nexport async function loadDirectorySidecar(\n dir: string,\n options: { refresh?: boolean } = {},\n): Promise<DirectorySidecar | null> {\n const refresh = options.refresh !== false;\n const target = sidecarPath(dir);\n const stored = readFileOrNull(target);\n const generated = stored !== null && stored.startsWith(DIRECTORY_SIDECAR_MARKER);\n const parsed = generated ? parseSidecar(stored) : null;\n const fingerprint = directoryFingerprint(dir);\n if (parsed !== null && (parsed.fingerprint === fingerprint || !refresh)) {\n return {\n dir,\n abstract: parsed.abstract,\n overview: parsed.overview,\n childCount: parsed.childCount,\n fresh: parsed.fingerprint === fingerprint,\n };\n }\n if (!refresh) return null;\n\n // Refresh bottom-up so this directory's body embeds current child abstracts.\n const childAbstracts = new Map<string, string>();\n for (const name of directoryChildren(dir)) {\n const child = await loadDirectorySidecar(path.join(dir, name));\n if (child) childAbstracts.set(path.join(dir, name), child.abstract);\n }\n const next = renderSidecar(dir, directoryFingerprint(dir), childAbstracts);\n if (next === null) {\n if (generated) unlinkSync(target);\n return null;\n }\n if (readFileOrNull(target) !== next) {\n if (stored !== null && !generated) {\n // User-authored file at the sidecar path: serve nothing rather than clobber it.\n return null;\n }\n await writeFileAtomically(target, next);\n }\n const refreshed = parseSidecar(next);\n return refreshed\n ? {\n dir,\n abstract: refreshed.abstract,\n overview: refreshed.overview,\n childCount: refreshed.childCount,\n fresh: true,\n }\n : null;\n}\n\n/**\n * Overview-query primitive for hierarchical retrieval (layer 1 of #2977):\n * score every sidecar's abstract (+3 per query term) and overview (+1 per\n * term) lexically, then return the most specific matches — when both a\n * directory and its descendant match, only the descendant is kept, matching\n * the drill-down semantics the full retrieval mode will build on.\n */\nexport async function findDirectorySidecarsForQuery(\n memoryDir: string,\n query: string,\n options: { namespace?: string; limit?: number; refresh?: boolean } = {},\n): Promise<DirectorySidecarMatch[]> {\n const scope = options.namespace ? path.join(memoryDir, \"namespaces\", options.namespace) : memoryDir;\n if (!isRealDirectory(scope)) return [];\n const terms = query\n .toLowerCase()\n .split(/[^a-z0-9]+/)\n .filter((term) => term.length >= 2);\n\n const matches: DirectorySidecarMatch[] = [];\n for (const root of scopeRoots(scope)) {\n for (const dir of collectSidecarDirs(root)) {\n const sidecar = await loadDirectorySidecar(dir, { refresh: options.refresh });\n if (!sidecar) continue;\n const abstractLower = sidecar.abstract.toLowerCase();\n const overviewLower = sidecar.overview.toLowerCase();\n let score = 0;\n for (const term of terms) {\n if (abstractLower.includes(term)) score += 3;\n else if (overviewLower.includes(term)) score += 1;\n }\n if (score > 0) matches.push({ ...sidecar, score });\n }\n }\n matches.sort((a, b) => b.score - a.score || a.dir.localeCompare(b.dir));\n\n const limit = options.limit ?? DEFAULT_QUERY_LIMIT;\n return matches\n .filter((candidate) => !matches.some((other) => other.dir.startsWith(`${candidate.dir}${path.sep}`)))\n .slice(0, limit);\n}\n\nfunction attachNeighborhoodAbstract(snippet: string, abstract: string): string {\n const line = `${NEIGHBORHOOD_ABSTRACT_LABEL} ${abstract}`;\n if (snippet === line || snippet.startsWith(`${line}\\n`)) return snippet;\n return snippet.length === 0 ? line : `${line}\\n${snippet}`;\n}\n\nfunction mostSpecificSidecarForHit(\n memoryDir: string,\n hitPath: string,\n matches: readonly DirectorySidecarMatch[],\n): DirectorySidecarMatch | null {\n if (path.basename(hitPath) === DIRECTORY_SIDECAR_BASENAME) return null;\n const abs = path.isAbsolute(hitPath) ? path.resolve(hitPath) : path.resolve(memoryDir, hitPath);\n let best: DirectorySidecarMatch | null = null;\n for (const match of matches) {\n const rel = path.relative(match.dir, abs);\n if (rel === \"\" || rel.startsWith(\"..\") || path.isAbsolute(rel)) continue;\n if (best === null || match.dir.length > best.dir.length) best = match;\n }\n return best;\n}\n\n/**\n * Retrieval drill-down (layer 3 of #2977): score fresh directory sidecars\n * and attach the winning neighborhood abstract to hits under that directory.\n * `enabled: false` (the default) returns hits unchanged with no I/O.\n * Never writes. Does not reorder. parseConfig is not consulted.\n */\nexport async function applyDirectorySidecarDrillDown<T extends DirectorySidecarHit>(\n memoryDir: string,\n query: string,\n hits: readonly T[],\n options: { enabled?: boolean; namespace?: string } = {},\n): Promise<T[]> {\n if (options.enabled !== true) return [...hits];\n const matches = await findDirectorySidecarsForQuery(memoryDir, query, {\n namespace: options.namespace,\n refresh: false,\n });\n const fresh = matches.filter((match) => match.fresh && match.abstract.length > 0);\n if (fresh.length === 0) return [...hits];\n return hits.map((hit) => {\n const match = mostSpecificSidecarForHit(memoryDir, hit.path, fresh);\n if (!match) return hit;\n const snippet = attachNeighborhoodAbstract(hit.snippet, match.abstract);\n return snippet === hit.snippet ? hit : { ...hit, snippet };\n });\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  isGenericRecallExcludedPath
3
- } from "./chunk-TEQQQTQS.js";
3
+ } from "./chunk-2HJKAVAS.js";
4
4
  import {
5
5
  normalizeProjectionPreview
6
6
  } from "./chunk-SCU65EZI.js";
@@ -209,4 +209,4 @@ export {
209
209
  browsePatternMatches,
210
210
  runMemoryBrowse
211
211
  };
212
- //# sourceMappingURL=chunk-EW3Y73MN.js.map
212
+ //# sourceMappingURL=chunk-UJBIWY5M.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getOperation
3
- } from "./chunk-DCRK7I5E.js";
3
+ } from "./chunk-HUQMVI3A.js";
4
4
  import {
5
5
  EngramAccessInputError
6
6
  } from "./chunk-2Z24E5W2.js";
@@ -21,4 +21,4 @@ async function respondBriefingHttp(options) {
21
21
  export {
22
22
  respondBriefingHttp
23
23
  };
24
- //# sourceMappingURL=chunk-SVUUOLKM.js.map
24
+ //# sourceMappingURL=chunk-VMKAA5SU.js.map
@@ -11,7 +11,7 @@ import {
11
11
  } from "./chunk-NHLLKEKK.js";
12
12
  import {
13
13
  parseConfig
14
- } from "./chunk-UVZBDIJX.js";
14
+ } from "./chunk-KGY6F4VJ.js";
15
15
  import {
16
16
  resolveObjectiveStateStoreDir,
17
17
  validateObjectiveStateSnapshot
@@ -268,4 +268,4 @@ export {
268
268
  recordResumeBundle,
269
269
  getResumeBundleStatus
270
270
  };
271
- //# sourceMappingURL=chunk-JE4H2QBO.js.map
271
+ //# sourceMappingURL=chunk-WJ5KWJLK.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  SupportPassportError,
3
3
  getOperation
4
- } from "./chunk-DCRK7I5E.js";
4
+ } from "./chunk-HUQMVI3A.js";
5
5
  import {
6
6
  abortError,
7
7
  isAbortError
@@ -499,4 +499,4 @@ export {
499
499
  buildSupportPassportPublicRequestHandler,
500
500
  composeSupportPassportExternalRequestHandlers
501
501
  };
502
- //# sourceMappingURL=chunk-UQTXER7M.js.map
502
+ //# sourceMappingURL=chunk-ZADYEZY4.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  defineOperation
3
- } from "./chunk-DCRK7I5E.js";
3
+ } from "./chunk-HUQMVI3A.js";
4
4
  import {
5
5
  EngramAccessInputError
6
6
  } from "./chunk-2Z24E5W2.js";
@@ -71,4 +71,4 @@ defineOperation({
71
71
  })
72
72
  })
73
73
  });
74
- //# sourceMappingURL=chunk-2INZSV27.js.map
74
+ //# sourceMappingURL=chunk-ZANEMAEV.js.map
@@ -101,7 +101,7 @@ import {
101
101
  buildResumeBundleFromState,
102
102
  getResumeBundleStatus,
103
103
  recordResumeBundle
104
- } from "./chunk-JE4H2QBO.js";
104
+ } from "./chunk-WJ5KWJLK.js";
105
105
  import {
106
106
  getWorkProductLedgerStatus,
107
107
  recordWorkProductLedgerEntry,
@@ -134,7 +134,7 @@ import {
134
134
  runOperatorInventory,
135
135
  runOperatorRepair,
136
136
  runOperatorSetup
137
- } from "./chunk-SEQ6DWXD.js";
137
+ } from "./chunk-5IKW2VP6.js";
138
138
  import {
139
139
  analyzeSessionIntegrity,
140
140
  applySessionRepair,
@@ -197,7 +197,7 @@ import {
197
197
  } from "./chunk-6TBIWIAG.js";
198
198
  import {
199
199
  parseConfig
200
- } from "./chunk-UVZBDIJX.js";
200
+ } from "./chunk-KGY6F4VJ.js";
201
201
  import {
202
202
  applyManagedRegion,
203
203
  expandVaultTemplateTokens,
@@ -210,7 +210,7 @@ import {
210
210
  import {
211
211
  EngramAccessHttpServer,
212
212
  MeetingsInputError
213
- } from "./chunk-6KCQNFDQ.js";
213
+ } from "./chunk-SOOWBRMH.js";
214
214
  import {
215
215
  WearablesInputError
216
216
  } from "./chunk-V7IZKJI3.js";
@@ -220,10 +220,10 @@ import {
220
220
  loadChatSession,
221
221
  processChatMessage,
222
222
  sessionBelongsToPrincipal
223
- } from "./chunk-U6CMLAP4.js";
223
+ } from "./chunk-M7HFDWOS.js";
224
224
  import {
225
225
  EngramAccessService
226
- } from "./chunk-DCRK7I5E.js";
226
+ } from "./chunk-HUQMVI3A.js";
227
227
  import {
228
228
  WorkStorage
229
229
  } from "./chunk-MPC7TYTZ.js";
@@ -249,7 +249,7 @@ import {
249
249
  } from "./chunk-HM7RHKS4.js";
250
250
  import {
251
251
  journalPath
252
- } from "./chunk-TEQQQTQS.js";
252
+ } from "./chunk-2HJKAVAS.js";
253
253
  import {
254
254
  searchHarmonicRetrieval
255
255
  } from "./chunk-TQT4AOPO.js";
@@ -9779,4 +9779,4 @@ export {
9779
9779
  listMemoryMarkdownFilePaths,
9780
9780
  registerCli
9781
9781
  };
9782
- //# sourceMappingURL=chunk-SOFATSHJ.js.map
9782
+ //# sourceMappingURL=chunk-ZHV6FGVF.js.map
@@ -5,7 +5,7 @@ import { M as MemoryFile, m as MemoryFrontmatter, x as MemoryStatus, ad as Behav
5
5
  import { C as ConversationIndexCoordinator, T as TierMigrationCoordinator, O as Orchestrator } from './orchestrator-iexgVLow.js';
6
6
  import { S as StorageManager } from './storage-CMm-3aD3.js';
7
7
  import { TrustZoneDemoSeedResult, TrustZoneName, TrustZonePromotionResult, TrustZoneStoreStatus } from './trust-zones.js';
8
- import { f as EngramAccessService } from './access-service-CUNM5RfA.js';
8
+ import { f as EngramAccessService } from './access-service-H-qEdnSs.js';
9
9
  import { Writable, Readable } from 'node:stream';
10
10
  import { ResolveSecretRefFn } from './resolve-auth-token.js';
11
11
  import { CausalTrajectoryStoreStatus } from './causal-trajectory.js';
package/dist/cli.d.ts CHANGED
@@ -5,8 +5,8 @@ import './types-Du6VdoAg.js';
5
5
  import './orchestrator-iexgVLow.js';
6
6
  import './storage-CMm-3aD3.js';
7
7
  import './trust-zones.js';
8
- export { c as AccessHttpServeCliCommandOptions, d as ArchiveObservationsCliCommandOptions, e as AuditMemoryCliCommandOptions, B as BulkImportCliCommandOptions, C as CliApi, g as CliCommand, h as CliProgram, i as CompatCliCommandOptions, j as ConnectorsRunCliOutputOptions, k as ConversationIndexHealthCliOrchestrator, D as DashboardStartCliCommandOptions, l as DedupeCandidate, E as ExactDedupePlan, G as GraphHealthCliCommandOptions, M as MemoryActionAuditCliCommandOptions, m as MemoryActionAuditCliNamespaceSummary, n as MemoryActionAuditCliReport, o as MemoryGovernanceCliCommandOptions, q as MemoryGovernanceReportCliCommandOptions, s as MemoryGovernanceRestoreCliCommandOptions, t as MemoryReviewDispositionCliCommandOptions, u as MemoryTimelineCliCommandOptions, v as MigrateCliOrchestrator, w as MigrateCliReport, x as MigrateObservationsCliCommandOptions, P as PolicyDiffCliReport, y as PolicyDiffEntry, z as PolicyRollbackCliReport, F as PolicyStatusCliReport, H as PolicyTuningCliOrchestrator, R as RebuildMemoryLifecycleLedgerCliCommandOptions, I as RebuildMemoryProjectionCliCommandOptions, J as RebuildObservationsCliCommandOptions, K as RepairMemoryProjectionCliCommandOptions, L as ReplayCliCommandOptions, N as ReplayCliOrchestrator, O as RouteCliCommandOptions, S as SessionIntegrityCliCommandOptions, Q as SessionRepairCliCommandOptions, T as TailscaleStatusCliCommandOptions, U as TailscaleSyncCliCommandOptions, V as TierMigrateCliAdapter, W as TierMigrateCoordinatorCliAdapter, X as TierMigrateLegacyCliAdapter, Y as TierStatusCliAdapter, Z as TierStatusCoordinatorCliAdapter, _ as TierStatusLegacyCliAdapter, $ as TrainingExportCliCommandOptions, a0 as VerifyMemoryProjectionCliCommandOptions, a1 as WebDavServeCliCommandOptions, a2 as WorkProjectCliCommandOptions, a3 as WorkTaskCliCommandOptions, a4 as emitConnectorsRunCliResult, a5 as filterNormalMemorySearchResults, a6 as hasDestructivePurgeFailures, a7 as isNormalRetrievalVisibleMemory, a8 as listMemoryMarkdownFilePaths, a9 as parseDurationToMs, aa as parseStrictCliDate, ab as planAggressiveDuplicateDeletions, ac as planExactDuplicateDeletions, ad as registerCli, ae as resolveAccessPrincipalOverride, af as resolveMemoryDirForNamespace, ag as runAbstractionNodeStatusCliCommand, ah as runAccessHttpServeCliCommand, ai as runAccessHttpStatusCliCommand, aj as runAccessHttpStopCliCommand, ak as runAccessMcpServeCliCommand, al as runArchiveObservationsCliCommand, r as runAuditMemoryCliCommand, am as runBenchmarkBaselineReportCliCommand, an as runBenchmarkBaselineSnapshotCliCommand, ao as runBenchmarkCiGateCliCommand, ap as runBenchmarkImportCliCommand, aq as runBenchmarkStatusCliCommand, ar as runBenchmarkStoredBaselineCiGateCliCommand, as as runBenchmarkValidateCliCommand, b as runBulkImportCliCommand, at as runCausalTrajectoryStatusCliCommand, au as runCommitmentLifecycleCliCommand, av as runCommitmentRecordCliCommand, aw as runCommitmentSetStateCliCommand, ax as runCommitmentStatusCliCommand, ay as runCompatCliCommand, az as runCompoundingPromoteCliCommand, aA as runConversationIndexHealthCliCommand, aB as runConversationIndexInspectCliCommand, aC as runConversationIndexRebuildCliCommand, aD as runCueAnchorStatusCliCommand, aE as runDashboardStartCliCommand, aF as runDashboardStatusCliCommand, aG as runDashboardStopCliCommand, aH as runGraphHealthCliCommand, aI as runHarmonicSearchCliCommand, aJ as runMemoryActionAuditCliCommand, aK as runMemoryGovernanceCliCommand, aL as runMemoryGovernanceReportCliCommand, aM as runMemoryGovernanceRestoreCliCommand, aN as runMemoryReviewDispositionCliCommand, aO as runMemoryTimelineCliCommand, aP as runMigrateNormalizeFrontmatterCliCommand, aQ as runMigrateObservationsCliCommand, aR as runMigrateRechunkCliCommand, aS as runMigrateReextractCliCommand, aT as runMigrateRescoreImportanceCliCommand, aU as runObjectiveStateStatusCliCommand, aV as runPolicyDiffCliCommand, aW as runPolicyRollbackCliCommand, aX as runPolicyStatusCliCommand, aY as runRebuildMemoryLifecycleLedgerCliCommand, aZ as runRebuildMemoryProjectionCliCommand, a_ as runRebuildObservationsCliCommand, a$ as runRepairMemoryProjectionCliCommand, b0 as runReplayCliCommand, b1 as runResumeBundleBuildCliCommand, b2 as runResumeBundleRecordCliCommand, b3 as runResumeBundleStatusCliCommand, b4 as runRouteCliCommand, b5 as runSemanticRulePromoteCliCommand, b6 as runSemanticRuleVerifyCliCommand, b7 as runSessionCheckCliCommand, b8 as runSessionRepairCliCommand, b9 as runTailscaleStatusCliCommand, ba as runTailscaleSyncCliCommand, bb as runTierMigrateCliCommand, bc as runTierStatusCliCommand, bd as runTrainingExportCliCommand, be as runTrustZoneDemoSeedCliCommand, bf as runTrustZonePromoteCliCommand, bg as runTrustZoneStatusCliCommand, bh as runUtilityLearningCliCommand, bi as runUtilityLearningStatusCliCommand, bj as runUtilityTelemetryRecordCliCommand, bk as runUtilityTelemetryStatusCliCommand, bl as runVerifiedRecallSearchCliCommand, bm as runVerifyMemoryProjectionCliCommand, bn as runWebDavServeCliCommand, bo as runWebDavStopCliCommand, bp as runWorkProductRecallSearchCliCommand, bq as runWorkProductRecordCliCommand, br as runWorkProductStatusCliCommand, bs as runWorkProjectCliCommand, bt as runWorkTaskCliCommand } from './cli-CCc34xV7.js';
9
- import './access-service-CUNM5RfA.js';
8
+ export { c as AccessHttpServeCliCommandOptions, d as ArchiveObservationsCliCommandOptions, e as AuditMemoryCliCommandOptions, B as BulkImportCliCommandOptions, C as CliApi, g as CliCommand, h as CliProgram, i as CompatCliCommandOptions, j as ConnectorsRunCliOutputOptions, k as ConversationIndexHealthCliOrchestrator, D as DashboardStartCliCommandOptions, l as DedupeCandidate, E as ExactDedupePlan, G as GraphHealthCliCommandOptions, M as MemoryActionAuditCliCommandOptions, m as MemoryActionAuditCliNamespaceSummary, n as MemoryActionAuditCliReport, o as MemoryGovernanceCliCommandOptions, q as MemoryGovernanceReportCliCommandOptions, s as MemoryGovernanceRestoreCliCommandOptions, t as MemoryReviewDispositionCliCommandOptions, u as MemoryTimelineCliCommandOptions, v as MigrateCliOrchestrator, w as MigrateCliReport, x as MigrateObservationsCliCommandOptions, P as PolicyDiffCliReport, y as PolicyDiffEntry, z as PolicyRollbackCliReport, F as PolicyStatusCliReport, H as PolicyTuningCliOrchestrator, R as RebuildMemoryLifecycleLedgerCliCommandOptions, I as RebuildMemoryProjectionCliCommandOptions, J as RebuildObservationsCliCommandOptions, K as RepairMemoryProjectionCliCommandOptions, L as ReplayCliCommandOptions, N as ReplayCliOrchestrator, O as RouteCliCommandOptions, S as SessionIntegrityCliCommandOptions, Q as SessionRepairCliCommandOptions, T as TailscaleStatusCliCommandOptions, U as TailscaleSyncCliCommandOptions, V as TierMigrateCliAdapter, W as TierMigrateCoordinatorCliAdapter, X as TierMigrateLegacyCliAdapter, Y as TierStatusCliAdapter, Z as TierStatusCoordinatorCliAdapter, _ as TierStatusLegacyCliAdapter, $ as TrainingExportCliCommandOptions, a0 as VerifyMemoryProjectionCliCommandOptions, a1 as WebDavServeCliCommandOptions, a2 as WorkProjectCliCommandOptions, a3 as WorkTaskCliCommandOptions, a4 as emitConnectorsRunCliResult, a5 as filterNormalMemorySearchResults, a6 as hasDestructivePurgeFailures, a7 as isNormalRetrievalVisibleMemory, a8 as listMemoryMarkdownFilePaths, a9 as parseDurationToMs, aa as parseStrictCliDate, ab as planAggressiveDuplicateDeletions, ac as planExactDuplicateDeletions, ad as registerCli, ae as resolveAccessPrincipalOverride, af as resolveMemoryDirForNamespace, ag as runAbstractionNodeStatusCliCommand, ah as runAccessHttpServeCliCommand, ai as runAccessHttpStatusCliCommand, aj as runAccessHttpStopCliCommand, ak as runAccessMcpServeCliCommand, al as runArchiveObservationsCliCommand, r as runAuditMemoryCliCommand, am as runBenchmarkBaselineReportCliCommand, an as runBenchmarkBaselineSnapshotCliCommand, ao as runBenchmarkCiGateCliCommand, ap as runBenchmarkImportCliCommand, aq as runBenchmarkStatusCliCommand, ar as runBenchmarkStoredBaselineCiGateCliCommand, as as runBenchmarkValidateCliCommand, b as runBulkImportCliCommand, at as runCausalTrajectoryStatusCliCommand, au as runCommitmentLifecycleCliCommand, av as runCommitmentRecordCliCommand, aw as runCommitmentSetStateCliCommand, ax as runCommitmentStatusCliCommand, ay as runCompatCliCommand, az as runCompoundingPromoteCliCommand, aA as runConversationIndexHealthCliCommand, aB as runConversationIndexInspectCliCommand, aC as runConversationIndexRebuildCliCommand, aD as runCueAnchorStatusCliCommand, aE as runDashboardStartCliCommand, aF as runDashboardStatusCliCommand, aG as runDashboardStopCliCommand, aH as runGraphHealthCliCommand, aI as runHarmonicSearchCliCommand, aJ as runMemoryActionAuditCliCommand, aK as runMemoryGovernanceCliCommand, aL as runMemoryGovernanceReportCliCommand, aM as runMemoryGovernanceRestoreCliCommand, aN as runMemoryReviewDispositionCliCommand, aO as runMemoryTimelineCliCommand, aP as runMigrateNormalizeFrontmatterCliCommand, aQ as runMigrateObservationsCliCommand, aR as runMigrateRechunkCliCommand, aS as runMigrateReextractCliCommand, aT as runMigrateRescoreImportanceCliCommand, aU as runObjectiveStateStatusCliCommand, aV as runPolicyDiffCliCommand, aW as runPolicyRollbackCliCommand, aX as runPolicyStatusCliCommand, aY as runRebuildMemoryLifecycleLedgerCliCommand, aZ as runRebuildMemoryProjectionCliCommand, a_ as runRebuildObservationsCliCommand, a$ as runRepairMemoryProjectionCliCommand, b0 as runReplayCliCommand, b1 as runResumeBundleBuildCliCommand, b2 as runResumeBundleRecordCliCommand, b3 as runResumeBundleStatusCliCommand, b4 as runRouteCliCommand, b5 as runSemanticRulePromoteCliCommand, b6 as runSemanticRuleVerifyCliCommand, b7 as runSessionCheckCliCommand, b8 as runSessionRepairCliCommand, b9 as runTailscaleStatusCliCommand, ba as runTailscaleSyncCliCommand, bb as runTierMigrateCliCommand, bc as runTierStatusCliCommand, bd as runTrainingExportCliCommand, be as runTrustZoneDemoSeedCliCommand, bf as runTrustZonePromoteCliCommand, bg as runTrustZoneStatusCliCommand, bh as runUtilityLearningCliCommand, bi as runUtilityLearningStatusCliCommand, bj as runUtilityTelemetryRecordCliCommand, bk as runUtilityTelemetryStatusCliCommand, bl as runVerifiedRecallSearchCliCommand, bm as runVerifyMemoryProjectionCliCommand, bn as runWebDavServeCliCommand, bo as runWebDavStopCliCommand, bp as runWorkProductRecallSearchCliCommand, bq as runWorkProductRecordCliCommand, br as runWorkProductStatusCliCommand, bs as runWorkProjectCliCommand, bt as runWorkTaskCliCommand } from './cli-VGDSn2zY.js';
9
+ import './access-service-H-qEdnSs.js';
10
10
  import 'node:stream';
11
11
  import './resolve-auth-token.js';
12
12
  import './causal-trajectory.js';
package/dist/cli.js CHANGED
@@ -91,7 +91,7 @@ import {
91
91
  runWorkProductStatusCliCommand,
92
92
  runWorkProjectCliCommand,
93
93
  runWorkTaskCliCommand
94
- } from "./chunk-SOFATSHJ.js";
94
+ } from "./chunk-ZHV6FGVF.js";
95
95
  import "./chunk-MMACM5G2.js";
96
96
  import "./chunk-54BGIBCR.js";
97
97
  import "./chunk-H4CKS5B2.js";
@@ -128,13 +128,13 @@ import "./chunk-EBA5DA77.js";
128
128
  import "./chunk-OJP3N7UK.js";
129
129
  import "./chunk-UDJMJNBK.js";
130
130
  import "./chunk-RUUJXAGT.js";
131
- import "./chunk-JE4H2QBO.js";
131
+ import "./chunk-WJ5KWJLK.js";
132
132
  import "./chunk-G7NYVKD6.js";
133
133
  import "./chunk-AM4T6CHX.js";
134
134
  import "./chunk-SLGD36MM.js";
135
135
  import "./chunk-3T74IZB3.js";
136
136
  import "./chunk-2LA3H54D.js";
137
- import "./chunk-SEQ6DWXD.js";
137
+ import "./chunk-5IKW2VP6.js";
138
138
  import "./chunk-7RKAE6Y4.js";
139
139
  import "./chunk-KFY3SGN7.js";
140
140
  import "./chunk-CMTINOFS.js";
@@ -161,7 +161,7 @@ import "./chunk-6TBIWIAG.js";
161
161
  import "./chunk-C6WMSXCJ.js";
162
162
  import "./chunk-B7RWBZXW.js";
163
163
  import "./chunk-YBPYIAA5.js";
164
- import "./chunk-UVZBDIJX.js";
164
+ import "./chunk-KGY6F4VJ.js";
165
165
  import "./chunk-ZKOPY4WW.js";
166
166
  import "./chunk-62OKGIJA.js";
167
167
  import "./chunk-3KJTSCSX.js";
@@ -186,7 +186,7 @@ import "./chunk-C6FQJ52H.js";
186
186
  import "./chunk-KFZY2OFH.js";
187
187
  import "./chunk-27NO2KVB.js";
188
188
  import "./chunk-B32WYRXX.js";
189
- import "./chunk-6KCQNFDQ.js";
189
+ import "./chunk-SOOWBRMH.js";
190
190
  import "./chunk-V7IZKJI3.js";
191
191
  import "./chunk-TB6CBZ5V.js";
192
192
  import "./chunk-XW2T4QAW.js";
@@ -200,26 +200,26 @@ import "./chunk-QZ4U67KO.js";
200
200
  import "./chunk-HMDYSGY6.js";
201
201
  import "./chunk-3HSRWJTC.js";
202
202
  import "./chunk-TTFJQ5B5.js";
203
- import "./chunk-WBW34YCJ.js";
204
- import "./chunk-UQTXER7M.js";
203
+ import "./chunk-BCXZ4BDS.js";
204
+ import "./chunk-ZADYEZY4.js";
205
205
  import "./chunk-SRT6SHVZ.js";
206
- import "./chunk-U6CMLAP4.js";
206
+ import "./chunk-M7HFDWOS.js";
207
207
  import "./chunk-TE6S7KDF.js";
208
208
  import "./chunk-EIB4FJVR.js";
209
209
  import "./chunk-FPB5LQWW.js";
210
210
  import "./chunk-A5KNZSNA.js";
211
211
  import "./chunk-HUSTM6PU.js";
212
212
  import "./chunk-D24OXEPB.js";
213
- import "./chunk-UCY4EHAG.js";
213
+ import "./chunk-A4TQFNRX.js";
214
214
  import "./chunk-Y7LZ5V7N.js";
215
- import "./chunk-2UDAABV6.js";
215
+ import "./chunk-MTJUIIM4.js";
216
216
  import "./chunk-EVQ33D3N.js";
217
- import "./chunk-GRX6YH4E.js";
218
- import "./chunk-2INZSV27.js";
219
- import "./chunk-HWT6KRGS.js";
217
+ import "./chunk-MXTCV3B5.js";
218
+ import "./chunk-ZANEMAEV.js";
219
+ import "./chunk-6UEM5EOB.js";
220
220
  import "./chunk-7T4TOGMS.js";
221
221
  import "./chunk-7YQ6ESEA.js";
222
- import "./chunk-V5BU5PVE.js";
222
+ import "./chunk-CO7KBRPF.js";
223
223
  import "./chunk-SCXURCVT.js";
224
224
  import "./chunk-EQWEIIKQ.js";
225
225
  import "./chunk-HNHIHXSD.js";
@@ -235,11 +235,11 @@ import "./chunk-AYHNTYVG.js";
235
235
  import "./chunk-U2SK45U3.js";
236
236
  import "./chunk-AB3A7EFH.js";
237
237
  import "./chunk-YEIKOBOW.js";
238
- import "./chunk-SVUUOLKM.js";
238
+ import "./chunk-VMKAA5SU.js";
239
239
  import "./chunk-TIDEL77O.js";
240
240
  import "./chunk-GZ3R6XOE.js";
241
- import "./chunk-HG42J2EX.js";
242
- import "./chunk-DCRK7I5E.js";
241
+ import "./chunk-EQNZC3BH.js";
242
+ import "./chunk-HUQMVI3A.js";
243
243
  import "./chunk-W4F3C7N7.js";
244
244
  import "./chunk-MPC7TYTZ.js";
245
245
  import "./chunk-VVX5PZFS.js";
@@ -275,8 +275,8 @@ import "./chunk-AQEJKOKI.js";
275
275
  import "./chunk-HM7RHKS4.js";
276
276
  import "./chunk-UD7UNYRD.js";
277
277
  import "./chunk-IISBCCWR.js";
278
- import "./chunk-EW3Y73MN.js";
279
- import "./chunk-TEQQQTQS.js";
278
+ import "./chunk-UJBIWY5M.js";
279
+ import "./chunk-2HJKAVAS.js";
280
280
  import "./chunk-2YA5N2BY.js";
281
281
  import "./chunk-HWLIMQE2.js";
282
282
  import "./chunk-TQT4AOPO.js";
@@ -293,7 +293,7 @@ import "./chunk-LTHVM4XN.js";
293
293
  import "./chunk-C37ZRXX7.js";
294
294
  import "./chunk-B4EGAHHS.js";
295
295
  import "./chunk-IHOXK2I6.js";
296
- import "./chunk-72AV2H3R.js";
296
+ import "./chunk-U3NBO4IX.js";
297
297
  import "./chunk-NAFPHFDM.js";
298
298
  import "./chunk-RF2SMMPP.js";
299
299
  import "./chunk-AJBWVDRV.js";
package/dist/config.js CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  isOpenaiApiKeyDisabled,
5
5
  parseConfig,
6
6
  resolveEnvVars
7
- } from "./chunk-UVZBDIJX.js";
7
+ } from "./chunk-KGY6F4VJ.js";
8
8
  import "./chunk-ZKOPY4WW.js";
9
9
  import "./chunk-62OKGIJA.js";
10
10
  import "./chunk-3KJTSCSX.js";
@@ -1,5 +1,5 @@
1
1
  import { IncomingMessage, ServerResponse } from 'node:http';
2
- import { f as EngramAccessService } from './access-service-CUNM5RfA.js';
2
+ import { f as EngramAccessService } from './access-service-H-qEdnSs.js';
3
3
  import './types-Du6VdoAg.js';
4
4
  import './message-parts/index.js';
5
5
  import './bounded-jsonl-state.js';
@@ -1,4 +1,4 @@
1
- import { l as McpTool } from './access-service-CUNM5RfA.js';
1
+ import { l as McpTool } from './access-service-H-qEdnSs.js';
2
2
  import './types-Du6VdoAg.js';
3
3
  import './message-parts/index.js';
4
4
  import './bounded-jsonl-state.js';
@@ -27,15 +27,21 @@
27
27
  * sidecar path WITHOUT the marker are user content: never overwritten, never
28
28
  * removed.
29
29
  *
30
- * Layer 2 (this slice): {@link refreshDirectorySidecarsAfterWrite} refreshes
31
- * only the changed directory and its category ancestors, so a memory write
32
- * populates sidecars without walking the rest of the store. `enabled: false`
33
- * is a proven no-op (no reads, no writes). Config parsing lives here;
34
- * `parseConfig` wiring, retrieval drill-down, xray, and LLM summarization
35
- * remain later layers on #2977 (`config.ts` is at its file-size ratchet).
30
+ * Layer 2: {@link refreshDirectorySidecarsAfterWrite} refreshes only the
31
+ * changed directory and its category ancestors. `enabled: false` is a
32
+ * proven no-op (no reads, no writes).
33
+ *
34
+ * Layer 3 (this slice): {@link applyDirectorySidecarDrillDown} scores
35
+ * fresh sidecars and attaches the winning directory's abstract to hits.
36
+ * `enabled` stays a function argument — not a parseConfig key (`config.ts`
37
+ * and `types.ts` are at their file-size ratchets). Retrieval never writes.
38
+ * xray trajectory, storage write-hook, parseConfig wiring, and LLM
39
+ * summarization remain later layers on #2977.
36
40
  */
37
41
  declare const DIRECTORY_SIDECAR_BASENAME = "overview.md";
38
42
  declare const DIRECTORY_SIDECAR_MARKER = "<!-- remnic-directory-sidecar -->";
43
+ /** Prefix prepended to a hit snippet when a fresh directory abstract attaches. */
44
+ declare const NEIGHBORHOOD_ABSTRACT_LABEL = "Neighborhood:";
39
45
  /** Config fields this slice owns. Mix into `PluginConfig` in a later layer. */
40
46
  interface DirectorySidecarSettings {
41
47
  /** Populate sidecars on memory writes. Default false. */
@@ -58,6 +64,12 @@ interface DirectorySidecar {
58
64
  interface DirectorySidecarMatch extends DirectorySidecar {
59
65
  readonly score: number;
60
66
  }
67
+ /** Minimal hit shape drill-down mutates. Extra fields pass through. */
68
+ interface DirectorySidecarHit {
69
+ path: string;
70
+ snippet: string;
71
+ score: number;
72
+ }
61
73
  interface DirectorySidecarReport {
62
74
  written: string[];
63
75
  removed: string[];
@@ -108,6 +120,17 @@ declare function loadDirectorySidecar(dir: string, options?: {
108
120
  declare function findDirectorySidecarsForQuery(memoryDir: string, query: string, options?: {
109
121
  namespace?: string;
110
122
  limit?: number;
123
+ refresh?: boolean;
111
124
  }): Promise<DirectorySidecarMatch[]>;
125
+ /**
126
+ * Retrieval drill-down (layer 3 of #2977): score fresh directory sidecars
127
+ * and attach the winning neighborhood abstract to hits under that directory.
128
+ * `enabled: false` (the default) returns hits unchanged with no I/O.
129
+ * Never writes. Does not reorder. parseConfig is not consulted.
130
+ */
131
+ declare function applyDirectorySidecarDrillDown<T extends DirectorySidecarHit>(memoryDir: string, query: string, hits: readonly T[], options?: {
132
+ enabled?: boolean;
133
+ namespace?: string;
134
+ }): Promise<T[]>;
112
135
 
113
- export { DIRECTORY_SIDECAR_BASENAME, DIRECTORY_SIDECAR_MARKER, type DirectorySidecar, type DirectorySidecarMatch, type DirectorySidecarReport, type DirectorySidecarSettings, directoryFingerprint, directorySidecarAncestry, findDirectorySidecarsForQuery, loadDirectorySidecar, parseDirectorySidecarsEnabled, refreshDirectorySidecarsAfterWrite, runDirectorySidecarMaintenance };
136
+ export { DIRECTORY_SIDECAR_BASENAME, DIRECTORY_SIDECAR_MARKER, type DirectorySidecar, type DirectorySidecarHit, type DirectorySidecarMatch, type DirectorySidecarReport, type DirectorySidecarSettings, NEIGHBORHOOD_ABSTRACT_LABEL, applyDirectorySidecarDrillDown, directoryFingerprint, directorySidecarAncestry, findDirectorySidecarsForQuery, loadDirectorySidecar, parseDirectorySidecarsEnabled, refreshDirectorySidecarsAfterWrite, runDirectorySidecarMaintenance };
@@ -1,6 +1,8 @@
1
1
  import {
2
2
  DIRECTORY_SIDECAR_BASENAME,
3
3
  DIRECTORY_SIDECAR_MARKER,
4
+ NEIGHBORHOOD_ABSTRACT_LABEL,
5
+ applyDirectorySidecarDrillDown,
4
6
  directoryFingerprint,
5
7
  directorySidecarAncestry,
6
8
  findDirectorySidecarsForQuery,
@@ -8,7 +10,7 @@ import {
8
10
  parseDirectorySidecarsEnabled,
9
11
  refreshDirectorySidecarsAfterWrite,
10
12
  runDirectorySidecarMaintenance
11
- } from "./chunk-72AV2H3R.js";
13
+ } from "./chunk-U3NBO4IX.js";
12
14
  import "./chunk-PCEYGOSL.js";
13
15
  import "./chunk-SCU65EZI.js";
14
16
  import "./chunk-PQVCH2AE.js";
@@ -19,6 +21,8 @@ import "./chunk-PZ5AY32C.js";
19
21
  export {
20
22
  DIRECTORY_SIDECAR_BASENAME,
21
23
  DIRECTORY_SIDECAR_MARKER,
24
+ NEIGHBORHOOD_ABSTRACT_LABEL,
25
+ applyDirectorySidecarDrillDown,
22
26
  directoryFingerprint,
23
27
  directorySidecarAncestry,
24
28
  findDirectorySidecarsForQuery,
@@ -1,4 +1,4 @@
1
- import { B as BoundOperation } from './access-service-CUNM5RfA.js';
1
+ import { B as BoundOperation } from './access-service-H-qEdnSs.js';
2
2
  import { ExternalWikiSearchResult, ExternalWikiSearchInput } from './external-wiki-search.js';
3
3
  import './types-Du6VdoAg.js';
4
4
  import './message-parts/index.js';
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  externalWikiSearchOperation
3
- } from "./chunk-HWT6KRGS.js";
3
+ } from "./chunk-6UEM5EOB.js";
4
4
  import "./chunk-7T4TOGMS.js";
5
5
  import "./chunk-7YQ6ESEA.js";
6
- import "./chunk-DCRK7I5E.js";
6
+ import "./chunk-HUQMVI3A.js";
7
7
  import "./chunk-W4F3C7N7.js";
8
8
  import "./chunk-MPC7TYTZ.js";
9
9
  import "./chunk-VVX5PZFS.js";
@@ -39,8 +39,8 @@ import "./chunk-AQEJKOKI.js";
39
39
  import "./chunk-HM7RHKS4.js";
40
40
  import "./chunk-UD7UNYRD.js";
41
41
  import "./chunk-IISBCCWR.js";
42
- import "./chunk-EW3Y73MN.js";
43
- import "./chunk-TEQQQTQS.js";
42
+ import "./chunk-UJBIWY5M.js";
43
+ import "./chunk-2HJKAVAS.js";
44
44
  import "./chunk-2YA5N2BY.js";
45
45
  import "./chunk-HWLIMQE2.js";
46
46
  import "./chunk-TQT4AOPO.js";
@@ -57,7 +57,7 @@ import "./chunk-LTHVM4XN.js";
57
57
  import "./chunk-C37ZRXX7.js";
58
58
  import "./chunk-B4EGAHHS.js";
59
59
  import "./chunk-IHOXK2I6.js";
60
- import "./chunk-72AV2H3R.js";
60
+ import "./chunk-U3NBO4IX.js";
61
61
  import "./chunk-NAFPHFDM.js";
62
62
  import "./chunk-RF2SMMPP.js";
63
63
  import "./chunk-AJBWVDRV.js";