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.
10func (b *Backend) GrantPermission(workspaceID string, req proto.PermissionGrant) error {
11 ws, err := b.GetWorkspace(workspaceID)
12 if err != nil {
13 return err
14 }
15
16 perm := permission.PermissionRequest{
17 ID: req.Permission.ID,
18 SessionID: req.Permission.SessionID,
19 ToolCallID: req.Permission.ToolCallID,
20 ToolName: req.Permission.ToolName,
21 Description: req.Permission.Description,
22 Action: req.Permission.Action,
23 Params: req.Permission.Params,
24 Path: req.Permission.Path,
25 }
26
27 switch req.Action {
28 case proto.PermissionAllow:
29 ws.Permissions.Grant(perm)
30 case proto.PermissionAllowForSession:
31 ws.Permissions.GrantPersistent(perm)
32 case proto.PermissionDeny:
33 ws.Permissions.Deny(perm)
34 default:
35 return ErrInvalidPermissionAction
36 }
37 return nil
38}
39
40// SetPermissionsSkip sets whether permission prompts are skipped.
41func (b *Backend) SetPermissionsSkip(workspaceID string, skip bool) error {
42 ws, err := b.GetWorkspace(workspaceID)
43 if err != nil {
44 return err
45 }
46
47 ws.Permissions.SetSkipRequests(skip)
48 return nil
49}
50
51// GetPermissionsSkip returns whether permission prompts are skipped.
52func (b *Backend) GetPermissionsSkip(workspaceID string) (bool, error) {
53 ws, err := b.GetWorkspace(workspaceID)
54 if err != nil {
55 return false, err
56 }
57
58 return ws.Permissions.SkipRequests(), nil
59}