import { parseAuth, listIntercomIntegrationNames, listUserSecretNames } from './auth.ts' import type { IntercomAuthInput, IntercomAuthMode } from './types.ts' import { requireRecord } from './types.ts' import { ACCESS_TOKEN_SETUP_URL, DEFAULT_INTEGRATION_NAME, DEFAULT_TOKEN_SECRET, INTERCOM_CALLBACK_URL, INTERCOM_PERMISSIONS, INTERCOM_REQUIRED_HOSTS, OAUTH_CONNECT_URL, accessTokenSetupUrl, oauthConnectUrl, resolveApiBaseUrl, resolveIntegrationName, resolveRegion, resolveSecretName, } from './setup.ts' export type IntercomAccountResolution = { integrationName: string secretName: string oauthConnected: boolean accessTokenSaved: boolean preferredAuth: IntercomAuthMode | null region: ReturnType apiBaseUrl: string connectUrl: string accessTokenUrl: string callbackUrl: string requiredHosts: Array permissions: typeof INTERCOM_PERMISSIONS } /** * Resolve which Intercom OAuth integration or access token to use. * * - `integration` / `integrationName` wins when set (exact name, e.g. `intercom-work`) * - `account: 'work'` → `intercom-work` * - `account: 'default'` / `'intercom'` / omitted → `intercom` * - Access-token secret defaults to `intercomAccessToken`, or * `intercomAccessToken-` for `intercom-` integrations * * @example * import listIntercomAccounts from 'kody:@kody/intercom/accounts' * const accounts = await listIntercomAccounts() */ export async function accounts( params: IntercomAuthInput = {}, ): Promise { const integrationName = resolveIntegrationName(params) const secretName = resolveSecretName(params) const [secrets, integrations] = await Promise.all([ listUserSecretNames(), listIntercomIntegrationNames(), ]) const oauthConnected = integrations.includes(integrationName) const accessTokenSaved = secrets.has(secretName) const forced = params.auth let preferredAuth: IntercomAuthMode | null = null if (forced === 'oauth' && oauthConnected) preferredAuth = 'oauth' else if (forced === 'accessToken' && accessTokenSaved) preferredAuth = 'accessToken' else if (oauthConnected) preferredAuth = 'oauth' else if (accessTokenSaved) preferredAuth = 'accessToken' return { integrationName, secretName, oauthConnected, accessTokenSaved, preferredAuth, region: resolveRegion(params), apiBaseUrl: resolveApiBaseUrl(params), connectUrl: oauthConnectUrl(integrationName, params), accessTokenUrl: accessTokenSetupUrl(secretName), callbackUrl: INTERCOM_CALLBACK_URL, requiredHosts: [...INTERCOM_REQUIRED_HOSTS], permissions: INTERCOM_PERMISSIONS, } } export { DEFAULT_INTEGRATION_NAME, DEFAULT_TOKEN_SECRET, OAUTH_CONNECT_URL, ACCESS_TOKEN_SETUP_URL } /** * Resolve which Intercom OAuth integration or access token to use. * @example * import listIntercomAccounts from 'kody:@kody/intercom/accounts' * const info = await listIntercomAccounts({ account: 'work' }) */ export default async function accountsEntrypoint( params: IntercomAuthInput & Record = {}, ) { return accounts(parseAuth(requireRecord(params, 'accounts'))) }