Files
sim/apps/sim/lib/workflows/application/execute-workflow.ts
T
Theodore Li 6d3e484fb3 fix(api): align v2 permissions and resource behavior (#6557)
* fix(api): align v2 permissions and resource behavior

* fix(api): refine resource authorization boundaries

* fix(tables): restore large durable imports

* fix(files): classify missing archive targets
2026-08-11 17:31:27 -04:00

61 lines
2.3 KiB
TypeScript

import type { Principal } from '@sim/auth/principal'
import { resolvePrincipalAttribution } from '@sim/auth/principal'
import { defineAuthorizedWorkflowUseCase } from '@/lib/workflows/application/authorized-workflow-use-case'
import { resolveActiveWorkflowApplicationContext } from '@/lib/workflows/application/context'
import { workflowOperations } from '@/lib/workflows/application/operations'
import {
type ExecuteWorkflowServiceResult,
executeWorkflowService,
} from '@/lib/workflows/executor/execute-service'
export interface ExecuteWorkflowInput {
workflowId: string
requestId: string
input: unknown
executionId?: string
includeFileBase64?: boolean
base64MaxBytes?: number
selectedOutputs?: string[]
requestedTimeoutSeconds?: number
abortSignal?: AbortSignal
mode: 'sync' | 'async' | 'stream'
requestHeaders: Headers
includeThinking?: boolean
includeToolCalls?: boolean
}
function authenticatesExecutionCredentials(principal: Principal): boolean {
return principal.kind !== 'workspace_api_key'
}
export const executeWorkflowOperation = defineAuthorizedWorkflowUseCase({
operation: workflowOperations.execute,
resolveContext: ({ input }: { input: ExecuteWorkflowInput }) =>
resolveActiveWorkflowApplicationContext({ workflowId: input.workflowId }),
async execute({ principal, context, input }): Promise<ExecuteWorkflowServiceResult> {
const attribution = resolvePrincipalAttribution(principal, {
workspaceBillingOwnerUserId: context.billedAccountUserId,
})
return executeWorkflowService({
workflowId: context.workflowId,
userId: attribution.attributedUserId,
input: input.input,
triggerType: 'api',
requestId: input.requestId,
executionId: input.executionId,
useAuthenticatedUserAsActor: authenticatesExecutionCredentials(principal),
workflowRecord: context.workflow,
includeFileBase64: input.includeFileBase64,
base64MaxBytes: input.base64MaxBytes,
selectedOutputs: input.selectedOutputs,
rateLimitCounter: input.mode === 'async' ? 'async' : 'sync',
requestedTimeoutSeconds: input.requestedTimeoutSeconds,
abortSignal: input.abortSignal,
mode: input.mode,
requestHeaders: input.requestHeaders,
includeThinking: input.includeThinking,
includeToolCalls: input.includeToolCalls,
})
},
})