返回 DeepSeek-Reasonix
permission_shortcuts.go
根目录 / internal / cli / permission_shortcuts.go
1 package cli
2
3 import "reasonix/internal/control"
4
5 // handleModeShortcut routes every permission/collaboration shortcut through one
6 // owner. Terminals may emit Shift+Tab as either "shift+tab" or CSI-Z "backtab"
7 // (#6660); Ctrl+Y retains the user-facing YOLO toggle.
8 func (m *chatTUI) handleModeShortcut(key string) bool {
9 switch {
10 case modeToggleKey(key):
11 m.cycleMode()
12 return true
13 case key == "ctrl+y":
14 m.toggleYoloMode()
15 return true
16 default:
17 return false
18 }
19 }
20
21 // modeToggleKey reports whether s is a recognized Shift+Tab encoding for the
22 // permission/plan mode cycle.
23 func modeToggleKey(s string) bool {
24 switch s {
25 case "shift+tab", "backtab":
26 return true
27 default:
28 return false
29 }
30 }
31
32 // cycleMode handles the Shift+Tab gesture using the four user-facing postures:
33 // read-only → workspace-write → YOLO (danger-full-access) → Plan →
34 // read-only. Goal is not part of the cycle and is cleared when Plan is entered.
35 func (m *chatTUI) cycleMode() {
36 if m.ctrl == nil {
37 return
38 }
39 switch {
40 case m.planMode:
41 m.planMode = false
42 m.ctrl.SetToolApprovalMode(control.ToolApprovalReadOnly)
43 m.yoloRestoreToolApprovalMode = ""
44 case m.ctrl.ToolApprovalMode() == control.ToolApprovalDontAsk:
45 m.ctrl.SetToolApprovalMode(control.ToolApprovalReadOnly)
46 m.yoloRestoreToolApprovalMode = ""
47 case m.ctrl.ToolApprovalMode() == control.ToolApprovalReadOnly:
48 m.ctrl.SetToolApprovalMode(control.ToolApprovalWorkspaceWrite)
49 m.yoloRestoreToolApprovalMode = ""
50 case m.ctrl.ToolApprovalMode() == control.ToolApprovalWorkspaceWrite:
51 m.yoloRestoreToolApprovalMode = control.ToolApprovalWorkspaceWrite
52 m.ctrl.SetToolApprovalMode(control.ToolApprovalDangerFullAccess)
53 case m.ctrl.ToolApprovalMode() == control.ToolApprovalDangerFullAccess:
54 m.planMode = true
55 m.ctrl.SetToolApprovalMode(control.ToolApprovalReadOnly)
56 m.yoloRestoreToolApprovalMode = ""
57 m.ctrl.ClearGoal()
58 }
59 m.ctrl.SetPlanMode(m.planMode)
60 }
61
62 // toggleYoloMode keeps the familiar Ctrl+Y/YOLO interaction label while the
63 // permission owner receives only the canonical danger-full-access preset. A
64 // second press restores the safe preset that was active before the toggle.
65 func (m *chatTUI) toggleYoloMode() {
66 if m.ctrl == nil {
67 return
68 }
69 if m.ctrl.ToolApprovalMode() == control.ToolApprovalDangerFullAccess {
70 restore := m.yoloRestoreToolApprovalMode
71 if restore != control.ToolApprovalWorkspaceWrite {
72 restore = control.ToolApprovalReadOnly
73 }
74 m.ctrl.SetToolApprovalMode(restore)
75 m.yoloRestoreToolApprovalMode = ""
76 return
77 }
78 restore := m.ctrl.ToolApprovalMode()
79 if restore != control.ToolApprovalWorkspaceWrite {
80 restore = control.ToolApprovalReadOnly
81 }
82 m.yoloRestoreToolApprovalMode = restore
83 m.ctrl.SetToolApprovalMode(control.ToolApprovalDangerFullAccess)
84 }
85
85 lines GO