@ggakila/agentx-framework 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +107 -0
- package/LICENSE +21 -0
- package/README.md +335 -0
- package/dist/agent/Agent.d.ts +110 -0
- package/dist/agent/Agent.d.ts.map +1 -0
- package/dist/agent/Agent.js +291 -0
- package/dist/agent/Agent.js.map +1 -0
- package/dist/agent/index.d.ts +5 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +11 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/cli/CLI.d.ts +74 -0
- package/dist/cli/CLI.d.ts.map +1 -0
- package/dist/cli/CLI.js +255 -0
- package/dist/cli/CLI.js.map +1 -0
- package/dist/cli/InteractiveSetup.d.ts +104 -0
- package/dist/cli/InteractiveSetup.d.ts.map +1 -0
- package/dist/cli/InteractiveSetup.js +2225 -0
- package/dist/cli/InteractiveSetup.js.map +1 -0
- package/dist/cli/bin.d.ts +7 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +35 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/commands/ProjectCommands.d.ts +23 -0
- package/dist/cli/commands/ProjectCommands.d.ts.map +1 -0
- package/dist/cli/commands/ProjectCommands.js +504 -0
- package/dist/cli/commands/ProjectCommands.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +21 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/credential/CredentialManager.d.ts +112 -0
- package/dist/credential/CredentialManager.d.ts.map +1 -0
- package/dist/credential/CredentialManager.js +343 -0
- package/dist/credential/CredentialManager.js.map +1 -0
- package/dist/credential/OAuth2Manager.d.ts +206 -0
- package/dist/credential/OAuth2Manager.d.ts.map +1 -0
- package/dist/credential/OAuth2Manager.js +463 -0
- package/dist/credential/OAuth2Manager.js.map +1 -0
- package/dist/credential/index.d.ts +6 -0
- package/dist/credential/index.d.ts.map +1 -0
- package/dist/credential/index.js +16 -0
- package/dist/credential/index.js.map +1 -0
- package/dist/error/ErrorHandler.d.ts +74 -0
- package/dist/error/ErrorHandler.d.ts.map +1 -0
- package/dist/error/ErrorHandler.js +279 -0
- package/dist/error/ErrorHandler.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +100 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/DatabaseTool.d.ts +149 -0
- package/dist/integrations/DatabaseTool.d.ts.map +1 -0
- package/dist/integrations/DatabaseTool.js +900 -0
- package/dist/integrations/DatabaseTool.js.map +1 -0
- package/dist/integrations/EmailTool.d.ts +142 -0
- package/dist/integrations/EmailTool.d.ts.map +1 -0
- package/dist/integrations/EmailTool.js +259 -0
- package/dist/integrations/EmailTool.js.map +1 -0
- package/dist/integrations/FileSystemTool.d.ts +153 -0
- package/dist/integrations/FileSystemTool.d.ts.map +1 -0
- package/dist/integrations/FileSystemTool.js +835 -0
- package/dist/integrations/FileSystemTool.js.map +1 -0
- package/dist/integrations/GoogleWorkspaceTool.d.ts +125 -0
- package/dist/integrations/GoogleWorkspaceTool.d.ts.map +1 -0
- package/dist/integrations/GoogleWorkspaceTool.js +765 -0
- package/dist/integrations/GoogleWorkspaceTool.js.map +1 -0
- package/dist/integrations/HttpTool.d.ts +55 -0
- package/dist/integrations/HttpTool.d.ts.map +1 -0
- package/dist/integrations/HttpTool.js +209 -0
- package/dist/integrations/HttpTool.js.map +1 -0
- package/dist/integrations/MessagingTool.d.ts +136 -0
- package/dist/integrations/MessagingTool.d.ts.map +1 -0
- package/dist/integrations/MessagingTool.js +503 -0
- package/dist/integrations/MessagingTool.js.map +1 -0
- package/dist/integrations/SchedulerTool.d.ts +147 -0
- package/dist/integrations/SchedulerTool.d.ts.map +1 -0
- package/dist/integrations/SchedulerTool.js +471 -0
- package/dist/integrations/SchedulerTool.js.map +1 -0
- package/dist/integrations/WebhookTool.d.ts +97 -0
- package/dist/integrations/WebhookTool.d.ts.map +1 -0
- package/dist/integrations/WebhookTool.js +351 -0
- package/dist/integrations/WebhookTool.js.map +1 -0
- package/dist/integrations/index.d.ts +13 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/index.js +60 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/llm/LLMProvider.d.ts +83 -0
- package/dist/llm/LLMProvider.d.ts.map +1 -0
- package/dist/llm/LLMProvider.js +370 -0
- package/dist/llm/LLMProvider.js.map +1 -0
- package/dist/llm/index.d.ts +5 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +14 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/payment/PaymentProvider.d.ts +157 -0
- package/dist/payment/PaymentProvider.d.ts.map +1 -0
- package/dist/payment/PaymentProvider.js +525 -0
- package/dist/payment/PaymentProvider.js.map +1 -0
- package/dist/payment/index.d.ts +5 -0
- package/dist/payment/index.d.ts.map +1 -0
- package/dist/payment/index.js +16 -0
- package/dist/payment/index.js.map +1 -0
- package/dist/plugin/PluginManager.d.ts +156 -0
- package/dist/plugin/PluginManager.d.ts.map +1 -0
- package/dist/plugin/PluginManager.js +288 -0
- package/dist/plugin/PluginManager.js.map +1 -0
- package/dist/plugin/index.d.ts +5 -0
- package/dist/plugin/index.d.ts.map +1 -0
- package/dist/plugin/index.js +10 -0
- package/dist/plugin/index.js.map +1 -0
- package/dist/runtime/AgentXRuntime.d.ts +90 -0
- package/dist/runtime/AgentXRuntime.d.ts.map +1 -0
- package/dist/runtime/AgentXRuntime.js +469 -0
- package/dist/runtime/AgentXRuntime.js.map +1 -0
- package/dist/security/SecurityManager.d.ts +245 -0
- package/dist/security/SecurityManager.d.ts.map +1 -0
- package/dist/security/SecurityManager.js +512 -0
- package/dist/security/SecurityManager.js.map +1 -0
- package/dist/security/index.d.ts +5 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +14 -0
- package/dist/security/index.js.map +1 -0
- package/dist/tool/ToolRegistry.d.ts +58 -0
- package/dist/tool/ToolRegistry.d.ts.map +1 -0
- package/dist/tool/ToolRegistry.js +173 -0
- package/dist/tool/ToolRegistry.js.map +1 -0
- package/dist/tool/ToolValidator.d.ts +41 -0
- package/dist/tool/ToolValidator.d.ts.map +1 -0
- package/dist/tool/ToolValidator.js +158 -0
- package/dist/tool/ToolValidator.js.map +1 -0
- package/dist/tool/index.d.ts +6 -0
- package/dist/tool/index.d.ts.map +1 -0
- package/dist/tool/index.js +11 -0
- package/dist/tool/index.js.map +1 -0
- package/dist/transport/BaseTransport.d.ts +66 -0
- package/dist/transport/BaseTransport.d.ts.map +1 -0
- package/dist/transport/BaseTransport.js +103 -0
- package/dist/transport/BaseTransport.js.map +1 -0
- package/dist/transport/HttpTransport.d.ts +41 -0
- package/dist/transport/HttpTransport.d.ts.map +1 -0
- package/dist/transport/HttpTransport.js +160 -0
- package/dist/transport/HttpTransport.js.map +1 -0
- package/dist/transport/LocalTransport.d.ts +40 -0
- package/dist/transport/LocalTransport.d.ts.map +1 -0
- package/dist/transport/LocalTransport.js +157 -0
- package/dist/transport/LocalTransport.js.map +1 -0
- package/dist/transport/QueueTransport.d.ts +63 -0
- package/dist/transport/QueueTransport.d.ts.map +1 -0
- package/dist/transport/QueueTransport.js +194 -0
- package/dist/transport/QueueTransport.js.map +1 -0
- package/dist/transport/StdioTransport.d.ts +51 -0
- package/dist/transport/StdioTransport.d.ts.map +1 -0
- package/dist/transport/StdioTransport.js +216 -0
- package/dist/transport/StdioTransport.js.map +1 -0
- package/dist/transport/TransportFactory.d.ts +35 -0
- package/dist/transport/TransportFactory.d.ts.map +1 -0
- package/dist/transport/TransportFactory.js +100 -0
- package/dist/transport/TransportFactory.js.map +1 -0
- package/dist/transport/index.d.ts +10 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +19 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/types/agent.d.ts +66 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js +3 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/config.d.ts +60 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +6 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/credential.d.ts +38 -0
- package/dist/types/credential.d.ts.map +1 -0
- package/dist/types/credential.js +3 -0
- package/dist/types/credential.js.map +1 -0
- package/dist/types/error.d.ts +136 -0
- package/dist/types/error.d.ts.map +1 -0
- package/dist/types/error.js +223 -0
- package/dist/types/error.js.map +1 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +27 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/llm.d.ts +43 -0
- package/dist/types/llm.d.ts.map +1 -0
- package/dist/types/llm.js +3 -0
- package/dist/types/llm.js.map +1 -0
- package/dist/types/payment.d.ts +129 -0
- package/dist/types/payment.d.ts.map +1 -0
- package/dist/types/payment.js +6 -0
- package/dist/types/payment.js.map +1 -0
- package/dist/types/runtime.d.ts +31 -0
- package/dist/types/runtime.d.ts.map +1 -0
- package/dist/types/runtime.js +3 -0
- package/dist/types/runtime.js.map +1 -0
- package/dist/types/tool.d.ts +72 -0
- package/dist/types/tool.d.ts.map +1 -0
- package/dist/types/tool.js +3 -0
- package/dist/types/tool.js.map +1 -0
- package/dist/types/transport.d.ts +53 -0
- package/dist/types/transport.d.ts.map +1 -0
- package/dist/types/transport.js +3 -0
- package/dist/types/transport.js.map +1 -0
- package/dist/types/workflow.d.ts +72 -0
- package/dist/types/workflow.d.ts.map +1 -0
- package/dist/types/workflow.js +6 -0
- package/dist/types/workflow.js.map +1 -0
- package/dist/utils/factory.d.ts +14 -0
- package/dist/utils/factory.d.ts.map +1 -0
- package/dist/utils/factory.js +146 -0
- package/dist/utils/factory.js.map +1 -0
- package/dist/workflow/StateManager.d.ts +93 -0
- package/dist/workflow/StateManager.d.ts.map +1 -0
- package/dist/workflow/StateManager.js +223 -0
- package/dist/workflow/StateManager.js.map +1 -0
- package/dist/workflow/WorkflowDefinition.d.ts +49 -0
- package/dist/workflow/WorkflowDefinition.d.ts.map +1 -0
- package/dist/workflow/WorkflowDefinition.js +264 -0
- package/dist/workflow/WorkflowDefinition.js.map +1 -0
- package/dist/workflow/WorkflowExecutor.d.ts +42 -0
- package/dist/workflow/WorkflowExecutor.d.ts.map +1 -0
- package/dist/workflow/WorkflowExecutor.js +372 -0
- package/dist/workflow/WorkflowExecutor.js.map +1 -0
- package/dist/workflow/index.d.ts +7 -0
- package/dist/workflow/index.d.ts.map +1 -0
- package/dist/workflow/index.js +17 -0
- package/dist/workflow/index.js.map +1 -0
- package/package.json +122 -0
|
@@ -0,0 +1,765 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Google Workspace Integration Tools
|
|
4
|
+
* Provides integrations for Google Docs, Sheets, and Drive
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.GoogleDriveTool = exports.googleDriveToolSpec = exports.GoogleSheetsTool = exports.googleSheetsToolSpec = exports.GoogleDocsTool = exports.googleDocsToolSpec = void 0;
|
|
8
|
+
/**
|
|
9
|
+
* Google Docs Tool Specification
|
|
10
|
+
*/
|
|
11
|
+
exports.googleDocsToolSpec = {
|
|
12
|
+
name: 'google-docs',
|
|
13
|
+
version: '1.0.0',
|
|
14
|
+
description: 'Create and manage Google Docs documents',
|
|
15
|
+
inputSchema: {
|
|
16
|
+
type: 'object',
|
|
17
|
+
properties: {
|
|
18
|
+
action: {
|
|
19
|
+
type: 'string',
|
|
20
|
+
enum: ['create', 'get', 'update', 'append', 'delete'],
|
|
21
|
+
description: 'Google Docs action',
|
|
22
|
+
},
|
|
23
|
+
documentId: { type: 'string', description: 'Document ID' },
|
|
24
|
+
title: { type: 'string', description: 'Document title' },
|
|
25
|
+
content: { type: 'string', description: 'Document content' },
|
|
26
|
+
index: { type: 'number', description: 'Insert index position' },
|
|
27
|
+
},
|
|
28
|
+
required: ['action'],
|
|
29
|
+
},
|
|
30
|
+
outputSchema: {
|
|
31
|
+
type: 'object',
|
|
32
|
+
properties: {
|
|
33
|
+
success: { type: 'boolean' },
|
|
34
|
+
documentId: { type: 'string' },
|
|
35
|
+
title: { type: 'string' },
|
|
36
|
+
content: { type: 'string' },
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Google Docs Integration
|
|
42
|
+
*/
|
|
43
|
+
class GoogleDocsTool {
|
|
44
|
+
config;
|
|
45
|
+
logger;
|
|
46
|
+
documents = new Map();
|
|
47
|
+
constructor(config, logger) {
|
|
48
|
+
this.config = config;
|
|
49
|
+
this.logger = logger;
|
|
50
|
+
}
|
|
51
|
+
async execute(input) {
|
|
52
|
+
try {
|
|
53
|
+
switch (input.action) {
|
|
54
|
+
case 'create':
|
|
55
|
+
return this.createDocument(input.title, input.content);
|
|
56
|
+
case 'get':
|
|
57
|
+
return this.getDocument(input.documentId);
|
|
58
|
+
case 'update':
|
|
59
|
+
return this.updateDocument(input.documentId, input.content, input.index);
|
|
60
|
+
case 'append':
|
|
61
|
+
return this.appendToDocument(input.documentId, input.content);
|
|
62
|
+
case 'delete':
|
|
63
|
+
return this.deleteDocument(input.documentId);
|
|
64
|
+
default:
|
|
65
|
+
return { success: false, error: `Unknown action: ${input.action}` };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
this.logger.error('Google Docs error', error);
|
|
70
|
+
return { success: false, error: error.message };
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
async createDocument(title, content) {
|
|
74
|
+
if (!title) {
|
|
75
|
+
return { success: false, error: 'Title is required' };
|
|
76
|
+
}
|
|
77
|
+
const documentId = `doc_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
78
|
+
this.documents.set(documentId, { title, content: content || '' });
|
|
79
|
+
this.logger.info('Google Doc created', { documentId, title });
|
|
80
|
+
return {
|
|
81
|
+
success: true,
|
|
82
|
+
data: {
|
|
83
|
+
documentId,
|
|
84
|
+
title,
|
|
85
|
+
revisionId: '1',
|
|
86
|
+
documentUrl: `https://docs.google.com/document/d/${documentId}/edit`,
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
async getDocument(documentId) {
|
|
91
|
+
if (!documentId) {
|
|
92
|
+
return { success: false, error: 'Document ID is required' };
|
|
93
|
+
}
|
|
94
|
+
const doc = this.documents.get(documentId);
|
|
95
|
+
if (!doc) {
|
|
96
|
+
return { success: false, error: 'Document not found' };
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
success: true,
|
|
100
|
+
data: {
|
|
101
|
+
documentId,
|
|
102
|
+
title: doc.title,
|
|
103
|
+
content: doc.content,
|
|
104
|
+
revisionId: '1',
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
async updateDocument(documentId, content, index) {
|
|
109
|
+
if (!documentId || content === undefined) {
|
|
110
|
+
return { success: false, error: 'Document ID and content are required' };
|
|
111
|
+
}
|
|
112
|
+
const doc = this.documents.get(documentId);
|
|
113
|
+
if (!doc) {
|
|
114
|
+
return { success: false, error: 'Document not found' };
|
|
115
|
+
}
|
|
116
|
+
if (index !== undefined) {
|
|
117
|
+
// Insert at specific position
|
|
118
|
+
const before = doc.content.slice(0, index);
|
|
119
|
+
const after = doc.content.slice(index);
|
|
120
|
+
doc.content = before + content + after;
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
doc.content = content;
|
|
124
|
+
}
|
|
125
|
+
this.logger.info('Google Doc updated', { documentId });
|
|
126
|
+
return {
|
|
127
|
+
success: true,
|
|
128
|
+
data: {
|
|
129
|
+
documentId,
|
|
130
|
+
title: doc.title,
|
|
131
|
+
revisionId: '2',
|
|
132
|
+
},
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
async appendToDocument(documentId, content) {
|
|
136
|
+
if (!documentId || !content) {
|
|
137
|
+
return { success: false, error: 'Document ID and content are required' };
|
|
138
|
+
}
|
|
139
|
+
const doc = this.documents.get(documentId);
|
|
140
|
+
if (!doc) {
|
|
141
|
+
return { success: false, error: 'Document not found' };
|
|
142
|
+
}
|
|
143
|
+
doc.content += content;
|
|
144
|
+
this.logger.info('Content appended to Google Doc', { documentId });
|
|
145
|
+
return {
|
|
146
|
+
success: true,
|
|
147
|
+
data: {
|
|
148
|
+
documentId,
|
|
149
|
+
title: doc.title,
|
|
150
|
+
revisionId: '2',
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
async deleteDocument(documentId) {
|
|
155
|
+
if (!documentId) {
|
|
156
|
+
return { success: false, error: 'Document ID is required' };
|
|
157
|
+
}
|
|
158
|
+
const deleted = this.documents.delete(documentId);
|
|
159
|
+
if (!deleted) {
|
|
160
|
+
return { success: false, error: 'Document not found' };
|
|
161
|
+
}
|
|
162
|
+
this.logger.info('Google Doc deleted', { documentId });
|
|
163
|
+
return {
|
|
164
|
+
success: true,
|
|
165
|
+
data: { documentId, deleted: true },
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
getDocuments() {
|
|
169
|
+
return new Map(this.documents);
|
|
170
|
+
}
|
|
171
|
+
clearDocuments() {
|
|
172
|
+
this.documents.clear();
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
exports.GoogleDocsTool = GoogleDocsTool;
|
|
176
|
+
/**
|
|
177
|
+
* Google Sheets Tool Specification
|
|
178
|
+
*/
|
|
179
|
+
exports.googleSheetsToolSpec = {
|
|
180
|
+
name: 'google-sheets',
|
|
181
|
+
version: '1.0.0',
|
|
182
|
+
description: 'Create and manage Google Sheets spreadsheets',
|
|
183
|
+
inputSchema: {
|
|
184
|
+
type: 'object',
|
|
185
|
+
properties: {
|
|
186
|
+
action: {
|
|
187
|
+
type: 'string',
|
|
188
|
+
enum: ['create', 'get', 'read', 'write', 'append', 'clear', 'delete'],
|
|
189
|
+
description: 'Google Sheets action',
|
|
190
|
+
},
|
|
191
|
+
spreadsheetId: { type: 'string', description: 'Spreadsheet ID' },
|
|
192
|
+
title: { type: 'string', description: 'Spreadsheet title' },
|
|
193
|
+
sheetName: { type: 'string', description: 'Sheet name' },
|
|
194
|
+
range: { type: 'string', description: 'Cell range (e.g., A1:B10)' },
|
|
195
|
+
values: { type: 'array', description: '2D array of values' },
|
|
196
|
+
},
|
|
197
|
+
required: ['action'],
|
|
198
|
+
},
|
|
199
|
+
outputSchema: {
|
|
200
|
+
type: 'object',
|
|
201
|
+
properties: {
|
|
202
|
+
success: { type: 'boolean' },
|
|
203
|
+
spreadsheetId: { type: 'string' },
|
|
204
|
+
values: { type: 'array' },
|
|
205
|
+
updatedCells: { type: 'number' },
|
|
206
|
+
},
|
|
207
|
+
},
|
|
208
|
+
};
|
|
209
|
+
/**
|
|
210
|
+
* Google Sheets Integration
|
|
211
|
+
*/
|
|
212
|
+
class GoogleSheetsTool {
|
|
213
|
+
config;
|
|
214
|
+
logger;
|
|
215
|
+
spreadsheets = new Map();
|
|
216
|
+
constructor(config, logger) {
|
|
217
|
+
this.config = config;
|
|
218
|
+
this.logger = logger;
|
|
219
|
+
}
|
|
220
|
+
async execute(input) {
|
|
221
|
+
try {
|
|
222
|
+
switch (input.action) {
|
|
223
|
+
case 'create':
|
|
224
|
+
return this.createSpreadsheet(input.title);
|
|
225
|
+
case 'get':
|
|
226
|
+
return this.getSpreadsheet(input.spreadsheetId);
|
|
227
|
+
case 'read':
|
|
228
|
+
return this.readRange(input.spreadsheetId, input.sheetName || 'Sheet1', input.range);
|
|
229
|
+
case 'write':
|
|
230
|
+
return this.writeRange(input.spreadsheetId, input.sheetName || 'Sheet1', input.range, input.values);
|
|
231
|
+
case 'append':
|
|
232
|
+
return this.appendRows(input.spreadsheetId, input.sheetName || 'Sheet1', input.values);
|
|
233
|
+
case 'clear':
|
|
234
|
+
return this.clearRange(input.spreadsheetId, input.sheetName || 'Sheet1', input.range);
|
|
235
|
+
case 'delete':
|
|
236
|
+
return this.deleteSpreadsheet(input.spreadsheetId);
|
|
237
|
+
default:
|
|
238
|
+
return { success: false, error: `Unknown action: ${input.action}` };
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
this.logger.error('Google Sheets error', error);
|
|
243
|
+
return { success: false, error: error.message };
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
async createSpreadsheet(title) {
|
|
247
|
+
if (!title) {
|
|
248
|
+
return { success: false, error: 'Title is required' };
|
|
249
|
+
}
|
|
250
|
+
const spreadsheetId = `sheet_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
251
|
+
this.spreadsheets.set(spreadsheetId, {
|
|
252
|
+
title,
|
|
253
|
+
sheets: new Map([['Sheet1', []]]),
|
|
254
|
+
});
|
|
255
|
+
this.logger.info('Google Sheet created', { spreadsheetId, title });
|
|
256
|
+
return {
|
|
257
|
+
success: true,
|
|
258
|
+
data: {
|
|
259
|
+
spreadsheetId,
|
|
260
|
+
title,
|
|
261
|
+
spreadsheetUrl: `https://docs.google.com/spreadsheets/d/${spreadsheetId}/edit`,
|
|
262
|
+
sheets: [{ sheetId: 0, title: 'Sheet1' }],
|
|
263
|
+
},
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
async getSpreadsheet(spreadsheetId) {
|
|
267
|
+
if (!spreadsheetId) {
|
|
268
|
+
return { success: false, error: 'Spreadsheet ID is required' };
|
|
269
|
+
}
|
|
270
|
+
const spreadsheet = this.spreadsheets.get(spreadsheetId);
|
|
271
|
+
if (!spreadsheet) {
|
|
272
|
+
return { success: false, error: 'Spreadsheet not found' };
|
|
273
|
+
}
|
|
274
|
+
const sheets = Array.from(spreadsheet.sheets.keys()).map((name, index) => ({
|
|
275
|
+
sheetId: index,
|
|
276
|
+
title: name,
|
|
277
|
+
}));
|
|
278
|
+
return {
|
|
279
|
+
success: true,
|
|
280
|
+
data: {
|
|
281
|
+
spreadsheetId,
|
|
282
|
+
title: spreadsheet.title,
|
|
283
|
+
sheets,
|
|
284
|
+
},
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
async readRange(spreadsheetId, sheetName, range) {
|
|
288
|
+
if (!spreadsheetId || !range) {
|
|
289
|
+
return { success: false, error: 'Spreadsheet ID and range are required' };
|
|
290
|
+
}
|
|
291
|
+
const spreadsheet = this.spreadsheets.get(spreadsheetId);
|
|
292
|
+
if (!spreadsheet) {
|
|
293
|
+
return { success: false, error: 'Spreadsheet not found' };
|
|
294
|
+
}
|
|
295
|
+
const sheet = spreadsheet.sheets.get(sheetName);
|
|
296
|
+
if (!sheet) {
|
|
297
|
+
return { success: false, error: `Sheet '${sheetName}' not found` };
|
|
298
|
+
}
|
|
299
|
+
const { startRow, startCol, endRow, endCol } = this.parseRange(range);
|
|
300
|
+
const values = [];
|
|
301
|
+
for (let row = startRow; row <= endRow && row < sheet.length; row++) {
|
|
302
|
+
const rowData = [];
|
|
303
|
+
for (let col = startCol; col <= endCol; col++) {
|
|
304
|
+
rowData.push(sheet[row]?.[col] ?? null);
|
|
305
|
+
}
|
|
306
|
+
values.push(rowData);
|
|
307
|
+
}
|
|
308
|
+
return {
|
|
309
|
+
success: true,
|
|
310
|
+
data: {
|
|
311
|
+
spreadsheetId,
|
|
312
|
+
range: `${sheetName}!${range}`,
|
|
313
|
+
values,
|
|
314
|
+
},
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
async writeRange(spreadsheetId, sheetName, range, values) {
|
|
318
|
+
if (!spreadsheetId || !range || !values) {
|
|
319
|
+
return { success: false, error: 'Spreadsheet ID, range, and values are required' };
|
|
320
|
+
}
|
|
321
|
+
const spreadsheet = this.spreadsheets.get(spreadsheetId);
|
|
322
|
+
if (!spreadsheet) {
|
|
323
|
+
return { success: false, error: 'Spreadsheet not found' };
|
|
324
|
+
}
|
|
325
|
+
let sheet = spreadsheet.sheets.get(sheetName);
|
|
326
|
+
if (!sheet) {
|
|
327
|
+
sheet = [];
|
|
328
|
+
spreadsheet.sheets.set(sheetName, sheet);
|
|
329
|
+
}
|
|
330
|
+
const { startRow, startCol } = this.parseRange(range);
|
|
331
|
+
let updatedCells = 0;
|
|
332
|
+
for (let i = 0; i < values.length; i++) {
|
|
333
|
+
const rowIndex = startRow + i;
|
|
334
|
+
if (!sheet[rowIndex]) {
|
|
335
|
+
sheet[rowIndex] = [];
|
|
336
|
+
}
|
|
337
|
+
for (let j = 0; j < values[i].length; j++) {
|
|
338
|
+
sheet[rowIndex][startCol + j] = values[i][j];
|
|
339
|
+
updatedCells++;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
this.logger.info('Google Sheet range written', { spreadsheetId, range, updatedCells });
|
|
343
|
+
return {
|
|
344
|
+
success: true,
|
|
345
|
+
data: {
|
|
346
|
+
spreadsheetId,
|
|
347
|
+
updatedRange: `${sheetName}!${range}`,
|
|
348
|
+
updatedRows: values.length,
|
|
349
|
+
updatedColumns: values[0]?.length || 0,
|
|
350
|
+
updatedCells,
|
|
351
|
+
},
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
async appendRows(spreadsheetId, sheetName, values) {
|
|
355
|
+
if (!spreadsheetId || !values) {
|
|
356
|
+
return { success: false, error: 'Spreadsheet ID and values are required' };
|
|
357
|
+
}
|
|
358
|
+
const spreadsheet = this.spreadsheets.get(spreadsheetId);
|
|
359
|
+
if (!spreadsheet) {
|
|
360
|
+
return { success: false, error: 'Spreadsheet not found' };
|
|
361
|
+
}
|
|
362
|
+
let sheet = spreadsheet.sheets.get(sheetName);
|
|
363
|
+
if (!sheet) {
|
|
364
|
+
sheet = [];
|
|
365
|
+
spreadsheet.sheets.set(sheetName, sheet);
|
|
366
|
+
}
|
|
367
|
+
const startRow = sheet.length;
|
|
368
|
+
sheet.push(...values);
|
|
369
|
+
this.logger.info('Rows appended to Google Sheet', { spreadsheetId, rowsAdded: values.length });
|
|
370
|
+
return {
|
|
371
|
+
success: true,
|
|
372
|
+
data: {
|
|
373
|
+
spreadsheetId,
|
|
374
|
+
updatedRange: `${sheetName}!A${startRow + 1}`,
|
|
375
|
+
updatedRows: values.length,
|
|
376
|
+
updatedCells: values.reduce((sum, row) => sum + row.length, 0),
|
|
377
|
+
},
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
async clearRange(spreadsheetId, sheetName, range) {
|
|
381
|
+
if (!spreadsheetId || !range) {
|
|
382
|
+
return { success: false, error: 'Spreadsheet ID and range are required' };
|
|
383
|
+
}
|
|
384
|
+
const spreadsheet = this.spreadsheets.get(spreadsheetId);
|
|
385
|
+
if (!spreadsheet) {
|
|
386
|
+
return { success: false, error: 'Spreadsheet not found' };
|
|
387
|
+
}
|
|
388
|
+
const sheet = spreadsheet.sheets.get(sheetName);
|
|
389
|
+
if (!sheet) {
|
|
390
|
+
return { success: false, error: `Sheet '${sheetName}' not found` };
|
|
391
|
+
}
|
|
392
|
+
const { startRow, startCol, endRow, endCol } = this.parseRange(range);
|
|
393
|
+
let clearedCells = 0;
|
|
394
|
+
for (let row = startRow; row <= endRow && row < sheet.length; row++) {
|
|
395
|
+
for (let col = startCol; col <= endCol && col < (sheet[row]?.length || 0); col++) {
|
|
396
|
+
if (sheet[row]) {
|
|
397
|
+
sheet[row][col] = null;
|
|
398
|
+
clearedCells++;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
this.logger.info('Google Sheet range cleared', { spreadsheetId, range, clearedCells });
|
|
403
|
+
return {
|
|
404
|
+
success: true,
|
|
405
|
+
data: {
|
|
406
|
+
spreadsheetId,
|
|
407
|
+
clearedRange: `${sheetName}!${range}`,
|
|
408
|
+
clearedCells,
|
|
409
|
+
},
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
async deleteSpreadsheet(spreadsheetId) {
|
|
413
|
+
if (!spreadsheetId) {
|
|
414
|
+
return { success: false, error: 'Spreadsheet ID is required' };
|
|
415
|
+
}
|
|
416
|
+
const deleted = this.spreadsheets.delete(spreadsheetId);
|
|
417
|
+
if (!deleted) {
|
|
418
|
+
return { success: false, error: 'Spreadsheet not found' };
|
|
419
|
+
}
|
|
420
|
+
this.logger.info('Google Sheet deleted', { spreadsheetId });
|
|
421
|
+
return {
|
|
422
|
+
success: true,
|
|
423
|
+
data: { spreadsheetId, deleted: true },
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
parseRange(range) {
|
|
427
|
+
// Parse range like "A1:B10" or "A1"
|
|
428
|
+
const match = range.match(/^([A-Z]+)(\d+)(?::([A-Z]+)(\d+))?$/i);
|
|
429
|
+
if (!match) {
|
|
430
|
+
return { startRow: 0, startCol: 0, endRow: 999, endCol: 25 };
|
|
431
|
+
}
|
|
432
|
+
const colToNum = (col) => {
|
|
433
|
+
let num = 0;
|
|
434
|
+
for (let i = 0; i < col.length; i++) {
|
|
435
|
+
num = num * 26 + (col.charCodeAt(i) - 64);
|
|
436
|
+
}
|
|
437
|
+
return num - 1;
|
|
438
|
+
};
|
|
439
|
+
const startCol = colToNum(match[1].toUpperCase());
|
|
440
|
+
const startRow = parseInt(match[2], 10) - 1;
|
|
441
|
+
const endCol = match[3] ? colToNum(match[3].toUpperCase()) : startCol;
|
|
442
|
+
const endRow = match[4] ? parseInt(match[4], 10) - 1 : startRow;
|
|
443
|
+
return { startRow, startCol, endRow, endCol };
|
|
444
|
+
}
|
|
445
|
+
getSpreadsheets() {
|
|
446
|
+
return new Map(this.spreadsheets);
|
|
447
|
+
}
|
|
448
|
+
clearSpreadsheets() {
|
|
449
|
+
this.spreadsheets.clear();
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
exports.GoogleSheetsTool = GoogleSheetsTool;
|
|
453
|
+
/**
|
|
454
|
+
* Google Drive Tool Specification
|
|
455
|
+
*/
|
|
456
|
+
exports.googleDriveToolSpec = {
|
|
457
|
+
name: 'google-drive',
|
|
458
|
+
version: '1.0.0',
|
|
459
|
+
description: 'Manage files and folders in Google Drive',
|
|
460
|
+
inputSchema: {
|
|
461
|
+
type: 'object',
|
|
462
|
+
properties: {
|
|
463
|
+
action: {
|
|
464
|
+
type: 'string',
|
|
465
|
+
enum: ['list', 'get', 'create', 'upload', 'download', 'delete', 'move', 'copy', 'share'],
|
|
466
|
+
description: 'Google Drive action',
|
|
467
|
+
},
|
|
468
|
+
fileId: { type: 'string', description: 'File ID' },
|
|
469
|
+
folderId: { type: 'string', description: 'Folder ID' },
|
|
470
|
+
name: { type: 'string', description: 'File or folder name' },
|
|
471
|
+
mimeType: { type: 'string', description: 'MIME type' },
|
|
472
|
+
content: { type: 'string', description: 'File content (base64 for binary)' },
|
|
473
|
+
query: { type: 'string', description: 'Search query' },
|
|
474
|
+
email: { type: 'string', description: 'Email for sharing' },
|
|
475
|
+
role: { type: 'string', enum: ['reader', 'writer', 'commenter'], description: 'Share role' },
|
|
476
|
+
},
|
|
477
|
+
required: ['action'],
|
|
478
|
+
},
|
|
479
|
+
outputSchema: {
|
|
480
|
+
type: 'object',
|
|
481
|
+
properties: {
|
|
482
|
+
success: { type: 'boolean' },
|
|
483
|
+
fileId: { type: 'string' },
|
|
484
|
+
files: { type: 'array' },
|
|
485
|
+
content: { type: 'string' },
|
|
486
|
+
},
|
|
487
|
+
},
|
|
488
|
+
};
|
|
489
|
+
/**
|
|
490
|
+
* Google Drive Integration
|
|
491
|
+
*/
|
|
492
|
+
class GoogleDriveTool {
|
|
493
|
+
config;
|
|
494
|
+
logger;
|
|
495
|
+
files = new Map();
|
|
496
|
+
constructor(config, logger) {
|
|
497
|
+
this.config = config;
|
|
498
|
+
this.logger = logger;
|
|
499
|
+
// Create root folder
|
|
500
|
+
this.files.set('root', {
|
|
501
|
+
id: 'root',
|
|
502
|
+
name: 'My Drive',
|
|
503
|
+
mimeType: 'application/vnd.google-apps.folder',
|
|
504
|
+
createdTime: new Date(),
|
|
505
|
+
modifiedTime: new Date(),
|
|
506
|
+
permissions: [],
|
|
507
|
+
});
|
|
508
|
+
}
|
|
509
|
+
async execute(input) {
|
|
510
|
+
try {
|
|
511
|
+
switch (input.action) {
|
|
512
|
+
case 'list':
|
|
513
|
+
return this.listFiles(input.folderId, input.query);
|
|
514
|
+
case 'get':
|
|
515
|
+
return this.getFile(input.fileId);
|
|
516
|
+
case 'create':
|
|
517
|
+
return this.createFolder(input.name, input.folderId);
|
|
518
|
+
case 'upload':
|
|
519
|
+
return this.uploadFile(input.name, input.content, input.mimeType, input.folderId);
|
|
520
|
+
case 'download':
|
|
521
|
+
return this.downloadFile(input.fileId);
|
|
522
|
+
case 'delete':
|
|
523
|
+
return this.deleteFile(input.fileId);
|
|
524
|
+
case 'move':
|
|
525
|
+
return this.moveFile(input.fileId, input.folderId);
|
|
526
|
+
case 'copy':
|
|
527
|
+
return this.copyFile(input.fileId, input.name);
|
|
528
|
+
case 'share':
|
|
529
|
+
return this.shareFile(input.fileId, input.email, input.role);
|
|
530
|
+
default:
|
|
531
|
+
return { success: false, error: `Unknown action: ${input.action}` };
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
catch (error) {
|
|
535
|
+
this.logger.error('Google Drive error', error);
|
|
536
|
+
return { success: false, error: error.message };
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
async listFiles(folderId, query) {
|
|
540
|
+
const parentId = folderId || 'root';
|
|
541
|
+
let files = Array.from(this.files.values()).filter(f => f.id !== 'root' && (f.parentId === parentId || (!f.parentId && parentId === 'root')));
|
|
542
|
+
if (query) {
|
|
543
|
+
const lowerQuery = query.toLowerCase();
|
|
544
|
+
files = files.filter(f => f.name.toLowerCase().includes(lowerQuery));
|
|
545
|
+
}
|
|
546
|
+
return {
|
|
547
|
+
success: true,
|
|
548
|
+
data: {
|
|
549
|
+
files: files.map(f => ({
|
|
550
|
+
id: f.id,
|
|
551
|
+
name: f.name,
|
|
552
|
+
mimeType: f.mimeType,
|
|
553
|
+
createdTime: f.createdTime.toISOString(),
|
|
554
|
+
modifiedTime: f.modifiedTime.toISOString(),
|
|
555
|
+
})),
|
|
556
|
+
},
|
|
557
|
+
};
|
|
558
|
+
}
|
|
559
|
+
async getFile(fileId) {
|
|
560
|
+
if (!fileId) {
|
|
561
|
+
return { success: false, error: 'File ID is required' };
|
|
562
|
+
}
|
|
563
|
+
const file = this.files.get(fileId);
|
|
564
|
+
if (!file) {
|
|
565
|
+
return { success: false, error: 'File not found' };
|
|
566
|
+
}
|
|
567
|
+
return {
|
|
568
|
+
success: true,
|
|
569
|
+
data: {
|
|
570
|
+
id: file.id,
|
|
571
|
+
name: file.name,
|
|
572
|
+
mimeType: file.mimeType,
|
|
573
|
+
createdTime: file.createdTime.toISOString(),
|
|
574
|
+
modifiedTime: file.modifiedTime.toISOString(),
|
|
575
|
+
permissions: file.permissions,
|
|
576
|
+
},
|
|
577
|
+
};
|
|
578
|
+
}
|
|
579
|
+
async createFolder(name, parentId) {
|
|
580
|
+
if (!name) {
|
|
581
|
+
return { success: false, error: 'Folder name is required' };
|
|
582
|
+
}
|
|
583
|
+
const fileId = `folder_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
584
|
+
const folder = {
|
|
585
|
+
id: fileId,
|
|
586
|
+
name,
|
|
587
|
+
mimeType: 'application/vnd.google-apps.folder',
|
|
588
|
+
parentId: parentId || 'root',
|
|
589
|
+
createdTime: new Date(),
|
|
590
|
+
modifiedTime: new Date(),
|
|
591
|
+
permissions: [],
|
|
592
|
+
};
|
|
593
|
+
this.files.set(fileId, folder);
|
|
594
|
+
this.logger.info('Google Drive folder created', { fileId, name });
|
|
595
|
+
return {
|
|
596
|
+
success: true,
|
|
597
|
+
data: {
|
|
598
|
+
id: fileId,
|
|
599
|
+
name,
|
|
600
|
+
mimeType: folder.mimeType,
|
|
601
|
+
},
|
|
602
|
+
};
|
|
603
|
+
}
|
|
604
|
+
async uploadFile(name, content, mimeType, parentId) {
|
|
605
|
+
if (!name || !content) {
|
|
606
|
+
return { success: false, error: 'File name and content are required' };
|
|
607
|
+
}
|
|
608
|
+
const fileId = `file_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
609
|
+
const file = {
|
|
610
|
+
id: fileId,
|
|
611
|
+
name,
|
|
612
|
+
mimeType: mimeType || 'application/octet-stream',
|
|
613
|
+
content,
|
|
614
|
+
parentId: parentId || 'root',
|
|
615
|
+
createdTime: new Date(),
|
|
616
|
+
modifiedTime: new Date(),
|
|
617
|
+
permissions: [],
|
|
618
|
+
};
|
|
619
|
+
this.files.set(fileId, file);
|
|
620
|
+
this.logger.info('File uploaded to Google Drive', { fileId, name });
|
|
621
|
+
return {
|
|
622
|
+
success: true,
|
|
623
|
+
data: {
|
|
624
|
+
id: fileId,
|
|
625
|
+
name,
|
|
626
|
+
mimeType: file.mimeType,
|
|
627
|
+
size: content.length,
|
|
628
|
+
},
|
|
629
|
+
};
|
|
630
|
+
}
|
|
631
|
+
async downloadFile(fileId) {
|
|
632
|
+
if (!fileId) {
|
|
633
|
+
return { success: false, error: 'File ID is required' };
|
|
634
|
+
}
|
|
635
|
+
const file = this.files.get(fileId);
|
|
636
|
+
if (!file) {
|
|
637
|
+
return { success: false, error: 'File not found' };
|
|
638
|
+
}
|
|
639
|
+
if (file.mimeType === 'application/vnd.google-apps.folder') {
|
|
640
|
+
return { success: false, error: 'Cannot download a folder' };
|
|
641
|
+
}
|
|
642
|
+
return {
|
|
643
|
+
success: true,
|
|
644
|
+
data: {
|
|
645
|
+
id: file.id,
|
|
646
|
+
name: file.name,
|
|
647
|
+
mimeType: file.mimeType,
|
|
648
|
+
content: file.content,
|
|
649
|
+
},
|
|
650
|
+
};
|
|
651
|
+
}
|
|
652
|
+
async deleteFile(fileId) {
|
|
653
|
+
if (!fileId) {
|
|
654
|
+
return { success: false, error: 'File ID is required' };
|
|
655
|
+
}
|
|
656
|
+
if (fileId === 'root') {
|
|
657
|
+
return { success: false, error: 'Cannot delete root folder' };
|
|
658
|
+
}
|
|
659
|
+
const deleted = this.files.delete(fileId);
|
|
660
|
+
if (!deleted) {
|
|
661
|
+
return { success: false, error: 'File not found' };
|
|
662
|
+
}
|
|
663
|
+
this.logger.info('File deleted from Google Drive', { fileId });
|
|
664
|
+
return {
|
|
665
|
+
success: true,
|
|
666
|
+
data: { fileId, deleted: true },
|
|
667
|
+
};
|
|
668
|
+
}
|
|
669
|
+
async moveFile(fileId, newParentId) {
|
|
670
|
+
if (!fileId || !newParentId) {
|
|
671
|
+
return { success: false, error: 'File ID and new parent ID are required' };
|
|
672
|
+
}
|
|
673
|
+
const file = this.files.get(fileId);
|
|
674
|
+
if (!file) {
|
|
675
|
+
return { success: false, error: 'File not found' };
|
|
676
|
+
}
|
|
677
|
+
const newParent = this.files.get(newParentId);
|
|
678
|
+
if (!newParent || newParent.mimeType !== 'application/vnd.google-apps.folder') {
|
|
679
|
+
return { success: false, error: 'Destination folder not found' };
|
|
680
|
+
}
|
|
681
|
+
file.parentId = newParentId;
|
|
682
|
+
file.modifiedTime = new Date();
|
|
683
|
+
this.logger.info('File moved in Google Drive', { fileId, newParentId });
|
|
684
|
+
return {
|
|
685
|
+
success: true,
|
|
686
|
+
data: {
|
|
687
|
+
id: file.id,
|
|
688
|
+
name: file.name,
|
|
689
|
+
parentId: newParentId,
|
|
690
|
+
},
|
|
691
|
+
};
|
|
692
|
+
}
|
|
693
|
+
async copyFile(fileId, newName) {
|
|
694
|
+
if (!fileId) {
|
|
695
|
+
return { success: false, error: 'File ID is required' };
|
|
696
|
+
}
|
|
697
|
+
const file = this.files.get(fileId);
|
|
698
|
+
if (!file) {
|
|
699
|
+
return { success: false, error: 'File not found' };
|
|
700
|
+
}
|
|
701
|
+
const newFileId = `file_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
702
|
+
const newFile = {
|
|
703
|
+
...file,
|
|
704
|
+
id: newFileId,
|
|
705
|
+
name: newName || `Copy of ${file.name}`,
|
|
706
|
+
createdTime: new Date(),
|
|
707
|
+
modifiedTime: new Date(),
|
|
708
|
+
permissions: [],
|
|
709
|
+
};
|
|
710
|
+
this.files.set(newFileId, newFile);
|
|
711
|
+
this.logger.info('File copied in Google Drive', { fileId, newFileId });
|
|
712
|
+
return {
|
|
713
|
+
success: true,
|
|
714
|
+
data: {
|
|
715
|
+
id: newFileId,
|
|
716
|
+
name: newFile.name,
|
|
717
|
+
mimeType: newFile.mimeType,
|
|
718
|
+
},
|
|
719
|
+
};
|
|
720
|
+
}
|
|
721
|
+
async shareFile(fileId, email, role) {
|
|
722
|
+
if (!fileId || !email || !role) {
|
|
723
|
+
return { success: false, error: 'File ID, email, and role are required' };
|
|
724
|
+
}
|
|
725
|
+
const file = this.files.get(fileId);
|
|
726
|
+
if (!file) {
|
|
727
|
+
return { success: false, error: 'File not found' };
|
|
728
|
+
}
|
|
729
|
+
// Check if permission already exists
|
|
730
|
+
const existingIndex = file.permissions.findIndex(p => p.email === email);
|
|
731
|
+
if (existingIndex >= 0) {
|
|
732
|
+
file.permissions[existingIndex].role = role;
|
|
733
|
+
}
|
|
734
|
+
else {
|
|
735
|
+
file.permissions.push({ email, role });
|
|
736
|
+
}
|
|
737
|
+
this.logger.info('File shared in Google Drive', { fileId, email, role });
|
|
738
|
+
return {
|
|
739
|
+
success: true,
|
|
740
|
+
data: {
|
|
741
|
+
fileId,
|
|
742
|
+
email,
|
|
743
|
+
role,
|
|
744
|
+
permissionId: `perm_${Date.now()}`,
|
|
745
|
+
},
|
|
746
|
+
};
|
|
747
|
+
}
|
|
748
|
+
getFiles() {
|
|
749
|
+
return new Map(this.files);
|
|
750
|
+
}
|
|
751
|
+
clearFiles() {
|
|
752
|
+
this.files.clear();
|
|
753
|
+
// Recreate root
|
|
754
|
+
this.files.set('root', {
|
|
755
|
+
id: 'root',
|
|
756
|
+
name: 'My Drive',
|
|
757
|
+
mimeType: 'application/vnd.google-apps.folder',
|
|
758
|
+
createdTime: new Date(),
|
|
759
|
+
modifiedTime: new Date(),
|
|
760
|
+
permissions: [],
|
|
761
|
+
});
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
exports.GoogleDriveTool = GoogleDriveTool;
|
|
765
|
+
//# sourceMappingURL=GoogleWorkspaceTool.js.map
|