返回 DeepSeek-Reasonix
inbox.go
根目录 / internal / acp / inbox.go
1 package acp
2
3 import (
4 "context"
5 "encoding/json"
6 "strings"
7
8 "reasonix/internal/control"
9 "reasonix/internal/sessioninbox"
10 )
11
12 func (s *service) sessionAPI(sess *acpSession) (control.SessionAPI, error) {
13 if sess == nil {
14 return nil, &RPCError{Code: ErrInvalidParams, Message: "unknown session"}
15 }
16 ctrl := sess.currentCtrl()
17 api, ok := ctrl.(control.SessionAPI)
18 if !ok {
19 return nil, &RPCError{Code: ErrInternal, Message: "session controller does not expose inbox"}
20 }
21 if ensurer, ok := any(api).(interface{ EnsureSessionPath() }); ok {
22 ensurer.EnsureSessionPath()
23 }
24 return api, nil
25 }
26
27 func (s *service) sessionInboxEnqueue(_ context.Context, raw json.RawMessage) (any, error) {
28 var p SessionInboxEnqueueParams
29 if err := json.Unmarshal(raw, &p); err != nil {
30 return nil, &RPCError{Code: ErrInvalidParams, Message: sessionInboxEnqueueMethod + ": " + err.Error()}
31 }
32 sess := s.session(p.SessionID)
33 api, err := s.sessionAPI(sess)
34 if err != nil {
35 return nil, err
36 }
37 text := strings.TrimSpace(p.Text)
38 if text == "" {
39 return nil, &RPCError{Code: ErrInvalidParams, Message: sessionInboxEnqueueMethod + ": empty text"}
40 }
41 intent := sessioninbox.IntentFollowup
42 if strings.EqualFold(p.Intent, "steer") {
43 intent = sessioninbox.IntentSteer
44 }
45 req := control.InboxRequest{
46 Intent: intent,
47 Display: text,
48 Raw: text,
49 Submit: text,
50 Source: "acp",
51 Idempotency: strings.TrimSpace(p.IdempotencyKey),
52 }
53 var rec sessioninbox.InboxReceipt
54 if intent == sessioninbox.IntentSteer {
55 rec, err = api.TryEnqueueAndSteer(req)
56 } else {
57 // ACP owns a blocking session/prompt response boundary. Keep follow-ups
58 // passive here so the prompt handler drains them with the same sink;
59 // detached Controller dispatch would race the transition between turns.
60 rec, err = api.EnqueueInbox(req)
61 }
62 if err != nil {
63 return nil, &RPCError{Code: ErrInvalidRequest, Message: err.Error()}
64 }
65 return map[string]any{
66 "itemId": rec.ItemID,
67 "disposition": string(rec.Disposition),
68 "position": rec.Position,
69 "paused": rec.Paused,
70 "idempotent": rec.Idempotent,
71 }, nil
72 }
73
74 func (s *service) sessionInboxList(_ context.Context, raw json.RawMessage) (any, error) {
75 var p struct {
76 SessionID string `json:"sessionId"`
77 }
78 if err := json.Unmarshal(raw, &p); err != nil {
79 return nil, &RPCError{Code: ErrInvalidParams, Message: err.Error()}
80 }
81 api, err := s.sessionAPI(s.session(p.SessionID))
82 if err != nil {
83 return nil, err
84 }
85 return api.InboxSnapshot(), nil
86 }
87
88 func (s *service) sessionInboxGet(_ context.Context, raw json.RawMessage) (any, error) {
89 var p SessionInboxItemParams
90 if err := json.Unmarshal(raw, &p); err != nil {
91 return nil, &RPCError{Code: ErrInvalidParams, Message: err.Error()}
92 }
93 api, err := s.sessionAPI(s.session(p.SessionID))
94 if err != nil {
95 return nil, err
96 }
97 meta, env, err := api.ReadInboxItem(p.ItemID)
98 if err != nil {
99 return nil, &RPCError{Code: ErrInvalidRequest, Message: err.Error()}
100 }
101 return map[string]any{"meta": meta, "envelope": env}, nil
102 }
103
104 func (s *service) sessionInboxUpdate(_ context.Context, raw json.RawMessage) (any, error) {
105 var p SessionInboxUpdateParams
106 if err := json.Unmarshal(raw, &p); err != nil {
107 return nil, &RPCError{Code: ErrInvalidParams, Message: err.Error()}
108 }
109 api, err := s.sessionAPI(s.session(p.SessionID))
110 if err != nil {
111 return nil, err
112 }
113 text := strings.TrimSpace(p.Text)
114 meta, err := api.UpdateInboxItem(p.ItemID, text, text, text)
115 if err != nil {
116 return nil, &RPCError{Code: ErrInvalidRequest, Message: err.Error()}
117 }
118 return meta, nil
119 }
120
121 func (s *service) sessionInboxDelete(_ context.Context, raw json.RawMessage) (any, error) {
122 var p SessionInboxItemParams
123 if err := json.Unmarshal(raw, &p); err != nil {
124 return nil, &RPCError{Code: ErrInvalidParams, Message: err.Error()}
125 }
126 api, err := s.sessionAPI(s.session(p.SessionID))
127 if err != nil {
128 return nil, err
129 }
130 if err := api.DeleteInboxItem(p.ItemID); err != nil {
131 return nil, &RPCError{Code: ErrInvalidRequest, Message: err.Error()}
132 }
133 return map[string]any{"ok": true}, nil
134 }
135
136 func (s *service) sessionInboxMove(_ context.Context, raw json.RawMessage) (any, error) {
137 var p SessionInboxMoveParams
138 if err := json.Unmarshal(raw, &p); err != nil {
139 return nil, &RPCError{Code: ErrInvalidParams, Message: err.Error()}
140 }
141 api, err := s.sessionAPI(s.session(p.SessionID))
142 if err != nil {
143 return nil, err
144 }
145 if err := api.MoveInboxItem(p.ItemID, p.ToIndex); err != nil {
146 return nil, &RPCError{Code: ErrInvalidRequest, Message: err.Error()}
147 }
148 return map[string]any{"ok": true}, nil
149 }
150
151 func (s *service) sessionInboxSetPaused(_ context.Context, raw json.RawMessage) (any, error) {
152 var p SessionInboxPauseParams
153 if err := json.Unmarshal(raw, &p); err != nil {
154 return nil, &RPCError{Code: ErrInvalidParams, Message: err.Error()}
155 }
156 api, err := s.sessionAPI(s.session(p.SessionID))
157 if err != nil {
158 return nil, err
159 }
160 if err := api.SetInboxPaused(p.Paused); err != nil {
161 return nil, &RPCError{Code: ErrInvalidRequest, Message: err.Error()}
162 }
163 return map[string]any{"paused": p.Paused}, nil
164 }
165
166 func (s *service) sessionInboxRetry(_ context.Context, raw json.RawMessage) (any, error) {
167 var p SessionInboxItemParams
168 if err := json.Unmarshal(raw, &p); err != nil {
169 return nil, &RPCError{Code: ErrInvalidParams, Message: err.Error()}
170 }
171 api, err := s.sessionAPI(s.session(p.SessionID))
172 if err != nil {
173 return nil, err
174 }
175 if err := api.RetryInboxItem(p.ItemID); err != nil {
176 return nil, &RPCError{Code: ErrInvalidRequest, Message: err.Error()}
177 }
178 return map[string]any{"ok": true}, nil
179 }
180
181 func (s *service) sessionInboxRefresh(_ context.Context, raw json.RawMessage) (any, error) {
182 var p SessionInboxItemParams
183 if err := json.Unmarshal(raw, &p); err != nil {
184 return nil, &RPCError{Code: ErrInvalidParams, Message: err.Error()}
185 }
186 api, err := s.sessionAPI(s.session(p.SessionID))
187 if err != nil {
188 return nil, err
189 }
190 if err := api.RefreshInboxReferences(p.ItemID); err != nil {
191 return nil, &RPCError{Code: ErrInvalidRequest, Message: err.Error()}
192 }
193 return map[string]any{"ok": true}, nil
194 }
195
195 lines GO