Skip to main content

opencode_voice/approval/
types.rs

1//! Approval system types: permission requests, question requests, and queue entries.
2
3use serde::{Deserialize, Serialize};
4
5/// A pending permission request from OpenCode.
6#[derive(Debug, Clone, Deserialize)]
7pub struct PermissionRequest {
8    pub id: String,
9    pub permission: String,
10    #[serde(default)]
11    pub metadata: serde_json::Value,
12}
13
14/// How to reply to a permission request.
15#[derive(Debug, Clone, PartialEq, Serialize)]
16#[serde(rename_all = "lowercase")]
17pub enum PermissionReply {
18    Once,
19    Always,
20    Reject,
21}
22
23/// A single option within a question.
24#[derive(Debug, Clone, Deserialize)]
25pub struct QuestionOption {
26    pub label: String,
27}
28
29/// A single question within a QuestionRequest.
30#[derive(Debug, Clone, Deserialize)]
31pub struct QuestionInfo {
32    pub question: String,
33    #[serde(default)]
34    pub options: Vec<QuestionOption>,
35    #[serde(default = "default_true")]
36    pub custom: bool,
37}
38
39fn default_true() -> bool {
40    true
41}
42
43/// A pending question request from OpenCode.
44#[derive(Debug, Clone, Deserialize)]
45pub struct QuestionRequest {
46    pub id: String,
47    #[serde(default)]
48    pub questions: Vec<QuestionInfo>,
49}
50
51/// A pending approval item — either a permission or a question.
52#[derive(Debug, Clone)]
53pub enum PendingApproval {
54    Permission(PermissionRequest),
55    Question(QuestionRequest),
56}
57
58impl PendingApproval {
59    /// Returns the request ID for this approval item.
60    pub fn id(&self) -> &str {
61        match self {
62            PendingApproval::Permission(r) => &r.id,
63            PendingApproval::Question(r) => &r.id,
64        }
65    }
66}