iop/packages/go/agentconfig/catalog.go

113 lines
3.8 KiB
Go

// Package agentconfig defines the secret-free, repository-owned catalog for
// external CLI agent providers. It is intentionally separate from the Edge
// provider-pool configuration in packages/go/config.
package agentconfig
const (
SchemaVersion = "1"
DefaultProbeTimeoutMS = 10_000
)
// Catalog declares official provider, model, and profile identities.
type Catalog struct {
Version string `yaml:"version"`
Providers []Provider `yaml:"providers"`
Models []Model `yaml:"models"`
Profiles []Profile `yaml:"profiles"`
}
// Provider declares one installed CLI family and its non-secret probes.
type Provider struct {
ID string `yaml:"id"`
Command string `yaml:"command"`
VersionProbe CommandProbe `yaml:"version_probe"`
Authentication AuthenticationProbe `yaml:"authentication"`
ModelProbe ModelProbe `yaml:"model_probe,omitempty"`
Capabilities []string `yaml:"capabilities"`
}
// CommandProbe runs a bounded command and records only redacted output.
type CommandProbe struct {
Args []string `yaml:"args"`
TimeoutMS int `yaml:"timeout_ms,omitempty"`
}
// AuthenticationProbe classifies an external CLI's existing authentication.
// A zero exit status is sufficient when SuccessPattern is empty.
type AuthenticationProbe struct {
Args []string `yaml:"args"`
TimeoutMS int `yaml:"timeout_ms,omitempty"`
SuccessPattern string `yaml:"success_pattern,omitempty"`
UnauthenticatedPattern string `yaml:"unauthenticated_pattern,omitempty"`
}
// ModelProbe optionally returns one supported model target per output line.
// When Args is empty, the validated static model declaration is authoritative.
type ModelProbe struct {
Args []string `yaml:"args,omitempty"`
TimeoutMS int `yaml:"timeout_ms,omitempty"`
}
// Model maps an official model ID to one provider-native target.
type Model struct {
ID string `yaml:"id"`
Provider string `yaml:"provider"`
Target string `yaml:"target"`
}
// Profile binds one official provider/model pair to the common CLI runtime.
type Profile struct {
ID string `yaml:"id"`
Provider string `yaml:"provider"`
Model string `yaml:"model"`
Args []string `yaml:"args"`
ResumeArgs []string `yaml:"resume_args,omitempty"`
Env []string `yaml:"env,omitempty"`
Mode string `yaml:"mode,omitempty"`
OutputFormat string `yaml:"output_format,omitempty"`
Persistent bool `yaml:"persistent,omitempty"`
Terminal bool `yaml:"terminal,omitempty"`
ResponseIdleTimeoutMS int `yaml:"response_idle_timeout_ms,omitempty"`
StartupIdleTimeoutMS int `yaml:"startup_idle_timeout_ms,omitempty"`
MaxConcurrency int `yaml:"max_concurrency,omitempty"`
Capabilities []string `yaml:"capabilities"`
}
// ResolvedProfile is the validated provider/model/profile triple consumed by a
// runtime factory.
type ResolvedProfile struct {
Provider Provider
Model Model
Profile Profile
}
// ResolveProfile returns the official identity triple for a profile.
func (c Catalog) ResolveProfile(profileID string) (ResolvedProfile, bool) {
var resolved ResolvedProfile
for _, profile := range c.Profiles {
if profile.ID == profileID {
resolved.Profile = profile
break
}
}
if resolved.Profile.ID == "" {
return ResolvedProfile{}, false
}
for _, provider := range c.Providers {
if provider.ID == resolved.Profile.Provider {
resolved.Provider = provider
break
}
}
for _, model := range c.Models {
if model.ID == resolved.Profile.Model {
resolved.Model = model
break
}
}
if resolved.Provider.ID == "" || resolved.Model.ID == "" {
return ResolvedProfile{}, false
}
return resolved, true
}