-
Notifications
You must be signed in to change notification settings - Fork 3.7k
Expand file tree
/
Copy pathwrite.ts
More file actions
130 lines (119 loc) · 3.69 KB
/
Copy pathwrite.ts
File metadata and controls
130 lines (119 loc) · 3.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
import type { GoogleDocsToolParams, GoogleDocsWriteResponse } from '@/tools/google_docs/types'
import type { ToolConfig } from '@/tools/types'
export const writeTool: ToolConfig<GoogleDocsToolParams, GoogleDocsWriteResponse> = {
id: 'google_docs_write',
name: 'Write to Google Docs Document',
description:
'Append content to a Google Docs document. Content is inserted literally; Markdown is not interpreted. For formatted output from Markdown, use the Create operation with the markdown toggle enabled.',
version: '1.0',
oauth: {
required: true,
provider: 'google-docs',
},
params: {
accessToken: {
type: 'string',
required: true,
visibility: 'hidden',
description: 'The access token for the Google Docs API',
},
documentId: {
type: 'string',
required: true,
description: 'The ID of the document to write to',
},
content: {
type: 'string',
required: true,
description: 'The content to write to the document',
},
},
request: {
url: (params) => {
// Ensure documentId is valid
const documentId = params.documentId?.trim() || params.manualDocumentId?.trim()
if (!documentId) {
throw new Error('Document ID is required')
}
return `https://docs.googleapis.com/v1/documents/${documentId}:batchUpdate`
},
method: 'POST',
headers: (params) => {
// Validate access token
if (!params.accessToken) {
throw new Error('Access token is required')
}
return {
Authorization: `Bearer ${params.accessToken}`,
'Content-Type': 'application/json',
}
},
body: (params) => {
// Validate content
if (!params.content) {
throw new Error('Content is required')
}
// Following the exact format from the Google Docs API examples
// Always insert at the end of the document to avoid duplication
// See: https://developers.google.com/docs/api/reference/rest/v1/documents/request#InsertTextRequest
const requestBody = {
requests: [
{
insertText: {
endOfSegmentLocation: {},
text: params.content,
},
},
],
}
return requestBody
},
},
outputs: {
updatedContent: {
type: 'boolean',
description: 'Indicates if document content was updated successfully',
},
metadata: {
type: 'json',
description: 'Updated document metadata including ID, title, and URL',
properties: {
documentId: { type: 'string', description: 'Google Docs document ID' },
title: { type: 'string', description: 'Document title' },
mimeType: { type: 'string', description: 'Document MIME type' },
url: { type: 'string', description: 'Document URL' },
},
},
},
transformResponse: async (response: Response) => {
const responseText = await response.text()
// Parse the response if it's not empty
let _data = {}
if (responseText.trim()) {
_data = JSON.parse(responseText)
}
// Get the document ID from the URL
const urlParts = response.url.split('/')
let documentId = ''
for (let i = 0; i < urlParts.length; i++) {
if (urlParts[i] === 'documents' && i + 1 < urlParts.length) {
documentId = urlParts[i + 1].split(':')[0]
break
}
}
// Create document metadata
const metadata = {
documentId,
title: 'Updated Document',
mimeType: 'application/vnd.google-apps.document',
url: `https://docs.google.com/document/d/${documentId}/edit`,
}
return {
success: true,
output: {
updatedContent: true,
metadata,
},
}
},
}