permission.go

 1package backend
 2
 3import (
 4	"github.com/charmbracelet/crush/internal/permission"
 5	"github.com/charmbracelet/crush/internal/proto"
 6)
 7
 8// GrantPermission grants, denies, or persistently grants a permission
 9// request. The returned bool reports whether this call resolved the
10// pending request (true) or found it already resolved by a previous
11// caller (false). A false return is not an error.
12func (b *Backend) GrantPermission(workspaceID string, req proto.PermissionGrant) (bool, error) {
13	ws, err := b.GetWorkspace(workspaceID)
14	if err != nil {
15		return false, err
16	}
17
18	perm := permission.PermissionRequest{
19		ID:          req.Permission.ID,
20		SessionID:   req.Permission.SessionID,
21		ToolCallID:  req.Permission.ToolCallID,
22		ToolName:    req.Permission.ToolName,
23		Description: req.Permission.Description,
24		Action:      req.Permission.Action,
25		Params:      req.Permission.Params,
26		Path:        req.Permission.Path,
27	}
28
29	switch req.Action {
30	case proto.PermissionAllow:
31		return ws.Permissions.Grant(perm), nil
32	case proto.PermissionAllowForSession:
33		return ws.Permissions.GrantPersistent(perm), nil
34	case proto.PermissionDeny:
35		return ws.Permissions.Deny(perm), nil
36	default:
37		return false, ErrInvalidPermissionAction
38	}
39}
40
41// SetPermissionsSkip sets whether permission prompts are skipped.
42func (b *Backend) SetPermissionsSkip(workspaceID string, skip bool) error {
43	ws, err := b.GetWorkspace(workspaceID)
44	if err != nil {
45		return err
46	}
47
48	ws.Permissions.SetSkipRequests(skip)
49	return nil
50}
51
52// GetPermissionsSkip returns whether permission prompts are skipped.
53func (b *Backend) GetPermissionsSkip(workspaceID string) (bool, error) {
54	ws, err := b.GetWorkspace(workspaceID)
55	if err != nil {
56		return false, err
57	}
58
59	return ws.Permissions.SkipRequests(), nil
60}