@agentcommunity/aid-doctor
Version:
CLI tool for Agent Interface Discovery (AID) - validate and check AID records
1 lines • 19.3 kB
Source Map (JSON)
{"version":3,"sources":["../src/generator.ts","../src/cli.ts"],"names":["parse","Command","chalk","AidError","ora","discover","enforceRedirectPolicy","inquirer","PROTOCOL_TOKENS","AUTH_TOKENS","clipboardy"],"mappings":"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","file":"cli.cjs","sourcesContent":["/**\n * @agentcommunity/aid-doctor - CLI tool for Agent Interface Discovery\n *\n * This file contains the logic for the interactive record generator.\n */\n\nimport { parse } from '@agentcommunity/aid';\nimport type { ProtocolToken, AuthToken } from '@agentcommunity/aid';\n\n// Export the types needed by the UI\nexport type AidGeneratorData = {\n uri: string;\n proto: ProtocolToken | '';\n auth: AuthToken | '';\n desc: string;\n domain: string;\n};\n\n// The core logic function\nexport function buildTxtRecord(formData: AidGeneratorData): string {\n const parts = ['v=aid1'];\n if (formData.uri) parts.push(`uri=${formData.uri}`);\n const protoKey = parts.join(';').length > 200 ? 'p' : 'proto';\n if (formData.proto) parts.push(`${protoKey}=${formData.proto}`);\n if (formData.auth) parts.push(`auth=${formData.auth}`);\n if (formData.desc) parts.push(`desc=${formData.desc}`);\n return parts.join(';');\n}\n\n// The validation logic\nexport function validateTxtRecord(record: string): { isValid: boolean; error?: string } {\n try {\n parse(record);\n return { isValid: true };\n } catch (error) {\n return { isValid: false, error: error instanceof Error ? error.message : 'Invalid' };\n }\n}\n","#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport {\n discover,\n AidError,\n enforceRedirectPolicy,\n type DiscoveryResult,\n PROTOCOL_TOKENS,\n AUTH_TOKENS,\n} from '@agentcommunity/aid';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport inquirer from 'inquirer';\nimport clipboardy from 'clipboardy';\nimport { buildTxtRecord, validateTxtRecord, type AidGeneratorData } from './generator';\n\nconst program = new Command();\n\n// Package info\nprogram\n .name('aid-doctor')\n .description('CLI tool for Agent Interface Discovery (AID)')\n .version('0.1.0');\n\n/**\n * Format the discovery result for human-readable output\n */\nfunction formatDiscoveryResult(result: DiscoveryResult, domain: string): string {\n const { record, queryName } = result;\n\n const lines = [\n chalk.green(`✅ AID Record Found for ${domain}`),\n '',\n chalk.bold('Record Details:'),\n ` Domain: ${chalk.cyan(domain)}`,\n ` Query: ${chalk.gray(queryName)}`,\n ` Version: ${chalk.yellow(record.v)}`,\n ` Protocol: ${chalk.magenta(record.proto)}`,\n ` URI: ${chalk.blue(record.uri)}`,\n ];\n\n if (record.auth) {\n lines.push(` Auth: ${chalk.yellow(record.auth)}`);\n }\n\n if (record.desc) {\n lines.push(` Description: ${chalk.white(record.desc)}`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Format an error for human-readable output\n */\nfunction formatError(error: unknown, domain: string): string {\n if (error instanceof AidError) {\n const codeColor = error.code >= 1003 ? chalk.red : chalk.yellow;\n return [\n chalk.red(`❌ AID Discovery Failed for ${domain}`),\n '',\n ` Error Code: ${codeColor(error.code)} (${error.errorCode})`,\n ` Message: ${error.message}`,\n ].join('\\n');\n }\n\n return [\n chalk.red(`❌ Unexpected Error for ${domain}`),\n '',\n ` ${error instanceof Error ? error.message : String(error)}`,\n ].join('\\n');\n}\n\n// Check command - human-readable report\nprogram\n .command('check <domain>')\n .description('Check a domain for AID records and display a human-readable report')\n .option('-p, --protocol <protocol>', 'Try protocol-specific subdomain first')\n .option('-t, --timeout <ms>', 'DNS query timeout in milliseconds', '5000')\n .option('--code', 'Exit with the specific error code on failure (for scripting)')\n .action(\n async (domain: string, options: { protocol?: string; timeout: string; code?: boolean }) => {\n const spinner = ora(`Checking AID record for ${domain}...`).start();\n\n try {\n const result = await discover(domain, {\n ...(options.protocol && { protocol: options.protocol }),\n timeout: Number.parseInt(options.timeout),\n });\n\n // Enforce redirect security unless explicitly skipped (CI placeholder URIs)\n if (result.record.proto !== 'local' && process.env.AID_SKIP_SECURITY !== '1') {\n spinner.text = 'Validating redirect policy...';\n await enforceRedirectPolicy(result.record.uri, Number.parseInt(options.timeout));\n }\n\n spinner.stop();\n console.log(formatDiscoveryResult(result, domain));\n\n // Exit with success code\n process.exit(0);\n } catch (error) {\n spinner.stop();\n console.log(formatError(error, domain));\n\n // Exit with error code\n if (options.code && error instanceof AidError) {\n process.exit(error.code);\n } else {\n process.exit(1);\n }\n }\n },\n );\n\n// JSON command - machine-readable JSON output\nprogram\n .command('json <domain>')\n .description('Check a domain for AID records and output machine-readable JSON')\n .option('-p, --protocol <protocol>', 'Try protocol-specific subdomain first')\n .option('-t, --timeout <ms>', 'DNS query timeout in milliseconds', '5000')\n .action(async (domain: string, options: { protocol?: string; timeout: string }) => {\n try {\n const result = await discover(domain, {\n ...(options.protocol && { protocol: options.protocol }),\n timeout: Number.parseInt(options.timeout),\n });\n\n // Optionally enforce redirect policy\n if (result.record.proto !== 'local') {\n await enforceRedirectPolicy(result.record.uri, Number.parseInt(options.timeout));\n }\n\n // Output successful result\n console.log(\n JSON.stringify(\n {\n success: true,\n domain,\n queryName: result.queryName,\n record: result.record,\n timestamp: new Date().toISOString(),\n },\n null,\n 2,\n ),\n );\n\n process.exit(0);\n } catch (error) {\n // Output error result\n if (error instanceof AidError) {\n console.log(\n JSON.stringify(\n {\n success: false,\n domain,\n error: {\n code: error.code,\n errorCode: error.errorCode,\n message: error.message,\n },\n timestamp: new Date().toISOString(),\n },\n null,\n 2,\n ),\n );\n\n process.exit(error.code);\n } else {\n console.log(\n JSON.stringify(\n {\n success: false,\n domain,\n error: {\n code: 1,\n errorCode: 'UNKNOWN_ERROR',\n message: error instanceof Error ? error.message : String(error),\n },\n timestamp: new Date().toISOString(),\n },\n null,\n 2,\n ),\n );\n\n process.exit(1);\n }\n }\n });\n\n// Generator command\nprogram\n .command('generate')\n .description('Run an interactive prompt to generate a new AID record')\n .action(async () => {\n console.log(chalk.bold.cyan('AID Record Generator'));\n console.log(chalk.gray('This tool will guide you through creating a valid DNS TXT record.\\n'));\n\n const answers = await inquirer.prompt<Partial<AidGeneratorData>>([\n {\n type: 'input',\n name: 'domain',\n message: 'What is the primary domain for your agent?',\n validate: (input: string) => (input ? true : 'Domain cannot be empty.'),\n },\n {\n type: 'input',\n name: 'uri',\n message: \"What is the full URI of your agent's endpoint?\",\n validate: (input: string) => {\n try {\n new URL(input);\n return true;\n } catch {\n return 'Please enter a valid URI (e.g., https://api.example.com/agent).';\n }\n },\n },\n {\n type: 'list',\n name: 'proto',\n message: 'Select the communication protocol:',\n choices: Object.keys(PROTOCOL_TOKENS),\n default: 'mcp',\n },\n {\n type: 'list',\n name: 'auth',\n message: 'Select the authentication method (if any):',\n choices: ['none', ...Object.keys(AUTH_TOKENS)],\n filter: (val: string) => (val === 'none' ? '' : val),\n },\n {\n type: 'input',\n name: 'desc',\n message: 'Enter a short description (optional):',\n validate: (input: string) => {\n if (!input) return true; // Optional field\n const byteLength = new TextEncoder().encode(input).length;\n return byteLength <= 60 || `Description is ${byteLength} bytes (max 60).`;\n },\n },\n ]);\n\n // We cast here because inquirer provides a partial object based on answers\n const formData = answers as AidGeneratorData;\n const txtRecord = buildTxtRecord(formData);\n const validation = validateTxtRecord(txtRecord);\n\n console.log(chalk.green('\\n--- Generation Complete ---\\n'));\n console.log(chalk.bold('Host:'));\n console.log(chalk.yellow(`_agent.${formData.domain}`));\n console.log('');\n console.log(chalk.bold('Type:'));\n console.log(chalk.yellow('TXT'));\n console.log('');\n console.log(chalk.bold('Value:'));\n console.log(chalk.yellow(txtRecord));\n console.log('');\n\n if (validation.isValid) {\n try {\n await clipboardy.write(txtRecord);\n console.log(\n chalk.bold.green('✅ Success! The TXT record value has been copied to your clipboard.'),\n );\n } catch {\n // The error object is not needed, so we use an optional catch binding.\n console.log(chalk.red('Could not copy to clipboard. Please copy the value manually.'));\n }\n } else {\n console.log(chalk.bold.red(`🔥 Validation Failed: ${validation.error}`));\n }\n });\n\n// Version command with additional info\nprogram\n .command('version')\n .description('Show version information')\n .action(() => {\n console.log(\n [\n chalk.bold('aid-doctor') + ' - Agent Interface Discovery CLI',\n `Version: ${chalk.green('0.1.0')}`,\n `Node: ${chalk.gray(process.version)}`,\n `Platform: ${chalk.gray(process.platform)}`,\n '',\n 'For more information, visit:',\n chalk.blue('https://aid.agentcommunity.org'),\n ].join('\\n'),\n );\n });\n\n// Parse command line arguments\nprogram.parse();\n"]}