syntax = "proto3";

package exa.index_pb;

import "buf/validate/validate.proto";
import "exa/codeium_common_pb/codeium_common.proto";
import "google/protobuf/duration.proto";
import "google/protobuf/timestamp.proto";

option go_package = "github.com/Exafunction/Exafunction/exa/index_pb";

service IndexManagementService {
    rpc EnableIndexing(EnableIndexingRequest) returns (EnableIndexingResponse);
    rpc DisableIndexing(DisableIndexingRequest) returns (DisableIndexingResponse);
    rpc AddRepository(AddRepositoryRequest) returns (AddRepositoryResponse);
    rpc EditRepository(EditRepositoryRequest) returns (EditRepositoryResponse);
    rpc DeleteRepository(DeleteRepositoryRequest) returns (DeleteRepositoryResponse);
    rpc GetRepositories(GetRepositoriesRequest) returns (GetRepositoriesResponse);
    rpc AddIndex(AddIndexRequest) returns (AddIndexResponse);
    rpc CancelIndexing(CancelIndexingRequest) returns (CancelIndexingResponse);
    rpc RetryIndexing(RetryIndexingRequest) returns (RetryIndexingResponse);
    rpc DeleteIndex(DeleteIndexRequest) returns (DeleteIndexResponse);
    rpc GetIndexes(GetIndexesRequest) returns (GetIndexesResponse);
    rpc GetIndex(GetIndexRequest) returns (GetIndexResponse);
    rpc GetRemoteIndexStats(GetRemoteIndexStatsRequest) returns (GetRemoteIndexStatsResponse);
    rpc PruneDatabase(PruneDatabaseRequest) returns (PruneDatabaseResponse);
    rpc GetDatabaseStats(GetDatabaseStatsRequest) returns (GetDatabaseStatsResponse);
    rpc SetIndexConfig(SetIndexConfigRequest) returns (SetIndexConfigResponse);
    rpc GetIndexConfig(GetIndexConfigRequest) returns (GetIndexConfigResponse);
    rpc GetNumberConnections(GetNumberConnectionsRequest) returns (GetNumberConnectionsResponse);
    rpc GetConnectionsDebugInfo(GetConnectionsDebugInfoRequest) returns (GetConnectionsDebugInfoResponse);
}

service IndexService {
    rpc GetIndexedRepositories(GetIndexedRepositoriesRequest) returns (GetIndexedRepositoriesResponse);
    rpc GetNearestCCIsFromEmbedding(GetNearestCCIsFromEmbeddingRequest) returns (GetNearestCCIsFromEmbeddingResponse);
    rpc GetEmbeddingsForCodeContextItems(GetEmbeddingsForCodeContextItemsRequest) returns (GetEmbeddingsForCodeContextItemsResponse);
    rpc GetMatchingFilePaths(GetMatchingFilePathsRequest) returns (GetMatchingFilePathsResponse);
}

message IndexDbVersion {
    int32 version = 1;
    int32 enterprise_version = 2;
}

message IndexBuildConfig {
    IndexDbVersion db_version = 2;
    int32 cci_timeout_secs = 3;
    IndexMode index_mode = 4;
}

message RepositoryConfig {
    string git_url = 1;
    codeium_common_pb.ScmProvider scm_provider = 2;
    
    AutoIndexConfig auto_index_config = 3;
    message AutoIndexConfig {
        string branch_name = 1;
        google.protobuf.Duration interval = 2;
        int32 max_num_auto_indexes = 3;
    }
    
    bool store_snippets = 4;
    repeated string whitelisted_groups = 5;
    bool use_github_app = 6;
    string auth_uid = 7;
    string email = 9;
    string service_key_id = 8;
}

message IndexConfig {
    google.protobuf.Timestamp prune_time = 1;
    google.protobuf.Duration prune_interval = 2;
    bool enable_prune = 3;
    bool enable_smallest_repo_first = 4;
    bool enable_round_robin = 5;
}

message VectorIndexStats {
    int64 num_embeddings = 1;
    int64 index_bytes_count = 2;
}

message ProgressBar {
    float progress = 1;
    string text = 2;
    google.protobuf.Duration remaining_time = 3;
}

message Index {
    string id = 1;
    string repo_name = 2;
    string workspace = 3;
    codeium_common_pb.GitRepoInfo repo_info = 4;
    google.protobuf.Timestamp created_at = 5;
    google.protobuf.Timestamp updated_at = 6;
    google.protobuf.Timestamp scheduled_at = 13;
    IndexingStatus status = 7;
    string status_detail = 8;
    bool auto_indexed = 9;
    bool has_snippets = 12;
    string auth_uid = 15;
    string email = 16;
    
    RepoStats repo_stats = 14;
    message RepoStats {
        int64 size = 1;
        int64 file_count = 2;
        int64 size_no_ignore = 3;
        int64 file_count_no_ignore = 4;
    }
    
    map<string, ProgressBar> indexing_progress = 10;
    VectorIndexStats index_stats = 11;
}

message Repository {
    string repo_name = 1;
    RepositoryConfig config = 2;
    google.protobuf.Timestamp created_at = 4;
    google.protobuf.Timestamp updated_at = 5;
    google.protobuf.Timestamp last_used_at = 6;
    Index latest_index = 3;
}

message RequestIndexVersion {
    string version_alias = 3;
    
    oneof version {
        string commit = 1;
        string branch = 2;
    }
}

message ManagementMetadata {
    string auth_token = 1;
    string auth_uid = 2;
    string service_key = 3;
    bool force_target_public_index = 4;
    string force_team_id = 5;
    string service_key_id = 6;
}

message AddRepositoryRequest {
    ManagementMetadata metadata = 1;
    RepositoryConfig config = 2;
    RequestIndexVersion initial_index = 3;
}

message AddRepositoryResponse {
    string repo_name = 1;
    string index_id = 2;
}

message EnableIndexingRequest {
    ManagementMetadata metadata = 1;
    IndexBuildConfig config = 2;
}

message EnableIndexingResponse {
    
}

message DisableIndexingRequest {
    ManagementMetadata metadata = 1;
}

message DisableIndexingResponse {
    
}

message EditRepositoryRequest {
    ManagementMetadata metadata = 1;
    string repo_name = 2;
    RepositoryConfig config = 3;
}

message EditRepositoryResponse {
    
}

message DeleteRepositoryRequest {
    ManagementMetadata metadata = 1;
    string repo_name = 2;
    repeated string repo_names = 3;
}

message DeleteRepositoryResponse {
    
}

message GetRepositoriesFilter {
    string repo_name = 1;
    string group_id = 2;
}

message GetRepositoriesRequest {
    ManagementMetadata metadata = 1;
    GetRepositoriesFilter filter = 2;
}

message GetRepositoriesResponse {
    repeated Repository repositories = 1;
}

message GetIndexesRequest {
    ManagementMetadata metadata = 1;
    string repo_name = 2;
}

message GetIndexesResponse {
    repeated Index indexes = 1;
}

message GetIndexRequest {
    ManagementMetadata metadata = 1;
    string index_id = 2;
}

message GetIndexResponse {
    Index index = 1;
    Repository repository = 2;
}

message RemoteIndexStats {
    string index_id = 1;
    int64 cci_count = 2;
    int64 snippet_count = 3;
    int64 embedding_count = 4;
}

message GetRemoteIndexStatsRequest {
    ManagementMetadata metadata = 1;
    repeated string index_ids = 2;
}

message GetRemoteIndexStatsResponse {
    repeated RemoteIndexStats index_stats = 1;
}

message AddIndexRequest {
    ManagementMetadata metadata = 1;
    string repo_name = 2;
    RequestIndexVersion version = 3;
}

message AddIndexResponse {
    string index_id = 1;
}

message CancelIndexingRequest {
    ManagementMetadata metadata = 1;
    string index_id = 2;
    repeated string index_ids = 3;
}

message CancelIndexingResponse {
    
}

message RetryIndexingRequest {
    ManagementMetadata metadata = 1;
    string index_id = 2;
    repeated string index_ids = 3;
}

message RetryIndexingResponse {
    
}

message DeleteIndexRequest {
    ManagementMetadata metadata = 1;
    string index_id = 2;
    repeated string index_ids = 3;
}

message DeleteIndexResponse {
    
}

message PruneDatabaseRequest {
    ManagementMetadata metadata = 1;
}

message PruneDatabaseResponse {
    
}

message GetDatabaseStatsRequest {
    ManagementMetadata metadata = 1;
}

message GetDatabaseStatsResponse {
    int64 database_total_bytes_count = 1;
    int64 table_total_bytes_count = 2;
    int64 index_total_bytes_count = 3;
    int64 estimate_prunable_bytes = 4;
    bool is_pruning = 5;
    string last_prune_error = 6;
    int64 all_tables_bytes_count = 7;
}

message SetIndexConfigRequest {
    ManagementMetadata metadata = 1;
    IndexConfig index_config = 2;
}

message SetIndexConfigResponse {
    
}

message GetIndexConfigRequest {
    ManagementMetadata metadata = 1;
}

message GetIndexConfigResponse {
    IndexConfig index_config = 1;
}

message GetNumberConnectionsRequest {
    ManagementMetadata metadata = 1;
}

message GetNumberConnectionsResponse {
    map<string, uint32> connections_map = 1;
}

message GetConnectionsDebugInfoRequest {
    ManagementMetadata metadata = 1;
}

message GetConnectionsDebugInfoResponse {
    string debug_info = 1;
}

message GetIndexedRepositoriesRequest {
    codeium_common_pb.Metadata metadata = 1;
    bool include_incomplete = 2;
    repeated string group_ids_filter = 3;
}

message GetIndexedRepositoriesResponse {
    repeated codeium_common_pb.GitRepoInfo repositories = 1;
    repeated Index indexes = 2;
}

message RepositoryFilter {
    codeium_common_pb.GitRepoInfo repository = 1;
    repeated string excluded_files = 2;
    repeated string filter_paths = 3;
}

message GetMatchingFilePathsRequest {
    codeium_common_pb.Metadata metadata = 1;
    codeium_common_pb.GitRepoInfo repository = 2;
    string query = 3;
    uint32 max_items = 4;
    repeated string group_ids_filter = 5;
}

message GetMatchingFilePathsResponse {
    repeated string relative_file_paths = 1;
}

message GetNearestCCIsFromEmbeddingRequest {
    codeium_common_pb.Metadata metadata = 1;
    codeium_common_pb.Embedding embedding = 2;
    repeated RepositoryFilter repository_filters = 3;
    int64 max_results = 4;
    repeated string group_ids_filter = 5;
}

message ScoredContextItem {
    codeium_common_pb.CodeContextItem code_context_item = 1;
    float score = 2;
}

message GetNearestCCIsFromEmbeddingResponse {
    repeated ScoredContextItem scored_context_items = 1;
}

message GetEmbeddingsForCodeContextItemsRequest {
    codeium_common_pb.Metadata metadata = 1;
    repeated codeium_common_pb.CodeContextItem code_context_items = 2;
    codeium_common_pb.ContextSnippetType snippet_type = 3;
}

message GetEmbeddingsForCodeContextItemsResponse {
    repeated codeium_common_pb.Embedding embeddings = 1;
}

message IndexStats {
    string repository_name = 1;
    int64 file_count = 2;
    int64 code_context_item_count = 3;
}

message IndexerEvent {
    uint64 uid = 1;
    
    oneof event_oneof {
        Deletion deletion = 2;
        Untrack untrack = 3;
        Update update = 4;
        AddWorkspace add_workspace = 5;
        RemoveWorkspace remove_workspace = 6;
        IgnoreWorkspace ignore_workspace = 7;
        AddCommit add_commit = 8;
    }
    
    message Deletion {
        string absolute_uri = 1;
    }
    
    message Untrack {
        string absolute_uri = 1;
        repeated codeium_common_pb.WorkspacePath paths = 2;
        string workspace_uri = 3;
    }
    
    message Update {
        string absolute_uri = 1;
        repeated codeium_common_pb.WorkspacePath paths = 2;
        google.protobuf.Timestamp mod_time = 3;
        
        AddWorkspaceInfo add_workspace_info = 4;
        message AddWorkspaceInfo {
            uint64 add_workspace_uid = 1;
            uint64 add_workspace_queue_uid = 2;
        }
    }
    
    message AddWorkspace {
        uint64 add_workspace_uid = 1;
        uint64 add_workspace_queue_uid = 2;
        string workspace_uri = 3;
        int64 num_files = 4;
        int64 size = 5;
    }
    
    message RemoveWorkspace {
        string workspace_uri = 1;
    }
    
    message IgnoreWorkspace {
        string workspace_uri = 1;
    }
    
    message AddCommit {
        string sha = 1;
    }
}

enum IndexMode {
    INDEX_MODE_UNSPECIFIED = 0;
    INDEX_MODE_HALFVEC = 1;
    INDEX_MODE_BINARY = 2;
    INDEX_MODE_BINARY_WITH_RERANK = 3;
    INDEX_MODE_BRUTE_FORCE = 4;
    INDEX_MODE_RANDOM_SEARCH = 5;
}

enum IndexingStatus {
    INDEXING_STATUS_UNSPECIFIED = 0;
    INDEXING_STATUS_ERROR = 1;
    INDEXING_STATUS_QUEUED = 2;
    INDEXING_STATUS_CLONING_REPO = 3;
    INDEXING_STATUS_SCANNING_REPO = 4;
    INDEXING_STATUS_GENERATING_EMBEDDINGS = 5;
    INDEXING_STATUS_VECTOR_INDEXING = 6;
    INDEXING_STATUS_DONE = 7;
    INDEXING_STATUS_CANCELING = 8;
    INDEXING_STATUS_CANCELED = 9;
}
