import {z} from 'zod' export type GetApiWorkflowsWorkflowIdDefinitionOptions = {baseUrl?: string | undefined, ApiKeyAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const workflowDefinitionNodePosition = z.object({x: z.number(), y: z.number()}); export const workflowNodeStartConfig = z.object({}); export const workflowNodeSendTextConfig = z.object({message: z.union([z.string(), z.record(z.string(), z.unknown())]), phone_number_id: z.string().nullable().optional(), whatsapp_config_id: z.string().nullable().optional(), to_phone_number: z.string().nullable().optional(), delay_seconds: z.number().int().gte(0).nullable().optional(), provider_model_id: z.string().nullable().optional(), provider_model_name: z.string().nullable().optional(), ai_field_config: z.record(z.string(), z.unknown()).optional()}); export const workflowNodeSendTemplateConfig = z.object({template_id: z.string(), template_name: z.string().nullable().optional(), parameters: z.unknown(), phone_number_id: z.string().nullable().optional(), whatsapp_config_id: z.string().nullable().optional(), to_phone_number: z.string().nullable().optional(), provider_model_id: z.string().nullable().optional(), provider_model_name: z.string().nullable().optional(), ai_field_config: z.record(z.string(), z.unknown()).optional()}); export const workflowNodeInteractiveButton = z.object({id: z.string(), title: z.string().max(20)}); export const workflowNodeInteractiveListRow = z.object({id: z.string(), title: z.string().max(24), description: z.string().max(72).optional()}); export const workflowNodeInteractiveListSection = z.object({title: z.string().optional(), rows: z.array(workflowNodeInteractiveListRow)}); export const workflowNodeSendInteractiveConfig = z.object({interactive_type: z.enum(["button", "list", "cta_url", "flow", "product", "product_list", "catalog_message", "location_request_message"]), body_text: z.union([z.string().max(1024), z.record(z.string(), z.unknown())]), footer_text: z.string().nullable().optional(), header_type: z.enum(["none", "text", "image", "video", "document", "null"]).nullable().optional(), header_text: z.string().nullable().optional(), header_media_url: z.string().nullable().optional(), buttons: z.array(workflowNodeInteractiveButton).optional(), list_button_text: z.string().nullable().optional(), list_sections: z.array(workflowNodeInteractiveListSection).optional(), cta_display_text: z.string().nullable().optional(), cta_url: z.string().nullable().optional(), flow_id: z.string().nullable().optional(), flow_cta: z.string().nullable().optional(), flow_token: z.string().nullable().optional(), flow_action: z.enum(["navigate", "data_exchange", "null"]).nullable().optional(), flow_action_payload: z.record(z.string(), z.unknown()).nullable().optional(), header_config: z.record(z.string(), z.unknown()).nullable().optional(), action_config: z.record(z.string(), z.unknown()).nullable().optional(), phone_number_id: z.string().nullable().optional(), whatsapp_config_id: z.string().nullable().optional(), to_phone_number: z.string().nullable().optional(), provider_model_id: z.string().nullable().optional(), provider_model_name: z.string().nullable().optional(), ai_field_config: z.record(z.string(), z.unknown()).optional()}); export const workflowNodeWaitForResponseConfig = z.object({has_timeout: z.boolean().optional(), timeout_seconds: z.number().int().nullable().optional(), save_response_to: z.string().nullable().optional()}); export const workflowNodeDecideCondition = z.object({id: z.string(), label: z.string(), description: z.string().nullable().optional()}); export const workflowNodeDecideConfig = z.object({decision_type: z.enum(["ai", "function"]), conditions: z.array(workflowNodeDecideCondition), llm_configuration: z.record(z.string(), z.unknown()), function_id: z.string().nullable().optional(), function_name: z.string().nullable().optional(), provider_model_id: z.string().nullable().optional(), provider_model_name: z.string().nullable().optional(), llm_temperature: z.number().nullable().optional(), llm_max_tokens: z.number().int().nullable().optional()}); export const workflowNodeFunctionConfig = z.object({function_id: z.string(), function_name: z.string().nullable().optional(), save_response_to: z.string().nullable().optional()}); export const workflowNodeWebhookConfig = z.object({url: z.string(), method: z.enum(["GET", "POST", "PUT", "PATCH", "DELETE"]).optional(), headers: z.union([z.record(z.string(), z.string()), z.string()]).optional(), body_template: z.unknown(), provider_model_id: z.string().nullable().optional(), provider_model_name: z.string().nullable().optional(), ai_field_config: z.record(z.string(), z.unknown()).optional(), save_response_to: z.string().nullable().optional()}); export const workflowNodeAgentFunctionTool = z.object({name: z.string().optional(), description: z.string().nullable().optional(), function_id: z.string().nullable().optional(), function_name: z.string().nullable().optional(), input_schema: z.record(z.string(), z.unknown()).optional()}); export const workflowNodeAgentWebhook = z.object({name: z.string().optional(), description: z.string().nullable().optional(), url: z.string().nullable().optional(), http_method: z.string().nullable().optional(), headers: z.record(z.string(), z.unknown()).nullable().optional(), body: z.unknown(), body_schema: z.record(z.string(), z.unknown()).nullable().optional(), jmespath_query: z.string().nullable().optional(), ai_field_config: z.record(z.string(), z.unknown()).optional()}); export const workflowNodeAgentKnowledgeBase = z.object({name: z.string().optional(), description: z.string().nullable().optional(), knowledge_base_text: z.string().nullable().optional()}); export const workflowNodeAgentMcpServer = z.object({name: z.string().optional(), description: z.string().nullable().optional(), url: z.string().nullable().optional(), headers: z.record(z.string(), z.unknown()).nullable().optional()}); export const workflowNodeAgentResource = z.object({id: z.string().nullable().optional(), resource_type: z.literal("github_repository").optional(), repo_url: z.string().optional(), owner: z.string().nullable().optional(), repo_name: z.string().nullable().optional(), branch: z.string().nullable().optional(), pat: z.string().nullable().optional(), has_pat: z.boolean().nullable().optional(), imported_missing_pat: z.boolean().nullable().optional()}); export const workflowNodeAgentConfig = z.object({system_prompt: z.string().nullable().optional(), provider_model_id: z.string().nullable().optional(), provider_model_name: z.string().nullable().optional(), temperature: z.number().nullable().optional(), max_iterations: z.number().int().nullable().optional(), max_tokens: z.number().int().nullable().optional(), reasoning_effort: z.enum(["none", "minimal", "low", "medium", "high", "xhigh", "null"]).nullable().optional(), observer_prompt_mode: z.enum(["analysis_only", "interactive_chat"]).optional(), message_delivery_mode: z.enum(["auto_send_assistant_text", "tool_only"]).optional(), enabled_default_tools: z.array(z.string()).optional(), default_tool_configs: z.object({emit_event: z.object({event_definition_ids: z.array(z.string()).optional()}).optional()}).and(z.record(z.string(), z.unknown())).optional(), flow_agent_function_tools: z.array(workflowNodeAgentFunctionTool).optional(), flow_agent_webhooks: z.array(workflowNodeAgentWebhook).optional(), flow_agent_knowledge_bases: z.array(workflowNodeAgentKnowledgeBase).optional(), flow_agent_mcp_servers: z.array(workflowNodeAgentMcpServer).optional(), flow_agent_resources: z.array(workflowNodeAgentResource).optional()}); export const workflowNodeCallConfig = z.object({workflow_id: z.string().nullable().optional(), workflow_name: z.string().nullable().optional(), save_error_to: z.string().nullable().optional()}); export const workflowNodeHandoffConfig = z.object({reason: z.string().nullable().optional(), context_data: z.unknown()}); export const workflowNodeSetVariableConfig = z.object({variable_name: z.string(), variable_value: z.unknown(), value_type: z.enum(["string", "number", "boolean", "json"]).optional()}); export const workflowNodeEmitEventConfig = z.object({event_name: z.string(), properties: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()]).nullable()).optional(), occurred_at: z.string().nullable().optional()}); export const workflowDefinitionNodeData = z.object({node_type: z.string(), config: z.union([workflowNodeStartConfig, workflowNodeSendTextConfig, workflowNodeSendTemplateConfig, workflowNodeSendInteractiveConfig, workflowNodeWaitForResponseConfig, workflowNodeDecideConfig, workflowNodeFunctionConfig, workflowNodeWebhookConfig, workflowNodeAgentConfig, workflowNodeCallConfig, workflowNodeHandoffConfig, workflowNodeSetVariableConfig, workflowNodeEmitEventConfig, z.record(z.string(), z.unknown())]), display_name: z.string()}); export const workflowDefinitionNode = z.object({id: z.string(), type: z.string(), position: workflowDefinitionNodePosition, data: workflowDefinitionNodeData}); export const workflowDefinitionEdge = z.object({id: z.string(), source: z.string(), target: z.string(), label: z.string().nullable().optional(), type: z.string(), flow_condition_id: z.string().nullable().optional()}); export const workflowDefinition = z.object({nodes: z.array(workflowDefinitionNode), edges: z.array(workflowDefinitionEdge)}); export const workflowWithDefinition = z.object({id: z.string(), name: z.string(), slug: z.string(), description: z.string().nullable().optional(), status: z.enum(["draft", "active", "archived"]), lock_version: z.number().int().nullable().optional(), message_debounce_seconds: z.number().int().nullable().optional(), agent_default_tools_version: z.number().int().nullable().optional(), inbound_message_read_mode: z.enum(["disabled", "read_only", "read_with_typing"]).optional(), created_at: z.string(), updated_at: z.string(), project_id: z.string().optional(), execution_count: z.number().int().gte(0).optional(), last_executed_at: z.string().nullable().optional(), definition: workflowDefinition}); export const workflowWithDefinitionResponse = z.object({data: workflowWithDefinition}); 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 }; /** * Retrieve workflow definition * * GET /workflows/{workflow_id}/definition */ export const getApiWorkflowsWorkflowIdDefinition = async (options?: GetApiWorkflowsWorkflowIdDefinitionOptions) => { const {baseUrl = "https://api.kapso.ai/platform/v1", fetch: fetchFn = fetch, ApiKeyAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (ApiKeyAuth !== undefined) headers.set("X-API-Key", ApiKeyAuth) const url = `${baseUrl.replace(/\/+$/, '')}/workflows/${encodeURIComponent(String(args.workflow_id))}/definition${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(workflowWithDefinitionResponse, await res.json()) };