{"record":{"id":"e8e4d6e66bfd0e39","repo":"nexu-io/open-design","slug":"connector-not-found","errorCode":"CONNECTOR_NOT_FOUND","errorMessage":"connector not found","messagePattern":"connector not found","errorType":"exception","errorClass":"ConnectorServiceError","httpStatus":404,"severity":"error","filePath":"apps/daemon/src/connectors/service.ts","lineNumber":640,"sourceCode":"    if (options.refresh) composioConnectorProvider.clearDiscoveryCache();\n    const definitions = options.refresh && !options.hydrateTools\n      ? await composioConnectorProvider.refreshCatalog(options.signal)\n      : options.hydrateTools\n        ? await this.listHydratedDefinitions(options.signal)\n        : await this.listDefinitions(options.signal);\n    return {\n      connectors: definitions.map((definition) => this.toDetail(definition)),\n      meta: {\n        provider: 'composio',\n        ...(options.refresh ? { refreshRequested: true } : {}),\n      },\n    };\n  }\n\n  async getConnector(connectorId: string, signal?: AbortSignal): Promise<ConnectorDetail> {\n    const definition = await this.getDefinition(connectorId, signal);\n    if (!definition) {\n      throw new ConnectorServiceError('CONNECTOR_NOT_FOUND', 'connector not found', 404);\n    }\n    return this.toDetail(definition);\n  }\n\n  async getHydratedConnector(connectorId: string, signal?: AbortSignal): Promise<ConnectorDetail> {\n    const definition = await this.getHydratedDefinition(connectorId, signal);\n    if (!definition) {\n      throw new ConnectorServiceError('CONNECTOR_NOT_FOUND', 'connector not found', 404);\n    }\n    return this.toDetail(definition);\n  }\n\n  async getPreviewConnector(connectorId: string, options: { toolsLimit: number; toolsCursor?: string; signal?: AbortSignal }): Promise<ConnectorDetail> {\n    const definition = await this.getPreviewDefinition(connectorId, options);\n    if (!definition) {\n      throw new ConnectorServiceError('CONNECTOR_NOT_FOUND', 'connector not found', 404);\n    }\n    return this.toDetail(definition);","sourceCodeStart":622,"sourceCodeEnd":658,"githubUrl":"https://github.com/nexu-io/open-design/blob/5be4028344c2eb4c667c5a97bda8f750c5597ef7/apps/daemon/src/connectors/service.ts#L622-L658","documentation":"Thrown by ConnectorService.getConnector() when getDefinition(connectorId) resolves to undefined, i.e. no catalog entry matches the id. It is a ConnectorServiceError with code CONNECTOR_NOT_FOUND and HTTP 404. This is the read path behind the GET connector detail route and the 'od connector get' CLI.","triggerScenarios":"Calling getConnector(connectorId) with an id that is not present in the local fast catalog nor returned by Composio after a refresh, e.g. a typo, a stale id from an older catalog, or an id from a different environment.","commonSituations":"Hard-coded connector id drifted after a catalog refresh; user typed/pasted an id; the Composio catalog failed to load and only the static catalog is available; cross-environment id mismatch (beta vs stable).","solutions":["List connectors first (listConnectors) and copy the exact id from the catalog.","Pass { refresh: true } to listConnectors to force a Composio catalog refresh, then retry getConnector.","Verify the connector is not disabled/removed upstream in the Composio dashboard.","Normalize the id (trim, lowercase only if the catalog uses lowercase ids) before the call."],"exampleFix":"// before\nawait connectorService.getConnector('Gihub');  // typo\n// throws CONNECTOR_NOT_FOUND\n\n// after\nconst { connectors } = await connectorService.listConnectors({ refresh: true });\nconst id = connectors.find((c) => c.name.toLowerCase().includes('github'))?.id;\nif (!id) throw new Error('github connector unavailable');\nawait connectorService.getConnector(id);","handlingStrategy":"validation","validationCode":"async function resolveConnectorId(connectorService: ConnectorService, candidate: string): Promise<string | null> {\n  const { connectors } = await connectorService.listConnectors();\n  const found = connectors.find((c) => c.id === candidate);\n  return found ? found.id : null;\n}\n\nconst id = await resolveConnectorId(connectorService, rawId);\nif (!id) throw new Error(`unknown connector: ${rawId}`);\nawait connectorService.getConnector(id);","typeGuard":"async function connectorExists(connectorService: ConnectorService, id: string): Promise<boolean> {\n  const { connectors } = await connectorService.listConnectors();\n  return connectors.some((c) => c.id === id);\n}\n\n// if (!(await connectorExists(connectorService, id))) return 'connector not available';","tryCatchPattern":"try {\n  return await connectorService.getConnector(id);\n} catch (error) {\n  if (error instanceof ConnectorServiceError && error.code === 'CONNECTOR_NOT_FOUND') {\n    await connectorService.listConnectors({ refresh: true });\n    return connectorService.getConnector(id); // one retry after refresh\n  }\n  throw error;\n}","preventionTips":["Always source connector ids from listConnectors() output, never from hard-coded strings.","Pass { refresh: true } when the id may be stale (older session, different environment).","Trim/normalize ids from user input before lookup."],"tags":["connector","not-found","catalog","lookup","composio"],"backgroundTag":null,"analyzedSha":"5be4028344c2eb4c667c5a97bda8f750c5597ef7","analyzedAt":"2026-08-12T12:03:58.812Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}