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}