cerevox 2.31.0 → 2.32.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -152,8 +152,13 @@ function createErrorResponse(error, operation) {
152
152
  }
153
153
  // Session 状态检查
154
154
  async function validateSession(operation) {
155
+ if (closeSessionTimerId) {
156
+ clearTimeout(closeSessionTimerId);
157
+ closeSessionTimerId = null;
158
+ }
155
159
  if (!session || !(await session.isRunning())) {
156
- throw new Error(`Session not initialized. Please call 'zerocut-project-open' first before using ${operation}.`);
160
+ session = null;
161
+ throw new Error(`Session not initialized. Please call 'project-open' first before using ${operation}.`);
157
162
  }
158
163
  return session;
159
164
  }
@@ -409,6 +414,7 @@ let projectLocalDir = '.';
409
414
  let checkStoryboardFlag = false;
410
415
  let checkAudioVideoDurationFlag = false;
411
416
  let checkStoryboardSubtitlesFlag = false;
417
+ let closeSessionTimerId = null;
412
418
  // 注册 ZeroCut 指导规范 Prompt
413
419
  server.registerPrompt('zerocut-guideline', {
414
420
  title: 'ZeroCut 短视频创作指导规范',
@@ -443,15 +449,25 @@ server.registerTool('retrieve-rules-context', {
443
449
  'general-video',
444
450
  'music-video',
445
451
  'stage-play',
446
- 'anime-series',
447
452
  'story-telling',
448
453
  'creative-ad',
449
454
  'professional',
455
+ 'material-creation',
450
456
  'freeform',
451
457
  'custom',
452
458
  ])
453
459
  .default('general-video')
454
- .describe('The purpose of the rules context to retrieve.'),
460
+ .describe(`The purpose of the rules context to retrieve.
461
+
462
+ - general-video 创建通用视频
463
+ - music-video 创建音乐视频
464
+ - stage-play 创建舞台播放视频
465
+ - story-telling 创建故事讲述视频
466
+ - creative-ad 创建创意广告视频
467
+ - professional 创建专业视频
468
+ - material-creation 素材创作模式
469
+ - freeform 自由创作模式
470
+ - custom 自定义模式`),
455
471
  },
456
472
  }, async ({ purpose }) => {
457
473
  const projectRulesFile = (0, node_path_1.resolve)(projectLocalDir, '.trae', 'rules', `project_rules.md`);
@@ -474,10 +490,10 @@ server.registerTool('retrieve-rules-context', {
474
490
  if (purpose !== 'general-video' &&
475
491
  purpose !== 'music-video' &&
476
492
  purpose !== 'stage-play' &&
477
- purpose !== 'anime-series' &&
478
493
  purpose !== 'story-telling' &&
479
494
  purpose !== 'creative-ad' &&
480
495
  purpose !== 'professional' &&
496
+ purpose !== 'material-creation' &&
481
497
  purpose !== 'freeform') {
482
498
  return createErrorResponse(`Project rules file not found: ${projectRulesFile}`, 'retrieve-rules-context');
483
499
  }
@@ -548,7 +564,7 @@ server.registerTool('retrieve-rules-context', {
548
564
  return createErrorResponse(`Failed to load rules context prompt for ${purpose}: ${error}`, 'retrieve-rules-context');
549
565
  }
550
566
  });
551
- server.registerTool('zerocut-project-open', {
567
+ server.registerTool('project-open', {
552
568
  title: 'Open Project',
553
569
  description: 'Launch a new Cerevox session with a Chromium browser instance and open a new project context. Supports smart file filtering to optimize upload performance.',
554
570
  inputSchema: {
@@ -570,15 +586,32 @@ server.registerTool('zerocut-project-open', {
570
586
  },
571
587
  }, async ({ localDir, uploadAllFiles, tosFiles }, context) => {
572
588
  try {
589
+ if (closeSessionTimerId) {
590
+ clearTimeout(closeSessionTimerId);
591
+ closeSessionTimerId = null;
592
+ }
573
593
  // 检查是否已有活跃session
574
594
  if (session) {
575
595
  console.warn('Session already exists, closing previous session');
576
- try {
577
- await session.close();
578
- }
579
- catch (closeError) {
580
- console.warn('Failed to close previous session:', closeError);
581
- }
596
+ // try {
597
+ // await session.close();
598
+ // } catch (closeError) {
599
+ // console.warn('Failed to close previous session:', closeError);
600
+ // }
601
+ const result = {
602
+ success: true,
603
+ sessionId: session.id,
604
+ workDir: `/home/user/cerevox-zerocut/projects/${session.terminal.id}`,
605
+ projectLocalDir,
606
+ };
607
+ return {
608
+ content: [
609
+ {
610
+ type: 'text',
611
+ text: JSON.stringify(result),
612
+ },
613
+ ],
614
+ };
582
615
  }
583
616
  const apiKey = process.env.CEREVOX_API_KEY;
584
617
  // 验证API密钥
@@ -678,19 +711,29 @@ server.registerTool('zerocut-project-open', {
678
711
  }
679
712
  catch (error) {
680
713
  // 不自动关闭session,让agent根据异常信息自行处理
681
- return createErrorResponse(error, 'zerocut-project-open');
714
+ return createErrorResponse(error, 'project-open');
682
715
  }
683
716
  });
684
- server.registerTool('zerocut-project-close', {
717
+ server.registerTool('project-close', {
685
718
  title: 'Close Project',
686
719
  description: 'Close the current Cerevox session and release all resources.',
687
- inputSchema: {},
688
- }, async () => {
720
+ inputSchema: {
721
+ inMinutes: zod_1.z
722
+ .number()
723
+ .int()
724
+ .min(0)
725
+ .max(20)
726
+ .default(5)
727
+ .describe('Close the session after the specified number of minutes. Default is 5 minutes. 如果用户要求立即关闭会话,请将该参数设置为0!'),
728
+ },
729
+ }, async ({ inMinutes }) => {
689
730
  try {
690
731
  if (session) {
691
- console.log('Closing Cerevox session...');
692
- await session.close();
693
- session = null;
732
+ closeSessionTimerId = setTimeout(() => {
733
+ console.log('Closing Cerevox session...');
734
+ session?.close();
735
+ session = null;
736
+ }, inMinutes * 60 * 1000);
694
737
  console.log('Session closed successfully');
695
738
  }
696
739
  else {
@@ -712,7 +755,7 @@ server.registerTool('zerocut-project-close', {
712
755
  catch (error) {
713
756
  // 即使关闭失败,也要清理session引用
714
757
  session = null;
715
- return createErrorResponse(error, 'zerocut-project-close');
758
+ return createErrorResponse(error, 'project-close');
716
759
  }
717
760
  });
718
761
  // 列出项目下的所有文件
@@ -2673,7 +2716,7 @@ server.registerTool('compile-and-run', {
2673
2716
  };
2674
2717
  if (result.exitCode === 254) {
2675
2718
  failureResult.message =
2676
- 'FFmpeg failed with code 254. Close current session and re-open a new session to try again.';
2719
+ 'FFmpeg failed with code 254. Close current session immediately (inMinutes = 0) and re-open a new session to try again.';
2677
2720
  }
2678
2721
  return {
2679
2722
  content: [