@remnic/core 9.65.5 → 9.65.6

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 (177) hide show
  1. package/dist/access-admin-ops-surface.js +24 -24
  2. package/dist/access-audit.js +2 -2
  3. package/dist/access-authorization-probe.js +25 -25
  4. package/dist/access-boundary.js +24 -24
  5. package/dist/access-cli.js +69 -68
  6. package/dist/access-cli.js.map +1 -1
  7. package/dist/access-extraction-force-flush.js +24 -24
  8. package/dist/access-http-query.js +26 -26
  9. package/dist/access-http.js +37 -37
  10. package/dist/access-identity-continuity-surface.js +24 -24
  11. package/dist/access-lcm-surface.js +24 -24
  12. package/dist/access-mcp.js +30 -30
  13. package/dist/access-namespace-preflight.js +24 -24
  14. package/dist/access-observe-write-surface.js +24 -24
  15. package/dist/access-operations-batch.js +26 -26
  16. package/dist/access-operations.js +29 -29
  17. package/dist/access-recall-concurrency.js +24 -24
  18. package/dist/access-recall-response.js +24 -24
  19. package/dist/access-recall-surface.js +24 -24
  20. package/dist/access-schema.js +3 -3
  21. package/dist/access-service.js +24 -24
  22. package/dist/access-surface-catalog.js +26 -26
  23. package/dist/briefing.js +10 -10
  24. package/dist/{capsule-crypto-YO5QJ6L3.js → capsule-crypto-GWVG7LGC.js} +2 -2
  25. package/dist/causal-consolidation.js +11 -11
  26. package/dist/{chunk-YB4GBWBU.js → chunk-2JHRCWHT.js} +37 -37
  27. package/dist/{chunk-BK5G2MHO.js → chunk-2RXUZVPU.js} +2 -2
  28. package/dist/{chunk-JPAKBNTM.js → chunk-3I22VWB3.js} +2 -2
  29. package/dist/{chunk-ECLJ4LA2.js → chunk-53MZQEBD.js} +2 -2
  30. package/dist/{chunk-HF5BUTI6.js → chunk-5GIZM4RX.js} +2 -2
  31. package/dist/{chunk-2EPOGPKO.js → chunk-5TG4MU2U.js} +4 -4
  32. package/dist/{chunk-VDX2J7OX.js → chunk-5W7CTZ2E.js} +4 -4
  33. package/dist/{chunk-N56GVOWR.js → chunk-5W7MKXMU.js} +4 -4
  34. package/dist/{chunk-YHCBJULX.js → chunk-6FUMA6AA.js} +2 -2
  35. package/dist/{chunk-THVI4Y7X.js → chunk-6LS5OX3U.js} +5 -5
  36. package/dist/{chunk-TVVEYCNW.js → chunk-7K5Q6COX.js} +4 -4
  37. package/dist/{chunk-OWQNJJY2.js → chunk-7OZSHBWK.js} +2 -2
  38. package/dist/{chunk-CQBIN77D.js → chunk-7SSRXEZJ.js} +2 -2
  39. package/dist/{chunk-NNBZS3DY.js → chunk-AG46P24C.js} +4 -4
  40. package/dist/{chunk-NH6LC57D.js → chunk-AYAZWXJI.js} +2 -2
  41. package/dist/{chunk-WDXD6ITO.js → chunk-BXXOPKT5.js} +2 -2
  42. package/dist/{chunk-DJZWNKFO.js → chunk-D35XLYQ7.js} +10 -10
  43. package/dist/{chunk-KOO37E4Y.js → chunk-DYO24BNB.js} +2 -2
  44. package/dist/{chunk-DORFF5N5.js → chunk-FEO2CDXR.js} +2 -2
  45. package/dist/{chunk-IURMJBGP.js → chunk-HWVNYNIV.js} +2 -2
  46. package/dist/{chunk-OZDFB22S.js → chunk-IDQ6DKXC.js} +3 -3
  47. package/dist/{chunk-J3ATBB7M.js → chunk-IF4EY26E.js} +2 -2
  48. package/dist/{chunk-W675UJCZ.js → chunk-IRXMJLTW.js} +2 -2
  49. package/dist/{chunk-DUZARALI.js → chunk-JFWZRUKP.js} +3 -3
  50. package/dist/{chunk-DUEDOYZD.js → chunk-JGG5HVI2.js} +2 -2
  51. package/dist/{chunk-3NH3VP3U.js → chunk-KBOG7FJV.js} +2 -2
  52. package/dist/{chunk-UCKG36HO.js → chunk-LSYD7GHZ.js} +2 -2
  53. package/dist/{chunk-6433HV72.js → chunk-MVIYRRVJ.js} +5 -5
  54. package/dist/{chunk-FBR7PIL4.js → chunk-NLUCDKLT.js} +2 -2
  55. package/dist/{chunk-TJFI3K2O.js → chunk-O4BAGJDN.js} +2 -2
  56. package/dist/{chunk-LYBIHM4N.js → chunk-OMZLBT4B.js} +4 -4
  57. package/dist/{chunk-BXLOS5AJ.js → chunk-OWHERGF2.js} +2 -2
  58. package/dist/{chunk-BW4GAF57.js → chunk-PGW64IFQ.js} +2 -2
  59. package/dist/{chunk-CV3GNPOE.js → chunk-PNAGNVGK.js} +17 -17
  60. package/dist/{chunk-YDKF4MSJ.js → chunk-QMZY3GG6.js} +3 -3
  61. package/dist/{chunk-N37X5RU7.js → chunk-RACZB5HT.js} +4 -4
  62. package/dist/{chunk-YZJM6CLF.js → chunk-ROEAEANL.js} +7 -7
  63. package/dist/{chunk-KTPXXVDQ.js → chunk-RQ2EQRRR.js} +4 -4
  64. package/dist/chunk-SDEPLF7V.js +325 -0
  65. package/dist/chunk-SDEPLF7V.js.map +1 -0
  66. package/dist/{chunk-2IXQSGCU.js → chunk-SR7JIRAR.js} +2 -2
  67. package/dist/{chunk-OCCHUEZB.js → chunk-TWBQQ3FT.js} +2 -2
  68. package/dist/{chunk-NLEH4RTB.js → chunk-US4IRASK.js} +2 -2
  69. package/dist/{chunk-DQEMWVMT.js → chunk-UVYI6VIX.js} +1 -1
  70. package/dist/{chunk-IIRCHGWD.js → chunk-W6J4POB6.js} +2 -2
  71. package/dist/{chunk-4JSF7UUP.js → chunk-X2DWBWOX.js} +2 -2
  72. package/dist/{chunk-2MVTAIL3.js → chunk-XAWIL7TC.js} +2 -2
  73. package/dist/{chunk-UFR6HX7A.js → chunk-XUZ5CIEE.js} +1 -1
  74. package/dist/{chunk-GIC6BASP.js → chunk-XZBXINXZ.js} +4 -4
  75. package/dist/{chunk-BA2GLSIP.js → chunk-YUTTMSC7.js} +13 -13
  76. package/dist/{chunk-DPGH6LHQ.js → chunk-YWBOOBDP.js} +38 -38
  77. package/dist/{chunk-KFIOPZ25.js → chunk-ZXUZ54Z5.js} +2 -2
  78. package/dist/cli.d.ts +2 -2
  79. package/dist/cli.js +53 -53
  80. package/dist/compounding/engine.js +10 -10
  81. package/dist/connectors/codex-materialize-runner.js +10 -10
  82. package/dist/connectors/index.js +10 -10
  83. package/dist/convergence-refresh.js +12 -12
  84. package/dist/corpus-watermark.js +12 -12
  85. package/dist/entity-retrieval.js +10 -10
  86. package/dist/external-wiki-access.js +25 -25
  87. package/dist/extraction.js +10 -10
  88. package/dist/harmonic-retrieval.js +1 -1
  89. package/dist/index.d.ts +2 -1
  90. package/dist/index.js +92 -76
  91. package/dist/lcm/index.js +3 -3
  92. package/dist/maintenance/memory-governance.js +10 -10
  93. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +10 -10
  94. package/dist/maintenance/rebuild-memory-projection.js +11 -11
  95. package/dist/memory-controller.d.ts +203 -0
  96. package/dist/memory-controller.js +23 -0
  97. package/dist/memory-controller.js.map +1 -0
  98. package/dist/namespaces/migrate.js +11 -11
  99. package/dist/namespaces/search.js +7 -7
  100. package/dist/namespaces/storage.js +10 -10
  101. package/dist/operator-doctor-corpus.js +13 -13
  102. package/dist/operator-toolkit.js +18 -18
  103. package/dist/orchestration/maintenance.js +16 -16
  104. package/dist/orchestrator.js +69 -68
  105. package/dist/search/factory.js +6 -6
  106. package/dist/search/index.js +11 -11
  107. package/dist/search/lancedb-backend.js +2 -2
  108. package/dist/search/meilisearch-backend.js +2 -2
  109. package/dist/search/orama-backend.js +2 -2
  110. package/dist/semantic-consolidation.js +11 -11
  111. package/dist/semantic-rule-promotion.js +10 -10
  112. package/dist/semantic-rule-verifier.js +10 -10
  113. package/dist/source-agent-qualifier.js +10 -10
  114. package/dist/storage.js +9 -9
  115. package/dist/support-passport/index.js +27 -27
  116. package/dist/transfer/backup.js +2 -2
  117. package/dist/transfer/capsule-export.js +2 -2
  118. package/dist/transfer/capsule-import.js +2 -2
  119. package/dist/verified-recall.js +10 -10
  120. package/dist/who-knows-cli.js +11 -11
  121. package/dist/who-knows.js +10 -10
  122. package/package.json +2 -2
  123. package/src/index.ts +3 -0
  124. package/src/memory-controller.test.ts +347 -0
  125. package/src/memory-controller.ts +547 -0
  126. package/dist/{capsule-crypto-YO5QJ6L3.js.map → capsule-crypto-GWVG7LGC.js.map} +0 -0
  127. package/dist/{chunk-YB4GBWBU.js.map → chunk-2JHRCWHT.js.map} +0 -0
  128. package/dist/{chunk-BK5G2MHO.js.map → chunk-2RXUZVPU.js.map} +0 -0
  129. package/dist/{chunk-JPAKBNTM.js.map → chunk-3I22VWB3.js.map} +0 -0
  130. package/dist/{chunk-ECLJ4LA2.js.map → chunk-53MZQEBD.js.map} +0 -0
  131. package/dist/{chunk-HF5BUTI6.js.map → chunk-5GIZM4RX.js.map} +0 -0
  132. package/dist/{chunk-2EPOGPKO.js.map → chunk-5TG4MU2U.js.map} +0 -0
  133. package/dist/{chunk-VDX2J7OX.js.map → chunk-5W7CTZ2E.js.map} +0 -0
  134. package/dist/{chunk-N56GVOWR.js.map → chunk-5W7MKXMU.js.map} +0 -0
  135. package/dist/{chunk-YHCBJULX.js.map → chunk-6FUMA6AA.js.map} +0 -0
  136. package/dist/{chunk-THVI4Y7X.js.map → chunk-6LS5OX3U.js.map} +0 -0
  137. package/dist/{chunk-TVVEYCNW.js.map → chunk-7K5Q6COX.js.map} +0 -0
  138. package/dist/{chunk-OWQNJJY2.js.map → chunk-7OZSHBWK.js.map} +0 -0
  139. package/dist/{chunk-CQBIN77D.js.map → chunk-7SSRXEZJ.js.map} +0 -0
  140. package/dist/{chunk-NNBZS3DY.js.map → chunk-AG46P24C.js.map} +0 -0
  141. package/dist/{chunk-NH6LC57D.js.map → chunk-AYAZWXJI.js.map} +0 -0
  142. package/dist/{chunk-WDXD6ITO.js.map → chunk-BXXOPKT5.js.map} +0 -0
  143. package/dist/{chunk-DJZWNKFO.js.map → chunk-D35XLYQ7.js.map} +0 -0
  144. package/dist/{chunk-KOO37E4Y.js.map → chunk-DYO24BNB.js.map} +0 -0
  145. package/dist/{chunk-DORFF5N5.js.map → chunk-FEO2CDXR.js.map} +0 -0
  146. package/dist/{chunk-IURMJBGP.js.map → chunk-HWVNYNIV.js.map} +0 -0
  147. package/dist/{chunk-OZDFB22S.js.map → chunk-IDQ6DKXC.js.map} +0 -0
  148. package/dist/{chunk-J3ATBB7M.js.map → chunk-IF4EY26E.js.map} +0 -0
  149. package/dist/{chunk-W675UJCZ.js.map → chunk-IRXMJLTW.js.map} +0 -0
  150. package/dist/{chunk-DUZARALI.js.map → chunk-JFWZRUKP.js.map} +0 -0
  151. package/dist/{chunk-DUEDOYZD.js.map → chunk-JGG5HVI2.js.map} +0 -0
  152. package/dist/{chunk-3NH3VP3U.js.map → chunk-KBOG7FJV.js.map} +0 -0
  153. package/dist/{chunk-UCKG36HO.js.map → chunk-LSYD7GHZ.js.map} +0 -0
  154. package/dist/{chunk-6433HV72.js.map → chunk-MVIYRRVJ.js.map} +0 -0
  155. package/dist/{chunk-FBR7PIL4.js.map → chunk-NLUCDKLT.js.map} +0 -0
  156. package/dist/{chunk-TJFI3K2O.js.map → chunk-O4BAGJDN.js.map} +0 -0
  157. package/dist/{chunk-LYBIHM4N.js.map → chunk-OMZLBT4B.js.map} +0 -0
  158. package/dist/{chunk-BXLOS5AJ.js.map → chunk-OWHERGF2.js.map} +0 -0
  159. package/dist/{chunk-BW4GAF57.js.map → chunk-PGW64IFQ.js.map} +0 -0
  160. package/dist/{chunk-CV3GNPOE.js.map → chunk-PNAGNVGK.js.map} +0 -0
  161. package/dist/{chunk-YDKF4MSJ.js.map → chunk-QMZY3GG6.js.map} +0 -0
  162. package/dist/{chunk-N37X5RU7.js.map → chunk-RACZB5HT.js.map} +0 -0
  163. package/dist/{chunk-YZJM6CLF.js.map → chunk-ROEAEANL.js.map} +0 -0
  164. package/dist/{chunk-KTPXXVDQ.js.map → chunk-RQ2EQRRR.js.map} +0 -0
  165. package/dist/{chunk-2IXQSGCU.js.map → chunk-SR7JIRAR.js.map} +0 -0
  166. package/dist/{chunk-OCCHUEZB.js.map → chunk-TWBQQ3FT.js.map} +0 -0
  167. package/dist/{chunk-NLEH4RTB.js.map → chunk-US4IRASK.js.map} +0 -0
  168. package/dist/{chunk-DQEMWVMT.js.map → chunk-UVYI6VIX.js.map} +0 -0
  169. package/dist/{chunk-IIRCHGWD.js.map → chunk-W6J4POB6.js.map} +0 -0
  170. package/dist/{chunk-4JSF7UUP.js.map → chunk-X2DWBWOX.js.map} +0 -0
  171. package/dist/{chunk-2MVTAIL3.js.map → chunk-XAWIL7TC.js.map} +0 -0
  172. package/dist/{chunk-UFR6HX7A.js.map → chunk-XUZ5CIEE.js.map} +0 -0
  173. package/dist/{chunk-GIC6BASP.js.map → chunk-XZBXINXZ.js.map} +0 -0
  174. package/dist/{chunk-BA2GLSIP.js.map → chunk-YUTTMSC7.js.map} +0 -0
  175. package/dist/{chunk-DPGH6LHQ.js.map → chunk-YWBOOBDP.js.map} +0 -0
  176. package/dist/{chunk-KFIOPZ25.js.map → chunk-ZXUZ54Z5.js.map} +0 -0
  177. package/dist/{cli-BqdqPdG_.d.ts → cli-Bfgo0n1L.d.ts} +1 -1
@@ -4,7 +4,7 @@ import {
4
4
  SUPPORT_PASSPORT_MODEL_RESULT_PATH,
5
5
  SupportPassportModelBridge,
6
6
  parseSupportPassportModelJob
7
- } from "../chunk-4JSF7UUP.js";
7
+ } from "../chunk-X2DWBWOX.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-NH6LC57D.js";
18
- import "../chunk-OWQNJJY2.js";
17
+ } from "../chunk-AYAZWXJI.js";
18
+ import "../chunk-7OZSHBWK.js";
19
19
  import {
20
20
  SUPPORT_PASSPORT_DRAFT_MAX_CONTENT_CHARACTERS,
21
21
  SUPPORT_PASSPORT_DRAFT_MAX_MEMORIES,
@@ -56,16 +56,16 @@ import {
56
56
  notifySupportPassportCommitted,
57
57
  resolveSupportPassportModelRoutePlan,
58
58
  syncDirectoryForDurability
59
- } from "../chunk-CV3GNPOE.js";
59
+ } from "../chunk-PNAGNVGK.js";
60
60
  import "../chunk-GDASG7NC.js";
61
61
  import "../chunk-GDB4J2H3.js";
62
- import "../chunk-6433HV72.js";
62
+ import "../chunk-MVIYRRVJ.js";
63
63
  import "../chunk-VQ7B2Q6M.js";
64
- import "../chunk-KFIOPZ25.js";
64
+ import "../chunk-ZXUZ54Z5.js";
65
65
  import "../chunk-PJSK6OJM.js";
66
+ import "../chunk-5QZR2RA3.js";
66
67
  import "../chunk-GNVZQ5JN.js";
67
68
  import "../chunk-YN2UN7N3.js";
68
- import "../chunk-5QZR2RA3.js";
69
69
  import "../chunk-P5FPO2BR.js";
70
70
  import "../chunk-S4DDLTPX.js";
71
71
  import "../chunk-ZVZHG7AI.js";
@@ -73,7 +73,7 @@ import "../chunk-H7XKCNR6.js";
73
73
  import "../chunk-YOXVZJFM.js";
74
74
  import "../chunk-SOBJ6NEY.js";
75
75
  import "../chunk-MFOSZUIT.js";
76
- import "../chunk-2MVTAIL3.js";
76
+ import "../chunk-XAWIL7TC.js";
77
77
  import "../chunk-CVILPI77.js";
78
78
  import "../chunk-2HIJHXB3.js";
79
79
  import "../chunk-AQEJKOKI.js";
@@ -95,10 +95,10 @@ import "../chunk-7BEPVIH3.js";
95
95
  import "../chunk-7ZNJN5WZ.js";
96
96
  import "../chunk-C37ZRXX7.js";
97
97
  import "../chunk-UFGFMWAD.js";
98
- import "../chunk-KOO37E4Y.js";
99
- import "../chunk-WDXD6ITO.js";
100
- import "../chunk-OZDFB22S.js";
101
- import "../chunk-CQBIN77D.js";
98
+ import "../chunk-DYO24BNB.js";
99
+ import "../chunk-BXXOPKT5.js";
100
+ import "../chunk-IDQ6DKXC.js";
101
+ import "../chunk-7SSRXEZJ.js";
102
102
  import "../chunk-BIJAWZYW.js";
103
103
  import "../chunk-LXY5VVGM.js";
104
104
  import "../chunk-2LSZVONP.js";
@@ -108,32 +108,32 @@ import "../chunk-CSAKJVXW.js";
108
108
  import "../chunk-K2XUWZBM.js";
109
109
  import "../chunk-OD4FM2U7.js";
110
110
  import "../chunk-ZY2MNJR6.js";
111
- import "../chunk-TJFI3K2O.js";
111
+ import "../chunk-O4BAGJDN.js";
112
112
  import "../chunk-ZXBTTMGZ.js";
113
- import "../chunk-IURMJBGP.js";
114
- import "../chunk-THVI4Y7X.js";
113
+ import "../chunk-HWVNYNIV.js";
114
+ import "../chunk-6LS5OX3U.js";
115
115
  import "../chunk-UHVXE24Y.js";
116
116
  import "../chunk-46WM6JX2.js";
117
117
  import "../chunk-SXIMQLGV.js";
118
- import "../chunk-YHCBJULX.js";
119
- import "../chunk-DJZWNKFO.js";
120
- import "../chunk-N37X5RU7.js";
121
- import "../chunk-NNBZS3DY.js";
122
- import "../chunk-CYEPCZN5.js";
123
- import "../chunk-GIC6BASP.js";
118
+ import "../chunk-6FUMA6AA.js";
119
+ import "../chunk-D35XLYQ7.js";
124
120
  import "../chunk-YQNNHLCG.js";
125
- import "../chunk-W7IGLX4G.js";
126
121
  import "../chunk-6KTXE6A3.js";
122
+ import "../chunk-RACZB5HT.js";
123
+ import "../chunk-AG46P24C.js";
124
+ import "../chunk-CYEPCZN5.js";
125
+ import "../chunk-XZBXINXZ.js";
127
126
  import "../chunk-GUMZC2BO.js";
127
+ import "../chunk-W7IGLX4G.js";
128
128
  import "../chunk-227UFSEQ.js";
129
129
  import "../chunk-ET356KSB.js";
130
130
  import "../chunk-72A4L5JJ.js";
131
131
  import "../chunk-A7Q43EUZ.js";
132
132
  import "../chunk-S2V7RUCL.js";
133
133
  import "../chunk-LBFFNDFM.js";
134
+ import "../chunk-S2HLHAZ4.js";
134
135
  import "../chunk-SCU65EZI.js";
135
136
  import "../chunk-PO7NXBG2.js";
136
- import "../chunk-S2HLHAZ4.js";
137
137
  import "../chunk-DM2T26WE.js";
138
138
  import "../chunk-LDXUBPMO.js";
139
139
  import "../chunk-UG6VXIOK.js";
@@ -188,9 +188,9 @@ import "../chunk-Z7L72ZHL.js";
188
188
  import "../chunk-4O4TKIXQ.js";
189
189
  import "../chunk-TBBDFYXW.js";
190
190
  import "../chunk-YCVB7X56.js";
191
- import "../chunk-VDX2J7OX.js";
191
+ import "../chunk-5W7CTZ2E.js";
192
+ import "../chunk-UVYI6VIX.js";
192
193
  import "../chunk-WEHSQBFR.js";
193
- import "../chunk-DQEMWVMT.js";
194
194
  import "../chunk-J4EB7DNW.js";
195
195
  import "../chunk-BJMBJZ2Y.js";
196
196
  import "../chunk-UKJAGEXH.js";
@@ -275,9 +275,9 @@ import "../chunk-2Z24E5W2.js";
275
275
  import "../chunk-BTTPKDIL.js";
276
276
  import "../chunk-A2IYSXDQ.js";
277
277
  import "../chunk-P77QX3ID.js";
278
- import "../chunk-TVVEYCNW.js";
279
- import "../chunk-RFYAYKTD.js";
278
+ import "../chunk-7K5Q6COX.js";
280
279
  import "../chunk-LBLXEFWK.js";
280
+ import "../chunk-RFYAYKTD.js";
281
281
  import "../chunk-JIYDRBVZ.js";
282
282
  import "../chunk-FF4KLI5W.js";
283
283
  import "../chunk-XQ3HXAQH.js";
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  backupMemoryDir
3
- } from "../chunk-BXLOS5AJ.js";
3
+ } from "../chunk-OWHERGF2.js";
4
4
  import "../chunk-765K3SAT.js";
5
- import "../chunk-DQEMWVMT.js";
5
+ import "../chunk-UVYI6VIX.js";
6
6
  import "../chunk-J4EB7DNW.js";
7
7
  import "../chunk-BJMBJZ2Y.js";
8
8
  import "../chunk-UKJAGEXH.js";
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  exportCapsule,
3
3
  isValidCapsuleSince
4
- } from "../chunk-VDX2J7OX.js";
4
+ } from "../chunk-5W7CTZ2E.js";
5
+ import "../chunk-UVYI6VIX.js";
5
6
  import "../chunk-WEHSQBFR.js";
6
- import "../chunk-DQEMWVMT.js";
7
7
  import "../chunk-J4EB7DNW.js";
8
8
  import "../chunk-BJMBJZ2Y.js";
9
9
  import "../chunk-UKJAGEXH.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  importCapsule
3
- } from "../chunk-6433HV72.js";
3
+ } from "../chunk-MVIYRRVJ.js";
4
4
  import "../chunk-UFKPQBXH.js";
5
5
  import "../chunk-XCB6QDL6.js";
6
6
  import "../chunk-RBOJCG4T.js";
@@ -9,8 +9,8 @@ import "../chunk-5WITETWU.js";
9
9
  import "../chunk-6CIAGZ6X.js";
10
10
  import "../chunk-C64XATK7.js";
11
11
  import "../chunk-42JKGUFJ.js";
12
+ import "../chunk-UVYI6VIX.js";
12
13
  import "../chunk-WEHSQBFR.js";
13
- import "../chunk-DQEMWVMT.js";
14
14
  import "../chunk-BJMBJZ2Y.js";
15
15
  import "../chunk-UKJAGEXH.js";
16
16
  import "../chunk-FP2373TW.js";
@@ -1,31 +1,31 @@
1
1
  import {
2
2
  compareVerifiedEpisodeResults,
3
3
  searchVerifiedEpisodes
4
- } from "./chunk-ECLJ4LA2.js";
4
+ } from "./chunk-53MZQEBD.js";
5
5
  import "./chunk-B7RWBZXW.js";
6
- import "./chunk-THVI4Y7X.js";
6
+ import "./chunk-6LS5OX3U.js";
7
7
  import "./chunk-UHVXE24Y.js";
8
8
  import "./chunk-46WM6JX2.js";
9
9
  import "./chunk-SXIMQLGV.js";
10
- import "./chunk-YHCBJULX.js";
11
- import "./chunk-DJZWNKFO.js";
12
- import "./chunk-N37X5RU7.js";
13
- import "./chunk-NNBZS3DY.js";
14
- import "./chunk-CYEPCZN5.js";
15
- import "./chunk-GIC6BASP.js";
10
+ import "./chunk-6FUMA6AA.js";
11
+ import "./chunk-D35XLYQ7.js";
16
12
  import "./chunk-YQNNHLCG.js";
17
- import "./chunk-W7IGLX4G.js";
18
13
  import "./chunk-6KTXE6A3.js";
14
+ import "./chunk-RACZB5HT.js";
15
+ import "./chunk-AG46P24C.js";
16
+ import "./chunk-CYEPCZN5.js";
17
+ import "./chunk-XZBXINXZ.js";
19
18
  import "./chunk-GUMZC2BO.js";
19
+ import "./chunk-W7IGLX4G.js";
20
20
  import "./chunk-227UFSEQ.js";
21
21
  import "./chunk-ET356KSB.js";
22
22
  import "./chunk-72A4L5JJ.js";
23
23
  import "./chunk-A7Q43EUZ.js";
24
24
  import "./chunk-S2V7RUCL.js";
25
25
  import "./chunk-LBFFNDFM.js";
26
+ import "./chunk-S2HLHAZ4.js";
26
27
  import "./chunk-SCU65EZI.js";
27
28
  import "./chunk-PO7NXBG2.js";
28
- import "./chunk-S2HLHAZ4.js";
29
29
  import "./chunk-DM2T26WE.js";
30
30
  import "./chunk-LDXUBPMO.js";
31
31
  import "./chunk-UG6VXIOK.js";
@@ -4,31 +4,31 @@ import {
4
4
  renderWhoKnows,
5
5
  renderWhoKnowsJson,
6
6
  renderWhoKnowsText
7
- } from "./chunk-2IXQSGCU.js";
8
- import "./chunk-KFIOPZ25.js";
9
- import "./chunk-THVI4Y7X.js";
7
+ } from "./chunk-SR7JIRAR.js";
8
+ import "./chunk-ZXUZ54Z5.js";
9
+ import "./chunk-6LS5OX3U.js";
10
10
  import "./chunk-UHVXE24Y.js";
11
11
  import "./chunk-46WM6JX2.js";
12
12
  import "./chunk-SXIMQLGV.js";
13
- import "./chunk-YHCBJULX.js";
14
- import "./chunk-DJZWNKFO.js";
15
- import "./chunk-N37X5RU7.js";
16
- import "./chunk-NNBZS3DY.js";
17
- import "./chunk-CYEPCZN5.js";
18
- import "./chunk-GIC6BASP.js";
13
+ import "./chunk-6FUMA6AA.js";
14
+ import "./chunk-D35XLYQ7.js";
19
15
  import "./chunk-YQNNHLCG.js";
20
- import "./chunk-W7IGLX4G.js";
21
16
  import "./chunk-6KTXE6A3.js";
17
+ import "./chunk-RACZB5HT.js";
18
+ import "./chunk-AG46P24C.js";
19
+ import "./chunk-CYEPCZN5.js";
20
+ import "./chunk-XZBXINXZ.js";
22
21
  import "./chunk-GUMZC2BO.js";
22
+ import "./chunk-W7IGLX4G.js";
23
23
  import "./chunk-227UFSEQ.js";
24
24
  import "./chunk-ET356KSB.js";
25
25
  import "./chunk-72A4L5JJ.js";
26
26
  import "./chunk-A7Q43EUZ.js";
27
27
  import "./chunk-S2V7RUCL.js";
28
28
  import "./chunk-LBFFNDFM.js";
29
+ import "./chunk-S2HLHAZ4.js";
29
30
  import "./chunk-SCU65EZI.js";
30
31
  import "./chunk-PO7NXBG2.js";
31
- import "./chunk-S2HLHAZ4.js";
32
32
  import "./chunk-DM2T26WE.js";
33
33
  import "./chunk-LDXUBPMO.js";
34
34
  import "./chunk-UG6VXIOK.js";
package/dist/who-knows.js CHANGED
@@ -9,30 +9,30 @@ import {
9
9
  loadWhoKnowsEntities,
10
10
  tokenizeTopic,
11
11
  validateWhoKnowsInput
12
- } from "./chunk-KFIOPZ25.js";
13
- import "./chunk-THVI4Y7X.js";
12
+ } from "./chunk-ZXUZ54Z5.js";
13
+ import "./chunk-6LS5OX3U.js";
14
14
  import "./chunk-UHVXE24Y.js";
15
15
  import "./chunk-46WM6JX2.js";
16
16
  import "./chunk-SXIMQLGV.js";
17
- import "./chunk-YHCBJULX.js";
18
- import "./chunk-DJZWNKFO.js";
19
- import "./chunk-N37X5RU7.js";
20
- import "./chunk-NNBZS3DY.js";
21
- import "./chunk-CYEPCZN5.js";
22
- import "./chunk-GIC6BASP.js";
17
+ import "./chunk-6FUMA6AA.js";
18
+ import "./chunk-D35XLYQ7.js";
23
19
  import "./chunk-YQNNHLCG.js";
24
- import "./chunk-W7IGLX4G.js";
25
20
  import "./chunk-6KTXE6A3.js";
21
+ import "./chunk-RACZB5HT.js";
22
+ import "./chunk-AG46P24C.js";
23
+ import "./chunk-CYEPCZN5.js";
24
+ import "./chunk-XZBXINXZ.js";
26
25
  import "./chunk-GUMZC2BO.js";
26
+ import "./chunk-W7IGLX4G.js";
27
27
  import "./chunk-227UFSEQ.js";
28
28
  import "./chunk-ET356KSB.js";
29
29
  import "./chunk-72A4L5JJ.js";
30
30
  import "./chunk-A7Q43EUZ.js";
31
31
  import "./chunk-S2V7RUCL.js";
32
32
  import "./chunk-LBFFNDFM.js";
33
+ import "./chunk-S2HLHAZ4.js";
33
34
  import "./chunk-SCU65EZI.js";
34
35
  import "./chunk-PO7NXBG2.js";
35
- import "./chunk-S2HLHAZ4.js";
36
36
  import "./chunk-DM2T26WE.js";
37
37
  import "./chunk-LDXUBPMO.js";
38
38
  import "./chunk-UG6VXIOK.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remnic/core",
3
- "version": "9.65.5",
3
+ "version": "9.65.6",
4
4
  "description": "Framework-agnostic Remnic memory engine — orchestrator, storage, extraction, search, trust zones",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -3166,7 +3166,7 @@
3166
3166
  "core"
3167
3167
  ],
3168
3168
  "peerDependencies": {
3169
- "@remnic/coding-graph": "^9.65.5"
3169
+ "@remnic/coding-graph": "^9.65.6"
3170
3170
  },
3171
3171
  "peerDependenciesMeta": {
3172
3172
  "@remnic/coding-graph": {
package/src/index.ts CHANGED
@@ -1460,3 +1460,6 @@ export type {
1460
1460
  } from "./coding/coding-graph-types.js";
1461
1461
  export type { ResolvedScopeProfilePlan } from "./namespaces/scope-profiles.js";
1462
1462
  export * from "./maintenance/atomic-file.js";
1463
+
1464
+ export { MemoryControllerCoordinator, chooseAction, computeEvidenceReportHash, controllerConfigHash, evaluateActiveGates, hashControllerState, verifyEvidenceReport } from "./memory-controller.js";
1465
+ export type { ActiveContextAdapter, ActiveContextMessage, ActiveContextPlan, MemoryControllerActionFamily, MemoryControllerChoice, MemoryControllerConfig, MemoryControllerDeps, MemoryControllerEvent, MemoryControllerEvidence, MemoryControllerEvidenceReport, MemoryControllerExecutors, MemoryControllerMode, MemoryControllerPairedSeedEvidence, MemoryControllerReceipt, MemoryControllerRecorder, MemoryControllerReportReader, MemoryControllerRunResult, MemoryControllerState } from "./memory-controller.js";
@@ -0,0 +1,347 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+
4
+ import {
5
+ MemoryControllerCoordinator,
6
+ chooseAction,
7
+ computeEvidenceReportHash,
8
+ controllerConfigHash,
9
+ evaluateActiveGates,
10
+ hashControllerState,
11
+ type ActiveContextPlan,
12
+ type MemoryControllerConfig,
13
+ type MemoryControllerDeps,
14
+ type MemoryControllerEvent,
15
+ type MemoryControllerEvidence,
16
+ type MemoryControllerExecutors,
17
+ type MemoryControllerMode,
18
+ } from "./memory-controller.js";
19
+
20
+ const NOW = new Date("2026-08-18T12:00:00.000Z");
21
+
22
+ function config(mode: MemoryControllerMode): MemoryControllerConfig {
23
+ return {
24
+ mode,
25
+ reportVersion: "2345-v1",
26
+ evidenceMaxAgeMs: 24 * 60 * 60 * 1000,
27
+ minPairedSeeds: 2,
28
+ shadowMinRecords: 3,
29
+ };
30
+ }
31
+
32
+ function evidence(overrides?: {
33
+ report?: Partial<MemoryControllerEvidence["report"]>;
34
+ pairedSeed?: Partial<MemoryControllerEvidence["pairedSeed"]>;
35
+ }): MemoryControllerEvidence {
36
+ const report = {
37
+ status: "pass",
38
+ version: "2345-v1",
39
+ configHash: controllerConfigHash(config("active")),
40
+ generatedAt: NOW.toISOString(),
41
+ ...overrides?.report,
42
+ } as MemoryControllerEvidence["report"];
43
+ return {
44
+ report: { ...report, reportHash: computeEvidenceReportHash(report) },
45
+ pairedSeed: {
46
+ status: "pass",
47
+ seedCount: 3,
48
+ generatedAt: NOW.toISOString(),
49
+ ...overrides?.pairedSeed,
50
+ },
51
+ };
52
+ }
53
+
54
+ function echoReceipt(input: { decisionId: string }): { decisionId: string; ok: true } {
55
+ return { decisionId: input.decisionId, ok: true };
56
+ }
57
+
58
+ function harness(options?: {
59
+ mode?: MemoryControllerMode;
60
+ evidenceOverride?: MemoryControllerEvidence | null;
61
+ shadowRecords?: number;
62
+ recordThrows?: boolean;
63
+ executors?: MemoryControllerExecutors;
64
+ adapterPlan?: ActiveContextPlan | null;
65
+ }) {
66
+ const events: MemoryControllerEvent[] = [];
67
+ const calls: string[] = [];
68
+ let dispatched = false;
69
+ const markDispatch =
70
+ <T>(label: string) =>
71
+ async (input: T & { decisionId: string }) => {
72
+ calls.push(label);
73
+ dispatched = true;
74
+ return echoReceipt(input);
75
+ };
76
+ const deps: MemoryControllerDeps = {
77
+ config: config(options?.mode ?? "active"),
78
+ reportReader: {
79
+ read: async () =>
80
+ options?.evidenceOverride === undefined || options.evidenceOverride !== null
81
+ ? (options?.evidenceOverride ?? evidence())
82
+ : null,
83
+ },
84
+ recorder: {
85
+ record: async (event) => {
86
+ if (options?.recordThrows) throw new Error("recorder down");
87
+ if (event.phase === "choice") {
88
+ // Gate proof: the choice record must precede any dispatch.
89
+ assert.ok(!dispatched, "choice event recorded after dispatch");
90
+ }
91
+ events.push(event);
92
+ },
93
+ countShadowRecords: async () => options?.shadowRecords ?? 10,
94
+ },
95
+ executors:
96
+ options?.executors ??
97
+ ({
98
+ executePersistentMemory: markDispatch("persistent"),
99
+ executeRecall: markDispatch("recall"),
100
+ executeActiveContext: markDispatch("context"),
101
+ } as MemoryControllerExecutors),
102
+ activeContextAdapter:
103
+ options?.adapterPlan === null
104
+ ? undefined
105
+ : {
106
+ plan: () => options?.adapterPlan ?? { transform: "FILTER", messageIds: ["m1"], planId: "p1" },
107
+ },
108
+ telemetry: (event) => calls.push(`telemetry:${event.phase}`),
109
+ clock: () => NOW,
110
+ };
111
+ return { deps, events, calls };
112
+ }
113
+
114
+ const RECALL_PROMPT = "what did we decide last time?";
115
+
116
+ test("off mode makes no choice, no read, no write, no call", async () => {
117
+ const h = harness({ mode: "off" });
118
+ const explode = async () => {
119
+ throw new Error("touched in off mode");
120
+ };
121
+ h.deps.reportReader = { read: explode };
122
+ h.deps.recorder = { record: explode, countShadowRecords: explode };
123
+ h.deps.executors = { executeRecall: explode } as MemoryControllerExecutors;
124
+ h.deps.policyRuntime = { loadRuntimeValues: explode };
125
+ h.deps.readUtilityRuntime = explode;
126
+
127
+ const result = await new MemoryControllerCoordinator(h.deps).run({ prompt: RECALL_PROMPT });
128
+
129
+ assert.equal(result.effectiveMode, "off");
130
+ assert.equal(result.executed, false);
131
+ assert.equal(result.recorded, false);
132
+ assert.deepEqual(h.events, []);
133
+ assert.deepEqual(h.calls, []);
134
+ });
135
+
136
+ test("shadow mode records the choice but calls no executor", async () => {
137
+ const h = harness({ mode: "shadow" });
138
+ const result = await new MemoryControllerCoordinator(h.deps).run({ prompt: RECALL_PROMPT });
139
+
140
+ assert.equal(result.effectiveMode, "shadow");
141
+ assert.equal(result.recorded, true);
142
+ assert.equal(result.executed, false);
143
+ assert.deepEqual(h.calls, ["telemetry:choice"]);
144
+ assert.equal(h.events.length, 1);
145
+ assert.equal(h.events[0].phase, "choice");
146
+ assert.ok(h.events[0].stateHash.length > 0);
147
+ });
148
+
149
+ test("active mode with passing gates executes and links one id across events", async () => {
150
+ const h = harness();
151
+ const result = await new MemoryControllerCoordinator(h.deps).run({ prompt: RECALL_PROMPT });
152
+
153
+ assert.equal(result.effectiveMode, "active");
154
+ assert.deepEqual(result.demotionReasons, []);
155
+ assert.equal(result.choice.family, "recall");
156
+ assert.ok(h.calls.includes("recall"));
157
+ const ids = new Set(h.events.map((event) => event.decisionId));
158
+ ids.add(result.decisionId);
159
+ if (result.receipt) ids.add(result.receipt.decisionId);
160
+ assert.equal(ids.size, 1, "one id joins each event");
161
+ assert.equal(result.executed, true);
162
+ const outcome = h.events.find((event) => event.phase === "outcome");
163
+ assert.equal(outcome?.receipt?.decisionId, result.decisionId);
164
+ });
165
+
166
+ test("bad or old evidence forces shadow: report gates", async () => {
167
+ const cases: { name: string; options: Parameters<typeof harness>[0] }[] = [
168
+ { name: "no evidence", options: { evidenceOverride: null } },
169
+ {
170
+ name: "report not passing",
171
+ options: { evidenceOverride: evidence({ report: { status: "fail" } }) },
172
+ },
173
+ {
174
+ name: "version mismatch",
175
+ options: { evidenceOverride: evidence({ report: { version: "2345-v0" } }) },
176
+ },
177
+ {
178
+ name: "config unbound",
179
+ options: {
180
+ evidenceOverride: evidence({
181
+ report: { configHash: controllerConfigHash({ ...config("active"), shadowMinRecords: 99 }) },
182
+ }),
183
+ },
184
+ },
185
+ {
186
+ name: "report hash invalid",
187
+ options: {
188
+ evidenceOverride: {
189
+ report: { ...evidence().report, reportHash: "0".repeat(64) },
190
+ pairedSeed: evidence().pairedSeed,
191
+ },
192
+ },
193
+ },
194
+ {
195
+ name: "report stale",
196
+ options: { evidenceOverride: evidence({ report: { generatedAt: "2020-01-01T00:00:00.000Z" } }) },
197
+ },
198
+ ];
199
+ for (const testCase of cases) {
200
+ const h = harness(testCase.options);
201
+ const result = await new MemoryControllerCoordinator(h.deps).run({ prompt: RECALL_PROMPT });
202
+ assert.equal(result.effectiveMode, "shadow", testCase.name);
203
+ assert.equal(result.executed, false, testCase.name);
204
+ assert.ok(!h.calls.some((c) => c !== "telemetry:choice"), testCase.name);
205
+ }
206
+ });
207
+
208
+ test("bad or old paired-seed evidence forces shadow", async () => {
209
+ const pairedSeeds = [
210
+ { status: "fail" as const, seedCount: 3, generatedAt: NOW.toISOString() },
211
+ { status: "pass" as const, seedCount: 1, generatedAt: NOW.toISOString() },
212
+ { status: "pass" as const, seedCount: 3, generatedAt: "2020-01-01T00:00:00.000Z" },
213
+ ];
214
+ for (const pairedSeed of pairedSeeds) {
215
+ const h = harness({ evidenceOverride: evidence({ pairedSeed }) });
216
+ const result = await new MemoryControllerCoordinator(h.deps).run({ prompt: RECALL_PROMPT });
217
+ assert.equal(result.effectiveMode, "shadow", JSON.stringify(pairedSeed));
218
+ assert.ok(result.demotionReasons.some((r) => r.startsWith("paired_seed")));
219
+ assert.equal(result.executed, false);
220
+ }
221
+ });
222
+
223
+ test("active promotion requires prior shadow records (shadow before active)", async () => {
224
+ const h = harness({ shadowRecords: 1 });
225
+ const result = await new MemoryControllerCoordinator(h.deps).run({ prompt: RECALL_PROMPT });
226
+ assert.equal(result.effectiveMode, "shadow");
227
+ assert.ok(result.demotionReasons.includes("shadow_history_insufficient"));
228
+ assert.equal(result.executed, false);
229
+ });
230
+
231
+ test("failed receipt forces shadow on the next run", async () => {
232
+ const h = harness({
233
+ executors: {
234
+ executeRecall: async () => ({ decisionId: "wrong-id", ok: true }),
235
+ },
236
+ });
237
+ const coordinator = new MemoryControllerCoordinator(h.deps);
238
+ const first = await coordinator.run({ prompt: RECALL_PROMPT });
239
+ assert.equal(first.executed, false, "mismatched receipt id is a bad receipt");
240
+ assert.ok(h.events.find((event) => event.phase === "outcome")?.failureClass === "bad_receipt");
241
+
242
+ const second = await coordinator.run({ prompt: RECALL_PROMPT });
243
+ assert.equal(second.effectiveMode, "shadow");
244
+ assert.ok(second.demotionReasons.includes("recent_receipt_failures"));
245
+ assert.equal(second.executed, false);
246
+ });
247
+
248
+ test("executor error or missing executor records a failure class and demotes next run", async () => {
249
+ const h = harness({
250
+ executors: {
251
+ executeRecall: async () => Promise.reject(new Error("boom")),
252
+ },
253
+ });
254
+ const coordinator = new MemoryControllerCoordinator(h.deps);
255
+ const failed = await coordinator.run({ prompt: RECALL_PROMPT });
256
+ assert.equal(failed.executed, false);
257
+ assert.equal(h.events.find((event) => event.phase === "outcome")?.failureClass, "executor_error");
258
+ const next = await coordinator.run({ prompt: RECALL_PROMPT });
259
+ assert.equal(next.effectiveMode, "shadow");
260
+
261
+ const h2 = harness({ executors: {} });
262
+ const missing = await new MemoryControllerCoordinator(h2.deps).run({ prompt: RECALL_PROMPT });
263
+ assert.equal(missing.executed, false);
264
+ assert.equal(h2.events.find((event) => event.phase === "outcome")?.failureClass, "no_executor");
265
+ });
266
+
267
+ test("bad scores fail closed to no_op", () => {
268
+ const { choice, scores } = chooseAction({
269
+ state: {
270
+ prompt: RECALL_PROMPT,
271
+ persistentMemoryCandidate: {
272
+ action: "store_note",
273
+ eligibility: {
274
+ confidence: Number.NaN,
275
+ lifecycleState: "active",
276
+ importance: 0.5,
277
+ source: "extraction",
278
+ },
279
+ },
280
+ },
281
+ });
282
+ assert.deepEqual(choice, { family: "no_op" });
283
+ assert.ok(Number.isNaN(scores.persistent_memory));
284
+ });
285
+
286
+ test("discard stays review-only in active mode", async () => {
287
+ const h = harness();
288
+ const result = await new MemoryControllerCoordinator(h.deps).run({
289
+ prompt: "ok",
290
+ persistentMemoryCandidate: {
291
+ action: "discard",
292
+ eligibility: {
293
+ confidence: 0.9,
294
+ lifecycleState: "active",
295
+ importance: 0.1,
296
+ source: "extraction",
297
+ },
298
+ },
299
+ });
300
+ assert.equal(result.choice.family, "persistent_memory");
301
+ assert.equal(result.choice.action, "discard");
302
+ assert.equal(result.reviewOnly, true);
303
+ assert.equal(result.executed, false);
304
+ assert.deepEqual(h.calls, ["telemetry:choice", "telemetry:outcome"]);
305
+ assert.equal(h.events.find((event) => event.phase === "outcome")?.reviewOnly, true);
306
+ });
307
+
308
+ test("record failure stops work before dispatch", async () => {
309
+ const h = harness({ recordThrows: true });
310
+ const result = await new MemoryControllerCoordinator(h.deps).run({ prompt: RECALL_PROMPT });
311
+ assert.equal(result.recorded, false);
312
+ assert.equal(result.executed, false);
313
+ assert.ok(result.demotionReasons.includes("record_failed"));
314
+ assert.deepEqual(h.calls, []);
315
+ });
316
+
317
+ test("one hash names each state", () => {
318
+ assert.equal(hashControllerState({ prompt: "same" }), hashControllerState({ prompt: "same" }));
319
+ assert.notEqual(hashControllerState({ prompt: "same" }), hashControllerState({ prompt: "other" }));
320
+ });
321
+
322
+ test("no counterfactual lift is claimed in events or results", async () => {
323
+ const h = harness();
324
+ const result = await new MemoryControllerCoordinator(h.deps).run({ prompt: RECALL_PROMPT });
325
+ const banned = /lift|counterfactual/i;
326
+ for (const event of h.events) {
327
+ for (const key of Object.keys(event)) assert.ok(!banned.test(key), `event key ${key}`);
328
+ }
329
+ for (const key of Object.keys(result)) assert.ok(!banned.test(key), `result key ${key}`);
330
+ });
331
+
332
+ test("evaluateActiveGates returns empty only when all gates pass", async () => {
333
+ const passing = await evaluateActiveGates({
334
+ config: config("active"),
335
+ reportReader: { read: async () => evidence() },
336
+ recorder: { record: async () => {}, countShadowRecords: async () => 5 },
337
+ consecutiveReceiptFailures: 0,
338
+ now: NOW,
339
+ });
340
+ assert.deepEqual(passing, []);
341
+ const noReader = await evaluateActiveGates({
342
+ config: config("active"),
343
+ consecutiveReceiptFailures: 0,
344
+ now: NOW,
345
+ });
346
+ assert.deepEqual(noReader, ["no_report_reader"]);
347
+ });