// This file is auto-generated by @hey-api/openapi-ts

import * as z from 'zod'

/**
 * AgentApiAccessResponse
 */
export const zAgentApiAccessResponse = z.object({
  api_key_count: z.int(),
  api_rph: z.int(),
  api_rpm: z.int(),
  chat_endpoint: z.string(),
  conversations_endpoint: z.string(),
  enabled: z.boolean(),
  files_upload_endpoint: z.string(),
  info_endpoint: z.string(),
  messages_endpoint: z.string(),
  meta_endpoint: z.string(),
  parameters_endpoint: z.string(),
  service_api_base_url: z.string(),
  stop_endpoint: z.string(),
  streaming_only: z.boolean().optional().default(true),
})

/**
 * AgentApiStatusPayload
 */
export const zAgentApiStatusPayload = z.object({
  enable_api: z.boolean(),
})

/**
 * ApiKeyItem
 */
export const zApiKeyItem = z.object({
  created_at: z.int().nullish(),
  id: z.string(),
  last_used_at: z.int().nullish(),
  token: z.string(),
  type: z.string(),
})

/**
 * ApiKeyList
 */
export const zApiKeyList = z.object({
  data: z.array(zApiKeyItem),
})

/**
 * AudioTranscriptResponse
 */
export const zAudioTranscriptResponse = z.object({
  text: z.string(),
})

/**
 * SimpleResultResponse
 */
export const zSimpleResultResponse = z.object({
  result: z.string(),
})

/**
 * AgentSimpleResultResponse
 */
export const zAgentSimpleResultResponse = z.object({
  result: z.string(),
})

/**
 * AgentBuildDraftApplyResponse
 */
export const zAgentBuildDraftApplyResponse = z.object({
  draft: z.record(z.string(), z.unknown()),
  result: z.string(),
})

/**
 * AgentBuildDraftCheckoutPayload
 */
export const zAgentBuildDraftCheckoutPayload = z.object({
  force: z.boolean().optional().default(false),
})

/**
 * SuggestedQuestionsResponse
 */
export const zSuggestedQuestionsResponse = z.object({
  data: z.array(z.string()),
})

/**
 * AgentConfigFileUploadPayload
 */
export const zAgentConfigFileUploadPayload = z.object({
  upload_file_id: z.string(),
})

/**
 * AgentConfigDeleteResponse
 */
export const zAgentConfigDeleteResponse = z.object({
  removed_names: z.array(z.string()).optional(),
  result: z.literal('success'),
})

/**
 * AgentConfigDownloadResponse
 */
export const zAgentConfigDownloadResponse = z.object({
  url: z.string(),
})

/**
 * AgentConfigFilePreviewResponse
 */
export const zAgentConfigFilePreviewResponse = z.object({
  binary: z.boolean(),
  name: z.string(),
  size: z.int().nullish(),
  text: z.string().nullish(),
  truncated: z.boolean(),
})

/**
 * AgentConfigSkillFilePreviewResponse
 */
export const zAgentConfigSkillFilePreviewResponse = z.object({
  binary: z.boolean(),
  path: z.string(),
  size: z.int().nullish(),
  text: z.string().nullish(),
  truncated: z.boolean(),
})

/**
 * AgentDebugConversationRefreshResponse
 */
export const zAgentDebugConversationRefreshResponse = z.object({
  debug_conversation_has_messages: z.boolean().optional().default(false),
  debug_conversation_id: z.string(),
  debug_conversation_message_count: z.int().optional().default(0),
})

/**
 * AgentDriveDownloadResponse
 */
export const zAgentDriveDownloadResponse = z.object({
  url: z.string(),
})

/**
 * AgentDrivePreviewResponse
 */
export const zAgentDrivePreviewResponse = z.object({
  binary: z.boolean(),
  key: z.string(),
  size: z.int().nullish(),
  text: z.string().nullish(),
  truncated: z.boolean(),
})

/**
 * MessageFeedbackPayload
 */
export const zMessageFeedbackPayload = z.object({
  content: z.string().nullish(),
  message_id: z.string(),
  rating: z.enum(['dislike', 'like']).nullish(),
})

/**
 * AgentDriveDeleteResponse
 */
export const zAgentDriveDeleteResponse = z.object({
  removed_keys: z.array(z.string()).optional(),
  result: z.string(),
})

/**
 * AgentDriveFilePayload
 */
export const zAgentDriveFilePayload = z.object({
  upload_file_id: z.string(),
})

/**
 * AgentPublishPayload
 */
export const zAgentPublishPayload = z.object({
  version_note: z.string().nullish(),
})

/**
 * SandboxInfoResponse
 */
export const zSandboxInfoResponse = z.object({
  session_id: z.string(),
  workspace_cwd: z.string(),
})

/**
 * SandboxReadResponse
 */
export const zSandboxReadResponse = z.object({
  binary: z.boolean(),
  path: z.string(),
  size: z.int().nullish(),
  text: z.string().nullish(),
  truncated: z.boolean(),
})

/**
 * AgentSandboxUploadPayload
 */
export const zAgentSandboxUploadPayload = z.object({
  conversation_id: z.string().min(1),
  path: z.string().min(1),
})

/**
 * SandboxUploadResponse
 */
export const zSandboxUploadResponse = z.object({
  url: z.string(),
})

/**
 * AgentConfigSnapshotRestoreResponse
 */
export const zAgentConfigSnapshotRestoreResponse = z.object({
  active_config_snapshot_id: z.string(),
  draft_config_id: z.string().nullish(),
  restored_version_id: z.string().nullish(),
  result: z.literal('success'),
})

/**
 * IconType
 */
export const zIconType = z.enum(['emoji', 'image', 'link'])

/**
 * AgentAppCreatePayload
 */
export const zAgentAppCreatePayload = z.object({
  description: z.string().max(400).nullish(),
  icon: z.string().nullish(),
  icon_background: z.string().nullish(),
  icon_type: zIconType.nullish(),
  name: z.string().min(1),
  role: z.string().max(255).nullish(),
})

/**
 * AgentAppUpdatePayload
 */
export const zAgentAppUpdatePayload = z.object({
  description: z.string().max(400).nullish(),
  icon: z.string().nullish(),
  icon_background: z.string().nullish(),
  icon_type: zIconType.nullish(),
  max_active_requests: z.int().nullish(),
  name: z.string().min(1),
  role: z.string().max(255).nullish(),
  use_icon_as_answer_icon: z.boolean().nullish(),
})

/**
 * AgentAppCopyPayload
 */
export const zAgentAppCopyPayload = z.object({
  description: z.string().max(400).nullish(),
  icon: z.string().nullish(),
  icon_background: z.string().nullish(),
  icon_type: zIconType.nullish(),
  name: z.string().nullish(),
  role: z.string().max(255).nullish(),
})

/**
 * DeletedTool
 */
export const zDeletedTool = z.object({
  provider_id: z.string(),
  tool_name: z.string(),
  type: z.string(),
})

/**
 * AppModelConfigResponse
 */
export const zAppModelConfigResponse = z.object({
  agent_mode: z.unknown().nullish(),
  annotation_reply: z.unknown().nullish(),
  chat_prompt_config: z.unknown().nullish(),
  completion_prompt_config: z.unknown().nullish(),
  created_at: z.int().nullish(),
  created_by: z.string().nullish(),
  dataset_configs: z.unknown().nullish(),
  dataset_query_variable: z.string().nullish(),
  external_data_tools: z.unknown().nullish(),
  file_upload: z.unknown().nullish(),
  model: z.unknown().nullish(),
  more_like_this: z.unknown().nullish(),
  opening_statement: z.string().nullish(),
  pre_prompt: z.string().nullish(),
  prompt_type: z.string().nullish(),
  retriever_resource: z.unknown().nullish(),
  sensitive_word_avoidance: z.unknown().nullish(),
  speech_to_text: z.unknown().nullish(),
  suggested_questions: z.unknown().nullish(),
  suggested_questions_after_answer: z.unknown().nullish(),
  text_to_speech: z.unknown().nullish(),
  updated_at: z.int().nullish(),
  updated_by: z.string().nullish(),
  user_input_form: z.unknown().nullish(),
})

/**
 * AppDetailSiteResponse
 */
export const zAppDetailSiteResponse = z.object({
  access_token: z.string().nullish(),
  app_base_url: z.string().nullish(),
  chat_color_theme: z.string().nullish(),
  chat_color_theme_inverted: z.boolean().nullish(),
  code: z.string().nullish(),
  copyright: z.string().nullish(),
  created_at: z.int().nullish(),
  created_by: z.string().nullish(),
  custom_disclaimer: z.string().nullish(),
  customize_domain: z.string().nullish(),
  customize_token_strategy: z.string().nullish(),
  default_language: z.string().nullish(),
  description: z.string().nullish(),
  icon: z.string().nullish(),
  icon_background: z.string().nullish(),
  icon_type: z.union([z.string(), zIconType]).nullish(),
  icon_url: z.string().nullable(),
  input_placeholder: z.string().nullish(),
  privacy_policy: z.string().nullish(),
  prompt_public: z.boolean().nullish(),
  show_workflow_steps: z.boolean().nullish(),
  title: z.string().nullish(),
  updated_at: z.int().nullish(),
  updated_by: z.string().nullish(),
  use_icon_as_answer_icon: z.boolean().nullish(),
})

/**
 * Tag
 */
export const zTag = z.object({
  id: z.string(),
  name: z.string(),
  type: z.string(),
})

/**
 * WorkflowPartial
 */
export const zWorkflowPartial = z.object({
  created_at: z.int().nullish(),
  created_by: z.string().nullish(),
  id: z.string(),
  updated_at: z.int().nullish(),
  updated_by: z.string().nullish(),
})

/**
 * AgentAppDetailWithSite
 */
export const zAgentAppDetailWithSite = z.object({
  access_mode: z.string().nullish(),
  api_base_url: z.string().nullish(),
  app_id: z.string().nullish(),
  backing_app_id: z.string().nullish(),
  bound_agent_id: z.string().nullish(),
  created_at: z.int().nullish(),
  created_by: z.string().nullish(),
  debug_conversation_has_messages: z.boolean().optional().default(false),
  debug_conversation_id: z.string().nullish(),
  debug_conversation_message_count: z.int().optional().default(0),
  deleted_tools: z.array(zDeletedTool).optional(),
  description: z.string().nullish(),
  enable_api: z.boolean(),
  enable_site: z.boolean(),
  hidden_app_backed: z.boolean().optional().default(false),
  icon: z.string().nullish(),
  icon_background: z.string().nullish(),
  icon_type: z.string().nullish(),
  icon_url: z.string().nullable(),
  id: z.string(),
  maintainer: z.string().nullish(),
  max_active_requests: z.int().nullish(),
  mode: z.string(),
  model_config: zAppModelConfigResponse.nullish(),
  name: z.string(),
  permission_keys: z.array(z.string()).optional(),
  role: z.string().nullish(),
  site: zAppDetailSiteResponse.nullish(),
  tags: z.array(zTag).optional(),
  tracing: z.unknown().nullish(),
  updated_at: z.int().nullish(),
  updated_by: z.string().nullish(),
  use_icon_as_answer_icon: z.boolean().nullish(),
  workflow: zWorkflowPartial.nullish(),
})

/**
 * ComposerBindingPayload
 */
export const zComposerBindingPayload = z.object({
  agent_id: z.string().nullish(),
  binding_type: z.enum(['inline_agent', 'roster_agent']),
  current_snapshot_id: z.string().nullish(),
})

/**
 * AgentIconType
 *
 * Supported icon storage formats for Agent roster entries.
 */
export const zAgentIconType = z.enum(['emoji', 'image', 'link'])

/**
 * ComposerSaveStrategy
 */
export const zComposerSaveStrategy = z.enum([
  'node_job_only',
  'save_as_new_agent',
  'save_as_new_version',
  'save_to_current_version',
  'save_to_roster',
])

/**
 * ComposerSoulLockPayload
 */
export const zComposerSoulLockPayload = z.object({
  locked: z.boolean().optional().default(true),
  unlocked_from_version_id: z.string().nullish(),
})

/**
 * ComposerVariant
 */
export const zComposerVariant = z.enum(['agent_app', 'workflow'])

/**
 * AgentConfigSnapshotSummaryResponse
 */
export const zAgentConfigSnapshotSummaryResponse = z.object({
  agent_id: z.string().nullish(),
  created_at: z.int().nullish(),
  created_by: z.string().nullish(),
  display_version: z.int().nullish(),
  id: z.string(),
  snapshot_version: z.int().nullish(),
  summary: z.string().nullish(),
  version: z.int(),
  version_note: z.string().nullish(),
})

/**
 * AgentConfigSnapshotListResponse
 */
export const zAgentConfigSnapshotListResponse = z.object({
  data: z.array(zAgentConfigSnapshotSummaryResponse),
})

/**
 * ComposerCandidateCapabilities
 */
export const zComposerCandidateCapabilities = z.object({
  human_roster_available: z.boolean().optional().default(false),
})

/**
 * ComposerKnowledgePlaceholderResponse
 */
export const zComposerKnowledgePlaceholderResponse = z.object({
  id: z.string(),
  placeholder_name: z.string(),
})

/**
 * ComposerValidationWarningResponse
 */
export const zComposerValidationWarningResponse = z.object({
  code: z.string(),
  id: z.string().nullish(),
  kind: z.string().nullish(),
  message: z.string().nullish(),
  surface: z.string().nullish(),
})

/**
 * AgentComposerValidateResponse
 */
export const zAgentComposerValidateResponse = z.object({
  errors: z.array(z.string()).optional(),
  knowledge_retrieval_placeholder: z.array(zComposerKnowledgePlaceholderResponse).optional(),
  result: z.literal('success'),
  warnings: z.array(zComposerValidationWarningResponse).optional(),
})

/**
 * ComposerValidationFindingsResponse
 */
export const zComposerValidationFindingsResponse = z.object({
  knowledge_retrieval_placeholder: z.array(zComposerKnowledgePlaceholderResponse).optional(),
  warnings: z.array(zComposerValidationWarningResponse).optional(),
})

/**
 * AgentConfigVersionResponse
 */
export const zAgentConfigVersionResponse = z.object({
  id: z.string(),
  kind: z.enum(['build_draft', 'draft', 'snapshot']),
  writable: z.boolean(),
})

/**
 * AgentConfigFileItemResponse
 */
export const zAgentConfigFileItemResponse = z.object({
  file_id: z.string().nullish(),
  hash: z.string().nullish(),
  id: z.string(),
  is_missing: z.boolean().optional().default(false),
  mime_type: z.string().nullish(),
  name: z.string(),
  size: z.int().nullish(),
})

/**
 * AgentConfigFileListResponse
 */
export const zAgentConfigFileListResponse = z.object({
  agent_id: z.string(),
  config_version: zAgentConfigVersionResponse,
  items: z.array(zAgentConfigFileItemResponse).optional(),
})

/**
 * AgentConfigFileUploadResponse
 */
export const zAgentConfigFileUploadResponse = z.object({
  config_version: zAgentConfigVersionResponse,
  file: zAgentConfigFileItemResponse,
})

/**
 * AgentConfigFileItemsResponse
 */
export const zAgentConfigFileItemsResponse = z.object({
  items: z.array(zAgentConfigFileItemResponse).optional(),
})

/**
 * AgentConfigSkillItemResponse
 */
export const zAgentConfigSkillItemResponse = z.object({
  description: z.string().optional().default(''),
  file_id: z.string().nullish(),
  hash: z.string().nullish(),
  id: z.string(),
  is_missing: z.boolean().optional().default(false),
  mime_type: z.string().nullish(),
  name: z.string(),
  size: z.int().nullish(),
})

/**
 * AgentConfigSkillListResponse
 */
export const zAgentConfigSkillListResponse = z.object({
  agent_id: z.string(),
  config_version: zAgentConfigVersionResponse,
  items: z.array(zAgentConfigSkillItemResponse).optional(),
})

/**
 * AgentConfigSkillUploadResponse
 */
export const zAgentConfigSkillUploadResponse = z.object({
  config_version: zAgentConfigVersionResponse,
  skill: zAgentConfigSkillItemResponse,
})

/**
 * AgentConfigSkillItemsResponse
 */
export const zAgentConfigSkillItemsResponse = z.object({
  items: z.array(zAgentConfigSkillItemResponse).optional(),
})

/**
 * AgentConfigManifestResponse
 */
export const zAgentConfigManifestResponse = z.object({
  agent_id: z.string(),
  config_version: zAgentConfigVersionResponse,
  env_keys: z.array(z.string()).optional(),
  files: zAgentConfigFileItemsResponse.optional(),
  note: z.string().optional().default(''),
  skills: zAgentConfigSkillItemsResponse.optional(),
})

/**
 * AgentConfigSkillFileResponse
 */
export const zAgentConfigSkillFileResponse = z.object({
  downloadable: z.boolean(),
  name: z.string(),
  path: z.string(),
  previewable: z.boolean(),
  type: z.enum(['directory', 'file']),
})

/**
 * AgentConfigSkillMarkdownResponse
 */
export const zAgentConfigSkillMarkdownResponse = z.object({
  binary: z.literal(false),
  path: z.literal('SKILL.md'),
  size: z.int().nullish(),
  text: z.string(),
  truncated: z.boolean(),
})

/**
 * AgentConfigSkillInspectResponse
 */
export const zAgentConfigSkillInspectResponse = z.object({
  description: z.string().optional().default(''),
  file_tree: z.array(z.record(z.string(), z.unknown())).nullish(),
  files: z.array(zAgentConfigSkillFileResponse).optional(),
  hash: z.string().nullish(),
  id: z.string(),
  mime_type: z.string().nullish(),
  name: z.string(),
  size: z.int().nullish(),
  skill_md: zAgentConfigSkillMarkdownResponse,
  source: z.literal('config_skill_zip'),
  warnings: z.array(z.string()).optional(),
})

/**
 * AgentConfigDraftType
 *
 * Editable Agent Soul draft workspace type.
 */
export const zAgentConfigDraftType = z.enum(['debug_build', 'draft'])

/**
 * AgentDebugConversationRefreshPayload
 */
export const zAgentDebugConversationRefreshPayload = z.object({
  draft_type: zAgentConfigDraftType.optional().default('debug_build'),
})

/**
 * AgentConfigDraftSummaryResponse
 */
export const zAgentConfigDraftSummaryResponse = z.object({
  account_id: z.string().nullish(),
  agent_id: z.string(),
  base_snapshot_id: z.string().nullish(),
  created_at: z.int().nullish(),
  created_by: z.string().nullish(),
  draft_type: zAgentConfigDraftType,
  id: z.string(),
  updated_at: z.int().nullish(),
  updated_by: z.string().nullish(),
})

/**
 * AgentPublishResponse
 */
export const zAgentPublishResponse = z.object({
  active_config_snapshot: zAgentConfigSnapshotSummaryResponse.nullish(),
  active_config_snapshot_id: z.string(),
  draft: zAgentConfigDraftSummaryResponse.nullish(),
  result: z.string(),
})

/**
 * AgentDriveItemResponse
 */
export const zAgentDriveItemResponse = z.object({
  created_at: z.int().nullish(),
  file_kind: z.string(),
  hash: z.string().nullish(),
  is_skill: z.boolean().nullish(),
  key: z.string(),
  mime_type: z.string().nullish(),
  size: z.int().nullish(),
  skill_metadata: z.string().nullish(),
})

/**
 * AgentDriveListResponse
 */
export const zAgentDriveListResponse = z.object({
  items: z.array(zAgentDriveItemResponse).optional(),
})

/**
 * AgentDriveSkillItemResponse
 */
export const zAgentDriveSkillItemResponse = z.object({
  archive_key: z.string().nullish(),
  created_at: z.int().nullish(),
  description: z.string(),
  hash: z.string().nullish(),
  mime_type: z.string().nullish(),
  name: z.string(),
  path: z.string(),
  size: z.int().nullish(),
  skill_md_key: z.string(),
})

/**
 * AgentDriveSkillListResponse
 */
export const zAgentDriveSkillListResponse = z.object({
  items: z.array(zAgentDriveSkillItemResponse).optional(),
})

/**
 * AgentDriveSkillFileResponse
 */
export const zAgentDriveSkillFileResponse = z.object({
  available_in_drive: z.boolean(),
  drive_key: z.string().nullish(),
  name: z.string(),
  path: z.string(),
  type: z.string(),
})

/**
 * AgentDriveSkillMarkdownResponse
 */
export const zAgentDriveSkillMarkdownResponse = z.object({
  binary: z.boolean(),
  key: z.string(),
  size: z.int().nullish(),
  text: z.string().nullish(),
  truncated: z.boolean(),
})

/**
 * AgentDriveSkillInspectResponse
 */
export const zAgentDriveSkillInspectResponse = z.object({
  archive_key: z.string().nullish(),
  created_at: z.int().nullish(),
  description: z.string(),
  file_tree: z.array(z.record(z.string(), z.unknown())).optional(),
  files: z.array(zAgentDriveSkillFileResponse).optional(),
  hash: z.string().nullish(),
  mime_type: z.string().nullish(),
  name: z.string(),
  path: z.string(),
  size: z.int().nullish(),
  skill_md: zAgentDriveSkillMarkdownResponse,
  skill_md_key: z.string(),
  source: z.string(),
  warnings: z.array(z.string()).optional(),
})

/**
 * AgentFeatureToggleConfig
 */
export const zAgentFeatureToggleConfig = z.object({
  enabled: z.boolean().optional().default(false),
})

/**
 * AgentTextToSpeechFeatureConfig
 */
export const zAgentTextToSpeechFeatureConfig = z.object({
  autoPlay: z.string().nullish(),
  enabled: z.boolean().optional().default(false),
  language: z.string().nullish(),
  voice: z.string().nullish(),
})

/**
 * AgentDriveFileResponse
 */
export const zAgentDriveFileResponse = z.object({
  drive_key: z.string(),
  file_id: z.string(),
  mime_type: z.string().nullish(),
  name: z.string(),
  size: z.int().nullish(),
})

/**
 * AgentDriveFileCommitResponse
 */
export const zAgentDriveFileCommitResponse = z.object({
  file: zAgentDriveFileResponse,
})

/**
 * AgentLogSourceResponse
 */
export const zAgentLogSourceResponse = z.object({
  app_icon: z.string().nullish(),
  app_icon_background: z.string().nullish(),
  app_icon_type: z.string().nullish(),
  app_id: z.string(),
  app_name: z.string(),
  id: z.string(),
  node_id: z.string().nullish(),
  type: z.enum(['webapp', 'workflow']),
  workflow_id: z.string().nullish(),
  workflow_version: z.string().nullish(),
})

/**
 * AgentLogSourceGroupResponse
 */
export const zAgentLogSourceGroupResponse = z.object({
  label: z.string(),
  sources: z.array(zAgentLogSourceResponse).optional(),
  type: z.enum(['webapp', 'workflow']),
})

/**
 * AgentLogSourceListResponse
 */
export const zAgentLogSourceListResponse = z.object({
  data: z.array(zAgentLogSourceResponse),
  groups: z.array(zAgentLogSourceGroupResponse),
})

/**
 * AgentLogConversationItemResponse
 */
export const zAgentLogConversationItemResponse = z.object({
  conversation_id: z.string(),
  created_at: z.int().nullish(),
  end_user_id: z.string().nullish(),
  id: z.string(),
  message_count: z.int(),
  operation_rate: z.number().nullish(),
  source: zAgentLogSourceResponse.nullish(),
  status: z.enum(['failed', 'paused', 'success']),
  title: z.string().nullish(),
  unread: z.boolean(),
  updated_at: z.int().nullish(),
  user_rate: z.number().nullish(),
})

/**
 * AgentLogListResponse
 */
export const zAgentLogListResponse = z.object({
  data: z.array(zAgentLogConversationItemResponse),
  has_more: z.boolean(),
  limit: z.int(),
  page: z.int(),
  total: z.int(),
})

/**
 * AgentLogMessageItemResponse
 */
export const zAgentLogMessageItemResponse = z.object({
  answer: z.string(),
  answer_tokens: z.int(),
  conversation_id: z.string(),
  created_at: z.int().nullish(),
  currency: z.string(),
  error: z.string().nullish(),
  from_account_id: z.string().nullish(),
  from_end_user_id: z.string().nullish(),
  id: z.string(),
  latency: z.number(),
  message_id: z.string(),
  message_tokens: z.int(),
  query: z.string(),
  status: z.string(),
  total_price: z.string(),
  total_tokens: z.int(),
  updated_at: z.int().nullish(),
})

/**
 * AgentLogMessageListResponse
 */
export const zAgentLogMessageListResponse = z.object({
  data: z.array(zAgentLogMessageItemResponse),
  has_more: z.boolean(),
  limit: z.int(),
  page: z.int(),
  total: z.int(),
})

export const zJsonValue = z
  .union([
    z.string(),
    z.int(),
    z.number(),
    z.boolean(),
    z.record(z.string(), z.unknown()),
    z.array(z.unknown()),
  ])
  .nullable()

/**
 * AgentThought
 */
export const zAgentThought = z.object({
  answer: z.string().nullish(),
  chain_id: z.string().nullish(),
  created_at: z.int().nullish(),
  files: z.array(z.string()),
  id: z.string(),
  message_id: z.string(),
  observation: z.string().nullish(),
  position: z.int(),
  thought: z.string().nullish(),
  tool: z.string().nullish(),
  tool_input: z.string().nullish(),
  tool_labels: zJsonValue,
})

/**
 * MessageFile
 */
export const zMessageFile = z.object({
  belongs_to: z.string().nullish(),
  filename: z.string(),
  id: z.string(),
  mime_type: z.string().nullish(),
  size: z.int().nullish(),
  transfer_method: z.string(),
  type: z.string(),
  upload_file_id: z.string().nullish(),
  url: z.string().nullish(),
})

/**
 * AgentReferencingWorkflowResponse
 */
export const zAgentReferencingWorkflowResponse = z.object({
  app_icon: z.string().nullish(),
  app_icon_background: z.string().nullish(),
  app_icon_type: z.string().nullish(),
  app_id: z.string(),
  app_mode: z.string(),
  app_name: z.string(),
  app_updated_at: z.int().nullish(),
  node_ids: z.array(z.string()).optional(),
  workflow_id: z.string(),
  workflow_version: z.string(),
})

/**
 * AgentReferencingWorkflowsResponse
 */
export const zAgentReferencingWorkflowsResponse = z.object({
  data: z.array(zAgentReferencingWorkflowResponse).optional(),
})

/**
 * SandboxFileEntryResponse
 */
export const zSandboxFileEntryResponse = z.object({
  mtime: z.int().nullish(),
  name: z.string(),
  size: z.int().nullish(),
  type: z.enum(['dir', 'file', 'other', 'symlink']),
})

/**
 * SandboxListResponse
 */
export const zSandboxListResponse = z.object({
  entries: z.array(zSandboxFileEntryResponse).optional(),
  path: z.string(),
  truncated: z.boolean().optional().default(false),
})

/**
 * SkillManifest
 *
 * Validated metadata extracted from a Skill package.
 */
export const zSkillManifest = z.object({
  description: z.string(),
  entry_path: z.string(),
  files: z.array(z.string()),
  hash: z.string(),
  name: z.string(),
  size: z.int(),
})

/**
 * AgentUploadedSkillResponse
 */
export const zAgentUploadedSkillResponse = z.object({
  archive_key: z.string().nullish(),
  description: z.string(),
  name: z.string(),
  path: z.string(),
  skill_md_key: z.string(),
})

/**
 * AgentSkillUploadResponse
 */
export const zAgentSkillUploadResponse = z.object({
  manifest: zSkillManifest,
  skill: zAgentUploadedSkillResponse,
})

/**
 * AgentStatisticSummaryResponse
 */
export const zAgentStatisticSummaryResponse = z.object({
  average_response_time: z.number(),
  average_session_interactions: z.number(),
  currency: z.string(),
  tokens_per_second: z.number(),
  total_conversations: z.int(),
  total_end_users: z.int(),
  total_messages: z.int(),
  total_price: z.string(),
  total_tokens: z.int(),
  user_satisfaction_rate: z.number(),
})

/**
 * ModelConfigPartial
 */
export const zModelConfigPartial = z.object({
  created_at: z.int().nullish(),
  created_by: z.string().nullish(),
  model: z.unknown().nullish(),
  pre_prompt: z.string().nullish(),
  updated_at: z.int().nullish(),
  updated_by: z.string().nullish(),
})

/**
 * AgentAppPublishedReferenceResponse
 */
export const zAgentAppPublishedReferenceResponse = z.object({
  app_icon: z.string().nullish(),
  app_icon_background: z.string().nullish(),
  app_icon_type: z.string().nullish(),
  app_id: z.string(),
  app_name: z.string(),
})

/**
 * AgentAppPartial
 */
export const zAgentAppPartial = z.object({
  access_mode: z.string().nullish(),
  active_config_is_published: z.boolean().optional().default(false),
  app_id: z.string().nullish(),
  author_name: z.string().nullish(),
  backing_app_id: z.string().nullish(),
  bound_agent_id: z.string().nullish(),
  create_user_name: z.string().nullish(),
  created_at: z.int().nullish(),
  created_by: z.string().nullish(),
  debug_conversation_id: z.string().nullish(),
  description: z.string().nullish(),
  has_draft_trigger: z.boolean().nullish(),
  hidden_app_backed: z.boolean().optional().default(false),
  icon: z.string().nullish(),
  icon_background: z.string().nullish(),
  icon_type: z.string().nullish(),
  icon_url: z.string().nullable(),
  id: z.string(),
  is_starred: z.boolean().optional().default(false),
  maintainer: z.string().nullish(),
  max_active_requests: z.int().nullish(),
  mode: z.string(),
  model_config: zModelConfigPartial.nullish(),
  name: z.string(),
  permission_keys: z.array(z.string()).optional(),
  published_reference_count: z.int().optional().default(0),
  published_references: z.array(zAgentAppPublishedReferenceResponse).optional(),
  reference_count: z.int().nullish(),
  role: z.string().nullish(),
  tags: z.array(zTag).optional(),
  updated_at: z.int().nullish(),
  updated_by: z.string().nullish(),
  use_icon_as_answer_icon: z.boolean().nullish(),
  workflow: zWorkflowPartial.nullish(),
})

/**
 * AgentAppPagination
 */
export const zAgentAppPagination = z.object({
  data: z.array(zAgentAppPartial),
  has_more: z.boolean(),
  limit: z.int(),
  page: z.int(),
  total: z.int(),
})

/**
 * AgentKind
 *
 * Agent implementation family.
 *
 * This leaves room for future non-Dify agent implementations while keeping
 * the current roster/workflow APIs scoped to Dify Agent.
 */
export const zAgentKind = z.enum(['dify_agent'])

/**
 * AgentPublishedReferenceResponse
 */
export const zAgentPublishedReferenceResponse = z.object({
  app_icon: z.string().nullish(),
  app_icon_background: z.string().nullish(),
  app_icon_type: z.string().nullish(),
  app_id: z.string(),
  app_mode: z.string(),
  app_name: z.string(),
  app_updated_at: z.int().nullish(),
  node_ids: z.array(z.string()).optional(),
  workflow_id: z.string(),
  workflow_version: z.string(),
})

/**
 * AgentScope
 *
 * Visibility and lifecycle scope of an Agent record.
 */
export const zAgentScope = z.enum(['roster', 'workflow_only'])

/**
 * AgentSource
 *
 * Origin that created or imported the Agent.
 */
export const zAgentSource = z.enum(['agent_app', 'imported', 'roster', 'system', 'workflow'])

/**
 * AgentStatus
 *
 * Soft lifecycle state for Agent records.
 */
export const zAgentStatus = z.enum(['active', 'archived'])

/**
 * AgentInviteOptionResponse
 */
export const zAgentInviteOptionResponse = z.object({
  active_config_is_published: z.boolean().optional().default(false),
  active_config_snapshot: zAgentConfigSnapshotSummaryResponse.nullish(),
  active_config_snapshot_id: z.string().nullish(),
  agent_kind: zAgentKind,
  app_id: z.string().nullish(),
  archived_at: z.int().nullish(),
  archived_by: z.string().nullish(),
  backing_app_id: z.string().nullish(),
  created_at: z.int().nullish(),
  created_by: z.string().nullish(),
  description: z.string(),
  existing_node_ids: z.array(z.string()).optional(),
  hidden_app_backed: z.boolean().optional().default(false),
  icon: z.string().nullish(),
  icon_background: z.string().nullish(),
  icon_type: zAgentIconType.nullish(),
  id: z.string(),
  in_current_workflow_count: z.int().optional().default(0),
  is_in_current_workflow: z.boolean().optional().default(false),
  name: z.string(),
  published_node_reference_count: z.int().optional().default(0),
  published_reference_count: z.int().optional().default(0),
  published_references: z.array(zAgentPublishedReferenceResponse).optional(),
  reference_count: z.int().nullish(),
  role: z.string().optional().default(''),
  scope: zAgentScope,
  source: zAgentSource,
  status: zAgentStatus,
  updated_at: z.int().nullish(),
  updated_by: z.string().nullish(),
  workflow_id: z.string().nullish(),
  workflow_node_id: z.string().nullish(),
})

/**
 * AgentInviteOptionsResponse
 */
export const zAgentInviteOptionsResponse = z.object({
  data: z.array(zAgentInviteOptionResponse),
  has_more: z.boolean(),
  limit: z.int(),
  page: z.int(),
  total: z.int(),
})

/**
 * AgentComposerAgentResponse
 */
export const zAgentComposerAgentResponse = z.object({
  active_config_snapshot_id: z.string().nullish(),
  app_id: z.string().nullish(),
  backing_app_id: z.string().nullish(),
  description: z.string(),
  hidden_app_backed: z.boolean().optional().default(false),
  icon: z.string().nullish(),
  icon_background: z.string().nullish(),
  icon_type: z.string().nullish(),
  id: z.string(),
  name: z.string(),
  role: z.string().nullish(),
  scope: zAgentScope,
  source: zAgentSource.nullish(),
  status: zAgentStatus,
})

/**
 * AppVariableConfig
 */
export const zAppVariableConfig = z.object({
  default: z.unknown().optional(),
  name: z.string().min(1).max(255),
  required: z.boolean().optional().default(false),
  type: z.string().min(1).max(64),
})

/**
 * AgentConfigFileRefConfig
 *
 * Stable Agent Soul reference to one config file payload.
 */
export const zAgentConfigFileRefConfig = z.object({
  file_id: z.string().max(255).optional().default(''),
  file_kind: z.enum(['tool_file', 'upload_file']),
  hash: z.string().nullish(),
  is_missing: z.boolean().optional().default(false),
  mime_type: z.string().nullish(),
  name: z.string().min(1).max(255),
  size: z.int().nullish(),
})

/**
 * AgentConfigSkillRefConfig
 *
 * Stable Agent Soul reference to one normalized skill archive.
 */
export const zAgentConfigSkillRefConfig = z.object({
  description: z.string().optional().default(''),
  file_id: z.string().max(255).optional().default(''),
  file_kind: z.literal('tool_file').optional().default('tool_file'),
  hash: z.string().nullish(),
  is_missing: z.boolean().optional().default(false),
  mime_type: z.string().nullish().default('application/zip'),
  name: z.string().min(1).max(255),
  size: z.int().nullish(),
})

/**
 * AgentSoulPromptConfig
 */
export const zAgentSoulPromptConfig = z.object({
  system_prompt: z.string().optional().default(''),
})

/**
 * AgentHumanContactConfig
 */
export const zAgentHumanContactConfig = z.object({
  channel: z.string().max(64).nullish(),
  contact_id: z.string().max(255).nullish(),
  contact_method: z.string().max(64).nullish(),
  email: z.string().max(255).nullish(),
  human_id: z.string().max(255).nullish(),
  id: z.string().max(255).nullish(),
  method: z.string().max(64).nullish(),
  name: z.string().max(255).nullish(),
  tenant_id: z.string().max(255).nullish(),
})

/**
 * WorkflowNodeJobMode
 */
export const zWorkflowNodeJobMode = z.enum(['let_agent_figure_it_out', 'tell_agent_what_to_do'])

/**
 * WorkflowPreviousNodeOutputRef
 */
export const zWorkflowPreviousNodeOutputRef = z.object({
  key: z.string().max(255).nullish(),
  name: z.string().max(255).nullish(),
  node_id: z.string().max(255).nullish(),
  output: z.string().max(255).nullish(),
  selector: z.array(z.union([z.string(), z.int(), z.number(), z.boolean(), z.null()])).nullish(),
  value_selector: z
    .array(z.union([z.string(), z.int(), z.number(), z.boolean(), z.null()]))
    .nullish(),
  variable: z.string().max(255).nullish(),
  variable_selector: z
    .array(z.union([z.string(), z.int(), z.number(), z.boolean(), z.null()]))
    .nullish(),
})

/**
 * DeclaredOutputType
 */
export const zDeclaredOutputType = z.enum([
  'array',
  'boolean',
  'file',
  'number',
  'object',
  'string',
])

/**
 * AgentComposerNodeJobCandidatesResponse
 */
export const zAgentComposerNodeJobCandidatesResponse = z.object({
  declare_output_types: z.array(zDeclaredOutputType).optional(),
  human_contacts: z.array(zAgentHumanContactConfig).optional(),
  previous_node_outputs: z.array(zWorkflowPreviousNodeOutputRef).optional(),
})

/**
 * AgentComposerDifyToolCandidateResponse
 */
export const zAgentComposerDifyToolCandidateResponse = z.object({
  description: z.string().nullish(),
  granularity: z.string().nullish(),
  id: z.string().nullish(),
  name: z.string().nullish(),
  plugin_id: z.string().nullish(),
  provider: z.string().nullish(),
  provider_id: z.string().nullish(),
  tools_count: z.int().nullish(),
})

/**
 * AgentSuggestedQuestionsAfterAnswerModelConfig
 *
 * Legacy Chat App model config used only for follow-up question generation.
 */
export const zAgentSuggestedQuestionsAfterAnswerModelConfig = z.object({
  completion_params: z.record(z.string(), z.unknown()).nullish(),
  mode: z.string().max(64).nullish(),
  name: z.string().min(1).max(255),
  provider: z.string().min(1).max(255),
})

/**
 * AgentSuggestedQuestionsAfterAnswerFeatureConfig
 */
export const zAgentSuggestedQuestionsAfterAnswerFeatureConfig = z.object({
  enabled: z.boolean().optional().default(false),
  model: zAgentSuggestedQuestionsAfterAnswerModelConfig.nullish(),
  prompt: z.string().nullish(),
})

/**
 * SimpleAccount
 */
export const zSimpleAccount = z.object({
  email: z.string(),
  id: z.string(),
  name: z.string(),
})

/**
 * ConversationAnnotation
 */
export const zConversationAnnotation = z.object({
  account: zSimpleAccount.nullish(),
  content: z.string(),
  created_at: z.int().nullish(),
  id: z.string(),
  question: z.string().nullish(),
})

/**
 * ConversationAnnotationHitHistory
 */
export const zConversationAnnotationHitHistory = z.object({
  annotation_create_account: zSimpleAccount.nullish(),
  annotation_id: z.string(),
  created_at: z.int().nullish(),
})

/**
 * Feedback
 */
export const zFeedback = z.object({
  content: z.string().nullish(),
  from_account: zSimpleAccount.nullish(),
  from_end_user_id: z.string().nullish(),
  from_source: z.string(),
  rating: z.string(),
})

/**
 * ExecutionContentType
 */
export const zExecutionContentType = z.enum(['human_input'])

/**
 * EnvSuggestion
 */
export const zEnvSuggestion = z.object({
  key: z.string(),
  reason: z.string().optional().default(''),
  secret_likely: z.boolean().optional().default(false),
})

/**
 * CliToolSuggestion
 */
export const zCliToolSuggestion = z.object({
  command: z.string().optional().default(''),
  description: z.string().optional().default(''),
  env_suggestions: z.array(zEnvSuggestion).optional(),
  inferred_from: z.string().optional().default(''),
  install_commands: z.array(z.string()).optional(),
  name: z.string(),
})

/**
 * SkillToolInferenceResult
 */
export const zSkillToolInferenceResult = z.object({
  cli_tools: z.array(zCliToolSuggestion).optional(),
  inferable: z.boolean(),
  reason: z.string().nullish(),
})

/**
 * AgentAverageResponseTimeStatisticResponse
 */
export const zAgentAverageResponseTimeStatisticResponse = z.object({
  date: z.string(),
  latency: z.number(),
})

/**
 * AgentAverageSessionInteractionStatisticResponse
 */
export const zAgentAverageSessionInteractionStatisticResponse = z.object({
  date: z.string(),
  interactions: z.number(),
})

/**
 * AgentDailyConversationStatisticResponse
 */
export const zAgentDailyConversationStatisticResponse = z.object({
  conversation_count: z.int(),
  date: z.string(),
})

/**
 * AgentDailyEndUserStatisticResponse
 */
export const zAgentDailyEndUserStatisticResponse = z.object({
  date: z.string(),
  terminal_count: z.int(),
})

/**
 * AgentDailyMessageStatisticResponse
 */
export const zAgentDailyMessageStatisticResponse = z.object({
  date: z.string(),
  message_count: z.int(),
})

/**
 * AgentTokenUsageStatisticResponse
 */
export const zAgentTokenUsageStatisticResponse = z.object({
  currency: z.string(),
  date: z.string(),
  token_count: z.int(),
  total_price: z.string(),
})

/**
 * AgentTokensPerSecondStatisticResponse
 */
export const zAgentTokensPerSecondStatisticResponse = z.object({
  date: z.string(),
  tps: z.number(),
})

/**
 * AgentUserSatisfactionRateStatisticResponse
 */
export const zAgentUserSatisfactionRateStatisticResponse = z.object({
  date: z.string(),
  rate: z.number(),
})

/**
 * AgentStatisticChartsResponse
 */
export const zAgentStatisticChartsResponse = z.object({
  average_response_time: z.array(zAgentAverageResponseTimeStatisticResponse).optional(),
  average_session_interactions: z
    .array(zAgentAverageSessionInteractionStatisticResponse)
    .optional(),
  daily_conversations: z.array(zAgentDailyConversationStatisticResponse).optional(),
  daily_end_users: z.array(zAgentDailyEndUserStatisticResponse).optional(),
  daily_messages: z.array(zAgentDailyMessageStatisticResponse).optional(),
  token_usage: z.array(zAgentTokenUsageStatisticResponse).optional(),
  tokens_per_second: z.array(zAgentTokensPerSecondStatisticResponse).optional(),
  user_satisfaction_rate: z.array(zAgentUserSatisfactionRateStatisticResponse).optional(),
})

/**
 * AgentStatisticSummaryEnvelopeResponse
 */
export const zAgentStatisticSummaryEnvelopeResponse = z.object({
  charts: zAgentStatisticChartsResponse,
  source: z.string(),
  summary: zAgentStatisticSummaryResponse,
})

/**
 * AgentConfigRevisionOperation
 *
 * Audit operation recorded for Agent Soul version/revision changes.
 */
export const zAgentConfigRevisionOperation = z.enum([
  'create_version',
  'import_package',
  'publish_draft',
  'restore_version',
  'save_current_version',
  'save_new_agent',
  'save_new_version',
  'save_to_roster',
])

/**
 * AgentConfigRevisionResponse
 */
export const zAgentConfigRevisionResponse = z.object({
  created_at: z.int().nullish(),
  created_by: z.string().nullish(),
  current_snapshot_id: z.string(),
  id: z.string(),
  operation: zAgentConfigRevisionOperation,
  previous_snapshot_id: z.string().nullish(),
  revision: z.int(),
  summary: z.string().nullish(),
  version_note: z.string().nullish(),
})

/**
 * AgentEnvVariableConfig
 */
export const zAgentEnvVariableConfig = z.object({
  default: z
    .union([
      z.string(),
      z.int(),
      z.number(),
      z.boolean(),
      z.array(z.string()),
      z.array(z.int()),
      z.array(z.number()),
      z.array(z.boolean()),
    ])
    .nullish(),
  env_name: z.string().max(255).nullish(),
  key: z.string().max(255).nullish(),
  name: z.string().max(255).nullish(),
  required: z.boolean().optional().default(false),
  type: z.string().max(64).nullish(),
  value: z
    .union([
      z.string(),
      z.int(),
      z.number(),
      z.boolean(),
      z.array(z.string()),
      z.array(z.int()),
      z.array(z.number()),
      z.array(z.boolean()),
    ])
    .nullish(),
  variable: z.string().max(255).nullish(),
})

/**
 * AgentFileRefConfig
 */
export const zAgentFileRefConfig = z.object({
  drive_key: z.string().max(512).nullish(),
  file_id: z.string().max(255).nullish(),
  id: z.string().max(255).nullish(),
  name: z.string().max(255).nullish(),
  reference: z.string().max(255).nullish(),
  remote_url: z.string().nullish(),
  tenant_id: z.string().max(255).nullish(),
  transfer_method: z.string().max(64).nullish(),
  type: z.string().max(64).nullish(),
  upload_file_id: z.string().max(255).nullish(),
  url: z.string().nullish(),
})

/**
 * WorkflowNodeJobMetadata
 */
export const zWorkflowNodeJobMetadata = z.object({
  agent_soul: z.record(z.string(), z.unknown()).nullish(),
  file_refs: z.array(zAgentFileRefConfig).nullish(),
})

/**
 * AgentSkillRefConfig
 */
export const zAgentSkillRefConfig = z.object({
  description: z.string().nullish(),
  file_id: z.string().max(255).nullish(),
  full_archive_file_id: z.string().max(255).nullish(),
  full_archive_key: z.string().max(512).nullish(),
  id: z.string().max(255).nullish(),
  manifest_files: z.array(z.string()).nullish(),
  name: z.string().max(255).nullish(),
  path: z.string().nullish(),
  skill_md_file_id: z.string().max(255).nullish(),
  skill_md_key: z.string().max(512).nullish(),
})

/**
 * AgentSoulFilesConfig
 */
export const zAgentSoulFilesConfig = z.object({
  files: z.array(zAgentFileRefConfig).optional(),
  skills: z.array(zAgentSkillRefConfig).optional(),
})

/**
 * AgentHumanToolConfig
 */
export const zAgentHumanToolConfig = z.object({
  description: z.string().nullish(),
  enabled: z.boolean().optional().default(true),
  name: z.string().max(255).nullish(),
})

/**
 * AgentSoulHumanConfig
 */
export const zAgentSoulHumanConfig = z.object({
  contacts: z.array(zAgentHumanContactConfig).optional(),
  tools: z.array(zAgentHumanToolConfig).optional(),
})

/**
 * AgentMemoryArtifactConfig
 */
export const zAgentMemoryArtifactConfig = z.object({
  id: z.string().max(255).nullish(),
  name: z.string().max(255).nullish(),
  type: z.string().max(64).nullish(),
  url: z.string().nullish(),
})

/**
 * AgentSoulMemoryConfig
 */
export const zAgentSoulMemoryConfig = z.object({
  artifacts: z.array(zAgentMemoryArtifactConfig).optional(),
  budget: z.string().nullish(),
  scope: z.string().nullish(),
})

/**
 * AgentSoulModelCredentialRef
 *
 * Reference to model credentials resolved only at runtime.
 */
export const zAgentSoulModelCredentialRef = z.object({
  id: z.string().max(255).nullish(),
  provider: z.string().max(255).nullish(),
  type: z.string().min(1).max(64),
})

/**
 * AgentSandboxProviderConfig
 */
export const zAgentSandboxProviderConfig = z.object({
  cpu: z.int().gte(1).nullish(),
  env: z.array(zAgentEnvVariableConfig).optional(),
  image: z.string().nullish(),
  working_dir: z.string().nullish(),
})

/**
 * AgentSoulSandboxConfig
 */
export const zAgentSoulSandboxConfig = z.object({
  config: zAgentSandboxProviderConfig.optional(),
  provider: z.string().nullish(),
})

/**
 * DeclaredArrayItem
 *
 * Per-item shape for an ``array``-typed declared output.
 *
 * PRD §OUTPUT 配置框 keeps arrays one level deep on first version; nested arrays
 * are rejected so the runtime type checker and JSON Schema stay easy to reason
 * about. Stage 4 §4.2.
 */
export const zDeclaredArrayItem = z.object({
  children: z
    .array(
      z.object({
        array_item: z
          .object({
            children: z.array(z.record(z.string(), z.unknown())).optional(),
            description: z.string().nullish(),
            type: z.enum(['array', 'boolean', 'file', 'number', 'object', 'string']).optional(),
          })
          .nullish(),
        children: z.array(z.record(z.string(), z.unknown())).optional(),
        description: z.string().nullish(),
        file: z.record(z.string(), z.unknown()).nullish(),
        name: z.string(),
        required: z.boolean().optional(),
        type: z.enum(['array', 'boolean', 'file', 'number', 'object', 'string']),
      }),
    )
    .optional(),
  description: z.string().nullish(),
  type: zDeclaredOutputType,
})

/**
 * DeclaredOutputFileConfig
 *
 * File-type output metadata. Both lists empty means "any file accepted".
 */
export const zDeclaredOutputFileConfig = z.object({
  extensions: z.array(z.string()).optional(),
  mime_types: z.array(z.string()).optional(),
})

/**
 * AgentCliToolAuthorizationStatus
 *
 * Authorization state for Agent-scoped CLI tools.
 *
 * Missing status keeps backward compatibility with draft rows and CLI tools that
 * do not need pre-authorization. Explicit denied-like states are blocked by the
 * composer/publish validators and skipped by runtime request builders.
 */
export const zAgentCliToolAuthorizationStatus = z.enum([
  'allowed',
  'authorized',
  'denied',
  'forbidden',
  'not_required',
  'pending',
  'pre_authorized',
  'unauthorized',
])

/**
 * AgentPermissionConfig
 */
export const zAgentPermissionConfig = z.object({
  allowed: z.boolean().nullish(),
  state: z.string().max(64).nullish(),
  status: z.string().max(64).nullish(),
})

/**
 * AgentSecretRefConfig
 */
export const zAgentSecretRefConfig = z.object({
  credential_id: z.string().max(255).nullish(),
  env_name: z.string().max(255).nullish(),
  id: z.string().max(255).nullish(),
  key: z.string().max(255).nullish(),
  name: z.string().max(255).nullish(),
  permission: zAgentPermissionConfig.nullish(),
  permission_status: z.string().max(64).nullish(),
  provider: z.string().max(255).nullish(),
  provider_credential_id: z.string().max(255).nullish(),
  ref: z.string().max(255).nullish(),
  type: z.string().max(64).nullish(),
  value: z.string().nullish(),
  variable: z.string().max(255).nullish(),
})

/**
 * AgentSoulEnvConfig
 */
export const zAgentSoulEnvConfig = z.object({
  secret_refs: z.array(zAgentSecretRefConfig).optional(),
  variables: z.array(zAgentEnvVariableConfig).optional(),
})

/**
 * AgentCliToolEnvConfig
 */
export const zAgentCliToolEnvConfig = z.object({
  secret_refs: z.array(zAgentSecretRefConfig).optional(),
  variables: z.array(zAgentEnvVariableConfig).optional(),
})

/**
 * AgentCliToolRiskLevel
 *
 * Risk marker for CLI tool bootstrap commands.
 */
export const zAgentCliToolRiskLevel = z.enum(['dangerous', 'safe', 'unknown'])

/**
 * AgentCliToolConfig
 */
export const zAgentCliToolConfig = z.object({
  approved: z.boolean().optional().default(false),
  authorization_status: zAgentCliToolAuthorizationStatus.nullish(),
  command: z.string().nullish(),
  dangerous: z.boolean().optional().default(false),
  dangerous_accepted: z.boolean().optional().default(false),
  dangerous_acknowledged: z.boolean().optional().default(false),
  dangerous_command: z.boolean().optional().default(false),
  description: z.string().nullish(),
  enabled: z.boolean().optional().default(true),
  env: zAgentCliToolEnvConfig.optional(),
  id: z.string().max(255).nullish(),
  inferred_from: z.string().max(255).nullish(),
  install: z.string().nullish(),
  install_command: z.string().nullish(),
  install_commands: z.array(z.string()).optional(),
  invoke_metadata: z.record(z.string(), z.unknown()).optional(),
  label: z.string().max(255).nullish(),
  name: z.string().max(255).nullish(),
  permission: zAgentPermissionConfig.nullish(),
  pre_authorized: z.boolean().nullish(),
  requires_confirmation: z.boolean().optional().default(false),
  risk_accepted: z.boolean().optional().default(false),
  risk_level: zAgentCliToolRiskLevel.nullish(),
  setup_command: z.string().nullish(),
  tool_name: z.string().max(255).nullish(),
})

/**
 * AgentComposerKnowledgeDatasetCandidateResponse
 */
export const zAgentComposerKnowledgeDatasetCandidateResponse = z.object({
  description: z.string().nullish(),
  id: z.string().max(255).nullish(),
  missing: z.boolean().optional().default(false),
  name: z.string().max(255).nullish(),
})

/**
 * AgentComposerKnowledgeSetCandidateResponse
 */
export const zAgentComposerKnowledgeSetCandidateResponse = z.object({
  datasets: z.array(zAgentComposerKnowledgeDatasetCandidateResponse).optional(),
  description: z.string().nullish(),
  id: z.string(),
  missing_dataset_ids: z.array(z.string()).optional(),
  name: z.string(),
})

/**
 * AgentComposerSoulCandidatesResponse
 */
export const zAgentComposerSoulCandidatesResponse = z.object({
  cli_tools: z.array(zAgentCliToolConfig).optional(),
  dify_tools: z.array(zAgentComposerDifyToolCandidateResponse).optional(),
  human_contacts: z.array(zAgentHumanContactConfig).optional(),
  knowledge_sets: z.array(zAgentComposerKnowledgeSetCandidateResponse).optional(),
})

/**
 * AgentComposerCandidatesResponse
 */
export const zAgentComposerCandidatesResponse = z.object({
  allowed_node_job_candidates: zAgentComposerNodeJobCandidatesResponse.optional(),
  allowed_soul_candidates: zAgentComposerSoulCandidatesResponse.optional(),
  capabilities: zComposerCandidateCapabilities.optional(),
  truncated: z.boolean().optional().default(false),
  variant: zComposerVariant,
})

/**
 * AgentModerationIOConfig
 */
export const zAgentModerationIoConfig = z.object({
  enabled: z.boolean().optional().default(false),
  preset_response: z.string().nullish(),
})

/**
 * AgentModerationProviderConfig
 */
export const zAgentModerationProviderConfig = z.object({
  api_based_extension_id: z.string().nullish(),
  inputs_config: zAgentModerationIoConfig.nullish(),
  keywords: z.string().nullish(),
  outputs_config: zAgentModerationIoConfig.nullish(),
})

/**
 * AgentSensitiveWordAvoidanceFeatureConfig
 */
export const zAgentSensitiveWordAvoidanceFeatureConfig = z.object({
  config: zAgentModerationProviderConfig.nullish(),
  enabled: z.boolean().optional().default(false),
  type: z.string().nullish(),
})

/**
 * AgentAppFeaturesPayload
 *
 * Presentation features configurable on an Agent App.
 *
 * All fields are optional; an omitted field is reset to its disabled/empty
 * default (the config form sends the full desired feature state on save).
 */
export const zAgentAppFeaturesPayload = z.object({
  opening_statement: z.string().nullish(),
  retriever_resource: zAgentFeatureToggleConfig.nullish(),
  sensitive_word_avoidance: zAgentSensitiveWordAvoidanceFeatureConfig.nullish(),
  speech_to_text: zAgentFeatureToggleConfig.nullish(),
  suggested_questions: z.array(z.string()).nullish(),
  suggested_questions_after_answer: zAgentSuggestedQuestionsAfterAnswerFeatureConfig.nullish(),
  text_to_speech: zAgentTextToSpeechFeatureConfig.nullish(),
})

export const zJsonValue2 = z.unknown()

/**
 * HumanInputFormSubmissionData
 */
export const zHumanInputFormSubmissionData = z.object({
  action_id: z.string(),
  action_text: z.string(),
  node_id: z.string(),
  node_title: z.string(),
  rendered_content: z.string(),
  submitted_data: z.record(z.string(), zJsonValue2).nullish(),
})

/**
 * FileType
 */
export const zFileType = z.enum(['audio', 'custom', 'document', 'image', 'video'])

/**
 * FileTransferMethod
 */
export const zFileTransferMethod = z.enum([
  'datasource_file',
  'local_file',
  'remote_url',
  'tool_file',
])

/**
 * AgentFileUploadImageFeatureConfig
 */
export const zAgentFileUploadImageFeatureConfig = z.object({
  enabled: z.boolean().optional().default(true),
})

/**
 * AgentFileUploadFeatureConfig
 */
export const zAgentFileUploadFeatureConfig = z.object({
  allowed_file_extensions: z.array(z.string()).optional(),
  allowed_file_types: z.array(zFileType).optional(),
  allowed_file_upload_methods: z.array(zFileTransferMethod).optional(),
  enabled: z.boolean().optional().default(true),
  image: zAgentFileUploadImageFeatureConfig.optional(),
  number_limits: z.int().optional().default(3),
})

/**
 * AgentSoulAppFeaturesConfig
 */
export const zAgentSoulAppFeaturesConfig = z.object({
  file_upload: zAgentFileUploadFeatureConfig.optional(),
  opening_statement: z.string().nullish(),
  retriever_resource: zAgentFeatureToggleConfig.nullish(),
  sensitive_word_avoidance: zAgentSensitiveWordAvoidanceFeatureConfig.nullish(),
  speech_to_text: zAgentFeatureToggleConfig.nullish(),
  suggested_questions: z.array(z.string()).nullish(),
  suggested_questions_after_answer: zAgentSuggestedQuestionsAfterAnswerFeatureConfig.nullish(),
  text_to_speech: zAgentTextToSpeechFeatureConfig.nullish(),
})

/**
 * AgentKnowledgeDatasetConfig
 */
export const zAgentKnowledgeDatasetConfig = z.object({
  description: z.string().nullish(),
  id: z.string().max(255).nullish(),
  name: z.string().max(255).nullish(),
})

/**
 * AgentModelResponseFormatConfig
 */
export const zAgentModelResponseFormatConfig = z.object({
  type: z.string().max(64).nullish(),
})

/**
 * AgentSoulModelSettings
 */
export const zAgentSoulModelSettings = z.object({
  frequency_penalty: z.number().nullish(),
  max_tokens: z.int().nullish(),
  presence_penalty: z.number().nullish(),
  response_format: zAgentModelResponseFormatConfig.nullish(),
  stop: z.array(z.string()).nullish(),
  temperature: z.number().nullish(),
  top_p: z.number().nullish(),
})

/**
 * AgentSoulModelConfig
 *
 * Stable model selection for Agent runtime without storing secret values.
 */
export const zAgentSoulModelConfig = z.object({
  credential_ref: zAgentSoulModelCredentialRef.nullish(),
  model: z.string().min(1).max(255),
  model_provider: z.string().min(1).max(255),
  model_settings: zAgentSoulModelSettings.optional(),
  plugin_id: z.string().min(1).max(255),
})

/**
 * DeclaredOutputCheckConfig
 *
 * File-output content check via a model-based comparison against a benchmark file.
 *
 * Per PRD §OUTPUT 配置框, output check is **file-only** and optional. Stage 4 §4.3.
 */
export const zDeclaredOutputCheckConfig = z.object({
  benchmark_file_ref: zAgentFileRefConfig.nullish(),
  enabled: z.boolean().optional().default(false),
  model_ref: zAgentSoulModelConfig.nullish(),
  prompt: z.string().nullish(),
})

/**
 * AgentSoulDifyToolCredentialRef
 *
 * Reference to a stored Dify Plugin Tool credential.
 *
 * Secret values are resolved only at runtime. The legacy ``credential_id``
 * field is accepted by :class:`AgentSoulDifyToolConfig` and normalized here so
 * old Agent tool payloads can be read while new payloads stay explicit.
 */
export const zAgentSoulDifyToolCredentialRef = z.object({
  id: z.string().max(255).nullish(),
  provider: z.string().max(255).nullish(),
  type: z.enum(['provider', 'tool']).optional().default('tool'),
})

/**
 * ToolProviderType
 *
 * Enum class for tool provider
 */
export const zToolProviderType = z.enum([
  'api',
  'app',
  'builtin',
  'dataset-retrieval',
  'mcp',
  'plugin',
  'workflow',
])

/**
 * AgentSoulDifyToolConfig
 *
 * One Dify tool configured on Agent Soul.
 *
 * The API backend prepares this persisted product shape into
 * either ``DifyPluginToolConfig`` or ``DifyCoreToolConfig`` before sending a
 * run request to Agent backend. ``plugin`` providers keep the direct
 * ``dify.plugin.tools`` transport; ``builtin`` / ``api`` / ``workflow`` /
 * ``mcp`` providers are prepared for ``dify.core.tools``. ``provider_id``
 * keeps compatibility with existing Agent tool config payloads; new callers
 * should send ``plugin_id`` + ``provider`` when available.
 */
export const zAgentSoulDifyToolConfig = z.object({
  credential_ref: zAgentSoulDifyToolCredentialRef.nullish(),
  credential_type: z.enum(['api-key', 'oauth2', 'unauthorized']).optional().default('api-key'),
  description: z.string().nullish(),
  enabled: z.boolean().optional().default(true),
  name: z.string().max(255).nullish(),
  plugin_id: z.string().max(255).nullish(),
  provider: z.string().max(255).nullish(),
  provider_id: z.string().max(255).nullish(),
  provider_type: zToolProviderType,
  runtime_parameters: z
    .record(
      z.string(),
      z
        .union([
          z.string(),
          z.int(),
          z.number(),
          z.boolean(),
          z.array(z.string()),
          z.array(z.int()),
          z.array(z.number()),
          z.array(z.boolean()),
        ])
        .nullable(),
    )
    .optional(),
  tool_name: z.string().min(1).max(255).nullish(),
})

/**
 * AgentSoulToolsConfig
 */
export const zAgentSoulToolsConfig = z.object({
  cli_tools: z.array(zAgentCliToolConfig).optional(),
  dify_tools: z.array(zAgentSoulDifyToolConfig).optional(),
})

/**
 * OutputErrorStrategy
 *
 * Per-output failure handling strategy.
 *
 * Mirrors ``graphon.ErrorStrategy`` but scoped to a single declared output of
 * a Workflow Agent Node. The runtime applies the strategy after type check or
 * output check fails and any configured retry attempts have been exhausted.
 */
export const zOutputErrorStrategy = z.enum(['default_value', 'fail_branch', 'stop'])

/**
 * DeclaredOutputRetryConfig
 *
 * Per-output retry configuration that mirrors ``graphon.RetryConfig`` shape.
 */
export const zDeclaredOutputRetryConfig = z.object({
  enabled: z.boolean().optional().default(false),
  max_retries: z.int().gte(0).lte(10).optional().default(0),
  retry_interval_ms: z.int().gte(0).lte(60000).optional().default(0),
})

/**
 * DeclaredOutputFailureStrategy
 *
 * Per-output failure handling.
 *
 * A single strategy applies to both ``type_check`` and ``output_check`` failures
 * (PRD does not distinguish them at the UX level). Stage 4 §4.4.
 */
export const zDeclaredOutputFailureStrategy = z.object({
  default_value: z.unknown().optional(),
  on_failure: zOutputErrorStrategy.optional().default('stop'),
  retry: zDeclaredOutputRetryConfig.optional(),
})

/**
 * DeclaredOutputConfig
 *
 * One declared output of a Workflow Agent Node.
 *
 * Stage 4 normalizes the shape: ``check`` is singular (was ``checks: list`` in
 * stage 3), and ``failure_strategy`` defaults to a populated value so runtime
 * code can call ``output.failure_strategy.on_failure`` without None-guards.
 */
export const zDeclaredOutputConfig = z.object({
  array_item: zDeclaredArrayItem.nullish(),
  check: zDeclaredOutputCheckConfig.nullish(),
  children: z
    .array(
      z.object({
        array_item: z
          .object({
            children: z.array(z.record(z.string(), z.unknown())).optional(),
            description: z.string().nullish(),
            type: z.enum(['array', 'boolean', 'file', 'number', 'object', 'string']).optional(),
          })
          .nullish(),
        children: z.array(z.record(z.string(), z.unknown())).optional(),
        description: z.string().nullish(),
        file: z.record(z.string(), z.unknown()).nullish(),
        name: z.string(),
        required: z.boolean().optional(),
        type: z.enum(['array', 'boolean', 'file', 'number', 'object', 'string']),
      }),
    )
    .optional(),
  description: z.string().nullish(),
  failure_strategy: zDeclaredOutputFailureStrategy.optional(),
  file: zDeclaredOutputFileConfig.nullish(),
  id: z.string().nullish(),
  name: z.string().min(1).max(255),
  required: z.boolean().optional().default(true),
  type: zDeclaredOutputType,
})

/**
 * WorkflowNodeJobConfig
 */
export const zWorkflowNodeJobConfig = z.object({
  declared_outputs: z.array(zDeclaredOutputConfig).optional(),
  human_contacts: z.array(zAgentHumanContactConfig).optional(),
  metadata: zWorkflowNodeJobMetadata.optional(),
  mode: zWorkflowNodeJobMode.optional().default('tell_agent_what_to_do'),
  previous_node_output_refs: z.array(zWorkflowPreviousNodeOutputRef).optional(),
  schema_version: z.int().optional().default(1),
  workflow_prompt: z.string().optional().default(''),
})

/**
 * ButtonStyle
 *
 * Button styles for user actions.
 */
export const zButtonStyle = z.enum(['accent', 'default', 'ghost', 'primary'])

/**
 * UserActionConfig
 *
 * User action configuration.
 */
export const zUserActionConfig = z.object({
  button_style: zButtonStyle.optional().default('default'),
  id: z.string().max(20),
  title: z.string().max(100),
})

/**
 * FileInputConfig
 */
export const zFileInputConfig = z.object({
  allowed_file_extensions: z.array(z.string()).optional(),
  allowed_file_types: z.array(zFileType).optional(),
  allowed_file_upload_methods: z.array(zFileTransferMethod).optional(),
  output_variable_name: z.string(),
  type: z.literal('file').optional().default('file'),
})

/**
 * FileListInputConfig
 */
export const zFileListInputConfig = z.object({
  allowed_file_extensions: z.array(z.string()).optional(),
  allowed_file_types: z.array(zFileType).optional(),
  allowed_file_upload_methods: z.array(zFileTransferMethod).optional(),
  number_limits: z.int().gte(0).optional().default(0),
  output_variable_name: z.string(),
  type: z.literal('file-list').optional().default('file-list'),
})

/**
 * AgentKnowledgeModelConfig
 */
export const zAgentKnowledgeModelConfig = z.object({
  completion_params: z.record(z.string(), z.unknown()).optional(),
  mode: z.string().min(1).max(64),
  name: z.string().min(1).max(255),
  provider: z.string().min(1).max(255),
})

/**
 * AgentKnowledgeQueryMode
 */
export const zAgentKnowledgeQueryMode = z.enum(['generated_query', 'user_query'])

/**
 * AgentKnowledgeQueryConfig
 *
 * Per-set query policy for Agent v2 knowledge retrieval.
 *
 * Agent v2 stores knowledge as explicit ``knowledge.sets`` rather than the
 * legacy flat ``datasets`` / ``query_mode`` / ``query_config`` shape. Each
 * set owns its own query policy. Mode-dependent completeness, such as
 * requiring ``value`` for ``user_query``, is enforced by composer publish
 * validation so draft saves can persist partially configured knowledge sets.
 */
export const zAgentKnowledgeQueryConfig = z.object({
  mode: zAgentKnowledgeQueryMode,
  value: z.string().nullish(),
})

/**
 * AgentKnowledgeRerankingModelConfig
 */
export const zAgentKnowledgeRerankingModelConfig = z.object({
  model: z.string().min(1).max(255),
  provider: z.string().min(1).max(255),
})

/**
 * AgentKnowledgeWeightedScoreConfig
 */
export const zAgentKnowledgeWeightedScoreConfig = z.object({
  keyword_setting: z.record(z.string(), z.unknown()).nullish(),
  vector_setting: z.record(z.string(), z.unknown()).nullish(),
  weight_type: z.string().max(64).nullish(),
})

/**
 * AgentKnowledgeRetrievalConfig
 *
 * Per-set retrieval policy for Agent v2 knowledge retrieval.
 *
 * Retrieval settings now live on each knowledge set instead of one shared
 * flat config. Mode-dependent completeness, such as requiring ``top_k`` for
 * ``multiple`` or a model for ``single``, is enforced by composer publish
 * validation so draft saves can persist partially configured knowledge sets.
 */
export const zAgentKnowledgeRetrievalConfig = z.object({
  mode: z.enum(['multiple', 'single']),
  model: zAgentKnowledgeModelConfig.nullish(),
  reranking_enable: z.boolean().optional().default(true),
  reranking_mode: z.string().optional().default('reranking_model'),
  reranking_model: zAgentKnowledgeRerankingModelConfig.nullish(),
  score_threshold: z.number().gte(0).lte(1).nullish(),
  top_k: z.int().gte(1).nullish(),
  weights: zAgentKnowledgeWeightedScoreConfig.nullish(),
})

/**
 * AgentKnowledgeMetadataCondition
 */
export const zAgentKnowledgeMetadataCondition = z.object({
  comparison_operator: z.enum([
    '<',
    '=',
    '>',
    'after',
    'before',
    'contains',
    'empty',
    'end with',
    'in',
    'is',
    'is not',
    'not contains',
    'not empty',
    'not in',
    'start with',
    '≠',
    '≤',
    '≥',
  ]),
  name: z.string().min(1).max(255),
  value: z.union([z.string(), z.array(z.string()), z.number()]).nullish(),
})

/**
 * AgentKnowledgeMetadataConditions
 */
export const zAgentKnowledgeMetadataConditions = z.object({
  conditions: z.array(zAgentKnowledgeMetadataCondition).optional(),
  logical_operator: z.enum(['and', 'or']).optional().default('and'),
})

/**
 * AgentKnowledgeMetadataFilteringConfig
 *
 * Per-set metadata filtering policy.
 *
 * The Python attribute uses ``metadata_model_config`` for clarity because the
 * model belongs to metadata filtering specifically, while the external API and
 * generated schema keep the historical ``model_config`` field name via alias.
 * Mode-dependent completeness is enforced by composer publish validation so
 * draft saves can persist partially configured metadata filters.
 */
export const zAgentKnowledgeMetadataFilteringConfig = z.object({
  conditions: zAgentKnowledgeMetadataConditions.nullish(),
  mode: z.enum(['automatic', 'disabled', 'manual']).optional().default('disabled'),
  model_config: zAgentKnowledgeModelConfig.nullish(),
})

/**
 * AgentKnowledgeSetConfig
 *
 * One explicit knowledge set in Agent v2.
 *
 * ``knowledge.sets`` replaces the old flat knowledge config. Each set owns
 * its datasets plus query, retrieval, and metadata policies. An individual
 * set must contain at least one dataset id even though the overall knowledge
 * section may be empty, which is how callers express "no knowledge layer".
 */
export const zAgentKnowledgeSetConfig = z.object({
  datasets: z.array(zAgentKnowledgeDatasetConfig),
  description: z.string().nullish(),
  id: z.string().min(1).max(255),
  metadata_filtering: zAgentKnowledgeMetadataFilteringConfig.optional(),
  name: z.string().min(1).max(255),
  query: zAgentKnowledgeQueryConfig,
  retrieval: zAgentKnowledgeRetrievalConfig,
})

/**
 * AgentSoulKnowledgeConfig
 *
 * Top-level Agent v2 knowledge config.
 *
 * Agent v2 models knowledge as explicit sets instead of one flat
 * ``datasets`` / ``query_mode`` / ``query_config`` block. An empty ``sets``
 * list means no knowledge layer should be emitted at runtime, while set-name
 * uniqueness stays case-insensitive because runtime selection addresses sets
 * by name.
 */
export const zAgentSoulKnowledgeConfig = z.object({
  sets: z.array(zAgentKnowledgeSetConfig).optional(),
})

/**
 * AgentSoulConfig
 */
export const zAgentSoulConfig = z.object({
  app_features: zAgentSoulAppFeaturesConfig.optional(),
  app_variables: z.array(zAppVariableConfig).optional(),
  config_files: z.array(zAgentConfigFileRefConfig).optional(),
  config_note: z.string().optional().default(''),
  config_skills: z.array(zAgentConfigSkillRefConfig).optional(),
  env: zAgentSoulEnvConfig.optional(),
  files: zAgentSoulFilesConfig.optional(),
  human: zAgentSoulHumanConfig.optional(),
  knowledge: zAgentSoulKnowledgeConfig.optional(),
  memory: zAgentSoulMemoryConfig.optional(),
  misc_legacy: zAgentSoulAppFeaturesConfig.optional(),
  model: zAgentSoulModelConfig.nullish(),
  prompt: zAgentSoulPromptConfig.optional(),
  sandbox: zAgentSoulSandboxConfig.optional(),
  schema_version: z.int().optional().default(1),
  tools: zAgentSoulToolsConfig.optional(),
})

/**
 * AgentBuildDraftResponse
 */
export const zAgentBuildDraftResponse = z.object({
  agent_soul: zAgentSoulConfig,
  draft: zAgentConfigDraftSummaryResponse,
  variant: z.string(),
})

/**
 * ComposerSavePayload
 */
export const zComposerSavePayload = z.object({
  agent_soul: zAgentSoulConfig.nullish(),
  binding: zComposerBindingPayload.nullish(),
  client_revision_id: z.string().nullish(),
  description: z.string().nullish(),
  icon: z.string().max(255).nullish(),
  icon_background: z.string().max(255).nullish(),
  icon_type: zAgentIconType.nullish(),
  idempotency_key: z.string().nullish(),
  new_agent_name: z.string().min(1).max(255).nullish(),
  node_job: zWorkflowNodeJobConfig.nullish(),
  role: z.string().max(255).nullish(),
  save_strategy: zComposerSaveStrategy,
  soul_lock: zComposerSoulLockPayload.optional(),
  variant: zComposerVariant,
  version_note: z.string().nullish(),
})

/**
 * AgentAppComposerResponse
 */
export const zAgentAppComposerResponse = z.object({
  active_config_is_published: z.boolean(),
  active_config_snapshot: zAgentConfigSnapshotSummaryResponse.nullish(),
  agent: zAgentComposerAgentResponse,
  agent_soul: zAgentSoulConfig,
  app_id: z.string().nullish(),
  backing_app_id: z.string().nullish(),
  chat_endpoint: z.string().nullish(),
  draft: zAgentConfigDraftSummaryResponse.nullish(),
  hidden_app_backed: z.boolean().optional().default(false),
  save_options: z.array(zComposerSaveStrategy),
  validation: zComposerValidationFindingsResponse.nullish(),
  variant: z.literal('agent_app'),
})

/**
 * AgentConfigSnapshotDetailResponse
 */
export const zAgentConfigSnapshotDetailResponse = z.object({
  agent_id: z.string().nullish(),
  config_snapshot: zAgentSoulConfig,
  created_at: z.int().nullish(),
  created_by: z.string().nullish(),
  display_version: z.int().nullish(),
  id: z.string(),
  revisions: z.array(zAgentConfigRevisionResponse).optional(),
  snapshot_version: z.int().nullish(),
  summary: z.string().nullish(),
  version: z.int(),
  version_note: z.string().nullish(),
})

/**
 * ValueSourceType
 *
 * ValueSourceType records whether the value comes from a static setting
 * in form definition, or a variable while the workflow is running.
 */
export const zValueSourceType = z.enum(['constant', 'variable'])

/**
 * StringSource
 *
 * Default configuration for form inputs.
 */
export const zStringSource = z.object({
  selector: z.array(z.string()).optional(),
  type: zValueSourceType,
  value: z.string().optional().default(''),
})

/**
 * ParagraphInputConfig
 *
 * Form input definition.
 */
export const zParagraphInputConfig = z.object({
  default: zStringSource.nullish(),
  output_variable_name: z.string(),
  type: z.literal('paragraph').optional().default('paragraph'),
})

/**
 * StringListSource
 */
export const zStringListSource = z.object({
  selector: z.array(z.string()).optional(),
  type: zValueSourceType,
  value: z.array(z.string()).optional(),
})

/**
 * SelectInputConfig
 */
export const zSelectInputConfig = z.object({
  option_source: zStringListSource,
  output_variable_name: z.string(),
  type: z.literal('select').optional().default('select'),
})

export const zFormInputConfig = z.discriminatedUnion('type', [
  zParagraphInputConfig.extend({ type: z.literal('paragraph') }),
  zSelectInputConfig.extend({ type: z.literal('select') }),
  zFileInputConfig.extend({ type: z.literal('file') }),
  zFileListInputConfig.extend({ type: z.literal('file-list') }),
])

/**
 * HumanInputFormDefinition
 */
export const zHumanInputFormDefinition = z.object({
  actions: z.array(zUserActionConfig).optional(),
  display_in_ui: z.boolean().optional().default(false),
  expiration_time: z.int(),
  form_content: z.string(),
  form_id: z.string(),
  form_token: z.string().nullish(),
  inputs: z.array(zFormInputConfig).optional(),
  node_id: z.string(),
  node_title: z.string(),
  resolved_default_values: z.record(z.string(), z.unknown()).optional(),
})

/**
 * HumanInputContent
 */
export const zHumanInputContent = z.object({
  form_definition: zHumanInputFormDefinition.nullish(),
  form_submission_data: zHumanInputFormSubmissionData.nullish(),
  submitted: z.boolean(),
  type: zExecutionContentType.optional().default('human_input'),
  workflow_run_id: z.string(),
})

/**
 * MessageDetailResponse
 */
export const zMessageDetailResponse = z.object({
  agent_thoughts: z.array(zAgentThought),
  annotation: zConversationAnnotation.nullish(),
  annotation_hit_history: zConversationAnnotationHitHistory.nullish(),
  answer: z.string(),
  answer_tokens: z.int(),
  conversation_id: z.string(),
  created_at: z.int().nullish(),
  error: z.string().nullish(),
  extra_contents: z.array(zHumanInputContent).optional(),
  feedbacks: z.array(zFeedback),
  from_account_id: z.string().nullish(),
  from_end_user_id: z.string().nullish(),
  from_source: z.string(),
  id: z.string(),
  inputs: z.record(z.string(), zJsonValue),
  message: zJsonValue,
  message_files: z.array(zMessageFile),
  message_tokens: z.int(),
  metadata: zJsonValue,
  parent_message_id: z.string().nullish(),
  provider_response_latency: z.number(),
  query: z.string(),
  status: z.string(),
  workflow_run_id: z.string().nullish(),
})

/**
 * MessageInfiniteScrollPaginationResponse
 */
export const zMessageInfiniteScrollPaginationResponse = z.object({
  data: z.array(zMessageDetailResponse),
  has_more: z.boolean(),
  limit: z.int(),
})

/**
 * AgentAppPartial
 */
export const zAgentAppPartialWritable = z.object({
  access_mode: z.string().nullish(),
  active_config_is_published: z.boolean().optional().default(false),
  app_id: z.string().nullish(),
  author_name: z.string().nullish(),
  backing_app_id: z.string().nullish(),
  bound_agent_id: z.string().nullish(),
  create_user_name: z.string().nullish(),
  created_at: z.int().nullish(),
  created_by: z.string().nullish(),
  debug_conversation_id: z.string().nullish(),
  description: z.string().nullish(),
  has_draft_trigger: z.boolean().nullish(),
  hidden_app_backed: z.boolean().optional().default(false),
  icon: z.string().nullish(),
  icon_background: z.string().nullish(),
  icon_type: z.string().nullish(),
  id: z.string(),
  is_starred: z.boolean().optional().default(false),
  maintainer: z.string().nullish(),
  max_active_requests: z.int().nullish(),
  mode: z.string(),
  model_config: zModelConfigPartial.nullish(),
  name: z.string(),
  permission_keys: z.array(z.string()).optional(),
  published_reference_count: z.int().optional().default(0),
  published_references: z.array(zAgentAppPublishedReferenceResponse).optional(),
  reference_count: z.int().nullish(),
  role: z.string().nullish(),
  tags: z.array(zTag).optional(),
  updated_at: z.int().nullish(),
  updated_by: z.string().nullish(),
  use_icon_as_answer_icon: z.boolean().nullish(),
  workflow: zWorkflowPartial.nullish(),
})

/**
 * AgentAppPagination
 */
export const zAgentAppPaginationWritable = z.object({
  data: z.array(zAgentAppPartialWritable),
  has_more: z.boolean(),
  limit: z.int(),
  page: z.int(),
  total: z.int(),
})

/**
 * AppDetailSiteResponse
 */
export const zAppDetailSiteResponseWritable = z.object({
  access_token: z.string().nullish(),
  app_base_url: z.string().nullish(),
  chat_color_theme: z.string().nullish(),
  chat_color_theme_inverted: z.boolean().nullish(),
  code: z.string().nullish(),
  copyright: z.string().nullish(),
  created_at: z.int().nullish(),
  created_by: z.string().nullish(),
  custom_disclaimer: z.string().nullish(),
  customize_domain: z.string().nullish(),
  customize_token_strategy: z.string().nullish(),
  default_language: z.string().nullish(),
  description: z.string().nullish(),
  icon: z.string().nullish(),
  icon_background: z.string().nullish(),
  icon_type: z.union([z.string(), zIconType]).nullish(),
  input_placeholder: z.string().nullish(),
  privacy_policy: z.string().nullish(),
  prompt_public: z.boolean().nullish(),
  show_workflow_steps: z.boolean().nullish(),
  title: z.string().nullish(),
  updated_at: z.int().nullish(),
  updated_by: z.string().nullish(),
  use_icon_as_answer_icon: z.boolean().nullish(),
})

/**
 * AgentAppDetailWithSite
 */
export const zAgentAppDetailWithSiteWritable = z.object({
  access_mode: z.string().nullish(),
  api_base_url: z.string().nullish(),
  app_id: z.string().nullish(),
  backing_app_id: z.string().nullish(),
  bound_agent_id: z.string().nullish(),
  created_at: z.int().nullish(),
  created_by: z.string().nullish(),
  debug_conversation_has_messages: z.boolean().optional().default(false),
  debug_conversation_id: z.string().nullish(),
  debug_conversation_message_count: z.int().optional().default(0),
  deleted_tools: z.array(zDeletedTool).optional(),
  description: z.string().nullish(),
  enable_api: z.boolean(),
  enable_site: z.boolean(),
  hidden_app_backed: z.boolean().optional().default(false),
  icon: z.string().nullish(),
  icon_background: z.string().nullish(),
  icon_type: z.string().nullish(),
  id: z.string(),
  maintainer: z.string().nullish(),
  max_active_requests: z.int().nullish(),
  mode: z.string(),
  model_config: zAppModelConfigResponse.nullish(),
  name: z.string(),
  permission_keys: z.array(z.string()).optional(),
  role: z.string().nullish(),
  site: zAppDetailSiteResponseWritable.nullish(),
  tags: z.array(zTag).optional(),
  tracing: z.unknown().nullish(),
  updated_at: z.int().nullish(),
  updated_by: z.string().nullish(),
  use_icon_as_answer_icon: z.boolean().nullish(),
  workflow: zWorkflowPartial.nullish(),
})

export const zGetAgentQuery = z.object({
  creator_ids: z.array(z.string()).optional(),
  is_created_by_me: z.boolean().optional(),
  limit: z.int().gte(1).lte(100).optional().default(20),
  mode: z
    .enum([
      'advanced-chat',
      'agent',
      'agent-chat',
      'all',
      'channel',
      'chat',
      'completion',
      'workflow',
    ])
    .optional()
    .default('all'),
  name: z.string().optional(),
  page: z.int().gte(1).lte(99999).optional().default(1),
  sort_by: z
    .enum(['earliest_created', 'last_modified', 'recently_created'])
    .optional()
    .default('last_modified'),
  tag_ids: z.array(z.string()).optional(),
})

/**
 * Agent app list
 */
export const zGetAgentResponse = zAgentAppPagination

export const zPostAgentBody = zAgentAppCreatePayload

/**
 * Agent app created successfully
 */
export const zPostAgentResponse = zAgentAppDetailWithSite

export const zGetAgentInviteOptionsQuery = z.object({
  app_id: z.string().optional(),
  keyword: z.string().optional(),
  limit: z.int().gte(1).lte(100).optional().default(20),
  page: z.int().gte(1).optional().default(1),
})

/**
 * Agent invite options
 */
export const zGetAgentInviteOptionsResponse = zAgentInviteOptionsResponse

export const zDeleteAgentByAgentIdPath = z.object({
  agent_id: z.uuid(),
})

/**
 * Agent app deleted successfully
 */
export const zDeleteAgentByAgentIdResponse = z.void()

export const zGetAgentByAgentIdPath = z.object({
  agent_id: z.uuid(),
})

/**
 * Agent app detail
 */
export const zGetAgentByAgentIdResponse = zAgentAppDetailWithSite

export const zPutAgentByAgentIdBody = zAgentAppUpdatePayload

export const zPutAgentByAgentIdPath = z.object({
  agent_id: z.uuid(),
})

/**
 * Agent app updated successfully
 */
export const zPutAgentByAgentIdResponse = zAgentAppDetailWithSite

export const zGetAgentByAgentIdApiAccessPath = z.object({
  agent_id: z.uuid(),
})

/**
 * Agent service API access
 */
export const zGetAgentByAgentIdApiAccessResponse = zAgentApiAccessResponse

export const zPostAgentByAgentIdApiEnableBody = zAgentApiStatusPayload

export const zPostAgentByAgentIdApiEnablePath = z.object({
  agent_id: z.uuid(),
})

/**
 * Agent service API status updated
 */
export const zPostAgentByAgentIdApiEnableResponse = zAgentApiAccessResponse

export const zGetAgentByAgentIdApiKeysPath = z.object({
  agent_id: z.uuid(),
})

/**
 * Agent service API keys
 */
export const zGetAgentByAgentIdApiKeysResponse = zApiKeyList

export const zPostAgentByAgentIdApiKeysPath = z.object({
  agent_id: z.uuid(),
})

/**
 * Agent service API key created
 */
export const zPostAgentByAgentIdApiKeysResponse = zApiKeyItem

export const zDeleteAgentByAgentIdApiKeysByApiKeyIdPath = z.object({
  agent_id: z.uuid(),
  api_key_id: z.uuid(),
})

/**
 * Agent service API key deleted
 */
export const zDeleteAgentByAgentIdApiKeysByApiKeyIdResponse = z.void()

export const zPostAgentByAgentIdAudioToTextBody = z.object({
  draft_type: z.enum(['debug_build', 'draft']).optional().default('draft'),
  file: z.custom<Blob | File>((value) => value instanceof Blob || value instanceof File),
})

export const zPostAgentByAgentIdAudioToTextPath = z.object({
  agent_id: z.uuid(),
})

/**
 * Audio transcription successful
 */
export const zPostAgentByAgentIdAudioToTextResponse = zAudioTranscriptResponse

export const zPostAgentByAgentIdBuildChatFinalizePath = z.object({
  agent_id: z.uuid(),
})

/**
 * Success
 */
export const zPostAgentByAgentIdBuildChatFinalizeResponse = zSimpleResultResponse

export const zDeleteAgentByAgentIdBuildDraftPath = z.object({
  agent_id: z.uuid(),
})

/**
 * Agent build draft discarded
 */
export const zDeleteAgentByAgentIdBuildDraftResponse = zAgentSimpleResultResponse

export const zGetAgentByAgentIdBuildDraftPath = z.object({
  agent_id: z.uuid(),
})

/**
 * Agent build draft
 */
export const zGetAgentByAgentIdBuildDraftResponse = zAgentBuildDraftResponse

export const zPutAgentByAgentIdBuildDraftBody = zComposerSavePayload

export const zPutAgentByAgentIdBuildDraftPath = z.object({
  agent_id: z.uuid(),
})

/**
 * Agent build draft saved
 */
export const zPutAgentByAgentIdBuildDraftResponse = zAgentBuildDraftResponse

export const zPostAgentByAgentIdBuildDraftApplyPath = z.object({
  agent_id: z.uuid(),
})

/**
 * Agent build draft applied
 */
export const zPostAgentByAgentIdBuildDraftApplyResponse = zAgentBuildDraftApplyResponse

export const zPostAgentByAgentIdBuildDraftCheckoutBody = zAgentBuildDraftCheckoutPayload

export const zPostAgentByAgentIdBuildDraftCheckoutPath = z.object({
  agent_id: z.uuid(),
})

/**
 * Agent build draft checked out
 */
export const zPostAgentByAgentIdBuildDraftCheckoutResponse = zAgentBuildDraftResponse

export const zGetAgentByAgentIdChatMessagesPath = z.object({
  agent_id: z.uuid(),
})

export const zGetAgentByAgentIdChatMessagesQuery = z.object({
  conversation_id: z.string(),
  first_id: z.string().optional(),
  limit: z.int().gte(1).lte(100).optional().default(20),
})

/**
 * Success
 */
export const zGetAgentByAgentIdChatMessagesResponse = zMessageInfiniteScrollPaginationResponse

export const zGetAgentByAgentIdChatMessagesByMessageIdSuggestedQuestionsPath = z.object({
  agent_id: z.uuid(),
  message_id: z.uuid(),
})

/**
 * Suggested questions retrieved successfully
 */
export const zGetAgentByAgentIdChatMessagesByMessageIdSuggestedQuestionsResponse =
  zSuggestedQuestionsResponse

export const zPostAgentByAgentIdChatMessagesByTaskIdStopPath = z.object({
  agent_id: z.uuid(),
  task_id: z.string(),
})

/**
 * Task stopped successfully
 */
export const zPostAgentByAgentIdChatMessagesByTaskIdStopResponse = zSimpleResultResponse

export const zGetAgentByAgentIdComposerPath = z.object({
  agent_id: z.uuid(),
})

/**
 * Agent app composer state
 */
export const zGetAgentByAgentIdComposerResponse = zAgentAppComposerResponse

export const zPutAgentByAgentIdComposerBody = zComposerSavePayload

export const zPutAgentByAgentIdComposerPath = z.object({
  agent_id: z.uuid(),
})

/**
 * Agent app composer saved
 */
export const zPutAgentByAgentIdComposerResponse = zAgentAppComposerResponse

export const zGetAgentByAgentIdComposerCandidatesPath = z.object({
  agent_id: z.uuid(),
})

/**
 * Agent app composer candidates
 */
export const zGetAgentByAgentIdComposerCandidatesResponse = zAgentComposerCandidatesResponse

export const zPostAgentByAgentIdComposerValidateBody = zComposerSavePayload

export const zPostAgentByAgentIdComposerValidatePath = z.object({
  agent_id: z.uuid(),
})

/**
 * Agent app composer validation result
 */
export const zPostAgentByAgentIdComposerValidateResponse = zAgentComposerValidateResponse

export const zGetAgentByAgentIdConfigFilesPath = z.object({
  agent_id: z.uuid(),
})

export const zGetAgentByAgentIdConfigFilesQuery = z.object({
  draft_type: z.enum(['debug_build', 'draft']).optional(),
  version_id: z.string().optional(),
})

/**
 * Config files
 */
export const zGetAgentByAgentIdConfigFilesResponse = zAgentConfigFileListResponse

export const zPostAgentByAgentIdConfigFilesBody = zAgentConfigFileUploadPayload

export const zPostAgentByAgentIdConfigFilesPath = z.object({
  agent_id: z.uuid(),
})

export const zPostAgentByAgentIdConfigFilesQuery = z.object({
  draft_type: z.enum(['debug_build', 'draft']).optional(),
  version_id: z.string().optional(),
})

/**
 * Uploaded config file
 */
export const zPostAgentByAgentIdConfigFilesResponse = zAgentConfigFileUploadResponse

export const zDeleteAgentByAgentIdConfigFilesByNamePath = z.object({
  agent_id: z.uuid(),
  name: z.string(),
})

export const zDeleteAgentByAgentIdConfigFilesByNameQuery = z.object({
  draft_type: z.enum(['debug_build', 'draft']).optional(),
  version_id: z.string().optional(),
})

/**
 * Config file deleted
 */
export const zDeleteAgentByAgentIdConfigFilesByNameResponse = zAgentConfigDeleteResponse

export const zGetAgentByAgentIdConfigFilesByNameDownloadPath = z.object({
  agent_id: z.uuid(),
  name: z.string(),
})

export const zGetAgentByAgentIdConfigFilesByNameDownloadQuery = z.object({
  draft_type: z.enum(['debug_build', 'draft']).optional(),
  version_id: z.string().optional(),
})

/**
 * Config file download URL
 */
export const zGetAgentByAgentIdConfigFilesByNameDownloadResponse = zAgentConfigDownloadResponse

export const zGetAgentByAgentIdConfigFilesByNamePreviewPath = z.object({
  agent_id: z.uuid(),
  name: z.string(),
})

export const zGetAgentByAgentIdConfigFilesByNamePreviewQuery = z.object({
  draft_type: z.enum(['debug_build', 'draft']).optional(),
  version_id: z.string().optional(),
})

/**
 * Preview
 */
export const zGetAgentByAgentIdConfigFilesByNamePreviewResponse = zAgentConfigFilePreviewResponse

export const zGetAgentByAgentIdConfigManifestPath = z.object({
  agent_id: z.uuid(),
})

export const zGetAgentByAgentIdConfigManifestQuery = z.object({
  draft_type: z.enum(['debug_build', 'draft']).optional(),
  version_id: z.string().optional(),
})

/**
 * Agent config manifest
 */
export const zGetAgentByAgentIdConfigManifestResponse = zAgentConfigManifestResponse

export const zGetAgentByAgentIdConfigSkillsPath = z.object({
  agent_id: z.uuid(),
})

export const zGetAgentByAgentIdConfigSkillsQuery = z.object({
  draft_type: z.enum(['debug_build', 'draft']).optional(),
  version_id: z.string().optional(),
})

/**
 * Config skills
 */
export const zGetAgentByAgentIdConfigSkillsResponse = zAgentConfigSkillListResponse

export const zPostAgentByAgentIdConfigSkillsUploadBody = z.object({
  file: z.custom<Blob | File>((value) => value instanceof Blob || value instanceof File),
})

export const zPostAgentByAgentIdConfigSkillsUploadPath = z.object({
  agent_id: z.uuid(),
})

export const zPostAgentByAgentIdConfigSkillsUploadQuery = z.object({
  draft_type: z.enum(['debug_build', 'draft']).optional(),
  version_id: z.string().optional(),
})

/**
 * Uploaded config skill
 */
export const zPostAgentByAgentIdConfigSkillsUploadResponse = zAgentConfigSkillUploadResponse

export const zDeleteAgentByAgentIdConfigSkillsByNamePath = z.object({
  agent_id: z.uuid(),
  name: z.string(),
})

export const zDeleteAgentByAgentIdConfigSkillsByNameQuery = z.object({
  draft_type: z.enum(['debug_build', 'draft']).optional(),
  version_id: z.string().optional(),
})

/**
 * Config skill deleted
 */
export const zDeleteAgentByAgentIdConfigSkillsByNameResponse = zAgentConfigDeleteResponse

export const zGetAgentByAgentIdConfigSkillsByNameDownloadPath = z.object({
  agent_id: z.uuid(),
  name: z.string(),
})

export const zGetAgentByAgentIdConfigSkillsByNameDownloadQuery = z.object({
  draft_type: z.enum(['debug_build', 'draft']).optional(),
  version_id: z.string().optional(),
})

/**
 * Config skill download URL
 */
export const zGetAgentByAgentIdConfigSkillsByNameDownloadResponse = zAgentConfigDownloadResponse

export const zGetAgentByAgentIdConfigSkillsByNameFilesContentPath = z.object({
  agent_id: z.uuid(),
  name: z.string(),
})

/**
 * Success
 */
export const zGetAgentByAgentIdConfigSkillsByNameFilesContentResponse = z.record(
  z.string(),
  z.unknown(),
)

export const zGetAgentByAgentIdConfigSkillsByNameFilesDownloadPath = z.object({
  agent_id: z.uuid(),
  name: z.string(),
})

export const zGetAgentByAgentIdConfigSkillsByNameFilesDownloadQuery = z.object({
  draft_type: z.enum(['debug_build', 'draft']).optional(),
  path: z.string(),
  version_id: z.string().optional(),
})

/**
 * Config skill file download URL
 */
export const zGetAgentByAgentIdConfigSkillsByNameFilesDownloadResponse =
  zAgentConfigDownloadResponse

export const zGetAgentByAgentIdConfigSkillsByNameFilesPreviewPath = z.object({
  agent_id: z.uuid(),
  name: z.string(),
})

export const zGetAgentByAgentIdConfigSkillsByNameFilesPreviewQuery = z.object({
  draft_type: z.enum(['debug_build', 'draft']).optional(),
  path: z.string(),
  version_id: z.string().optional(),
})

/**
 * Config skill file preview
 */
export const zGetAgentByAgentIdConfigSkillsByNameFilesPreviewResponse =
  zAgentConfigSkillFilePreviewResponse

export const zGetAgentByAgentIdConfigSkillsByNameInspectPath = z.object({
  agent_id: z.uuid(),
  name: z.string(),
})

export const zGetAgentByAgentIdConfigSkillsByNameInspectQuery = z.object({
  draft_type: z.enum(['debug_build', 'draft']).optional(),
  version_id: z.string().optional(),
})

/**
 * Config skill inspect view
 */
export const zGetAgentByAgentIdConfigSkillsByNameInspectResponse = zAgentConfigSkillInspectResponse

export const zPostAgentByAgentIdCopyBody = zAgentAppCopyPayload

export const zPostAgentByAgentIdCopyPath = z.object({
  agent_id: z.uuid(),
})

/**
 * Agent app copied successfully
 */
export const zPostAgentByAgentIdCopyResponse = zAgentAppDetailWithSite

export const zPostAgentByAgentIdDebugConversationRefreshBody = zAgentDebugConversationRefreshPayload

export const zPostAgentByAgentIdDebugConversationRefreshPath = z.object({
  agent_id: z.uuid(),
})

/**
 * Agent debug conversation refreshed
 */
export const zPostAgentByAgentIdDebugConversationRefreshResponse =
  zAgentDebugConversationRefreshResponse

export const zGetAgentByAgentIdDriveFilesPath = z.object({
  agent_id: z.uuid(),
})

export const zGetAgentByAgentIdDriveFilesQuery = z.object({
  prefix: z.string().optional().default(''),
})

/**
 * Drive entries
 */
export const zGetAgentByAgentIdDriveFilesResponse = zAgentDriveListResponse

export const zGetAgentByAgentIdDriveFilesDownloadPath = z.object({
  agent_id: z.uuid(),
})

export const zGetAgentByAgentIdDriveFilesDownloadQuery = z.object({
  key: z.string().min(1),
})

/**
 * Signed URL
 */
export const zGetAgentByAgentIdDriveFilesDownloadResponse = zAgentDriveDownloadResponse

export const zGetAgentByAgentIdDriveFilesPreviewPath = z.object({
  agent_id: z.uuid(),
})

export const zGetAgentByAgentIdDriveFilesPreviewQuery = z.object({
  key: z.string().min(1),
})

/**
 * Preview
 */
export const zGetAgentByAgentIdDriveFilesPreviewResponse = zAgentDrivePreviewResponse

export const zGetAgentByAgentIdDriveSkillsPath = z.object({
  agent_id: z.uuid(),
})

/**
 * Drive skills
 */
export const zGetAgentByAgentIdDriveSkillsResponse = zAgentDriveSkillListResponse

export const zGetAgentByAgentIdDriveSkillsBySkillPathInspectPath = z.object({
  agent_id: z.uuid(),
  skill_path: z.string(),
})

/**
 * Drive skill inspect view
 */
export const zGetAgentByAgentIdDriveSkillsBySkillPathInspectResponse =
  zAgentDriveSkillInspectResponse

export const zPostAgentByAgentIdFeaturesBody = zAgentAppFeaturesPayload

export const zPostAgentByAgentIdFeaturesPath = z.object({
  agent_id: z.uuid(),
})

/**
 * Features updated successfully
 */
export const zPostAgentByAgentIdFeaturesResponse = zSimpleResultResponse

export const zPostAgentByAgentIdFeedbacksBody = zMessageFeedbackPayload

export const zPostAgentByAgentIdFeedbacksPath = z.object({
  agent_id: z.uuid(),
})

/**
 * Feedback updated successfully
 */
export const zPostAgentByAgentIdFeedbacksResponse = zSimpleResultResponse

export const zDeleteAgentByAgentIdFilesPath = z.object({
  agent_id: z.uuid(),
})

export const zDeleteAgentByAgentIdFilesQuery = z.object({
  key: z.string().min(1),
})

/**
 * File removed
 */
export const zDeleteAgentByAgentIdFilesResponse = zAgentDriveDeleteResponse

export const zPostAgentByAgentIdFilesBody = zAgentDriveFilePayload

export const zPostAgentByAgentIdFilesPath = z.object({
  agent_id: z.uuid(),
})

/**
 * File committed into the agent drive
 */
export const zPostAgentByAgentIdFilesResponse = zAgentDriveFileCommitResponse

export const zGetAgentByAgentIdLogSourcesPath = z.object({
  agent_id: z.uuid(),
})

/**
 * Agent log sources
 */
export const zGetAgentByAgentIdLogSourcesResponse = zAgentLogSourceListResponse

export const zGetAgentByAgentIdLogsPath = z.object({
  agent_id: z.uuid(),
})

export const zGetAgentByAgentIdLogsQuery = z.object({
  end: z.string().optional(),
  keyword: z.string().optional(),
  limit: z.int().gte(1).lte(100).optional().default(20),
  page: z.int().gte(1).optional().default(1),
  sort_by: z.string().optional().default('updated_at'),
  sort_order: z.string().optional().default('desc'),
  source: z.string().optional(),
  sources: z.array(z.string()).optional(),
  start: z.string().optional(),
  status: z.string().optional(),
  statuses: z.array(z.string()).optional(),
})

/**
 * Agent logs
 */
export const zGetAgentByAgentIdLogsResponse = zAgentLogListResponse

export const zGetAgentByAgentIdLogsByConversationIdMessagesPath = z.object({
  agent_id: z.uuid(),
  conversation_id: z.uuid(),
})

export const zGetAgentByAgentIdLogsByConversationIdMessagesQuery = z.object({
  end: z.string().optional(),
  keyword: z.string().optional(),
  limit: z.int().gte(1).lte(100).optional().default(20),
  page: z.int().gte(1).optional().default(1),
  sort_by: z.string().optional().default('updated_at'),
  sort_order: z.string().optional().default('desc'),
  source: z.string().optional(),
  sources: z.array(z.string()).optional(),
  start: z.string().optional(),
  status: z.string().optional(),
  statuses: z.array(z.string()).optional(),
})

/**
 * Agent log messages
 */
export const zGetAgentByAgentIdLogsByConversationIdMessagesResponse = zAgentLogMessageListResponse

export const zGetAgentByAgentIdMessagesByMessageIdPath = z.object({
  agent_id: z.uuid(),
  message_id: z.uuid(),
})

/**
 * Message retrieved successfully
 */
export const zGetAgentByAgentIdMessagesByMessageIdResponse = zMessageDetailResponse

export const zPostAgentByAgentIdPublishBody = zAgentPublishPayload

export const zPostAgentByAgentIdPublishPath = z.object({
  agent_id: z.uuid(),
})

/**
 * Agent draft published
 */
export const zPostAgentByAgentIdPublishResponse = zAgentPublishResponse

export const zGetAgentByAgentIdReferencingWorkflowsPath = z.object({
  agent_id: z.uuid(),
})

/**
 * Referencing workflows listed successfully
 */
export const zGetAgentByAgentIdReferencingWorkflowsResponse = zAgentReferencingWorkflowsResponse

export const zGetAgentByAgentIdSandboxPath = z.object({
  agent_id: z.uuid(),
})

export const zGetAgentByAgentIdSandboxQuery = z.object({
  conversation_id: z.string().min(1),
})

/**
 * Sandbox information returned
 */
export const zGetAgentByAgentIdSandboxResponse = zSandboxInfoResponse

export const zGetAgentByAgentIdSandboxFilesPath = z.object({
  agent_id: z.uuid(),
})

export const zGetAgentByAgentIdSandboxFilesQuery = z.object({
  conversation_id: z.string().min(1),
  path: z.string().optional().default('.'),
})

/**
 * Listing returned
 */
export const zGetAgentByAgentIdSandboxFilesResponse = zSandboxListResponse

export const zGetAgentByAgentIdSandboxFilesReadPath = z.object({
  agent_id: z.uuid(),
})

export const zGetAgentByAgentIdSandboxFilesReadQuery = z.object({
  conversation_id: z.string().min(1),
  path: z.string().min(1),
})

/**
 * Preview returned
 */
export const zGetAgentByAgentIdSandboxFilesReadResponse = zSandboxReadResponse

export const zPostAgentByAgentIdSandboxFilesUploadBody = zAgentSandboxUploadPayload

export const zPostAgentByAgentIdSandboxFilesUploadPath = z.object({
  agent_id: z.uuid(),
})

/**
 * Uploaded
 */
export const zPostAgentByAgentIdSandboxFilesUploadResponse = zSandboxUploadResponse

export const zPostAgentByAgentIdSkillsUploadBody = z.object({
  file: z.custom<Blob | File>((value) => value instanceof Blob || value instanceof File),
})

export const zPostAgentByAgentIdSkillsUploadPath = z.object({
  agent_id: z.uuid(),
})

/**
 * Skill uploaded into drive
 */
export const zPostAgentByAgentIdSkillsUploadResponse = zAgentSkillUploadResponse

export const zDeleteAgentByAgentIdSkillsBySlugPath = z.object({
  agent_id: z.uuid(),
  slug: z.string(),
})

/**
 * Skill removed
 */
export const zDeleteAgentByAgentIdSkillsBySlugResponse = zAgentDriveDeleteResponse

export const zPostAgentByAgentIdSkillsBySlugInferToolsPath = z.object({
  agent_id: z.uuid(),
  slug: z.string(),
})

/**
 * Inference result (draft suggestions, nothing persisted)
 */
export const zPostAgentByAgentIdSkillsBySlugInferToolsResponse = zSkillToolInferenceResult

export const zGetAgentByAgentIdStatisticsSummaryPath = z.object({
  agent_id: z.uuid(),
})

export const zGetAgentByAgentIdStatisticsSummaryQuery = z.object({
  end: z.string().optional(),
  source: z.string().optional(),
  start: z.string().optional(),
})

/**
 * Agent monitoring summary and chart data
 */
export const zGetAgentByAgentIdStatisticsSummaryResponse = zAgentStatisticSummaryEnvelopeResponse

export const zGetAgentByAgentIdVersionsPath = z.object({
  agent_id: z.uuid(),
})

/**
 * Agent versions
 */
export const zGetAgentByAgentIdVersionsResponse = zAgentConfigSnapshotListResponse

export const zGetAgentByAgentIdVersionsByVersionIdPath = z.object({
  agent_id: z.uuid(),
  version_id: z.uuid(),
})

/**
 * Agent version detail
 */
export const zGetAgentByAgentIdVersionsByVersionIdResponse = zAgentConfigSnapshotDetailResponse

export const zPostAgentByAgentIdVersionsByVersionIdRestorePath = z.object({
  agent_id: z.uuid(),
  version_id: z.uuid(),
})

/**
 * Agent version restored
 */
export const zPostAgentByAgentIdVersionsByVersionIdRestoreResponse =
  zAgentConfigSnapshotRestoreResponse
