返回 DeepSeek-Reasonix
tool_recovery.go
根目录 / internal / serve / tool_recovery.go
1 package serve
2
3 import (
4 "context"
5 "encoding/json"
6 "net/http"
7
8 "reasonix/internal/control"
9 )
10
11 func (s *Server) registerRuntimeRecoveryRoutes(mux *http.ServeMux) {
12 mux.HandleFunc("GET /status", s.status)
13 mux.HandleFunc("GET /tool-recovery", s.toolRecovery)
14 mux.HandleFunc("POST /tool-recovery", s.foregroundMutation(s.resolveToolRecovery))
15 }
16
17 type toolRecoveryController interface {
18 ToolRecoverySnapshot() control.ToolRecoverySnapshot
19 ResolveToolRecovery(context.Context, control.ToolRecoveryRequest) (control.ToolRecoverySnapshot, error)
20 }
21
22 func (s *Server) toolRecovery(w http.ResponseWriter, r *http.Request) {
23 s.bindMu.Lock()
24 defer s.bindMu.Unlock()
25 if !s.validateExpectedSessionLocked(w, r) {
26 return
27 }
28 ctrl, ok := s.ctl().(toolRecoveryController)
29 if !ok {
30 http.Error(w, "tool recovery unavailable", http.StatusNotImplemented)
31 return
32 }
33 writeJSON(w, ctrl.ToolRecoverySnapshot())
34 }
35
36 func (s *Server) resolveToolRecovery(w http.ResponseWriter, r *http.Request) {
37 ctrl, ok := s.ctl().(toolRecoveryController)
38 if !ok {
39 http.Error(w, "tool recovery unavailable", http.StatusNotImplemented)
40 return
41 }
42 var req control.ToolRecoveryRequest
43 decoder := json.NewDecoder(http.MaxBytesReader(w, r.Body, 16<<10))
44 decoder.DisallowUnknownFields()
45 if err := decoder.Decode(&req); err != nil {
46 http.Error(w, "invalid tool recovery request", http.StatusBadRequest)
47 return
48 }
49 view, err := ctrl.ResolveToolRecovery(r.Context(), req)
50 if err != nil {
51 http.Error(w, err.Error(), http.StatusConflict)
52 return
53 }
54 writeJSON(w, view)
55 }
56
56 lines GO