import {z} from 'zod' export type TaskMock = {executionTime?: number | undefined, output?: {[key: string]: Record} | undefined, queueWaitTime?: number | undefined, status?: ('IN_PROGRESS' | 'FAILED' | 'FAILED_WITH_TERMINAL_ERROR' | 'COMPLETED' | 'CANCELED') | undefined}; export type CacheConfig = {key?: string | undefined, ttlInSecond?: number | undefined}; export type SchemaDef = {createTime?: number | undefined, createdBy?: string | undefined, data?: {[key: string]: Record} | undefined, externalRef?: string | undefined, name: string, ownerApp?: string | undefined, type: 'JSON' | 'AVRO' | 'PROTOBUF', updateTime?: number | undefined, updatedBy?: string | undefined, version: number}; export type RateLimitConfig = {concurrentExecLimit?: number | undefined, policy?: ('QUEUE' | 'REJECT') | undefined, rateLimitKey?: string | undefined}; export type StateChangeEvent = {payload?: {[key: string]: Record} | undefined, type: string}; export type SubWorkflowParams = {idempotencyKey?: string | undefined, idempotencyStrategy?: ('FAIL' | 'RETURN_EXISTING' | 'FAIL_ON_RUNNING') | undefined, name?: string | undefined, priority?: Record | undefined, taskToDomain?: {[key: string]: string} | undefined, version?: number | undefined, workflowDefinition?: Record | undefined}; export type TaskDef = {backoffJitterMs?: number | undefined, backoffScaleFactor?: number | undefined, baseType?: string | undefined, concurrentExecLimit?: number | undefined, createTime?: number | undefined, createdBy?: string | undefined, description?: string | undefined, enforceSchema?: boolean | undefined, executionNameSpace?: string | undefined, inputKeys?: Array | undefined, inputSchema?: SchemaDef | undefined, inputTemplate?: {[key: string]: Record} | undefined, isolationGroupId?: string | undefined, maxRetryDelaySeconds?: number | undefined, name?: string | undefined, outputKeys?: Array | undefined, outputSchema?: SchemaDef | undefined, ownerApp?: string | undefined, ownerEmail?: string | undefined, pollTimeoutSeconds?: number | undefined, rateLimitFrequencyInSeconds?: number | undefined, rateLimitPerFrequency?: number | undefined, responseTimeoutSeconds?: number | undefined, retryCount?: number | undefined, retryDelaySeconds?: number | undefined, retryLogic?: ('FIXED' | 'EXPONENTIAL_BACKOFF' | 'LINEAR_BACKOFF') | undefined, runtimeMetadata?: Array | undefined, taskStatusListenerEnabled?: boolean | undefined, timeoutPolicy?: ('RETRY' | 'TIME_OUT_WF' | 'ALERT_ONLY') | undefined, timeoutSeconds: number, totalTimeoutSeconds?: number | undefined, updateTime?: number | undefined, updatedBy?: string | undefined}; export type WorkflowTask = {asyncComplete?: boolean | undefined, cacheConfig?: CacheConfig | undefined, caseExpression?: string | undefined, caseValueParam?: string | undefined, decisionCases?: {[key: string]: Array} | undefined, defaultCase?: Array | undefined, defaultExclusiveJoinTask?: Array | undefined, description?: string | undefined, dynamicForkJoinTasksParam?: string | undefined, dynamicForkTasksInputParamName?: string | undefined, dynamicForkTasksParam?: string | undefined, dynamicTaskNameParam?: string | undefined, evaluatorType?: string | undefined, expression?: string | undefined, forkTasks?: Array> | undefined, inputParameters?: {[key: string]: Record} | undefined, items?: string | undefined, joinMode?: ('SYNC' | 'ASYNC') | undefined, joinOn?: Array | undefined, joinStatus?: string | undefined, loopCondition?: string | undefined, loopOver?: Array | undefined, metadata?: {[key: string]: Record} | undefined, name?: string | undefined, onStateChange?: {[key: string]: Array} | undefined, optional?: boolean | undefined, permissive?: boolean | undefined, rateLimited?: boolean | undefined, retryCount?: number | undefined, scriptExpression?: string | undefined, sink?: string | undefined, startDelay?: number | undefined, subWorkflowParam?: SubWorkflowParams | undefined, taskDefinition?: TaskDef | undefined, taskReferenceName?: string | undefined, type?: string | undefined, workflowTaskType?: ('SIMPLE' | 'DYNAMIC' | 'FORK_JOIN' | 'FORK_JOIN_DYNAMIC' | 'DECISION' | 'SWITCH' | 'JOIN' | 'DO_WHILE' | 'SUB_WORKFLOW' | 'START_WORKFLOW' | 'EVENT' | 'WAIT' | 'HUMAN' | 'USER_DEFINED' | 'HTTP' | 'LAMBDA' | 'INLINE' | 'EXCLUSIVE_JOIN' | 'TERMINATE' | 'KAFKA_PUBLISH' | 'JSON_JQ_TRANSFORM' | 'SET_VARIABLE' | 'NOOP' | 'LLM_TEXT_COMPLETE' | 'LLM_CHAT_COMPLETE' | 'LLM_INDEX_TEXT' | 'LLM_SEARCH_INDEX' | 'LLM_GENERATE_EMBEDDINGS' | 'LLM_STORE_EMBEDDINGS' | 'LLM_GET_EMBEDDINGS' | 'LIST_MCP_TOOLS' | 'CALL_MCP_TOOL' | 'PULL_WORKFLOW_MESSAGES' | 'AGENT' | 'GET_AGENT_CARD' | 'CANCEL_AGENT') | undefined}; export type WorkflowDef = {cacheConfig?: CacheConfig | undefined, createTime?: number | undefined, createdBy?: string | undefined, description?: string | undefined, enforceSchema?: boolean | undefined, failureWorkflow?: string | undefined, failureWorkflowVersion?: number | undefined, inputParameters?: Array | undefined, inputSchema?: SchemaDef | undefined, inputTemplate?: {[key: string]: Record} | undefined, maskedFields?: Array | undefined, metadata?: {[key: string]: Record} | undefined, name?: string | undefined, outputParameters?: {[key: string]: Record} | undefined, outputSchema?: SchemaDef | undefined, ownerApp?: string | undefined, ownerEmail?: string | undefined, rateLimitConfig?: RateLimitConfig | undefined, restartable?: boolean | undefined, schemaVersion?: number | undefined, tasks: Array, timeoutPolicy?: ('TIME_OUT_WF' | 'ALERT_ONLY') | undefined, timeoutSeconds: number, updateTime?: number | undefined, updatedBy?: string | undefined, variables?: {[key: string]: Record} | undefined, version?: number | undefined, workflowStatusListenerEnabled?: boolean | undefined, workflowStatusListenerSink?: string | undefined}; export type WorkflowTestRequest = {correlationId?: string | undefined, createdBy?: string | undefined, externalInputPayloadStoragePath?: string | undefined, idempotencyKey?: string | undefined, idempotencyStrategy?: ('FAIL' | 'RETURN_EXISTING' | 'FAIL_ON_RUNNING') | undefined, input?: {[key: string]: Record} | undefined, maxLoops?: number | undefined, mockTtlSeconds?: number | undefined, name: string, priority?: number | undefined, subWorkflowTestRequest?: {[key: string]: WorkflowTestRequest} | undefined, taskRefToMockOutput?: {[key: string]: Array} | undefined, taskToDomain?: {[key: string]: string} | undefined, version?: number | undefined, workflowDef?: WorkflowDef | undefined}; export type CreateApiApiWorkflowTestArgs = {body: WorkflowTestRequest}; export type CreateApiApiWorkflowTestOptions = {baseUrl?: string | undefined, apiKey?: string | undefined, fetch?: typeof fetch | undefined}; export const aggregateTokenUsage = z.object({completionTokens: z.number().int().optional(), promptTokens: z.number().int().optional(), totalTokens: z.number().int().optional()}); export const executionMetadata = z.object({additionalContext: z.record(z.string(), z.object({})).optional(), additionalContextMap: z.record(z.string(), z.object({})).optional(), clientReceiveTime: z.number().int().optional(), clientSendTime: z.number().int().optional(), empty: z.boolean().optional(), executionDuration: z.number().int().optional(), executionEndTime: z.number().int().optional(), executionStartTime: z.number().int().optional(), pollNetworkLatency: z.number().int().optional(), serverSendTime: z.number().int().optional(), updateNetworkLatency: z.number().int().optional()}); export const schemaDef = z.object({createTime: z.number().int().optional(), createdBy: z.string().optional(), data: z.record(z.string(), z.object({})).optional(), externalRef: z.string().optional(), name: z.string(), ownerApp: z.string().optional(), type: z.enum(["JSON", "AVRO", "PROTOBUF"]), updateTime: z.number().int().optional(), updatedBy: z.string().optional(), version: z.number().int()}); export const taskDef = z.object({backoffJitterMs: z.number().int().gte(0).optional(), backoffScaleFactor: z.number().int().gte(1).optional(), baseType: z.string().optional(), concurrentExecLimit: z.number().int().optional(), createTime: z.number().int().optional(), createdBy: z.string().optional(), description: z.string().optional(), enforceSchema: z.boolean().optional(), executionNameSpace: z.string().optional(), inputKeys: z.array(z.string()).optional(), inputSchema: schemaDef.optional(), inputTemplate: z.record(z.string(), z.object({})).optional(), isolationGroupId: z.string().optional(), maxRetryDelaySeconds: z.number().int().gte(0).optional(), name: z.string().min(1).optional(), outputKeys: z.array(z.string()).optional(), outputSchema: schemaDef.optional(), ownerApp: z.string().optional(), ownerEmail: z.string().optional(), pollTimeoutSeconds: z.number().int().gte(0).optional(), rateLimitFrequencyInSeconds: z.number().int().optional(), rateLimitPerFrequency: z.number().int().optional(), responseTimeoutSeconds: z.number().int().gte(1).optional(), retryCount: z.number().int().gte(0).optional(), retryDelaySeconds: z.number().int().optional(), retryLogic: z.enum(["FIXED", "EXPONENTIAL_BACKOFF", "LINEAR_BACKOFF"]).optional(), runtimeMetadata: z.array(z.string()).optional(), taskStatusListenerEnabled: z.boolean().optional(), timeoutPolicy: z.enum(["RETRY", "TIME_OUT_WF", "ALERT_ONLY"]).optional(), timeoutSeconds: z.number().int(), totalTimeoutSeconds: z.number().int().gte(0).optional(), updateTime: z.number().int().optional(), updatedBy: z.string().optional()}); export const cacheConfig = z.object({key: z.string().optional(), ttlInSecond: z.number().int().optional()}); export const stateChangeEvent = z.object({payload: z.record(z.string(), z.object({})).optional(), type: z.string()}); export const subWorkflowParams = z.object({idempotencyKey: z.string().optional(), idempotencyStrategy: z.enum(["FAIL", "RETURN_EXISTING", "FAIL_ON_RUNNING"]).optional(), name: z.string().optional(), priority: z.object({}).optional(), taskToDomain: z.record(z.string(), z.string()).optional(), version: z.number().int().optional(), workflowDefinition: z.object({}).optional()}); export const workflowTask: z.ZodType = z.object({asyncComplete: z.boolean().optional(), cacheConfig: cacheConfig.optional(), caseExpression: z.string().optional(), caseValueParam: z.string().optional(), decisionCases: z.record(z.string(), z.array(z.lazy(() => workflowTask))).optional(), defaultCase: z.array(z.lazy(() => workflowTask)).optional(), defaultExclusiveJoinTask: z.array(z.string()).optional(), description: z.string().optional(), dynamicForkJoinTasksParam: z.string().optional(), dynamicForkTasksInputParamName: z.string().optional(), dynamicForkTasksParam: z.string().optional(), dynamicTaskNameParam: z.string().optional(), evaluatorType: z.string().optional(), expression: z.string().optional(), forkTasks: z.array(z.array(z.lazy(() => workflowTask))).optional(), inputParameters: z.record(z.string(), z.object({})).optional(), items: z.string().optional(), joinMode: z.enum(["SYNC", "ASYNC"]).optional(), joinOn: z.array(z.string()).optional(), joinStatus: z.string().optional(), loopCondition: z.string().optional(), loopOver: z.array(z.lazy(() => workflowTask)).optional(), metadata: z.record(z.string(), z.object({})).optional(), name: z.string().min(1).optional(), onStateChange: z.record(z.string(), z.array(stateChangeEvent)).optional(), optional: z.boolean().optional(), permissive: z.boolean().optional(), rateLimited: z.boolean().optional(), retryCount: z.number().int().optional(), scriptExpression: z.string().optional(), sink: z.string().optional(), startDelay: z.number().int().optional(), subWorkflowParam: subWorkflowParams.optional(), taskDefinition: taskDef.optional(), taskReferenceName: z.string().min(1).optional(), type: z.string().optional(), workflowTaskType: z.enum(["SIMPLE", "DYNAMIC", "FORK_JOIN", "FORK_JOIN_DYNAMIC", "DECISION", "SWITCH", "JOIN", "DO_WHILE", "SUB_WORKFLOW", "START_WORKFLOW", "EVENT", "WAIT", "HUMAN", "USER_DEFINED", "HTTP", "LAMBDA", "INLINE", "EXCLUSIVE_JOIN", "TERMINATE", "KAFKA_PUBLISH", "JSON_JQ_TRANSFORM", "SET_VARIABLE", "NOOP", "LLM_TEXT_COMPLETE", "LLM_CHAT_COMPLETE", "LLM_INDEX_TEXT", "LLM_SEARCH_INDEX", "LLM_GENERATE_EMBEDDINGS", "LLM_STORE_EMBEDDINGS", "LLM_GET_EMBEDDINGS", "LIST_MCP_TOOLS", "CALL_MCP_TOOL", "PULL_WORKFLOW_MESSAGES", "AGENT", "GET_AGENT_CARD", "CANCEL_AGENT"]).optional()}); export const task = z.object({callbackAfterSeconds: z.number().int().optional(), callbackFromWorker: z.boolean().optional(), correlationId: z.string().optional(), domain: z.string().optional(), endTime: z.number().int().optional(), executed: z.boolean().optional(), executionMetadata: executionMetadata.optional(), executionNameSpace: z.string().optional(), externalInputPayloadStoragePath: z.string().optional(), externalOutputPayloadStoragePath: z.string().optional(), firstStartTime: z.number().int().optional(), inputData: z.record(z.string(), z.object({})).optional(), isolationGroupId: z.string().optional(), iteration: z.number().int().optional(), loopOverTask: z.boolean().optional(), outputData: z.record(z.string(), z.object({})).optional(), parentTaskId: z.string().optional(), pollCount: z.number().int().optional(), queueWaitTime: z.number().int().optional(), rateLimitFrequencyInSeconds: z.number().int().optional(), rateLimitPerFrequency: z.number().int().optional(), reasonForIncompletion: z.string().optional(), referenceTaskName: z.string().optional(), responseTimeoutSeconds: z.number().int().optional(), retried: z.boolean().optional(), retriedTaskId: z.string().optional(), retryCount: z.number().int().optional(), runtimeMetadata: z.record(z.string(), z.string()).optional(), scheduledTime: z.number().int().optional(), seq: z.number().int().optional(), startDelayInSeconds: z.number().int().optional(), startTime: z.number().int().optional(), status: z.enum(["IN_PROGRESS", "CANCELED", "FAILED", "FAILED_WITH_TERMINAL_ERROR", "COMPLETED", "COMPLETED_WITH_ERRORS", "SCHEDULED", "TIMED_OUT", "SKIPPED"]).optional(), subWorkflowId: z.string().optional(), subworkflowChanged: z.boolean().optional(), taskDefName: z.string().optional(), taskDefinition: taskDef.optional(), taskId: z.string().optional(), taskType: z.string().optional(), updateTime: z.number().int().optional(), workerId: z.string().optional(), workflowInstanceId: z.string().optional(), workflowPriority: z.number().int().optional(), workflowTask: workflowTask.optional(), workflowType: z.string().optional()}); export const rateLimitConfig = z.object({concurrentExecLimit: z.number().int().optional(), policy: z.enum(["QUEUE", "REJECT"]).optional(), rateLimitKey: z.string().optional()}); export const workflowDef = z.object({cacheConfig: cacheConfig.optional(), createTime: z.number().int().optional(), createdBy: z.string().optional(), description: z.string().optional(), enforceSchema: z.boolean().optional(), failureWorkflow: z.string().optional(), failureWorkflowVersion: z.number().int().optional(), inputParameters: z.array(z.string()).optional(), inputSchema: schemaDef.optional(), inputTemplate: z.record(z.string(), z.object({})).optional(), maskedFields: z.array(z.string()).optional(), metadata: z.record(z.string(), z.object({})).optional(), name: z.string().min(1).optional(), outputParameters: z.record(z.string(), z.object({})).optional(), outputSchema: schemaDef.optional(), ownerApp: z.string().optional(), ownerEmail: z.string().optional(), rateLimitConfig: rateLimitConfig.optional(), restartable: z.boolean().optional(), schemaVersion: z.number().int().gte(2).lte(2).optional(), tasks: z.array(workflowTask), timeoutPolicy: z.enum(["TIME_OUT_WF", "ALERT_ONLY"]).optional(), timeoutSeconds: z.number().int(), updateTime: z.number().int().optional(), updatedBy: z.string().optional(), variables: z.record(z.string(), z.object({})).optional(), version: z.number().int().optional(), workflowStatusListenerEnabled: z.boolean().optional(), workflowStatusListenerSink: z.string().optional()}); export const workflow: z.ZodType = z.object({aggregateTokenUsage: aggregateTokenUsage.optional(), correlationId: z.string().optional(), createTime: z.number().int().optional(), createdBy: z.string().optional(), endTime: z.number().int().optional(), event: z.string().optional(), externalInputPayloadStoragePath: z.string().optional(), externalOutputPayloadStoragePath: z.string().optional(), failedReferenceTaskNames: z.array(z.string()).optional(), failedTaskNames: z.array(z.string()).optional(), history: z.array(z.lazy(() => workflow)).optional(), idempotencyKey: z.string().optional(), input: z.record(z.string(), z.object({})).optional(), lastRetriedTime: z.number().int().optional(), output: z.record(z.string(), z.object({})).optional(), ownerApp: z.string().optional(), parentWorkflowId: z.string().optional(), parentWorkflowTaskId: z.string().optional(), priority: z.number().int().gte(0).lte(99).optional(), rateLimitKey: z.string().optional(), rateLimited: z.boolean().optional(), reRunFromWorkflowId: z.string().optional(), reasonForIncompletion: z.string().optional(), startTime: z.number().int().optional(), status: z.enum(["RUNNING", "COMPLETED", "FAILED", "TIMED_OUT", "TERMINATED", "PAUSED"]).optional(), taskToDomain: z.record(z.string(), z.string()).optional(), tasks: z.array(task).optional(), updateTime: z.number().int().optional(), updatedBy: z.string().optional(), variables: z.record(z.string(), z.object({})).optional(), workflowDefinition: workflowDef.optional(), workflowId: z.string().optional(), workflowName: z.string().optional(), workflowVersion: z.number().int().optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Test workflow execution using mock data * * POST /api/workflow/test */ export const createApiApiWorkflowTest = async (args: CreateApiApiWorkflowTestArgs, options?: CreateApiApiWorkflowTestOptions) => { const {baseUrl = "https://developer.orkescloud.com", fetch: fetchFn = fetch, apiKey} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (apiKey !== undefined) headers.set("X-Authorization", apiKey) const url = `${baseUrl.replace(/\/+$/, '')}/api/workflow/test${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(workflow, await res.json()) };