From 050b4634cdb99bd32c6e5a68c69455e56632264c Mon Sep 17 00:00:00 2001 From: Waleed Date: Thu, 9 Apr 2026 15:18:34 -0700 Subject: [PATCH] fix(tools): add Atlassian error extractor to all Jira, JSM, and Confluence tools (#4085) * 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 * chore(tools): lint formatting fix for error extractor * 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. --------- 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 + .../tools/confluence/create_page_property.ts | 2 + apps/sim/tools/confluence/create_space.ts | 2 + .../tools/confluence/create_space_property.ts | 2 + .../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 + .../tools/confluence/delete_page_property.ts | 2 + apps/sim/tools/confluence/delete_space.ts | 2 + .../tools/confluence/delete_space_property.ts | 2 + apps/sim/tools/confluence/get_blogpost.ts | 2 + .../tools/confluence/get_page_ancestors.ts | 2 + .../sim/tools/confluence/get_page_children.ts | 2 + .../tools/confluence/get_page_descendants.ts | 2 + apps/sim/tools/confluence/get_page_version.ts | 2 + .../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 + .../confluence/list_blogposts_in_space.ts | 2 + apps/sim/tools/confluence/list_comments.ts | 2 + apps/sim/tools/confluence/list_labels.ts | 2 + .../tools/confluence/list_page_properties.ts | 2 + .../tools/confluence/list_page_versions.ts | 2 + .../tools/confluence/list_pages_in_space.ts | 2 + .../sim/tools/confluence/list_space_labels.ts | 2 + .../confluence/list_space_permissions.ts | 2 + .../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 + .../sim/tools/confluence/upload_attachment.ts | 2 + apps/sim/tools/error-extractors.ts | 38 +++++++++++++++++-- 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, 225 insertions(+), 3 deletions(-) diff --git a/apps/sim/tools/confluence/add_label.ts b/apps/sim/tools/confluence/add_label.ts index db931b3cf0..2ba111f529 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 b39e91b7f1..e67e0f0732 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 aa18a5c4a0..b09c6ddb54 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 7a4fec8a84..f4f70bc4af 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 36ebfb04a0..99fbe246fd 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 f2d8b8a734..4981c4adc2 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 c702f63539..e6fee973b8 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 37d2d093d8..38159ee4d6 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 c53562cf28..6d03a3f60e 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 6564181dfe..7cfb169498 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 2f92766fc6..182dd06634 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 a648a2b37c..bc7be2b893 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 d7b6c5fbb4..0bd4d04911 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 82442c66ad..c9fa5cb315 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 9c69431aac..0f2a29dfdd 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 94c9b02de7..c61d489411 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 20b7be3ca2..2e3ea9714e 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 7ca7ca10ed..a7691245ea 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 a9e0bc5a32..9fdb821333 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 dc496b38a2..a67b709295 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 af67210a0b..0220341ed1 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 fbadd7a657..178ec6e21f 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 cf0b617765..21c2c5c428 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, + 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 + } + return undefined + }, }, { id: 'graphql-errors', diff --git a/apps/sim/tools/jira/add_attachment.ts b/apps/sim/tools/jira/add_attachment.ts index bd890e509e..b9eeba374c 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 526e724fb4..e49fa24833 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 e23069a138..a06caaf36c 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 d864cf747d..d439c174ce 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