@marktoflow/integrations 2.0.0-alpha.12

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 (181) hide show
  1. package/README.md +1341 -0
  2. package/dist/adapters/claude-agent-hooks.d.ts.map +1 -0
  3. package/dist/adapters/claude-agent-hooks.js +339 -0
  4. package/dist/adapters/claude-agent-hooks.js.map +1 -0
  5. package/dist/adapters/claude-agent-types.d.ts +426 -0
  6. package/dist/adapters/claude-agent-types.d.ts.map +1 -0
  7. package/dist/adapters/claude-agent-types.js +62 -0
  8. package/dist/adapters/claude-agent-types.js.map +1 -0
  9. package/dist/adapters/claude-agent-workflow.d.ts +393 -0
  10. package/dist/adapters/claude-agent-workflow.d.ts.map +1 -0
  11. package/dist/adapters/claude-agent-workflow.js +445 -0
  12. package/dist/adapters/claude-agent-workflow.js.map +1 -0
  13. package/dist/adapters/claude-agent.d.ts +189 -0
  14. package/dist/adapters/claude-agent.d.ts.map +1 -0
  15. package/dist/adapters/claude-agent.js +504 -0
  16. package/dist/adapters/claude-agent.js.map +1 -0
  17. package/dist/adapters/claude-code.d.ts +34 -0
  18. package/dist/adapters/claude-code.d.ts.map +1 -0
  19. package/dist/adapters/claude-code.js +89 -0
  20. package/dist/adapters/claude-code.js.map +1 -0
  21. package/dist/adapters/codex-types.d.ts +463 -0
  22. package/dist/adapters/codex-types.d.ts.map +1 -0
  23. package/dist/adapters/codex-types.js +53 -0
  24. package/dist/adapters/codex-types.js.map +1 -0
  25. package/dist/adapters/codex-workflow.d.ts +414 -0
  26. package/dist/adapters/codex-workflow.d.ts.map +1 -0
  27. package/dist/adapters/codex-workflow.js +470 -0
  28. package/dist/adapters/codex-workflow.js.map +1 -0
  29. package/dist/adapters/codex.d.ts +154 -0
  30. package/dist/adapters/codex.d.ts.map +1 -0
  31. package/dist/adapters/codex.js +416 -0
  32. package/dist/adapters/codex.js.map +1 -0
  33. package/dist/adapters/github-copilot-types.d.ts +1012 -0
  34. package/dist/adapters/github-copilot-types.d.ts.map +1 -0
  35. package/dist/adapters/github-copilot-types.js +80 -0
  36. package/dist/adapters/github-copilot-types.js.map +1 -0
  37. package/dist/adapters/github-copilot-workflow.d.ts +462 -0
  38. package/dist/adapters/github-copilot-workflow.d.ts.map +1 -0
  39. package/dist/adapters/github-copilot-workflow.js +473 -0
  40. package/dist/adapters/github-copilot-workflow.js.map +1 -0
  41. package/dist/adapters/github-copilot.d.ts +280 -0
  42. package/dist/adapters/github-copilot.d.ts.map +1 -0
  43. package/dist/adapters/github-copilot.js +468 -0
  44. package/dist/adapters/github-copilot.js.map +1 -0
  45. package/dist/adapters/ollama.d.ts.map +1 -0
  46. package/dist/adapters/ollama.js +9 -0
  47. package/dist/adapters/ollama.js.map +1 -0
  48. package/dist/adapters/opencode.d.ts +41 -0
  49. package/dist/adapters/opencode.d.ts.map +1 -0
  50. package/dist/adapters/opencode.js +148 -0
  51. package/dist/adapters/opencode.js.map +1 -0
  52. package/dist/index.d.ts +52 -0
  53. package/dist/index.d.ts.map +1 -0
  54. package/dist/index.js +161 -0
  55. package/dist/index.js.map +1 -0
  56. package/dist/services/ai-browser.d.ts +112 -0
  57. package/dist/services/ai-browser.d.ts.map +1 -0
  58. package/dist/services/ai-browser.js +363 -0
  59. package/dist/services/ai-browser.js.map +1 -0
  60. package/dist/services/airtable.d.ts.map +1 -0
  61. package/dist/services/airtable.js +295 -0
  62. package/dist/services/airtable.js.map +1 -0
  63. package/dist/services/asana.d.ts +159 -0
  64. package/dist/services/asana.d.ts.map +1 -0
  65. package/dist/services/asana.js +196 -0
  66. package/dist/services/asana.js.map +1 -0
  67. package/dist/services/aws-s3.d.ts +89 -0
  68. package/dist/services/aws-s3.d.ts.map +1 -0
  69. package/dist/services/aws-s3.js +154 -0
  70. package/dist/services/aws-s3.js.map +1 -0
  71. package/dist/services/confluence.d.ts.map +1 -0
  72. package/dist/services/confluence.js +356 -0
  73. package/dist/services/confluence.js.map +1 -0
  74. package/dist/services/discord.d.ts.map +1 -0
  75. package/dist/services/discord.js +279 -0
  76. package/dist/services/discord.js.map +1 -0
  77. package/dist/services/dropbox.d.ts +134 -0
  78. package/dist/services/dropbox.d.ts.map +1 -0
  79. package/dist/services/dropbox.js +190 -0
  80. package/dist/services/dropbox.js.map +1 -0
  81. package/dist/services/github.d.ts.map +1 -0
  82. package/dist/services/github.js +13 -0
  83. package/dist/services/github.js.map +1 -0
  84. package/dist/services/gmail-trigger.d.ts.map +1 -0
  85. package/dist/services/gmail-trigger.js +172 -0
  86. package/dist/services/gmail-trigger.js.map +1 -0
  87. package/dist/services/gmail.d.ts.map +1 -0
  88. package/dist/services/gmail.js +372 -0
  89. package/dist/services/gmail.js.map +1 -0
  90. package/dist/services/google-calendar.d.ts.map +1 -0
  91. package/dist/services/google-calendar.js +357 -0
  92. package/dist/services/google-calendar.js.map +1 -0
  93. package/dist/services/google-docs.d.ts.map +1 -0
  94. package/dist/services/google-docs.js +332 -0
  95. package/dist/services/google-docs.js.map +1 -0
  96. package/dist/services/google-drive.d.ts.map +1 -0
  97. package/dist/services/google-drive.js +327 -0
  98. package/dist/services/google-drive.js.map +1 -0
  99. package/dist/services/google-sheets.d.ts.map +1 -0
  100. package/dist/services/google-sheets.js +391 -0
  101. package/dist/services/google-sheets.js.map +1 -0
  102. package/dist/services/http.d.ts.map +1 -0
  103. package/dist/services/http.js +284 -0
  104. package/dist/services/http.js.map +1 -0
  105. package/dist/services/jira.d.ts.map +1 -0
  106. package/dist/services/jira.js +35 -0
  107. package/dist/services/jira.js.map +1 -0
  108. package/dist/services/linear.d.ts.map +1 -0
  109. package/dist/services/linear.js +326 -0
  110. package/dist/services/linear.js.map +1 -0
  111. package/dist/services/mailchimp.d.ts +169 -0
  112. package/dist/services/mailchimp.d.ts.map +1 -0
  113. package/dist/services/mailchimp.js +180 -0
  114. package/dist/services/mailchimp.js.map +1 -0
  115. package/dist/services/mysql.d.ts.map +1 -0
  116. package/dist/services/mysql.js +250 -0
  117. package/dist/services/mysql.js.map +1 -0
  118. package/dist/services/notion.d.ts.map +1 -0
  119. package/dist/services/notion.js +358 -0
  120. package/dist/services/notion.js.map +1 -0
  121. package/dist/services/outlook-trigger.d.ts.map +1 -0
  122. package/dist/services/outlook-trigger.js +204 -0
  123. package/dist/services/outlook-trigger.js.map +1 -0
  124. package/dist/services/outlook.d.ts.map +1 -0
  125. package/dist/services/outlook.js +486 -0
  126. package/dist/services/outlook.js.map +1 -0
  127. package/dist/services/playwright.d.ts +678 -0
  128. package/dist/services/playwright.d.ts.map +1 -0
  129. package/dist/services/playwright.js +1141 -0
  130. package/dist/services/playwright.js.map +1 -0
  131. package/dist/services/postgres.d.ts.map +1 -0
  132. package/dist/services/postgres.js +230 -0
  133. package/dist/services/postgres.js.map +1 -0
  134. package/dist/services/sendgrid.d.ts +43 -0
  135. package/dist/services/sendgrid.d.ts.map +1 -0
  136. package/dist/services/sendgrid.js +87 -0
  137. package/dist/services/sendgrid.js.map +1 -0
  138. package/dist/services/shopify.d.ts +160 -0
  139. package/dist/services/shopify.d.ts.map +1 -0
  140. package/dist/services/shopify.js +166 -0
  141. package/dist/services/shopify.js.map +1 -0
  142. package/dist/services/slack-socket.d.ts.map +1 -0
  143. package/dist/services/slack-socket.js +48 -0
  144. package/dist/services/slack-socket.js.map +1 -0
  145. package/dist/services/slack.d.ts.map +1 -0
  146. package/dist/services/slack.js +11 -0
  147. package/dist/services/slack.js.map +1 -0
  148. package/dist/services/stripe.d.ts +275 -0
  149. package/dist/services/stripe.d.ts.map +1 -0
  150. package/dist/services/stripe.js +229 -0
  151. package/dist/services/stripe.js.map +1 -0
  152. package/dist/services/supabase.d.ts.map +1 -0
  153. package/dist/services/supabase.js +328 -0
  154. package/dist/services/supabase.js.map +1 -0
  155. package/dist/services/teams.d.ts +224 -0
  156. package/dist/services/teams.d.ts.map +1 -0
  157. package/dist/services/teams.js +229 -0
  158. package/dist/services/teams.js.map +1 -0
  159. package/dist/services/telegram.d.ts.map +1 -0
  160. package/dist/services/telegram.js +247 -0
  161. package/dist/services/telegram.js.map +1 -0
  162. package/dist/services/trello.d.ts +160 -0
  163. package/dist/services/trello.d.ts.map +1 -0
  164. package/dist/services/trello.js +194 -0
  165. package/dist/services/trello.js.map +1 -0
  166. package/dist/services/twilio.d.ts +126 -0
  167. package/dist/services/twilio.d.ts.map +1 -0
  168. package/dist/services/twilio.js +153 -0
  169. package/dist/services/twilio.js.map +1 -0
  170. package/dist/services/whatsapp.d.ts.map +1 -0
  171. package/dist/services/whatsapp.js +253 -0
  172. package/dist/services/whatsapp.js.map +1 -0
  173. package/dist/services/zendesk.d.ts +134 -0
  174. package/dist/services/zendesk.d.ts.map +1 -0
  175. package/dist/services/zendesk.js +148 -0
  176. package/dist/services/zendesk.js.map +1 -0
  177. package/dist/tools/script.d.ts +21 -0
  178. package/dist/tools/script.d.ts.map +1 -0
  179. package/dist/tools/script.js +136 -0
  180. package/dist/tools/script.js.map +1 -0
  181. package/package.json +98 -0
@@ -0,0 +1,332 @@
1
+ /**
2
+ * Google Docs Integration
3
+ *
4
+ * Document creation and editing platform.
5
+ * API Docs: https://developers.google.com/docs/api
6
+ */
7
+ import { google } from 'googleapis';
8
+ import { existsSync, readFileSync } from 'node:fs';
9
+ import { join } from 'node:path';
10
+ /**
11
+ * Google Docs actions for workflow integration
12
+ */
13
+ export class GoogleDocsActions {
14
+ docs;
15
+ constructor(docs) {
16
+ this.docs = docs;
17
+ }
18
+ /**
19
+ * Get a document by ID
20
+ */
21
+ async getDocument(documentId) {
22
+ const response = await this.docs.documents.get({
23
+ documentId,
24
+ });
25
+ return {
26
+ documentId: response.data.documentId ?? '',
27
+ title: response.data.title ?? '',
28
+ body: response.data.body,
29
+ revisionId: response.data.revisionId ?? undefined,
30
+ suggestionsViewMode: response.data.suggestionsViewMode ?? undefined,
31
+ };
32
+ }
33
+ /**
34
+ * Create a new document
35
+ */
36
+ async createDocument(options) {
37
+ const response = await this.docs.documents.create({
38
+ requestBody: {
39
+ title: options.title,
40
+ },
41
+ });
42
+ return {
43
+ documentId: response.data.documentId ?? '',
44
+ title: response.data.title ?? '',
45
+ revisionId: response.data.revisionId ?? undefined,
46
+ };
47
+ }
48
+ /**
49
+ * Get document text content
50
+ */
51
+ async getDocumentText(documentId) {
52
+ const doc = await this.getDocument(documentId);
53
+ const content = doc.body?.content ?? [];
54
+ let text = '';
55
+ for (const element of content) {
56
+ if (element.paragraph) {
57
+ for (const elem of element.paragraph.elements) {
58
+ if (elem.textRun) {
59
+ text += elem.textRun.content;
60
+ }
61
+ }
62
+ }
63
+ }
64
+ return text;
65
+ }
66
+ /**
67
+ * Insert text into a document
68
+ */
69
+ async insertText(documentId, options) {
70
+ await this.batchUpdate(documentId, [
71
+ {
72
+ insertText: {
73
+ text: options.text,
74
+ location: {
75
+ index: options.index ?? 1,
76
+ },
77
+ },
78
+ },
79
+ ]);
80
+ }
81
+ /**
82
+ * Append text to the end of a document
83
+ */
84
+ async appendText(documentId, text) {
85
+ const doc = await this.getDocument(documentId);
86
+ const endIndex = doc.body?.content?.[doc.body.content.length - 1]?.endIndex ?? 1;
87
+ await this.insertText(documentId, {
88
+ text,
89
+ index: endIndex - 1,
90
+ });
91
+ }
92
+ /**
93
+ * Delete content from a document
94
+ */
95
+ async deleteContent(documentId, options) {
96
+ await this.batchUpdate(documentId, [
97
+ {
98
+ deleteContentRange: {
99
+ range: {
100
+ startIndex: options.startIndex,
101
+ endIndex: options.endIndex,
102
+ },
103
+ },
104
+ },
105
+ ]);
106
+ }
107
+ /**
108
+ * Replace all occurrences of text
109
+ */
110
+ async replaceAllText(documentId, find, replace, matchCase = false) {
111
+ const response = await this.batchUpdate(documentId, [
112
+ {
113
+ replaceAllText: {
114
+ containsText: {
115
+ text: find,
116
+ matchCase,
117
+ },
118
+ replaceText: replace,
119
+ },
120
+ },
121
+ ]);
122
+ return response.replies?.[0]?.replaceAllText?.occurrencesChanged ?? 0;
123
+ }
124
+ /**
125
+ * Format text
126
+ */
127
+ async formatText(documentId, options) {
128
+ const fields = [];
129
+ const textStyle = {};
130
+ if (options.bold !== undefined) {
131
+ textStyle.bold = options.bold;
132
+ fields.push('bold');
133
+ }
134
+ if (options.italic !== undefined) {
135
+ textStyle.italic = options.italic;
136
+ fields.push('italic');
137
+ }
138
+ if (options.underline !== undefined) {
139
+ textStyle.underline = options.underline;
140
+ fields.push('underline');
141
+ }
142
+ if (options.fontSize !== undefined) {
143
+ textStyle.fontSize = { magnitude: options.fontSize, unit: 'PT' };
144
+ fields.push('fontSize');
145
+ }
146
+ if (options.foregroundColor !== undefined) {
147
+ textStyle.foregroundColor = {
148
+ color: {
149
+ rgbColor: options.foregroundColor,
150
+ },
151
+ };
152
+ fields.push('foregroundColor');
153
+ }
154
+ await this.batchUpdate(documentId, [
155
+ {
156
+ updateTextStyle: {
157
+ range: {
158
+ startIndex: options.startIndex,
159
+ endIndex: options.endIndex,
160
+ },
161
+ textStyle,
162
+ fields: fields.join(','),
163
+ },
164
+ },
165
+ ]);
166
+ }
167
+ /**
168
+ * Insert a table
169
+ */
170
+ async insertTable(documentId, options) {
171
+ await this.batchUpdate(documentId, [
172
+ {
173
+ insertTable: {
174
+ rows: options.rows,
175
+ columns: options.columns,
176
+ location: {
177
+ index: options.index ?? 1,
178
+ },
179
+ },
180
+ },
181
+ ]);
182
+ }
183
+ /**
184
+ * Insert a page break
185
+ */
186
+ async insertPageBreak(documentId, index) {
187
+ await this.batchUpdate(documentId, [
188
+ {
189
+ insertPageBreak: {
190
+ location: {
191
+ index: index ?? 1,
192
+ },
193
+ },
194
+ },
195
+ ]);
196
+ }
197
+ /**
198
+ * Create a named range
199
+ */
200
+ async createNamedRange(documentId, name, startIndex, endIndex) {
201
+ const response = await this.batchUpdate(documentId, [
202
+ {
203
+ createNamedRange: {
204
+ name,
205
+ range: {
206
+ startIndex,
207
+ endIndex,
208
+ },
209
+ },
210
+ },
211
+ ]);
212
+ return response.replies?.[0]?.createNamedRange?.namedRangeId ?? '';
213
+ }
214
+ /**
215
+ * Update paragraph style
216
+ */
217
+ async updateParagraphStyle(documentId, startIndex, endIndex, style) {
218
+ const fields = [];
219
+ const paragraphStyle = {};
220
+ if (style.headingId !== undefined) {
221
+ paragraphStyle.headingId = style.headingId;
222
+ fields.push('headingId');
223
+ }
224
+ if (style.namedStyleType !== undefined) {
225
+ paragraphStyle.namedStyleType = style.namedStyleType;
226
+ fields.push('namedStyleType');
227
+ }
228
+ if (style.alignment !== undefined) {
229
+ paragraphStyle.alignment = style.alignment;
230
+ fields.push('alignment');
231
+ }
232
+ await this.batchUpdate(documentId, [
233
+ {
234
+ updateParagraphStyle: {
235
+ range: {
236
+ startIndex,
237
+ endIndex,
238
+ },
239
+ paragraphStyle,
240
+ fields: fields.join(','),
241
+ },
242
+ },
243
+ ]);
244
+ }
245
+ /**
246
+ * Insert inline image
247
+ */
248
+ async insertImage(documentId, imageUri, index) {
249
+ await this.batchUpdate(documentId, [
250
+ {
251
+ insertInlineImage: {
252
+ uri: imageUri,
253
+ location: {
254
+ index: index ?? 1,
255
+ },
256
+ },
257
+ },
258
+ ]);
259
+ }
260
+ /**
261
+ * Batch update operations
262
+ */
263
+ async batchUpdate(documentId, requests) {
264
+ const response = await this.docs.documents.batchUpdate({
265
+ documentId,
266
+ requestBody: {
267
+ requests,
268
+ },
269
+ });
270
+ return response.data;
271
+ }
272
+ }
273
+ /**
274
+ * Load saved OAuth tokens from credentials file
275
+ */
276
+ function loadSavedTokens() {
277
+ const credentialsPath = join('.marktoflow', 'credentials', 'google-docs.json');
278
+ if (!existsSync(credentialsPath))
279
+ return null;
280
+ try {
281
+ const data = JSON.parse(readFileSync(credentialsPath, 'utf-8'));
282
+ return {
283
+ refresh_token: data.refresh_token,
284
+ access_token: data.access_token,
285
+ };
286
+ }
287
+ catch {
288
+ return null;
289
+ }
290
+ }
291
+ export const GoogleDocsInitializer = {
292
+ async initialize(_module, config) {
293
+ const clientId = config.auth?.['client_id'];
294
+ const clientSecret = config.auth?.['client_secret'];
295
+ const redirectUri = config.auth?.['redirect_uri'];
296
+ let refreshToken = config.auth?.['refresh_token'];
297
+ let accessToken = config.auth?.['access_token'];
298
+ // If no refresh token provided in config, try loading from saved credentials
299
+ if (!refreshToken || !accessToken) {
300
+ const savedTokens = loadSavedTokens();
301
+ if (savedTokens) {
302
+ refreshToken = refreshToken || savedTokens.refresh_token;
303
+ accessToken = accessToken || savedTokens.access_token;
304
+ }
305
+ }
306
+ if (!clientId || !clientSecret || !redirectUri) {
307
+ throw new Error('Google Docs SDK requires auth.client_id, auth.client_secret, auth.redirect_uri');
308
+ }
309
+ const oauth2Client = new google.auth.OAuth2(clientId, clientSecret, redirectUri);
310
+ oauth2Client.setCredentials({
311
+ refresh_token: refreshToken,
312
+ access_token: accessToken,
313
+ });
314
+ const docs = google.docs({ version: 'v1', auth: oauth2Client });
315
+ const actions = new GoogleDocsActions(docs);
316
+ // Copy all methods from actions to root level for workflow access
317
+ // Can't use spread operator as methods are on the prototype
318
+ const sdk = {
319
+ client: docs,
320
+ actions,
321
+ };
322
+ // Copy all methods from GoogleDocsActions prototype and bind them to maintain 'this' context
323
+ for (const key of Object.getOwnPropertyNames(Object.getPrototypeOf(actions))) {
324
+ if (key !== 'constructor' && typeof actions[key] === 'function') {
325
+ const method = actions[key];
326
+ sdk[key] = method.bind(actions);
327
+ }
328
+ }
329
+ return sdk;
330
+ },
331
+ };
332
+ //# sourceMappingURL=google-docs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-docs.js","sourceRoot":"","sources":["../../src/services/google-docs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-drive.d.ts","sourceRoot":"","sources":["../../src/services/google-drive.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAU,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAc,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAIlC,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC3D,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC7C,IAAI,EAAE,OAAO,GAAG,WAAW,GAAG,eAAe,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;IAClF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC7C,IAAI,EAAE,OAAO,GAAG,WAAW,GAAG,eAAe,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;IAClF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,qBAAa,kBAAkB;IACjB,OAAO,CAAC,KAAK;gBAAL,KAAK,EAAE,QAAQ,CAAC,KAAK;IAEzC;;OAEG;IACG,SAAS,CACb,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC;QAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAoB1D;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAYlE;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAanD;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAYnE;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,SAAS,CAAC;IA4BhE;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAQvE;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,SAAS,CAAC;IA6BhF;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO/C;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC;IAepF;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAsBvE;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAyBpF;;OAEG;IACG,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAmBjE;;OAEG;IACG,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ3E;;OAEG;IACG,WAAW,CACf,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAM,GACxC,OAAO,CAAC,SAAS,EAAE,CAAC;IAKvB;;OAEG;IACG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAI9D;;OAEG;IACH,OAAO,CAAC,SAAS;CAqBlB;AAoBD,eAAO,MAAM,sBAAsB,EAAE,cAiDpC,CAAC"}
@@ -0,0 +1,327 @@
1
+ /**
2
+ * Google Drive Integration
3
+ *
4
+ * File storage and collaboration platform.
5
+ * API Docs: https://developers.google.com/drive/api
6
+ */
7
+ import { google } from 'googleapis';
8
+ import { existsSync, readFileSync } from 'node:fs';
9
+ import { join } from 'node:path';
10
+ /**
11
+ * Google Drive actions for workflow integration
12
+ */
13
+ export class GoogleDriveActions {
14
+ drive;
15
+ constructor(drive) {
16
+ this.drive = drive;
17
+ }
18
+ /**
19
+ * List files and folders
20
+ */
21
+ async listFiles(options = {}) {
22
+ const response = await this.drive.files.list({
23
+ q: options.q,
24
+ pageSize: options.pageSize ?? 100,
25
+ pageToken: options.pageToken,
26
+ orderBy: options.orderBy,
27
+ spaces: options.spaces,
28
+ fields: options.fields ??
29
+ 'nextPageToken, files(id, name, mimeType, size, createdTime, modifiedTime, parents, webViewLink, webContentLink, description, starred, trashed, shared, owners)',
30
+ includeItemsFromAllDrives: options.includeItemsFromAllDrives,
31
+ supportsAllDrives: options.supportsAllDrives,
32
+ });
33
+ return {
34
+ files: response.data.files?.map((f) => this.parseFile(f)) ?? [],
35
+ nextPageToken: response.data.nextPageToken ?? undefined,
36
+ };
37
+ }
38
+ /**
39
+ * Get a file by ID
40
+ */
41
+ async getFile(fileId, fields) {
42
+ const response = await this.drive.files.get({
43
+ fileId,
44
+ fields: fields ??
45
+ 'id, name, mimeType, size, createdTime, modifiedTime, parents, webViewLink, webContentLink, description, starred, trashed, shared, owners',
46
+ supportsAllDrives: true,
47
+ });
48
+ return this.parseFile(response.data);
49
+ }
50
+ /**
51
+ * Download file content
52
+ */
53
+ async downloadFile(fileId) {
54
+ const response = await this.drive.files.get({
55
+ fileId,
56
+ alt: 'media',
57
+ supportsAllDrives: true,
58
+ }, { responseType: 'arraybuffer' });
59
+ return Buffer.from(response.data);
60
+ }
61
+ /**
62
+ * Export Google Workspace file to another format
63
+ */
64
+ async exportFile(fileId, mimeType) {
65
+ const response = await this.drive.files.export({
66
+ fileId,
67
+ mimeType,
68
+ }, { responseType: 'arraybuffer' });
69
+ return Buffer.from(response.data);
70
+ }
71
+ /**
72
+ * Create a file or folder
73
+ */
74
+ async createFile(options) {
75
+ const metadata = {
76
+ name: options.name,
77
+ mimeType: options.mimeType,
78
+ parents: options.parents,
79
+ description: options.description,
80
+ };
81
+ let media;
82
+ if (options.content) {
83
+ media = {
84
+ mimeType: options.contentType,
85
+ body: options.content,
86
+ };
87
+ }
88
+ const response = await this.drive.files.create({
89
+ requestBody: metadata,
90
+ media,
91
+ fields: 'id, name, mimeType, size, createdTime, modifiedTime, parents, webViewLink, webContentLink',
92
+ supportsAllDrives: true,
93
+ });
94
+ return this.parseFile(response.data);
95
+ }
96
+ /**
97
+ * Create a folder
98
+ */
99
+ async createFolder(name, parentId) {
100
+ return this.createFile({
101
+ name,
102
+ mimeType: 'application/vnd.google-apps.folder',
103
+ parents: parentId ? [parentId] : undefined,
104
+ });
105
+ }
106
+ /**
107
+ * Update a file
108
+ */
109
+ async updateFile(fileId, options) {
110
+ const metadata = {
111
+ name: options.name,
112
+ description: options.description,
113
+ starred: options.starred,
114
+ trashed: options.trashed,
115
+ };
116
+ let media;
117
+ if (options.content) {
118
+ media = {
119
+ mimeType: options.contentType,
120
+ body: options.content,
121
+ };
122
+ }
123
+ const response = await this.drive.files.update({
124
+ fileId,
125
+ requestBody: metadata,
126
+ media,
127
+ fields: 'id, name, mimeType, size, createdTime, modifiedTime, parents, webViewLink, webContentLink',
128
+ supportsAllDrives: true,
129
+ });
130
+ return this.parseFile(response.data);
131
+ }
132
+ /**
133
+ * Delete a file
134
+ */
135
+ async deleteFile(fileId) {
136
+ await this.drive.files.delete({
137
+ fileId,
138
+ supportsAllDrives: true,
139
+ });
140
+ }
141
+ /**
142
+ * Copy a file
143
+ */
144
+ async copyFile(fileId, name, parents) {
145
+ const response = await this.drive.files.copy({
146
+ fileId,
147
+ requestBody: {
148
+ name,
149
+ parents,
150
+ },
151
+ fields: 'id, name, mimeType, size, createdTime, modifiedTime, parents, webViewLink, webContentLink',
152
+ supportsAllDrives: true,
153
+ });
154
+ return this.parseFile(response.data);
155
+ }
156
+ /**
157
+ * Move a file
158
+ */
159
+ async moveFile(fileId, newParentId) {
160
+ // Get current parents
161
+ const file = await this.drive.files.get({
162
+ fileId,
163
+ fields: 'parents',
164
+ supportsAllDrives: true,
165
+ });
166
+ const previousParents = file.data.parents?.join(',');
167
+ const response = await this.drive.files.update({
168
+ fileId,
169
+ addParents: newParentId,
170
+ removeParents: previousParents,
171
+ fields: 'id, name, mimeType, size, createdTime, modifiedTime, parents, webViewLink, webContentLink',
172
+ supportsAllDrives: true,
173
+ });
174
+ return this.parseFile(response.data);
175
+ }
176
+ /**
177
+ * Share a file
178
+ */
179
+ async shareFile(fileId, options) {
180
+ const response = await this.drive.permissions.create({
181
+ fileId,
182
+ requestBody: {
183
+ type: options.type,
184
+ role: options.role,
185
+ emailAddress: options.emailAddress,
186
+ domain: options.domain,
187
+ allowFileDiscovery: options.allowFileDiscovery,
188
+ },
189
+ sendNotificationEmail: options.sendNotificationEmail ?? true,
190
+ emailMessage: options.emailMessage,
191
+ supportsAllDrives: true,
192
+ });
193
+ return {
194
+ id: response.data.id ?? '',
195
+ type: response.data.type ?? 'user',
196
+ role: response.data.role ?? 'reader',
197
+ emailAddress: response.data.emailAddress ?? undefined,
198
+ displayName: response.data.displayName ?? undefined,
199
+ deleted: response.data.deleted ?? undefined,
200
+ };
201
+ }
202
+ /**
203
+ * List permissions for a file
204
+ */
205
+ async listPermissions(fileId) {
206
+ const response = await this.drive.permissions.list({
207
+ fileId,
208
+ fields: 'permissions(id, type, role, emailAddress, displayName, deleted)',
209
+ supportsAllDrives: true,
210
+ });
211
+ return (response.data.permissions?.map((p) => ({
212
+ id: p.id ?? '',
213
+ type: p.type ?? 'user',
214
+ role: p.role ?? 'reader',
215
+ emailAddress: p.emailAddress ?? undefined,
216
+ displayName: p.displayName ?? undefined,
217
+ deleted: p.deleted ?? undefined,
218
+ })) ?? []);
219
+ }
220
+ /**
221
+ * Remove a permission
222
+ */
223
+ async removePermission(fileId, permissionId) {
224
+ await this.drive.permissions.delete({
225
+ fileId,
226
+ permissionId,
227
+ supportsAllDrives: true,
228
+ });
229
+ }
230
+ /**
231
+ * Search files
232
+ */
233
+ async searchFiles(query, options = {}) {
234
+ const result = await this.listFiles({ ...options, q: query });
235
+ return result.files;
236
+ }
237
+ /**
238
+ * Get files in a folder
239
+ */
240
+ async getFilesInFolder(folderId) {
241
+ return this.searchFiles(`'${folderId}' in parents and trashed=false`);
242
+ }
243
+ /**
244
+ * Parse file from API response
245
+ */
246
+ parseFile(file) {
247
+ return {
248
+ id: file.id ?? '',
249
+ name: file.name ?? '',
250
+ mimeType: file.mimeType ?? '',
251
+ parents: file.parents ?? undefined,
252
+ size: file.size ?? undefined,
253
+ createdTime: file.createdTime ?? undefined,
254
+ modifiedTime: file.modifiedTime ?? undefined,
255
+ webViewLink: file.webViewLink ?? undefined,
256
+ webContentLink: file.webContentLink ?? undefined,
257
+ description: file.description ?? undefined,
258
+ starred: file.starred ?? undefined,
259
+ trashed: file.trashed ?? undefined,
260
+ shared: file.shared ?? undefined,
261
+ owners: file.owners?.map((o) => ({
262
+ displayName: o.displayName ?? undefined,
263
+ emailAddress: o.emailAddress ?? undefined,
264
+ })),
265
+ };
266
+ }
267
+ }
268
+ /**
269
+ * Load saved OAuth tokens from credentials file
270
+ */
271
+ function loadSavedTokens() {
272
+ const credentialsPath = join('.marktoflow', 'credentials', 'google-drive.json');
273
+ if (!existsSync(credentialsPath))
274
+ return null;
275
+ try {
276
+ const data = JSON.parse(readFileSync(credentialsPath, 'utf-8'));
277
+ return {
278
+ refresh_token: data.refresh_token,
279
+ access_token: data.access_token,
280
+ };
281
+ }
282
+ catch {
283
+ return null;
284
+ }
285
+ }
286
+ export const GoogleDriveInitializer = {
287
+ async initialize(_module, config) {
288
+ const clientId = config.auth?.['client_id'];
289
+ const clientSecret = config.auth?.['client_secret'];
290
+ const redirectUri = config.auth?.['redirect_uri'];
291
+ let refreshToken = config.auth?.['refresh_token'];
292
+ let accessToken = config.auth?.['access_token'];
293
+ // If no refresh token provided in config, try loading from saved credentials
294
+ if (!refreshToken || !accessToken) {
295
+ const savedTokens = loadSavedTokens();
296
+ if (savedTokens) {
297
+ refreshToken = refreshToken || savedTokens.refresh_token;
298
+ accessToken = accessToken || savedTokens.access_token;
299
+ }
300
+ }
301
+ if (!clientId || !clientSecret || !redirectUri) {
302
+ throw new Error('Google Drive SDK requires auth.client_id, auth.client_secret, auth.redirect_uri');
303
+ }
304
+ const oauth2Client = new google.auth.OAuth2(clientId, clientSecret, redirectUri);
305
+ oauth2Client.setCredentials({
306
+ refresh_token: refreshToken,
307
+ access_token: accessToken,
308
+ });
309
+ const drive = google.drive({ version: 'v3', auth: oauth2Client });
310
+ const actions = new GoogleDriveActions(drive);
311
+ // Copy all methods from actions to root level for workflow access
312
+ // Can't use spread operator as methods are on the prototype
313
+ const sdk = {
314
+ client: drive,
315
+ actions,
316
+ };
317
+ // Copy all methods from GoogleDriveActions prototype and bind them to maintain 'this' context
318
+ for (const key of Object.getOwnPropertyNames(Object.getPrototypeOf(actions))) {
319
+ if (key !== 'constructor' && typeof actions[key] === 'function') {
320
+ const method = actions[key];
321
+ sdk[key] = method.bind(actions);
322
+ }
323
+ }
324
+ return sdk;
325
+ },
326
+ };
327
+ //# sourceMappingURL=google-drive.js.map