use std::collections::BTreeMap;
use rmcp::schemars;
use serde::{Deserialize, Serialize};
use crate::path::RelPath;
#[derive(Debug, Deserialize, Serialize, schemars::JsonSchema)]
pub struct OutlineParams {
pub path: RelPath,
#[serde(default)]
pub l2: bool,
}
#[derive(Debug, Deserialize, Serialize, schemars::JsonSchema)]
pub struct SearchSymbolsParams {
pub needle: String,
#[serde(default)]
pub kind: Option<String>,
#[serde(default)]
pub limit: Option<u32>,
}
#[derive(Debug, Deserialize, Serialize, schemars::JsonSchema)]
pub struct ListFilesParams {
#[serde(default)]
pub path_contains: Option<String>,
#[serde(default)]
pub language: Option<String>,
#[serde(default)]
pub limit: Option<u32>,
}
#[derive(Debug, Deserialize, Serialize, schemars::JsonSchema)]
pub struct DependentsParams {
pub module: String,
}
#[derive(Debug, Deserialize, Serialize, schemars::JsonSchema)]
pub struct StatusParams {}
#[derive(Debug, Deserialize, Serialize, schemars::JsonSchema)]
pub struct WorkingTreeStatusParams {}
#[derive(Debug, Deserialize, Serialize, schemars::JsonSchema)]
pub struct RecentChangesParams {
#[serde(default)]
pub limit: Option<u32>,
#[serde(default = "default_true")]
pub include_files: bool,
}
#[derive(Debug, Deserialize, Serialize, schemars::JsonSchema)]
pub struct CommitsTouchingParams {
pub path: RelPath,
#[serde(default)]
pub limit: Option<u32>,
}
#[derive(Debug, Deserialize, Serialize, schemars::JsonSchema)]
pub struct DiffOutlineParams {
pub path: RelPath,
#[serde(default)]
pub rev: Option<String>,
}
#[derive(Debug, Deserialize, Serialize, schemars::JsonSchema)]
pub struct RepoInfoParams {}
#[derive(Debug, Deserialize, Serialize, schemars::JsonSchema)]
pub struct BlameFileParams {
pub path: RelPath,
#[serde(default)]
pub line_start: Option<u32>,
#[serde(default)]
pub line_end: Option<u32>,
#[serde(default)]
pub rev: Option<String>,
}
#[derive(Debug, Deserialize, Serialize, schemars::JsonSchema)]
pub struct FindCommitsByPathParams {
pub pattern: String,
#[serde(default)]
pub window: Option<u32>,
#[serde(default)]
pub limit: Option<u32>,
}
#[derive(Debug, Deserialize, Serialize, schemars::JsonSchema)]
pub struct HotFilesParams {
#[serde(default)]
pub window: Option<u32>,
#[serde(default)]
pub top_k: Option<u32>,
}
#[derive(Debug, Deserialize, Serialize, schemars::JsonSchema)]
pub struct DiffFileParams {
pub rev_old: String,
pub rev_new: String,
pub path: RelPath,
}
#[derive(Debug, Deserialize, Serialize, schemars::JsonSchema)]
pub struct SymbolHistoryParams {
pub path: RelPath,
pub name: String,
#[serde(default)]
pub kind: Option<String>,
#[serde(default)]
pub limit: Option<u32>,
#[serde(default)]
pub hash_mode: Option<String>,
}
#[derive(Debug, Deserialize, Serialize, schemars::JsonSchema)]
pub struct FindReferencesParams {
pub name: String,
#[serde(default)]
pub limit: Option<u32>,
}
#[derive(Debug, Deserialize, Serialize, schemars::JsonSchema)]
pub struct FindCallersParams {
pub path: RelPath,
pub name: String,
#[serde(default)]
pub kind: Option<String>,
#[serde(default)]
pub limit: Option<u32>,
}
#[derive(Debug, Deserialize, Serialize, schemars::JsonSchema)]
pub struct BlameSymbolParams {
pub path: RelPath,
pub name: String,
#[serde(default)]
pub kind: Option<String>,
#[serde(default)]
pub rev: Option<String>,
}
fn default_true() -> bool {
true
}
#[derive(Debug, Serialize)]
pub(super) struct OutlineResponse {
pub path: RelPath,
pub language: String,
pub size_bytes: u64,
pub had_errors: bool,
pub error_count: u32,
pub symbols: Vec<SymbolView>,
pub imports: Vec<ImportView>,
#[serde(skip_serializing_if = "Option::is_none")]
pub calls: Option<Vec<CallView>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub docs: Option<Vec<DocView>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub l2_status: Option<&'static str>,
}
#[derive(Debug, Serialize)]
pub(super) struct SymbolView {
pub name: String,
pub kind: String,
pub start_row: u32,
pub start_col: u32,
pub start_byte: u32,
pub end_byte: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub signature: Option<String>,
}
#[derive(Debug, Serialize)]
pub(super) struct ImportView {
#[serde(skip_serializing_if = "Option::is_none")]
pub module: Option<String>,
pub raw: String,
pub start_byte: u32,
}
#[derive(Debug, Serialize)]
pub(super) struct CallView {
pub callee: String,
pub start_byte: u32,
}
#[derive(Debug, Serialize)]
pub(super) struct DocView {
pub text: String,
pub start_byte: u32,
}
#[derive(Debug, Serialize)]
pub(super) struct SearchHitView {
pub path: RelPath,
pub name: String,
pub kind: String,
pub start_row: u32,
pub start_col: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub signature: Option<String>,
}
#[derive(Debug, Serialize)]
pub(super) struct SearchResponse {
pub total: usize,
pub truncated: bool,
pub results: Vec<SearchHitView>,
}
#[derive(Debug, Serialize)]
pub(super) struct ListFilesEntry {
pub path: RelPath,
pub language: String,
pub size_bytes: u64,
}
#[derive(Debug, Serialize)]
pub(super) struct ListFilesResponse {
pub total: usize,
pub returned: usize,
pub truncated: bool,
pub files: Vec<ListFilesEntry>,
}
#[derive(Debug, Serialize)]
pub(super) struct DependentsResponse {
pub module: String,
pub paths: Vec<RelPath>,
}
#[derive(Debug, Serialize)]
pub(super) struct StatusResponse {
pub file_count: usize,
pub total_size_bytes: u64,
pub languages: BTreeMap<String, usize>,
pub cache_dir: String,
pub schema_version: u16,
pub root: String,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub submodules: Vec<RelPath>,
}
#[derive(Debug, Serialize)]
pub(super) struct CommitView {
pub sha: String,
pub short_sha: String,
pub summary: String,
pub author: String,
pub author_time_unix: i64,
#[serde(skip_serializing_if = "Option::is_none")]
pub files: Option<Vec<CommitFileView>>,
}
#[derive(Debug, Serialize)]
pub(super) struct CommitFileView {
pub path: RelPath,
pub change: &'static str,
}
#[derive(Debug, Serialize)]
pub(super) struct WorkingTreeStatusView {
pub staged_added: Vec<RelPath>,
pub staged_modified: Vec<RelPath>,
pub staged_deleted: Vec<RelPath>,
pub modified: Vec<RelPath>,
pub untracked: Vec<RelPath>,
pub is_clean: bool,
}
#[derive(Debug, Serialize)]
pub(super) struct RecentChangesResponse {
pub commits: Vec<CommitView>,
#[serde(skip_serializing_if = "std::ops::Not::not")]
pub truncated: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub truncated_reason: Option<&'static str>,
}
#[derive(Debug, Serialize)]
pub(super) struct CommitsTouchingResponse {
pub path: RelPath,
pub commits: Vec<CommitView>,
#[serde(skip_serializing_if = "std::ops::Not::not")]
pub truncated: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub truncated_reason: Option<&'static str>,
}
#[derive(Debug, Serialize)]
pub(super) struct DiffSymbolView {
pub name: String,
pub kind: String,
}
#[derive(Debug, Serialize)]
pub(super) struct DiffOutlineResponse {
pub path: RelPath,
pub rev: String,
pub added: Vec<DiffSymbolView>,
pub removed: Vec<DiffSymbolView>,
pub common: Vec<DiffSymbolView>,
#[serde(skip_serializing_if = "Option::is_none")]
pub note: Option<String>,
}
#[derive(Debug, Serialize)]
pub(super) struct BlameHunkView {
pub commit_sha: String,
pub short_sha: String,
pub start_line: u32,
pub len: u32,
pub source_start_line: u32,
pub author: String,
pub author_time_unix: i64,
pub summary: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub source_path: Option<RelPath>,
}
#[derive(Debug, Serialize)]
pub(super) struct BlameResponse {
pub path: RelPath,
pub suspect_sha: String,
pub hunks: Vec<BlameHunkView>,
#[serde(skip_serializing_if = "std::ops::Not::not")]
pub truncated: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub truncated_reason: Option<&'static str>,
}
#[derive(Debug, Serialize)]
pub(super) struct BlameSymbolResponse {
pub path: RelPath,
pub suspect_sha: String,
pub name: String,
pub kind: String,
pub line_start: u32,
pub line_end: u32,
pub hunks: Vec<BlameHunkView>,
#[serde(skip_serializing_if = "std::ops::Not::not")]
pub truncated: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub truncated_reason: Option<&'static str>,
}
#[derive(Debug, Serialize)]
pub(super) struct FindCommitsByPathResponse {
pub pattern: String,
pub window_inspected: u32,
pub commits: Vec<CommitView>,
}
#[derive(Debug, Serialize)]
pub(super) struct HotFileEntry {
pub path: RelPath,
pub commits_touching: u32,
pub added: u32,
pub modified: u32,
pub deleted: u32,
}
#[derive(Debug, Serialize)]
pub(super) struct HotFilesResponse {
pub window_inspected: u32,
pub total_files_changed: u32,
pub files: Vec<HotFileEntry>,
}
#[derive(Debug, Serialize)]
pub(super) struct HunkView {
pub kind: &'static str,
pub old_line_start: u32,
pub old_line_count: u32,
pub new_line_start: u32,
pub new_line_count: u32,
pub text: String,
}
#[derive(Debug, Serialize)]
pub(super) struct DiffFileResponse {
pub path: RelPath,
pub rev_old: String,
pub rev_new: String,
pub present_at_old: bool,
pub present_at_new: bool,
pub hunks: Vec<HunkView>,
}
#[derive(Debug, Serialize)]
pub(super) struct SymbolHistoryEntry {
pub sha: String,
pub short_sha: String,
pub summary: String,
pub author: String,
pub author_time_unix: i64,
pub change: &'static str,
}
#[derive(Debug, Serialize)]
pub(super) struct SymbolHistoryResponse {
pub path: RelPath,
pub name: String,
pub kind: Option<String>,
pub commits_inspected: u32,
pub history: Vec<SymbolHistoryEntry>,
pub hash_mode: &'static str,
#[serde(skip_serializing_if = "std::ops::Not::not")]
pub truncated: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub truncated_reason: Option<&'static str>,
}
#[derive(Debug, Serialize)]
pub(super) struct ReferenceHit {
pub path: RelPath,
pub line: u32,
pub column: u32,
pub callee: String,
}
#[derive(Debug, Serialize)]
pub(super) struct FindReferencesResponse {
pub name: String,
pub total: u32,
#[serde(skip_serializing_if = "std::ops::Not::not")]
pub total_is_partial: bool,
pub hits: Vec<ReferenceHit>,
}
#[derive(Debug, Serialize)]
pub(super) struct FindCallersResponse {
pub definition: Option<DefinitionView>,
pub total: u32,
#[serde(skip_serializing_if = "std::ops::Not::not")]
pub total_is_partial: bool,
pub hits: Vec<ReferenceHit>,
}
#[derive(Debug, Serialize)]
pub(super) struct DefinitionView {
pub path: RelPath,
pub name: String,
pub kind: &'static str,
pub start_row: u32,
pub start_col: u32,
}
#[derive(Debug, Serialize)]
pub(super) struct RepoInfoResponse {
pub workdir: String,
pub head_sha: Option<String>,
pub head_short_sha: Option<String>,
pub branch: Option<String>,
}