Skip to main content

ucp_codegraph/programmatic/
types.rs

1use serde::{Deserialize, Serialize};
2use ucm_core::BlockId;
3
4use crate::{
5    CodeGraphCoderef, CodeGraphContextUpdate, CodeGraphDetailLevel, CodeGraphExportOmissionDetail,
6    CodeGraphOperationBudget, CodeGraphRecommendation, CodeGraphSelectionOrigin,
7    CodeGraphSessionEvent,
8};
9
10#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
11#[serde(rename_all = "snake_case")]
12pub enum CodeGraphExpandMode {
13    File,
14    Dependencies,
15    Dependents,
16}
17
18#[derive(Debug, Clone, Default, Serialize, Deserialize)]
19pub struct CodeGraphFindQuery {
20    #[serde(default, skip_serializing_if = "Option::is_none")]
21    pub node_class: Option<String>,
22    #[serde(default, skip_serializing_if = "Option::is_none")]
23    pub name_regex: Option<String>,
24    #[serde(default, skip_serializing_if = "Option::is_none")]
25    pub path_regex: Option<String>,
26    #[serde(default, skip_serializing_if = "Option::is_none")]
27    pub logical_key_regex: Option<String>,
28    #[serde(default)]
29    pub case_sensitive: bool,
30    #[serde(default, skip_serializing_if = "Option::is_none")]
31    pub exported: Option<bool>,
32    #[serde(default, skip_serializing_if = "Option::is_none")]
33    pub limit: Option<usize>,
34}
35
36#[derive(Debug, Clone, Serialize, Deserialize)]
37pub struct CodeGraphNodeSummary {
38    pub block_id: BlockId,
39    pub node_class: String,
40    pub label: String,
41    #[serde(default, skip_serializing_if = "Option::is_none")]
42    pub logical_key: Option<String>,
43    #[serde(default, skip_serializing_if = "Option::is_none")]
44    pub symbol_name: Option<String>,
45    #[serde(default, skip_serializing_if = "Option::is_none")]
46    pub path: Option<String>,
47    pub exported: bool,
48    #[serde(default, skip_serializing_if = "Option::is_none")]
49    pub coderef: Option<CodeGraphCoderef>,
50}
51
52#[derive(Debug, Clone, Serialize, Deserialize)]
53pub struct CodeGraphPathHop {
54    pub from: BlockId,
55    pub to: BlockId,
56    pub relation: String,
57    pub direction: String,
58}
59
60#[derive(Debug, Clone, Serialize, Deserialize)]
61pub struct CodeGraphPathResult {
62    pub start: CodeGraphNodeSummary,
63    pub end: CodeGraphNodeSummary,
64    #[serde(default)]
65    pub hops: Vec<CodeGraphPathHop>,
66}
67
68#[derive(Debug, Clone, Serialize, Deserialize)]
69pub struct CodeGraphSelectionExplanation {
70    pub selector: String,
71    pub block_id: BlockId,
72    pub selected: bool,
73    pub focus: bool,
74    pub pinned: bool,
75    #[serde(default, skip_serializing_if = "Option::is_none")]
76    pub detail_level: Option<CodeGraphDetailLevel>,
77    #[serde(default, skip_serializing_if = "Option::is_none")]
78    pub origin: Option<CodeGraphSelectionOrigin>,
79    pub explanation: String,
80    #[serde(default, skip_serializing_if = "Option::is_none")]
81    pub node: Option<CodeGraphNodeSummary>,
82    #[serde(default, skip_serializing_if = "Option::is_none")]
83    pub anchor: Option<CodeGraphNodeSummary>,
84    #[serde(default, skip_serializing_if = "Vec::is_empty")]
85    pub provenance_chain: Vec<CodeGraphProvenanceStep>,
86}
87
88#[derive(Debug, Clone, Serialize, Deserialize)]
89pub struct CodeGraphProvenanceStep {
90    pub block_id: BlockId,
91    #[serde(default, skip_serializing_if = "Option::is_none")]
92    pub node: Option<CodeGraphNodeSummary>,
93    #[serde(default, skip_serializing_if = "Option::is_none")]
94    pub origin: Option<CodeGraphSelectionOrigin>,
95    pub explanation: String,
96}
97
98#[derive(Debug, Clone, Serialize, Deserialize)]
99pub struct CodeGraphSessionDiff {
100    #[serde(default)]
101    pub added: Vec<CodeGraphNodeSummary>,
102    #[serde(default)]
103    pub removed: Vec<CodeGraphNodeSummary>,
104    #[serde(default, skip_serializing_if = "Option::is_none")]
105    pub focus_before: Option<BlockId>,
106    #[serde(default, skip_serializing_if = "Option::is_none")]
107    pub focus_after: Option<BlockId>,
108    pub changed_focus: bool,
109}
110
111#[derive(Debug, Clone, Serialize, Deserialize)]
112pub struct CodeGraphRecommendedActionsResult {
113    #[serde(default)]
114    pub applied_actions: Vec<String>,
115    #[serde(default, skip_serializing_if = "Vec::is_empty")]
116    pub recommendations: Vec<CodeGraphRecommendation>,
117    pub update: CodeGraphContextUpdate,
118    #[serde(default, skip_serializing_if = "Vec::is_empty")]
119    pub events: Vec<CodeGraphSessionEvent>,
120}
121
122#[derive(Debug, Clone, Serialize, Deserialize)]
123pub struct CodeGraphSelectorResolutionExplanation {
124    pub selector: String,
125    #[serde(default, skip_serializing_if = "Option::is_none")]
126    pub resolved_block_id: Option<BlockId>,
127    #[serde(default, skip_serializing_if = "Option::is_none")]
128    pub match_kind: Option<String>,
129    pub ambiguous: bool,
130    pub explanation: String,
131    #[serde(default, skip_serializing_if = "Vec::is_empty")]
132    pub candidates: Vec<CodeGraphNodeSummary>,
133}
134
135#[derive(Debug, Clone, Serialize, Deserialize)]
136pub struct CodeGraphExportOmissionExplanation {
137    pub selector: String,
138    pub omitted: bool,
139    #[serde(default, skip_serializing_if = "Option::is_none")]
140    pub block_id: Option<BlockId>,
141    #[serde(default, skip_serializing_if = "Option::is_none")]
142    pub detail: Option<CodeGraphExportOmissionDetail>,
143    pub explanation: String,
144}
145
146#[derive(Debug, Clone, Serialize, Deserialize)]
147pub struct CodeGraphPruneExplanation {
148    pub selector: String,
149    #[serde(default, skip_serializing_if = "Option::is_none")]
150    pub block_id: Option<BlockId>,
151    pub pruned: bool,
152    pub explanation: String,
153}
154
155#[derive(Debug, Clone, Serialize, Deserialize)]
156pub struct CodeGraphMutationEstimate {
157    pub operation: String,
158    #[serde(default, skip_serializing_if = "Option::is_none")]
159    pub selector: Option<String>,
160    #[serde(default, skip_serializing_if = "Option::is_none")]
161    pub target_block_id: Option<BlockId>,
162    #[serde(default, skip_serializing_if = "Vec::is_empty")]
163    pub resolved_block_ids: Vec<BlockId>,
164    #[serde(default, skip_serializing_if = "Option::is_none")]
165    pub budget: Option<CodeGraphOperationBudget>,
166    pub estimated_nodes_added: usize,
167    pub estimated_nodes_changed: usize,
168    pub estimated_nodes_visited: usize,
169    pub estimated_frontier_width: usize,
170    pub estimated_rendered_bytes: usize,
171    pub estimated_rendered_tokens: u32,
172    pub estimated_export_growth: isize,
173    pub explanation: String,
174}