@remnic/core 9.57.4 → 9.57.5

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 (202) hide show
  1. package/dist/access-admin-ops-surface.js +23 -23
  2. package/dist/access-authorization-probe.js +24 -24
  3. package/dist/access-boundary.js +23 -23
  4. package/dist/access-cli.js +57 -57
  5. package/dist/access-extraction-force-flush.js +23 -23
  6. package/dist/access-http-query.js +23 -23
  7. package/dist/access-http.js +34 -34
  8. package/dist/access-identity-continuity-surface.js +23 -23
  9. package/dist/access-lcm-surface.js +23 -23
  10. package/dist/access-mcp.js +30 -30
  11. package/dist/access-memory-search-fanout.js +4 -3
  12. package/dist/access-namespace-preflight.js +23 -23
  13. package/dist/access-observe-write-surface.js +23 -23
  14. package/dist/access-offline-manifest.js +10 -10
  15. package/dist/access-operations-batch.js +26 -26
  16. package/dist/access-operations.js +29 -29
  17. package/dist/access-recall-concurrency.js +23 -23
  18. package/dist/access-recall-response.js +23 -23
  19. package/dist/access-recall-surface.js +23 -23
  20. package/dist/access-service.js +23 -23
  21. package/dist/access-surface-catalog.js +25 -25
  22. package/dist/active-memory-bridge.js +5 -5
  23. package/dist/briefing.js +5 -5
  24. package/dist/buffer.js +6 -5
  25. package/dist/causal-consolidation.js +7 -7
  26. package/dist/{chunk-O54B5YNM.js → chunk-24PNX2GF.js} +3 -3
  27. package/dist/{chunk-ONCWJBWV.js → chunk-3AJOJOFP.js} +2 -2
  28. package/dist/{chunk-QSDPVZPD.js → chunk-4O6R3GPK.js} +8 -8
  29. package/dist/{chunk-IXGQP4RZ.js → chunk-4SGDYYWV.js} +4 -4
  30. package/dist/{chunk-UTDMY476.js → chunk-4UUF2EX3.js} +3 -3
  31. package/dist/{chunk-T6EQPZ6E.js → chunk-4YZCIK5E.js} +16 -14
  32. package/dist/chunk-4YZCIK5E.js.map +1 -0
  33. package/dist/{chunk-S6AH7WSF.js → chunk-5PGYCWA7.js} +5 -5
  34. package/dist/{chunk-7NSC4IVA.js → chunk-6RK2X7BR.js} +3 -3
  35. package/dist/{chunk-VWP5DEHU.js → chunk-6SX4MY5Q.js} +2 -2
  36. package/dist/{chunk-GUNIXT36.js → chunk-7BY7V4YX.js} +2 -2
  37. package/dist/{chunk-R7UHWPYI.js → chunk-7PJARJS4.js} +3 -3
  38. package/dist/{chunk-V3IT3XNG.js → chunk-7VSHDLJQ.js} +6 -6
  39. package/dist/{chunk-SFCJCMZQ.js → chunk-A7266TRJ.js} +2 -2
  40. package/dist/{chunk-4THNU7OF.js → chunk-AW4A4XOP.js} +22 -22
  41. package/dist/{chunk-IFFW25NG.js → chunk-C5B3CIMJ.js} +34 -34
  42. package/dist/{chunk-TF3LMM5E.js → chunk-CSV34HIW.js} +3 -3
  43. package/dist/{chunk-FK7T55BA.js → chunk-CZUHNJHX.js} +19 -19
  44. package/dist/{chunk-NFQB6RJT.js → chunk-D4OCJSLV.js} +3 -3
  45. package/dist/{chunk-JKL53MOY.js → chunk-DLQQU4EG.js} +3 -3
  46. package/dist/{chunk-CME347TM.js → chunk-DNC4A7RS.js} +2 -2
  47. package/dist/{chunk-F2JRDPON.js → chunk-EGBDFJ36.js} +2 -2
  48. package/dist/{chunk-TFXYQNBH.js → chunk-FI3PIOOI.js} +9 -9
  49. package/dist/{chunk-CKSEJD7K.js → chunk-FKTD7IVS.js} +2 -2
  50. package/dist/{chunk-FONW766A.js → chunk-GXIY65UH.js} +2 -2
  51. package/dist/{chunk-2YREVL4T.js → chunk-HZC3OECF.js} +2 -2
  52. package/dist/{chunk-X5OIPQME.js → chunk-HZNYJN77.js} +6 -6
  53. package/dist/{chunk-LYPG7GOO.js → chunk-I2GIYTRU.js} +2 -2
  54. package/dist/{chunk-FR3FNPCJ.js → chunk-IT57AOMC.js} +4 -4
  55. package/dist/{chunk-CMRUIKVA.js → chunk-KCT36JAW.js} +25 -9
  56. package/dist/chunk-KCT36JAW.js.map +1 -0
  57. package/dist/{chunk-KJH6W2I7.js → chunk-L3CHRBHE.js} +4 -4
  58. package/dist/{chunk-PSH3VFZ7.js → chunk-L3LRWDJW.js} +7 -7
  59. package/dist/{chunk-JFPZEWY3.js → chunk-LIF6DO6U.js} +37 -13
  60. package/dist/chunk-LIF6DO6U.js.map +1 -0
  61. package/dist/{chunk-QZR3WT3L.js → chunk-LJJWFV2Q.js} +2 -2
  62. package/dist/{chunk-TLVLJSWS.js → chunk-LRDP2AC2.js} +2 -2
  63. package/dist/{chunk-QV7OEHFN.js → chunk-LTBKKSCX.js} +2 -2
  64. package/dist/{chunk-IGWVMA4Y.js → chunk-MRV7VSQK.js} +20 -10
  65. package/dist/chunk-MRV7VSQK.js.map +1 -0
  66. package/dist/{chunk-6P2NUVM5.js → chunk-NEJQ65NV.js} +2 -2
  67. package/dist/{chunk-7PKNOXYB.js → chunk-NTJ6TY44.js} +2 -2
  68. package/dist/{chunk-HYVBJLEK.js → chunk-O5AFC5KM.js} +2 -2
  69. package/dist/{chunk-U3PN77QT.js → chunk-PCXDUHQH.js} +11 -4
  70. package/dist/chunk-PCXDUHQH.js.map +1 -0
  71. package/dist/{chunk-N655QIA2.js → chunk-PEDYKCJI.js} +3 -3
  72. package/dist/{chunk-TVKWT2CY.js → chunk-Q57GOHLF.js} +11 -9
  73. package/dist/{chunk-TVKWT2CY.js.map → chunk-Q57GOHLF.js.map} +1 -1
  74. package/dist/{chunk-4QFCAKNM.js → chunk-RUZM6Z52.js} +1 -1
  75. package/dist/{chunk-O4TTIMOP.js → chunk-SFR7J2G6.js} +2 -2
  76. package/dist/{chunk-ION47U3Z.js → chunk-SNW3YRO6.js} +2 -2
  77. package/dist/{chunk-XL24QQ63.js → chunk-TBUEE7XF.js} +2 -2
  78. package/dist/{chunk-TAPFJ3ET.js → chunk-U7XLOSG2.js} +3 -3
  79. package/dist/{chunk-T3HC7RJ7.js → chunk-USAUBGBC.js} +2 -2
  80. package/dist/{chunk-TAMY4NKO.js → chunk-USGKHF36.js} +2 -2
  81. package/dist/{chunk-XRPPHIRI.js → chunk-VUDALPI5.js} +2 -2
  82. package/dist/{chunk-EGGE52UU.js → chunk-VUFL7X3H.js} +13 -6
  83. package/dist/chunk-VUFL7X3H.js.map +1 -0
  84. package/dist/{chunk-HC55YCNK.js → chunk-VYIXCMUP.js} +4 -4
  85. package/dist/{chunk-HQ2VGCGP.js → chunk-XBGLEOID.js} +8 -8
  86. package/dist/{chunk-XX4HPFFM.js → chunk-XDL5CYZN.js} +4 -4
  87. package/dist/{chunk-THACANBI.js → chunk-YOKSRIFI.js} +3 -3
  88. package/dist/{chunk-BWJMBJCY.js → chunk-YTZA7U6Q.js} +6 -6
  89. package/dist/{chunk-4KM3V6VS.js → chunk-ZN7SMKAK.js} +2 -2
  90. package/dist/cli.js +45 -45
  91. package/dist/compounding/engine.js +5 -5
  92. package/dist/connectors/codex-materialize-runner.js +6 -6
  93. package/dist/connectors/index.js +6 -6
  94. package/dist/contradiction/index.js +3 -3
  95. package/dist/{contradiction-scan-522AYLQC.js → contradiction-scan-VOTQRRSX.js} +4 -4
  96. package/dist/convergence-refresh.js +7 -7
  97. package/dist/corpus-watermark.js +8 -8
  98. package/dist/entity-retrieval.js +5 -5
  99. package/dist/explicit-capture.js +4 -4
  100. package/dist/external-wiki-access.js +24 -24
  101. package/dist/extraction.js +11 -11
  102. package/dist/{first-start-migration-HZ4VPRFQ.js → first-start-migration-4NETATFF.js} +4 -4
  103. package/dist/{graph-edge-decay-ZXGBXNPW.js → graph-edge-decay-A4SDFMMS.js} +4 -3
  104. package/dist/harmonic-retrieval.js +1 -1
  105. package/dist/index.js +57 -57
  106. package/dist/maintenance/memory-governance.js +5 -5
  107. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +5 -5
  108. package/dist/maintenance/rebuild-memory-projection.js +6 -6
  109. package/dist/namespaces/migrate.js +7 -7
  110. package/dist/namespaces/principal.js +3 -2
  111. package/dist/namespaces/search.js +2 -2
  112. package/dist/namespaces/storage.js +6 -6
  113. package/dist/offline-sync-impression-drain.js +6 -6
  114. package/dist/operator-doctor-corpus.js +9 -9
  115. package/dist/operator-toolkit.js +16 -16
  116. package/dist/orchestration/maintenance.js +14 -14
  117. package/dist/orchestrator.js +57 -57
  118. package/dist/reconcile/manifest.js +3 -3
  119. package/dist/reconcile/plan.js +2 -2
  120. package/dist/routing/engine.js +2 -1
  121. package/dist/routing/store.js +3 -2
  122. package/dist/semantic-consolidation.js +7 -7
  123. package/dist/semantic-rule-promotion.js +5 -5
  124. package/dist/semantic-rule-verifier.js +5 -5
  125. package/dist/source-agent-qualifier.js +10 -10
  126. package/dist/storage.js +4 -4
  127. package/dist/support-passport/index.js +26 -26
  128. package/dist/tier-routing.js +3 -3
  129. package/dist/{tier-stats-7E6OBUSD.js → tier-stats-4B5IJ3NE.js} +4 -4
  130. package/dist/verified-recall.js +5 -5
  131. package/package.json +2 -2
  132. package/src/namespaces/catalog.ts +9 -9
  133. package/src/namespaces/identity.ts +15 -6
  134. package/src/namespaces/principal.test.ts +10 -1
  135. package/src/namespaces/principal.ts +17 -9
  136. package/src/namespaces/scope-profiles.ts +35 -13
  137. package/src/namespaces/storage.ts +63 -13
  138. package/src/namespaces/unicode-routing.test.ts +71 -0
  139. package/src/routing/engine.test.ts +30 -0
  140. package/src/routing/engine.ts +12 -3
  141. package/src/scopes/scope-plan.ts +8 -2
  142. package/src/storage-contract/namespace-routing.test.ts +18 -1
  143. package/dist/chunk-CMRUIKVA.js.map +0 -1
  144. package/dist/chunk-EGGE52UU.js.map +0 -1
  145. package/dist/chunk-IGWVMA4Y.js.map +0 -1
  146. package/dist/chunk-JFPZEWY3.js.map +0 -1
  147. package/dist/chunk-T6EQPZ6E.js.map +0 -1
  148. package/dist/chunk-U3PN77QT.js.map +0 -1
  149. /package/dist/{chunk-O54B5YNM.js.map → chunk-24PNX2GF.js.map} +0 -0
  150. /package/dist/{chunk-ONCWJBWV.js.map → chunk-3AJOJOFP.js.map} +0 -0
  151. /package/dist/{chunk-QSDPVZPD.js.map → chunk-4O6R3GPK.js.map} +0 -0
  152. /package/dist/{chunk-IXGQP4RZ.js.map → chunk-4SGDYYWV.js.map} +0 -0
  153. /package/dist/{chunk-UTDMY476.js.map → chunk-4UUF2EX3.js.map} +0 -0
  154. /package/dist/{chunk-S6AH7WSF.js.map → chunk-5PGYCWA7.js.map} +0 -0
  155. /package/dist/{chunk-7NSC4IVA.js.map → chunk-6RK2X7BR.js.map} +0 -0
  156. /package/dist/{chunk-VWP5DEHU.js.map → chunk-6SX4MY5Q.js.map} +0 -0
  157. /package/dist/{chunk-GUNIXT36.js.map → chunk-7BY7V4YX.js.map} +0 -0
  158. /package/dist/{chunk-R7UHWPYI.js.map → chunk-7PJARJS4.js.map} +0 -0
  159. /package/dist/{chunk-V3IT3XNG.js.map → chunk-7VSHDLJQ.js.map} +0 -0
  160. /package/dist/{chunk-SFCJCMZQ.js.map → chunk-A7266TRJ.js.map} +0 -0
  161. /package/dist/{chunk-4THNU7OF.js.map → chunk-AW4A4XOP.js.map} +0 -0
  162. /package/dist/{chunk-IFFW25NG.js.map → chunk-C5B3CIMJ.js.map} +0 -0
  163. /package/dist/{chunk-TF3LMM5E.js.map → chunk-CSV34HIW.js.map} +0 -0
  164. /package/dist/{chunk-FK7T55BA.js.map → chunk-CZUHNJHX.js.map} +0 -0
  165. /package/dist/{chunk-NFQB6RJT.js.map → chunk-D4OCJSLV.js.map} +0 -0
  166. /package/dist/{chunk-JKL53MOY.js.map → chunk-DLQQU4EG.js.map} +0 -0
  167. /package/dist/{chunk-CME347TM.js.map → chunk-DNC4A7RS.js.map} +0 -0
  168. /package/dist/{chunk-F2JRDPON.js.map → chunk-EGBDFJ36.js.map} +0 -0
  169. /package/dist/{chunk-TFXYQNBH.js.map → chunk-FI3PIOOI.js.map} +0 -0
  170. /package/dist/{chunk-CKSEJD7K.js.map → chunk-FKTD7IVS.js.map} +0 -0
  171. /package/dist/{chunk-FONW766A.js.map → chunk-GXIY65UH.js.map} +0 -0
  172. /package/dist/{chunk-2YREVL4T.js.map → chunk-HZC3OECF.js.map} +0 -0
  173. /package/dist/{chunk-X5OIPQME.js.map → chunk-HZNYJN77.js.map} +0 -0
  174. /package/dist/{chunk-LYPG7GOO.js.map → chunk-I2GIYTRU.js.map} +0 -0
  175. /package/dist/{chunk-FR3FNPCJ.js.map → chunk-IT57AOMC.js.map} +0 -0
  176. /package/dist/{chunk-KJH6W2I7.js.map → chunk-L3CHRBHE.js.map} +0 -0
  177. /package/dist/{chunk-PSH3VFZ7.js.map → chunk-L3LRWDJW.js.map} +0 -0
  178. /package/dist/{chunk-QZR3WT3L.js.map → chunk-LJJWFV2Q.js.map} +0 -0
  179. /package/dist/{chunk-TLVLJSWS.js.map → chunk-LRDP2AC2.js.map} +0 -0
  180. /package/dist/{chunk-QV7OEHFN.js.map → chunk-LTBKKSCX.js.map} +0 -0
  181. /package/dist/{chunk-6P2NUVM5.js.map → chunk-NEJQ65NV.js.map} +0 -0
  182. /package/dist/{chunk-7PKNOXYB.js.map → chunk-NTJ6TY44.js.map} +0 -0
  183. /package/dist/{chunk-HYVBJLEK.js.map → chunk-O5AFC5KM.js.map} +0 -0
  184. /package/dist/{chunk-N655QIA2.js.map → chunk-PEDYKCJI.js.map} +0 -0
  185. /package/dist/{chunk-4QFCAKNM.js.map → chunk-RUZM6Z52.js.map} +0 -0
  186. /package/dist/{chunk-O4TTIMOP.js.map → chunk-SFR7J2G6.js.map} +0 -0
  187. /package/dist/{chunk-ION47U3Z.js.map → chunk-SNW3YRO6.js.map} +0 -0
  188. /package/dist/{chunk-XL24QQ63.js.map → chunk-TBUEE7XF.js.map} +0 -0
  189. /package/dist/{chunk-TAPFJ3ET.js.map → chunk-U7XLOSG2.js.map} +0 -0
  190. /package/dist/{chunk-T3HC7RJ7.js.map → chunk-USAUBGBC.js.map} +0 -0
  191. /package/dist/{chunk-TAMY4NKO.js.map → chunk-USGKHF36.js.map} +0 -0
  192. /package/dist/{chunk-XRPPHIRI.js.map → chunk-VUDALPI5.js.map} +0 -0
  193. /package/dist/{chunk-HC55YCNK.js.map → chunk-VYIXCMUP.js.map} +0 -0
  194. /package/dist/{chunk-HQ2VGCGP.js.map → chunk-XBGLEOID.js.map} +0 -0
  195. /package/dist/{chunk-XX4HPFFM.js.map → chunk-XDL5CYZN.js.map} +0 -0
  196. /package/dist/{chunk-THACANBI.js.map → chunk-YOKSRIFI.js.map} +0 -0
  197. /package/dist/{chunk-BWJMBJCY.js.map → chunk-YTZA7U6Q.js.map} +0 -0
  198. /package/dist/{chunk-4KM3V6VS.js.map → chunk-ZN7SMKAK.js.map} +0 -0
  199. /package/dist/{contradiction-scan-522AYLQC.js.map → contradiction-scan-VOTQRRSX.js.map} +0 -0
  200. /package/dist/{first-start-migration-HZ4VPRFQ.js.map → first-start-migration-4NETATFF.js.map} +0 -0
  201. /package/dist/{graph-edge-decay-ZXGBXNPW.js.map → graph-edge-decay-A4SDFMMS.js.map} +0 -0
  202. /package/dist/{tier-stats-7E6OBUSD.js.map → tier-stats-4B5IJ3NE.js.map} +0 -0
@@ -4,14 +4,13 @@ import {
4
4
  buildReconcileManifest,
5
5
  buildReconcileManifestFile,
6
6
  collapseActiveFactDuplicates
7
- } from "../chunk-XRPPHIRI.js";
8
- import "../chunk-KJH6W2I7.js";
7
+ } from "../chunk-VUDALPI5.js";
8
+ import "../chunk-L3CHRBHE.js";
9
9
  import "../chunk-J6A3CX5N.js";
10
10
  import "../chunk-7RJUVTVF.js";
11
11
  import "../chunk-NRFU5MVH.js";
12
12
  import "../chunk-5FVVY2EB.js";
13
13
  import "../chunk-FFAZ2XFU.js";
14
- import "../chunk-EGGE52UU.js";
15
14
  import "../chunk-JDSVLVCG.js";
16
15
  import "../chunk-HBVPYRDW.js";
17
16
  import "../chunk-5GKPFL3S.js";
@@ -22,6 +21,7 @@ import "../chunk-GCGJW34D.js";
22
21
  import "../chunk-AREGMX2J.js";
23
22
  import "../chunk-LC2BDILZ.js";
24
23
  import "../chunk-P7FMDTKL.js";
24
+ import "../chunk-VUFL7X3H.js";
25
25
  import "../chunk-XQ3HXAQH.js";
26
26
  import "../chunk-A6XUJE5D.js";
27
27
  import "../chunk-5UZXUTVO.js";
@@ -3,8 +3,7 @@ import {
3
3
  planNamespaceReconciliation,
4
4
  planReconciliation,
5
5
  summarizeReconcilePlan
6
- } from "../chunk-KJH6W2I7.js";
7
- import "../chunk-EGGE52UU.js";
6
+ } from "../chunk-L3CHRBHE.js";
8
7
  import "../chunk-HBVPYRDW.js";
9
8
  import "../chunk-Z4N7SVVF.js";
10
9
  import "../chunk-UI3NYK34.js";
@@ -12,6 +11,7 @@ import "../chunk-GCGJW34D.js";
12
11
  import "../chunk-AREGMX2J.js";
13
12
  import "../chunk-LC2BDILZ.js";
14
13
  import "../chunk-P7FMDTKL.js";
14
+ import "../chunk-VUFL7X3H.js";
15
15
  import "../chunk-XQ3HXAQH.js";
16
16
  import "../chunk-A6XUJE5D.js";
17
17
  import "../chunk-5UZXUTVO.js";
@@ -4,7 +4,8 @@ import {
4
4
  isSafeRouteNamespace,
5
5
  selectRouteRule,
6
6
  validateRouteTarget
7
- } from "../chunk-U3PN77QT.js";
7
+ } from "../chunk-PCXDUHQH.js";
8
+ import "../chunk-VUFL7X3H.js";
8
9
  import "../chunk-PZ5AY32C.js";
9
10
  export {
10
11
  doesRuleMatch,
@@ -1,7 +1,8 @@
1
1
  import {
2
2
  RoutingRulesStore
3
- } from "../chunk-XL24QQ63.js";
4
- import "../chunk-U3PN77QT.js";
3
+ } from "../chunk-TBUEE7XF.js";
4
+ import "../chunk-PCXDUHQH.js";
5
+ import "../chunk-VUFL7X3H.js";
5
6
  import "../chunk-3WCASNQZ.js";
6
7
  import "../chunk-PZ5AY32C.js";
7
8
  export {
@@ -7,17 +7,17 @@ import {
7
7
  materializeAfterSemanticConsolidation,
8
8
  parseConsolidationResponse,
9
9
  parseOperatorAwareConsolidationResponse
10
- } from "./chunk-ONCWJBWV.js";
10
+ } from "./chunk-3AJOJOFP.js";
11
11
  import {
12
12
  resolveExtensionsRoot
13
13
  } from "./chunk-JLNBQWZ2.js";
14
- import "./chunk-HC55YCNK.js";
14
+ import "./chunk-VYIXCMUP.js";
15
15
  import "./chunk-KSXJOC4F.js";
16
- import "./chunk-BWJMBJCY.js";
16
+ import "./chunk-YTZA7U6Q.js";
17
17
  import "./chunk-UHVXE24Y.js";
18
18
  import "./chunk-KHQ57QLJ.js";
19
19
  import "./chunk-SXIMQLGV.js";
20
- import "./chunk-ION47U3Z.js";
20
+ import "./chunk-SNW3YRO6.js";
21
21
  import "./chunk-F7M36OG2.js";
22
22
  import "./chunk-XL3TATMJ.js";
23
23
  import "./chunk-VANZKHTN.js";
@@ -92,13 +92,13 @@ import "./chunk-2LWQSV6A.js";
92
92
  import "./chunk-RL6NEVXT.js";
93
93
  import "./chunk-5FVVY2EB.js";
94
94
  import "./chunk-FFAZ2XFU.js";
95
- import "./chunk-XX4HPFFM.js";
96
- import "./chunk-EGGE52UU.js";
95
+ import "./chunk-XDL5CYZN.js";
97
96
  import "./chunk-JDSVLVCG.js";
98
97
  import "./chunk-5GKPFL3S.js";
99
98
  import "./chunk-JAKIDQB2.js";
100
99
  import "./chunk-P7FMDTKL.js";
101
- import "./chunk-U3PN77QT.js";
100
+ import "./chunk-PCXDUHQH.js";
101
+ import "./chunk-VUFL7X3H.js";
102
102
  import "./chunk-JUOZ62Y7.js";
103
103
  import "./chunk-O75CRYGF.js";
104
104
  import "./chunk-EYIEWJNI.js";
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  promoteSemanticRuleFromMemory,
3
3
  setSemanticRulePromotionTestHooks
4
- } from "./chunk-LYPG7GOO.js";
5
- import "./chunk-BWJMBJCY.js";
4
+ } from "./chunk-I2GIYTRU.js";
5
+ import "./chunk-YTZA7U6Q.js";
6
6
  import "./chunk-UHVXE24Y.js";
7
7
  import "./chunk-KHQ57QLJ.js";
8
8
  import "./chunk-SXIMQLGV.js";
9
- import "./chunk-ION47U3Z.js";
9
+ import "./chunk-SNW3YRO6.js";
10
10
  import "./chunk-F7M36OG2.js";
11
11
  import "./chunk-XL3TATMJ.js";
12
12
  import "./chunk-VANZKHTN.js";
@@ -75,12 +75,12 @@ import "./chunk-2LWQSV6A.js";
75
75
  import "./chunk-RL6NEVXT.js";
76
76
  import "./chunk-5FVVY2EB.js";
77
77
  import "./chunk-FFAZ2XFU.js";
78
- import "./chunk-XX4HPFFM.js";
79
- import "./chunk-EGGE52UU.js";
78
+ import "./chunk-XDL5CYZN.js";
80
79
  import "./chunk-JDSVLVCG.js";
81
80
  import "./chunk-5GKPFL3S.js";
82
81
  import "./chunk-JAKIDQB2.js";
83
82
  import "./chunk-P7FMDTKL.js";
83
+ import "./chunk-VUFL7X3H.js";
84
84
  import "./chunk-JUOZ62Y7.js";
85
85
  import "./chunk-O75CRYGF.js";
86
86
  import "./chunk-EYIEWJNI.js";
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  compareVerifiedSemanticRuleResults,
3
3
  searchVerifiedSemanticRules
4
- } from "./chunk-TAMY4NKO.js";
5
- import "./chunk-BWJMBJCY.js";
4
+ } from "./chunk-USGKHF36.js";
5
+ import "./chunk-YTZA7U6Q.js";
6
6
  import "./chunk-UHVXE24Y.js";
7
7
  import "./chunk-KHQ57QLJ.js";
8
8
  import "./chunk-SXIMQLGV.js";
9
- import "./chunk-ION47U3Z.js";
9
+ import "./chunk-SNW3YRO6.js";
10
10
  import "./chunk-F7M36OG2.js";
11
11
  import "./chunk-XL3TATMJ.js";
12
12
  import "./chunk-VANZKHTN.js";
@@ -76,12 +76,12 @@ import "./chunk-2LWQSV6A.js";
76
76
  import "./chunk-RL6NEVXT.js";
77
77
  import "./chunk-5FVVY2EB.js";
78
78
  import "./chunk-FFAZ2XFU.js";
79
- import "./chunk-XX4HPFFM.js";
80
- import "./chunk-EGGE52UU.js";
79
+ import "./chunk-XDL5CYZN.js";
81
80
  import "./chunk-JDSVLVCG.js";
82
81
  import "./chunk-5GKPFL3S.js";
83
82
  import "./chunk-JAKIDQB2.js";
84
83
  import "./chunk-P7FMDTKL.js";
84
+ import "./chunk-VUFL7X3H.js";
85
85
  import "./chunk-JUOZ62Y7.js";
86
86
  import "./chunk-O75CRYGF.js";
87
87
  import "./chunk-EYIEWJNI.js";
@@ -3,7 +3,7 @@ import {
3
3
  headerConnector,
4
4
  renderExtractionConversation,
5
5
  resolveSourceConnector
6
- } from "./chunk-SFCJCMZQ.js";
6
+ } from "./chunk-A7266TRJ.js";
7
7
  import "./chunk-L4DLLKPN.js";
8
8
  import "./chunk-4POAMKV6.js";
9
9
  import "./chunk-WAS4HV46.js";
@@ -11,16 +11,16 @@ import "./chunk-VEWZZM3H.js";
11
11
  import "./chunk-4OW2T32G.js";
12
12
  import "./chunk-ANMIOQPU.js";
13
13
  import "./chunk-EMDLM3LW.js";
14
- import "./chunk-UTDMY476.js";
14
+ import "./chunk-4UUF2EX3.js";
15
15
  import "./chunk-PD6O7AXF.js";
16
16
  import "./chunk-OD4FM2U7.js";
17
- import "./chunk-HC55YCNK.js";
17
+ import "./chunk-VYIXCMUP.js";
18
18
  import "./chunk-KSXJOC4F.js";
19
- import "./chunk-BWJMBJCY.js";
19
+ import "./chunk-YTZA7U6Q.js";
20
20
  import "./chunk-UHVXE24Y.js";
21
21
  import "./chunk-KHQ57QLJ.js";
22
22
  import "./chunk-SXIMQLGV.js";
23
- import "./chunk-ION47U3Z.js";
23
+ import "./chunk-SNW3YRO6.js";
24
24
  import "./chunk-F7M36OG2.js";
25
25
  import "./chunk-XL3TATMJ.js";
26
26
  import "./chunk-VANZKHTN.js";
@@ -81,7 +81,7 @@ import "./chunk-TBBDFYXW.js";
81
81
  import "./chunk-BJMBJZ2Y.js";
82
82
  import "./chunk-UKJAGEXH.js";
83
83
  import "./chunk-FP2373TW.js";
84
- import "./chunk-CMRUIKVA.js";
84
+ import "./chunk-KCT36JAW.js";
85
85
  import "./chunk-J6A3CX5N.js";
86
86
  import "./chunk-DVYRD4HY.js";
87
87
  import "./chunk-ZA53AZND.js";
@@ -92,15 +92,15 @@ import "./chunk-2LWQSV6A.js";
92
92
  import "./chunk-RL6NEVXT.js";
93
93
  import "./chunk-5FVVY2EB.js";
94
94
  import "./chunk-FFAZ2XFU.js";
95
- import "./chunk-XX4HPFFM.js";
96
- import "./chunk-EGGE52UU.js";
95
+ import "./chunk-XDL5CYZN.js";
97
96
  import "./chunk-JDSVLVCG.js";
98
97
  import "./chunk-5GKPFL3S.js";
99
98
  import "./chunk-JAKIDQB2.js";
100
99
  import "./chunk-P7FMDTKL.js";
101
100
  import "./chunk-MZWSOLMT.js";
102
- import "./chunk-IGWVMA4Y.js";
103
- import "./chunk-U3PN77QT.js";
101
+ import "./chunk-MRV7VSQK.js";
102
+ import "./chunk-PCXDUHQH.js";
103
+ import "./chunk-VUFL7X3H.js";
104
104
  import "./chunk-JUOZ62Y7.js";
105
105
  import "./chunk-J2WC5LF4.js";
106
106
  import "./chunk-O75CRYGF.js";
package/dist/storage.js CHANGED
@@ -13,11 +13,11 @@ import {
13
13
  parseFrontmatter,
14
14
  parseFrontmatterStringValue,
15
15
  serializeEntityFile
16
- } from "./chunk-BWJMBJCY.js";
16
+ } from "./chunk-YTZA7U6Q.js";
17
17
  import "./chunk-UHVXE24Y.js";
18
18
  import "./chunk-KHQ57QLJ.js";
19
19
  import "./chunk-SXIMQLGV.js";
20
- import "./chunk-ION47U3Z.js";
20
+ import "./chunk-SNW3YRO6.js";
21
21
  import "./chunk-F7M36OG2.js";
22
22
  import "./chunk-XL3TATMJ.js";
23
23
  import "./chunk-VANZKHTN.js";
@@ -91,8 +91,7 @@ import "./chunk-2LWQSV6A.js";
91
91
  import "./chunk-RL6NEVXT.js";
92
92
  import "./chunk-5FVVY2EB.js";
93
93
  import "./chunk-FFAZ2XFU.js";
94
- import "./chunk-XX4HPFFM.js";
95
- import "./chunk-EGGE52UU.js";
94
+ import "./chunk-XDL5CYZN.js";
96
95
  import {
97
96
  normalizeAttributePairs,
98
97
  stripAttributesSuffix
@@ -100,6 +99,7 @@ import {
100
99
  import "./chunk-5GKPFL3S.js";
101
100
  import "./chunk-JAKIDQB2.js";
102
101
  import "./chunk-P7FMDTKL.js";
102
+ import "./chunk-VUFL7X3H.js";
103
103
  import "./chunk-JUOZ62Y7.js";
104
104
  import "./chunk-O75CRYGF.js";
105
105
  import "./chunk-EYIEWJNI.js";
@@ -4,7 +4,7 @@ import {
4
4
  SUPPORT_PASSPORT_MODEL_RESULT_PATH,
5
5
  SupportPassportModelBridge,
6
6
  parseSupportPassportModelJob
7
- } from "../chunk-TAPFJ3ET.js";
7
+ } from "../chunk-U7XLOSG2.js";
8
8
  import {
9
9
  DEFAULT_SUPPORT_PASSPORT_CONFIG,
10
10
  parseSupportPassportConfig
@@ -14,8 +14,8 @@ import {
14
14
  buildSupportPassportPublicRequestHandler,
15
15
  composeSupportPassportExternalRequestHandlers,
16
16
  normalizeSupportPassportNetworkAddress
17
- } from "../chunk-TLVLJSWS.js";
18
- import "../chunk-R7UHWPYI.js";
17
+ } from "../chunk-LRDP2AC2.js";
18
+ import "../chunk-7PJARJS4.js";
19
19
  import {
20
20
  SUPPORT_PASSPORT_DRAFT_MAX_CONTENT_CHARACTERS,
21
21
  SUPPORT_PASSPORT_DRAFT_MAX_MEMORIES,
@@ -56,7 +56,7 @@ import {
56
56
  notifySupportPassportCommitted,
57
57
  resolveSupportPassportModelRoutePlan,
58
58
  syncDirectoryForDurability
59
- } from "../chunk-FK7T55BA.js";
59
+ } from "../chunk-CZUHNJHX.js";
60
60
  import "../chunk-GDASG7NC.js";
61
61
  import "../chunk-GDB4J2H3.js";
62
62
  import "../chunk-PPUTUOC3.js";
@@ -71,7 +71,7 @@ import "../chunk-H7XKCNR6.js";
71
71
  import "../chunk-U7BMN33M.js";
72
72
  import "../chunk-SOBJ6NEY.js";
73
73
  import "../chunk-QKPDN325.js";
74
- import "../chunk-S6AH7WSF.js";
74
+ import "../chunk-5PGYCWA7.js";
75
75
  import "../chunk-CVILPI77.js";
76
76
  import "../chunk-2HIJHXB3.js";
77
77
  import "../chunk-AQEJKOKI.js";
@@ -89,31 +89,31 @@ import "../chunk-WKDFJXW5.js";
89
89
  import "../chunk-JUXOTY6J.js";
90
90
  import "../chunk-QDW3E4RD.js";
91
91
  import "../chunk-LTHVM4XN.js";
92
- import "../chunk-JKL53MOY.js";
92
+ import "../chunk-DLQQU4EG.js";
93
93
  import "../chunk-7ZNJN5WZ.js";
94
94
  import "../chunk-C37ZRXX7.js";
95
- import "../chunk-7NSC4IVA.js";
96
- import "../chunk-QZR3WT3L.js";
97
- import "../chunk-PSH3VFZ7.js";
98
- import "../chunk-JFPZEWY3.js";
95
+ import "../chunk-6RK2X7BR.js";
96
+ import "../chunk-LJJWFV2Q.js";
97
+ import "../chunk-L3LRWDJW.js";
98
+ import "../chunk-LIF6DO6U.js";
99
99
  import "../chunk-UFGFMWAD.js";
100
100
  import "../chunk-YMOPYG3K.js";
101
101
  import "../chunk-2LSZVONP.js";
102
102
  import "../chunk-DEUNUKTD.js";
103
103
  import "../chunk-LXY5VVGM.js";
104
- import "../chunk-UTDMY476.js";
104
+ import "../chunk-4UUF2EX3.js";
105
105
  import "../chunk-PD6O7AXF.js";
106
106
  import "../chunk-OD4FM2U7.js";
107
107
  import "../chunk-ZY2MNJR6.js";
108
- import "../chunk-HC55YCNK.js";
108
+ import "../chunk-VYIXCMUP.js";
109
109
  import "../chunk-KSXJOC4F.js";
110
110
  import "../chunk-HXXGZ4KV.js";
111
- import "../chunk-TF3LMM5E.js";
112
- import "../chunk-BWJMBJCY.js";
111
+ import "../chunk-CSV34HIW.js";
112
+ import "../chunk-YTZA7U6Q.js";
113
113
  import "../chunk-UHVXE24Y.js";
114
114
  import "../chunk-KHQ57QLJ.js";
115
115
  import "../chunk-SXIMQLGV.js";
116
- import "../chunk-ION47U3Z.js";
116
+ import "../chunk-SNW3YRO6.js";
117
117
  import "../chunk-F7M36OG2.js";
118
118
  import "../chunk-XL3TATMJ.js";
119
119
  import "../chunk-VANZKHTN.js";
@@ -190,15 +190,15 @@ import "../chunk-I4WBNM3M.js";
190
190
  import "../chunk-SOAU2OE2.js";
191
191
  import "../chunk-3QL24R5Y.js";
192
192
  import "../chunk-SYOIVK7K.js";
193
- import "../chunk-4KM3V6VS.js";
193
+ import "../chunk-ZN7SMKAK.js";
194
194
  import "../chunk-LNEWDF2A.js";
195
- import "../chunk-IXGQP4RZ.js";
196
- import "../chunk-XRPPHIRI.js";
197
- import "../chunk-KJH6W2I7.js";
198
- import "../chunk-X5OIPQME.js";
199
- import "../chunk-TVKWT2CY.js";
195
+ import "../chunk-4SGDYYWV.js";
196
+ import "../chunk-VUDALPI5.js";
197
+ import "../chunk-L3CHRBHE.js";
198
+ import "../chunk-HZNYJN77.js";
199
+ import "../chunk-Q57GOHLF.js";
200
200
  import "../chunk-AW4QUFQF.js";
201
- import "../chunk-CMRUIKVA.js";
201
+ import "../chunk-KCT36JAW.js";
202
202
  import "../chunk-J6A3CX5N.js";
203
203
  import "../chunk-DVYRD4HY.js";
204
204
  import "../chunk-ZA53AZND.js";
@@ -238,8 +238,7 @@ import {
238
238
  hasLiveSupportPassportCard,
239
239
  isSupportPassportPrivateMemory,
240
240
  projectSupportPassportCard
241
- } from "../chunk-XX4HPFFM.js";
242
- import "../chunk-EGGE52UU.js";
241
+ } from "../chunk-XDL5CYZN.js";
243
242
  import "../chunk-JDSVLVCG.js";
244
243
  import "../chunk-HBVPYRDW.js";
245
244
  import "../chunk-5GKPFL3S.js";
@@ -251,8 +250,9 @@ import "../chunk-AREGMX2J.js";
251
250
  import "../chunk-LC2BDILZ.js";
252
251
  import "../chunk-P7FMDTKL.js";
253
252
  import "../chunk-MZWSOLMT.js";
254
- import "../chunk-IGWVMA4Y.js";
255
- import "../chunk-U3PN77QT.js";
253
+ import "../chunk-MRV7VSQK.js";
254
+ import "../chunk-PCXDUHQH.js";
255
+ import "../chunk-VUFL7X3H.js";
256
256
  import "../chunk-JUOZ62Y7.js";
257
257
  import "../chunk-VFUEZZBS.js";
258
258
  import "../chunk-773TRRGT.js";
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  computeTierValueScore,
3
3
  decideTierTransition
4
- } from "./chunk-F2JRDPON.js";
4
+ } from "./chunk-EGBDFJ36.js";
5
5
  import "./chunk-TBBDFYXW.js";
6
- import "./chunk-XX4HPFFM.js";
7
- import "./chunk-EGGE52UU.js";
6
+ import "./chunk-XDL5CYZN.js";
8
7
  import "./chunk-JDSVLVCG.js";
9
8
  import "./chunk-5GKPFL3S.js";
10
9
  import "./chunk-JAKIDQB2.js";
11
10
  import "./chunk-P7FMDTKL.js";
11
+ import "./chunk-VUFL7X3H.js";
12
12
  import "./chunk-PZ5AY32C.js";
13
13
  export {
14
14
  computeTierValueScore,
@@ -5,18 +5,18 @@ import {
5
5
  import {
6
6
  computeTierValueScore,
7
7
  decideTierTransition
8
- } from "./chunk-F2JRDPON.js";
8
+ } from "./chunk-EGBDFJ36.js";
9
9
  import "./chunk-HDQUQBPW.js";
10
10
  import "./chunk-6FC3IZ26.js";
11
11
  import {
12
12
  computeLifecycleValueInputs
13
13
  } from "./chunk-TBBDFYXW.js";
14
- import "./chunk-XX4HPFFM.js";
15
- import "./chunk-EGGE52UU.js";
14
+ import "./chunk-XDL5CYZN.js";
16
15
  import "./chunk-JDSVLVCG.js";
17
16
  import "./chunk-5GKPFL3S.js";
18
17
  import "./chunk-JAKIDQB2.js";
19
18
  import "./chunk-P7FMDTKL.js";
19
+ import "./chunk-VUFL7X3H.js";
20
20
  import {
21
21
  resolveQmdCapabilities,
22
22
  resolveUtilityLearningCapabilities
@@ -159,4 +159,4 @@ export {
159
159
  formatTierSummaryText,
160
160
  summarizeTiers
161
161
  };
162
- //# sourceMappingURL=tier-stats-7E6OBUSD.js.map
162
+ //# sourceMappingURL=tier-stats-4B5IJ3NE.js.map
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  compareVerifiedEpisodeResults,
3
3
  searchVerifiedEpisodes
4
- } from "./chunk-FONW766A.js";
4
+ } from "./chunk-GXIY65UH.js";
5
5
  import "./chunk-B7RWBZXW.js";
6
- import "./chunk-BWJMBJCY.js";
6
+ import "./chunk-YTZA7U6Q.js";
7
7
  import "./chunk-UHVXE24Y.js";
8
8
  import "./chunk-KHQ57QLJ.js";
9
9
  import "./chunk-SXIMQLGV.js";
10
- import "./chunk-ION47U3Z.js";
10
+ import "./chunk-SNW3YRO6.js";
11
11
  import "./chunk-F7M36OG2.js";
12
12
  import "./chunk-XL3TATMJ.js";
13
13
  import "./chunk-VANZKHTN.js";
@@ -77,12 +77,12 @@ import "./chunk-2LWQSV6A.js";
77
77
  import "./chunk-RL6NEVXT.js";
78
78
  import "./chunk-5FVVY2EB.js";
79
79
  import "./chunk-FFAZ2XFU.js";
80
- import "./chunk-XX4HPFFM.js";
81
- import "./chunk-EGGE52UU.js";
80
+ import "./chunk-XDL5CYZN.js";
82
81
  import "./chunk-JDSVLVCG.js";
83
82
  import "./chunk-5GKPFL3S.js";
84
83
  import "./chunk-JAKIDQB2.js";
85
84
  import "./chunk-P7FMDTKL.js";
85
+ import "./chunk-VUFL7X3H.js";
86
86
  import "./chunk-JUOZ62Y7.js";
87
87
  import "./chunk-O75CRYGF.js";
88
88
  import "./chunk-EYIEWJNI.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remnic/core",
3
- "version": "9.57.4",
3
+ "version": "9.57.5",
4
4
  "description": "Framework-agnostic Remnic memory engine — orchestrator, storage, extraction, search, trust zones",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -3136,7 +3136,7 @@
3136
3136
  "core"
3137
3137
  ],
3138
3138
  "peerDependencies": {
3139
- "@remnic/coding-graph": "^9.57.4"
3139
+ "@remnic/coding-graph": "^9.57.5"
3140
3140
  },
3141
3141
  "peerDependenciesMeta": {
3142
3142
  "@remnic/coding-graph": {
@@ -19,7 +19,7 @@ import {
19
19
  withHeldFileLock,
20
20
  } from "../utils/serialize-mutations.js";
21
21
  import { isSafeRouteNamespace } from "../routing/engine.js";
22
- import { namespaceIdentityFromToken, namespaceIdentityToken, normalizeNamespaceIdentity } from "./identity.js";
22
+ import { namespaceIdentityFromToken, namespaceIdentityLegacyToken, namespaceIdentityToken, normalizeNamespaceIdentity } from "./identity.js";
23
23
  import { resolveDefaultNamespaceRoot, resolveNamespaceStorageRoot } from "./storage.js";
24
24
  import { ALL_CATEGORY_DIRS } from "../utils/category-dir.js";
25
25
 
@@ -1721,8 +1721,7 @@ export class NamespaceCatalog {
1721
1721
  // sourced from their tokenized dir so a later legacy-named `readdir` entry
1722
1722
  // cannot overwrite the tokenized record (and vice-versa: a tokenized entry
1723
1723
  // always wins over a previously-set legacy one).
1724
- const scannedFromTokenized = new Set<string>();
1725
-
1724
+ const scannedFromTokenized = new Map<string, number>();
1726
1725
  for (const entry of entries) {
1727
1726
  const token = entry.name;
1728
1727
  const fullPath = path.join(namespacesDir, token);
@@ -1798,7 +1797,7 @@ export class NamespaceCatalog {
1798
1797
  const tokenDecoded = literalOwnsRoot ? null : namespaceIdentityFromToken(token);
1799
1798
  const rawDecoded = tokenDecoded && tokenDecoded.length > 0 ? tokenDecoded : token;
1800
1799
  const decoded = normalizeNamespaceIdentity(rawDecoded);
1801
- if (decoded.length === 0 || rawDecoded !== decoded) {
1800
+ if (decoded.length === 0 || (rawDecoded !== decoded && rawDecoded.normalize("NFC") !== decoded)) {
1802
1801
  skipped.push({ token, reason: "unsafe", detail: rawDecoded });
1803
1802
  continue;
1804
1803
  }
@@ -1841,11 +1840,12 @@ export class NamespaceCatalog {
1841
1840
  // is the on-disk dir name; it is the tokenized dir iff it equals the
1842
1841
  // namespace's identity token. If we already recorded this namespace from
1843
1842
  // its tokenized dir, a later legacy-named entry must not clobber it.
1844
- const isTokenizedEntry = token === namespaceIdentityToken(decoded);
1845
- if (rebuilt.has(decoded) && scannedFromTokenized.has(decoded) && !isTokenizedEntry) {
1846
- continue;
1847
- }
1848
- if (isTokenizedEntry) scannedFromTokenized.add(decoded);
1843
+ const canonicalToken = namespaceIdentityToken(decoded);
1844
+ const legacyToken = namespaceIdentityLegacyToken(decoded.normalize("NFD"));
1845
+ const tokenKind = token === canonicalToken ? 2 : token === legacyToken ? 1 : 0;
1846
+ const priorTokenKind = scannedFromTokenized.get(decoded) ?? 0;
1847
+ if (rebuilt.has(decoded) && priorTokenKind > tokenKind) continue;
1848
+ if (tokenKind > 0) scannedFromTokenized.set(decoded, tokenKind);
1849
1849
 
1850
1850
  const prior = existing.get(decoded);
1851
1851
  rebuilt.set(
@@ -1,14 +1,21 @@
1
1
  export function normalizeNamespaceIdentity(namespace: string | null | undefined): string {
2
- return namespace?.trim() ?? "";
2
+ return namespace?.trim().normalize("NFC") ?? "";
3
3
  }
4
4
 
5
- export function namespaceIdentityToken(namespace: string): string {
6
- const normalized = normalizeNamespaceIdentity(namespace);
7
- const bytes = new TextEncoder().encode(normalized);
5
+ function encodeNamespaceIdentityToken(namespace: string): string {
6
+ const bytes = new TextEncoder().encode(namespace);
8
7
  const hex = Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join("");
9
8
  return `ns-${hex || "default"}`;
10
9
  }
11
10
 
11
+ export function namespaceIdentityToken(namespace: string): string {
12
+ return encodeNamespaceIdentityToken(normalizeNamespaceIdentity(namespace));
13
+ }
14
+
15
+ export function namespaceIdentityLegacyToken(namespace: string): string {
16
+ return encodeNamespaceIdentityToken(namespace.trim());
17
+ }
18
+
12
19
  export function namespaceIdentityFromToken(token: string): string | null {
13
20
  if (!token.startsWith("ns-")) return null;
14
21
  const hex = token.slice(3);
@@ -17,7 +24,9 @@ export function namespaceIdentityFromToken(token: string): string | null {
17
24
  return null;
18
25
  }
19
26
  const decoded = Buffer.from(hex, "hex").toString("utf8");
20
- return namespaceIdentityToken(decoded).toLowerCase() === token.toLowerCase()
21
- ? decoded
27
+ const normalized = normalizeNamespaceIdentity(decoded);
28
+ return namespaceIdentityToken(decoded).toLowerCase() === token.toLowerCase() ||
29
+ namespaceIdentityLegacyToken(decoded).toLowerCase() === token.toLowerCase()
30
+ ? normalized
22
31
  : null;
23
32
  }
@@ -12,8 +12,8 @@
12
12
  import assert from "node:assert/strict";
13
13
  import test from "node:test";
14
14
 
15
- import { canReadNamespace, isNamespacePolicyCovered, resolvePrincipal } from "./principal.js";
16
15
  import type { PluginConfig } from "../types.js";
16
+ import { canReadNamespace, canWriteNamespace, isNamespacePolicyCovered, resolvePrincipal } from "./principal.js";
17
17
 
18
18
  // ──────────────────────────────────────────────────────────────────────────
19
19
  // Helpers
@@ -285,3 +285,12 @@ test("isNamespacePolicyCovered: an explicit default-namespace policy overrides t
285
285
  const grantedDefault = makeConfig(true, [{ name: "default", readPrincipals: [], writePrincipals: ["alice"] }]);
286
286
  assert.equal(isNamespacePolicyCovered("default", grantedDefault), true);
287
287
  });
288
+
289
+ test("namespace ACL matches canonically equivalent Unicode identities", () => {
290
+ const config = makeConfig(true, [
291
+ { name: "Cafe\u0301", readPrincipals: ["reader"], writePrincipals: ["writer"] },
292
+ ]);
293
+
294
+ assert.equal(canReadNamespace("reader", "Café", config), true);
295
+ assert.equal(canWriteNamespace("writer", "Café", config), true);
296
+ });
@@ -1,7 +1,7 @@
1
1
  import { resolveNamespaceCapabilities } from "../capabilities.js";
2
2
  import type { PluginConfig } from "../types.js";
3
3
  import { isLikelyUnsafeRegex } from "../routing/engine.js";
4
-
4
+ import { normalizeNamespaceIdentity } from "./identity.js";
5
5
  const MAX_REGEX_SESSION_KEY_LENGTH = 512;
6
6
 
7
7
  function compileSafePrincipalRegex(pattern: string): RegExp | null {
@@ -54,16 +54,21 @@ export function resolvePrincipal(sessionKey: string | undefined, config: PluginC
54
54
  export function canReadNamespace(principal: string | undefined, namespace: string, config: PluginConfig): boolean {
55
55
  if (!resolveNamespaceCapabilities(config).namespaces) return true;
56
56
  if (!principal) return false;
57
- const policy = config.namespacePolicies.find((p) => p.name === namespace);
58
- if (!policy) return namespace === config.defaultNamespace || namespace === config.sharedNamespace;
57
+ const identity = normalizeNamespaceIdentity(namespace);
58
+ const policy = config.namespacePolicies.find((p) => normalizeNamespaceIdentity(p.name) === identity);
59
+ if (!policy) {
60
+ return identity === normalizeNamespaceIdentity(config.defaultNamespace) ||
61
+ identity === normalizeNamespaceIdentity(config.sharedNamespace);
62
+ }
59
63
  return policy.readPrincipals.includes(principal) || policy.readPrincipals.includes("*");
60
64
  }
61
65
 
62
66
  export function canWriteNamespace(principal: string | undefined, namespace: string, config: PluginConfig): boolean {
63
67
  if (!resolveNamespaceCapabilities(config).namespaces) return true;
64
68
  if (!principal) return false;
65
- const policy = config.namespacePolicies.find((p) => p.name === namespace);
66
- if (!policy) return namespace === config.defaultNamespace;
69
+ const identity = normalizeNamespaceIdentity(namespace);
70
+ const policy = config.namespacePolicies.find((p) => normalizeNamespaceIdentity(p.name) === identity);
71
+ if (!policy) return identity === normalizeNamespaceIdentity(config.defaultNamespace);
67
72
  return policy.writePrincipals.includes(principal) || policy.writePrincipals.includes("*");
68
73
  }
69
74
 
@@ -87,8 +92,9 @@ export function isNamespacePolicyCovered(namespace: string, config: PluginConfig
87
92
  // An explicit policy wins over the default fallback (exactly as
88
93
  // canWriteNamespace), so a policy naming the default with no writers is NOT
89
94
  // covered. Only fall back to defaultNamespace when no policy matches.
90
- const policy = config.namespacePolicies.find((p) => p.name === namespace);
91
- if (!policy) return namespace === config.defaultNamespace;
95
+ const identity = normalizeNamespaceIdentity(namespace);
96
+ const policy = config.namespacePolicies.find((p) => normalizeNamespaceIdentity(p.name) === identity);
97
+ if (!policy) return identity === normalizeNamespaceIdentity(config.defaultNamespace);
92
98
  return policy.writePrincipals.some((w) => w.trim().length > 0);
93
99
  }
94
100
 
@@ -102,8 +108,10 @@ export function isNamespacePolicyCovered(namespace: string, config: PluginConfig
102
108
  export function defaultNamespaceForPrincipal(principal: string | undefined, config: PluginConfig): string {
103
109
  if (!resolveNamespaceCapabilities(config).namespaces) return config.defaultNamespace;
104
110
  if (!principal) return config.defaultNamespace;
105
- const exists = config.namespacePolicies.some((p) => p.name === principal);
106
- return exists ? principal : config.defaultNamespace;
111
+ const policy = config.namespacePolicies.find(
112
+ (p) => normalizeNamespaceIdentity(p.name) === normalizeNamespaceIdentity(principal),
113
+ );
114
+ return policy ? normalizeNamespaceIdentity(policy.name) : config.defaultNamespace;
107
115
  }
108
116
 
109
117
  export function recallNamespacesForPrincipal(principal: string | undefined, config: PluginConfig): string[] {