@remnic/core 9.69.96 → 9.69.98

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 (136) hide show
  1. package/dist/access-admin-ops-surface.js +9 -9
  2. package/dist/access-authorization-probe.js +10 -10
  3. package/dist/access-boundary.js +9 -9
  4. package/dist/access-cli.js +34 -34
  5. package/dist/access-extraction-force-flush.js +9 -9
  6. package/dist/access-http-briefing.js +10 -10
  7. package/dist/access-http-query.js +9 -9
  8. package/dist/access-http.d.ts.map +1 -1
  9. package/dist/access-http.js +28 -28
  10. package/dist/access-identity-continuity-surface.js +9 -9
  11. package/dist/access-lcm-surface.js +9 -9
  12. package/dist/access-mcp.js +16 -16
  13. package/dist/access-namespace-preflight.js +9 -9
  14. package/dist/access-observe-write-category.js +6 -6
  15. package/dist/access-observe-write-surface.js +9 -9
  16. package/dist/access-offline-manifest.js +5 -5
  17. package/dist/access-operations-batch.js +10 -10
  18. package/dist/access-operations.js +15 -15
  19. package/dist/access-recall-concurrency.js +9 -9
  20. package/dist/access-recall-response.js +9 -9
  21. package/dist/access-recall-surface.js +9 -9
  22. package/dist/access-schema.js +5 -5
  23. package/dist/access-service.js +9 -9
  24. package/dist/access-surface-catalog.js +11 -11
  25. package/dist/active-recall.js +5 -5
  26. package/dist/adapters/claude-code.js +2 -2
  27. package/dist/adapters/codex.js +2 -2
  28. package/dist/adapters/hermes.js +2 -2
  29. package/dist/adapters/index.js +6 -6
  30. package/dist/adapters/registry.js +6 -6
  31. package/dist/adapters/replit.js +2 -2
  32. package/dist/adapters/types.d.ts +2 -0
  33. package/dist/adapters/types.d.ts.map +1 -1
  34. package/dist/adapters/types.js +1 -1
  35. package/dist/{chunk-F23U5YE7.js → chunk-2KB7TTAP.js} +12 -10
  36. package/dist/chunk-2KB7TTAP.js.map +1 -0
  37. package/dist/{chunk-J64TK33U.js → chunk-3JKYQBLC.js} +5 -4
  38. package/dist/{chunk-J64TK33U.js.map → chunk-3JKYQBLC.js.map} +1 -1
  39. package/dist/{chunk-MSAI3Q7D.js → chunk-3QH4NT72.js} +2 -2
  40. package/dist/{chunk-P62DSJUK.js → chunk-3RMJLDMS.js} +4 -4
  41. package/dist/{chunk-KNI4SGQE.js → chunk-3SNJMRC7.js} +7 -7
  42. package/dist/{chunk-WHIGRW7T.js → chunk-4HUMF74S.js} +2 -2
  43. package/dist/{chunk-U36GYZ2P.js → chunk-55NZVUNI.js} +2 -2
  44. package/dist/{chunk-UG5V3Z3R.js → chunk-6MWPIWPF.js} +3 -3
  45. package/dist/{chunk-OEBUAC3O.js → chunk-76GQBIVX.js} +2 -2
  46. package/dist/{chunk-RSUYKGGZ.js → chunk-7RKSJVOQ.js} +5 -4
  47. package/dist/{chunk-RSUYKGGZ.js.map → chunk-7RKSJVOQ.js.map} +1 -1
  48. package/dist/{chunk-4NSLQ7EU.js → chunk-ANPRNTPT.js} +3 -3
  49. package/dist/{chunk-4NSLQ7EU.js.map → chunk-ANPRNTPT.js.map} +1 -1
  50. package/dist/{chunk-6BG364RN.js → chunk-AWEHMKIO.js} +2 -2
  51. package/dist/{chunk-AF5PW35O.js → chunk-FQJ4YXJO.js} +2 -2
  52. package/dist/{chunk-42NQ7AVG.js → chunk-HCAGBFE7.js} +5 -4
  53. package/dist/{chunk-42NQ7AVG.js.map → chunk-HCAGBFE7.js.map} +1 -1
  54. package/dist/{chunk-KYOZ5E6V.js → chunk-HDOWMJKD.js} +2 -2
  55. package/dist/{chunk-ANGZWYL2.js → chunk-I7BRU753.js} +3 -3
  56. package/dist/{chunk-MZAH3CBT.js → chunk-IKWD4VP7.js} +2 -2
  57. package/dist/{chunk-HQCUUVG2.js → chunk-J3GJ23IP.js} +19 -12
  58. package/dist/chunk-J3GJ23IP.js.map +1 -0
  59. package/dist/{chunk-3BTHXB7Z.js → chunk-JAQXKNQV.js} +2 -2
  60. package/dist/{chunk-AXGJMDBS.js → chunk-KO4X4WRJ.js} +2 -2
  61. package/dist/{chunk-VOZNBQNL.js → chunk-LBU623X7.js} +2 -2
  62. package/dist/{chunk-5S7SNRSJ.js → chunk-N6GYEWFQ.js} +2 -2
  63. package/dist/{chunk-7RXCMVFQ.js → chunk-NJAIR57U.js} +1 -1
  64. package/dist/{chunk-7RXCMVFQ.js.map → chunk-NJAIR57U.js.map} +1 -1
  65. package/dist/{chunk-PH2V7EXZ.js → chunk-NWXGLTWN.js} +2 -2
  66. package/dist/{chunk-R5B3OWI4.js → chunk-OYQAYIGE.js} +7 -7
  67. package/dist/{chunk-A3K2KKSG.js → chunk-PYYQCHJC.js} +2 -2
  68. package/dist/{chunk-GXETU7AE.js → chunk-QVYXXOTR.js} +7 -7
  69. package/dist/{chunk-TMSXWOBZ.js → chunk-SI36RWC3.js} +5 -4
  70. package/dist/{chunk-TMSXWOBZ.js.map → chunk-SI36RWC3.js.map} +1 -1
  71. package/dist/{chunk-NSKXRTVZ.js → chunk-ST4IBSPL.js} +2 -2
  72. package/dist/{chunk-SMLKHXPF.js → chunk-UKWQSPUU.js} +2 -2
  73. package/dist/{chunk-IVEHY2VT.js → chunk-VQEOBVF2.js} +4 -4
  74. package/dist/{chunk-YHZWVDP7.js → chunk-YHDA3DSO.js} +2 -2
  75. package/dist/{chunk-C6HPNPNK.js → chunk-ZK4XGNJ3.js} +4 -4
  76. package/dist/{chunk-ZQTYWSO3.js → chunk-ZNEA255W.js} +2 -2
  77. package/dist/cli.js +32 -32
  78. package/dist/config.js +5 -5
  79. package/dist/deep-recall-http-glue.js +6 -6
  80. package/dist/external-wiki-access.js +10 -10
  81. package/dist/index.js +34 -34
  82. package/dist/memory-browse-operations.js +10 -10
  83. package/dist/offline-sync-changeset-generations.js +3 -3
  84. package/dist/offline-sync-embedding-generation.js +2 -2
  85. package/dist/offline-sync-exclude-globs.d.ts +1 -0
  86. package/dist/offline-sync-exclude-globs.d.ts.map +1 -1
  87. package/dist/offline-sync-exclude-globs.js +1 -1
  88. package/dist/offline-sync-snapshot-stream.js +5 -5
  89. package/dist/offline-sync.js +4 -4
  90. package/dist/operator-toolkit.js +6 -6
  91. package/dist/orchestrator.js +34 -34
  92. package/dist/recall-navigation-operations.js +10 -10
  93. package/dist/recall-navigation.js +9 -9
  94. package/dist/resume-bundles.js +6 -6
  95. package/dist/support-passport/index.js +12 -12
  96. package/package.json +2 -2
  97. package/src/access-http-adapter-namespace.test.ts +217 -0
  98. package/src/access-http.ts +8 -0
  99. package/src/adapters/claude-code.ts +4 -4
  100. package/src/adapters/codex.ts +3 -3
  101. package/src/adapters/grok-opencode.test.ts +2 -0
  102. package/src/adapters/grok.ts +3 -3
  103. package/src/adapters/hermes.ts +3 -3
  104. package/src/adapters/opencode.ts +3 -3
  105. package/src/adapters/replit.ts +3 -3
  106. package/src/adapters/types.ts +2 -0
  107. package/src/offline-sync-exclude-globs.ts +3 -2
  108. package/src/offline-sync.test.ts +12 -0
  109. package/dist/chunk-F23U5YE7.js.map +0 -1
  110. package/dist/chunk-HQCUUVG2.js.map +0 -1
  111. /package/dist/{chunk-MSAI3Q7D.js.map → chunk-3QH4NT72.js.map} +0 -0
  112. /package/dist/{chunk-P62DSJUK.js.map → chunk-3RMJLDMS.js.map} +0 -0
  113. /package/dist/{chunk-KNI4SGQE.js.map → chunk-3SNJMRC7.js.map} +0 -0
  114. /package/dist/{chunk-WHIGRW7T.js.map → chunk-4HUMF74S.js.map} +0 -0
  115. /package/dist/{chunk-U36GYZ2P.js.map → chunk-55NZVUNI.js.map} +0 -0
  116. /package/dist/{chunk-UG5V3Z3R.js.map → chunk-6MWPIWPF.js.map} +0 -0
  117. /package/dist/{chunk-OEBUAC3O.js.map → chunk-76GQBIVX.js.map} +0 -0
  118. /package/dist/{chunk-6BG364RN.js.map → chunk-AWEHMKIO.js.map} +0 -0
  119. /package/dist/{chunk-AF5PW35O.js.map → chunk-FQJ4YXJO.js.map} +0 -0
  120. /package/dist/{chunk-KYOZ5E6V.js.map → chunk-HDOWMJKD.js.map} +0 -0
  121. /package/dist/{chunk-ANGZWYL2.js.map → chunk-I7BRU753.js.map} +0 -0
  122. /package/dist/{chunk-MZAH3CBT.js.map → chunk-IKWD4VP7.js.map} +0 -0
  123. /package/dist/{chunk-3BTHXB7Z.js.map → chunk-JAQXKNQV.js.map} +0 -0
  124. /package/dist/{chunk-AXGJMDBS.js.map → chunk-KO4X4WRJ.js.map} +0 -0
  125. /package/dist/{chunk-VOZNBQNL.js.map → chunk-LBU623X7.js.map} +0 -0
  126. /package/dist/{chunk-5S7SNRSJ.js.map → chunk-N6GYEWFQ.js.map} +0 -0
  127. /package/dist/{chunk-PH2V7EXZ.js.map → chunk-NWXGLTWN.js.map} +0 -0
  128. /package/dist/{chunk-R5B3OWI4.js.map → chunk-OYQAYIGE.js.map} +0 -0
  129. /package/dist/{chunk-A3K2KKSG.js.map → chunk-PYYQCHJC.js.map} +0 -0
  130. /package/dist/{chunk-GXETU7AE.js.map → chunk-QVYXXOTR.js.map} +0 -0
  131. /package/dist/{chunk-NSKXRTVZ.js.map → chunk-ST4IBSPL.js.map} +0 -0
  132. /package/dist/{chunk-SMLKHXPF.js.map → chunk-UKWQSPUU.js.map} +0 -0
  133. /package/dist/{chunk-IVEHY2VT.js.map → chunk-VQEOBVF2.js.map} +0 -0
  134. /package/dist/{chunk-YHZWVDP7.js.map → chunk-YHDA3DSO.js.map} +0 -0
  135. /package/dist/{chunk-C6HPNPNK.js.map → chunk-ZK4XGNJ3.js.map} +0 -0
  136. /package/dist/{chunk-ZQTYWSO3.js.map → chunk-ZNEA255W.js.map} +0 -0
@@ -1,5 +1,5 @@
1
- import "./chunk-MZAH3CBT.js";
2
- import "./chunk-GXETU7AE.js";
1
+ import "./chunk-IKWD4VP7.js";
2
+ import "./chunk-QVYXXOTR.js";
3
3
  import "./chunk-W4F3C7N7.js";
4
4
  import "./chunk-MPC7TYTZ.js";
5
5
  import "./chunk-ZHXSOMYH.js";
@@ -31,7 +31,7 @@ import "./chunk-32HO62I4.js";
31
31
  import "./chunk-SOBJ6NEY.js";
32
32
  import "./chunk-QPWUG2S3.js";
33
33
  import "./chunk-R36IBI2M.js";
34
- import "./chunk-C6HPNPNK.js";
34
+ import "./chunk-ZK4XGNJ3.js";
35
35
  import "./chunk-E6UNM67F.js";
36
36
  import "./chunk-6WHJ2EAB.js";
37
37
  import "./chunk-AQEJKOKI.js";
@@ -170,13 +170,13 @@ import "./chunk-Z7L72ZHL.js";
170
170
  import "./chunk-4O4TKIXQ.js";
171
171
  import "./chunk-RMMA44HE.js";
172
172
  import "./chunk-SYOIVK7K.js";
173
- import "./chunk-PH2V7EXZ.js";
173
+ import "./chunk-NWXGLTWN.js";
174
174
  import "./chunk-MY7B3HYC.js";
175
175
  import "./chunk-353C5UNV.js";
176
176
  import "./chunk-5AYUHSAU.js";
177
177
  import "./chunk-BT7NVCML.js";
178
178
  import "./chunk-PO7NXNGC.js";
179
- import "./chunk-3BTHXB7Z.js";
179
+ import "./chunk-JAQXKNQV.js";
180
180
  import "./chunk-KQAFEZQX.js";
181
181
  import "./chunk-WEHSQBFR.js";
182
182
  import "./chunk-X7Y7WX73.js";
@@ -187,7 +187,7 @@ import "./chunk-SOAU2OE2.js";
187
187
  import "./chunk-BJMBJZ2Y.js";
188
188
  import "./chunk-UKJAGEXH.js";
189
189
  import "./chunk-FP2373TW.js";
190
- import "./chunk-AF5PW35O.js";
190
+ import "./chunk-FQJ4YXJO.js";
191
191
  import "./chunk-N7QV3CMX.js";
192
192
  import "./chunk-PAAJWQH5.js";
193
193
  import "./chunk-2JRB3Z5N.js";
@@ -205,13 +205,13 @@ import "./chunk-C7HJ3NEI.js";
205
205
  import "./chunk-N4PYB235.js";
206
206
  import "./chunk-AW4QUFQF.js";
207
207
  import "./chunk-5FVVY2EB.js";
208
- import "./chunk-IVEHY2VT.js";
208
+ import "./chunk-VQEOBVF2.js";
209
209
  import "./chunk-UI3NYK34.js";
210
210
  import "./chunk-ETUZFFPU.js";
211
- import "./chunk-MSAI3Q7D.js";
212
- import "./chunk-AXGJMDBS.js";
211
+ import "./chunk-3QH4NT72.js";
212
+ import "./chunk-KO4X4WRJ.js";
213
213
  import "./chunk-TYT4TEQV.js";
214
- import "./chunk-4NSLQ7EU.js";
214
+ import "./chunk-ANPRNTPT.js";
215
215
  import "./chunk-EFHNFTWB.js";
216
216
  import "./chunk-GCGJW34D.js";
217
217
  import "./chunk-75PT4N7Q.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  runRecallNavigation
3
- } from "./chunk-GXETU7AE.js";
3
+ } from "./chunk-QVYXXOTR.js";
4
4
  import "./chunk-W4F3C7N7.js";
5
5
  import "./chunk-MPC7TYTZ.js";
6
6
  import "./chunk-ZHXSOMYH.js";
@@ -32,7 +32,7 @@ import "./chunk-32HO62I4.js";
32
32
  import "./chunk-SOBJ6NEY.js";
33
33
  import "./chunk-QPWUG2S3.js";
34
34
  import "./chunk-R36IBI2M.js";
35
- import "./chunk-C6HPNPNK.js";
35
+ import "./chunk-ZK4XGNJ3.js";
36
36
  import "./chunk-E6UNM67F.js";
37
37
  import "./chunk-6WHJ2EAB.js";
38
38
  import "./chunk-AQEJKOKI.js";
@@ -171,13 +171,13 @@ import "./chunk-Z7L72ZHL.js";
171
171
  import "./chunk-4O4TKIXQ.js";
172
172
  import "./chunk-RMMA44HE.js";
173
173
  import "./chunk-SYOIVK7K.js";
174
- import "./chunk-PH2V7EXZ.js";
174
+ import "./chunk-NWXGLTWN.js";
175
175
  import "./chunk-MY7B3HYC.js";
176
176
  import "./chunk-353C5UNV.js";
177
177
  import "./chunk-5AYUHSAU.js";
178
178
  import "./chunk-BT7NVCML.js";
179
179
  import "./chunk-PO7NXNGC.js";
180
- import "./chunk-3BTHXB7Z.js";
180
+ import "./chunk-JAQXKNQV.js";
181
181
  import "./chunk-KQAFEZQX.js";
182
182
  import "./chunk-WEHSQBFR.js";
183
183
  import "./chunk-X7Y7WX73.js";
@@ -188,7 +188,7 @@ import "./chunk-SOAU2OE2.js";
188
188
  import "./chunk-BJMBJZ2Y.js";
189
189
  import "./chunk-UKJAGEXH.js";
190
190
  import "./chunk-FP2373TW.js";
191
- import "./chunk-AF5PW35O.js";
191
+ import "./chunk-FQJ4YXJO.js";
192
192
  import "./chunk-N7QV3CMX.js";
193
193
  import "./chunk-PAAJWQH5.js";
194
194
  import "./chunk-2JRB3Z5N.js";
@@ -206,13 +206,13 @@ import "./chunk-C7HJ3NEI.js";
206
206
  import "./chunk-N4PYB235.js";
207
207
  import "./chunk-AW4QUFQF.js";
208
208
  import "./chunk-5FVVY2EB.js";
209
- import "./chunk-IVEHY2VT.js";
209
+ import "./chunk-VQEOBVF2.js";
210
210
  import "./chunk-UI3NYK34.js";
211
211
  import "./chunk-ETUZFFPU.js";
212
- import "./chunk-MSAI3Q7D.js";
213
- import "./chunk-AXGJMDBS.js";
212
+ import "./chunk-3QH4NT72.js";
213
+ import "./chunk-KO4X4WRJ.js";
214
214
  import "./chunk-TYT4TEQV.js";
215
- import "./chunk-4NSLQ7EU.js";
215
+ import "./chunk-ANPRNTPT.js";
216
216
  import "./chunk-EFHNFTWB.js";
217
217
  import "./chunk-GCGJW34D.js";
218
218
  import "./chunk-75PT4N7Q.js";
@@ -4,12 +4,12 @@ import {
4
4
  recordResumeBundle,
5
5
  resolveResumeBundleDir,
6
6
  validateResumeBundle
7
- } from "./chunk-A3K2KKSG.js";
7
+ } from "./chunk-PYYQCHJC.js";
8
8
  import "./chunk-G7NYVKD6.js";
9
9
  import "./chunk-AM4T6CHX.js";
10
10
  import "./chunk-KFY3SGN7.js";
11
11
  import "./chunk-NHLLKEKK.js";
12
- import "./chunk-U36GYZ2P.js";
12
+ import "./chunk-55NZVUNI.js";
13
13
  import "./chunk-ZKOPY4WW.js";
14
14
  import "./chunk-62OKGIJA.js";
15
15
  import "./chunk-EUL3S3LE.js";
@@ -135,13 +135,13 @@ import "./chunk-C7HJ3NEI.js";
135
135
  import "./chunk-N4PYB235.js";
136
136
  import "./chunk-AW4QUFQF.js";
137
137
  import "./chunk-5FVVY2EB.js";
138
- import "./chunk-IVEHY2VT.js";
138
+ import "./chunk-VQEOBVF2.js";
139
139
  import "./chunk-UI3NYK34.js";
140
140
  import "./chunk-ETUZFFPU.js";
141
- import "./chunk-MSAI3Q7D.js";
142
- import "./chunk-AXGJMDBS.js";
141
+ import "./chunk-3QH4NT72.js";
142
+ import "./chunk-KO4X4WRJ.js";
143
143
  import "./chunk-TYT4TEQV.js";
144
- import "./chunk-4NSLQ7EU.js";
144
+ import "./chunk-ANPRNTPT.js";
145
145
  import "./chunk-EFHNFTWB.js";
146
146
  import "./chunk-GCGJW34D.js";
147
147
  import "./chunk-75PT4N7Q.js";
@@ -4,7 +4,7 @@ import {
4
4
  SUPPORT_PASSPORT_MODEL_RESULT_PATH,
5
5
  SupportPassportModelBridge,
6
6
  parseSupportPassportModelJob
7
- } from "../chunk-KYOZ5E6V.js";
7
+ } from "../chunk-HDOWMJKD.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-VOZNBQNL.js";
18
- import "../chunk-SMLKHXPF.js";
17
+ } from "../chunk-LBU623X7.js";
18
+ import "../chunk-UKWQSPUU.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-GXETU7AE.js";
59
+ } from "../chunk-QVYXXOTR.js";
60
60
  import "../chunk-W4F3C7N7.js";
61
61
  import "../chunk-MPC7TYTZ.js";
62
62
  import "../chunk-ZHXSOMYH.js";
@@ -88,7 +88,7 @@ import "../chunk-32HO62I4.js";
88
88
  import "../chunk-SOBJ6NEY.js";
89
89
  import "../chunk-QPWUG2S3.js";
90
90
  import "../chunk-R36IBI2M.js";
91
- import "../chunk-C6HPNPNK.js";
91
+ import "../chunk-ZK4XGNJ3.js";
92
92
  import "../chunk-E6UNM67F.js";
93
93
  import "../chunk-6WHJ2EAB.js";
94
94
  import "../chunk-AQEJKOKI.js";
@@ -227,13 +227,13 @@ import "../chunk-Z7L72ZHL.js";
227
227
  import "../chunk-4O4TKIXQ.js";
228
228
  import "../chunk-RMMA44HE.js";
229
229
  import "../chunk-SYOIVK7K.js";
230
- import "../chunk-PH2V7EXZ.js";
230
+ import "../chunk-NWXGLTWN.js";
231
231
  import "../chunk-MY7B3HYC.js";
232
232
  import "../chunk-353C5UNV.js";
233
233
  import "../chunk-5AYUHSAU.js";
234
234
  import "../chunk-BT7NVCML.js";
235
235
  import "../chunk-PO7NXNGC.js";
236
- import "../chunk-3BTHXB7Z.js";
236
+ import "../chunk-JAQXKNQV.js";
237
237
  import "../chunk-KQAFEZQX.js";
238
238
  import "../chunk-WEHSQBFR.js";
239
239
  import "../chunk-X7Y7WX73.js";
@@ -244,7 +244,7 @@ import "../chunk-SOAU2OE2.js";
244
244
  import "../chunk-BJMBJZ2Y.js";
245
245
  import "../chunk-UKJAGEXH.js";
246
246
  import "../chunk-FP2373TW.js";
247
- import "../chunk-AF5PW35O.js";
247
+ import "../chunk-FQJ4YXJO.js";
248
248
  import "../chunk-N7QV3CMX.js";
249
249
  import "../chunk-PAAJWQH5.js";
250
250
  import "../chunk-2JRB3Z5N.js";
@@ -262,13 +262,13 @@ import "../chunk-C7HJ3NEI.js";
262
262
  import "../chunk-N4PYB235.js";
263
263
  import "../chunk-AW4QUFQF.js";
264
264
  import "../chunk-5FVVY2EB.js";
265
- import "../chunk-IVEHY2VT.js";
265
+ import "../chunk-VQEOBVF2.js";
266
266
  import "../chunk-UI3NYK34.js";
267
267
  import "../chunk-ETUZFFPU.js";
268
- import "../chunk-MSAI3Q7D.js";
269
- import "../chunk-AXGJMDBS.js";
268
+ import "../chunk-3QH4NT72.js";
269
+ import "../chunk-KO4X4WRJ.js";
270
270
  import "../chunk-TYT4TEQV.js";
271
- import "../chunk-4NSLQ7EU.js";
271
+ import "../chunk-ANPRNTPT.js";
272
272
  import "../chunk-EFHNFTWB.js";
273
273
  import "../chunk-GCGJW34D.js";
274
274
  import "../chunk-75PT4N7Q.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remnic/core",
3
- "version": "9.69.96",
3
+ "version": "9.69.98",
4
4
  "description": "Framework-agnostic Remnic memory engine — orchestrator, storage, extraction, search, trust zones",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -3327,7 +3327,7 @@
3327
3327
  "core"
3328
3328
  ],
3329
3329
  "peerDependencies": {
3330
- "@remnic/coding-graph": "^9.69.96"
3330
+ "@remnic/coding-graph": "^9.69.98"
3331
3331
  },
3332
3332
  "peerDependenciesMeta": {
3333
3333
  "@remnic/coding-graph": {
@@ -0,0 +1,217 @@
1
+ import assert from "node:assert/strict";
2
+ import { mkdtemp, rm } from "node:fs/promises";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import test from "node:test";
6
+
7
+ import { EngramAccessHttpServer } from "./access-http.js";
8
+ import { EngramAccessService, type EngramAccessRecallRequest, type EngramAccessRecallResponse } from "./access-service.js";
9
+ import { parseConfig } from "./config.js";
10
+ import { Orchestrator } from "./orchestrator.js";
11
+ import type { PluginConfig } from "./types.js";
12
+
13
+ const FLAT_ADAPTER_IDS = ["claude-code", "codex", "replit", "grok", "opencode", "hermes"];
14
+
15
+ const NAMESPACED_ADAPTERS = [
16
+ { clientId: "claude-code", principal: "claude-code" },
17
+ { clientId: "codex", principal: "codex" },
18
+ { clientId: "replit", principal: "replit-agent" },
19
+ { clientId: "grok", principal: "grok" },
20
+ { clientId: "opencode", principal: "opencode" },
21
+ { clientId: "hermes", principal: "hermes-agent" },
22
+ ];
23
+
24
+ interface TestDaemon {
25
+ service: EngramAccessService;
26
+ port: number;
27
+ close(): Promise<void>;
28
+ }
29
+
30
+ function makeConfig(memoryDir: string, overrides: Partial<PluginConfig> = {}) {
31
+ return parseConfig({
32
+ openaiApiKey: "sk-test",
33
+ memoryDir,
34
+ workspaceDir: path.join(memoryDir, "workspace"),
35
+ qmdEnabled: false,
36
+ embeddingFallbackEnabled: false,
37
+ recallPlannerEnabled: false,
38
+ sharedContextEnabled: false,
39
+ initGateTimeoutMs: 1000,
40
+ ...overrides,
41
+ });
42
+ }
43
+
44
+ async function startServer(overrides: Partial<PluginConfig> = {}): Promise<TestDaemon> {
45
+ const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-3166-"));
46
+ const orchestrator = new Orchestrator(makeConfig(memoryDir, overrides));
47
+ const service = new EngramAccessService(orchestrator);
48
+ const server = new EngramAccessHttpServer({
49
+ service,
50
+ host: "127.0.0.1",
51
+ port: 0,
52
+ authToken: "secret-token",
53
+ adminConsoleEnabled: false,
54
+ });
55
+ const { port } = await server.start();
56
+ return {
57
+ service,
58
+ port,
59
+ async close() {
60
+ await server.stop();
61
+ await rm(memoryDir, { recursive: true, force: true });
62
+ },
63
+ };
64
+ }
65
+
66
+ interface RecallOutcome {
67
+ status: number;
68
+ isError: boolean;
69
+ text: string;
70
+ payload?: EngramAccessRecallResponse;
71
+ }
72
+
73
+ interface McpToolReply {
74
+ result?: { content?: Array<{ text?: string }>; isError?: boolean };
75
+ }
76
+
77
+ async function mcpRecall(
78
+ port: number,
79
+ args: EngramAccessRecallRequest,
80
+ headers: Record<string, string> = {},
81
+ ): Promise<RecallOutcome> {
82
+ const res = await fetch(`http://127.0.0.1:${port}/mcp`, {
83
+ method: "POST",
84
+ headers: {
85
+ authorization: "Bearer secret-token",
86
+ "content-type": "application/json",
87
+ ...headers,
88
+ },
89
+ body: JSON.stringify({
90
+ jsonrpc: "2.0",
91
+ id: 1,
92
+ method: "tools/call",
93
+ params: { name: "engram.recall", arguments: args },
94
+ }),
95
+ });
96
+ const body: McpToolReply = JSON.parse(await res.text());
97
+ const text = body.result?.content?.[0]?.text ?? "";
98
+ const outcome: RecallOutcome = {
99
+ status: res.status,
100
+ isError: body.result?.isError === true,
101
+ text,
102
+ };
103
+ if (!outcome.isError) outcome.payload = JSON.parse(text);
104
+ return outcome;
105
+ }
106
+
107
+ test("flat daemon: all six built-in adapters resolve the configured default namespace over MCP recall", async () => {
108
+ const daemon = await startServer({
109
+ namespacesEnabled: false,
110
+ defaultNamespace: "flat-tenant",
111
+ });
112
+ try {
113
+ await daemon.service.memoryStore({ content: "the launch codeword is PERIHELION" });
114
+ for (const clientId of FLAT_ADAPTER_IDS) {
115
+ const outcome = await mcpRecall(
116
+ daemon.port,
117
+ { query: "launch codeword" },
118
+ { "x-engram-client-id": clientId },
119
+ );
120
+ assert.equal(outcome.status, 200, `${clientId}: recall must reach the op`);
121
+ assert.equal(outcome.isError, false, `${clientId}: ${outcome.text}`);
122
+ assert.equal(outcome.payload?.namespace, "flat-tenant", `${clientId}: default namespace`);
123
+ assert.ok(
124
+ outcome.payload?.context.includes("PERIHELION"),
125
+ `${clientId}: default-namespace memory must be recalled`,
126
+ );
127
+ }
128
+ } finally {
129
+ await daemon.close();
130
+ }
131
+ });
132
+
133
+ test("flat daemon: explicit X-Engram-Namespace is enforced, not silently dropped", async () => {
134
+ const daemon = await startServer({
135
+ namespacesEnabled: false,
136
+ defaultNamespace: "flat-tenant",
137
+ });
138
+ try {
139
+ await daemon.service.memoryStore({ content: "the launch codeword is PERIHELION" });
140
+
141
+ const validDefault = await mcpRecall(daemon.port, { query: "launch codeword" }, {
142
+ "x-engram-client-id": "claude-code",
143
+ "x-engram-namespace": "flat-tenant",
144
+ });
145
+ assert.equal(validDefault.isError, false, validDefault.text);
146
+ assert.equal(validDefault.payload?.namespace, "flat-tenant");
147
+ assert.ok(validDefault.payload?.context.includes("PERIHELION"));
148
+
149
+ for (const outcome of [
150
+ await mcpRecall(daemon.port, { query: "launch codeword" }, {
151
+ "x-engram-client-id": "claude-code",
152
+ "x-engram-namespace": "off-books",
153
+ }),
154
+ await mcpRecall(daemon.port, { query: "launch codeword", namespace: "off-books" }, {
155
+ "x-engram-client-id": "claude-code",
156
+ }),
157
+ ]) {
158
+ assert.equal(outcome.isError, true, "non-default namespace must be rejected");
159
+ assert.match(outcome.text, /unsupported namespace: off-books/);
160
+ }
161
+ } finally {
162
+ await daemon.close();
163
+ }
164
+ });
165
+
166
+ test("namespaced daemon: adapters keep their self-namespaces over MCP recall", async () => {
167
+ const daemon = await startServer({
168
+ namespacesEnabled: true,
169
+ defaultNamespace: "main",
170
+ namespacePolicies: NAMESPACED_ADAPTERS.map(({ clientId, principal }) => ({
171
+ name: clientId,
172
+ readPrincipals: [principal],
173
+ writePrincipals: [principal],
174
+ })),
175
+ });
176
+ try {
177
+ await daemon.service.memoryStore({
178
+ content: "main vault code is QUASAR-main",
179
+ namespace: "main",
180
+ authenticatedPrincipal: "operator",
181
+ });
182
+ for (const { clientId, principal } of NAMESPACED_ADAPTERS) {
183
+ await daemon.service.memoryStore({
184
+ content: `the ${clientId} vault code is NOVA-${clientId}`,
185
+ namespace: clientId,
186
+ authenticatedPrincipal: principal,
187
+ });
188
+ }
189
+
190
+ for (const { clientId } of NAMESPACED_ADAPTERS) {
191
+ const outcome = await mcpRecall(daemon.port, { query: "vault code" }, {
192
+ "x-engram-client-id": clientId,
193
+ });
194
+ assert.equal(outcome.status, 200, `${clientId}: recall must reach the op`);
195
+ assert.equal(outcome.isError, false, `${clientId}: ${outcome.text}`);
196
+ assert.equal(outcome.payload?.namespace, clientId, `${clientId}: self-namespace kept`);
197
+ assert.ok(
198
+ outcome.payload?.context.includes(`NOVA-${clientId}`),
199
+ `${clientId}: own namespace memory must be recalled`,
200
+ );
201
+ assert.ok(
202
+ !outcome.payload?.context.includes("QUASAR-main"),
203
+ `${clientId}: default namespace must stay isolated`,
204
+ );
205
+ }
206
+
207
+ const crossTenant = await mcpRecall(daemon.port, { query: "vault code" }, {
208
+ "x-engram-client-id": "claude-code",
209
+ });
210
+ assert.ok(
211
+ !crossTenant.payload?.context.includes("NOVA-codex"),
212
+ "one adapter's namespace must not leak into another's recall",
213
+ );
214
+ } finally {
215
+ await daemon.close();
216
+ }
217
+ });
@@ -7,6 +7,7 @@ import path from "node:path";
7
7
  import { fileURLToPath, URL } from "node:url";
8
8
  import { gunzipSync } from "node:zlib";
9
9
  import { log } from "./logger.js";
10
+ import { resolveNamespaceCapabilities } from "./capabilities.js";
10
11
  import { WriteRateLimiter, type WriteRateLimitReservation } from "./write-rate-limiter.js";
11
12
  import { abortError, isAbortError } from "./abort-error.js";
12
13
  import { EngramAccessForbiddenError } from "./access-errors.js";
@@ -716,6 +717,13 @@ export class EngramAccessHttpServer extends ReviewDeckAccessHttpBase {
716
717
  principal = adapterIdentity.principal;
717
718
  }
718
719
  namespace = adapterIdentity.namespace;
720
+ const config = this.service.configRef;
721
+ if (
722
+ adapterIdentity.namespaceExplicit === false &&
723
+ !(config && resolveNamespaceCapabilities(config).namespaces)
724
+ ) {
725
+ namespace = undefined;
726
+ }
719
727
  sessionKey = adapterIdentity.sessionKey;
720
728
  }
721
729
 
@@ -41,12 +41,12 @@ export class ClaudeCodeAdapter implements EngramAdapter {
41
41
  // MCP session ID (standard MCP header, server-assigned)
42
42
  const mcpSessionId = headerValue(context.headers, "mcp-session-id");
43
43
 
44
- // Namespace: explicit header > default
45
- const namespace = headerValue(context.headers, "x-engram-namespace")
46
- || "claude-code";
44
+ // Namespace: explicit header > adapter default
45
+ const namespaceHeader = headerValue(context.headers, "x-engram-namespace");
47
46
 
48
47
  return {
49
- namespace,
48
+ namespace: namespaceHeader ?? "claude-code",
49
+ namespaceExplicit: namespaceHeader !== undefined,
50
50
  principal: "claude-code",
51
51
  sessionKey: mcpSessionId ?? context.sessionKey,
52
52
  adapterId: this.id,
@@ -43,11 +43,11 @@ export class CodexAdapter implements EngramAdapter {
43
43
  const mcpSessionId = headerValue(context.headers, "mcp-session-id");
44
44
 
45
45
  // Namespace: explicit header > default
46
- const namespace = headerValue(context.headers, "x-engram-namespace")
47
- || "codex";
46
+ const namespaceHeader = headerValue(context.headers, "x-engram-namespace");
48
47
 
49
48
  return {
50
- namespace,
49
+ namespace: namespaceHeader ?? "codex",
50
+ namespaceExplicit: namespaceHeader !== undefined,
51
51
  principal: "codex",
52
52
  sessionKey: mcpSessionId ?? context.sessionKey,
53
53
  adapterId: this.id,
@@ -49,6 +49,7 @@ test("GrokAdapter resolves identity with adapter-owned principal and header name
49
49
  })),
50
50
  {
51
51
  namespace: "my-project",
52
+ namespaceExplicit: true,
52
53
  principal: "grok",
53
54
  sessionKey: "sess-grok-1",
54
55
  adapterId: "grok",
@@ -91,6 +92,7 @@ test("OpenCodeAdapter resolves identity with adapter-owned principal", () => {
91
92
  }));
92
93
  assert.deepEqual(resolved, {
93
94
  namespace: "opencode",
95
+ namespaceExplicit: false,
94
96
  principal: "opencode",
95
97
  sessionKey: "sess-oc-1",
96
98
  adapterId: "opencode",
@@ -40,11 +40,11 @@ export class GrokAdapter implements EngramAdapter {
40
40
  const mcpSessionId = headerValue(context.headers, "mcp-session-id");
41
41
 
42
42
  // Namespace: explicit header > default
43
- const namespace = headerValue(context.headers, "x-engram-namespace")
44
- || "grok";
43
+ const namespaceHeader = headerValue(context.headers, "x-engram-namespace");
45
44
 
46
45
  return {
47
- namespace,
46
+ namespace: namespaceHeader ?? "grok",
47
+ namespaceExplicit: namespaceHeader !== undefined,
48
48
  principal: "grok",
49
49
  sessionKey: mcpSessionId ?? context.sessionKey,
50
50
  adapterId: this.id,
@@ -47,11 +47,11 @@ export class HermesAdapter implements EngramAdapter {
47
47
  resolveIdentity(context: AdapterContext): ResolvedIdentity {
48
48
  const sessionId = headerValue(context.headers, "x-hermes-session-id");
49
49
 
50
- const namespace = headerValue(context.headers, "x-engram-namespace")
51
- || "hermes";
50
+ const namespaceHeader = headerValue(context.headers, "x-engram-namespace");
52
51
 
53
52
  return {
54
- namespace,
53
+ namespace: namespaceHeader ?? "hermes",
54
+ namespaceExplicit: namespaceHeader !== undefined,
55
55
  principal: "hermes-agent",
56
56
  sessionKey: sessionId ?? context.sessionKey,
57
57
  adapterId: this.id,
@@ -39,11 +39,11 @@ export class OpenCodeAdapter implements EngramAdapter {
39
39
  const mcpSessionId = headerValue(context.headers, "mcp-session-id");
40
40
 
41
41
  // Namespace: explicit header > default
42
- const namespace = headerValue(context.headers, "x-engram-namespace")
43
- || "opencode";
42
+ const namespaceHeader = headerValue(context.headers, "x-engram-namespace");
44
43
 
45
44
  return {
46
- namespace,
45
+ namespace: namespaceHeader ?? "opencode",
46
+ namespaceExplicit: namespaceHeader !== undefined,
47
47
  principal: "opencode",
48
48
  sessionKey: mcpSessionId ?? context.sessionKey,
49
49
  adapterId: this.id,
@@ -40,11 +40,11 @@ export class ReplitAdapter implements EngramAdapter {
40
40
  resolveIdentity(context: AdapterContext): ResolvedIdentity {
41
41
  const mcpSessionId = headerValue(context.headers, "mcp-session-id");
42
42
 
43
- const namespace = headerValue(context.headers, "x-engram-namespace")
44
- || "replit";
43
+ const namespaceHeader = headerValue(context.headers, "x-engram-namespace");
45
44
 
46
45
  return {
47
- namespace,
46
+ namespace: namespaceHeader ?? "replit",
47
+ namespaceExplicit: namespaceHeader !== undefined,
48
48
  principal: "replit-agent",
49
49
  sessionKey: mcpSessionId ?? context.sessionKey,
50
50
  adapterId: this.id,
@@ -22,6 +22,8 @@ export interface AdapterContext {
22
22
  export interface ResolvedIdentity {
23
23
  /** Engram namespace (scopes memory access) */
24
24
  namespace: string;
25
+ /** False for an inferred namespace; omitted values retain explicit-namespace validation. */
26
+ namespaceExplicit?: boolean;
25
27
  /** Engram principal (authorization subject) */
26
28
  principal: string;
27
29
  /** Session key for continuity tracking */
@@ -104,11 +104,11 @@ export function globToRegExp(glob: string): RegExp {
104
104
  // (Cursor review on PR #1793: trailing `scratch/**` must match
105
105
  // nested `scratch/a/b.md`, matching the offline-mode guide.)
106
106
  if (glob[i + 2] === "/") {
107
- source += "(?:.*/)?";
107
+ source += "(?:[\\s\\S]*/)?";
108
108
  i += 2;
109
109
  continue;
110
110
  }
111
- source += ".*";
111
+ source += "[\\s\\S]*";
112
112
  i += 1;
113
113
  continue;
114
114
  }
@@ -128,6 +128,7 @@ export function globToRegExp(glob: string): RegExp {
128
128
  return new RegExp(`^${source}$`);
129
129
  }
130
130
 
131
+ /** Match relative POSIX paths: `*` stays within a segment; `**` crosses separators and matches every path alone. */
131
132
  export function compileOfflineSyncExcludeGlobs(
132
133
  globs: readonly unknown[],
133
134
  ): RegExp[] {
@@ -3077,6 +3077,18 @@ test("globToRegExp treats ** as cross-segment in trailing and embedded positions
3077
3077
  assert.equal(embedded.test("state/a/b/other.json"), false);
3078
3078
  });
3079
3079
 
3080
+ test("globToRegExp ** spans line terminators that valid archive paths may contain (#3172)", () => {
3081
+ const trailing = globToRegExp("scratch/**");
3082
+ assert.equal(trailing.test("scratch/a\nb.md"), true);
3083
+ assert.equal(trailing.test("scratch/a\nb/c.md"), true);
3084
+ const embedded = globToRegExp("state/**/runs.json");
3085
+ assert.equal(embedded.test("state/a\nb/runs.json"), true);
3086
+ assert.equal(globToRegExp("**/state/*.sqlite").test("a\nb/state/lcm.sqlite"), true);
3087
+ const single = globToRegExp("state/*.sqlite");
3088
+ assert.equal(single.test("state/a\nb.sqlite"), true);
3089
+ assert.equal(single.test("state/a/b.sqlite"), false);
3090
+ });
3091
+
3080
3092
  test("default excludes cover per-namespace state dirs (#1793 review)", () => {
3081
3093
  const sqlite = globToRegExp("**/state/*.sqlite");
3082
3094
  assert.equal(sqlite.test("state/lcm.sqlite"), true);