Files
wehub-resource-sync f99010fae1
CI / lint (push) Failing after 1s
CI / frontend (push) Failing after 1s
CI / scripts (push) Failing after 1s
CI / Go Test (ubuntu-latest) (push) Failing after 0s
CI / frontend-node-25 (push) Failing after 1s
CI / docs (push) Failing after 0s
CI / coverage (push) Failing after 0s
CI / e2e (push) Failing after 0s
Docker / build-and-push (push) Failing after 1s
CI / integration (push) Failing after 4m43s
CI / Go Test (windows-latest) (push) Has been cancelled
CI / Desktop Unit Tests (Windows) (push) Has been cancelled
Desktop Artifacts / Desktop Build (Linux (arm64)) (push) Has been cancelled
Desktop Artifacts / Desktop Build (Linux) (push) Has been cancelled
Desktop Artifacts / Desktop Build (Windows) (push) Has been cancelled
Desktop Artifacts (macOS) / Desktop Build (macOS (aarch64)) (push) Has been cancelled
Desktop Artifacts (macOS) / Desktop Build (macOS (x86_64)) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:30:36 +08:00

148 lines
5.5 KiB
Go

package parser
import (
"fmt"
"maps"
)
// ProviderMigrationMode describes which runtime path owns a provider during
// the facade migration.
type ProviderMigrationMode string
const (
ProviderMigrationProviderAuthoritative ProviderMigrationMode = "provider-authoritative"
ProviderMigrationImportOnly ProviderMigrationMode = "import-only"
)
var providerMigrationModes = map[AgentType]ProviderMigrationMode{
AgentClaude: ProviderMigrationProviderAuthoritative,
AgentOpenClaude: ProviderMigrationProviderAuthoritative,
AgentCowork: ProviderMigrationProviderAuthoritative,
AgentCodex: ProviderMigrationProviderAuthoritative,
AgentCopilot: ProviderMigrationProviderAuthoritative,
AgentGemini: ProviderMigrationProviderAuthoritative,
AgentOpenHands: ProviderMigrationProviderAuthoritative,
AgentCursor: ProviderMigrationProviderAuthoritative,
AgentMiMoCode: ProviderMigrationProviderAuthoritative,
AgentOpenCode: ProviderMigrationProviderAuthoritative,
AgentKilo: ProviderMigrationProviderAuthoritative,
AgentIcodemate: ProviderMigrationProviderAuthoritative,
AgentIflow: ProviderMigrationProviderAuthoritative,
AgentAmp: ProviderMigrationProviderAuthoritative,
AgentZencoder: ProviderMigrationProviderAuthoritative,
AgentVSCodeCopilot: ProviderMigrationProviderAuthoritative,
AgentWindsurf: ProviderMigrationProviderAuthoritative,
AgentVSCopilot: ProviderMigrationProviderAuthoritative,
AgentPi: ProviderMigrationProviderAuthoritative,
AgentQwen: ProviderMigrationProviderAuthoritative,
AgentCommandCode: ProviderMigrationProviderAuthoritative,
AgentDeepSeekTUI: ProviderMigrationProviderAuthoritative,
AgentOpenClaw: ProviderMigrationProviderAuthoritative,
AgentQClaw: ProviderMigrationProviderAuthoritative,
AgentKimi: ProviderMigrationProviderAuthoritative,
AgentClaudeAI: ProviderMigrationImportOnly,
AgentChatGPT: ProviderMigrationImportOnly,
AgentKiro: ProviderMigrationProviderAuthoritative,
AgentKiroIDE: ProviderMigrationProviderAuthoritative,
AgentCortex: ProviderMigrationProviderAuthoritative,
AgentHermes: ProviderMigrationProviderAuthoritative,
AgentGrok: ProviderMigrationProviderAuthoritative,
AgentWorkBuddy: ProviderMigrationProviderAuthoritative,
AgentForge: ProviderMigrationProviderAuthoritative,
AgentDevin: ProviderMigrationProviderAuthoritative,
AgentPiebald: ProviderMigrationProviderAuthoritative,
AgentWarp: ProviderMigrationProviderAuthoritative,
AgentPositron: ProviderMigrationProviderAuthoritative,
AgentPositAssistant: ProviderMigrationProviderAuthoritative,
AgentZCode: ProviderMigrationProviderAuthoritative,
AgentAntigravity: ProviderMigrationProviderAuthoritative,
AgentAntigravityCLI: ProviderMigrationProviderAuthoritative,
AgentVibe: ProviderMigrationProviderAuthoritative,
AgentZed: ProviderMigrationProviderAuthoritative,
AgentQwenPaw: ProviderMigrationProviderAuthoritative,
AgentGptme: ProviderMigrationProviderAuthoritative,
AgentQoder: ProviderMigrationProviderAuthoritative,
AgentShelley: ProviderMigrationProviderAuthoritative,
AgentAider: ProviderMigrationProviderAuthoritative,
AgentOMP: ProviderMigrationProviderAuthoritative,
AgentReasonix: ProviderMigrationProviderAuthoritative,
}
// ProviderMigrationModes returns the current provider migration manifest.
func ProviderMigrationModes() map[AgentType]ProviderMigrationMode {
modes := make(map[AgentType]ProviderMigrationMode, len(providerMigrationModes))
maps.Copy(modes, providerMigrationModes)
return modes
}
// ValidateProviderMigrationModes checks that provider factories and the
// migration manifest move in lockstep during the staged facade migration.
func ValidateProviderMigrationModes(
factories []ProviderFactory,
modes map[AgentType]ProviderMigrationMode,
) error {
seen := make(map[AgentType]bool, len(factories))
for _, factory := range factories {
def := factory.Definition()
seen[def.Type] = true
mode, ok := modes[def.Type]
if !ok {
return fmt.Errorf("%s: missing provider migration mode", def.Type)
}
if err := validateProviderMigrationMode(factory, mode); err != nil {
return err
}
}
for agent := range modes {
if !seen[agent] {
return fmt.Errorf("%s: provider migration mode has no factory", agent)
}
}
return nil
}
func validateProviderMigrationMode(
factory ProviderFactory,
mode ProviderMigrationMode,
) error {
def := factory.Definition()
switch mode {
case ProviderMigrationProviderAuthoritative:
caps := factory.Capabilities().Source
if caps.DiscoverSources != CapabilitySupported {
return fmt.Errorf(
"%s: %s requires provider source discovery",
def.Type, mode,
)
}
if caps.FindSource != CapabilitySupported {
return fmt.Errorf(
"%s: %s requires provider source lookup",
def.Type, mode,
)
}
case ProviderMigrationImportOnly:
if !isImportOnlyAgentType(def.Type) {
return fmt.Errorf(
"%s: %s is only valid for import-only providers",
def.Type,
ProviderMigrationImportOnly,
)
}
default:
return fmt.Errorf("%s: invalid provider migration mode %q", def.Type, mode)
}
return nil
}
func isImportOnlyAgentType(agent AgentType) bool {
switch agent {
case AgentClaudeAI, AgentChatGPT:
return true
default:
return false
}
}