1use serde::{Deserialize, Serialize};
4use serde_json::Value;
5use utoipa::ToSchema;
6
7pub const CONSOLE_BRIDGE_PROTOCOL: &str = "lenso.console-bridge.v1";
8
9#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, schemars::JsonSchema)]
10pub struct ConsoleSurface {
11 pub name: String,
12 pub label: String,
13 pub route: String,
14 pub presentation: ConsoleSurfacePresentation,
15 #[serde(default, skip_serializing_if = "Option::is_none")]
16 pub icon: Option<String>,
17 #[serde(default)]
18 pub required_capabilities: Vec<String>,
19 #[serde(default, skip_serializing_if = "Option::is_none")]
20 pub navigation: Option<ConsoleNavigation>,
21}
22
23#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, schemars::JsonSchema)]
24#[serde(tag = "kind", rename_all = "snake_case")]
25#[non_exhaustive]
26pub enum ConsoleSurfacePresentation {
27 Declarative {
28 schema: Value,
29 },
30 Isolated {
31 entry: String,
32 bridge_protocol: String,
33 },
34}
35
36#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, schemars::JsonSchema)]
37pub struct ConsolePermissionRequest {
38 pub permission_id: String,
39 #[serde(default)]
40 pub operations: Vec<String>,
41 #[serde(default)]
42 pub resources: Vec<String>,
43 #[serde(default)]
44 pub outbound_destinations: Vec<String>,
45 #[serde(default)]
46 pub secret_references: Vec<String>,
47}
48
49#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, schemars::JsonSchema)]
50pub struct ConsolePermissionGrant {
51 pub module_id: String,
52 pub module_release_digest: String,
53 #[serde(default, skip_serializing_if = "Option::is_none")]
54 pub ui_artifact_digest: Option<String>,
55 #[serde(default)]
56 pub granted_permissions: Vec<String>,
57}
58
59#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, schemars::JsonSchema)]
60pub struct ConsoleContribution {
61 pub target: String,
62 pub target_version: u32,
63 pub label: String,
64 pub action: ConsoleContributionAction,
65 #[serde(default, skip_serializing_if = "Option::is_none")]
66 pub icon: Option<String>,
67 #[serde(default)]
68 pub required_capabilities: Vec<String>,
69}
70
71#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, schemars::JsonSchema)]
72pub struct ConsoleSlot {
73 pub id: String,
74 pub version: u32,
75 pub label: String,
76 #[serde(default)]
77 pub accepts: Vec<ConsoleContributionKind>,
78 #[serde(default)]
79 pub context: Vec<ConsoleSlotContext>,
80}
81
82#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, schemars::JsonSchema)]
83#[serde(rename_all = "snake_case")]
84#[non_exhaustive]
85pub enum ConsoleContributionKind {
86 AdminAction,
87}
88
89#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, schemars::JsonSchema)]
90pub struct ConsoleSlotContext {
91 pub name: String,
92 #[serde(default)]
93 pub fields: Vec<ConsoleSlotContextField>,
94}
95
96#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, schemars::JsonSchema)]
97pub struct ConsoleSlotContextField {
98 pub name: String,
99 pub field_type: ConsoleSlotContextFieldType,
100 #[serde(default)]
101 pub required: bool,
102}
103
104#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, schemars::JsonSchema)]
105#[serde(rename_all = "snake_case")]
106#[non_exhaustive]
107pub enum ConsoleSlotContextFieldType {
108 String,
109 Boolean,
110 Number,
111 Timestamp,
112}
113
114#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, schemars::JsonSchema)]
115#[serde(tag = "kind", rename_all = "snake_case")]
116#[non_exhaustive]
117pub enum ConsoleContributionAction {
118 AdminAction {
119 module: String,
120 name: String,
121 #[serde(default)]
122 input_bindings: Vec<ConsoleActionInputBinding>,
123 },
124}
125
126#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, schemars::JsonSchema)]
127pub struct ConsoleActionInputBinding {
128 pub input: String,
129 pub value: ConsoleActionInputValue,
130}
131
132#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, schemars::JsonSchema)]
133#[serde(tag = "kind", rename_all = "snake_case")]
134#[non_exhaustive]
135pub enum ConsoleActionInputValue {
136 SlotContext { path: String },
137}
138
139#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, schemars::JsonSchema)]
140pub struct ConsoleNavigation {
141 pub workspace: ConsoleWorkspaceRef,
142 #[serde(default, skip_serializing_if = "Option::is_none")]
143 pub group: Option<ConsoleNavigationGroup>,
144 #[serde(default, skip_serializing_if = "Option::is_none")]
145 pub order: Option<i32>,
146}
147
148#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, schemars::JsonSchema)]
149pub struct ConsoleWorkspaceRef {
150 pub id: String,
151 pub label: String,
152 #[serde(default, skip_serializing_if = "Option::is_none")]
153 pub icon: Option<String>,
154}
155
156#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, schemars::JsonSchema)]
157pub struct ConsoleNavigationGroup {
158 pub id: String,
159 pub label: String,
160 #[serde(default, skip_serializing_if = "Option::is_none")]
161 pub icon: Option<String>,
162 #[serde(default, skip_serializing_if = "Option::is_none")]
163 pub order: Option<i32>,
164}