UNPKG

@ankimcp/anki-mcp-server

Version:

Model Context Protocol server for Anki - enables AI assistants to interact with your Anki flashcards

82 lines • 3.23 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.translateDeviceFlowError = translateDeviceFlowError; exports.reportLoginError = reportLoginError; exports.performLogin = performLogin; const tunnel_1 = require("../index.js"); const spinner_1 = require("../../cli/spinner.js"); const child_process_1 = require("child_process"); const util_1 = require("util"); const execFileAsync = (0, util_1.promisify)(child_process_1.execFile); async function openBrowser(url) { try { switch (process.platform) { case "darwin": await execFileAsync("open", [url]); break; case "win32": await execFileAsync("cmd", ["/c", "start", "", url]); break; default: await execFileAsync("xdg-open", [url]); break; } } catch { } } function translateDeviceFlowError(error) { switch (error.code) { case "expired_token": return "Authentication timed out. Please try again with 'ankimcp --login'"; case "access_denied": return "Authentication was denied. Please try again with 'ankimcp --login'"; case "network_error": case "timeout": return "Failed to connect to auth server. Check your internet connection."; default: return `Authentication failed: ${error.message}`; } } function reportLoginError(cli, error) { if (error instanceof tunnel_1.DeviceFlowError) { cli.error(translateDeviceFlowError(error)); } else { cli.error(`Login failed: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined); } } async function performLogin(deps) { const { credentialsService, deviceFlowService, cli } = deps; const deviceCode = await deviceFlowService.requestDeviceCode(); cli.info("Opening browser for authentication..."); cli.info(`If browser doesn't open, visit: ${deviceCode.verification_uri}`); cli.info(`Enter code: ${deviceCode.user_code}`); cli.blank(); const urlToOpen = deviceCode.verification_uri_complete || deviceCode.verification_uri; await openBrowser(urlToOpen); const stopSpinner = (0, spinner_1.startSpinner)("Waiting for authentication..."); let tokenResponse; try { tokenResponse = await deviceFlowService.pollForToken(deviceCode.device_code, deviceCode.interval, deviceCode.expires_in); } finally { stopSpinner(); } cli.success("Authentication successful"); cli.blank(); const expiresAt = new Date(Date.now() + tokenResponse.expires_in * 1000).toISOString(); const credentials = { access_token: tokenResponse.access_token, refresh_token: tokenResponse.refresh_token, expires_at: expiresAt, user: tokenResponse.user, }; await credentialsService.saveCredentials(credentials); cli.info(`Logged in as: ${tokenResponse.user.email}`); cli.info(`Tier: ${tokenResponse.user.tier}`); cli.info(`Credentials saved to ${credentialsService.getCredentialsPath()}`); cli.blank(); return credentials; } //# sourceMappingURL=perform-login.js.map