import { kody } from 'kody:runtime' import { resolveAuthMode, resolveMetaIntegration, resolveSystemUserSecret, type MetaAccountParams, } from './accounts.ts' import { graphRequest, type JsonObject } from './core.ts' import { setupUrls } from './scopes.ts' export type SmokeTestSuccess = { ok: true authMode: 'oauth' | 'system-user' integration: string id: string | null name: string | null } export type SmokeTestSetup = { ok: false reason: 'not_connected' auth: 'oauth-or-system-user' setup: ReturnType } export type SmokeTestResult = SmokeTestSuccess | SmokeTestSetup async function hasOauthIntegration(name: string): Promise { try { const listed = await kody.integrationList({}) const items = listed.integrations ?? [] return items.some((item) => item.name === name) } catch { return false } } async function hasSystemUserSecret(name: string): Promise { try { const listed = await kody.secretList({}) return listed.secrets.some((item) => item.name === name) } catch { return false } } /** * Verify Meta Graph auth with GET /me. Does not publish, comment, or send WhatsApp. * Missing credentials return `{ ok: false, setup }` with prefilled connect / secret URLs. * @example * import smokeTest from 'kody:@kody/meta/smoke-test' * const result = await smokeTest() */ export default async function smokeTest(params: MetaAccountParams = {}): Promise { const integration = resolveMetaIntegration(params) const tokenSecret = resolveSystemUserSecret(params) const requestedMode = params.authMode ? resolveAuthMode(params) : null const oauthReady = await hasOauthIntegration(integration) const secretReady = await hasSystemUserSecret(tokenSecret) const setup = setupUrls(integration, tokenSecret) let authMode = requestedMode if (!authMode) { if (oauthReady) authMode = 'oauth' else if (secretReady) authMode = 'system-user' else return { ok: false, reason: 'not_connected', auth: 'oauth-or-system-user', setup } } const me = await graphRequest({ integration, account: params.account, tokenSecret, authMode, path: '/me', query: { fields: 'id,name' }, }) return { ok: true, authMode, integration: authMode === 'system-user' ? tokenSecret : integration, id: typeof me.id === 'string' ? me.id : null, name: typeof me.name === 'string' ? me.name : null, } }