@batalabs/virlow-mcp-core 3.119.4 → 3.120.0

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/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  export { ApiError, VirlowApi } from './api.js';
2
2
  export { LockedError, Vault } from './vault.js';
3
3
  export { NotesService, SEARCH_SCAN_CAP } from './notes.js';
4
- export { AttachmentsService } from './attachments.js';
4
+ export { AttachmentsService, SMALL_FILE_BYTES } from './attachments.js';
5
5
  export { KeyChangedError, NoWorkspaceKeyError, WorkspaceKeyring, memorySignerMemory } from './keyring.js';
6
6
  export { fileSignerMemory } from './signer-file.js';
7
7
  export { MemoryStore, SYNC_PAGE_LIMIT } from './memories.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAgB/C,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAE1G,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAE7D,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,eAAe,EACf,mBAAmB,EACnB,cAAc,GACf,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,uBAAuB,EACvB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,aAAa,EACb,cAAc,EACd,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEhE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,yBAAyB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACnF,OAAO,EACL,eAAe,EACf,SAAS,EACT,WAAW,EACX,YAAY,EACZ,UAAU,EACV,UAAU,EACV,WAAW,EACX,WAAW,EACX,YAAY,EACZ,SAAS,EACT,UAAU,EACV,YAAY,EACZ,WAAW,EACX,aAAa,EACb,UAAU,EACV,QAAQ,GACT,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEnF,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzC;;;;;;;;;;GAUG"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAgB/C,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAE1G,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAE7D,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,eAAe,EACf,mBAAmB,EACnB,cAAc,GACf,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,uBAAuB,EACvB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,aAAa,EACb,cAAc,EACd,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEhE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,yBAAyB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACnF,OAAO,EACL,eAAe,EACf,SAAS,EACT,WAAW,EACX,YAAY,EACZ,UAAU,EACV,UAAU,EACV,WAAW,EACX,WAAW,EACX,YAAY,EACZ,SAAS,EACT,UAAU,EACV,YAAY,EACZ,WAAW,EACX,aAAa,EACb,UAAU,EACV,QAAQ,GACT,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEnF,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzC;;;;;;;;;;GAUG"}
@@ -0,0 +1,73 @@
1
+ export interface Transport {
2
+ /** A JSON call to the API with the session's auth. `path` starts with "/". */
3
+ api: <T>(path: string, init?: {
4
+ method?: string;
5
+ body?: unknown;
6
+ }) => Promise<T>;
7
+ /** PUT bytes to a signed URL, reporting bytes sent. Resolves with the HTTP status. */
8
+ put: (url: string, body: Uint8Array, onSent: (sent: number) => void, signal?: AbortSignal) => Promise<number>;
9
+ /** GET a byte range [start, end) of a signed URL. */
10
+ getRange: (url: string, start: number, end: number, signal?: AbortSignal) => Promise<Response>;
11
+ /** Wait before a retry. Replaced in tests. */
12
+ wait?: (ms: number) => Promise<void>;
13
+ }
14
+ /** The API's answer was a refusal it worded for a person. */
15
+ export interface ApiRefusalBody {
16
+ error?: string;
17
+ code?: string;
18
+ feature?: string;
19
+ missing?: number[];
20
+ }
21
+ export declare class ApiRefusal extends Error {
22
+ readonly status: number;
23
+ readonly body: ApiRefusalBody;
24
+ constructor(status: number, body: ApiRefusalBody);
25
+ }
26
+ export interface LargeUploadInput {
27
+ noteId: string;
28
+ file: Blob;
29
+ mimeType: string;
30
+ /** The key that wraps the file's own key: the account key, or a shared workspace's. */
31
+ masterKey: CryptoKey;
32
+ /** The workspace key version `masterKey` is, in a shared workspace. */
33
+ keyVersion?: number | null;
34
+ encryptedTitle: string;
35
+ iv: string;
36
+ salt: string;
37
+ onProgress?: (sentBytes: number) => void;
38
+ signal?: AbortSignal;
39
+ }
40
+ /**
41
+ * Sends `file` as a large upload and returns the attachment the API recorded.
42
+ * If anything fails, the upload is abandoned on the server so the space it
43
+ * reserved is released straight away rather than a day later.
44
+ */
45
+ export declare function uploadLargeFile<Row>(transport: Transport, input: LargeUploadInput): Promise<Row>;
46
+ export interface LargeDownloadInput {
47
+ /** The row from GET /files/:id. */
48
+ size: number;
49
+ chunkSize: number;
50
+ header: string;
51
+ url: string;
52
+ masterKey: CryptoKey;
53
+ /** Asked for a new signed URL when the one in hand stops working. */
54
+ refreshUrl: () => Promise<string>;
55
+ /** Only the chunks covering these plaintext bytes [start, end); the whole
56
+ * file when absent. A reader asked for one part of a file pays for that part. */
57
+ range?: {
58
+ start: number;
59
+ end: number;
60
+ };
61
+ /** Called with each chunk's plaintext and where it starts, in file order. */
62
+ write: (chunk: Uint8Array, offset: number) => Promise<void> | void;
63
+ onProgress?: (receivedBytes: number) => void;
64
+ signal?: AbortSignal;
65
+ }
66
+ /**
67
+ * Reads a large file back: fetches the sealed chunks by range, a few at a
68
+ * time, opens each and hands them to `write` in order. A chunk that is not
69
+ * the one stored at that place in that file fails its tag and the download
70
+ * with it, so what reaches `write` is the file or nothing.
71
+ */
72
+ export declare function downloadLargeFile(transport: Transport, input: LargeDownloadInput): Promise<void>;
73
+ //# sourceMappingURL=large-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"large-files.d.ts","sourceRoot":"","sources":["../src/large-files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,230 @@
1
+ import { createFileKey, decryptFileChunk, encryptFileChunk, fileChunkCount, openFileKey, sealedChunkRange, } from '@batalabs/virlow-crypto';
2
+ /**
3
+ * Files too large to send as one request. The file is cut into chunks, each
4
+ * encrypted here under a key made for this file alone, and each sent straight
5
+ * to object storage at a URL the API signs. The API never carries the bytes,
6
+ * and neither end ever holds the whole file in memory.
7
+ *
8
+ * This module is the transfer only. Who may upload what, and which format a
9
+ * file takes, is fileService's decision.
10
+ */
11
+ /** Chunks in flight at once. Each holds a chunk and its ciphertext in memory. */
12
+ const CONCURRENCY = 3;
13
+ /** Tries per chunk before the transfer fails. */
14
+ const ATTEMPTS = 4;
15
+ /** Part URLs asked for at a time; the API signs at most 100. */
16
+ const URL_BATCH = 50;
17
+ export class ApiRefusal extends Error {
18
+ status;
19
+ body;
20
+ constructor(status, body) {
21
+ super(body.error ?? `Request failed: ${status}`);
22
+ this.name = 'ApiRefusal';
23
+ this.status = status;
24
+ this.body = body;
25
+ }
26
+ }
27
+ const defaultWait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
28
+ function aborted(signal) {
29
+ return signal?.aborted === true;
30
+ }
31
+ /** Runs `job` over `items`, `limit` at a time, stopping at the first failure. */
32
+ async function pool(items, limit, job) {
33
+ let next = 0;
34
+ let failure;
35
+ let failed = false;
36
+ const worker = async () => {
37
+ while (!failed && next < items.length) {
38
+ const item = items[next++];
39
+ try {
40
+ await job(item);
41
+ }
42
+ catch (error) {
43
+ if (!failed) {
44
+ failed = true;
45
+ failure = error;
46
+ }
47
+ }
48
+ }
49
+ };
50
+ await Promise.all(Array.from({ length: Math.min(limit, items.length) }, worker));
51
+ if (failed)
52
+ throw failure;
53
+ }
54
+ /**
55
+ * Sends `file` as a large upload and returns the attachment the API recorded.
56
+ * If anything fails, the upload is abandoned on the server so the space it
57
+ * reserved is released straight away rather than a day later.
58
+ */
59
+ export async function uploadLargeFile(transport, input) {
60
+ const { file, signal } = input;
61
+ const wait = transport.wait ?? defaultWait;
62
+ const { header, fileKey } = await createFileKey(input.masterKey);
63
+ const upload = await transport.api(`/notes/${input.noteId}/files/uploads`, {
64
+ method: 'POST',
65
+ body: {
66
+ mimeType: input.mimeType,
67
+ size: file.size,
68
+ encryptedData: header,
69
+ encryptedTitle: input.encryptedTitle,
70
+ iv: input.iv,
71
+ salt: input.salt,
72
+ ...(input.keyVersion !== null && input.keyVersion !== undefined && { keyVersion: input.keyVersion }),
73
+ },
74
+ });
75
+ try {
76
+ const sentByPart = new Map();
77
+ const report = (partNumber, sent) => {
78
+ sentByPart.set(partNumber, sent);
79
+ if (!input.onProgress)
80
+ return;
81
+ let total = 0;
82
+ for (const value of sentByPart.values())
83
+ total += value;
84
+ input.onProgress(Math.min(total, file.size));
85
+ };
86
+ // Signed URLs, fetched a batch ahead of the parts that need them. A URL
87
+ // that has expired by the time its part is sent is signed again.
88
+ const urls = new Map();
89
+ let signing = Promise.resolve();
90
+ const urlFor = (partNumber, pending, fresh = false) => {
91
+ const ask = signing.then(async () => {
92
+ if (!fresh && urls.has(partNumber))
93
+ return;
94
+ // This part and whichever others still need one, so the batches do
95
+ // not depend on which worker happens to ask first.
96
+ const wanted = fresh
97
+ ? [partNumber]
98
+ : [partNumber, ...pending.filter((n) => n !== partNumber && !urls.has(n))].slice(0, URL_BATCH);
99
+ const signed = await transport.api(`/files/uploads/${upload.id}/parts`, { method: 'POST', body: { partNumbers: wanted } });
100
+ for (const entry of signed.urls)
101
+ urls.set(entry.partNumber, entry.url);
102
+ });
103
+ // One signing call at a time, and a failed one does not poison the next.
104
+ signing = ask.catch(() => { });
105
+ return ask.then(() => {
106
+ const url = urls.get(partNumber);
107
+ if (!url)
108
+ throw new Error(`No upload URL for part ${partNumber}`);
109
+ return url;
110
+ });
111
+ };
112
+ const sendPart = async (partNumber, pending) => {
113
+ const index = partNumber - 1;
114
+ const plain = new Uint8Array(await file.slice(index * upload.chunkSize, (index + 1) * upload.chunkSize).arrayBuffer());
115
+ const sealed = await encryptFileChunk(fileKey, index, partNumber === upload.partCount, plain);
116
+ for (let attempt = 1;; attempt++) {
117
+ if (aborted(signal))
118
+ throw new DOMException('Upload cancelled', 'AbortError');
119
+ let status = 0;
120
+ try {
121
+ const url = await urlFor(partNumber, pending, attempt > 1);
122
+ status = await transport.put(url, sealed, (sent) => report(partNumber, Math.min(sent, plain.byteLength)), signal);
123
+ }
124
+ catch (error) {
125
+ if (aborted(signal) || attempt >= ATTEMPTS)
126
+ throw error;
127
+ }
128
+ if (status >= 200 && status < 300) {
129
+ report(partNumber, plain.byteLength);
130
+ return;
131
+ }
132
+ if (attempt >= ATTEMPTS)
133
+ throw new Error(`Uploading part ${partNumber} failed (${status})`);
134
+ report(partNumber, 0);
135
+ await wait(500 * 2 ** (attempt - 1));
136
+ }
137
+ };
138
+ const all = Array.from({ length: upload.partCount }, (_, i) => i + 1);
139
+ await pool(all, CONCURRENCY, (partNumber) => sendPart(partNumber, all));
140
+ // The API checks what the store holds. If it says parts are missing (a
141
+ // PUT that reported success and was lost), send those and ask once more.
142
+ for (let round = 1;; round++) {
143
+ try {
144
+ return await transport.api(`/files/uploads/${upload.id}/complete`, { method: 'POST' });
145
+ }
146
+ catch (error) {
147
+ const missing = error instanceof ApiRefusal && error.body.code === 'UPLOAD_INCOMPLETE'
148
+ ? (error.body.missing ?? [])
149
+ : [];
150
+ if (missing.length === 0 || round >= 2)
151
+ throw error;
152
+ await pool(missing, CONCURRENCY, (partNumber) => sendPart(partNumber, missing));
153
+ }
154
+ }
155
+ }
156
+ catch (error) {
157
+ await transport.api(`/files/uploads/${upload.id}`, { method: 'DELETE' }).catch(() => { });
158
+ throw error;
159
+ }
160
+ }
161
+ /**
162
+ * Reads a large file back: fetches the sealed chunks by range, a few at a
163
+ * time, opens each and hands them to `write` in order. A chunk that is not
164
+ * the one stored at that place in that file fails its tag and the download
165
+ * with it, so what reaches `write` is the file or nothing.
166
+ */
167
+ export async function downloadLargeFile(transport, input) {
168
+ const { size, chunkSize, signal } = input;
169
+ const wait = transport.wait ?? defaultWait;
170
+ const fileKey = await openFileKey(input.masterKey, input.header);
171
+ const count = fileChunkCount(size, chunkSize);
172
+ let url = input.url;
173
+ let refreshing = null;
174
+ const refresh = () => {
175
+ refreshing ??= input
176
+ .refreshUrl()
177
+ .then((fresh) => {
178
+ url = fresh;
179
+ })
180
+ .finally(() => {
181
+ refreshing = null;
182
+ });
183
+ return refreshing;
184
+ };
185
+ const fetchChunk = async (index) => {
186
+ const { start, end } = sealedChunkRange(size, chunkSize, index);
187
+ for (let attempt = 1;; attempt++) {
188
+ if (aborted(signal))
189
+ throw new DOMException('Download cancelled', 'AbortError');
190
+ try {
191
+ const response = await transport.getRange(url, start, end, signal);
192
+ if (response.ok) {
193
+ const sealed = new Uint8Array(await response.arrayBuffer());
194
+ if (sealed.byteLength !== end - start)
195
+ throw new Error('The stored file is incomplete');
196
+ return await decryptFileChunk(fileKey, index, index === count - 1, sealed);
197
+ }
198
+ if (attempt >= ATTEMPTS)
199
+ throw new Error(`Download failed (${response.status})`);
200
+ // A signed URL past its hour answers 403.
201
+ if (response.status === 403)
202
+ await refresh();
203
+ }
204
+ catch (error) {
205
+ // A chunk that fails its tag will fail it every time.
206
+ if (aborted(signal) || attempt >= ATTEMPTS || error?.name === 'OperationError') {
207
+ throw error;
208
+ }
209
+ }
210
+ await wait(500 * 2 ** (attempt - 1));
211
+ }
212
+ };
213
+ // A window of chunks is fetched together and written in order, so memory
214
+ // holds a few chunks however large the file is.
215
+ const first = input.range ? Math.floor(input.range.start / chunkSize) : 0;
216
+ const stop = input.range ? Math.min(count, Math.ceil(input.range.end / chunkSize)) : count;
217
+ let received = 0;
218
+ for (let from = first; from < stop; from += CONCURRENCY) {
219
+ const window = Array.from({ length: Math.min(CONCURRENCY, stop - from) }, (_, i) => from + i);
220
+ const chunks = await Promise.all(window.map(fetchChunk));
221
+ for (const [i, chunk] of chunks.entries()) {
222
+ await input.write(chunk, (from + i) * chunkSize);
223
+ received += chunk.byteLength;
224
+ input.onProgress?.(received);
225
+ }
226
+ }
227
+ if (!input.range && received !== size)
228
+ throw new Error('The stored file is incomplete');
229
+ }
230
+ //# sourceMappingURL=large-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"large-files.js","sourceRoot":"","sources":["../src/large-files.ts"],"names":[],"mappings":"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"}
package/dist/notes.d.ts CHANGED
@@ -20,6 +20,8 @@ export interface AppliedProp {
20
20
  export declare class NotesService {
21
21
  private readonly api;
22
22
  private readonly vault;
23
+ /** See AttachmentsService: for the account holder's own surfaces only. */
24
+ private readonly options;
23
25
  /** Per-unlock cache of decrypted (title, content) keyed by `id:updatedAt`
24
26
  * so re-reading/re-scanning the same note twice in one unlock doesn't
25
27
  * re-run AES-GCM decryption. Cleared whenever the vault locks. */
@@ -65,7 +67,11 @@ export declare class NotesService {
65
67
  /** Opens shared workspaces' keys for this unlock. Public so the attachment
66
68
  * service built next to this one shares it rather than opening them twice. */
67
69
  readonly keyring: WorkspaceKeyring;
68
- constructor(api: VirlowApi, vault: Vault, keyring?: WorkspaceKeyring);
70
+ constructor(api: VirlowApi, vault: Vault, keyring?: WorkspaceKeyring,
71
+ /** See AttachmentsService: for the account holder's own surfaces only. */
72
+ options?: {
73
+ allFolders?: boolean;
74
+ });
69
75
  private handleLock;
70
76
  /** Drops the paged row list after anything that could change which rows
71
77
  * exist, where they live, or what they are called. Called after the write
@@ -257,6 +263,31 @@ export declare class NotesService {
257
263
  }>;
258
264
  withheld: number;
259
265
  }>;
266
+ /**
267
+ * Every folder and every note that has attachments, decrypted, for a surface
268
+ * that shows the account's own tree (the desktop drive). Refused unless this
269
+ * service was built with `allFolders`, so no tool path can reach it.
270
+ *
271
+ * The memories tree is left out: the MCP server makes it for AI tools and it
272
+ * holds no files. `attachmentStamp` changes when a note's attachments do, so
273
+ * a caller lists a note's files only when it has to. A note whose key does
274
+ * not open here is left out and counted, never opened with the account key.
275
+ */
276
+ listDriveCatalog(): Promise<{
277
+ folders: Array<{
278
+ id: string;
279
+ name: string;
280
+ parentId: string | null;
281
+ }>;
282
+ notes: Array<{
283
+ id: string;
284
+ title: string;
285
+ folderId: string | null;
286
+ updatedAt: string;
287
+ attachmentStamp: string;
288
+ }>;
289
+ withheld: number;
290
+ }>;
260
291
  /** Folder exposure for this request. Not cached across calls: the user can
261
292
  * flip the switch in the app at any moment and the next tool call must
262
293
  * respect it. */
@@ -1 +1 @@
1
- {"version":3,"file":"notes.d.ts","sourceRoot":"","sources":["../src/notes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"notes.d.ts","sourceRoot":"","sources":["../src/notes.ts"],"names":[],"mappings":"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"}
package/dist/notes.js CHANGED
@@ -178,6 +178,7 @@ function resolveValues(defs, values, createOption) {
178
178
  export class NotesService {
179
179
  api;
180
180
  vault;
181
+ options;
181
182
  /** Per-unlock cache of decrypted (title, content) keyed by `id:updatedAt`
182
183
  * so re-reading/re-scanning the same note twice in one unlock doesn't
183
184
  * re-run AES-GCM decryption. Cleared whenever the vault locks. */
@@ -223,9 +224,12 @@ export class NotesService {
223
224
  /** Opens shared workspaces' keys for this unlock. Public so the attachment
224
225
  * service built next to this one shares it rather than opening them twice. */
225
226
  keyring;
226
- constructor(api, vault, keyring) {
227
+ constructor(api, vault, keyring,
228
+ /** See AttachmentsService: for the account holder's own surfaces only. */
229
+ options = {}) {
227
230
  this.api = api;
228
231
  this.vault = vault;
232
+ this.options = options;
229
233
  this.vault.onLock = () => this.handleLock();
230
234
  this.keyring = keyring ?? new WorkspaceKeyring(api, vault);
231
235
  }
@@ -778,6 +782,68 @@ export class NotesService {
778
782
  withheld: folders.length - visible.length,
779
783
  };
780
784
  }
785
+ /**
786
+ * Every folder and every note that has attachments, decrypted, for a surface
787
+ * that shows the account's own tree (the desktop drive). Refused unless this
788
+ * service was built with `allFolders`, so no tool path can reach it.
789
+ *
790
+ * The memories tree is left out: the MCP server makes it for AI tools and it
791
+ * holds no files. `attachmentStamp` changes when a note's attachments do, so
792
+ * a caller lists a note's files only when it has to. A note whose key does
793
+ * not open here is left out and counted, never opened with the account key.
794
+ */
795
+ async listDriveCatalog() {
796
+ if (this.options.allFolders !== true)
797
+ throw new Error('The drive catalog is not available here.');
798
+ const key = this.requireSession();
799
+ const { folders: rows } = await this.api.listFolders();
800
+ const exposure = await this.exposureOf(rows);
801
+ const byId = new Map(rows.map((f) => [f.id, f]));
802
+ const inMemories = (folder) => {
803
+ const seen = new Set();
804
+ let current = folder;
805
+ while (current && !seen.has(current.id)) {
806
+ if (current.kind === 'memories')
807
+ return true;
808
+ seen.add(current.id);
809
+ current = current.parentId === null ? undefined : byId.get(current.parentId);
810
+ }
811
+ return false;
812
+ };
813
+ const shown = rows.filter((f) => !inMemories(f));
814
+ const shownIds = new Set(shown.map((f) => f.id));
815
+ const folders = await Promise.all(shown.map(async (f) => ({ id: f.id, name: await this.folderName(key, f), parentId: f.parentId })));
816
+ const notes = [];
817
+ let withheld = 0;
818
+ for (let page = 1, pages = 1; page <= pages; page += 1) {
819
+ const result = await this.api.listNotes({ page, limit: 50, deleted: false, archived: false });
820
+ pages = result.pagination.pages;
821
+ const rowsWithFiles = result.notes.filter((row) => (row.attachmentCount ?? 0) > 0 &&
822
+ row.hidden !== true &&
823
+ !isSystemNote(row) &&
824
+ (row.folderId === null || shownIds.has(row.folderId)));
825
+ const decrypted = await Promise.all(rowsWithFiles.map(async (row) => {
826
+ const rowKey = await this.keyForRowOrNull(key, row, exposure);
827
+ if (rowKey === null)
828
+ return null;
829
+ const title = await this.decryptRow(rowKey, row).then((fields) => fields.title, () => null);
830
+ if (title === null)
831
+ return null;
832
+ const stamp = [...(row.attachments ?? [])]
833
+ .map((a) => `${a.id}:${a.iv}:${a.encryptedTitle}`)
834
+ .sort()
835
+ .join('|');
836
+ return { id: row.id, title, folderId: row.folderId, updatedAt: row.updatedAt, attachmentStamp: stamp };
837
+ }));
838
+ for (const entry of decrypted) {
839
+ if (entry === null)
840
+ withheld += 1;
841
+ else
842
+ notes.push(entry);
843
+ }
844
+ }
845
+ return { folders, notes, withheld };
846
+ }
781
847
  /** Folder exposure for this request. Not cached across calls: the user can
782
848
  * flip the switch in the app at any moment and the next tool call must
783
849
  * respect it. */
@@ -809,8 +875,10 @@ export class NotesService {
809
875
  `/${f.userId ?? ''}/${f.workspaceId ?? ''}/${f.workspaceId ? (workspaceOwners.get(f.workspaceId) ?? '') : ''}`)
810
876
  .join('|');
811
877
  const workspaces = new Map(folders.map((f) => [f.id, f.workspaceId ?? null]));
878
+ const computed = computeExposure(folders, { viewerId, workspaceOwners });
812
879
  return {
813
- ...computeExposure(folders, { viewerId, workspaceOwners }),
880
+ ...computed,
881
+ ...(this.options.allFolders === true ? { allows: () => true, hiddenFolderCount: 0, allHidden: false } : {}),
814
882
  key: `${viewerId}#${key}`,
815
883
  workspaceOf: (folderId) => (folderId === null ? null : (workspaces.get(folderId) ?? null)),
816
884
  hasFolder: (folderId) => workspaces.has(folderId),