#!/usr/bin/env node /** * CLI tool to generate API keys for agents * Usage: node generate-key.js * Example: node generate-key.js "ac-infinity-agent" "ac:" */ import { fileURLToPath } from 'url'; import { dirname, join } from 'path'; import { initDatabase } from '../db/schema.js'; import { generateApiKey, listApiKeys } from '../db/queries.js'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); const dbPath = process.env.DB_PATH || join(__dirname, '..', '..', 'data', 'sensors.db'); const args = process.argv.slice(2); if (args.length === 0 || args[0] === '--list') { // List existing keys const db = initDatabase(dbPath); const keys = listApiKeys(db); if (keys.length === 0) { console.log('No API keys found.'); } else { console.log('\nExisting API keys:\n'); console.log('ID | Name | Prefix | Preview | Last Used'); console.log('-'.repeat(75)); for (const key of keys) { const lastUsed = key.last_used_at || 'never'; console.log(`${key.id.toString().padEnd(3)} | ${key.name.padEnd(20)} | ${key.device_prefix.padEnd(7)} | ${key.key_preview.padEnd(12)} | ${lastUsed}`); } } console.log('\nUsage: node generate-key.js '); console.log('Example: node generate-key.js "ac-infinity-agent" "ac:"'); db.close(); process.exit(0); } if (args.length < 2) { console.error('Error: Both name and device_prefix are required'); console.error('Usage: node generate-key.js '); process.exit(1); } const [name, devicePrefix] = args; const db = initDatabase(dbPath); const key = generateApiKey(db, name, devicePrefix); console.log('\n✓ API key generated successfully!\n'); console.log(`Name: ${name}`); console.log(`Device Prefix: ${devicePrefix}`); console.log(`API Key: ${key}`); console.log('\n⚠ Save this key securely - it cannot be recovered!\n'); db.close();