@mcp-z/mcp-drive 1.0.8 → 1.0.10
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/cjs/constants.js.map +1 -1
- package/dist/cjs/index.js +10 -24
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/lib/create-store.js +2 -5
- package/dist/cjs/lib/create-store.js.map +1 -1
- package/dist/cjs/lib/file-streaming.d.cts +35 -0
- package/dist/cjs/lib/file-streaming.d.ts +35 -0
- package/dist/cjs/lib/file-streaming.js +289 -0
- package/dist/cjs/lib/file-streaming.js.map +1 -0
- package/dist/cjs/lib/query-builder.js.map +1 -1
- package/dist/cjs/mcp/index.js +8 -19
- package/dist/cjs/mcp/index.js.map +1 -1
- package/dist/cjs/mcp/prompts/index.js.map +1 -1
- package/dist/cjs/mcp/prompts/organize-files.js +3 -6
- package/dist/cjs/mcp/prompts/organize-files.js.map +1 -1
- package/dist/cjs/mcp/prompts/query-syntax.js +3 -6
- package/dist/cjs/mcp/prompts/query-syntax.js.map +1 -1
- package/dist/cjs/mcp/resources/file.js +3 -6
- package/dist/cjs/mcp/resources/file.js.map +1 -1
- package/dist/cjs/mcp/resources/index.js.map +1 -1
- package/dist/cjs/mcp/tools/file-move-to-trash.js +5 -11
- package/dist/cjs/mcp/tools/file-move-to-trash.js.map +1 -1
- package/dist/cjs/mcp/tools/file-move.js +11 -18
- package/dist/cjs/mcp/tools/file-move.js.map +1 -1
- package/dist/cjs/mcp/tools/file-upload.d.cts +69 -0
- package/dist/cjs/mcp/tools/file-upload.d.ts +69 -0
- package/dist/cjs/mcp/tools/file-upload.js +387 -0
- package/dist/cjs/mcp/tools/file-upload.js.map +1 -0
- package/dist/cjs/mcp/tools/files-search.js +7 -14
- package/dist/cjs/mcp/tools/files-search.js.map +1 -1
- package/dist/cjs/mcp/tools/folder-contents.js +7 -14
- package/dist/cjs/mcp/tools/folder-contents.js.map +1 -1
- package/dist/cjs/mcp/tools/folder-create.js +5 -11
- package/dist/cjs/mcp/tools/folder-create.js.map +1 -1
- package/dist/cjs/mcp/tools/folder-path.js +4 -8
- package/dist/cjs/mcp/tools/folder-path.js.map +1 -1
- package/dist/cjs/mcp/tools/folder-search.js +19 -24
- package/dist/cjs/mcp/tools/folder-search.js.map +1 -1
- package/dist/cjs/mcp/tools/index.d.cts +1 -0
- package/dist/cjs/mcp/tools/index.d.ts +1 -0
- package/dist/cjs/mcp/tools/index.js +4 -0
- package/dist/cjs/mcp/tools/index.js.map +1 -1
- package/dist/cjs/schemas/drive-query-schema.js +2 -3
- package/dist/cjs/schemas/drive-query-schema.js.map +1 -1
- package/dist/cjs/schemas/drive-validation.js.map +1 -1
- package/dist/cjs/schemas/index.js.map +1 -1
- package/dist/cjs/setup/config.js +11 -25
- package/dist/cjs/setup/config.js.map +1 -1
- package/dist/cjs/setup/http.js +15 -16
- package/dist/cjs/setup/http.js.map +1 -1
- package/dist/cjs/setup/index.js.map +1 -1
- package/dist/cjs/setup/oauth-google.js +9 -16
- package/dist/cjs/setup/oauth-google.js.map +1 -1
- package/dist/cjs/setup/runtime.d.cts +1 -1
- package/dist/cjs/setup/runtime.d.ts +1 -1
- package/dist/cjs/setup/runtime.js +11 -25
- package/dist/cjs/setup/runtime.js.map +1 -1
- package/dist/cjs/setup/stdio.js +15 -16
- package/dist/cjs/setup/stdio.js.map +1 -1
- package/dist/esm/constants.js.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/create-store.js.map +1 -1
- package/dist/esm/lib/file-streaming.d.ts +35 -0
- package/dist/esm/lib/file-streaming.js +111 -0
- package/dist/esm/lib/file-streaming.js.map +1 -0
- package/dist/esm/lib/query-builder.js.map +1 -1
- package/dist/esm/mcp/index.js.map +1 -1
- package/dist/esm/mcp/prompts/index.js.map +1 -1
- package/dist/esm/mcp/prompts/organize-files.js.map +1 -1
- package/dist/esm/mcp/prompts/query-syntax.js.map +1 -1
- package/dist/esm/mcp/resources/file.js.map +1 -1
- package/dist/esm/mcp/resources/index.js.map +1 -1
- package/dist/esm/mcp/tools/file-move-to-trash.js.map +1 -1
- package/dist/esm/mcp/tools/file-move.js.map +1 -1
- package/dist/esm/mcp/tools/file-upload.d.ts +69 -0
- package/dist/esm/mcp/tools/file-upload.js +163 -0
- package/dist/esm/mcp/tools/file-upload.js.map +1 -0
- package/dist/esm/mcp/tools/files-search.js.map +1 -1
- package/dist/esm/mcp/tools/folder-contents.js.map +1 -1
- package/dist/esm/mcp/tools/folder-create.js.map +1 -1
- package/dist/esm/mcp/tools/folder-path.js.map +1 -1
- package/dist/esm/mcp/tools/folder-search.js.map +1 -1
- package/dist/esm/mcp/tools/index.d.ts +1 -0
- package/dist/esm/mcp/tools/index.js +1 -0
- package/dist/esm/mcp/tools/index.js.map +1 -1
- package/dist/esm/schemas/drive-query-schema.js.map +1 -1
- package/dist/esm/schemas/drive-validation.js.map +1 -1
- package/dist/esm/schemas/index.js.map +1 -1
- package/dist/esm/setup/config.js.map +1 -1
- package/dist/esm/setup/http.js.map +1 -1
- package/dist/esm/setup/index.js.map +1 -1
- package/dist/esm/setup/oauth-google.js.map +1 -1
- package/dist/esm/setup/runtime.d.ts +1 -1
- package/dist/esm/setup/runtime.js.map +1 -1
- package/dist/esm/setup/stdio.js.map +1 -1
- package/dist/esm/types.js.map +1 -1
- package/package.json +10 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-drive/src/constants.ts"],"sourcesContent":["/**\n * Drive MCP Server Constants\n *\n * These scopes are required for Google Drive functionality and are hardcoded\n * rather than externally configured since this server knows its own requirements.\n */\n\n// Google OAuth scopes required for Drive operations\nexport const GOOGLE_SCOPE = 'openid https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/drive';\n"],"names":["GOOGLE_SCOPE"],"mappings":"AAAA;;;;;CAKC,GAED,oDAAoD;;;;;+BACvCA;;;eAAAA;;;AAAN,IAAMA,eAAe"}
|
package/dist/cjs/index.js
CHANGED
|
@@ -44,11 +44,8 @@ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
|
44
44
|
reject(error);
|
|
45
45
|
return;
|
|
46
46
|
}
|
|
47
|
-
if (info.done)
|
|
48
|
-
|
|
49
|
-
} else {
|
|
50
|
-
Promise.resolve(value).then(_next, _throw);
|
|
51
|
-
}
|
|
47
|
+
if (info.done) resolve(value);
|
|
48
|
+
else Promise.resolve(value).then(_next, _throw);
|
|
52
49
|
}
|
|
53
50
|
function _async_to_generator(fn) {
|
|
54
51
|
return function() {
|
|
@@ -87,18 +84,12 @@ function _getRequireWildcardCache(nodeInterop) {
|
|
|
87
84
|
})(nodeInterop);
|
|
88
85
|
}
|
|
89
86
|
function _interop_require_wildcard(obj, nodeInterop) {
|
|
90
|
-
if (!nodeInterop && obj && obj.__esModule)
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
return {
|
|
95
|
-
default: obj
|
|
96
|
-
};
|
|
97
|
-
}
|
|
87
|
+
if (!nodeInterop && obj && obj.__esModule) return obj;
|
|
88
|
+
if (obj === null || typeof obj !== "object" && typeof obj !== "function") return {
|
|
89
|
+
default: obj
|
|
90
|
+
};
|
|
98
91
|
var cache = _getRequireWildcardCache(nodeInterop);
|
|
99
|
-
if (cache && cache.has(obj))
|
|
100
|
-
return cache.get(obj);
|
|
101
|
-
}
|
|
92
|
+
if (cache && cache.has(obj)) return cache.get(obj);
|
|
102
93
|
var newObj = {
|
|
103
94
|
__proto__: null
|
|
104
95
|
};
|
|
@@ -106,17 +97,12 @@ function _interop_require_wildcard(obj, nodeInterop) {
|
|
|
106
97
|
for(var key in obj){
|
|
107
98
|
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
108
99
|
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
109
|
-
if (desc && (desc.get || desc.set))
|
|
110
|
-
|
|
111
|
-
} else {
|
|
112
|
-
newObj[key] = obj[key];
|
|
113
|
-
}
|
|
100
|
+
if (desc && (desc.get || desc.set)) Object.defineProperty(newObj, key, desc);
|
|
101
|
+
else newObj[key] = obj[key];
|
|
114
102
|
}
|
|
115
103
|
}
|
|
116
104
|
newObj.default = obj;
|
|
117
|
-
if (cache)
|
|
118
|
-
cache.set(obj, newObj);
|
|
119
|
-
}
|
|
105
|
+
if (cache) cache.set(obj, newObj);
|
|
120
106
|
return newObj;
|
|
121
107
|
}
|
|
122
108
|
function _ts_generator(thisArg, body) {
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-drive/src/index.ts"],"sourcesContent":["import { createConfig, handleVersionHelp } from './setup/config.ts';\nimport { createHTTPServer } from './setup/http.ts';\nimport { createStdioServer } from './setup/stdio.ts';\nimport type { ServerConfig } from './types.ts';\n\nexport { GOOGLE_SCOPE } from './constants.ts';\nexport * as mcp from './mcp/index.ts';\nexport * as schemas from './schemas/index.ts';\nexport * as setup from './setup/index.ts';\nexport * from './types.ts';\n\nexport async function startServer(config: ServerConfig): Promise<void> {\n const { logger, close } = config.transport.type === 'stdio' ? await createStdioServer(config) : await createHTTPServer(config);\n\n process.on('SIGINT', async () => {\n await close();\n process.exit(0);\n });\n\n logger.info(`Server started with ${config.transport.type} transport`);\n await new Promise(() => {});\n}\n\nexport default async function main(): Promise<void> {\n // Check for help/version flags FIRST, before config parsing\n const versionHelpResult = handleVersionHelp(process.argv);\n if (versionHelpResult.handled) {\n console.log(versionHelpResult.output);\n process.exit(0);\n }\n\n // Only parse config if no help/version flags\n const config = createConfig();\n await startServer(config);\n}\n\nif (process.argv[1] === new URL(import.meta.url).pathname) {\n main();\n}\n"],"names":["GOOGLE_SCOPE","main","mcp","schemas","setup","startServer","config","logger","close","transport","type","createStdioServer","createHTTPServer","process","on","exit","info","Promise","versionHelpResult","handleVersionHelp","argv","handled","console","log","output","createConfig","URL","pathname"],"mappings":";;;;;;;;;;;QAKSA;eAAAA,yBAAY;;QAkBrB;eAA8BC;;QAjBlBC;;;QACAC;;;QACAC;;;QAGUC;eAAAA;;;wBAX0B;sBACf;uBACC;2BAGL;+DACR;gEACI;gEACF;qBACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEP,SAAeA,YAAYC,MAAoB;;YAC1BA,MAAlBC,QAAQC;;;;yBAAUF,CAAAA,OAAOG,SAAS,CAACC,IAAI,KAAK,OAAM,GAAhCJ;;;;oBAAoC;;wBAAMK,IAAAA,0BAAiB,EAACL;;;2BAAxB;;;;;;oBAAkC;;wBAAMM,IAAAA,wBAAgB,EAACN;;;2BAAvB;;;oBAAtEA,aAAlBC,SAAkBD,KAAlBC,QAAQC,QAAUF,KAAVE;oBAEhBK,QAAQC,EAAE,CAAC,UAAU;;;;;wCACnB;;4CAAMN;;;wCAAN;wCACAK,QAAQE,IAAI,CAAC;;;;;;wBACf;;oBAEAR,OAAOS,IAAI,CAAC,AAAC,uBAA4C,OAAtBV,OAAOG,SAAS,CAACC,IAAI,EAAC;oBACzD;;wBAAM,IAAIO,QAAQ,YAAO;;;oBAAzB;;;;;;IACF;;AAEe,SAAehB;;YAEtBiB,mBAOAZ;;;;oBARN,4DAA4D;oBACtDY,oBAAoBC,IAAAA,2BAAiB,EAACN,QAAQO,IAAI;oBACxD,IAAIF,kBAAkBG,OAAO,EAAE;wBAC7BC,QAAQC,GAAG,CAACL,kBAAkBM,MAAM;wBACpCX,QAAQE,IAAI,CAAC;oBACf;oBAEA,6CAA6C;oBACvCT,SAASmB,IAAAA,sBAAY;oBAC3B;;wBAAMpB,YAAYC;;;oBAAlB;;;;;;IACF;;AAEA,IAAIO,QAAQO,IAAI,CAAC,EAAE,KAAK,IAAIM,IAAI,qDAAiBC,QAAQ,EAAE;IACzD1B;AACF"}
|
|
@@ -17,11 +17,8 @@ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
|
17
17
|
reject(error);
|
|
18
18
|
return;
|
|
19
19
|
}
|
|
20
|
-
if (info.done)
|
|
21
|
-
|
|
22
|
-
} else {
|
|
23
|
-
Promise.resolve(value).then(_next, _throw);
|
|
24
|
-
}
|
|
20
|
+
if (info.done) resolve(value);
|
|
21
|
+
else Promise.resolve(value).then(_next, _throw);
|
|
25
22
|
}
|
|
26
23
|
function _async_to_generator(fn) {
|
|
27
24
|
return function() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-drive/src/lib/create-store.ts"],"sourcesContent":["import type Keyv from 'keyv';\nimport keyvRegistry from 'keyv-registry';\n\nexport default async function createStore<T>(uri: string): Promise<Keyv<T>> {\n const store = await keyvRegistry<T>(uri);\n if (!store) throw new Error(`Failed to create store for URI: ${uri}`);\n return store;\n}\n"],"names":["createStore","uri","store","keyvRegistry","Error"],"mappings":";;;;+BAGA;;;eAA8BA;;;mEAFL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEV,SAAeA,YAAeC,GAAW;;YAChDC;;;;oBAAQ;;wBAAMC,IAAAA,qBAAY,EAAIF;;;oBAA9BC,QAAQ;oBACd,IAAI,CAACA,OAAO,MAAM,IAAIE,MAAM,AAAC,mCAAsC,OAAJH;oBAC/D;;wBAAOC;;;;IACT"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/** Streaming file source utilities for memory-efficient uploads (no temp files) */
|
|
2
|
+
import { Readable } from 'stream';
|
|
3
|
+
/** Resolved source for an upload URI: a readable stream plus naming/MIME hints */
|
|
4
|
+
export interface FileSource {
|
|
5
|
+
/** Binary read stream of the file content */
|
|
6
|
+
stream: Readable;
|
|
7
|
+
/** Best-effort file name (used as default Drive name) */
|
|
8
|
+
fileName: string;
|
|
9
|
+
/** MIME type from the Content-Type header (http/https sources only) */
|
|
10
|
+
contentType?: string;
|
|
11
|
+
/** File size in bytes when known (file:// via stat, http/https via Content-Length) */
|
|
12
|
+
size?: number;
|
|
13
|
+
}
|
|
14
|
+
/** Guess MIME type from file name extension (application/octet-stream fallback) */
|
|
15
|
+
export declare function guessMimeType(fileName: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* Get readable stream and metadata from a file URI
|
|
18
|
+
*
|
|
19
|
+
* Memory efficiency:
|
|
20
|
+
* - file:// URIs stream directly from disk
|
|
21
|
+
* - http:// URIs stream directly from response (no temp files!)
|
|
22
|
+
*
|
|
23
|
+
* Unlike mcp-sheets' getCsvReadStream, this streams binary content
|
|
24
|
+
* (no text encoding) so arbitrary file types can be uploaded.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```ts
|
|
28
|
+
* const source = await getFileReadStream('file:///path/to/report.pdf');
|
|
29
|
+
* await drive.files.create({
|
|
30
|
+
* requestBody: { name: source.fileName },
|
|
31
|
+
* media: { mimeType: guessMimeType(source.fileName), body: source.stream },
|
|
32
|
+
* });
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare function getFileReadStream(fileUri: string): Promise<FileSource>;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/** Streaming file source utilities for memory-efficient uploads (no temp files) */
|
|
2
|
+
import { Readable } from 'stream';
|
|
3
|
+
/** Resolved source for an upload URI: a readable stream plus naming/MIME hints */
|
|
4
|
+
export interface FileSource {
|
|
5
|
+
/** Binary read stream of the file content */
|
|
6
|
+
stream: Readable;
|
|
7
|
+
/** Best-effort file name (used as default Drive name) */
|
|
8
|
+
fileName: string;
|
|
9
|
+
/** MIME type from the Content-Type header (http/https sources only) */
|
|
10
|
+
contentType?: string;
|
|
11
|
+
/** File size in bytes when known (file:// via stat, http/https via Content-Length) */
|
|
12
|
+
size?: number;
|
|
13
|
+
}
|
|
14
|
+
/** Guess MIME type from file name extension (application/octet-stream fallback) */
|
|
15
|
+
export declare function guessMimeType(fileName: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* Get readable stream and metadata from a file URI
|
|
18
|
+
*
|
|
19
|
+
* Memory efficiency:
|
|
20
|
+
* - file:// URIs stream directly from disk
|
|
21
|
+
* - http:// URIs stream directly from response (no temp files!)
|
|
22
|
+
*
|
|
23
|
+
* Unlike mcp-sheets' getCsvReadStream, this streams binary content
|
|
24
|
+
* (no text encoding) so arbitrary file types can be uploaded.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```ts
|
|
28
|
+
* const source = await getFileReadStream('file:///path/to/report.pdf');
|
|
29
|
+
* await drive.files.create({
|
|
30
|
+
* requestBody: { name: source.fileName },
|
|
31
|
+
* media: { mimeType: guessMimeType(source.fileName), body: source.stream },
|
|
32
|
+
* });
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare function getFileReadStream(fileUri: string): Promise<FileSource>;
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
/** Streaming file source utilities for memory-efficient uploads (no temp files) */ "use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
get getFileReadStream () {
|
|
13
|
+
return getFileReadStream;
|
|
14
|
+
},
|
|
15
|
+
get guessMimeType () {
|
|
16
|
+
return guessMimeType;
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
var _fs = require("fs");
|
|
20
|
+
var _promises = require("fs/promises");
|
|
21
|
+
var _path = require("path");
|
|
22
|
+
var _stream = require("stream");
|
|
23
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
24
|
+
try {
|
|
25
|
+
var info = gen[key](arg);
|
|
26
|
+
var value = info.value;
|
|
27
|
+
} catch (error) {
|
|
28
|
+
reject(error);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (info.done) resolve(value);
|
|
32
|
+
else Promise.resolve(value).then(_next, _throw);
|
|
33
|
+
}
|
|
34
|
+
function _async_to_generator(fn) {
|
|
35
|
+
return function() {
|
|
36
|
+
var self = this, args = arguments;
|
|
37
|
+
return new Promise(function(resolve, reject) {
|
|
38
|
+
var gen = fn.apply(self, args);
|
|
39
|
+
function _next(value) {
|
|
40
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
|
41
|
+
}
|
|
42
|
+
function _throw(err) {
|
|
43
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
|
44
|
+
}
|
|
45
|
+
_next(undefined);
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function _define_property(obj, key, value) {
|
|
50
|
+
if (key in obj) {
|
|
51
|
+
Object.defineProperty(obj, key, {
|
|
52
|
+
value: value,
|
|
53
|
+
enumerable: true,
|
|
54
|
+
configurable: true,
|
|
55
|
+
writable: true
|
|
56
|
+
});
|
|
57
|
+
} else obj[key] = value;
|
|
58
|
+
return obj;
|
|
59
|
+
}
|
|
60
|
+
function _object_spread(target) {
|
|
61
|
+
for(var i = 1; i < arguments.length; i++){
|
|
62
|
+
var source = arguments[i] != null ? arguments[i] : {};
|
|
63
|
+
var ownKeys = Object.keys(source);
|
|
64
|
+
if (typeof Object.getOwnPropertySymbols === "function") {
|
|
65
|
+
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
|
|
66
|
+
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
|
|
67
|
+
}));
|
|
68
|
+
}
|
|
69
|
+
ownKeys.forEach(function(key) {
|
|
70
|
+
_define_property(target, key, source[key]);
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
return target;
|
|
74
|
+
}
|
|
75
|
+
function _ts_generator(thisArg, body) {
|
|
76
|
+
var f, y, t, _ = {
|
|
77
|
+
label: 0,
|
|
78
|
+
sent: function() {
|
|
79
|
+
if (t[0] & 1) throw t[1];
|
|
80
|
+
return t[1];
|
|
81
|
+
},
|
|
82
|
+
trys: [],
|
|
83
|
+
ops: []
|
|
84
|
+
}, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype), d = Object.defineProperty;
|
|
85
|
+
return d(g, "next", {
|
|
86
|
+
value: verb(0)
|
|
87
|
+
}), d(g, "throw", {
|
|
88
|
+
value: verb(1)
|
|
89
|
+
}), d(g, "return", {
|
|
90
|
+
value: verb(2)
|
|
91
|
+
}), typeof Symbol === "function" && d(g, Symbol.iterator, {
|
|
92
|
+
value: function() {
|
|
93
|
+
return this;
|
|
94
|
+
}
|
|
95
|
+
}), g;
|
|
96
|
+
function verb(n) {
|
|
97
|
+
return function(v) {
|
|
98
|
+
return step([
|
|
99
|
+
n,
|
|
100
|
+
v
|
|
101
|
+
]);
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function step(op) {
|
|
105
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
106
|
+
while(g && (g = 0, op[0] && (_ = 0)), _)try {
|
|
107
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
108
|
+
if (y = 0, t) op = [
|
|
109
|
+
op[0] & 2,
|
|
110
|
+
t.value
|
|
111
|
+
];
|
|
112
|
+
switch(op[0]){
|
|
113
|
+
case 0:
|
|
114
|
+
case 1:
|
|
115
|
+
t = op;
|
|
116
|
+
break;
|
|
117
|
+
case 4:
|
|
118
|
+
_.label++;
|
|
119
|
+
return {
|
|
120
|
+
value: op[1],
|
|
121
|
+
done: false
|
|
122
|
+
};
|
|
123
|
+
case 5:
|
|
124
|
+
_.label++;
|
|
125
|
+
y = op[1];
|
|
126
|
+
op = [
|
|
127
|
+
0
|
|
128
|
+
];
|
|
129
|
+
continue;
|
|
130
|
+
case 7:
|
|
131
|
+
op = _.ops.pop();
|
|
132
|
+
_.trys.pop();
|
|
133
|
+
continue;
|
|
134
|
+
default:
|
|
135
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
|
|
136
|
+
_ = 0;
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
|
|
140
|
+
_.label = op[1];
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
if (op[0] === 6 && _.label < t[1]) {
|
|
144
|
+
_.label = t[1];
|
|
145
|
+
t = op;
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
if (t && _.label < t[2]) {
|
|
149
|
+
_.label = t[2];
|
|
150
|
+
_.ops.push(op);
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
if (t[2]) _.ops.pop();
|
|
154
|
+
_.trys.pop();
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
op = body.call(thisArg, _);
|
|
158
|
+
} catch (e) {
|
|
159
|
+
op = [
|
|
160
|
+
6,
|
|
161
|
+
e
|
|
162
|
+
];
|
|
163
|
+
y = 0;
|
|
164
|
+
} finally{
|
|
165
|
+
f = t = 0;
|
|
166
|
+
}
|
|
167
|
+
if (op[0] & 5) throw op[1];
|
|
168
|
+
return {
|
|
169
|
+
value: op[0] ? op[1] : void 0,
|
|
170
|
+
done: true
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/** Common extension → MIME map; falls back to application/octet-stream */ var MIME_BY_EXTENSION = {
|
|
175
|
+
'.csv': 'text/csv',
|
|
176
|
+
'.doc': 'application/msword',
|
|
177
|
+
'.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
|
178
|
+
'.gif': 'image/gif',
|
|
179
|
+
'.gz': 'application/gzip',
|
|
180
|
+
'.html': 'text/html',
|
|
181
|
+
'.jpeg': 'image/jpeg',
|
|
182
|
+
'.jpg': 'image/jpeg',
|
|
183
|
+
'.json': 'application/json',
|
|
184
|
+
'.md': 'text/markdown',
|
|
185
|
+
'.mp3': 'audio/mpeg',
|
|
186
|
+
'.mp4': 'video/mp4',
|
|
187
|
+
'.pdf': 'application/pdf',
|
|
188
|
+
'.png': 'image/png',
|
|
189
|
+
'.ppt': 'application/vnd.ms-powerpoint',
|
|
190
|
+
'.pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
|
|
191
|
+
'.rtf': 'application/rtf',
|
|
192
|
+
'.svg': 'image/svg+xml',
|
|
193
|
+
'.tar': 'application/x-tar',
|
|
194
|
+
'.txt': 'text/plain',
|
|
195
|
+
'.webp': 'image/webp',
|
|
196
|
+
'.woff': 'font/woff',
|
|
197
|
+
'.woff2': 'font/woff2',
|
|
198
|
+
'.xls': 'application/vnd.ms-excel',
|
|
199
|
+
'.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
|
200
|
+
'.xml': 'application/xml',
|
|
201
|
+
'.zip': 'application/zip'
|
|
202
|
+
};
|
|
203
|
+
function guessMimeType(fileName) {
|
|
204
|
+
var _MIME_BY_EXTENSION_extname_toLowerCase;
|
|
205
|
+
return (_MIME_BY_EXTENSION_extname_toLowerCase = MIME_BY_EXTENSION[(0, _path.extname)(fileName).toLowerCase()]) !== null && _MIME_BY_EXTENSION_extname_toLowerCase !== void 0 ? _MIME_BY_EXTENSION_extname_toLowerCase : 'application/octet-stream';
|
|
206
|
+
}
|
|
207
|
+
function getFileReadStream(fileUri) {
|
|
208
|
+
return _async_to_generator(function() {
|
|
209
|
+
var rawPath, filePath, fileSize, _response_headers_get_split_, _response_headers_get, response, stream, contentType, contentLength;
|
|
210
|
+
return _ts_generator(this, function(_state) {
|
|
211
|
+
switch(_state.label){
|
|
212
|
+
case 0:
|
|
213
|
+
if (!fileUri.startsWith('file://')) return [
|
|
214
|
+
3,
|
|
215
|
+
2
|
|
216
|
+
];
|
|
217
|
+
// Local file - stream directly from disk
|
|
218
|
+
rawPath = fileUri.slice('file://'.length);
|
|
219
|
+
filePath = rawPath.startsWith('/') ? rawPath : (0, _path.resolve)(rawPath);
|
|
220
|
+
return [
|
|
221
|
+
4,
|
|
222
|
+
(0, _promises.stat)(filePath)
|
|
223
|
+
];
|
|
224
|
+
case 1:
|
|
225
|
+
fileSize = _state.sent().size;
|
|
226
|
+
return [
|
|
227
|
+
2,
|
|
228
|
+
{
|
|
229
|
+
stream: (0, _fs.createReadStream)(filePath),
|
|
230
|
+
fileName: (0, _path.basename)(filePath),
|
|
231
|
+
size: fileSize
|
|
232
|
+
}
|
|
233
|
+
];
|
|
234
|
+
case 2:
|
|
235
|
+
if (!(fileUri.startsWith('http://') || fileUri.startsWith('https://'))) return [
|
|
236
|
+
3,
|
|
237
|
+
4
|
|
238
|
+
];
|
|
239
|
+
return [
|
|
240
|
+
4,
|
|
241
|
+
fetch(fileUri)
|
|
242
|
+
];
|
|
243
|
+
case 3:
|
|
244
|
+
response = _state.sent();
|
|
245
|
+
if (!response.ok) {
|
|
246
|
+
throw new Error("Failed to fetch file from ".concat(fileUri, ": ").concat(response.statusText));
|
|
247
|
+
}
|
|
248
|
+
if (!response.body) {
|
|
249
|
+
throw new Error("No response body from ".concat(fileUri));
|
|
250
|
+
}
|
|
251
|
+
// Convert web stream to Node.js stream
|
|
252
|
+
// response.body is ReadableStream<Uint8Array> from fetch API
|
|
253
|
+
// Cast to Node.js ReadableStream type for compatibility with Readable.fromWeb
|
|
254
|
+
stream = _stream.Readable.fromWeb(response.body);
|
|
255
|
+
contentType = (_response_headers_get = response.headers.get('content-type')) === null || _response_headers_get === void 0 ? void 0 : (_response_headers_get_split_ = _response_headers_get.split(';')[0]) === null || _response_headers_get_split_ === void 0 ? void 0 : _response_headers_get_split_.trim();
|
|
256
|
+
contentLength = response.headers.get('content-length');
|
|
257
|
+
return [
|
|
258
|
+
2,
|
|
259
|
+
_object_spread({
|
|
260
|
+
stream: stream,
|
|
261
|
+
fileName: getRemoteFileName(response.headers.get('content-disposition'), fileUri)
|
|
262
|
+
}, contentType && {
|
|
263
|
+
contentType: contentType
|
|
264
|
+
}, contentLength && {
|
|
265
|
+
size: Number.parseInt(contentLength, 10)
|
|
266
|
+
})
|
|
267
|
+
];
|
|
268
|
+
case 4:
|
|
269
|
+
throw new Error("Invalid file URI: ".concat(fileUri, ". Must start with file://, http://, or https://"));
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
})();
|
|
273
|
+
}
|
|
274
|
+
/** Best-effort file name for a remote source: Content-Disposition, then URL path */ function getRemoteFileName(contentDisposition, fileUri) {
|
|
275
|
+
if (contentDisposition) {
|
|
276
|
+
var _ref;
|
|
277
|
+
var match = /filename="([^"]+)"|filename=([^;]+)/i.exec(contentDisposition);
|
|
278
|
+
var fromHeader = (_ref = match === null || match === void 0 ? void 0 : match[1]) !== null && _ref !== void 0 ? _ref : match === null || match === void 0 ? void 0 : match[2];
|
|
279
|
+
if (fromHeader) {
|
|
280
|
+
return fromHeader.trim();
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
try {
|
|
284
|
+
return decodeURIComponent((0, _path.basename)(new URL(fileUri).pathname)) || 'upload.bin';
|
|
285
|
+
} catch (unused) {
|
|
286
|
+
return 'upload.bin';
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
/* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-drive/src/lib/file-streaming.ts"],"sourcesContent":["/** Streaming file source utilities for memory-efficient uploads (no temp files) */\n\nimport { createReadStream } from 'fs';\nimport { stat } from 'fs/promises';\nimport { basename, extname, resolve } from 'path';\nimport { Readable } from 'stream';\nimport type { ReadableStream as NodeReadableStream } from 'stream/web';\n\n/** Resolved source for an upload URI: a readable stream plus naming/MIME hints */\nexport interface FileSource {\n /** Binary read stream of the file content */\n stream: Readable;\n /** Best-effort file name (used as default Drive name) */\n fileName: string;\n /** MIME type from the Content-Type header (http/https sources only) */\n contentType?: string;\n /** File size in bytes when known (file:// via stat, http/https via Content-Length) */\n size?: number;\n}\n\n/** Common extension → MIME map; falls back to application/octet-stream */\nconst MIME_BY_EXTENSION: Record<string, string> = {\n '.csv': 'text/csv',\n '.doc': 'application/msword',\n '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n '.gif': 'image/gif',\n '.gz': 'application/gzip',\n '.html': 'text/html',\n '.jpeg': 'image/jpeg',\n '.jpg': 'image/jpeg',\n '.json': 'application/json',\n '.md': 'text/markdown',\n '.mp3': 'audio/mpeg',\n '.mp4': 'video/mp4',\n '.pdf': 'application/pdf',\n '.png': 'image/png',\n '.ppt': 'application/vnd.ms-powerpoint',\n '.pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n '.rtf': 'application/rtf',\n '.svg': 'image/svg+xml',\n '.tar': 'application/x-tar',\n '.txt': 'text/plain',\n '.webp': 'image/webp',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n '.xls': 'application/vnd.ms-excel',\n '.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n '.xml': 'application/xml',\n '.zip': 'application/zip',\n};\n\n/** Guess MIME type from file name extension (application/octet-stream fallback) */\nexport function guessMimeType(fileName: string): string {\n return MIME_BY_EXTENSION[extname(fileName).toLowerCase()] ?? 'application/octet-stream';\n}\n\n/**\n * Get readable stream and metadata from a file URI\n *\n * Memory efficiency:\n * - file:// URIs stream directly from disk\n * - http:// URIs stream directly from response (no temp files!)\n *\n * Unlike mcp-sheets' getCsvReadStream, this streams binary content\n * (no text encoding) so arbitrary file types can be uploaded.\n *\n * @example\n * ```ts\n * const source = await getFileReadStream('file:///path/to/report.pdf');\n * await drive.files.create({\n * requestBody: { name: source.fileName },\n * media: { mimeType: guessMimeType(source.fileName), body: source.stream },\n * });\n * ```\n */\nexport async function getFileReadStream(fileUri: string): Promise<FileSource> {\n if (fileUri.startsWith('file://')) {\n // Local file - stream directly from disk\n const rawPath = fileUri.slice('file://'.length);\n const filePath = rawPath.startsWith('/') ? rawPath : resolve(rawPath);\n const fileSize = (await stat(filePath)).size;\n return {\n stream: createReadStream(filePath),\n fileName: basename(filePath),\n size: fileSize,\n };\n }\n\n if (fileUri.startsWith('http://') || fileUri.startsWith('https://')) {\n // Remote file - stream directly from fetch response\n const response = await fetch(fileUri);\n if (!response.ok) {\n throw new Error(`Failed to fetch file from ${fileUri}: ${response.statusText}`);\n }\n\n if (!response.body) {\n throw new Error(`No response body from ${fileUri}`);\n }\n\n // Convert web stream to Node.js stream\n // response.body is ReadableStream<Uint8Array> from fetch API\n // Cast to Node.js ReadableStream type for compatibility with Readable.fromWeb\n const stream = Readable.fromWeb(response.body as unknown as NodeReadableStream<Uint8Array>);\n const contentType = response.headers.get('content-type')?.split(';')[0]?.trim();\n const contentLength = response.headers.get('content-length');\n\n return {\n stream,\n fileName: getRemoteFileName(response.headers.get('content-disposition'), fileUri),\n ...(contentType && { contentType }),\n ...(contentLength && { size: Number.parseInt(contentLength, 10) }),\n };\n }\n\n throw new Error(`Invalid file URI: ${fileUri}. Must start with file://, http://, or https://`);\n}\n\n/** Best-effort file name for a remote source: Content-Disposition, then URL path */\nfunction getRemoteFileName(contentDisposition: string | null, fileUri: string): string {\n if (contentDisposition) {\n const match = /filename=\"([^\"]+)\"|filename=([^;]+)/i.exec(contentDisposition);\n const fromHeader = match?.[1] ?? match?.[2];\n if (fromHeader) {\n return fromHeader.trim();\n }\n }\n\n try {\n return decodeURIComponent(basename(new URL(fileUri).pathname)) || 'upload.bin';\n } catch {\n return 'upload.bin';\n }\n}\n"],"names":["getFileReadStream","guessMimeType","MIME_BY_EXTENSION","fileName","extname","toLowerCase","fileUri","rawPath","filePath","fileSize","response","stream","contentType","contentLength","startsWith","slice","length","resolve","stat","size","createReadStream","basename","fetch","ok","Error","statusText","body","Readable","fromWeb","headers","get","split","trim","getRemoteFileName","Number","parseInt","contentDisposition","match","exec","fromHeader","decodeURIComponent","URL","pathname"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-drive/src/lib/query-builder.ts"],"sourcesContent":["import type { DriveQuery, DriveQueryObject } from '../schemas/drive-query-schema.ts';\n\n/**\n * Field operator interface for query filters\n */\nexport interface FieldOperator {\n $any?: string[];\n $all?: string[];\n $none?: string[];\n}\n\n/**\n * Filters object returned by toDriveQuery for debugging/logging\n */\ninterface FiltersObject {\n nameIncludes?: string[];\n mimeTypeIncludes?: string[];\n fullTextIncludes?: string[];\n parentIdIncludes?: string[];\n ownerIncludes?: string[];\n starred?: boolean;\n sharedWithMe?: boolean;\n trashed?: boolean;\n}\n\n/**\n * Convert structured DriveQuery to Google Drive query string\n *\n * Accepts either:\n * - A raw Drive query string (returned as-is)\n * - A structured DriveQueryObject (converted to Drive query syntax)\n *\n * Drive query syntax reference:\n * - name contains 'text' - Search by filename\n * - mimeType = 'type' - Filter by MIME type\n * - fullText contains 'text' - Search content and metadata\n * - 'parent_id' in parents - Search in folder\n * - starred = true/false - Filter by starred status\n * - sharedWithMe = true - Filter by shared status\n * - modifiedTime >= 'date' - Date filtering\n * - 'email' in owners - Filter by owner\n * - trashed = true/false - Filter by trash status\n */\nexport function toDriveQuery(query: DriveQuery | string): {\n q: string;\n filters: FiltersObject;\n} {\n // Handle string queries - return as raw query with empty filters\n if (typeof query === 'string') {\n return { q: query, filters: {} };\n }\n const nameIncludes: string[] = [];\n const mimeTypeIncludes: string[] = [];\n const fullTextIncludes: string[] = [];\n const parentIdIncludes: string[] = [];\n const ownerIncludes: string[] = [];\n\n let starredFlag: boolean | undefined;\n let sharedWithMeFlag: boolean | undefined;\n let trashedFlag: boolean | undefined;\n\n function p(s: unknown) {\n return `(${String(s ?? '')})`;\n }\n\n function quote(s?: unknown) {\n const str = String(s ?? '');\n // Escape single quotes for Drive query syntax\n return `'${str.replace(/'/g, \"\\\\'\")}'`;\n }\n\n function fv(field: string, raw?: unknown) {\n const rawVal = String(raw ?? '');\n const v = quote(rawVal);\n\n if (field === 'name') {\n nameIncludes.push(rawVal);\n return `name contains ${v}`;\n }\n if (field === 'mimeType') {\n mimeTypeIncludes.push(rawVal);\n return `mimeType = ${v}`;\n }\n if (field === 'fullText') {\n fullTextIncludes.push(rawVal);\n return `fullText contains ${v}`;\n }\n if (field === 'parentId') {\n parentIdIncludes.push(rawVal);\n return `${v} in parents`;\n }\n if (field === 'owner') {\n ownerIncludes.push(rawVal);\n return `${v} in owners`;\n }\n\n return '';\n }\n\n function chain(op: 'and' | 'or', arr: string[]) {\n const filtered = arr.filter((s) => s && s.trim() !== '');\n if (filtered.length === 0) return '';\n if (filtered.length === 1) {\n const first = filtered[0];\n return first ?? '';\n }\n return p(filtered.join(` ${op} `));\n }\n\n function fieldExpr(field: string, op: FieldOperator) {\n if (op.$any) {\n const nonEmpty = op.$any.filter((v: string) => String(v ?? '').trim() !== '');\n const results = nonEmpty.map((v: string) => fv(field, String(v ?? ''))).filter((result: string) => result.trim() !== '');\n return results.length > 0 ? chain('or', results) : '';\n }\n if (op.$all) {\n const nonEmpty = op.$all.filter((v: string) => String(v ?? '').trim() !== '');\n const results = nonEmpty.map((v: string) => fv(field, String(v ?? ''))).filter((result: string) => result.trim() !== '');\n return results.length > 0 ? chain('and', results) : '';\n }\n if (op.$none) {\n const nonEmpty = op.$none.filter((v: string) => String(v ?? '').trim() !== '');\n const results = nonEmpty.map((v: string) => fv(field, String(v ?? ''))).filter((result: string) => result.trim() !== '');\n return results.length > 0 ? `not ${p(chain('or', results))}` : '';\n }\n throw new Error(`Unknown field operator ${JSON.stringify(op)}`);\n }\n\n function dateExpr(d: { $gte?: string; $lt?: string }) {\n const parts: string[] = [];\n if (d.$gte) parts.push(`modifiedTime >= '${d.$gte}'`);\n if (d.$lt) parts.push(`modifiedTime < '${d.$lt}'`);\n return parts.length > 1 ? p(parts.join(' and ')) : (parts[0] ?? '');\n }\n\n function fieldKeys() {\n return ['name', 'mimeType', 'fullText', 'parentId', 'owner'];\n }\n\n function emit(n: DriveQueryObject): string {\n if (n.$and) return p(n.$and.map(emit).join(' and '));\n if (n.$or) return p(n.$or.map(emit).join(' or '));\n if (n.$not) return `not ${emit(n.$not)}`;\n\n const expressions: string[] = [];\n\n if (typeof n.starred === 'boolean') {\n starredFlag = n.starred;\n expressions.push(`starred = ${n.starred}`);\n }\n if (typeof n.sharedWithMe === 'boolean') {\n sharedWithMeFlag = n.sharedWithMe;\n expressions.push(`sharedWithMe = ${n.sharedWithMe}`);\n }\n if (typeof n.trashed === 'boolean') {\n trashedFlag = n.trashed;\n expressions.push(`trashed = ${n.trashed}`);\n }\n if (n.modifiedTime) {\n expressions.push(dateExpr(n.modifiedTime));\n }\n\n for (const k of fieldKeys()) {\n if (typeof n === 'object' && n !== null && k in n) {\n const op = (n as Record<string, string | FieldOperator>)[k];\n const normalizedOp: FieldOperator = typeof op === 'string' ? { $any: [op] } : (op ?? {});\n const result = fieldExpr(k, normalizedOp);\n if (result.trim() !== '') {\n expressions.push(result);\n }\n }\n }\n\n // Handle empty objects\n if (expressions.length === 0 && typeof n === 'object' && n !== null && Object.keys(n).length === 0) {\n return '';\n }\n\n // Combine multiple expressions with AND\n if (expressions.length > 1) {\n return chain('and', expressions);\n }\n if (expressions.length === 1) {\n return expressions[0] ?? '';\n }\n\n throw new Error(`Unknown node: ${JSON.stringify(n)}`);\n }\n\n function emitTop(n: DriveQueryObject): string {\n if (!n) return '';\n\n // Handle empty objects\n if (typeof n === 'object' && n !== null && Object.keys(n).length === 0) return '';\n\n if (n.$and) return n.$and.map(emit).join(' and ');\n if (n.$or) return n.$or.map(emit).join(' or ');\n if (n.$not) return `not ${emit(n.$not)}`;\n\n const result = emit(n);\n return result.trim() === '' ? '' : result;\n }\n\n const q = emitTop(query);\n const cleanedQuery = q.replace(/\\s+and\\s+$|\\s+or\\s+$|^\\s+and\\s+|^\\s+or\\s+/gi, '').trim();\n\n const filters: FiltersObject = {};\n if (nameIncludes.length) filters.nameIncludes = nameIncludes;\n if (mimeTypeIncludes.length) filters.mimeTypeIncludes = mimeTypeIncludes;\n if (fullTextIncludes.length) filters.fullTextIncludes = fullTextIncludes;\n if (parentIdIncludes.length) filters.parentIdIncludes = parentIdIncludes;\n if (ownerIncludes.length) filters.ownerIncludes = ownerIncludes;\n // Use tracked flags from emit() to capture nested boolean conditions\n if (typeof starredFlag === 'boolean') filters.starred = starredFlag;\n if (typeof sharedWithMeFlag === 'boolean') filters.sharedWithMe = sharedWithMeFlag;\n if (typeof trashedFlag === 'boolean') filters.trashed = trashedFlag;\n\n return { q: cleanedQuery ?? '', filters };\n}\n"],"names":["toDriveQuery","query","q","filters","nameIncludes","mimeTypeIncludes","fullTextIncludes","parentIdIncludes","ownerIncludes","starredFlag","sharedWithMeFlag","trashedFlag","p","s","String","quote","str","replace","fv","field","raw","rawVal","v","push","chain","op","arr","filtered","filter","trim","length","first","join","fieldExpr","$any","nonEmpty","results","map","result","$all","$none","Error","JSON","stringify","dateExpr","d","parts","$gte","$lt","fieldKeys","emit","n","$and","$or","$not","expressions","starred","sharedWithMe","trashed","modifiedTime","k","normalizedOp","Object","keys","emitTop","cleanedQuery"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-drive/src/lib/query-builder.ts"],"sourcesContent":["import type { DriveQuery, DriveQueryObject } from '../schemas/drive-query-schema.ts';\n\n/**\n * Field operator interface for query filters\n */\nexport interface FieldOperator {\n $any?: string[];\n $all?: string[];\n $none?: string[];\n}\n\n/**\n * Filters object returned by toDriveQuery for debugging/logging\n */\ninterface FiltersObject {\n nameIncludes?: string[];\n mimeTypeIncludes?: string[];\n fullTextIncludes?: string[];\n parentIdIncludes?: string[];\n ownerIncludes?: string[];\n starred?: boolean;\n sharedWithMe?: boolean;\n trashed?: boolean;\n}\n\n/**\n * Convert structured DriveQuery to Google Drive query string\n *\n * Accepts either:\n * - A raw Drive query string (returned as-is)\n * - A structured DriveQueryObject (converted to Drive query syntax)\n *\n * Drive query syntax reference:\n * - name contains 'text' - Search by filename\n * - mimeType = 'type' - Filter by MIME type\n * - fullText contains 'text' - Search content and metadata\n * - 'parent_id' in parents - Search in folder\n * - starred = true/false - Filter by starred status\n * - sharedWithMe = true - Filter by shared status\n * - modifiedTime >= 'date' - Date filtering\n * - 'email' in owners - Filter by owner\n * - trashed = true/false - Filter by trash status\n */\nexport function toDriveQuery(query: DriveQuery | string): {\n q: string;\n filters: FiltersObject;\n} {\n // Handle string queries - return as raw query with empty filters\n if (typeof query === 'string') {\n return { q: query, filters: {} };\n }\n const nameIncludes: string[] = [];\n const mimeTypeIncludes: string[] = [];\n const fullTextIncludes: string[] = [];\n const parentIdIncludes: string[] = [];\n const ownerIncludes: string[] = [];\n\n let starredFlag: boolean | undefined;\n let sharedWithMeFlag: boolean | undefined;\n let trashedFlag: boolean | undefined;\n\n function p(s: unknown) {\n return `(${String(s ?? '')})`;\n }\n\n function quote(s?: unknown) {\n const str = String(s ?? '');\n // Escape single quotes for Drive query syntax\n return `'${str.replace(/'/g, \"\\\\'\")}'`;\n }\n\n function fv(field: string, raw?: unknown) {\n const rawVal = String(raw ?? '');\n const v = quote(rawVal);\n\n if (field === 'name') {\n nameIncludes.push(rawVal);\n return `name contains ${v}`;\n }\n if (field === 'mimeType') {\n mimeTypeIncludes.push(rawVal);\n return `mimeType = ${v}`;\n }\n if (field === 'fullText') {\n fullTextIncludes.push(rawVal);\n return `fullText contains ${v}`;\n }\n if (field === 'parentId') {\n parentIdIncludes.push(rawVal);\n return `${v} in parents`;\n }\n if (field === 'owner') {\n ownerIncludes.push(rawVal);\n return `${v} in owners`;\n }\n\n return '';\n }\n\n function chain(op: 'and' | 'or', arr: string[]) {\n const filtered = arr.filter((s) => s && s.trim() !== '');\n if (filtered.length === 0) return '';\n if (filtered.length === 1) {\n const first = filtered[0];\n return first ?? '';\n }\n return p(filtered.join(` ${op} `));\n }\n\n function fieldExpr(field: string, op: FieldOperator) {\n if (op.$any) {\n const nonEmpty = op.$any.filter((v: string) => String(v ?? '').trim() !== '');\n const results = nonEmpty.map((v: string) => fv(field, String(v ?? ''))).filter((result: string) => result.trim() !== '');\n return results.length > 0 ? chain('or', results) : '';\n }\n if (op.$all) {\n const nonEmpty = op.$all.filter((v: string) => String(v ?? '').trim() !== '');\n const results = nonEmpty.map((v: string) => fv(field, String(v ?? ''))).filter((result: string) => result.trim() !== '');\n return results.length > 0 ? chain('and', results) : '';\n }\n if (op.$none) {\n const nonEmpty = op.$none.filter((v: string) => String(v ?? '').trim() !== '');\n const results = nonEmpty.map((v: string) => fv(field, String(v ?? ''))).filter((result: string) => result.trim() !== '');\n return results.length > 0 ? `not ${p(chain('or', results))}` : '';\n }\n throw new Error(`Unknown field operator ${JSON.stringify(op)}`);\n }\n\n function dateExpr(d: { $gte?: string; $lt?: string }) {\n const parts: string[] = [];\n if (d.$gte) parts.push(`modifiedTime >= '${d.$gte}'`);\n if (d.$lt) parts.push(`modifiedTime < '${d.$lt}'`);\n return parts.length > 1 ? p(parts.join(' and ')) : (parts[0] ?? '');\n }\n\n function fieldKeys() {\n return ['name', 'mimeType', 'fullText', 'parentId', 'owner'];\n }\n\n function emit(n: DriveQueryObject): string {\n if (n.$and) return p(n.$and.map(emit).join(' and '));\n if (n.$or) return p(n.$or.map(emit).join(' or '));\n if (n.$not) return `not ${emit(n.$not)}`;\n\n const expressions: string[] = [];\n\n if (typeof n.starred === 'boolean') {\n starredFlag = n.starred;\n expressions.push(`starred = ${n.starred}`);\n }\n if (typeof n.sharedWithMe === 'boolean') {\n sharedWithMeFlag = n.sharedWithMe;\n expressions.push(`sharedWithMe = ${n.sharedWithMe}`);\n }\n if (typeof n.trashed === 'boolean') {\n trashedFlag = n.trashed;\n expressions.push(`trashed = ${n.trashed}`);\n }\n if (n.modifiedTime) {\n expressions.push(dateExpr(n.modifiedTime));\n }\n\n for (const k of fieldKeys()) {\n if (typeof n === 'object' && n !== null && k in n) {\n const op = (n as Record<string, string | FieldOperator>)[k];\n const normalizedOp: FieldOperator = typeof op === 'string' ? { $any: [op] } : (op ?? {});\n const result = fieldExpr(k, normalizedOp);\n if (result.trim() !== '') {\n expressions.push(result);\n }\n }\n }\n\n // Handle empty objects\n if (expressions.length === 0 && typeof n === 'object' && n !== null && Object.keys(n).length === 0) {\n return '';\n }\n\n // Combine multiple expressions with AND\n if (expressions.length > 1) {\n return chain('and', expressions);\n }\n if (expressions.length === 1) {\n return expressions[0] ?? '';\n }\n\n throw new Error(`Unknown node: ${JSON.stringify(n)}`);\n }\n\n function emitTop(n: DriveQueryObject): string {\n if (!n) return '';\n\n // Handle empty objects\n if (typeof n === 'object' && n !== null && Object.keys(n).length === 0) return '';\n\n if (n.$and) return n.$and.map(emit).join(' and ');\n if (n.$or) return n.$or.map(emit).join(' or ');\n if (n.$not) return `not ${emit(n.$not)}`;\n\n const result = emit(n);\n return result.trim() === '' ? '' : result;\n }\n\n const q = emitTop(query);\n const cleanedQuery = q.replace(/\\s+and\\s+$|\\s+or\\s+$|^\\s+and\\s+|^\\s+or\\s+/gi, '').trim();\n\n const filters: FiltersObject = {};\n if (nameIncludes.length) filters.nameIncludes = nameIncludes;\n if (mimeTypeIncludes.length) filters.mimeTypeIncludes = mimeTypeIncludes;\n if (fullTextIncludes.length) filters.fullTextIncludes = fullTextIncludes;\n if (parentIdIncludes.length) filters.parentIdIncludes = parentIdIncludes;\n if (ownerIncludes.length) filters.ownerIncludes = ownerIncludes;\n // Use tracked flags from emit() to capture nested boolean conditions\n if (typeof starredFlag === 'boolean') filters.starred = starredFlag;\n if (typeof sharedWithMeFlag === 'boolean') filters.sharedWithMe = sharedWithMeFlag;\n if (typeof trashedFlag === 'boolean') filters.trashed = trashedFlag;\n\n return { q: cleanedQuery ?? '', filters };\n}\n"],"names":["toDriveQuery","query","q","filters","nameIncludes","mimeTypeIncludes","fullTextIncludes","parentIdIncludes","ownerIncludes","starredFlag","sharedWithMeFlag","trashedFlag","p","s","String","quote","str","replace","fv","field","raw","rawVal","v","push","chain","op","arr","filtered","filter","trim","length","first","join","fieldExpr","$any","nonEmpty","results","map","result","$all","$none","Error","JSON","stringify","dateExpr","d","parts","$gte","$lt","fieldKeys","emit","n","$and","$or","$not","expressions","starred","sharedWithMe","trashed","modifiedTime","k","normalizedOp","Object","keys","emitTop","cleanedQuery"],"mappings":"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"}
|
package/dist/cjs/mcp/index.js
CHANGED
|
@@ -31,18 +31,12 @@ function _getRequireWildcardCache(nodeInterop) {
|
|
|
31
31
|
})(nodeInterop);
|
|
32
32
|
}
|
|
33
33
|
function _interop_require_wildcard(obj, nodeInterop) {
|
|
34
|
-
if (!nodeInterop && obj && obj.__esModule)
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
return {
|
|
39
|
-
default: obj
|
|
40
|
-
};
|
|
41
|
-
}
|
|
34
|
+
if (!nodeInterop && obj && obj.__esModule) return obj;
|
|
35
|
+
if (obj === null || typeof obj !== "object" && typeof obj !== "function") return {
|
|
36
|
+
default: obj
|
|
37
|
+
};
|
|
42
38
|
var cache = _getRequireWildcardCache(nodeInterop);
|
|
43
|
-
if (cache && cache.has(obj))
|
|
44
|
-
return cache.get(obj);
|
|
45
|
-
}
|
|
39
|
+
if (cache && cache.has(obj)) return cache.get(obj);
|
|
46
40
|
var newObj = {
|
|
47
41
|
__proto__: null
|
|
48
42
|
};
|
|
@@ -50,17 +44,12 @@ function _interop_require_wildcard(obj, nodeInterop) {
|
|
|
50
44
|
for(var key in obj){
|
|
51
45
|
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
52
46
|
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
53
|
-
if (desc && (desc.get || desc.set))
|
|
54
|
-
|
|
55
|
-
} else {
|
|
56
|
-
newObj[key] = obj[key];
|
|
57
|
-
}
|
|
47
|
+
if (desc && (desc.get || desc.set)) Object.defineProperty(newObj, key, desc);
|
|
48
|
+
else newObj[key] = obj[key];
|
|
58
49
|
}
|
|
59
50
|
}
|
|
60
51
|
newObj.default = obj;
|
|
61
|
-
if (cache)
|
|
62
|
-
cache.set(obj, newObj);
|
|
63
|
-
}
|
|
52
|
+
if (cache) cache.set(obj, newObj);
|
|
64
53
|
return newObj;
|
|
65
54
|
}
|
|
66
55
|
/* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-drive/src/mcp/index.ts"],"sourcesContent":["export * as promptFactories from './prompts/index.ts';\nexport * as resourceFactories from './resources/index.ts';\nexport * as toolFactories from './tools/index.ts';\n"],"names":["promptFactories","resourceFactories","toolFactories"],"mappings":";;;;;;;;;;;QAAYA;;;QACAC;;;QACAC;;;;+DAFqB;gEACE;gEACJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-drive/src/mcp/prompts/index.ts"],"sourcesContent":["export { default as organizeFiles } from './organize-files.ts';\nexport { default as querySyntax } from './query-syntax.ts';\n"],"names":["organizeFiles","querySyntax"],"mappings":";;;;;;;;;;;QAAoBA;eAAAA,wBAAa;;QACbC;eAAAA,sBAAW;;;sEADU;oEACF"}
|
|
@@ -16,11 +16,8 @@ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
|
16
16
|
reject(error);
|
|
17
17
|
return;
|
|
18
18
|
}
|
|
19
|
-
if (info.done)
|
|
20
|
-
|
|
21
|
-
} else {
|
|
22
|
-
Promise.resolve(value).then(_next, _throw);
|
|
23
|
-
}
|
|
19
|
+
if (info.done) resolve(value);
|
|
20
|
+
else Promise.resolve(value).then(_next, _throw);
|
|
24
21
|
}
|
|
25
22
|
function _async_to_generator(fn) {
|
|
26
23
|
return function() {
|
|
@@ -144,7 +141,7 @@ function createPrompt() {
|
|
|
144
141
|
return {
|
|
145
142
|
name: 'organize-files',
|
|
146
143
|
config: config,
|
|
147
|
-
handler: function() {
|
|
144
|
+
handler: function handler() {
|
|
148
145
|
return _async_to_generator(function() {
|
|
149
146
|
return _ts_generator(this, function(_state) {
|
|
150
147
|
return [
|