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}