@remnic/core 9.9.0 → 9.9.2

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 (155) hide show
  1. package/dist/access-admin-ops-surface.js +24 -23
  2. package/dist/access-boundary.js +24 -23
  3. package/dist/access-citation-namespace.d.ts +19 -0
  4. package/dist/access-citation-namespace.js +13 -0
  5. package/dist/access-cli.js +67 -66
  6. package/dist/access-cli.js.map +1 -1
  7. package/dist/access-http.js +31 -30
  8. package/dist/access-identity-continuity-surface.js +24 -23
  9. package/dist/access-lcm-surface.js +24 -23
  10. package/dist/access-mcp.js +29 -28
  11. package/dist/access-observe-write-surface.js +24 -23
  12. package/dist/access-operations-batch.js +26 -25
  13. package/dist/access-operations.d.ts +3 -3
  14. package/dist/access-operations.js +28 -27
  15. package/dist/access-recall-concurrency.js +24 -23
  16. package/dist/access-recall-response.js +24 -23
  17. package/dist/access-recall-surface.js +24 -23
  18. package/dist/access-schema.d.ts +76 -76
  19. package/dist/access-schema.js +5 -5
  20. package/dist/access-service.js +27 -26
  21. package/dist/active-recall.js +3 -3
  22. package/dist/briefing.js +6 -6
  23. package/dist/{capsule-crypto-YO5QJ6L3.js → capsule-crypto-GWVG7LGC.js} +2 -2
  24. package/dist/capsule-crypto-GWVG7LGC.js.map +1 -0
  25. package/dist/causal-consolidation.js +9 -9
  26. package/dist/{chunk-LEPOP46W.js → chunk-227UFSEQ.js} +4 -4
  27. package/dist/{chunk-MC5Q3J7S.js → chunk-3332THSR.js} +10 -10
  28. package/dist/chunk-3PDOVUHC.js +48 -0
  29. package/dist/chunk-3PDOVUHC.js.map +1 -0
  30. package/dist/{chunk-EEC7UJPX.js → chunk-46OH3OVK.js} +2 -2
  31. package/dist/{chunk-VDX2J7OX.js → chunk-5W7CTZ2E.js} +4 -4
  32. package/dist/{chunk-KAVBJSBQ.js → chunk-7G7DVA2C.js} +2 -2
  33. package/dist/{chunk-4BJQODZF.js → chunk-7HZMTXXB.js} +14 -14
  34. package/dist/{chunk-GFPZS3F5.js → chunk-A56B2AJR.js} +5 -5
  35. package/dist/{chunk-A6USBZTO.js → chunk-AAP5T6QG.js} +5 -5
  36. package/dist/{chunk-AJ7QCSIS.js → chunk-ALSGMEJR.js} +5 -5
  37. package/dist/{chunk-57OWKFUQ.js → chunk-AS6UOOXF.js} +2 -2
  38. package/dist/{chunk-OGCAYLNA.js → chunk-B4C3JSJT.js} +3 -3
  39. package/dist/{chunk-WON4APQY.js → chunk-CAZ2SHEP.js} +2 -2
  40. package/dist/{chunk-7RNBVZZO.js → chunk-CQ6WP3PA.js} +2 -2
  41. package/dist/{chunk-FUTF72MJ.js → chunk-DF552QUN.js} +5 -5
  42. package/dist/{chunk-ZVAYK7GU.js → chunk-DZQZHQQ4.js} +13 -13
  43. package/dist/{chunk-72VAXGEI.js → chunk-E4OCKU67.js} +4 -4
  44. package/dist/{chunk-5Q7EVV4X.js → chunk-HLG7VAZP.js} +2 -2
  45. package/dist/{chunk-IFH6LWTO.js → chunk-IAHNKI2E.js} +22 -8
  46. package/dist/chunk-IAHNKI2E.js.map +1 -0
  47. package/dist/{chunk-FFPJINJE.js → chunk-IQFS4AU7.js} +2 -2
  48. package/dist/{chunk-EKBNDKDY.js → chunk-KN6UGAQB.js} +4 -4
  49. package/dist/{chunk-XQDRKZ7V.js → chunk-KQILYXND.js} +34 -35
  50. package/dist/chunk-KQILYXND.js.map +1 -0
  51. package/dist/{chunk-44XZ75OQ.js → chunk-O4K3DWK2.js} +5 -5
  52. package/dist/{chunk-BXLOS5AJ.js → chunk-OWHERGF2.js} +2 -2
  53. package/dist/{chunk-6DRPPQEJ.js → chunk-P5FPO2BR.js} +4 -4
  54. package/dist/{chunk-2UFO7X4Q.js → chunk-QZGN4773.js} +6 -6
  55. package/dist/{chunk-PMUD7ERF.js → chunk-SOTYFJOA.js} +48 -48
  56. package/dist/{chunk-2VEOKUPP.js → chunk-TC5HBIIT.js} +3 -3
  57. package/dist/{chunk-A72SWTWW.js → chunk-TY6NBWV4.js} +2 -2
  58. package/dist/{chunk-DQEMWVMT.js → chunk-UVYI6VIX.js} +1 -1
  59. package/dist/{chunk-MYFQ3ED4.js → chunk-W2OST2HH.js} +2 -2
  60. package/dist/{chunk-BI2OJF6J.js → chunk-WR7DZIWF.js} +62 -61
  61. package/dist/{chunk-BI2OJF6J.js.map → chunk-WR7DZIWF.js.map} +1 -1
  62. package/dist/{chunk-QVT3E4CE.js → chunk-WSHJAY5M.js} +6 -6
  63. package/dist/{chunk-6O22TZSB.js → chunk-XMAD32BW.js} +2 -2
  64. package/dist/{chunk-CXZQOVIE.js → chunk-XRNU7OEQ.js} +5 -5
  65. package/dist/{chunk-R26ZMXR2.js → chunk-Y6XODVJ4.js} +15 -15
  66. package/dist/{chunk-OQJIB32H.js → chunk-YO3ZB3PJ.js} +8 -8
  67. package/dist/{chunk-C6XBRYVD.js → chunk-YQQYS2K4.js} +2 -2
  68. package/dist/{chunk-F7GAIWFA.js → chunk-YSDVEPV2.js} +7 -7
  69. package/dist/{chunk-YROFNEG5.js → chunk-YUQOAKPX.js} +2 -2
  70. package/dist/cli.js +50 -49
  71. package/dist/compounding/engine.js +6 -6
  72. package/dist/config.js +3 -3
  73. package/dist/connectors/codex-materialize-runner.js +7 -7
  74. package/dist/connectors/index.js +8 -8
  75. package/dist/contradiction/index.js +4 -4
  76. package/dist/conversation-index/backend.js +2 -2
  77. package/dist/entity-retrieval.js +6 -6
  78. package/dist/extraction.js +2 -2
  79. package/dist/index.d.ts +404 -404
  80. package/dist/index.js +95 -94
  81. package/dist/maintenance/memory-governance.js +6 -6
  82. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +6 -6
  83. package/dist/maintenance/rebuild-memory-projection.js +7 -7
  84. package/dist/namespaces/migrate.js +15 -15
  85. package/dist/namespaces/search.js +8 -8
  86. package/dist/namespaces/storage.js +7 -7
  87. package/dist/offline-sync-impression-drain.js +4 -4
  88. package/dist/offline-sync.js +2 -2
  89. package/dist/operator-toolkit.js +22 -22
  90. package/dist/orchestration/maintenance.js +12 -12
  91. package/dist/orchestrator.js +67 -66
  92. package/dist/resume-bundles.js +7 -7
  93. package/dist/schemas.d.ts +76 -76
  94. package/dist/search/factory.js +7 -7
  95. package/dist/search/index.js +11 -11
  96. package/dist/search/lancedb-backend.js +1 -1
  97. package/dist/search/meilisearch-backend.js +1 -1
  98. package/dist/search/orama-backend.js +1 -1
  99. package/dist/semantic-consolidation.js +8 -8
  100. package/dist/semantic-rule-promotion.js +6 -6
  101. package/dist/semantic-rule-verifier.js +6 -6
  102. package/dist/session-transcript-migration.js +2 -2
  103. package/dist/shared-context/manager.d.ts +8 -8
  104. package/dist/storage.js +5 -5
  105. package/dist/summarizer.js +3 -3
  106. package/dist/summary-snapshot.js +2 -2
  107. package/dist/transfer/backup.js +2 -2
  108. package/dist/transfer/capsule-export.js +2 -2
  109. package/dist/transfer/capsule-import.js +2 -2
  110. package/dist/transfer/types.d.ts +66 -66
  111. package/dist/verified-recall.js +6 -6
  112. package/package.json +2 -2
  113. package/src/access-citation-namespace.ts +74 -0
  114. package/src/access-service.ts +7 -11
  115. package/src/namespaces/search.ts +54 -11
  116. package/src/wearables/registry.ts +1 -0
  117. package/dist/chunk-IFH6LWTO.js.map +0 -1
  118. package/dist/chunk-XQDRKZ7V.js.map +0 -1
  119. /package/dist/{capsule-crypto-YO5QJ6L3.js.map → access-citation-namespace.js.map} +0 -0
  120. /package/dist/{chunk-LEPOP46W.js.map → chunk-227UFSEQ.js.map} +0 -0
  121. /package/dist/{chunk-MC5Q3J7S.js.map → chunk-3332THSR.js.map} +0 -0
  122. /package/dist/{chunk-EEC7UJPX.js.map → chunk-46OH3OVK.js.map} +0 -0
  123. /package/dist/{chunk-VDX2J7OX.js.map → chunk-5W7CTZ2E.js.map} +0 -0
  124. /package/dist/{chunk-KAVBJSBQ.js.map → chunk-7G7DVA2C.js.map} +0 -0
  125. /package/dist/{chunk-4BJQODZF.js.map → chunk-7HZMTXXB.js.map} +0 -0
  126. /package/dist/{chunk-GFPZS3F5.js.map → chunk-A56B2AJR.js.map} +0 -0
  127. /package/dist/{chunk-A6USBZTO.js.map → chunk-AAP5T6QG.js.map} +0 -0
  128. /package/dist/{chunk-AJ7QCSIS.js.map → chunk-ALSGMEJR.js.map} +0 -0
  129. /package/dist/{chunk-57OWKFUQ.js.map → chunk-AS6UOOXF.js.map} +0 -0
  130. /package/dist/{chunk-OGCAYLNA.js.map → chunk-B4C3JSJT.js.map} +0 -0
  131. /package/dist/{chunk-WON4APQY.js.map → chunk-CAZ2SHEP.js.map} +0 -0
  132. /package/dist/{chunk-7RNBVZZO.js.map → chunk-CQ6WP3PA.js.map} +0 -0
  133. /package/dist/{chunk-FUTF72MJ.js.map → chunk-DF552QUN.js.map} +0 -0
  134. /package/dist/{chunk-ZVAYK7GU.js.map → chunk-DZQZHQQ4.js.map} +0 -0
  135. /package/dist/{chunk-72VAXGEI.js.map → chunk-E4OCKU67.js.map} +0 -0
  136. /package/dist/{chunk-5Q7EVV4X.js.map → chunk-HLG7VAZP.js.map} +0 -0
  137. /package/dist/{chunk-FFPJINJE.js.map → chunk-IQFS4AU7.js.map} +0 -0
  138. /package/dist/{chunk-EKBNDKDY.js.map → chunk-KN6UGAQB.js.map} +0 -0
  139. /package/dist/{chunk-44XZ75OQ.js.map → chunk-O4K3DWK2.js.map} +0 -0
  140. /package/dist/{chunk-BXLOS5AJ.js.map → chunk-OWHERGF2.js.map} +0 -0
  141. /package/dist/{chunk-6DRPPQEJ.js.map → chunk-P5FPO2BR.js.map} +0 -0
  142. /package/dist/{chunk-2UFO7X4Q.js.map → chunk-QZGN4773.js.map} +0 -0
  143. /package/dist/{chunk-PMUD7ERF.js.map → chunk-SOTYFJOA.js.map} +0 -0
  144. /package/dist/{chunk-2VEOKUPP.js.map → chunk-TC5HBIIT.js.map} +0 -0
  145. /package/dist/{chunk-A72SWTWW.js.map → chunk-TY6NBWV4.js.map} +0 -0
  146. /package/dist/{chunk-DQEMWVMT.js.map → chunk-UVYI6VIX.js.map} +0 -0
  147. /package/dist/{chunk-MYFQ3ED4.js.map → chunk-W2OST2HH.js.map} +0 -0
  148. /package/dist/{chunk-QVT3E4CE.js.map → chunk-WSHJAY5M.js.map} +0 -0
  149. /package/dist/{chunk-6O22TZSB.js.map → chunk-XMAD32BW.js.map} +0 -0
  150. /package/dist/{chunk-CXZQOVIE.js.map → chunk-XRNU7OEQ.js.map} +0 -0
  151. /package/dist/{chunk-R26ZMXR2.js.map → chunk-Y6XODVJ4.js.map} +0 -0
  152. /package/dist/{chunk-OQJIB32H.js.map → chunk-YO3ZB3PJ.js.map} +0 -0
  153. /package/dist/{chunk-C6XBRYVD.js.map → chunk-YQQYS2K4.js.map} +0 -0
  154. /package/dist/{chunk-F7GAIWFA.js.map → chunk-YSDVEPV2.js.map} +0 -0
  155. /package/dist/{chunk-YROFNEG5.js.map → chunk-YUQOAKPX.js.map} +0 -0
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-3UXOZBHV.js";
8
8
  import {
9
9
  StorageManager
10
- } from "./chunk-4BJQODZF.js";
10
+ } from "./chunk-7HZMTXXB.js";
11
11
  import {
12
12
  isSafeRouteNamespace
13
13
  } from "./chunk-U3PN77QT.js";
@@ -118,4 +118,4 @@ export {
118
118
  runCodexMaterialize,
119
119
  runPostConsolidationMaterialize
120
120
  };
121
- //# sourceMappingURL=chunk-WON4APQY.js.map
121
+ //# sourceMappingURL=chunk-CAZ2SHEP.js.map
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-R6YJI3HE.js";
8
8
  import {
9
9
  StorageManager
10
- } from "./chunk-4BJQODZF.js";
10
+ } from "./chunk-7HZMTXXB.js";
11
11
  import {
12
12
  withHeldFileLock
13
13
  } from "./chunk-WL5EBRDH.js";
@@ -267,4 +267,4 @@ export {
267
267
  backupExistingLedger,
268
268
  rebuildMemoryLifecycleLedger
269
269
  };
270
- //# sourceMappingURL=chunk-7RNBVZZO.js.map
270
+ //# sourceMappingURL=chunk-CQ6WP3PA.js.map
@@ -1,3 +1,6 @@
1
+ import {
2
+ OramaBackend
3
+ } from "./chunk-ES36HTSC.js";
1
4
  import {
2
5
  RemoteSearchBackend
3
6
  } from "./chunk-3Y224NYC.js";
@@ -13,12 +16,9 @@ import {
13
16
  import {
14
17
  NoopSearchBackend
15
18
  } from "./chunk-CYEPCZN5.js";
16
- import {
17
- OramaBackend
18
- } from "./chunk-ES36HTSC.js";
19
19
  import {
20
20
  createConversationIndexBackend
21
- } from "./chunk-LEPOP46W.js";
21
+ } from "./chunk-227UFSEQ.js";
22
22
  import {
23
23
  FaissConversationIndexAdapter
24
24
  } from "./chunk-ET356KSB.js";
@@ -175,4 +175,4 @@ export {
175
175
  createConversationSearchBackend,
176
176
  createConversationIndexRuntime
177
177
  };
178
- //# sourceMappingURL=chunk-FUTF72MJ.js.map
178
+ //# sourceMappingURL=chunk-DF552QUN.js.map
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  WearablesInputError
3
3
  } from "./chunk-V7IZKJI3.js";
4
- import {
5
- AdapterRegistry
6
- } from "./chunk-RKNJBZ55.js";
7
4
  import {
8
5
  WriteRateLimiter
9
6
  } from "./chunk-MKQBXQKU.js";
7
+ import {
8
+ AdapterRegistry
9
+ } from "./chunk-RKNJBZ55.js";
10
10
  import {
11
11
  EngramMcpServer,
12
12
  MCP_SUPPORTED_PROTOCOL_VERSIONS,
@@ -16,10 +16,10 @@ import {
16
16
  processChatMessage,
17
17
  sessionBelongsToPrincipal,
18
18
  subscribeChatTranscript
19
- } from "./chunk-CXZQOVIE.js";
19
+ } from "./chunk-XRNU7OEQ.js";
20
20
  import {
21
21
  RelayMissionStoreError
22
- } from "./chunk-OGCAYLNA.js";
22
+ } from "./chunk-B4C3JSJT.js";
23
23
  import {
24
24
  executeResolution,
25
25
  isValidResolutionVerb
@@ -31,13 +31,13 @@ import {
31
31
  } from "./chunk-35NN3ZFA.js";
32
32
  import {
33
33
  validateRequest
34
- } from "./chunk-2VEOKUPP.js";
34
+ } from "./chunk-TC5HBIIT.js";
35
35
  import {
36
36
  getOperation
37
37
  } from "./chunk-KF5EUVKQ.js";
38
38
  import {
39
39
  CorrectionContractError
40
- } from "./chunk-XQDRKZ7V.js";
40
+ } from "./chunk-KQILYXND.js";
41
41
  import {
42
42
  isTrustZoneName
43
43
  } from "./chunk-JGSKJHF7.js";
@@ -65,7 +65,11 @@ import {
65
65
  OFFLINE_SYNC_APPLY_MAX_BODY_BYTES,
66
66
  OFFLINE_SYNC_FILE_CONTENT_MAX_CHUNK_BYTES,
67
67
  OFFLINE_SYNC_SNAPSHOT_BASE_MAX_BODY_BYTES
68
- } from "./chunk-72VAXGEI.js";
68
+ } from "./chunk-E4OCKU67.js";
69
+ import {
70
+ EngramAccessForbiddenError,
71
+ EngramAccessInputError
72
+ } from "./chunk-2Z24E5W2.js";
69
73
  import {
70
74
  abortError,
71
75
  isAbortError
@@ -73,10 +77,6 @@ import {
73
77
  import {
74
78
  log
75
79
  } from "./chunk-3WCASNQZ.js";
76
- import {
77
- EngramAccessForbiddenError,
78
- EngramAccessInputError
79
- } from "./chunk-2Z24E5W2.js";
80
80
 
81
81
  // src/access-http.ts
82
82
  import { createServer } from "http";
@@ -3132,4 +3132,4 @@ function positiveIntQueryParam(value, label) {
3132
3132
  export {
3133
3133
  EngramAccessHttpServer
3134
3134
  };
3135
- //# sourceMappingURL=chunk-ZVAYK7GU.js.map
3135
+ //# sourceMappingURL=chunk-DZQZHQQ4.js.map
@@ -10,13 +10,13 @@ import {
10
10
  import {
11
11
  DEFAULT_OFFLINE_SYNC_EXCLUDE_GLOBS
12
12
  } from "./chunk-AREGMX2J.js";
13
+ import {
14
+ parseFlexibleIsoTimestamp
15
+ } from "./chunk-P7FMDTKL.js";
13
16
  import {
14
17
  MAGIC_HEADER_SIZE,
15
18
  isEncryptedFile
16
19
  } from "./chunk-AIK5W3IW.js";
17
- import {
18
- parseFlexibleIsoTimestamp
19
- } from "./chunk-P7FMDTKL.js";
20
20
 
21
21
  // src/offline-sync.ts
22
22
  import { createHash, randomUUID } from "crypto";
@@ -1760,4 +1760,4 @@ export {
1760
1760
  normalizeOfflineSyncState,
1761
1761
  fileStatesFromSnapshot
1762
1762
  };
1763
- //# sourceMappingURL=chunk-72VAXGEI.js.map
1763
+ //# sourceMappingURL=chunk-E4OCKU67.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  StorageManager
3
- } from "./chunk-4BJQODZF.js";
3
+ } from "./chunk-7HZMTXXB.js";
4
4
  import {
5
5
  assertPathInsideRoot
6
6
  } from "./chunk-GCASGYIO.js";
@@ -755,4 +755,4 @@ export {
755
755
  listMemoryGovernanceRuns,
756
756
  readMemoryGovernanceRunArtifact
757
757
  };
758
- //# sourceMappingURL=chunk-5Q7EVV4X.js.map
758
+ //# sourceMappingURL=chunk-HLG7VAZP.js.map
@@ -1,19 +1,20 @@
1
1
  import {
2
2
  createSearchBackend
3
- } from "./chunk-FUTF72MJ.js";
3
+ } from "./chunk-DF552QUN.js";
4
4
  import {
5
5
  namespaceIdentityToken,
6
6
  normalizeNamespaceIdentity
7
7
  } from "./chunk-EGGE52UU.js";
8
- import {
9
- ALL_CATEGORY_DIRS
10
- } from "./chunk-VS2IYZRU.js";
11
8
  import {
12
9
  resolveNamespaceCapabilities
13
10
  } from "./chunk-SCCO46KZ.js";
11
+ import {
12
+ ALL_CATEGORY_DIRS
13
+ } from "./chunk-VS2IYZRU.js";
14
14
 
15
15
  // src/namespaces/search.ts
16
16
  import path from "path";
17
+ import { realpathSync } from "fs";
17
18
  var NESTED_NAMESPACE_FILTER_OVERFETCH_FACTOR = 4;
18
19
  var NESTED_NAMESPACE_FILTER_OVERFETCH_MIN = 50;
19
20
  function namespaceCollectionName(baseCollection, namespace, options) {
@@ -115,7 +116,7 @@ var NamespaceSearchRouter = class {
115
116
  // stay distinct across every downstream consumer with no special
116
117
  // handling. Display/citation surfaces relativize for portability (#2020).
117
118
  path: resolveNamespaceResultPath(record.memoryDir, record.collection, result.path)
118
- }));
119
+ })).filter((result) => resolvedPathIsInsideNamespaceRoot(record.memoryDir, result.path));
119
120
  return { namespace, results };
120
121
  })
121
122
  );
@@ -387,14 +388,27 @@ async function embedBackendRecord(record, options) {
387
388
  function daemonModeForBackend(backend) {
388
389
  return "isDaemonMode" in backend && typeof backend.isDaemonMode === "function" ? backend.isDaemonMode() === true : null;
389
390
  }
391
+ function isContainedPath(root, candidate) {
392
+ const relative = path.relative(root, candidate);
393
+ return relative === "" || relative !== ".." && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative);
394
+ }
390
395
  function pathIsInsideNamespaceSubtree(memoryDir, collection, resultPath) {
391
396
  if (!resultPath) return false;
392
397
  const normalizedResultPath = normalizeQmdResultPath(resultPath, collection);
393
398
  const memoryRoot = path.resolve(memoryDir);
394
399
  const namespacesRoot = path.join(memoryRoot, "namespaces");
395
400
  const candidate = path.isAbsolute(normalizedResultPath) ? path.normalize(normalizedResultPath) : path.resolve(memoryRoot, normalizedResultPath);
396
- const relative = path.relative(namespacesRoot, candidate);
397
- return relative === "" || !relative.startsWith("..") && !path.isAbsolute(relative);
401
+ return isContainedPath(namespacesRoot, candidate);
402
+ }
403
+ function resolvedPathIsInsideNamespaceRoot(memoryDir, resolvedPath) {
404
+ const root = path.resolve(memoryDir);
405
+ const candidate = path.isAbsolute(resolvedPath) ? path.normalize(resolvedPath) : path.resolve(root, resolvedPath);
406
+ if (!isContainedPath(root, candidate)) return false;
407
+ try {
408
+ return isContainedPath(realpathSync.native(root), realpathSync.native(candidate));
409
+ } catch {
410
+ return true;
411
+ }
398
412
  }
399
413
  function normalizeQmdResultPath(resultPath, collection) {
400
414
  let value = resultPath.trim();
@@ -456,4 +470,4 @@ export {
456
470
  NamespaceSearchRouter,
457
471
  normalizeQmdResultPath
458
472
  };
459
- //# sourceMappingURL=chunk-IFH6LWTO.js.map
473
+ //# sourceMappingURL=chunk-IAHNKI2E.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/namespaces/search.ts"],"sourcesContent":["import { resolveNamespaceCapabilities } from \"../capabilities.js\";\nimport path from \"node:path\";\nimport { realpathSync } from \"node:fs\";\nimport type { PluginConfig, QmdSearchResult } from \"../types.js\";\nimport type {\n SearchBackend,\n SearchExecutionOptions,\n SearchQueryOptions,\n} from \"../search/port.js\";\nimport { createSearchBackend } from \"../search/factory.js\";\nimport { namespaceIdentityToken, normalizeNamespaceIdentity } from \"./identity.js\";\nimport { ALL_CATEGORY_DIRS } from \"../utils/category-dir.js\";\n\nconst NESTED_NAMESPACE_FILTER_OVERFETCH_FACTOR = 4;\nconst NESTED_NAMESPACE_FILTER_OVERFETCH_MIN = 50;\n\nexport function namespaceCollectionName(\n baseCollection: string,\n namespace: string,\n options?: {\n defaultNamespace?: string;\n useLegacyDefaultCollection?: boolean;\n },\n): string {\n const trimmed = normalizeNamespaceIdentity(namespace);\n const defaultNamespace = normalizeNamespaceIdentity(options?.defaultNamespace ?? \"\") || \"default\";\n if (\n options?.useLegacyDefaultCollection === true &&\n trimmed === defaultNamespace\n ) {\n return baseCollection;\n }\n\n return `${baseCollection}--${namespaceIdentityToken(trimmed || defaultNamespace)}`;\n}\n\ntype StorageRouterLike = {\n storageFor(namespace: string): Promise<{ dir: string }>;\n};\n\ntype NamespaceBackendRecord = {\n backend: SearchBackend;\n collection: string;\n memoryDir: string;\n available: boolean;\n collectionState: CollectionState;\n filtersNestedNamespaces: boolean;\n};\n\nexport interface NamespaceUpdateResult {\n backendCount: number;\n eligibleNamespaces: string[];\n}\n\nexport type CollectionState = \"present\" | \"missing\" | \"unknown\" | \"skipped\";\n\nexport interface NamespaceSearchHealth {\n collection: string;\n memoryDir: string;\n available: boolean;\n collectionState: CollectionState;\n debugStatus: string;\n installedVersion: string | null;\n supportedVersion: string | null;\n supported: boolean | null;\n upgradeAvailable: boolean | null;\n doctorAvailable: boolean | null;\n daemonMode: boolean | null;\n pendingEmbeddings: number | null;\n oldestPendingAgeMs: number | null;\n embeddingBacklogThreshold: number;\n}\n\ntype NamespaceScopedSearchConfig = PluginConfig & {\n hostEmbeddingProviderScope?: string;\n};\n\ntype BackendRecordOptions = {\n autoCreateCollection: boolean;\n abortAsUnavailable: boolean;\n failOpenMissingGuardedCollection: boolean;\n};\n\nexport class NamespaceSearchRouter {\n private readonly cache = new Map<string, Promise<NamespaceBackendRecord>>();\n\n constructor(\n private readonly config: PluginConfig,\n private readonly storageRouter: StorageRouterLike,\n private readonly createBackend: (config: PluginConfig) => SearchBackend = createSearchBackend,\n ) {}\n\n async collectionForNamespace(namespace: string): Promise<string> {\n return (await this.backendRecordFor(namespace)).collection;\n }\n\n /**\n * Resolve the search backend for a namespace (#2019). Returns `unknown` so\n * callers (e.g. the prioritized-embed path) duck-type for capability like\n * `embedFiles` rather than depending on a concrete QMD shape. Reuses the\n * cached backend record, so this never re-creates a backend. Returns `null`\n * when the namespace backend is unavailable.\n */\n async backendForNamespace(namespace: string): Promise<unknown> {\n const record = await this.backendRecordFor(namespace);\n return record.available ? record.backend : null;\n }\n\n async searchAcrossNamespaces(options: {\n query: string;\n namespaces: string[];\n maxResults?: number;\n mode?: \"search\" | \"hybrid\" | \"bm25\" | \"vector\";\n searchOptions?: SearchQueryOptions;\n execution?: SearchExecutionOptions;\n }): Promise<QmdSearchResult[]> {\n const query = options.query.trim();\n if (!query) return [];\n const maxResults = Math.max(0, Math.floor(options.maxResults ?? this.config.qmdMaxResults));\n if (maxResults === 0) return [];\n\n const method = options.mode ?? \"search\";\n const namespaces = Array.from(new Set(options.namespaces.map((value) => value.trim()).filter(Boolean)));\n if (namespaces.length === 0) return [];\n\n const resultsByNamespace = await Promise.all(\n namespaces.map(async (namespace) => {\n const record = await this.backendRecordFor(namespace);\n if (!record.available || record.collectionState === \"missing\") {\n // A per-namespace backend that is unavailable (or missing its\n // collection) must report like any other QMD skip (#1536): its\n // empty contribution is otherwise indistinguishable from a true\n // no-matches for that namespace (codex round-5 review on #1544).\n try {\n options.execution?.onDegradation?.({\n backend: \"qmd\",\n code: \"backend_unavailable\",\n detail:\n record.collectionState === \"missing\"\n ? `namespace collection missing: ${namespace}`\n : `namespace backend unavailable: ${namespace}`,\n });\n } catch {\n // Observers must never break search.\n }\n return { namespace, results: [] as QmdSearchResult[] };\n }\n const backendLimit = backendSearchLimit(record, maxResults);\n let results: QmdSearchResult[];\n switch (method) {\n case \"hybrid\":\n results = await record.backend.hybridSearch(\n query,\n record.collection,\n backendLimit,\n options.execution,\n );\n break;\n case \"bm25\":\n results = await record.backend.bm25Search(\n query,\n record.collection,\n backendLimit,\n options.execution,\n );\n break;\n case \"vector\":\n results = await record.backend.vectorSearch(\n query,\n record.collection,\n backendLimit,\n options.execution,\n );\n break;\n default:\n results = await record.backend.search(\n query,\n record.collection,\n backendLimit,\n options.searchOptions,\n options.execution,\n );\n break;\n }\n results = filterNamespaceSubtreeResults(record, results)\n .map((result) => ({\n ...result,\n namespace,\n // Resolve to an absolute path so the (namespace, path) identity is\n // globally unique — same-relative-path hits from different namespaces\n // stay distinct across every downstream consumer with no special\n // handling. Display/citation surfaces relativize for portability (#2020).\n path: resolveNamespaceResultPath(record.memoryDir, record.collection, result.path),\n }))\n // Reject hits whose resolved path escapes the queried namespace's\n // storage root (#2077). A stale/corrupt per-namespace collection can\n // return a path owned by another namespace; stamping it would let\n // downstream scope checks (which trust the stamped namespace) and\n // absolute-path resolution surface a foreign-namespace memory.\n .filter((result) => resolvedPathIsInsideNamespaceRoot(record.memoryDir, result.path));\n return { namespace, results };\n }),\n );\n\n return mergeNamespaceSearchResults(resultsByNamespace, maxResults);\n }\n\n /**\n * Update all namespace backends.\n * Returns the number of backends for which an update was attempted\n * (i.e., available and collection present). Callers can treat 0 as a\n * signal that no backend was eligible — useful for success-verification in\n * startup-sync when namespacesEnabled is true.\n */\n async updateNamespaces(\n namespaces: string[],\n execution?: SearchExecutionOptions,\n options?: { strict?: boolean },\n ): Promise<number> {\n return (await this.updateNamespacesDetailed(namespaces, execution, options)).backendCount;\n }\n\n async updateNamespacesDetailed(\n namespaces: string[],\n execution?: SearchExecutionOptions,\n options?: { strict?: boolean },\n ): Promise<NamespaceUpdateResult> {\n const unique = Array.from(new Set(namespaces.map((value) => value.trim()).filter(Boolean)));\n const eligible = (await Promise.all(\n unique.map(async (namespace) => {\n const record = await this.backendRecordFor(namespace);\n return record.available && record.collectionState !== \"missing\"\n ? { namespace, record }\n : null;\n }),\n )).filter((entry): entry is { namespace: string; record: NamespaceBackendRecord } => entry !== null);\n\n const globalEntry = eligible.find(({ record }) => record.backend.updatesAllCollections?.() === true);\n const scopedEntries = globalEntry\n ? eligible.filter(({ record }) => record.backend.updatesAllCollections?.() !== true)\n : eligible;\n\n await Promise.all([\n globalEntry\n ? updateBackendRecord(globalEntry.record, execution, options)\n : Promise.resolve(),\n ...scopedEntries.map(({ record }) => updateBackendRecord(record, execution, options)),\n ]);\n\n return {\n backendCount: (globalEntry ? 1 : 0) + scopedEntries.length,\n eligibleNamespaces: eligible.map(({ namespace }) => namespace),\n };\n }\n\n async embedNamespaces(namespaces: string[], options?: { strict?: boolean }): Promise<void> {\n const unique = Array.from(new Set(namespaces.map((value) => value.trim()).filter(Boolean)));\n await Promise.all(\n unique.map(async (namespace) => {\n const record = await this.backendRecordFor(namespace);\n if (!record.available || record.collectionState === \"missing\") return;\n await embedBackendRecord(record, options);\n }),\n );\n }\n\n async ensureNamespaceCollection(\n namespace: string,\n execution?: SearchExecutionOptions,\n ): Promise<\"present\" | \"missing\" | \"unknown\" | \"skipped\"> {\n const record = await this.backendRecordFor(namespace, execution);\n return record.collectionState;\n }\n\n async healthForNamespace(\n namespace: string,\n execution?: SearchExecutionOptions,\n ): Promise<NamespaceSearchHealth> {\n const key = namespace.trim() || this.config.defaultNamespace;\n const record = await this.createBackendRecordFor(\n key,\n execution,\n {\n autoCreateCollection: false,\n abortAsUnavailable: true,\n failOpenMissingGuardedCollection: false,\n },\n );\n try {\n const liveRecord = await this.liveCachedRecordForHealth(key, record, execution);\n const diagnosticBackend = liveRecord?.backend ?? record.backend;\n const versionStatus =\n \"getVersionStatus\" in diagnosticBackend &&\n typeof diagnosticBackend.getVersionStatus === \"function\"\n ? diagnosticBackend.getVersionStatus()\n : null;\n const daemonMode = daemonModeForBackend(diagnosticBackend);\n const backendStatus =\n \"status\" in diagnosticBackend &&\n typeof diagnosticBackend.status === \"function\"\n ? await Promise.race([\n diagnosticBackend.status().catch(() => null),\n new Promise<null>((resolve) => setTimeout(() => resolve(null), 5_000).unref?.()),\n ])\n : null;\n const collectionState =\n liveRecord?.collectionState === \"missing\"\n ? \"missing\"\n : record.collectionState;\n\n return {\n collection: record.collection,\n memoryDir: record.memoryDir,\n available: liveRecord?.available ?? record.available,\n collectionState,\n debugStatus: diagnosticBackend.debugStatus(),\n installedVersion: versionStatus?.installedVersion ?? null,\n supportedVersion: versionStatus?.supportedVersion ?? null,\n supported: versionStatus?.supported ?? null,\n upgradeAvailable: versionStatus?.upgradeAvailable ?? null,\n doctorAvailable: versionStatus?.capabilities?.doctor ?? null,\n daemonMode,\n pendingEmbeddings: backendStatus?.pendingEmbeddings ?? null,\n oldestPendingAgeMs: backendStatus?.oldestPendingAgeMs ?? null,\n embeddingBacklogThreshold: this.config.qmdEmbeddingBacklogThreshold,\n };\n } finally {\n const dispose = (record.backend as { dispose?: () => void | Promise<void> }).dispose;\n await dispose?.call(record.backend);\n }\n }\n\n private async liveCachedRecordForHealth(\n key: string,\n disposableRecord: NamespaceBackendRecord,\n execution?: SearchExecutionOptions,\n ): Promise<NamespaceBackendRecord | null> {\n const pending = this.cache.get(key);\n if (!pending) return null;\n const cachedRecord = await awaitWithAbort(pending, execution?.signal).catch(() => null);\n if (!cachedRecord) return null;\n if (cachedRecord.collection !== disposableRecord.collection) return null;\n if (cachedRecord.memoryDir !== disposableRecord.memoryDir) return null;\n return cachedRecord;\n }\n\n /** Clear cached backend records so the next access re-probes availability. */\n clearCache(): void {\n this.cache.clear();\n }\n\n /** Release any per-namespace backend handles held by cached records. */\n async dispose(): Promise<void> {\n const pendingRecords = Array.from(this.cache.values());\n this.cache.clear();\n const settled = await Promise.allSettled(pendingRecords);\n await Promise.allSettled(\n settled.flatMap((entry) => {\n if (entry.status !== \"fulfilled\") return [];\n const dispose = (entry.value.backend as { dispose?: () => void | Promise<void> }).dispose;\n return dispose ? [dispose.call(entry.value.backend)] : [];\n }),\n );\n }\n\n private async backendRecordFor(\n namespace: string,\n execution?: SearchExecutionOptions,\n ): Promise<NamespaceBackendRecord> {\n const key = namespace.trim() || this.config.defaultNamespace;\n const existing = this.cache.get(key);\n if (existing) return await existing;\n\n const pending = this.createBackendRecordFor(key, execution, {\n autoCreateCollection: true,\n abortAsUnavailable: false,\n failOpenMissingGuardedCollection: true,\n }).catch((error) => {\n this.cache.delete(key);\n throw error;\n });\n\n this.cache.set(key, pending);\n return await pending;\n }\n\n private async createBackendRecordFor(\n namespace: string,\n execution: SearchExecutionOptions | undefined,\n options: BackendRecordOptions,\n ): Promise<NamespaceBackendRecord> {\n const key = namespace.trim() || this.config.defaultNamespace;\n const storage = await this.storageRouter.storageFor(key);\n const useLegacyDefaultCollection =\n key === this.config.defaultNamespace && storage.dir === this.config.memoryDir;\n const filtersNestedNamespaces =\n resolveNamespaceCapabilities(this.config).namespaces === true && useLegacyDefaultCollection;\n const rootHostEmbeddingScope =\n (this.config as NamespaceScopedSearchConfig).hostEmbeddingProviderScope ??\n this.config.memoryDir;\n const scopedConfig: NamespaceScopedSearchConfig = {\n ...this.config,\n memoryDir: storage.dir,\n hostEmbeddingProviderScope: rootHostEmbeddingScope,\n qmdCollection: namespaceCollectionName(this.config.qmdCollection, key, {\n defaultNamespace: this.config.defaultNamespace,\n useLegacyDefaultCollection,\n }),\n };\n\n const backend = this.createBackend(scopedConfig);\n try {\n const availabilityProbe =\n options.autoCreateCollection || typeof backend.checkAvailability !== \"function\"\n ? backend.probe()\n : backend.checkAvailability({ signal: execution?.signal });\n const available = await awaitWithAbort(availabilityProbe, execution?.signal).catch((error) => {\n if (error instanceof NamespaceSearchAbortError && !options.abortAsUnavailable) {\n throw error;\n }\n return false;\n });\n const collectionState = available\n ? await awaitWithAbort(\n // The legacy default namespace at the flat root (`filtersNestedNamespaces`)\n // shares its `memoryDir` with the `namespaces/` container, so its base\n // collection is a \"broad root\" that also indexes nested-namespace files.\n // We STILL auto-create it (issue #1929): the search side already targets\n // this exact base collection and `filterNamespaceSubtreeResults` strips\n // the nested `namespaces/` subtree out of its results, so index and\n // search stay symmetric. Skipping creation left a configured default\n // namespace (e.g. `geek`) with maintenance \"ran\" but no collection and 0\n // recall results. `ensureCollection` is a no-op when the collection is\n // already present, so legacy installs that pre-created the broad root are\n // unaffected.\n this.collectionStateForBackend(backend, storage.dir, scopedConfig.qmdCollection, {\n autoCreate: options.autoCreateCollection,\n failOpenMissingGuardedCollection: options.failOpenMissingGuardedCollection,\n execution,\n }),\n execution?.signal,\n ).catch((error) => {\n if (error instanceof NamespaceSearchAbortError && !options.abortAsUnavailable) {\n throw error;\n }\n return \"unknown\" as const;\n })\n : \"unknown\";\n return {\n backend,\n collection: scopedConfig.qmdCollection,\n memoryDir: storage.dir,\n available,\n collectionState,\n filtersNestedNamespaces,\n };\n } catch (error) {\n const dispose = (backend as { dispose?: () => void | Promise<void> }).dispose;\n if (dispose) {\n await Promise.resolve(dispose.call(backend)).catch(() => {});\n }\n throw error;\n }\n }\n\n private async collectionStateForBackend(\n backend: SearchBackend,\n memoryDir: string,\n collection: string,\n options: {\n autoCreate: boolean;\n failOpenMissingGuardedCollection: boolean;\n execution?: SearchExecutionOptions;\n },\n ): Promise<CollectionState> {\n if (!options.autoCreate) {\n if (!backend.checkCollection) return \"unknown\";\n const collectionState = await backend\n .checkCollection(collection, options.execution)\n .catch(() => \"unknown\" as const);\n return options.failOpenMissingGuardedCollection && collectionState === \"missing\"\n ? \"unknown\"\n : collectionState;\n }\n return await backend.ensureCollection(memoryDir, collection, options.execution).catch(() => \"unknown\" as const);\n }\n}\n\nclass NamespaceSearchAbortError extends Error {\n constructor() {\n super(\"operation aborted\");\n }\n}\n\nfunction awaitWithAbort<T>(operation: Promise<T>, signal?: AbortSignal): Promise<T> {\n if (!signal) return operation;\n if (signal.aborted) return Promise.reject(new NamespaceSearchAbortError());\n\n return new Promise<T>((resolve, reject) => {\n const onAbort = () => {\n signal.removeEventListener(\"abort\", onAbort);\n reject(new NamespaceSearchAbortError());\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n operation.then(resolve, reject).finally(() => {\n signal.removeEventListener(\"abort\", onAbort);\n });\n });\n}\n\nfunction filterNamespaceSubtreeResults(\n record: NamespaceBackendRecord,\n results: QmdSearchResult[],\n): QmdSearchResult[] {\n if (!record.filtersNestedNamespaces) return results;\n return results.filter((result) =>\n !pathIsInsideNamespaceSubtree(record.memoryDir, record.collection, result.path)\n );\n}\n\nfunction backendSearchLimit(\n record: NamespaceBackendRecord,\n maxResults: number,\n): number {\n if (!record.filtersNestedNamespaces) return maxResults;\n return Math.max(\n maxResults,\n maxResults * NESTED_NAMESPACE_FILTER_OVERFETCH_FACTOR,\n NESTED_NAMESPACE_FILTER_OVERFETCH_MIN,\n );\n}\n\nasync function updateBackendRecord(\n record: NamespaceBackendRecord,\n execution?: SearchExecutionOptions,\n options?: { strict?: boolean },\n): Promise<void> {\n if (options?.strict === true) {\n if (\n record.backend.updatesAllCollections?.() === true &&\n typeof record.backend.updateStrict === \"function\"\n ) {\n await record.backend.updateStrict(execution);\n return;\n }\n if (typeof record.backend.updateCollectionStrict === \"function\") {\n await record.backend.updateCollectionStrict(record.collection, execution);\n return;\n }\n }\n await record.backend.update(execution);\n}\n\nasync function embedBackendRecord(\n record: NamespaceBackendRecord,\n options?: { strict?: boolean },\n): Promise<void> {\n if (options?.strict === true) {\n if (typeof record.backend.embedCollectionStrict === \"function\") {\n await record.backend.embedCollectionStrict(record.collection);\n return;\n }\n if (typeof record.backend.embedStrict === \"function\") {\n await record.backend.embedStrict();\n return;\n }\n }\n if (typeof record.backend.embedCollection === \"function\") {\n await record.backend.embedCollection(record.collection);\n return;\n }\n await record.backend.embed();\n}\n\nfunction daemonModeForBackend(backend: SearchBackend): boolean | null {\n return \"isDaemonMode\" in backend && typeof backend.isDaemonMode === \"function\"\n ? backend.isDaemonMode() === true\n : null;\n}\n\nfunction isContainedPath(root: string, candidate: string): boolean {\n const relative = path.relative(root, candidate);\n return (\n relative === \"\" ||\n (relative !== \"..\" && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative))\n );\n}\n\nfunction pathIsInsideNamespaceSubtree(\n memoryDir: string,\n collection: string,\n resultPath: string | undefined,\n): boolean {\n if (!resultPath) return false;\n const normalizedResultPath = normalizeQmdResultPath(resultPath, collection);\n const memoryRoot = path.resolve(memoryDir);\n const namespacesRoot = path.join(memoryRoot, \"namespaces\");\n const candidate = path.isAbsolute(normalizedResultPath)\n ? path.normalize(normalizedResultPath)\n : path.resolve(memoryRoot, normalizedResultPath);\n return isContainedPath(namespacesRoot, candidate);\n}\n\n/**\n * Reject a QMD hit whose resolved path escapes the queried namespace's storage\n * root (#2077). `resolvedPath` is the already-resolved value produced by\n * `resolveNamespaceResultPath`; a stale/corrupt per-namespace collection can\n * yield an absolute path owned by another namespace, and stamping it with the\n * queried namespace would surface a foreign-namespace memory downstream.\n *\n * Lexical containment runs first — it is cheap and the only check possible when\n * the file is not yet on disk (a stale collection may cite a since-deleted\n * path). When both root and candidate exist, their filesystem realpaths are\n * canonicalized and re-checked so a symlink planted inside the namespace root\n * cannot resolve into another namespace or outside storage. An unresolved path\n * (ENOENT) keeps the lexical result rather than rejecting the stale-collection\n * case this guard targets.\n */\nfunction resolvedPathIsInsideNamespaceRoot(memoryDir: string, resolvedPath: string): boolean {\n const root = path.resolve(memoryDir);\n const candidate = path.isAbsolute(resolvedPath)\n ? path.normalize(resolvedPath)\n : path.resolve(root, resolvedPath);\n if (!isContainedPath(root, candidate)) return false;\n try {\n return isContainedPath(realpathSync.native(root), realpathSync.native(candidate));\n } catch {\n return true;\n }\n}\nexport function normalizeQmdResultPath(resultPath: string, collection: string): string {\n let value = resultPath.trim();\n if (value.startsWith(\"qmd://\")) {\n try {\n const parsed = new URL(value);\n if (parsed.protocol === \"qmd:\" && parsed.hostname === collection) {\n value = decodeURIComponent(parsed.pathname.replace(/^\\/+/, \"\"));\n }\n } catch {\n const remainder = value.slice(\"qmd://\".length);\n const slashIndex = remainder.indexOf(\"/\");\n if (slashIndex !== -1) {\n value = remainder.slice(slashIndex + 1);\n }\n }\n }\n\n // Only strip a genuine QMD collection prefix — never when the collection name\n // collides with a memory category dir (e.g. qmdCollection == \"facts\"), or a\n // bare \"facts/<id>.md\" hit would be corrupted to \"<id>.md\" and fail namespace\n // reads/access tracking (#2020).\n const collectionPrefix = `${collection}/`;\n if (value.startsWith(collectionPrefix) && !ALL_CATEGORY_DIRS.includes(collection)) {\n value = value.slice(collectionPrefix.length);\n }\n return value;\n}\nfunction resolveNamespaceResultPath(\n memoryDir: string,\n collection: string,\n resultPath: string,\n): string {\n const normalized = normalizeQmdResultPath(resultPath, collection);\n if (path.isAbsolute(normalized)) return normalized;\n const root = path.resolve(memoryDir);\n const resolved = path.resolve(root, normalized);\n const relative = path.relative(root, resolved);\n if (relative === \"\" || relative.startsWith(\"..\") || path.isAbsolute(relative)) {\n return resultPath;\n }\n return resolved;\n}\nfunction mergeNamespaceSearchResults(\n lists: Array<{ namespace: string; results: QmdSearchResult[] }>,\n maxResults: number,\n): QmdSearchResult[] {\n const merged = new Map<string, QmdSearchResult>();\n\n for (const { namespace, results } of lists) {\n for (const result of results) {\n const key = `${namespace}\\0${result.path || result.docid}`;\n const existing = merged.get(key);\n if (!existing) {\n merged.set(key, { ...result, namespace });\n continue;\n }\n if (result.score > existing.score) {\n merged.set(key, {\n ...result,\n namespace,\n snippet: existing.snippet || result.snippet || \"\",\n });\n }\n }\n }\n\n return [...merged.values()]\n .sort((a, b) => b.score - a.score)\n .slice(0, maxResults);\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  StorageManager
3
- } from "./chunk-4BJQODZF.js";
3
+ } from "./chunk-7HZMTXXB.js";
4
4
  import {
5
5
  getCachedRuleMemories,
6
6
  setCachedRuleMemories
@@ -119,4 +119,4 @@ export {
119
119
  compareVerifiedSemanticRuleResults,
120
120
  searchVerifiedSemanticRules
121
121
  };
122
- //# sourceMappingURL=chunk-FFPJINJE.js.map
122
+ //# sourceMappingURL=chunk-IQFS4AU7.js.map
@@ -22,14 +22,14 @@ import {
22
22
  import {
23
23
  LocalLlmClient
24
24
  } from "./chunk-6KIQT7RG.js";
25
- import {
26
- delinearize
27
- } from "./chunk-VEWZZM3H.js";
28
25
  import {
29
26
  buildExtensionsFooterForSummary,
30
27
  formatDaySummaryMemories,
31
28
  loadDaySummaryPrompt
32
29
  } from "./chunk-S2FSBU4H.js";
30
+ import {
31
+ delinearize
32
+ } from "./chunk-VEWZZM3H.js";
33
33
  import {
34
34
  isTransientHttpError
35
35
  } from "./chunk-C7SRUWBW.js";
@@ -2477,4 +2477,4 @@ export {
2477
2477
  classifyFallbackParseFailure,
2478
2478
  ExtractionEngine
2479
2479
  };
2480
- //# sourceMappingURL=chunk-EKBNDKDY.js.map
2480
+ //# sourceMappingURL=chunk-KN6UGAQB.js.map
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-GDB4J2H3.js";
9
9
  import {
10
10
  importCapsule
11
- } from "./chunk-AJ7QCSIS.js";
11
+ } from "./chunk-ALSGMEJR.js";
12
12
  import {
13
13
  WriteQuarantineStore
14
14
  } from "./chunk-PJSK6OJM.js";
@@ -29,7 +29,7 @@ import {
29
29
  } from "./chunk-JGSKJHF7.js";
30
30
  import {
31
31
  planSessionTranscriptMigration
32
- } from "./chunk-6DRPPQEJ.js";
32
+ } from "./chunk-P5FPO2BR.js";
33
33
  import {
34
34
  decideDisclosureEscalation
35
35
  } from "./chunk-H7XKCNR6.js";
@@ -41,7 +41,7 @@ import {
41
41
  } from "./chunk-U3ZAVRP3.js";
42
42
  import {
43
43
  namespaceCollectionName
44
- } from "./chunk-IFH6LWTO.js";
44
+ } from "./chunk-IAHNKI2E.js";
45
45
  import {
46
46
  buildProposedActions,
47
47
  buildQualityScore,
@@ -49,7 +49,7 @@ import {
49
49
  listMemoryGovernanceRuns,
50
50
  readMemoryGovernanceRunArtifact,
51
51
  runMemoryGovernance
52
- } from "./chunk-5Q7EVV4X.js";
52
+ } from "./chunk-HLG7VAZP.js";
53
53
  import {
54
54
  recordObjectiveStateSnapshotsFromObservedMessages
55
55
  } from "./chunk-ICP53SKG.js";
@@ -100,6 +100,9 @@ import {
100
100
  CrossNamespaceBudget,
101
101
  toBudgetWarning
102
102
  } from "./chunk-UFGFMWAD.js";
103
+ import {
104
+ defaultCapsulesDir
105
+ } from "./chunk-ZY2MNJR6.js";
103
106
  import {
104
107
  filterTrajectoriesByLookbackDays,
105
108
  readCausalTrajectoryRecords
@@ -110,19 +113,16 @@ import {
110
113
  enqueuePassiveCorrectionNotification,
111
114
  parseBriefingFocus,
112
115
  parseBriefingWindow
113
- } from "./chunk-KAVBJSBQ.js";
116
+ } from "./chunk-7G7DVA2C.js";
114
117
  import {
115
118
  parseEntityFile,
116
119
  qmdCollectionPathParts,
117
120
  qmdResultPathCandidates,
118
121
  selfDeps
119
- } from "./chunk-4BJQODZF.js";
122
+ } from "./chunk-7HZMTXXB.js";
120
123
  import {
121
124
  supersessionKeysForFact
122
125
  } from "./chunk-DNHVPZOD.js";
123
- import {
124
- isPathInsideStorageRoot
125
- } from "./chunk-FF4KLI5W.js";
126
126
  import {
127
127
  DEFAULT_RECALL_DISCLOSURE,
128
128
  isRecallDisclosure
@@ -133,6 +133,10 @@ import {
133
133
  import {
134
134
  serializeMutations
135
135
  } from "./chunk-WL5EBRDH.js";
136
+ import {
137
+ normalizeProjectionPreview,
138
+ normalizeProjectionTags
139
+ } from "./chunk-SCU65EZI.js";
136
140
  import {
137
141
  getMemoryProjectionPath
138
142
  } from "./chunk-347WD2LE.js";
@@ -143,10 +147,6 @@ import {
143
147
  inferMemoryStatus,
144
148
  toMemoryPathRel
145
149
  } from "./chunk-ILGC6JH6.js";
146
- import {
147
- normalizeProjectionPreview,
148
- normalizeProjectionTags
149
- } from "./chunk-SCU65EZI.js";
150
150
  import {
151
151
  STRUCTURED_ATTRIBUTE_LIMITS,
152
152
  buildAccessWriteRequestFingerprint,
@@ -168,9 +168,6 @@ import {
168
168
  import {
169
169
  computeContentHash
170
170
  } from "./chunk-W5H6ZRPT.js";
171
- import {
172
- defaultCapsulesDir
173
- } from "./chunk-ZY2MNJR6.js";
174
171
  import {
175
172
  sanitizeMemoryContent
176
173
  } from "./chunk-5GKPFL3S.js";
@@ -183,7 +180,7 @@ import {
183
180
  } from "./chunk-JAKIDQB2.js";
184
181
  import {
185
182
  exportCapsule
186
- } from "./chunk-VDX2J7OX.js";
183
+ } from "./chunk-5W7CTZ2E.js";
187
184
  import {
188
185
  evaluateActionConfidence
189
186
  } from "./chunk-Z2YFLXHU.js";
@@ -197,13 +194,11 @@ import {
197
194
  compileOfflineSyncExcludeGlobs,
198
195
  iterateOfflineSyncSnapshotFileRecords,
199
196
  readOfflineSyncFileContentChunk
200
- } from "./chunk-72VAXGEI.js";
201
- import {
202
- SecureStoreLockedError
203
- } from "./chunk-AIK5W3IW.js";
197
+ } from "./chunk-E4OCKU67.js";
204
198
  import {
205
- ALL_CATEGORY_DIRS
206
- } from "./chunk-VS2IYZRU.js";
199
+ EngramAccessInputError,
200
+ NamespaceNotWritableError
201
+ } from "./chunk-2Z24E5W2.js";
207
202
  import {
208
203
  AccessIdempotencyStore,
209
204
  hashAccessIdempotencyPayload
@@ -244,16 +239,21 @@ import {
244
239
  import {
245
240
  AccessAuditAdapter
246
241
  } from "./chunk-TVVEYCNW.js";
242
+ import {
243
+ decodeCitationNamespace
244
+ } from "./chunk-3PDOVUHC.js";
245
+ import {
246
+ isPathInsideStorageRoot
247
+ } from "./chunk-FF4KLI5W.js";
248
+ import {
249
+ SecureStoreLockedError
250
+ } from "./chunk-AIK5W3IW.js";
247
251
  import {
248
252
  recordCitationUsage
249
253
  } from "./chunk-NINSR6LX.js";
250
254
  import {
251
255
  log
252
256
  } from "./chunk-3WCASNQZ.js";
253
- import {
254
- EngramAccessInputError,
255
- NamespaceNotWritableError
256
- } from "./chunk-2Z24E5W2.js";
257
257
 
258
258
  // src/access-service.ts
259
259
  import { stat as stat2 } from "fs/promises";
@@ -10964,13 +10964,12 @@ var EngramAccessService = class {
10964
10964
  if (nodePath3.isAbsolute(memoryPath)) {
10965
10965
  throw new EngramAccessInputError("cited path is outside the caller's readable namespaces");
10966
10966
  }
10967
- let nsMatch = "";
10968
- for (const ns of authorizedNamespaces) {
10969
- if (!ns || ALL_CATEGORY_DIRS.includes(ns)) continue;
10970
- if ((memoryPath === ns || memoryPath.startsWith(`${ns}/`)) && ns.length > nsMatch.length) nsMatch = ns;
10971
- }
10972
- if (nsMatch) return nsMatch;
10973
- return fallbackNamespace;
10967
+ return decodeCitationNamespace(
10968
+ (ns) => this.orchestrator.getStorage(ns),
10969
+ authorizedNamespaces,
10970
+ memoryPath,
10971
+ fallbackNamespace
10972
+ );
10974
10973
  }
10975
10974
  return resolved.namespace;
10976
10975
  },
@@ -11979,4 +11978,4 @@ export {
11979
11978
  EngramAccessService,
11980
11979
  AccessAdminOpsSurface
11981
11980
  };
11982
- //# sourceMappingURL=chunk-XQDRKZ7V.js.map
11981
+ //# sourceMappingURL=chunk-KQILYXND.js.map