brainhub-mcp 0.1.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.
Files changed (156) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +84 -0
  3. package/dist/adapters/claude.d.ts +2 -0
  4. package/dist/adapters/claude.js +50 -0
  5. package/dist/adapters/claude.js.map +1 -0
  6. package/dist/adapters/codex.d.ts +2 -0
  7. package/dist/adapters/codex.js +52 -0
  8. package/dist/adapters/codex.js.map +1 -0
  9. package/dist/adapters/content.d.ts +6 -0
  10. package/dist/adapters/content.js +68 -0
  11. package/dist/adapters/content.js.map +1 -0
  12. package/dist/adapters/grok.d.ts +2 -0
  13. package/dist/adapters/grok.js +44 -0
  14. package/dist/adapters/grok.js.map +1 -0
  15. package/dist/adapters/index.d.ts +31 -0
  16. package/dist/adapters/index.js +111 -0
  17. package/dist/adapters/index.js.map +1 -0
  18. package/dist/adapters/jsonl.d.ts +6 -0
  19. package/dist/adapters/jsonl.js +26 -0
  20. package/dist/adapters/jsonl.js.map +1 -0
  21. package/dist/adapters/types.d.ts +10 -0
  22. package/dist/adapters/types.js +2 -0
  23. package/dist/adapters/types.js.map +1 -0
  24. package/dist/auth/account-status.d.ts +50 -0
  25. package/dist/auth/account-status.js +59 -0
  26. package/dist/auth/account-status.js.map +1 -0
  27. package/dist/auth/google-account.d.ts +21 -0
  28. package/dist/auth/google-account.js +45 -0
  29. package/dist/auth/google-account.js.map +1 -0
  30. package/dist/auth/google-oauth.d.ts +35 -0
  31. package/dist/auth/google-oauth.js +191 -0
  32. package/dist/auth/google-oauth.js.map +1 -0
  33. package/dist/auth/oauth-loopback.d.ts +10 -0
  34. package/dist/auth/oauth-loopback.js +81 -0
  35. package/dist/auth/oauth-loopback.js.map +1 -0
  36. package/dist/auth/official-oauth-client.d.ts +5 -0
  37. package/dist/auth/official-oauth-client.js +6 -0
  38. package/dist/auth/official-oauth-client.js.map +1 -0
  39. package/dist/auth/platform-secrets.d.ts +14 -0
  40. package/dist/auth/platform-secrets.js +81 -0
  41. package/dist/auth/platform-secrets.js.map +1 -0
  42. package/dist/auth/secret-store-factory.d.ts +11 -0
  43. package/dist/auth/secret-store-factory.js +37 -0
  44. package/dist/auth/secret-store-factory.js.map +1 -0
  45. package/dist/auth/secret-store.d.ts +13 -0
  46. package/dist/auth/secret-store.js +40 -0
  47. package/dist/auth/secret-store.js.map +1 -0
  48. package/dist/capture/images.d.ts +11 -0
  49. package/dist/capture/images.js +27 -0
  50. package/dist/capture/images.js.map +1 -0
  51. package/dist/capture/normalize.d.ts +11 -0
  52. package/dist/capture/normalize.js +43 -0
  53. package/dist/capture/normalize.js.map +1 -0
  54. package/dist/capture/redact.d.ts +10 -0
  55. package/dist/capture/redact.js +60 -0
  56. package/dist/capture/redact.js.map +1 -0
  57. package/dist/cli/index.d.ts +20 -0
  58. package/dist/cli/index.js +781 -0
  59. package/dist/cli/index.js.map +1 -0
  60. package/dist/clients/registry.d.ts +24 -0
  61. package/dist/clients/registry.js +105 -0
  62. package/dist/clients/registry.js.map +1 -0
  63. package/dist/domain/config-io.d.ts +15 -0
  64. package/dist/domain/config-io.js +168 -0
  65. package/dist/domain/config-io.js.map +1 -0
  66. package/dist/domain/config.d.ts +74 -0
  67. package/dist/domain/config.js +130 -0
  68. package/dist/domain/config.js.map +1 -0
  69. package/dist/domain/errors.d.ts +6 -0
  70. package/dist/domain/errors.js +11 -0
  71. package/dist/domain/errors.js.map +1 -0
  72. package/dist/domain/session.d.ts +62 -0
  73. package/dist/domain/session.js +47 -0
  74. package/dist/domain/session.js.map +1 -0
  75. package/dist/drive/drive-port.d.ts +51 -0
  76. package/dist/drive/drive-port.js +2 -0
  77. package/dist/drive/drive-port.js.map +1 -0
  78. package/dist/drive/google-drive.d.ts +28 -0
  79. package/dist/drive/google-drive.js +501 -0
  80. package/dist/drive/google-drive.js.map +1 -0
  81. package/dist/drive/memory-drive.d.ts +19 -0
  82. package/dist/drive/memory-drive.js +148 -0
  83. package/dist/drive/memory-drive.js.map +1 -0
  84. package/dist/drive/scoped-drive.d.ts +17 -0
  85. package/dist/drive/scoped-drive.js +115 -0
  86. package/dist/drive/scoped-drive.js.map +1 -0
  87. package/dist/mcp/server.d.ts +55 -0
  88. package/dist/mcp/server.js +133 -0
  89. package/dist/mcp/server.js.map +1 -0
  90. package/dist/portrait/obsidian.d.ts +7 -0
  91. package/dist/portrait/obsidian.js +16 -0
  92. package/dist/portrait/obsidian.js.map +1 -0
  93. package/dist/portrait/portrait-service.d.ts +12 -0
  94. package/dist/portrait/portrait-service.js +18 -0
  95. package/dist/portrait/portrait-service.js.map +1 -0
  96. package/dist/portrait/portrait-sync-service.d.ts +21 -0
  97. package/dist/portrait/portrait-sync-service.js +43 -0
  98. package/dist/portrait/portrait-sync-service.js.map +1 -0
  99. package/dist/runtime/command.d.ts +4 -0
  100. package/dist/runtime/command.js +2 -0
  101. package/dist/runtime/command.js.map +1 -0
  102. package/dist/runtime/container.d.ts +72 -0
  103. package/dist/runtime/container.js +361 -0
  104. package/dist/runtime/container.js.map +1 -0
  105. package/dist/scheduler/jobs.d.ts +2 -0
  106. package/dist/scheduler/jobs.js +7 -0
  107. package/dist/scheduler/jobs.js.map +1 -0
  108. package/dist/scheduler/launchd.d.ts +7 -0
  109. package/dist/scheduler/launchd.js +40 -0
  110. package/dist/scheduler/launchd.js.map +1 -0
  111. package/dist/scheduler/manager.d.ts +26 -0
  112. package/dist/scheduler/manager.js +113 -0
  113. package/dist/scheduler/manager.js.map +1 -0
  114. package/dist/search/chunk-text.d.ts +11 -0
  115. package/dist/search/chunk-text.js +40 -0
  116. package/dist/search/chunk-text.js.map +1 -0
  117. package/dist/search/e5-embedder.d.ts +19 -0
  118. package/dist/search/e5-embedder.js +71 -0
  119. package/dist/search/e5-embedder.js.map +1 -0
  120. package/dist/search/embedder.d.ts +8 -0
  121. package/dist/search/embedder.js +5 -0
  122. package/dist/search/embedder.js.map +1 -0
  123. package/dist/search/model-cache.d.ts +7 -0
  124. package/dist/search/model-cache.js +38 -0
  125. package/dist/search/model-cache.js.map +1 -0
  126. package/dist/search/search-service.d.ts +46 -0
  127. package/dist/search/search-service.js +319 -0
  128. package/dist/search/search-service.js.map +1 -0
  129. package/dist/setup/backfill-service.d.ts +33 -0
  130. package/dist/setup/backfill-service.js +47 -0
  131. package/dist/setup/backfill-service.js.map +1 -0
  132. package/dist/setup/setup-service.d.ts +65 -0
  133. package/dist/setup/setup-service.js +90 -0
  134. package/dist/setup/setup-service.js.map +1 -0
  135. package/dist/setup/uninstall-service.d.ts +34 -0
  136. package/dist/setup/uninstall-service.js +91 -0
  137. package/dist/setup/uninstall-service.js.map +1 -0
  138. package/dist/state/sqlite-store.d.ts +19 -0
  139. package/dist/state/sqlite-store.js +299 -0
  140. package/dist/state/sqlite-store.js.map +1 -0
  141. package/dist/state/store.d.ts +52 -0
  142. package/dist/state/store.js +2 -0
  143. package/dist/state/store.js.map +1 -0
  144. package/dist/status/status-service.d.ts +38 -0
  145. package/dist/status/status-service.js +93 -0
  146. package/dist/status/status-service.js.map +1 -0
  147. package/dist/update/update-check-service.d.ts +38 -0
  148. package/dist/update/update-check-service.js +105 -0
  149. package/dist/update/update-check-service.js.map +1 -0
  150. package/dist/upload/lock.d.ts +7 -0
  151. package/dist/upload/lock.js +68 -0
  152. package/dist/upload/lock.js.map +1 -0
  153. package/dist/upload/upload-service.d.ts +36 -0
  154. package/dist/upload/upload-service.js +360 -0
  155. package/dist/upload/upload-service.js.map +1 -0
  156. package/package.json +82 -0
@@ -0,0 +1,501 @@
1
+ import { Readable } from "node:stream";
2
+ import { posix } from "node:path";
3
+ import { BrainHubError } from "../domain/errors.js";
4
+ const folderMimeType = "application/vnd.google-apps.folder";
5
+ const googleDocumentMimeType = "application/vnd.google-apps.document";
6
+ const fileFields = "id,name,mimeType,parents,size,modifiedTime,appProperties,version,trashed";
7
+ export class DriveRootConflictError extends BrainHubError {
8
+ candidates;
9
+ constructor(candidates) {
10
+ super("DRIVE_ROOT_CONFLICT", `Multiple brain-hub folders exist; choose one of: ${candidates.join(", ")}`);
11
+ this.candidates = candidates;
12
+ }
13
+ }
14
+ function safePath(value) {
15
+ if (!value || value.startsWith("/") || value.includes("\\")) {
16
+ throw new BrainHubError("INVALID_INPUT", "Drive path must be relative to the BrainHub root");
17
+ }
18
+ const normalized = posix.normalize(value);
19
+ if (normalized === ".." ||
20
+ normalized.startsWith("../") ||
21
+ normalized === ".") {
22
+ throw new BrainHubError("INVALID_INPUT", "Drive path escapes the BrainHub root");
23
+ }
24
+ return normalized;
25
+ }
26
+ function escapeQuery(value) {
27
+ return value.replaceAll("\\", "\\\\").replaceAll("'", "\\'");
28
+ }
29
+ function headerValue(headers, name) {
30
+ if (!headers || typeof headers !== "object")
31
+ return undefined;
32
+ const getter = headers.get;
33
+ if (typeof getter === "function") {
34
+ const value = getter.call(headers, name);
35
+ return typeof value === "string" ? value : undefined;
36
+ }
37
+ const value = headers[name];
38
+ return typeof value === "string" ? value : undefined;
39
+ }
40
+ function isMissingOrOutsideRoot(error) {
41
+ return ((error instanceof BrainHubError && error.code === "INVALID_INPUT") ||
42
+ error?.code === 404);
43
+ }
44
+ export class GoogleDrive {
45
+ #client;
46
+ #rootFolderId;
47
+ #folderCreations = new Map();
48
+ constructor(options) {
49
+ if (!options.rootFolderId) {
50
+ throw new BrainHubError("DRIVE_ROOT_REQUIRED", "Drive root folder is not configured");
51
+ }
52
+ this.#client = options.client;
53
+ this.#rootFolderId = options.rootFolderId;
54
+ }
55
+ static async openMyDrive(client) {
56
+ const response = await client.files.get({
57
+ fileId: "root",
58
+ fields: "id",
59
+ supportsAllDrives: true,
60
+ });
61
+ if (!response.data.id) {
62
+ throw new BrainHubError("DRIVE_ROOT_REQUIRED", "Google Drive did not return the My Drive root ID");
63
+ }
64
+ return new GoogleDrive({ client, rootFolderId: response.data.id });
65
+ }
66
+ static async createRoot(client, name, selectedId) {
67
+ const q = `'root' in parents and name = '${escapeQuery(name)}' and mimeType = '${folderMimeType}' and trashed = false`;
68
+ const existing = await client.files.list({
69
+ q,
70
+ fields: "files(id)",
71
+ pageSize: 1_000,
72
+ spaces: "drive",
73
+ });
74
+ const candidates = (existing.data.files ?? [])
75
+ .flatMap((file) => (file.id ? [file.id] : []))
76
+ .sort();
77
+ if (selectedId) {
78
+ if (candidates.includes(selectedId))
79
+ return selectedId;
80
+ throw new BrainHubError("INVALID_INPUT", `Selected Drive root ${selectedId} is not a matching ${name} folder`);
81
+ }
82
+ if (candidates.length > 1)
83
+ throw new DriveRootConflictError(candidates);
84
+ if (candidates[0])
85
+ return candidates[0];
86
+ const created = await client.files.create({
87
+ requestBody: { name, mimeType: folderMimeType, parents: ["root"] },
88
+ fields: "id",
89
+ });
90
+ if (!created.data.id)
91
+ throw new Error("Google Drive did not return a root folder ID");
92
+ return created.data.id;
93
+ }
94
+ async #metadataResponse(id) {
95
+ return this.#client.files.get({
96
+ fileId: id,
97
+ fields: fileFields,
98
+ supportsAllDrives: true,
99
+ });
100
+ }
101
+ async #metadata(id) {
102
+ return (await this.#metadataResponse(id)).data;
103
+ }
104
+ async #assertDescendant(id) {
105
+ let current = id;
106
+ const visited = new Set();
107
+ while (current !== this.#rootFolderId) {
108
+ if (visited.has(current))
109
+ throw new Error("Drive parent cycle detected");
110
+ visited.add(current);
111
+ const metadata = await this.#metadata(current);
112
+ const parent = metadata.parents?.[0];
113
+ if (!parent)
114
+ throw new BrainHubError("INVALID_INPUT", "Drive object is outside the BrainHub root");
115
+ current = parent;
116
+ }
117
+ }
118
+ async #children(parentId) {
119
+ const files = [];
120
+ let pageToken;
121
+ do {
122
+ const response = await this.#client.files.list({
123
+ q: `'${escapeQuery(parentId)}' in parents and trashed = false`,
124
+ fields: `nextPageToken,files(${fileFields})`,
125
+ pageSize: 1_000,
126
+ ...(pageToken ? { pageToken } : {}),
127
+ spaces: "drive",
128
+ includeItemsFromAllDrives: true,
129
+ supportsAllDrives: true,
130
+ });
131
+ files.push(...(response.data.files ?? []));
132
+ pageToken = response.data.nextPageToken ?? undefined;
133
+ } while (pageToken);
134
+ return files;
135
+ }
136
+ async #namedChildren(parentId, name) {
137
+ const files = [];
138
+ let pageToken;
139
+ do {
140
+ const response = await this.#client.files.list({
141
+ q: `'${escapeQuery(parentId)}' in parents and name = '${escapeQuery(name)}' and trashed = false`,
142
+ fields: `nextPageToken,files(${fileFields})`,
143
+ pageSize: 1_000,
144
+ ...(pageToken ? { pageToken } : {}),
145
+ spaces: "drive",
146
+ includeItemsFromAllDrives: true,
147
+ supportsAllDrives: true,
148
+ });
149
+ files.push(...(response.data.files ?? []));
150
+ pageToken = response.data.nextPageToken ?? undefined;
151
+ } while (pageToken);
152
+ return files
153
+ .filter((file) => file.name === name)
154
+ .sort((left, right) => String(right.id).localeCompare(String(left.id)));
155
+ }
156
+ async #namedChild(parentId, name) {
157
+ return (await this.#namedChildren(parentId, name))[0] ?? null;
158
+ }
159
+ async #resolveAll(path) {
160
+ const segments = safePath(path).split("/");
161
+ let parentIds = [this.#rootFolderId];
162
+ let found = [];
163
+ for (const [index, segment] of segments.entries()) {
164
+ found = (await Promise.all(parentIds.map((parentId) => this.#namedChildren(parentId, segment)))).flat();
165
+ if (index < segments.length - 1) {
166
+ found = found.filter((file) => file.mimeType === folderMimeType);
167
+ }
168
+ const unique = new Map(found.filter((file) => file.id).map((file) => [file.id, file]));
169
+ found = [...unique.values()];
170
+ parentIds = [...unique.keys()];
171
+ if (parentIds.length === 0)
172
+ return [];
173
+ }
174
+ return found;
175
+ }
176
+ async #resolve(path) {
177
+ const normalized = safePath(path);
178
+ let parent = this.#rootFolderId;
179
+ let found = null;
180
+ for (const segment of normalized.split("/")) {
181
+ found = await this.#namedChild(parent, segment);
182
+ if (!found?.id)
183
+ return null;
184
+ parent = found.id;
185
+ }
186
+ return found;
187
+ }
188
+ async #ensureFolder(path) {
189
+ if (!path)
190
+ return this.#rootFolderId;
191
+ const normalized = safePath(path);
192
+ let parent = this.#rootFolderId;
193
+ let currentPath = "";
194
+ for (const segment of normalized.split("/")) {
195
+ currentPath = currentPath ? `${currentPath}/${segment}` : segment;
196
+ let creation = this.#folderCreations.get(currentPath);
197
+ if (!creation) {
198
+ creation = this.#findOrCreateFolder(parent, segment);
199
+ this.#folderCreations.set(currentPath, creation);
200
+ }
201
+ try {
202
+ parent = await creation;
203
+ }
204
+ finally {
205
+ if (this.#folderCreations.get(currentPath) === creation) {
206
+ this.#folderCreations.delete(currentPath);
207
+ }
208
+ }
209
+ }
210
+ return parent;
211
+ }
212
+ async #findOrCreateFolder(parent, name) {
213
+ const child = (await this.#children(parent)).find((file) => file.name === name && file.mimeType === folderMimeType);
214
+ if (child?.id)
215
+ return child.id;
216
+ const created = await this.#client.files.create({
217
+ requestBody: {
218
+ name,
219
+ mimeType: folderMimeType,
220
+ parents: [parent],
221
+ },
222
+ fields: "id",
223
+ supportsAllDrives: true,
224
+ });
225
+ if (!created.data.id)
226
+ throw new Error("Google Drive did not return a folder ID");
227
+ return created.data.id;
228
+ }
229
+ async #entry(file, path, etag) {
230
+ if (!file.id)
231
+ throw new Error("Google Drive file is missing an ID");
232
+ return {
233
+ id: file.id,
234
+ path,
235
+ mimeType: file.mimeType ?? "application/octet-stream",
236
+ size: Number(file.size ?? 0),
237
+ modifiedTime: file.modifiedTime ?? new Date(0).toISOString(),
238
+ etag: etag ?? String(file.version ?? ""),
239
+ appProperties: file.appProperties ?? {},
240
+ };
241
+ }
242
+ async #walkFrom(rootId, rootPath) {
243
+ const output = [];
244
+ const queue = [
245
+ { id: rootId, path: rootPath },
246
+ ];
247
+ while (queue.length > 0) {
248
+ const current = queue.shift();
249
+ for (const file of await this.#children(current.id)) {
250
+ if (!file.id || !file.name)
251
+ continue;
252
+ const path = current.path ? `${current.path}/${file.name}` : file.name;
253
+ if (file.mimeType === folderMimeType)
254
+ queue.push({ id: file.id, path });
255
+ else
256
+ output.push({ file, path });
257
+ }
258
+ }
259
+ return output;
260
+ }
261
+ async #walk() {
262
+ return this.#walkFrom(this.#rootFolderId, "");
263
+ }
264
+ async list(query) {
265
+ if (query.prefix)
266
+ safePath(query.prefix.replace(/\/$/u, "") || "invalid");
267
+ let files;
268
+ if (query.prefix) {
269
+ const prefix = query.prefix.replace(/\/$/u, "");
270
+ const roots = await this.#resolveAll(prefix);
271
+ if (roots.length === 0)
272
+ return [];
273
+ files = (await Promise.all(roots.map((root) => root.id && root.mimeType === folderMimeType
274
+ ? this.#walkFrom(root.id, prefix)
275
+ : Promise.resolve([{ file: root, path: prefix }])))).flat();
276
+ }
277
+ else if (query.appProperty) {
278
+ const { key, value } = query.appProperty;
279
+ const response = await this.#client.files.list({
280
+ q: `appProperties has { key='${escapeQuery(key)}' and value='${escapeQuery(value)}' } and trashed = false`,
281
+ fields: `files(${fileFields})`,
282
+ pageSize: 1_000,
283
+ spaces: "drive",
284
+ includeItemsFromAllDrives: true,
285
+ supportsAllDrives: true,
286
+ });
287
+ files = [];
288
+ for (const file of response.data.files ?? []) {
289
+ if (!file.id)
290
+ continue;
291
+ try {
292
+ await this.#assertDescendant(file.id);
293
+ }
294
+ catch {
295
+ continue;
296
+ }
297
+ files.push({ file, path: await this.#pathFor(file.id) });
298
+ }
299
+ }
300
+ else {
301
+ files = await this.#walk();
302
+ }
303
+ return Promise.all(files
304
+ .filter(({ path }) => !query.prefix || path.startsWith(query.prefix))
305
+ .filter(({ file }) => !query.appProperty ||
306
+ file.appProperties?.[query.appProperty.key] ===
307
+ query.appProperty.value)
308
+ .filter(({ file }) => !query.modifiedAfter ||
309
+ (file.modifiedTime ?? "") > query.modifiedAfter)
310
+ .map(({ file, path }) => this.#entry(file, path)));
311
+ }
312
+ async changes(query) {
313
+ const prefix = safePath(query.prefix.replace(/\/$/u, "") || "invalid");
314
+ const normalizedPrefix = `${prefix}/`;
315
+ if (query.cursor === undefined) {
316
+ const token = await this.#client.changes.getStartPageToken({
317
+ supportsAllDrives: true,
318
+ });
319
+ if (!token.data.startPageToken) {
320
+ throw new Error("Google Drive did not return a change cursor");
321
+ }
322
+ return {
323
+ entries: await this.list({ prefix: normalizedPrefix }),
324
+ removedIds: [],
325
+ cursor: token.data.startPageToken,
326
+ reset: true,
327
+ };
328
+ }
329
+ const entries = new Map();
330
+ const removedIds = new Set();
331
+ let pageToken = query.cursor;
332
+ let cursor = query.cursor;
333
+ let requiresReset = false;
334
+ try {
335
+ do {
336
+ const response = await this.#client.changes.list({
337
+ pageToken,
338
+ fields: `nextPageToken,newStartPageToken,changes(fileId,removed,file(${fileFields}))`,
339
+ pageSize: 1_000,
340
+ spaces: "drive",
341
+ includeItemsFromAllDrives: true,
342
+ supportsAllDrives: true,
343
+ });
344
+ for (const change of response.data.changes ?? []) {
345
+ const id = change.fileId ?? change.file?.id;
346
+ if (!id)
347
+ continue;
348
+ if (change.file?.mimeType === folderMimeType) {
349
+ requiresReset = true;
350
+ continue;
351
+ }
352
+ if (change.removed || change.file?.trashed) {
353
+ entries.delete(id);
354
+ removedIds.add(id);
355
+ continue;
356
+ }
357
+ try {
358
+ const path = await this.#pathFor(id);
359
+ if (!path.startsWith(normalizedPrefix)) {
360
+ entries.delete(id);
361
+ removedIds.add(id);
362
+ continue;
363
+ }
364
+ const metadata = change.file ?? (await this.#metadata(id));
365
+ entries.set(id, await this.#entry(metadata, path));
366
+ removedIds.delete(id);
367
+ }
368
+ catch (error) {
369
+ if (!isMissingOrOutsideRoot(error))
370
+ throw error;
371
+ entries.delete(id);
372
+ removedIds.add(id);
373
+ }
374
+ }
375
+ pageToken = response.data.nextPageToken ?? undefined;
376
+ cursor = response.data.newStartPageToken ?? pageToken ?? cursor;
377
+ } while (pageToken);
378
+ }
379
+ catch (error) {
380
+ if (error.code === 410) {
381
+ return this.changes({ prefix: normalizedPrefix });
382
+ }
383
+ throw error;
384
+ }
385
+ if (requiresReset) {
386
+ return {
387
+ entries: await this.list({ prefix: normalizedPrefix }),
388
+ removedIds: [],
389
+ cursor,
390
+ reset: true,
391
+ };
392
+ }
393
+ return {
394
+ entries: [...entries.values()].sort((left, right) => left.path.localeCompare(right.path)),
395
+ removedIds: [...removedIds].sort(),
396
+ cursor,
397
+ reset: false,
398
+ };
399
+ }
400
+ async #pathFor(id) {
401
+ const segments = [];
402
+ let current = id;
403
+ while (current !== this.#rootFolderId) {
404
+ const file = await this.#metadata(current);
405
+ if (!file.name || !file.parents?.[0]) {
406
+ throw new BrainHubError("INVALID_INPUT", "Drive object is outside the BrainHub root");
407
+ }
408
+ segments.unshift(file.name);
409
+ current = file.parents[0];
410
+ }
411
+ return segments.join("/");
412
+ }
413
+ async put(input) {
414
+ const path = safePath(input.path);
415
+ const parent = await this.#ensureFolder(posix.dirname(path) === "." ? "" : posix.dirname(path));
416
+ const response = await this.#client.files.create({
417
+ requestBody: {
418
+ name: posix.basename(path),
419
+ parents: [parent],
420
+ ...(input.appProperties ? { appProperties: input.appProperties } : {}),
421
+ },
422
+ media: { mimeType: input.mimeType, body: Readable.from(input.bytes) },
423
+ fields: fileFields,
424
+ supportsAllDrives: true,
425
+ });
426
+ return this.#entry(response.data, path);
427
+ }
428
+ async upsert(input) {
429
+ const path = safePath(input.path);
430
+ const existing = await this.#resolve(path);
431
+ if (!existing?.id)
432
+ return this.put(input);
433
+ await this.#assertDescendant(existing.id);
434
+ const current = await this.#metadataResponse(existing.id);
435
+ const currentEtag = headerValue(current.headers, "etag");
436
+ if (input.ifMatch && currentEtag !== input.ifMatch) {
437
+ const error = new Error("Drive precondition failed");
438
+ error.code = 412;
439
+ throw error;
440
+ }
441
+ const response = await this.#client.files.update({
442
+ fileId: existing.id,
443
+ requestBody: input.appProperties
444
+ ? { appProperties: input.appProperties }
445
+ : {},
446
+ media: { mimeType: input.mimeType, body: Readable.from(input.bytes) },
447
+ fields: fileFields,
448
+ supportsAllDrives: true,
449
+ }, input.ifMatch ? { headers: { "If-Match": input.ifMatch } } : undefined);
450
+ return this.#entry(response.data, path);
451
+ }
452
+ async read(id) {
453
+ await this.#assertDescendant(id);
454
+ const metadata = await this.#metadataResponse(id);
455
+ const content = metadata.data.mimeType === googleDocumentMimeType
456
+ ? await this.#client.files.export({ fileId: id, mimeType: "text/markdown" }, { responseType: "arraybuffer" })
457
+ : await this.#client.files.get({ fileId: id, alt: "media", supportsAllDrives: true }, { responseType: "arraybuffer" });
458
+ const path = await this.#pathFor(id);
459
+ return {
460
+ ...(await this.#entry(metadata.data, path, headerValue(metadata.headers, "etag"))),
461
+ bytes: Buffer.from(content.data),
462
+ };
463
+ }
464
+ async readPath(path) {
465
+ const file = await this.#resolve(path);
466
+ return file?.id ? this.read(file.id) : null;
467
+ }
468
+ async move(id, pathValue) {
469
+ const path = safePath(pathValue);
470
+ await this.#assertDescendant(id);
471
+ const metadata = await this.#metadata(id);
472
+ const parent = await this.#ensureFolder(posix.dirname(path) === "." ? "" : posix.dirname(path));
473
+ const response = await this.#client.files.update({
474
+ fileId: id,
475
+ addParents: parent,
476
+ ...(metadata.parents?.length
477
+ ? { removeParents: metadata.parents.join(",") }
478
+ : {}),
479
+ requestBody: { name: posix.basename(path) },
480
+ fields: fileFields,
481
+ supportsAllDrives: true,
482
+ });
483
+ return this.#entry(response.data, path);
484
+ }
485
+ async trash(id) {
486
+ await this.#assertDescendant(id);
487
+ await this.#client.files.update({
488
+ fileId: id,
489
+ requestBody: { trashed: true },
490
+ supportsAllDrives: true,
491
+ });
492
+ }
493
+ async quota() {
494
+ const response = await this.#client.about.get({ fields: "storageQuota" });
495
+ return {
496
+ usedBytes: Number(response.data.storageQuota?.usage ?? 0),
497
+ totalBytes: Number(response.data.storageQuota?.limit ?? 0),
498
+ };
499
+ }
500
+ }
501
+ //# sourceMappingURL=google-drive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-drive.js","sourceRoot":"","sources":["../../src/drive/google-drive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { DriveEntry, DriveChanges, DriveListQuery, DriveObject, DrivePort, DrivePutInput, DriveQuota } from "./drive-port.js";
2
+ export declare class MemoryDrive implements DrivePort {
3
+ #private;
4
+ constructor(options?: {
5
+ corruptReads?: boolean;
6
+ });
7
+ list(query: DriveListQuery): Promise<DriveEntry[]>;
8
+ put(input: DrivePutInput): Promise<DriveEntry>;
9
+ upsert(input: DrivePutInput): Promise<DriveEntry>;
10
+ changes(query: {
11
+ prefix: string;
12
+ cursor?: string;
13
+ }): Promise<DriveChanges>;
14
+ read(id: string): Promise<DriveObject>;
15
+ readPath(path: string): Promise<DriveObject | null>;
16
+ move(id: string, path: string): Promise<DriveEntry>;
17
+ trash(id: string): Promise<void>;
18
+ quota(): Promise<DriveQuota>;
19
+ }