export type AgentChatMessage = {
  id: string;
  role: "user" | "assistant";
  content: string;
  progress?: AgentChatProgress[];
  permissions?: AgentPermissionRequest[];
  questions?: AgentQuestionRequest[];
  todos?: AgentTodoUpdate;
};

export type AgentStreamRenderMessageState = {
  done: boolean;
};

export type AgentStreamRenderState = Record<string, AgentStreamRenderMessageState>;

export type AgentConnectionStatus = "connecting" | "online" | "offline";

export type AgentChatProgress = {
  id: string;
  phase: string;
  status: "running" | "completed" | "error";
  title: string;
  detail?: string;
  startedAt?: number;
  endedAt?: number;
  elapsedMs?: number;
  elapsedSnapshotAt?: number;
  durationMs?: number;
};

export type AgentPermissionStatus =
  | "pending"
  | "submitting"
  | "approved_once"
  | "approved_always"
  | "rejected"
  | "aborted"
  | "error";

export type AgentPermissionReply = "once" | "always" | "reject";

export type AgentApprovalMode = "request" | "always";

export type AgentModelOption = {
  id: string;
  label: string;
  description: string;
  icon: "bolt" | "sparkle";
};

export type AgentPermissionRequest = {
  requestId: string;
  sessionId: string;
  permission: string;
  patterns: string[];
  target?: string;
  always: string[];
  tool?: AgentInteractionToolRef;
  createdAt: number;
  repliedAt?: number;
  status: AgentPermissionStatus;
  error?: string;
};

export type AgentQuestionOption = {
  label: string;
  description: string;
};

export type AgentQuestionInfo = {
  header: string;
  question: string;
  options: AgentQuestionOption[];
  multiple?: boolean;
  custom?: boolean;
};

export type AgentQuestionRequest = {
  requestId: string;
  sessionId: string;
  questions: AgentQuestionInfo[];
  tool?: AgentInteractionToolRef;
  createdAt: number;
  repliedAt?: number;
  status: "pending" | "submitting" | "answered" | "rejected" | "error";
  answers?: string[][];
  error?: string;
};

export type AgentTodoItem = {
  id: string;
  content: string;
  status: "pending" | "in_progress" | "completed" | "cancelled";
  priority?: "low" | "medium" | "high";
  createdAt?: number;
  updatedAt?: number;
};

export type AgentTodoUpdate = {
  sessionId: string;
  messageId?: string;
  todos: AgentTodoItem[];
  createdAt: number;
};

export type AgentInteractionToolRef = {
  messageID: string;
  callID: string;
};

export type AgentUiResult = {
  id: string;
  sessionId: string;
  createdAt: number;
  envelope: import("./ui-envelope").UIEnvelope;
};
