mirror of
https://github.com/simstudioai/sim.git
synced 2026-04-28 03:00:29 -04:00
v0.6.34: trigger.dev fixes, CI speedup, atlassian error extractor
This commit is contained in:
14
.github/workflows/ci.yml
vendored
14
.github/workflows/ci.yml
vendored
@@ -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:
|
||||
@@ -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
|
||||
@@ -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:
|
||||
@@ -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
|
||||
|
||||
|
||||
2
.github/workflows/docs-embeddings.yml
vendored
2
.github/workflows/docs-embeddings.yml
vendored
@@ -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
|
||||
|
||||
4
.github/workflows/i18n.yml
vendored
4
.github/workflows/i18n.yml
vendored
@@ -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
|
||||
|
||||
|
||||
4
.github/workflows/images.yml
vendored
4
.github/workflows/images.yml
vendored
@@ -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
|
||||
|
||||
2
.github/workflows/migrations.yml
vendored
2
.github/workflows/migrations.yml
vendored
@@ -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
|
||||
|
||||
2
.github/workflows/publish-cli.yml
vendored
2
.github/workflows/publish-cli.yml
vendored
@@ -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
|
||||
|
||||
2
.github/workflows/publish-python-sdk.yml
vendored
2
.github/workflows/publish-python-sdk.yml
vendored
@@ -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
|
||||
|
||||
2
.github/workflows/publish-ts-sdk.yml
vendored
2
.github/workflows/publish-ts-sdk.yml
vendored
@@ -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
|
||||
|
||||
2
.github/workflows/test-build.yml
vendored
2
.github/workflows/test-build.yml
vendored
@@ -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
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { render } from '@react-email/components'
|
||||
import { render } from '@react-email/render'
|
||||
import {
|
||||
OnboardingFollowupEmail,
|
||||
OTPVerificationEmail,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { render } from '@react-email/components'
|
||||
import { render } from '@react-email/render'
|
||||
import { db } from '@sim/db'
|
||||
import {
|
||||
member,
|
||||
|
||||
@@ -34,6 +34,8 @@ export const confluenceAddLabelTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -44,6 +44,8 @@ export const confluenceCreateBlogPostTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -31,6 +31,8 @@ export const confluenceCreateCommentTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -40,6 +40,8 @@ export const confluenceCreatePageTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -38,6 +38,8 @@ export const confluenceCreatePagePropertyTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -39,6 +39,8 @@ export const confluenceCreateSpaceTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -35,6 +35,8 @@ export const confluenceCreateSpacePropertyTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -30,6 +30,8 @@ export const confluenceDeleteAttachmentTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -31,6 +31,8 @@ export const confluenceDeleteBlogPostTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -30,6 +30,8 @@ export const confluenceDeleteCommentTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -33,6 +33,8 @@ export const confluenceDeleteLabelTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -32,6 +32,8 @@ export const confluenceDeletePageTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -33,6 +33,8 @@ export const confluenceDeletePagePropertyTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -31,6 +31,8 @@ export const confluenceDeleteSpaceTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -33,6 +33,8 @@ export const confluenceDeleteSpacePropertyTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -49,6 +49,8 @@ export const confluenceGetBlogPostTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -39,6 +39,8 @@ export const confluenceGetPageAncestorsTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -42,6 +42,8 @@ export const confluenceGetPageChildrenTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -43,6 +43,8 @@ export const confluenceGetPageDescendantsTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -54,6 +54,8 @@ export const confluenceGetPageVersionTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -47,6 +47,8 @@ export const confluenceGetPagesByLabelTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -42,6 +42,8 @@ export const confluenceGetSpaceTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -41,6 +41,8 @@ export const confluenceGetTaskTool: ToolConfig<ConfluenceGetTaskParams, Confluen
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -33,6 +33,8 @@ export const confluenceGetUserTool: ToolConfig<ConfluenceGetUserParams, Confluen
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -39,6 +39,8 @@ export const confluenceListAttachmentsTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -47,6 +47,8 @@ export const confluenceListBlogPostsTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -55,6 +55,8 @@ export const confluenceListBlogPostsInSpaceTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -39,6 +39,8 @@ export const confluenceListCommentsTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -37,6 +37,8 @@ export const confluenceListLabelsTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -43,6 +43,8 @@ export const confluenceListPagePropertiesTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -40,6 +40,8 @@ export const confluenceListPageVersionsTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -57,6 +57,8 @@ export const confluenceListPagesInSpaceTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -38,6 +38,8 @@ export const confluenceListSpaceLabelsTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -42,6 +42,8 @@ export const confluenceListSpacePermissionsTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -38,6 +38,8 @@ export const confluenceListSpacePropertiesTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -38,6 +38,8 @@ export const confluenceListSpacesTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -52,6 +52,8 @@ export const confluenceListTasksTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -21,6 +21,8 @@ export const confluenceRetrieveTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -34,6 +34,8 @@ export const confluenceSearchTool: ToolConfig<ConfluenceSearchParams, Confluence
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -44,6 +44,8 @@ export const confluenceSearchInSpaceTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -13,6 +13,8 @@ export const confluenceUpdateTool: ToolConfig<ConfluenceUpdateParams, Confluence
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -37,6 +37,8 @@ export const confluenceUpdateBlogPostTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -31,6 +31,8 @@ export const confluenceUpdateCommentTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -38,6 +38,8 @@ export const confluenceUpdateSpaceTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -44,6 +44,8 @@ export const confluenceUpdateTaskTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -37,6 +37,8 @@ export const confluenceUploadAttachmentTool: ToolConfig<
|
||||
provider: 'confluence',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -41,9 +41,41 @@ export interface ErrorExtractorConfig {
|
||||
const ERROR_EXTRACTORS: ErrorExtractorConfig[] = [
|
||||
{
|
||||
id: 'atlassian-errors',
|
||||
description: 'Atlassian REST API errorMessage field',
|
||||
examples: ['Jira', 'Jira Service Management', 'Confluence'],
|
||||
extract: (errorInfo) => 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',
|
||||
|
||||
@@ -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<string, string | undefined>,
|
||||
@@ -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,19 @@ 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({
|
||||
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(() => {
|
||||
|
||||
@@ -14,6 +14,8 @@ export const jiraAddAttachmentTool: ToolConfig<JiraAddAttachmentParams, JiraAddA
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -30,6 +30,8 @@ export const jiraAddCommentTool: ToolConfig<JiraAddCommentParams, JiraAddComment
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -14,6 +14,8 @@ export const jiraAddWatcherTool: ToolConfig<JiraAddWatcherParams, JiraAddWatcher
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -57,6 +57,8 @@ export const jiraAddWorklogTool: ToolConfig<JiraAddWorklogParams, JiraAddWorklog
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -14,6 +14,8 @@ export const jiraAssignIssueTool: ToolConfig<JiraAssignIssueParams, JiraAssignIs
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -14,6 +14,8 @@ export const jiraBulkRetrieveTool: ToolConfig<JiraRetrieveBulkParams, JiraRetrie
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -17,6 +17,8 @@ export const jiraCreateIssueLinkTool: ToolConfig<
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -17,6 +17,8 @@ export const jiraDeleteAttachmentTool: ToolConfig<
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -15,6 +15,8 @@ export const jiraDeleteCommentTool: ToolConfig<JiraDeleteCommentParams, JiraDele
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -14,6 +14,8 @@ export const jiraDeleteIssueTool: ToolConfig<JiraDeleteIssueParams, JiraDeleteIs
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -17,6 +17,8 @@ export const jiraDeleteIssueLinkTool: ToolConfig<
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -15,6 +15,8 @@ export const jiraDeleteWorklogTool: ToolConfig<JiraDeleteWorklogParams, JiraDele
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -35,6 +35,8 @@ export const jiraGetAttachmentsTool: ToolConfig<
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -32,6 +32,8 @@ export const jiraGetCommentsTool: ToolConfig<JiraGetCommentsParams, JiraGetComme
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -32,6 +32,8 @@ export const jiraGetUsersTool: ToolConfig<JiraGetUsersParams, JiraGetUsersRespon
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -32,6 +32,8 @@ export const jiraGetWorklogsTool: ToolConfig<JiraGetWorklogsParams, JiraGetWorkl
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -15,6 +15,8 @@ export const jiraRemoveWatcherTool: ToolConfig<JiraRemoveWatcherParams, JiraRemo
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -195,6 +195,8 @@ export const jiraRetrieveTool: ToolConfig<JiraRetrieveParams, JiraRetrieveRespon
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -81,6 +81,8 @@ export const jiraSearchIssuesTool: ToolConfig<JiraSearchIssuesParams, JiraSearch
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -15,6 +15,8 @@ export const jiraSearchUsersTool: ToolConfig<JiraSearchUsersParams, JiraSearchUs
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -17,6 +17,8 @@ export const jiraTransitionIssueTool: ToolConfig<
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -13,6 +13,8 @@ export const jiraUpdateTool: ToolConfig<JiraUpdateParams, JiraUpdateResponse> =
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -31,6 +31,8 @@ export const jiraUpdateCommentTool: ToolConfig<JiraUpdateCommentParams, JiraUpda
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -58,6 +58,8 @@ export const jiraUpdateWorklogTool: ToolConfig<JiraUpdateWorklogParams, JiraUpda
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -13,6 +13,8 @@ export const jiraWriteTool: ToolConfig<JiraWriteParams, JiraWriteResponse> = {
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -13,6 +13,8 @@ export const jsmAddCommentTool: ToolConfig<JsmAddCommentParams, JsmAddCommentRes
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -12,6 +12,8 @@ export const jsmAddCustomerTool: ToolConfig<JsmAddCustomerParams, JsmAddCustomer
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -15,6 +15,8 @@ export const jsmAddOrganizationTool: ToolConfig<
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -16,6 +16,8 @@ export const jsmAddParticipantsTool: ToolConfig<
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -13,6 +13,8 @@ export const jsmAnswerApprovalTool: ToolConfig<JsmAnswerApprovalParams, JsmAnswe
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -15,6 +15,8 @@ export const jsmCreateOrganizationTool: ToolConfig<
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -12,6 +12,8 @@ export const jsmCreateRequestTool: ToolConfig<JsmCreateRequestParams, JsmCreateR
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -13,6 +13,8 @@ export const jsmGetApprovalsTool: ToolConfig<JsmGetApprovalsParams, JsmGetApprov
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -13,6 +13,8 @@ export const jsmGetCommentsTool: ToolConfig<JsmGetCommentsParams, JsmGetComments
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -13,6 +13,8 @@ export const jsmGetCustomersTool: ToolConfig<JsmGetCustomersParams, JsmGetCustom
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -16,6 +16,8 @@ export const jsmGetFormStructureTool: ToolConfig<
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -17,6 +17,8 @@ export const jsmGetFormTemplatesTool: ToolConfig<
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -14,6 +14,8 @@ export const jsmGetIssueFormsTool: ToolConfig<JsmGetIssueFormsParams, JsmGetIssu
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -16,6 +16,8 @@ export const jsmGetOrganizationsTool: ToolConfig<
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -16,6 +16,8 @@ export const jsmGetParticipantsTool: ToolConfig<
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
@@ -13,6 +13,8 @@ export const jsmGetQueuesTool: ToolConfig<JsmGetQueuesParams, JsmGetQueuesRespon
|
||||
provider: 'jira',
|
||||
},
|
||||
|
||||
errorExtractor: 'atlassian-errors',
|
||||
|
||||
params: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user