@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
JavaScript
;
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