@remnic/core 9.3.515 → 9.3.516
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-cli.js +11 -11
- package/dist/access-http.d.ts +2 -1
- package/dist/access-http.js +5 -5
- package/dist/access-mcp.d.ts +1 -1
- package/dist/access-mcp.js +4 -4
- package/dist/access-schema.js +2 -2
- package/dist/{access-service-qrrIrC-0.d.ts → access-service-CZfksQuS.d.ts} +6 -2
- package/dist/access-service.d.ts +1 -1
- package/dist/access-service.js +2 -2
- package/dist/{chunk-NJ3MJQZX.js → chunk-2I5JGH3M.js} +2 -2
- package/dist/{chunk-NJ3MJQZX.js.map → chunk-2I5JGH3M.js.map} +1 -1
- package/dist/{chunk-O27WNHTT.js → chunk-5UHVGNZD.js} +2 -2
- package/dist/{chunk-3Q4H3OBR.js → chunk-5V456VRV.js} +6 -6
- package/dist/{chunk-3Q4H3OBR.js.map → chunk-5V456VRV.js.map} +1 -1
- package/dist/{chunk-EDBEWFJO.js → chunk-6BR7L222.js} +2 -2
- package/dist/{chunk-D6WE5MTW.js → chunk-FCOQXV3T.js} +6 -6
- package/dist/{chunk-RCTS5CKK.js → chunk-FK556DDH.js} +2 -2
- package/dist/{chunk-RCTS5CKK.js.map → chunk-FK556DDH.js.map} +1 -1
- package/dist/{chunk-A52AKD7C.js → chunk-FUC4LZMD.js} +2 -2
- package/dist/chunk-FUC4LZMD.js.map +1 -0
- package/dist/{chunk-FER4WARO.js → chunk-HC6EKOID.js} +20 -7
- package/dist/chunk-HC6EKOID.js.map +1 -0
- package/dist/{chunk-PIRJPV5T.js → chunk-JNANKJLN.js} +2 -2
- package/dist/chunk-JNANKJLN.js.map +1 -0
- package/dist/{chunk-7MV5CWTE.js → chunk-KXULCVOC.js} +6 -6
- package/dist/chunk-KXULCVOC.js.map +1 -0
- package/dist/{chunk-TVRN5QKH.js → chunk-PCI747N2.js} +3 -3
- package/dist/{chunk-TVRN5QKH.js.map → chunk-PCI747N2.js.map} +1 -1
- package/dist/{chunk-BLZAVUD2.js → chunk-QVJ4NWL2.js} +2 -2
- package/dist/chunk-QVJ4NWL2.js.map +1 -0
- package/dist/{chunk-EIPUHVKE.js → chunk-SML26KED.js} +7 -7
- package/dist/{chunk-JYIKKAK3.js → chunk-TTGZV5R3.js} +3 -3
- package/dist/{chunk-R26QUUQN.js → chunk-YDMVYYD2.js} +52 -11
- package/dist/chunk-YDMVYYD2.js.map +1 -0
- package/dist/{chunk-L7S47WZT.js → chunk-YNXOKMJP.js} +2 -2
- package/dist/chunk-YNXOKMJP.js.map +1 -0
- package/dist/{chunk-4Q73JBSM.js → chunk-ZEY4KYRQ.js} +38 -11
- package/dist/chunk-ZEY4KYRQ.js.map +1 -0
- package/dist/{cli-X4NJoqSe.d.ts → cli-CPe_2KB1.d.ts} +1 -1
- package/dist/cli.d.ts +2 -2
- package/dist/cli.js +16 -16
- package/dist/index.d.ts +2 -2
- package/dist/index.js +17 -17
- package/dist/mcp-memory-inspector-app.d.ts +1 -1
- package/dist/namespaces/migrate.js +9 -9
- package/dist/namespaces/search.d.ts +1 -1
- package/dist/namespaces/search.js +8 -8
- package/dist/offline-sync.d.ts +4 -0
- package/dist/offline-sync.js +1 -1
- package/dist/operator-toolkit.d.ts +3 -1
- package/dist/operator-toolkit.js +10 -10
- package/dist/orchestrator.js +9 -9
- package/dist/qmd.d.ts +1 -1
- package/dist/qmd.js +1 -1
- package/dist/search/factory.js +7 -7
- package/dist/search/index.js +7 -7
- package/dist/search/lancedb-backend.d.ts +1 -1
- package/dist/search/lancedb-backend.js +1 -1
- package/dist/search/meilisearch-backend.d.ts +1 -1
- package/dist/search/meilisearch-backend.js +1 -1
- package/dist/search/noop-backend.d.ts +1 -1
- package/dist/search/noop-backend.js +1 -1
- package/dist/search/orama-backend.d.ts +1 -1
- package/dist/search/orama-backend.js +1 -1
- package/dist/search/port.d.ts +1 -1
- package/dist/search/remote-backend.d.ts +1 -1
- package/dist/search/remote-backend.js +1 -1
- package/package.json +1 -1
- package/src/access-http.ts +14 -0
- package/src/access-service-namespace.test.ts +9 -9
- package/src/access-service.ts +4 -4
- package/src/namespaces/search.test.ts +20 -1
- package/src/namespaces/search.ts +10 -4
- package/src/offline-sync.test.ts +128 -18
- package/src/offline-sync.ts +41 -7
- package/src/operator-toolkit.ts +4 -1
- package/src/orchestrator.ts +68 -10
- package/src/qmd.ts +5 -2
- package/src/search/lancedb-backend.ts +4 -1
- package/src/search/meilisearch-backend.ts +4 -1
- package/src/search/noop-backend.ts +1 -1
- package/src/search/orama-backend.ts +4 -1
- package/src/search/port.ts +4 -1
- package/src/search/remote-backend.ts +1 -1
- package/dist/chunk-4Q73JBSM.js.map +0 -1
- package/dist/chunk-7MV5CWTE.js.map +0 -1
- package/dist/chunk-A52AKD7C.js.map +0 -1
- package/dist/chunk-BLZAVUD2.js.map +0 -1
- package/dist/chunk-FER4WARO.js.map +0 -1
- package/dist/chunk-L7S47WZT.js.map +0 -1
- package/dist/chunk-PIRJPV5T.js.map +0 -1
- package/dist/chunk-R26QUUQN.js.map +0 -1
- /package/dist/{chunk-O27WNHTT.js.map → chunk-5UHVGNZD.js.map} +0 -0
- /package/dist/{chunk-EDBEWFJO.js.map → chunk-6BR7L222.js.map} +0 -0
- /package/dist/{chunk-D6WE5MTW.js.map → chunk-FCOQXV3T.js.map} +0 -0
- /package/dist/{chunk-EIPUHVKE.js.map → chunk-SML26KED.js.map} +0 -0
- /package/dist/{chunk-JYIKKAK3.js.map → chunk-TTGZV5R3.js.map} +0 -0
package/dist/offline-sync.d.ts
CHANGED
|
@@ -128,6 +128,7 @@ declare function iterateOfflineSyncSnapshotFileRecords(options: {
|
|
|
128
128
|
includeTranscripts?: boolean;
|
|
129
129
|
readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;
|
|
130
130
|
readFileDigest?: (target: OfflineSyncFileTarget) => Promise<OfflineSyncFileDigest>;
|
|
131
|
+
signal?: AbortSignal;
|
|
131
132
|
}): AsyncIterable<OfflineSyncFileRecord>;
|
|
132
133
|
declare function buildOfflineSyncSnapshot(options: {
|
|
133
134
|
root: string;
|
|
@@ -137,6 +138,7 @@ declare function buildOfflineSyncSnapshot(options: {
|
|
|
137
138
|
now?: Date;
|
|
138
139
|
readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;
|
|
139
140
|
readFileDigest?: (target: OfflineSyncFileTarget) => Promise<OfflineSyncFileDigest>;
|
|
141
|
+
signal?: AbortSignal;
|
|
140
142
|
}): Promise<OfflineSyncSnapshot>;
|
|
141
143
|
declare function buildOfflineSyncSnapshotFromBase(options: {
|
|
142
144
|
root: string;
|
|
@@ -148,6 +150,7 @@ declare function buildOfflineSyncSnapshotFromBase(options: {
|
|
|
148
150
|
now?: Date;
|
|
149
151
|
readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;
|
|
150
152
|
readFileDigest?: (target: OfflineSyncFileTarget) => Promise<OfflineSyncFileDigest>;
|
|
153
|
+
signal?: AbortSignal;
|
|
151
154
|
}): Promise<OfflineSyncSnapshot>;
|
|
152
155
|
declare function buildOfflineSyncSnapshotForPaths(options: {
|
|
153
156
|
root: string;
|
|
@@ -158,6 +161,7 @@ declare function buildOfflineSyncSnapshotForPaths(options: {
|
|
|
158
161
|
now?: Date;
|
|
159
162
|
readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;
|
|
160
163
|
readFileDigest?: (target: OfflineSyncFileTarget) => Promise<OfflineSyncFileDigest>;
|
|
164
|
+
signal?: AbortSignal;
|
|
161
165
|
}): Promise<OfflineSyncSnapshot>;
|
|
162
166
|
declare function readOfflineSyncFileContentChunk(options: {
|
|
163
167
|
root: string;
|
package/dist/offline-sync.js
CHANGED
|
@@ -29,7 +29,7 @@ import {
|
|
|
29
29
|
summarizeOfflineSyncPendingChanges,
|
|
30
30
|
summarizeOfflineSyncPendingFiles,
|
|
31
31
|
writeOfflineSyncState
|
|
32
|
-
} from "./chunk-
|
|
32
|
+
} from "./chunk-ZEY4KYRQ.js";
|
|
33
33
|
import "./chunk-UI3NYK34.js";
|
|
34
34
|
import "./chunk-GCGJW34D.js";
|
|
35
35
|
import "./chunk-KJMYHC7K.js";
|
|
@@ -15,7 +15,9 @@ import 'better-sqlite3';
|
|
|
15
15
|
interface QmdRuntimeLike {
|
|
16
16
|
probe(): Promise<boolean>;
|
|
17
17
|
isAvailable(): boolean;
|
|
18
|
-
ensureCollection(memoryDir: string
|
|
18
|
+
ensureCollection(memoryDir: string, execution?: {
|
|
19
|
+
signal?: AbortSignal;
|
|
20
|
+
}): Promise<"present" | "missing" | "unknown" | "skipped">;
|
|
19
21
|
debugStatus(): string;
|
|
20
22
|
}
|
|
21
23
|
interface ConversationIndexLike {
|
package/dist/operator-toolkit.js
CHANGED
|
@@ -11,17 +11,17 @@ import {
|
|
|
11
11
|
summarizeMemoryWorthLegacyCounters,
|
|
12
12
|
summarizeObservationThroughput,
|
|
13
13
|
summarizeTierDistribution
|
|
14
|
-
} from "./chunk-
|
|
15
|
-
import "./chunk-
|
|
14
|
+
} from "./chunk-YNXOKMJP.js";
|
|
15
|
+
import "./chunk-6BR7L222.js";
|
|
16
16
|
import "./chunk-LZ3VEOU5.js";
|
|
17
17
|
import "./chunk-YBPYIAA5.js";
|
|
18
|
-
import "./chunk-
|
|
19
|
-
import "./chunk-
|
|
20
|
-
import "./chunk-
|
|
21
|
-
import "./chunk-
|
|
22
|
-
import "./chunk-
|
|
23
|
-
import "./chunk-
|
|
24
|
-
import "./chunk-
|
|
18
|
+
import "./chunk-KXULCVOC.js";
|
|
19
|
+
import "./chunk-SML26KED.js";
|
|
20
|
+
import "./chunk-FUC4LZMD.js";
|
|
21
|
+
import "./chunk-FK556DDH.js";
|
|
22
|
+
import "./chunk-2I5JGH3M.js";
|
|
23
|
+
import "./chunk-QVJ4NWL2.js";
|
|
24
|
+
import "./chunk-JNANKJLN.js";
|
|
25
25
|
import "./chunk-Q4CAQGKQ.js";
|
|
26
26
|
import "./chunk-ONPLNAPX.js";
|
|
27
27
|
import "./chunk-CINZGPSJ.js";
|
|
@@ -32,7 +32,7 @@ import "./chunk-ORFGK3XI.js";
|
|
|
32
32
|
import "./chunk-HENLZHIT.js";
|
|
33
33
|
import "./chunk-7DTASS5T.js";
|
|
34
34
|
import "./chunk-KFY3SGN7.js";
|
|
35
|
-
import "./chunk-
|
|
35
|
+
import "./chunk-PCI747N2.js";
|
|
36
36
|
import "./chunk-CMTINOFS.js";
|
|
37
37
|
import "./chunk-BEUDU7Y4.js";
|
|
38
38
|
import "./chunk-G3Z3QEF5.js";
|
package/dist/orchestrator.js
CHANGED
|
@@ -26,7 +26,7 @@ import {
|
|
|
26
26
|
sanitizeSessionKeyForFilename,
|
|
27
27
|
shouldFilterLifecycleRecallCandidate,
|
|
28
28
|
summarizeGraphShadowComparison
|
|
29
|
-
} from "./chunk-
|
|
29
|
+
} from "./chunk-YDMVYYD2.js";
|
|
30
30
|
import "./chunk-Y2SXZ5KZ.js";
|
|
31
31
|
import "./chunk-BFBF3XEF.js";
|
|
32
32
|
import "./chunk-S53PKKWK.js";
|
|
@@ -109,13 +109,13 @@ import "./chunk-A6D7A2FW.js";
|
|
|
109
109
|
import "./chunk-FF4KLI5W.js";
|
|
110
110
|
import "./chunk-4426WSWL.js";
|
|
111
111
|
import "./chunk-A2Z6UCWT.js";
|
|
112
|
-
import "./chunk-
|
|
113
|
-
import "./chunk-
|
|
114
|
-
import "./chunk-
|
|
115
|
-
import "./chunk-
|
|
116
|
-
import "./chunk-
|
|
117
|
-
import "./chunk-
|
|
118
|
-
import "./chunk-
|
|
112
|
+
import "./chunk-KXULCVOC.js";
|
|
113
|
+
import "./chunk-SML26KED.js";
|
|
114
|
+
import "./chunk-FUC4LZMD.js";
|
|
115
|
+
import "./chunk-FK556DDH.js";
|
|
116
|
+
import "./chunk-2I5JGH3M.js";
|
|
117
|
+
import "./chunk-QVJ4NWL2.js";
|
|
118
|
+
import "./chunk-JNANKJLN.js";
|
|
119
119
|
import "./chunk-Q4CAQGKQ.js";
|
|
120
120
|
import "./chunk-ONPLNAPX.js";
|
|
121
121
|
import "./chunk-CINZGPSJ.js";
|
|
@@ -126,7 +126,7 @@ import "./chunk-ORFGK3XI.js";
|
|
|
126
126
|
import "./chunk-HENLZHIT.js";
|
|
127
127
|
import "./chunk-7DTASS5T.js";
|
|
128
128
|
import "./chunk-KFY3SGN7.js";
|
|
129
|
-
import "./chunk-
|
|
129
|
+
import "./chunk-PCI747N2.js";
|
|
130
130
|
import "./chunk-BECQDWBA.js";
|
|
131
131
|
import "./chunk-CWWMTTQE.js";
|
|
132
132
|
import "./chunk-JXS5PDQ7.js";
|
package/dist/qmd.d.ts
CHANGED
|
@@ -209,7 +209,7 @@ declare class QmdClient implements SearchBackend {
|
|
|
209
209
|
private runUpdateForCollection;
|
|
210
210
|
embed(): Promise<void>;
|
|
211
211
|
embedCollection(collection: string): Promise<void>;
|
|
212
|
-
ensureCollection(memoryDir: string): Promise<"present" | "missing" | "unknown" | "skipped">;
|
|
212
|
+
ensureCollection(memoryDir: string, execution?: SearchExecutionOptions): Promise<"present" | "missing" | "unknown" | "skipped">;
|
|
213
213
|
}
|
|
214
214
|
|
|
215
215
|
export { QMD_SUPPORTED_VERSION, type QmdCapabilities, type QmdChunkStrategy, QmdClient, type QmdClientOptions, type QmdDoctorReport, type QmdStructuredSearch, type QmdStructuredSearchType, type QmdVersionStatus, type QmdVersionTuple, compareQmdVersions, getQmdCommandName, getQmdPostInstallProbeTargets, parseQmdExplain, parseQmdVersion, parseQmdVersionOutput, resolveQmdCapabilities, shouldAutoUpgradeQmd, versionAtLeast };
|
package/dist/qmd.js
CHANGED
package/dist/search/factory.js
CHANGED
|
@@ -2,12 +2,12 @@ import {
|
|
|
2
2
|
createConversationIndexRuntime,
|
|
3
3
|
createConversationSearchBackend,
|
|
4
4
|
createSearchBackend
|
|
5
|
-
} from "../chunk-
|
|
6
|
-
import "../chunk-
|
|
7
|
-
import "../chunk-
|
|
8
|
-
import "../chunk-
|
|
9
|
-
import "../chunk-
|
|
10
|
-
import "../chunk-
|
|
5
|
+
} from "../chunk-SML26KED.js";
|
|
6
|
+
import "../chunk-FUC4LZMD.js";
|
|
7
|
+
import "../chunk-FK556DDH.js";
|
|
8
|
+
import "../chunk-2I5JGH3M.js";
|
|
9
|
+
import "../chunk-QVJ4NWL2.js";
|
|
10
|
+
import "../chunk-JNANKJLN.js";
|
|
11
11
|
import "../chunk-Q4CAQGKQ.js";
|
|
12
12
|
import "../chunk-ONPLNAPX.js";
|
|
13
13
|
import "../chunk-CINZGPSJ.js";
|
|
@@ -15,7 +15,7 @@ import "../chunk-KIB7SDIJ.js";
|
|
|
15
15
|
import "../chunk-ORFGK3XI.js";
|
|
16
16
|
import "../chunk-HENLZHIT.js";
|
|
17
17
|
import "../chunk-7DTASS5T.js";
|
|
18
|
-
import "../chunk-
|
|
18
|
+
import "../chunk-PCI747N2.js";
|
|
19
19
|
import "../chunk-PVGDJXVK.js";
|
|
20
20
|
import "../chunk-NNVTUXEB.js";
|
|
21
21
|
import "../chunk-CPPS65WS.js";
|
package/dist/search/index.js
CHANGED
|
@@ -2,22 +2,22 @@ import {
|
|
|
2
2
|
createConversationIndexRuntime,
|
|
3
3
|
createConversationSearchBackend,
|
|
4
4
|
createSearchBackend
|
|
5
|
-
} from "../chunk-
|
|
5
|
+
} from "../chunk-SML26KED.js";
|
|
6
6
|
import {
|
|
7
7
|
LanceDbBackend
|
|
8
|
-
} from "../chunk-
|
|
8
|
+
} from "../chunk-FUC4LZMD.js";
|
|
9
9
|
import {
|
|
10
10
|
MeilisearchBackend
|
|
11
|
-
} from "../chunk-
|
|
11
|
+
} from "../chunk-FK556DDH.js";
|
|
12
12
|
import {
|
|
13
13
|
NoopSearchBackend
|
|
14
|
-
} from "../chunk-
|
|
14
|
+
} from "../chunk-2I5JGH3M.js";
|
|
15
15
|
import {
|
|
16
16
|
OramaBackend
|
|
17
|
-
} from "../chunk-
|
|
17
|
+
} from "../chunk-QVJ4NWL2.js";
|
|
18
18
|
import {
|
|
19
19
|
RemoteSearchBackend
|
|
20
|
-
} from "../chunk-
|
|
20
|
+
} from "../chunk-JNANKJLN.js";
|
|
21
21
|
import {
|
|
22
22
|
scanMemoryDir
|
|
23
23
|
} from "../chunk-Q4CAQGKQ.js";
|
|
@@ -29,7 +29,7 @@ import "../chunk-KIB7SDIJ.js";
|
|
|
29
29
|
import "../chunk-ORFGK3XI.js";
|
|
30
30
|
import "../chunk-HENLZHIT.js";
|
|
31
31
|
import "../chunk-7DTASS5T.js";
|
|
32
|
-
import "../chunk-
|
|
32
|
+
import "../chunk-PCI747N2.js";
|
|
33
33
|
import "../chunk-PVGDJXVK.js";
|
|
34
34
|
import "../chunk-NNVTUXEB.js";
|
|
35
35
|
import "../chunk-CPPS65WS.js";
|
|
@@ -39,7 +39,7 @@ declare class LanceDbBackend implements SearchBackend {
|
|
|
39
39
|
updateCollection(collection: string, execution?: SearchExecutionOptions): Promise<void>;
|
|
40
40
|
embed(): Promise<void>;
|
|
41
41
|
embedCollection(collection: string): Promise<void>;
|
|
42
|
-
ensureCollection(_memoryDir: string): Promise<"present" | "missing" | "unknown" | "skipped">;
|
|
42
|
+
ensureCollection(_memoryDir: string, _execution?: SearchExecutionOptions): Promise<"present" | "missing" | "unknown" | "skipped">;
|
|
43
43
|
private table;
|
|
44
44
|
private get lanceIndex();
|
|
45
45
|
private ensureDb;
|
|
@@ -40,7 +40,7 @@ declare class MeilisearchBackend implements SearchBackend {
|
|
|
40
40
|
updateCollection(collection: string, execution?: SearchExecutionOptions): Promise<void>;
|
|
41
41
|
embed(): Promise<void>;
|
|
42
42
|
embedCollection(collection: string): Promise<void>;
|
|
43
|
-
ensureCollection(_memoryDir: string): Promise<"present" | "missing" | "unknown" | "skipped">;
|
|
43
|
+
ensureCollection(_memoryDir: string, _execution?: SearchExecutionOptions): Promise<"present" | "missing" | "unknown" | "skipped">;
|
|
44
44
|
private ensureClient;
|
|
45
45
|
private doSearch;
|
|
46
46
|
private mapHits;
|
|
@@ -21,7 +21,7 @@ declare class NoopSearchBackend implements SearchBackend {
|
|
|
21
21
|
updatesAllCollections(): boolean;
|
|
22
22
|
embed(): Promise<void>;
|
|
23
23
|
embedCollection(_collection: string): Promise<void>;
|
|
24
|
-
ensureCollection(_memoryDir: string): Promise<"skipped">;
|
|
24
|
+
ensureCollection(_memoryDir: string, _execution?: SearchExecutionOptions): Promise<"skipped">;
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
export { NoopSearchBackend };
|
|
@@ -41,7 +41,7 @@ declare class OramaBackend implements SearchBackend {
|
|
|
41
41
|
updateCollection(collection: string, execution?: SearchExecutionOptions): Promise<void>;
|
|
42
42
|
embed(): Promise<void>;
|
|
43
43
|
embedCollection(collection: string): Promise<void>;
|
|
44
|
-
ensureCollection(_memoryDir: string): Promise<"present" | "missing" | "unknown" | "skipped">;
|
|
44
|
+
ensureCollection(_memoryDir: string, _execution?: SearchExecutionOptions): Promise<"present" | "missing" | "unknown" | "skipped">;
|
|
45
45
|
private ensureModules;
|
|
46
46
|
private ensureDb;
|
|
47
47
|
private ensureDbForCollection;
|
package/dist/search/port.d.ts
CHANGED
|
@@ -56,7 +56,7 @@ interface SearchBackend {
|
|
|
56
56
|
updateCollectionStrict?(collection: string, execution?: SearchExecutionOptions): Promise<void>;
|
|
57
57
|
embed(): Promise<void>;
|
|
58
58
|
embedCollection(collection: string): Promise<void>;
|
|
59
|
-
ensureCollection(memoryDir: string): Promise<"present" | "missing" | "unknown" | "skipped">;
|
|
59
|
+
ensureCollection(memoryDir: string, execution?: SearchExecutionOptions): Promise<"present" | "missing" | "unknown" | "skipped">;
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
export type { SearchBackend, SearchExecutionOptions, SearchQueryOptions, SearchResult };
|
|
@@ -32,7 +32,7 @@ declare class RemoteSearchBackend implements SearchBackend {
|
|
|
32
32
|
updateCollection(_collection: string, _execution?: SearchExecutionOptions): Promise<void>;
|
|
33
33
|
embed(): Promise<void>;
|
|
34
34
|
embedCollection(_collection: string): Promise<void>;
|
|
35
|
-
ensureCollection(_memoryDir: string): Promise<"skipped">;
|
|
35
|
+
ensureCollection(_memoryDir: string, _execution?: SearchExecutionOptions): Promise<"skipped">;
|
|
36
36
|
private headers;
|
|
37
37
|
private post;
|
|
38
38
|
}
|
package/package.json
CHANGED
package/src/access-http.ts
CHANGED
|
@@ -735,6 +735,7 @@ export class EngramAccessHttpServer {
|
|
|
735
735
|
principal: this.resolveRequestPrincipal(req),
|
|
736
736
|
includeTranscripts: includeTranscriptsRaw !== "false",
|
|
737
737
|
includeContent: false,
|
|
738
|
+
signal: this.createRequestAbortSignal(req, res),
|
|
738
739
|
});
|
|
739
740
|
await this.respondOfflineSnapshotStream(res, result);
|
|
740
741
|
return;
|
|
@@ -756,6 +757,7 @@ export class EngramAccessHttpServer {
|
|
|
756
757
|
includeContent: body.includeContent,
|
|
757
758
|
baseFiles: body.baseFiles,
|
|
758
759
|
...(body.baseCapturedAt ? { baseCapturedAt: new Date(body.baseCapturedAt) } : {}),
|
|
760
|
+
signal: this.createRequestAbortSignal(req, res),
|
|
759
761
|
});
|
|
760
762
|
this.respondJson(res, 200, result);
|
|
761
763
|
return;
|
|
@@ -1786,6 +1788,18 @@ export class EngramAccessHttpServer {
|
|
|
1786
1788
|
this.respondJson(res, 404, { error: "not_found", code: "not_found" });
|
|
1787
1789
|
}
|
|
1788
1790
|
|
|
1791
|
+
private createRequestAbortSignal(req: IncomingMessage, res: ServerResponse): AbortSignal {
|
|
1792
|
+
const controller = new AbortController();
|
|
1793
|
+
const abort = () => {
|
|
1794
|
+
if (!controller.signal.aborted) controller.abort();
|
|
1795
|
+
};
|
|
1796
|
+
req.once("aborted", abort);
|
|
1797
|
+
res.once("close", () => {
|
|
1798
|
+
if (!res.writableEnded) abort();
|
|
1799
|
+
});
|
|
1800
|
+
return controller.signal;
|
|
1801
|
+
}
|
|
1802
|
+
|
|
1789
1803
|
/**
|
|
1790
1804
|
* SSE handler for /engram/v1/graph/events.
|
|
1791
1805
|
*
|
|
@@ -186,27 +186,25 @@ test("offlineSyncFiles reports symlink requested paths as input errors", async (
|
|
|
186
186
|
}
|
|
187
187
|
});
|
|
188
188
|
|
|
189
|
-
test("offlineSyncSnapshot
|
|
189
|
+
test("offlineSyncSnapshot does not trust client base capture time for server fast-base scans", async () => {
|
|
190
190
|
const root = await mkdtemp(path.join(os.tmpdir(), "remnic-offline-snapshot-client-clock-"));
|
|
191
191
|
try {
|
|
192
192
|
const relPath = "facts/a.md";
|
|
193
193
|
const filePath = path.join(root, relPath);
|
|
194
|
-
const
|
|
195
|
-
const newContent = Buffer.from("bravo");
|
|
194
|
+
const content = Buffer.from("alpha");
|
|
196
195
|
const mtimeMs = 1_700_000_000_000;
|
|
197
196
|
await mkdir(path.dirname(filePath), { recursive: true });
|
|
198
|
-
await writeFile(filePath,
|
|
197
|
+
await writeFile(filePath, content);
|
|
199
198
|
await utimes(filePath, mtimeMs / 1000, mtimeMs / 1000);
|
|
200
199
|
const baseFile = {
|
|
201
200
|
path: relPath,
|
|
202
|
-
sha256: createHash("sha256").update(
|
|
203
|
-
bytes:
|
|
201
|
+
sha256: createHash("sha256").update(content).digest("hex"),
|
|
202
|
+
bytes: content.byteLength,
|
|
204
203
|
mtimeMs,
|
|
205
204
|
};
|
|
206
|
-
await writeFile(filePath, newContent);
|
|
207
|
-
await utimes(filePath, mtimeMs / 1000, mtimeMs / 1000);
|
|
208
205
|
|
|
209
206
|
const { service } = makeService();
|
|
207
|
+
let digestReads = 0;
|
|
210
208
|
(service as unknown as {
|
|
211
209
|
orchestrator: {
|
|
212
210
|
config: PluginConfig;
|
|
@@ -218,6 +216,7 @@ test("offlineSyncSnapshot ignores client capture time for server fast-base scans
|
|
|
218
216
|
return readFile(targetPath);
|
|
219
217
|
},
|
|
220
218
|
async digestOfflineSyncFile(targetPath: string) {
|
|
219
|
+
digestReads += 1;
|
|
221
220
|
const content = await readFile(targetPath);
|
|
222
221
|
return {
|
|
223
222
|
sha256: createHash("sha256").update(content).digest("hex"),
|
|
@@ -234,7 +233,8 @@ test("offlineSyncSnapshot ignores client capture time for server fast-base scans
|
|
|
234
233
|
baseCapturedAt: new Date(Date.now() + 60_000),
|
|
235
234
|
});
|
|
236
235
|
|
|
237
|
-
assert.equal(
|
|
236
|
+
assert.equal(digestReads, 1);
|
|
237
|
+
assert.deepEqual(snapshot.files, [baseFile]);
|
|
238
238
|
} finally {
|
|
239
239
|
await rm(root, { recursive: true, force: true });
|
|
240
240
|
}
|
package/src/access-service.ts
CHANGED
|
@@ -5611,7 +5611,7 @@ export class EngramAccessService {
|
|
|
5611
5611
|
}
|
|
5612
5612
|
|
|
5613
5613
|
async offlineSyncSnapshot(
|
|
5614
|
-
options: EngramAccessOfflineSyncSnapshotRequest = {},
|
|
5614
|
+
options: EngramAccessOfflineSyncSnapshotRequest & { signal?: AbortSignal } = {},
|
|
5615
5615
|
): Promise<EngramAccessOfflineSyncSnapshotResponse> {
|
|
5616
5616
|
const resolvedNamespace = this.resolveReadableNamespace(options.namespace, options.principal);
|
|
5617
5617
|
const storage = await this.orchestrator.getStorage(resolvedNamespace);
|
|
@@ -5623,12 +5623,11 @@ export class EngramAccessService {
|
|
|
5623
5623
|
root: storage.dir,
|
|
5624
5624
|
sourceId: `remnic:${resolvedNamespace}:${storageHash}`,
|
|
5625
5625
|
...(options.baseFiles && options.baseFiles.length > 0 ? { baseFiles: options.baseFiles } : {}),
|
|
5626
|
-
// Client clocks are not authoritative for server-side ctime reuse. A
|
|
5627
|
-
// future client timestamp can hide same-size, preserved-mtime rewrites.
|
|
5628
5626
|
includeContent: options.includeContent !== false,
|
|
5629
5627
|
includeTranscripts: options.includeTranscripts !== false,
|
|
5630
5628
|
readFile: async ({ filePath }) => storage.readOfflineSyncFile(filePath),
|
|
5631
5629
|
readFileDigest: async ({ filePath }) => storage.digestOfflineSyncFile(filePath),
|
|
5630
|
+
signal: options.signal,
|
|
5632
5631
|
});
|
|
5633
5632
|
return {
|
|
5634
5633
|
namespace: resolvedNamespace,
|
|
@@ -5637,7 +5636,7 @@ export class EngramAccessService {
|
|
|
5637
5636
|
}
|
|
5638
5637
|
|
|
5639
5638
|
async offlineSyncSnapshotStream(
|
|
5640
|
-
options: Omit<EngramAccessOfflineSyncSnapshotRequest, "baseCapturedAt" | "baseFiles"> = {},
|
|
5639
|
+
options: Omit<EngramAccessOfflineSyncSnapshotRequest, "baseCapturedAt" | "baseFiles"> & { signal?: AbortSignal } = {},
|
|
5641
5640
|
): Promise<EngramAccessOfflineSyncSnapshotStreamResponse> {
|
|
5642
5641
|
const resolvedNamespace = this.resolveReadableNamespace(options.namespace, options.principal);
|
|
5643
5642
|
const storage = await this.orchestrator.getStorage(resolvedNamespace);
|
|
@@ -5655,6 +5654,7 @@ export class EngramAccessService {
|
|
|
5655
5654
|
includeTranscripts: options.includeTranscripts !== false,
|
|
5656
5655
|
readFile: async ({ filePath }) => storage.readOfflineSyncFile(filePath),
|
|
5657
5656
|
readFileDigest: async ({ filePath }) => storage.digestOfflineSyncFile(filePath),
|
|
5657
|
+
signal: options.signal,
|
|
5658
5658
|
}),
|
|
5659
5659
|
};
|
|
5660
5660
|
}
|
|
@@ -7,6 +7,7 @@ import type { PluginConfig, QmdSearchResult } from "../types.js";
|
|
|
7
7
|
class FakeBackend implements SearchBackend {
|
|
8
8
|
updates = 0;
|
|
9
9
|
calls: Array<{ method: string; collection: string | undefined }> = [];
|
|
10
|
+
ensureSignals: Array<AbortSignal | undefined> = [];
|
|
10
11
|
|
|
11
12
|
constructor(
|
|
12
13
|
private readonly globalUpdate: boolean,
|
|
@@ -63,7 +64,8 @@ class FakeBackend implements SearchBackend {
|
|
|
63
64
|
|
|
64
65
|
async embedCollection(): Promise<void> {}
|
|
65
66
|
|
|
66
|
-
async ensureCollection(): Promise<"present"> {
|
|
67
|
+
async ensureCollection(_memoryDir?: string, execution?: { signal?: AbortSignal }): Promise<"present"> {
|
|
68
|
+
this.ensureSignals.push(execution?.signal);
|
|
67
69
|
return "present";
|
|
68
70
|
}
|
|
69
71
|
}
|
|
@@ -173,3 +175,20 @@ test("searchAcrossNamespaces passes scoped collection to backend search methods"
|
|
|
173
175
|
);
|
|
174
176
|
}
|
|
175
177
|
});
|
|
178
|
+
|
|
179
|
+
test("ensureNamespaceCollection forwards abort signals to backend collection checks", async () => {
|
|
180
|
+
const backend = new FakeBackend(false);
|
|
181
|
+
const router = new NamespaceSearchRouter(
|
|
182
|
+
config(),
|
|
183
|
+
{ storageFor: async (namespace: string) => ({ dir: `/tmp/remnic/${namespace}` }) },
|
|
184
|
+
() => backend,
|
|
185
|
+
);
|
|
186
|
+
const controller = new AbortController();
|
|
187
|
+
|
|
188
|
+
const state = await router.ensureNamespaceCollection("main", {
|
|
189
|
+
signal: controller.signal,
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
assert.equal(state, "present");
|
|
193
|
+
assert.deepEqual(backend.ensureSignals, [controller.signal]);
|
|
194
|
+
});
|
package/src/namespaces/search.ts
CHANGED
|
@@ -144,8 +144,11 @@ export class NamespaceSearchRouter {
|
|
|
144
144
|
);
|
|
145
145
|
}
|
|
146
146
|
|
|
147
|
-
async ensureNamespaceCollection(
|
|
148
|
-
|
|
147
|
+
async ensureNamespaceCollection(
|
|
148
|
+
namespace: string,
|
|
149
|
+
execution?: SearchExecutionOptions,
|
|
150
|
+
): Promise<"present" | "missing" | "unknown" | "skipped"> {
|
|
151
|
+
const record = await this.backendRecordFor(namespace, execution);
|
|
149
152
|
return record.collectionState;
|
|
150
153
|
}
|
|
151
154
|
|
|
@@ -168,7 +171,10 @@ export class NamespaceSearchRouter {
|
|
|
168
171
|
);
|
|
169
172
|
}
|
|
170
173
|
|
|
171
|
-
private async backendRecordFor(
|
|
174
|
+
private async backendRecordFor(
|
|
175
|
+
namespace: string,
|
|
176
|
+
execution?: SearchExecutionOptions,
|
|
177
|
+
): Promise<NamespaceBackendRecord> {
|
|
172
178
|
const key = namespace.trim() || this.config.defaultNamespace;
|
|
173
179
|
const existing = this.cache.get(key);
|
|
174
180
|
if (existing) return await existing;
|
|
@@ -189,7 +195,7 @@ export class NamespaceSearchRouter {
|
|
|
189
195
|
const backend = this.createBackend(scopedConfig);
|
|
190
196
|
const available = await backend.probe().catch(() => false);
|
|
191
197
|
const collectionState = available
|
|
192
|
-
? await backend.ensureCollection(storage.dir).catch(() => "unknown" as const)
|
|
198
|
+
? await backend.ensureCollection(storage.dir, execution).catch(() => "unknown" as const)
|
|
193
199
|
: "unknown";
|
|
194
200
|
return {
|
|
195
201
|
backend,
|