tmp-poll-book43.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. // book 43 轮询监控 - 每 60 秒查询一次状态
  2. const { PrismaClient } = require('@prisma/client');
  3. const p = new PrismaClient();
  4. const START = Date.now();
  5. const MAX_MS = 90 * 60 * 1000; // 90 分钟
  6. const LOG_FILE = '/tmp/poll-book43-v2.log';
  7. const fs = require('fs');
  8. function log(msg) {
  9. const ts = new Date().toISOString();
  10. const line = `[${ts}] ${msg}\n`;
  11. fs.appendFileSync(LOG_FILE, line);
  12. process.stdout.write(line);
  13. }
  14. // 清理旧日志
  15. fs.writeFileSync(LOG_FILE, `=== 轮询开始 ${new Date().toISOString()} ===\n`);
  16. async function tick() {
  17. const elapsed = Math.floor((Date.now() - START) / 1000);
  18. try {
  19. const b = await p.book.findUnique({
  20. where: { id: 43 },
  21. select: {
  22. genStage: true, progress: true, failedStage: true,
  23. errorMsg: true, outlineJson: true, bookAnalysis: true,
  24. updatedAt: true
  25. }
  26. });
  27. const outlineLen = (b.outlineJson || '').length;
  28. const analysisLen = (b.bookAnalysis || '').length;
  29. const stage = b.genStage;
  30. const prog = b.progress;
  31. const failed = b.failedStage;
  32. const err = b.errorMsg ? b.errorMsg.substring(0, 120) : null;
  33. log(`[${elapsed}s] ${stage}|${prog}|${failed}|${outlineLen}|${analysisLen}|err=${err || '-'}`);
  34. // 终态检测
  35. if (stage === 'failed' && failed) {
  36. log(`!!! 检测到失败: stage=${failed}, errorMsg=${err}`);
  37. log(`!!! 等待 Coding Agent 处理`);
  38. // 继续监控但放慢
  39. }
  40. if (stage === 'content_completed' || stage === 'audio_completed' || prog >= 100) {
  41. log(`🎉 完成! genStage=${stage}, progress=${prog}`);
  42. process.exit(0);
  43. }
  44. } catch (e) {
  45. log(`[error] ${e.message}`);
  46. }
  47. if (Date.now() - START > MAX_MS) {
  48. log(`!!! 轮询超时 90 分钟,退出`);
  49. process.exit(2);
  50. }
  51. setTimeout(tick, 60000);
  52. }
  53. tick();