sim/runtime/glasses/proofs/
review.rs1use sim_codec_bridge::{
2 BridgeBook, BridgeFramePayload, BridgeHeader, BridgePacket, BridgePart, BridgeProvenance,
3 stamp_packet_cid, warrant_for_packet,
4};
5use sim_kernel::{Error, Expr, Result, Symbol};
6use sim_lib_intent::{Origin, intent_kind_of};
7use sim_lib_scene::GlanceCard;
8use sim_lib_view::SurfaceCaps;
9use sim_lib_view_bridge::{
10 BridgeGlassesReviewInput, halo_warrant_glance_pager, warrant_review_intent_from_glasses_input,
11};
12use sim_lib_view_device::DeviceSurfaceCapsExt;
13use sim_value::build::{self, entry, qsym};
14
15#[derive(Clone, Debug, PartialEq, Eq)]
17pub struct ReviewInSpaceProof {
18 pub warrant_pager: bool,
20 pub approved: bool,
22 pub packet_bound: bool,
24}
25
26impl ReviewInSpaceProof {
27 pub fn to_expr(&self) -> Expr {
29 build::map(vec![
30 ("kind", build::qsym("glasses/sdk", "review-in-space-proof")),
31 ("warrant-pager", Expr::Bool(self.warrant_pager)),
32 ("approved", Expr::Bool(self.approved)),
33 ("packet-bound", Expr::Bool(self.packet_bound)),
34 ])
35 }
36}
37
38pub fn prove_review_in_space() -> Result<ReviewInSpaceProof> {
40 let packet = packet_with_warrant()?;
41 let profile = SurfaceCaps::from_preset("glasses-hud", "sdk.review")
42 .ok_or_else(|| Error::HostError("Halo surface preset missing".to_owned()))?
43 .device_profile();
44 let pager = halo_warrant_glance_pager(&packet, &profile)?;
45 let card = GlanceCard::from_scene(&pager)?;
46 let approval = warrant_review_intent_from_glasses_input(
47 &packet,
48 BridgeGlassesReviewInput::HaloDoubleTap,
49 Origin::human(9),
50 )?;
51 let packet_cid = packet.header.cid.as_deref().unwrap_or_default();
52
53 Ok(ReviewInSpaceProof {
54 warrant_pager: card.bypass_budget,
55 approved: intent_kind_of(&approval).is_some_and(|kind| kind.name.as_ref() == "approve"),
56 packet_bound: sim_lib_intent::field(&approval, "packet-cid")
57 == Some(&Expr::String(packet_cid.to_owned())),
58 })
59}
60
61fn packet_with_warrant() -> Result<BridgePacket> {
62 let mut packet = BridgePacket {
63 header: BridgeHeader {
64 cid: None,
65 move_kind: Symbol::new("reply"),
66 from: "model:drafter".to_owned(),
67 to: vec!["human:reviewer".to_owned()],
68 role: Symbol::new("implementer"),
69 parents: vec!["core/sha256-bridge-v1:root".to_owned()],
70 task: Symbol::new("T1"),
71 output: Symbol::new("O1"),
72 ceiling: Vec::new(),
73 context: Vec::new(),
74 provenance: BridgeProvenance::default(),
75 },
76 body: vec![
77 BridgePart {
78 id: Symbol::new("T1"),
79 kind: Symbol::qualified("bridge", "Frame"),
80 payload: BridgeFramePayload::new(Symbol::qualified("bridge", "answer")).to_expr(),
81 },
82 BridgePart {
83 id: Symbol::new("O1"),
84 kind: Symbol::qualified("bridge", "Return"),
85 payload: Expr::Map(vec![
86 entry("codec", qsym("codec", "bridge")),
87 entry("shape", qsym("core", "Map")),
88 ]),
89 },
90 ],
91 warrant: None,
92 };
93 packet.warrant = Some(warrant_for_packet(&BridgeBook::standard(), &packet)?);
94 stamp_packet_cid(&packet)
95}