router-for-me/CLIProxyAPI · error

unsupported install type %q

Error message

unsupported install type %q

What it means

Client.InstallFromManifest dispatched on manifest.InstallType() and hit the default branch — the install.type string is neither 'direct' nor the GitHub-release type. This indicates a manifest with a missing, empty, or newer/unknown install type that this client build cannot handle.

Source

Thrown at internal/pluginstore/install.go:83

	return c.installRelease(ctx, plugin, release, latestVersion, options)
}

func (c Client) InstallManifest(ctx context.Context, manifest Manifest, options InstallOptions) (InstallResult, error) {
	if errValidate := manifest.Validate(); errValidate != nil {
		return InstallResult{}, errValidate
	}
	options = normalizeInstallOptions(options)
	switch manifest.InstallType() {
	case InstallTypeDirect:
		plugin, errPlugin := c.directPluginFromManifest(ctx, manifest)
		if errPlugin != nil {
			return InstallResult{}, errPlugin
		}
		return c.InstallDirect(ctx, plugin, plugin.Install, options)
	case InstallTypeGitHubRelease:
		return c.InstallVersion(ctx, manifest.Plugin(), manifest.ReleaseTag, manifest.Version, options)
	default:
		return InstallResult{}, fmt.Errorf("unsupported install type %q", manifest.Install.Type)
	}
}

// InstallVersion installs a plugin artifact from a fixed release tag/version.
func (c Client) InstallVersion(ctx context.Context, plugin Plugin, releaseTag string, version string, options InstallOptions) (InstallResult, error) {
	if errValidate := ValidatePlugin(plugin); errValidate != nil {
		return InstallResult{}, errValidate
	}
	options = normalizeInstallOptions(options)
	version = normalizeVersion(version)
	if !validPluginVersion(version) {
		return InstallResult{}, fmt.Errorf("invalid plugin version %q", version)
	}
	releaseTag = strings.TrimSpace(releaseTag)
	if releaseTag == "" {
		releaseTag = version
	}
	release, errRelease := c.FetchReleaseByTag(ctx, plugin, releaseTag)

View on GitHub (pinned to 78f0c4079e)

Solutions

  1. Set install.type to a supported value ('direct' or the GitHub release type) in the manifest
  2. Upgrade the client to a version that knows the new install type
  3. If installing from a GitHub release is acceptable, convert the manifest to that type

Example fix

// before
{"install":{"type":"source"}}

// after
{"install":{"type":"github-release"}}
Defensive patterns

Strategy: validation

Validate before calling

switch m.InstallType() {
case pluginstore.InstallTypeDirect, pluginstore.InstallTypeGitHubRelease:
default:
    return fmt.Errorf("unsupported install type %q", m.Install.Type)
}

Type guard

func supportedInstallType(m pluginstore.Manifest) bool {
    switch m.InstallType() {
    case pluginstore.InstallTypeDirect, pluginstore.InstallTypeGitHubRelease:
        return true
    }
    return false
}

Try / catch

if err != nil && strings.Contains(err.Error(), "unsupported install type") {
    // check for client upgrade; otherwise normalize the manifest's install.type
}

Prevention

When it happens

Trigger: InstallFromManifest with a manifest whose install.type is empty, misspelled ('Direct', 'github'), or a type introduced after this client version.

Common situations: Manifest authored by hand without install.type; index schema evolved and added a new install type; client binary older than the index.

Related errors


AI-assisted analysis of router-for-me/CLIProxyAPI@78f0c4079e (2026-08-15). Data as JSON: /api/errors/f702c600e8557a6e. Report an issue: GitHub.