mirror of
https://github.com/simstudioai/sim.git
synced 2026-08-30 17:05:18 +08:00
6d3e484fb3
* 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
61 lines
2.3 KiB
TypeScript
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,
|
|
})
|
|
},
|
|
})
|