@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.
Files changed (97) hide show
  1. package/dist/access-cli.js +11 -11
  2. package/dist/access-http.d.ts +2 -1
  3. package/dist/access-http.js +5 -5
  4. package/dist/access-mcp.d.ts +1 -1
  5. package/dist/access-mcp.js +4 -4
  6. package/dist/access-schema.js +2 -2
  7. package/dist/{access-service-qrrIrC-0.d.ts → access-service-CZfksQuS.d.ts} +6 -2
  8. package/dist/access-service.d.ts +1 -1
  9. package/dist/access-service.js +2 -2
  10. package/dist/{chunk-NJ3MJQZX.js → chunk-2I5JGH3M.js} +2 -2
  11. package/dist/{chunk-NJ3MJQZX.js.map → chunk-2I5JGH3M.js.map} +1 -1
  12. package/dist/{chunk-O27WNHTT.js → chunk-5UHVGNZD.js} +2 -2
  13. package/dist/{chunk-3Q4H3OBR.js → chunk-5V456VRV.js} +6 -6
  14. package/dist/{chunk-3Q4H3OBR.js.map → chunk-5V456VRV.js.map} +1 -1
  15. package/dist/{chunk-EDBEWFJO.js → chunk-6BR7L222.js} +2 -2
  16. package/dist/{chunk-D6WE5MTW.js → chunk-FCOQXV3T.js} +6 -6
  17. package/dist/{chunk-RCTS5CKK.js → chunk-FK556DDH.js} +2 -2
  18. package/dist/{chunk-RCTS5CKK.js.map → chunk-FK556DDH.js.map} +1 -1
  19. package/dist/{chunk-A52AKD7C.js → chunk-FUC4LZMD.js} +2 -2
  20. package/dist/chunk-FUC4LZMD.js.map +1 -0
  21. package/dist/{chunk-FER4WARO.js → chunk-HC6EKOID.js} +20 -7
  22. package/dist/chunk-HC6EKOID.js.map +1 -0
  23. package/dist/{chunk-PIRJPV5T.js → chunk-JNANKJLN.js} +2 -2
  24. package/dist/chunk-JNANKJLN.js.map +1 -0
  25. package/dist/{chunk-7MV5CWTE.js → chunk-KXULCVOC.js} +6 -6
  26. package/dist/chunk-KXULCVOC.js.map +1 -0
  27. package/dist/{chunk-TVRN5QKH.js → chunk-PCI747N2.js} +3 -3
  28. package/dist/{chunk-TVRN5QKH.js.map → chunk-PCI747N2.js.map} +1 -1
  29. package/dist/{chunk-BLZAVUD2.js → chunk-QVJ4NWL2.js} +2 -2
  30. package/dist/chunk-QVJ4NWL2.js.map +1 -0
  31. package/dist/{chunk-EIPUHVKE.js → chunk-SML26KED.js} +7 -7
  32. package/dist/{chunk-JYIKKAK3.js → chunk-TTGZV5R3.js} +3 -3
  33. package/dist/{chunk-R26QUUQN.js → chunk-YDMVYYD2.js} +52 -11
  34. package/dist/chunk-YDMVYYD2.js.map +1 -0
  35. package/dist/{chunk-L7S47WZT.js → chunk-YNXOKMJP.js} +2 -2
  36. package/dist/chunk-YNXOKMJP.js.map +1 -0
  37. package/dist/{chunk-4Q73JBSM.js → chunk-ZEY4KYRQ.js} +38 -11
  38. package/dist/chunk-ZEY4KYRQ.js.map +1 -0
  39. package/dist/{cli-X4NJoqSe.d.ts → cli-CPe_2KB1.d.ts} +1 -1
  40. package/dist/cli.d.ts +2 -2
  41. package/dist/cli.js +16 -16
  42. package/dist/index.d.ts +2 -2
  43. package/dist/index.js +17 -17
  44. package/dist/mcp-memory-inspector-app.d.ts +1 -1
  45. package/dist/namespaces/migrate.js +9 -9
  46. package/dist/namespaces/search.d.ts +1 -1
  47. package/dist/namespaces/search.js +8 -8
  48. package/dist/offline-sync.d.ts +4 -0
  49. package/dist/offline-sync.js +1 -1
  50. package/dist/operator-toolkit.d.ts +3 -1
  51. package/dist/operator-toolkit.js +10 -10
  52. package/dist/orchestrator.js +9 -9
  53. package/dist/qmd.d.ts +1 -1
  54. package/dist/qmd.js +1 -1
  55. package/dist/search/factory.js +7 -7
  56. package/dist/search/index.js +7 -7
  57. package/dist/search/lancedb-backend.d.ts +1 -1
  58. package/dist/search/lancedb-backend.js +1 -1
  59. package/dist/search/meilisearch-backend.d.ts +1 -1
  60. package/dist/search/meilisearch-backend.js +1 -1
  61. package/dist/search/noop-backend.d.ts +1 -1
  62. package/dist/search/noop-backend.js +1 -1
  63. package/dist/search/orama-backend.d.ts +1 -1
  64. package/dist/search/orama-backend.js +1 -1
  65. package/dist/search/port.d.ts +1 -1
  66. package/dist/search/remote-backend.d.ts +1 -1
  67. package/dist/search/remote-backend.js +1 -1
  68. package/package.json +1 -1
  69. package/src/access-http.ts +14 -0
  70. package/src/access-service-namespace.test.ts +9 -9
  71. package/src/access-service.ts +4 -4
  72. package/src/namespaces/search.test.ts +20 -1
  73. package/src/namespaces/search.ts +10 -4
  74. package/src/offline-sync.test.ts +128 -18
  75. package/src/offline-sync.ts +41 -7
  76. package/src/operator-toolkit.ts +4 -1
  77. package/src/orchestrator.ts +68 -10
  78. package/src/qmd.ts +5 -2
  79. package/src/search/lancedb-backend.ts +4 -1
  80. package/src/search/meilisearch-backend.ts +4 -1
  81. package/src/search/noop-backend.ts +1 -1
  82. package/src/search/orama-backend.ts +4 -1
  83. package/src/search/port.ts +4 -1
  84. package/src/search/remote-backend.ts +1 -1
  85. package/dist/chunk-4Q73JBSM.js.map +0 -1
  86. package/dist/chunk-7MV5CWTE.js.map +0 -1
  87. package/dist/chunk-A52AKD7C.js.map +0 -1
  88. package/dist/chunk-BLZAVUD2.js.map +0 -1
  89. package/dist/chunk-FER4WARO.js.map +0 -1
  90. package/dist/chunk-L7S47WZT.js.map +0 -1
  91. package/dist/chunk-PIRJPV5T.js.map +0 -1
  92. package/dist/chunk-R26QUUQN.js.map +0 -1
  93. /package/dist/{chunk-O27WNHTT.js.map → chunk-5UHVGNZD.js.map} +0 -0
  94. /package/dist/{chunk-EDBEWFJO.js.map → chunk-6BR7L222.js.map} +0 -0
  95. /package/dist/{chunk-D6WE5MTW.js.map → chunk-FCOQXV3T.js.map} +0 -0
  96. /package/dist/{chunk-EIPUHVKE.js.map → chunk-SML26KED.js.map} +0 -0
  97. /package/dist/{chunk-JYIKKAK3.js.map → chunk-TTGZV5R3.js.map} +0 -0
@@ -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;
@@ -29,7 +29,7 @@ import {
29
29
  summarizeOfflineSyncPendingChanges,
30
30
  summarizeOfflineSyncPendingFiles,
31
31
  writeOfflineSyncState
32
- } from "./chunk-4Q73JBSM.js";
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): Promise<"present" | "missing" | "unknown" | "skipped">;
18
+ ensureCollection(memoryDir: string, execution?: {
19
+ signal?: AbortSignal;
20
+ }): Promise<"present" | "missing" | "unknown" | "skipped">;
19
21
  debugStatus(): string;
20
22
  }
21
23
  interface ConversationIndexLike {
@@ -11,17 +11,17 @@ import {
11
11
  summarizeMemoryWorthLegacyCounters,
12
12
  summarizeObservationThroughput,
13
13
  summarizeTierDistribution
14
- } from "./chunk-L7S47WZT.js";
15
- import "./chunk-EDBEWFJO.js";
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-7MV5CWTE.js";
19
- import "./chunk-EIPUHVKE.js";
20
- import "./chunk-A52AKD7C.js";
21
- import "./chunk-RCTS5CKK.js";
22
- import "./chunk-NJ3MJQZX.js";
23
- import "./chunk-BLZAVUD2.js";
24
- import "./chunk-PIRJPV5T.js";
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-TVRN5QKH.js";
35
+ import "./chunk-PCI747N2.js";
36
36
  import "./chunk-CMTINOFS.js";
37
37
  import "./chunk-BEUDU7Y4.js";
38
38
  import "./chunk-G3Z3QEF5.js";
@@ -26,7 +26,7 @@ import {
26
26
  sanitizeSessionKeyForFilename,
27
27
  shouldFilterLifecycleRecallCandidate,
28
28
  summarizeGraphShadowComparison
29
- } from "./chunk-R26QUUQN.js";
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-7MV5CWTE.js";
113
- import "./chunk-EIPUHVKE.js";
114
- import "./chunk-A52AKD7C.js";
115
- import "./chunk-RCTS5CKK.js";
116
- import "./chunk-NJ3MJQZX.js";
117
- import "./chunk-BLZAVUD2.js";
118
- import "./chunk-PIRJPV5T.js";
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-TVRN5QKH.js";
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
@@ -10,7 +10,7 @@ import {
10
10
  resolveQmdCapabilities,
11
11
  shouldAutoUpgradeQmd,
12
12
  versionAtLeast
13
- } from "./chunk-TVRN5QKH.js";
13
+ } from "./chunk-PCI747N2.js";
14
14
  import "./chunk-PVGDJXVK.js";
15
15
  import "./chunk-NNVTUXEB.js";
16
16
  import "./chunk-CPPS65WS.js";
@@ -2,12 +2,12 @@ import {
2
2
  createConversationIndexRuntime,
3
3
  createConversationSearchBackend,
4
4
  createSearchBackend
5
- } from "../chunk-EIPUHVKE.js";
6
- import "../chunk-A52AKD7C.js";
7
- import "../chunk-RCTS5CKK.js";
8
- import "../chunk-NJ3MJQZX.js";
9
- import "../chunk-BLZAVUD2.js";
10
- import "../chunk-PIRJPV5T.js";
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-TVRN5QKH.js";
18
+ import "../chunk-PCI747N2.js";
19
19
  import "../chunk-PVGDJXVK.js";
20
20
  import "../chunk-NNVTUXEB.js";
21
21
  import "../chunk-CPPS65WS.js";
@@ -2,22 +2,22 @@ import {
2
2
  createConversationIndexRuntime,
3
3
  createConversationSearchBackend,
4
4
  createSearchBackend
5
- } from "../chunk-EIPUHVKE.js";
5
+ } from "../chunk-SML26KED.js";
6
6
  import {
7
7
  LanceDbBackend
8
- } from "../chunk-A52AKD7C.js";
8
+ } from "../chunk-FUC4LZMD.js";
9
9
  import {
10
10
  MeilisearchBackend
11
- } from "../chunk-RCTS5CKK.js";
11
+ } from "../chunk-FK556DDH.js";
12
12
  import {
13
13
  NoopSearchBackend
14
- } from "../chunk-NJ3MJQZX.js";
14
+ } from "../chunk-2I5JGH3M.js";
15
15
  import {
16
16
  OramaBackend
17
- } from "../chunk-BLZAVUD2.js";
17
+ } from "../chunk-QVJ4NWL2.js";
18
18
  import {
19
19
  RemoteSearchBackend
20
- } from "../chunk-PIRJPV5T.js";
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-TVRN5QKH.js";
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;
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  LanceDbBackend
3
- } from "../chunk-A52AKD7C.js";
3
+ } from "../chunk-FUC4LZMD.js";
4
4
  import "../chunk-Q4CAQGKQ.js";
5
5
  import "../chunk-CINZGPSJ.js";
6
6
  import "../chunk-PVGDJXVK.js";
@@ -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;
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  MeilisearchBackend
3
- } from "../chunk-RCTS5CKK.js";
3
+ } from "../chunk-FK556DDH.js";
4
4
  import "../chunk-Q4CAQGKQ.js";
5
5
  import "../chunk-CINZGPSJ.js";
6
6
  import "../chunk-PVGDJXVK.js";
@@ -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 };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  NoopSearchBackend
3
- } from "../chunk-NJ3MJQZX.js";
3
+ } from "../chunk-2I5JGH3M.js";
4
4
  import "../chunk-PZ5AY32C.js";
5
5
  export {
6
6
  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;
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  OramaBackend,
3
3
  resolveOramaCollectionDbFilePath
4
- } from "../chunk-BLZAVUD2.js";
4
+ } from "../chunk-QVJ4NWL2.js";
5
5
  import "../chunk-Q4CAQGKQ.js";
6
6
  import "../chunk-CINZGPSJ.js";
7
7
  import "../chunk-PVGDJXVK.js";
@@ -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
  }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  RemoteSearchBackend
3
- } from "../chunk-PIRJPV5T.js";
3
+ } from "../chunk-JNANKJLN.js";
4
4
  import "../chunk-2ODBA7MQ.js";
5
5
  import "../chunk-PZ5AY32C.js";
6
6
  export {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remnic/core",
3
- "version": "9.3.515",
3
+ "version": "9.3.516",
4
4
  "description": "Framework-agnostic Remnic memory engine — orchestrator, storage, extraction, search, trust zones",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -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 ignores client capture time for server fast-base scans", async () => {
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 oldContent = Buffer.from("alpha");
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, oldContent);
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(oldContent).digest("hex"),
203
- bytes: oldContent.byteLength,
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(snapshot.files[0]?.sha256, createHash("sha256").update(newContent).digest("hex"));
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
  }
@@ -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
+ });
@@ -144,8 +144,11 @@ export class NamespaceSearchRouter {
144
144
  );
145
145
  }
146
146
 
147
- async ensureNamespaceCollection(namespace: string): Promise<"present" | "missing" | "unknown" | "skipped"> {
148
- const record = await this.backendRecordFor(namespace);
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(namespace: string): Promise<NamespaceBackendRecord> {
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,