musistudio/claude-code-router · error · Error
Plugin app URL is required.
Error message
Plugin app URL is required.
What it means
Error "Plugin app URL is required." thrown in musistudio/claude-code-router.
Source
Thrown at packages/electron/src/main/deep-link.ts:392
}
return knownGatewayPluginDefaultApps(pluginId) || [];
}
function resolveGatewayPluginAppUrl(config: AppConfig, url: string): string {
const trimmed = normalizePluginAppUrl(url);
if (/^https?:\/\//i.test(trimmed)) {
return trimmed;
}
const urlPath = trimmed.startsWith("/") ? trimmed : `/${trimmed}`;
const host = normalizeGatewayPluginAppHost(config.gateway?.host || config.HOST || "127.0.0.1");
const port = config.gateway?.port || config.PORT || 3456;
return `http://${host}:${port}${urlPath}`;
}
function normalizePluginAppUrl(value: string): string {
const trimmed = value.trim();
if (!trimmed) {
throw new Error("Plugin app URL is required.");
}
if (/^https?:\/\//i.test(trimmed)) {
return new URL(trimmed).toString();
}
if (trimmed.startsWith("//")) {
throw new Error("Plugin app URL cannot be protocol-relative.");
}
if (/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(trimmed)) {
throw new Error("Plugin app URL must be an http(s) URL or a CCR gateway path.");
}
return trimmed.startsWith("/") ? trimmed : `/${trimmed}`;
}
function normalizeGatewayPluginAppHost(host: string): string {
const trimmed = host.trim();
if (!trimmed || trimmed === "0.0.0.0" || trimmed === "::") {
return "127.0.0.1";
}View on GitHub (pinned to 99f24806c6)
When it happens
Trigger: Thrown at packages/electron/src/main/deep-link.ts:392 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of musistudio/claude-code-router@99f24806c6 (2026-08-27).
Data as JSON: /api/errors/964a68edc82de28a.
Report an issue: GitHub.