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}