1package proto
2
3import (
4 "encoding/json"
5)
6
7type CreatePermissionRequest struct {
8 SessionID string `json:"session_id"`
9 ToolCallID string `json:"tool_call_id"`
10 ToolName string `json:"tool_name"`
11 Description string `json:"description"`
12 Action string `json:"action"`
13 Params any `json:"params"`
14 Path string `json:"path"`
15}
16
17type PermissionNotification struct {
18 ToolCallID string `json:"tool_call_id"`
19 Granted bool `json:"granted"`
20 Denied bool `json:"denied"`
21}
22
23type PermissionRequest struct {
24 ID string `json:"id"`
25 SessionID string `json:"session_id"`
26 ToolCallID string `json:"tool_call_id"`
27 ToolName string `json:"tool_name"`
28 Description string `json:"description"`
29 Action string `json:"action"`
30 Params any `json:"params"`
31 Path string `json:"path"`
32}
33
34// UnmarshalJSON implements the json.Unmarshaler interface. This is needed
35// because the Params field is of type any, so we need to unmarshal it into
36// it's appropriate type based on the [PermissionRequest.ToolName].
37func (p *PermissionRequest) UnmarshalJSON(data []byte) error {
38 type Alias PermissionRequest
39 aux := &struct {
40 Params json.RawMessage `json:"params"`
41 *Alias
42 }{
43 Alias: (*Alias)(p),
44 }
45 if err := json.Unmarshal(data, &aux); err != nil {
46 return err
47 }
48
49 switch p.ToolName {
50 case BashToolName:
51 var params BashPermissionsParams
52 if err := json.Unmarshal(aux.Params, ¶ms); err != nil {
53 return err
54 }
55 p.Params = params
56 case DownloadToolName:
57 var params DownloadPermissionsParams
58 if err := json.Unmarshal(aux.Params, ¶ms); err != nil {
59 return err
60 }
61 p.Params = params
62 case EditToolName:
63 var params EditPermissionsParams
64 if err := json.Unmarshal(aux.Params, ¶ms); err != nil {
65 return err
66 }
67 p.Params = params
68 case WriteToolName:
69 var params WritePermissionsParams
70 if err := json.Unmarshal(aux.Params, ¶ms); err != nil {
71 return err
72 }
73 p.Params = params
74 case MultiEditToolName:
75 var params MultiEditPermissionsParams
76 if err := json.Unmarshal(aux.Params, ¶ms); err != nil {
77 return err
78 }
79 p.Params = params
80 case FetchToolName:
81 var params FetchPermissionsParams
82 if err := json.Unmarshal(aux.Params, ¶ms); err != nil {
83 return err
84 }
85 p.Params = params
86 case ViewToolName:
87 var params ViewPermissionsParams
88 if err := json.Unmarshal(aux.Params, ¶ms); err != nil {
89 return err
90 }
91 p.Params = params
92 case LSToolName:
93 var params LSPermissionsParams
94 if err := json.Unmarshal(aux.Params, ¶ms); err != nil {
95 return err
96 }
97 p.Params = params
98 default:
99 panic("unknown tool name: " + p.ToolName)
100 }
101 return nil
102}
103
104// UnmarshalJSON implements the json.Unmarshaler interface. This is needed
105// because the Params field is of type any, so we need to unmarshal it into
106// it's appropriate type based on the [CreatePermissionRequest.ToolName].
107func (p *CreatePermissionRequest) UnmarshalJSON(data []byte) error {
108 type Alias CreatePermissionRequest
109 aux := &struct {
110 Params json.RawMessage `json:"params"`
111 *Alias
112 }{
113 Alias: (*Alias)(p),
114 }
115 if err := json.Unmarshal(data, &aux); err != nil {
116 return err
117 }
118
119 switch p.ToolName {
120 case BashToolName:
121 var params BashPermissionsParams
122 if err := json.Unmarshal(aux.Params, ¶ms); err != nil {
123 return err
124 }
125 p.Params = params
126 case DownloadToolName:
127 var params DownloadPermissionsParams
128 if err := json.Unmarshal(aux.Params, ¶ms); err != nil {
129 return err
130 }
131 p.Params = params
132 case EditToolName:
133 var params EditPermissionsParams
134 if err := json.Unmarshal(aux.Params, ¶ms); err != nil {
135 return err
136 }
137 p.Params = params
138 case WriteToolName:
139 var params WritePermissionsParams
140 if err := json.Unmarshal(aux.Params, ¶ms); err != nil {
141 return err
142 }
143 p.Params = params
144 case MultiEditToolName:
145 var params MultiEditPermissionsParams
146 if err := json.Unmarshal(aux.Params, ¶ms); err != nil {
147 return err
148 }
149 p.Params = params
150 case FetchToolName:
151 var params FetchPermissionsParams
152 if err := json.Unmarshal(aux.Params, ¶ms); err != nil {
153 return err
154 }
155 p.Params = params
156 case ViewToolName:
157 var params ViewPermissionsParams
158 if err := json.Unmarshal(aux.Params, ¶ms); err != nil {
159 return err
160 }
161 p.Params = params
162 case LSToolName:
163 var params LSPermissionsParams
164 if err := json.Unmarshal(aux.Params, ¶ms); err != nil {
165 return err
166 }
167 p.Params = params
168 default:
169 panic("unknown tool name: " + p.ToolName)
170 }
171 return nil
172}