返回 DeepSeek-Reasonix
extension_form_http.go
根目录 / internal / serve / extension_form_http.go
1 package serve
2
3 import (
4 "context"
5 "encoding/json"
6 "net/http"
7 "strings"
8
9 "reasonix/internal/event"
10 )
11
12 type extensionFormSubmitter interface {
13 SubmitExtensionForm(ctx context.Context, pluginID, surfaceID string, values map[string]any) error
14 }
15 type exactExtensionFormSubmitter interface {
16 SubmitExtensionFormExact(ctx context.Context, pluginID, surfaceID string, generation uint64, formInstanceID string, values map[string]any) error
17 }
18
19 func (s *Server) submitExtensionForm(w http.ResponseWriter, r *http.Request) {
20 var body struct {
21 SessionID string `json:"sessionId"`
22 PluginID string `json:"pluginId"`
23 SurfaceID string `json:"surfaceId"`
24 Generation uint64 `json:"generation"`
25 FormInstanceID string `json:"formInstanceId"`
26 Values map[string]any `json:"values"`
27 }
28 if err := json.NewDecoder(r.Body).Decode(&body); err != nil || strings.TrimSpace(body.PluginID) == "" || strings.TrimSpace(body.SurfaceID) == "" {
29 http.Error(w, "missing extension form identity", http.StatusBadRequest)
30 return
31 }
32 if body.FormInstanceID != "" {
33 submitter, ok := s.ctl().(exactExtensionFormSubmitter)
34 if !ok {
35 http.Error(w, "exact extension form submission is unavailable", http.StatusConflict)
36 return
37 }
38 if reader, ok := s.ctl().(interface {
39 RuntimeStateSnapshot() event.RuntimeStateSnapshot
40 }); ok {
41 if current := reader.RuntimeStateSnapshot().SessionID; current != "" && body.SessionID != current {
42 http.Error(w, "extension form session binding is stale", http.StatusConflict)
43 return
44 }
45 }
46 if err := submitter.SubmitExtensionFormExact(r.Context(), body.PluginID, body.SurfaceID, body.Generation, body.FormInstanceID, body.Values); err != nil {
47 http.Error(w, err.Error(), http.StatusConflict)
48 return
49 }
50 w.WriteHeader(http.StatusNoContent)
51 return
52 }
53 submitter, ok := s.ctl().(extensionFormSubmitter)
54 if !ok {
55 http.Error(w, "extension form submission is unavailable", http.StatusConflict)
56 return
57 }
58 if err := submitter.SubmitExtensionForm(r.Context(), body.PluginID, body.SurfaceID, body.Values); err != nil {
59 http.Error(w, err.Error(), http.StatusConflict)
60 return
61 }
62 w.WriteHeader(http.StatusNoContent)
63 }
64
64 lines GO