#!/usr/bin/env node const fs = require('fs'); const os = require('os'); const path = require('path'); const { readTihaoToken } = require('../mcp/src/core/credentials'); const { resolveTihaoUserInfo } = require('../mcp/src/core/payment-links'); const { runTihaoSourcing } = require('../mcp/src/tools/tihao-brief-sourcing-run'); async function main() { const token = readTihaoToken({}); if (!token) { console.error('Missing TIHAO_SESSION_TOKEN / VOC_ECOMMERCE_TOKEN / VOC_TOKEN. Refusing to run real live acceptance.'); process.exit(2); } const identity = await resolveTihaoUserInfo(token); const company = process.env.TIHAO_COMPANY || process.env.VOC_ECOMMERCE_COMPANY || process.env.COMPANY_OBJECT_ID || identity.companyId || ''; if (!company) { console.error('Missing company. Set TIHAO_COMPANY / VOC_ECOMMERCE_COMPANY / COMPANY_OBJECT_ID, or use a sessionToken whose Parse user has company.'); process.exit(2); } const output = path.join(os.tmpdir(), `tihao-live-acceptance-${Date.now()}`); const dhaBrief = path.resolve(__dirname, '..', '..', 'dha_brief.xlsx'); const result = await runTihaoSourcing({ collectionMode: 'live', brief: fs.existsSync(dhaBrief) ? dhaBrief : undefined, briefText: fs.existsSync(dhaBrief) ? undefined : 'DHA 母婴 小红书 10人 粉丝范围 2万-50万 预算 1000-5000', company, keywordLimit: 1, pagesPerKeyword: 1, output }); if (result.status !== 'ok') { console.error(`live acceptance returned status=${result.status}`); console.error(result.assistantMessage); process.exit(1); } if (!result.summary || result.summary.total < 1) { console.error('live acceptance did not produce any candidate.'); process.exit(1); } if (!result.summary || result.summary.clientReadyCount < 1) { console.error('live acceptance did not produce a client-ready shortlist.'); process.exit(1); } if (!result.files || !result.files.every(file => fs.existsSync(file))) { console.error('live acceptance did not write all expected files.'); process.exit(1); } if (JSON.stringify(result).includes(token)) { console.error('live acceptance leaked token in result.'); process.exit(1); } const fileLeaks = result.files.filter(file => fs.readFileSync(file, 'utf8').includes(token)); if (fileLeaks.length > 0) { console.error('live acceptance leaked token in output files.'); process.exit(1); } console.log(`live acceptance ok: candidates=${result.summary.total}, clientReady=${result.summary.clientReadyCount}, output=${output}`); } main().catch(error => { console.error(error && error.stack ? error.stack : String(error)); process.exit(1); });