Ctrl K
ComunidadGuías…

scripts/web-search-direct-probe.mjs

Rama master · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
#!/usr/bin/env node

import { existsSync, readFileSync } from 'node:fs';
import { join } from 'node:path';

import { config } from '../src/config.js';
import { getEffectiveProxy } from '../src/dashboard/proxy-config.js';
import { getWebSearchResults } from '../src/windsurf-api.js';

const query = process.env.WEB_SEARCH_PROBE_QUERY || 'WindsurfAPI native bridge protocol';
const limit = Math.max(1, Math.min(10, Number(process.env.WEB_SEARCH_PROBE_LIMIT || 3)));
const accountId = process.env.WEB_SEARCH_PROBE_ACCOUNT || '';
const accountKeyEnv = process.env.WEB_SEARCH_PROBE_API_KEY
  || process.env.CODEIUM_API_KEY
  || process.env.WINDSURFAPI_CODEIUM_API_KEY
  || '';
const accountsFile = process.env.WEB_SEARCH_PROBE_ACCOUNTS_FILE
  || join(config.sharedDataDir || config.dataDir || process.cwd(), 'accounts.json');

function compact(value, max = 500) {
  const s = String(value || '').replace(/\s+/g, ' ').trim();
  return s.length > max ? `${s.slice(0, max)}...<truncated ${s.length - max} chars>` : s;
}

function summarizeResult(item) {
  if (!item || typeof item !== 'object') return item;
  const out = {};
  for (const key of ['title', 'name', 'url', 'sourceUrl', 'webUrl', 'snippet', 'summary', 'text', 'content']) {
    if (item[key] != null) out[key] = typeof item[key] === 'string' ? compact(item[key], 240) : item[key];
  }
  if (!Object.keys(out).length) {
    for (const [key, value] of Object.entries(item).slice(0, 8)) {
      if (/apiKey|token|secret|password/i.test(key)) continue;
      out[key] = typeof value === 'string' ? compact(value, 160) : value;
    }
  }
  return out;
}

function readPersistedAccounts() {
  if (!existsSync(accountsFile)) return [];
  try {
    const data = JSON.parse(readFileSync(accountsFile, 'utf8'));
    if (!Array.isArray(data)) return [];
    return data.filter(a => a && typeof a === 'object' && a.apiKey);
  } catch (error) {
    throw new Error(`Failed to read accounts file ${accountsFile}: ${error.message}`);
  }
}

function selectAccounts() {
  const directKeys = String(accountKeyEnv || '')
    .split(',')
    .map(s => s.trim())
    .filter(Boolean);
  if (directKeys.length) {
    return directKeys.map((apiKey, index) => ({
      id: `env-account-key-${index + 1}`,
      email: '',
      apiKey,
      direct: true,
      proxy: null,
    }));
  }

  const accounts = readPersistedAccounts()
    .filter(a => a.status === 'active' && a.apiKey);
  if (accountId) return accounts.filter(a => a.id === accountId || a.email === accountId);
  return accounts;
}

const accounts = selectAccounts();
if (!accounts.length) {
  console.error('No active upstream account found. Set WEB_SEARCH_PROBE_API_KEY/CODEIUM_API_KEY, or point WEB_SEARCH_PROBE_ACCOUNTS_FILE at accounts.json.');
  process.exit(2);
}

const results = [];
for (const account of accounts) {
  const proxy = account.proxy || (!account.direct ? getEffectiveProxy(account.id) : null);
  const started = Date.now();
  try {
    const out = await getWebSearchResults(account.apiKey, { query, limit }, proxy);
    results.push({
      ok: true,
      accountId: account.id,
      email: account.email || '',
      latencyMs: Date.now() - started,
      resultCount: Array.isArray(out.results) ? out.results.length : 0,
      webSearchUrl: out.webSearchUrl || '',
      summary: compact(out.summary, 500),
      results: (out.results || []).slice(0, limit).map(summarizeResult),
    });
  } catch (error) {
    results.push({
      ok: false,
      accountId: account.id,
      email: account.email || '',
      latencyMs: Date.now() - started,
      error: String(error?.message || error),
    });
  }
}

console.log(JSON.stringify({
  ok: results.every(r => r.ok),
  query,
  limit,
  accountSource: accountKeyEnv ? 'env-account-key' : accountsFile,
  accountCount: accounts.length,
  results,
}, null, 2));

if (!results.every(r => r.ok)) process.exit(1);