From 4a1a84e08e3e60fae9e4e4c799fa82529d7fd2bd Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Thu, 9 Apr 2026 15:08:44 -0700 Subject: [PATCH 1/3] fix(tools): add Atlassian error extractor to all Jira, JSM, and Confluence tools Wire up the existing `atlassian-errors` error extractor to all 95 Atlassian tool configs so the executor surfaces meaningful error messages instead of generic status codes. Also fix the extractor itself to handle all three Atlassian error response formats: `errorMessage` (JSM), `errorMessages` array (Jira), and `message` (Confluence). Co-Authored-By: Claude Opus 4.6 --- apps/sim/tools/confluence/add_label.ts | 2 ++ apps/sim/tools/confluence/create_blogpost.ts | 2 ++ apps/sim/tools/confluence/create_comment.ts | 2 ++ apps/sim/tools/confluence/create_page.ts | 2 ++ apps/sim/tools/confluence/create_page_property.ts | 2 ++ apps/sim/tools/confluence/create_space.ts | 2 ++ .../sim/tools/confluence/create_space_property.ts | 2 ++ apps/sim/tools/confluence/delete_attachment.ts | 2 ++ apps/sim/tools/confluence/delete_blogpost.ts | 2 ++ apps/sim/tools/confluence/delete_comment.ts | 2 ++ apps/sim/tools/confluence/delete_label.ts | 2 ++ apps/sim/tools/confluence/delete_page.ts | 2 ++ apps/sim/tools/confluence/delete_page_property.ts | 2 ++ apps/sim/tools/confluence/delete_space.ts | 2 ++ .../sim/tools/confluence/delete_space_property.ts | 2 ++ apps/sim/tools/confluence/get_blogpost.ts | 2 ++ apps/sim/tools/confluence/get_page_ancestors.ts | 2 ++ apps/sim/tools/confluence/get_page_children.ts | 2 ++ apps/sim/tools/confluence/get_page_descendants.ts | 2 ++ apps/sim/tools/confluence/get_page_version.ts | 2 ++ apps/sim/tools/confluence/get_pages_by_label.ts | 2 ++ apps/sim/tools/confluence/get_space.ts | 2 ++ apps/sim/tools/confluence/get_task.ts | 2 ++ apps/sim/tools/confluence/get_user.ts | 2 ++ apps/sim/tools/confluence/list_attachments.ts | 2 ++ apps/sim/tools/confluence/list_blogposts.ts | 2 ++ .../tools/confluence/list_blogposts_in_space.ts | 2 ++ apps/sim/tools/confluence/list_comments.ts | 2 ++ apps/sim/tools/confluence/list_labels.ts | 2 ++ apps/sim/tools/confluence/list_page_properties.ts | 2 ++ apps/sim/tools/confluence/list_page_versions.ts | 2 ++ apps/sim/tools/confluence/list_pages_in_space.ts | 2 ++ apps/sim/tools/confluence/list_space_labels.ts | 2 ++ .../tools/confluence/list_space_permissions.ts | 2 ++ .../sim/tools/confluence/list_space_properties.ts | 2 ++ apps/sim/tools/confluence/list_spaces.ts | 2 ++ apps/sim/tools/confluence/list_tasks.ts | 2 ++ apps/sim/tools/confluence/retrieve.ts | 2 ++ apps/sim/tools/confluence/search.ts | 2 ++ apps/sim/tools/confluence/search_in_space.ts | 2 ++ apps/sim/tools/confluence/update.ts | 2 ++ apps/sim/tools/confluence/update_blogpost.ts | 2 ++ apps/sim/tools/confluence/update_comment.ts | 2 ++ apps/sim/tools/confluence/update_space.ts | 2 ++ apps/sim/tools/confluence/update_task.ts | 2 ++ apps/sim/tools/confluence/upload_attachment.ts | 2 ++ apps/sim/tools/error-extractors.ts | 15 +++++++++++++-- apps/sim/tools/jira/add_attachment.ts | 2 ++ apps/sim/tools/jira/add_comment.ts | 2 ++ apps/sim/tools/jira/add_watcher.ts | 2 ++ apps/sim/tools/jira/add_worklog.ts | 2 ++ apps/sim/tools/jira/assign_issue.ts | 2 ++ apps/sim/tools/jira/bulk_read.ts | 2 ++ apps/sim/tools/jira/create_issue_link.ts | 2 ++ apps/sim/tools/jira/delete_attachment.ts | 2 ++ apps/sim/tools/jira/delete_comment.ts | 2 ++ apps/sim/tools/jira/delete_issue.ts | 2 ++ apps/sim/tools/jira/delete_issue_link.ts | 2 ++ apps/sim/tools/jira/delete_worklog.ts | 2 ++ apps/sim/tools/jira/get_attachments.ts | 2 ++ apps/sim/tools/jira/get_comments.ts | 2 ++ apps/sim/tools/jira/get_users.ts | 2 ++ apps/sim/tools/jira/get_worklogs.ts | 2 ++ apps/sim/tools/jira/remove_watcher.ts | 2 ++ apps/sim/tools/jira/retrieve.ts | 2 ++ apps/sim/tools/jira/search_issues.ts | 2 ++ apps/sim/tools/jira/search_users.ts | 2 ++ apps/sim/tools/jira/transition_issue.ts | 2 ++ apps/sim/tools/jira/update.ts | 2 ++ apps/sim/tools/jira/update_comment.ts | 2 ++ apps/sim/tools/jira/update_worklog.ts | 2 ++ apps/sim/tools/jira/write.ts | 2 ++ apps/sim/tools/jsm/add_comment.ts | 2 ++ apps/sim/tools/jsm/add_customer.ts | 2 ++ apps/sim/tools/jsm/add_organization.ts | 2 ++ apps/sim/tools/jsm/add_participants.ts | 2 ++ apps/sim/tools/jsm/answer_approval.ts | 2 ++ apps/sim/tools/jsm/create_organization.ts | 2 ++ apps/sim/tools/jsm/create_request.ts | 2 ++ apps/sim/tools/jsm/get_approvals.ts | 2 ++ apps/sim/tools/jsm/get_comments.ts | 2 ++ apps/sim/tools/jsm/get_customers.ts | 2 ++ apps/sim/tools/jsm/get_form_structure.ts | 2 ++ apps/sim/tools/jsm/get_form_templates.ts | 2 ++ apps/sim/tools/jsm/get_issue_forms.ts | 2 ++ apps/sim/tools/jsm/get_organizations.ts | 2 ++ apps/sim/tools/jsm/get_participants.ts | 2 ++ apps/sim/tools/jsm/get_queues.ts | 2 ++ apps/sim/tools/jsm/get_request.ts | 2 ++ apps/sim/tools/jsm/get_request_type_fields.ts | 2 ++ apps/sim/tools/jsm/get_request_types.ts | 2 ++ apps/sim/tools/jsm/get_requests.ts | 2 ++ apps/sim/tools/jsm/get_service_desks.ts | 2 ++ apps/sim/tools/jsm/get_sla.ts | 2 ++ apps/sim/tools/jsm/get_transitions.ts | 2 ++ apps/sim/tools/jsm/transition_request.ts | 2 ++ 96 files changed, 203 insertions(+), 2 deletions(-) diff --git a/apps/sim/tools/confluence/add_label.ts b/apps/sim/tools/confluence/add_label.ts index db931b3cf0d..2ba111f529d 100644 --- a/apps/sim/tools/confluence/add_label.ts +++ b/apps/sim/tools/confluence/add_label.ts @@ -34,6 +34,8 @@ export const confluenceAddLabelTool: ToolConfig< provider: 'confluence', }, + errorExtractor: 'atlassian-errors', + params: { accessToken: { type: 'string', diff --git a/apps/sim/tools/confluence/create_blogpost.ts b/apps/sim/tools/confluence/create_blogpost.ts index b39e91b7f18..e67e0f0732b 100644 --- a/apps/sim/tools/confluence/create_blogpost.ts +++ b/apps/sim/tools/confluence/create_blogpost.ts @@ -44,6 +44,8 @@ export const confluenceCreateBlogPostTool: ToolConfig< provider: 'confluence', }, + errorExtractor: 'atlassian-errors', + params: { accessToken: { type: 'string', diff --git a/apps/sim/tools/confluence/create_comment.ts b/apps/sim/tools/confluence/create_comment.ts index aa18a5c4a0b..b09c6ddb54d 100644 --- a/apps/sim/tools/confluence/create_comment.ts +++ b/apps/sim/tools/confluence/create_comment.ts @@ -31,6 +31,8 @@ export const confluenceCreateCommentTool: ToolConfig< provider: 'confluence', }, + errorExtractor: 'atlassian-errors', + params: { accessToken: { type: 'string', diff --git a/apps/sim/tools/confluence/create_page.ts b/apps/sim/tools/confluence/create_page.ts index 7a4fec8a846..f4f70bc4afb 100644 --- a/apps/sim/tools/confluence/create_page.ts +++ b/apps/sim/tools/confluence/create_page.ts @@ -40,6 +40,8 @@ export const confluenceCreatePageTool: ToolConfig< provider: 'confluence', }, + errorExtractor: 'atlassian-errors', + params: { accessToken: { type: 'string', diff --git a/apps/sim/tools/confluence/create_page_property.ts b/apps/sim/tools/confluence/create_page_property.ts index 36ebfb04a06..99fbe246fdc 100644 --- a/apps/sim/tools/confluence/create_page_property.ts +++ b/apps/sim/tools/confluence/create_page_property.ts @@ -38,6 +38,8 @@ export const confluenceCreatePagePropertyTool: ToolConfig< provider: 'confluence', }, + errorExtractor: 'atlassian-errors', + params: { accessToken: { type: 'string', diff --git a/apps/sim/tools/confluence/create_space.ts b/apps/sim/tools/confluence/create_space.ts index f2d8b8a734a..4981c4adc25 100644 --- a/apps/sim/tools/confluence/create_space.ts +++ b/apps/sim/tools/confluence/create_space.ts @@ -39,6 +39,8 @@ export const confluenceCreateSpaceTool: ToolConfig< provider: 'confluence', }, + errorExtractor: 'atlassian-errors', + params: { accessToken: { type: 'string', diff --git a/apps/sim/tools/confluence/create_space_property.ts b/apps/sim/tools/confluence/create_space_property.ts index c702f63539a..e6fee973b82 100644 --- a/apps/sim/tools/confluence/create_space_property.ts +++ b/apps/sim/tools/confluence/create_space_property.ts @@ -35,6 +35,8 @@ export const confluenceCreateSpacePropertyTool: ToolConfig< provider: 'confluence', }, + errorExtractor: 'atlassian-errors', + params: { accessToken: { type: 'string', diff --git a/apps/sim/tools/confluence/delete_attachment.ts b/apps/sim/tools/confluence/delete_attachment.ts index 37d2d093d80..38159ee4d6a 100644 --- a/apps/sim/tools/confluence/delete_attachment.ts +++ b/apps/sim/tools/confluence/delete_attachment.ts @@ -30,6 +30,8 @@ export const confluenceDeleteAttachmentTool: ToolConfig< provider: 'confluence', }, + errorExtractor: 'atlassian-errors', + params: { accessToken: { type: 'string', diff --git a/apps/sim/tools/confluence/delete_blogpost.ts b/apps/sim/tools/confluence/delete_blogpost.ts index c53562cf283..6d03a3f60e1 100644 --- a/apps/sim/tools/confluence/delete_blogpost.ts +++ b/apps/sim/tools/confluence/delete_blogpost.ts @@ -31,6 +31,8 @@ export const confluenceDeleteBlogPostTool: ToolConfig< provider: 'confluence', }, + errorExtractor: 'atlassian-errors', + params: { accessToken: { type: 'string', diff --git a/apps/sim/tools/confluence/delete_comment.ts b/apps/sim/tools/confluence/delete_comment.ts index 6564181dfe0..7cfb1694987 100644 --- a/apps/sim/tools/confluence/delete_comment.ts +++ b/apps/sim/tools/confluence/delete_comment.ts @@ -30,6 +30,8 @@ export const confluenceDeleteCommentTool: ToolConfig< provider: 'confluence', }, + errorExtractor: 'atlassian-errors', + params: { accessToken: { type: 'string', diff --git a/apps/sim/tools/confluence/delete_label.ts b/apps/sim/tools/confluence/delete_label.ts index 2f92766fc67..182dd066340 100644 --- a/apps/sim/tools/confluence/delete_label.ts +++ b/apps/sim/tools/confluence/delete_label.ts @@ -33,6 +33,8 @@ export const confluenceDeleteLabelTool: ToolConfig< provider: 'confluence', }, + errorExtractor: 'atlassian-errors', + params: { accessToken: { type: 'string', diff --git a/apps/sim/tools/confluence/delete_page.ts b/apps/sim/tools/confluence/delete_page.ts index a648a2b37c5..bc7be2b8932 100644 --- a/apps/sim/tools/confluence/delete_page.ts +++ b/apps/sim/tools/confluence/delete_page.ts @@ -32,6 +32,8 @@ export const confluenceDeletePageTool: ToolConfig< provider: 'confluence', }, + errorExtractor: 'atlassian-errors', + params: { accessToken: { type: 'string', diff --git a/apps/sim/tools/confluence/delete_page_property.ts b/apps/sim/tools/confluence/delete_page_property.ts index d7b6c5fbb49..0bd4d04911b 100644 --- a/apps/sim/tools/confluence/delete_page_property.ts +++ b/apps/sim/tools/confluence/delete_page_property.ts @@ -33,6 +33,8 @@ export const confluenceDeletePagePropertyTool: ToolConfig< provider: 'confluence', }, + errorExtractor: 'atlassian-errors', + params: { accessToken: { type: 'string', diff --git a/apps/sim/tools/confluence/delete_space.ts b/apps/sim/tools/confluence/delete_space.ts index 82442c66ad5..c9fa5cb315e 100644 --- a/apps/sim/tools/confluence/delete_space.ts +++ b/apps/sim/tools/confluence/delete_space.ts @@ -31,6 +31,8 @@ export const confluenceDeleteSpaceTool: ToolConfig< provider: 'confluence', }, + errorExtractor: 'atlassian-errors', + params: { accessToken: { type: 'string', diff --git a/apps/sim/tools/confluence/delete_space_property.ts b/apps/sim/tools/confluence/delete_space_property.ts index 9c69431aac4..0f2a29dfdd4 100644 --- a/apps/sim/tools/confluence/delete_space_property.ts +++ b/apps/sim/tools/confluence/delete_space_property.ts @@ -33,6 +33,8 @@ export const confluenceDeleteSpacePropertyTool: ToolConfig< provider: 'confluence', }, + errorExtractor: 'atlassian-errors', + params: { accessToken: { type: 'string', diff --git a/apps/sim/tools/confluence/get_blogpost.ts b/apps/sim/tools/confluence/get_blogpost.ts index 94c9b02de7c..c61d4894117 100644 --- a/apps/sim/tools/confluence/get_blogpost.ts +++ b/apps/sim/tools/confluence/get_blogpost.ts @@ -49,6 +49,8 @@ export const confluenceGetBlogPostTool: ToolConfig< provider: 'confluence', }, + errorExtractor: 'atlassian-errors', + params: { accessToken: { type: 'string', diff --git a/apps/sim/tools/confluence/get_page_ancestors.ts b/apps/sim/tools/confluence/get_page_ancestors.ts index 20b7be3ca2c..2e3ea9714e2 100644 --- a/apps/sim/tools/confluence/get_page_ancestors.ts +++ b/apps/sim/tools/confluence/get_page_ancestors.ts @@ -39,6 +39,8 @@ export const confluenceGetPageAncestorsTool: ToolConfig< provider: 'confluence', }, + errorExtractor: 'atlassian-errors', + params: { accessToken: { type: 'string', diff --git a/apps/sim/tools/confluence/get_page_children.ts b/apps/sim/tools/confluence/get_page_children.ts index 7ca7ca10eda..a7691245ea6 100644 --- a/apps/sim/tools/confluence/get_page_children.ts +++ b/apps/sim/tools/confluence/get_page_children.ts @@ -42,6 +42,8 @@ export const confluenceGetPageChildrenTool: ToolConfig< provider: 'confluence', }, + errorExtractor: 'atlassian-errors', + params: { accessToken: { type: 'string', diff --git a/apps/sim/tools/confluence/get_page_descendants.ts b/apps/sim/tools/confluence/get_page_descendants.ts index a9e0bc5a323..9fdb8213331 100644 --- a/apps/sim/tools/confluence/get_page_descendants.ts +++ b/apps/sim/tools/confluence/get_page_descendants.ts @@ -43,6 +43,8 @@ export const confluenceGetPageDescendantsTool: ToolConfig< provider: 'confluence', }, + errorExtractor: 'atlassian-errors', + params: { accessToken: { type: 'string', diff --git a/apps/sim/tools/confluence/get_page_version.ts b/apps/sim/tools/confluence/get_page_version.ts index dc496b38a24..a67b709295c 100644 --- a/apps/sim/tools/confluence/get_page_version.ts +++ b/apps/sim/tools/confluence/get_page_version.ts @@ -54,6 +54,8 @@ export const confluenceGetPageVersionTool: ToolConfig< provider: 'confluence', }, + errorExtractor: 'atlassian-errors', + params: { accessToken: { type: 'string', diff --git a/apps/sim/tools/confluence/get_pages_by_label.ts b/apps/sim/tools/confluence/get_pages_by_label.ts index af67210a0b0..0220341ed16 100644 --- a/apps/sim/tools/confluence/get_pages_by_label.ts +++ b/apps/sim/tools/confluence/get_pages_by_label.ts @@ -47,6 +47,8 @@ export const confluenceGetPagesByLabelTool: ToolConfig< provider: 'confluence', }, + errorExtractor: 'atlassian-errors', + params: { accessToken: { type: 'string', diff --git a/apps/sim/tools/confluence/get_space.ts b/apps/sim/tools/confluence/get_space.ts index fbadd7a6575..178ec6e21f1 100644 --- a/apps/sim/tools/confluence/get_space.ts +++ b/apps/sim/tools/confluence/get_space.ts @@ -42,6 +42,8 @@ export const confluenceGetSpaceTool: ToolConfig< provider: 'confluence', }, + errorExtractor: 'atlassian-errors', + params: { accessToken: { type: 'string', diff --git a/apps/sim/tools/confluence/get_task.ts b/apps/sim/tools/confluence/get_task.ts index cf0b6177654..21c2c5c4284 100644 --- a/apps/sim/tools/confluence/get_task.ts +++ b/apps/sim/tools/confluence/get_task.ts @@ -41,6 +41,8 @@ export const confluenceGetTaskTool: ToolConfig errorInfo?.data?.errorMessage, + extract: (errorInfo) => { + if (errorInfo?.data?.errorMessage) { + return errorInfo.data.errorMessage + } + if (Array.isArray(errorInfo?.data?.errorMessages) && errorInfo.data.errorMessages.length > 0) { + return errorInfo.data.errorMessages.join(', ') + } + if (errorInfo?.data?.message) { + return errorInfo.data.message + } + return undefined + }, }, { id: 'graphql-errors', diff --git a/apps/sim/tools/jira/add_attachment.ts b/apps/sim/tools/jira/add_attachment.ts index bd890e509ed..b9eeba374c1 100644 --- a/apps/sim/tools/jira/add_attachment.ts +++ b/apps/sim/tools/jira/add_attachment.ts @@ -14,6 +14,8 @@ export const jiraAddAttachmentTool: ToolConfig = provider: 'jira', }, + errorExtractor: 'atlassian-errors', + params: { accessToken: { type: 'string', diff --git a/apps/sim/tools/jira/update_comment.ts b/apps/sim/tools/jira/update_comment.ts index 526e724fb4c..e49fa248332 100644 --- a/apps/sim/tools/jira/update_comment.ts +++ b/apps/sim/tools/jira/update_comment.ts @@ -31,6 +31,8 @@ export const jiraUpdateCommentTool: ToolConfig = { provider: 'jira', }, + errorExtractor: 'atlassian-errors', + params: { accessToken: { type: 'string', diff --git a/apps/sim/tools/jsm/add_comment.ts b/apps/sim/tools/jsm/add_comment.ts index e23069a138a..a06caaf36ca 100644 --- a/apps/sim/tools/jsm/add_comment.ts +++ b/apps/sim/tools/jsm/add_comment.ts @@ -13,6 +13,8 @@ export const jsmAddCommentTool: ToolConfig = { provider: 'jira', }, + errorExtractor: 'atlassian-errors', + params: { accessToken: { type: 'string', diff --git a/apps/sim/tools/jsm/get_transitions.ts b/apps/sim/tools/jsm/get_transitions.ts index d864cf747d6..d439c174cea 100644 --- a/apps/sim/tools/jsm/get_transitions.ts +++ b/apps/sim/tools/jsm/get_transitions.ts @@ -14,6 +14,8 @@ export const jsmGetTransitionsTool: ToolConfig Date: Thu, 9 Apr 2026 15:11:33 -0700 Subject: [PATCH 2/3] chore(tools): lint formatting fix for error extractor --- apps/sim/tools/error-extractors.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/sim/tools/error-extractors.ts b/apps/sim/tools/error-extractors.ts index 94656199356..0eb8ed42568 100644 --- a/apps/sim/tools/error-extractors.ts +++ b/apps/sim/tools/error-extractors.ts @@ -47,7 +47,10 @@ const ERROR_EXTRACTORS: ErrorExtractorConfig[] = [ if (errorInfo?.data?.errorMessage) { return errorInfo.data.errorMessage } - if (Array.isArray(errorInfo?.data?.errorMessages) && errorInfo.data.errorMessages.length > 0) { + if ( + Array.isArray(errorInfo?.data?.errorMessages) && + errorInfo.data.errorMessages.length > 0 + ) { return errorInfo.data.errorMessages.join(', ') } if (errorInfo?.data?.message) { From 83ea42f8368df04ebd674e6a56df93fe05d76b4c Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Thu, 9 Apr 2026 15:15:04 -0700 Subject: [PATCH 3/3] fix(tools): handle all Atlassian error formats in error extractor Add RFC 7807 errors[].title format (Confluence v2, Forms/ProForma API) and Jira field-level errors object to the atlassian-errors extractor. --- apps/sim/tools/error-extractors.ts | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/apps/sim/tools/error-extractors.ts b/apps/sim/tools/error-extractors.ts index 0eb8ed42568..1bae33b442b 100644 --- a/apps/sim/tools/error-extractors.ts +++ b/apps/sim/tools/error-extractors.ts @@ -41,18 +41,36 @@ export interface ErrorExtractorConfig { const ERROR_EXTRACTORS: ErrorExtractorConfig[] = [ { id: 'atlassian-errors', - description: 'Atlassian REST API error formats (errorMessage, errorMessages array, message)', - examples: ['Jira', 'Jira Service Management', 'Confluence'], + description: + 'Atlassian REST API error formats (errorMessage, errorMessages, errors[].title, message)', + examples: ['Jira', 'Jira Service Management', 'Confluence', 'JSM Forms/ProForma'], extract: (errorInfo) => { + // JSM Service Desk: singular errorMessage string if (errorInfo?.data?.errorMessage) { return errorInfo.data.errorMessage } + // Jira Platform: errorMessages array if ( Array.isArray(errorInfo?.data?.errorMessages) && errorInfo.data.errorMessages.length > 0 ) { return errorInfo.data.errorMessages.join(', ') } + // Confluence v2 / Forms API: RFC 7807 errors array with title/detail + if (Array.isArray(errorInfo?.data?.errors) && errorInfo.data.errors.length > 0) { + const err = errorInfo.data.errors[0] + if (err?.title) { + return err.detail ? `${err.title}: ${err.detail}` : err.title + } + } + // Jira Platform field-level errors object + if (errorInfo?.data?.errors && !Array.isArray(errorInfo.data.errors)) { + const fieldErrors = Object.entries(errorInfo.data.errors) + .map(([field, msg]) => `${field}: ${msg}`) + .join(', ') + if (fieldErrors) return fieldErrors + } + // Generic message fallback (auth/gateway errors) if (errorInfo?.data?.message) { return errorInfo.data.message }