prospeo-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/core/config.ts","../src/core/errors.ts","../src/core/auth.ts","../src/core/client.ts","../src/core/output.ts","../src/commands/auth/login.ts","../src/commands/auth/logout.ts","../src/mcp/server.ts","../src/commands/mcp/index.ts","../src/commands/person/enrich.ts","../src/commands/person/bulk-enrich.ts","../src/commands/person/search.ts","../src/commands/company/enrich.ts","../src/commands/company/bulk-enrich.ts","../src/commands/company/search.ts","../src/commands/suggestions/location.ts","../src/commands/suggestions/job-title.ts","../src/commands/account/info.ts","../src/commands/index.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { registerAllCommands } from './commands/index.js';\n\nconst program = new Command();\n\nprogram\n .name('prospeo')\n .description('CLI and MCP server for the Prospeo API — person/company enrichment and search')\n .version('0.1.0')\n .option('--api-key <key>', 'API key (overrides PROSPEO_API_KEY env var and stored config)')\n .option('--output <format>', 'Output format: json (default) or pretty', 'json')\n .option('--pretty', 'Shorthand for --output pretty')\n .option('--quiet', 'Suppress output, exit codes only')\n .option('--fields <fields>', 'Comma-separated list of fields to include in output');\n\nregisterAllCommands(program);\n\nprogram.parse();\n","import { readFile, writeFile, mkdir, rm } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport type { ProspeoConfig } from './types.js';\n\nconst CONFIG_DIR = join(homedir(), '.prospeo');\nconst CONFIG_FILE = join(CONFIG_DIR, 'config.json');\n\nexport function getConfigDir(): string {\n return CONFIG_DIR;\n}\n\nexport function getConfigPath(): string {\n return CONFIG_FILE;\n}\n\nexport async function loadConfig(): Promise<ProspeoConfig | null> {\n try {\n const content = await readFile(CONFIG_FILE, 'utf-8');\n return JSON.parse(content) as ProspeoConfig;\n } catch {\n return null;\n }\n}\n\nexport async function saveConfig(config: ProspeoConfig): Promise<void> {\n await mkdir(CONFIG_DIR, { recursive: true });\n await writeFile(CONFIG_FILE, JSON.stringify(config, null, 2) + '\\n', {\n mode: 0o600,\n });\n}\n\nexport async function deleteConfig(): Promise<void> {\n try {\n await rm(CONFIG_FILE);\n } catch {\n // File doesn't exist, that's fine\n }\n}\n","export class ProspeoError extends Error {\n constructor(\n message: string,\n public code: string,\n public statusCode?: number,\n ) {\n super(message);\n this.name = 'ProspeoError';\n }\n}\n\nexport class AuthError extends ProspeoError {\n constructor(message: string) {\n super(message, 'AUTH_ERROR', 401);\n this.name = 'AuthError';\n }\n}\n\nexport class ValidationError extends ProspeoError {\n constructor(message: string) {\n super(message, 'VALIDATION_ERROR', 400);\n this.name = 'ValidationError';\n }\n}\n\nexport class RateLimitError extends ProspeoError {\n constructor(message: string) {\n super(message, 'RATE_LIMIT', 429);\n this.name = 'RateLimitError';\n }\n}\n\nexport class InsufficientCreditsError extends ProspeoError {\n constructor(message: string) {\n super(message, 'INSUFFICIENT_CREDITS', 400);\n this.name = 'InsufficientCreditsError';\n }\n}\n\nexport class NoMatchError extends ProspeoError {\n constructor(message: string) {\n super(message, 'NO_MATCH', 400);\n this.name = 'NoMatchError';\n }\n}\n\nexport class ServerError extends ProspeoError {\n constructor(message: string, statusCode: number = 500) {\n super(message, 'SERVER_ERROR', statusCode);\n this.name = 'ServerError';\n }\n}\n\nexport function formatError(error: unknown): { message: string; code: string } {\n if (error instanceof ProspeoError) {\n return { message: error.message, code: error.code };\n }\n if (error instanceof Error) {\n if (error.name === 'AbortError' || String(error.message).includes('aborted')) {\n return { message: 'Request timed out — the API did not respond in time', code: 'TIMEOUT' };\n }\n if (error.message.includes('ECONNREFUSED') || error.message.includes('ENOTFOUND')) {\n return { message: `Network error: ${error.message}`, code: 'NETWORK_ERROR' };\n }\n return { message: error.message, code: 'UNKNOWN_ERROR' };\n }\n return { message: String(error), code: 'UNKNOWN_ERROR' };\n}\n","import { loadConfig } from './config.js';\nimport { AuthError } from './errors.js';\n\nexport async function resolveApiKey(flagKey?: string): Promise<string> {\n // 1. --api-key flag takes highest priority\n if (flagKey) return flagKey;\n\n // 2. PROSPEO_API_KEY environment variable\n const envKey = process.env.PROSPEO_API_KEY;\n if (envKey) return envKey;\n\n // 3. Stored config from ~/.prospeo/config.json\n const config = await loadConfig();\n if (config?.api_key) return config.api_key;\n\n throw new AuthError(\n 'No API key found. Set PROSPEO_API_KEY, use --api-key, or run: prospeo login',\n );\n}\n","import type { ProspeoClient as IProspeoClient } from './types.js';\nimport {\n AuthError,\n ValidationError,\n RateLimitError,\n InsufficientCreditsError,\n NoMatchError,\n ServerError,\n ProspeoError,\n} from './errors.js';\n\nconst BASE_URL = 'https://api.prospeo.io';\nconst MAX_RETRIES = 3;\nconst REQUEST_TIMEOUT = 30_000;\nconst VERSION = '0.1.0';\n\ninterface ClientOptions {\n apiKey: string;\n baseUrl?: string;\n maxRetries?: number;\n timeout?: number;\n}\n\nexport class ProspeoClient implements IProspeoClient {\n private apiKey: string;\n private baseUrl: string;\n private maxRetries: number;\n private timeout: number;\n\n constructor(options: ClientOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl ?? BASE_URL;\n this.maxRetries = options.maxRetries ?? MAX_RETRIES;\n this.timeout = options.timeout ?? REQUEST_TIMEOUT;\n }\n\n async request<T>(options: {\n method: 'GET' | 'POST';\n path: string;\n body?: unknown;\n }): Promise<T> {\n const url = `${this.baseUrl}${options.path}`;\n\n const headers: Record<string, string> = {\n 'X-KEY': this.apiKey,\n 'User-Agent': `prospeo-cli/${VERSION}`,\n Accept: 'application/json',\n };\n\n if (options.body !== undefined) {\n headers['Content-Type'] = 'application/json';\n }\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method: options.method,\n headers,\n body: options.body !== undefined ? JSON.stringify(options.body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const text = await response.text();\n let parsed: any;\n try {\n parsed = JSON.parse(text);\n } catch {\n parsed = { error: true, error_code: 'PARSE_ERROR', message: text };\n }\n\n if (response.ok) {\n // Prospeo returns { error: false, ... } on success\n if (parsed?.error === true) {\n // Treat as error even on 200 if error flag is set\n throw this.parseApiError(parsed, response.status);\n }\n return parsed as T;\n }\n\n throw this.parseApiError(parsed, response.status);\n } catch (error) {\n if (error instanceof ProspeoError) {\n // Rate limit and server errors are retryable\n if (\n (error instanceof RateLimitError || error instanceof ServerError) &&\n attempt < this.maxRetries\n ) {\n const delay = Math.min(1000 * Math.pow(2, attempt), 10_000);\n await sleep(delay);\n lastError = error;\n continue;\n }\n throw error;\n }\n\n const isAbort =\n error instanceof Error &&\n (error.name === 'AbortError' || String(error.message).includes('aborted'));\n\n if (isAbort) {\n lastError = new ProspeoError(\n `Request timed out after ${this.timeout / 1000}s: ${options.method} ${options.path}`,\n 'TIMEOUT',\n );\n if (attempt < this.maxRetries) {\n await sleep(Math.min(1000 * Math.pow(2, attempt), 10_000));\n continue;\n }\n throw lastError;\n }\n\n if (error instanceof TypeError && String(error.message).includes('fetch')) {\n throw new ProspeoError(`Network error: ${error.message}`, 'NETWORK_ERROR');\n }\n\n throw error;\n }\n }\n\n throw lastError ?? new ProspeoError('Request failed after retries', 'MAX_RETRIES');\n }\n\n private parseApiError(body: any, statusCode: number): ProspeoError {\n const code = body?.error_code ?? body?.code ?? 'API_ERROR';\n const message =\n body?.message ?? body?.error_message ?? body?.error ?? `API error (HTTP ${statusCode})`;\n\n switch (code) {\n case 'INVALID_API_KEY':\n return new AuthError(message);\n case 'INSUFFICIENT_CREDITS':\n return new InsufficientCreditsError(message);\n case 'NO_MATCH':\n case 'NO_RESULTS':\n return new NoMatchError(message);\n case 'RATE_LIMITED':\n return new RateLimitError(message);\n case 'INVALID_DATAPOINTS':\n case 'INVALID_FILTERS':\n case 'INVALID_REQUEST':\n return new ValidationError(message);\n case 'INTERNAL_ERROR':\n return new ServerError(message, statusCode);\n default:\n if (statusCode === 401) return new AuthError(message);\n if (statusCode === 429) return new RateLimitError(message);\n if (statusCode >= 500) return new ServerError(message, statusCode);\n return new ProspeoError(message, code, statusCode);\n }\n }\n\n async post<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>({ method: 'POST', path, body });\n }\n\n async get<T>(path: string): Promise<T> {\n return this.request<T>({ method: 'GET', path });\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import type { GlobalOptions } from './types.js';\nimport { formatError } from './errors.js';\n\nexport function output(data: unknown, options: GlobalOptions = {}): void {\n if (options.quiet) return;\n\n let result = data;\n\n // Select specific fields if --fields is set\n if (options.fields && typeof data === 'object' && data !== null) {\n const fields = options.fields.split(',').map((f) => f.trim());\n if (Array.isArray(data)) {\n result = data.map((item) => pickFields(item, fields));\n } else {\n result = pickFields(data as Record<string, unknown>, fields);\n }\n }\n\n if (options.output === 'pretty') {\n console.log(JSON.stringify(result, null, 2));\n } else {\n // Default: compact JSON for machine consumption\n console.log(JSON.stringify(result));\n }\n}\n\nexport function outputError(error: unknown, options: GlobalOptions = {}): void {\n const formatted = formatError(error);\n if (options.quiet) {\n process.exitCode = 1;\n return;\n }\n\n if (options.output === 'pretty') {\n console.error(`Error: ${formatted.message}`);\n } else {\n console.error(JSON.stringify({ error: formatted.message, code: formatted.code }));\n }\n process.exitCode = 1;\n}\n\nfunction pickFields(\n obj: Record<string, unknown>,\n fields: string[],\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const field of fields) {\n if (field in obj) {\n result[field] = obj[field];\n }\n }\n return result;\n}\n","import { Command } from 'commander';\nimport { ProspeoClient } from '../../core/client.js';\nimport { saveConfig } from '../../core/config.js';\nimport { output, outputError } from '../../core/output.js';\nimport type { GlobalOptions } from '../../core/types.js';\n\nexport function registerLoginCommand(program: Command): void {\n program\n .command('login')\n .description('Authenticate with your Prospeo API key')\n .option('--api-key <key>', 'API key (skips interactive prompt)')\n .action(async (opts) => {\n const globalOpts = program.opts() as GlobalOptions;\n\n try {\n let apiKey = opts.apiKey || process.env.PROSPEO_API_KEY;\n\n if (!apiKey) {\n if (!process.stdin.isTTY) {\n outputError(\n new Error('No API key provided. Use --api-key or set PROSPEO_API_KEY'),\n globalOpts,\n );\n return;\n }\n\n console.log('Get your API key from: https://prospeo.io/dashboard/api\\n');\n\n const [major] = process.versions.node.split('.').map(Number);\n if (major < 20) {\n outputError(\n new Error(\n 'Interactive login requires Node.js 20+. Use --api-key or set PROSPEO_API_KEY instead.',\n ),\n globalOpts,\n );\n return;\n }\n const { password } = await import('@inquirer/prompts');\n apiKey = await password({\n message: 'Enter your Prospeo API key:',\n mask: '*',\n });\n }\n\n if (!apiKey) {\n outputError(new Error('No API key provided'), globalOpts);\n return;\n }\n\n const client = new ProspeoClient({ apiKey });\n\n if (process.stdin.isTTY) {\n console.log('Validating API key...');\n }\n\n // Validate by fetching account information\n let accountInfo: any;\n try {\n accountInfo = await client.get('/account-information');\n } catch {\n accountInfo = null;\n }\n\n await saveConfig({ api_key: apiKey });\n\n const result = {\n status: 'authenticated',\n plan: accountInfo?.current_plan ?? 'unknown',\n remaining_credits: accountInfo?.remaining_credits ?? 'unknown',\n config_path: '~/.prospeo/config.json',\n };\n\n if (process.stdin.isTTY) {\n console.log('\\nAuthenticated successfully!');\n if (accountInfo?.current_plan) console.log(`Plan: ${accountInfo.current_plan}`);\n if (accountInfo?.remaining_credits !== undefined)\n console.log(`Remaining credits: ${accountInfo.remaining_credits}`);\n console.log('Config saved to ~/.prospeo/config.json');\n } else {\n output(result, globalOpts);\n }\n } catch (error) {\n outputError(error, globalOpts);\n }\n });\n}\n","import { Command } from 'commander';\nimport { deleteConfig } from '../../core/config.js';\nimport { output, outputError } from '../../core/output.js';\nimport type { GlobalOptions } from '../../core/types.js';\n\nexport function registerLogoutCommand(program: Command): void {\n program\n .command('logout')\n .description('Remove stored Prospeo API key from local config')\n .action(async () => {\n const globalOpts = program.opts() as GlobalOptions;\n try {\n await deleteConfig();\n const result = { status: 'logged_out', message: 'Config removed from ~/.prospeo/config.json' };\n if (process.stdin.isTTY) {\n console.log('Logged out. Config removed from ~/.prospeo/config.json');\n } else {\n output(result, globalOpts);\n }\n } catch (error) {\n outputError(error, globalOpts);\n }\n });\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { allCommands } from '../commands/index.js';\nimport { resolveApiKey } from '../core/auth.js';\nimport { ProspeoClient } from '../core/client.js';\n\nexport async function startMcpServer(): Promise<void> {\n const apiKey = await resolveApiKey();\n const client = new ProspeoClient({ apiKey });\n\n const server = new McpServer({\n name: 'prospeo',\n version: '0.1.0',\n });\n\n // Register every CommandDefinition as an MCP tool\n for (const cmdDef of allCommands) {\n const shape = cmdDef.inputSchema.shape;\n\n server.registerTool(\n cmdDef.name,\n {\n description: cmdDef.description,\n inputSchema: shape,\n },\n async (args: Record<string, unknown>) => {\n try {\n const result = await cmdDef.handler(args, client);\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error: any) {\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({\n error: error.message ?? String(error),\n code: error.code ?? 'UNKNOWN_ERROR',\n }),\n },\n ],\n isError: true,\n };\n }\n },\n );\n }\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n console.error('Prospeo MCP server started. Tools registered:', allCommands.length);\n}\n","import { Command } from 'commander';\nimport { startMcpServer } from '../../mcp/server.js';\n\nexport function registerMcpCommand(program: Command): void {\n program\n .command('mcp')\n .description('Start the MCP server for AI assistant integration (Claude, Cursor, VS Code, Windsurf)')\n .addHelpText(\n 'after',\n `\nMCP Configuration:\n\n For Claude Desktop / Cursor / VS Code, add to your MCP config:\n\n {\n \"mcpServers\": {\n \"prospeo\": {\n \"command\": \"npx\",\n \"args\": [\"prospeo-cli\", \"mcp\"],\n \"env\": {\n \"PROSPEO_API_KEY\": \"your-api-key\"\n }\n }\n }\n }\n\n Or if installed globally:\n\n {\n \"mcpServers\": {\n \"prospeo\": {\n \"command\": \"prospeo\",\n \"args\": [\"mcp\"],\n \"env\": {\n \"PROSPEO_API_KEY\": \"your-api-key\"\n }\n }\n }\n }`,\n )\n .action(async () => {\n process.on('SIGINT', () => process.exit(0));\n process.on('SIGTERM', () => process.exit(0));\n\n try {\n await startMcpServer();\n } catch (error: any) {\n console.error('Failed to start MCP server:', error.message ?? error);\n process.exit(1);\n }\n });\n}\n","import { z } from 'zod';\nimport type { CommandDefinition } from '../../core/types.js';\n\nexport const personEnrichCommand: CommandDefinition = {\n name: 'person_enrich',\n group: 'person',\n subcommand: 'enrich',\n description:\n 'Enrich a person with verified contact details, email, mobile, job history, and company data. Provide at least one of: linkedin_url, email, person_id, or (first_name/last_name + company identifier).',\n examples: [\n 'prospeo person enrich --linkedin-url \"https://linkedin.com/in/jdoe\"',\n 'prospeo person enrich --email \"john@acme.com\"',\n 'prospeo person enrich --first-name \"Eva\" --last-name \"Kiegler\" --company-website \"intercom.com\"',\n 'prospeo person enrich --first-name \"John\" --last-name \"Doe\" --company-name \"Acme\" --enrich-mobile',\n 'prospeo person enrich --linkedin-url \"https://linkedin.com/in/jdoe\" --only-verified-email --pretty',\n ],\n inputSchema: z.object({\n linkedin_url: z.string().url().optional().describe('LinkedIn profile URL'),\n email: z.string().email().optional().describe('Work email address'),\n first_name: z.string().optional().describe('First name'),\n last_name: z.string().optional().describe('Last name'),\n full_name: z.string().optional().describe('Full name'),\n company_name: z.string().optional().describe('Company name'),\n company_website: z.string().optional().describe('Company website domain (e.g. intercom.com)'),\n company_linkedin_url: z.string().url().optional().describe(\"Company's LinkedIn URL\"),\n person_id: z.string().optional().describe('Person ID from search-person results'),\n only_verified_email: z\n .preprocess((v) => v === true || v === 'true', z.boolean())\n .optional()\n .describe('Only return records with a verified email'),\n enrich_mobile: z\n .preprocess((v) => v === true || v === 'true', z.boolean())\n .optional()\n .describe('Also enrich mobile phone number (costs 10 credits instead of 1)'),\n only_verified_mobile: z\n .preprocess((v) => v === true || v === 'true', z.boolean())\n .optional()\n .describe('Only return records with a verified mobile (requires enrich_mobile)'),\n }),\n cliMappings: {\n options: [\n { field: 'linkedin_url', flags: '--linkedin-url <url>', description: 'LinkedIn profile URL' },\n { field: 'email', flags: '--email <email>', description: 'Work email address' },\n { field: 'first_name', flags: '--first-name <name>', description: 'First name' },\n { field: 'last_name', flags: '--last-name <name>', description: 'Last name' },\n { field: 'full_name', flags: '--full-name <name>', description: 'Full name' },\n { field: 'company_name', flags: '--company-name <name>', description: 'Company name' },\n { field: 'company_website', flags: '--company-website <domain>', description: 'Company website (e.g. intercom.com)' },\n { field: 'company_linkedin_url', flags: '--company-linkedin-url <url>', description: 'Company LinkedIn URL' },\n { field: 'person_id', flags: '--person-id <id>', description: 'Person ID from search results' },\n { field: 'only_verified_email', flags: '--only-verified-email', description: 'Only return records with verified email' },\n { field: 'enrich_mobile', flags: '--enrich-mobile', description: 'Enrich mobile number (10 credits)' },\n { field: 'only_verified_mobile', flags: '--only-verified-mobile', description: 'Only return records with verified mobile' },\n ],\n },\n handler: async (input, client) => {\n const { only_verified_email, enrich_mobile, only_verified_mobile, ...dataFields } = input;\n\n // Build data object — only include provided fields\n const data: Record<string, string> = {};\n if (dataFields.linkedin_url) data.linkedin_url = dataFields.linkedin_url;\n if (dataFields.email) data.email = dataFields.email;\n if (dataFields.first_name) data.first_name = dataFields.first_name;\n if (dataFields.last_name) data.last_name = dataFields.last_name;\n if (dataFields.full_name) data.full_name = dataFields.full_name;\n if (dataFields.company_name) data.company_name = dataFields.company_name;\n if (dataFields.company_website) data.company_website = dataFields.company_website;\n if (dataFields.company_linkedin_url) data.company_linkedin_url = dataFields.company_linkedin_url;\n if (dataFields.person_id) data.person_id = dataFields.person_id;\n\n const body: Record<string, unknown> = { data };\n if (only_verified_email !== undefined) body.only_verified_email = only_verified_email;\n if (enrich_mobile !== undefined) body.enrich_mobile = enrich_mobile;\n if (only_verified_mobile !== undefined) body.only_verified_mobile = only_verified_mobile;\n\n return client.post('/enrich-person', body);\n },\n};\n","import { z } from 'zod';\nimport type { CommandDefinition } from '../../core/types.js';\n\nconst PersonRecord = z.object({\n identifier: z.string().describe('Unique alpha-numeric string to track this record in the response'),\n linkedin_url: z.string().url().optional(),\n email: z.string().email().optional(),\n first_name: z.string().optional(),\n last_name: z.string().optional(),\n full_name: z.string().optional(),\n company_name: z.string().optional(),\n company_website: z.string().optional(),\n company_linkedin_url: z.string().url().optional(),\n person_id: z.string().optional(),\n});\n\nexport const personBulkEnrichCommand: CommandDefinition = {\n name: 'person_bulk_enrich',\n group: 'person',\n subcommand: 'bulk-enrich',\n description:\n 'Enrich up to 50 persons in a single request. Pass a JSON array of person objects via --data. Each object requires an \"identifier\" field for tracking. Returns matched[], not_matched[], and invalid_datapoints[] arrays.',\n examples: [\n `prospeo person bulk-enrich --data '[{\"identifier\":\"1\",\"linkedin_url\":\"https://linkedin.com/in/jdoe\"},{\"identifier\":\"2\",\"email\":\"jane@acme.com\"}]'`,\n `prospeo person bulk-enrich --data '[{\"identifier\":\"1\",\"first_name\":\"John\",\"last_name\":\"Doe\",\"company_website\":\"acme.com\"}]' --only-verified-email`,\n `prospeo person bulk-enrich --data '[{\"identifier\":\"1\",\"linkedin_url\":\"https://linkedin.com/in/jdoe\"}]' --enrich-mobile --pretty`,\n ],\n inputSchema: z.object({\n data: z\n .preprocess(\n (v) => (typeof v === 'string' ? JSON.parse(v) : v),\n z.array(PersonRecord).min(1).max(50),\n )\n .describe('JSON array of up to 50 person objects, each with a unique \"identifier\" field'),\n only_verified_email: z\n .preprocess((v) => v === true || v === 'true', z.boolean())\n .optional()\n .describe('Only return records with a verified email'),\n enrich_mobile: z\n .preprocess((v) => v === true || v === 'true', z.boolean())\n .optional()\n .describe('Also enrich mobile phone number'),\n only_verified_mobile: z\n .preprocess((v) => v === true || v === 'true', z.boolean())\n .optional()\n .describe('Only return records with a verified mobile'),\n }),\n cliMappings: {\n options: [\n { field: 'data', flags: '--data <json>', description: 'JSON array of person objects (each needs \"identifier\")' },\n { field: 'only_verified_email', flags: '--only-verified-email', description: 'Only return records with verified email' },\n { field: 'enrich_mobile', flags: '--enrich-mobile', description: 'Enrich mobile numbers' },\n { field: 'only_verified_mobile', flags: '--only-verified-mobile', description: 'Only return records with verified mobile' },\n ],\n },\n handler: async (input, client) => {\n const { data, only_verified_email, enrich_mobile, only_verified_mobile } = input;\n\n const body: Record<string, unknown> = { data };\n if (only_verified_email !== undefined) body.only_verified_email = only_verified_email;\n if (enrich_mobile !== undefined) body.enrich_mobile = enrich_mobile;\n if (only_verified_mobile !== undefined) body.only_verified_mobile = only_verified_mobile;\n\n return client.post('/bulk-enrich-person', body);\n },\n};\n","import { z } from 'zod';\nimport type { CommandDefinition } from '../../core/types.js';\n\nexport const personSearchCommand: CommandDefinition = {\n name: 'person_search',\n group: 'person',\n subcommand: 'search',\n description:\n 'Search 200M+ persons with 30+ filters. Pass filters as a JSON object via --filters. Use --page for pagination (25 results/page, max 1000 pages). 1 credit per page returned. Use \"prospeo suggestions location\" and \"prospeo suggestions job-title\" to find exact filter values.',\n examples: [\n `prospeo person search --filters '{\"person_seniority\":{\"include\":[\"C_SUITE\",\"VP\"]},\"company_industry\":{\"include\":[\"TECHNOLOGY\"]}}' --pretty`,\n `prospeo person search --filters '{\"company_websites\":[\"stripe.com\",\"brex.com\"]}' --page 2`,\n `prospeo person search --filters '{\"person_job_title\":[\"Head of Sales\"],\"company_location\":[\"United States\"]}' --pretty`,\n `prospeo person search --filters '{\"person_seniority\":{\"include\":[\"DIRECTOR\"]},\"company_employee_range\":{\"include\":[\"51_200\",\"201_500\"]}}' --fields \"person,company\"`,\n ],\n inputSchema: z.object({\n filters: z\n .preprocess(\n (v) => (typeof v === 'string' ? JSON.parse(v) : v),\n z.record(z.unknown()),\n )\n .describe(\n 'JSON object of search filters. Common keys: person_seniority (include/exclude arrays), person_job_title (array), company_industry (include/exclude), company_location (array), person_location (array), company_websites (array, max 500), company_names (array, max 500), company_employee_range (include/exclude), person_year_of_experience (min/max), person_department (include/exclude). Use search-suggestions for exact location/job-title values.',\n ),\n page: z.coerce\n .number()\n .min(1)\n .max(1000)\n .default(1)\n .describe('Page number (1–1000, 25 results per page)'),\n }),\n cliMappings: {\n options: [\n {\n field: 'filters',\n flags: '--filters <json>',\n description: 'JSON filter object (see docs for available filter keys)',\n },\n { field: 'page', flags: '--page <number>', description: 'Page number (default: 1)' },\n ],\n },\n handler: async (input, client) => {\n return client.post('/search-person', {\n filters: input.filters,\n page: input.page,\n });\n },\n};\n","import { z } from 'zod';\nimport type { CommandDefinition } from '../../core/types.js';\n\nexport const companyEnrichCommand: CommandDefinition = {\n name: 'company_enrich',\n group: 'company',\n subcommand: 'enrich',\n description:\n 'Enrich a company with 50+ data points: funding, technologies, headcount, location, job postings, social URLs, and more. Provide company_website or company_linkedin_url for best accuracy.',\n examples: [\n 'prospeo company enrich --website \"intercom.com\"',\n 'prospeo company enrich --linkedin-url \"https://linkedin.com/company/stripe\"',\n 'prospeo company enrich --website \"deloitte.com\" --pretty',\n 'prospeo company enrich --company-id \"cccc7c7da6116a8830a07100\"',\n 'prospeo company enrich --name \"Salesforce\" --website \"salesforce.com\"',\n ],\n inputSchema: z.object({\n company_website: z\n .string()\n .optional()\n .describe('Company website domain (e.g. intercom.com)'),\n company_linkedin_url: z\n .string()\n .url()\n .optional()\n .describe(\"Company LinkedIn URL (e.g. https://linkedin.com/company/stripe)\"),\n company_name: z\n .string()\n .optional()\n .describe('Company name — avoid using alone, pair with website or LinkedIn URL'),\n company_id: z\n .string()\n .optional()\n .describe('Company ID from previous enrichment or search results'),\n }),\n cliMappings: {\n options: [\n { field: 'company_website', flags: '--website <domain>', description: 'Company domain (e.g. intercom.com)' },\n { field: 'company_linkedin_url', flags: '--linkedin-url <url>', description: 'Company LinkedIn URL' },\n { field: 'company_name', flags: '--name <name>', description: 'Company name (use with website or LinkedIn URL)' },\n { field: 'company_id', flags: '--company-id <id>', description: 'Company ID from previous results' },\n ],\n },\n handler: async (input, client) => {\n const data: Record<string, string> = {};\n if (input.company_website) data.company_website = input.company_website;\n if (input.company_linkedin_url) data.company_linkedin_url = input.company_linkedin_url;\n if (input.company_name) data.company_name = input.company_name;\n if (input.company_id) data.company_id = input.company_id;\n\n return client.post('/enrich-company', { data });\n },\n};\n","import { z } from 'zod';\nimport type { CommandDefinition } from '../../core/types.js';\n\nconst CompanyRecord = z.object({\n identifier: z.string().describe('Unique alpha-numeric string to track this record in the response'),\n company_website: z.string().optional(),\n company_linkedin_url: z.string().url().optional(),\n company_name: z.string().optional(),\n company_id: z.string().optional(),\n});\n\nexport const companyBulkEnrichCommand: CommandDefinition = {\n name: 'company_bulk_enrich',\n group: 'company',\n subcommand: 'bulk-enrich',\n description:\n 'Enrich up to 50 companies in a single request. Pass a JSON array of company objects via --data. Each object requires an \"identifier\" field. Returns matched[], not_matched[], and invalid_datapoints[] arrays.',\n examples: [\n `prospeo company bulk-enrich --data '[{\"identifier\":\"1\",\"company_website\":\"intercom.com\"},{\"identifier\":\"2\",\"company_website\":\"stripe.com\"}]'`,\n `prospeo company bulk-enrich --data '[{\"identifier\":\"a1\",\"company_linkedin_url\":\"https://linkedin.com/company/salesforce\"},{\"identifier\":\"a2\",\"company_website\":\"hubspot.com\"}]' --pretty`,\n ],\n inputSchema: z.object({\n data: z\n .preprocess(\n (v) => (typeof v === 'string' ? JSON.parse(v) : v),\n z.array(CompanyRecord).min(1).max(50),\n )\n .describe('JSON array of up to 50 company objects, each with a unique \"identifier\" field'),\n }),\n cliMappings: {\n options: [\n {\n field: 'data',\n flags: '--data <json>',\n description: 'JSON array of company objects (each needs \"identifier\")',\n },\n ],\n },\n handler: async (input, client) => {\n return client.post('/bulk-enrich-company', { data: input.data });\n },\n};\n","import { z } from 'zod';\nimport type { CommandDefinition } from '../../core/types.js';\n\nexport const companySearchCommand: CommandDefinition = {\n name: 'company_search',\n group: 'company',\n subcommand: 'search',\n description:\n 'Search 30M+ companies with filters for industry, location, funding, employee count, technologies, and more. Pass filters as a JSON object via --filters. 1 credit per page returned (25 results/page).',\n examples: [\n `prospeo company search --filters '{\"company_industry\":{\"include\":[\"TECHNOLOGY\"]},\"company_employee_range\":{\"include\":[\"51_200\"]}}' --pretty`,\n `prospeo company search --filters '{\"company_location\":[\"United States\"],\"company_funding\":{\"stage\":[\"SERIES_A\",\"SERIES_B\"]}}' --page 1`,\n `prospeo company search --filters '{\"company\":{\"websites\":[\"stripe.com\",\"brex.com\",\"ramp.com\"]}}' --pretty`,\n `prospeo company search --filters '{\"company_industry\":{\"include\":[\"FINTECH\"]},\"company_location\":[\"New York\"]}' --page 2`,\n ],\n inputSchema: z.object({\n filters: z\n .preprocess(\n (v) => (typeof v === 'string' ? JSON.parse(v) : v),\n z.record(z.unknown()),\n )\n .describe(\n 'JSON object of search filters. Common keys: company_industry (include/exclude), company_location (array of exact strings), company_employee_range (include/exclude), company_funding (stage/funding_date/last_funding/total_funding), company (websites array max 500, names array max 500). Use exact strings from the Prospeo dashboard for location values.',\n ),\n page: z.coerce\n .number()\n .min(1)\n .max(1000)\n .default(1)\n .describe('Page number (1–1000, 25 results per page)'),\n }),\n cliMappings: {\n options: [\n {\n field: 'filters',\n flags: '--filters <json>',\n description: 'JSON filter object',\n },\n { field: 'page', flags: '--page <number>', description: 'Page number (default: 1)' },\n ],\n },\n handler: async (input, client) => {\n return client.post('/search-company', {\n filters: input.filters,\n page: input.page,\n });\n },\n};\n","import { z } from 'zod';\nimport type { CommandDefinition } from '../../core/types.js';\n\nexport const suggestionsLocationCommand: CommandDefinition = {\n name: 'suggestions_location',\n group: 'suggestions',\n subcommand: 'location',\n description:\n 'Get autocomplete location suggestions for use in person/company search filters. Returns COUNTRY, STATE, CITY, and ZONE entries. Free — no credits consumed. Use the returned \"name\" values in company_location and person_location filter arrays.',\n examples: [\n 'prospeo suggestions location --query \"united states\"',\n 'prospeo suggestions location --query \"new york\" --pretty',\n 'prospeo suggestions location --query \"san fra\"',\n 'prospeo suggestions location --query \"greater toronto\"',\n ],\n inputSchema: z.object({\n query: z\n .string()\n .min(2)\n .describe('Location search query (minimum 2 characters). E.g. \"united states\", \"california\", \"new york\"'),\n }),\n cliMappings: {\n options: [\n {\n field: 'query',\n flags: '--query <text>',\n description: 'Location search query (min 2 chars)',\n },\n ],\n },\n handler: async (input, client) => {\n return client.post('/search-suggestions', {\n location_search: input.query,\n });\n },\n};\n","import { z } from 'zod';\nimport type { CommandDefinition } from '../../core/types.js';\n\nexport const suggestionsJobTitleCommand: CommandDefinition = {\n name: 'suggestions_job_title',\n group: 'suggestions',\n subcommand: 'job-title',\n description:\n 'Get autocomplete job title suggestions for use in person search filters. Returns up to 25 results ordered by popularity. Free — no credits consumed. Use the returned values in the person_job_title filter array.',\n examples: [\n 'prospeo suggestions job-title --query \"head of sales\"',\n 'prospeo suggestions job-title --query \"vp engineering\" --pretty',\n 'prospeo suggestions job-title --query \"chief revenue\"',\n 'prospeo suggestions job-title --query \"software engineer\"',\n ],\n inputSchema: z.object({\n query: z\n .string()\n .min(2)\n .describe('Job title search query (minimum 2 characters). E.g. \"head of sales\", \"vp engineer\"'),\n }),\n cliMappings: {\n options: [\n {\n field: 'query',\n flags: '--query <text>',\n description: 'Job title search query (min 2 chars)',\n },\n ],\n },\n handler: async (input, client) => {\n return client.post('/search-suggestions', {\n job_title_search: input.query,\n });\n },\n};\n","import { z } from 'zod';\nimport type { CommandDefinition } from '../../core/types.js';\n\nexport const accountInfoCommand: CommandDefinition = {\n name: 'account_info',\n group: 'account',\n subcommand: 'info',\n description:\n 'Get account information: current plan, remaining credits, used credits, team members, and next quota renewal date. Free — no credits consumed.',\n examples: [\n 'prospeo account info',\n 'prospeo account info --pretty',\n 'prospeo account info --fields remaining_credits,next_quota_renewal_date',\n ],\n inputSchema: z.object({}),\n cliMappings: {},\n handler: async (_input, client) => {\n return client.get('/account-information');\n },\n};\n","import { Command } from 'commander';\nimport type { CommandDefinition, GlobalOptions } from '../core/types.js';\nimport { resolveApiKey } from '../core/auth.js';\nimport { ProspeoClient } from '../core/client.js';\nimport { output, outputError } from '../core/output.js';\n\n// Auth commands\nimport { registerLoginCommand } from './auth/login.js';\nimport { registerLogoutCommand } from './auth/logout.js';\n\n// MCP command\nimport { registerMcpCommand } from './mcp/index.js';\n\n// Person\nimport { personEnrichCommand } from './person/enrich.js';\nimport { personBulkEnrichCommand } from './person/bulk-enrich.js';\nimport { personSearchCommand } from './person/search.js';\n\n// Company\nimport { companyEnrichCommand } from './company/enrich.js';\nimport { companyBulkEnrichCommand } from './company/bulk-enrich.js';\nimport { companySearchCommand } from './company/search.js';\n\n// Suggestions\nimport { suggestionsLocationCommand } from './suggestions/location.js';\nimport { suggestionsJobTitleCommand } from './suggestions/job-title.js';\n\n// Account\nimport { accountInfoCommand } from './account/info.js';\n\n/** All command definitions — single source of truth for both CLI and MCP */\nexport const allCommands: CommandDefinition[] = [\n // Person (3)\n personEnrichCommand,\n personBulkEnrichCommand,\n personSearchCommand,\n\n // Company (3)\n companyEnrichCommand,\n companyBulkEnrichCommand,\n companySearchCommand,\n\n // Suggestions (2)\n suggestionsLocationCommand,\n suggestionsJobTitleCommand,\n\n // Account (1)\n accountInfoCommand,\n];\n\nexport function registerAllCommands(program: Command): void {\n // Auth commands (no API client needed)\n registerLoginCommand(program);\n registerLogoutCommand(program);\n\n // MCP server command\n registerMcpCommand(program);\n\n // Group commands by their `group` field\n const groups = new Map<string, CommandDefinition[]>();\n for (const cmd of allCommands) {\n if (!groups.has(cmd.group)) groups.set(cmd.group, []);\n groups.get(cmd.group)!.push(cmd);\n }\n\n for (const [groupName, commands] of groups) {\n const groupCmd = program\n .command(groupName)\n .description(`${groupName.charAt(0).toUpperCase() + groupName.slice(1)} commands`);\n\n for (const cmdDef of commands) {\n registerCommand(groupCmd, cmdDef);\n }\n\n // Helpful error for unknown subcommands\n groupCmd.on('command:*', (operands: string[]) => {\n const available = commands.map((c) => c.subcommand).join(', ');\n console.error(`error: unknown command '${operands[0]}' for '${groupName}'`);\n console.error(`Available commands: ${available}`);\n process.exitCode = 1;\n });\n }\n}\n\nfunction registerCommand(parent: Command, cmdDef: CommandDefinition): void {\n const cmd = parent.command(cmdDef.subcommand).description(cmdDef.description);\n\n if (cmdDef.cliMappings.args) {\n for (const arg of cmdDef.cliMappings.args) {\n const argStr = arg.required ? `<${arg.name}>` : `[${arg.name}]`;\n cmd.argument(argStr, arg.field);\n }\n }\n\n if (cmdDef.cliMappings.options) {\n for (const opt of cmdDef.cliMappings.options) {\n cmd.option(opt.flags, opt.description ?? '');\n }\n }\n\n if (cmdDef.examples?.length) {\n cmd.addHelpText('after', '\\nExamples:\\n' + cmdDef.examples.map((e) => ` $ ${e}`).join('\\n'));\n }\n\n cmd.action(async (...actionArgs: any[]) => {\n try {\n const globalOpts = cmd.optsWithGlobals() as GlobalOptions & Record<string, any>;\n\n if (globalOpts.pretty) {\n globalOpts.output = 'pretty';\n }\n\n const apiKey = await resolveApiKey(globalOpts.apiKey);\n const client = new ProspeoClient({ apiKey });\n\n const input: Record<string, any> = {};\n\n // Map positional arguments\n if (cmdDef.cliMappings.args) {\n for (let i = 0; i < cmdDef.cliMappings.args.length; i++) {\n const argDef = cmdDef.cliMappings.args[i];\n if (actionArgs[i] !== undefined) {\n input[argDef.field] = actionArgs[i];\n }\n }\n }\n\n // Map options\n if (cmdDef.cliMappings.options) {\n for (const opt of cmdDef.cliMappings.options) {\n const match = opt.flags.match(/--([a-z][a-z0-9-]*)/);\n if (match) {\n const optName = match[1].replace(/-([a-z])/g, (_: string, c: string) => c.toUpperCase());\n if (globalOpts[optName] !== undefined) {\n input[opt.field] = globalOpts[optName];\n }\n }\n }\n }\n\n // Validate\n const parsed = cmdDef.inputSchema.safeParse(input);\n if (!parsed.success) {\n const issues = parsed.error.issues ?? [];\n const missing = issues\n .filter(\n (i: any) =>\n i.code === 'invalid_type' && String(i.message).includes('received undefined'),\n )\n .map((i: any) => '--' + String(i.path?.[0] ?? '').replace(/_/g, '-'));\n if (missing.length > 0) {\n throw new Error(`Missing required option(s): ${missing.join(', ')}`);\n }\n const msg = issues.map((i: any) => `${i.path?.join('.')}: ${i.message}`).join('; ');\n throw new Error(`Invalid input: ${msg}`);\n }\n\n const result = await cmdDef.handler(parsed.data, client);\n output(result, globalOpts);\n } catch (error) {\n const globalOpts = cmd.optsWithGlobals() as GlobalOptions;\n outputError(error, globalOpts);\n }\n });\n}\n"],"mappings":"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","names":["program","program","program","z","z","z","z","z","z","z","z","program"]}