@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.
Files changed (97) hide show
  1. package/dist/cjs/constants.js.map +1 -1
  2. package/dist/cjs/index.js +10 -24
  3. package/dist/cjs/index.js.map +1 -1
  4. package/dist/cjs/lib/create-store.js +2 -5
  5. package/dist/cjs/lib/create-store.js.map +1 -1
  6. package/dist/cjs/lib/file-streaming.d.cts +35 -0
  7. package/dist/cjs/lib/file-streaming.d.ts +35 -0
  8. package/dist/cjs/lib/file-streaming.js +289 -0
  9. package/dist/cjs/lib/file-streaming.js.map +1 -0
  10. package/dist/cjs/lib/query-builder.js.map +1 -1
  11. package/dist/cjs/mcp/index.js +8 -19
  12. package/dist/cjs/mcp/index.js.map +1 -1
  13. package/dist/cjs/mcp/prompts/index.js.map +1 -1
  14. package/dist/cjs/mcp/prompts/organize-files.js +3 -6
  15. package/dist/cjs/mcp/prompts/organize-files.js.map +1 -1
  16. package/dist/cjs/mcp/prompts/query-syntax.js +3 -6
  17. package/dist/cjs/mcp/prompts/query-syntax.js.map +1 -1
  18. package/dist/cjs/mcp/resources/file.js +3 -6
  19. package/dist/cjs/mcp/resources/file.js.map +1 -1
  20. package/dist/cjs/mcp/resources/index.js.map +1 -1
  21. package/dist/cjs/mcp/tools/file-move-to-trash.js +5 -11
  22. package/dist/cjs/mcp/tools/file-move-to-trash.js.map +1 -1
  23. package/dist/cjs/mcp/tools/file-move.js +11 -18
  24. package/dist/cjs/mcp/tools/file-move.js.map +1 -1
  25. package/dist/cjs/mcp/tools/file-upload.d.cts +69 -0
  26. package/dist/cjs/mcp/tools/file-upload.d.ts +69 -0
  27. package/dist/cjs/mcp/tools/file-upload.js +387 -0
  28. package/dist/cjs/mcp/tools/file-upload.js.map +1 -0
  29. package/dist/cjs/mcp/tools/files-search.js +7 -14
  30. package/dist/cjs/mcp/tools/files-search.js.map +1 -1
  31. package/dist/cjs/mcp/tools/folder-contents.js +7 -14
  32. package/dist/cjs/mcp/tools/folder-contents.js.map +1 -1
  33. package/dist/cjs/mcp/tools/folder-create.js +5 -11
  34. package/dist/cjs/mcp/tools/folder-create.js.map +1 -1
  35. package/dist/cjs/mcp/tools/folder-path.js +4 -8
  36. package/dist/cjs/mcp/tools/folder-path.js.map +1 -1
  37. package/dist/cjs/mcp/tools/folder-search.js +19 -24
  38. package/dist/cjs/mcp/tools/folder-search.js.map +1 -1
  39. package/dist/cjs/mcp/tools/index.d.cts +1 -0
  40. package/dist/cjs/mcp/tools/index.d.ts +1 -0
  41. package/dist/cjs/mcp/tools/index.js +4 -0
  42. package/dist/cjs/mcp/tools/index.js.map +1 -1
  43. package/dist/cjs/schemas/drive-query-schema.js +2 -3
  44. package/dist/cjs/schemas/drive-query-schema.js.map +1 -1
  45. package/dist/cjs/schemas/drive-validation.js.map +1 -1
  46. package/dist/cjs/schemas/index.js.map +1 -1
  47. package/dist/cjs/setup/config.js +11 -25
  48. package/dist/cjs/setup/config.js.map +1 -1
  49. package/dist/cjs/setup/http.js +15 -16
  50. package/dist/cjs/setup/http.js.map +1 -1
  51. package/dist/cjs/setup/index.js.map +1 -1
  52. package/dist/cjs/setup/oauth-google.js +9 -16
  53. package/dist/cjs/setup/oauth-google.js.map +1 -1
  54. package/dist/cjs/setup/runtime.d.cts +1 -1
  55. package/dist/cjs/setup/runtime.d.ts +1 -1
  56. package/dist/cjs/setup/runtime.js +11 -25
  57. package/dist/cjs/setup/runtime.js.map +1 -1
  58. package/dist/cjs/setup/stdio.js +15 -16
  59. package/dist/cjs/setup/stdio.js.map +1 -1
  60. package/dist/esm/constants.js.map +1 -1
  61. package/dist/esm/index.js.map +1 -1
  62. package/dist/esm/lib/create-store.js.map +1 -1
  63. package/dist/esm/lib/file-streaming.d.ts +35 -0
  64. package/dist/esm/lib/file-streaming.js +111 -0
  65. package/dist/esm/lib/file-streaming.js.map +1 -0
  66. package/dist/esm/lib/query-builder.js.map +1 -1
  67. package/dist/esm/mcp/index.js.map +1 -1
  68. package/dist/esm/mcp/prompts/index.js.map +1 -1
  69. package/dist/esm/mcp/prompts/organize-files.js.map +1 -1
  70. package/dist/esm/mcp/prompts/query-syntax.js.map +1 -1
  71. package/dist/esm/mcp/resources/file.js.map +1 -1
  72. package/dist/esm/mcp/resources/index.js.map +1 -1
  73. package/dist/esm/mcp/tools/file-move-to-trash.js.map +1 -1
  74. package/dist/esm/mcp/tools/file-move.js.map +1 -1
  75. package/dist/esm/mcp/tools/file-upload.d.ts +69 -0
  76. package/dist/esm/mcp/tools/file-upload.js +163 -0
  77. package/dist/esm/mcp/tools/file-upload.js.map +1 -0
  78. package/dist/esm/mcp/tools/files-search.js.map +1 -1
  79. package/dist/esm/mcp/tools/folder-contents.js.map +1 -1
  80. package/dist/esm/mcp/tools/folder-create.js.map +1 -1
  81. package/dist/esm/mcp/tools/folder-path.js.map +1 -1
  82. package/dist/esm/mcp/tools/folder-search.js.map +1 -1
  83. package/dist/esm/mcp/tools/index.d.ts +1 -0
  84. package/dist/esm/mcp/tools/index.js +1 -0
  85. package/dist/esm/mcp/tools/index.js.map +1 -1
  86. package/dist/esm/schemas/drive-query-schema.js.map +1 -1
  87. package/dist/esm/schemas/drive-validation.js.map +1 -1
  88. package/dist/esm/schemas/index.js.map +1 -1
  89. package/dist/esm/setup/config.js.map +1 -1
  90. package/dist/esm/setup/http.js.map +1 -1
  91. package/dist/esm/setup/index.js.map +1 -1
  92. package/dist/esm/setup/oauth-google.js.map +1 -1
  93. package/dist/esm/setup/runtime.d.ts +1 -1
  94. package/dist/esm/setup/runtime.js.map +1 -1
  95. package/dist/esm/setup/stdio.js.map +1 -1
  96. package/dist/esm/types.js.map +1 -1
  97. package/package.json +10 -6
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/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"}
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
- resolve(value);
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
- return obj;
92
- }
93
- if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
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
- Object.defineProperty(newObj, key, desc);
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) {
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/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"}
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
- resolve(value);
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/Projects/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"}
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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"}
@@ -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
- return obj;
36
- }
37
- if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
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
- Object.defineProperty(newObj, key, desc);
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/Projects/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
+ {"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/Projects/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"}
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
- resolve(value);
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 [