syntax = "proto3";
package coda.core.v1;

import "coda/core/v1/types.proto";
import "coda/common/v1/types.proto";

service ChatService {
  rpc ListChats(ListChatsRequest) returns (ListChatsResponse);
  rpc GetChat(GetChatRequest) returns (GetChatResponse);
  rpc CreateChat(CreateChatRequest) returns (CreateChatResponse);
  rpc UpdateChat(UpdateChatRequest) returns (UpdateChatResponse);
  rpc DeleteChat(DeleteChatRequest) returns (DeleteChatResponse);
  rpc BulkDeleteChats(BulkDeleteChatsRequest) returns (BulkDeleteChatsResponse);
  rpc ListMessages(ListMessagesRequest) returns (ListMessagesResponse);
  rpc StreamChat(StreamChatRequest) returns (stream StreamChatEvent);
  rpc SubmitFeedback(SubmitFeedbackRequest) returns (SubmitFeedbackResponse);
  rpc DeleteFeedback(DeleteFeedbackRequest) returns (DeleteFeedbackResponse);
  rpc GetAttachmentUrl(GetAttachmentUrlRequest) returns (GetAttachmentUrlResponse);
  rpc GetPermissions(GetPermissionsRequest) returns (GetPermissionsResponse);
  rpc ListDeletedChats(ListDeletedChatsRequest) returns (ListDeletedChatsResponse);
}

message ListChatsRequest {
  coda.common.v1.PageRequest page = 1;
  optional bool starred = 2;
}

message ListChatsResponse {
  repeated Chat data = 1;
  coda.common.v1.PageInfo page = 2;
}

message GetChatRequest { string chat_id = 1; }
message GetChatResponse { Chat chat = 1; }

message CreateChatRequest { optional string title = 1; }
message CreateChatResponse { Chat chat = 1; }

message UpdateChatRequest {
  string chat_id = 1;
  optional string title = 2;
  optional bool starred = 3;
  optional string if_updated_at = 4;
}
message UpdateChatResponse { Chat chat = 1; }

message DeleteChatRequest { string chat_id = 1; }
message DeleteChatResponse {}

message BulkDeleteChatsRequest { repeated string chat_ids = 1; }
message BulkDeleteChatsResponse { int32 deleted = 1; }

message ListMessagesRequest {
  string chat_id = 1;
  coda.common.v1.PageRequest page = 2;
  optional string leaf = 3;
}

message ListMessagesResponse {
  repeated ChatMessage data = 1;
  coda.common.v1.PageInfo page = 2;
}

message StreamChatRequest {
  string chat_id = 1;
  string query = 2;
  optional string model = 3;
  optional string provider = 4;
  repeated Attachment attachments = 5;
}

message StreamChatEvent {
  oneof event {
    StreamChunk chunk = 1;
    StreamReasoning reasoning = 2;
    StreamProgress progress = 3;
    StreamMessageStart message_start = 4;
    UsageStats usage = 5;
    StreamSources sources = 6;
    StreamSuggestions suggestions = 7;
    StreamAttachments attachments = 8;
    StreamTitle title = 9;
    StreamSelectionRequired selection_required = 10;
    StreamDone done = 11;
    StreamError error = 12;
    StreamWarnings warnings = 13;
  }
}

message StreamChunk { string text = 1; }
message StreamReasoning { oneof payload { string chunk = 1; bool done = 2; } }
message StreamProgress { repeated ConversationStep steps = 1; }
message StreamMessageStart {
  string user_message_id = 1;
  string assistant_message_id = 2;
  ModelInfo model = 3;
}
message StreamSources { repeated SourceLink sources = 1; }
message StreamSuggestions { repeated string suggestions = 1; }
message StreamAttachments { repeated ExtractedAttachment attachments = 1; }
message StreamTitle { string title = 1; }
message StreamSelectionRequired {
  repeated SelectionItem items = 1;
  string search_term = 2;
}
message StreamDone {
  string message_id = 1;
  string user_message_id = 2;
  StreamEndReason reason = 3;
}
message StreamError { string message = 1; }
message StreamWarnings { repeated string warnings = 1; }

message SubmitFeedbackRequest {
  string chat_id = 1;
  string message_id = 2;
  FeedbackRating rating = 3;
  optional string comment = 4;
}
message SubmitFeedbackResponse {}

message DeleteFeedbackRequest { string chat_id = 1; string message_id = 2; }
message DeleteFeedbackResponse {}

message GetAttachmentUrlRequest { string chat_id = 1; string attachment_id = 2; }
message GetAttachmentUrlResponse { string url = 1; }

message GetPermissionsRequest {}
message GetPermissionsResponse {
  repeated string permissions = 1;
  repeated RoleSummary roles = 2;
  bool is_super_admin = 3;
}

message ListDeletedChatsRequest {
  coda.common.v1.PageRequest page = 1;
}

message ListDeletedChatsResponse {
  repeated string chat_ids = 1;
  coda.common.v1.PageInfo page = 2;
}
