{"version":3,"file":"search.mjs","names":[],"sources":["../../src/commands/search.ts"],"sourcesContent":["import { defineCommand } from 'citty'\nimport { consola } from 'consola'\n\nexport default defineCommand({\n  meta: {\n    name: 'search',\n    description: 'Search the web using a provider',\n  },\n  args: {\n    query: {\n      type: 'positional',\n      description: 'Search query',\n      required: true,\n    },\n    provider: {\n      type: 'string',\n      description: 'Search provider to use',\n    },\n    'max-results': {\n      type: 'string',\n      description: 'Maximum number of results',\n      default: '10',\n    },\n    json: {\n      type: 'boolean',\n      description: 'Output as JSON',\n      default: false,\n    },\n  },\n  async run({ args }) {\n    const { create } = await import('../core/registry.ts')\n    const { resolveDefaultProvider } = await import('../core/resolve.ts')\n    const { AuthError, UnknownProviderError, NoProviderConfiguredError } = await import('../core/errors.ts')\n    let providerName = args.provider\n\n    try {\n      if (!args.query.trim()) {\n        consola.error('Search query cannot be empty.')\n        process.exit(1)\n      }\n\n      const maxResults = parseMaxResults(args['max-results'])\n      if (!maxResults.ok) {\n        consola.error(maxResults.message)\n        process.exit(1)\n      }\n\n      providerName = args.provider || resolveDefaultProvider()\n      await import('../providers/index.ts')\n      const provider = create(providerName, {})\n      const results = await provider.search(args.query, {\n        maxResults: maxResults.value,\n      })\n\n      if (args.json) {\n        process.stdout.write(`${JSON.stringify(results, null, 2)}\\n`)\n        return\n      }\n\n      if (results.length === 0) {\n        consola.info('No results found.')\n        return\n      }\n\n      for (const result of results) {\n        consola.log(`\\x1b[1m\\x1b[36m${result.title}\\x1b[0m`)\n        consola.log(`  ${result.url}`)\n        if (result.snippet) {\n          const truncated = result.snippet.length > 120\n            ? result.snippet.slice(0, 120) + '...'\n            : result.snippet\n          consola.log(`  \\x1b[90m${truncated}\\x1b[0m`)\n        }\n        consola.log('')\n      }\n    }\n    catch (error) {\n      if (error instanceof AuthError) {\n        const authProvider = providerName || error.provider\n        consola.error(`Authentication failed for provider \"${authProvider}\".`)\n        consola.info(`Set the ${authProvider.toUpperCase()}_API_KEY environment variable.`)\n        process.exit(1)\n      }\n      if (error instanceof UnknownProviderError) {\n        const { providers } = await import('../core/registry.ts')\n        consola.error(`Unknown provider: ${providerName}`)\n        const available = providers()\n        if (available.length > 0) {\n          consola.info(`Available providers: ${available.join(', ')}`)\n        } else {\n          consola.info('No providers registered. Import a provider first.')\n        }\n        process.exit(1)\n      }\n      if (error instanceof NoProviderConfiguredError) {\n        await import('../providers/index.ts')\n        const { providers } = await import('../core/registry.ts')\n        const available = providers()\n        consola.error(error.message)\n        if (available.length > 0) {\n          consola.info(`Registered providers: ${available.join(', ')}`)\n          consola.info('Set one provider API key env var or pass --provider explicitly.')\n        }\n        process.exit(1)\n      }\n      throw error\n    }\n  },\n})\n\ntype ParsedMaxResults =\n  | { ok: true; value: number }\n  | { ok: false; message: string }\n\nfunction parseMaxResults(input: string): ParsedMaxResults {\n  if (!/^\\d+$/.test(input)) {\n    return {\n      ok: false,\n      message: 'Invalid --max-results value. Expected a positive integer.',\n    }\n  }\n\n  const value = Number.parseInt(input, 10)\n  if (value < 1) {\n    return {\n      ok: false,\n      message: 'Invalid --max-results value. Expected a positive integer.',\n    }\n  }\n\n  return { ok: true, value }\n}\n"],"mappings":";;;AAGA,IAAA,iBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;EACd;CACD,MAAM;EACJ,OAAO;GACL,MAAM;GACN,aAAa;GACb,UAAU;GACX;EACD,UAAU;GACR,MAAM;GACN,aAAa;GACd;EACD,eAAe;GACb,MAAM;GACN,aAAa;GACb,SAAS;GACV;EACD,MAAM;GACJ,MAAM;GACN,aAAa;GACb,SAAS;;EAEZ;CACD,MAAM,IAAI,EAAE,QAAQ;EAClB,MAAM,EAAE,WAAW,MAAM,OAAO;EAChC,MAAM,EAAE,2BAA2B,MAAM,OAAO;EAChD,MAAM,EAAE,WAAW,sBAAsB,8BAA8B,MAAM,OAAO;EACpF,IAAI,eAAe,KAAK;AAExB,MAAI;AACF,OAAI,CAAC,KAAK,MAAM,MAAM,EAAE;AACtB,YAAQ,MAAM,gCAAgC;AAC9C,YAAQ,KAAK,EAAE;;GAGjB,MAAM,aAAa,gBAAgB,KAAK,eAAe;AACvD,OAAI,CAAC,WAAW,IAAI;AAClB,YAAQ,MAAM,WAAW,QAAQ;AACjC,YAAQ,KAAK,EAAE;;AAGjB,kBAAe,KAAK,YAAY,wBAAwB;AACxD,SAAM,OAAO;GAEb,MAAM,UAAU,MADC,OAAO,cAAc,EAAE,CAAC,CACV,OAAO,KAAK,OAAO,EAChD,YAAY,WAAW,OACxB,CAAC;AAEF,OAAI,KAAK,MAAM;AACb,YAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,SAAS,MAAM,EAAE,CAAC,IAAI;AAC7D;;AAGF,OAAI,QAAQ,WAAW,GAAG;AACxB,YAAQ,KAAK,oBAAoB;AACjC;;AAGF,QAAK,MAAM,UAAU,SAAS;AAC5B,YAAQ,IAAI,kBAAkB,OAAO,MAAM,SAAS;AACpD,YAAQ,IAAI,KAAK,OAAO,MAAM;AAC9B,QAAI,OAAO,SAAS;KAClB,MAAM,YAAY,OAAO,QAAQ,SAAS,MACtC,OAAO,QAAQ,MAAM,GAAG,IAAI,GAAG,QAC/B,OAAO;AACX,aAAQ,IAAI,aAAa,UAAU,SAAS;;AAE9C,YAAQ,IAAI,GAAG;;WAGZ,OAAO;AACZ,OAAI,iBAAiB,WAAW;IAC9B,MAAM,eAAe,gBAAgB,MAAM;AAC3C,YAAQ,MAAM,uCAAuC,aAAa,IAAI;AACtE,YAAQ,KAAK,WAAW,aAAa,aAAa,CAAC,gCAAgC;AACnF,YAAQ,KAAK,EAAE;;AAEjB,OAAI,iBAAiB,sBAAsB;IACzC,MAAM,EAAE,cAAc,MAAM,OAAO;AACnC,YAAQ,MAAM,qBAAqB,eAAe;IAClD,MAAM,YAAY,WAAW;AAC7B,QAAI,UAAU,SAAS,EACrB,SAAQ,KAAK,wBAAwB,UAAU,KAAK,KAAK,GAAG;QAE5D,SAAQ,KAAK,oDAAoD;AAEnE,YAAQ,KAAK,EAAE;;AAEjB,OAAI,iBAAiB,2BAA2B;AAC9C,UAAM,OAAO;IACb,MAAM,EAAE,cAAc,MAAM,OAAO;IACnC,MAAM,YAAY,WAAW;AAC7B,YAAQ,MAAM,MAAM,QAAQ;AAC5B,QAAI,UAAU,SAAS,GAAG;AACxB,aAAQ,KAAK,yBAAyB,UAAU,KAAK,KAAK,GAAG;AAC7D,aAAQ,KAAK,kEAAkE;;AAEjF,YAAQ,KAAK,EAAE;;AAEjB,SAAM;;;CAGX,CAAC;AAMF,SAAS,gBAAgB,OAAiC;AACxD,KAAI,CAAC,QAAQ,KAAK,MAAM,CACtB,QAAO;EACL,IAAI;EACJ,SAAS;EACV;CAGH,MAAM,QAAQ,OAAO,SAAS,OAAO,GAAG;AACxC,KAAI,QAAQ,EACV,QAAO;EACL,IAAI;EACJ,SAAS;EACV;AAGH,QAAO;EAAE,IAAI;EAAM;EAAO"}