live-acceptance.js 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #!/usr/bin/env node
  2. const fs = require('fs');
  3. const os = require('os');
  4. const path = require('path');
  5. const { readTihaoToken } = require('../mcp/src/core/credentials');
  6. const { resolveTihaoUserInfo } = require('../mcp/src/core/payment-links');
  7. const { runTihaoSourcing } = require('../mcp/src/tools/tihao-brief-sourcing-run');
  8. async function main() {
  9. const token = readTihaoToken({});
  10. if (!token) {
  11. console.error('Missing TIHAO_SESSION_TOKEN / VOC_ECOMMERCE_TOKEN / VOC_TOKEN. Refusing to run real live acceptance.');
  12. process.exit(2);
  13. }
  14. const identity = await resolveTihaoUserInfo(token);
  15. const company = process.env.TIHAO_COMPANY || process.env.VOC_ECOMMERCE_COMPANY || process.env.COMPANY_OBJECT_ID || identity.companyId || '';
  16. if (!company) {
  17. console.error('Missing company. Set TIHAO_COMPANY / VOC_ECOMMERCE_COMPANY / COMPANY_OBJECT_ID, or use a sessionToken whose Parse user has company.');
  18. process.exit(2);
  19. }
  20. const output = path.join(os.tmpdir(), `tihao-live-acceptance-${Date.now()}`);
  21. const dhaBrief = path.resolve(__dirname, '..', '..', 'dha_brief.xlsx');
  22. const result = await runTihaoSourcing({
  23. collectionMode: 'live',
  24. brief: fs.existsSync(dhaBrief) ? dhaBrief : undefined,
  25. briefText: fs.existsSync(dhaBrief) ? undefined : 'DHA 母婴 小红书 10人 粉丝范围 2万-50万 预算 1000-5000',
  26. company,
  27. keywordLimit: 1,
  28. pagesPerKeyword: 1,
  29. output
  30. });
  31. if (result.status !== 'ok') {
  32. console.error(`live acceptance returned status=${result.status}`);
  33. console.error(result.assistantMessage);
  34. process.exit(1);
  35. }
  36. if (!result.summary || result.summary.total < 1) {
  37. console.error('live acceptance did not produce any candidate.');
  38. process.exit(1);
  39. }
  40. if (!result.summary || result.summary.clientReadyCount < 1) {
  41. console.error('live acceptance did not produce a client-ready shortlist.');
  42. process.exit(1);
  43. }
  44. if (!result.files || !result.files.every(file => fs.existsSync(file))) {
  45. console.error('live acceptance did not write all expected files.');
  46. process.exit(1);
  47. }
  48. if (JSON.stringify(result).includes(token)) {
  49. console.error('live acceptance leaked token in result.');
  50. process.exit(1);
  51. }
  52. const fileLeaks = result.files.filter(file => fs.readFileSync(file, 'utf8').includes(token));
  53. if (fileLeaks.length > 0) {
  54. console.error('live acceptance leaked token in output files.');
  55. process.exit(1);
  56. }
  57. console.log(`live acceptance ok: candidates=${result.summary.total}, clientReady=${result.summary.clientReadyCount}, output=${output}`);
  58. }
  59. main().catch(error => {
  60. console.error(error && error.stack ? error.stack : String(error));
  61. process.exit(1);
  62. });