{"record":{"id":"fc00da1fafbeeb97","repo":"musistudio/claude-code-router","slug":"plugin-app-url-must-be-an-http-s-url-or-a-ccr-gat-fc00da","errorCode":null,"errorMessage":"Plugin app URL must be an http(s) URL or a CCR gateway path.","messagePattern":"Plugin app URL must be an http\\(s\\) URL or a CCR gateway path\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/electron/src/main/ipc.ts","lineNumber":1130,"sourceCode":"    ...(id ? { id } : {}),\n    name,\n    url\n  };\n}\n\nfunction normalizePluginAppUrl(value: string | undefined): string {\n  const trimmed = value?.trim() || \"\";\n  if (!trimmed) {\n    return \"\";\n  }\n  if (/^https?:\\/\\//i.test(trimmed)) {\n    return new URL(trimmed).toString();\n  }\n  if (trimmed.startsWith(\"//\")) {\n    throw new Error(\"Plugin app URL cannot be protocol-relative.\");\n  }\n  if (/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(trimmed)) {\n    throw new Error(\"Plugin app URL must be an http(s) URL or a CCR gateway path.\");\n  }\n  return trimmed.startsWith(\"/\") ? trimmed : `/${trimmed}`;\n}\n\nfunction readPluginPermissions(\n  manifest: Record<string, unknown> | undefined,\n  packageJson: Record<string, unknown> | undefined\n): GatewayPluginPermission[] | undefined {\n  const values = [\n    manifest?.permissions,\n    readRecord(manifest?.ccr)?.permissions,\n    readRecord(manifest?.ccrPlugin)?.permissions,\n    readRecord(packageJson?.ccr)?.permissions,\n    readRecord(packageJson?.ccrPlugin)?.permissions\n  ];\n  const parsedValues = values.map(parsePluginPermissions).filter((value): value is GatewayPluginPermission[] => Boolean(value));\n  return parsedValues.length > 0 ? uniquePluginPermissions(parsedValues.flat()) : undefined;\n}","sourceCodeStart":1112,"sourceCodeEnd":1148,"githubUrl":"https://github.com/musistudio/claude-code-router/blob/99f24806c6a2c660b16e53e95211c517448a6c90/packages/electron/src/main/ipc.ts#L1112-L1148","documentation":"Error \"Plugin app URL must be an http(s) URL or a CCR gateway path.\" thrown in musistudio/claude-code-router.","triggerScenarios":"Thrown at packages/electron/src/main/ipc.ts:1130 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":[],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"99f24806c6a2c660b16e53e95211c517448a6c90","analyzedAt":"2026-08-27T04:11:01.184Z","schemaVersion":2},"datasetVersion":"2026-08-27T08:17:20.692Z"}