@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.
- package/dist/access-admin-ops-surface.js +9 -9
- package/dist/access-authorization-probe.js +10 -10
- package/dist/access-boundary.js +9 -9
- package/dist/access-cli.js +34 -34
- package/dist/access-extraction-force-flush.js +9 -9
- package/dist/access-http-briefing.js +10 -10
- package/dist/access-http-query.js +9 -9
- package/dist/access-http.d.ts.map +1 -1
- package/dist/access-http.js +28 -28
- package/dist/access-identity-continuity-surface.js +9 -9
- package/dist/access-lcm-surface.js +9 -9
- package/dist/access-mcp.js +16 -16
- package/dist/access-namespace-preflight.js +9 -9
- package/dist/access-observe-write-category.js +6 -6
- package/dist/access-observe-write-surface.js +9 -9
- package/dist/access-offline-manifest.js +5 -5
- package/dist/access-operations-batch.js +10 -10
- package/dist/access-operations.js +15 -15
- package/dist/access-recall-concurrency.js +9 -9
- package/dist/access-recall-response.js +9 -9
- package/dist/access-recall-surface.js +9 -9
- package/dist/access-schema.js +5 -5
- package/dist/access-service.js +9 -9
- package/dist/access-surface-catalog.js +11 -11
- package/dist/active-recall.js +5 -5
- package/dist/adapters/claude-code.js +2 -2
- package/dist/adapters/codex.js +2 -2
- package/dist/adapters/hermes.js +2 -2
- package/dist/adapters/index.js +6 -6
- package/dist/adapters/registry.js +6 -6
- package/dist/adapters/replit.js +2 -2
- package/dist/adapters/types.d.ts +2 -0
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/types.js +1 -1
- package/dist/{chunk-F23U5YE7.js → chunk-2KB7TTAP.js} +12 -10
- package/dist/chunk-2KB7TTAP.js.map +1 -0
- package/dist/{chunk-J64TK33U.js → chunk-3JKYQBLC.js} +5 -4
- package/dist/{chunk-J64TK33U.js.map → chunk-3JKYQBLC.js.map} +1 -1
- package/dist/{chunk-MSAI3Q7D.js → chunk-3QH4NT72.js} +2 -2
- package/dist/{chunk-P62DSJUK.js → chunk-3RMJLDMS.js} +4 -4
- package/dist/{chunk-KNI4SGQE.js → chunk-3SNJMRC7.js} +7 -7
- package/dist/{chunk-WHIGRW7T.js → chunk-4HUMF74S.js} +2 -2
- package/dist/{chunk-U36GYZ2P.js → chunk-55NZVUNI.js} +2 -2
- package/dist/{chunk-UG5V3Z3R.js → chunk-6MWPIWPF.js} +3 -3
- package/dist/{chunk-OEBUAC3O.js → chunk-76GQBIVX.js} +2 -2
- package/dist/{chunk-RSUYKGGZ.js → chunk-7RKSJVOQ.js} +5 -4
- package/dist/{chunk-RSUYKGGZ.js.map → chunk-7RKSJVOQ.js.map} +1 -1
- package/dist/{chunk-4NSLQ7EU.js → chunk-ANPRNTPT.js} +3 -3
- package/dist/{chunk-4NSLQ7EU.js.map → chunk-ANPRNTPT.js.map} +1 -1
- package/dist/{chunk-6BG364RN.js → chunk-AWEHMKIO.js} +2 -2
- package/dist/{chunk-AF5PW35O.js → chunk-FQJ4YXJO.js} +2 -2
- package/dist/{chunk-42NQ7AVG.js → chunk-HCAGBFE7.js} +5 -4
- package/dist/{chunk-42NQ7AVG.js.map → chunk-HCAGBFE7.js.map} +1 -1
- package/dist/{chunk-KYOZ5E6V.js → chunk-HDOWMJKD.js} +2 -2
- package/dist/{chunk-ANGZWYL2.js → chunk-I7BRU753.js} +3 -3
- package/dist/{chunk-MZAH3CBT.js → chunk-IKWD4VP7.js} +2 -2
- package/dist/{chunk-HQCUUVG2.js → chunk-J3GJ23IP.js} +19 -12
- package/dist/chunk-J3GJ23IP.js.map +1 -0
- package/dist/{chunk-3BTHXB7Z.js → chunk-JAQXKNQV.js} +2 -2
- package/dist/{chunk-AXGJMDBS.js → chunk-KO4X4WRJ.js} +2 -2
- package/dist/{chunk-VOZNBQNL.js → chunk-LBU623X7.js} +2 -2
- package/dist/{chunk-5S7SNRSJ.js → chunk-N6GYEWFQ.js} +2 -2
- package/dist/{chunk-7RXCMVFQ.js → chunk-NJAIR57U.js} +1 -1
- package/dist/{chunk-7RXCMVFQ.js.map → chunk-NJAIR57U.js.map} +1 -1
- package/dist/{chunk-PH2V7EXZ.js → chunk-NWXGLTWN.js} +2 -2
- package/dist/{chunk-R5B3OWI4.js → chunk-OYQAYIGE.js} +7 -7
- package/dist/{chunk-A3K2KKSG.js → chunk-PYYQCHJC.js} +2 -2
- package/dist/{chunk-GXETU7AE.js → chunk-QVYXXOTR.js} +7 -7
- package/dist/{chunk-TMSXWOBZ.js → chunk-SI36RWC3.js} +5 -4
- package/dist/{chunk-TMSXWOBZ.js.map → chunk-SI36RWC3.js.map} +1 -1
- package/dist/{chunk-NSKXRTVZ.js → chunk-ST4IBSPL.js} +2 -2
- package/dist/{chunk-SMLKHXPF.js → chunk-UKWQSPUU.js} +2 -2
- package/dist/{chunk-IVEHY2VT.js → chunk-VQEOBVF2.js} +4 -4
- package/dist/{chunk-YHZWVDP7.js → chunk-YHDA3DSO.js} +2 -2
- package/dist/{chunk-C6HPNPNK.js → chunk-ZK4XGNJ3.js} +4 -4
- package/dist/{chunk-ZQTYWSO3.js → chunk-ZNEA255W.js} +2 -2
- package/dist/cli.js +32 -32
- package/dist/config.js +5 -5
- package/dist/deep-recall-http-glue.js +6 -6
- package/dist/external-wiki-access.js +10 -10
- package/dist/index.js +34 -34
- package/dist/memory-browse-operations.js +10 -10
- package/dist/offline-sync-changeset-generations.js +3 -3
- package/dist/offline-sync-embedding-generation.js +2 -2
- package/dist/offline-sync-exclude-globs.d.ts +1 -0
- package/dist/offline-sync-exclude-globs.d.ts.map +1 -1
- package/dist/offline-sync-exclude-globs.js +1 -1
- package/dist/offline-sync-snapshot-stream.js +5 -5
- package/dist/offline-sync.js +4 -4
- package/dist/operator-toolkit.js +6 -6
- package/dist/orchestrator.js +34 -34
- package/dist/recall-navigation-operations.js +10 -10
- package/dist/recall-navigation.js +9 -9
- package/dist/resume-bundles.js +6 -6
- package/dist/support-passport/index.js +12 -12
- package/package.json +2 -2
- package/src/access-http-adapter-namespace.test.ts +217 -0
- package/src/access-http.ts +8 -0
- package/src/adapters/claude-code.ts +4 -4
- package/src/adapters/codex.ts +3 -3
- package/src/adapters/grok-opencode.test.ts +2 -0
- package/src/adapters/grok.ts +3 -3
- package/src/adapters/hermes.ts +3 -3
- package/src/adapters/opencode.ts +3 -3
- package/src/adapters/replit.ts +3 -3
- package/src/adapters/types.ts +2 -0
- package/src/offline-sync-exclude-globs.ts +3 -2
- package/src/offline-sync.test.ts +12 -0
- package/dist/chunk-F23U5YE7.js.map +0 -1
- package/dist/chunk-HQCUUVG2.js.map +0 -1
- /package/dist/{chunk-MSAI3Q7D.js.map → chunk-3QH4NT72.js.map} +0 -0
- /package/dist/{chunk-P62DSJUK.js.map → chunk-3RMJLDMS.js.map} +0 -0
- /package/dist/{chunk-KNI4SGQE.js.map → chunk-3SNJMRC7.js.map} +0 -0
- /package/dist/{chunk-WHIGRW7T.js.map → chunk-4HUMF74S.js.map} +0 -0
- /package/dist/{chunk-U36GYZ2P.js.map → chunk-55NZVUNI.js.map} +0 -0
- /package/dist/{chunk-UG5V3Z3R.js.map → chunk-6MWPIWPF.js.map} +0 -0
- /package/dist/{chunk-OEBUAC3O.js.map → chunk-76GQBIVX.js.map} +0 -0
- /package/dist/{chunk-6BG364RN.js.map → chunk-AWEHMKIO.js.map} +0 -0
- /package/dist/{chunk-AF5PW35O.js.map → chunk-FQJ4YXJO.js.map} +0 -0
- /package/dist/{chunk-KYOZ5E6V.js.map → chunk-HDOWMJKD.js.map} +0 -0
- /package/dist/{chunk-ANGZWYL2.js.map → chunk-I7BRU753.js.map} +0 -0
- /package/dist/{chunk-MZAH3CBT.js.map → chunk-IKWD4VP7.js.map} +0 -0
- /package/dist/{chunk-3BTHXB7Z.js.map → chunk-JAQXKNQV.js.map} +0 -0
- /package/dist/{chunk-AXGJMDBS.js.map → chunk-KO4X4WRJ.js.map} +0 -0
- /package/dist/{chunk-VOZNBQNL.js.map → chunk-LBU623X7.js.map} +0 -0
- /package/dist/{chunk-5S7SNRSJ.js.map → chunk-N6GYEWFQ.js.map} +0 -0
- /package/dist/{chunk-PH2V7EXZ.js.map → chunk-NWXGLTWN.js.map} +0 -0
- /package/dist/{chunk-R5B3OWI4.js.map → chunk-OYQAYIGE.js.map} +0 -0
- /package/dist/{chunk-A3K2KKSG.js.map → chunk-PYYQCHJC.js.map} +0 -0
- /package/dist/{chunk-GXETU7AE.js.map → chunk-QVYXXOTR.js.map} +0 -0
- /package/dist/{chunk-NSKXRTVZ.js.map → chunk-ST4IBSPL.js.map} +0 -0
- /package/dist/{chunk-SMLKHXPF.js.map → chunk-UKWQSPUU.js.map} +0 -0
- /package/dist/{chunk-IVEHY2VT.js.map → chunk-VQEOBVF2.js.map} +0 -0
- /package/dist/{chunk-YHZWVDP7.js.map → chunk-YHDA3DSO.js.map} +0 -0
- /package/dist/{chunk-C6HPNPNK.js.map → chunk-ZK4XGNJ3.js.map} +0 -0
- /package/dist/{chunk-ZQTYWSO3.js.map → chunk-ZNEA255W.js.map} +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import "./chunk-
|
|
2
|
-
import "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
208
|
+
import "./chunk-VQEOBVF2.js";
|
|
209
209
|
import "./chunk-UI3NYK34.js";
|
|
210
210
|
import "./chunk-ETUZFFPU.js";
|
|
211
|
-
import "./chunk-
|
|
212
|
-
import "./chunk-
|
|
211
|
+
import "./chunk-3QH4NT72.js";
|
|
212
|
+
import "./chunk-KO4X4WRJ.js";
|
|
213
213
|
import "./chunk-TYT4TEQV.js";
|
|
214
|
-
import "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
209
|
+
import "./chunk-VQEOBVF2.js";
|
|
210
210
|
import "./chunk-UI3NYK34.js";
|
|
211
211
|
import "./chunk-ETUZFFPU.js";
|
|
212
|
-
import "./chunk-
|
|
213
|
-
import "./chunk-
|
|
212
|
+
import "./chunk-3QH4NT72.js";
|
|
213
|
+
import "./chunk-KO4X4WRJ.js";
|
|
214
214
|
import "./chunk-TYT4TEQV.js";
|
|
215
|
-
import "./chunk-
|
|
215
|
+
import "./chunk-ANPRNTPT.js";
|
|
216
216
|
import "./chunk-EFHNFTWB.js";
|
|
217
217
|
import "./chunk-GCGJW34D.js";
|
|
218
218
|
import "./chunk-75PT4N7Q.js";
|
package/dist/resume-bundles.js
CHANGED
|
@@ -4,12 +4,12 @@ import {
|
|
|
4
4
|
recordResumeBundle,
|
|
5
5
|
resolveResumeBundleDir,
|
|
6
6
|
validateResumeBundle
|
|
7
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
138
|
+
import "./chunk-VQEOBVF2.js";
|
|
139
139
|
import "./chunk-UI3NYK34.js";
|
|
140
140
|
import "./chunk-ETUZFFPU.js";
|
|
141
|
-
import "./chunk-
|
|
142
|
-
import "./chunk-
|
|
141
|
+
import "./chunk-3QH4NT72.js";
|
|
142
|
+
import "./chunk-KO4X4WRJ.js";
|
|
143
143
|
import "./chunk-TYT4TEQV.js";
|
|
144
|
-
import "./chunk-
|
|
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-
|
|
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-
|
|
18
|
-
import "../chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
265
|
+
import "../chunk-VQEOBVF2.js";
|
|
266
266
|
import "../chunk-UI3NYK34.js";
|
|
267
267
|
import "../chunk-ETUZFFPU.js";
|
|
268
|
-
import "../chunk-
|
|
269
|
-
import "../chunk-
|
|
268
|
+
import "../chunk-3QH4NT72.js";
|
|
269
|
+
import "../chunk-KO4X4WRJ.js";
|
|
270
270
|
import "../chunk-TYT4TEQV.js";
|
|
271
|
-
import "../chunk-
|
|
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.
|
|
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.
|
|
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
|
+
});
|
package/src/access-http.ts
CHANGED
|
@@ -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
|
|
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,
|
package/src/adapters/codex.ts
CHANGED
|
@@ -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
|
|
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",
|
package/src/adapters/grok.ts
CHANGED
|
@@ -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
|
|
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,
|
package/src/adapters/hermes.ts
CHANGED
|
@@ -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
|
|
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,
|
package/src/adapters/opencode.ts
CHANGED
|
@@ -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
|
|
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,
|
package/src/adapters/replit.ts
CHANGED
|
@@ -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
|
|
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,
|
package/src/adapters/types.ts
CHANGED
|
@@ -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[] {
|
package/src/offline-sync.test.ts
CHANGED
|
@@ -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);
|