diff --git a/packages/components/credentials/GoogleDocsOAuth2.credential.ts b/packages/components/credentials/GoogleDocsOAuth2.credential.ts
new file mode 100644
index 000000000..24cb5d6d5
--- /dev/null
+++ b/packages/components/credentials/GoogleDocsOAuth2.credential.ts
@@ -0,0 +1,62 @@
+import { INodeParams, INodeCredential } from '../src/Interface'
+const scopes = [
+ 'https://www.googleapis.com/auth/documents',
+ 'https://www.googleapis.com/auth/drive',
+ 'https://www.googleapis.com/auth/drive.file'
+]
+
+class GoogleDocsOAuth2 implements INodeCredential {
+ label: string
+ name: string
+ version: number
+ inputs: INodeParams[]
+ description: string
+
+ constructor() {
+ this.label = 'Google Docs OAuth2'
+ this.name = 'googleDocsOAuth2'
+ this.version = 1.0
+ this.description =
+ 'You can find the setup instructions here'
+ this.inputs = [
+ {
+ label: 'Authorization URL',
+ name: 'authorizationUrl',
+ type: 'string',
+ default: 'https://accounts.google.com/o/oauth2/v2/auth'
+ },
+ {
+ label: 'Access Token URL',
+ name: 'accessTokenUrl',
+ type: 'string',
+ default: 'https://oauth2.googleapis.com/token'
+ },
+ {
+ label: 'Client ID',
+ name: 'clientId',
+ type: 'string'
+ },
+ {
+ label: 'Client Secret',
+ name: 'clientSecret',
+ type: 'password'
+ },
+ {
+ label: 'Additional Parameters',
+ name: 'additionalParameters',
+ type: 'string',
+ default: 'access_type=offline&prompt=consent',
+ hidden: true
+ },
+ {
+ label: 'Scope',
+ name: 'scope',
+ type: 'string',
+ hidden: true,
+ default: scopes.join(' ')
+ }
+ ]
+ }
+}
+
+module.exports = { credClass: GoogleDocsOAuth2 }
diff --git a/packages/components/nodes/agentflow/Tool/Tool.ts b/packages/components/nodes/agentflow/Tool/Tool.ts
index db7d11262..33947d813 100644
--- a/packages/components/nodes/agentflow/Tool/Tool.ts
+++ b/packages/components/nodes/agentflow/Tool/Tool.ts
@@ -226,6 +226,16 @@ class Tool_Agentflow implements INode {
const toolInstance = (await newToolNodeInstance.init(newNodeData, '', options)) as Tool | Tool[]
let toolCallArgs: Record = {}
+
+ if (newToolNodeInstance.transformNodeInputsToToolArgs) {
+ const defaultParams = newToolNodeInstance.transformNodeInputsToToolArgs(newNodeData)
+
+ toolCallArgs = {
+ ...defaultParams,
+ ...toolCallArgs
+ }
+ }
+
for (const item of toolInputArgs) {
const variableName = item.inputArgName
const variableValue = item.inputArgValue
diff --git a/packages/components/nodes/tools/Gmail/Gmail.ts b/packages/components/nodes/tools/Gmail/Gmail.ts
index 4c3054064..f164680aa 100644
--- a/packages/components/nodes/tools/Gmail/Gmail.ts
+++ b/packages/components/nodes/tools/Gmail/Gmail.ts
@@ -571,118 +571,7 @@ class Gmail_Tools implements INode {
actions = convertMultiOptionsToStringArray(nodeData.inputs?.threadActions)
}
- // Prepare default parameters for each action
- const defaultParams: ICommonObject = {}
-
- // Draft parameters
- const draftMaxResults = nodeData.inputs?.draftMaxResults
- const draftTo = nodeData.inputs?.draftTo
- const draftSubject = nodeData.inputs?.draftSubject
- const draftBody = nodeData.inputs?.draftBody
- const draftCc = nodeData.inputs?.draftCc
- const draftBcc = nodeData.inputs?.draftBcc
- const draftId = nodeData.inputs?.draftId
- const draftUpdateTo = nodeData.inputs?.draftUpdateTo
- const draftUpdateSubject = nodeData.inputs?.draftUpdateSubject
- const draftUpdateBody = nodeData.inputs?.draftUpdateBody
-
- // Message parameters
- const messageMaxResults = nodeData.inputs?.messageMaxResults
- const messageQuery = nodeData.inputs?.messageQuery
- const messageTo = nodeData.inputs?.messageTo
- const messageSubject = nodeData.inputs?.messageSubject
- const messageBody = nodeData.inputs?.messageBody
- const messageCc = nodeData.inputs?.messageCc
- const messageBcc = nodeData.inputs?.messageBcc
- const messageId = nodeData.inputs?.messageId
- const messageAddLabelIds = nodeData.inputs?.messageAddLabelIds
- const messageRemoveLabelIds = nodeData.inputs?.messageRemoveLabelIds
-
- // Label parameters
- const labelName = nodeData.inputs?.labelName
- const labelColor = nodeData.inputs?.labelColor
- const labelId = nodeData.inputs?.labelId
-
- // Thread parameters
- const threadMaxResults = nodeData.inputs?.threadMaxResults
- const threadQuery = nodeData.inputs?.threadQuery
- const threadId = nodeData.inputs?.threadId
- const threadAddLabelIds = nodeData.inputs?.threadAddLabelIds
- const threadRemoveLabelIds = nodeData.inputs?.threadRemoveLabelIds
-
- // Set default parameters based on actions
- actions.forEach((action) => {
- const params: ICommonObject = {}
-
- // Draft action parameters
- if (action.startsWith('list') && draftMaxResults) params.maxResults = draftMaxResults
- if (action === 'createDraft') {
- if (draftTo) params.to = draftTo
- if (draftSubject) params.subject = draftSubject
- if (draftBody) params.body = draftBody
- if (draftCc) params.cc = draftCc
- if (draftBcc) params.bcc = draftBcc
- }
- if (action === 'updateDraft') {
- if (draftId) params.draftId = draftId
- if (draftUpdateTo) params.to = draftUpdateTo
- if (draftUpdateSubject) params.subject = draftUpdateSubject
- if (draftUpdateBody) params.body = draftUpdateBody
- }
- if (['getDraft', 'sendDraft', 'deleteDraft'].includes(action) && draftId) {
- params.draftId = draftId
- }
-
- // Message action parameters
- if (action === 'listMessages') {
- if (messageMaxResults) params.maxResults = messageMaxResults
- if (messageQuery) params.query = messageQuery
- }
- if (action === 'sendMessage') {
- if (messageTo) params.to = messageTo
- if (messageSubject) params.subject = messageSubject
- if (messageBody) params.body = messageBody
- if (messageCc) params.cc = messageCc
- if (messageBcc) params.bcc = messageBcc
- }
- if (['getMessage', 'trashMessage', 'untrashMessage', 'deleteMessage'].includes(action) && messageId) {
- params.messageId = messageId
- }
- if (action === 'modifyMessage') {
- if (messageId) params.messageId = messageId
- if (messageAddLabelIds) params.addLabelIds = messageAddLabelIds.split(',').map((id: string) => id.trim())
- if (messageRemoveLabelIds) params.removeLabelIds = messageRemoveLabelIds.split(',').map((id: string) => id.trim())
- }
-
- // Label action parameters
- if (action === 'createLabel') {
- if (labelName) params.labelName = labelName
- if (labelColor) params.labelColor = labelColor
- }
- if (['getLabel', 'updateLabel', 'deleteLabel'].includes(action) && labelId) {
- params.labelId = labelId
- }
- if (action === 'updateLabel') {
- if (labelName) params.labelName = labelName
- if (labelColor) params.labelColor = labelColor
- }
-
- // Thread action parameters
- if (action === 'listThreads') {
- if (threadMaxResults) params.maxResults = threadMaxResults
- if (threadQuery) params.query = threadQuery
- }
- if (['getThread', 'trashThread', 'untrashThread', 'deleteThread'].includes(action) && threadId) {
- params.threadId = threadId
- }
- if (action === 'modifyThread') {
- if (threadId) params.threadId = threadId
- if (threadAddLabelIds) params.addLabelIds = threadAddLabelIds.split(',').map((id: string) => id.trim())
- if (threadRemoveLabelIds) params.removeLabelIds = threadRemoveLabelIds.split(',').map((id: string) => id.trim())
- }
-
- defaultParams[action] = params
- })
+ const defaultParams = this.transformNodeInputsToToolArgs(nodeData)
// Create and return tools based on selected actions
const tools = createGmailTools({
@@ -693,6 +582,49 @@ class Gmail_Tools implements INode {
return tools
}
+
+ transformNodeInputsToToolArgs(nodeData: INodeData): Record {
+ // Collect default parameters from inputs
+ const defaultParams: Record = {}
+
+ // Draft parameters
+ if (nodeData.inputs?.draftMaxResults) defaultParams.draftMaxResults = nodeData.inputs.draftMaxResults
+ if (nodeData.inputs?.draftTo) defaultParams.draftTo = nodeData.inputs.draftTo
+ if (nodeData.inputs?.draftSubject) defaultParams.draftSubject = nodeData.inputs.draftSubject
+ if (nodeData.inputs?.draftBody) defaultParams.draftBody = nodeData.inputs.draftBody
+ if (nodeData.inputs?.draftCc) defaultParams.draftCc = nodeData.inputs.draftCc
+ if (nodeData.inputs?.draftBcc) defaultParams.draftBcc = nodeData.inputs.draftBcc
+ if (nodeData.inputs?.draftId) defaultParams.draftId = nodeData.inputs.draftId
+ if (nodeData.inputs?.draftUpdateTo) defaultParams.draftUpdateTo = nodeData.inputs.draftUpdateTo
+ if (nodeData.inputs?.draftUpdateSubject) defaultParams.draftUpdateSubject = nodeData.inputs.draftUpdateSubject
+ if (nodeData.inputs?.draftUpdateBody) defaultParams.draftUpdateBody = nodeData.inputs.draftUpdateBody
+
+ // Message parameters
+ if (nodeData.inputs?.messageMaxResults) defaultParams.messageMaxResults = nodeData.inputs.messageMaxResults
+ if (nodeData.inputs?.messageQuery) defaultParams.messageQuery = nodeData.inputs.messageQuery
+ if (nodeData.inputs?.messageTo) defaultParams.messageTo = nodeData.inputs.messageTo
+ if (nodeData.inputs?.messageSubject) defaultParams.messageSubject = nodeData.inputs.messageSubject
+ if (nodeData.inputs?.messageBody) defaultParams.messageBody = nodeData.inputs.messageBody
+ if (nodeData.inputs?.messageCc) defaultParams.messageCc = nodeData.inputs.messageCc
+ if (nodeData.inputs?.messageBcc) defaultParams.messageBcc = nodeData.inputs.messageBcc
+ if (nodeData.inputs?.messageId) defaultParams.messageId = nodeData.inputs.messageId
+ if (nodeData.inputs?.messageAddLabelIds) defaultParams.messageAddLabelIds = nodeData.inputs.messageAddLabelIds
+ if (nodeData.inputs?.messageRemoveLabelIds) defaultParams.messageRemoveLabelIds = nodeData.inputs.messageRemoveLabelIds
+
+ // Label parameters
+ if (nodeData.inputs?.labelName) defaultParams.labelName = nodeData.inputs.labelName
+ if (nodeData.inputs?.labelColor) defaultParams.labelColor = nodeData.inputs.labelColor
+ if (nodeData.inputs?.labelId) defaultParams.labelId = nodeData.inputs.labelId
+
+ // Thread parameters
+ if (nodeData.inputs?.threadMaxResults) defaultParams.threadMaxResults = nodeData.inputs.threadMaxResults
+ if (nodeData.inputs?.threadQuery) defaultParams.threadQuery = nodeData.inputs.threadQuery
+ if (nodeData.inputs?.threadId) defaultParams.threadId = nodeData.inputs.threadId
+ if (nodeData.inputs?.threadAddLabelIds) defaultParams.threadAddLabelIds = nodeData.inputs.threadAddLabelIds
+ if (nodeData.inputs?.threadRemoveLabelIds) defaultParams.threadRemoveLabelIds = nodeData.inputs.threadRemoveLabelIds
+
+ return defaultParams
+ }
}
module.exports = { nodeClass: Gmail_Tools }
diff --git a/packages/components/nodes/tools/GoogleCalendar/GoogleCalendar.ts b/packages/components/nodes/tools/GoogleCalendar/GoogleCalendar.ts
index 36ad7d810..38a0a6291 100644
--- a/packages/components/nodes/tools/GoogleCalendar/GoogleCalendar.ts
+++ b/packages/components/nodes/tools/GoogleCalendar/GoogleCalendar.ts
@@ -559,88 +559,7 @@ class GoogleCalendar_Tools implements INode {
actions = convertMultiOptionsToStringArray(nodeData.inputs?.freebusyActions)
}
- // Create default params object based on inputs
- const defaultParams: any = {}
-
- // Event-specific default params
- if (calendarType === 'event') {
- actions.forEach((action) => {
- const params: any = {}
-
- if (nodeData.inputs?.calendarId) params.calendarId = nodeData.inputs.calendarId
- if (action === 'getEvent' || action === 'updateEvent' || action === 'deleteEvent') {
- if (nodeData.inputs?.eventId) params.eventId = nodeData.inputs.eventId
- }
- if (action === 'createEvent' || action === 'updateEvent') {
- if (nodeData.inputs?.summary) params.summary = nodeData.inputs.summary
- if (nodeData.inputs?.description) params.description = nodeData.inputs.description
- if (nodeData.inputs?.location) params.location = nodeData.inputs.location
- if (nodeData.inputs?.startDateTime) params.startDateTime = nodeData.inputs.startDateTime
- if (nodeData.inputs?.endDateTime) params.endDateTime = nodeData.inputs.endDateTime
- if (nodeData.inputs?.timeZone) params.timeZone = nodeData.inputs.timeZone
- if (nodeData.inputs?.allDay !== undefined) params.allDay = nodeData.inputs.allDay
- if (nodeData.inputs?.startDate) params.startDate = nodeData.inputs.startDate
- if (nodeData.inputs?.endDate) params.endDate = nodeData.inputs.endDate
- if (nodeData.inputs?.attendees) params.attendees = nodeData.inputs.attendees
- if (nodeData.inputs?.recurrence) params.recurrence = nodeData.inputs.recurrence
- if (nodeData.inputs?.reminderMinutes) params.reminderMinutes = nodeData.inputs.reminderMinutes
- if (nodeData.inputs?.visibility) params.visibility = nodeData.inputs.visibility
- }
- if (action === 'quickAddEvent') {
- if (nodeData.inputs?.quickAddText) params.quickAddText = nodeData.inputs.quickAddText
- }
- if (action === 'listEvents') {
- if (nodeData.inputs?.timeMin) params.timeMin = nodeData.inputs.timeMin
- if (nodeData.inputs?.timeMax) params.timeMax = nodeData.inputs.timeMax
- if (nodeData.inputs?.maxResults) params.maxResults = nodeData.inputs.maxResults
- if (nodeData.inputs?.singleEvents !== undefined) params.singleEvents = nodeData.inputs.singleEvents
- if (nodeData.inputs?.orderBy) params.orderBy = nodeData.inputs.orderBy
- if (nodeData.inputs?.query) params.query = nodeData.inputs.query
- }
-
- defaultParams[action] = params
- })
- }
-
- // Calendar-specific default params
- if (calendarType === 'calendar') {
- actions.forEach((action) => {
- const params: any = {}
-
- if (['getCalendar', 'updateCalendar', 'deleteCalendar', 'clearCalendar'].includes(action)) {
- if (nodeData.inputs?.calendarIdForCalendar) params.calendarId = nodeData.inputs.calendarIdForCalendar
- }
- if (action === 'createCalendar' || action === 'updateCalendar') {
- if (nodeData.inputs?.calendarSummary) params.summary = nodeData.inputs.calendarSummary
- if (nodeData.inputs?.calendarDescription) params.description = nodeData.inputs.calendarDescription
- if (nodeData.inputs?.calendarLocation) params.location = nodeData.inputs.calendarLocation
- if (nodeData.inputs?.calendarTimeZone) params.timeZone = nodeData.inputs.calendarTimeZone
- }
- if (action === 'listCalendars') {
- if (nodeData.inputs?.showHidden !== undefined) params.showHidden = nodeData.inputs.showHidden
- if (nodeData.inputs?.minAccessRole) params.minAccessRole = nodeData.inputs.minAccessRole
- }
-
- defaultParams[action] = params
- })
- }
-
- // Freebusy-specific default params
- if (calendarType === 'freebusy') {
- actions.forEach((action) => {
- const params: any = {}
-
- if (action === 'queryFreebusy') {
- if (nodeData.inputs?.freebusyTimeMin) params.timeMin = nodeData.inputs.freebusyTimeMin
- if (nodeData.inputs?.freebusyTimeMax) params.timeMax = nodeData.inputs.freebusyTimeMax
- if (nodeData.inputs?.calendarIds) params.calendarIds = nodeData.inputs.calendarIds
- if (nodeData.inputs?.groupExpansionMax) params.groupExpansionMax = nodeData.inputs.groupExpansionMax
- if (nodeData.inputs?.calendarExpansionMax) params.calendarExpansionMax = nodeData.inputs.calendarExpansionMax
- }
-
- defaultParams[action] = params
- })
- }
+ const defaultParams = this.transformNodeInputsToToolArgs(nodeData)
const tools = createGoogleCalendarTools({
accessToken,
@@ -650,6 +569,53 @@ class GoogleCalendar_Tools implements INode {
return tools
}
+
+ transformNodeInputsToToolArgs(nodeData: INodeData): Record {
+ // Collect default parameters from inputs
+ const defaultParams: Record = {}
+
+ // Event parameters
+ if (nodeData.inputs?.calendarId) defaultParams.calendarId = nodeData.inputs.calendarId
+ if (nodeData.inputs?.eventId) defaultParams.eventId = nodeData.inputs.eventId
+ if (nodeData.inputs?.summary) defaultParams.summary = nodeData.inputs.summary
+ if (nodeData.inputs?.description) defaultParams.description = nodeData.inputs.description
+ if (nodeData.inputs?.location) defaultParams.location = nodeData.inputs.location
+ if (nodeData.inputs?.startDateTime) defaultParams.startDateTime = nodeData.inputs.startDateTime
+ if (nodeData.inputs?.endDateTime) defaultParams.endDateTime = nodeData.inputs.endDateTime
+ if (nodeData.inputs?.timeZone) defaultParams.timeZone = nodeData.inputs.timeZone
+ if (nodeData.inputs?.allDay !== undefined) defaultParams.allDay = nodeData.inputs.allDay
+ if (nodeData.inputs?.startDate) defaultParams.startDate = nodeData.inputs.startDate
+ if (nodeData.inputs?.endDate) defaultParams.endDate = nodeData.inputs.endDate
+ if (nodeData.inputs?.attendees) defaultParams.attendees = nodeData.inputs.attendees
+ if (nodeData.inputs?.recurrence) defaultParams.recurrence = nodeData.inputs.recurrence
+ if (nodeData.inputs?.reminderMinutes) defaultParams.reminderMinutes = nodeData.inputs.reminderMinutes
+ if (nodeData.inputs?.visibility) defaultParams.visibility = nodeData.inputs.visibility
+ if (nodeData.inputs?.quickAddText) defaultParams.quickAddText = nodeData.inputs.quickAddText
+ if (nodeData.inputs?.timeMin) defaultParams.timeMin = nodeData.inputs.timeMin
+ if (nodeData.inputs?.timeMax) defaultParams.timeMax = nodeData.inputs.timeMax
+ if (nodeData.inputs?.maxResults) defaultParams.maxResults = nodeData.inputs.maxResults
+ if (nodeData.inputs?.singleEvents !== undefined) defaultParams.singleEvents = nodeData.inputs.singleEvents
+ if (nodeData.inputs?.orderBy) defaultParams.orderBy = nodeData.inputs.orderBy
+ if (nodeData.inputs?.query) defaultParams.query = nodeData.inputs.query
+
+ // Calendar parameters
+ if (nodeData.inputs?.calendarIdForCalendar) defaultParams.calendarIdForCalendar = nodeData.inputs.calendarIdForCalendar
+ if (nodeData.inputs?.calendarSummary) defaultParams.calendarSummary = nodeData.inputs.calendarSummary
+ if (nodeData.inputs?.calendarDescription) defaultParams.calendarDescription = nodeData.inputs.calendarDescription
+ if (nodeData.inputs?.calendarLocation) defaultParams.calendarLocation = nodeData.inputs.calendarLocation
+ if (nodeData.inputs?.calendarTimeZone) defaultParams.calendarTimeZone = nodeData.inputs.calendarTimeZone
+ if (nodeData.inputs?.showHidden !== undefined) defaultParams.showHidden = nodeData.inputs.showHidden
+ if (nodeData.inputs?.minAccessRole) defaultParams.minAccessRole = nodeData.inputs.minAccessRole
+
+ // Freebusy parameters
+ if (nodeData.inputs?.freebusyTimeMin) defaultParams.freebusyTimeMin = nodeData.inputs.freebusyTimeMin
+ if (nodeData.inputs?.freebusyTimeMax) defaultParams.freebusyTimeMax = nodeData.inputs.freebusyTimeMax
+ if (nodeData.inputs?.calendarIds) defaultParams.calendarIds = nodeData.inputs.calendarIds
+ if (nodeData.inputs?.groupExpansionMax) defaultParams.groupExpansionMax = nodeData.inputs.groupExpansionMax
+ if (nodeData.inputs?.calendarExpansionMax) defaultParams.calendarExpansionMax = nodeData.inputs.calendarExpansionMax
+
+ return defaultParams
+ }
}
module.exports = { nodeClass: GoogleCalendar_Tools }
diff --git a/packages/components/nodes/tools/GoogleDocs/GoogleDocs.ts b/packages/components/nodes/tools/GoogleDocs/GoogleDocs.ts
new file mode 100644
index 000000000..296a9dea8
--- /dev/null
+++ b/packages/components/nodes/tools/GoogleDocs/GoogleDocs.ts
@@ -0,0 +1,253 @@
+import { convertMultiOptionsToStringArray, getCredentialData, getCredentialParam, refreshOAuth2Token } from '../../../src/utils'
+import { createGoogleDocsTools } from './core'
+import type { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface'
+
+class GoogleDocs_Tools implements INode {
+ label: string
+ name: string
+ version: number
+ type: string
+ icon: string
+ category: string
+ description: string
+ baseClasses: string[]
+ credential: INodeParams
+ inputs: INodeParams[]
+
+ constructor() {
+ this.label = 'Google Docs'
+ this.name = 'googleDocsTool'
+ this.version = 1.0
+ this.type = 'GoogleDocs'
+ this.icon = 'google-docs.svg'
+ this.category = 'Tools'
+ this.description =
+ 'Perform Google Docs operations such as creating, reading, updating, and deleting documents, as well as text manipulation'
+ this.baseClasses = ['Tool']
+ this.credential = {
+ label: 'Connect Credential',
+ name: 'credential',
+ type: 'credential',
+ credentialNames: ['googleDocsOAuth2']
+ }
+ this.inputs = [
+ // Document Actions
+ {
+ label: 'Actions',
+ name: 'actions',
+ type: 'multiOptions',
+ description: 'Actions to perform',
+ options: [
+ {
+ label: 'Create Document',
+ name: 'createDocument'
+ },
+ {
+ label: 'Get Document',
+ name: 'getDocument'
+ },
+ {
+ label: 'Update Document',
+ name: 'updateDocument'
+ },
+ {
+ label: 'Insert Text',
+ name: 'insertText'
+ },
+ {
+ label: 'Replace Text',
+ name: 'replaceText'
+ },
+ {
+ label: 'Append Text',
+ name: 'appendText'
+ },
+ {
+ label: 'Get Text Content',
+ name: 'getTextContent'
+ },
+ {
+ label: 'Insert Image',
+ name: 'insertImage'
+ },
+ {
+ label: 'Create Table',
+ name: 'createTable'
+ }
+ ]
+ },
+ // Document Parameters
+ {
+ label: 'Document ID',
+ name: 'documentId',
+ type: 'string',
+ description: 'Document ID for operations on specific documents',
+ show: {
+ actions: [
+ 'getDocument',
+ 'updateDocument',
+ 'insertText',
+ 'replaceText',
+ 'appendText',
+ 'getTextContent',
+ 'insertImage',
+ 'createTable'
+ ]
+ },
+ additionalParams: true,
+ optional: true
+ },
+ {
+ label: 'Title',
+ name: 'title',
+ type: 'string',
+ description: 'Document title',
+ show: {
+ actions: ['createDocument']
+ },
+ additionalParams: true,
+ optional: true
+ },
+ // Text Parameters
+ {
+ label: 'Text',
+ name: 'text',
+ type: 'string',
+ description: 'Text content to insert or append',
+ show: {
+ actions: ['createDocument', 'updateDocument', 'insertText', 'appendText']
+ },
+ additionalParams: true,
+ optional: true
+ },
+ {
+ label: 'Index',
+ name: 'index',
+ type: 'number',
+ description: 'Index where to insert text or media (1-based, default: 1 for beginning)',
+ default: 1,
+ show: {
+ actions: ['createDocument', 'updateDocument', 'insertText', 'insertImage', 'createTable']
+ },
+ additionalParams: true,
+ optional: true
+ },
+ {
+ label: 'Replace Text',
+ name: 'replaceText',
+ type: 'string',
+ description: 'Text to replace',
+ show: {
+ actions: ['updateDocument', 'replaceText']
+ },
+ additionalParams: true,
+ optional: true
+ },
+ {
+ label: 'New Text',
+ name: 'newText',
+ type: 'string',
+ description: 'New text to replace with',
+ show: {
+ actions: ['updateDocument', 'replaceText']
+ },
+ additionalParams: true,
+ optional: true
+ },
+ {
+ label: 'Match Case',
+ name: 'matchCase',
+ type: 'boolean',
+ description: 'Whether the search should be case-sensitive',
+ default: false,
+ show: {
+ actions: ['updateDocument', 'replaceText']
+ },
+ additionalParams: true,
+ optional: true
+ },
+
+ // Media Parameters
+ {
+ label: 'Image URL',
+ name: 'imageUrl',
+ type: 'string',
+ description: 'URL of the image to insert',
+ show: {
+ actions: ['createDocument', 'updateDocument', 'insertImage']
+ },
+ additionalParams: true,
+ optional: true
+ },
+ {
+ label: 'Table Rows',
+ name: 'rows',
+ type: 'number',
+ description: 'Number of rows in the table',
+ show: {
+ actions: ['createDocument', 'updateDocument', 'createTable']
+ },
+ additionalParams: true,
+ optional: true
+ },
+ {
+ label: 'Table Columns',
+ name: 'columns',
+ type: 'number',
+ description: 'Number of columns in the table',
+ show: {
+ actions: ['createDocument', 'updateDocument', 'createTable']
+ },
+ additionalParams: true,
+ optional: true
+ }
+ ]
+ }
+
+ async init(nodeData: INodeData, _: string, options: ICommonObject): Promise {
+ let credentialData = await getCredentialData(nodeData.credential ?? '', options)
+ credentialData = await refreshOAuth2Token(nodeData.credential ?? '', credentialData, options)
+ const accessToken = getCredentialParam('access_token', credentialData, nodeData)
+
+ if (!accessToken) {
+ throw new Error('No access token found in credential')
+ }
+
+ // Get all actions
+ const actions = convertMultiOptionsToStringArray(nodeData.inputs?.actions)
+
+ const defaultParams = this.transformNodeInputsToToolArgs(nodeData)
+
+ const tools = createGoogleDocsTools({
+ accessToken,
+ actions,
+ defaultParams
+ })
+
+ return tools
+ }
+
+ transformNodeInputsToToolArgs(nodeData: INodeData): Record {
+ const nodeInputs: Record = {}
+
+ // Document parameters
+ if (nodeData.inputs?.documentId) nodeInputs.documentId = nodeData.inputs.documentId
+ if (nodeData.inputs?.title) nodeInputs.title = nodeData.inputs.title
+
+ // Text parameters
+ if (nodeData.inputs?.text) nodeInputs.text = nodeData.inputs.text
+ if (nodeData.inputs?.index) nodeInputs.index = nodeData.inputs.index
+ if (nodeData.inputs?.replaceText) nodeInputs.replaceText = nodeData.inputs.replaceText
+ if (nodeData.inputs?.newText) nodeInputs.newText = nodeData.inputs.newText
+ if (nodeData.inputs?.matchCase !== undefined) nodeInputs.matchCase = nodeData.inputs.matchCase
+
+ // Media parameters
+ if (nodeData.inputs?.imageUrl) nodeInputs.imageUrl = nodeData.inputs.imageUrl
+ if (nodeData.inputs?.rows) nodeInputs.rows = nodeData.inputs.rows
+ if (nodeData.inputs?.columns) nodeInputs.columns = nodeData.inputs.columns
+
+ return nodeInputs
+ }
+}
+
+module.exports = { nodeClass: GoogleDocs_Tools }
diff --git a/packages/components/nodes/tools/GoogleDocs/core.ts b/packages/components/nodes/tools/GoogleDocs/core.ts
new file mode 100644
index 000000000..2b43114f6
--- /dev/null
+++ b/packages/components/nodes/tools/GoogleDocs/core.ts
@@ -0,0 +1,729 @@
+import { z } from 'zod'
+import fetch from 'node-fetch'
+import { DynamicStructuredTool } from '../OpenAPIToolkit/core'
+import { TOOL_ARGS_PREFIX } from '../../../src/agents'
+
+export const desc = `Use this when you want to access Google Docs API for managing documents`
+
+export interface Headers {
+ [key: string]: string
+}
+
+export interface Body {
+ [key: string]: any
+}
+
+export interface RequestParameters {
+ headers?: Headers
+ body?: Body
+ url?: string
+ description?: string
+ name?: string
+ actions?: string[]
+ accessToken?: string
+ defaultParams?: any
+}
+
+// Define schemas for different Google Docs operations
+
+// Document Schemas
+const CreateDocumentSchema = z.object({
+ title: z.string().describe('Document title'),
+ text: z.string().optional().describe('Text content to insert after creating document'),
+ index: z.number().optional().default(1).describe('Index where to insert text or media (1-based, default: 1 for beginning)'),
+ imageUrl: z.string().optional().describe('URL of the image to insert after creating document'),
+ rows: z.number().optional().describe('Number of rows in the table to create'),
+ columns: z.number().optional().describe('Number of columns in the table to create')
+})
+
+const GetDocumentSchema = z.object({
+ documentId: z.string().describe('Document ID to retrieve')
+})
+
+const UpdateDocumentSchema = z.object({
+ documentId: z.string().describe('Document ID to update'),
+ text: z.string().optional().describe('Text content to insert'),
+ index: z.number().optional().default(1).describe('Index where to insert text or media (1-based, default: 1 for beginning)'),
+ replaceText: z.string().optional().describe('Text to replace'),
+ newText: z.string().optional().describe('New text to replace with'),
+ matchCase: z.boolean().optional().default(false).describe('Whether the search should be case-sensitive'),
+ imageUrl: z.string().optional().describe('URL of the image to insert'),
+ rows: z.number().optional().describe('Number of rows in the table to create'),
+ columns: z.number().optional().describe('Number of columns in the table to create')
+})
+
+const InsertTextSchema = z.object({
+ documentId: z.string().describe('Document ID'),
+ text: z.string().describe('Text to insert'),
+ index: z.number().optional().default(1).describe('Index where to insert text (1-based, default: 1 for beginning)')
+})
+
+const ReplaceTextSchema = z.object({
+ documentId: z.string().describe('Document ID'),
+ replaceText: z.string().describe('Text to replace'),
+ newText: z.string().describe('New text to replace with'),
+ matchCase: z.boolean().optional().default(false).describe('Whether the search should be case-sensitive')
+})
+
+const AppendTextSchema = z.object({
+ documentId: z.string().describe('Document ID'),
+ text: z.string().describe('Text to append to the document')
+})
+
+const GetTextContentSchema = z.object({
+ documentId: z.string().describe('Document ID to get text content from')
+})
+
+const InsertImageSchema = z.object({
+ documentId: z.string().describe('Document ID'),
+ imageUrl: z.string().describe('URL of the image to insert'),
+ index: z.number().optional().default(1).describe('Index where to insert image (1-based)')
+})
+
+const CreateTableSchema = z.object({
+ documentId: z.string().describe('Document ID'),
+ rows: z.number().describe('Number of rows in the table'),
+ columns: z.number().describe('Number of columns in the table'),
+ index: z.number().optional().default(1).describe('Index where to insert table (1-based)')
+})
+
+class BaseGoogleDocsTool extends DynamicStructuredTool {
+ protected accessToken: string = ''
+
+ constructor(args: any) {
+ super(args)
+ this.accessToken = args.accessToken ?? ''
+ }
+
+ async makeGoogleDocsRequest({
+ endpoint,
+ method = 'GET',
+ body,
+ params
+ }: {
+ endpoint: string
+ method?: string
+ body?: any
+ params?: any
+ }): Promise {
+ const url = `https://docs.googleapis.com/v1/${endpoint}`
+
+ const headers = {
+ Authorization: `Bearer ${this.accessToken}`,
+ 'Content-Type': 'application/json',
+ Accept: 'application/json',
+ ...this.headers
+ }
+
+ const response = await fetch(url, {
+ method,
+ headers,
+ body: body ? JSON.stringify(body) : undefined
+ })
+
+ if (!response.ok) {
+ const errorText = await response.text()
+ throw new Error(`Google Docs API Error ${response.status}: ${response.statusText} - ${errorText}`)
+ }
+
+ const data = await response.text()
+ return data + TOOL_ARGS_PREFIX + JSON.stringify(params)
+ }
+
+ async makeDriveRequest({
+ endpoint,
+ method = 'GET',
+ body,
+ params
+ }: {
+ endpoint: string
+ method?: string
+ body?: any
+ params?: any
+ }): Promise {
+ const url = `https://www.googleapis.com/drive/v3/${endpoint}`
+
+ const headers = {
+ Authorization: `Bearer ${this.accessToken}`,
+ 'Content-Type': 'application/json',
+ Accept: 'application/json',
+ ...this.headers
+ }
+
+ const response = await fetch(url, {
+ method,
+ headers,
+ body: body ? JSON.stringify(body) : undefined
+ })
+
+ if (!response.ok) {
+ const errorText = await response.text()
+ throw new Error(`Google Drive API Error ${response.status}: ${response.statusText} - ${errorText}`)
+ }
+
+ const data = await response.text()
+ return data + TOOL_ARGS_PREFIX + JSON.stringify(params)
+ }
+}
+
+// Document Tools
+class CreateDocumentTool extends BaseGoogleDocsTool {
+ defaultParams: any
+
+ constructor(args: any) {
+ const toolInput = {
+ name: 'create_document',
+ description: 'Create a new Google Docs document',
+ schema: CreateDocumentSchema,
+ baseUrl: '',
+ method: 'POST',
+ headers: {}
+ }
+ super({
+ ...toolInput,
+ accessToken: args.accessToken
+ })
+ this.defaultParams = args.defaultParams || {}
+ }
+
+ async _call(arg: any): Promise {
+ const params = { ...arg, ...this.defaultParams }
+
+ try {
+ const documentData = {
+ title: params.title
+ }
+
+ const endpoint = 'documents'
+ const createResponse = await this.makeGoogleDocsRequest({
+ endpoint,
+ method: 'POST',
+ body: documentData,
+ params
+ })
+
+ // Get the document ID from the response
+ const documentResponse = JSON.parse(createResponse.split(TOOL_ARGS_PREFIX)[0])
+ const documentId = documentResponse.documentId
+
+ // Now add content if provided
+ const requests = []
+
+ if (params.text) {
+ requests.push({
+ insertText: {
+ location: {
+ index: params.index || 1
+ },
+ text: params.text
+ }
+ })
+ }
+
+ if (params.imageUrl) {
+ requests.push({
+ insertInlineImage: {
+ location: {
+ index: params.index || 1
+ },
+ uri: params.imageUrl
+ }
+ })
+ }
+
+ if (params.rows && params.columns) {
+ requests.push({
+ insertTable: {
+ location: {
+ index: params.index || 1
+ },
+ rows: params.rows,
+ columns: params.columns
+ }
+ })
+ }
+
+ // If we have content to add, make a batch update
+ if (requests.length > 0) {
+ const updateEndpoint = `documents/${encodeURIComponent(documentId)}:batchUpdate`
+ await this.makeGoogleDocsRequest({
+ endpoint: updateEndpoint,
+ method: 'POST',
+ body: { requests },
+ params: {}
+ })
+ }
+
+ return createResponse
+ } catch (error) {
+ return `Error creating document: ${error}`
+ }
+ }
+}
+
+class GetDocumentTool extends BaseGoogleDocsTool {
+ defaultParams: any
+
+ constructor(args: any) {
+ const toolInput = {
+ name: 'get_document',
+ description: 'Get a Google Docs document by ID',
+ schema: GetDocumentSchema,
+ baseUrl: '',
+ method: 'GET',
+ headers: {}
+ }
+ super({
+ ...toolInput,
+ accessToken: args.accessToken
+ })
+ this.defaultParams = args.defaultParams || {}
+ }
+
+ async _call(arg: any): Promise {
+ const params = { ...arg, ...this.defaultParams }
+
+ try {
+ const endpoint = `documents/${encodeURIComponent(params.documentId)}`
+ const response = await this.makeGoogleDocsRequest({ endpoint, params })
+ return response
+ } catch (error) {
+ return `Error getting document: ${error}`
+ }
+ }
+}
+
+class UpdateDocumentTool extends BaseGoogleDocsTool {
+ defaultParams: any
+
+ constructor(args: any) {
+ const toolInput = {
+ name: 'update_document',
+ description: 'Update a Google Docs document with batch requests',
+ schema: UpdateDocumentSchema,
+ baseUrl: '',
+ method: 'POST',
+ headers: {}
+ }
+ super({
+ ...toolInput,
+ accessToken: args.accessToken
+ })
+ this.defaultParams = args.defaultParams || {}
+ }
+
+ async _call(arg: any): Promise {
+ const params = { ...arg, ...this.defaultParams }
+
+ try {
+ const requests = []
+
+ // Insert text
+ if (params.text) {
+ requests.push({
+ insertText: {
+ location: {
+ index: params.index || 1
+ },
+ text: params.text
+ }
+ })
+ }
+
+ // Replace text
+ if (params.replaceText && params.newText) {
+ requests.push({
+ replaceAllText: {
+ containsText: {
+ text: params.replaceText,
+ matchCase: params.matchCase || false
+ },
+ replaceText: params.newText
+ }
+ })
+ }
+
+ // Insert image
+ if (params.imageUrl) {
+ requests.push({
+ insertInlineImage: {
+ location: {
+ index: params.index || 1
+ },
+ uri: params.imageUrl
+ }
+ })
+ }
+
+ // Create table
+ if (params.rows && params.columns) {
+ requests.push({
+ insertTable: {
+ location: {
+ index: params.index || 1
+ },
+ rows: params.rows,
+ columns: params.columns
+ }
+ })
+ }
+
+ if (requests.length > 0) {
+ const endpoint = `documents/${encodeURIComponent(params.documentId)}:batchUpdate`
+ const response = await this.makeGoogleDocsRequest({
+ endpoint,
+ method: 'POST',
+ body: { requests },
+ params
+ })
+ return response
+ } else {
+ return `No updates specified` + TOOL_ARGS_PREFIX + JSON.stringify(params)
+ }
+ } catch (error) {
+ return `Error updating document: ${error}`
+ }
+ }
+}
+
+class InsertTextTool extends BaseGoogleDocsTool {
+ defaultParams: any
+
+ constructor(args: any) {
+ const toolInput = {
+ name: 'insert_text',
+ description: 'Insert text into a Google Docs document',
+ schema: InsertTextSchema,
+ baseUrl: '',
+ method: 'POST',
+ headers: {}
+ }
+ super({
+ ...toolInput,
+ accessToken: args.accessToken
+ })
+ this.defaultParams = args.defaultParams || {}
+ }
+
+ async _call(arg: any): Promise {
+ const params = { ...arg, ...this.defaultParams }
+
+ try {
+ const requests = [
+ {
+ insertText: {
+ location: {
+ index: params.index
+ },
+ text: params.text
+ }
+ }
+ ]
+
+ const endpoint = `documents/${encodeURIComponent(params.documentId)}:batchUpdate`
+ const response = await this.makeGoogleDocsRequest({
+ endpoint,
+ method: 'POST',
+ body: { requests },
+ params
+ })
+ return response
+ } catch (error) {
+ return `Error inserting text: ${error}`
+ }
+ }
+}
+
+class ReplaceTextTool extends BaseGoogleDocsTool {
+ defaultParams: any
+
+ constructor(args: any) {
+ const toolInput = {
+ name: 'replace_text',
+ description: 'Replace text in a Google Docs document',
+ schema: ReplaceTextSchema,
+ baseUrl: '',
+ method: 'POST',
+ headers: {}
+ }
+ super({
+ ...toolInput,
+ accessToken: args.accessToken
+ })
+ this.defaultParams = args.defaultParams || {}
+ }
+
+ async _call(arg: any): Promise {
+ const params = { ...arg, ...this.defaultParams }
+
+ try {
+ const requests = [
+ {
+ replaceAllText: {
+ containsText: {
+ text: params.replaceText,
+ matchCase: params.matchCase
+ },
+ replaceText: params.newText
+ }
+ }
+ ]
+
+ const endpoint = `documents/${encodeURIComponent(params.documentId)}:batchUpdate`
+ const response = await this.makeGoogleDocsRequest({
+ endpoint,
+ method: 'POST',
+ body: { requests },
+ params
+ })
+ return response
+ } catch (error) {
+ return `Error replacing text: ${error}`
+ }
+ }
+}
+
+class AppendTextTool extends BaseGoogleDocsTool {
+ defaultParams: any
+
+ constructor(args: any) {
+ const toolInput = {
+ name: 'append_text',
+ description: 'Append text to the end of a Google Docs document',
+ schema: AppendTextSchema,
+ baseUrl: '',
+ method: 'POST',
+ headers: {}
+ }
+ super({
+ ...toolInput,
+ accessToken: args.accessToken
+ })
+ this.defaultParams = args.defaultParams || {}
+ }
+
+ async _call(arg: any): Promise {
+ const params = { ...arg, ...this.defaultParams }
+
+ try {
+ // First get the document to find the end index
+ const getEndpoint = `documents/${encodeURIComponent(params.documentId)}`
+ const docResponse = await this.makeGoogleDocsRequest({ endpoint: getEndpoint, params: {} })
+ const docData = JSON.parse(docResponse.split(TOOL_ARGS_PREFIX)[0])
+
+ // Get the end index of the document body
+ const endIndex = docData.body.content[docData.body.content.length - 1].endIndex - 1
+
+ const requests = [
+ {
+ insertText: {
+ location: {
+ index: endIndex
+ },
+ text: params.text
+ }
+ }
+ ]
+
+ const endpoint = `documents/${encodeURIComponent(params.documentId)}:batchUpdate`
+ const response = await this.makeGoogleDocsRequest({
+ endpoint,
+ method: 'POST',
+ body: { requests },
+ params
+ })
+ return response
+ } catch (error) {
+ return `Error appending text: ${error}`
+ }
+ }
+}
+
+class GetTextContentTool extends BaseGoogleDocsTool {
+ defaultParams: any
+
+ constructor(args: any) {
+ const toolInput = {
+ name: 'get_text_content',
+ description: 'Get the text content from a Google Docs document',
+ schema: GetTextContentSchema,
+ baseUrl: '',
+ method: 'GET',
+ headers: {}
+ }
+ super({
+ ...toolInput,
+ accessToken: args.accessToken
+ })
+ this.defaultParams = args.defaultParams || {}
+ }
+
+ async _call(arg: any): Promise {
+ const params = { ...arg, ...this.defaultParams }
+
+ try {
+ const endpoint = `documents/${encodeURIComponent(params.documentId)}`
+ const response = await this.makeGoogleDocsRequest({ endpoint, params })
+
+ // Extract and return just the text content
+ const docData = JSON.parse(response.split(TOOL_ARGS_PREFIX)[0])
+ let textContent = ''
+
+ const extractText = (element: any) => {
+ if (element.paragraph) {
+ element.paragraph.elements?.forEach((elem: any) => {
+ if (elem.textRun) {
+ textContent += elem.textRun.content
+ }
+ })
+ }
+ }
+
+ docData.body.content?.forEach(extractText)
+
+ return JSON.stringify({ textContent }) + TOOL_ARGS_PREFIX + JSON.stringify(params)
+ } catch (error) {
+ return `Error getting text content: ${error}`
+ }
+ }
+}
+
+class InsertImageTool extends BaseGoogleDocsTool {
+ defaultParams: any
+
+ constructor(args: any) {
+ const toolInput = {
+ name: 'insert_image',
+ description: 'Insert an image into a Google Docs document',
+ schema: InsertImageSchema,
+ baseUrl: '',
+ method: 'POST',
+ headers: {}
+ }
+ super({
+ ...toolInput,
+ accessToken: args.accessToken
+ })
+ this.defaultParams = args.defaultParams || {}
+ }
+
+ async _call(arg: any): Promise {
+ const params = { ...arg, ...this.defaultParams }
+
+ try {
+ const requests = [
+ {
+ insertInlineImage: {
+ location: {
+ index: params.index
+ },
+ uri: params.imageUrl
+ }
+ }
+ ]
+
+ const endpoint = `documents/${encodeURIComponent(params.documentId)}:batchUpdate`
+ const response = await this.makeGoogleDocsRequest({
+ endpoint,
+ method: 'POST',
+ body: { requests },
+ params
+ })
+ return response
+ } catch (error) {
+ return `Error inserting image: ${error}`
+ }
+ }
+}
+
+class CreateTableTool extends BaseGoogleDocsTool {
+ defaultParams: any
+
+ constructor(args: any) {
+ const toolInput = {
+ name: 'create_table',
+ description: 'Create a table in a Google Docs document',
+ schema: CreateTableSchema,
+ baseUrl: '',
+ method: 'POST',
+ headers: {}
+ }
+ super({
+ ...toolInput,
+ accessToken: args.accessToken
+ })
+ this.defaultParams = args.defaultParams || {}
+ }
+
+ async _call(arg: any): Promise {
+ const params = { ...arg, ...this.defaultParams }
+
+ try {
+ const requests = [
+ {
+ insertTable: {
+ location: {
+ index: params.index
+ },
+ rows: params.rows,
+ columns: params.columns
+ }
+ }
+ ]
+
+ const endpoint = `documents/${encodeURIComponent(params.documentId)}:batchUpdate`
+ const response = await this.makeGoogleDocsRequest({
+ endpoint,
+ method: 'POST',
+ body: { requests },
+ params
+ })
+ return response
+ } catch (error) {
+ return `Error creating table: ${error}`
+ }
+ }
+}
+
+export const createGoogleDocsTools = (args?: RequestParameters): DynamicStructuredTool[] => {
+ const actions = args?.actions || []
+ const tools: DynamicStructuredTool[] = []
+
+ if (actions.includes('createDocument') || actions.length === 0) {
+ tools.push(new CreateDocumentTool(args))
+ }
+
+ if (actions.includes('getDocument') || actions.length === 0) {
+ tools.push(new GetDocumentTool(args))
+ }
+
+ if (actions.includes('updateDocument') || actions.length === 0) {
+ tools.push(new UpdateDocumentTool(args))
+ }
+
+ if (actions.includes('insertText') || actions.length === 0) {
+ tools.push(new InsertTextTool(args))
+ }
+
+ if (actions.includes('replaceText') || actions.length === 0) {
+ tools.push(new ReplaceTextTool(args))
+ }
+
+ if (actions.includes('appendText') || actions.length === 0) {
+ tools.push(new AppendTextTool(args))
+ }
+
+ if (actions.includes('getTextContent') || actions.length === 0) {
+ tools.push(new GetTextContentTool(args))
+ }
+
+ if (actions.includes('insertImage') || actions.length === 0) {
+ tools.push(new InsertImageTool(args))
+ }
+
+ if (actions.includes('createTable') || actions.length === 0) {
+ tools.push(new CreateTableTool(args))
+ }
+
+ return tools
+}
diff --git a/packages/components/nodes/tools/GoogleDocs/google-docs.svg b/packages/components/nodes/tools/GoogleDocs/google-docs.svg
new file mode 100644
index 000000000..7406241a1
--- /dev/null
+++ b/packages/components/nodes/tools/GoogleDocs/google-docs.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/components/nodes/tools/GoogleDrive/GoogleDrive.ts b/packages/components/nodes/tools/GoogleDrive/GoogleDrive.ts
index 48939dd63..ec44367df 100644
--- a/packages/components/nodes/tools/GoogleDrive/GoogleDrive.ts
+++ b/packages/components/nodes/tools/GoogleDrive/GoogleDrive.ts
@@ -616,8 +616,20 @@ class GoogleDrive_Tools implements INode {
actions = shareActions
}
+ const defaultParams = this.transformNodeInputsToToolArgs(nodeData)
+
+ const tools = createGoogleDriveTools({
+ accessToken,
+ actions,
+ defaultParams
+ })
+
+ return tools
+ }
+
+ transformNodeInputsToToolArgs(nodeData: INodeData): Record {
// Collect default parameters from inputs
- const defaultParams: any = {}
+ const defaultParams: Record = {}
// Add parameters based on the inputs provided
if (nodeData.inputs?.fileId) defaultParams.fileId = nodeData.inputs.fileId
@@ -644,13 +656,7 @@ class GoogleDrive_Tools implements INode {
if (nodeData.inputs?.fields) defaultParams.fields = nodeData.inputs.fields
if (nodeData.inputs?.acknowledgeAbuse !== undefined) defaultParams.acknowledgeAbuse = nodeData.inputs.acknowledgeAbuse
- const tools = createGoogleDriveTools({
- accessToken,
- actions,
- defaultParams
- })
-
- return tools
+ return defaultParams
}
}
diff --git a/packages/components/nodes/tools/GoogleSheets/GoogleSheets.ts b/packages/components/nodes/tools/GoogleSheets/GoogleSheets.ts
index 785e1098a..60f15903a 100644
--- a/packages/components/nodes/tools/GoogleSheets/GoogleSheets.ts
+++ b/packages/components/nodes/tools/GoogleSheets/GoogleSheets.ts
@@ -328,88 +328,7 @@ class GoogleSheets_Tools implements INode {
actions = convertMultiOptionsToStringArray(nodeData.inputs?.valuesActions)
}
- // Create default params object based on inputs
- const defaultParams: any = {}
-
- // Spreadsheet-specific default params
- if (sheetsType === 'spreadsheet') {
- actions.forEach((action) => {
- const params: any = {}
-
- // Common spreadsheet parameters
- if (nodeData.inputs?.spreadsheetId) params.spreadsheetId = nodeData.inputs.spreadsheetId
-
- if (action === 'createSpreadsheet') {
- if (nodeData.inputs?.title) params.title = nodeData.inputs.title
- if (nodeData.inputs?.sheetCount) params.sheetCount = nodeData.inputs.sheetCount
- }
-
- if (action === 'getSpreadsheet') {
- if (nodeData.inputs?.ranges) params.ranges = nodeData.inputs.ranges
- if (nodeData.inputs?.includeGridData !== undefined) params.includeGridData = nodeData.inputs.includeGridData
- }
-
- if (action === 'updateSpreadsheet') {
- if (nodeData.inputs?.title) params.title = nodeData.inputs.title
- }
-
- defaultParams[action] = params
- })
- }
-
- // Values-specific default params
- if (sheetsType === 'values') {
- actions.forEach((action) => {
- const params: any = {}
-
- // Common values parameters
- if (nodeData.inputs?.spreadsheetId) params.spreadsheetId = nodeData.inputs.spreadsheetId
-
- if (action === 'getValues') {
- if (nodeData.inputs?.range) params.range = nodeData.inputs.range
- if (nodeData.inputs?.valueRenderOption) params.valueRenderOption = nodeData.inputs.valueRenderOption
- if (nodeData.inputs?.dateTimeRenderOption) params.dateTimeRenderOption = nodeData.inputs.dateTimeRenderOption
- if (nodeData.inputs?.majorDimension) params.majorDimension = nodeData.inputs.majorDimension
- }
-
- if (action === 'updateValues') {
- if (nodeData.inputs?.range) params.range = nodeData.inputs.range
- if (nodeData.inputs?.values) params.values = nodeData.inputs.values
- if (nodeData.inputs?.valueInputOption) params.valueInputOption = nodeData.inputs.valueInputOption
- if (nodeData.inputs?.majorDimension) params.majorDimension = nodeData.inputs.majorDimension
- }
-
- if (action === 'appendValues') {
- if (nodeData.inputs?.range) params.range = nodeData.inputs.range
- if (nodeData.inputs?.values) params.values = nodeData.inputs.values
- if (nodeData.inputs?.valueInputOption) params.valueInputOption = nodeData.inputs.valueInputOption
- if (nodeData.inputs?.insertDataOption) params.insertDataOption = nodeData.inputs.insertDataOption
- if (nodeData.inputs?.majorDimension) params.majorDimension = nodeData.inputs.majorDimension
- }
-
- if (action === 'clearValues') {
- if (nodeData.inputs?.range) params.range = nodeData.inputs.range
- }
-
- if (action === 'batchGetValues') {
- if (nodeData.inputs?.ranges) params.ranges = nodeData.inputs.ranges
- if (nodeData.inputs?.valueRenderOption) params.valueRenderOption = nodeData.inputs.valueRenderOption
- if (nodeData.inputs?.dateTimeRenderOption) params.dateTimeRenderOption = nodeData.inputs.dateTimeRenderOption
- if (nodeData.inputs?.majorDimension) params.majorDimension = nodeData.inputs.majorDimension
- }
-
- if (action === 'batchUpdateValues') {
- if (nodeData.inputs?.values) params.values = nodeData.inputs.values
- if (nodeData.inputs?.valueInputOption) params.valueInputOption = nodeData.inputs.valueInputOption
- }
-
- if (action === 'batchClearValues') {
- if (nodeData.inputs?.ranges) params.ranges = nodeData.inputs.ranges
- }
-
- defaultParams[action] = params
- })
- }
+ const defaultParams = this.transformNodeInputsToToolArgs(nodeData)
const tools = createGoogleSheetsTools({
accessToken,
@@ -419,6 +338,31 @@ class GoogleSheets_Tools implements INode {
return tools
}
+
+ transformNodeInputsToToolArgs(nodeData: INodeData): Record {
+ // Collect default parameters from inputs
+ const defaultParams: Record = {}
+
+ // Common parameters
+ if (nodeData.inputs?.spreadsheetId) defaultParams.spreadsheetId = nodeData.inputs.spreadsheetId
+
+ // Spreadsheet parameters
+ if (nodeData.inputs?.title) defaultParams.title = nodeData.inputs.title
+ if (nodeData.inputs?.sheetCount) defaultParams.sheetCount = nodeData.inputs.sheetCount
+ if (nodeData.inputs?.includeGridData !== undefined) defaultParams.includeGridData = nodeData.inputs.includeGridData
+
+ // Values parameters
+ if (nodeData.inputs?.range) defaultParams.range = nodeData.inputs.range
+ if (nodeData.inputs?.ranges) defaultParams.ranges = nodeData.inputs.ranges
+ if (nodeData.inputs?.values) defaultParams.values = nodeData.inputs.values
+ if (nodeData.inputs?.valueInputOption) defaultParams.valueInputOption = nodeData.inputs.valueInputOption
+ if (nodeData.inputs?.valueRenderOption) defaultParams.valueRenderOption = nodeData.inputs.valueRenderOption
+ if (nodeData.inputs?.dateTimeRenderOption) defaultParams.dateTimeRenderOption = nodeData.inputs.dateTimeRenderOption
+ if (nodeData.inputs?.insertDataOption) defaultParams.insertDataOption = nodeData.inputs.insertDataOption
+ if (nodeData.inputs?.majorDimension) defaultParams.majorDimension = nodeData.inputs.majorDimension
+
+ return defaultParams
+ }
}
module.exports = { nodeClass: GoogleSheets_Tools }
diff --git a/packages/components/nodes/tools/Jira/Jira.ts b/packages/components/nodes/tools/Jira/Jira.ts
index 9087b5cff..95c2b8c04 100644
--- a/packages/components/nodes/tools/Jira/Jira.ts
+++ b/packages/components/nodes/tools/Jira/Jira.ts
@@ -400,93 +400,7 @@ class Jira_Tools implements INode {
actions = convertMultiOptionsToStringArray(nodeData.inputs?.userActions)
}
- // Prepare default parameters for each action
- const defaultParams: ICommonObject = {}
-
- // Issue parameters
- const projectKey = nodeData.inputs?.projectKey
- const issueType = nodeData.inputs?.issueType
- const issueSummary = nodeData.inputs?.issueSummary
- const issueDescription = nodeData.inputs?.issueDescription
- const issuePriority = nodeData.inputs?.issuePriority
- const issueKey = nodeData.inputs?.issueKey
- const assigneeAccountId = nodeData.inputs?.assigneeAccountId
- const transitionId = nodeData.inputs?.transitionId
- const jqlQuery = nodeData.inputs?.jqlQuery
- const issueMaxResults = nodeData.inputs?.issueMaxResults
-
- // Comment parameters
- const commentIssueKey = nodeData.inputs?.commentIssueKey
- const commentText = nodeData.inputs?.commentText
- const commentId = nodeData.inputs?.commentId
-
- // User parameters
- const userQuery = nodeData.inputs?.userQuery
- const userAccountId = nodeData.inputs?.userAccountId
- const userEmail = nodeData.inputs?.userEmail
- const userDisplayName = nodeData.inputs?.userDisplayName
- const userMaxResults = nodeData.inputs?.userMaxResults
-
- // Set default parameters based on actions
- actions.forEach((action) => {
- const params: ICommonObject = {}
-
- // Issue action parameters
- if (action === 'listIssues') {
- if (projectKey) params.projectKey = projectKey
- if (jqlQuery) params.jql = jqlQuery
- if (issueMaxResults) params.maxResults = issueMaxResults
- }
- if (action === 'createIssue') {
- if (projectKey) params.projectKey = projectKey
- if (issueType) params.issueType = issueType
- if (issueSummary) params.summary = issueSummary
- if (issueDescription) params.description = issueDescription
- if (issuePriority) params.priority = issuePriority
- if (assigneeAccountId) params.assigneeAccountId = assigneeAccountId
- }
- if (['getIssue', 'updateIssue', 'deleteIssue', 'assignIssue', 'transitionIssue'].includes(action)) {
- if (issueKey) params.issueKey = issueKey
- }
- if (action === 'updateIssue') {
- if (issueSummary) params.summary = issueSummary
- if (issueDescription) params.description = issueDescription
- if (issuePriority) params.priority = issuePriority
- if (assigneeAccountId) params.assigneeAccountId = assigneeAccountId
- }
- if (action === 'assignIssue') {
- if (assigneeAccountId) params.assigneeAccountId = assigneeAccountId
- }
- if (action === 'transitionIssue') {
- if (transitionId) params.transitionId = transitionId
- }
-
- // Comment action parameters
- if (['listComments', 'createComment'].includes(action) && commentIssueKey) {
- params.issueKey = commentIssueKey
- }
- if (['createComment', 'updateComment'].includes(action) && commentText) {
- params.text = commentText
- }
- if (['getComment', 'updateComment', 'deleteComment'].includes(action) && commentId) {
- params.commentId = commentId
- }
-
- // User action parameters
- if (action === 'searchUsers') {
- if (userQuery) params.query = userQuery
- if (userMaxResults) params.maxResults = userMaxResults
- }
- if (['getUser', 'updateUser', 'deleteUser'].includes(action) && userAccountId) {
- params.accountId = userAccountId
- }
- if (['createUser', 'updateUser'].includes(action)) {
- if (userEmail) params.emailAddress = userEmail
- if (userDisplayName) params.displayName = userDisplayName
- }
-
- defaultParams[action] = params
- })
+ const defaultParams = this.transformNodeInputsToToolArgs(nodeData)
// Create and return tools based on selected actions
const tools = createJiraTools({
@@ -499,6 +413,37 @@ class Jira_Tools implements INode {
return tools
}
+
+ transformNodeInputsToToolArgs(nodeData: INodeData): Record {
+ // Collect default parameters from inputs
+ const defaultParams: Record = {}
+
+ // Issue parameters
+ if (nodeData.inputs?.projectKey) defaultParams.projectKey = nodeData.inputs.projectKey
+ if (nodeData.inputs?.issueType) defaultParams.issueType = nodeData.inputs.issueType
+ if (nodeData.inputs?.issueSummary) defaultParams.issueSummary = nodeData.inputs.issueSummary
+ if (nodeData.inputs?.issueDescription) defaultParams.issueDescription = nodeData.inputs.issueDescription
+ if (nodeData.inputs?.issuePriority) defaultParams.issuePriority = nodeData.inputs.issuePriority
+ if (nodeData.inputs?.issueKey) defaultParams.issueKey = nodeData.inputs.issueKey
+ if (nodeData.inputs?.assigneeAccountId) defaultParams.assigneeAccountId = nodeData.inputs.assigneeAccountId
+ if (nodeData.inputs?.transitionId) defaultParams.transitionId = nodeData.inputs.transitionId
+ if (nodeData.inputs?.jqlQuery) defaultParams.jqlQuery = nodeData.inputs.jqlQuery
+ if (nodeData.inputs?.issueMaxResults) defaultParams.issueMaxResults = nodeData.inputs.issueMaxResults
+
+ // Comment parameters
+ if (nodeData.inputs?.commentIssueKey) defaultParams.commentIssueKey = nodeData.inputs.commentIssueKey
+ if (nodeData.inputs?.commentText) defaultParams.commentText = nodeData.inputs.commentText
+ if (nodeData.inputs?.commentId) defaultParams.commentId = nodeData.inputs.commentId
+
+ // User parameters
+ if (nodeData.inputs?.userQuery) defaultParams.userQuery = nodeData.inputs.userQuery
+ if (nodeData.inputs?.userAccountId) defaultParams.userAccountId = nodeData.inputs.userAccountId
+ if (nodeData.inputs?.userEmail) defaultParams.userEmail = nodeData.inputs.userEmail
+ if (nodeData.inputs?.userDisplayName) defaultParams.userDisplayName = nodeData.inputs.userDisplayName
+ if (nodeData.inputs?.userMaxResults) defaultParams.userMaxResults = nodeData.inputs.userMaxResults
+
+ return defaultParams
+ }
}
module.exports = { nodeClass: Jira_Tools }
diff --git a/packages/components/nodes/tools/MicrosoftOutlook/MicrosoftOutlook.ts b/packages/components/nodes/tools/MicrosoftOutlook/MicrosoftOutlook.ts
index 94c413564..a85af7221 100644
--- a/packages/components/nodes/tools/MicrosoftOutlook/MicrosoftOutlook.ts
+++ b/packages/components/nodes/tools/MicrosoftOutlook/MicrosoftOutlook.ts
@@ -747,216 +747,7 @@ class MicrosoftOutlook_Tools implements INode {
actions = convertMultiOptionsToStringArray(messageActions)
}
- // Prepare default parameters for each action based on type
- const defaultParams: ICommonObject = {}
-
- if (outlookType === 'calendar') {
- // Map calendar actions to their parameters
- actions.forEach((action) => {
- defaultParams[action] = {}
-
- switch (action) {
- case 'listCalendars':
- if (nodeData.inputs?.maxResultsListCalendars) {
- defaultParams[action].maxResults = nodeData.inputs.maxResultsListCalendars
- }
- break
-
- case 'getCalendar':
- if (nodeData.inputs?.calendarIdGetCalendar) {
- defaultParams[action].calendarId = nodeData.inputs.calendarIdGetCalendar
- }
- break
-
- case 'createCalendar':
- if (nodeData.inputs?.calendarNameCreateCalendar) {
- defaultParams[action].calendarName = nodeData.inputs.calendarNameCreateCalendar
- }
- break
-
- case 'updateCalendar':
- if (nodeData.inputs?.calendarIdUpdateCalendar) {
- defaultParams[action].calendarId = nodeData.inputs.calendarIdUpdateCalendar
- }
- if (nodeData.inputs?.calendarNameUpdateCalendar) {
- defaultParams[action].calendarName = nodeData.inputs.calendarNameUpdateCalendar
- }
- break
-
- case 'deleteCalendar':
- if (nodeData.inputs?.calendarIdDeleteCalendar) {
- defaultParams[action].calendarId = nodeData.inputs.calendarIdDeleteCalendar
- }
- break
-
- case 'listEvents':
- if (nodeData.inputs?.calendarIdListEvents) {
- defaultParams[action].calendarId = nodeData.inputs.calendarIdListEvents
- }
- if (nodeData.inputs?.maxResultsListEvents) {
- defaultParams[action].maxResults = nodeData.inputs.maxResultsListEvents
- }
- if (nodeData.inputs?.startDateTimeListEvents) {
- defaultParams[action].startDateTime = nodeData.inputs.startDateTimeListEvents
- }
- if (nodeData.inputs?.endDateTimeListEvents) {
- defaultParams[action].endDateTime = nodeData.inputs.endDateTimeListEvents
- }
- break
-
- case 'getEvent':
- if (nodeData.inputs?.eventIdGetEvent) {
- defaultParams[action].eventId = nodeData.inputs.eventIdGetEvent
- }
- break
-
- case 'createEvent':
- if (nodeData.inputs?.subjectCreateEvent) {
- defaultParams[action].subject = nodeData.inputs.subjectCreateEvent
- }
- if (nodeData.inputs?.bodyCreateEvent) {
- defaultParams[action].body = nodeData.inputs.bodyCreateEvent
- }
- if (nodeData.inputs?.startDateTimeCreateEvent) {
- defaultParams[action].startDateTime = nodeData.inputs.startDateTimeCreateEvent
- }
- if (nodeData.inputs?.endDateTimeCreateEvent) {
- defaultParams[action].endDateTime = nodeData.inputs.endDateTimeCreateEvent
- }
- if (nodeData.inputs?.timeZoneCreateEvent) {
- defaultParams[action].timeZone = nodeData.inputs.timeZoneCreateEvent
- }
- if (nodeData.inputs?.locationCreateEvent) {
- defaultParams[action].location = nodeData.inputs.locationCreateEvent
- }
- if (nodeData.inputs?.attendeesCreateEvent) {
- defaultParams[action].attendees = nodeData.inputs.attendeesCreateEvent
- }
- break
-
- case 'updateEvent':
- if (nodeData.inputs?.eventIdUpdateEvent) {
- defaultParams[action].eventId = nodeData.inputs.eventIdUpdateEvent
- }
- if (nodeData.inputs?.subjectUpdateEvent) {
- defaultParams[action].subject = nodeData.inputs.subjectUpdateEvent
- }
- break
-
- case 'deleteEvent':
- if (nodeData.inputs?.eventIdDeleteEvent) {
- defaultParams[action].eventId = nodeData.inputs.eventIdDeleteEvent
- }
- break
- }
- })
- } else if (outlookType === 'message') {
- // Map message actions to their parameters
- actions.forEach((action) => {
- defaultParams[action] = {}
-
- switch (action) {
- case 'listMessages':
- if (nodeData.inputs?.maxResultsListMessages) {
- defaultParams[action].maxResults = nodeData.inputs.maxResultsListMessages
- }
- if (nodeData.inputs?.filterListMessages) {
- defaultParams[action].filter = nodeData.inputs.filterListMessages
- }
- break
-
- case 'getMessage':
- if (nodeData.inputs?.messageIdGetMessage) {
- defaultParams[action].messageId = nodeData.inputs.messageIdGetMessage
- }
- break
-
- case 'createDraftMessage':
- if (nodeData.inputs?.toCreateDraftMessage) {
- defaultParams[action].to = nodeData.inputs.toCreateDraftMessage
- }
- if (nodeData.inputs?.subjectCreateDraftMessage) {
- defaultParams[action].subject = nodeData.inputs.subjectCreateDraftMessage
- }
- if (nodeData.inputs?.bodyCreateDraftMessage) {
- defaultParams[action].body = nodeData.inputs.bodyCreateDraftMessage
- }
- if (nodeData.inputs?.ccCreateDraftMessage) {
- defaultParams[action].cc = nodeData.inputs.ccCreateDraftMessage
- }
- if (nodeData.inputs?.bccCreateDraftMessage) {
- defaultParams[action].bcc = nodeData.inputs.bccCreateDraftMessage
- }
- break
-
- case 'sendMessage':
- if (nodeData.inputs?.toSendMessage) {
- defaultParams[action].to = nodeData.inputs.toSendMessage
- }
- if (nodeData.inputs?.subjectSendMessage) {
- defaultParams[action].subject = nodeData.inputs.subjectSendMessage
- }
- if (nodeData.inputs?.bodySendMessage) {
- defaultParams[action].body = nodeData.inputs.bodySendMessage
- }
- break
-
- case 'updateMessage':
- if (nodeData.inputs?.messageIdUpdateMessage) {
- defaultParams[action].messageId = nodeData.inputs.messageIdUpdateMessage
- }
- if (nodeData.inputs?.isReadUpdateMessage !== undefined) {
- defaultParams[action].isRead = nodeData.inputs.isReadUpdateMessage
- }
- break
-
- case 'deleteMessage':
- if (nodeData.inputs?.messageIdDeleteMessage) {
- defaultParams[action].messageId = nodeData.inputs.messageIdDeleteMessage
- }
- break
-
- case 'copyMessage':
- if (nodeData.inputs?.messageIdCopyMessage) {
- defaultParams[action].messageId = nodeData.inputs.messageIdCopyMessage
- }
- if (nodeData.inputs?.destinationFolderIdCopyMessage) {
- defaultParams[action].destinationFolderId = nodeData.inputs.destinationFolderIdCopyMessage
- }
- break
-
- case 'moveMessage':
- if (nodeData.inputs?.messageIdMoveMessage) {
- defaultParams[action].messageId = nodeData.inputs.messageIdMoveMessage
- }
- if (nodeData.inputs?.destinationFolderIdMoveMessage) {
- defaultParams[action].destinationFolderId = nodeData.inputs.destinationFolderIdMoveMessage
- }
- break
-
- case 'replyMessage':
- if (nodeData.inputs?.messageIdReplyMessage) {
- defaultParams[action].messageId = nodeData.inputs.messageIdReplyMessage
- }
- if (nodeData.inputs?.replyBodyReplyMessage) {
- defaultParams[action].replyBody = nodeData.inputs.replyBodyReplyMessage
- }
- break
-
- case 'forwardMessage':
- if (nodeData.inputs?.messageIdForwardMessage) {
- defaultParams[action].messageId = nodeData.inputs.messageIdForwardMessage
- }
- if (nodeData.inputs?.forwardToForwardMessage) {
- defaultParams[action].forwardTo = nodeData.inputs.forwardToForwardMessage
- }
- if (nodeData.inputs?.forwardCommentForwardMessage) {
- defaultParams[action].forwardComment = nodeData.inputs.forwardCommentForwardMessage
- }
- break
- }
- })
- }
+ const defaultParams = this.transformNodeInputsToToolArgs(nodeData)
const outlookTools = createOutlookTools({
accessToken,
@@ -966,6 +757,66 @@ class MicrosoftOutlook_Tools implements INode {
return outlookTools
}
+
+ transformNodeInputsToToolArgs(nodeData: INodeData): Record {
+ // Collect default parameters from inputs
+ const defaultParams: Record = {}
+
+ // Calendar parameters
+ if (nodeData.inputs?.maxResultsListCalendars) defaultParams.maxResultsListCalendars = nodeData.inputs.maxResultsListCalendars
+ if (nodeData.inputs?.calendarIdGetCalendar) defaultParams.calendarIdGetCalendar = nodeData.inputs.calendarIdGetCalendar
+ if (nodeData.inputs?.calendarNameCreateCalendar)
+ defaultParams.calendarNameCreateCalendar = nodeData.inputs.calendarNameCreateCalendar
+ if (nodeData.inputs?.calendarIdUpdateCalendar) defaultParams.calendarIdUpdateCalendar = nodeData.inputs.calendarIdUpdateCalendar
+ if (nodeData.inputs?.calendarNameUpdateCalendar)
+ defaultParams.calendarNameUpdateCalendar = nodeData.inputs.calendarNameUpdateCalendar
+ if (nodeData.inputs?.calendarIdDeleteCalendar) defaultParams.calendarIdDeleteCalendar = nodeData.inputs.calendarIdDeleteCalendar
+ if (nodeData.inputs?.calendarIdListEvents) defaultParams.calendarIdListEvents = nodeData.inputs.calendarIdListEvents
+ if (nodeData.inputs?.maxResultsListEvents) defaultParams.maxResultsListEvents = nodeData.inputs.maxResultsListEvents
+ if (nodeData.inputs?.startDateTimeListEvents) defaultParams.startDateTimeListEvents = nodeData.inputs.startDateTimeListEvents
+ if (nodeData.inputs?.endDateTimeListEvents) defaultParams.endDateTimeListEvents = nodeData.inputs.endDateTimeListEvents
+ if (nodeData.inputs?.eventIdGetEvent) defaultParams.eventIdGetEvent = nodeData.inputs.eventIdGetEvent
+ if (nodeData.inputs?.subjectCreateEvent) defaultParams.subjectCreateEvent = nodeData.inputs.subjectCreateEvent
+ if (nodeData.inputs?.bodyCreateEvent) defaultParams.bodyCreateEvent = nodeData.inputs.bodyCreateEvent
+ if (nodeData.inputs?.startDateTimeCreateEvent) defaultParams.startDateTimeCreateEvent = nodeData.inputs.startDateTimeCreateEvent
+ if (nodeData.inputs?.endDateTimeCreateEvent) defaultParams.endDateTimeCreateEvent = nodeData.inputs.endDateTimeCreateEvent
+ if (nodeData.inputs?.timeZoneCreateEvent) defaultParams.timeZoneCreateEvent = nodeData.inputs.timeZoneCreateEvent
+ if (nodeData.inputs?.locationCreateEvent) defaultParams.locationCreateEvent = nodeData.inputs.locationCreateEvent
+ if (nodeData.inputs?.attendeesCreateEvent) defaultParams.attendeesCreateEvent = nodeData.inputs.attendeesCreateEvent
+ if (nodeData.inputs?.eventIdUpdateEvent) defaultParams.eventIdUpdateEvent = nodeData.inputs.eventIdUpdateEvent
+ if (nodeData.inputs?.subjectUpdateEvent) defaultParams.subjectUpdateEvent = nodeData.inputs.subjectUpdateEvent
+ if (nodeData.inputs?.eventIdDeleteEvent) defaultParams.eventIdDeleteEvent = nodeData.inputs.eventIdDeleteEvent
+
+ // Message parameters
+ if (nodeData.inputs?.maxResultsListMessages) defaultParams.maxResultsListMessages = nodeData.inputs.maxResultsListMessages
+ if (nodeData.inputs?.filterListMessages) defaultParams.filterListMessages = nodeData.inputs.filterListMessages
+ if (nodeData.inputs?.messageIdGetMessage) defaultParams.messageIdGetMessage = nodeData.inputs.messageIdGetMessage
+ if (nodeData.inputs?.toCreateDraftMessage) defaultParams.toCreateDraftMessage = nodeData.inputs.toCreateDraftMessage
+ if (nodeData.inputs?.subjectCreateDraftMessage) defaultParams.subjectCreateDraftMessage = nodeData.inputs.subjectCreateDraftMessage
+ if (nodeData.inputs?.bodyCreateDraftMessage) defaultParams.bodyCreateDraftMessage = nodeData.inputs.bodyCreateDraftMessage
+ if (nodeData.inputs?.ccCreateDraftMessage) defaultParams.ccCreateDraftMessage = nodeData.inputs.ccCreateDraftMessage
+ if (nodeData.inputs?.bccCreateDraftMessage) defaultParams.bccCreateDraftMessage = nodeData.inputs.bccCreateDraftMessage
+ if (nodeData.inputs?.toSendMessage) defaultParams.toSendMessage = nodeData.inputs.toSendMessage
+ if (nodeData.inputs?.subjectSendMessage) defaultParams.subjectSendMessage = nodeData.inputs.subjectSendMessage
+ if (nodeData.inputs?.bodySendMessage) defaultParams.bodySendMessage = nodeData.inputs.bodySendMessage
+ if (nodeData.inputs?.messageIdUpdateMessage) defaultParams.messageIdUpdateMessage = nodeData.inputs.messageIdUpdateMessage
+ if (nodeData.inputs?.isReadUpdateMessage !== undefined) defaultParams.isReadUpdateMessage = nodeData.inputs.isReadUpdateMessage
+ if (nodeData.inputs?.messageIdDeleteMessage) defaultParams.messageIdDeleteMessage = nodeData.inputs.messageIdDeleteMessage
+ if (nodeData.inputs?.messageIdCopyMessage) defaultParams.messageIdCopyMessage = nodeData.inputs.messageIdCopyMessage
+ if (nodeData.inputs?.destinationFolderIdCopyMessage)
+ defaultParams.destinationFolderIdCopyMessage = nodeData.inputs.destinationFolderIdCopyMessage
+ if (nodeData.inputs?.messageIdMoveMessage) defaultParams.messageIdMoveMessage = nodeData.inputs.messageIdMoveMessage
+ if (nodeData.inputs?.destinationFolderIdMoveMessage)
+ defaultParams.destinationFolderIdMoveMessage = nodeData.inputs.destinationFolderIdMoveMessage
+ if (nodeData.inputs?.messageIdReplyMessage) defaultParams.messageIdReplyMessage = nodeData.inputs.messageIdReplyMessage
+ if (nodeData.inputs?.replyBodyReplyMessage) defaultParams.replyBodyReplyMessage = nodeData.inputs.replyBodyReplyMessage
+ if (nodeData.inputs?.messageIdForwardMessage) defaultParams.messageIdForwardMessage = nodeData.inputs.messageIdForwardMessage
+ if (nodeData.inputs?.forwardToForwardMessage) defaultParams.forwardToForwardMessage = nodeData.inputs.forwardToForwardMessage
+ if (nodeData.inputs?.forwardCommentForwardMessage)
+ defaultParams.forwardCommentForwardMessage = nodeData.inputs.forwardCommentForwardMessage
+
+ return defaultParams
+ }
}
module.exports = { nodeClass: MicrosoftOutlook_Tools }
diff --git a/packages/components/nodes/tools/MicrosoftTeams/MicrosoftTeams.ts b/packages/components/nodes/tools/MicrosoftTeams/MicrosoftTeams.ts
index 0303c324f..d9391c504 100644
--- a/packages/components/nodes/tools/MicrosoftTeams/MicrosoftTeams.ts
+++ b/packages/components/nodes/tools/MicrosoftTeams/MicrosoftTeams.ts
@@ -1,4 +1,4 @@
-import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface'
+import { INode, INodeData, INodeParams } from '../../../src/Interface'
import { convertMultiOptionsToStringArray, getCredentialData, getCredentialParam, refreshOAuth2Token } from '../../../src/utils'
import { createTeamsTools } from './core'
@@ -928,289 +928,7 @@ class MicrosoftTeams_Tools implements INode {
throw new Error('No access token found in credential')
}
- // Prepare default parameters for each action based on type
- const defaultParams: ICommonObject = {}
-
- if (teamsType === 'channel') {
- // Map channel actions to their parameters
- actions.forEach((action) => {
- defaultParams[action] = {}
-
- switch (action) {
- case 'listChannels':
- if (nodeData.inputs?.teamIdListChannels) {
- defaultParams[action].teamId = nodeData.inputs.teamIdListChannels
- }
- if (nodeData.inputs?.maxResultsListChannels) {
- defaultParams[action].maxResults = nodeData.inputs.maxResultsListChannels
- }
- break
-
- case 'getChannel':
- if (nodeData.inputs?.teamIdGetChannel) {
- defaultParams[action].teamId = nodeData.inputs.teamIdGetChannel
- }
- if (nodeData.inputs?.channelIdGetChannel) {
- defaultParams[action].channelId = nodeData.inputs.channelIdGetChannel
- }
- break
-
- case 'createChannel':
- if (nodeData.inputs?.teamIdCreateChannel) {
- defaultParams[action].teamId = nodeData.inputs.teamIdCreateChannel
- }
- if (nodeData.inputs?.displayNameCreateChannel) {
- defaultParams[action].displayName = nodeData.inputs.displayNameCreateChannel
- }
- if (nodeData.inputs?.descriptionCreateChannel) {
- defaultParams[action].description = nodeData.inputs.descriptionCreateChannel
- }
- if (nodeData.inputs?.membershipTypeCreateChannel) {
- defaultParams[action].membershipType = nodeData.inputs.membershipTypeCreateChannel
- }
- break
-
- case 'updateChannel':
- if (nodeData.inputs?.teamIdUpdateChannel) {
- defaultParams[action].teamId = nodeData.inputs.teamIdUpdateChannel
- }
- if (nodeData.inputs?.channelIdUpdateChannel) {
- defaultParams[action].channelId = nodeData.inputs.channelIdUpdateChannel
- }
- if (nodeData.inputs?.displayNameUpdateChannel) {
- defaultParams[action].displayName = nodeData.inputs.displayNameUpdateChannel
- }
- break
-
- case 'deleteChannel':
- case 'archiveChannel':
- case 'unarchiveChannel':
- if (nodeData.inputs?.teamIdDeleteChannel) {
- defaultParams[action].teamId = nodeData.inputs.teamIdDeleteChannel
- }
- if (nodeData.inputs?.channelIdDeleteChannel) {
- defaultParams[action].channelId = nodeData.inputs.channelIdDeleteChannel
- }
- break
-
- case 'listChannelMembers':
- if (nodeData.inputs?.teamIdChannelMembers) {
- defaultParams[action].teamId = nodeData.inputs.teamIdChannelMembers
- }
- if (nodeData.inputs?.channelIdChannelMembers) {
- defaultParams[action].channelId = nodeData.inputs.channelIdChannelMembers
- }
- break
-
- case 'addChannelMember':
- case 'removeChannelMember':
- if (nodeData.inputs?.teamIdChannelMembers) {
- defaultParams[action].teamId = nodeData.inputs.teamIdChannelMembers
- }
- if (nodeData.inputs?.channelIdChannelMembers) {
- defaultParams[action].channelId = nodeData.inputs.channelIdChannelMembers
- }
- if (nodeData.inputs?.userIdChannelMember) {
- defaultParams[action].userId = nodeData.inputs.userIdChannelMember
- }
- break
- }
- })
- } else if (teamsType === 'chat') {
- // Map chat actions to their parameters
- actions.forEach((action) => {
- defaultParams[action] = {}
-
- switch (action) {
- case 'listChats':
- if (nodeData.inputs?.maxResultsListChats) {
- defaultParams[action].maxResults = nodeData.inputs.maxResultsListChats
- }
- break
-
- case 'getChat':
- if (nodeData.inputs?.chatIdGetChat) {
- defaultParams[action].chatId = nodeData.inputs.chatIdGetChat
- }
- break
-
- case 'createChat':
- if (nodeData.inputs?.chatTypeCreateChat) {
- defaultParams[action].chatType = nodeData.inputs.chatTypeCreateChat
- }
- if (nodeData.inputs?.topicCreateChat) {
- defaultParams[action].topic = nodeData.inputs.topicCreateChat
- }
- if (nodeData.inputs?.membersCreateChat) {
- defaultParams[action].members = nodeData.inputs.membersCreateChat
- }
- break
-
- case 'updateChat':
- if (nodeData.inputs?.chatIdUpdateChat) {
- defaultParams[action].chatId = nodeData.inputs.chatIdUpdateChat
- }
- if (nodeData.inputs?.topicUpdateChat) {
- defaultParams[action].topic = nodeData.inputs.topicUpdateChat
- }
- break
-
- case 'deleteChat':
- if (nodeData.inputs?.chatIdDeleteChat) {
- defaultParams[action].chatId = nodeData.inputs.chatIdDeleteChat
- }
- break
-
- case 'listChatMembers':
- if (nodeData.inputs?.chatIdChatMembers) {
- defaultParams[action].chatId = nodeData.inputs.chatIdChatMembers
- }
- break
-
- case 'addChatMember':
- case 'removeChatMember':
- if (nodeData.inputs?.chatIdChatMembers) {
- defaultParams[action].chatId = nodeData.inputs.chatIdChatMembers
- }
- if (nodeData.inputs?.userIdChatMember) {
- defaultParams[action].userId = nodeData.inputs.userIdChatMember
- }
- break
-
- case 'pinMessage':
- case 'unpinMessage':
- if (nodeData.inputs?.chatIdPinMessage) {
- defaultParams[action].chatId = nodeData.inputs.chatIdPinMessage
- }
- if (nodeData.inputs?.messageIdPinMessage) {
- defaultParams[action].messageId = nodeData.inputs.messageIdPinMessage
- }
- break
- }
- })
- } else if (teamsType === 'chatMessage') {
- // Map chat message actions to their parameters
- actions.forEach((action) => {
- defaultParams[action] = {}
-
- switch (action) {
- case 'listMessages':
- if (nodeData.inputs?.chatChannelIdListMessages) {
- defaultParams[action].chatChannelId = nodeData.inputs.chatChannelIdListMessages
- }
- if (nodeData.inputs?.teamIdListMessages) {
- defaultParams[action].teamId = nodeData.inputs.teamIdListMessages
- }
- if (nodeData.inputs?.maxResultsListMessages) {
- defaultParams[action].maxResults = nodeData.inputs.maxResultsListMessages
- }
- break
-
- case 'getMessage':
- if (nodeData.inputs?.chatChannelIdGetMessage) {
- defaultParams[action].chatChannelId = nodeData.inputs.chatChannelIdGetMessage
- }
- if (nodeData.inputs?.teamIdGetMessage) {
- defaultParams[action].teamId = nodeData.inputs.teamIdGetMessage
- }
- if (nodeData.inputs?.messageIdGetMessage) {
- defaultParams[action].messageId = nodeData.inputs.messageIdGetMessage
- }
- break
-
- case 'sendMessage':
- if (nodeData.inputs?.chatChannelIdSendMessage) {
- defaultParams[action].chatChannelId = nodeData.inputs.chatChannelIdSendMessage
- }
- if (nodeData.inputs?.teamIdSendMessage) {
- defaultParams[action].teamId = nodeData.inputs.teamIdSendMessage
- }
- if (nodeData.inputs?.messageBodySendMessage) {
- defaultParams[action].messageBody = nodeData.inputs.messageBodySendMessage
- }
- if (nodeData.inputs?.contentTypeSendMessage) {
- defaultParams[action].contentType = nodeData.inputs.contentTypeSendMessage
- }
- break
-
- case 'updateMessage':
- if (nodeData.inputs?.chatChannelIdUpdateMessage) {
- defaultParams[action].chatChannelId = nodeData.inputs.chatChannelIdUpdateMessage
- }
- if (nodeData.inputs?.teamIdUpdateMessage) {
- defaultParams[action].teamId = nodeData.inputs.teamIdUpdateMessage
- }
- if (nodeData.inputs?.messageIdUpdateMessage) {
- defaultParams[action].messageId = nodeData.inputs.messageIdUpdateMessage
- }
- break
-
- case 'deleteMessage':
- if (nodeData.inputs?.chatChannelIdDeleteMessage) {
- defaultParams[action].chatChannelId = nodeData.inputs.chatChannelIdDeleteMessage
- }
- if (nodeData.inputs?.teamIdDeleteMessage) {
- defaultParams[action].teamId = nodeData.inputs.teamIdDeleteMessage
- }
- if (nodeData.inputs?.messageIdDeleteMessage) {
- defaultParams[action].messageId = nodeData.inputs.messageIdDeleteMessage
- }
- break
-
- case 'replyToMessage':
- if (nodeData.inputs?.chatChannelIdReplyMessage) {
- defaultParams[action].chatChannelId = nodeData.inputs.chatChannelIdReplyMessage
- }
- if (nodeData.inputs?.teamIdReplyMessage) {
- defaultParams[action].teamId = nodeData.inputs.teamIdReplyMessage
- }
- if (nodeData.inputs?.messageIdReplyMessage) {
- defaultParams[action].messageId = nodeData.inputs.messageIdReplyMessage
- }
- if (nodeData.inputs?.replyBodyReplyMessage) {
- defaultParams[action].replyBody = nodeData.inputs.replyBodyReplyMessage
- }
- break
-
- case 'setReaction':
- if (nodeData.inputs?.chatChannelIdReaction) {
- defaultParams[action].chatChannelId = nodeData.inputs.chatChannelIdReaction
- }
- if (nodeData.inputs?.teamIdReaction) {
- defaultParams[action].teamId = nodeData.inputs.teamIdReaction
- }
- if (nodeData.inputs?.messageIdReaction) {
- defaultParams[action].messageId = nodeData.inputs.messageIdReaction
- }
- if (nodeData.inputs?.reactionTypeSetReaction) {
- defaultParams[action].reactionType = nodeData.inputs.reactionTypeSetReaction
- }
- break
-
- case 'unsetReaction':
- if (nodeData.inputs?.chatChannelIdReaction) {
- defaultParams[action].chatChannelId = nodeData.inputs.chatChannelIdReaction
- }
- if (nodeData.inputs?.teamIdReaction) {
- defaultParams[action].teamId = nodeData.inputs.teamIdReaction
- }
- if (nodeData.inputs?.messageIdReaction) {
- defaultParams[action].messageId = nodeData.inputs.messageIdReaction
- }
- break
-
- case 'getAllMessages':
- // getAllMessages might use similar params to listMessages
- if (nodeData.inputs?.chatChannelIdListMessages) {
- defaultParams[action].chatChannelId = nodeData.inputs.chatChannelIdListMessages
- }
- if (nodeData.inputs?.teamIdListMessages) {
- defaultParams[action].teamId = nodeData.inputs.teamIdListMessages
- }
- break
- }
- })
- }
+ const defaultParams = this.transformNodeInputsToToolArgs(nodeData)
const teamsTools = createTeamsTools({
accessToken,
@@ -1221,6 +939,74 @@ class MicrosoftTeams_Tools implements INode {
return teamsTools
}
+
+ transformNodeInputsToToolArgs(nodeData: INodeData): Record {
+ // Collect default parameters from inputs
+ const defaultParams: Record = {}
+
+ // Channel parameters
+ if (nodeData.inputs?.teamIdListChannels) defaultParams.teamIdListChannels = nodeData.inputs.teamIdListChannels
+ if (nodeData.inputs?.maxResultsListChannels) defaultParams.maxResultsListChannels = nodeData.inputs.maxResultsListChannels
+ if (nodeData.inputs?.teamIdGetChannel) defaultParams.teamIdGetChannel = nodeData.inputs.teamIdGetChannel
+ if (nodeData.inputs?.channelIdGetChannel) defaultParams.channelIdGetChannel = nodeData.inputs.channelIdGetChannel
+ if (nodeData.inputs?.teamIdCreateChannel) defaultParams.teamIdCreateChannel = nodeData.inputs.teamIdCreateChannel
+ if (nodeData.inputs?.displayNameCreateChannel) defaultParams.displayNameCreateChannel = nodeData.inputs.displayNameCreateChannel
+ if (nodeData.inputs?.descriptionCreateChannel) defaultParams.descriptionCreateChannel = nodeData.inputs.descriptionCreateChannel
+ if (nodeData.inputs?.membershipTypeCreateChannel)
+ defaultParams.membershipTypeCreateChannel = nodeData.inputs.membershipTypeCreateChannel
+ if (nodeData.inputs?.teamIdUpdateChannel) defaultParams.teamIdUpdateChannel = nodeData.inputs.teamIdUpdateChannel
+ if (nodeData.inputs?.channelIdUpdateChannel) defaultParams.channelIdUpdateChannel = nodeData.inputs.channelIdUpdateChannel
+ if (nodeData.inputs?.displayNameUpdateChannel) defaultParams.displayNameUpdateChannel = nodeData.inputs.displayNameUpdateChannel
+ if (nodeData.inputs?.teamIdDeleteChannel) defaultParams.teamIdDeleteChannel = nodeData.inputs.teamIdDeleteChannel
+ if (nodeData.inputs?.channelIdDeleteChannel) defaultParams.channelIdDeleteChannel = nodeData.inputs.channelIdDeleteChannel
+ if (nodeData.inputs?.teamIdChannelMembers) defaultParams.teamIdChannelMembers = nodeData.inputs.teamIdChannelMembers
+ if (nodeData.inputs?.channelIdChannelMembers) defaultParams.channelIdChannelMembers = nodeData.inputs.channelIdChannelMembers
+ if (nodeData.inputs?.userIdChannelMember) defaultParams.userIdChannelMember = nodeData.inputs.userIdChannelMember
+
+ // Chat parameters
+ if (nodeData.inputs?.maxResultsListChats) defaultParams.maxResultsListChats = nodeData.inputs.maxResultsListChats
+ if (nodeData.inputs?.chatIdGetChat) defaultParams.chatIdGetChat = nodeData.inputs.chatIdGetChat
+ if (nodeData.inputs?.chatTypeCreateChat) defaultParams.chatTypeCreateChat = nodeData.inputs.chatTypeCreateChat
+ if (nodeData.inputs?.topicCreateChat) defaultParams.topicCreateChat = nodeData.inputs.topicCreateChat
+ if (nodeData.inputs?.membersCreateChat) defaultParams.membersCreateChat = nodeData.inputs.membersCreateChat
+ if (nodeData.inputs?.chatIdUpdateChat) defaultParams.chatIdUpdateChat = nodeData.inputs.chatIdUpdateChat
+ if (nodeData.inputs?.topicUpdateChat) defaultParams.topicUpdateChat = nodeData.inputs.topicUpdateChat
+ if (nodeData.inputs?.chatIdDeleteChat) defaultParams.chatIdDeleteChat = nodeData.inputs.chatIdDeleteChat
+ if (nodeData.inputs?.chatIdChatMembers) defaultParams.chatIdChatMembers = nodeData.inputs.chatIdChatMembers
+ if (nodeData.inputs?.userIdChatMember) defaultParams.userIdChatMember = nodeData.inputs.userIdChatMember
+ if (nodeData.inputs?.chatIdPinMessage) defaultParams.chatIdPinMessage = nodeData.inputs.chatIdPinMessage
+ if (nodeData.inputs?.messageIdPinMessage) defaultParams.messageIdPinMessage = nodeData.inputs.messageIdPinMessage
+
+ // Chat Message parameters
+ if (nodeData.inputs?.chatChannelIdListMessages) defaultParams.chatChannelIdListMessages = nodeData.inputs.chatChannelIdListMessages
+ if (nodeData.inputs?.teamIdListMessages) defaultParams.teamIdListMessages = nodeData.inputs.teamIdListMessages
+ if (nodeData.inputs?.maxResultsListMessages) defaultParams.maxResultsListMessages = nodeData.inputs.maxResultsListMessages
+ if (nodeData.inputs?.chatChannelIdGetMessage) defaultParams.chatChannelIdGetMessage = nodeData.inputs.chatChannelIdGetMessage
+ if (nodeData.inputs?.teamIdGetMessage) defaultParams.teamIdGetMessage = nodeData.inputs.teamIdGetMessage
+ if (nodeData.inputs?.messageIdGetMessage) defaultParams.messageIdGetMessage = nodeData.inputs.messageIdGetMessage
+ if (nodeData.inputs?.chatChannelIdSendMessage) defaultParams.chatChannelIdSendMessage = nodeData.inputs.chatChannelIdSendMessage
+ if (nodeData.inputs?.teamIdSendMessage) defaultParams.teamIdSendMessage = nodeData.inputs.teamIdSendMessage
+ if (nodeData.inputs?.messageBodySendMessage) defaultParams.messageBodySendMessage = nodeData.inputs.messageBodySendMessage
+ if (nodeData.inputs?.contentTypeSendMessage) defaultParams.contentTypeSendMessage = nodeData.inputs.contentTypeSendMessage
+ if (nodeData.inputs?.chatChannelIdUpdateMessage)
+ defaultParams.chatChannelIdUpdateMessage = nodeData.inputs.chatChannelIdUpdateMessage
+ if (nodeData.inputs?.teamIdUpdateMessage) defaultParams.teamIdUpdateMessage = nodeData.inputs.teamIdUpdateMessage
+ if (nodeData.inputs?.messageIdUpdateMessage) defaultParams.messageIdUpdateMessage = nodeData.inputs.messageIdUpdateMessage
+ if (nodeData.inputs?.chatChannelIdDeleteMessage)
+ defaultParams.chatChannelIdDeleteMessage = nodeData.inputs.chatChannelIdDeleteMessage
+ if (nodeData.inputs?.teamIdDeleteMessage) defaultParams.teamIdDeleteMessage = nodeData.inputs.teamIdDeleteMessage
+ if (nodeData.inputs?.messageIdDeleteMessage) defaultParams.messageIdDeleteMessage = nodeData.inputs.messageIdDeleteMessage
+ if (nodeData.inputs?.chatChannelIdReplyMessage) defaultParams.chatChannelIdReplyMessage = nodeData.inputs.chatChannelIdReplyMessage
+ if (nodeData.inputs?.teamIdReplyMessage) defaultParams.teamIdReplyMessage = nodeData.inputs.teamIdReplyMessage
+ if (nodeData.inputs?.messageIdReplyMessage) defaultParams.messageIdReplyMessage = nodeData.inputs.messageIdReplyMessage
+ if (nodeData.inputs?.replyBodyReplyMessage) defaultParams.replyBodyReplyMessage = nodeData.inputs.replyBodyReplyMessage
+ if (nodeData.inputs?.chatChannelIdReaction) defaultParams.chatChannelIdReaction = nodeData.inputs.chatChannelIdReaction
+ if (nodeData.inputs?.teamIdReaction) defaultParams.teamIdReaction = nodeData.inputs.teamIdReaction
+ if (nodeData.inputs?.messageIdReaction) defaultParams.messageIdReaction = nodeData.inputs.messageIdReaction
+ if (nodeData.inputs?.reactionTypeSetReaction) defaultParams.reactionTypeSetReaction = nodeData.inputs.reactionTypeSetReaction
+
+ return defaultParams
+ }
}
module.exports = { nodeClass: MicrosoftTeams_Tools }