#![allow(dead_code)]
use rmcp::schemars;
use rmcp::serde::{self, Deserialize, Serialize};
#[derive(Debug, Default, serde::Deserialize, schemars::JsonSchema)]
pub struct SearchCodebaseParams {
pub query: String,
#[serde(default)]
pub is_regex: bool,
#[serde(default = "default_path_glob")]
pub path_glob: String,
#[serde(default)]
pub filter_mode: pathfinder_common::types::FilterMode,
#[serde(default = "default_max_results")]
pub max_results: u32,
#[serde(default = "default_context_lines")]
pub context_lines: u32,
#[serde(default)]
pub known_files: Vec<String>,
#[serde(default)]
pub group_by_file: bool,
#[serde(default)]
pub exclude_glob: String,
#[serde(default)]
pub offset: u32,
}
#[derive(Debug, Default, serde::Deserialize, schemars::JsonSchema)]
pub struct GetRepoMapParams {
#[serde(default = "default_repo_map_path")]
pub path: String,
#[serde(default = "default_max_tokens")]
pub max_tokens: u32,
#[serde(default = "default_depth")]
pub depth: u32,
#[serde(default)]
pub visibility: pathfinder_common::types::Visibility,
#[serde(default)]
pub include_imports: pathfinder_common::types::IncludeImports,
#[serde(default = "default_max_tokens_per_file")]
pub max_tokens_per_file: u32,
#[serde(default)]
pub changed_since: String,
#[serde(default)]
pub include_extensions: Vec<String>,
#[serde(default)]
pub exclude_extensions: Vec<String>,
}
#[derive(Debug, Default, serde::Deserialize, schemars::JsonSchema)]
pub struct ReadSymbolScopeParams {
pub semantic_path: String,
}
#[derive(Debug, Default, serde::Deserialize, schemars::JsonSchema)]
pub struct ReadWithDeepContextParams {
pub semantic_path: String,
}
#[derive(Debug, Default, serde::Deserialize, schemars::JsonSchema)]
pub struct GetDefinitionParams {
pub semantic_path: String,
}
#[derive(Debug, Default, serde::Deserialize, schemars::JsonSchema)]
pub struct AnalyzeImpactParams {
pub semantic_path: String,
#[serde(default = "default_max_depth")]
pub max_depth: u32,
}
#[derive(Debug, Default, serde::Deserialize, schemars::JsonSchema)]
pub struct ReplaceBodyParams {
pub semantic_path: String,
pub base_version: String,
pub new_code: String,
#[serde(default)]
pub ignore_validation_failures: bool,
}
#[derive(Debug, Default, serde::Deserialize, schemars::JsonSchema)]
pub struct ReplaceFullParams {
pub semantic_path: String,
pub base_version: String,
pub new_code: String,
#[serde(default)]
pub ignore_validation_failures: bool,
}
#[derive(Debug, Default, serde::Deserialize, schemars::JsonSchema)]
pub struct InsertBeforeParams {
pub semantic_path: String,
pub base_version: String,
pub new_code: String,
#[serde(default)]
pub ignore_validation_failures: bool,
}
#[derive(Debug, Default, serde::Deserialize, schemars::JsonSchema)]
pub struct InsertAfterParams {
pub semantic_path: String,
pub base_version: String,
pub new_code: String,
#[serde(default)]
pub ignore_validation_failures: bool,
}
#[derive(Debug, Default, serde::Deserialize, schemars::JsonSchema)]
pub struct InsertIntoParams {
pub semantic_path: String,
pub base_version: String,
pub new_code: String,
#[serde(default)]
pub ignore_validation_failures: bool,
}
#[derive(Debug, Default, serde::Deserialize, schemars::JsonSchema)]
pub struct DeleteSymbolParams {
pub semantic_path: String,
pub base_version: String,
#[serde(default)]
pub ignore_validation_failures: bool,
}
#[derive(Debug, Default, serde::Deserialize, schemars::JsonSchema)]
pub struct ValidateOnlyParams {
pub semantic_path: String,
pub edit_type: String,
pub new_code: Option<String>,
pub base_version: String,
}
#[derive(Debug, Default, Clone, serde::Deserialize, schemars::JsonSchema)]
pub struct CreateFileParams {
pub filepath: String,
pub content: String,
}
#[derive(Debug, Default, serde::Deserialize, schemars::JsonSchema)]
pub struct DeleteFileParams {
pub filepath: String,
pub base_version: String,
}
#[derive(Debug, Default, serde::Deserialize, schemars::JsonSchema)]
pub struct ReadFileParams {
pub filepath: String,
#[serde(default = "default_start_line")]
pub start_line: u32,
#[serde(default = "default_max_lines")]
pub max_lines: u32,
}
#[derive(Debug, Default, serde::Deserialize, schemars::JsonSchema)]
pub struct WriteFileParams {
pub filepath: String,
pub base_version: String,
pub content: Option<String>,
pub replacements: Option<Vec<Replacement>>,
}
#[derive(Debug, Default, Clone, serde::Deserialize, schemars::JsonSchema)]
pub struct Replacement {
pub old_text: String,
pub new_text: String,
}
#[derive(Debug, Default, serde::Deserialize, schemars::JsonSchema)]
pub struct ReadSourceFileParams {
pub filepath: String,
#[serde(default = "default_detail_level")]
pub detail_level: String,
#[serde(default = "default_start_line")]
pub start_line: u32,
#[serde(default)]
pub end_line: Option<u32>,
}
#[derive(Debug, Default, serde::Deserialize, schemars::JsonSchema)]
pub struct BatchEdit {
#[serde(default)]
pub semantic_path: String,
#[serde(default)]
pub edit_type: String,
pub new_code: Option<String>,
pub old_text: Option<String>,
pub context_line: Option<u32>,
pub replacement_text: Option<String>,
#[serde(default)]
pub normalize_whitespace: bool,
}
#[derive(Debug, Default, serde::Deserialize, schemars::JsonSchema)]
pub struct ReplaceBatchParams {
pub filepath: String,
pub base_version: String,
pub edits: Vec<BatchEdit>,
#[serde(default)]
pub ignore_validation_failures: bool,
}
#[derive(Debug, Serialize, schemars::JsonSchema)]
pub struct SearchCodebaseResponse {
pub matches: Vec<pathfinder_search::SearchMatch>,
pub total_matches: usize,
pub returned_count: usize,
pub truncated: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_groups: Option<Vec<SearchResultGroup>>,
#[serde(default)]
pub degraded: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub degraded_reason: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub next_offset: Option<u32>,
}
#[derive(Debug, Serialize, schemars::JsonSchema)]
pub struct GroupedKnownMatch {
pub line: u64,
pub column: u64,
#[serde(skip_serializing_if = "Option::is_none")]
pub enclosing_semantic_path: Option<String>,
pub known: bool,
}
#[derive(Debug, Serialize, schemars::JsonSchema)]
pub struct SearchResultGroup {
pub file: String,
pub version_hash: String,
pub total_matches: usize,
#[serde(skip_serializing_if = "Vec::is_empty")]
#[schemars(skip)]
pub matches: Vec<GroupedMatch>,
#[serde(skip_serializing_if = "Vec::is_empty")]
#[schemars(skip)]
pub known_matches: Vec<GroupedKnownMatch>,
}
#[derive(Debug, Serialize, schemars::JsonSchema)]
pub struct GroupedMatch {
pub line: u64,
pub column: u64,
pub content: String,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub context_before: Vec<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub context_after: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub enclosing_semantic_path: Option<String>,
}
#[derive(Debug, Serialize, serde::Deserialize, schemars::JsonSchema)]
pub struct GetRepoMapMetadata {
pub tech_stack: Vec<String>,
pub files_scanned: usize,
pub files_truncated: usize,
pub files_in_scope: usize,
pub coverage_percent: u8,
pub version_hashes: std::collections::HashMap<String, String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub visibility_degraded: Option<bool>,
#[serde(default)]
pub degraded: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub degraded_reason: Option<String>,
pub capabilities: RepoCapabilities,
}
#[derive(Debug, Serialize, serde::Deserialize, schemars::JsonSchema)]
pub struct RepoCapabilities {
pub edit: bool,
pub search: bool,
pub lsp: LspCapabilities,
}
#[derive(Debug, Serialize, serde::Deserialize, schemars::JsonSchema)]
pub struct LspCapabilities {
pub supported: bool,
pub per_language: std::collections::HashMap<String, pathfinder_lsp::types::LspLanguageStatus>,
}
#[derive(Debug, Serialize, serde::Deserialize, schemars::JsonSchema)]
pub struct ReadSymbolScopeMetadata {
pub content: String,
pub start_line: usize,
pub end_line: usize,
pub version_hash: String,
pub language: String,
}
#[derive(Debug, Serialize, schemars::JsonSchema)]
pub struct ReadSymbolScopeResponse {
pub content: String,
pub start_line: usize,
pub end_line: usize,
pub version_hash: String,
pub language: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, serde::Deserialize, schemars::JsonSchema)]
pub struct SourceSymbol {
pub name: String,
pub semantic_path: String,
pub kind: String,
pub start_line: usize,
pub end_line: usize,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub children: Vec<Self>,
}
#[derive(Debug, Clone, PartialEq, Default, Serialize, serde::Deserialize, schemars::JsonSchema)]
pub struct ReadSourceFileMetadata {
pub version_hash: String,
pub language: String,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub symbols: Vec<SourceSymbol>,
}
#[derive(Debug, Serialize, schemars::JsonSchema)]
pub struct EditResponse {
pub success: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub new_version_hash: Option<String>,
pub formatted: bool,
pub validation: EditValidation,
#[serde(default)]
pub validation_skipped: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub validation_skipped_reason: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub warning: Option<String>,
}
#[derive(Debug, Clone, Serialize, schemars::JsonSchema)]
pub struct EditValidation {
pub status: String,
pub introduced_errors: Vec<pathfinder_common::error::DiagnosticError>,
pub resolved_errors: Vec<pathfinder_common::error::DiagnosticError>,
#[serde(skip_serializing_if = "Option::is_none")]
pub validation_confidence: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub recovery_action: Option<String>,
}
impl EditValidation {
#[must_use]
pub fn skipped() -> Self {
Self {
status: "skipped".to_owned(),
introduced_errors: vec![],
resolved_errors: vec![],
validation_confidence: Some("none".to_owned()),
recovery_action: None,
}
}
#[must_use]
pub fn skipped_with_recovery(recovery_action: Option<String>) -> Self {
Self {
status: "skipped".to_owned(),
introduced_errors: vec![],
resolved_errors: vec![],
validation_confidence: Some("none".to_owned()),
recovery_action,
}
}
#[must_use]
pub fn uncertain() -> Self {
Self {
status: "uncertain".to_owned(),
introduced_errors: vec![],
resolved_errors: vec![],
validation_confidence: Some("low".to_owned()),
recovery_action: None,
}
}
}
#[derive(Debug, Serialize, schemars::JsonSchema)]
pub struct CreateFileResponse {
pub success: bool,
pub version_hash: String,
pub validation: ValidationResult,
}
#[derive(Debug, Serialize, schemars::JsonSchema)]
pub struct DeleteFileResponse {
pub success: bool,
pub version_hash: String,
}
#[derive(Debug, Serialize, serde::Deserialize, schemars::JsonSchema)]
pub struct ReadFileMetadata {
pub start_line: u32,
pub lines_returned: u32,
pub total_lines: u32,
pub truncated: bool,
pub version_hash: String,
pub language: String,
}
#[derive(Debug, Serialize, serde::Deserialize, schemars::JsonSchema)]
pub struct WriteFileMetadata {
pub success: bool,
pub new_version_hash: String,
}
#[derive(Debug, Serialize, schemars::JsonSchema)]
pub struct ValidationResult {
pub status: String,
pub introduced_errors: Vec<pathfinder_common::error::DiagnosticError>,
}
#[derive(Debug, Serialize, serde::Deserialize, schemars::JsonSchema)]
pub struct DeepContextDependency {
pub semantic_path: String,
pub signature: String,
pub file: String,
pub line: usize,
}
#[derive(Debug, Serialize, serde::Deserialize, schemars::JsonSchema)]
pub struct ReadWithDeepContextMetadata {
pub start_line: usize,
pub end_line: usize,
pub version_hash: String,
pub language: String,
#[serde(skip_serializing_if = "Vec::is_empty", default)]
pub dependencies: Vec<DeepContextDependency>,
#[serde(default)]
pub degraded: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub degraded_reason: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub lsp_readiness: Option<String>,
}
#[derive(Debug, Serialize, schemars::JsonSchema)]
pub struct GetDefinitionResponse {
pub file: String,
pub line: u32,
pub column: u32,
pub preview: String,
#[serde(default)]
pub degraded: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub degraded_reason: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub lsp_readiness: Option<String>,
}
#[derive(Debug, Serialize, serde::Deserialize, schemars::JsonSchema)]
pub struct ImpactReference {
pub semantic_path: String,
pub file: String,
pub line: usize,
pub snippet: String,
pub version_hash: String,
pub direction: String,
pub depth: usize,
}
#[derive(Debug, Serialize, serde::Deserialize, schemars::JsonSchema)]
pub struct AnalyzeImpactMetadata {
pub incoming: Option<Vec<ImpactReference>>,
pub outgoing: Option<Vec<ImpactReference>>,
pub depth_reached: u32,
pub files_referenced: usize,
pub degraded: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub degraded_reason: Option<String>,
#[serde(skip_serializing_if = "std::collections::HashMap::is_empty", default)]
pub version_hashes: std::collections::HashMap<String, String>,
}
#[derive(Debug, Default, serde::Deserialize, schemars::JsonSchema)]
pub struct LspHealthParams {
#[serde(default)]
pub language: Option<String>,
#[serde(default)]
pub action: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, schemars::JsonSchema)]
pub struct LspHealthResponse {
pub status: String,
pub languages: Vec<LspLanguageHealth>,
}
#[derive(Debug, Serialize, Deserialize, schemars::JsonSchema)]
pub struct LspLanguageHealth {
pub language: String,
pub status: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub uptime: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub diagnostics_strategy: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub supports_call_hierarchy: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub supports_diagnostics: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub supports_definition: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub supports_formatting: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub indexing_status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub navigation_ready: Option<bool>,
#[serde(skip_serializing_if = "crate::server::types::is_false")]
pub probe_verified: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub install_hint: Option<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub degraded_tools: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub validation_latency_ms: Option<u64>,
}
#[allow(clippy::trivially_copy_pass_by_ref)] pub(crate) fn is_false(b: &bool) -> bool {
!b
}
#[must_use]
pub fn default_path_glob() -> String {
"**/*".to_owned()
}
#[must_use]
pub const fn default_max_results() -> u32 {
50
}
#[must_use]
pub const fn default_context_lines() -> u32 {
2
}
#[must_use]
pub fn default_repo_map_path() -> String {
".".to_owned()
}
#[must_use]
pub const fn default_max_tokens() -> u32 {
16_000
}
#[must_use]
pub const fn default_max_tokens_per_file() -> u32 {
2_000
}
#[must_use]
pub const fn default_depth() -> u32 {
5
}
#[must_use]
pub const fn default_max_depth() -> u32 {
2
}
#[must_use]
pub const fn default_start_line() -> u32 {
1
}
#[must_use]
pub const fn default_max_lines() -> u32 {
500
}
#[must_use]
pub fn default_detail_level() -> String {
"compact".to_string()
}