From 12deb0f5b4144797c0092e63544fbb23b4d8c6a1 Mon Sep 17 00:00:00 2001 From: Waleed Date: Thu, 9 Apr 2026 14:33:11 -0700 Subject: [PATCH 1/4] chore(ci): bump actions/checkout to v6 and dorny/paths-filter to v4 (#4082) * chore(ci): bump actions/checkout to v6 and dorny/paths-filter to v4 * fix(ci): mock secureFetchWithPinnedIP in tools tests to prevent timeouts * lint --- .github/workflows/ci.yml | 10 +++++----- .github/workflows/docs-embeddings.yml | 2 +- .github/workflows/i18n.yml | 4 ++-- .github/workflows/images.yml | 4 ++-- .github/workflows/migrations.yml | 2 +- .github/workflows/publish-cli.yml | 2 +- .github/workflows/publish-python-sdk.yml | 2 +- .github/workflows/publish-ts-sdk.yml | 2 +- .github/workflows/test-build.yml | 2 +- apps/sim/tools/index.test.ts | 17 +++++++++++++++++ 10 files changed, 32 insertions(+), 15 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3b67ff38f5..14837501f9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -70,7 +70,7 @@ jobs: ecr_repo_secret: ECR_REALTIME steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v4 @@ -169,7 +169,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Login to GHCR uses: docker/login-action@v3 @@ -264,10 +264,10 @@ jobs: outputs: docs_changed: ${{ steps.filter.outputs.docs }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 2 # Need at least 2 commits to detect changes - - uses: dorny/paths-filter@v3 + - uses: dorny/paths-filter@v4 id: filter with: filters: | @@ -294,7 +294,7 @@ jobs: contents: write steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: fetch-depth: 0 diff --git a/.github/workflows/docs-embeddings.yml b/.github/workflows/docs-embeddings.yml index 3a3d89c071..3e4de08e19 100644 --- a/.github/workflows/docs-embeddings.yml +++ b/.github/workflows/docs-embeddings.yml @@ -15,7 +15,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup Bun uses: oven-sh/setup-bun@v2 diff --git a/.github/workflows/i18n.yml b/.github/workflows/i18n.yml index de8c59c9da..2eab817d00 100644 --- a/.github/workflows/i18n.yml +++ b/.github/workflows/i18n.yml @@ -14,7 +14,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: ref: staging token: ${{ secrets.GH_PAT }} @@ -115,7 +115,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: ref: staging diff --git a/.github/workflows/images.yml b/.github/workflows/images.yml index 8028c43363..853ebc6881 100644 --- a/.github/workflows/images.yml +++ b/.github/workflows/images.yml @@ -31,7 +31,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v4 @@ -117,7 +117,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Login to GHCR uses: docker/login-action@v3 diff --git a/.github/workflows/migrations.yml b/.github/workflows/migrations.yml index 8a3f543c17..db08492686 100644 --- a/.github/workflows/migrations.yml +++ b/.github/workflows/migrations.yml @@ -14,7 +14,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup Bun uses: oven-sh/setup-bun@v2 diff --git a/.github/workflows/publish-cli.yml b/.github/workflows/publish-cli.yml index 0a9bea3140..ceb124c823 100644 --- a/.github/workflows/publish-cli.yml +++ b/.github/workflows/publish-cli.yml @@ -14,7 +14,7 @@ jobs: runs-on: blacksmith-4vcpu-ubuntu-2404 steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup Bun uses: oven-sh/setup-bun@v2 diff --git a/.github/workflows/publish-python-sdk.yml b/.github/workflows/publish-python-sdk.yml index a44d5a3422..85d110b53d 100644 --- a/.github/workflows/publish-python-sdk.yml +++ b/.github/workflows/publish-python-sdk.yml @@ -14,7 +14,7 @@ jobs: runs-on: blacksmith-4vcpu-ubuntu-2404 steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup Python uses: actions/setup-python@v5 diff --git a/.github/workflows/publish-ts-sdk.yml b/.github/workflows/publish-ts-sdk.yml index e826d4395f..1032ce7442 100644 --- a/.github/workflows/publish-ts-sdk.yml +++ b/.github/workflows/publish-ts-sdk.yml @@ -14,7 +14,7 @@ jobs: runs-on: blacksmith-4vcpu-ubuntu-2404 steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup Bun uses: oven-sh/setup-bun@v2 diff --git a/.github/workflows/test-build.yml b/.github/workflows/test-build.yml index b8fab8a77c..eb55aced79 100644 --- a/.github/workflows/test-build.yml +++ b/.github/workflows/test-build.yml @@ -14,7 +14,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup Bun uses: oven-sh/setup-bun@v2 diff --git a/apps/sim/tools/index.test.ts b/apps/sim/tools/index.test.ts index e3ecf97fae..3fa4073ac3 100644 --- a/apps/sim/tools/index.test.ts +++ b/apps/sim/tools/index.test.ts @@ -26,6 +26,8 @@ const { mockListCustomTools, mockGetCustomToolByIdOrTitle, mockGenerateInternalToken, + mockSecureFetchWithPinnedIP, + mockValidateUrlWithDNS, } = vi.hoisted(() => ({ mockIsHosted: { value: false }, mockEnv: { NEXT_PUBLIC_APP_URL: 'http://localhost:3000' } as Record, @@ -40,6 +42,8 @@ const { mockListCustomTools: vi.fn(), mockGetCustomToolByIdOrTitle: vi.fn(), mockGenerateInternalToken: vi.fn(), + mockSecureFetchWithPinnedIP: vi.fn(), + mockValidateUrlWithDNS: vi.fn(), })) // Mock feature flags @@ -73,6 +77,11 @@ vi.mock('@/lib/auth/internal', () => ({ vi.mock('@/lib/billing/core/usage-log', () => ({})) +vi.mock('@/lib/core/security/input-validation.server', () => ({ + secureFetchWithPinnedIP: (...args: unknown[]) => mockSecureFetchWithPinnedIP(...args), + validateUrlWithDNS: (...args: unknown[]) => mockValidateUrlWithDNS(...args), +})) + vi.mock('@/lib/core/rate-limiter/hosted-key', () => ({ getHostedKeyRateLimiter: () => mockRateLimiterFns, })) @@ -476,6 +485,14 @@ describe('Automatic Internal Route Detection', () => { beforeEach(() => { process.env.NEXT_PUBLIC_APP_URL = 'http://localhost:3000' cleanupEnvVars = setupEnvVars({ NEXT_PUBLIC_APP_URL: 'http://localhost:3000' }) + + mockValidateUrlWithDNS.mockResolvedValue({ isValid: true, resolvedIP: '93.184.216.34' }) + mockSecureFetchWithPinnedIP.mockResolvedValue( + new Response(JSON.stringify({}), { + status: 200, + headers: { 'content-type': 'application/json' }, + }) + ) }) afterEach(() => { From 32bdf3cfa5119241c74e5fb04083ba4b2ee31218 Mon Sep 17 00:00:00 2001 From: Waleed Date: Thu, 9 Apr 2026 14:46:57 -0700 Subject: [PATCH 2/4] fix(trigger): use @react-email/render v2 to fix renderToPipeableStream error (#4084) --- apps/sim/components/emails/render.ts | 2 +- apps/sim/lib/billing/webhooks/invoices.ts | 2 +- apps/sim/trigger.config.ts | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/apps/sim/components/emails/render.ts b/apps/sim/components/emails/render.ts index 761b89f378..e495232ef5 100644 --- a/apps/sim/components/emails/render.ts +++ b/apps/sim/components/emails/render.ts @@ -1,4 +1,4 @@ -import { render } from '@react-email/components' +import { render } from '@react-email/render' import { OnboardingFollowupEmail, OTPVerificationEmail, diff --git a/apps/sim/lib/billing/webhooks/invoices.ts b/apps/sim/lib/billing/webhooks/invoices.ts index b0558292ec..635aa8314a 100644 --- a/apps/sim/lib/billing/webhooks/invoices.ts +++ b/apps/sim/lib/billing/webhooks/invoices.ts @@ -1,4 +1,4 @@ -import { render } from '@react-email/components' +import { render } from '@react-email/render' import { db } from '@sim/db' import { member, diff --git a/apps/sim/trigger.config.ts b/apps/sim/trigger.config.ts index 40d3f825c7..2f12cf3ab5 100644 --- a/apps/sim/trigger.config.ts +++ b/apps/sim/trigger.config.ts @@ -27,7 +27,6 @@ export default defineConfig({ 'isolated-vm', 'pptxgenjs', 'react-dom', - '@react-email/components', '@react-email/render', ], }), From 05b5588a7b7a89a8b69efae9fa58aeafdc126ca3 Mon Sep 17 00:00:00 2001 From: Waleed Date: Thu, 9 Apr 2026 15:18:19 -0700 Subject: [PATCH 3/4] improvement(ci): parallelize Docker builds and fix test timeouts (#4083) * improvement(ci): parallelize Docker builds with tests and remove duplicate turbo install * fix(test): use SecureFetchResponse shape in mock instead of standard Response --- .github/workflows/ci.yml | 4 ++-- apps/sim/tools/index.test.ts | 17 +++++++++++------ docker/app.Dockerfile | 3 +-- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 14837501f9..7413dc3327 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -48,7 +48,7 @@ jobs: # Build AMD64 images and push to ECR immediately (+ GHCR for main) build-amd64: name: Build AMD64 - needs: [test-build, detect-version] + needs: [detect-version] if: github.event_name == 'push' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/staging' || github.ref == 'refs/heads/dev') runs-on: blacksmith-8vcpu-ubuntu-2404 permissions: @@ -150,7 +150,7 @@ jobs: # Build ARM64 images for GHCR (main branch only, runs in parallel) build-ghcr-arm64: name: Build ARM64 (GHCR Only) - needs: [test-build, detect-version] + needs: [detect-version] runs-on: blacksmith-8vcpu-ubuntu-2404-arm if: github.event_name == 'push' && github.ref == 'refs/heads/main' permissions: diff --git a/apps/sim/tools/index.test.ts b/apps/sim/tools/index.test.ts index 3fa4073ac3..cef7cc82a1 100644 --- a/apps/sim/tools/index.test.ts +++ b/apps/sim/tools/index.test.ts @@ -487,12 +487,17 @@ describe('Automatic Internal Route Detection', () => { cleanupEnvVars = setupEnvVars({ NEXT_PUBLIC_APP_URL: 'http://localhost:3000' }) mockValidateUrlWithDNS.mockResolvedValue({ isValid: true, resolvedIP: '93.184.216.34' }) - mockSecureFetchWithPinnedIP.mockResolvedValue( - new Response(JSON.stringify({}), { - status: 200, - headers: { 'content-type': 'application/json' }, - }) - ) + mockSecureFetchWithPinnedIP.mockResolvedValue({ + ok: true, + status: 200, + statusText: 'OK', + headers: { + get: (name: string) => (name.toLowerCase() === 'content-type' ? 'application/json' : null), + toRecord: () => ({ 'content-type': 'application/json' }), + }, + text: async () => JSON.stringify({}), + json: async () => ({}), + }) }) afterEach(() => { diff --git a/docker/app.Dockerfile b/docker/app.Dockerfile index 54791300d5..07641931f0 100644 --- a/docker/app.Dockerfile +++ b/docker/app.Dockerfile @@ -25,11 +25,10 @@ COPY packages/testing/package.json ./packages/testing/package.json COPY packages/logger/package.json ./packages/logger/package.json COPY packages/tsconfig/package.json ./packages/tsconfig/package.json -# Install turbo globally, then dependencies, then rebuild isolated-vm for Node.js +# Install dependencies, then rebuild isolated-vm for Node.js # Use --linker=hoisted for flat node_modules layout (required for Docker multi-stage builds) RUN --mount=type=cache,id=bun-cache,target=/root/.bun/install/cache \ --mount=type=cache,id=npm-cache,target=/root/.npm \ - bun install -g turbo && \ HUSKY=0 bun install --omit=dev --ignore-scripts --linker=hoisted && \ cd node_modules/isolated-vm && npx node-gyp rebuild --release From bce638dd753b0ae566f39b501694021b858daf79 Mon Sep 17 00:00:00 2001 From: Waleed Date: Thu, 9 Apr 2026 15:18:34 -0700 Subject: [PATCH 4/4] 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