package pluginhost import ( "context" "encoding/json" "fmt" "strings" "time" coreauth "github.com/router-for-me/CLIProxyAPI/v7/sdk/cliproxy/auth" "github.com/router-for-me/CLIProxyAPI/v7/sdk/pluginapi" ) func (h *Host) callHostAffinityLookup(ctx context.Context, request []byte) ([]byte, error) { _ = ctx var req pluginapi.HostAffinityLookupRequest if errUnmarshal := json.Unmarshal(request, &req); errUnmarshal != nil { return nil, fmt.Errorf("decode host affinity lookup request: %w", errUnmarshal) } req.Provider = strings.TrimSpace(req.Provider) req.Model = strings.TrimSpace(req.Model) req.SessionID = strings.TrimSpace(req.SessionID) if req.Provider == "" { return nil, fmt.Errorf("provider is required") } if req.Model == "" { return nil, fmt.Errorf("model is required") } if req.SessionID == "" { return nil, fmt.Errorf("session_id is required") } now := time.Now().UTC() manager := h.currentAuthManager() if manager == nil { return marshalRPCResult(pluginapi.HostAffinityLookupResponse{ Status: pluginapi.HostAffinityStatusUnsupported, ObservedAt: now, }) } auth, status := manager.LookupSessionAffinity(req.Provider, req.Model, req.SessionID) if status != pluginapi.HostAffinityStatusBound || auth == nil { return marshalRPCResult(pluginapi.HostAffinityLookupResponse{ Status: status, ObservedAt: now, }) } auth.EnsureIndex() disabled := auth.Disabled || auth.Status == coreauth.StatusDisabled unavailable := auth.Unavailable || auth.Status == coreauth.StatusError return marshalRPCResult(pluginapi.HostAffinityLookupResponse{ Status: pluginapi.HostAffinityStatusBound, AuthIndex: auth.Index, ObservedAt: now, Disabled: disabled, Unavailable: unavailable, }) }