68 lines
2.0 KiB
JavaScript
68 lines
2.0 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
/**
|
|
* OpenQode Authentication Helper
|
|
* Handles the Vision API OAuth flow during installation.
|
|
*/
|
|
|
|
const { QwenOAuth } = require('../qwen-oauth');
|
|
const readline = require('readline');
|
|
const { exec } = require('child_process');
|
|
const os = require('os');
|
|
|
|
const rl = readline.createInterface({
|
|
input: process.stdin,
|
|
output: process.stdout
|
|
});
|
|
|
|
const oauth = new QwenOAuth();
|
|
|
|
async function openBrowser(url) {
|
|
const platform = os.platform();
|
|
let command;
|
|
|
|
if (platform === 'win32') {
|
|
command = `start "${url}"`;
|
|
} else if (platform === 'darwin') {
|
|
command = `open "${url}"`;
|
|
} else {
|
|
command = `xdg-open "${url}"`;
|
|
}
|
|
|
|
exec(command, (error) => {
|
|
if (error) {
|
|
console.log(' (Please open the URL manually if it didn\'t open)');
|
|
}
|
|
});
|
|
}
|
|
|
|
console.log('\n========================================================');
|
|
console.log(' OpenQode Vision API Authentication');
|
|
console.log('========================================================\n');
|
|
console.log('This step authorizes OpenQode to see images (Vision features).');
|
|
console.log('You will also be asked to login to the CLI separately if needed.\n');
|
|
|
|
(async () => {
|
|
try {
|
|
const flow = await oauth.startDeviceFlow();
|
|
|
|
console.log(`\n 1. Your User Code is: \x1b[1;33m${flow.userCode}\x1b[0m`);
|
|
console.log(` 2. Please verify at: \x1b[1;36m${flow.verificationUri}\x1b[0m`);
|
|
console.log('\n Opening browser...');
|
|
|
|
openBrowser(flow.verificationUriComplete || flow.verificationUri);
|
|
|
|
console.log('\n Waiting for you to complete login in the browser...');
|
|
|
|
const tokens = await oauth.pollForTokens();
|
|
|
|
console.log('\n\x1b[1;32m Success! Vision API authenticated.\x1b[0m');
|
|
console.log(' Tokens saved to .qwen-tokens.json\n');
|
|
|
|
} catch (error) {
|
|
console.error(`\n\x1b[1;31m Authentication failed: ${error.message}\x1b[0m\n`);
|
|
} finally {
|
|
rl.close();
|
|
}
|
|
})();
|