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