{"record":{"id":"4f687be6056da576","repo":"nexu-io/open-design","slug":"connector-disabled","errorCode":"CONNECTOR_DISABLED","errorMessage":"connector is disabled","messagePattern":"connector is disabled","errorType":"exception","errorClass":"ConnectorServiceError","httpStatus":403,"severity":"error","filePath":"apps/daemon/src/connectors/service.ts","lineNumber":704,"sourceCode":"\n    let auth: ComposioConnectionStart | undefined;\n    let detailDefinition = definition;\n    if (definition.authentication === 'composio' && options.credentials === undefined) {\n      if (!options.callbackUrl) {\n        throw new ConnectorServiceError('CONNECTOR_EXECUTION_FAILED', 'callbackUrl is required for Composio connectors', 400, { connectorId });\n      }\n      auth = await composioConnectorProvider.connect(definition, options.callbackUrl, options.signal);\n      if (auth.kind === 'redirect_required' || auth.kind === 'pending') {\n        return { connector: this.toDetail(detailDefinition), auth: publicComposioAuthStart(auth) };\n      }\n      if (auth.credentials !== undefined) {\n        options = { ...options, ...(auth.accountLabel === undefined ? {} : { accountLabel: auth.accountLabel }), credentials: auth.credentials };\n      }\n    }\n\n    const status = this.statusService.connect(detailDefinition, options.accountLabel, options.credentials);\n    if (status.status === 'disabled') {\n      throw new ConnectorServiceError('CONNECTOR_DISABLED', 'connector is disabled', 403);\n    }\n    return { connector: this.toDetail(detailDefinition), ...(auth === undefined ? {} : { auth: publicComposioAuthStart(auth) }) };\n  }\n\n  async disconnect(connectorId: string): Promise<ConnectorDetail> {\n    const definition = this.getFastDefinition(connectorId) ?? await this.getDefinition(connectorId);\n    if (!definition) {\n      throw new ConnectorServiceError('CONNECTOR_NOT_FOUND', 'connector not found', 404);\n    }\n    if (definition.authentication === 'composio') {\n      await composioConnectorProvider.disconnect(this.getCredential(connectorId)?.credentials);\n    }\n    this.statusService.disconnect(definition);\n    return this.toDetail(definition);\n  }\n\n  async cancelPendingAuthorization(connectorId: string): Promise<ConnectorDetail> {\n    const definition = this.getFastDefinition(connectorId) ?? await this.getDefinition(connectorId);","sourceCodeStart":686,"sourceCodeEnd":722,"githubUrl":"https://github.com/nexu-io/open-design/blob/5be4028344c2eb4c667c5a97bda8f750c5597ef7/apps/daemon/src/connectors/service.ts#L686-L722","documentation":"Thrown by ConnectorService.connect() after the definition resolves and statusService.connect() reports status 'disabled'. A connector is disabled when its catalog definition sets disabled:true (e.g. administratively turned off or deprecated). ConnectorServiceError with code CONNECTOR_DISABLED and HTTP 403.","triggerScenarios":"Calling connect() on a connector whose catalog definition is flagged disabled, e.g. a connector that was deprecated or turned off by an admin via the catalog.","commonSituations":"Catalog refresh marked a connector disabled; admin disabled a misbehaving integration; deprecated connector still referenced by old UI state.","solutions":["Check definition.disabled / connector.status before offering the Connect action; hide disabled connectors in the picker.","If the disable is unintended, update the catalog definition to set disabled:false.","Offer the user an alternative connector that covers the same provider.","Do not retry connect() on a disabled connector; the status will not change without a catalog edit."],"exampleFix":"// before\nawait connectorService.connect(id, { callbackUrl });\n// throws CONNECTOR_DISABLED\n\n// after\nconst detail = await connectorService.getConnector(id);\nif (detail.status === 'disabled') {\n  throw new Error(`${detail.name} is disabled; choose another connector.`);\n}\nawait connectorService.connect(id, { callbackUrl });","handlingStrategy":"type-guard","validationCode":"async function connectIfEnabled(connectorService: ConnectorService, id: string, callbackUrl: string) {\n  const detail = await connectorService.getConnector(id);\n  if (detail.status === 'disabled') {\n    throw new Error(`${detail.name} is disabled`);\n  }\n  return connectorService.connect(id, { callbackUrl });\n}","typeGuard":"import type { ConnectorDetail } from './connectors/catalog.js';\n\nfunction isEnabled(detail: ConnectorDetail): boolean {\n  return detail.status !== 'disabled';\n}\n\n// const detail = await connectorService.getConnector(id);\n// if (!isEnabled(detail)) return 'connector disabled';","tryCatchPattern":"try {\n  return await connectorService.connect(id, { callbackUrl });\n} catch (error) {\n  if (error instanceof ConnectorServiceError && error.code === 'CONNECTOR_DISABLED') {\n    return { ok: false, reason: 'disabled', connectorId: id };\n  }\n  throw error;\n}","preventionTips":["Check connector.status === 'disabled' before rendering the Connect button.","Do not retry connect() on a disabled connector; it requires a catalog edit.","Offer an alternative connector when the desired one is disabled."],"tags":["connector","disabled","connect","catalog","authorization"],"backgroundTag":null,"analyzedSha":"5be4028344c2eb4c667c5a97bda8f750c5597ef7","analyzedAt":"2026-08-12T12:03:58.812Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}