返回 DeepSeek-Reasonix
goal_draft.go
根目录 / internal / acp / goal_draft.go
1 package acp
2
3 import (
4 "errors"
5 "strings"
6
7 "reasonix/internal/control"
8 )
9
10 func loadedGoalDraftMode(goal string) bool {
11 return strings.TrimSpace(goal) == ""
12 }
13
14 func selectedGoalDraftMode(modeID, goal string) bool {
15 return modeID == sessionModeGoal && loadedGoalDraftMode(goal)
16 }
17
18 func setACPGoalDurably(ctrl acpController, objective string) error {
19 if ctrl == nil {
20 return errors.New("session controller is unavailable")
21 }
22 if setter, ok := ctrl.(interface{ SetGoalDurable(string) error }); ok {
23 return setter.SetGoalDurable(objective)
24 }
25 ctrl.SetGoal(objective)
26 return nil
27 }
28
29 func applyACPSessionMode(ctrl acpController, requested string) (nextMode, legacyApproval string, rpcErr *RPCError) {
30 nextMode = requested
31 clearGoal := false
32 switch requested {
33 case sessionModeNormal, sessionModePlan:
34 clearGoal = true
35 case sessionModeGoal:
36 case sessionModeLegacyDefault:
37 nextMode, legacyApproval, clearGoal = sessionModeNormal, control.ToolApprovalReadOnly, true
38 case sessionModeLegacyAuto:
39 nextMode, legacyApproval, clearGoal = sessionModeNormal, control.ToolApprovalWorkspaceWrite, true
40 default:
41 return "", "", &RPCError{Code: ErrInvalidParams, Message: "session/set_mode: unknown modeId " + requested}
42 }
43 if clearGoal {
44 if err := setACPGoalDurably(ctrl, ""); err != nil {
45 return "", "", &RPCError{Code: ErrInternal, Message: "session/set_mode: persist goal: " + err.Error()}
46 }
47 }
48 ctrl.SetPlanMode(nextMode == sessionModePlan)
49 return nextMode, legacyApproval, nil
50 }
51
52 func applyLoadedACPMode(ctrl acpController, savedMode string) (modeID string, goalDraftMode bool) {
53 modeID = normalizeACPCollaborationMode(savedMode)
54 switch modeID {
55 case sessionModePlan:
56 ctrl.SetPlanMode(true)
57 case sessionModeGoal:
58 ctrl.SetPlanMode(false)
59 goalDraftMode = loadedGoalDraftMode(ctrl.Goal())
60 default:
61 if ctrl.GoalStatus() == control.GoalStatusRunning {
62 modeID = sessionModeGoal
63 } else {
64 modeID = sessionModeNormal
65 ctrl.SetPlanMode(false)
66 }
67 }
68 return modeID, goalDraftMode
69 }
70
71 func prepareACPGoalPrompt(sess *acpSession, text string) *RPCError {
72 if !sess.takeGoalDraftMode() {
73 return nil
74 }
75 if err := setACPGoalDurably(sess.currentCtrl(), text); err != nil {
76 sess.setGoalDraftMode(true)
77 return &RPCError{Code: ErrInternal, Message: "session/prompt: persist goal: " + err.Error()}
78 }
79 sess.saveMetaIfPresent()
80 return nil
81 }
82
83 func inheritACPControllerLifecycle(newCtrl *control.Controller, cur acpController) *RPCError {
84 prev, ok := cur.(*control.Controller)
85 if !ok {
86 return nil
87 }
88 if err := newCtrl.InheritLifecycleFrom(prev); err != nil {
89 return &RPCError{Code: ErrInvalidRequest, Message: "session config: active Goal continuation must finish before switching config"}
90 }
91 newCtrl.RestoreSessionAuthorizations(prev.SessionAuthorizations())
92 return nil
93 }
94
94 lines GO