permission.go

  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, &params); err != nil {
 88			return nil, err
 89		}
 90		return params, nil
 91	case DownloadToolName:
 92		var params DownloadPermissionsParams
 93		if err := json.Unmarshal(raw, &params); err != nil {
 94			return nil, err
 95		}
 96		return params, nil
 97	case EditToolName:
 98		var params EditPermissionsParams
 99		if err := json.Unmarshal(raw, &params); err != nil {
100			return nil, err
101		}
102		return params, nil
103	case WriteToolName:
104		var params WritePermissionsParams
105		if err := json.Unmarshal(raw, &params); err != nil {
106			return nil, err
107		}
108		return params, nil
109	case MultiEditToolName:
110		var params MultiEditPermissionsParams
111		if err := json.Unmarshal(raw, &params); err != nil {
112			return nil, err
113		}
114		return params, nil
115	case FetchToolName:
116		var params FetchPermissionsParams
117		if err := json.Unmarshal(raw, &params); err != nil {
118			return nil, err
119		}
120		return params, nil
121	case ViewToolName:
122		var params ViewPermissionsParams
123		if err := json.Unmarshal(raw, &params); err != nil {
124			return nil, err
125		}
126		return params, nil
127	case LSToolName:
128		var params LSPermissionsParams
129		if err := json.Unmarshal(raw, &params); 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}