Skip to main content

agent_protocols/knowledge/
types.rs

1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3use std::collections::BTreeMap;
4
5macro_rules! wire_enum {
6    ($name:ident { $($variant:ident => $wire:literal),+ $(,)? }) => {
7        #[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq)]
8        pub enum $name { $(#[serde(rename = $wire)] $variant),+ }
9    };
10}
11wire_enum!(KnowledgeKind { Question => "question", Hypothesis => "hypothesis", Definition => "definition", Observation => "observation", Inference => "inference", Procedure => "procedure", Resource => "resource", NegativeResult => "negative_result", Synthesis => "synthesis", Collection => "collection" });
12wire_enum!(KnowledgeRelationKind { DerivedFrom => "derived_from", Addresses => "addresses", Tests => "tests", Extends => "extends", Supports => "supports", Contradicts => "contradicts", Supersedes => "supersedes", Contains => "contains" });
13wire_enum!(KnowledgeVerdict { Supports => "supports", Challenges => "challenges", Reproduced => "reproduced", NotReproduced => "not_reproduced", Applied => "applied", Inconclusive => "inconclusive" });
14wire_enum!(EvidenceRole { Source => "source", Input => "input", Output => "output", Environment => "environment", Validation => "validation" });
15wire_enum!(EvidenceStatus { Unchecked => "unchecked", Matched => "matched", Mismatched => "mismatched", Unavailable => "unavailable" });
16wire_enum!(SearchMode { Lexical => "lexical", Semantic => "semantic", Hybrid => "hybrid" });
17
18#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
19#[serde(deny_unknown_fields)]
20pub struct KnowledgeContext {
21    pub scope: String,
22    pub conditions: Vec<String>,
23    pub limitations: Vec<String>,
24}
25#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
26#[serde(deny_unknown_fields)]
27pub struct KnowledgeReproduction {
28    pub environment: String,
29    pub steps: Vec<String>,
30    pub expected: String,
31    #[serde(default, skip_serializing_if = "Option::is_none")]
32    pub observed: Option<String>,
33}
34#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
35#[serde(deny_unknown_fields)]
36pub struct KnowledgeEvidence {
37    pub url: String,
38    pub description: String,
39    #[serde(default, skip_serializing_if = "Option::is_none")]
40    pub digest: Option<String>,
41    #[serde(default, skip_serializing_if = "Option::is_none")]
42    pub media_type: Option<String>,
43    #[serde(default, skip_serializing_if = "Option::is_none")]
44    pub role: Option<EvidenceRole>,
45}
46#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
47#[serde(deny_unknown_fields)]
48pub struct KnowledgeRelation {
49    pub relation: KnowledgeRelationKind,
50    pub target: String,
51}
52#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
53#[serde(deny_unknown_fields)]
54pub struct KnowledgeProfileReference {
55    pub url: String,
56    pub digest: String,
57}
58#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
59#[serde(deny_unknown_fields)]
60pub struct KnowledgeProfileBinding {
61    pub profile: KnowledgeProfileReference,
62    pub data: BTreeMap<String, Value>,
63}
64#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
65#[serde(deny_unknown_fields)]
66pub struct KnowledgePublishPayload {
67    pub license: String,
68    pub kind: KnowledgeKind,
69    pub title: String,
70    pub statement: String,
71    pub language: String,
72    pub context: KnowledgeContext,
73    pub basis: String,
74    #[serde(default, skip_serializing_if = "Option::is_none")]
75    pub evidence: Option<Vec<KnowledgeEvidence>>,
76    #[serde(default, skip_serializing_if = "Option::is_none")]
77    pub reproduction: Option<KnowledgeReproduction>,
78    #[serde(default, skip_serializing_if = "Option::is_none")]
79    pub relations: Option<Vec<KnowledgeRelation>>,
80    #[serde(default, skip_serializing_if = "Option::is_none")]
81    pub tags: Option<Vec<String>>,
82    #[serde(default, skip_serializing_if = "Option::is_none")]
83    pub profiles: Option<Vec<KnowledgeProfileBinding>>,
84    #[serde(default, skip_serializing_if = "Option::is_none")]
85    pub extra: Option<BTreeMap<String, Value>>,
86}
87#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
88#[serde(deny_unknown_fields)]
89pub struct KnowledgeAssessPayload {
90    pub license: String,
91    pub target: String,
92    pub verdict: KnowledgeVerdict,
93    pub summary: String,
94    pub context: KnowledgeContext,
95    pub basis: String,
96    #[serde(default, skip_serializing_if = "Option::is_none")]
97    pub evidence: Option<Vec<KnowledgeEvidence>>,
98    #[serde(default, skip_serializing_if = "Option::is_none")]
99    pub reproduction: Option<KnowledgeReproduction>,
100    #[serde(default, skip_serializing_if = "Option::is_none")]
101    pub profiles: Option<Vec<KnowledgeProfileBinding>>,
102    #[serde(default, skip_serializing_if = "Option::is_none")]
103    pub extra: Option<BTreeMap<String, Value>>,
104}
105#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
106#[serde(deny_unknown_fields)]
107pub struct KnowledgeRetractPayload {
108    pub target: String,
109    pub reason: String,
110    #[serde(default, skip_serializing_if = "Option::is_none")]
111    pub extra: Option<BTreeMap<String, Value>>,
112}
113
114/// Caller-ranked candidates for one ranked-search page. Candidates must be
115/// visible and satisfy the request's exact filters; no ranking model is implied.
116/// `explanations` are optional per-hit texts keyed by event ID.
117#[derive(Clone, Debug, Default, PartialEq)]
118pub struct KnowledgeSearchSelection {
119    pub candidates: Vec<String>,
120    pub ranking: Value,
121    pub coverage: Value,
122    pub explanations: BTreeMap<String, String>,
123}