Skip to main content

chio_core/extension/
model.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
4#[serde(rename_all = "snake_case")]
5pub enum CanonicalContractKind {
6    Capability,
7    Receipt,
8    Policy,
9    ArtifactFamily,
10}
11
12#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
13#[serde(rename_all = "snake_case")]
14pub enum ExtensionPointKind {
15    Authority,
16    Store,
17    ToolServerConnection,
18    ResourceProvider,
19    PromptProvider,
20    Adapter,
21}
22
23#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
24#[serde(rename_all = "snake_case")]
25pub enum ExtensionStability {
26    Supported,
27    Experimental,
28    Internal,
29}
30
31#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
32#[serde(rename_all = "snake_case")]
33pub enum ExtensionIsolation {
34    InProcess,
35    Subprocess,
36    RemoteService,
37}
38
39#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
40#[serde(rename_all = "snake_case")]
41pub enum ExtensionEvidenceMode {
42    None,
43    ImportOnly,
44    DispatchOnly,
45    ImportAndDispatch,
46}
47
48#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
49#[serde(rename_all = "snake_case")]
50pub enum ExtensionPrivilege {
51    FilesystemRead,
52    FilesystemWrite,
53    NetworkEgress,
54    ProcessExecution,
55    OperatorSecrets,
56}
57
58#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
59#[serde(rename_all = "snake_case")]
60pub enum ExtensionDistribution {
61    OfficialFirstParty,
62    CustomFirstParty,
63    ThirdPartyCustom,
64}
65
66#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
67#[serde(rename_all = "snake_case")]
68pub enum OfficialImplementationSource {
69    FirstParty,
70}
71
72#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
73#[serde(rename_all = "snake_case")]
74pub enum ExtensionNegotiationOutcome {
75    Accepted,
76    Rejected,
77}
78
79#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
80#[serde(rename_all = "snake_case")]
81pub enum QualificationMode {
82    OfficialToOfficial,
83    OfficialToCustom,
84    CustomToOfficial,
85    CustomToCustom,
86}
87
88#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
89#[serde(rename_all = "snake_case")]
90pub enum QualificationOutcome {
91    Pass,
92    FailClosed,
93}
94
95#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
96#[serde(rename_all = "snake_case")]
97pub enum QualificationInvariant {
98    PreservesCanonicalTruth,
99    RequiresLocalPolicyActivation,
100    RejectsVersionMismatch,
101    RejectsPrivilegeEscalation,
102    RejectsTruthMutation,
103    RejectsUnsignedEvidence,
104}
105
106#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
107#[serde(rename_all = "snake_case")]
108pub enum ExtensionNegotiationRejectionCode {
109    MalformedInventory,
110    MalformedOfficialStack,
111    MalformedManifest,
112    UnknownExtensionPoint,
113    UnsupportedOfficialStack,
114    UnsupportedChioContract,
115    UnsupportedProfile,
116    UnsupportedComponent,
117    UnsupportedIsolation,
118    UnsupportedEvidenceMode,
119    UnsupportedPrivilege,
120    OfficialOnlyPoint,
121    InternalOnlyPoint,
122    LocalPolicyActivationRequired,
123    MissingSubjectBinding,
124    MissingSignerVerification,
125    MissingFreshnessCheck,
126    TruthMutationNotAllowed,
127    TrustWideningNotAllowed,
128}
129
130#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
131#[serde(deny_unknown_fields)]
132pub struct CanonicalTruthSurface {
133    pub id: String,
134    pub name: String,
135    pub crate_path: String,
136    pub contract_kind: CanonicalContractKind,
137    pub artifact_schemas: Vec<String>,
138    pub notes: String,
139    pub extensions_may_write: bool,
140}
141
142#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
143#[serde(deny_unknown_fields)]
144pub struct ChioExtensionPoint {
145    pub id: String,
146    pub name: String,
147    pub point_kind: ExtensionPointKind,
148    pub owner: String,
149    pub contract_path: String,
150    pub stability: ExtensionStability,
151    pub allowed_isolations: Vec<ExtensionIsolation>,
152    pub allowed_evidence_modes: Vec<ExtensionEvidenceMode>,
153    pub allowed_privileges: Vec<ExtensionPrivilege>,
154    pub custom_implementations_allowed: bool,
155    pub policy_activation_required: bool,
156    pub official_component_ids: Vec<String>,
157}
158
159#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
160#[serde(deny_unknown_fields)]
161pub struct ChioExtensionInventory {
162    pub schema: String,
163    pub chio_contract_version: String,
164    pub canonical_truth: Vec<CanonicalTruthSurface>,
165    pub extension_points: Vec<ChioExtensionPoint>,
166}
167
168#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
169#[serde(deny_unknown_fields)]
170pub struct OfficialStackComponent {
171    pub id: String,
172    pub name: String,
173    pub extension_point_ids: Vec<String>,
174    pub crate_path: String,
175    pub implementation_source: OfficialImplementationSource,
176}
177
178#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
179#[serde(deny_unknown_fields)]
180pub struct OfficialStackProfile {
181    pub id: String,
182    pub name: String,
183    pub description: String,
184    pub component_ids: Vec<String>,
185}
186
187#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
188#[serde(deny_unknown_fields)]
189pub struct OfficialStackPackage {
190    pub schema: String,
191    pub package_id: String,
192    pub version: String,
193    pub chio_contract_version: String,
194    pub components: Vec<OfficialStackComponent>,
195    pub profiles: Vec<OfficialStackProfile>,
196}
197
198#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
199#[serde(deny_unknown_fields)]
200pub struct ExtensionCompatibility {
201    pub chio_contract_version: String,
202    pub official_stack_package_id: String,
203    pub supported_component_ids: Vec<String>,
204    pub supported_contract_schemas: Vec<String>,
205}
206
207#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
208#[serde(deny_unknown_fields)]
209pub struct ExtensionRuntimeEnvelope {
210    pub isolation: ExtensionIsolation,
211    pub allowed_privileges: Vec<ExtensionPrivilege>,
212    pub evidence_mode: ExtensionEvidenceMode,
213    pub requires_subject_binding: bool,
214    pub requires_signer_verification: bool,
215    pub requires_freshness_check: bool,
216    pub requires_local_policy_activation: bool,
217    pub allows_truth_mutation: bool,
218    pub allows_trust_widening: bool,
219}
220
221#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
222#[serde(deny_unknown_fields)]
223pub struct ChioExtensionManifest {
224    pub schema: String,
225    pub extension_id: String,
226    pub display_name: String,
227    pub version: String,
228    pub distribution: ExtensionDistribution,
229    pub extension_point_id: String,
230    pub capabilities: Vec<String>,
231    pub supported_profiles: Vec<String>,
232    pub compatibility: ExtensionCompatibility,
233    pub runtime: ExtensionRuntimeEnvelope,
234}
235
236#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
237#[serde(deny_unknown_fields)]
238pub struct ExtensionNegotiationRejection {
239    pub code: ExtensionNegotiationRejectionCode,
240    pub detail: String,
241}
242
243#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
244#[serde(deny_unknown_fields)]
245pub struct ExtensionNegotiationReport {
246    pub schema: String,
247    pub official_stack_package_id: String,
248    pub extension_id: String,
249    pub extension_point_id: String,
250    pub outcome: ExtensionNegotiationOutcome,
251    pub reasons: Vec<ExtensionNegotiationRejection>,
252}
253
254#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
255#[serde(deny_unknown_fields)]
256pub struct ExtensionQualificationCase {
257    pub id: String,
258    pub name: String,
259    pub extension_point_id: String,
260    pub supported_component_id: String,
261    pub candidate_extension_id: String,
262    pub mode: QualificationMode,
263    pub expected_outcome: QualificationOutcome,
264    pub observed_outcome: QualificationOutcome,
265    pub rejection_codes: Vec<ExtensionNegotiationRejectionCode>,
266    pub invariants: Vec<QualificationInvariant>,
267}
268
269#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
270#[serde(deny_unknown_fields)]
271pub struct ExtensionQualificationMatrix {
272    pub schema: String,
273    pub official_stack_package_id: String,
274    pub chio_contract_version: String,
275    pub cases: Vec<ExtensionQualificationCase>,
276}