/* v24: 手机全屏操作台(桌面 studio_card 同链路移植) 1) mksOpenModule(item) —— 应用市场卡片全屏入口(按 type 分发) 2) 模仿创作/爆款二创/解析提取/PPT 制作 —— 桌面同字段表单 + 上传 3) 执行器 mksRun —— dispatch(frontend_content_coordinator_agent, task_type:'studio_card') 4) API Key 管理(Bearer user_token = 带用户身份生成) 5) 其他类型(studio/resources/url/chat) 先行引导 命名统一 mks 前缀,避免与旧全局函数冲突。 */ (function () { 'use strict'; if (window.__mobV24) return; window.__mobV24 = true; var API = 'https://api-gateway.duoweiying.cn'; function $(id) { return document.getElementById(id); } function uidV24() { var u = null; try { u = JSON.parse(localStorage.getItem('user_info') || '{}'); } catch (e) {} return (u && (u.id || u.username)) || localStorage.getItem('user_id') || 'anonymous'; } function escH(s) { return String(s == null ? '' : s).replace(/[&<>"']/g, function (c) { return { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c]; }); } function mksTip(t) { try { var o = $('mksTip'); if (o) o.remove(); var d = document.createElement('div'); d.id = 'mksTip'; d.style.cssText = 'position:fixed;left:50%;bottom:120px;transform:translateX(-50%);z-index:48000;background:#0f172a;color:#fff;font-size:13px;padding:9px 16px;border-radius:18px;max-width:84%;text-align:center;'; d.textContent = t; document.body.appendChild(d); setTimeout(function () { d.remove(); }, 2600); } catch (e) {} } /* ============ 全屏操作台壳 ============ */ var MKS = {}; // 跨步骤临时存储(上传 URL 等) function mksOpen(title, bodyHtml) { mksClose(); var p = document.createElement('div'); p.id = 'mksPage'; p.style.cssText = 'position:fixed;inset:0;z-index:45000;background:#f1f5f9;display:flex;flex-direction:column;'; p.innerHTML = '
' + '' + '
' + escH(title) + '
' + '
'; document.body.appendChild(p); $('mksBack').onclick = function () { mksClose(); }; $('mksBody').innerHTML = bodyHtml; return $('mksBody'); } function mksClose() { var p = $('mksPage'); if (p) p.remove(); } function mksField(label, inner) { return '
' + label + '
' + inner + '
'; } function mksInput(id, ph, type) { return ''; } function mksSelect(id, opts) { return ''; } function mksArea(id, ph) { return ''; } /* WR-551: 上传按钮此前给 input 强制 capture=environment -> 手机上只能直接开相机, 无法从相册/文件里选视频,用户就传不了素材做「模仿/二创/解析」。 现改为:默认「选择文件」(不带 capture,手机弹选择器:相册/文件/相机) + 额外一个「拍照/录像」。 */ function mksUploadBtn(acc, kind, key, label) { var _cam = (kind === 'video' || kind === 'image'); return '
' + '' + (_cam ? '' : '') + '未上传
' + '
'; } /* WR-562k16: 内嵌素材区勾选回调(写 MKS, 与上传后等价) */ window.mksSetFile = function (key, url, name) { try { if (!url) return; MKS[key] = url; var sp = $('mksUp_' + key); if (sp) { sp.textContent = '\u2705 已选用:' + String(name || '').substring(0, 18); sp.style.color = '#16a34a'; } mksTip('\u2705 已选用「文件管理」里的素材'); } catch (e) {} }; function mksBtn(id, label, color) { return ''; } function mksResult() { return ''; } /* WR-562k14 从文件管理选择: 直接复用「我的 → 文件管理」里的素材(同一份数据), 不再只能重新上传。选中后写进 MKS[key], 与 mksUp 上传后的效果完全一致。 */ /* WR-562k15: 与「我的 → 文件管理」完全同源(并集: file_records + 素材库 + 生成的视频), 选中后写进 MKS[key], 与 mksUp 上传后的效果完全一致。 */ window.mksPickFiles = function (kind, key) { try { if (!window.wrChoose) { mksTip('页面需刷新后才能使用(缺少选择器组件)'); return; } var cat = (kind === 'video') ? 'video' : (kind === 'image') ? 'image' : (kind === 'document') ? 'document' : ''; mksTip('\u23f3 正在读取「文件管理」…'); var jobs = []; jobs.push(fetch(API + '/api/files/list?user_id=' + encodeURIComponent(uidV24()) + '&category=' + encodeURIComponent(cat) + '&page_size=100&_t=' + Date.now()) .then(function (r) { return r.json().catch(function () { return {}; }); }) .then(function (d) { return ((d && d.files) || []).map(function (x) { return { name: String(x.file_name || '文件'), folder: x.folder || '', size: x.file_size || 0, url: String(x.file_url || x.url || '') }; }); }).catch(function () { return []; })); jobs.push(fetch(API + '/ai-army/materials?user_id=' + encodeURIComponent(uidV24()) + (cat ? ('&material_type=' + encodeURIComponent(cat)) : '') + '&limit=100&_t=' + Date.now()) .then(function (r) { return r.json().catch(function () { return {}; }); }) .then(function (d) { return ((d && (d.data || d.materials || d.items)) || []).map(function (m) { return { name: String(m.name || m.filename || '文件'), folder: '', size: m.file_size || 0, url: String(m.url || m.file_path || '') }; }); }).catch(function () { return []; })); if (kind === 'video') { jobs.push(fetch(API + '/ai-army/user-resources?user_id=' + encodeURIComponent(uidV24()) + '&types=video&_t=' + Date.now()) .then(function (r) { return r.json().catch(function () { return {}; }); }) .then(function (d) { return ((d && d.video) || []).map(function (v) { return { name: String(v.title || ('视频_' + String(v.id || ''))), folder: '', size: 0, url: mksAbs(v.url) }; }); }).catch(function () { return []; })); } Promise.all(jobs) .then(function (lists) { var items = [], seen = {}; lists.forEach(function (l) { (l || []).forEach(function (x) { if (!x || !x.url) return; if (seen[x.url]) return; seen[x.url] = 1; items.push(x); }); }); if (!items.length) { mksTip('「文件管理」里还没有可用的' + (kind === 'video' ? '视频' : kind === 'image' ? '图片' : '文件') + ',请先到文件管理上传素材'); return; } var opts = items.slice(0, 80).map(function (x) { var sz = x.size ? (Math.round(x.size / 1048576 * 10) / 10) + 'MB' : ''; var fd = x.folder ? ('📁' + x.folder + ' ') : ''; return { label: String(x.name || '文件'), hint: fd + sz, value: String(x.url) }; }); return window.wrChoose('从「文件管理」选择素材(共 ' + opts.length + ' 个)', opts).then(function (v) { if (!v) return; MKS[key] = v; var sp = $('mksUp_' + key); if (sp) { sp.textContent = '\u2705 已从文件管理选择'; sp.style.color = '#16a34a'; } mksTip('\u2705 已从文件管理选择素材'); }); }) .catch(function () { mksTip('读取「文件管理」失败,请重试'); }); } catch (e) {} }; window.mksUp = function (kind, key, mode) { try { var old = $('mksFile'); if (old) old.remove(); var i = document.createElement('input'); i.id = 'mksFile'; i.type = 'file'; i.accept = kind === 'video' ? 'video/*' : (kind === 'document' ? '.doc,.docx,.md,.txt,.pdf,.ppt,.pptx' : 'image/*'); if (mode === 'camera' && (kind === 'video' || kind === 'image')) { i.setAttribute('capture', 'environment'); i.capture = 'environment'; } /* WR-551: 只有拍照/录像才强制相机 */ i.style.display = 'none'; document.body.appendChild(i); i.onchange = function () { var f = i.files && i.files[0]; if (!f) return; mksTip('⏳ 上传中…'); var fd = new FormData(); fd.append('file', f); fetch(API + '/ai-army/upload?user_id=' + encodeURIComponent(uidV24()) + '&material_type=' + kind, { method: 'POST', body: fd }) .then(function (r) { return r.json().catch(function () { return {}; }); }) .then(function (d) { var url = d && (d.url || (d.data && d.data.url) || d.file_path); if (!url) { mksTip('上传失败,请重试'); return; } MKS[key] = url; var sp = $('mksUp_' + key); if (sp) { sp.textContent = '✅ 已上传'; sp.style.color = '#16a34a'; } mksTip('✅ 上传成功'); }).catch(function () { mksTip('上传网络错误'); }); }; i.click(); } catch (e) {} }; /* ===== WR-529C: 出片结果渲染 + 素材上下文 + 任务轮询 ===== */ function mksAbs(u) { u = String(u || ''); if (!u) return u; var low = u.toLowerCase(); if (low.indexOf('http') === 0 || low.indexOf('//') === 0 || low.indexOf('data:') === 0 || low.indexOf('blob:') === 0) return u; if (u.charAt(0) === '/') return 'https://console.duoweiying.cn' + u; return u; } function mksIsVideo(s) { s = String(s || '').toLowerCase().split('?')[0]; return /.mp4$|.mov$|.webm$|.m4v$|.avi$|.mkv$/.test(s); } function mksMats(keys) { var ks = keys || ['ref', 'avatar_img', 'ref2', 'ref3', 'ppt', 'v', 'p', 'm']; var out = []; for (var i = 0; i < ks.length; i++) { var u = MKS[ks[i]]; if (!u) continue; var s = String(u); out.push({ url: s, name: ks[i], kind: mksIsVideo(s) ? 'video' : 'image', role: 'material' }); } return out; } function mksFindVideos(d) { var out = [], seen = {}; function push(v) { if (typeof v === 'string' && v) { var u = mksAbs(v); if (!seen[u]) { seen[u] = 1; out.push(u); } } else if (v && typeof v === 'object' && v.url) push(v.url); } try { var r = (d && d.result) || {}, rd = r.data || {}, gd = (d && d.data) || {}; push(d && d.video_url); push(r.video_url); push(rd.video_url); push(gd.video_url); var arrs = [gd.videos, gd.video_urls, rd.videos, rd.video_urls, r.videos]; for (var i = 0; i < arrs.length; i++) { if (Object.prototype.toString.call(arrs[i]) === '[object Array]') arrs[i].forEach(push); } } catch (e) {} return out; } function mksShowResult(box, txt, d) { var vids = mksFindVideos(d); var html = escH(String(txt || '').substring(0, 4000)); if (vids.length) { html += vids.map(function (u) { return '
' + '
' + '' + '' + '
'; }).join(''); html += '
成片已自动归档到「我的 → 文件管理 → 视频」。
'; } var needConfirm = !!(d && (d.needs_confirm || (d.result && d.result.data && d.result.data.needs_confirm))); if (needConfirm) { html += '
' + '' + '
'; } box.style.display = 'block'; box.innerHTML = html; try { box.setAttribute('data-txt', String(txt || '').substring(0, 1500)); } catch (e) {} try { box.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); } catch (e) {} box.onclick = function (e) { var tg = e.target || {}; var sv = tg.getAttribute && tg.getAttribute('data-save'); var sh = tg.getAttribute && tg.getAttribute('data-share'); var cf = tg.getAttribute && tg.getAttribute('data-cf'); if (cf) { if (window.mksRun) window.mksRun(cf, mksMats(), 'video_generation'); return; } if (sv) mksDownload(sv, '成片.mp4'); else if (sh) mksShare(sh); }; var tid = (d && (d.task_id || (d.result && d.result.task_id) || (d.data && d.data.task_id))) || ''; if (!vids.length && tid) mksPollTask(tid, box, 0); } function mksDownload(url, name) { mksTip('⏳ 保存中…'); fetch(url).then(function (r) { return r.blob(); }).then(function (b) { var a = document.createElement('a'); a.href = URL.createObjectURL(b); a.download = String(name || 'video.mp4').replace(/[^0-9A-Za-z._-]/g, '_'); document.body.appendChild(a); a.click(); a.remove(); setTimeout(function () { try { URL.revokeObjectURL(a.href); } catch (e) {} }, 4000); mksTip('💾 已保存'); }).catch(function () { mksTip('保存失败,请长按视频另存'); }); } function mksShare(url) { try { if (navigator.share) { navigator.share({ title: 'AI 成片', url: url }); return; } } catch (e) {} try { navigator.clipboard.writeText(url).then(function () { mksTip('🔗 链接已复制'); }, function () { mksTip(url); }); } catch (e) { mksTip(url); } } function mksPollTask(tid, box, tries) { tries = tries || 0; if (!tid || tries > 90) return; fetch(API + '/ai-army/tasks/' + encodeURIComponent(tid) + '?_t=' + Date.now()) .then(function (r) { return r.json().catch(function () { return {}; }); }) .then(function (d) { if (mksFindVideos(d).length) { mksShowResult(box, '✅ 出片完成', d); return; } var st = String((d && (d.status || (d.data && d.data.status))) || ''); if (st === 'failed') { mksShowResult(box, '❌ 出片失败:' + String((d && (d.error || d.message)) || '').substring(0, 300), d); return; } box.style.display = 'block'; box.innerHTML = '
⏳ 出片中(第 ' + (tries + 1) + ' 次轮询…)
' + escH(String(box.getAttribute('data-txt') || '').substring(0, 1200)); setTimeout(function () { mksPollTask(tid, box, tries + 1); }, 8000); }) .catch(function () { setTimeout(function () { mksPollTask(tid, box, tries + 1); }, 8000); }); } window.mksRun = function (promptTxt, mats, taskType) { var _k = (window.__mksCurItem && window.__mksCurItem.id) || ''; if (window.dwyGateCheck) { window.dwyGateCheck(_k, function (ok) { if (ok) { window.__mksRunRaw(promptTxt, mats, taskType); } }); return; } window.__mksRunRaw(promptTxt, mats, taskType); }; window.__mksRunRaw = function (promptTxt, mats, taskType) { var box = $('mksResult'); if (box) { box.style.display = 'block'; box.innerHTML = '⏳ AI 员工接收任务中…'; box.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); } fetch(API + '/ai-army/dispatch?agent_id=frontend_content_coordinator_agent', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ user_input: promptTxt, user_id: uidV24(), task_type: (taskType || 'chat'), ai_context: { materials: (mats || mksMats()) } }) }) .then(function (res) { return res.json().catch(function () { return {}; }); }) .then(function (d) { var txt = ''; if (d && d.result) { var rr = d.result; txt = rr.reply || rr.response || rr.summary || rr.message || ''; if (!txt && rr.execution_results && rr.execution_results.length) txt = rr.execution_results.map(function (x) { return (x.summary || x.output || JSON.stringify(x)).substring(0, 400); }).join('\n\n'); if (!txt) txt = JSON.stringify(rr).substring(0, 800); } else { txt = (d && d.message) || (d && d.response) || '任务已完成(详见通知中心/执行记录)'; } if (box) { mksShowResult(box, txt, d); } }).catch(function (e) { if (box) { box.style.display = 'block'; box.innerHTML = '执行失败:' + escH(e.message) + ''; } }); }; window.mksVal = function (id) { var el = $(id); return el ? el.value.trim() : ''; }; window.mksChk = function (id) { var el = $(id); return !!(el && el.checked); }; function mkExec(id, label, color) { return mksBtn(id, label, color); } /* ============ 工具:模仿创作 ============ */ function openImitate() { var b = mksOpen('🎭 模仿创作', mksField('① 参考视频(可选:上传想模仿风格的视频)', mksUploadBtn('video', 'video', 'ref', '📁 上传视频')) + mksField('② 数字人形象(可选:上传自己的形象照片,或选预设)', mksSelect('mkAvatar', ['商务专业人士', '知识讲师', '直播主播', '温柔女声解说', '磁性男声解说']) + '
' + mksUploadBtn('image', 'image', 'avatar_img', '🖼️ 上传我的形象') + '
') + mksField('③ 场景背景', mksSelect('mkScene', ['专业演播室', '简约办公室', '户外街景', '科技感纯色背景', '家居生活场景'])) + mksField('④ 文案需求(必填)', mksArea('mkScript', '描述你想生成的视频内容/口播文案,例如:介绍一款智能保温杯的卖点,语气亲切…')) + mkExec('mkRunI', '🚀 生成视频') + mksResult()); $('mkRunI').onclick = function () { var s = mksVal('mkScript'); if (!s) { mksTip('请填写文案需求'); return; } var ref = MKS.ref || '无参考视频'; mksRun('【模仿创作】请按以下需求生成视频内容方案(含分镜口播稿与画面建议):\n参考视频:' + String(ref).substring(0, 300) + '\n数字人形象:' + mksVal('mkAvatar') + '\n场景背景:' + mksVal('mkScene') + '\n文案需求:' + s); }; } /* ============ 工具:爆款二创 ============ */ function openRemake() { mksOpen('🔥 爆款二创', mksField('① 爆款视频来源', mksUploadBtn('video', 'video', 'ref2', '📁 上传视频') + '
' + mksInput('mkRefUrl2', '或粘贴爆款视频链接') + '
') + mksField('② 二创方向(可选)', mksInput('mkRemixDir', '如:改成搞笑风格 / 提炼干货要点 / 换个目标人群')) + mksField('③ 数字人形象', mksSelect('mkAvatar2', ['商务专业人士', '知识讲师', '直播主播', '温柔女声解说', '磁性男声解说'])) + '
流程:解析视频 → 提取/优化文案 → 数字人演绎生成爆款二创视频
' + mkExec('mkRunR', '🚀 解析并二创') + mksResult()); $('mkRunR').onclick = function () { var ref = MKS.ref2 || mksVal('mkRefUrl2'); if (!ref) { mksTip('请上传爆款视频或粘贴链接'); return; } mksRun('【爆款二创】请解析该爆款视频并产出二创执行方案:\n视频:' + String(ref).substring(0, 300) + '\n二创方向:' + (mksVal('mkRemixDir') || '保持原风格优化') + '\n数字人形象:' + mksVal('mkAvatar2') + '\n输出:原视频结构拆解 → 优化后口播文案 → 数字人演绎分镜脚本。'); }; } /* ============ 工具:解析提取 ============ */ function openParse() { mksOpen('🔍 解析提取', mksField('① 选择视频', mksUploadBtn('video', 'video', 'ref3', '📁 上传视频') + '
' + mksInput('mkRefUrl3', '或粘贴视频链接') + '
') + '
' + '' + '
' + mkExec('mkRunP', '🚀 解析提取') + mksResult()); $('mkRunP').onclick = function () { var ref = MKS.ref3 || mksVal('mkRefUrl3'); if (!ref) { mksTip('请上传视频或粘贴链接'); return; } var p1 = mksChk('mkP1'), p2 = mksChk('mkP2'), p3 = mksChk('mkP3'); mksRun('【解析提取】请解析视频并输出结构化素材包:\n视频:' + String(ref).substring(0, 300) + '\n需要提取:' + [p1 ? '口播文案' : '', p2 ? '背景音乐建议' : '', p3 ? '画面/素材模板' : ''].filter(Boolean).join('、') + '\n文案请给出可直接使用的完整口播稿。', null, 'video_script'); }; } /* ============ 工具:PPT 制作 ============ */ function openPpt() { mksOpen('📑 PPT 制作', mksField('① 上传资料文件(Word/Markdown/PDF/大纲,可选)', mksUploadBtn('document', 'document', 'ppt', '📎 上传文件')) + mksField('② 描述 PPT 需求(必填:主题/页数/风格)', mksArea('mkPptReq', '例如:帮我做一份 15 页的产品发布会 PPT,主题是智能家居新品,风格简洁商务…')) + mkExec('mkRunPPT', '🚀 生成 PPT') + mksResult()); $('mkRunPPT').onclick = function () { var req = mksVal('mkPptReq'); if (!req) { mksTip('请描述 PPT 需求'); return; } var f = MKS.ppt || ''; mksRun('【PPT制作】请基于以下资料与需求产出完整 PPT 大纲与每页要点(含封面/目录/内容页/结尾),并给出可执行页数建议:\n资料文件:' + (f ? String(f).substring(0, 300) : '无(按需求直接创作)') + '\n需求:' + req); }; } /* ============ API Key(Bearer=登录用户身份) ============ */ window.mksAPIKey = function () { function token() { return localStorage.getItem('user_token') || localStorage.getItem('authToken') || ''; } function list() { var box = $('mksKeyList'); if (!box) return; box.innerHTML = '
加载中…
'; var tk = token(); if (!tk) { box.innerHTML = '
请先登录后再管理 API Key(密钥将绑定您的账户用于计费)
'; return; } fetch(API + '/user/apikeys/allocations', { headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + tk } }) .then(function (r) { return r.json().catch(function () { return {}; }); }) .then(function (d) { var keys = (d && (d.data || d.keys)) || []; if (!keys.length) { box.innerHTML = '
暂无 API Key
点击下方「生成新 Key」(自动绑定当前账号与计费)
'; return; } box.innerHTML = keys.map(function (k) { return '
' + '
' + escH(k.key_name || 'Key') + '
' + '
' + escH(k.one_api_key || 'sk-***') + '
' + '
额度 ' + (k.quota_limit || 0) + ' · 已用 ' + (k.quota_used || 0) + '' + '
'; }).join(''); }).catch(function (e) { box.innerHTML = '
加载失败:' + escH(e.message) + '
'; }); } window.mksKeyCopy = function (k) { if (navigator.clipboard) { navigator.clipboard.writeText(k || '').then(function () { mksTip('✅ 已复制'); }).catch(function () { mksTip('复制失败,请长按手动复制'); }); } else mksTip(k || ''); }; window.mksKeyCreate = function () { var tk = token(); if (!tk) { mksTip('请先登录'); return; } var nm = mksVal('mksKeyName'); mksTip('⏳ 正在生成…'); fetch(API + '/user/apikeys/allocations', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + tk }, body: JSON.stringify({ key_name: nm || '手机端 Key', quota_limit: 10000 }) }) .then(function (r) { return r.json().catch(function () { return {}; }); }) .then(function (d) { var kd = (d && (d.data || d)) || {}; mksTip(kd.one_api_key ? '✅ 已生成(已绑定您的账号)' : '生成失败:' + ((d && d.message) || '请重试')); list(); }).catch(function () { mksTip('网络错误'); }); }; mksOpen('🔑 API Key 管理', '
' + '
' + mksInput('mksKeyName', 'Key 名称(可选)') + '
' + '
· Key 通过当前登录账号生成,自动绑定用户 ID 用于计费与鉴权
· 复制后在第三方工具/API 调用中使用,额度 10000 次/Key
'); list(); }; /* ============ 分发入口(市场卡片/☰ 调用) ============ */ // 20260909 修复:注册表改为顶层立即挂出(此前在函数体内赋值,需等本函数被调用; // 分发器被 v26f 接管后本函数永不被调 → __mksV24Map 恒为空 → 4 操作台丢失) window.__mksV24Map = { imitate_create: openImitate, remake_create: openRemake, parse_extract: openParse, ppt_maker: openPpt, tool_api_key: function () { window.mksAPIKey(); } }; window.mksOpenModule = function (item) { var id = item && item.id; if (!id) return; window.__mksCurItem = item; // WR-530: 供派发前门禁预检取卡片能力键 var M2 = window.__mksV24Map || {}; if (M2[id]) { M2[id](); return; } if (id === 'digital_human' || (item && item.url && String(item.url).indexOf('http') === 0)) { var u = (item && item.url) || ''; try { var c = false; if (window.wrConfirm) { window.wrConfirm('「' + (item.name || id) + '」为独立页面,是否在新窗口打开?', { title: '打开外链' }).then(function (ok) { if (ok) try { window.open(item.url, '_blank'); } catch (e) {} }); return; } c = confirm('「' + (item.name || id) + '」为独立页面,是否在新窗口打开?'); if (c && u) window.open(u, '_blank'); } catch (e) {} return; } if (item && item.type === 'resources') { mksOpen('📚 ' + (item.name || id), '
「' + escH(item.name || id) + '」是素材/文件资源管理
请先使用底部导航或对话页完成内容,再回来查看
' + '
'); return; } if (item && item.type === 'chat') { mksClose(); var pref = (item && item.url) || ('我想使用【' + (item.name || id) + '】,请帮我:'); var inp = $('chat-input'); if (inp) { inp.value = pref; } try { if (typeof window.switchTab === 'function') window.switchTab('home'); } catch (e) {} try { if (typeof window.sendMessage === 'function') setTimeout(function () { window.sendMessage(); }, 300); } catch (e) {} return; } /* studio 等其余类型:先走对话引导(桌面场景版式正在分批接入) */ mksClose(); var inp2 = $('chat-input'); if (inp2) { inp2.value = '我想使用【' + (item.name || id) + '】,请帮我:'; try { inp2.focus(); } catch (e) {} } mksTip('「' + (item.name || id) + '」请描述具体需求,AI 会为你执行'); }; console.log('[MobV24] 全屏操作台就绪(模仿/二创/解析/PPT/APIKey)'); })();