// dsh-plugin-mcn 配置常量(拆分自 index.js,纯常量无业务逻辑) import { homedir } from "node:os"; import { join, isAbsolute, resolve } from "node:path"; import { readFileSync, existsSync } from "node:fs"; const DB_PATH = join(homedir(), ".dsh", "mcn-plugin.db"); // 数据预览统计缓存(60s TTL,避免每次从数据库刷新) const STATS_TTL = 60 * 1000; // 创作专用会话:固定命名,已存在则复用 const CREATIVE_SESSION_ID = "dsh_short-video-script"; // 创作 agent 的模型配置(与 web profile 默认一致,避免 {{model}} 变量无值) const CREATIVE_PROVIDER = "deepseek-official"; const CREATIVE_MODEL = "deepseek-v4-flash"; const MCP_PACKAGE = "myai-mcp"; const MCP_ENV = { MYAI_ENV: "prod", MYAI_API_BASE_URL: "https://maiya-trans.youmanvideo.com/api", MYAI_FEISHU_APP_ID: "cli_a84d0a47f93e1013", MYAI_VOD_URL_PREFIX: "https://maiya-ai-fileup.youmanvideo.com", MYAI_VOD_SPACE_NAME: "maiya-ai", }; const NPX_CMD = process.platform === "win32" ? '"D:\\Program Files\\nodejs\\npx.cmd"' : "npx"; function resolveCreativeCwd() { try { const raw = readFileSync(join(homedir(), ".dsh", "storages", "workspace.json"), "utf8"); const data = JSON.parse(raw); const workspaces = data?.tables?.workspaces; if (workspaces) { const candidates = Object.values(workspaces) .filter((ws) => typeof ws?.path === "string" && existsSync(ws.path)) .sort((a, b) => String(a.path).split(/[\\/]/).length - String(b.path).split(/[\\/]/).length); if (candidates.length > 0) return candidates[0].path; } } catch (e) { /* fall through */ } return "D:\\dshworkspace"; } /** 并发浏览器任务隔离:调试 Chrome 端口池(需预启动对应实例),按会话 id 稳定分配。 * 导入/刷新等浏览器类任务各自使用独立端口,避免多个 AI 会话抢同一 Chrome。 */ const CHROME_PORTS = [9223, 9224, 9225]; const IMPORT_PREFIX = "dsh_import-"; const REFRESH_PREFIX = "dsh_refresh-"; const VIDEO_ANALYZE_PREFIX = "dsh_video-analyze-"; const REWRITE_PREFIX = "dsh_rewrite-"; const PERSONA_PREFIX = "dsh_persona-"; const STORYBOARD_PREFIX = "dsh_storyboard-"; const REVIEW_PREFIX = "dsh_review-"; // 账号数据分析会话前缀(V1.0 同步:账号详情「数据分析」tab 任务,每账号独立会话,归「解析任务」分组) const ACCT_ANALYSIS_PREFIX = "dsh_acctana-"; const VIDEO_ANALYZE_MAX_CONCURRENT = 8; const REWRITE_MAX_CONCURRENT = 8; const STORYBOARD_MAX_CONCURRENT = 8; const REVIEW_MAX_CONCURRENT = 4; const MAX_UNGROUPED = 10; const SESSION_ACTIVE_WINDOW_MS = 15 * 60 * 1000; // MCN 任务会话自动删除:最后活动时间距今超过该时长(24h)且不在运行中的 dsh_* 会话,物理删除会话记录 const SESSION_RETENTION_MS = 24 * 60 * 60 * 1000; // ---- 榜单更新任务(同步 V1.0 工作台 09-03 机制:30min 防重复更新窗口,可 force 跳过;红狐 API 按次计费)---- const RANK_UPDATE_COOLDOWN_MS = 30 * 60 * 1000; // 榜单更新专用会话(固定命名,与创作会话同模式:已存在复用、followup 触发) const RANK_SESSION_ID = "dsh_rank-update"; // 榜单更新元数据(跨重启持久化:lastAt/running/lastOk/lastError) const RANK_META_FILE = join(homedir(), ".dsh", "mcn-rank-update.json"); // 榜单更新任务超时兜底:提交超过该时长仍标记 running → 视为中断(自愈置回空闲) const RANK_TASK_MAX_MS = 60 * 60 * 1000; /** 赛道标准枚举(28 个标准,其中「化妆美容」统一为「美妆」+ 剧情 1 个用户指定保留,共 29 个;权威定义见 dsh-plugin-dev/references/赛道标准枚举.md 与技能 SKILL.md) */ const STANDARD_TRACKS = [ "个人才艺", "生活vlog", "财富理财", "二次元", "居家装修", "学习教育", "小剧场", "数码科技", "旅行", "美食", "美妆", "动物", "亲子", "汽车", "情感", "三农", "健康医学", "潮流风尚", "舞蹈才艺", "颜值造型", "人文", "音乐", "影视", "身体锻炼", "体育", "明星娱乐", "游戏", "其他", "剧情", ]; export { DB_PATH, STATS_TTL, CREATIVE_SESSION_ID, CREATIVE_PROVIDER, CREATIVE_MODEL, MCP_PACKAGE, MCP_ENV, NPX_CMD, CHROME_PORTS, IMPORT_PREFIX, REFRESH_PREFIX, VIDEO_ANALYZE_PREFIX, REWRITE_PREFIX, PERSONA_PREFIX, STORYBOARD_PREFIX, REVIEW_PREFIX, ACCT_ANALYSIS_PREFIX, VIDEO_ANALYZE_MAX_CONCURRENT, REWRITE_MAX_CONCURRENT, STORYBOARD_MAX_CONCURRENT, REVIEW_MAX_CONCURRENT, MAX_UNGROUPED, SESSION_ACTIVE_WINDOW_MS, SESSION_RETENTION_MS, STANDARD_TRACKS, resolveCreativeCwd, RANK_UPDATE_COOLDOWN_MS, RANK_SESSION_ID, RANK_META_FILE, RANK_TASK_MAX_MS, };