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