Date: Thu, 18 Dec 2025 12:49:58 -0800
Subject: [PATCH 11/19] fix(notifs): inactivity polling filters, consolidate
trigger types, minor consistency issue with filter parsing (#2452)
* fix(notifs-slac): display name for account
* fix inactivity polling check
* consolidate trigger types
* remove redundant defaults
* fix
---
apps/sim/app/api/auth/accounts/route.ts | 12 ++-
.../app/api/workflows/[id]/execute/route.ts | 3 +-
.../notifications/[notificationId]/route.ts | 3 +-
.../workspaces/[id]/notifications/route.ts | 5 +-
.../slack-channel-selector.tsx | 2 +
.../notifications/notifications.tsx | 11 +--
apps/sim/hooks/use-slack-accounts.ts | 1 +
apps/sim/lib/logs/events.ts | 5 +-
apps/sim/lib/logs/types.ts | 5 +-
apps/sim/lib/notifications/alert-rules.ts | 74 +++++++-------
.../lib/notifications/inactivity-polling.ts | 98 ++++++++++++++++---
11 files changed, 159 insertions(+), 60 deletions(-)
diff --git a/apps/sim/app/api/auth/accounts/route.ts b/apps/sim/app/api/auth/accounts/route.ts
index 418a04c02..5739586c3 100644
--- a/apps/sim/app/api/auth/accounts/route.ts
+++ b/apps/sim/app/api/auth/accounts/route.ts
@@ -32,7 +32,17 @@ export async function GET(request: NextRequest) {
.from(account)
.where(and(...whereConditions))
- return NextResponse.json({ accounts })
+ // Use the user's email as the display name (consistent with credential selector)
+ const userEmail = session.user.email
+
+ const accountsWithDisplayName = accounts.map((acc) => ({
+ id: acc.id,
+ accountId: acc.accountId,
+ providerId: acc.providerId,
+ displayName: userEmail || acc.providerId,
+ }))
+
+ return NextResponse.json({ accounts: accountsWithDisplayName })
} catch (error) {
logger.error('Failed to fetch accounts', { error })
return NextResponse.json({ error: 'Internal server error' }, { status: 500 })
diff --git a/apps/sim/app/api/workflows/[id]/execute/route.ts b/apps/sim/app/api/workflows/[id]/execute/route.ts
index 2b9cd8bea..050088787 100644
--- a/apps/sim/app/api/workflows/[id]/execute/route.ts
+++ b/apps/sim/app/api/workflows/[id]/execute/route.ts
@@ -11,6 +11,7 @@ import { processInputFileFields } from '@/lib/execution/files'
import { preprocessExecution } from '@/lib/execution/preprocessing'
import { createLogger } from '@/lib/logs/console/logger'
import { LoggingSession } from '@/lib/logs/execution/logging-session'
+import { ALL_TRIGGER_TYPES } from '@/lib/logs/types'
import { executeWorkflowCore } from '@/lib/workflows/executor/execution-core'
import { type ExecutionEvent, encodeSSEEvent } from '@/lib/workflows/executor/execution-events'
import { PauseResumeManager } from '@/lib/workflows/executor/human-in-the-loop-manager'
@@ -30,7 +31,7 @@ const logger = createLogger('WorkflowExecuteAPI')
const ExecuteWorkflowSchema = z.object({
selectedOutputs: z.array(z.string()).optional().default([]),
- triggerType: z.enum(['api', 'webhook', 'schedule', 'manual', 'chat']).optional(),
+ triggerType: z.enum(ALL_TRIGGER_TYPES).optional(),
stream: z.boolean().optional(),
useDraftState: z.boolean().optional(),
input: z.any().optional(),
diff --git a/apps/sim/app/api/workspaces/[id]/notifications/[notificationId]/route.ts b/apps/sim/app/api/workspaces/[id]/notifications/[notificationId]/route.ts
index a7bca617d..799d148a6 100644
--- a/apps/sim/app/api/workspaces/[id]/notifications/[notificationId]/route.ts
+++ b/apps/sim/app/api/workspaces/[id]/notifications/[notificationId]/route.ts
@@ -6,13 +6,14 @@ import { z } from 'zod'
import { getSession } from '@/lib/auth'
import { encryptSecret } from '@/lib/core/security/encryption'
import { createLogger } from '@/lib/logs/console/logger'
+import { ALL_TRIGGER_TYPES } from '@/lib/logs/types'
import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils'
import { MAX_EMAIL_RECIPIENTS, MAX_WORKFLOW_IDS } from '../constants'
const logger = createLogger('WorkspaceNotificationAPI')
const levelFilterSchema = z.array(z.enum(['info', 'error']))
-const triggerFilterSchema = z.array(z.enum(['api', 'webhook', 'schedule', 'manual', 'chat']))
+const triggerFilterSchema = z.array(z.enum(ALL_TRIGGER_TYPES))
const alertRuleSchema = z.enum([
'consecutive_failures',
diff --git a/apps/sim/app/api/workspaces/[id]/notifications/route.ts b/apps/sim/app/api/workspaces/[id]/notifications/route.ts
index 9eb99ed5f..b1aa69ae0 100644
--- a/apps/sim/app/api/workspaces/[id]/notifications/route.ts
+++ b/apps/sim/app/api/workspaces/[id]/notifications/route.ts
@@ -7,6 +7,7 @@ import { z } from 'zod'
import { getSession } from '@/lib/auth'
import { encryptSecret } from '@/lib/core/security/encryption'
import { createLogger } from '@/lib/logs/console/logger'
+import { ALL_TRIGGER_TYPES } from '@/lib/logs/types'
import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils'
import { MAX_EMAIL_RECIPIENTS, MAX_NOTIFICATIONS_PER_TYPE, MAX_WORKFLOW_IDS } from './constants'
@@ -14,7 +15,7 @@ const logger = createLogger('WorkspaceNotificationsAPI')
const notificationTypeSchema = z.enum(['webhook', 'email', 'slack'])
const levelFilterSchema = z.array(z.enum(['info', 'error']))
-const triggerFilterSchema = z.array(z.enum(['api', 'webhook', 'schedule', 'manual', 'chat']))
+const triggerFilterSchema = z.array(z.enum(ALL_TRIGGER_TYPES))
const alertRuleSchema = z.enum([
'consecutive_failures',
@@ -80,7 +81,7 @@ const createNotificationSchema = z
workflowIds: z.array(z.string()).max(MAX_WORKFLOW_IDS).default([]),
allWorkflows: z.boolean().default(false),
levelFilter: levelFilterSchema.default(['info', 'error']),
- triggerFilter: triggerFilterSchema.default(['api', 'webhook', 'schedule', 'manual', 'chat']),
+ triggerFilter: triggerFilterSchema.default([...ALL_TRIGGER_TYPES]),
includeFinalOutput: z.boolean().default(false),
includeTraceSpans: z.boolean().default(false),
includeRateLimits: z.boolean().default(false),
diff --git a/apps/sim/app/workspace/[workspaceId]/logs/components/logs-toolbar/components/notifications/components/slack-channel-selector/slack-channel-selector.tsx b/apps/sim/app/workspace/[workspaceId]/logs/components/logs-toolbar/components/notifications/components/slack-channel-selector/slack-channel-selector.tsx
index 67583aa34..037064199 100644
--- a/apps/sim/app/workspace/[workspaceId]/logs/components/logs-toolbar/components/notifications/components/slack-channel-selector/slack-channel-selector.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/logs/components/logs-toolbar/components/notifications/components/slack-channel-selector/slack-channel-selector.tsx
@@ -104,6 +104,8 @@ export function SlackChannelSelector({
disabled={disabled || channels.length === 0}
isLoading={isLoading}
error={fetchError}
+ searchable
+ searchPlaceholder='Search channels...'
/>
{selectedChannel && !fetchError && (
diff --git a/apps/sim/app/workspace/[workspaceId]/logs/components/logs-toolbar/components/notifications/notifications.tsx b/apps/sim/app/workspace/[workspaceId]/logs/components/logs-toolbar/components/notifications/notifications.tsx
index a112df9e6..81bedb039 100644
--- a/apps/sim/app/workspace/[workspaceId]/logs/components/logs-toolbar/components/notifications/notifications.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/logs/components/logs-toolbar/components/notifications/notifications.tsx
@@ -22,6 +22,7 @@ import { SlackIcon } from '@/components/icons'
import { Skeleton } from '@/components/ui'
import { cn } from '@/lib/core/utils/cn'
import { createLogger } from '@/lib/logs/console/logger'
+import { ALL_TRIGGER_TYPES, type TriggerType } from '@/lib/logs/types'
import { quickValidateEmail } from '@/lib/messaging/email/validation'
import {
type NotificationSubscription,
@@ -43,7 +44,6 @@ const PRIMARY_BUTTON_STYLES =
type NotificationType = 'webhook' | 'email' | 'slack'
type LogLevel = 'info' | 'error'
-type TriggerType = 'api' | 'webhook' | 'schedule' | 'manual' | 'chat'
type AlertRule =
| 'none'
| 'consecutive_failures'
@@ -84,7 +84,6 @@ interface NotificationSettingsProps {
}
const LOG_LEVELS: LogLevel[] = ['info', 'error']
-const TRIGGER_TYPES: TriggerType[] = ['api', 'webhook', 'schedule', 'manual', 'chat']
function formatAlertConfigLabel(config: {
rule: AlertRule
@@ -137,7 +136,7 @@ export function NotificationSettings({
workflowIds: [] as string[],
allWorkflows: true,
levelFilter: ['info', 'error'] as LogLevel[],
- triggerFilter: ['api', 'webhook', 'schedule', 'manual', 'chat'] as TriggerType[],
+ triggerFilter: [...ALL_TRIGGER_TYPES] as TriggerType[],
includeFinalOutput: false,
includeTraceSpans: false,
includeRateLimits: false,
@@ -207,7 +206,7 @@ export function NotificationSettings({
workflowIds: [],
allWorkflows: true,
levelFilter: ['info', 'error'],
- triggerFilter: ['api', 'webhook', 'schedule', 'manual', 'chat'],
+ triggerFilter: [...ALL_TRIGGER_TYPES],
includeFinalOutput: false,
includeTraceSpans: false,
includeRateLimits: false,
@@ -768,7 +767,7 @@ export function NotificationSettings({
({
value: acc.id,
- label: acc.accountId,
+ label: acc.displayName || 'Slack Workspace',
}))}
value={formData.slackAccountId}
onChange={(value) => {
@@ -859,7 +858,7 @@ export function NotificationSettings({
({
+ options={ALL_TRIGGER_TYPES.map((trigger) => ({
label: trigger.charAt(0).toUpperCase() + trigger.slice(1),
value: trigger,
}))}
diff --git a/apps/sim/hooks/use-slack-accounts.ts b/apps/sim/hooks/use-slack-accounts.ts
index 4bb82543c..2f690b844 100644
--- a/apps/sim/hooks/use-slack-accounts.ts
+++ b/apps/sim/hooks/use-slack-accounts.ts
@@ -4,6 +4,7 @@ interface SlackAccount {
id: string
accountId: string
providerId: string
+ displayName?: string
}
interface UseSlackAccountsResult {
diff --git a/apps/sim/lib/logs/events.ts b/apps/sim/lib/logs/events.ts
index 14e2ceee8..4d2b923c1 100644
--- a/apps/sim/lib/logs/events.ts
+++ b/apps/sim/lib/logs/events.ts
@@ -81,8 +81,8 @@ export async function emitWorkflowExecutionCompleted(log: WorkflowExecutionLog):
)
for (const subscription of subscriptions) {
- const levelMatches = subscription.levelFilter?.includes(log.level) ?? true
- const triggerMatches = subscription.triggerFilter?.includes(log.trigger) ?? true
+ const levelMatches = subscription.levelFilter.includes(log.level)
+ const triggerMatches = subscription.triggerFilter.includes(log.trigger)
if (!levelMatches || !triggerMatches) {
logger.debug(`Skipping subscription ${subscription.id} due to filter mismatch`)
@@ -98,6 +98,7 @@ export async function emitWorkflowExecutionCompleted(log: WorkflowExecutionLog):
status: log.level === 'error' ? 'error' : 'success',
durationMs: log.totalDurationMs || 0,
cost: (log.cost as { total?: number })?.total || 0,
+ triggerFilter: subscription.triggerFilter,
}
const shouldAlert = await shouldTriggerAlert(alertConfig, context, subscription.lastAlertAt)
diff --git a/apps/sim/lib/logs/types.ts b/apps/sim/lib/logs/types.ts
index 6eebee216..6ea4f1b8e 100644
--- a/apps/sim/lib/logs/types.ts
+++ b/apps/sim/lib/logs/types.ts
@@ -51,8 +51,11 @@ export interface ExecutionEnvironment {
workspaceId: string
}
+export const ALL_TRIGGER_TYPES = ['api', 'webhook', 'schedule', 'manual', 'chat'] as const
+export type TriggerType = (typeof ALL_TRIGGER_TYPES)[number]
+
export interface ExecutionTrigger {
- type: 'api' | 'webhook' | 'schedule' | 'manual' | 'chat' | string
+ type: TriggerType | string
source: string
data?: Record
timestamp: string
diff --git a/apps/sim/lib/notifications/alert-rules.ts b/apps/sim/lib/notifications/alert-rules.ts
index c07dc7e5e..d2263f381 100644
--- a/apps/sim/lib/notifications/alert-rules.ts
+++ b/apps/sim/lib/notifications/alert-rules.ts
@@ -1,6 +1,6 @@
import { db } from '@sim/db'
import { workflowExecutionLogs } from '@sim/db/schema'
-import { and, avg, count, desc, eq, gte } from 'drizzle-orm'
+import { and, avg, count, desc, eq, gte, inArray } from 'drizzle-orm'
import { createLogger } from '@/lib/logs/console/logger'
const logger = createLogger('AlertRules')
@@ -135,25 +135,29 @@ export function isInCooldown(lastAlertAt: Date | null): boolean {
return new Date() < cooldownEnd
}
-/**
- * Context passed to alert check functions
- */
export interface AlertCheckContext {
workflowId: string
executionId: string
status: 'success' | 'error'
durationMs: number
cost: number
+ triggerFilter: string[]
}
-/**
- * Check if consecutive failures threshold is met
- */
-async function checkConsecutiveFailures(workflowId: string, threshold: number): Promise {
+async function checkConsecutiveFailures(
+ workflowId: string,
+ threshold: number,
+ triggerFilter: string[]
+): Promise {
const recentLogs = await db
.select({ level: workflowExecutionLogs.level })
.from(workflowExecutionLogs)
- .where(eq(workflowExecutionLogs.workflowId, workflowId))
+ .where(
+ and(
+ eq(workflowExecutionLogs.workflowId, workflowId),
+ inArray(workflowExecutionLogs.trigger, triggerFilter)
+ )
+ )
.orderBy(desc(workflowExecutionLogs.createdAt))
.limit(threshold)
@@ -162,13 +166,11 @@ async function checkConsecutiveFailures(workflowId: string, threshold: number):
return recentLogs.every((log) => log.level === 'error')
}
-/**
- * Check if failure rate exceeds threshold
- */
async function checkFailureRate(
workflowId: string,
ratePercent: number,
- windowHours: number
+ windowHours: number,
+ triggerFilter: string[]
): Promise {
const windowStart = new Date(Date.now() - windowHours * 60 * 60 * 1000)
@@ -181,7 +183,8 @@ async function checkFailureRate(
.where(
and(
eq(workflowExecutionLogs.workflowId, workflowId),
- gte(workflowExecutionLogs.createdAt, windowStart)
+ gte(workflowExecutionLogs.createdAt, windowStart),
+ inArray(workflowExecutionLogs.trigger, triggerFilter)
)
)
.orderBy(workflowExecutionLogs.createdAt)
@@ -206,14 +209,12 @@ function checkLatencyThreshold(durationMs: number, thresholdMs: number): boolean
return durationMs > thresholdMs
}
-/**
- * Check if execution duration is significantly above average
- */
async function checkLatencySpike(
workflowId: string,
currentDurationMs: number,
spikePercent: number,
- windowHours: number
+ windowHours: number,
+ triggerFilter: string[]
): Promise {
const windowStart = new Date(Date.now() - windowHours * 60 * 60 * 1000)
@@ -226,7 +227,8 @@ async function checkLatencySpike(
.where(
and(
eq(workflowExecutionLogs.workflowId, workflowId),
- gte(workflowExecutionLogs.createdAt, windowStart)
+ gte(workflowExecutionLogs.createdAt, windowStart),
+ inArray(workflowExecutionLogs.trigger, triggerFilter)
)
)
@@ -248,13 +250,11 @@ function checkCostThreshold(cost: number, thresholdDollars: number): boolean {
return cost > thresholdDollars
}
-/**
- * Check if error count exceeds threshold within window
- */
async function checkErrorCount(
workflowId: string,
threshold: number,
- windowHours: number
+ windowHours: number,
+ triggerFilter: string[]
): Promise {
const windowStart = new Date(Date.now() - windowHours * 60 * 60 * 1000)
@@ -265,7 +265,8 @@ async function checkErrorCount(
and(
eq(workflowExecutionLogs.workflowId, workflowId),
eq(workflowExecutionLogs.level, 'error'),
- gte(workflowExecutionLogs.createdAt, windowStart)
+ gte(workflowExecutionLogs.createdAt, windowStart),
+ inArray(workflowExecutionLogs.trigger, triggerFilter)
)
)
@@ -273,9 +274,6 @@ async function checkErrorCount(
return errorCount >= threshold
}
-/**
- * Evaluates if an alert should be triggered based on the configuration
- */
export async function shouldTriggerAlert(
config: AlertConfig,
context: AlertCheckContext,
@@ -287,16 +285,21 @@ export async function shouldTriggerAlert(
}
const { rule } = config
- const { workflowId, status, durationMs, cost } = context
+ const { workflowId, status, durationMs, cost, triggerFilter } = context
switch (rule) {
case 'consecutive_failures':
if (status !== 'error') return false
- return checkConsecutiveFailures(workflowId, config.consecutiveFailures!)
+ return checkConsecutiveFailures(workflowId, config.consecutiveFailures!, triggerFilter)
case 'failure_rate':
if (status !== 'error') return false
- return checkFailureRate(workflowId, config.failureRatePercent!, config.windowHours!)
+ return checkFailureRate(
+ workflowId,
+ config.failureRatePercent!,
+ config.windowHours!,
+ triggerFilter
+ )
case 'latency_threshold':
return checkLatencyThreshold(durationMs, config.durationThresholdMs!)
@@ -306,19 +309,24 @@ export async function shouldTriggerAlert(
workflowId,
durationMs,
config.latencySpikePercent!,
- config.windowHours!
+ config.windowHours!,
+ triggerFilter
)
case 'cost_threshold':
return checkCostThreshold(cost, config.costThresholdDollars!)
case 'no_activity':
- // no_activity alerts are handled by the hourly polling job, not execution events
return false
case 'error_count':
if (status !== 'error') return false
- return checkErrorCount(workflowId, config.errorCountThreshold!, config.windowHours!)
+ return checkErrorCount(
+ workflowId,
+ config.errorCountThreshold!,
+ config.windowHours!,
+ triggerFilter
+ )
default:
logger.warn(`Unknown alert rule: ${rule}`)
diff --git a/apps/sim/lib/notifications/inactivity-polling.ts b/apps/sim/lib/notifications/inactivity-polling.ts
index f577b3666..c5d749897 100644
--- a/apps/sim/lib/notifications/inactivity-polling.ts
+++ b/apps/sim/lib/notifications/inactivity-polling.ts
@@ -1,6 +1,7 @@
import { db } from '@sim/db'
import {
workflow,
+ workflowDeploymentVersion,
workflowExecutionLogs,
workspaceNotificationDelivery,
workspaceNotificationSubscription,
@@ -9,15 +10,81 @@ import { and, eq, gte, inArray, sql } from 'drizzle-orm'
import { v4 as uuidv4 } from 'uuid'
import { isTriggerDevEnabled } from '@/lib/core/config/feature-flags'
import { createLogger } from '@/lib/logs/console/logger'
+import { TRIGGER_TYPES } from '@/lib/workflows/triggers/triggers'
import {
executeNotificationDelivery,
workspaceNotificationDeliveryTask,
} from '@/background/workspace-notification-delivery'
+import type { WorkflowState } from '@/stores/workflows/workflow/types'
import type { AlertConfig } from './alert-rules'
import { isInCooldown } from './alert-rules'
const logger = createLogger('InactivityPolling')
+const SCHEDULE_BLOCK_TYPES: string[] = [TRIGGER_TYPES.SCHEDULE]
+const WEBHOOK_BLOCK_TYPES: string[] = [TRIGGER_TYPES.WEBHOOK, TRIGGER_TYPES.GENERIC_WEBHOOK]
+
+function deploymentHasTriggerType(
+ deploymentState: Pick,
+ triggerFilter: string[]
+): boolean {
+ const blocks = deploymentState.blocks
+ if (!blocks) return false
+
+ const alwaysAvailable = ['api', 'manual', 'chat']
+ if (triggerFilter.some((t) => alwaysAvailable.includes(t))) {
+ return true
+ }
+
+ for (const block of Object.values(blocks)) {
+ if (triggerFilter.includes('schedule') && SCHEDULE_BLOCK_TYPES.includes(block.type)) {
+ return true
+ }
+
+ if (triggerFilter.includes('webhook')) {
+ if (WEBHOOK_BLOCK_TYPES.includes(block.type)) {
+ return true
+ }
+ if (block.triggerMode === true) {
+ return true
+ }
+ }
+ }
+
+ return false
+}
+
+async function getWorkflowsWithTriggerTypes(
+ workspaceId: string,
+ triggerFilter: string[]
+): Promise> {
+ const workflowIds = new Set()
+
+ const deployedWorkflows = await db
+ .select({
+ workflowId: workflow.id,
+ deploymentState: workflowDeploymentVersion.state,
+ })
+ .from(workflow)
+ .innerJoin(
+ workflowDeploymentVersion,
+ and(
+ eq(workflowDeploymentVersion.workflowId, workflow.id),
+ eq(workflowDeploymentVersion.isActive, true)
+ )
+ )
+ .where(and(eq(workflow.workspaceId, workspaceId), eq(workflow.isDeployed, true)))
+
+ for (const w of deployedWorkflows) {
+ const state = w.deploymentState as WorkflowState | null
+ if (state && deploymentHasTriggerType(state, triggerFilter)) {
+ workflowIds.add(w.workflowId)
+ }
+ }
+
+ return workflowIds
+}
+
interface InactivityCheckResult {
subscriptionId: string
workflowId: string
@@ -25,9 +92,6 @@ interface InactivityCheckResult {
reason?: string
}
-/**
- * Checks a single workflow for inactivity and triggers notification if needed
- */
async function checkWorkflowInactivity(
subscription: typeof workspaceNotificationSubscription.$inferSelect,
workflowId: string,
@@ -141,9 +205,6 @@ async function checkWorkflowInactivity(
return result
}
-/**
- * Polls all active no_activity subscriptions and triggers alerts as needed
- */
export async function pollInactivityAlerts(): Promise<{
total: number
triggered: number
@@ -179,19 +240,30 @@ export async function pollInactivityAlerts(): Promise<{
continue
}
+ const triggerFilter = subscription.triggerFilter as string[]
+ if (!triggerFilter || triggerFilter.length === 0) {
+ logger.warn(`Subscription ${subscription.id} has no trigger filter, skipping`)
+ continue
+ }
+
+ const eligibleWorkflowIds = await getWorkflowsWithTriggerTypes(
+ subscription.workspaceId,
+ triggerFilter
+ )
+
let workflowIds: string[] = []
if (subscription.allWorkflows) {
- const workflows = await db
- .select({ id: workflow.id })
- .from(workflow)
- .where(eq(workflow.workspaceId, subscription.workspaceId))
-
- workflowIds = workflows.map((w) => w.id)
+ workflowIds = Array.from(eligibleWorkflowIds)
} else {
- workflowIds = subscription.workflowIds || []
+ workflowIds = (subscription.workflowIds || []).filter((id) => eligibleWorkflowIds.has(id))
}
+ logger.debug(`Checking ${workflowIds.length} workflows for subscription ${subscription.id}`, {
+ triggerFilter,
+ eligibleCount: eligibleWorkflowIds.size,
+ })
+
for (const workflowId of workflowIds) {
const result = await checkWorkflowInactivity(subscription, workflowId, alertConfig)
results.push(result)
From f45730a89e1957eb73c228826ef118bc6479b8b2 Mon Sep 17 00:00:00 2001
From: Waleed
Date: Thu, 18 Dec 2025 13:12:21 -0800
Subject: [PATCH 12/19] improvement(helm): added SSO and cloud storage
variables to helm charts (#2454)
* improvement(helm): added SSO and cloud storage variables to helm charts
* consolidated sf types
---
apps/sim/tools/salesforce/create_account.ts | 36 +-
apps/sim/tools/salesforce/create_case.ts | 31 +-
apps/sim/tools/salesforce/create_contact.ts | 35 +-
apps/sim/tools/salesforce/create_lead.ts | 33 +-
.../tools/salesforce/create_opportunity.ts | 31 +-
apps/sim/tools/salesforce/create_task.ts | 31 +-
apps/sim/tools/salesforce/delete_account.ts | 23 +-
apps/sim/tools/salesforce/delete_case.ts | 24 +-
apps/sim/tools/salesforce/delete_contact.ts | 22 +-
apps/sim/tools/salesforce/delete_lead.ts | 24 +-
.../tools/salesforce/delete_opportunity.ts | 24 +-
apps/sim/tools/salesforce/delete_task.ts | 24 +-
apps/sim/tools/salesforce/describe_object.ts | 35 +-
apps/sim/tools/salesforce/get_accounts.ts | 1 +
apps/sim/tools/salesforce/get_cases.ts | 32 +-
apps/sim/tools/salesforce/get_contacts.ts | 36 +-
apps/sim/tools/salesforce/get_dashboard.ts | 29 +-
apps/sim/tools/salesforce/get_leads.ts | 33 +-
.../sim/tools/salesforce/get_opportunities.ts | 35 +-
apps/sim/tools/salesforce/get_report.ts | 25 +-
apps/sim/tools/salesforce/get_tasks.ts | 32 +-
apps/sim/tools/salesforce/list_dashboards.ts | 25 +-
apps/sim/tools/salesforce/list_objects.ts | 26 +-
.../sim/tools/salesforce/list_report_types.ts | 24 +-
apps/sim/tools/salesforce/list_reports.ts | 26 +-
apps/sim/tools/salesforce/query.ts | 27 +-
apps/sim/tools/salesforce/query_more.ts | 29 +-
.../sim/tools/salesforce/refresh_dashboard.ts | 29 +-
apps/sim/tools/salesforce/run_report.ts | 35 +-
apps/sim/tools/salesforce/types.ts | 566 ++++++++++++++++--
apps/sim/tools/salesforce/update_account.ts | 36 +-
apps/sim/tools/salesforce/update_case.ts | 28 +-
apps/sim/tools/salesforce/update_contact.ts | 35 +-
apps/sim/tools/salesforce/update_lead.ts | 33 +-
.../tools/salesforce/update_opportunity.ts | 31 +-
apps/sim/tools/salesforce/update_task.ts | 29 +-
helm/sim/examples/values-aws.yaml | 13 +-
helm/sim/examples/values-azure.yaml | 15 +-
helm/sim/values.yaml | 33 +-
39 files changed, 727 insertions(+), 909 deletions(-)
diff --git a/apps/sim/tools/salesforce/create_account.ts b/apps/sim/tools/salesforce/create_account.ts
index ed878a93e..08951d734 100644
--- a/apps/sim/tools/salesforce/create_account.ts
+++ b/apps/sim/tools/salesforce/create_account.ts
@@ -1,39 +1,13 @@
import { createLogger } from '@/lib/logs/console/logger'
+import type {
+ SalesforceCreateAccountParams,
+ SalesforceCreateAccountResponse,
+} from '@/tools/salesforce/types'
+import { getInstanceUrl } from '@/tools/salesforce/utils'
import type { ToolConfig } from '@/tools/types'
const logger = createLogger('SalesforceCreateAccount')
-export interface SalesforceCreateAccountParams {
- accessToken: string
- idToken?: string
- instanceUrl?: string
- name: string
- type?: string
- industry?: string
- phone?: string
- website?: string
- billingStreet?: string
- billingCity?: string
- billingState?: string
- billingPostalCode?: string
- billingCountry?: string
- description?: string
- annualRevenue?: string
- numberOfEmployees?: string
-}
-
-export interface SalesforceCreateAccountResponse {
- success: boolean
- output: {
- id: string
- success: boolean
- created: boolean
- metadata: {
- operation: 'create_account'
- }
- }
-}
-
export const salesforceCreateAccountTool: ToolConfig<
SalesforceCreateAccountParams,
SalesforceCreateAccountResponse
diff --git a/apps/sim/tools/salesforce/create_case.ts b/apps/sim/tools/salesforce/create_case.ts
index 251ba91c2..09214ac2e 100644
--- a/apps/sim/tools/salesforce/create_case.ts
+++ b/apps/sim/tools/salesforce/create_case.ts
@@ -1,30 +1,9 @@
+import type {
+ SalesforceCreateCaseParams,
+ SalesforceCreateCaseResponse,
+} from '@/tools/salesforce/types'
+import { getInstanceUrl } from '@/tools/salesforce/utils'
import type { ToolConfig } from '@/tools/types'
-import { getInstanceUrl } from './utils'
-
-export interface SalesforceCreateCaseParams {
- accessToken: string
- idToken?: string
- instanceUrl?: string
- subject: string
- status?: string
- priority?: string
- origin?: string
- contactId?: string
- accountId?: string
- description?: string
-}
-
-export interface SalesforceCreateCaseResponse {
- success: boolean
- output: {
- id: string
- success: boolean
- created: boolean
- metadata: {
- operation: 'create_case'
- }
- }
-}
export const salesforceCreateCaseTool: ToolConfig<
SalesforceCreateCaseParams,
diff --git a/apps/sim/tools/salesforce/create_contact.ts b/apps/sim/tools/salesforce/create_contact.ts
index 72a62d929..d8ee11c04 100644
--- a/apps/sim/tools/salesforce/create_contact.ts
+++ b/apps/sim/tools/salesforce/create_contact.ts
@@ -1,38 +1,13 @@
import { createLogger } from '@/lib/logs/console/logger'
+import type {
+ SalesforceCreateContactParams,
+ SalesforceCreateContactResponse,
+} from '@/tools/salesforce/types'
+import { getInstanceUrl } from '@/tools/salesforce/utils'
import type { ToolConfig } from '@/tools/types'
-import { getInstanceUrl } from './utils'
const logger = createLogger('SalesforceContacts')
-export interface SalesforceCreateContactParams {
- accessToken: string
- idToken?: string
- instanceUrl?: string
- lastName: string
- firstName?: string
- email?: string
- phone?: string
- accountId?: string
- title?: string
- department?: string
- mailingStreet?: string
- mailingCity?: string
- mailingState?: string
- mailingPostalCode?: string
- mailingCountry?: string
- description?: string
-}
-
-export interface SalesforceCreateContactResponse {
- success: boolean
- output: {
- id: string
- success: boolean
- created: boolean
- metadata: { operation: 'create_contact' }
- }
-}
-
export const salesforceCreateContactTool: ToolConfig<
SalesforceCreateContactParams,
SalesforceCreateContactResponse
diff --git a/apps/sim/tools/salesforce/create_lead.ts b/apps/sim/tools/salesforce/create_lead.ts
index 1ffd1b5a4..93d92f0c2 100644
--- a/apps/sim/tools/salesforce/create_lead.ts
+++ b/apps/sim/tools/salesforce/create_lead.ts
@@ -1,32 +1,9 @@
+import type {
+ SalesforceCreateLeadParams,
+ SalesforceCreateLeadResponse,
+} from '@/tools/salesforce/types'
+import { getInstanceUrl } from '@/tools/salesforce/utils'
import type { ToolConfig } from '@/tools/types'
-import { getInstanceUrl } from './utils'
-
-export interface SalesforceCreateLeadParams {
- accessToken: string
- idToken?: string
- instanceUrl?: string
- lastName: string
- company: string
- firstName?: string
- email?: string
- phone?: string
- status?: string
- leadSource?: string
- title?: string
- description?: string
-}
-
-export interface SalesforceCreateLeadResponse {
- success: boolean
- output: {
- id: string
- success: boolean
- created: boolean
- metadata: {
- operation: 'create_lead'
- }
- }
-}
export const salesforceCreateLeadTool: ToolConfig<
SalesforceCreateLeadParams,
diff --git a/apps/sim/tools/salesforce/create_opportunity.ts b/apps/sim/tools/salesforce/create_opportunity.ts
index aebc55c7f..eba10e3b6 100644
--- a/apps/sim/tools/salesforce/create_opportunity.ts
+++ b/apps/sim/tools/salesforce/create_opportunity.ts
@@ -1,30 +1,9 @@
+import type {
+ SalesforceCreateOpportunityParams,
+ SalesforceCreateOpportunityResponse,
+} from '@/tools/salesforce/types'
+import { getInstanceUrl } from '@/tools/salesforce/utils'
import type { ToolConfig } from '@/tools/types'
-import { getInstanceUrl } from './utils'
-
-export interface SalesforceCreateOpportunityParams {
- accessToken: string
- idToken?: string
- instanceUrl?: string
- name: string
- stageName: string
- closeDate: string
- accountId?: string
- amount?: string
- probability?: string
- description?: string
-}
-
-export interface SalesforceCreateOpportunityResponse {
- success: boolean
- output: {
- id: string
- success: boolean
- created: boolean
- metadata: {
- operation: 'create_opportunity'
- }
- }
-}
export const salesforceCreateOpportunityTool: ToolConfig<
SalesforceCreateOpportunityParams,
diff --git a/apps/sim/tools/salesforce/create_task.ts b/apps/sim/tools/salesforce/create_task.ts
index b00ff719f..c815185d7 100644
--- a/apps/sim/tools/salesforce/create_task.ts
+++ b/apps/sim/tools/salesforce/create_task.ts
@@ -1,30 +1,9 @@
+import type {
+ SalesforceCreateTaskParams,
+ SalesforceCreateTaskResponse,
+} from '@/tools/salesforce/types'
+import { getInstanceUrl } from '@/tools/salesforce/utils'
import type { ToolConfig } from '@/tools/types'
-import { getInstanceUrl } from './utils'
-
-export interface SalesforceCreateTaskParams {
- accessToken: string
- idToken?: string
- instanceUrl?: string
- subject: string
- status?: string
- priority?: string
- activityDate?: string
- whoId?: string
- whatId?: string
- description?: string
-}
-
-export interface SalesforceCreateTaskResponse {
- success: boolean
- output: {
- id: string
- success: boolean
- created: boolean
- metadata: {
- operation: 'create_task'
- }
- }
-}
export const salesforceCreateTaskTool: ToolConfig<
SalesforceCreateTaskParams,
diff --git a/apps/sim/tools/salesforce/delete_account.ts b/apps/sim/tools/salesforce/delete_account.ts
index b6990ce60..d2010fc57 100644
--- a/apps/sim/tools/salesforce/delete_account.ts
+++ b/apps/sim/tools/salesforce/delete_account.ts
@@ -1,26 +1,13 @@
import { createLogger } from '@/lib/logs/console/logger'
+import type {
+ SalesforceDeleteAccountParams,
+ SalesforceDeleteAccountResponse,
+} from '@/tools/salesforce/types'
+import { getInstanceUrl } from '@/tools/salesforce/utils'
import type { ToolConfig } from '@/tools/types'
const logger = createLogger('SalesforceDeleteAccount')
-export interface SalesforceDeleteAccountParams {
- accessToken: string
- idToken?: string
- instanceUrl?: string
- accountId: string
-}
-
-export interface SalesforceDeleteAccountResponse {
- success: boolean
- output: {
- id: string
- deleted: boolean
- metadata: {
- operation: 'delete_account'
- }
- }
-}
-
export const salesforceDeleteAccountTool: ToolConfig<
SalesforceDeleteAccountParams,
SalesforceDeleteAccountResponse
diff --git a/apps/sim/tools/salesforce/delete_case.ts b/apps/sim/tools/salesforce/delete_case.ts
index cefb38ed0..d2fbbb31e 100644
--- a/apps/sim/tools/salesforce/delete_case.ts
+++ b/apps/sim/tools/salesforce/delete_case.ts
@@ -1,23 +1,9 @@
+import type {
+ SalesforceDeleteCaseParams,
+ SalesforceDeleteCaseResponse,
+} from '@/tools/salesforce/types'
+import { getInstanceUrl } from '@/tools/salesforce/utils'
import type { ToolConfig } from '@/tools/types'
-import { getInstanceUrl } from './utils'
-
-export interface SalesforceDeleteCaseParams {
- accessToken: string
- idToken?: string
- instanceUrl?: string
- caseId: string
-}
-
-export interface SalesforceDeleteCaseResponse {
- success: boolean
- output: {
- id: string
- deleted: boolean
- metadata: {
- operation: 'delete_case'
- }
- }
-}
export const salesforceDeleteCaseTool: ToolConfig<
SalesforceDeleteCaseParams,
diff --git a/apps/sim/tools/salesforce/delete_contact.ts b/apps/sim/tools/salesforce/delete_contact.ts
index a15c3a7db..28ae47c6a 100644
--- a/apps/sim/tools/salesforce/delete_contact.ts
+++ b/apps/sim/tools/salesforce/delete_contact.ts
@@ -1,25 +1,13 @@
import { createLogger } from '@/lib/logs/console/logger'
+import type {
+ SalesforceDeleteContactParams,
+ SalesforceDeleteContactResponse,
+} from '@/tools/salesforce/types'
+import { getInstanceUrl } from '@/tools/salesforce/utils'
import type { ToolConfig } from '@/tools/types'
-import { getInstanceUrl } from './utils'
const logger = createLogger('SalesforceContacts')
-export interface SalesforceDeleteContactParams {
- accessToken: string
- idToken?: string
- instanceUrl?: string
- contactId: string
-}
-
-export interface SalesforceDeleteContactResponse {
- success: boolean
- output: {
- id: string
- deleted: boolean
- metadata: { operation: 'delete_contact' }
- }
-}
-
export const salesforceDeleteContactTool: ToolConfig<
SalesforceDeleteContactParams,
SalesforceDeleteContactResponse
diff --git a/apps/sim/tools/salesforce/delete_lead.ts b/apps/sim/tools/salesforce/delete_lead.ts
index 9f79b3394..aa8dc2f2b 100644
--- a/apps/sim/tools/salesforce/delete_lead.ts
+++ b/apps/sim/tools/salesforce/delete_lead.ts
@@ -1,23 +1,9 @@
+import type {
+ SalesforceDeleteLeadParams,
+ SalesforceDeleteLeadResponse,
+} from '@/tools/salesforce/types'
+import { getInstanceUrl } from '@/tools/salesforce/utils'
import type { ToolConfig } from '@/tools/types'
-import { getInstanceUrl } from './utils'
-
-export interface SalesforceDeleteLeadParams {
- accessToken: string
- idToken?: string
- instanceUrl?: string
- leadId: string
-}
-
-export interface SalesforceDeleteLeadResponse {
- success: boolean
- output: {
- id: string
- deleted: boolean
- metadata: {
- operation: 'delete_lead'
- }
- }
-}
export const salesforceDeleteLeadTool: ToolConfig<
SalesforceDeleteLeadParams,
diff --git a/apps/sim/tools/salesforce/delete_opportunity.ts b/apps/sim/tools/salesforce/delete_opportunity.ts
index 31258d867..826c2a963 100644
--- a/apps/sim/tools/salesforce/delete_opportunity.ts
+++ b/apps/sim/tools/salesforce/delete_opportunity.ts
@@ -1,23 +1,9 @@
+import type {
+ SalesforceDeleteOpportunityParams,
+ SalesforceDeleteOpportunityResponse,
+} from '@/tools/salesforce/types'
+import { getInstanceUrl } from '@/tools/salesforce/utils'
import type { ToolConfig } from '@/tools/types'
-import { getInstanceUrl } from './utils'
-
-export interface SalesforceDeleteOpportunityParams {
- accessToken: string
- idToken?: string
- instanceUrl?: string
- opportunityId: string
-}
-
-export interface SalesforceDeleteOpportunityResponse {
- success: boolean
- output: {
- id: string
- deleted: boolean
- metadata: {
- operation: 'delete_opportunity'
- }
- }
-}
export const salesforceDeleteOpportunityTool: ToolConfig<
SalesforceDeleteOpportunityParams,
diff --git a/apps/sim/tools/salesforce/delete_task.ts b/apps/sim/tools/salesforce/delete_task.ts
index 6f6cc405b..ec606fbef 100644
--- a/apps/sim/tools/salesforce/delete_task.ts
+++ b/apps/sim/tools/salesforce/delete_task.ts
@@ -1,23 +1,9 @@
+import type {
+ SalesforceDeleteTaskParams,
+ SalesforceDeleteTaskResponse,
+} from '@/tools/salesforce/types'
+import { getInstanceUrl } from '@/tools/salesforce/utils'
import type { ToolConfig } from '@/tools/types'
-import { getInstanceUrl } from './utils'
-
-export interface SalesforceDeleteTaskParams {
- accessToken: string
- idToken?: string
- instanceUrl?: string
- taskId: string
-}
-
-export interface SalesforceDeleteTaskResponse {
- success: boolean
- output: {
- id: string
- deleted: boolean
- metadata: {
- operation: 'delete_task'
- }
- }
-}
export const salesforceDeleteTaskTool: ToolConfig<
SalesforceDeleteTaskParams,
diff --git a/apps/sim/tools/salesforce/describe_object.ts b/apps/sim/tools/salesforce/describe_object.ts
index a9087e0ee..70b5f1234 100644
--- a/apps/sim/tools/salesforce/describe_object.ts
+++ b/apps/sim/tools/salesforce/describe_object.ts
@@ -1,38 +1,13 @@
import { createLogger } from '@/lib/logs/console/logger'
+import type {
+ SalesforceDescribeObjectParams,
+ SalesforceDescribeObjectResponse,
+} from '@/tools/salesforce/types'
+import { extractErrorMessage, getInstanceUrl } from '@/tools/salesforce/utils'
import type { ToolConfig } from '@/tools/types'
-import { extractErrorMessage, getInstanceUrl } from './utils'
const logger = createLogger('SalesforceQuery')
-export interface SalesforceDescribeObjectParams {
- accessToken: string
- idToken?: string
- instanceUrl?: string
- objectName: string
-}
-
-export interface SalesforceDescribeObjectResponse {
- success: boolean
- output: {
- objectName: string
- label?: string
- labelPlural?: string
- fields?: any[]
- keyPrefix?: string
- queryable?: boolean
- createable?: boolean
- updateable?: boolean
- deletable?: boolean
- childRelationships?: any[]
- recordTypeInfos?: any[]
- metadata: {
- operation: 'describe_object'
- fieldCount: number
- }
- success: boolean
- }
-}
-
/**
* Describe a Salesforce object to get its metadata/fields
* Useful for discovering available fields for queries
diff --git a/apps/sim/tools/salesforce/get_accounts.ts b/apps/sim/tools/salesforce/get_accounts.ts
index 4180fb8fa..718d3e027 100644
--- a/apps/sim/tools/salesforce/get_accounts.ts
+++ b/apps/sim/tools/salesforce/get_accounts.ts
@@ -3,6 +3,7 @@ import type {
SalesforceGetAccountsParams,
SalesforceGetAccountsResponse,
} from '@/tools/salesforce/types'
+import { getInstanceUrl } from '@/tools/salesforce/utils'
import type { ToolConfig } from '@/tools/types'
const logger = createLogger('SalesforceGetAccounts')
diff --git a/apps/sim/tools/salesforce/get_cases.ts b/apps/sim/tools/salesforce/get_cases.ts
index cd65f8479..469bc4e4f 100644
--- a/apps/sim/tools/salesforce/get_cases.ts
+++ b/apps/sim/tools/salesforce/get_cases.ts
@@ -1,34 +1,6 @@
+import type { SalesforceGetCasesParams, SalesforceGetCasesResponse } from '@/tools/salesforce/types'
+import { getInstanceUrl } from '@/tools/salesforce/utils'
import type { ToolConfig } from '@/tools/types'
-import { getInstanceUrl } from './utils'
-
-export interface SalesforceGetCasesParams {
- accessToken: string
- idToken?: string
- instanceUrl?: string
- caseId?: string
- limit?: string
- fields?: string
- orderBy?: string
-}
-
-export interface SalesforceGetCasesResponse {
- success: boolean
- output: {
- case?: any
- cases?: any[]
- paging?: {
- nextRecordsUrl?: string
- totalSize: number
- done: boolean
- }
- metadata: {
- operation: 'get_cases'
- totalReturned?: number
- hasMore?: boolean
- }
- success: boolean
- }
-}
export const salesforceGetCasesTool: ToolConfig<
SalesforceGetCasesParams,
diff --git a/apps/sim/tools/salesforce/get_contacts.ts b/apps/sim/tools/salesforce/get_contacts.ts
index 679d3a32d..3ab35e0a1 100644
--- a/apps/sim/tools/salesforce/get_contacts.ts
+++ b/apps/sim/tools/salesforce/get_contacts.ts
@@ -1,39 +1,13 @@
import { createLogger } from '@/lib/logs/console/logger'
+import type {
+ SalesforceGetContactsParams,
+ SalesforceGetContactsResponse,
+} from '@/tools/salesforce/types'
+import { getInstanceUrl } from '@/tools/salesforce/utils'
import type { ToolConfig } from '@/tools/types'
-import { getInstanceUrl } from './utils'
const logger = createLogger('SalesforceContacts')
-export interface SalesforceGetContactsParams {
- accessToken: string
- idToken?: string
- instanceUrl?: string
- contactId?: string
- limit?: string
- fields?: string
- orderBy?: string
-}
-
-export interface SalesforceGetContactsResponse {
- success: boolean
- output: {
- contacts?: any[]
- contact?: any
- paging?: {
- nextRecordsUrl?: string
- totalSize: number
- done: boolean
- }
- metadata: {
- operation: 'get_contacts'
- totalReturned?: number
- hasMore?: boolean
- singleContact?: boolean
- }
- success: boolean
- }
-}
-
export const salesforceGetContactsTool: ToolConfig<
SalesforceGetContactsParams,
SalesforceGetContactsResponse
diff --git a/apps/sim/tools/salesforce/get_dashboard.ts b/apps/sim/tools/salesforce/get_dashboard.ts
index b5824f26e..a9bf3a769 100644
--- a/apps/sim/tools/salesforce/get_dashboard.ts
+++ b/apps/sim/tools/salesforce/get_dashboard.ts
@@ -1,32 +1,13 @@
import { createLogger } from '@/lib/logs/console/logger'
+import type {
+ SalesforceGetDashboardParams,
+ SalesforceGetDashboardResponse,
+} from '@/tools/salesforce/types'
+import { extractErrorMessage, getInstanceUrl } from '@/tools/salesforce/utils'
import type { ToolConfig } from '@/tools/types'
-import { extractErrorMessage, getInstanceUrl } from './utils'
const logger = createLogger('SalesforceDashboards')
-export interface SalesforceGetDashboardParams {
- accessToken: string
- idToken?: string
- instanceUrl?: string
- dashboardId: string
-}
-
-export interface SalesforceGetDashboardResponse {
- success: boolean
- output: {
- dashboard: any
- dashboardId: string
- components: any[]
- metadata: {
- operation: 'get_dashboard'
- dashboardName?: string
- folderId?: string
- runningUser?: any
- }
- success: boolean
- }
-}
-
/**
* Get details for a specific dashboard
* @see https://developer.salesforce.com/docs/atlas.en-us.api_analytics.meta/api_analytics/sforce_analytics_rest_api_dashboard_results.htm
diff --git a/apps/sim/tools/salesforce/get_leads.ts b/apps/sim/tools/salesforce/get_leads.ts
index 93bda3453..de6834abc 100644
--- a/apps/sim/tools/salesforce/get_leads.ts
+++ b/apps/sim/tools/salesforce/get_leads.ts
@@ -1,35 +1,6 @@
+import type { SalesforceGetLeadsParams, SalesforceGetLeadsResponse } from '@/tools/salesforce/types'
+import { getInstanceUrl } from '@/tools/salesforce/utils'
import type { ToolConfig } from '@/tools/types'
-import { getInstanceUrl } from './utils'
-
-export interface SalesforceGetLeadsParams {
- accessToken: string
- idToken?: string
- instanceUrl?: string
- leadId?: string
- limit?: string
- fields?: string
- orderBy?: string
-}
-
-export interface SalesforceGetLeadsResponse {
- success: boolean
- output: {
- lead?: any
- leads?: any[]
- paging?: {
- nextRecordsUrl?: string
- totalSize: number
- done: boolean
- }
- metadata: {
- operation: 'get_leads'
- totalReturned?: number
- hasMore?: boolean
- singleLead?: boolean
- }
- success: boolean
- }
-}
export const salesforceGetLeadsTool: ToolConfig<
SalesforceGetLeadsParams,
diff --git a/apps/sim/tools/salesforce/get_opportunities.ts b/apps/sim/tools/salesforce/get_opportunities.ts
index 0330abdd4..084459b21 100644
--- a/apps/sim/tools/salesforce/get_opportunities.ts
+++ b/apps/sim/tools/salesforce/get_opportunities.ts
@@ -1,34 +1,9 @@
+import type {
+ SalesforceGetOpportunitiesParams,
+ SalesforceGetOpportunitiesResponse,
+} from '@/tools/salesforce/types'
+import { getInstanceUrl } from '@/tools/salesforce/utils'
import type { ToolConfig } from '@/tools/types'
-import { getInstanceUrl } from './utils'
-
-export interface SalesforceGetOpportunitiesParams {
- accessToken: string
- idToken?: string
- instanceUrl?: string
- opportunityId?: string
- limit?: string
- fields?: string
- orderBy?: string
-}
-
-export interface SalesforceGetOpportunitiesResponse {
- success: boolean
- output: {
- opportunity?: any
- opportunities?: any[]
- paging?: {
- nextRecordsUrl?: string
- totalSize: number
- done: boolean
- }
- metadata: {
- operation: 'get_opportunities'
- totalReturned?: number
- hasMore?: boolean
- }
- success: boolean
- }
-}
export const salesforceGetOpportunitiesTool: ToolConfig<
SalesforceGetOpportunitiesParams,
diff --git a/apps/sim/tools/salesforce/get_report.ts b/apps/sim/tools/salesforce/get_report.ts
index e1f0c08df..12da61bbf 100644
--- a/apps/sim/tools/salesforce/get_report.ts
+++ b/apps/sim/tools/salesforce/get_report.ts
@@ -1,28 +1,13 @@
import { createLogger } from '@/lib/logs/console/logger'
+import type {
+ SalesforceGetReportParams,
+ SalesforceGetReportResponse,
+} from '@/tools/salesforce/types'
+import { extractErrorMessage, getInstanceUrl } from '@/tools/salesforce/utils'
import type { ToolConfig } from '@/tools/types'
-import { extractErrorMessage, getInstanceUrl } from './utils'
const logger = createLogger('SalesforceReports')
-export interface SalesforceGetReportParams {
- accessToken: string
- idToken?: string
- instanceUrl?: string
- reportId: string
-}
-
-export interface SalesforceGetReportResponse {
- success: boolean
- output: {
- report: any
- reportId: string
- metadata: {
- operation: 'get_report'
- }
- success: boolean
- }
-}
-
/**
* Get metadata for a specific report
* @see https://developer.salesforce.com/docs/atlas.en-us.api_analytics.meta/api_analytics/sforce_analytics_rest_api_get_reportmetadata.htm
diff --git a/apps/sim/tools/salesforce/get_tasks.ts b/apps/sim/tools/salesforce/get_tasks.ts
index 791a5ab21..358dfa29a 100644
--- a/apps/sim/tools/salesforce/get_tasks.ts
+++ b/apps/sim/tools/salesforce/get_tasks.ts
@@ -1,34 +1,6 @@
+import type { SalesforceGetTasksParams, SalesforceGetTasksResponse } from '@/tools/salesforce/types'
+import { getInstanceUrl } from '@/tools/salesforce/utils'
import type { ToolConfig } from '@/tools/types'
-import { getInstanceUrl } from './utils'
-
-export interface SalesforceGetTasksParams {
- accessToken: string
- idToken?: string
- instanceUrl?: string
- taskId?: string
- limit?: string
- fields?: string
- orderBy?: string
-}
-
-export interface SalesforceGetTasksResponse {
- success: boolean
- output: {
- task?: any
- tasks?: any[]
- paging?: {
- nextRecordsUrl?: string
- totalSize: number
- done: boolean
- }
- metadata: {
- operation: 'get_tasks'
- totalReturned?: number
- hasMore?: boolean
- }
- success: boolean
- }
-}
export const salesforceGetTasksTool: ToolConfig<
SalesforceGetTasksParams,
diff --git a/apps/sim/tools/salesforce/list_dashboards.ts b/apps/sim/tools/salesforce/list_dashboards.ts
index 62a5fc42a..a2122aed2 100644
--- a/apps/sim/tools/salesforce/list_dashboards.ts
+++ b/apps/sim/tools/salesforce/list_dashboards.ts
@@ -1,28 +1,13 @@
import { createLogger } from '@/lib/logs/console/logger'
+import type {
+ SalesforceListDashboardsParams,
+ SalesforceListDashboardsResponse,
+} from '@/tools/salesforce/types'
+import { extractErrorMessage, getInstanceUrl } from '@/tools/salesforce/utils'
import type { ToolConfig } from '@/tools/types'
-import { extractErrorMessage, getInstanceUrl } from './utils'
const logger = createLogger('SalesforceDashboards')
-export interface SalesforceListDashboardsParams {
- accessToken: string
- idToken?: string
- instanceUrl?: string
- folderName?: string
-}
-
-export interface SalesforceListDashboardsResponse {
- success: boolean
- output: {
- dashboards: any[]
- metadata: {
- operation: 'list_dashboards'
- totalReturned: number
- }
- success: boolean
- }
-}
-
/**
* List all dashboards accessible by the current user
* @see https://developer.salesforce.com/docs/atlas.en-us.api_analytics.meta/api_analytics/sforce_analytics_rest_api_getbasic_dashboardlist.htm
diff --git a/apps/sim/tools/salesforce/list_objects.ts b/apps/sim/tools/salesforce/list_objects.ts
index 4efedefa6..20406bf66 100644
--- a/apps/sim/tools/salesforce/list_objects.ts
+++ b/apps/sim/tools/salesforce/list_objects.ts
@@ -1,29 +1,13 @@
import { createLogger } from '@/lib/logs/console/logger'
+import type {
+ SalesforceListObjectsParams,
+ SalesforceListObjectsResponse,
+} from '@/tools/salesforce/types'
+import { extractErrorMessage, getInstanceUrl } from '@/tools/salesforce/utils'
import type { ToolConfig } from '@/tools/types'
-import { extractErrorMessage, getInstanceUrl } from './utils'
const logger = createLogger('SalesforceQuery')
-export interface SalesforceListObjectsParams {
- accessToken: string
- idToken?: string
- instanceUrl?: string
-}
-
-export interface SalesforceListObjectsResponse {
- success: boolean
- output: {
- objects: any[]
- encoding?: string
- maxBatchSize?: number
- metadata: {
- operation: 'list_objects'
- totalReturned: number
- }
- success: boolean
- }
-}
-
/**
* List all available Salesforce objects
* Useful for discovering what objects are available
diff --git a/apps/sim/tools/salesforce/list_report_types.ts b/apps/sim/tools/salesforce/list_report_types.ts
index 70f3c0916..9a1988e13 100644
--- a/apps/sim/tools/salesforce/list_report_types.ts
+++ b/apps/sim/tools/salesforce/list_report_types.ts
@@ -1,27 +1,13 @@
import { createLogger } from '@/lib/logs/console/logger'
+import type {
+ SalesforceListReportTypesParams,
+ SalesforceListReportTypesResponse,
+} from '@/tools/salesforce/types'
+import { extractErrorMessage, getInstanceUrl } from '@/tools/salesforce/utils'
import type { ToolConfig } from '@/tools/types'
-import { extractErrorMessage, getInstanceUrl } from './utils'
const logger = createLogger('SalesforceReports')
-export interface SalesforceListReportTypesParams {
- accessToken: string
- idToken?: string
- instanceUrl?: string
-}
-
-export interface SalesforceListReportTypesResponse {
- success: boolean
- output: {
- reportTypes: any[]
- metadata: {
- operation: 'list_report_types'
- totalReturned: number
- }
- success: boolean
- }
-}
-
/**
* Get list of available report types
* @see https://developer.salesforce.com/docs/atlas.en-us.api_analytics.meta/api_analytics/sforce_analytics_rest_api_list_reporttypes.htm
diff --git a/apps/sim/tools/salesforce/list_reports.ts b/apps/sim/tools/salesforce/list_reports.ts
index 09550383a..fe85a65f7 100644
--- a/apps/sim/tools/salesforce/list_reports.ts
+++ b/apps/sim/tools/salesforce/list_reports.ts
@@ -1,29 +1,13 @@
import { createLogger } from '@/lib/logs/console/logger'
+import type {
+ SalesforceListReportsParams,
+ SalesforceListReportsResponse,
+} from '@/tools/salesforce/types'
+import { extractErrorMessage, getInstanceUrl } from '@/tools/salesforce/utils'
import type { ToolConfig } from '@/tools/types'
-import { extractErrorMessage, getInstanceUrl } from './utils'
const logger = createLogger('SalesforceReports')
-export interface SalesforceListReportsParams {
- accessToken: string
- idToken?: string
- instanceUrl?: string
- folderName?: string
- searchTerm?: string
-}
-
-export interface SalesforceListReportsResponse {
- success: boolean
- output: {
- reports: any[]
- metadata: {
- operation: 'list_reports'
- totalReturned: number
- }
- success: boolean
- }
-}
-
/**
* List all reports accessible by the current user
* @see https://developer.salesforce.com/docs/atlas.en-us.api_analytics.meta/api_analytics/sforce_analytics_rest_api_get_reportlist.htm
diff --git a/apps/sim/tools/salesforce/query.ts b/apps/sim/tools/salesforce/query.ts
index 29c5a9032..4c138ed0f 100644
--- a/apps/sim/tools/salesforce/query.ts
+++ b/apps/sim/tools/salesforce/query.ts
@@ -1,33 +1,10 @@
import { createLogger } from '@/lib/logs/console/logger'
+import type { SalesforceQueryParams, SalesforceQueryResponse } from '@/tools/salesforce/types'
+import { extractErrorMessage, getInstanceUrl } from '@/tools/salesforce/utils'
import type { ToolConfig } from '@/tools/types'
-import { extractErrorMessage, getInstanceUrl } from './utils'
const logger = createLogger('SalesforceQuery')
-export interface SalesforceQueryParams {
- accessToken: string
- idToken?: string
- instanceUrl?: string
- query: string
-}
-
-export interface SalesforceQueryResponse {
- success: boolean
- output: {
- records: any[]
- totalSize: number
- done: boolean
- nextRecordsUrl?: string
- query: string
- metadata: {
- operation: 'query'
- totalReturned: number
- hasMore: boolean
- }
- success: boolean
- }
-}
-
/**
* Execute a custom SOQL query
* @see https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/dome_query.htm
diff --git a/apps/sim/tools/salesforce/query_more.ts b/apps/sim/tools/salesforce/query_more.ts
index bae4b0147..77b3bd3eb 100644
--- a/apps/sim/tools/salesforce/query_more.ts
+++ b/apps/sim/tools/salesforce/query_more.ts
@@ -1,32 +1,13 @@
import { createLogger } from '@/lib/logs/console/logger'
+import type {
+ SalesforceQueryMoreParams,
+ SalesforceQueryMoreResponse,
+} from '@/tools/salesforce/types'
+import { extractErrorMessage, getInstanceUrl } from '@/tools/salesforce/utils'
import type { ToolConfig } from '@/tools/types'
-import { extractErrorMessage, getInstanceUrl } from './utils'
const logger = createLogger('SalesforceQuery')
-export interface SalesforceQueryMoreParams {
- accessToken: string
- idToken?: string
- instanceUrl?: string
- nextRecordsUrl: string
-}
-
-export interface SalesforceQueryMoreResponse {
- success: boolean
- output: {
- records: any[]
- totalSize: number
- done: boolean
- nextRecordsUrl?: string
- metadata: {
- operation: 'query_more'
- totalReturned: number
- hasMore: boolean
- }
- success: boolean
- }
-}
-
/**
* Retrieve additional query results using the nextRecordsUrl
* @see https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/dome_query.htm
diff --git a/apps/sim/tools/salesforce/refresh_dashboard.ts b/apps/sim/tools/salesforce/refresh_dashboard.ts
index 6fb355caf..8a0f965bf 100644
--- a/apps/sim/tools/salesforce/refresh_dashboard.ts
+++ b/apps/sim/tools/salesforce/refresh_dashboard.ts
@@ -1,32 +1,13 @@
import { createLogger } from '@/lib/logs/console/logger'
+import type {
+ SalesforceRefreshDashboardParams,
+ SalesforceRefreshDashboardResponse,
+} from '@/tools/salesforce/types'
+import { extractErrorMessage, getInstanceUrl } from '@/tools/salesforce/utils'
import type { ToolConfig } from '@/tools/types'
-import { extractErrorMessage, getInstanceUrl } from './utils'
const logger = createLogger('SalesforceDashboards')
-export interface SalesforceRefreshDashboardParams {
- accessToken: string
- idToken?: string
- instanceUrl?: string
- dashboardId: string
-}
-
-export interface SalesforceRefreshDashboardResponse {
- success: boolean
- output: {
- dashboard: any
- dashboardId: string
- components: any[]
- status?: any
- metadata: {
- operation: 'refresh_dashboard'
- dashboardName?: string
- refreshDate?: string
- }
- success: boolean
- }
-}
-
/**
* Refresh a dashboard to get latest data
* @see https://developer.salesforce.com/docs/atlas.en-us.api_analytics.meta/api_analytics/sforce_analytics_rest_api_refresh_dashboard.htm
diff --git a/apps/sim/tools/salesforce/run_report.ts b/apps/sim/tools/salesforce/run_report.ts
index cca98d1ed..25eddd35a 100644
--- a/apps/sim/tools/salesforce/run_report.ts
+++ b/apps/sim/tools/salesforce/run_report.ts
@@ -1,38 +1,13 @@
import { createLogger } from '@/lib/logs/console/logger'
+import type {
+ SalesforceRunReportParams,
+ SalesforceRunReportResponse,
+} from '@/tools/salesforce/types'
+import { extractErrorMessage, getInstanceUrl } from '@/tools/salesforce/utils'
import type { ToolConfig } from '@/tools/types'
-import { extractErrorMessage, getInstanceUrl } from './utils'
const logger = createLogger('SalesforceReports')
-export interface SalesforceRunReportParams {
- accessToken: string
- idToken?: string
- instanceUrl?: string
- reportId: string
- includeDetails?: string
- filters?: string
-}
-
-export interface SalesforceRunReportResponse {
- success: boolean
- output: {
- reportId: string
- reportMetadata?: any
- reportExtendedMetadata?: any
- factMap?: any
- groupingsDown?: any
- groupingsAcross?: any
- hasDetailRows?: boolean
- allData?: boolean
- metadata: {
- operation: 'run_report'
- reportName?: string
- reportFormat?: string
- }
- success: boolean
- }
-}
-
/**
* Run a report and return the results
* @see https://developer.salesforce.com/docs/atlas.en-us.api_analytics.meta/api_analytics/sforce_analytics_rest_api_get_reportdata.htm
diff --git a/apps/sim/tools/salesforce/types.ts b/apps/sim/tools/salesforce/types.ts
index 17cb41c04..21769103e 100644
--- a/apps/sim/tools/salesforce/types.ts
+++ b/apps/sim/tools/salesforce/types.ts
@@ -1,6 +1,23 @@
import type { ToolResponse } from '@/tools/types'
-// Common Salesforce types
+/**
+ * Base parameters shared by all Salesforce operations
+ */
+export interface BaseSalesforceParams {
+ accessToken: string
+ idToken?: string
+ instanceUrl?: string
+}
+
+/**
+ * Common paging structure for list operations
+ */
+export interface SalesforcePaging {
+ nextRecordsUrl?: string
+ totalSize: number
+ done: boolean
+}
+
export interface SalesforceAccount {
Id: string
Name: string
@@ -22,13 +39,12 @@ export interface SalesforceAccount {
[key: string]: any
}
-export interface SalesforcePaging {
- nextRecordsUrl?: string
- totalSize: number
- done: boolean
+export interface SalesforceGetAccountsParams extends BaseSalesforceParams {
+ limit?: string
+ fields?: string
+ orderBy?: string
}
-// Get Accounts
export interface SalesforceGetAccountsResponse extends ToolResponse {
output: {
accounts: SalesforceAccount[]
@@ -42,16 +58,22 @@ export interface SalesforceGetAccountsResponse extends ToolResponse {
}
}
-export interface SalesforceGetAccountsParams {
- accessToken: string
- idToken?: string
- instanceUrl?: string
- limit?: string
- fields?: string
- orderBy?: string
+export interface SalesforceCreateAccountParams extends BaseSalesforceParams {
+ name: string
+ type?: string
+ industry?: string
+ phone?: string
+ website?: string
+ billingStreet?: string
+ billingCity?: string
+ billingState?: string
+ billingPostalCode?: string
+ billingCountry?: string
+ description?: string
+ annualRevenue?: string
+ numberOfEmployees?: string
}
-// Create Account
export interface SalesforceCreateAccountResponse {
success: boolean
output: {
@@ -64,7 +86,23 @@ export interface SalesforceCreateAccountResponse {
}
}
-// Update Account
+export interface SalesforceUpdateAccountParams extends BaseSalesforceParams {
+ accountId: string
+ name?: string
+ type?: string
+ industry?: string
+ phone?: string
+ website?: string
+ billingStreet?: string
+ billingCity?: string
+ billingState?: string
+ billingPostalCode?: string
+ billingCountry?: string
+ description?: string
+ annualRevenue?: string
+ numberOfEmployees?: string
+}
+
export interface SalesforceUpdateAccountResponse {
success: boolean
output: {
@@ -76,7 +114,10 @@ export interface SalesforceUpdateAccountResponse {
}
}
-// Delete Account
+export interface SalesforceDeleteAccountParams extends BaseSalesforceParams {
+ accountId: string
+}
+
export interface SalesforceDeleteAccountResponse {
success: boolean
output: {
@@ -88,17 +129,19 @@ export interface SalesforceDeleteAccountResponse {
}
}
-// Contact types
+export interface SalesforceGetContactsParams extends BaseSalesforceParams {
+ contactId?: string
+ limit?: string
+ fields?: string
+ orderBy?: string
+}
+
export interface SalesforceGetContactsResponse {
success: boolean
output: {
contacts?: any[]
contact?: any
- paging?: {
- nextRecordsUrl?: string
- totalSize: number
- done: boolean
- }
+ paging?: SalesforcePaging
metadata: {
operation: 'get_contacts'
totalReturned?: number
@@ -109,6 +152,22 @@ export interface SalesforceGetContactsResponse {
}
}
+export interface SalesforceCreateContactParams extends BaseSalesforceParams {
+ lastName: string
+ firstName?: string
+ email?: string
+ phone?: string
+ accountId?: string
+ title?: string
+ department?: string
+ mailingStreet?: string
+ mailingCity?: string
+ mailingState?: string
+ mailingPostalCode?: string
+ mailingCountry?: string
+ description?: string
+}
+
export interface SalesforceCreateContactResponse {
success: boolean
output: {
@@ -119,6 +178,23 @@ export interface SalesforceCreateContactResponse {
}
}
+export interface SalesforceUpdateContactParams extends BaseSalesforceParams {
+ contactId: string
+ lastName?: string
+ firstName?: string
+ email?: string
+ phone?: string
+ accountId?: string
+ title?: string
+ department?: string
+ mailingStreet?: string
+ mailingCity?: string
+ mailingState?: string
+ mailingPostalCode?: string
+ mailingCountry?: string
+ description?: string
+}
+
export interface SalesforceUpdateContactResponse {
success: boolean
output: {
@@ -128,6 +204,10 @@ export interface SalesforceUpdateContactResponse {
}
}
+export interface SalesforceDeleteContactParams extends BaseSalesforceParams {
+ contactId: string
+}
+
export interface SalesforceDeleteContactResponse {
success: boolean
output: {
@@ -137,7 +217,335 @@ export interface SalesforceDeleteContactResponse {
}
}
-// Report types
+export interface SalesforceGetLeadsParams extends BaseSalesforceParams {
+ leadId?: string
+ limit?: string
+ fields?: string
+ orderBy?: string
+}
+
+export interface SalesforceGetLeadsResponse {
+ success: boolean
+ output: {
+ lead?: any
+ leads?: any[]
+ paging?: SalesforcePaging
+ metadata: {
+ operation: 'get_leads'
+ totalReturned?: number
+ hasMore?: boolean
+ singleLead?: boolean
+ }
+ success: boolean
+ }
+}
+
+export interface SalesforceCreateLeadParams extends BaseSalesforceParams {
+ lastName: string
+ company: string
+ firstName?: string
+ email?: string
+ phone?: string
+ status?: string
+ leadSource?: string
+ title?: string
+ description?: string
+}
+
+export interface SalesforceCreateLeadResponse {
+ success: boolean
+ output: {
+ id: string
+ success: boolean
+ created: boolean
+ metadata: {
+ operation: 'create_lead'
+ }
+ }
+}
+
+export interface SalesforceUpdateLeadParams extends BaseSalesforceParams {
+ leadId: string
+ lastName?: string
+ company?: string
+ firstName?: string
+ email?: string
+ phone?: string
+ status?: string
+ leadSource?: string
+ title?: string
+ description?: string
+}
+
+export interface SalesforceUpdateLeadResponse {
+ success: boolean
+ output: {
+ id: string
+ updated: boolean
+ metadata: {
+ operation: 'update_lead'
+ }
+ }
+}
+
+export interface SalesforceDeleteLeadParams extends BaseSalesforceParams {
+ leadId: string
+}
+
+export interface SalesforceDeleteLeadResponse {
+ success: boolean
+ output: {
+ id: string
+ deleted: boolean
+ metadata: {
+ operation: 'delete_lead'
+ }
+ }
+}
+
+export interface SalesforceGetOpportunitiesParams extends BaseSalesforceParams {
+ opportunityId?: string
+ limit?: string
+ fields?: string
+ orderBy?: string
+}
+
+export interface SalesforceGetOpportunitiesResponse {
+ success: boolean
+ output: {
+ opportunity?: any
+ opportunities?: any[]
+ paging?: SalesforcePaging
+ metadata: {
+ operation: 'get_opportunities'
+ totalReturned?: number
+ hasMore?: boolean
+ }
+ success: boolean
+ }
+}
+
+export interface SalesforceCreateOpportunityParams extends BaseSalesforceParams {
+ name: string
+ stageName: string
+ closeDate: string
+ accountId?: string
+ amount?: string
+ probability?: string
+ description?: string
+}
+
+export interface SalesforceCreateOpportunityResponse {
+ success: boolean
+ output: {
+ id: string
+ success: boolean
+ created: boolean
+ metadata: {
+ operation: 'create_opportunity'
+ }
+ }
+}
+
+export interface SalesforceUpdateOpportunityParams extends BaseSalesforceParams {
+ opportunityId: string
+ name?: string
+ stageName?: string
+ closeDate?: string
+ accountId?: string
+ amount?: string
+ probability?: string
+ description?: string
+}
+
+export interface SalesforceUpdateOpportunityResponse {
+ success: boolean
+ output: {
+ id: string
+ updated: boolean
+ metadata: {
+ operation: 'update_opportunity'
+ }
+ }
+}
+
+export interface SalesforceDeleteOpportunityParams extends BaseSalesforceParams {
+ opportunityId: string
+}
+
+export interface SalesforceDeleteOpportunityResponse {
+ success: boolean
+ output: {
+ id: string
+ deleted: boolean
+ metadata: {
+ operation: 'delete_opportunity'
+ }
+ }
+}
+
+export interface SalesforceGetCasesParams extends BaseSalesforceParams {
+ caseId?: string
+ limit?: string
+ fields?: string
+ orderBy?: string
+}
+
+export interface SalesforceGetCasesResponse {
+ success: boolean
+ output: {
+ case?: any
+ cases?: any[]
+ paging?: SalesforcePaging
+ metadata: {
+ operation: 'get_cases'
+ totalReturned?: number
+ hasMore?: boolean
+ }
+ success: boolean
+ }
+}
+
+export interface SalesforceCreateCaseParams extends BaseSalesforceParams {
+ subject: string
+ status?: string
+ priority?: string
+ origin?: string
+ contactId?: string
+ accountId?: string
+ description?: string
+}
+
+export interface SalesforceCreateCaseResponse {
+ success: boolean
+ output: {
+ id: string
+ success: boolean
+ created: boolean
+ metadata: {
+ operation: 'create_case'
+ }
+ }
+}
+
+export interface SalesforceUpdateCaseParams extends BaseSalesforceParams {
+ caseId: string
+ subject?: string
+ status?: string
+ priority?: string
+ description?: string
+}
+
+export interface SalesforceUpdateCaseResponse {
+ success: boolean
+ output: {
+ id: string
+ updated: boolean
+ metadata: {
+ operation: 'update_case'
+ }
+ }
+}
+
+export interface SalesforceDeleteCaseParams extends BaseSalesforceParams {
+ caseId: string
+}
+
+export interface SalesforceDeleteCaseResponse {
+ success: boolean
+ output: {
+ id: string
+ deleted: boolean
+ metadata: {
+ operation: 'delete_case'
+ }
+ }
+}
+
+export interface SalesforceGetTasksParams extends BaseSalesforceParams {
+ taskId?: string
+ limit?: string
+ fields?: string
+ orderBy?: string
+}
+
+export interface SalesforceGetTasksResponse {
+ success: boolean
+ output: {
+ task?: any
+ tasks?: any[]
+ paging?: SalesforcePaging
+ metadata: {
+ operation: 'get_tasks'
+ totalReturned?: number
+ hasMore?: boolean
+ }
+ success: boolean
+ }
+}
+
+export interface SalesforceCreateTaskParams extends BaseSalesforceParams {
+ subject: string
+ status?: string
+ priority?: string
+ activityDate?: string
+ whoId?: string
+ whatId?: string
+ description?: string
+}
+
+export interface SalesforceCreateTaskResponse {
+ success: boolean
+ output: {
+ id: string
+ success: boolean
+ created: boolean
+ metadata: {
+ operation: 'create_task'
+ }
+ }
+}
+
+export interface SalesforceUpdateTaskParams extends BaseSalesforceParams {
+ taskId: string
+ subject?: string
+ status?: string
+ priority?: string
+ activityDate?: string
+ description?: string
+}
+
+export interface SalesforceUpdateTaskResponse {
+ success: boolean
+ output: {
+ id: string
+ updated: boolean
+ metadata: {
+ operation: 'update_task'
+ }
+ }
+}
+
+export interface SalesforceDeleteTaskParams extends BaseSalesforceParams {
+ taskId: string
+}
+
+export interface SalesforceDeleteTaskResponse {
+ success: boolean
+ output: {
+ id: string
+ deleted: boolean
+ metadata: {
+ operation: 'delete_task'
+ }
+ }
+}
+
+export interface SalesforceListReportsParams extends BaseSalesforceParams {
+ folderName?: string
+ searchTerm?: string
+}
+
export interface SalesforceListReportsResponse {
success: boolean
output: {
@@ -150,6 +558,10 @@ export interface SalesforceListReportsResponse {
}
}
+export interface SalesforceGetReportParams extends BaseSalesforceParams {
+ reportId: string
+}
+
export interface SalesforceGetReportResponse {
success: boolean
output: {
@@ -162,26 +574,34 @@ export interface SalesforceGetReportResponse {
}
}
+export interface SalesforceRunReportParams extends BaseSalesforceParams {
+ reportId: string
+ includeDetails?: string
+ filters?: string
+}
+
export interface SalesforceRunReportResponse {
success: boolean
output: {
reportId: string
- reportMetadata: any
- reportExtendedMetadata: any
- factMap: any
- groupingsDown: any
- groupingsAcross: any
- hasDetailRows: boolean
- allData: boolean
+ reportMetadata?: any
+ reportExtendedMetadata?: any
+ factMap?: any
+ groupingsDown?: any
+ groupingsAcross?: any
+ hasDetailRows?: boolean
+ allData?: boolean
metadata: {
operation: 'run_report'
- reportName: string
- reportFormat: string
+ reportName?: string
+ reportFormat?: string
}
success: boolean
}
}
+export interface SalesforceListReportTypesParams extends BaseSalesforceParams {}
+
export interface SalesforceListReportTypesResponse {
success: boolean
output: {
@@ -194,7 +614,10 @@ export interface SalesforceListReportTypesResponse {
}
}
-// Dashboard types
+export interface SalesforceListDashboardsParams extends BaseSalesforceParams {
+ folderName?: string
+}
+
export interface SalesforceListDashboardsResponse {
success: boolean
output: {
@@ -207,6 +630,10 @@ export interface SalesforceListDashboardsResponse {
}
}
+export interface SalesforceGetDashboardParams extends BaseSalesforceParams {
+ dashboardId: string
+}
+
export interface SalesforceGetDashboardResponse {
success: boolean
output: {
@@ -215,31 +642,38 @@ export interface SalesforceGetDashboardResponse {
components: any[]
metadata: {
operation: 'get_dashboard'
- dashboardName: string
- folderId: string
- runningUser: any
+ dashboardName?: string
+ folderId?: string
+ runningUser?: any
}
success: boolean
}
}
+export interface SalesforceRefreshDashboardParams extends BaseSalesforceParams {
+ dashboardId: string
+}
+
export interface SalesforceRefreshDashboardResponse {
success: boolean
output: {
dashboard: any
dashboardId: string
components: any[]
- status: any
+ status?: any
metadata: {
operation: 'refresh_dashboard'
- dashboardName: string
- refreshDate: string
+ dashboardName?: string
+ refreshDate?: string
}
success: boolean
}
}
-// Query types
+export interface SalesforceQueryParams extends BaseSalesforceParams {
+ query: string
+}
+
export interface SalesforceQueryResponse {
success: boolean
output: {
@@ -257,6 +691,10 @@ export interface SalesforceQueryResponse {
}
}
+export interface SalesforceQueryMoreParams extends BaseSalesforceParams {
+ nextRecordsUrl: string
+}
+
export interface SalesforceQueryMoreResponse {
success: boolean
output: {
@@ -273,20 +711,24 @@ export interface SalesforceQueryMoreResponse {
}
}
+export interface SalesforceDescribeObjectParams extends BaseSalesforceParams {
+ objectName: string
+}
+
export interface SalesforceDescribeObjectResponse {
success: boolean
output: {
objectName: string
- label: string
- labelPlural: string
- fields: any[]
- keyPrefix: string
- queryable: boolean
- createable: boolean
- updateable: boolean
- deletable: boolean
- childRelationships: any[]
- recordTypeInfos: any[]
+ label?: string
+ labelPlural?: string
+ fields?: any[]
+ keyPrefix?: string
+ queryable?: boolean
+ createable?: boolean
+ updateable?: boolean
+ deletable?: boolean
+ childRelationships?: any[]
+ recordTypeInfos?: any[]
metadata: {
operation: 'describe_object'
fieldCount: number
@@ -295,12 +737,14 @@ export interface SalesforceDescribeObjectResponse {
}
}
+export interface SalesforceListObjectsParams extends BaseSalesforceParams {}
+
export interface SalesforceListObjectsResponse {
success: boolean
output: {
objects: any[]
- encoding: string
- maxBatchSize: number
+ encoding?: string
+ maxBatchSize?: number
metadata: {
operation: 'list_objects'
totalReturned: number
@@ -309,7 +753,6 @@ export interface SalesforceListObjectsResponse {
}
}
-// Generic Salesforce response type for the block
export type SalesforceResponse =
| SalesforceGetAccountsResponse
| SalesforceCreateAccountResponse
@@ -319,6 +762,22 @@ export type SalesforceResponse =
| SalesforceCreateContactResponse
| SalesforceUpdateContactResponse
| SalesforceDeleteContactResponse
+ | SalesforceGetLeadsResponse
+ | SalesforceCreateLeadResponse
+ | SalesforceUpdateLeadResponse
+ | SalesforceDeleteLeadResponse
+ | SalesforceGetOpportunitiesResponse
+ | SalesforceCreateOpportunityResponse
+ | SalesforceUpdateOpportunityResponse
+ | SalesforceDeleteOpportunityResponse
+ | SalesforceGetCasesResponse
+ | SalesforceCreateCaseResponse
+ | SalesforceUpdateCaseResponse
+ | SalesforceDeleteCaseResponse
+ | SalesforceGetTasksResponse
+ | SalesforceCreateTaskResponse
+ | SalesforceUpdateTaskResponse
+ | SalesforceDeleteTaskResponse
| SalesforceListReportsResponse
| SalesforceGetReportResponse
| SalesforceRunReportResponse
@@ -330,4 +789,3 @@ export type SalesforceResponse =
| SalesforceQueryMoreResponse
| SalesforceDescribeObjectResponse
| SalesforceListObjectsResponse
- | { success: boolean; output: any } // Generic for leads, opportunities, cases, tasks
diff --git a/apps/sim/tools/salesforce/update_account.ts b/apps/sim/tools/salesforce/update_account.ts
index c8b8ef8a4..7927db59d 100644
--- a/apps/sim/tools/salesforce/update_account.ts
+++ b/apps/sim/tools/salesforce/update_account.ts
@@ -1,39 +1,13 @@
import { createLogger } from '@/lib/logs/console/logger'
+import type {
+ SalesforceUpdateAccountParams,
+ SalesforceUpdateAccountResponse,
+} from '@/tools/salesforce/types'
+import { getInstanceUrl } from '@/tools/salesforce/utils'
import type { ToolConfig } from '@/tools/types'
const logger = createLogger('SalesforceUpdateAccount')
-export interface SalesforceUpdateAccountParams {
- accessToken: string
- idToken?: string
- instanceUrl?: string
- accountId: string
- name?: string
- type?: string
- industry?: string
- phone?: string
- website?: string
- billingStreet?: string
- billingCity?: string
- billingState?: string
- billingPostalCode?: string
- billingCountry?: string
- description?: string
- annualRevenue?: string
- numberOfEmployees?: string
-}
-
-export interface SalesforceUpdateAccountResponse {
- success: boolean
- output: {
- id: string
- updated: boolean
- metadata: {
- operation: 'update_account'
- }
- }
-}
-
export const salesforceUpdateAccountTool: ToolConfig<
SalesforceUpdateAccountParams,
SalesforceUpdateAccountResponse
diff --git a/apps/sim/tools/salesforce/update_case.ts b/apps/sim/tools/salesforce/update_case.ts
index 67f5bdf6c..abe818a9c 100644
--- a/apps/sim/tools/salesforce/update_case.ts
+++ b/apps/sim/tools/salesforce/update_case.ts
@@ -1,27 +1,9 @@
+import type {
+ SalesforceUpdateCaseParams,
+ SalesforceUpdateCaseResponse,
+} from '@/tools/salesforce/types'
+import { getInstanceUrl } from '@/tools/salesforce/utils'
import type { ToolConfig } from '@/tools/types'
-import { getInstanceUrl } from './utils'
-
-export interface SalesforceUpdateCaseParams {
- accessToken: string
- idToken?: string
- instanceUrl?: string
- caseId: string
- subject?: string
- status?: string
- priority?: string
- description?: string
-}
-
-export interface SalesforceUpdateCaseResponse {
- success: boolean
- output: {
- id: string
- updated: boolean
- metadata: {
- operation: 'update_case'
- }
- }
-}
export const salesforceUpdateCaseTool: ToolConfig<
SalesforceUpdateCaseParams,
diff --git a/apps/sim/tools/salesforce/update_contact.ts b/apps/sim/tools/salesforce/update_contact.ts
index 6d64c705f..ba3bd1393 100644
--- a/apps/sim/tools/salesforce/update_contact.ts
+++ b/apps/sim/tools/salesforce/update_contact.ts
@@ -1,38 +1,13 @@
import { createLogger } from '@/lib/logs/console/logger'
+import type {
+ SalesforceUpdateContactParams,
+ SalesforceUpdateContactResponse,
+} from '@/tools/salesforce/types'
+import { getInstanceUrl } from '@/tools/salesforce/utils'
import type { ToolConfig } from '@/tools/types'
-import { getInstanceUrl } from './utils'
const logger = createLogger('SalesforceContacts')
-export interface SalesforceUpdateContactParams {
- accessToken: string
- idToken?: string
- instanceUrl?: string
- contactId: string
- lastName?: string
- firstName?: string
- email?: string
- phone?: string
- accountId?: string
- title?: string
- department?: string
- mailingStreet?: string
- mailingCity?: string
- mailingState?: string
- mailingPostalCode?: string
- mailingCountry?: string
- description?: string
-}
-
-export interface SalesforceUpdateContactResponse {
- success: boolean
- output: {
- id: string
- updated: boolean
- metadata: { operation: 'update_contact' }
- }
-}
-
export const salesforceUpdateContactTool: ToolConfig<
SalesforceUpdateContactParams,
SalesforceUpdateContactResponse
diff --git a/apps/sim/tools/salesforce/update_lead.ts b/apps/sim/tools/salesforce/update_lead.ts
index 612189a7b..e4727db6b 100644
--- a/apps/sim/tools/salesforce/update_lead.ts
+++ b/apps/sim/tools/salesforce/update_lead.ts
@@ -1,32 +1,9 @@
+import type {
+ SalesforceUpdateLeadParams,
+ SalesforceUpdateLeadResponse,
+} from '@/tools/salesforce/types'
+import { getInstanceUrl } from '@/tools/salesforce/utils'
import type { ToolConfig } from '@/tools/types'
-import { getInstanceUrl } from './utils'
-
-export interface SalesforceUpdateLeadParams {
- accessToken: string
- idToken?: string
- instanceUrl?: string
- leadId: string
- lastName?: string
- company?: string
- firstName?: string
- email?: string
- phone?: string
- status?: string
- leadSource?: string
- title?: string
- description?: string
-}
-
-export interface SalesforceUpdateLeadResponse {
- success: boolean
- output: {
- id: string
- updated: boolean
- metadata: {
- operation: 'update_lead'
- }
- }
-}
export const salesforceUpdateLeadTool: ToolConfig<
SalesforceUpdateLeadParams,
diff --git a/apps/sim/tools/salesforce/update_opportunity.ts b/apps/sim/tools/salesforce/update_opportunity.ts
index 70b2dce0d..2872daa4c 100644
--- a/apps/sim/tools/salesforce/update_opportunity.ts
+++ b/apps/sim/tools/salesforce/update_opportunity.ts
@@ -1,30 +1,9 @@
+import type {
+ SalesforceUpdateOpportunityParams,
+ SalesforceUpdateOpportunityResponse,
+} from '@/tools/salesforce/types'
+import { getInstanceUrl } from '@/tools/salesforce/utils'
import type { ToolConfig } from '@/tools/types'
-import { getInstanceUrl } from './utils'
-
-export interface SalesforceUpdateOpportunityParams {
- accessToken: string
- idToken?: string
- instanceUrl?: string
- opportunityId: string
- name?: string
- stageName?: string
- closeDate?: string
- accountId?: string
- amount?: string
- probability?: string
- description?: string
-}
-
-export interface SalesforceUpdateOpportunityResponse {
- success: boolean
- output: {
- id: string
- updated: boolean
- metadata: {
- operation: 'update_opportunity'
- }
- }
-}
export const salesforceUpdateOpportunityTool: ToolConfig<
SalesforceUpdateOpportunityParams,
diff --git a/apps/sim/tools/salesforce/update_task.ts b/apps/sim/tools/salesforce/update_task.ts
index 0dd62f824..3eaa6b4dc 100644
--- a/apps/sim/tools/salesforce/update_task.ts
+++ b/apps/sim/tools/salesforce/update_task.ts
@@ -1,28 +1,9 @@
+import type {
+ SalesforceUpdateTaskParams,
+ SalesforceUpdateTaskResponse,
+} from '@/tools/salesforce/types'
+import { getInstanceUrl } from '@/tools/salesforce/utils'
import type { ToolConfig } from '@/tools/types'
-import { getInstanceUrl } from './utils'
-
-export interface SalesforceUpdateTaskParams {
- accessToken: string
- idToken?: string
- instanceUrl?: string
- taskId: string
- subject?: string
- status?: string
- priority?: string
- activityDate?: string
- description?: string
-}
-
-export interface SalesforceUpdateTaskResponse {
- success: boolean
- output: {
- id: string
- updated: boolean
- metadata: {
- operation: 'update_task'
- }
- }
-}
export const salesforceUpdateTaskTool: ToolConfig<
SalesforceUpdateTaskParams,
diff --git a/helm/sim/examples/values-aws.yaml b/helm/sim/examples/values-aws.yaml
index 8fb7e167a..a36f6b1b8 100644
--- a/helm/sim/examples/values-aws.yaml
+++ b/helm/sim/examples/values-aws.yaml
@@ -44,9 +44,18 @@ app:
NODE_ENV: "production"
NEXT_TELEMETRY_DISABLED: "1"
-
- # AWS-specific environment variables
+
+ # AWS S3 Cloud Storage Configuration (RECOMMENDED for production)
+ # Create S3 buckets in your AWS account and configure IAM permissions
AWS_REGION: "us-west-2"
+ AWS_ACCESS_KEY_ID: "" # AWS access key (or use IRSA for EKS)
+ AWS_SECRET_ACCESS_KEY: "" # AWS secret key (or use IRSA for EKS)
+ S3_BUCKET_NAME: "workspace-files" # Workspace files
+ S3_KB_BUCKET_NAME: "knowledge-base" # Knowledge base documents
+ S3_EXECUTION_FILES_BUCKET_NAME: "execution-files" # Workflow execution outputs
+ S3_CHAT_BUCKET_NAME: "chat-files" # Deployed chat assets
+ S3_COPILOT_BUCKET_NAME: "copilot-files" # Copilot attachments
+ S3_PROFILE_PICTURES_BUCKET_NAME: "profile-pictures" # User avatars
# Realtime service
realtime:
diff --git a/helm/sim/examples/values-azure.yaml b/helm/sim/examples/values-azure.yaml
index 1ae5a468b..238b3e958 100644
--- a/helm/sim/examples/values-azure.yaml
+++ b/helm/sim/examples/values-azure.yaml
@@ -42,10 +42,23 @@ app:
# Optional: API Key Encryption (RECOMMENDED for production)
# Generate 64-character hex string using: openssl rand -hex 32
API_ENCRYPTION_KEY: "your-64-char-hex-api-encryption-key-here" # Optional but recommended
-
+
NODE_ENV: "production"
NEXT_TELEMETRY_DISABLED: "1"
+ # Azure Blob Storage Configuration (RECOMMENDED for production)
+ # Create a storage account and containers in your Azure subscription
+ AZURE_ACCOUNT_NAME: "simstudiostorageacct" # Azure storage account name
+ AZURE_ACCOUNT_KEY: "" # Storage account access key
+ # Or use connection string instead of account name/key:
+ # AZURE_CONNECTION_STRING: "DefaultEndpointsProtocol=https;AccountName=...;AccountKey=...;EndpointSuffix=core.windows.net"
+ AZURE_STORAGE_CONTAINER_NAME: "workspace-files" # Workspace files container
+ AZURE_STORAGE_KB_CONTAINER_NAME: "knowledge-base" # Knowledge base documents container
+ AZURE_STORAGE_EXECUTION_FILES_CONTAINER_NAME: "execution-files" # Workflow execution outputs
+ AZURE_STORAGE_CHAT_CONTAINER_NAME: "chat-files" # Deployed chat assets container
+ AZURE_STORAGE_COPILOT_CONTAINER_NAME: "copilot-files" # Copilot attachments container
+ AZURE_STORAGE_PROFILE_PICTURES_CONTAINER_NAME: "profile-pictures" # User avatars container
+
# Realtime service
realtime:
enabled: true
diff --git a/helm/sim/values.yaml b/helm/sim/values.yaml
index d588d06b7..d1c1b7138 100644
--- a/helm/sim/values.yaml
+++ b/helm/sim/values.yaml
@@ -116,8 +116,37 @@ app:
# Access Control (leave empty if not restricting login)
ALLOWED_LOGIN_EMAILS: "" # Comma-separated list of allowed email addresses for login
ALLOWED_LOGIN_DOMAINS: "" # Comma-separated list of allowed email domains for login
-
-
+
+ # SSO Configuration (Enterprise Single Sign-On)
+ # Set to "true" AFTER running the SSO registration script
+ SSO_ENABLED: "" # Enable SSO authentication ("true" to enable)
+ NEXT_PUBLIC_SSO_ENABLED: "" # Show SSO login button in UI ("true" to enable)
+
+ # AWS S3 Cloud Storage Configuration (optional - for file storage)
+ # If configured, files will be stored in S3 instead of local storage
+ AWS_REGION: "" # AWS region (e.g., "us-east-1")
+ AWS_ACCESS_KEY_ID: "" # AWS access key ID
+ AWS_SECRET_ACCESS_KEY: "" # AWS secret access key
+ S3_BUCKET_NAME: "" # S3 bucket for workspace files
+ S3_KB_BUCKET_NAME: "" # S3 bucket for knowledge base files
+ S3_EXECUTION_FILES_BUCKET_NAME: "" # S3 bucket for workflow execution files
+ S3_CHAT_BUCKET_NAME: "" # S3 bucket for deployed chat files
+ S3_COPILOT_BUCKET_NAME: "" # S3 bucket for copilot files
+ S3_PROFILE_PICTURES_BUCKET_NAME: "" # S3 bucket for user profile pictures
+
+ # Azure Blob Storage Configuration (optional - for file storage)
+ # If configured, files will be stored in Azure Blob instead of local storage
+ # Note: Azure Blob takes precedence over S3 if both are configured
+ AZURE_ACCOUNT_NAME: "" # Azure storage account name
+ AZURE_ACCOUNT_KEY: "" # Azure storage account key
+ AZURE_CONNECTION_STRING: "" # Azure connection string (alternative to account name/key)
+ AZURE_STORAGE_CONTAINER_NAME: "" # Azure container for workspace files
+ AZURE_STORAGE_KB_CONTAINER_NAME: "" # Azure container for knowledge base files
+ AZURE_STORAGE_EXECUTION_FILES_CONTAINER_NAME: "" # Azure container for workflow execution files
+ AZURE_STORAGE_CHAT_CONTAINER_NAME: "" # Azure container for deployed chat files
+ AZURE_STORAGE_COPILOT_CONTAINER_NAME: "" # Azure container for copilot files
+ AZURE_STORAGE_PROFILE_PICTURES_CONTAINER_NAME: "" # Azure container for user profile pictures
+
# Service configuration
service:
type: ClusterIP
From 36bdccb4494c2fe6074153d885078b53b697b40a Mon Sep 17 00:00:00 2001
From: Waleed
Date: Thu, 18 Dec 2025 13:24:32 -0800
Subject: [PATCH 13/19] fix(ui): fixed visibility issue on reset passowrd page
(#2456)
---
apps/sim/app/(auth)/login/login-form.tsx | 4 ++--
apps/sim/app/_shell/providers/theme-provider.tsx | 1 +
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/apps/sim/app/(auth)/login/login-form.tsx b/apps/sim/app/(auth)/login/login-form.tsx
index bb3d22d1f..775bf9570 100644
--- a/apps/sim/app/(auth)/login/login-form.tsx
+++ b/apps/sim/app/(auth)/login/login-form.tsx
@@ -573,10 +573,10 @@ export default function LoginPage({
@@ -145,7 +144,6 @@ export default async function Page({ params }: { params: Promise<{ slug: string
className='h-[160px] w-full object-cover'
sizes='(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw'
loading='lazy'
- unoptimized
/>