cerevox 2.37.1 → 2.38.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.
- package/dist/core/ai.d.ts +11 -12
- package/dist/core/ai.d.ts.map +1 -1
- package/dist/core/ai.js +42 -7
- package/dist/core/ai.js.map +1 -1
- package/dist/mcp/servers/prompts/zerocut-core.md +0 -3
- package/dist/mcp/servers/zerocut.d.ts.map +1 -1
- package/dist/mcp/servers/zerocut.js +273 -168
- package/dist/mcp/servers/zerocut.js.map +1 -1
- package/package.json +1 -1
- /package/dist/mcp/servers/prompts/rules/{professional.md → expert.md} +0 -0
|
@@ -53,7 +53,6 @@ const node_path_1 = __importStar(require("node:path"));
|
|
|
53
53
|
const doubao_voices_full_1 = require("./helper/doubao_voices_full");
|
|
54
54
|
const node_fs_1 = require("node:fs");
|
|
55
55
|
const coze_1 = require("../../utils/coze");
|
|
56
|
-
const node_http_1 = __importDefault(require("node:http"));
|
|
57
56
|
const node_child_process_1 = require("node:child_process");
|
|
58
57
|
const node_util_1 = require("node:util");
|
|
59
58
|
const os = __importStar(require("node:os"));
|
|
@@ -451,7 +450,7 @@ server.registerTool('retrieve-rules-context', {
|
|
|
451
450
|
'stage-play',
|
|
452
451
|
'story-telling',
|
|
453
452
|
'creative-ad',
|
|
454
|
-
'
|
|
453
|
+
'expert',
|
|
455
454
|
'material-creation',
|
|
456
455
|
'freeform',
|
|
457
456
|
'custom',
|
|
@@ -464,9 +463,9 @@ server.registerTool('retrieve-rules-context', {
|
|
|
464
463
|
- stage-play 创建舞台播放视频
|
|
465
464
|
- story-telling 创建故事讲述视频
|
|
466
465
|
- creative-ad 创建创意广告视频
|
|
467
|
-
-
|
|
468
|
-
- material-creation
|
|
469
|
-
- freeform
|
|
466
|
+
- expert 以专家模式创建视频,必须用户主动要求才触发
|
|
467
|
+
- material-creation 素材创作模式,必须用户主动要求才触发
|
|
468
|
+
- freeform 自由创作模式,必须用户主动要求才触发
|
|
470
469
|
- custom 自定义模式`),
|
|
471
470
|
},
|
|
472
471
|
}, async ({ purpose }) => {
|
|
@@ -492,7 +491,7 @@ server.registerTool('retrieve-rules-context', {
|
|
|
492
491
|
purpose !== 'stage-play' &&
|
|
493
492
|
purpose !== 'story-telling' &&
|
|
494
493
|
purpose !== 'creative-ad' &&
|
|
495
|
-
purpose !== '
|
|
494
|
+
purpose !== 'expert' &&
|
|
496
495
|
purpose !== 'material-creation' &&
|
|
497
496
|
purpose !== 'freeform') {
|
|
498
497
|
return createErrorResponse(`Project rules file not found: ${projectRulesFile}`, 'retrieve-rules-context');
|
|
@@ -1732,6 +1731,7 @@ server.registerTool('generate-video', {
|
|
|
1732
1731
|
'pixv',
|
|
1733
1732
|
'kenburns',
|
|
1734
1733
|
'zero',
|
|
1734
|
+
'zero-fast',
|
|
1735
1735
|
])
|
|
1736
1736
|
.default('lite')
|
|
1737
1737
|
.describe('除非用户明确提出使用其他模型,否则一律用lite模型;zero 系列模型适合创作8-23秒带故事情节的短片'),
|
|
@@ -1773,17 +1773,21 @@ server.registerTool('generate-video', {
|
|
|
1773
1773
|
try {
|
|
1774
1774
|
// 验证session状态
|
|
1775
1775
|
const currentSession = await validateSession('generate-video');
|
|
1776
|
-
|
|
1776
|
+
const isZeroModel = type.startsWith('zero');
|
|
1777
|
+
if (!start_frame && !isZeroModel) {
|
|
1777
1778
|
return createErrorResponse('start_frame 不能为空', 'generate-video');
|
|
1778
1779
|
}
|
|
1779
|
-
if (
|
|
1780
|
+
if (!isZeroModel && duration > 16) {
|
|
1780
1781
|
return createErrorResponse('非 zero 系列模型的视频仅支持 16 秒以下时长', 'generate-video');
|
|
1781
1782
|
}
|
|
1782
|
-
else if (
|
|
1783
|
-
return createErrorResponse('zero 系列模型的视频仅支持 8
|
|
1783
|
+
else if (isZeroModel && duration < 8) {
|
|
1784
|
+
return createErrorResponse('zero 系列模型的视频仅支持 8 秒以上时长', 'generate-video');
|
|
1785
|
+
}
|
|
1786
|
+
if (type === 'zero-fast' && duration > 18) {
|
|
1787
|
+
return createErrorResponse('zero-fast 模型的视频仅支持 18 秒以下时长', 'generate-video');
|
|
1784
1788
|
}
|
|
1785
1789
|
if (type === 'zero' && resolution !== '1080p') {
|
|
1786
|
-
console.warn(`zero
|
|
1790
|
+
console.warn(`zero 模型的视频仅支持 1080p 分辨率,用户指定的分辨率为 %s,已自动将 ${resolution} 转换为 1080p`, resolution);
|
|
1787
1791
|
resolution = '1080p';
|
|
1788
1792
|
}
|
|
1789
1793
|
// 校验 prompt 与 story_board.json 中场景设定的一致性以及视频时长与 timeline_analysis.json 中 proposed_video_scenes 的匹配
|
|
@@ -2178,6 +2182,21 @@ server.registerTool('generate-video', {
|
|
|
2178
2182
|
],
|
|
2179
2183
|
};
|
|
2180
2184
|
}
|
|
2185
|
+
else if (res.execute_id) {
|
|
2186
|
+
return {
|
|
2187
|
+
content: [
|
|
2188
|
+
{
|
|
2189
|
+
type: 'text',
|
|
2190
|
+
text: JSON.stringify({
|
|
2191
|
+
success: true,
|
|
2192
|
+
message: '该视频生成任务已提交,它是异步任务,且执行时间较长,你应立即调用工具 wait-for-workflow-finish 来等待任务结束,如该工具调用超时,你应立即再次重新调用直到任务结束。',
|
|
2193
|
+
execute_id: res.execute_id,
|
|
2194
|
+
workflow_id: res.workflow_id,
|
|
2195
|
+
}),
|
|
2196
|
+
},
|
|
2197
|
+
],
|
|
2198
|
+
};
|
|
2199
|
+
}
|
|
2181
2200
|
else {
|
|
2182
2201
|
console.warn('Video generation completed but no URL returned');
|
|
2183
2202
|
return {
|
|
@@ -2200,6 +2219,73 @@ server.registerTool('generate-video', {
|
|
|
2200
2219
|
return createErrorResponse(error, 'generate-video');
|
|
2201
2220
|
}
|
|
2202
2221
|
});
|
|
2222
|
+
server.registerTool('wait-for-workflow-finish', {
|
|
2223
|
+
title: 'Wait Workflow Done',
|
|
2224
|
+
description: 'Wait for a workflow to complete.',
|
|
2225
|
+
inputSchema: {
|
|
2226
|
+
workflowID: zod_1.z
|
|
2227
|
+
.string()
|
|
2228
|
+
.describe('The workflow_id of the workflow to wait for.'),
|
|
2229
|
+
executeID: zod_1.z
|
|
2230
|
+
.string()
|
|
2231
|
+
.describe('The execute_id of the workflow to wait for.'),
|
|
2232
|
+
saveToFileName: zod_1.z
|
|
2233
|
+
.string()
|
|
2234
|
+
.describe('The file name to save the video to.'),
|
|
2235
|
+
},
|
|
2236
|
+
}, async ({ workflowID, executeID, saveToFileName }, context) => {
|
|
2237
|
+
try {
|
|
2238
|
+
const currentSession = await validateSession('wait-for-workflow-finish');
|
|
2239
|
+
const ai = currentSession.ai;
|
|
2240
|
+
let progress = 0;
|
|
2241
|
+
const res = await ai.waitForWorkflowFinish({
|
|
2242
|
+
workflowId: workflowID,
|
|
2243
|
+
executeId: executeID,
|
|
2244
|
+
onProgress: async (metaData) => {
|
|
2245
|
+
try {
|
|
2246
|
+
await sendProgress(context, ++progress, undefined, JSON.stringify(metaData));
|
|
2247
|
+
}
|
|
2248
|
+
catch (progressError) {
|
|
2249
|
+
console.warn('Failed to send progress update:', progressError);
|
|
2250
|
+
}
|
|
2251
|
+
},
|
|
2252
|
+
});
|
|
2253
|
+
if (res.url) {
|
|
2254
|
+
const uri = await saveMaterial(currentSession, res.url, saveToFileName);
|
|
2255
|
+
// Update media_logs.json
|
|
2256
|
+
try {
|
|
2257
|
+
await updateMediaLogs(currentSession, saveToFileName, res, 'audio');
|
|
2258
|
+
}
|
|
2259
|
+
catch (error) {
|
|
2260
|
+
console.warn(`Failed to update media_logs.json for ${saveToFileName}:`, error);
|
|
2261
|
+
}
|
|
2262
|
+
return {
|
|
2263
|
+
content: [
|
|
2264
|
+
{
|
|
2265
|
+
type: 'text',
|
|
2266
|
+
text: JSON.stringify({
|
|
2267
|
+
success: true,
|
|
2268
|
+
uri,
|
|
2269
|
+
source: res.url,
|
|
2270
|
+
duration: res.duration,
|
|
2271
|
+
}),
|
|
2272
|
+
},
|
|
2273
|
+
],
|
|
2274
|
+
};
|
|
2275
|
+
}
|
|
2276
|
+
return {
|
|
2277
|
+
content: [
|
|
2278
|
+
{
|
|
2279
|
+
type: 'text',
|
|
2280
|
+
text: JSON.stringify(res),
|
|
2281
|
+
},
|
|
2282
|
+
],
|
|
2283
|
+
};
|
|
2284
|
+
}
|
|
2285
|
+
catch (error) {
|
|
2286
|
+
return createErrorResponse(error, 'wait-for-workflow-finish');
|
|
2287
|
+
}
|
|
2288
|
+
});
|
|
2203
2289
|
server.registerTool('generate-sound-effect', {
|
|
2204
2290
|
title: 'Generate Sound Effect',
|
|
2205
2291
|
description: 'Generate sound effect with text prompt.',
|
|
@@ -4208,163 +4294,182 @@ server.registerTool('run-ffmpeg-command', {
|
|
|
4208
4294
|
return createErrorResponse(error, 'run-ffmpeg-command');
|
|
4209
4295
|
}
|
|
4210
4296
|
});
|
|
4211
|
-
server.registerTool(
|
|
4212
|
-
|
|
4213
|
-
|
|
4214
|
-
|
|
4215
|
-
|
|
4216
|
-
|
|
4217
|
-
|
|
4218
|
-
|
|
4219
|
-
|
|
4220
|
-
|
|
4221
|
-
|
|
4222
|
-
|
|
4223
|
-
|
|
4224
|
-
|
|
4225
|
-
|
|
4226
|
-
|
|
4227
|
-
|
|
4228
|
-
|
|
4229
|
-
|
|
4230
|
-
|
|
4231
|
-
|
|
4232
|
-
|
|
4233
|
-
|
|
4234
|
-
|
|
4235
|
-
|
|
4236
|
-
|
|
4237
|
-
|
|
4238
|
-
|
|
4239
|
-
|
|
4240
|
-
|
|
4241
|
-
|
|
4242
|
-
|
|
4243
|
-
|
|
4244
|
-
|
|
4245
|
-
|
|
4246
|
-
|
|
4247
|
-
|
|
4248
|
-
|
|
4249
|
-
|
|
4250
|
-
|
|
4251
|
-
|
|
4252
|
-
|
|
4253
|
-
|
|
4254
|
-
|
|
4255
|
-
|
|
4256
|
-
|
|
4257
|
-
|
|
4258
|
-
|
|
4259
|
-
|
|
4260
|
-
|
|
4261
|
-
|
|
4262
|
-
|
|
4263
|
-
|
|
4264
|
-
|
|
4265
|
-
|
|
4266
|
-
|
|
4267
|
-
|
|
4268
|
-
|
|
4269
|
-
|
|
4270
|
-
|
|
4271
|
-
|
|
4272
|
-
|
|
4273
|
-
|
|
4274
|
-
|
|
4275
|
-
|
|
4276
|
-
|
|
4277
|
-
|
|
4278
|
-
|
|
4279
|
-
|
|
4280
|
-
|
|
4281
|
-
|
|
4282
|
-
|
|
4283
|
-
|
|
4284
|
-
|
|
4285
|
-
|
|
4286
|
-
|
|
4287
|
-
|
|
4288
|
-
|
|
4289
|
-
|
|
4290
|
-
|
|
4291
|
-
|
|
4292
|
-
|
|
4293
|
-
|
|
4294
|
-
|
|
4295
|
-
|
|
4296
|
-
|
|
4297
|
-
|
|
4298
|
-
|
|
4299
|
-
|
|
4300
|
-
|
|
4301
|
-
|
|
4302
|
-
|
|
4303
|
-
|
|
4304
|
-
|
|
4305
|
-
|
|
4306
|
-
|
|
4307
|
-
|
|
4308
|
-
|
|
4309
|
-
|
|
4310
|
-
|
|
4311
|
-
|
|
4312
|
-
|
|
4313
|
-
|
|
4314
|
-
|
|
4315
|
-
|
|
4316
|
-
|
|
4317
|
-
|
|
4318
|
-
|
|
4319
|
-
|
|
4320
|
-
|
|
4321
|
-
|
|
4322
|
-
|
|
4323
|
-
|
|
4324
|
-
|
|
4325
|
-
|
|
4326
|
-
|
|
4327
|
-
|
|
4328
|
-
|
|
4329
|
-
|
|
4330
|
-
|
|
4331
|
-
|
|
4332
|
-
|
|
4333
|
-
|
|
4334
|
-
|
|
4335
|
-
|
|
4336
|
-
|
|
4337
|
-
|
|
4338
|
-
|
|
4339
|
-
|
|
4340
|
-
|
|
4341
|
-
|
|
4342
|
-
|
|
4343
|
-
|
|
4344
|
-
|
|
4345
|
-
|
|
4346
|
-
|
|
4347
|
-
|
|
4348
|
-
|
|
4349
|
-
|
|
4350
|
-
|
|
4351
|
-
|
|
4352
|
-
|
|
4353
|
-
|
|
4354
|
-
|
|
4355
|
-
|
|
4356
|
-
|
|
4357
|
-
|
|
4358
|
-
|
|
4359
|
-
|
|
4360
|
-
|
|
4361
|
-
|
|
4362
|
-
|
|
4363
|
-
|
|
4364
|
-
|
|
4365
|
-
|
|
4366
|
-
|
|
4367
|
-
}
|
|
4297
|
+
// server.registerTool(
|
|
4298
|
+
// 'custom-edit-draft',
|
|
4299
|
+
// {
|
|
4300
|
+
// title: 'Custom Edit Draft',
|
|
4301
|
+
// description:
|
|
4302
|
+
// 'Launch timeline editor server for custom draft editing. Starts a local server at specified port with draft file configuration.',
|
|
4303
|
+
// inputSchema: {
|
|
4304
|
+
// draftContentFileName: z
|
|
4305
|
+
// .string()
|
|
4306
|
+
// .optional()
|
|
4307
|
+
// .default('draft_content.json')
|
|
4308
|
+
// .describe('Draft content filename (default: draft_content.json)'),
|
|
4309
|
+
// port: z
|
|
4310
|
+
// .number()
|
|
4311
|
+
// .optional()
|
|
4312
|
+
// .default(6789)
|
|
4313
|
+
// .describe('Server port (default: 6789)'),
|
|
4314
|
+
// },
|
|
4315
|
+
// },
|
|
4316
|
+
// async ({ draftContentFileName = 'draft_content.json', port = 6789 }) => {
|
|
4317
|
+
// try {
|
|
4318
|
+
// // 使用项目本地目录
|
|
4319
|
+
// const workDir = resolve(
|
|
4320
|
+
// process.env.ZEROCUT_PROJECT_CWD || process.cwd(),
|
|
4321
|
+
// projectLocalDir
|
|
4322
|
+
// );
|
|
4323
|
+
// // 检查 draft_content.json 文件是否存在
|
|
4324
|
+
// const draftFilePath = resolve(workDir, draftContentFileName);
|
|
4325
|
+
// if (!existsSync(draftFilePath)) {
|
|
4326
|
+
// return createErrorResponse(
|
|
4327
|
+
// new Error(
|
|
4328
|
+
// `Draft content file not found: ${draftContentFileName}. Please generate draft content first using the generate-draft-content tool.`
|
|
4329
|
+
// ),
|
|
4330
|
+
// 'custom-edit-draft'
|
|
4331
|
+
// );
|
|
4332
|
+
// }
|
|
4333
|
+
// // 备份原始的 draft_content.json 文件
|
|
4334
|
+
// const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
4335
|
+
// const backupFileName = `${draftContentFileName}.backup.${timestamp}`;
|
|
4336
|
+
// const backupFilePath = resolve(workDir, backupFileName);
|
|
4337
|
+
// try {
|
|
4338
|
+
// const { copyFileSync } = await import('fs');
|
|
4339
|
+
// copyFileSync(draftFilePath, backupFilePath);
|
|
4340
|
+
// console.log(`Draft file backed up to: ${backupFileName}`);
|
|
4341
|
+
// } catch (backupError) {
|
|
4342
|
+
// console.warn(`Failed to backup draft file: ${backupError}`);
|
|
4343
|
+
// // 继续执行,不因备份失败而中断
|
|
4344
|
+
// }
|
|
4345
|
+
// // 构建启动命令参数
|
|
4346
|
+
// const timelineEditorPath = resolve(
|
|
4347
|
+
// __dirname,
|
|
4348
|
+
// '../../../dist/timeline-editor/index.js'
|
|
4349
|
+
// );
|
|
4350
|
+
// console.log(`Starting timeline editor server...`);
|
|
4351
|
+
// console.log(`Working directory: ${workDir}`);
|
|
4352
|
+
// console.log(`Draft file: ${draftContentFileName}`);
|
|
4353
|
+
// console.log(`Server port: ${port}`);
|
|
4354
|
+
// console.log(`Timeline editor path: ${timelineEditorPath}`);
|
|
4355
|
+
// // 检查端口是否被占用,如果被占用则停止占用的进程
|
|
4356
|
+
// if (await isPortInUse(port)) {
|
|
4357
|
+
// console.log(`Port ${port} is in use, killing existing processes...`);
|
|
4358
|
+
// await killPortProcess(port);
|
|
4359
|
+
// }
|
|
4360
|
+
// // 直接启动服务器进程
|
|
4361
|
+
// const platform = os.platform();
|
|
4362
|
+
// const nodeCommand = platform === 'win32' ? 'node.exe' : 'node';
|
|
4363
|
+
// const serverProcess = spawn(
|
|
4364
|
+
// nodeCommand,
|
|
4365
|
+
// [
|
|
4366
|
+
// timelineEditorPath,
|
|
4367
|
+
// '--draft-file',
|
|
4368
|
+
// draftContentFileName,
|
|
4369
|
+
// '--project-dir',
|
|
4370
|
+
// workDir,
|
|
4371
|
+
// '--port',
|
|
4372
|
+
// port.toString(),
|
|
4373
|
+
// ],
|
|
4374
|
+
// {
|
|
4375
|
+
// cwd: workDir,
|
|
4376
|
+
// stdio: 'pipe',
|
|
4377
|
+
// shell: platform === 'win32', // 在 Windows 下使用 shell
|
|
4378
|
+
// }
|
|
4379
|
+
// );
|
|
4380
|
+
// const serverUrl = `http://localhost:${port}`;
|
|
4381
|
+
// // 等待服务器启动 - 使用健康检查 API 轮询
|
|
4382
|
+
// await new Promise((resolve, reject) => {
|
|
4383
|
+
// const timeout = setTimeout(() => {
|
|
4384
|
+
// reject(new Error('Server startup timeout'));
|
|
4385
|
+
// }, 30000); // 增加超时时间到30秒
|
|
4386
|
+
// const checkHealth = async () => {
|
|
4387
|
+
// try {
|
|
4388
|
+
// const healthUrl = `${serverUrl}/health`;
|
|
4389
|
+
// const req = http.get(healthUrl, (res: any) => {
|
|
4390
|
+
// let data = '';
|
|
4391
|
+
// res.on('data', (chunk: any) => {
|
|
4392
|
+
// data += chunk;
|
|
4393
|
+
// });
|
|
4394
|
+
// res.on('end', () => {
|
|
4395
|
+
// try {
|
|
4396
|
+
// const healthData = JSON.parse(data);
|
|
4397
|
+
// if (healthData.status === 'ok') {
|
|
4398
|
+
// clearTimeout(timeout);
|
|
4399
|
+
// console.log('Server health check passed');
|
|
4400
|
+
// resolve(void 0);
|
|
4401
|
+
// } else {
|
|
4402
|
+
// // 继续轮询
|
|
4403
|
+
// setTimeout(checkHealth, 1000);
|
|
4404
|
+
// }
|
|
4405
|
+
// } catch (parseError) {
|
|
4406
|
+
// // 继续轮询
|
|
4407
|
+
// setTimeout(checkHealth, 1000);
|
|
4408
|
+
// }
|
|
4409
|
+
// });
|
|
4410
|
+
// });
|
|
4411
|
+
// req.on('error', () => {
|
|
4412
|
+
// // 服务器还未启动,继续轮询
|
|
4413
|
+
// setTimeout(checkHealth, 1000);
|
|
4414
|
+
// });
|
|
4415
|
+
// req.setTimeout(2000, () => {
|
|
4416
|
+
// req.destroy();
|
|
4417
|
+
// // 继续轮询
|
|
4418
|
+
// setTimeout(checkHealth, 1000);
|
|
4419
|
+
// });
|
|
4420
|
+
// } catch (error) {
|
|
4421
|
+
// // 继续轮询
|
|
4422
|
+
// setTimeout(checkHealth, 1000);
|
|
4423
|
+
// }
|
|
4424
|
+
// };
|
|
4425
|
+
// serverProcess.stdout?.on('data', (data: any) => {
|
|
4426
|
+
// console.log('Server output:', data.toString());
|
|
4427
|
+
// });
|
|
4428
|
+
// serverProcess.stderr?.on('data', (data: any) => {
|
|
4429
|
+
// console.error('Server error:', data.toString());
|
|
4430
|
+
// });
|
|
4431
|
+
// serverProcess.on('error', (error: any) => {
|
|
4432
|
+
// clearTimeout(timeout);
|
|
4433
|
+
// reject(error);
|
|
4434
|
+
// });
|
|
4435
|
+
// // 开始健康检查轮询
|
|
4436
|
+
// setTimeout(checkHealth, 2000); // 2秒后开始第一次检查
|
|
4437
|
+
// });
|
|
4438
|
+
// return {
|
|
4439
|
+
// content: [
|
|
4440
|
+
// {
|
|
4441
|
+
// type: 'text',
|
|
4442
|
+
// text: JSON.stringify(
|
|
4443
|
+
// {
|
|
4444
|
+
// success: true,
|
|
4445
|
+
// message: 'Timeline editor server started successfully',
|
|
4446
|
+
// serverUrl: serverUrl,
|
|
4447
|
+
// draftFile: draftContentFileName,
|
|
4448
|
+
// backupFile: backupFileName,
|
|
4449
|
+
// projectDirectory: workDir,
|
|
4450
|
+
// port: port,
|
|
4451
|
+
// pid: serverProcess.pid,
|
|
4452
|
+
// instructions: [
|
|
4453
|
+
// `Timeline editor is now running at: ${serverUrl}`,
|
|
4454
|
+
// 'Open the URL in your browser to edit the draft',
|
|
4455
|
+
// 'The server will automatically save changes to the draft file',
|
|
4456
|
+
// `Original draft file has been backed up as: ${backupFileName}`,
|
|
4457
|
+
// `Server process ID: ${serverProcess.pid}`,
|
|
4458
|
+
// 'The server will continue running in the background',
|
|
4459
|
+
// ],
|
|
4460
|
+
// },
|
|
4461
|
+
// null,
|
|
4462
|
+
// 2
|
|
4463
|
+
// ),
|
|
4464
|
+
// },
|
|
4465
|
+
// ],
|
|
4466
|
+
// };
|
|
4467
|
+
// } catch (error) {
|
|
4468
|
+
// console.error('Error starting timeline editor:', error);
|
|
4469
|
+
// return createErrorResponse(error, 'custom-edit-draft');
|
|
4470
|
+
// }
|
|
4471
|
+
// }
|
|
4472
|
+
// );
|
|
4368
4473
|
async function run() {
|
|
4369
4474
|
// Start receiving messages on stdin and sending messages on stdout
|
|
4370
4475
|
const transport = new stdio_js_1.StdioServerTransport();
|