ucp_codegraph/programmatic/
types.rs1use serde::{Deserialize, Serialize};
2use ucm_core::BlockId;
3
4use crate::{
5 CodeGraphCoderef, CodeGraphContextUpdate, CodeGraphDetailLevel, CodeGraphSelectionOrigin,
6};
7
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
9#[serde(rename_all = "snake_case")]
10pub enum CodeGraphExpandMode {
11 File,
12 Dependencies,
13 Dependents,
14}
15
16#[derive(Debug, Clone, Default, Serialize, Deserialize)]
17pub struct CodeGraphFindQuery {
18 #[serde(default, skip_serializing_if = "Option::is_none")]
19 pub node_class: Option<String>,
20 #[serde(default, skip_serializing_if = "Option::is_none")]
21 pub name_regex: Option<String>,
22 #[serde(default, skip_serializing_if = "Option::is_none")]
23 pub path_regex: Option<String>,
24 #[serde(default, skip_serializing_if = "Option::is_none")]
25 pub logical_key_regex: Option<String>,
26 #[serde(default)]
27 pub case_sensitive: bool,
28 #[serde(default, skip_serializing_if = "Option::is_none")]
29 pub exported: Option<bool>,
30 #[serde(default, skip_serializing_if = "Option::is_none")]
31 pub limit: Option<usize>,
32}
33
34#[derive(Debug, Clone, Serialize, Deserialize)]
35pub struct CodeGraphNodeSummary {
36 pub block_id: BlockId,
37 pub node_class: String,
38 pub label: String,
39 #[serde(default, skip_serializing_if = "Option::is_none")]
40 pub logical_key: Option<String>,
41 #[serde(default, skip_serializing_if = "Option::is_none")]
42 pub symbol_name: Option<String>,
43 #[serde(default, skip_serializing_if = "Option::is_none")]
44 pub path: Option<String>,
45 pub exported: bool,
46 #[serde(default, skip_serializing_if = "Option::is_none")]
47 pub coderef: Option<CodeGraphCoderef>,
48}
49
50#[derive(Debug, Clone, Serialize, Deserialize)]
51pub struct CodeGraphPathHop {
52 pub from: BlockId,
53 pub to: BlockId,
54 pub relation: String,
55 pub direction: String,
56}
57
58#[derive(Debug, Clone, Serialize, Deserialize)]
59pub struct CodeGraphPathResult {
60 pub start: CodeGraphNodeSummary,
61 pub end: CodeGraphNodeSummary,
62 #[serde(default)]
63 pub hops: Vec<CodeGraphPathHop>,
64}
65
66#[derive(Debug, Clone, Serialize, Deserialize)]
67pub struct CodeGraphSelectionExplanation {
68 pub block_id: BlockId,
69 pub selected: bool,
70 pub focus: bool,
71 pub pinned: bool,
72 #[serde(default, skip_serializing_if = "Option::is_none")]
73 pub detail_level: Option<CodeGraphDetailLevel>,
74 #[serde(default, skip_serializing_if = "Option::is_none")]
75 pub origin: Option<CodeGraphSelectionOrigin>,
76 pub explanation: String,
77 #[serde(default, skip_serializing_if = "Option::is_none")]
78 pub node: Option<CodeGraphNodeSummary>,
79 #[serde(default, skip_serializing_if = "Option::is_none")]
80 pub anchor: Option<CodeGraphNodeSummary>,
81}
82
83#[derive(Debug, Clone, Serialize, Deserialize)]
84pub struct CodeGraphSessionDiff {
85 #[serde(default)]
86 pub added: Vec<CodeGraphNodeSummary>,
87 #[serde(default)]
88 pub removed: Vec<CodeGraphNodeSummary>,
89 #[serde(default, skip_serializing_if = "Option::is_none")]
90 pub focus_before: Option<BlockId>,
91 #[serde(default, skip_serializing_if = "Option::is_none")]
92 pub focus_after: Option<BlockId>,
93 pub changed_focus: bool,
94}
95
96#[derive(Debug, Clone, Serialize, Deserialize)]
97pub struct CodeGraphRecommendedActionsResult {
98 #[serde(default)]
99 pub applied_actions: Vec<String>,
100 pub update: CodeGraphContextUpdate,
101}