diff --git a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/qimingclawAdapter.ts b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/qimingclawAdapter.ts index ead7985e..3866091d 100644 --- a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/qimingclawAdapter.ts +++ b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/qimingclawAdapter.ts @@ -1165,6 +1165,8 @@ function taskStatusTone(status: string): 'running' | 'success' | 'danger' | 'wai function taskStatusLabel(status: string): string { const normalized = status.toLowerCase(); + if (normalized === 'ready') return '待启动'; + if (normalized === 'blocked') return '依赖阻塞'; if (normalized === 'skipped') return '已跳过'; if (normalized === 'cancelled') return '已取消'; if (normalized === 'paused') return '已暂停'; diff --git a/qimingclaw/crates/agent-electron-client/public/sgrobot-digital/assets/index-BR7K6m9r.js b/qimingclaw/crates/agent-electron-client/public/sgrobot-digital/assets/index-CRHKnsH7.js similarity index 88% rename from qimingclaw/crates/agent-electron-client/public/sgrobot-digital/assets/index-BR7K6m9r.js rename to qimingclaw/crates/agent-electron-client/public/sgrobot-digital/assets/index-CRHKnsH7.js index 40895de9..85c47fff 100644 --- a/qimingclaw/crates/agent-electron-client/public/sgrobot-digital/assets/index-BR7K6m9r.js +++ b/qimingclaw/crates/agent-electron-client/public/sgrobot-digital/assets/index-CRHKnsH7.js @@ -132,7 +132,7 @@ Please change the parent to null))??null,h={...L0(),...f??{},...a};return await s.saveUiState({state:h,...i})}catch{return null}}const Rs={finance:{id:"finance",labelKey:"console.role.finance",density:"compact",tone:"strict",contentPriority:["audit","sources","exactNumbers"],motion:{defaultLevel:"none",allowParticles:!1,allowCelebrations:!1,allowDecorativeBadges:!1},actionPolicy:{requireConfirmationForDestructive:!0,showReversalHint:!0,preferOneClickApproval:!1},staleDataThresholdMs:3e4,cssVars:{"--role-accent":"#2563eb","--role-accent-soft":"rgba(37,99,235,0.12)","--role-surface-tint":"rgba(248,250,252,0.78)","--role-border":"rgba(37,99,235,0.22)","--role-focus-ring":"#1d4ed8"}},engineering:{id:"engineering",labelKey:"console.role.engineering",density:"compact",tone:"technical",contentPriority:["alarms","timestamps","reliability"],motion:{defaultLevel:"none",allowParticles:!1,allowCelebrations:!1,allowDecorativeBadges:!1},actionPolicy:{requireConfirmationForDestructive:!0,showReversalHint:!0,preferOneClickApproval:!1},staleDataThresholdMs:15e3,cssVars:{"--role-accent":"#0f766e","--role-accent-soft":"rgba(15,118,110,0.12)","--role-surface-tint":"rgba(240,253,250,0.72)","--role-border":"rgba(15,118,110,0.24)","--role-focus-ring":"#0f766e"}},executive:{id:"executive",labelKey:"console.role.executive",density:"presentation",tone:"executive",contentPriority:["kpi","approvals","exactNumbers"],motion:{defaultLevel:"minimal",allowParticles:!1,allowCelebrations:!1,allowDecorativeBadges:!1},actionPolicy:{requireConfirmationForDestructive:!0,showReversalHint:!0,preferOneClickApproval:!0},staleDataThresholdMs:6e4,cssVars:{"--role-accent":"#334155","--role-accent-soft":"rgba(51,65,85,0.10)","--role-surface-tint":"rgba(248,250,252,0.82)","--role-border":"rgba(51,65,85,0.20)","--role-focus-ring":"#475569"}},hr:{id:"hr",labelKey:"console.role.hr",density:"balanced",tone:"warm-professional",contentPriority:["queues","timestamps","approvals"],motion:{defaultLevel:"minimal",allowParticles:!1,allowCelebrations:!1,allowDecorativeBadges:!1},actionPolicy:{requireConfirmationForDestructive:!0,showReversalHint:!0,preferOneClickApproval:!1},staleDataThresholdMs:45e3,cssVars:{"--role-accent":"#7c3aed","--role-accent-soft":"rgba(124,58,237,0.10)","--role-surface-tint":"rgba(250,245,255,0.72)","--role-border":"rgba(124,58,237,0.20)","--role-focus-ring":"#6d28d9"}},sales:{id:"sales",labelKey:"console.role.sales",density:"balanced",tone:"warm-professional",contentPriority:["pipeline","sources","exactNumbers"],motion:{defaultLevel:"minimal",allowParticles:!1,allowCelebrations:!1,allowDecorativeBadges:!1},actionPolicy:{requireConfirmationForDestructive:!0,showReversalHint:!0,preferOneClickApproval:!1},staleDataThresholdMs:45e3,cssVars:{"--role-accent":"#b45309","--role-accent-soft":"rgba(180,83,9,0.10)","--role-surface-tint":"rgba(255,251,235,0.70)","--role-border":"rgba(180,83,9,0.20)","--role-focus-ring":"#92400e"}}},Jg=b.createContext(null),cd="qimingclaw:digital-console-role",ud="sgrobot-console-role";function U0(){try{const a=localStorage.getItem(cd)??localStorage.getItem(ud);if(a&&a in Rs)return a}catch{}return"sales"}function B0({children:a}){const[i,s]=b.useState(U0);b.useEffect(()=>{let f=!1;return Zg().then(h=>{if(f)return;const _=h==null?void 0:h.consoleRole;if(_&&_ in Rs){s(_);try{localStorage.setItem(cd,_),localStorage.removeItem(ud)}catch{}}}),()=>{f=!0}},[]);const c=b.useCallback(f=>{s(f);try{localStorage.setItem(cd,f),localStorage.removeItem(ud)}catch{}Vg({consoleRole:f},{action:"update_console_role",metadata:{role:f}})},[]),d=Rs[i];return u.jsx(Jg.Provider,{value:{role:i,profile:d,setRole:c},children:u.jsx("div",{style:d.cssVars,"data-role":i,children:a})})}function H0(){const a=b.useContext(Jg);if(!a)throw new Error("useRole must be used within RoleProvider");return a}function Jo({className:a=""}){return u.jsx("div",{className:`de-gem ${a}`,"aria-hidden":"true"})}function G0(){return u.jsxs("div",{className:"de-stage","aria-hidden":"true",children:[u.jsx("div",{className:"de-stage-glow"}),u.jsx("div",{className:"de-stage-layer de-stage-layer-1"}),u.jsx("div",{className:"de-stage-layer de-stage-layer-2"}),u.jsx("div",{className:"de-stage-layer de-stage-layer-3"})]})}function Y0({avatarSrc:a,altText:i="数字员工",statusLabel:s}){return u.jsxs("div",{className:"de-avatar-container","aria-hidden":"true",children:[u.jsxs("div",{className:"de-avatar-glass-space",children:[u.jsxs("div",{className:"de-avatar-roof",children:[u.jsx("div",{className:"de-avatar-roof-face"}),u.jsx("div",{className:"de-avatar-roof-glow"})]}),u.jsx("div",{className:"de-avatar-glass-left"}),u.jsx("div",{className:"de-avatar-glass-right"}),u.jsx(Jo,{className:"de-gem-1"}),u.jsx(Jo,{className:"de-gem-2"}),u.jsx(Jo,{className:"de-gem-3"})]}),s&&u.jsx("div",{className:"de-avatar-state-label",children:s}),u.jsx("img",{src:a,alt:i,className:"de-avatar-img"}),u.jsx(G0,{})]})}const Q0=".",K0=(()=>{var i;return((i=window.__QIMINGCLAW_DIGITAL_API_BASE__)==null?void 0:i.replace(/\/+$/,""))??""})(),X0=()=>"",Fg="qimingclaw_digital_token",Ig="zeroclaw_token";function Z0(){try{return localStorage.getItem(Fg)??localStorage.getItem(Ig)}catch{return null}}function V0(){try{localStorage.removeItem(Fg),localStorage.removeItem(Ig)}catch{}}const Wg="qimingclaw:digital-employee-adapter-state",J0="18:00",F0=[{skill_id:"qimingclaw-acp-session",name:"ACP 会话执行",version:"1.0.0",enabled:!0,description:"通过 qimingclaw 的 ACP 引擎创建会话、执行任务并跟踪结果。",category:"执行",capability_level:"core"},{skill_id:"qimingclaw-mcp-tools",name:"MCP 工具编排",version:"1.0.0",enabled:!0,description:"读取已配置 MCP 服务与工具,作为数字员工的工具能力池。",category:"工具",capability_level:"core"},{skill_id:"qimingclaw-computer-control",name:"客户端电脑控制",version:"1.0.0",enabled:!0,description:"承接 /computer/chat 执行入口,面向远程任务和本地自动化操作。",category:"桌面",capability_level:"specialized"},{skill_id:"qimingclaw-artifact-report",name:"产物与日报整理",version:"1.0.0",enabled:!0,description:"把执行记录、关键产物和异常汇总成数字员工日报。",category:"汇报",capability_level:"standard"}],I0=[{plan_id:"qimingclaw-client-readiness",title:"客户端运行状态巡检",objective:"确认 qimingclaw 客户端、Agent、MCP 和远程接入能力是否处于可执行状态。",status:"running",created_at:ia(9,0),steps:[{step_id:"agent-status",title:"检查 Agent 引擎状态",depends_on:[],preferred_skills:["qimingclaw-acp-session"],tasks:[{task_id:"task-agent-status",title:"读取 Agent 服务状态",status:"running"}]},{step_id:"mcp-status",title:"检查 MCP 工具能力",depends_on:["agent-status"],preferred_skills:["qimingclaw-mcp-tools"],tasks:[{task_id:"task-mcp-status",title:"同步 MCP 工具列表",status:"pending"}]}]},{plan_id:"qimingclaw-remote-task-ingress",title:"远程任务接入准备",objective:"检查 lanproxy、computer server 和文件服务,为后端下发数字员工任务做准备。",status:"pending",created_at:ia(9,30),steps:[{step_id:"computer-server",title:"确认 /computer/chat 执行入口",depends_on:[],preferred_skills:["qimingclaw-computer-control"],tasks:[{task_id:"task-computer-server",title:"检查电脑控制服务",status:"pending"}]},{step_id:"file-artifact",title:"准备产物回传目录",depends_on:["computer-server"],preferred_skills:["qimingclaw-artifact-report"],tasks:[{task_id:"task-file-artifact",title:"整理执行产物通道",status:"pending"}]}]},{plan_id:"qimingclaw-daily-report",title:"数字员工日报生成",objective:"汇总今日执行记录、服务状态和待介入事项,生成面向业务的日报。",status:"pending",created_at:ia(17,30),steps:[{step_id:"collect-events",title:"汇总运行事件",depends_on:[],preferred_skills:["qimingclaw-artifact-report"],tasks:[{task_id:"task-collect-events",title:"整理今日运行明细",status:"pending"}]},{step_id:"write-report",title:"生成日报摘要",depends_on:["collect-events"],preferred_skills:["qimingclaw-artifact-report"],tasks:[{task_id:"task-write-report",title:"生成数字员工日报",status:"pending"}]}]}],vc={"qimingclaw-client-readiness":{expression:"0 9 * * *",nextRun:ia(9,0),scheduleText:"已定时 09:00 执行"},"qimingclaw-remote-task-ingress":{expression:"30 9 * * *",nextRun:ia(9,30),scheduleText:"已定时 09:30 执行"},"qimingclaw-daily-report":{expression:"0 18 * * *",nextRun:ia(18,0),scheduleText:"已定时 18:00 执行"}};function W0(){return window.__QIMINGCLAW_EMBEDDED_DIGITAL__===!0}async function P0(a,i={}){var p,g,j;if(!W0())return;const s=new URL(a,window.location.origin),c=(i.method||"GET").toUpperCase(),d=s.pathname;if(c==="GET"&&d==="/api/digital-employee/workday")return gy(s.searchParams.get("date")||Od(),await gt());if(c==="POST"&&d==="/api/digital-employee/workday/actions")return await YS(ml(i.body),await gt());if(c==="POST"&&d==="/api/governance/command")return await Gd(ml(i.body),await gt());if(c==="GET"&&d==="/api/scheduler/jobs")return{jobs:xc(await gt())};if(c==="GET"&&d==="/api/cron")return{jobs:xc(await gt())};if(c==="POST"&&d==="/api/cron")return await uS(ml(i.body),await gt());if(c==="GET"&&d==="/api/cron/settings")return await lS();if(c==="PATCH"&&d==="/api/cron/settings"){const S=ml(i.body);return await iS(S)}if(c==="POST"&&d==="/api/cron/check"){const S=await((j=(g=(p=window.QimingClawBridge)==null?void 0:p.digital)==null?void 0:g.runSchedulerCheck)==null?void 0:j.call(g));return{ok:!0,activated:(S==null?void 0:S.activated)??0,...S}}const f=d.match(/^\/api\/cron\/([^/]+)\/runs$/);if(c==="GET"&&f)return{runs:await dS(decodeURIComponent(f[1]||""),Number(s.searchParams.get("limit"))||20)};const h=d.match(/^\/api\/cron\/([^/]+)$/);if((c==="PATCH"||c==="DELETE")&&h){const S=decodeURIComponent(h[1]||"");if(c==="DELETE"){await ty("delete_schedule",S,{},await gt());return}return await oS(S,ml(i.body),await gt())}if(c==="GET"&&d==="/api/debug/plans")return{plans:py(s.searchParams.get("q"),await gt())};if(c==="GET"&&d==="/api/debug/tasks"){const S=s.searchParams.get("plan_id");return Bd(S,await gt())}if(c==="GET"&&d==="/api/debug/store")return AS(await gt());if(c==="GET"&&d==="/api/dashboard")return TS(await gt());if(c==="GET"&&d==="/api/artifact")return{artifacts:Hd(await gt())};if(c==="GET"&&d==="/api/memory")return{entries:await sS(s.searchParams.get("query"),s.searchParams.get("category"))};if(c==="POST"&&d==="/api/memory")return await rS(ml(i.body));const _=d.match(/^\/api\/memory\/([^/]+)$/);if(c==="DELETE"&&_){await cS(decodeURIComponent(_[1]||""));return}if(c==="GET"&&d.startsWith("/api/debug/plan/")&&d.endsWith("/flow"))return yy(decodeURIComponent(d.split("/")[4]||""),await gt());if(c==="GET"&&d.startsWith("/api/debug/task/")&&d.endsWith("/flow"))return FS(decodeURIComponent(d.split("/")[4]||""),await gt());if(c==="POST"&&d.startsWith("/api/debug/plan/")&&d.endsWith("/dispatch"))return await _y(decodeURIComponent(d.split("/")[4]||""),await gt());if(c==="GET"&&d.startsWith("/api/plan/")&&d.endsWith("/messages"))return{messages:IS(decodeURIComponent(d.split("/")[3]||""),await gt())};if(c==="GET"&&d==="/api/skill")return{skills:await nS()};if(c==="POST"&&d.startsWith("/api/skill/")&&d.endsWith("/enabled")){const S=decodeURIComponent(d.split("/")[3]||""),E=ml(i.body);return{ok:!0,skill_id:S,enabled:E.enabled??!0}}}function Fo(){return{selectedDutyIdsByDate:{},confirmedDates:{},reportScheduleTime:J0,reportGeneratedAtByDate:{},decisionResultsByDate:{},consoleRole:"sales",rolePreferences:{},profile:{name:"飞天数字员工",company:"qimingclaw 客户端",position:"客户端任务执行员",currentStatus:"working"}}}function Rd(){try{const a=window.localStorage.getItem(Wg);return a?{...Fo(),...JSON.parse(a)}:Fo()}catch{return Fo()}}function eS(a){window.localStorage.setItem(Wg,JSON.stringify(a))}async function gt(){var a,i,s,c,d,f,h,_,p,g,j,S;try{const E=await((s=(i=(a=window.QimingClawBridge)==null?void 0:a.digital)==null?void 0:i.getSnapshot)==null?void 0:s.call(i))??null;if(!E)return null;const[$,A,O,R]=await Promise.all([((f=(d=(c=window.QimingClawBridge)==null?void 0:c.digital)==null?void 0:d.getSyncStatus)==null?void 0:f.call(d).catch(()=>null))??null,((p=(_=(h=window.QimingClawBridge)==null?void 0:h.digital)==null?void 0:_.getRuntimeRecords)==null?void 0:p.call(_).catch(()=>null))??null,Md(),((S=(j=(g=window.QimingClawBridge)==null?void 0:g.digital)==null?void 0:j.getPlanTemplates)==null?void 0:S.call(j).catch(()=>null))??null]);return{...E,sync:$,runtime:A,uiState:O,planTemplates:(R==null?void 0:R.templates)??[]}}catch{return null}}async function Md(){var a,i,s;try{return await((s=(i=(a=window.QimingClawBridge)==null?void 0:a.digital)==null?void 0:i.getUiState)==null?void 0:s.call(i))??null}catch{return null}}async function tS(){var a,i,s;try{const c=await((s=(i=(a=window.QimingClawBridge)==null?void 0:a.digital)==null?void 0:i.getSkillCapabilities)==null?void 0:s.call(i))??null;return Array.isArray(c==null?void 0:c.skills)?c.skills:[]}catch{return[]}}async function nS(){return aS([...F0,...await tS()])}function aS(a){const i=new Set,s=[];for(const c of a){const d=typeof c.skill_id=="string"?c.skill_id.trim():"";!d||i.has(d)||(i.add(d),s.push({...c,skill_id:d}))}return s}async function Pg(a,i,s,c){var d,f,h;eS(a);try{return await((h=(f=(d=window.QimingClawBridge)==null?void 0:d.digital)==null?void 0:f.saveUiState)==null?void 0:h.call(f,{state:a,action:i,date:s,metadata:c}))??a}catch{return a}}async function Ka(a,i){var s,c,d,f,h,_,p,g,j,S,E,$,A,O,R,q,F,Z,P,te;try{await((te=(c=(s=window.QimingClawBridge)==null?void 0:s.digital)==null?void 0:c.recordGovernanceCommand)==null?void 0:te.call(c,{commandKind:a.command_kind,commandId:i.command_id,correlationId:i.correlation_id,planId:oe((d=i.result)==null?void 0:d.plan_id)||oe((f=a.context_refs)==null?void 0:f.plan_id)||oe((h=a.payload)==null?void 0:h.plan_id)||null,taskId:oe((_=i.result)==null?void 0:_.task_id)||oe((p=a.context_refs)==null?void 0:p.task_id)||oe((g=a.payload)==null?void 0:g.task_id)||null,runId:oe((j=i.result)==null?void 0:j.run_id)||oe((S=a.context_refs)==null?void 0:S.run_id)||oe((E=a.payload)==null?void 0:E.run_id)||oe(($=a.payload)==null?void 0:$.latest_run_id)||null,stepId:oe((A=i.result)==null?void 0:A.step_id)||oe((O=a.context_refs)==null?void 0:O.step_id)||oe((R=a.payload)==null?void 0:R.step_id)||oe((q=a.payload)==null?void 0:q.stepId)||null,scheduleId:oe((F=i.result)==null?void 0:F.schedule_id)||oe((Z=a.context_refs)==null?void 0:Z.schedule_id)||oe((P=a.payload)==null?void 0:P.schedule_id)||null,accepted:i.accepted,message:i.message,error:i.error??null,payload:a.payload??null,result:i.result??null}))}catch{}}async function lS(){var a,i,s;try{return await((s=(i=(a=window.QimingClawBridge)==null?void 0:a.digital)==null?void 0:i.getCronSettings)==null?void 0:s.call(i))??bc()}catch{return bc()}}async function iS(a){var i,s,c;try{return await((c=(s=(i=window.QimingClawBridge)==null?void 0:i.digital)==null?void 0:s.saveCronSettings)==null?void 0:c.call(s,a))??{...bc(),...a}}catch{return{...bc(),...a}}}async function sS(a,i){var s,c,d;try{return(await((d=(c=(s=window.QimingClawBridge)==null?void 0:s.digital)==null?void 0:c.listMemories)==null?void 0:d.call(c,{query:a||void 0,category:i||void 0,limit:300}))??[]).map(ey)}catch{return[]}}async function rS(a){var f,h,_;const i=oe(a.key),s=oe(a.content??a.text),c=oe(a.category)||"fact";if(!s)return{ok:!0,entry:null};const d=await((_=(h=(f=window.QimingClawBridge)==null?void 0:f.digital)==null?void 0:h.addMemory)==null?void 0:_.call(h,{key:i||void 0,content:s,category:c,source:"qimingclaw-digital-page",payload:{source:"embedded-memory-api",key:i||null}}))??null;return{ok:!0,entry:d?ey(d):null}}async function cS(a){var i,s,c;try{await((c=(s=(i=window.QimingClawBridge)==null?void 0:i.digital)==null?void 0:s.deleteMemory)==null?void 0:c.call(s,a))}catch{}}function ey(a){return{id:a.id,key:a.key||a.id,content:a.content,category:a.category||"fact",timestamp:a.updatedAt||a.createdAt||new Date().toISOString(),session_id:a.sessionId??null,score:typeof a.score=="number"?a.score:null}}function bc(){return{enabled:!0,catch_up_on_startup:!0,max_run_history:100,max_catch_up_runs:5,max_concurrent_schedule_runs:1}}async function uS(a,i){const s=Date.now(),c=oe(a.id)||oe(a.schedule_id)||`cron-${ua(oe(a.name)||"job")}-${s}`;await Gd({command_kind:"create_schedule",context_refs:{schedule_id:c,plan_id:oe(a.plan_id)||oe(a.template_id)||void 0},payload:{...a,schedule_id:c,cron_expr:oe(a.schedule)||oe(a.cron_expr)},correlation_id:`qimingclaw-cron-create-${s}`,idempotency_key:`qimingclaw-cron-create-${c}-${s}`},i);const d=await gt();return{status:"created",job:xc(d).find(f=>f.id===c)??ny(c,a)}}async function oS(a,i,s){await ty("update_schedule",a,i,s);const c=await gt();return{status:"updated",job:xc(c).find(d=>d.id===a)??ny(a,i)}}async function ty(a,i,s,c){const d=Date.now();return Gd({command_kind:a,context_refs:{schedule_id:i,plan_id:oe(s.plan_id)||oe(s.template_id)||void 0},payload:{...s,schedule_id:i,cron_expr:oe(s.schedule)||oe(s.cron_expr)},correlation_id:`qimingclaw-cron-${a}-${d}`,idempotency_key:`qimingclaw-cron-${a}-${i}-${d}`},c)}function ny(a,i){const s=new Date().toISOString(),c=oe(i.schedule)||oe(i.cron_expr)||"0 9 * * *";return{id:a,name:oe(i.name)||a,expression:c,command:oe(i.command)||`digital-employee:${a}`,prompt:oe(i.prompt)||null,job_type:oe(i.job_type)||"qimingclaw_schedule",schedule:{expression:c,schedule_id:a},enabled:i.enabled!==!1,delivery:{mode:"qimingclaw_schedule",schedule_id:a},template_id:oe(i.template_id)||oe(i.plan_id)||a,trigger_kind:"scheduled",delete_after_run:i.delete_after_run===!0,created_at:s,next_run:s,last_run:null,last_status:null,last_output:null}}async function dS(a,i){var c,d,f;return(await((f=(d=(c=window.QimingClawBridge)==null?void 0:c.digital)==null?void 0:d.getScheduleRuns)==null?void 0:f.call(d,a,i).catch(()=>[]))??[]).map((h,_)=>({id:Number.isFinite(Date.parse(h.createdAt))?Date.parse(h.createdAt)+_:_+1,job_id:h.scheduleId,started_at:h.startedAt||h.createdAt,finished_at:h.finishedAt||"",status:h.status,output:h.error||null,duration_ms:h.startedAt&&h.finishedAt?Math.max(0,Date.parse(h.finishedAt)-Date.parse(h.startedAt)):null}))}function ml(a){return typeof a!="string"||!a.trim()?{}:JSON.parse(a)}function Od(){const a=new Date;return[a.getFullYear(),String(a.getMonth()+1).padStart(2,"0"),String(a.getDate()).padStart(2,"0")].join("-")}function ia(a,i){const s=new Date;return s.setHours(a,i,0,0),s.toISOString()}function lc(a){return a.split("-").join("/")}function Sc(a){if(!a)return"未知";const i=new Date(a);return Number.isNaN(i.getTime())?a:new Intl.DateTimeFormat("zh-CN",{hour:"2-digit",minute:"2-digit"}).format(i)}function ay(a,i){return new Set(a.selectedDutyIdsByDate[i]??[])}function ly(a){return["completed","succeeded","success"].includes(a)?"success":["running","active"].includes(a)?"running":["failed","error"].includes(a)?"danger":"waiting"}function ks(a,i){var s;return((s=a==null?void 0:a.services[i])==null?void 0:s.running)===!0}function As(a,i){var s;return(s=a==null?void 0:a.services[i])==null?void 0:s.error}function fS(a,i){return i?a.plan_id==="qimingclaw-client-readiness"?ks(i,"agent")&&ks(i,"mcp")?"running":As(i,"agent")||As(i,"mcp")?"failed":"pending":a.plan_id==="qimingclaw-remote-task-ingress"?ks(i,"computerServer")||ks(i,"lanproxy")||ks(i,"fileServer")?"running":As(i,"computerServer")||As(i,"lanproxy")||As(i,"fileServer")?"failed":"pending":a.status:a.status}function Xa(a,i,s){const c=a==null?void 0:a.services[i];if(!c)return`${s}:未连接`;if(c.running){const d=c.port?`(端口 ${c.port})`:"";return`${s}:运行中${d}`}return`${s}:未运行${c.error?`,${c.error}`:""}`}function mS(a){const i=(a==null?void 0:a.managedServices)??[];return i.length>0?i.map(s=>({service_id:s.serviceId,name:s.name,kind:s.kind,status:s.status,status_label:s.statusLabel,running:s.running,error:s.error??null,requires_human_action:s.requiresHumanAction,dependent_tasks:s.dependentTasks??[],restart_count:s.restartCount??0,last_seen_at:s.lastSeenAt,instance:s.instance,lease:s.lease})):[fi(a,"agent","Agent","agent",["ACP 会话执行","Plan Agent"]),fi(a,"mcp","MCP Proxy","mcp",["Skill Catalog","MCP 工具调用"]),fi(a,"computerServer","Computer Server","desktop",["/computer/chat","远程任务接入"]),fi(a,"fileServer","File Server","file",["Artifact 上传","文件交付"]),fi(a,"lanproxy","Lanproxy","network",["远程访问","管理端回连"]),fi(a,"guiServer","GUI Agent Server","gui",["GUI 自动化"])]}function fi(a,i,s,c,d){const f=a==null?void 0:a.services[i],h=(f==null?void 0:f.running)===!0,_=f!=null&&f.error?"degraded":h?"running":"stopped";return{service_id:i,name:s,kind:c,status:_,status_label:_==="running"?"运行中":_==="degraded"?"异常":"未运行",running:h,error:(f==null?void 0:f.error)??null,requires_human_action:!!(f!=null&&f.error),dependent_tasks:d,restart_count:0,last_seen_at:(a==null?void 0:a.generatedAt)??new Date().toISOString(),instance:f?{port:f.port,engineType:f.engineType,serverCount:f.serverCount,serverNames:f.serverNames}:void 0,lease:{state:_==="running"?"active":_,updatedAt:(a==null?void 0:a.generatedAt)??new Date().toISOString()}}}function hS(a){const i=a.dependent_tasks.length>0?`;依赖任务:${a.dependent_tasks.slice(0,2).join("、")}`:"";return`${a.name}:${a.status_label}${a.error?`,${a.error}`:""}${i}`}function Qp(a){const i=a.filter(c=>c.running).length,s=a.filter(c=>c.requires_human_action||c.status==="degraded").length;return`ManagedService:${i}/${a.length} 运行,${s} 项需处理`}function od(a){const i=a==null?void 0:a.sync;return i?i.enabled?i.endpoint?i.syncing?`管理端同步:同步中,待同步 ${i.pending} 条`:i.failed>0?`管理端同步:${i.failed} 条失败,待同步 ${i.pending} 条`:i.pending>0?`管理端同步:待同步 ${i.pending} 条`:i.lastSyncAt?`管理端同步:已同步,最近 ${i.lastSyncAt}`:"管理端同步:等待本地数据":"管理端同步:未配置地址":"管理端同步:已停用":"管理端同步:未连接"}function pS(a){return String(a||"").replace(/\s+/g," ").trim()}function Sn(a){var i;return((i=a==null?void 0:a.runtime)==null?void 0:i.plans)??[]}function $d(a){var i;return((i=a==null?void 0:a.runtime)==null?void 0:i.planSteps)??[]}function Nt(a){var i;return((i=a==null?void 0:a.runtime)==null?void 0:i.tasks)??[]}function _i(a){var i;return((i=a==null?void 0:a.runtime)==null?void 0:i.runs)??[]}function ra(a){var i;return((i=a==null?void 0:a.runtime)==null?void 0:i.events)??[]}function iy(a){var i;return((i=a==null?void 0:a.runtime)==null?void 0:i.artifacts)??[]}function sy(a){var i;return((i=a==null?void 0:a.runtime)==null?void 0:i.approvals)??[]}function xl(a){return Sn(a).length>0||$d(a).length>0||Nt(a).length>0||iy(a).length>0||sy(a).length>0}function qd(a,i){const s=[a.updatedAt,...i.map(c=>c.updatedAt)].filter(Boolean).sort();return s[s.length-1]??a.updatedAt??a.createdAt}function Ie(a){const i=a.toLowerCase();return["completed","succeeded","success","done"].includes(i)?"success":["failed","error","rejected","cancelled"].includes(i)?"danger":["running","active","leased","syncing"].includes(i)?"running":"waiting"}function $n(a){const i=a.toLowerCase();if(i==="skipped")return"已跳过";if(i==="cancelled")return"已取消";if(i==="paused")return"已暂停";const s=Ie(a);return s==="success"?"已完成":s==="danger"?"异常":s==="running"?"执行中":"待执行"}function Nc(a,i){return Nt(a).filter(s=>s.planId===i)}function ry(a,i){return $d(a).filter(s=>s.planId===i).sort((s,c)=>s.seq-c.seq||s.createdAt.localeCompare(c.createdAt))}function Ls(a){const i=_l(a.payload);return le((i==null?void 0:i.stepId)??(i==null?void 0:i.step_id))||(a.planId?`${a.planId}:runtime`:"qimingclaw-runtime")}function Cc(a,i){return i.some(s=>Ie(s.status)==="danger")?"failed":i.some(s=>Ie(s.status)==="running")?"running":i.length>0&&i.every(s=>Ie(s.status)==="success")?"completed":a.status||"pending"}function gS(a){return Sn(a).map(i=>{const s=Nc(a,i.id),c=Cc(i,s),d=ly(c),f=s.filter(_=>Ie(_.status)==="danger").length,h=s.filter(_=>Ie(_.status)==="running").length;return{agent_id:`plan-agent-${ua(i.id)}`,plan_id:i.id,title:i.title,lifecycle:c,status_label:dy(c),status_tone:d,managed_task_count:s.length,running_task_count:h,failed_task_count:f,next_action:f>0?"review_failures":h>0?"monitor_runs":d==="success"?"archive_results":"activate_plan",can_replan:f>0,can_pause:h>0,can_resume:c==="paused",updated_at:qd(i,s)}})}function yS(a){const i=_i(a);return Nt(a).map(s=>{const c=cy(i,s.id),d=Ie(s.status),f=s.status.toLowerCase(),h=Ls(s);return{agent_id:`task-agent-${ua(s.id)}`,task_id:s.id,plan_id:s.planId??null,step_id:h,title:s.title,execution_state:s.status,status_label:$n(s.status),status_tone:d,assigned_skill_id:s.assignedSkillId??null,latest_run_id:(c==null?void 0:c.id)??null,can_retry:["failed","cancelled","skipped"].includes(f),can_skip:["pending","running"].includes(f),can_cancel:["pending","running","paused"].includes(f),next_action:_S(f,d),updated_at:(c==null?void 0:c.updatedAt)??s.updatedAt}})}function _S(a,i){return["failed","cancelled","skipped"].includes(a)?"retry_or_review":a==="paused"?"resume_or_cancel":i==="running"?"watch_progress":i==="success"?"collect_artifacts":"start_run"}function cy(a,i){return a.filter(c=>c.taskId===i).sort((c,d)=>(d.updatedAt||d.createdAt).localeCompare(c.updatedAt||c.createdAt))[0]??null}function vS(a,i){const s=Nc(i,a.id),c=ry(i,a.id),d=Cc(a,s),f=new Set(c.map(p=>p.id)),h=s.filter(p=>!f.has(Ls(p))),_=c.length>0?[...c.map(p=>uy(p,s)),...h.length>0?[Kp(a.id,h)]:[]]:[Kp(a.id,s)];return{plan_id:a.id,title:a.title,objective:a.objective??void 0,status:d,created_at:a.createdAt,updated_at:qd(a,s),source:a.source,sync_status:a.syncStatus,steps:_}}function uy(a,i){return{step_id:a.id,title:a.title,depends_on:a.dependsOn,preferred_skills:a.preferredSkillIds,tasks:i.filter(s=>Ls(s)===a.id).map(s=>({task_id:s.id,title:s.title,status:s.status}))}}function Kp(a,i){return{step_id:`${a}:runtime`,title:"qimingclaw 执行记录",depends_on:[],preferred_skills:[...new Set(i.map(s=>s.assignedSkillId).filter(s=>!!s))],tasks:i.map(s=>({task_id:s.id,title:s.title,status:s.status}))}}function bS(a){return{task_id:a.id,title:a.title,status:a.status,plan_id:a.planId??null,step_id:Ls(a),assigned_skill_id:a.assignedSkillId??"",description:a.syncError??"",created_at:a.createdAt,updated_at:a.updatedAt,started_at:a.createdAt,finished_at:Ie(a.status)==="success"||Ie(a.status)==="danger"?a.updatedAt:null,error_message:a.syncError??null,sync_status:a.syncStatus}}function SS(a,i){return{run_id:a.id,task_id:a.taskId??"",plan_id:a.planId??null,skill_id:void 0,attempt_no:1,lifecycle:Ie(a.status)==="success"?"Succeeded":Ie(a.status)==="danger"?"Failed":Ie(a.status)==="running"?"Running":a.status,created_at:a.startedAt??a.createdAt,completed_at:a.finishedAt??null,events:i.filter(s=>s.runId===a.id).map(s=>({event_id:s.id,kind:s.kind,occurred_at:s.occurredAt,message:s.message})),artifacts:my(a,i),sync_status:a.syncStatus}}function oy(a){const i=pS(a.error),s=i.length>120?`${i.slice(0,120)}...`:i,c=a.dueForRetry?"等待补偿":a.nextRetryAt?`下次重试 ${a.nextRetryAt}`:"等待重试";return`${a.entityType}/${a.operation} ${a.id} 重试 ${a.attempts} 次,${c}${s?`,${s}`:""}`}function Us(a,i){return{...a,status:fS(a,i)}}function dy(a){return a==="running"?"执行中":a==="completed"||a==="succeeded"?"已完成":a==="failed"?"异常":"待执行"}function Ld(a){const i=Sn(a);if(i.length>0)return i.map(c=>vS(c,a));const s=Nt(a);return s.length===0?[]:s.map(c=>({plan_id:c.id,title:c.title,objective:"未绑定 Plan 的 qimingclaw 本地任务记录。",status:c.status,created_at:c.createdAt,updated_at:c.updatedAt,source:"qimingclaw",sync_status:c.syncStatus,steps:[{step_id:`${c.id}:runtime`,title:"qimingclaw 执行记录",depends_on:[],preferred_skills:c.assignedSkillId?[c.assignedSkillId]:[],tasks:[{task_id:c.id,title:c.title,status:c.status}]}]}))}function ca(a){const i=(a==null?void 0:a.planTemplates)??[],s=new Map;for(const c of[...i,...I0])s.has(c.plan_id)||s.set(c.plan_id,c);return Array.from(s.values())}function Ud(a){const i=new Map;for(const s of[...Ld(a),...ca(a).map(c=>Us(c,a))])i.has(s.plan_id)||i.set(s.plan_id,s);return Array.from(i.values())}function xS(a,i){var d;const s=Us(a,i),c=vc[a.plan_id]??vc["qimingclaw-client-readiness"];return{id:`schedule-${a.plan_id}`,name:a.title,expression:c.expression,command:`digital-employee:${a.plan_id}`,prompt:a.objective??null,job_type:"plan_template",schedule:{expression:c.expression,template_id:a.plan_id},enabled:!0,delivery:{mode:"plan_template",template_id:a.plan_id},template_id:a.plan_id,trigger_kind:"scheduled",step_count:((d=a.steps)==null?void 0:d.length)??0,skill_ids:[...new Set((a.steps??[]).flatMap(f=>f.preferred_skills??[]))],delete_after_run:!1,created_at:a.created_at,next_run:c.nextRun,last_run:s.status==="running"?ia(9,5):null,last_status:s.status==="running"?"running":null,last_output:null}}function jS(a,i){var f,h;const s=a.planId?Ud(i).find(_=>_.plan_id===a.planId):null,d=(((f=i==null?void 0:i.runtime)==null?void 0:f.scheduleRuns)??[]).find(_=>_.scheduleId===a.id);return{id:a.id,name:a.name,expression:a.cronExpr,command:a.command||`digital-employee:${a.planId||a.id}`,prompt:a.prompt??a.description??null,job_type:"qimingclaw_schedule",schedule:{mode:"qimingclaw_schedule",schedule_id:a.id,plan_id:a.planId,expression:a.cronExpr,timezone:a.timezone,status:a.status,failure_count:a.failureCount,last_error:a.lastError},enabled:a.enabled&&a.status==="enabled"&&!a.deletedAt,delivery:{mode:"qimingclaw_schedule",schedule_id:a.id,plan_id:a.planId},template_id:a.planId??a.id,trigger_kind:"scheduled",step_count:((h=s==null?void 0:s.steps)==null?void 0:h.length)??0,skill_ids:[...new Set(((s==null?void 0:s.steps)??[]).flatMap(_=>_.preferred_skills??[]))],delete_after_run:!1,created_at:a.createdAt,next_run:a.nextRunAt||a.updatedAt,last_run:a.lastRunAt??(d==null?void 0:d.finishedAt)??(d==null?void 0:d.startedAt)??null,last_status:(d==null?void 0:d.status)??(a.lastError?"failed":null),last_output:(d==null?void 0:d.error)??a.lastError??null}}function xc(a=null){var c;const i=(((c=a==null?void 0:a.runtime)==null?void 0:c.schedules)??[]).filter(d=>d.status!=="deleted").map(d=>jS(d,a)),s=ca(a).map(d=>xS(d,a));if(i.length>0){const d=new Set(i.map(f=>f.template_id));return[...i,...s.filter(f=>!d.has(f.template_id))]}if(xl(a)){const d=Ld(a).map(h=>{var _;return{id:`runtime-${h.plan_id}`,name:h.title,expression:"",command:`qimingclaw-runtime:${h.plan_id}`,prompt:h.objective??null,job_type:"qimingclaw_runtime",schedule:{mode:"runtime_record",plan_id:h.plan_id},enabled:!0,delivery:{mode:"qimingclaw_runtime",plan_id:h.plan_id},template_id:h.plan_id,trigger_kind:"runtime_record",step_count:((_=h.steps)==null?void 0:_.length)??0,skill_ids:[...new Set((h.steps??[]).flatMap(p=>p.preferred_skills??[]))],delete_after_run:!1,created_at:h.created_at,next_run:h.updated_at??h.created_at,last_run:h.updated_at??h.created_at,last_status:h.status,last_output:null}}),f=new Set(d.map(h=>h.template_id));return[...d,...s.filter(h=>!f.has(h.template_id))]}return s}function wS(a,i,s){const c=ay(a,i);if(xl(s)){const d=Sn(s),f=Nt(s).filter(g=>!g.planId),h=d.map((g,j)=>{const S=Nc(s,g.id),E=Cc(g,S),$=S.filter(R=>Ie(R.status)==="success").length,A=S.filter(R=>Ie(R.status)==="danger").length,O=c.size===0?j<3:c.has(g.id);return{id:g.id,title:g.title,summary:g.objective||"qimingclaw 本地执行记录已同步到数字员工。",implemented:!0,selectable:!0,selected:O,status:E,status_label:$n(E),status_tone:Ie(E),schedule_text:S.length>0?`最近更新 ${Sc(qd(g,S))}`:"等待任务记录",result_text:S.length>0?`${S.length} 项任务,${$} 项完成,${A} 项异常`:`同步状态:${g.syncStatus}`,conversation_id:g.id}}),_=f.map((g,j)=>({id:g.id,title:g.title,summary:"未绑定 Plan 的 qimingclaw 本地任务记录。",implemented:!0,selectable:!0,selected:c.size===0?h.length+j<3:c.has(g.id),status:g.status,status_label:$n(g.status),status_tone:Ie(g.status),schedule_text:`最近更新 ${Sc(g.updatedAt)}`,result_text:g.syncError||`同步状态:${g.syncStatus}`,conversation_id:g.id})),p=new Set([...h,..._].map(g=>g.id));return[...h,..._,...Xp(a,i,s).filter(g=>!p.has(g.id))]}return Xp(a,i,s)}function Xp(a,i,s){const c=ay(a,i);return ca(s).map(d=>{const f=Us(d,s),h=vc[f.plan_id]??vc["qimingclaw-client-readiness"];return{id:f.plan_id,title:f.title,summary:f.objective??"等待 qimingclaw 执行链路补充任务说明。",implemented:!0,selectable:!0,selected:c.has(f.plan_id),status:f.status,status_label:dy(f.status),status_tone:ly(f.status),schedule_text:h.scheduleText,result_text:fy(f,s),conversation_id:f.plan_id}})}function fy(a,i){return a.plan_id==="qimingclaw-client-readiness"?[Xa(i,"agent","Agent"),Xa(i,"mcp","MCP"),`活跃会话:${(i==null?void 0:i.sessions.active)??0}`].join(";"):a.plan_id==="qimingclaw-remote-task-ingress"?[Xa(i,"computerServer","Computer Server"),Xa(i,"lanproxy","Lanproxy"),Xa(i,"fileServer","File Server")].join(";"):a.status==="running"?"正在同步客户端运行状态":"等待任务执行"}function Bs(a,i=null){const s=ca(i).filter(c=>!a||c.plan_id===a).map(c=>Us(c,i)).flatMap(ES);if(xl(i)){const c=Nt(i).filter(f=>!a||f.planId===a||f.id===a).map(bS),d=new Set(c.map(f=>f.task_id));return[...c,...s.filter(f=>!d.has(f.task_id))]}return s}function ES(a){return(a.steps??[]).flatMap(i=>(i.tasks??[]).map(s=>{var c;return{task_id:s.task_id,title:s.title,status:a.status==="running"&&s.status==="pending"?"running":s.status,plan_id:a.plan_id,step_id:i.step_id,assigned_skill_id:((c=i.preferred_skills)==null?void 0:c[0])??"",description:`${a.title} · ${i.title}`,created_at:a.created_at,updated_at:a.status==="running"?new Date().toISOString():a.created_at,started_at:s.status==="running"?ia(9,5):null,finished_at:s.status==="completed"?ia(9,10):null}}))}function kS(a){return a.filter(i=>i.status==="running"||i.status==="completed").map((i,s)=>({run_id:`qimingclaw-run-${s+1}`,task_id:i.task_id,plan_id:i.plan_id,skill_id:i.assigned_skill_id,attempt_no:1,lifecycle:i.status==="running"?"Running":"Succeeded",created_at:i.started_at??i.created_at,completed_at:i.finished_at,events:[{event_id:`${i.task_id}-event-start`,kind:"RunStarted",occurred_at:i.started_at??i.created_at,message:`${i.title} 已进入 qimingclaw 执行链路`}]}))}function Bd(a,i=null){const s=Bs(a,i);if(xl(i)){const c=new Set(s.map(f=>f.task_id)),d=_i(i).filter(f=>!f.taskId||c.has(f.taskId)).map(f=>SS(f,ra(i)));return{tasks:s,runs:d,total:s.length,truncated:!1}}return{tasks:s,runs:kS(s),total:s.length,truncated:!1}}function AS(a){const i=py(null,a),s=Bs(null,a),c=Bd(null,a).runs,d=$d(a);return{tables:{canonical_events:NS(a,s,c),tasks:s,runs:c,plans:i,plan_steps:d.length>0?d.map(f=>uy(f,Nt(a))):i.flatMap(f=>f.steps??[]),approvals:Dc(a),artifacts:Hd(a)}}}function TS(a){const i=Bs(null,a),s=i.filter(_=>Ie(_.status)==="waiting").length,c=i.filter(_=>Ie(_.status)==="running").length,d=i.filter(_=>Ie(_.status)==="success").length,f=i.filter(_=>Ie(_.status)==="danger").length,h=Dc(a);return{runtime:{active_tasks:c,failed_tasks:f,pending_confirmations:h.filter(_=>_.status==="pending").length},tasks:{total:i.length,queued:s,running:c,succeeded:d,failed:f},approvals:{total:h.length,pending:h.filter(_=>_.status==="pending").length}}}function NS(a,i,s){var _;const c=ra(a).map(p=>({event_id:p.id,aggregate_type:p.runId?"run":p.taskId?"task":"plan",aggregate_id:p.runId??p.taskId??p.planId??p.id,event_type:p.kind,kind:p.kind,message:p.message,occurred_at:p.occurredAt,timestamp:p.occurredAt,plan_id:p.planId??null,task_id:p.taskId??null})),d=s.flatMap(p=>(p.events??[]).map(g=>({event_id:g.event_id??`${p.run_id}:${g.kind??"event"}:${g.occurred_at??p.created_at}`,aggregate_type:"run",aggregate_id:p.run_id,event_type:g.kind??p.lifecycle,kind:g.kind??p.lifecycle,message:g.message??p.lifecycle,occurred_at:g.occurred_at??p.completed_at??p.created_at,timestamp:g.occurred_at??p.completed_at??p.created_at,plan_id:p.plan_id??null,task_id:p.task_id||null}))),f=i.map(p=>({event_id:`task-status-${p.task_id}`,aggregate_type:"task",aggregate_id:p.task_id,event_type:"task_status",kind:p.status,message:`${p.title}:${$n(p.status)}`,occurred_at:p.updated_at??p.created_at,timestamp:p.updated_at??p.created_at,plan_id:p.plan_id??null,task_id:p.task_id})),h=(((_=a==null?void 0:a.sync)==null?void 0:_.recentFailures)??[]).map(p=>({event_id:`digital-sync-failure-${p.id}`,aggregate_type:"sync_outbox",aggregate_id:p.id,event_type:"digital_sync_failed",kind:"digital_sync_failed",message:oy(p),occurred_at:p.lastAttemptAt??p.updatedAt??p.createdAt,timestamp:p.lastAttemptAt??p.updatedAt??p.createdAt,plan_id:null,task_id:null}));return CS([...c,...d,...f,...h]).sort((p,g)=>(g.occurred_at??"").localeCompare(p.occurred_at??""))}function CS(a){const i=new Set;return a.filter(s=>!s.event_id||i.has(s.event_id)?!1:(i.add(s.event_id),!0))}function Dc(a){var d;const i=sy(a).map(f=>({approval_id:f.id,task_id:f.taskId??"",status:f.status,created_at:f.createdAt,plan_id:f.planId??null,run_id:f.runId??null,title:f.title,reversible:f.status==="pending",source:"qimingclaw-runtime",sync_status:f.syncStatus,sync_error:f.syncError,payload:f.payload})),c=(((d=a==null?void 0:a.sync)==null?void 0:d.recentFailures)??[]).filter(f=>f.dueForRetry===!1||/credential|auth|token|unauthor/i.test(f.error??"")).slice(0,20).map(f=>({approval_id:`sync-review-${f.id}`,task_id:f.entityId,status:"pending",created_at:f.createdAt,title:`同步异常待处理:${f.entityType}/${f.entityId}`,reversible:!1,source:"qimingclaw-sync",error:f.error}));return[...i,...c]}function DS(a,i,s){var h;const c=new Map(Sn(s).map(_=>[_.id,_])),d=new Map(Nt(s).map(_=>[_.id,_])),f=((h=a.decisionResultsByDate)==null?void 0:h[i])??{};return Dc(s).filter(_=>le(_.source)==="qimingclaw-runtime").map(_=>{const p=_l(_.payload),g=le(_.approval_id)||`approval-${ua(le(_.task_id)||le(_.title)||"item")}`,j=f[g],S=RS(j,le(_.status)||"pending"),E=le(_.plan_id),$=le(_.task_id),A=E?c.get(E):null,O=$?d.get($):null;return{id:g,title:le(_.title)||le(p==null?void 0:p.title)||"待确认事项",scenario:zS(_,p),status:S,status_label:MS(S,j),plan_title:(A==null?void 0:A.title)||le(p==null?void 0:p.plan_title)||le(_.plan_id)||"qimingclaw 本地记录",task_title:(O==null?void 0:O.title)||le(p==null?void 0:p.task_title)||le(_.task_id)||"待确认任务",actions:OS(S)?[{id:"approved",label:"同意",tone:"primary"},{id:"rejected",label:"驳回",tone:"secondary"}]:[]}})}function zS(a,i){return le(i==null?void 0:i.scenario)||le(i==null?void 0:i.summary)||le(i==null?void 0:i.reason)||le(i==null?void 0:i.message)||le(a.error)||"来自 qimingclaw 本地运行记录的人工确认项。"}function RS(a,i){const s=String(a||"").toLowerCase();return["approve","approved","accept","accepted"].includes(s)?"approved":["reject","rejected","deny","denied"].includes(s)?"rejected":["dismiss","dismissed","skip","skipped"].includes(s)?"dismissed":i||"pending"}function MS(a,i){return i?a==="approved"?"已同意":a==="rejected"?"已驳回":a==="dismissed"?"已忽略":"已处理":a==="approved"?"已同意":a==="rejected"?"已驳回":a==="completed"?"已完成":a==="failed"?"异常":"待确认"}function OS(a){return["pending","requested"].includes(String(a||"").toLowerCase())}function Hd(a){const i=[...iy(a).map($S),..._i(a).flatMap(s=>my(s,ra(a))),...ra(a).flatMap(s=>dd(s.id,s.payload,s.occurredAt,{sourceType:"event",sourceEventId:s.id,sourceLabel:`Event ${s.kind}`,planId:s.planId,taskId:s.taskId,runId:s.runId}))];return hy(i)}function $S(a){const i=_l(a.payload);return{artifact_id:a.id,subject_id:a.runId??a.taskId??a.planId??a.id,kind:a.kind,name:a.name||le((i==null?void 0:i.name)??(i==null?void 0:i.title))||fd(a.uri??"")||a.kind,uri:a.uri||le((i==null?void 0:i.uri)??(i==null?void 0:i.url)??(i==null?void 0:i.path))||void 0,value:le((i==null?void 0:i.value)??(i==null?void 0:i.summary)??(i==null?void 0:i.text))||a.uri||a.name||a.kind,plan_id:a.planId??null,task_id:a.taskId??null,run_id:a.runId??null,created_at:a.createdAt,source:"qimingclaw-runtime",source_type:"artifact",source_label:jc("artifact",a.id),sync_status:a.syncStatus,sync_error:a.syncError,payload:a.payload}}function my(a,i){return hy([...dd(a.id,a.payload,a.finishedAt??a.startedAt??a.createdAt,{sourceType:"run",sourceLabel:jc("run",a.id),planId:a.planId,taskId:a.taskId,runId:a.id}),...i.filter(s=>s.runId===a.id).flatMap(s=>dd(a.id,s.payload,s.occurredAt,{sourceType:"event",sourceEventId:s.id,sourceLabel:`Event ${s.kind}`,planId:s.planId,taskId:s.taskId,runId:s.runId}))])}function dd(a,i,s,c){const d=_l(i);if(!d)return typeof i=="string"?[Io(a,i,0,s,c)]:[];const h=[...ic(d.artifacts),...ic(d.outputs),...ic(d.files),...ic(d.attachments)].map((_,p)=>Io(a,_,p,s,c));for(const _ of["artifact","outputPath","output_path","filePath","file_path","path","uri","url"])d[_]&&h.push(Io(a,d[_],h.length,s,c));return h.filter(_=>_.name||_.uri||_.value)}function Io(a,i,s,c,d){const f=_l(i);if(f){const _=le(f.uri??f.url??f.path??f.filePath??f.file_path??f.outputPath??f.output_path),p=le(f.name??f.title??f.filename)||fd(_)||`产物 ${s+1}`;return{artifact_id:le(f.artifact_id??f.id)||`artifact-${ua(a)}-${s+1}`,subject_id:le(f.subject_id)||a,kind:le(f.kind??f.type)||"artifact",name:p,uri:_,value:le(f.value??f.summary??f.text)||_,created_at:(le(f.created_at??f.createdAt)||c)??void 0,source:"qimingclaw-runtime",source_type:le(f.source_type)||(d==null?void 0:d.sourceType)||"payload",source_event_id:le(f.source_event_id)||(d==null?void 0:d.sourceEventId)||null,source_label:le(f.source_label)||(d==null?void 0:d.sourceLabel)||jc("payload",a),plan_id:le(f.plan_id)||(d==null?void 0:d.planId)||null,task_id:le(f.task_id)||(d==null?void 0:d.taskId)||null,run_id:le(f.run_id)||(d==null?void 0:d.runId)||null}}const h=String(i??"").trim();return{artifact_id:`artifact-${ua(a)}-${s+1}`,subject_id:a,kind:"artifact",name:fd(h)||`产物 ${s+1}`,uri:qS(h)?h:void 0,value:h,created_at:c??void 0,source:"qimingclaw-runtime",source_type:(d==null?void 0:d.sourceType)||"payload",source_event_id:(d==null?void 0:d.sourceEventId)||null,source_label:(d==null?void 0:d.sourceLabel)||jc("payload",a),plan_id:(d==null?void 0:d.planId)||null,task_id:(d==null?void 0:d.taskId)||null,run_id:(d==null?void 0:d.runId)||null}}function jc(a,i){const s=i?` ${i}`:"";switch(a){case"artifact":return`Artifact${s}`;case"event":return`Event${s}`;case"run":return`Run${s}`;case"task":return`Task${s}`;case"plan":return`Plan${s}`;default:return`Payload${s}`}}function hy(a){const i=new Set;return a.filter(s=>{const c=s.artifact_id||`${s.subject_id}:${s.uri||s.value||s.name}`;return!c||i.has(c)?!1:(i.add(c),!!(s.name||s.uri||s.value))})}function _l(a){return a&&typeof a=="object"&&!Array.isArray(a)?a:null}function ic(a){return Array.isArray(a)?a:[]}function le(a){return typeof a=="string"?a.trim():""}function qS(a){return/^(file|https?):\/\//i.test(a)||a.includes("/")||a.includes("\\")}function fd(a){return a?(a.split(/[?#]/)[0]||a).split(/[\\/]/).filter(Boolean).pop()??"":""}function ua(a){const i=a.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(i)return i;let s=0;for(let c=0;c>>0;return`item-${s.toString(36)}`}function py(a,i=null){const s=(a??"").trim().toLowerCase(),c=Ud(i);return s?c.filter(d=>d.title.toLowerCase().includes(s)||d.plan_id.toLowerCase().includes(s)||(d.objective??"").toLowerCase().includes(s)):c}function LS(a){const i=new Map(Sn(a).map(d=>[d.id,d])),s=new Map(Nt(a).map(d=>[d.id,d])),c=ra(a).map(d=>{const f=d.taskId?s.get(d.taskId):void 0,h=d.planId??(f==null?void 0:f.planId)??null,_=h?i.get(h):void 0,p=(f==null?void 0:f.status)??(_==null?void 0:_.status)??(d.kind.includes("failed")||d.kind.includes("error")?"failed":"running"),g=Ie(p);return{id:d.id,time:Sc(d.occurredAt),plan_title:(_==null?void 0:_.title)??"qimingclaw 本地执行",task_title:(f==null?void 0:f.title)??d.message,step_title:d.kind,detail:d.message||d.kind,status:p,status_label:$n(p),status_tone:g,updated_at:d.occurredAt,conversation_id:h??(f==null?void 0:f.id)??d.id}});return c.length>0?c:Nt(a).map(d=>{const f=d.planId?i.get(d.planId):void 0;return{id:`task-event-${d.id}`,time:Sc(d.updatedAt),plan_title:(f==null?void 0:f.title)??"qimingclaw 本地任务",task_title:d.title,step_title:d.assignedSkillId||"qimingclaw-runtime",detail:d.syncError||`${d.title}:${$n(d.status)},同步状态 ${d.syncStatus}`,status:d.status,status_label:$n(d.status),status_tone:Ie(d.status),updated_at:d.updatedAt,conversation_id:d.planId??d.id}})}function US(a,i,s){if(xl(s)){const f=LS(s);return Zp(f,s)}if(!i)return[{id:"event-await-confirmation",time:"待确认",plan_title:"任务设置",task_title:"等待确认今日任务",step_title:"选择职责",detail:"请先确认今天要执行的任务,确认后数字员工会开始执行。",status:"pending",status_label:"待确认",status_tone:"waiting",updated_at:new Date().toISOString(),conversation_id:null}];const d=a.filter(f=>f.selected).map(f=>({id:`event-${f.id}`,time:f.status==="running"?"实时":"待执行",plan_title:f.title,task_title:f.title,step_title:f.status==="running"?"同步 qimingclaw 服务状态":"等待调度",detail:f.status==="running"?`${f.result_text}。快照时间:${(s==null?void 0:s.generatedAt)??"未连接 bridge"}`:"任务已确认,将在后续阶段接入 ACP/MCP 真实执行事件。",status:f.status==="running"?"running":"pending",status_label:f.status==="running"?"执行中":"待执行",status_tone:f.status==="running"?"running":"waiting",updated_at:new Date().toISOString(),conversation_id:f.conversation_id}));return Zp(d,s)}function Zp(a,i){const s=i==null?void 0:i.sync;if(s&&(s.pending>0||s.failed>0||s.lastSyncAt)){const c=(s.recentFailures||[]).slice(0,3).map(oy).join(";");return[...a,{id:"event-management-sync",time:s.syncing?"实时":"同步",plan_title:"管理端联动",task_title:"同步数字员工本地状态",step_title:s.failed>0?"同步补偿":"outbox 推送",detail:[od(i),s.lastSyncError?`错误:${s.lastSyncError}`:"",c?`最近失败:${c}`:""].filter(Boolean).join("。"),status:s.failed>0?"failed":s.syncing||s.pending>0?"running":"completed",status_label:s.failed>0?"异常":s.syncing||s.pending>0?"同步中":"已同步",status_tone:s.failed>0?"danger":s.syncing||s.pending>0?"running":"success",updated_at:s.lastSyncAt??new Date().toISOString(),conversation_id:"qimingclaw-management-sync"}]}return a}function BS(a,i){return(a.some(c=>c.selected)?a.filter(c=>c.selected):a).map(c=>{const d=i.filter(g=>g.conversation_id===c.conversation_id),f=d.filter(g=>g.status==="running").length,h=d.filter(g=>g.status==="completed").length,_=d.filter(g=>Ie(g.status)==="danger").length,p=Math.max(0,d.length-f-h-_);return{id:c.id,plan_id:c.id,title:c.title,description:c.summary,selected:c.selected,total_count:Math.max(d.length,1),success_count:h,failure_count:_,running_count:f,waiting_count:d.length===0?1:p,latest_status_label:_>0?"异常":f>0?"执行中":h>0?"已完成":"待执行",latest_status_tone:_>0?"danger":f>0?"running":h>0?"success":"waiting",business_summary:c.result_text,ai_summary:"当前由 qimingclaw 本地运行记录生成。"}})}function HS(a){return a.map(i=>({id:`run-detail-${i.id}`,time:i.time,task_name:i.task_title,step_name:i.step_title,operation_name:i.plan_title,status_label:i.status_label,status_tone:i.status_tone,business_detail:i.detail,raw_detail:i.detail,updated_at:i.updated_at,conversation_id:i.conversation_id}))}function gy(a,i){const s=(i==null?void 0:i.uiState)??Rd(),c=s.confirmedDates[a]??null,d=!!c,f=wS(s,a,i),h=US(f,d,i),_=BS(f,h),p=s.reportGeneratedAtByDate[a]??null,g=f.filter(K=>K.selected).length,j=h.filter(K=>K.status==="running").length,S=h.filter(K=>Ie(K.status)==="success").length,E=h.filter(K=>Ie(K.status)==="danger").length,$=Sn(i).length+Nt(i).length,A=xl(i),O=i==null?void 0:i.sync,R=GS(Hd(i)),q=mS(i),F=q.filter(K=>K.requires_human_action||K.status==="degraded"),Z=q.filter(K=>K.running).length,P=gS(i),te=yS(i),he=te.filter(K=>K.can_retry||K.can_skip||K.can_cancel);return{source:"live",date:a,employee:{name:s.profile.name,title:"数字员工",major:"qimingclaw 客户端任务执行",company:s.profile.company,position:s.profile.position,current_status:s.profile.currentStatus,current_status_label:s.profile.currentStatus==="resting"?"休息中":"工作中",motto:"承接客户端任务,调度 ACP 与 MCP 能力完成执行。"},workday:{confirmed:d,confirmed_at:c,current_status:s.profile.currentStatus,current_status_label:s.profile.currentStatus==="resting"?"休息中":"工作中",status_label:A?E>0||F.length>0?"有异常":j>0?"执行中":"已同步":d?"运行中":"待确认",status_tone:A?E>0||F.length>0?"danger":j>0?"running":"success":d?"running":"waiting",summary:A?`当前日期 ${lc(a)} 已读取 ${$} 条 qimingclaw 本地运行记录,${Qp(q)}。`:d?`当前日期 ${lc(a)} 已确认 ${g} 项任务。`:`当前日期 ${lc(a)} 待确认今日任务。`,bubble_text:A?F.length>0?`我发现 ${F.length} 项常驻服务需要处理,会把影响到的任务标出来。`:"我已接入 qimingclaw 本地运行记录,会持续展示真实任务、事件和同步状态。":d?"我已接入 qimingclaw 客户端执行链路,正在等待真实 Run/Event 数据接入。":"请先确认今天要执行的任务,我会把它们映射到 qimingclaw 执行链路。"},overview:{title:"今日执行",status_label:A?"本地真实记录":d?"真实数据":"待确认",status_tone:E>0?"danger":A||d?"success":"waiting",metrics:[{label:"已选任务",value:String(g)},{label:"运行记录",value:String(h.length)},{label:"执行中",value:String(j)},{label:"已完成",value:String(S)},{label:"异常",value:String(E)},{label:"待同步",value:String((O==null?void 0:O.pending)??0)},{label:"同步异常",value:String((O==null?void 0:O.failed)??0)},{label:"服务运行",value:`${Z}/${q.length}`},{label:"需处理服务",value:String(F.length)},{label:"Plan Agent",value:String(P.length)},{label:"Task Agent",value:String(te.length)},{label:"可治理任务",value:String(he.length)}]},managed_services:q,plan_agents:P,task_agents:te,duties:f,events:h,execution_summaries:_,run_details:HS(h),decisions:DS(s,a,i),delivery:{headline:A?"qimingclaw 本地记录已接入":d?"qimingclaw 执行链路已接入":"等待确认任务设置",summary:A?"数字员工页面正在读取本地 Plan / Task / Run / Event,并同步展示管理端 outbox 状态。":"当前阶段已将数字员工页面切换到 qimingclaw adapter,并开始读取客户端服务状态。",lines:["已吸收 sgRobot 数字员工 UI 和核心展示模型。",A?`已读取本地记录:Plan ${Sn(i).length} / Task ${Nt(i).length} / Run ${_i(i).length} / Event ${ra(i).length}。`:"已建立 qimingclaw workday/plans/tasks/skills API adapter。",Xa(i,"agent","Agent"),Xa(i,"mcp","MCP"),Xa(i,"computerServer","Computer Server"),Qp(q),...F.slice(0,3).map(hS),`Plan Agent:${P.length} 个计划代理,Task Agent:${te.length} 个任务代理。`,he[0]?`待治理任务:${he[0].title},下一步 ${he[0].next_action}。`:"Task Agent:暂无需要重试、跳过或取消的任务。",od(i),`活跃会话:${(i==null?void 0:i.sessions.active)??0} / ${(i==null?void 0:i.sessions.total)??0}`],artifacts:[{name:"数字员工运行摘要",status:p?"ready":"pending"},...R.slice(0,4).map(K=>({name:K.name,status:p?"ready":"available",uri:K.uri??null,source_label:K.source_label??null,source_type:K.source_type??null}))]},daily_report:{date:a,title:`${lc(a)} 飞天数字员工日报`,report_schedule_time:s.reportScheduleTime,status:p?"ready":"not_generated",generated_at:p,generated_by:p?"ai":"fallback",model:"qimingclaw-adapter",source:"qimingclaw",summary:p?`今日已完成数字员工页面到 qimingclaw adapter 的接入,并读取了 qimingclaw 服务状态。${od(i)}。`:"日报将在生成后汇总任务选择、运行明细和后续接入建议。",totals:{task_count:g,execution_count:h.length,success_count:S,failure_count:E,running_count:j},task_sections:_,detail_lines:h.map(K=>`${K.time} ${K.task_title}:${K.detail}`),artifact_sources:R,pdf_available:!!p,pdf_url:null}}}function GS(a){return a.slice(0,20).map(i=>({id:le(i.artifact_id)||`${le(i.subject_id)}:${le(i.uri??i.name)}`,name:le(i.name)||le(i.uri)||le(i.value)||"未命名产物",kind:le(i.kind)||null,uri:le(i.uri)||null,source_label:le(i.source_label)||null,source_type:le(i.source_type)||null,source_event_id:le(i.source_event_id)||null,plan_id:le(i.plan_id)||null,task_id:le(i.task_id)||null,run_id:le(i.run_id)||null,created_at:le(i.created_at)||null}))}async function YS(a,i){const s=(i==null?void 0:i.uiState)??await Md()??Rd(),c=a.date||Od();a.action==="confirm_workday"&&(s.selectedDutyIdsByDate[c]=a.duty_ids??[],s.confirmedDates[c]=new Date().toISOString()),a.action==="update_profile"&&(s.profile={name:a.name||s.profile.name,company:a.company||s.profile.company,position:a.position||s.profile.position,currentStatus:a.current_status||s.profile.currentStatus}),a.action==="update_report_schedule"&&(s.reportScheduleTime=a.report_schedule_time||s.reportScheduleTime),a.action==="generate_daily_report"&&(a.duty_ids&&(s.selectedDutyIdsByDate[c]=a.duty_ids),a.report_schedule_time&&(s.reportScheduleTime=a.report_schedule_time),s.reportGeneratedAtByDate[c]=new Date().toISOString()),a.action==="decide_approval"&&a.decision_id&&(s.decisionResultsByDate=s.decisionResultsByDate??{},s.decisionResultsByDate[c]={...s.decisionResultsByDate[c]??{},[a.decision_id]:a.decision||"resolved"});const d=a.action==="decide_approval"?await QS(a,i):null,f=await Pg(s,a.action,c,a.action==="decide_approval"?{decision_id:a.decision_id,decision:a.decision,acp_permission:d}:void 0);return gy(c,{...i??{generatedAt:new Date().toISOString(),services:{},sessions:{total:0,active:0,items:[]}},uiState:f})}async function QS(a,i){var h,_;if(!a.decision_id||!a.decision)return null;const s=KS(a.decision_id,i);if(!s)return null;const c=XS(s);if(!c)return null;const d=ZS(a.decision),f=(_=(h=window.QimingClawBridge)==null?void 0:h.digital)==null?void 0:_.respondPermission;if(!f)return null;try{const p=await f(c.sessionId,c.permissionId,d);return{permission_id:c.permissionId,session_id:c.sessionId,response:d,success:(p==null?void 0:p.success)!==!1,error:p==null?void 0:p.error}}catch(p){return{permission_id:c.permissionId,session_id:c.sessionId,response:d,success:!1,error:p instanceof Error?p.message:String(p)}}}function KS(a,i){return Dc(i).find(s=>le(s.approval_id)===a)??null}function XS(a){const i=_l(a.payload),s=_l(i==null?void 0:i.payload),c=le(i==null?void 0:i.permissionId)||le(i==null?void 0:i.permission_id)||le(i==null?void 0:i.id)||le(s==null?void 0:s.permissionId)||le(s==null?void 0:s.permission_id)||le(s==null?void 0:s.id),d=le(i==null?void 0:i.sessionId)||le(i==null?void 0:i.session_id)||le(s==null?void 0:s.sessionId)||le(s==null?void 0:s.session_id),f=le(i==null?void 0:i.source);return!c||!d||f&&f!=="acp-permission"?null:{permissionId:c,sessionId:d}}function ZS(a){const i=a.toLowerCase();return i.includes("always")?"always":i.includes("reject")||i.includes("deny")?"reject":"once"}async function Gd(a,i){var j,S,E,$,A,O,R,q,F,Z,P,te,he,K,ie,ne,be,Be,Re,Q,re;const s=`qimingclaw-digital-${a.command_kind}-${Date.now()}`,c=a.correlation_id||s,d=oe((j=a.context_refs)==null?void 0:j.plan_id)||oe((S=a.payload)==null?void 0:S.plan_id)||oe((E=a.payload)==null?void 0:E.original_plan_id),f=oe(($=a.context_refs)==null?void 0:$.task_id)||oe((A=a.payload)==null?void 0:A.task_id)||oe((O=a.payload)==null?void 0:O.original_task_id),h=oe((R=a.context_refs)==null?void 0:R.run_id)||oe((q=a.payload)==null?void 0:q.run_id)||oe((F=a.payload)==null?void 0:F.latest_run_id),_=oe((Z=a.context_refs)==null?void 0:Z.step_id)||oe((P=a.payload)==null?void 0:P.step_id)||oe((te=a.payload)==null?void 0:te.stepId),p=oe((he=a.context_refs)==null?void 0:he.schedule_id)||oe((K=a.payload)==null?void 0:K.schedule_id);if(a.command_kind==="create_plan"){const L=`qimingclaw-local-${ua(oe((ie=a.payload)==null?void 0:ie.title)||d||"plan")}-${Date.now()}`,N=pl(s,c,"已在 qimingclaw 兼容层创建本地计划草稿。",{plan_id:L,status:"draft",source:"qimingclaw-adapter",requested_action:(ne=a.payload)==null?void 0:ne.requested_action,original_plan_id:((be=a.payload)==null?void 0:be.original_plan_id)??d});return await Ka(a,N),N}if(a.command_kind==="activate_plan"||a.command_kind==="run_schedule_now"){const L=d||((Be=Ld(i)[0])==null?void 0:Be.plan_id)||((Re=ca(i)[0])==null?void 0:Re.plan_id)||"qimingclaw-client-readiness",N=await _y(L,i,{recordCommand:!1}),Y=pl(s,c,"已映射为 qimingclaw 本地任务激活。",{plan_id:L,status:"active",dispatched_tasks:N.dispatched_tasks,source:"qimingclaw-adapter"});return await Ka(a,Y),Y}if(a.command_kind==="create_schedule"){const L=pl(s,c,"已记录 qimingclaw 兼容定时任务请求。",{schedule_id:p||`qimingclaw-schedule-${Date.now()}`,plan_id:d,status:"enabled",source:"qimingclaw-adapter"});return await Ka(a,L),L}if(["update_schedule","pause_schedule","resume_schedule","delete_schedule"].includes(a.command_kind)){const L=a.command_kind==="pause_schedule"?"paused":a.command_kind==="delete_schedule"?"deleted":"enabled",N=pl(s,c,`已接受 ${a.command_kind},并更新 qimingclaw 本地定时任务状态。`,{schedule_id:p||`qimingclaw-schedule-${Date.now()}`,plan_id:d,status:L,source:"qimingclaw-adapter"});return await Ka(a,N),N}if(["submit_plan","approve_plan","amend_plan","resume_plan","pause_plan","cancel_plan"].includes(a.command_kind)){const L=pl(s,c,`已接受 ${a.command_kind},当前由 qimingclaw 本地 adapter 记录兼容状态。`,{plan_id:d,status:a.command_kind==="approve_plan"?"approved":a.command_kind==="submit_plan"?"reviewing":"accepted",source:"qimingclaw-adapter"});return await Ka(a,L),L}if(["retry_task","skip_task","pause_task","resume_task","provide_task_input","cancel_task","start_run","cancel_run"].includes(a.command_kind)){const L=f||((Q=Nt(i)[0])==null?void 0:Q.id)||"qimingclaw-task-agent",N=Nt(i).find(Se=>Se.id===L),Y=h||((re=cy(_i(i),L))==null?void 0:re.id)||null,ae=_||(N?Ls(N):null),me=pl(s,c,`已接受 ${a.command_kind},并记录到 qimingclaw Task Agent 控制平面。`,{plan_id:d||(N==null?void 0:N.planId)||"qimingclaw-task-agent-plan",task_id:L,run_id:Y,step_id:ae,task_agent_id:`task-agent-${ua(L)}`,status:VS(a.command_kind),next_action:JS(a.command_kind),source:"qimingclaw-task-agent"});return await Ka(a,me),me}const g={command_id:s,accepted:!1,correlation_id:c,error:"missing_capability",message:`qimingclaw 数字员工兼容层尚未支持 ${a.command_kind}。`};return await Ka(a,g),g}function pl(a,i,s,c){return{command_id:a,accepted:!0,correlation_id:i,message:s,result:c}}function VS(a){switch(a){case"retry_task":case"start_run":case"resume_task":return"running";case"skip_task":return"skipped";case"cancel_task":case"cancel_run":return"cancelled";case"pause_task":return"paused";default:return"accepted"}}function JS(a){switch(a){case"retry_task":return"start_retry_run";case"skip_task":return"continue_next_task";case"pause_task":return"await_resume";case"resume_task":return"watch_progress";case"provide_task_input":return"resume_with_input";case"cancel_task":case"cancel_run":return"close_execution";case"start_run":return"watch_progress";default:return"record_control_event"}}function oe(a){return typeof a=="string"&&a.trim()?a.trim():""}function yy(a,i=null){var d,f,h,_;if(xl(i)){const p=Sn(i).find(q=>q.id===a),g=Bs(a,i),j=ry(i,a),S=Bd(a,i).runs,E=ra(i).filter(q=>q.planId===a||g.some(F=>F.task_id===q.taskId)),$=(p==null?void 0:p.title)??((d=g[0])==null?void 0:d.title)??a,A=(p==null?void 0:p.objective)??"qimingclaw 本地运行记录",O=[];let R=2;if(j.length>0){const q=new Set(j.map(Z=>Z.id));for(const Z of j){O.push({seq:R++,lane:"qimingclaw",label:Z.title,sub_label:`${$n(Z.status)} · 依赖 ${Z.dependsOn.length} · 技能 ${Z.preferredSkillIds.length}`,timestamp:Z.updatedAt,color:"#22c55e",source_type:"plan_step"});for(const P of g.filter(te=>te.step_id===Z.id))O.push(Wo(P,R++))}const F=g.filter(Z=>!q.has(Z.step_id||""));if(F.length>0){O.push({seq:R++,lane:"qimingclaw",label:"未归属步骤",sub_label:`包含 ${F.length} 个任务`,timestamp:((f=F[0])==null?void 0:f.updated_at)??new Date().toISOString(),color:"#22c55e",source_type:"plan_step"});for(const Z of F)O.push(Wo(Z,R++))}}else for(const q of g)O.push(Wo(q,R++));return{plan_id:a,plan_title:$,plan_status:p?Cc(p,Nc(i,p.id)):(h=g[0])==null?void 0:h.status,plan_objective:A,lanes:[{key:"intent",label:"目标",color:"#38bdf8"},{key:"qimingclaw",label:"qimingclaw",color:"#22c55e"},{key:"execution",label:"执行",color:"#f59e0b"}],steps:[{seq:1,lane:"intent",label:$,sub_label:A,timestamp:(p==null?void 0:p.createdAt)??((_=g[0])==null?void 0:_.created_at)??new Date().toISOString(),color:"#38bdf8",source_type:"plan"},...O,...S.map((q,F)=>({seq:R+F,lane:"execution",label:q.lifecycle||"Run",sub_label:q.run_id,timestamp:q.completed_at??q.created_at,color:"#f59e0b",source_type:"run"}))],events:E.map(q=>({event_id:q.id,kind:q.kind,occurred_at:q.occurredAt,message:q.message}))}}const s=Us(ca(i).find(p=>p.plan_id===a)??ca(i)[0],i),c=new Date().toISOString();return{plan_id:s.plan_id,plan_title:s.title,plan_status:s.status,plan_objective:s.objective,lanes:[{key:"intent",label:"目标",color:"#38bdf8"},{key:"qimingclaw",label:"qimingclaw",color:"#22c55e"},{key:"execution",label:"执行",color:"#f59e0b"}],steps:[{seq:1,lane:"intent",label:s.title,sub_label:s.objective,timestamp:s.created_at,color:"#38bdf8",source_type:"plan"},{seq:2,lane:"qimingclaw",label:"接入客户端能力",sub_label:"ACP / MCP / computer server adapter",timestamp:c,color:"#22c55e",source_type:"adapter"},{seq:3,lane:"execution",label:s.status==="running"?"已读取 qimingclaw 服务状态":"等待调度",sub_label:fy(s,i),timestamp:c,color:"#f59e0b",source_type:"run"}],events:[{event_id:`${s.plan_id}-adapter-event`,kind:"qimingclaw_adapter",occurred_at:c,message:"数字员工页面已通过 qimingclaw adapter 获取数据。"}]}}function Wo(a,i){return{seq:i,lane:"qimingclaw",label:a.title,sub_label:`${$n(a.status)} · ${a.assigned_skill_id||"qimingclaw-runtime"}`,timestamp:a.updated_at,color:"#22c55e",source_type:"task"}}function FS(a,i=null){const s=Nt(i).find(h=>h.id===a);if(!s)return yy(a,i);const c=s.planId?Sn(i).find(h=>h.id===s.planId):null,d=_i(i).filter(h=>h.taskId===s.id),f=ra(i).filter(h=>h.taskId===s.id||d.some(_=>_.id===h.runId));return{plan_id:s.planId??s.id,plan_title:(c==null?void 0:c.title)??s.title,plan_status:s.status,plan_objective:(c==null?void 0:c.objective)??"qimingclaw 本地任务记录",lanes:[{key:"task",label:"任务",color:"#38bdf8"},{key:"execution",label:"执行",color:"#22c55e"},{key:"event",label:"事件",color:"#f59e0b"}],steps:[{seq:1,lane:"task",label:s.title,sub_label:`${$n(s.status)} · ${s.assignedSkillId||"qimingclaw-runtime"}`,timestamp:s.updatedAt,color:"#38bdf8",source_type:"task"},...d.map((h,_)=>({seq:_+2,lane:"execution",label:h.status||"Run",sub_label:h.id,timestamp:h.finishedAt??h.startedAt??h.createdAt,color:"#22c55e",source_type:"run"})),...f.map((h,_)=>({seq:d.length+_+2,lane:"event",label:h.kind,sub_label:h.message,timestamp:h.occurredAt,color:"#f59e0b",source_type:"event"}))],events:f.map(h=>({event_id:h.id,kind:h.kind,occurred_at:h.occurredAt,message:h.message}))}}async function _y(a,i=null,s={}){const c=(i==null?void 0:i.uiState)??await Md()??Rd(),d=Od(),f=Ud(i).find(j=>j.plan_id===a),h=Date.now(),_=`dispatch-${a}-${h}`,p=new Set(c.selectedDutyIdsByDate[d]??[]);p.add(a),c.selectedDutyIdsByDate[d]=[...p],c.confirmedDates[d]=c.confirmedDates[d]??new Date().toISOString(),await Pg(c,"confirm_workday",d);const g=Bs(a,i).map(j=>({task_id:j.task_id,title:j.title,status:j.status==="pending"?"running":j.status}));return s.recordCommand!==!1&&await Ka({command_kind:"activate_plan",context_refs:{plan_id:a},payload:{plan_id:a,title:f==null?void 0:f.title,objective:f==null?void 0:f.objective,requested_action:"dispatch_plan"},correlation_id:_},pl(`qimingclaw-digital-dispatch-${ua(a)}-${h}`,_,"已将数字员工模板执行写入 qimingclaw 本地运行记录。",{plan_id:a,status:"active",dispatched_tasks:g,source:"qimingclaw-adapter"})),{ok:!0,plan_id:a,source_plan_id:a,dispatched_tasks:g}}function IS(a,i=null){const s=Sn(i).find(d=>d.id===a);if(s){const d=ra(i).filter(f=>f.planId===a).slice(0,12);return[{role:"user",content:`查看 qimingclaw 本地任务:${s.title}`,created_at:s.createdAt},...d.map(f=>({role:"assistant",content:`${f.kind}:${f.message}`,created_at:f.occurredAt}))]}const c=ca(i).find(d=>d.plan_id===a)??ca(i)[0];return[{role:"user",content:`执行数字员工任务:${c.title}`,created_at:c.created_at},{role:"assistant",content:`已接入 qimingclaw adapter。目标:${c.objective??c.title}`,created_at:new Date().toISOString()}]}const WS=9e3,vy=2e4;class PS extends Error{constructor(){super("Unauthorized"),this.name="UnauthorizedError"}}async function dn(a,i={}){const s=await P0(a,i);if(s!==void 0)return s;const{timeoutMs:c=WS,...d}=i,f=Z0(),h=new Headers(d.headers),_=new AbortController;let p=!1;const g=window.setTimeout(()=>{p=!0,_.abort()},c),j=d.signal,S=()=>_.abort();j&&(j.aborted?_.abort():j.addEventListener("abort",S,{once:!0})),f&&h.set("Authorization",`Bearer ${f}`),d.body&&typeof d.body=="string"&&!h.has("Content-Type")&&h.set("Content-Type","application/json");let E;try{E=await fetch(`${X0()}${K0}${a}`,{...d,headers:h,signal:_.signal})}catch($){throw $ instanceof DOMException&&$.name==="AbortError"&&p?new Error(`API request timed out after ${c/1e3}s: ${a}`):$}finally{window.clearTimeout(g),j==null||j.removeEventListener("abort",S)}if(E.status===401)throw V0(),window.dispatchEvent(new Event("qimingclaw-digital-unauthorized")),new PS;if(!E.ok){const $=await E.text().catch(()=>"");let A=$||E.statusText;if($)try{const O=JSON.parse($);typeof O.message=="string"&&O.message.trim()?A=O.message.trim():typeof O.error=="string"&&O.error.trim()&&(A=O.error.trim())}catch{A=$}throw new Error(`API ${E.status}: ${A}`)}if(E.status!==204)return E.json()}function ex(a,i){if(a!==null&&typeof a=="object"&&!Array.isArray(a)&&i in a){const s=a[i];if(s!==void 0)return s}return a}function tx(){return dn("/api/scheduler/jobs").then(a=>ex(a,"jobs"))}function Vp(a){return dn(`/api/plan/${encodeURIComponent(a)}/messages`).then(i=>({messages:i.messages||[]}))}function md(a){return dn("/api/governance/command",{method:"POST",body:JSON.stringify(a)})}function mc(a){const i=a?`?date=${encodeURIComponent(a)}`:"";return dn(`/api/digital-employee/workday${i}`,{timeoutMs:vy})}function yl(a){return dn("/api/digital-employee/workday/actions",{method:"POST",body:JSON.stringify(a)})}function nx(a){return dn(`/api/debug/plan/${encodeURIComponent(a)}/dispatch`,{method:"POST",timeoutMs:vy})}function ax(){return dn("/api/debug/plans?limit=80").then(a=>a.plans??[])}function Jp(a,i=50){const s=new URLSearchParams({limit:String(i),q:a});return dn(`/api/debug/plans?${s}`).then(c=>c.plans??[])}function lx(a){const i=new URLSearchParams({limit:"50",plan_id:a});return dn(`/api/debug/tasks?${i}`).then(s=>({tasks:s.tasks??[],runs:s.runs??[],total:s.total,truncated:s.truncated}))}function ix(a){return dn(`/api/debug/plan/${encodeURIComponent(a)}/flow`)}function sx(){return dn("/api/skill").then(a=>a.skills??[])}function rx(a,i){return dn(`/api/skill/${encodeURIComponent(a)}/enabled`,{method:"POST",body:JSON.stringify({enabled:i})})}const cx=Q0,ux=`${cx}/digital-assets`,hl=`${ux}/avatars`,ox="Asia/Shanghai",dx=["skill","browser","call","redial","evidence","decision","reporting"],fx=[{id:"all",label:"全部"},{id:"running",label:"执行中"},{id:"success",label:"已完成"},{id:"danger",label:"异常"}],by="qimingclaw:digital-workday-guide-dismissed-date",Sy="sgrobot:digital-workday-guide-dismissed-date",mx=80,Fp=300,hx=[{title:"确认日期",body:"先确认今天的值班日期,避免把昨天或明天的任务混在一起。"},{title:"选择任务",body:"从岗位职责里勾选今天要执行的任务,未接入能力保持待扩展。"},{title:"任务执行",body:"点击任务执行后,数字员工开始按已选任务推进工作。"},{title:"查看过程",body:"右侧滚动显示运行明细,任务中心可继续查看明细。"}],px={skill:{id:"skill",label:"查看Skill",shortLabel:"技能",phase:"查看Skill与计划",src:`${hl}/states/employee-idle.png`,bubble:"我正在查看可用Skill、任务计划和今天要勾选的执行内容。"},browser:{id:"browser",label:"操作浏览器",shortLabel:"浏览器",phase:"操作浏览器执行",src:`${hl}/states/employee-browser.png`,bubble:"我正在打开页面、读取信息、填写表单,并把执行过程同步到右侧。"},call:{id:"call",label:"电话外呼",shortLabel:"外呼",phase:"电话外呼与重拨",src:`${hl}/states/employee-running.png`,bubble:"我正在按工单名单外呼现场人员,记录接通、未接通和后续重拨。"},redial:{id:"redial",label:"重拨跟进",shortLabel:"重拨",phase:"未接通人员重拨",src:`${hl}/states/employee-redial.png`,bubble:"我正在跟进未接通人员,按间隔重拨并更新每个人的通知状态。"},evidence:{id:"evidence",label:"数据核验",shortLabel:"核验",phase:"核验执行证据",src:`${hl}/states/employee-evidence.png`,bubble:"我正在核验页面数据、执行证据和任务结果,确认交付内容可信。"},decision:{id:"decision",label:"等待决策",shortLabel:"决策",phase:"等待人工确认",src:`${hl}/states/employee-decision.png`,bubble:"我已完成前置处理,现在需要人工确认后再继续推进。"},reporting:{id:"reporting",label:"汇报成果",shortLabel:"汇报",phase:"汇报今日成果",src:`${hl}/states/employee-reporting.png`,bubble:"我正在整理运行明细和日报,方便你直接查看成果和异常。"}};function hd(){const a=new Date;return[a.getFullYear(),String(a.getMonth()+1).padStart(2,"0"),String(a.getDate()).padStart(2,"0")].join("-")}function gx(a){return(a||hd()).split("-").join("/")}function sc(a){return a==="success"?"de-badge-success":a==="danger"?"de-badge-danger":a==="warning"||a==="running"?"de-badge-warning":"de-badge-info"}function yx(a,i){const s=["de-template-card-row","de-duty-card","de-duty-card--compact"];return a.implemented||s.push("de-duty-card--disabled"),i&&s.push("de-duty-card--selected"),a.statusTone==="running"&&s.push("de-duty-card--running"),s.join(" ")}function qn(a){return String(a||"").replace(/\s+/g," ").trim()}function _x(a){if(!a)return"";if(a.expression)return a.expression;if(typeof a.schedule=="string")return a.schedule;if(a.schedule&&typeof a.schedule=="object"){const i=a.schedule,s=i.expr??i.expression??i.cron;if(typeof s=="string")return s}return""}function vx(a){const i=_x(a);if(!i)return"未定时";const s=i.trim().split(/\s+/),c=s[0]??"",d=s[1]??"";return s.length>=2&&/^\d+$/.test(c)&&/^\d+$/.test(d)?`已定时 ${d.padStart(2,"0")}:${c.padStart(2,"0")} 执行`:`调度注册 ${i}`}function wc(a,i){if(!a||typeof a!="object")return"";const s=a;for(const c of i){const d=s[c];if(typeof d=="string"&&d.trim())return d.trim()}return""}function pi(a){const i=qn(a.template_id);if(i)return i;const s=wc(a.delivery,["template_id","plan_template_id","templateId"]);if(s)return s;const c=wc(a.schedule,["template_id","plan_template_id","templateId"]);return c||a.id.replace(/^schedule-/,"")}function bx(a,i,s){return a.has(i)||s?!0:Array.from(a).some(c=>Ms(c,i))}function Ms(a,i){return a.startsWith(`${i}-`)?/^-\d{8,}$/.test(a.slice(i.length)):!1}function Sx(a,i,s){if(a.id===i||a.conversation_id===i||Ms(a.id,i)||a.conversation_id&&Ms(a.conversation_id,i))return!0;const c=qn(s).toLowerCase();return!!(c&&qn(a.title).toLowerCase()===c)}function xy(a,i,s){const c=s.filter(d=>Sx(d,a,i));return c.find(d=>d.selected)??c.find(d=>d.id===a||d.conversation_id===a)??c[0]??null}function xx(a,i){var s;return((s=xy(a.id,a.title,i))==null?void 0:s.id)??a.id}function jx(a){return typeof a.step_count=="number"&&Number.isFinite(a.step_count)?a.step_count:Array.isArray(a.skill_ids)?a.skill_ids.length:0}function wx(a){const i=qn(a.trigger_kind||wc(a.schedule,["kind"])).toLowerCase();return i==="cron"?"定时任务":i==="webhook"?"触发任务":"手动任务"}function Ex(a,i,s){const c=pi(a),d=xy(c,a.name,i),f=jx(a),h=Array.isArray(a.skill_ids)?a.skill_ids.length:f,_=(d==null?void 0:d.status)??a.last_status??(a.enabled?"plan_template":"disabled"),p=(d==null?void 0:d.status_label)??(a.enabled?wx(a):"已停用"),g=(d==null?void 0:d.status_tone)??(a.enabled?"info":"waiting");return{id:c,planId:c,title:qn(a.name)||c,summary:qn(a.prompt)||`任务:${c}`,implemented:a.enabled,selectable:!0,selected:s,status:_,statusLabel:p,statusTone:g,scheduleText:(d==null?void 0:d.schedule_text)??vx(a),resultText:(d==null?void 0:d.result_text)??`${f} 个步骤,${h} 个Skill`,conversationId:(d==null?void 0:d.conversation_id)??c,stepCount:f,taskCount:h,schedulerJob:a,source:"plan_template"}}function rc(a){return a.implemented}function cc(a){return a.implemented?"":"当前任务未接入执行能力。"}function kx(a,i){const s=`${a.conversation_id??""} ${a.plan_title} ${a.task_title} ${a.step_title??""} ${a.detail}`;return s.includes(i.id)||s.includes(i.title)}function Ax(a,i){const s=i.filter(p=>kx(p,a)),c=s.filter(Rc).length,d=s.filter(Mc).length,f=s.filter(zc).length,h=Math.max(s.length-c-d-f,0),_=s.length>0?s[s.length-1]:void 0;return{id:a.id,plan_id:a.planId,title:a.title,description:a.summary,selected:!0,total_count:s.length,success_count:c,failure_count:d,running_count:f,waiting_count:h,latest_status_label:(_==null?void 0:_.status_label)??a.statusLabel,latest_status_tone:(_==null?void 0:_.status_tone)??a.statusTone,business_summary:s.length>0?`${a.title} 今日执行 ${s.length} 次,成功 ${c} 次,失败 ${d} 次。`:`${a.title} 尚未产生执行记录。`,ai_summary:s.length>0?`${a.title} 今日执行 ${s.length} 次,成功 ${c} 次,失败 ${d} 次。`:`${a.title} 尚未产生执行记录。`}}function Tx(a,i){const s=a.plan_id??"";return a.id===i.id||s===i.planId||Ms(a.id,i.id)||Ms(s,i.planId)?!0:qn(a.title).toLowerCase()===qn(i.title).toLowerCase()}function Nx(a){return{id:a.id,time:a.time,task_name:a.plan_title,step_name:a.step_title,operation_name:a.task_title,status_label:a.status_label,status_tone:a.status_tone,business_detail:hc(a),raw_detail:a.detail,updated_at:a.updated_at,conversation_id:a.conversation_id}}function Ip(a){const[i="9",s="0"]=a.split(":"),c=Math.min(Math.max(Number(i)||9,0),23);return`${Math.min(Math.max(Number(s)||0,0),59)} ${c} * * *`}function Wp(a){return a.status_label||a.status||"已同步"}function jl(a){return String(a||"").replace(/\s+/g," ").trim()}function jy(a){const s=`${a.plan_title} ${a.step_title??""}`.match(/(?:^|\D)(\d{1,2})[::](\d{2})(?:\D|$)/);return s!=null&&s[1]&&s[2]?`${s[1].padStart(2,"0")}:${s[2]}`:jl(a.time)||"即时触发"}function wl(a){const i=jl(a);if(!i)return"";const s=new Date(i);if(Number.isNaN(s.getTime()))return"";const c=new Intl.DateTimeFormat("zh-CN",{timeZone:ox,month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",hour12:!1}).formatToParts(s),d=f=>{var h;return((h=c.find(_=>_.type===f))==null?void 0:h.value)??""};return`${d("month")}/${d("day")} ${d("hour")}:${d("minute")}`}function Yd(a){const i=jl(a);return i?i.length>140?`${i.slice(0,140)}...`:i:""}function Cx(a){var i;return a?!a.enabled||!a.endpoint||(((i=a.missingCredentials)==null?void 0:i.length)??0)>0?"warning":a.failed>0||a.lastSyncError?"danger":a.syncing||a.pending>0?"warning":a.lastSyncAt?"success":"info":"info"}function Dx(a){var i;return a?a.enabled?a.endpoint?(((i=a.missingCredentials)==null?void 0:i.length)??0)>0?"缺少凭据":a.syncing?"同步中":a.failed>0||a.lastSyncError?"同步异常":a.pending>0?"待同步":a.lastSyncAt?"已同步":"等待数据":"未配置":"已停用":"未连接"}function zx(a){var s,c;if(!a)return"当前环境未连接 qimingclaw 同步桥。";if(!a.enabled)return"管理端同步已停用。";if(!a.endpoint)return"管理端同步地址未配置。";if((((s=a.missingCredentials)==null?void 0:s.length)??0)>0)return`管理端同步凭据未完整:${(c=a.missingCredentials)==null?void 0:c.join("、")}`;const i=Yd(a.lastSyncError);if(a.failed>0||i){const d=a.failureSummary?[a.failureSummary.dueForRetry>0?`${a.failureSummary.dueForRetry} 条可重试`:"",a.failureSummary.backoff>0?`${a.failureSummary.backoff} 条退避中`:"",Rx(a.failureSummary)].filter(Boolean).join(","):"";return[a.failed>0?`${a.failed} 条失败`:"",a.pending>0?`${a.pending} 条待同步`:"",d,i?`失败原因:${i}`:""].filter(Boolean).join(",")}return a.syncing?`正在同步,待同步 ${a.pending} 条。`:a.pending>0?`仍有 ${a.pending} 条待同步记录。`:a.lastSyncAt?`最近同步:${wl(a.lastSyncAt)||a.lastSyncAt}`:"等待本地 outbox 数据。"}function Ns(a){return{plan:"Plan",task:"Task",run:"Run",event:"Event",artifact:"Artifact",approval:"Approval"}[a]||a||"Entity"}function Rx(a){const i=a.byEntityType.slice(0,3).map(s=>`${Ns(s.entityType)} ${s.count}`).join(" / ");return i?`类型:${i}`:""}function Mx(a){var c;const i=Yd(a.error);return[jl((c=a.entitySummary)==null?void 0:c.title),`${Ns(a.entityType)} / ${a.operation}`,`重试 ${a.attempts} 次`,a.dueForRetry?"等待补偿":`下次 ${wy(a)}`,i].filter(Boolean).join(" · ")}function Pp(a){return wl(a.lastAttemptAt||a.updatedAt||a.createdAt)||"未尝试"}function wy(a){return a.dueForRetry?"可重试":wl(a.nextRetryAt)||"待计算"}function Ox(a){return a==="synced"?"已同步":a==="failed"?"失败":a||"未知"}function $x(a){return a==="synced"?"success":a==="failed"?"danger":"info"}function eg(a,i){return JSON.stringify({generatedAt:new Date().toISOString(),source:"qimingclaw-digital-employee",failure:a,sync:i?{running:i.running,syncing:i.syncing,enabled:i.enabled,endpoint:i.endpoint,missingCredentials:i.missingCredentials??[],pending:i.pending,failed:i.failed,lastSyncAt:i.lastSyncAt,lastSyncError:i.lastSyncError,failureSummary:i.failureSummary??null}:null},null,2)}function qx(a){return`qimingclaw-sync-failure-${[a.entityType,a.entityId].filter(Boolean).join("-").replace(/[^a-z0-9._-]+/gi,"-").replace(/^-+|-+$/g,"").slice(0,80)||a.id||"diagnostic"}.json`}function tg(a,i,s="application/json;charset=utf-8"){const c=new Blob([i],{type:s}),d=URL.createObjectURL(c),f=document.createElement("a");f.href=d,f.download=a,document.body.appendChild(f),f.click(),f.remove(),window.setTimeout(()=>URL.revokeObjectURL(d),1e3)}function Lx(a){return`qimingclaw-digital-report-${a}.txt`}function Ux(a,i,s,c){return[i.title||`${a} 数字员工日报`,`日期:${a}`,`生成时间:${i.generated_at?wl(i.generated_at):"暂未生成"}`,`生成来源:${i.generated_by==="ai"?"AI":"qimingclaw adapter"}`,"","## 摘要",i.summary||"暂无摘要。","","## 指标",`任务总数:${i.totals.task_count}`,`执行次数:${i.totals.execution_count}`,`成功次数:${i.totals.success_count}`,`失败次数:${i.totals.failure_count}`,`运行中:${i.totals.running_count??0}`,"","## 任务汇总",...s.length>0?s.map(d=>`- ${d.title}:${d.latest_status_label},执行 ${d.total_count} 次,成功 ${d.success_count},失败 ${d.failure_count}。${d.ai_summary||d.business_summary||""}`):["暂无任务汇总。"],"","## 运行明细",...c.length>0?c.map(d=>`- ${d.time||"--:--"} ${d.task_name} / ${d.step_name||d.operation_name||"任务执行"}:${d.status_label},${d.business_detail}`):["暂无运行明细。"],"","## 详情",...(i.detail_lines??[]).length>0?i.detail_lines:["暂无详情。"]].join(` + */const q0=jn("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);function L0(){return{selectedDutyIdsByDate:{},confirmedDates:{},reportScheduleTime:"18:00",reportGeneratedAtByDate:{},decisionResultsByDate:{},profile:{name:"飞天数字员工",company:"qimingclaw 客户端",position:"客户端任务执行员",currentStatus:"working"}}}async function Zg(){var a,i,s;try{return await((s=(i=(a=window.QimingClawBridge)==null?void 0:a.digital)==null?void 0:i.getUiState)==null?void 0:s.call(i))??null}catch{return null}}async function Vg(a,i={}){var c,d;const s=(c=window.QimingClawBridge)==null?void 0:c.digital;if(!(s!=null&&s.saveUiState))return null;try{const f=await((d=s.getUiState)==null?void 0:d.call(s).catch(()=>null))??null,h={...L0(),...f??{},...a};return await s.saveUiState({state:h,...i})}catch{return null}}const Rs={finance:{id:"finance",labelKey:"console.role.finance",density:"compact",tone:"strict",contentPriority:["audit","sources","exactNumbers"],motion:{defaultLevel:"none",allowParticles:!1,allowCelebrations:!1,allowDecorativeBadges:!1},actionPolicy:{requireConfirmationForDestructive:!0,showReversalHint:!0,preferOneClickApproval:!1},staleDataThresholdMs:3e4,cssVars:{"--role-accent":"#2563eb","--role-accent-soft":"rgba(37,99,235,0.12)","--role-surface-tint":"rgba(248,250,252,0.78)","--role-border":"rgba(37,99,235,0.22)","--role-focus-ring":"#1d4ed8"}},engineering:{id:"engineering",labelKey:"console.role.engineering",density:"compact",tone:"technical",contentPriority:["alarms","timestamps","reliability"],motion:{defaultLevel:"none",allowParticles:!1,allowCelebrations:!1,allowDecorativeBadges:!1},actionPolicy:{requireConfirmationForDestructive:!0,showReversalHint:!0,preferOneClickApproval:!1},staleDataThresholdMs:15e3,cssVars:{"--role-accent":"#0f766e","--role-accent-soft":"rgba(15,118,110,0.12)","--role-surface-tint":"rgba(240,253,250,0.72)","--role-border":"rgba(15,118,110,0.24)","--role-focus-ring":"#0f766e"}},executive:{id:"executive",labelKey:"console.role.executive",density:"presentation",tone:"executive",contentPriority:["kpi","approvals","exactNumbers"],motion:{defaultLevel:"minimal",allowParticles:!1,allowCelebrations:!1,allowDecorativeBadges:!1},actionPolicy:{requireConfirmationForDestructive:!0,showReversalHint:!0,preferOneClickApproval:!0},staleDataThresholdMs:6e4,cssVars:{"--role-accent":"#334155","--role-accent-soft":"rgba(51,65,85,0.10)","--role-surface-tint":"rgba(248,250,252,0.82)","--role-border":"rgba(51,65,85,0.20)","--role-focus-ring":"#475569"}},hr:{id:"hr",labelKey:"console.role.hr",density:"balanced",tone:"warm-professional",contentPriority:["queues","timestamps","approvals"],motion:{defaultLevel:"minimal",allowParticles:!1,allowCelebrations:!1,allowDecorativeBadges:!1},actionPolicy:{requireConfirmationForDestructive:!0,showReversalHint:!0,preferOneClickApproval:!1},staleDataThresholdMs:45e3,cssVars:{"--role-accent":"#7c3aed","--role-accent-soft":"rgba(124,58,237,0.10)","--role-surface-tint":"rgba(250,245,255,0.72)","--role-border":"rgba(124,58,237,0.20)","--role-focus-ring":"#6d28d9"}},sales:{id:"sales",labelKey:"console.role.sales",density:"balanced",tone:"warm-professional",contentPriority:["pipeline","sources","exactNumbers"],motion:{defaultLevel:"minimal",allowParticles:!1,allowCelebrations:!1,allowDecorativeBadges:!1},actionPolicy:{requireConfirmationForDestructive:!0,showReversalHint:!0,preferOneClickApproval:!1},staleDataThresholdMs:45e3,cssVars:{"--role-accent":"#b45309","--role-accent-soft":"rgba(180,83,9,0.10)","--role-surface-tint":"rgba(255,251,235,0.70)","--role-border":"rgba(180,83,9,0.20)","--role-focus-ring":"#92400e"}}},Jg=b.createContext(null),cd="qimingclaw:digital-console-role",ud="sgrobot-console-role";function U0(){try{const a=localStorage.getItem(cd)??localStorage.getItem(ud);if(a&&a in Rs)return a}catch{}return"sales"}function B0({children:a}){const[i,s]=b.useState(U0);b.useEffect(()=>{let f=!1;return Zg().then(h=>{if(f)return;const _=h==null?void 0:h.consoleRole;if(_&&_ in Rs){s(_);try{localStorage.setItem(cd,_),localStorage.removeItem(ud)}catch{}}}),()=>{f=!0}},[]);const c=b.useCallback(f=>{s(f);try{localStorage.setItem(cd,f),localStorage.removeItem(ud)}catch{}Vg({consoleRole:f},{action:"update_console_role",metadata:{role:f}})},[]),d=Rs[i];return u.jsx(Jg.Provider,{value:{role:i,profile:d,setRole:c},children:u.jsx("div",{style:d.cssVars,"data-role":i,children:a})})}function H0(){const a=b.useContext(Jg);if(!a)throw new Error("useRole must be used within RoleProvider");return a}function Jo({className:a=""}){return u.jsx("div",{className:`de-gem ${a}`,"aria-hidden":"true"})}function G0(){return u.jsxs("div",{className:"de-stage","aria-hidden":"true",children:[u.jsx("div",{className:"de-stage-glow"}),u.jsx("div",{className:"de-stage-layer de-stage-layer-1"}),u.jsx("div",{className:"de-stage-layer de-stage-layer-2"}),u.jsx("div",{className:"de-stage-layer de-stage-layer-3"})]})}function Y0({avatarSrc:a,altText:i="数字员工",statusLabel:s}){return u.jsxs("div",{className:"de-avatar-container","aria-hidden":"true",children:[u.jsxs("div",{className:"de-avatar-glass-space",children:[u.jsxs("div",{className:"de-avatar-roof",children:[u.jsx("div",{className:"de-avatar-roof-face"}),u.jsx("div",{className:"de-avatar-roof-glow"})]}),u.jsx("div",{className:"de-avatar-glass-left"}),u.jsx("div",{className:"de-avatar-glass-right"}),u.jsx(Jo,{className:"de-gem-1"}),u.jsx(Jo,{className:"de-gem-2"}),u.jsx(Jo,{className:"de-gem-3"})]}),s&&u.jsx("div",{className:"de-avatar-state-label",children:s}),u.jsx("img",{src:a,alt:i,className:"de-avatar-img"}),u.jsx(G0,{})]})}const Q0=".",K0=(()=>{var i;return((i=window.__QIMINGCLAW_DIGITAL_API_BASE__)==null?void 0:i.replace(/\/+$/,""))??""})(),X0=()=>"",Fg="qimingclaw_digital_token",Ig="zeroclaw_token";function Z0(){try{return localStorage.getItem(Fg)??localStorage.getItem(Ig)}catch{return null}}function V0(){try{localStorage.removeItem(Fg),localStorage.removeItem(Ig)}catch{}}const Wg="qimingclaw:digital-employee-adapter-state",J0="18:00",F0=[{skill_id:"qimingclaw-acp-session",name:"ACP 会话执行",version:"1.0.0",enabled:!0,description:"通过 qimingclaw 的 ACP 引擎创建会话、执行任务并跟踪结果。",category:"执行",capability_level:"core"},{skill_id:"qimingclaw-mcp-tools",name:"MCP 工具编排",version:"1.0.0",enabled:!0,description:"读取已配置 MCP 服务与工具,作为数字员工的工具能力池。",category:"工具",capability_level:"core"},{skill_id:"qimingclaw-computer-control",name:"客户端电脑控制",version:"1.0.0",enabled:!0,description:"承接 /computer/chat 执行入口,面向远程任务和本地自动化操作。",category:"桌面",capability_level:"specialized"},{skill_id:"qimingclaw-artifact-report",name:"产物与日报整理",version:"1.0.0",enabled:!0,description:"把执行记录、关键产物和异常汇总成数字员工日报。",category:"汇报",capability_level:"standard"}],I0=[{plan_id:"qimingclaw-client-readiness",title:"客户端运行状态巡检",objective:"确认 qimingclaw 客户端、Agent、MCP 和远程接入能力是否处于可执行状态。",status:"running",created_at:ia(9,0),steps:[{step_id:"agent-status",title:"检查 Agent 引擎状态",depends_on:[],preferred_skills:["qimingclaw-acp-session"],tasks:[{task_id:"task-agent-status",title:"读取 Agent 服务状态",status:"running"}]},{step_id:"mcp-status",title:"检查 MCP 工具能力",depends_on:["agent-status"],preferred_skills:["qimingclaw-mcp-tools"],tasks:[{task_id:"task-mcp-status",title:"同步 MCP 工具列表",status:"pending"}]}]},{plan_id:"qimingclaw-remote-task-ingress",title:"远程任务接入准备",objective:"检查 lanproxy、computer server 和文件服务,为后端下发数字员工任务做准备。",status:"pending",created_at:ia(9,30),steps:[{step_id:"computer-server",title:"确认 /computer/chat 执行入口",depends_on:[],preferred_skills:["qimingclaw-computer-control"],tasks:[{task_id:"task-computer-server",title:"检查电脑控制服务",status:"pending"}]},{step_id:"file-artifact",title:"准备产物回传目录",depends_on:["computer-server"],preferred_skills:["qimingclaw-artifact-report"],tasks:[{task_id:"task-file-artifact",title:"整理执行产物通道",status:"pending"}]}]},{plan_id:"qimingclaw-daily-report",title:"数字员工日报生成",objective:"汇总今日执行记录、服务状态和待介入事项,生成面向业务的日报。",status:"pending",created_at:ia(17,30),steps:[{step_id:"collect-events",title:"汇总运行事件",depends_on:[],preferred_skills:["qimingclaw-artifact-report"],tasks:[{task_id:"task-collect-events",title:"整理今日运行明细",status:"pending"}]},{step_id:"write-report",title:"生成日报摘要",depends_on:["collect-events"],preferred_skills:["qimingclaw-artifact-report"],tasks:[{task_id:"task-write-report",title:"生成数字员工日报",status:"pending"}]}]}],vc={"qimingclaw-client-readiness":{expression:"0 9 * * *",nextRun:ia(9,0),scheduleText:"已定时 09:00 执行"},"qimingclaw-remote-task-ingress":{expression:"30 9 * * *",nextRun:ia(9,30),scheduleText:"已定时 09:30 执行"},"qimingclaw-daily-report":{expression:"0 18 * * *",nextRun:ia(18,0),scheduleText:"已定时 18:00 执行"}};function W0(){return window.__QIMINGCLAW_EMBEDDED_DIGITAL__===!0}async function P0(a,i={}){var p,g,j;if(!W0())return;const s=new URL(a,window.location.origin),c=(i.method||"GET").toUpperCase(),d=s.pathname;if(c==="GET"&&d==="/api/digital-employee/workday")return gy(s.searchParams.get("date")||Od(),await gt());if(c==="POST"&&d==="/api/digital-employee/workday/actions")return await YS(ml(i.body),await gt());if(c==="POST"&&d==="/api/governance/command")return await Gd(ml(i.body),await gt());if(c==="GET"&&d==="/api/scheduler/jobs")return{jobs:xc(await gt())};if(c==="GET"&&d==="/api/cron")return{jobs:xc(await gt())};if(c==="POST"&&d==="/api/cron")return await uS(ml(i.body),await gt());if(c==="GET"&&d==="/api/cron/settings")return await lS();if(c==="PATCH"&&d==="/api/cron/settings"){const S=ml(i.body);return await iS(S)}if(c==="POST"&&d==="/api/cron/check"){const S=await((j=(g=(p=window.QimingClawBridge)==null?void 0:p.digital)==null?void 0:g.runSchedulerCheck)==null?void 0:j.call(g));return{ok:!0,activated:(S==null?void 0:S.activated)??0,...S}}const f=d.match(/^\/api\/cron\/([^/]+)\/runs$/);if(c==="GET"&&f)return{runs:await dS(decodeURIComponent(f[1]||""),Number(s.searchParams.get("limit"))||20)};const h=d.match(/^\/api\/cron\/([^/]+)$/);if((c==="PATCH"||c==="DELETE")&&h){const S=decodeURIComponent(h[1]||"");if(c==="DELETE"){await ty("delete_schedule",S,{},await gt());return}return await oS(S,ml(i.body),await gt())}if(c==="GET"&&d==="/api/debug/plans")return{plans:py(s.searchParams.get("q"),await gt())};if(c==="GET"&&d==="/api/debug/tasks"){const S=s.searchParams.get("plan_id");return Bd(S,await gt())}if(c==="GET"&&d==="/api/debug/store")return AS(await gt());if(c==="GET"&&d==="/api/dashboard")return TS(await gt());if(c==="GET"&&d==="/api/artifact")return{artifacts:Hd(await gt())};if(c==="GET"&&d==="/api/memory")return{entries:await sS(s.searchParams.get("query"),s.searchParams.get("category"))};if(c==="POST"&&d==="/api/memory")return await rS(ml(i.body));const _=d.match(/^\/api\/memory\/([^/]+)$/);if(c==="DELETE"&&_){await cS(decodeURIComponent(_[1]||""));return}if(c==="GET"&&d.startsWith("/api/debug/plan/")&&d.endsWith("/flow"))return yy(decodeURIComponent(d.split("/")[4]||""),await gt());if(c==="GET"&&d.startsWith("/api/debug/task/")&&d.endsWith("/flow"))return FS(decodeURIComponent(d.split("/")[4]||""),await gt());if(c==="POST"&&d.startsWith("/api/debug/plan/")&&d.endsWith("/dispatch"))return await _y(decodeURIComponent(d.split("/")[4]||""),await gt());if(c==="GET"&&d.startsWith("/api/plan/")&&d.endsWith("/messages"))return{messages:IS(decodeURIComponent(d.split("/")[3]||""),await gt())};if(c==="GET"&&d==="/api/skill")return{skills:await nS()};if(c==="POST"&&d.startsWith("/api/skill/")&&d.endsWith("/enabled")){const S=decodeURIComponent(d.split("/")[3]||""),E=ml(i.body);return{ok:!0,skill_id:S,enabled:E.enabled??!0}}}function Fo(){return{selectedDutyIdsByDate:{},confirmedDates:{},reportScheduleTime:J0,reportGeneratedAtByDate:{},decisionResultsByDate:{},consoleRole:"sales",rolePreferences:{},profile:{name:"飞天数字员工",company:"qimingclaw 客户端",position:"客户端任务执行员",currentStatus:"working"}}}function Rd(){try{const a=window.localStorage.getItem(Wg);return a?{...Fo(),...JSON.parse(a)}:Fo()}catch{return Fo()}}function eS(a){window.localStorage.setItem(Wg,JSON.stringify(a))}async function gt(){var a,i,s,c,d,f,h,_,p,g,j,S;try{const E=await((s=(i=(a=window.QimingClawBridge)==null?void 0:a.digital)==null?void 0:i.getSnapshot)==null?void 0:s.call(i))??null;if(!E)return null;const[$,A,O,R]=await Promise.all([((f=(d=(c=window.QimingClawBridge)==null?void 0:c.digital)==null?void 0:d.getSyncStatus)==null?void 0:f.call(d).catch(()=>null))??null,((p=(_=(h=window.QimingClawBridge)==null?void 0:h.digital)==null?void 0:_.getRuntimeRecords)==null?void 0:p.call(_).catch(()=>null))??null,Md(),((S=(j=(g=window.QimingClawBridge)==null?void 0:g.digital)==null?void 0:j.getPlanTemplates)==null?void 0:S.call(j).catch(()=>null))??null]);return{...E,sync:$,runtime:A,uiState:O,planTemplates:(R==null?void 0:R.templates)??[]}}catch{return null}}async function Md(){var a,i,s;try{return await((s=(i=(a=window.QimingClawBridge)==null?void 0:a.digital)==null?void 0:i.getUiState)==null?void 0:s.call(i))??null}catch{return null}}async function tS(){var a,i,s;try{const c=await((s=(i=(a=window.QimingClawBridge)==null?void 0:a.digital)==null?void 0:i.getSkillCapabilities)==null?void 0:s.call(i))??null;return Array.isArray(c==null?void 0:c.skills)?c.skills:[]}catch{return[]}}async function nS(){return aS([...F0,...await tS()])}function aS(a){const i=new Set,s=[];for(const c of a){const d=typeof c.skill_id=="string"?c.skill_id.trim():"";!d||i.has(d)||(i.add(d),s.push({...c,skill_id:d}))}return s}async function Pg(a,i,s,c){var d,f,h;eS(a);try{return await((h=(f=(d=window.QimingClawBridge)==null?void 0:d.digital)==null?void 0:f.saveUiState)==null?void 0:h.call(f,{state:a,action:i,date:s,metadata:c}))??a}catch{return a}}async function Ka(a,i){var s,c,d,f,h,_,p,g,j,S,E,$,A,O,R,q,F,Z,P,te;try{await((te=(c=(s=window.QimingClawBridge)==null?void 0:s.digital)==null?void 0:c.recordGovernanceCommand)==null?void 0:te.call(c,{commandKind:a.command_kind,commandId:i.command_id,correlationId:i.correlation_id,planId:oe((d=i.result)==null?void 0:d.plan_id)||oe((f=a.context_refs)==null?void 0:f.plan_id)||oe((h=a.payload)==null?void 0:h.plan_id)||null,taskId:oe((_=i.result)==null?void 0:_.task_id)||oe((p=a.context_refs)==null?void 0:p.task_id)||oe((g=a.payload)==null?void 0:g.task_id)||null,runId:oe((j=i.result)==null?void 0:j.run_id)||oe((S=a.context_refs)==null?void 0:S.run_id)||oe((E=a.payload)==null?void 0:E.run_id)||oe(($=a.payload)==null?void 0:$.latest_run_id)||null,stepId:oe((A=i.result)==null?void 0:A.step_id)||oe((O=a.context_refs)==null?void 0:O.step_id)||oe((R=a.payload)==null?void 0:R.step_id)||oe((q=a.payload)==null?void 0:q.stepId)||null,scheduleId:oe((F=i.result)==null?void 0:F.schedule_id)||oe((Z=a.context_refs)==null?void 0:Z.schedule_id)||oe((P=a.payload)==null?void 0:P.schedule_id)||null,accepted:i.accepted,message:i.message,error:i.error??null,payload:a.payload??null,result:i.result??null}))}catch{}}async function lS(){var a,i,s;try{return await((s=(i=(a=window.QimingClawBridge)==null?void 0:a.digital)==null?void 0:i.getCronSettings)==null?void 0:s.call(i))??bc()}catch{return bc()}}async function iS(a){var i,s,c;try{return await((c=(s=(i=window.QimingClawBridge)==null?void 0:i.digital)==null?void 0:s.saveCronSettings)==null?void 0:c.call(s,a))??{...bc(),...a}}catch{return{...bc(),...a}}}async function sS(a,i){var s,c,d;try{return(await((d=(c=(s=window.QimingClawBridge)==null?void 0:s.digital)==null?void 0:c.listMemories)==null?void 0:d.call(c,{query:a||void 0,category:i||void 0,limit:300}))??[]).map(ey)}catch{return[]}}async function rS(a){var f,h,_;const i=oe(a.key),s=oe(a.content??a.text),c=oe(a.category)||"fact";if(!s)return{ok:!0,entry:null};const d=await((_=(h=(f=window.QimingClawBridge)==null?void 0:f.digital)==null?void 0:h.addMemory)==null?void 0:_.call(h,{key:i||void 0,content:s,category:c,source:"qimingclaw-digital-page",payload:{source:"embedded-memory-api",key:i||null}}))??null;return{ok:!0,entry:d?ey(d):null}}async function cS(a){var i,s,c;try{await((c=(s=(i=window.QimingClawBridge)==null?void 0:i.digital)==null?void 0:s.deleteMemory)==null?void 0:c.call(s,a))}catch{}}function ey(a){return{id:a.id,key:a.key||a.id,content:a.content,category:a.category||"fact",timestamp:a.updatedAt||a.createdAt||new Date().toISOString(),session_id:a.sessionId??null,score:typeof a.score=="number"?a.score:null}}function bc(){return{enabled:!0,catch_up_on_startup:!0,max_run_history:100,max_catch_up_runs:5,max_concurrent_schedule_runs:1}}async function uS(a,i){const s=Date.now(),c=oe(a.id)||oe(a.schedule_id)||`cron-${ua(oe(a.name)||"job")}-${s}`;await Gd({command_kind:"create_schedule",context_refs:{schedule_id:c,plan_id:oe(a.plan_id)||oe(a.template_id)||void 0},payload:{...a,schedule_id:c,cron_expr:oe(a.schedule)||oe(a.cron_expr)},correlation_id:`qimingclaw-cron-create-${s}`,idempotency_key:`qimingclaw-cron-create-${c}-${s}`},i);const d=await gt();return{status:"created",job:xc(d).find(f=>f.id===c)??ny(c,a)}}async function oS(a,i,s){await ty("update_schedule",a,i,s);const c=await gt();return{status:"updated",job:xc(c).find(d=>d.id===a)??ny(a,i)}}async function ty(a,i,s,c){const d=Date.now();return Gd({command_kind:a,context_refs:{schedule_id:i,plan_id:oe(s.plan_id)||oe(s.template_id)||void 0},payload:{...s,schedule_id:i,cron_expr:oe(s.schedule)||oe(s.cron_expr)},correlation_id:`qimingclaw-cron-${a}-${d}`,idempotency_key:`qimingclaw-cron-${a}-${i}-${d}`},c)}function ny(a,i){const s=new Date().toISOString(),c=oe(i.schedule)||oe(i.cron_expr)||"0 9 * * *";return{id:a,name:oe(i.name)||a,expression:c,command:oe(i.command)||`digital-employee:${a}`,prompt:oe(i.prompt)||null,job_type:oe(i.job_type)||"qimingclaw_schedule",schedule:{expression:c,schedule_id:a},enabled:i.enabled!==!1,delivery:{mode:"qimingclaw_schedule",schedule_id:a},template_id:oe(i.template_id)||oe(i.plan_id)||a,trigger_kind:"scheduled",delete_after_run:i.delete_after_run===!0,created_at:s,next_run:s,last_run:null,last_status:null,last_output:null}}async function dS(a,i){var c,d,f;return(await((f=(d=(c=window.QimingClawBridge)==null?void 0:c.digital)==null?void 0:d.getScheduleRuns)==null?void 0:f.call(d,a,i).catch(()=>[]))??[]).map((h,_)=>({id:Number.isFinite(Date.parse(h.createdAt))?Date.parse(h.createdAt)+_:_+1,job_id:h.scheduleId,started_at:h.startedAt||h.createdAt,finished_at:h.finishedAt||"",status:h.status,output:h.error||null,duration_ms:h.startedAt&&h.finishedAt?Math.max(0,Date.parse(h.finishedAt)-Date.parse(h.startedAt)):null}))}function ml(a){return typeof a!="string"||!a.trim()?{}:JSON.parse(a)}function Od(){const a=new Date;return[a.getFullYear(),String(a.getMonth()+1).padStart(2,"0"),String(a.getDate()).padStart(2,"0")].join("-")}function ia(a,i){const s=new Date;return s.setHours(a,i,0,0),s.toISOString()}function lc(a){return a.split("-").join("/")}function Sc(a){if(!a)return"未知";const i=new Date(a);return Number.isNaN(i.getTime())?a:new Intl.DateTimeFormat("zh-CN",{hour:"2-digit",minute:"2-digit"}).format(i)}function ay(a,i){return new Set(a.selectedDutyIdsByDate[i]??[])}function ly(a){return["completed","succeeded","success"].includes(a)?"success":["running","active"].includes(a)?"running":["failed","error"].includes(a)?"danger":"waiting"}function ks(a,i){var s;return((s=a==null?void 0:a.services[i])==null?void 0:s.running)===!0}function As(a,i){var s;return(s=a==null?void 0:a.services[i])==null?void 0:s.error}function fS(a,i){return i?a.plan_id==="qimingclaw-client-readiness"?ks(i,"agent")&&ks(i,"mcp")?"running":As(i,"agent")||As(i,"mcp")?"failed":"pending":a.plan_id==="qimingclaw-remote-task-ingress"?ks(i,"computerServer")||ks(i,"lanproxy")||ks(i,"fileServer")?"running":As(i,"computerServer")||As(i,"lanproxy")||As(i,"fileServer")?"failed":"pending":a.status:a.status}function Xa(a,i,s){const c=a==null?void 0:a.services[i];if(!c)return`${s}:未连接`;if(c.running){const d=c.port?`(端口 ${c.port})`:"";return`${s}:运行中${d}`}return`${s}:未运行${c.error?`,${c.error}`:""}`}function mS(a){const i=(a==null?void 0:a.managedServices)??[];return i.length>0?i.map(s=>({service_id:s.serviceId,name:s.name,kind:s.kind,status:s.status,status_label:s.statusLabel,running:s.running,error:s.error??null,requires_human_action:s.requiresHumanAction,dependent_tasks:s.dependentTasks??[],restart_count:s.restartCount??0,last_seen_at:s.lastSeenAt,instance:s.instance,lease:s.lease})):[fi(a,"agent","Agent","agent",["ACP 会话执行","Plan Agent"]),fi(a,"mcp","MCP Proxy","mcp",["Skill Catalog","MCP 工具调用"]),fi(a,"computerServer","Computer Server","desktop",["/computer/chat","远程任务接入"]),fi(a,"fileServer","File Server","file",["Artifact 上传","文件交付"]),fi(a,"lanproxy","Lanproxy","network",["远程访问","管理端回连"]),fi(a,"guiServer","GUI Agent Server","gui",["GUI 自动化"])]}function fi(a,i,s,c,d){const f=a==null?void 0:a.services[i],h=(f==null?void 0:f.running)===!0,_=f!=null&&f.error?"degraded":h?"running":"stopped";return{service_id:i,name:s,kind:c,status:_,status_label:_==="running"?"运行中":_==="degraded"?"异常":"未运行",running:h,error:(f==null?void 0:f.error)??null,requires_human_action:!!(f!=null&&f.error),dependent_tasks:d,restart_count:0,last_seen_at:(a==null?void 0:a.generatedAt)??new Date().toISOString(),instance:f?{port:f.port,engineType:f.engineType,serverCount:f.serverCount,serverNames:f.serverNames}:void 0,lease:{state:_==="running"?"active":_,updatedAt:(a==null?void 0:a.generatedAt)??new Date().toISOString()}}}function hS(a){const i=a.dependent_tasks.length>0?`;依赖任务:${a.dependent_tasks.slice(0,2).join("、")}`:"";return`${a.name}:${a.status_label}${a.error?`,${a.error}`:""}${i}`}function Qp(a){const i=a.filter(c=>c.running).length,s=a.filter(c=>c.requires_human_action||c.status==="degraded").length;return`ManagedService:${i}/${a.length} 运行,${s} 项需处理`}function od(a){const i=a==null?void 0:a.sync;return i?i.enabled?i.endpoint?i.syncing?`管理端同步:同步中,待同步 ${i.pending} 条`:i.failed>0?`管理端同步:${i.failed} 条失败,待同步 ${i.pending} 条`:i.pending>0?`管理端同步:待同步 ${i.pending} 条`:i.lastSyncAt?`管理端同步:已同步,最近 ${i.lastSyncAt}`:"管理端同步:等待本地数据":"管理端同步:未配置地址":"管理端同步:已停用":"管理端同步:未连接"}function pS(a){return String(a||"").replace(/\s+/g," ").trim()}function Sn(a){var i;return((i=a==null?void 0:a.runtime)==null?void 0:i.plans)??[]}function $d(a){var i;return((i=a==null?void 0:a.runtime)==null?void 0:i.planSteps)??[]}function Nt(a){var i;return((i=a==null?void 0:a.runtime)==null?void 0:i.tasks)??[]}function _i(a){var i;return((i=a==null?void 0:a.runtime)==null?void 0:i.runs)??[]}function ra(a){var i;return((i=a==null?void 0:a.runtime)==null?void 0:i.events)??[]}function iy(a){var i;return((i=a==null?void 0:a.runtime)==null?void 0:i.artifacts)??[]}function sy(a){var i;return((i=a==null?void 0:a.runtime)==null?void 0:i.approvals)??[]}function xl(a){return Sn(a).length>0||$d(a).length>0||Nt(a).length>0||iy(a).length>0||sy(a).length>0}function qd(a,i){const s=[a.updatedAt,...i.map(c=>c.updatedAt)].filter(Boolean).sort();return s[s.length-1]??a.updatedAt??a.createdAt}function Ie(a){const i=a.toLowerCase();return["completed","succeeded","success","done"].includes(i)?"success":["failed","error","rejected","cancelled"].includes(i)?"danger":["running","active","leased","syncing"].includes(i)?"running":"waiting"}function $n(a){const i=a.toLowerCase();if(i==="ready")return"待启动";if(i==="blocked")return"依赖阻塞";if(i==="skipped")return"已跳过";if(i==="cancelled")return"已取消";if(i==="paused")return"已暂停";const s=Ie(a);return s==="success"?"已完成":s==="danger"?"异常":s==="running"?"执行中":"待执行"}function Nc(a,i){return Nt(a).filter(s=>s.planId===i)}function ry(a,i){return $d(a).filter(s=>s.planId===i).sort((s,c)=>s.seq-c.seq||s.createdAt.localeCompare(c.createdAt))}function Ls(a){const i=_l(a.payload);return le((i==null?void 0:i.stepId)??(i==null?void 0:i.step_id))||(a.planId?`${a.planId}:runtime`:"qimingclaw-runtime")}function Cc(a,i){return i.some(s=>Ie(s.status)==="danger")?"failed":i.some(s=>Ie(s.status)==="running")?"running":i.length>0&&i.every(s=>Ie(s.status)==="success")?"completed":a.status||"pending"}function gS(a){return Sn(a).map(i=>{const s=Nc(a,i.id),c=Cc(i,s),d=ly(c),f=s.filter(_=>Ie(_.status)==="danger").length,h=s.filter(_=>Ie(_.status)==="running").length;return{agent_id:`plan-agent-${ua(i.id)}`,plan_id:i.id,title:i.title,lifecycle:c,status_label:dy(c),status_tone:d,managed_task_count:s.length,running_task_count:h,failed_task_count:f,next_action:f>0?"review_failures":h>0?"monitor_runs":d==="success"?"archive_results":"activate_plan",can_replan:f>0,can_pause:h>0,can_resume:c==="paused",updated_at:qd(i,s)}})}function yS(a){const i=_i(a);return Nt(a).map(s=>{const c=cy(i,s.id),d=Ie(s.status),f=s.status.toLowerCase(),h=Ls(s);return{agent_id:`task-agent-${ua(s.id)}`,task_id:s.id,plan_id:s.planId??null,step_id:h,title:s.title,execution_state:s.status,status_label:$n(s.status),status_tone:d,assigned_skill_id:s.assignedSkillId??null,latest_run_id:(c==null?void 0:c.id)??null,can_retry:["failed","cancelled","skipped"].includes(f),can_skip:["pending","running"].includes(f),can_cancel:["pending","running","paused"].includes(f),next_action:_S(f,d),updated_at:(c==null?void 0:c.updatedAt)??s.updatedAt}})}function _S(a,i){return["failed","cancelled","skipped"].includes(a)?"retry_or_review":a==="paused"?"resume_or_cancel":i==="running"?"watch_progress":i==="success"?"collect_artifacts":"start_run"}function cy(a,i){return a.filter(c=>c.taskId===i).sort((c,d)=>(d.updatedAt||d.createdAt).localeCompare(c.updatedAt||c.createdAt))[0]??null}function vS(a,i){const s=Nc(i,a.id),c=ry(i,a.id),d=Cc(a,s),f=new Set(c.map(p=>p.id)),h=s.filter(p=>!f.has(Ls(p))),_=c.length>0?[...c.map(p=>uy(p,s)),...h.length>0?[Kp(a.id,h)]:[]]:[Kp(a.id,s)];return{plan_id:a.id,title:a.title,objective:a.objective??void 0,status:d,created_at:a.createdAt,updated_at:qd(a,s),source:a.source,sync_status:a.syncStatus,steps:_}}function uy(a,i){return{step_id:a.id,title:a.title,depends_on:a.dependsOn,preferred_skills:a.preferredSkillIds,tasks:i.filter(s=>Ls(s)===a.id).map(s=>({task_id:s.id,title:s.title,status:s.status}))}}function Kp(a,i){return{step_id:`${a}:runtime`,title:"qimingclaw 执行记录",depends_on:[],preferred_skills:[...new Set(i.map(s=>s.assignedSkillId).filter(s=>!!s))],tasks:i.map(s=>({task_id:s.id,title:s.title,status:s.status}))}}function bS(a){return{task_id:a.id,title:a.title,status:a.status,plan_id:a.planId??null,step_id:Ls(a),assigned_skill_id:a.assignedSkillId??"",description:a.syncError??"",created_at:a.createdAt,updated_at:a.updatedAt,started_at:a.createdAt,finished_at:Ie(a.status)==="success"||Ie(a.status)==="danger"?a.updatedAt:null,error_message:a.syncError??null,sync_status:a.syncStatus}}function SS(a,i){return{run_id:a.id,task_id:a.taskId??"",plan_id:a.planId??null,skill_id:void 0,attempt_no:1,lifecycle:Ie(a.status)==="success"?"Succeeded":Ie(a.status)==="danger"?"Failed":Ie(a.status)==="running"?"Running":a.status,created_at:a.startedAt??a.createdAt,completed_at:a.finishedAt??null,events:i.filter(s=>s.runId===a.id).map(s=>({event_id:s.id,kind:s.kind,occurred_at:s.occurredAt,message:s.message})),artifacts:my(a,i),sync_status:a.syncStatus}}function oy(a){const i=pS(a.error),s=i.length>120?`${i.slice(0,120)}...`:i,c=a.dueForRetry?"等待补偿":a.nextRetryAt?`下次重试 ${a.nextRetryAt}`:"等待重试";return`${a.entityType}/${a.operation} ${a.id} 重试 ${a.attempts} 次,${c}${s?`,${s}`:""}`}function Us(a,i){return{...a,status:fS(a,i)}}function dy(a){return a==="running"?"执行中":a==="completed"||a==="succeeded"?"已完成":a==="failed"?"异常":"待执行"}function Ld(a){const i=Sn(a);if(i.length>0)return i.map(c=>vS(c,a));const s=Nt(a);return s.length===0?[]:s.map(c=>({plan_id:c.id,title:c.title,objective:"未绑定 Plan 的 qimingclaw 本地任务记录。",status:c.status,created_at:c.createdAt,updated_at:c.updatedAt,source:"qimingclaw",sync_status:c.syncStatus,steps:[{step_id:`${c.id}:runtime`,title:"qimingclaw 执行记录",depends_on:[],preferred_skills:c.assignedSkillId?[c.assignedSkillId]:[],tasks:[{task_id:c.id,title:c.title,status:c.status}]}]}))}function ca(a){const i=(a==null?void 0:a.planTemplates)??[],s=new Map;for(const c of[...i,...I0])s.has(c.plan_id)||s.set(c.plan_id,c);return Array.from(s.values())}function Ud(a){const i=new Map;for(const s of[...Ld(a),...ca(a).map(c=>Us(c,a))])i.has(s.plan_id)||i.set(s.plan_id,s);return Array.from(i.values())}function xS(a,i){var d;const s=Us(a,i),c=vc[a.plan_id]??vc["qimingclaw-client-readiness"];return{id:`schedule-${a.plan_id}`,name:a.title,expression:c.expression,command:`digital-employee:${a.plan_id}`,prompt:a.objective??null,job_type:"plan_template",schedule:{expression:c.expression,template_id:a.plan_id},enabled:!0,delivery:{mode:"plan_template",template_id:a.plan_id},template_id:a.plan_id,trigger_kind:"scheduled",step_count:((d=a.steps)==null?void 0:d.length)??0,skill_ids:[...new Set((a.steps??[]).flatMap(f=>f.preferred_skills??[]))],delete_after_run:!1,created_at:a.created_at,next_run:c.nextRun,last_run:s.status==="running"?ia(9,5):null,last_status:s.status==="running"?"running":null,last_output:null}}function jS(a,i){var f,h;const s=a.planId?Ud(i).find(_=>_.plan_id===a.planId):null,d=(((f=i==null?void 0:i.runtime)==null?void 0:f.scheduleRuns)??[]).find(_=>_.scheduleId===a.id);return{id:a.id,name:a.name,expression:a.cronExpr,command:a.command||`digital-employee:${a.planId||a.id}`,prompt:a.prompt??a.description??null,job_type:"qimingclaw_schedule",schedule:{mode:"qimingclaw_schedule",schedule_id:a.id,plan_id:a.planId,expression:a.cronExpr,timezone:a.timezone,status:a.status,failure_count:a.failureCount,last_error:a.lastError},enabled:a.enabled&&a.status==="enabled"&&!a.deletedAt,delivery:{mode:"qimingclaw_schedule",schedule_id:a.id,plan_id:a.planId},template_id:a.planId??a.id,trigger_kind:"scheduled",step_count:((h=s==null?void 0:s.steps)==null?void 0:h.length)??0,skill_ids:[...new Set(((s==null?void 0:s.steps)??[]).flatMap(_=>_.preferred_skills??[]))],delete_after_run:!1,created_at:a.createdAt,next_run:a.nextRunAt||a.updatedAt,last_run:a.lastRunAt??(d==null?void 0:d.finishedAt)??(d==null?void 0:d.startedAt)??null,last_status:(d==null?void 0:d.status)??(a.lastError?"failed":null),last_output:(d==null?void 0:d.error)??a.lastError??null}}function xc(a=null){var c;const i=(((c=a==null?void 0:a.runtime)==null?void 0:c.schedules)??[]).filter(d=>d.status!=="deleted").map(d=>jS(d,a)),s=ca(a).map(d=>xS(d,a));if(i.length>0){const d=new Set(i.map(f=>f.template_id));return[...i,...s.filter(f=>!d.has(f.template_id))]}if(xl(a)){const d=Ld(a).map(h=>{var _;return{id:`runtime-${h.plan_id}`,name:h.title,expression:"",command:`qimingclaw-runtime:${h.plan_id}`,prompt:h.objective??null,job_type:"qimingclaw_runtime",schedule:{mode:"runtime_record",plan_id:h.plan_id},enabled:!0,delivery:{mode:"qimingclaw_runtime",plan_id:h.plan_id},template_id:h.plan_id,trigger_kind:"runtime_record",step_count:((_=h.steps)==null?void 0:_.length)??0,skill_ids:[...new Set((h.steps??[]).flatMap(p=>p.preferred_skills??[]))],delete_after_run:!1,created_at:h.created_at,next_run:h.updated_at??h.created_at,last_run:h.updated_at??h.created_at,last_status:h.status,last_output:null}}),f=new Set(d.map(h=>h.template_id));return[...d,...s.filter(h=>!f.has(h.template_id))]}return s}function wS(a,i,s){const c=ay(a,i);if(xl(s)){const d=Sn(s),f=Nt(s).filter(g=>!g.planId),h=d.map((g,j)=>{const S=Nc(s,g.id),E=Cc(g,S),$=S.filter(R=>Ie(R.status)==="success").length,A=S.filter(R=>Ie(R.status)==="danger").length,O=c.size===0?j<3:c.has(g.id);return{id:g.id,title:g.title,summary:g.objective||"qimingclaw 本地执行记录已同步到数字员工。",implemented:!0,selectable:!0,selected:O,status:E,status_label:$n(E),status_tone:Ie(E),schedule_text:S.length>0?`最近更新 ${Sc(qd(g,S))}`:"等待任务记录",result_text:S.length>0?`${S.length} 项任务,${$} 项完成,${A} 项异常`:`同步状态:${g.syncStatus}`,conversation_id:g.id}}),_=f.map((g,j)=>({id:g.id,title:g.title,summary:"未绑定 Plan 的 qimingclaw 本地任务记录。",implemented:!0,selectable:!0,selected:c.size===0?h.length+j<3:c.has(g.id),status:g.status,status_label:$n(g.status),status_tone:Ie(g.status),schedule_text:`最近更新 ${Sc(g.updatedAt)}`,result_text:g.syncError||`同步状态:${g.syncStatus}`,conversation_id:g.id})),p=new Set([...h,..._].map(g=>g.id));return[...h,..._,...Xp(a,i,s).filter(g=>!p.has(g.id))]}return Xp(a,i,s)}function Xp(a,i,s){const c=ay(a,i);return ca(s).map(d=>{const f=Us(d,s),h=vc[f.plan_id]??vc["qimingclaw-client-readiness"];return{id:f.plan_id,title:f.title,summary:f.objective??"等待 qimingclaw 执行链路补充任务说明。",implemented:!0,selectable:!0,selected:c.has(f.plan_id),status:f.status,status_label:dy(f.status),status_tone:ly(f.status),schedule_text:h.scheduleText,result_text:fy(f,s),conversation_id:f.plan_id}})}function fy(a,i){return a.plan_id==="qimingclaw-client-readiness"?[Xa(i,"agent","Agent"),Xa(i,"mcp","MCP"),`活跃会话:${(i==null?void 0:i.sessions.active)??0}`].join(";"):a.plan_id==="qimingclaw-remote-task-ingress"?[Xa(i,"computerServer","Computer Server"),Xa(i,"lanproxy","Lanproxy"),Xa(i,"fileServer","File Server")].join(";"):a.status==="running"?"正在同步客户端运行状态":"等待任务执行"}function Bs(a,i=null){const s=ca(i).filter(c=>!a||c.plan_id===a).map(c=>Us(c,i)).flatMap(ES);if(xl(i)){const c=Nt(i).filter(f=>!a||f.planId===a||f.id===a).map(bS),d=new Set(c.map(f=>f.task_id));return[...c,...s.filter(f=>!d.has(f.task_id))]}return s}function ES(a){return(a.steps??[]).flatMap(i=>(i.tasks??[]).map(s=>{var c;return{task_id:s.task_id,title:s.title,status:a.status==="running"&&s.status==="pending"?"running":s.status,plan_id:a.plan_id,step_id:i.step_id,assigned_skill_id:((c=i.preferred_skills)==null?void 0:c[0])??"",description:`${a.title} · ${i.title}`,created_at:a.created_at,updated_at:a.status==="running"?new Date().toISOString():a.created_at,started_at:s.status==="running"?ia(9,5):null,finished_at:s.status==="completed"?ia(9,10):null}}))}function kS(a){return a.filter(i=>i.status==="running"||i.status==="completed").map((i,s)=>({run_id:`qimingclaw-run-${s+1}`,task_id:i.task_id,plan_id:i.plan_id,skill_id:i.assigned_skill_id,attempt_no:1,lifecycle:i.status==="running"?"Running":"Succeeded",created_at:i.started_at??i.created_at,completed_at:i.finished_at,events:[{event_id:`${i.task_id}-event-start`,kind:"RunStarted",occurred_at:i.started_at??i.created_at,message:`${i.title} 已进入 qimingclaw 执行链路`}]}))}function Bd(a,i=null){const s=Bs(a,i);if(xl(i)){const c=new Set(s.map(f=>f.task_id)),d=_i(i).filter(f=>!f.taskId||c.has(f.taskId)).map(f=>SS(f,ra(i)));return{tasks:s,runs:d,total:s.length,truncated:!1}}return{tasks:s,runs:kS(s),total:s.length,truncated:!1}}function AS(a){const i=py(null,a),s=Bs(null,a),c=Bd(null,a).runs,d=$d(a);return{tables:{canonical_events:NS(a,s,c),tasks:s,runs:c,plans:i,plan_steps:d.length>0?d.map(f=>uy(f,Nt(a))):i.flatMap(f=>f.steps??[]),approvals:Dc(a),artifacts:Hd(a)}}}function TS(a){const i=Bs(null,a),s=i.filter(_=>Ie(_.status)==="waiting").length,c=i.filter(_=>Ie(_.status)==="running").length,d=i.filter(_=>Ie(_.status)==="success").length,f=i.filter(_=>Ie(_.status)==="danger").length,h=Dc(a);return{runtime:{active_tasks:c,failed_tasks:f,pending_confirmations:h.filter(_=>_.status==="pending").length},tasks:{total:i.length,queued:s,running:c,succeeded:d,failed:f},approvals:{total:h.length,pending:h.filter(_=>_.status==="pending").length}}}function NS(a,i,s){var _;const c=ra(a).map(p=>({event_id:p.id,aggregate_type:p.runId?"run":p.taskId?"task":"plan",aggregate_id:p.runId??p.taskId??p.planId??p.id,event_type:p.kind,kind:p.kind,message:p.message,occurred_at:p.occurredAt,timestamp:p.occurredAt,plan_id:p.planId??null,task_id:p.taskId??null})),d=s.flatMap(p=>(p.events??[]).map(g=>({event_id:g.event_id??`${p.run_id}:${g.kind??"event"}:${g.occurred_at??p.created_at}`,aggregate_type:"run",aggregate_id:p.run_id,event_type:g.kind??p.lifecycle,kind:g.kind??p.lifecycle,message:g.message??p.lifecycle,occurred_at:g.occurred_at??p.completed_at??p.created_at,timestamp:g.occurred_at??p.completed_at??p.created_at,plan_id:p.plan_id??null,task_id:p.task_id||null}))),f=i.map(p=>({event_id:`task-status-${p.task_id}`,aggregate_type:"task",aggregate_id:p.task_id,event_type:"task_status",kind:p.status,message:`${p.title}:${$n(p.status)}`,occurred_at:p.updated_at??p.created_at,timestamp:p.updated_at??p.created_at,plan_id:p.plan_id??null,task_id:p.task_id})),h=(((_=a==null?void 0:a.sync)==null?void 0:_.recentFailures)??[]).map(p=>({event_id:`digital-sync-failure-${p.id}`,aggregate_type:"sync_outbox",aggregate_id:p.id,event_type:"digital_sync_failed",kind:"digital_sync_failed",message:oy(p),occurred_at:p.lastAttemptAt??p.updatedAt??p.createdAt,timestamp:p.lastAttemptAt??p.updatedAt??p.createdAt,plan_id:null,task_id:null}));return CS([...c,...d,...f,...h]).sort((p,g)=>(g.occurred_at??"").localeCompare(p.occurred_at??""))}function CS(a){const i=new Set;return a.filter(s=>!s.event_id||i.has(s.event_id)?!1:(i.add(s.event_id),!0))}function Dc(a){var d;const i=sy(a).map(f=>({approval_id:f.id,task_id:f.taskId??"",status:f.status,created_at:f.createdAt,plan_id:f.planId??null,run_id:f.runId??null,title:f.title,reversible:f.status==="pending",source:"qimingclaw-runtime",sync_status:f.syncStatus,sync_error:f.syncError,payload:f.payload})),c=(((d=a==null?void 0:a.sync)==null?void 0:d.recentFailures)??[]).filter(f=>f.dueForRetry===!1||/credential|auth|token|unauthor/i.test(f.error??"")).slice(0,20).map(f=>({approval_id:`sync-review-${f.id}`,task_id:f.entityId,status:"pending",created_at:f.createdAt,title:`同步异常待处理:${f.entityType}/${f.entityId}`,reversible:!1,source:"qimingclaw-sync",error:f.error}));return[...i,...c]}function DS(a,i,s){var h;const c=new Map(Sn(s).map(_=>[_.id,_])),d=new Map(Nt(s).map(_=>[_.id,_])),f=((h=a.decisionResultsByDate)==null?void 0:h[i])??{};return Dc(s).filter(_=>le(_.source)==="qimingclaw-runtime").map(_=>{const p=_l(_.payload),g=le(_.approval_id)||`approval-${ua(le(_.task_id)||le(_.title)||"item")}`,j=f[g],S=RS(j,le(_.status)||"pending"),E=le(_.plan_id),$=le(_.task_id),A=E?c.get(E):null,O=$?d.get($):null;return{id:g,title:le(_.title)||le(p==null?void 0:p.title)||"待确认事项",scenario:zS(_,p),status:S,status_label:MS(S,j),plan_title:(A==null?void 0:A.title)||le(p==null?void 0:p.plan_title)||le(_.plan_id)||"qimingclaw 本地记录",task_title:(O==null?void 0:O.title)||le(p==null?void 0:p.task_title)||le(_.task_id)||"待确认任务",actions:OS(S)?[{id:"approved",label:"同意",tone:"primary"},{id:"rejected",label:"驳回",tone:"secondary"}]:[]}})}function zS(a,i){return le(i==null?void 0:i.scenario)||le(i==null?void 0:i.summary)||le(i==null?void 0:i.reason)||le(i==null?void 0:i.message)||le(a.error)||"来自 qimingclaw 本地运行记录的人工确认项。"}function RS(a,i){const s=String(a||"").toLowerCase();return["approve","approved","accept","accepted"].includes(s)?"approved":["reject","rejected","deny","denied"].includes(s)?"rejected":["dismiss","dismissed","skip","skipped"].includes(s)?"dismissed":i||"pending"}function MS(a,i){return i?a==="approved"?"已同意":a==="rejected"?"已驳回":a==="dismissed"?"已忽略":"已处理":a==="approved"?"已同意":a==="rejected"?"已驳回":a==="completed"?"已完成":a==="failed"?"异常":"待确认"}function OS(a){return["pending","requested"].includes(String(a||"").toLowerCase())}function Hd(a){const i=[...iy(a).map($S),..._i(a).flatMap(s=>my(s,ra(a))),...ra(a).flatMap(s=>dd(s.id,s.payload,s.occurredAt,{sourceType:"event",sourceEventId:s.id,sourceLabel:`Event ${s.kind}`,planId:s.planId,taskId:s.taskId,runId:s.runId}))];return hy(i)}function $S(a){const i=_l(a.payload);return{artifact_id:a.id,subject_id:a.runId??a.taskId??a.planId??a.id,kind:a.kind,name:a.name||le((i==null?void 0:i.name)??(i==null?void 0:i.title))||fd(a.uri??"")||a.kind,uri:a.uri||le((i==null?void 0:i.uri)??(i==null?void 0:i.url)??(i==null?void 0:i.path))||void 0,value:le((i==null?void 0:i.value)??(i==null?void 0:i.summary)??(i==null?void 0:i.text))||a.uri||a.name||a.kind,plan_id:a.planId??null,task_id:a.taskId??null,run_id:a.runId??null,created_at:a.createdAt,source:"qimingclaw-runtime",source_type:"artifact",source_label:jc("artifact",a.id),sync_status:a.syncStatus,sync_error:a.syncError,payload:a.payload}}function my(a,i){return hy([...dd(a.id,a.payload,a.finishedAt??a.startedAt??a.createdAt,{sourceType:"run",sourceLabel:jc("run",a.id),planId:a.planId,taskId:a.taskId,runId:a.id}),...i.filter(s=>s.runId===a.id).flatMap(s=>dd(a.id,s.payload,s.occurredAt,{sourceType:"event",sourceEventId:s.id,sourceLabel:`Event ${s.kind}`,planId:s.planId,taskId:s.taskId,runId:s.runId}))])}function dd(a,i,s,c){const d=_l(i);if(!d)return typeof i=="string"?[Io(a,i,0,s,c)]:[];const h=[...ic(d.artifacts),...ic(d.outputs),...ic(d.files),...ic(d.attachments)].map((_,p)=>Io(a,_,p,s,c));for(const _ of["artifact","outputPath","output_path","filePath","file_path","path","uri","url"])d[_]&&h.push(Io(a,d[_],h.length,s,c));return h.filter(_=>_.name||_.uri||_.value)}function Io(a,i,s,c,d){const f=_l(i);if(f){const _=le(f.uri??f.url??f.path??f.filePath??f.file_path??f.outputPath??f.output_path),p=le(f.name??f.title??f.filename)||fd(_)||`产物 ${s+1}`;return{artifact_id:le(f.artifact_id??f.id)||`artifact-${ua(a)}-${s+1}`,subject_id:le(f.subject_id)||a,kind:le(f.kind??f.type)||"artifact",name:p,uri:_,value:le(f.value??f.summary??f.text)||_,created_at:(le(f.created_at??f.createdAt)||c)??void 0,source:"qimingclaw-runtime",source_type:le(f.source_type)||(d==null?void 0:d.sourceType)||"payload",source_event_id:le(f.source_event_id)||(d==null?void 0:d.sourceEventId)||null,source_label:le(f.source_label)||(d==null?void 0:d.sourceLabel)||jc("payload",a),plan_id:le(f.plan_id)||(d==null?void 0:d.planId)||null,task_id:le(f.task_id)||(d==null?void 0:d.taskId)||null,run_id:le(f.run_id)||(d==null?void 0:d.runId)||null}}const h=String(i??"").trim();return{artifact_id:`artifact-${ua(a)}-${s+1}`,subject_id:a,kind:"artifact",name:fd(h)||`产物 ${s+1}`,uri:qS(h)?h:void 0,value:h,created_at:c??void 0,source:"qimingclaw-runtime",source_type:(d==null?void 0:d.sourceType)||"payload",source_event_id:(d==null?void 0:d.sourceEventId)||null,source_label:(d==null?void 0:d.sourceLabel)||jc("payload",a),plan_id:(d==null?void 0:d.planId)||null,task_id:(d==null?void 0:d.taskId)||null,run_id:(d==null?void 0:d.runId)||null}}function jc(a,i){const s=i?` ${i}`:"";switch(a){case"artifact":return`Artifact${s}`;case"event":return`Event${s}`;case"run":return`Run${s}`;case"task":return`Task${s}`;case"plan":return`Plan${s}`;default:return`Payload${s}`}}function hy(a){const i=new Set;return a.filter(s=>{const c=s.artifact_id||`${s.subject_id}:${s.uri||s.value||s.name}`;return!c||i.has(c)?!1:(i.add(c),!!(s.name||s.uri||s.value))})}function _l(a){return a&&typeof a=="object"&&!Array.isArray(a)?a:null}function ic(a){return Array.isArray(a)?a:[]}function le(a){return typeof a=="string"?a.trim():""}function qS(a){return/^(file|https?):\/\//i.test(a)||a.includes("/")||a.includes("\\")}function fd(a){return a?(a.split(/[?#]/)[0]||a).split(/[\\/]/).filter(Boolean).pop()??"":""}function ua(a){const i=a.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(i)return i;let s=0;for(let c=0;c>>0;return`item-${s.toString(36)}`}function py(a,i=null){const s=(a??"").trim().toLowerCase(),c=Ud(i);return s?c.filter(d=>d.title.toLowerCase().includes(s)||d.plan_id.toLowerCase().includes(s)||(d.objective??"").toLowerCase().includes(s)):c}function LS(a){const i=new Map(Sn(a).map(d=>[d.id,d])),s=new Map(Nt(a).map(d=>[d.id,d])),c=ra(a).map(d=>{const f=d.taskId?s.get(d.taskId):void 0,h=d.planId??(f==null?void 0:f.planId)??null,_=h?i.get(h):void 0,p=(f==null?void 0:f.status)??(_==null?void 0:_.status)??(d.kind.includes("failed")||d.kind.includes("error")?"failed":"running"),g=Ie(p);return{id:d.id,time:Sc(d.occurredAt),plan_title:(_==null?void 0:_.title)??"qimingclaw 本地执行",task_title:(f==null?void 0:f.title)??d.message,step_title:d.kind,detail:d.message||d.kind,status:p,status_label:$n(p),status_tone:g,updated_at:d.occurredAt,conversation_id:h??(f==null?void 0:f.id)??d.id}});return c.length>0?c:Nt(a).map(d=>{const f=d.planId?i.get(d.planId):void 0;return{id:`task-event-${d.id}`,time:Sc(d.updatedAt),plan_title:(f==null?void 0:f.title)??"qimingclaw 本地任务",task_title:d.title,step_title:d.assignedSkillId||"qimingclaw-runtime",detail:d.syncError||`${d.title}:${$n(d.status)},同步状态 ${d.syncStatus}`,status:d.status,status_label:$n(d.status),status_tone:Ie(d.status),updated_at:d.updatedAt,conversation_id:d.planId??d.id}})}function US(a,i,s){if(xl(s)){const f=LS(s);return Zp(f,s)}if(!i)return[{id:"event-await-confirmation",time:"待确认",plan_title:"任务设置",task_title:"等待确认今日任务",step_title:"选择职责",detail:"请先确认今天要执行的任务,确认后数字员工会开始执行。",status:"pending",status_label:"待确认",status_tone:"waiting",updated_at:new Date().toISOString(),conversation_id:null}];const d=a.filter(f=>f.selected).map(f=>({id:`event-${f.id}`,time:f.status==="running"?"实时":"待执行",plan_title:f.title,task_title:f.title,step_title:f.status==="running"?"同步 qimingclaw 服务状态":"等待调度",detail:f.status==="running"?`${f.result_text}。快照时间:${(s==null?void 0:s.generatedAt)??"未连接 bridge"}`:"任务已确认,将在后续阶段接入 ACP/MCP 真实执行事件。",status:f.status==="running"?"running":"pending",status_label:f.status==="running"?"执行中":"待执行",status_tone:f.status==="running"?"running":"waiting",updated_at:new Date().toISOString(),conversation_id:f.conversation_id}));return Zp(d,s)}function Zp(a,i){const s=i==null?void 0:i.sync;if(s&&(s.pending>0||s.failed>0||s.lastSyncAt)){const c=(s.recentFailures||[]).slice(0,3).map(oy).join(";");return[...a,{id:"event-management-sync",time:s.syncing?"实时":"同步",plan_title:"管理端联动",task_title:"同步数字员工本地状态",step_title:s.failed>0?"同步补偿":"outbox 推送",detail:[od(i),s.lastSyncError?`错误:${s.lastSyncError}`:"",c?`最近失败:${c}`:""].filter(Boolean).join("。"),status:s.failed>0?"failed":s.syncing||s.pending>0?"running":"completed",status_label:s.failed>0?"异常":s.syncing||s.pending>0?"同步中":"已同步",status_tone:s.failed>0?"danger":s.syncing||s.pending>0?"running":"success",updated_at:s.lastSyncAt??new Date().toISOString(),conversation_id:"qimingclaw-management-sync"}]}return a}function BS(a,i){return(a.some(c=>c.selected)?a.filter(c=>c.selected):a).map(c=>{const d=i.filter(g=>g.conversation_id===c.conversation_id),f=d.filter(g=>g.status==="running").length,h=d.filter(g=>g.status==="completed").length,_=d.filter(g=>Ie(g.status)==="danger").length,p=Math.max(0,d.length-f-h-_);return{id:c.id,plan_id:c.id,title:c.title,description:c.summary,selected:c.selected,total_count:Math.max(d.length,1),success_count:h,failure_count:_,running_count:f,waiting_count:d.length===0?1:p,latest_status_label:_>0?"异常":f>0?"执行中":h>0?"已完成":"待执行",latest_status_tone:_>0?"danger":f>0?"running":h>0?"success":"waiting",business_summary:c.result_text,ai_summary:"当前由 qimingclaw 本地运行记录生成。"}})}function HS(a){return a.map(i=>({id:`run-detail-${i.id}`,time:i.time,task_name:i.task_title,step_name:i.step_title,operation_name:i.plan_title,status_label:i.status_label,status_tone:i.status_tone,business_detail:i.detail,raw_detail:i.detail,updated_at:i.updated_at,conversation_id:i.conversation_id}))}function gy(a,i){const s=(i==null?void 0:i.uiState)??Rd(),c=s.confirmedDates[a]??null,d=!!c,f=wS(s,a,i),h=US(f,d,i),_=BS(f,h),p=s.reportGeneratedAtByDate[a]??null,g=f.filter(K=>K.selected).length,j=h.filter(K=>K.status==="running").length,S=h.filter(K=>Ie(K.status)==="success").length,E=h.filter(K=>Ie(K.status)==="danger").length,$=Sn(i).length+Nt(i).length,A=xl(i),O=i==null?void 0:i.sync,R=GS(Hd(i)),q=mS(i),F=q.filter(K=>K.requires_human_action||K.status==="degraded"),Z=q.filter(K=>K.running).length,P=gS(i),te=yS(i),he=te.filter(K=>K.can_retry||K.can_skip||K.can_cancel);return{source:"live",date:a,employee:{name:s.profile.name,title:"数字员工",major:"qimingclaw 客户端任务执行",company:s.profile.company,position:s.profile.position,current_status:s.profile.currentStatus,current_status_label:s.profile.currentStatus==="resting"?"休息中":"工作中",motto:"承接客户端任务,调度 ACP 与 MCP 能力完成执行。"},workday:{confirmed:d,confirmed_at:c,current_status:s.profile.currentStatus,current_status_label:s.profile.currentStatus==="resting"?"休息中":"工作中",status_label:A?E>0||F.length>0?"有异常":j>0?"执行中":"已同步":d?"运行中":"待确认",status_tone:A?E>0||F.length>0?"danger":j>0?"running":"success":d?"running":"waiting",summary:A?`当前日期 ${lc(a)} 已读取 ${$} 条 qimingclaw 本地运行记录,${Qp(q)}。`:d?`当前日期 ${lc(a)} 已确认 ${g} 项任务。`:`当前日期 ${lc(a)} 待确认今日任务。`,bubble_text:A?F.length>0?`我发现 ${F.length} 项常驻服务需要处理,会把影响到的任务标出来。`:"我已接入 qimingclaw 本地运行记录,会持续展示真实任务、事件和同步状态。":d?"我已接入 qimingclaw 客户端执行链路,正在等待真实 Run/Event 数据接入。":"请先确认今天要执行的任务,我会把它们映射到 qimingclaw 执行链路。"},overview:{title:"今日执行",status_label:A?"本地真实记录":d?"真实数据":"待确认",status_tone:E>0?"danger":A||d?"success":"waiting",metrics:[{label:"已选任务",value:String(g)},{label:"运行记录",value:String(h.length)},{label:"执行中",value:String(j)},{label:"已完成",value:String(S)},{label:"异常",value:String(E)},{label:"待同步",value:String((O==null?void 0:O.pending)??0)},{label:"同步异常",value:String((O==null?void 0:O.failed)??0)},{label:"服务运行",value:`${Z}/${q.length}`},{label:"需处理服务",value:String(F.length)},{label:"Plan Agent",value:String(P.length)},{label:"Task Agent",value:String(te.length)},{label:"可治理任务",value:String(he.length)}]},managed_services:q,plan_agents:P,task_agents:te,duties:f,events:h,execution_summaries:_,run_details:HS(h),decisions:DS(s,a,i),delivery:{headline:A?"qimingclaw 本地记录已接入":d?"qimingclaw 执行链路已接入":"等待确认任务设置",summary:A?"数字员工页面正在读取本地 Plan / Task / Run / Event,并同步展示管理端 outbox 状态。":"当前阶段已将数字员工页面切换到 qimingclaw adapter,并开始读取客户端服务状态。",lines:["已吸收 sgRobot 数字员工 UI 和核心展示模型。",A?`已读取本地记录:Plan ${Sn(i).length} / Task ${Nt(i).length} / Run ${_i(i).length} / Event ${ra(i).length}。`:"已建立 qimingclaw workday/plans/tasks/skills API adapter。",Xa(i,"agent","Agent"),Xa(i,"mcp","MCP"),Xa(i,"computerServer","Computer Server"),Qp(q),...F.slice(0,3).map(hS),`Plan Agent:${P.length} 个计划代理,Task Agent:${te.length} 个任务代理。`,he[0]?`待治理任务:${he[0].title},下一步 ${he[0].next_action}。`:"Task Agent:暂无需要重试、跳过或取消的任务。",od(i),`活跃会话:${(i==null?void 0:i.sessions.active)??0} / ${(i==null?void 0:i.sessions.total)??0}`],artifacts:[{name:"数字员工运行摘要",status:p?"ready":"pending"},...R.slice(0,4).map(K=>({name:K.name,status:p?"ready":"available",uri:K.uri??null,source_label:K.source_label??null,source_type:K.source_type??null}))]},daily_report:{date:a,title:`${lc(a)} 飞天数字员工日报`,report_schedule_time:s.reportScheduleTime,status:p?"ready":"not_generated",generated_at:p,generated_by:p?"ai":"fallback",model:"qimingclaw-adapter",source:"qimingclaw",summary:p?`今日已完成数字员工页面到 qimingclaw adapter 的接入,并读取了 qimingclaw 服务状态。${od(i)}。`:"日报将在生成后汇总任务选择、运行明细和后续接入建议。",totals:{task_count:g,execution_count:h.length,success_count:S,failure_count:E,running_count:j},task_sections:_,detail_lines:h.map(K=>`${K.time} ${K.task_title}:${K.detail}`),artifact_sources:R,pdf_available:!!p,pdf_url:null}}}function GS(a){return a.slice(0,20).map(i=>({id:le(i.artifact_id)||`${le(i.subject_id)}:${le(i.uri??i.name)}`,name:le(i.name)||le(i.uri)||le(i.value)||"未命名产物",kind:le(i.kind)||null,uri:le(i.uri)||null,source_label:le(i.source_label)||null,source_type:le(i.source_type)||null,source_event_id:le(i.source_event_id)||null,plan_id:le(i.plan_id)||null,task_id:le(i.task_id)||null,run_id:le(i.run_id)||null,created_at:le(i.created_at)||null}))}async function YS(a,i){const s=(i==null?void 0:i.uiState)??await Md()??Rd(),c=a.date||Od();a.action==="confirm_workday"&&(s.selectedDutyIdsByDate[c]=a.duty_ids??[],s.confirmedDates[c]=new Date().toISOString()),a.action==="update_profile"&&(s.profile={name:a.name||s.profile.name,company:a.company||s.profile.company,position:a.position||s.profile.position,currentStatus:a.current_status||s.profile.currentStatus}),a.action==="update_report_schedule"&&(s.reportScheduleTime=a.report_schedule_time||s.reportScheduleTime),a.action==="generate_daily_report"&&(a.duty_ids&&(s.selectedDutyIdsByDate[c]=a.duty_ids),a.report_schedule_time&&(s.reportScheduleTime=a.report_schedule_time),s.reportGeneratedAtByDate[c]=new Date().toISOString()),a.action==="decide_approval"&&a.decision_id&&(s.decisionResultsByDate=s.decisionResultsByDate??{},s.decisionResultsByDate[c]={...s.decisionResultsByDate[c]??{},[a.decision_id]:a.decision||"resolved"});const d=a.action==="decide_approval"?await QS(a,i):null,f=await Pg(s,a.action,c,a.action==="decide_approval"?{decision_id:a.decision_id,decision:a.decision,acp_permission:d}:void 0);return gy(c,{...i??{generatedAt:new Date().toISOString(),services:{},sessions:{total:0,active:0,items:[]}},uiState:f})}async function QS(a,i){var h,_;if(!a.decision_id||!a.decision)return null;const s=KS(a.decision_id,i);if(!s)return null;const c=XS(s);if(!c)return null;const d=ZS(a.decision),f=(_=(h=window.QimingClawBridge)==null?void 0:h.digital)==null?void 0:_.respondPermission;if(!f)return null;try{const p=await f(c.sessionId,c.permissionId,d);return{permission_id:c.permissionId,session_id:c.sessionId,response:d,success:(p==null?void 0:p.success)!==!1,error:p==null?void 0:p.error}}catch(p){return{permission_id:c.permissionId,session_id:c.sessionId,response:d,success:!1,error:p instanceof Error?p.message:String(p)}}}function KS(a,i){return Dc(i).find(s=>le(s.approval_id)===a)??null}function XS(a){const i=_l(a.payload),s=_l(i==null?void 0:i.payload),c=le(i==null?void 0:i.permissionId)||le(i==null?void 0:i.permission_id)||le(i==null?void 0:i.id)||le(s==null?void 0:s.permissionId)||le(s==null?void 0:s.permission_id)||le(s==null?void 0:s.id),d=le(i==null?void 0:i.sessionId)||le(i==null?void 0:i.session_id)||le(s==null?void 0:s.sessionId)||le(s==null?void 0:s.session_id),f=le(i==null?void 0:i.source);return!c||!d||f&&f!=="acp-permission"?null:{permissionId:c,sessionId:d}}function ZS(a){const i=a.toLowerCase();return i.includes("always")?"always":i.includes("reject")||i.includes("deny")?"reject":"once"}async function Gd(a,i){var j,S,E,$,A,O,R,q,F,Z,P,te,he,K,ie,ne,be,Be,Re,Q,re;const s=`qimingclaw-digital-${a.command_kind}-${Date.now()}`,c=a.correlation_id||s,d=oe((j=a.context_refs)==null?void 0:j.plan_id)||oe((S=a.payload)==null?void 0:S.plan_id)||oe((E=a.payload)==null?void 0:E.original_plan_id),f=oe(($=a.context_refs)==null?void 0:$.task_id)||oe((A=a.payload)==null?void 0:A.task_id)||oe((O=a.payload)==null?void 0:O.original_task_id),h=oe((R=a.context_refs)==null?void 0:R.run_id)||oe((q=a.payload)==null?void 0:q.run_id)||oe((F=a.payload)==null?void 0:F.latest_run_id),_=oe((Z=a.context_refs)==null?void 0:Z.step_id)||oe((P=a.payload)==null?void 0:P.step_id)||oe((te=a.payload)==null?void 0:te.stepId),p=oe((he=a.context_refs)==null?void 0:he.schedule_id)||oe((K=a.payload)==null?void 0:K.schedule_id);if(a.command_kind==="create_plan"){const L=`qimingclaw-local-${ua(oe((ie=a.payload)==null?void 0:ie.title)||d||"plan")}-${Date.now()}`,N=pl(s,c,"已在 qimingclaw 兼容层创建本地计划草稿。",{plan_id:L,status:"draft",source:"qimingclaw-adapter",requested_action:(ne=a.payload)==null?void 0:ne.requested_action,original_plan_id:((be=a.payload)==null?void 0:be.original_plan_id)??d});return await Ka(a,N),N}if(a.command_kind==="activate_plan"||a.command_kind==="run_schedule_now"){const L=d||((Be=Ld(i)[0])==null?void 0:Be.plan_id)||((Re=ca(i)[0])==null?void 0:Re.plan_id)||"qimingclaw-client-readiness",N=await _y(L,i,{recordCommand:!1}),Y=pl(s,c,"已映射为 qimingclaw 本地任务激活。",{plan_id:L,status:"active",dispatched_tasks:N.dispatched_tasks,source:"qimingclaw-adapter"});return await Ka(a,Y),Y}if(a.command_kind==="create_schedule"){const L=pl(s,c,"已记录 qimingclaw 兼容定时任务请求。",{schedule_id:p||`qimingclaw-schedule-${Date.now()}`,plan_id:d,status:"enabled",source:"qimingclaw-adapter"});return await Ka(a,L),L}if(["update_schedule","pause_schedule","resume_schedule","delete_schedule"].includes(a.command_kind)){const L=a.command_kind==="pause_schedule"?"paused":a.command_kind==="delete_schedule"?"deleted":"enabled",N=pl(s,c,`已接受 ${a.command_kind},并更新 qimingclaw 本地定时任务状态。`,{schedule_id:p||`qimingclaw-schedule-${Date.now()}`,plan_id:d,status:L,source:"qimingclaw-adapter"});return await Ka(a,N),N}if(["submit_plan","approve_plan","amend_plan","resume_plan","pause_plan","cancel_plan"].includes(a.command_kind)){const L=pl(s,c,`已接受 ${a.command_kind},当前由 qimingclaw 本地 adapter 记录兼容状态。`,{plan_id:d,status:a.command_kind==="approve_plan"?"approved":a.command_kind==="submit_plan"?"reviewing":"accepted",source:"qimingclaw-adapter"});return await Ka(a,L),L}if(["retry_task","skip_task","pause_task","resume_task","provide_task_input","cancel_task","start_run","cancel_run"].includes(a.command_kind)){const L=f||((Q=Nt(i)[0])==null?void 0:Q.id)||"qimingclaw-task-agent",N=Nt(i).find(Se=>Se.id===L),Y=h||((re=cy(_i(i),L))==null?void 0:re.id)||null,ae=_||(N?Ls(N):null),me=pl(s,c,`已接受 ${a.command_kind},并记录到 qimingclaw Task Agent 控制平面。`,{plan_id:d||(N==null?void 0:N.planId)||"qimingclaw-task-agent-plan",task_id:L,run_id:Y,step_id:ae,task_agent_id:`task-agent-${ua(L)}`,status:VS(a.command_kind),next_action:JS(a.command_kind),source:"qimingclaw-task-agent"});return await Ka(a,me),me}const g={command_id:s,accepted:!1,correlation_id:c,error:"missing_capability",message:`qimingclaw 数字员工兼容层尚未支持 ${a.command_kind}。`};return await Ka(a,g),g}function pl(a,i,s,c){return{command_id:a,accepted:!0,correlation_id:i,message:s,result:c}}function VS(a){switch(a){case"retry_task":case"start_run":case"resume_task":return"running";case"skip_task":return"skipped";case"cancel_task":case"cancel_run":return"cancelled";case"pause_task":return"paused";default:return"accepted"}}function JS(a){switch(a){case"retry_task":return"start_retry_run";case"skip_task":return"continue_next_task";case"pause_task":return"await_resume";case"resume_task":return"watch_progress";case"provide_task_input":return"resume_with_input";case"cancel_task":case"cancel_run":return"close_execution";case"start_run":return"watch_progress";default:return"record_control_event"}}function oe(a){return typeof a=="string"&&a.trim()?a.trim():""}function yy(a,i=null){var d,f,h,_;if(xl(i)){const p=Sn(i).find(q=>q.id===a),g=Bs(a,i),j=ry(i,a),S=Bd(a,i).runs,E=ra(i).filter(q=>q.planId===a||g.some(F=>F.task_id===q.taskId)),$=(p==null?void 0:p.title)??((d=g[0])==null?void 0:d.title)??a,A=(p==null?void 0:p.objective)??"qimingclaw 本地运行记录",O=[];let R=2;if(j.length>0){const q=new Set(j.map(Z=>Z.id));for(const Z of j){O.push({seq:R++,lane:"qimingclaw",label:Z.title,sub_label:`${$n(Z.status)} · 依赖 ${Z.dependsOn.length} · 技能 ${Z.preferredSkillIds.length}`,timestamp:Z.updatedAt,color:"#22c55e",source_type:"plan_step"});for(const P of g.filter(te=>te.step_id===Z.id))O.push(Wo(P,R++))}const F=g.filter(Z=>!q.has(Z.step_id||""));if(F.length>0){O.push({seq:R++,lane:"qimingclaw",label:"未归属步骤",sub_label:`包含 ${F.length} 个任务`,timestamp:((f=F[0])==null?void 0:f.updated_at)??new Date().toISOString(),color:"#22c55e",source_type:"plan_step"});for(const Z of F)O.push(Wo(Z,R++))}}else for(const q of g)O.push(Wo(q,R++));return{plan_id:a,plan_title:$,plan_status:p?Cc(p,Nc(i,p.id)):(h=g[0])==null?void 0:h.status,plan_objective:A,lanes:[{key:"intent",label:"目标",color:"#38bdf8"},{key:"qimingclaw",label:"qimingclaw",color:"#22c55e"},{key:"execution",label:"执行",color:"#f59e0b"}],steps:[{seq:1,lane:"intent",label:$,sub_label:A,timestamp:(p==null?void 0:p.createdAt)??((_=g[0])==null?void 0:_.created_at)??new Date().toISOString(),color:"#38bdf8",source_type:"plan"},...O,...S.map((q,F)=>({seq:R+F,lane:"execution",label:q.lifecycle||"Run",sub_label:q.run_id,timestamp:q.completed_at??q.created_at,color:"#f59e0b",source_type:"run"}))],events:E.map(q=>({event_id:q.id,kind:q.kind,occurred_at:q.occurredAt,message:q.message}))}}const s=Us(ca(i).find(p=>p.plan_id===a)??ca(i)[0],i),c=new Date().toISOString();return{plan_id:s.plan_id,plan_title:s.title,plan_status:s.status,plan_objective:s.objective,lanes:[{key:"intent",label:"目标",color:"#38bdf8"},{key:"qimingclaw",label:"qimingclaw",color:"#22c55e"},{key:"execution",label:"执行",color:"#f59e0b"}],steps:[{seq:1,lane:"intent",label:s.title,sub_label:s.objective,timestamp:s.created_at,color:"#38bdf8",source_type:"plan"},{seq:2,lane:"qimingclaw",label:"接入客户端能力",sub_label:"ACP / MCP / computer server adapter",timestamp:c,color:"#22c55e",source_type:"adapter"},{seq:3,lane:"execution",label:s.status==="running"?"已读取 qimingclaw 服务状态":"等待调度",sub_label:fy(s,i),timestamp:c,color:"#f59e0b",source_type:"run"}],events:[{event_id:`${s.plan_id}-adapter-event`,kind:"qimingclaw_adapter",occurred_at:c,message:"数字员工页面已通过 qimingclaw adapter 获取数据。"}]}}function Wo(a,i){return{seq:i,lane:"qimingclaw",label:a.title,sub_label:`${$n(a.status)} · ${a.assigned_skill_id||"qimingclaw-runtime"}`,timestamp:a.updated_at,color:"#22c55e",source_type:"task"}}function FS(a,i=null){const s=Nt(i).find(h=>h.id===a);if(!s)return yy(a,i);const c=s.planId?Sn(i).find(h=>h.id===s.planId):null,d=_i(i).filter(h=>h.taskId===s.id),f=ra(i).filter(h=>h.taskId===s.id||d.some(_=>_.id===h.runId));return{plan_id:s.planId??s.id,plan_title:(c==null?void 0:c.title)??s.title,plan_status:s.status,plan_objective:(c==null?void 0:c.objective)??"qimingclaw 本地任务记录",lanes:[{key:"task",label:"任务",color:"#38bdf8"},{key:"execution",label:"执行",color:"#22c55e"},{key:"event",label:"事件",color:"#f59e0b"}],steps:[{seq:1,lane:"task",label:s.title,sub_label:`${$n(s.status)} · ${s.assignedSkillId||"qimingclaw-runtime"}`,timestamp:s.updatedAt,color:"#38bdf8",source_type:"task"},...d.map((h,_)=>({seq:_+2,lane:"execution",label:h.status||"Run",sub_label:h.id,timestamp:h.finishedAt??h.startedAt??h.createdAt,color:"#22c55e",source_type:"run"})),...f.map((h,_)=>({seq:d.length+_+2,lane:"event",label:h.kind,sub_label:h.message,timestamp:h.occurredAt,color:"#f59e0b",source_type:"event"}))],events:f.map(h=>({event_id:h.id,kind:h.kind,occurred_at:h.occurredAt,message:h.message}))}}async function _y(a,i=null,s={}){const c=(i==null?void 0:i.uiState)??await Md()??Rd(),d=Od(),f=Ud(i).find(j=>j.plan_id===a),h=Date.now(),_=`dispatch-${a}-${h}`,p=new Set(c.selectedDutyIdsByDate[d]??[]);p.add(a),c.selectedDutyIdsByDate[d]=[...p],c.confirmedDates[d]=c.confirmedDates[d]??new Date().toISOString(),await Pg(c,"confirm_workday",d);const g=Bs(a,i).map(j=>({task_id:j.task_id,title:j.title,status:j.status==="pending"?"running":j.status}));return s.recordCommand!==!1&&await Ka({command_kind:"activate_plan",context_refs:{plan_id:a},payload:{plan_id:a,title:f==null?void 0:f.title,objective:f==null?void 0:f.objective,requested_action:"dispatch_plan"},correlation_id:_},pl(`qimingclaw-digital-dispatch-${ua(a)}-${h}`,_,"已将数字员工模板执行写入 qimingclaw 本地运行记录。",{plan_id:a,status:"active",dispatched_tasks:g,source:"qimingclaw-adapter"})),{ok:!0,plan_id:a,source_plan_id:a,dispatched_tasks:g}}function IS(a,i=null){const s=Sn(i).find(d=>d.id===a);if(s){const d=ra(i).filter(f=>f.planId===a).slice(0,12);return[{role:"user",content:`查看 qimingclaw 本地任务:${s.title}`,created_at:s.createdAt},...d.map(f=>({role:"assistant",content:`${f.kind}:${f.message}`,created_at:f.occurredAt}))]}const c=ca(i).find(d=>d.plan_id===a)??ca(i)[0];return[{role:"user",content:`执行数字员工任务:${c.title}`,created_at:c.created_at},{role:"assistant",content:`已接入 qimingclaw adapter。目标:${c.objective??c.title}`,created_at:new Date().toISOString()}]}const WS=9e3,vy=2e4;class PS extends Error{constructor(){super("Unauthorized"),this.name="UnauthorizedError"}}async function dn(a,i={}){const s=await P0(a,i);if(s!==void 0)return s;const{timeoutMs:c=WS,...d}=i,f=Z0(),h=new Headers(d.headers),_=new AbortController;let p=!1;const g=window.setTimeout(()=>{p=!0,_.abort()},c),j=d.signal,S=()=>_.abort();j&&(j.aborted?_.abort():j.addEventListener("abort",S,{once:!0})),f&&h.set("Authorization",`Bearer ${f}`),d.body&&typeof d.body=="string"&&!h.has("Content-Type")&&h.set("Content-Type","application/json");let E;try{E=await fetch(`${X0()}${K0}${a}`,{...d,headers:h,signal:_.signal})}catch($){throw $ instanceof DOMException&&$.name==="AbortError"&&p?new Error(`API request timed out after ${c/1e3}s: ${a}`):$}finally{window.clearTimeout(g),j==null||j.removeEventListener("abort",S)}if(E.status===401)throw V0(),window.dispatchEvent(new Event("qimingclaw-digital-unauthorized")),new PS;if(!E.ok){const $=await E.text().catch(()=>"");let A=$||E.statusText;if($)try{const O=JSON.parse($);typeof O.message=="string"&&O.message.trim()?A=O.message.trim():typeof O.error=="string"&&O.error.trim()&&(A=O.error.trim())}catch{A=$}throw new Error(`API ${E.status}: ${A}`)}if(E.status!==204)return E.json()}function ex(a,i){if(a!==null&&typeof a=="object"&&!Array.isArray(a)&&i in a){const s=a[i];if(s!==void 0)return s}return a}function tx(){return dn("/api/scheduler/jobs").then(a=>ex(a,"jobs"))}function Vp(a){return dn(`/api/plan/${encodeURIComponent(a)}/messages`).then(i=>({messages:i.messages||[]}))}function md(a){return dn("/api/governance/command",{method:"POST",body:JSON.stringify(a)})}function mc(a){const i=a?`?date=${encodeURIComponent(a)}`:"";return dn(`/api/digital-employee/workday${i}`,{timeoutMs:vy})}function yl(a){return dn("/api/digital-employee/workday/actions",{method:"POST",body:JSON.stringify(a)})}function nx(a){return dn(`/api/debug/plan/${encodeURIComponent(a)}/dispatch`,{method:"POST",timeoutMs:vy})}function ax(){return dn("/api/debug/plans?limit=80").then(a=>a.plans??[])}function Jp(a,i=50){const s=new URLSearchParams({limit:String(i),q:a});return dn(`/api/debug/plans?${s}`).then(c=>c.plans??[])}function lx(a){const i=new URLSearchParams({limit:"50",plan_id:a});return dn(`/api/debug/tasks?${i}`).then(s=>({tasks:s.tasks??[],runs:s.runs??[],total:s.total,truncated:s.truncated}))}function ix(a){return dn(`/api/debug/plan/${encodeURIComponent(a)}/flow`)}function sx(){return dn("/api/skill").then(a=>a.skills??[])}function rx(a,i){return dn(`/api/skill/${encodeURIComponent(a)}/enabled`,{method:"POST",body:JSON.stringify({enabled:i})})}const cx=Q0,ux=`${cx}/digital-assets`,hl=`${ux}/avatars`,ox="Asia/Shanghai",dx=["skill","browser","call","redial","evidence","decision","reporting"],fx=[{id:"all",label:"全部"},{id:"running",label:"执行中"},{id:"success",label:"已完成"},{id:"danger",label:"异常"}],by="qimingclaw:digital-workday-guide-dismissed-date",Sy="sgrobot:digital-workday-guide-dismissed-date",mx=80,Fp=300,hx=[{title:"确认日期",body:"先确认今天的值班日期,避免把昨天或明天的任务混在一起。"},{title:"选择任务",body:"从岗位职责里勾选今天要执行的任务,未接入能力保持待扩展。"},{title:"任务执行",body:"点击任务执行后,数字员工开始按已选任务推进工作。"},{title:"查看过程",body:"右侧滚动显示运行明细,任务中心可继续查看明细。"}],px={skill:{id:"skill",label:"查看Skill",shortLabel:"技能",phase:"查看Skill与计划",src:`${hl}/states/employee-idle.png`,bubble:"我正在查看可用Skill、任务计划和今天要勾选的执行内容。"},browser:{id:"browser",label:"操作浏览器",shortLabel:"浏览器",phase:"操作浏览器执行",src:`${hl}/states/employee-browser.png`,bubble:"我正在打开页面、读取信息、填写表单,并把执行过程同步到右侧。"},call:{id:"call",label:"电话外呼",shortLabel:"外呼",phase:"电话外呼与重拨",src:`${hl}/states/employee-running.png`,bubble:"我正在按工单名单外呼现场人员,记录接通、未接通和后续重拨。"},redial:{id:"redial",label:"重拨跟进",shortLabel:"重拨",phase:"未接通人员重拨",src:`${hl}/states/employee-redial.png`,bubble:"我正在跟进未接通人员,按间隔重拨并更新每个人的通知状态。"},evidence:{id:"evidence",label:"数据核验",shortLabel:"核验",phase:"核验执行证据",src:`${hl}/states/employee-evidence.png`,bubble:"我正在核验页面数据、执行证据和任务结果,确认交付内容可信。"},decision:{id:"decision",label:"等待决策",shortLabel:"决策",phase:"等待人工确认",src:`${hl}/states/employee-decision.png`,bubble:"我已完成前置处理,现在需要人工确认后再继续推进。"},reporting:{id:"reporting",label:"汇报成果",shortLabel:"汇报",phase:"汇报今日成果",src:`${hl}/states/employee-reporting.png`,bubble:"我正在整理运行明细和日报,方便你直接查看成果和异常。"}};function hd(){const a=new Date;return[a.getFullYear(),String(a.getMonth()+1).padStart(2,"0"),String(a.getDate()).padStart(2,"0")].join("-")}function gx(a){return(a||hd()).split("-").join("/")}function sc(a){return a==="success"?"de-badge-success":a==="danger"?"de-badge-danger":a==="warning"||a==="running"?"de-badge-warning":"de-badge-info"}function yx(a,i){const s=["de-template-card-row","de-duty-card","de-duty-card--compact"];return a.implemented||s.push("de-duty-card--disabled"),i&&s.push("de-duty-card--selected"),a.statusTone==="running"&&s.push("de-duty-card--running"),s.join(" ")}function qn(a){return String(a||"").replace(/\s+/g," ").trim()}function _x(a){if(!a)return"";if(a.expression)return a.expression;if(typeof a.schedule=="string")return a.schedule;if(a.schedule&&typeof a.schedule=="object"){const i=a.schedule,s=i.expr??i.expression??i.cron;if(typeof s=="string")return s}return""}function vx(a){const i=_x(a);if(!i)return"未定时";const s=i.trim().split(/\s+/),c=s[0]??"",d=s[1]??"";return s.length>=2&&/^\d+$/.test(c)&&/^\d+$/.test(d)?`已定时 ${d.padStart(2,"0")}:${c.padStart(2,"0")} 执行`:`调度注册 ${i}`}function wc(a,i){if(!a||typeof a!="object")return"";const s=a;for(const c of i){const d=s[c];if(typeof d=="string"&&d.trim())return d.trim()}return""}function pi(a){const i=qn(a.template_id);if(i)return i;const s=wc(a.delivery,["template_id","plan_template_id","templateId"]);if(s)return s;const c=wc(a.schedule,["template_id","plan_template_id","templateId"]);return c||a.id.replace(/^schedule-/,"")}function bx(a,i,s){return a.has(i)||s?!0:Array.from(a).some(c=>Ms(c,i))}function Ms(a,i){return a.startsWith(`${i}-`)?/^-\d{8,}$/.test(a.slice(i.length)):!1}function Sx(a,i,s){if(a.id===i||a.conversation_id===i||Ms(a.id,i)||a.conversation_id&&Ms(a.conversation_id,i))return!0;const c=qn(s).toLowerCase();return!!(c&&qn(a.title).toLowerCase()===c)}function xy(a,i,s){const c=s.filter(d=>Sx(d,a,i));return c.find(d=>d.selected)??c.find(d=>d.id===a||d.conversation_id===a)??c[0]??null}function xx(a,i){var s;return((s=xy(a.id,a.title,i))==null?void 0:s.id)??a.id}function jx(a){return typeof a.step_count=="number"&&Number.isFinite(a.step_count)?a.step_count:Array.isArray(a.skill_ids)?a.skill_ids.length:0}function wx(a){const i=qn(a.trigger_kind||wc(a.schedule,["kind"])).toLowerCase();return i==="cron"?"定时任务":i==="webhook"?"触发任务":"手动任务"}function Ex(a,i,s){const c=pi(a),d=xy(c,a.name,i),f=jx(a),h=Array.isArray(a.skill_ids)?a.skill_ids.length:f,_=(d==null?void 0:d.status)??a.last_status??(a.enabled?"plan_template":"disabled"),p=(d==null?void 0:d.status_label)??(a.enabled?wx(a):"已停用"),g=(d==null?void 0:d.status_tone)??(a.enabled?"info":"waiting");return{id:c,planId:c,title:qn(a.name)||c,summary:qn(a.prompt)||`任务:${c}`,implemented:a.enabled,selectable:!0,selected:s,status:_,statusLabel:p,statusTone:g,scheduleText:(d==null?void 0:d.schedule_text)??vx(a),resultText:(d==null?void 0:d.result_text)??`${f} 个步骤,${h} 个Skill`,conversationId:(d==null?void 0:d.conversation_id)??c,stepCount:f,taskCount:h,schedulerJob:a,source:"plan_template"}}function rc(a){return a.implemented}function cc(a){return a.implemented?"":"当前任务未接入执行能力。"}function kx(a,i){const s=`${a.conversation_id??""} ${a.plan_title} ${a.task_title} ${a.step_title??""} ${a.detail}`;return s.includes(i.id)||s.includes(i.title)}function Ax(a,i){const s=i.filter(p=>kx(p,a)),c=s.filter(Rc).length,d=s.filter(Mc).length,f=s.filter(zc).length,h=Math.max(s.length-c-d-f,0),_=s.length>0?s[s.length-1]:void 0;return{id:a.id,plan_id:a.planId,title:a.title,description:a.summary,selected:!0,total_count:s.length,success_count:c,failure_count:d,running_count:f,waiting_count:h,latest_status_label:(_==null?void 0:_.status_label)??a.statusLabel,latest_status_tone:(_==null?void 0:_.status_tone)??a.statusTone,business_summary:s.length>0?`${a.title} 今日执行 ${s.length} 次,成功 ${c} 次,失败 ${d} 次。`:`${a.title} 尚未产生执行记录。`,ai_summary:s.length>0?`${a.title} 今日执行 ${s.length} 次,成功 ${c} 次,失败 ${d} 次。`:`${a.title} 尚未产生执行记录。`}}function Tx(a,i){const s=a.plan_id??"";return a.id===i.id||s===i.planId||Ms(a.id,i.id)||Ms(s,i.planId)?!0:qn(a.title).toLowerCase()===qn(i.title).toLowerCase()}function Nx(a){return{id:a.id,time:a.time,task_name:a.plan_title,step_name:a.step_title,operation_name:a.task_title,status_label:a.status_label,status_tone:a.status_tone,business_detail:hc(a),raw_detail:a.detail,updated_at:a.updated_at,conversation_id:a.conversation_id}}function Ip(a){const[i="9",s="0"]=a.split(":"),c=Math.min(Math.max(Number(i)||9,0),23);return`${Math.min(Math.max(Number(s)||0,0),59)} ${c} * * *`}function Wp(a){return a.status_label||a.status||"已同步"}function jl(a){return String(a||"").replace(/\s+/g," ").trim()}function jy(a){const s=`${a.plan_title} ${a.step_title??""}`.match(/(?:^|\D)(\d{1,2})[::](\d{2})(?:\D|$)/);return s!=null&&s[1]&&s[2]?`${s[1].padStart(2,"0")}:${s[2]}`:jl(a.time)||"即时触发"}function wl(a){const i=jl(a);if(!i)return"";const s=new Date(i);if(Number.isNaN(s.getTime()))return"";const c=new Intl.DateTimeFormat("zh-CN",{timeZone:ox,month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",hour12:!1}).formatToParts(s),d=f=>{var h;return((h=c.find(_=>_.type===f))==null?void 0:h.value)??""};return`${d("month")}/${d("day")} ${d("hour")}:${d("minute")}`}function Yd(a){const i=jl(a);return i?i.length>140?`${i.slice(0,140)}...`:i:""}function Cx(a){var i;return a?!a.enabled||!a.endpoint||(((i=a.missingCredentials)==null?void 0:i.length)??0)>0?"warning":a.failed>0||a.lastSyncError?"danger":a.syncing||a.pending>0?"warning":a.lastSyncAt?"success":"info":"info"}function Dx(a){var i;return a?a.enabled?a.endpoint?(((i=a.missingCredentials)==null?void 0:i.length)??0)>0?"缺少凭据":a.syncing?"同步中":a.failed>0||a.lastSyncError?"同步异常":a.pending>0?"待同步":a.lastSyncAt?"已同步":"等待数据":"未配置":"已停用":"未连接"}function zx(a){var s,c;if(!a)return"当前环境未连接 qimingclaw 同步桥。";if(!a.enabled)return"管理端同步已停用。";if(!a.endpoint)return"管理端同步地址未配置。";if((((s=a.missingCredentials)==null?void 0:s.length)??0)>0)return`管理端同步凭据未完整:${(c=a.missingCredentials)==null?void 0:c.join("、")}`;const i=Yd(a.lastSyncError);if(a.failed>0||i){const d=a.failureSummary?[a.failureSummary.dueForRetry>0?`${a.failureSummary.dueForRetry} 条可重试`:"",a.failureSummary.backoff>0?`${a.failureSummary.backoff} 条退避中`:"",Rx(a.failureSummary)].filter(Boolean).join(","):"";return[a.failed>0?`${a.failed} 条失败`:"",a.pending>0?`${a.pending} 条待同步`:"",d,i?`失败原因:${i}`:""].filter(Boolean).join(",")}return a.syncing?`正在同步,待同步 ${a.pending} 条。`:a.pending>0?`仍有 ${a.pending} 条待同步记录。`:a.lastSyncAt?`最近同步:${wl(a.lastSyncAt)||a.lastSyncAt}`:"等待本地 outbox 数据。"}function Ns(a){return{plan:"Plan",task:"Task",run:"Run",event:"Event",artifact:"Artifact",approval:"Approval"}[a]||a||"Entity"}function Rx(a){const i=a.byEntityType.slice(0,3).map(s=>`${Ns(s.entityType)} ${s.count}`).join(" / ");return i?`类型:${i}`:""}function Mx(a){var c;const i=Yd(a.error);return[jl((c=a.entitySummary)==null?void 0:c.title),`${Ns(a.entityType)} / ${a.operation}`,`重试 ${a.attempts} 次`,a.dueForRetry?"等待补偿":`下次 ${wy(a)}`,i].filter(Boolean).join(" · ")}function Pp(a){return wl(a.lastAttemptAt||a.updatedAt||a.createdAt)||"未尝试"}function wy(a){return a.dueForRetry?"可重试":wl(a.nextRetryAt)||"待计算"}function Ox(a){return a==="synced"?"已同步":a==="failed"?"失败":a||"未知"}function $x(a){return a==="synced"?"success":a==="failed"?"danger":"info"}function eg(a,i){return JSON.stringify({generatedAt:new Date().toISOString(),source:"qimingclaw-digital-employee",failure:a,sync:i?{running:i.running,syncing:i.syncing,enabled:i.enabled,endpoint:i.endpoint,missingCredentials:i.missingCredentials??[],pending:i.pending,failed:i.failed,lastSyncAt:i.lastSyncAt,lastSyncError:i.lastSyncError,failureSummary:i.failureSummary??null}:null},null,2)}function qx(a){return`qimingclaw-sync-failure-${[a.entityType,a.entityId].filter(Boolean).join("-").replace(/[^a-z0-9._-]+/gi,"-").replace(/^-+|-+$/g,"").slice(0,80)||a.id||"diagnostic"}.json`}function tg(a,i,s="application/json;charset=utf-8"){const c=new Blob([i],{type:s}),d=URL.createObjectURL(c),f=document.createElement("a");f.href=d,f.download=a,document.body.appendChild(f),f.click(),f.remove(),window.setTimeout(()=>URL.revokeObjectURL(d),1e3)}function Lx(a){return`qimingclaw-digital-report-${a}.txt`}function Ux(a,i,s,c){return[i.title||`${a} 数字员工日报`,`日期:${a}`,`生成时间:${i.generated_at?wl(i.generated_at):"暂未生成"}`,`生成来源:${i.generated_by==="ai"?"AI":"qimingclaw adapter"}`,"","## 摘要",i.summary||"暂无摘要。","","## 指标",`任务总数:${i.totals.task_count}`,`执行次数:${i.totals.execution_count}`,`成功次数:${i.totals.success_count}`,`失败次数:${i.totals.failure_count}`,`运行中:${i.totals.running_count??0}`,"","## 任务汇总",...s.length>0?s.map(d=>`- ${d.title}:${d.latest_status_label},执行 ${d.total_count} 次,成功 ${d.success_count},失败 ${d.failure_count}。${d.ai_summary||d.business_summary||""}`):["暂无任务汇总。"],"","## 运行明细",...c.length>0?c.map(d=>`- ${d.time||"--:--"} ${d.task_name} / ${d.step_name||d.operation_name||"任务执行"}:${d.status_label},${d.business_detail}`):["暂无运行明细。"],"","## 详情",...(i.detail_lines??[]).length>0?i.detail_lines:["暂无详情。"]].join(` `)}async function Bx(){var i;const a=(i=window.QimingClawBridge)==null?void 0:i.digital;if(!(a!=null&&a.getSyncStatus))return null;try{return await a.getSyncStatus()}catch{return null}}function Ey(a){const i=wl(a.updated_at);return i||jl(a.time)||"待同步"}function Hx(a){return wl(a.updated_at)||jl(a.time)||"--:--"}function hc(a){const i=jl(a.detail).replace(/^触发来源[::]\s*$/u,"").replace(/触发来源[::]\s*(?=。|,|,|;|;|$)/u,"").trim();return i?/^runner unavailable/i.test(i)?"执行链路异常,点击查看详情。":i.length>72?`${i.slice(0,72)}...`:i:Rc(a)?"真实事件已完成,结果详情未回传。":zc(a)?"真实事件执行中,等待结果回传。":Mc(a)?"执行异常,点击查看详情。":"结果详情待同步。"}function ng(a){return`计划时间 ${jy(a)} · 执行时间 ${Ey(a)}`}function Gx(a,i){return i==="all"?!0:i==="running"?zc(a):i==="success"?Rc(a):Mc(a)}function Yx(a){return new Set(a.duties.filter(i=>i.selected).map(i=>i.id))}function ag(a){const i=a.dependent_tasks.length>0?`,影响 ${a.dependent_tasks.slice(0,2).join("、")}`:"";return`${a.name} ${a.status_label}${a.error?`:${a.error}`:i}`}function lg(a){const i=a.next_action==="retry_or_skip"?"重试或跳过":a.next_action==="watch_progress"?"观察进度":a.next_action;return`${a.title} ${a.status_label},下一步 ${i}`}function Qx(a){switch(a){case"retry_task":return"重试";case"skip_task":return"跳过";case"cancel_task":return"取消";default:return a}}function Po(a){return["pending","requested"].includes(String(a||"").toLowerCase())}function ig(a){if(!(a instanceof Element))return!1;if(a.closest('button, a, input, select, textarea, [role="tab"]'))return!0;const i=a.closest('[role="button"]');return!!(i&&!i.classList.contains("de-workday-execution--clickable"))}function Kx(a,i){return a.length<=4?a:a.slice(i).concat(a.slice(0,i)).slice(0,4)}function zc(a){const i=`${a.status} ${a.status_tone}`.toLowerCase();return i.includes("running")||i.includes("execut")||i.includes("progress")}function Rc(a){const i=`${a.status} ${a.status_tone}`.toLowerCase();return i.includes("success")||i.includes("complete")||i.includes("done")}function Mc(a){const i=`${a.status} ${a.status_tone}`.toLowerCase();return i.includes("danger")||i.includes("fail")||i.includes("error")||i.includes("异常")}function Xx(a){const i=`${a.plan_title} ${a.task_title} ${a.step_title??""} ${a.detail}`.toLowerCase();return["外呼","电话","拨打","接通","未接通","重拨","人员"].some(s=>i.includes(s))}function Zx(a){const i=`${a.plan_title} ${a.task_title} ${a.step_title??""} ${a.detail}`.toLowerCase();return["重拨","未接通","再拨","回拨","retry","callback"].some(s=>i.includes(s))}function Vx(a){const i=`${a.plan_title} ${a.task_title} ${a.step_title??""} ${a.detail}`.toLowerCase();return["核验","校验","证据","汇总","报告","结果","交付","看板","同步"].some(s=>i.includes(s))}function Jx(){if(typeof window>"u")return null;const a=new URLSearchParams(window.location.search).get("visual");return dx.includes(a)?a:null}function Fx(a){return Zx(a)?"redial":Xx(a)?"call":Vx(a)?"evidence":"browser"}function Ix(a){return a.currentEvent?Fx(a.currentEvent):!a.confirmed&&a.eventsCount===0?"skill":a.pendingDecisionCount>0?"decision":a.eventsCount>0?"browser":"skill"}function Wx(){if(typeof window>"u")return null;try{return window.sessionStorage.getItem(by)??window.sessionStorage.getItem(Sy)}catch{return null}}function Px(a){if(!(typeof window>"u"))try{window.sessionStorage.setItem(by,a),window.sessionStorage.removeItem(Sy)}catch{}}function e1({onNavigate:a}){var Ol,qi,ba,en,$l,Sa;const[i,s]=b.useState(hd()),[c,d]=b.useState(null),[f,h]=b.useState([]),[_,p]=b.useState(new Set),[g,j]=b.useState(!0),[S,E]=b.useState(null),[$,A]=b.useState(null),[O,R]=b.useState(null),[q,F]=b.useState(null),[Z,P]=b.useState(!1),[te,he]=b.useState("selected"),[K,ie]=b.useState(0),[ne,be]=b.useState(!1),[Be,Re]=b.useState(!1),[Q,re]=b.useState(!1),[L,N]=b.useState(null),[Y,ae]=b.useState("all"),[me,Se]=b.useState(!1),[w,B]=b.useState(null),[V,I]=b.useState(null),[de,_e]=b.useState("09:00"),[X,W]=b.useState(!1),[Me,Oe]=b.useState(!1),[xe,kt]=b.useState(null),[yt,Te]=b.useState({name:"",company:"",position:"",currentStatus:"working"}),[tt,Un]=b.useState("18:00"),[bi,El]=b.useState(!1),[Si,xi]=b.useState(()=>Wx()),[vt,Hs]=b.useState(null),Ee=b.useRef(!1),mt=b.useRef(!1);b.useEffect(()=>(Ee.current=!0,()=>{Ee.current=!1}),[]);const It=b.useCallback(async()=>{let v=null,J=null;const ue=()=>{if(mt.current||!J)return;const it=(v==null?void 0:v.source)==="live"?Yx(v):new Set,We=J.map(Gt=>pi(Gt)).filter(Gt=>bx(it,Gt)),Ht=We.length>0?We:J.slice(0,3).map(Gt=>pi(Gt));p(new Set(Ht))},ze=mc(i).then(it=>{Ee.current&&(v=it,d(it),R(null),ue())}).catch(it=>{Ee.current&&R(it instanceof Error?it.message:"数字员工首页数据同步失败")}),ct=tx().then(it=>{Ee.current&&(J=it.filter(We=>We.job_type==="plan_template"||wc(We.delivery,["mode"])==="plan_template"),h(J),F(null),ue())}).catch(it=>{Ee.current&&F(it instanceof Error?it.message:"任务加载失败")}),pn=Bx().then(it=>{Ee.current&&Hs(it)});await Promise.allSettled([ze,ct,pn]),Ee.current&&j(!1)},[i]);b.useEffect(()=>{j(!0),It()},[It]),b.useEffect(()=>{const v=c!=null&&c.workday.confirmed?8e3:3e4,J=window.setInterval(()=>{It()},v);return()=>window.clearInterval(J)},[It,c==null?void 0:c.workday.confirmed]),b.useEffect(()=>{if(ne||Be||Q||L!==null)return;const J=window.setInterval(()=>{ie(ue=>{const ze=(c==null?void 0:c.source)==="live"?c.events.length:0;return ze>0?(ue+1)%ze:0})},3200);return()=>window.clearInterval(J)},[Q,Be,ne,L,c==null?void 0:c.events.length,c==null?void 0:c.source]);const Wt=(c==null?void 0:c.source)==="live",Za=b.useMemo(()=>Wt?(c==null?void 0:c.duties)??[]:[],[Wt,c==null?void 0:c.duties]),Ct=b.useMemo(()=>f.slice().sort((v,J)=>{const ue=pi(v),ze=pi(J),ct=_.has(ue)?1:0,pn=_.has(ze)?1:0;if(ct!==pn)return pn-ct;const it=new Date(v.next_run||"").getTime(),We=new Date(J.next_run||"").getTime(),Ht=Number.isFinite(it),Gt=Number.isFinite(We);return Ht!==Gt?Ht?-1:1:Ht&&Gt&&it!==We?it-We:qn(v.name).localeCompare(qn(J.name),"zh-CN")}).map(v=>{const J=pi(v);return Ex(v,Za,_.has(J))}),[Za,f,_]),At=b.useMemo(()=>Ct.filter(v=>_.has(v.id)),[Ct,_]),Va=b.useMemo(()=>At.map(v=>xx(v,Za)),[Za,At]),Bn=Ct,Ja=Ct.filter(v=>!_.has(v.id)),Hn=te==="selected"?At:te==="pending"?Ja:Bn,Xe=Wt?(c==null?void 0:c.events)??[]:[],wn=Kx(Xe,K),wt=Xe,oa=(Wt?(c==null?void 0:c.decisions)??[]:[]).filter(v=>Po(v.status)),qc=ne||Be||Q||L!==null,ji=b.useMemo(()=>Xe.filter(v=>Gx(v,Y)),[Xe,Y]),kl=ji.slice(0,Fp),Al=Xe.filter(zc),Tl=Xe.filter(Rc),Gn=Xe.filter(Mc),Dt=wn[0]??Al[0]??null,Le=c==null?void 0:c.employee,Ne=c==null?void 0:c.workday,Nl=c==null?void 0:c.delivery,Pt=(Wt?(c==null?void 0:c.managed_services)??[]:[]).filter(v=>v.requires_human_action||v.status==="degraded"),fn=(Wt?(c==null?void 0:c.task_agents)??[]:[]).filter(v=>v.can_retry||v.can_skip||v.can_cancel),pe=Wt?c==null?void 0:c.daily_report:void 0,wi=Wt?(Ol=c==null?void 0:c.run_details)!=null&&Ol.length?c.run_details:Xe.map(Nx):[],Yn=wi.slice(0,mx),Ei=Wt?(c==null?void 0:c.execution_summaries)??[]:[],mn=At.map(v=>Ei.find(J=>Tx(J,v))??Ax(v,Xe)),En=gx(i),kn=te==="all"?"全部任务":te==="pending"?"待选择任务":"今日已选任务",ht=te==="all"?`总任务 ${Bn.length} 项,不代表当天都会执行。`:te==="pending"?`当前日期 ${En} 还有 ${Ja.length} 项未选择。`:`当前日期 ${En} 已选择 ${At.length} 项任务。`,Ze=(pe==null?void 0:pe.status)==="ready"?pe.totals:null,da=(Ze==null?void 0:Ze.task_count)??mn.length,ki=(Ze==null?void 0:Ze.execution_count)??mn.reduce((v,J)=>v+J.total_count,0),Lc=(Ze==null?void 0:Ze.success_count)??mn.reduce((v,J)=>v+J.success_count,0),Uc=(Ze==null?void 0:Ze.failure_count)??mn.reduce((v,J)=>v+J.failure_count,0),Cl=pe?[pe.summary,...pe.detail_lines??[]].filter(v=>!!(v&&v.trim())):[],fa=(pe==null?void 0:pe.status)==="ready"&&Cl.length>0,Dl=(Ne==null?void 0:Ne.current_status)??(Le==null?void 0:Le.current_status)??"working",ma=(Ne==null?void 0:Ne.current_status_label)??(Le==null?void 0:Le.current_status_label)??(Dl==="resting"?"休息中":"工作中"),An=Dl==="resting",ha=(c==null?void 0:c.source)==="demo",Tn=ha?"演示兜底":"真实数据",lt=ha?"de-badge-warning":"de-badge-success",Ai=Cx(vt),Ys=Dx(vt),Nn=zx(vt),pa=Yd(vt==null?void 0:vt.lastSyncError),Qs=(vt==null?void 0:vt.recentFailures)??[],Ks=Ix({confirmed:!!(Ne!=null&&Ne.confirmed),currentEvent:Dt,pendingDecisionCount:oa.length,eventsCount:Xe.length}),Ti=Jx(),Cn=px[Ti??Ks],zl=Ti||Dt||oa.length>0?Cn.bubble:(Ne==null?void 0:Ne.bubble_text)??Cn.bubble,hn=Bn.length>0?`已加载 ${Bn.length} 项任务,当前选择 ${At.length} 项;右侧展示真实执行状态、运行明细和日报。`:(Ne==null?void 0:Ne.summary)??"等待同步当天任务计划。",zt=(Dt==null?void 0:Dt.task_title)??(fn[0]?fn[0].title:Pt[0]?Pt[0].name:Ne!=null&&Ne.confirmed?"等待下一条执行事件":"等待确认任务设置"),Xs=Dt?`${Dt.plan_title}:${hc(Dt)}(${ng(Dt)})`:fn[0]?lg(fn[0]):Pt[0]?ag(Pt[0]):"任务执行后会显示正在处理的任务、步骤或汇总动作。",Bc=oa[0]?`等待人工确认:${oa[0].title}`:fn[0]?`Task Agent:${lg(fn[0])}`:Pt[0]?`处理服务状态:${ag(Pt[0])}`:Ne!=null&&Ne.confirmed?(Nl==null?void 0:Nl.lines[0])??"继续按计划轮询新工单,并把结果同步到运行明细。":"请先确认今天要执行的任务,确认后数字员工会开始执行。",Ni=!!(c&&!(Ne!=null&&Ne.confirmed));b.useEffect(()=>{if(!(g||!c)&&c.workday.confirmed){El(!1);return}},[Si,g,i,c]),b.useEffect(()=>{Le&&Te({name:Le.name||"",company:Le.company||"",position:Le.position||Le.major||"",currentStatus:Le.current_status||(Ne==null?void 0:Ne.current_status)||"working"})},[Le,Ne==null?void 0:Ne.current_status]),b.useEffect(()=>{Un((pe==null?void 0:pe.report_schedule_time)||"18:00")},[pe==null?void 0:pe.report_schedule_time]),b.useEffect(()=>{Oe(!1)},[i]);const Ci=b.useCallback(v=>{!v.selectable||!v.implemented||(p(J=>{const ue=new Set(J);return ue.has(v.id)?ue.delete(v.id):ue.add(v.id),ue}),mt.current=!0,P(!0),A(null))},[]),Fa=b.useCallback(async()=>{if(_.size===0){R("请至少选择一项今天要执行的任务。");return}if(An){R("当前状态为休息中,请切换为工作中后再执行任务。");return}E("confirm_workday"),R(null),A(null);try{const v=await yl({action:"confirm_workday",date:i,duty_ids:Va});if(!Ee.current)return;d(v),p(new Set(_)),mt.current=!0,P(!1),El(!1),A("任务设置已确认,数字员工开始按任务执行。")}catch(v){Ee.current&&R(v instanceof Error?v.message:"确认任务设置失败")}finally{Ee.current&&E(null)}},[An,i,_,Va]),Zs=b.useCallback(async()=>{var v;E("flush_management_sync"),R(null),A(null);try{const J=(v=window.QimingClawBridge)==null?void 0:v.digital;if(!(J!=null&&J.flushSync)){A("当前环境未连接 qimingclaw 同步桥。");return}const ue=await J.flushSync();if(!Ee.current)return;Hs(ue);const ze=await mc(i);if(!Ee.current)return;d(ze);const ct=ue.failed>0?`同步完成,仍有 ${ue.failed} 条失败记录。`:ue.pending>0?`同步完成,仍有 ${ue.pending} 条待同步记录。`:"管理端同步完成。";A(ct)}catch(J){Ee.current&&R(J instanceof Error?J.message:"同步管理端失败")}finally{Ee.current&&E(null)}},[i]),Rt=b.useCallback(async v=>{const J=eg(v,vt);try{await navigator.clipboard.writeText(J),R(null),A("同步失败诊断已复制。")}catch(ue){A(null),R(ue instanceof Error?ue.message:"复制同步失败诊断失败")}},[vt]),Di=b.useCallback(v=>{tg(qx(v),eg(v,vt)),R(null),A("同步失败诊断已导出。")},[vt]),Vs=b.useCallback(()=>{p(new Set),mt.current=!0,P(!0),A("已一键取消当前选择,重新选择后点击任务执行生效。"),R(null)},[]),zi=b.useCallback(async()=>{E("update_profile"),R(null),A(null);try{const v=await yl({action:"update_profile",date:i,name:yt.name,company:yt.company,position:yt.position,current_status:yt.currentStatus});if(!Ee.current)return;d(v),W(!1),A("数字员工特性设置已保存。")}catch(v){Ee.current&&R(v instanceof Error?v.message:"保存特性设置失败")}finally{Ee.current&&E(null)}},[yt,i]),ga=b.useCallback(async()=>{E("update_report_schedule"),R(null),A(null);try{const v=await yl({action:"update_report_schedule",date:i,report_schedule_time:tt});if(!Ee.current)return;d(v),A(`日报生成时间已设置为 ${tt}。`)}catch(v){Ee.current&&R(v instanceof Error?v.message:"设置日报时间失败")}finally{Ee.current&&E(null)}},[tt,i]),Js=b.useCallback(async()=>{var v,J;E("generate_daily_report"),R(null),A(null);try{const ue=await yl({action:"generate_daily_report",date:i,duty_ids:Va,report_schedule_time:tt});if(!Ee.current)return;const ze=((v=ue.daily_report)==null?void 0:v.status)==="ready"?ue:await mc(i);if(!Ee.current)return;d(ze),A("日报已生成,可下载本地文本。"),((J=ze.daily_report)==null?void 0:J.status)==="ready"&&Oe(!0)}catch(ue){Ee.current&&R(ue instanceof Error?ue.message:"生成日报失败")}finally{Ee.current&&E(null)}},[tt,i,_,Va]),Ri=b.useCallback(()=>{!pe||pe.status!=="ready"||(tg(Lx(i),Ux(En,pe,mn,Yn),"text/plain;charset=utf-8"),A("日报文本已下载。"))},[pe,i,En,mn,Yn]),ya=b.useCallback(async(v,J)=>{var ue;E(`${v.id}:${J}`),R(null),A(null);try{const ze=await yl({action:"decide_approval",date:i,decision_id:v.id,decision:J});if(!Ee.current)return;const ct=((ue=v.actions.find(pn=>pn.id===J))==null?void 0:ue.label)??J;d(ze),A(`已记录“${ct}”处理结果,并写入 qimingclaw 本地运行状态。`)}catch(ze){Ee.current&&R(ze instanceof Error?ze.message:"处理决策失败")}finally{Ee.current&&E(null)}},[i]),Mi=b.useCallback(async(v,J)=>{const ue=`task-agent:${v.task_id}:${J}`;E(ue),R(null),A(null);try{const ze=await md({command_kind:J,context_refs:{plan_id:v.plan_id,task_id:v.task_id,run_id:v.latest_run_id,step_id:v.step_id,task_agent_id:v.agent_id},payload:{source:"digital-home-task-agent",task_agent_id:v.agent_id,task_id:v.task_id,plan_id:v.plan_id,step_id:v.step_id,latest_run_id:v.latest_run_id,title:v.title,requested_action:J,previous_state:v.execution_state,next_action:v.next_action},correlation_id:`digital-home-task-agent-${v.task_id}-${J}-${Date.now()}`});if(!ze.accepted)throw new Error(ze.message||`Task Agent 命令未被接受:${ze.command_id||J}`);A(`Task Agent 已${Qx(J)}:${v.title}。`),await It()}catch(ze){Ee.current&&R(ze instanceof Error?ze.message:"Task Agent 控制失败")}finally{Ee.current&&E(null)}},[It]),Ia=b.useCallback(v=>{a({tab:"missions",date:i,missionId:v.conversationId||v.id})},[a,i]),Fs=b.useCallback(async v=>{const J=Ip(de),ue=Date.now(),ze=`digital-home-${v.planId}-${de.replace(":","")}`;E(`schedule:${v.id}`),R(null),A(null);try{const ct=await md({command_kind:"create_schedule",context_refs:{plan_id:v.planId,schedule_id:ze},payload:{source:"digital-home",plan_id:v.planId,name:`定时执行:${v.title}`,description:`按首页任务管理定时任务:${v.title}`,prompt:`请按计划执行:${v.title}。${v.summary}`,cron_expr:J,schedule:J},correlation_id:`digital-home-create-schedule-${v.planId}-${ue}`,idempotency_key:`digital-home-create-schedule-${v.planId}-${de}-${ue}`});if(!ct.accepted)throw new Error(ct.message||`调度命令未被接受:${ct.command_id||"create_schedule"}`);B(null),A(`已提交定时:${v.title},${de} 按 cron 计划执行。`),await It()}catch(ct){Ee.current&&R(ct instanceof Error?ct.message:"定时执行失败")}finally{Ee.current&&E(null)}},[It,de]),Oi=b.useCallback(async v=>{var J;if(!rc(v)){R(cc(v)),A(null);return}E(`execute:${v.id}`),R(null),A(null);try{const ue=await nx(v.planId);if(ue.ok!==!0)throw new Error(ue.error||"执行接口未接受请求");const ze=((J=ue.dispatched_tasks)==null?void 0:J.length)??0;I(null),A(`已触发执行:${v.title},已派发 ${ze} 个步骤。`),await It()}catch(ue){Ee.current&&R(ue instanceof Error?ue.message:"执行失败")}finally{Ee.current&&E(null)}},[It]),$i=b.useCallback(()=>{El(!1),xi(i),Px(i)},[i]),Is=b.useCallback((v,J)=>{const ue=_.has(v.id),ze=cc(v);return u.jsxs("div",{className:`${yx(v,ue)} ${J==="guide"?"de-duty-card--guide":""}`,title:v.summary,children:[u.jsxs("label",{className:"de-task-manager-duty-check",children:[u.jsx("input",{type:"checkbox",checked:ue,disabled:!v.selectable||!v.implemented,onChange:()=>Ci(v)}),u.jsx("span",{children:ue?"已选":v.implemented?"未选":"待扩展"})]}),u.jsxs("div",{className:"de-template-card-main",children:[u.jsxs("div",{className:"de-template-card-head",children:[u.jsx("span",{className:"de-template-card-name",children:v.title}),u.jsx("span",{className:`de-badge ${sc(v.statusTone)}`,children:v.implemented?v.statusLabel:"待扩展"})]}),u.jsx("p",{className:"de-template-card-desc",children:v.summary}),u.jsxs("div",{className:"de-template-card-meta",children:[u.jsx("span",{children:v.scheduleText}),u.jsx("span",{children:v.resultText})]}),u.jsxs("div",{className:"de-duty-card-foot",children:[u.jsx("button",{type:"button",className:"de-btn-secondary de-btn-sm",disabled:!v.implemented,onClick:()=>Ia(v),children:"进入处理"}),u.jsxs("div",{className:"de-duty-card-actions",children:[u.jsxs("button",{type:"button",className:"de-btn-secondary de-btn-sm",disabled:!v.implemented||S===`schedule:${v.id}`,onClick:()=>B(v),children:[u.jsx(Hp,{size:13,"aria-hidden":"true"}),u.jsx("span",{children:"定时"})]}),u.jsxs("button",{type:"button",className:"de-btn-primary de-btn-sm",disabled:!v.implemented||S===`execute:${v.id}`,title:ze||"立即执行此任务",onClick:()=>I(v),children:[u.jsx(Bp,{size:13,"aria-hidden":"true"}),u.jsx("span",{children:"执行"})]})]}),!v.implemented&&u.jsx("span",{className:"de-duty-selected-mark",children:"待扩展"})]})]})]},`${J}-${v.id}`)},[S,Ia,_,Ci]),Rl=b.useCallback(v=>{N(v),Re(!0)},[]),Bt=b.useCallback(()=>{N(null),Re(!1)},[]),Ml=b.useCallback(()=>{re(!1),Re(!1)},[]),Dn=b.useCallback(()=>{re(!0),Re(!0)},[]),_a=b.useCallback(v=>{ig(v.target)||Dn()},[Dn]),va=b.useCallback(v=>{v.key!=="Enter"&&v.key!==" "||ig(v.target)||(v.preventDefault(),Dn())},[Dn]),Ws=b.useCallback(v=>{N(null),re(!1),Re(!1),a({tab:"missions",date:i,missionId:v.conversation_id||v.id})},[a,i]);return u.jsxs("div",{className:"de-dashboard de-dashboard--compact",style:{position:"relative",height:"100%",minHeight:0,display:"flex",flexDirection:"column",overflow:"hidden"},children:[u.jsx("div",{className:"de-connection-layer","aria-hidden":"true",children:u.jsxs("svg",{className:"de-connection-svg",viewBox:"0 0 1200 800",preserveAspectRatio:"none",children:[u.jsxs("defs",{children:[u.jsxs("linearGradient",{id:"connGrad1",x1:"0%",y1:"0%",x2:"100%",y2:"100%",children:[u.jsx("stop",{offset:"0%",stopColor:"rgba(79,172,254,0.25)"}),u.jsx("stop",{offset:"100%",stopColor:"rgba(0,242,254,0.1)"})]}),u.jsx("filter",{id:"connGlow",children:u.jsx("feGaussianBlur",{stdDeviation:"3"})})]}),u.jsx("path",{d:"M 80 180 Q 420 400, 580 350",stroke:"url(#connGrad1)",strokeWidth:"1.5",fill:"none",filter:"url(#connGlow)"}),u.jsx("path",{d:"M 120 620 Q 380 400, 560 380",stroke:"url(#connGrad1)",strokeWidth:"1.2",fill:"none",filter:"url(#connGlow)"}),u.jsx("path",{d:"M 640 360 Q 780 200, 1100 160",stroke:"url(#connGrad1)",strokeWidth:"1.3",fill:"none",filter:"url(#connGlow)"})]})}),u.jsxs("div",{className:"de-dashboard-content",children:[u.jsxs("div",{className:"de-dashboard-left",children:[u.jsxs("div",{className:"de-card de-person-card de-person-card--compact",children:[u.jsxs("div",{className:"de-card-title-bar",children:[u.jsx("span",{className:"de-card-title-bar-text",children:"数字员工"}),u.jsx("button",{type:"button",className:"de-btn-secondary de-btn-sm",onClick:()=>W(!0),children:"特性设置"})]}),u.jsx("div",{className:"de-card-body",children:u.jsxs("div",{className:"de-info-grid",children:[u.jsxs("div",{className:"de-info-item",children:[u.jsx("label",{children:"姓名"}),u.jsx("span",{children:(Le==null?void 0:Le.name)??"同步中"})]}),u.jsxs("div",{className:"de-info-item",children:[u.jsx("label",{children:"单位"}),u.jsx("span",{children:(Le==null?void 0:Le.company)??"同步中"})]}),u.jsxs("div",{className:"de-info-item",children:[u.jsx("label",{children:"岗位"}),u.jsx("span",{children:(Le==null?void 0:Le.position)??(Le==null?void 0:Le.major)??"同步中"})]}),u.jsxs("div",{className:"de-info-item",children:[u.jsx("label",{children:"当前状态"}),u.jsx("span",{className:An?"de-status-resting":"de-status-working",children:ma})]})]})})]}),u.jsxs("div",{className:"de-card de-template-manager-card",children:[u.jsx("div",{className:"de-card-title-bar",children:u.jsx("span",{className:"de-card-title-bar-text",children:"任务设置"})}),u.jsxs("div",{className:"de-card-body de-template-manager-body",children:[u.jsxs("div",{className:"de-workday-toolbar",children:[u.jsxs("label",{children:[u.jsx("span",{children:"日期"}),u.jsx("input",{type:"date",value:i,onChange:v=>{mt.current=!1,P(!1),A(null),s(v.target.value||hd())}})]}),u.jsx("button",{type:"button",className:"de-btn-secondary de-btn-sm",disabled:g,onClick:()=>Se(!0),children:"任务设置"}),u.jsxs("button",{type:"button",className:"de-btn-secondary de-btn-sm",disabled:g||S==="flush_management_sync",onClick:Zs,title:"立即同步数字员工本地状态到管理端",children:[u.jsx(Yp,{size:13,"aria-hidden":"true"}),u.jsx("span",{children:S==="flush_management_sync"?"同步中...":"同步管理端"})]})]}),u.jsxs("div",{className:`de-management-sync-strip de-management-sync-strip--${Ai}`,title:pa||Nn,children:[u.jsx("span",{className:`de-badge ${sc(Ai)}`,children:Ys}),u.jsx("span",{children:Nn})]}),Qs.length>0&&u.jsx("div",{className:"de-management-sync-failures","aria-label":"同步失败明细",children:Qs.map(v=>u.jsxs("button",{type:"button",className:"de-management-sync-failure",title:v.error||v.id,onClick:()=>kt(v),children:[u.jsx("span",{children:Pp(v)}),u.jsx("strong",{children:Ns(v.entityType)}),u.jsx("em",{children:v.id}),u.jsx("small",{children:Mx(v)})]},v.id))}),($||O||q||(c==null?void 0:c.demo_reason))&&u.jsx("div",{className:`de-schedule-result ${O?"de-schedule-result--error":"de-schedule-result--success"}`,style:{marginBottom:10},children:O||$||q||(c==null?void 0:c.demo_reason)}),Z&&!$&&!O&&u.jsx("div",{className:"de-schedule-result de-schedule-result--success",style:{marginBottom:10},children:"当前选择尚未确认,自动刷新不会覆盖你的勾选。"}),u.jsxs("div",{className:"de-template-overview",children:[u.jsxs("button",{type:"button",className:`de-template-overview-item de-template-overview-item--total ${te==="all"?"active":""}`,onClick:()=>he("all"),children:[u.jsx("span",{className:"de-template-overview-label",children:"总任务"}),u.jsx("span",{className:"de-template-overview-value",children:Bn.length})]}),u.jsxs("button",{type:"button",className:`de-template-overview-item de-template-overview-item--scheduled ${te==="selected"?"active":""}`,onClick:()=>he("selected"),children:[u.jsx("span",{className:"de-template-overview-label",children:"已选择"}),u.jsx("span",{className:"de-template-overview-value",children:At.length})]}),u.jsxs("button",{type:"button",className:`de-template-overview-item de-template-overview-item--runnable ${te==="pending"?"active":""}`,onClick:()=>he("pending"),children:[u.jsx("span",{className:"de-template-overview-label",children:"待选择"}),u.jsx("span",{className:"de-template-overview-value",children:Ja.length})]})]}),u.jsxs("div",{className:"de-task-date-context",children:[u.jsxs("span",{children:["当前日期 ",En]}),u.jsx("em",{children:ht}),u.jsx("button",{type:"button",className:"de-btn-secondary de-btn-sm",onClick:Vs,disabled:At.length===0,children:"一键取消"})]}),u.jsxs("div",{className:"de-task-manager-preview de-task-manager-preview-scroll de-template-task-list",children:[u.jsxs("div",{className:"de-task-manager-preview-head",children:[u.jsx("span",{children:En}),u.jsxs("strong",{children:[kn," ",Hn.length]})]}),g?u.jsx("div",{className:"de-loading-skeleton",style:{height:96}}):Ct.length===0?u.jsx("p",{className:"de-empty-text",children:"暂无任务,首页不会再展示硬编码任务。"}):Hn.length===0?u.jsx("p",{className:"de-empty-text",children:"当前筛选下暂无任务,点击总任务查看全部内容。"}):Hn.map(v=>u.jsxs("div",{className:`de-task-manager-preview-row ${_.has(v.id)?"is-selected":""}`,title:v.summary,children:[u.jsxs("button",{type:"button",className:"de-template-task-main",onClick:()=>Ia(v),children:[u.jsx("strong",{children:v.title}),u.jsx("span",{children:v.resultText})]}),u.jsxs("div",{className:"de-template-item-actions",children:[u.jsxs("button",{type:"button",className:"de-btn-secondary de-btn-sm",disabled:!v.implemented||S===`schedule:${v.id}`,onClick:()=>B(v),children:[u.jsx(Hp,{size:13,"aria-hidden":"true"}),u.jsx("span",{children:"定时"})]}),u.jsxs("button",{type:"button",className:"de-btn-primary de-btn-sm",disabled:!v.implemented||S===`execute:${v.id}`,title:cc(v)||"立即执行此任务",onClick:()=>I(v),children:[u.jsx(Bp,{size:13,"aria-hidden":"true"}),u.jsx("span",{children:"执行"})]})]})]},v.id))]})]})]})]}),u.jsxs("div",{className:"de-dashboard-center",style:{justifyContent:"center",padding:"0 0 16px",overflow:"visible"},children:[u.jsx("div",{className:"de-avatar-wrapper",style:{minHeight:470,maxWidth:560,transform:"translateY(-6px)",display:"flex",alignItems:"flex-end",justifyContent:"center"},children:u.jsx(Y0,{avatarSrc:Cn.src,altText:`数字员工-${Cn.label}`,statusLabel:Cn.label})}),u.jsxs("div",{className:"de-speech-bubble de-speech-bubble--employee",style:{top:"38%",left:"29%",right:"auto",transform:"translateX(-50%)",width:268,padding:"10px 12px",zIndex:16},children:[u.jsx("span",{className:"de-speech-label",children:"数字员工播报"}),u.jsx("p",{className:"de-speech-text",children:zl}),u.jsxs("button",{type:"button",className:"de-speech-workflow de-execution-detail-trigger",onClick:Dn,title:"打开运行明细",children:[u.jsx("span",{children:"当前动作"}),u.jsx("strong",{children:zt}),u.jsx("small",{children:Xs}),u.jsx("span",{children:"下一步"}),u.jsx("small",{children:Bc})]})]})]}),u.jsx("div",{className:"de-dashboard-right",children:u.jsxs("div",{className:"de-right-panels",children:[u.jsxs("div",{className:"de-workbench de-workday-execution de-workday-execution--clickable",role:"button",tabIndex:0,"aria-label":"打开运行明细",title:"打开运行明细",onClick:_a,onKeyDown:va,children:[u.jsxs("div",{className:"de-card-title-bar de-workbench-head de-workbench-head--bar",children:[u.jsx("div",{className:"de-workbench-title-row",children:u.jsx("h3",{children:"今日执行"})}),u.jsx("span",{className:`de-badge ${lt}`,children:Tn})]}),u.jsxs("div",{className:"de-workday-execution-body","aria-live":"polite",children:[u.jsxs("div",{className:"de-execution-status-strip",children:[u.jsxs("span",{children:[u.jsx("em",{children:"已选任务"}),u.jsx("strong",{children:At.length})]}),u.jsxs("span",{children:[u.jsx("em",{children:"运行记录"}),u.jsx("strong",{children:wt.length})]}),u.jsxs("span",{children:[u.jsx("em",{children:"已完成"}),u.jsx("strong",{children:Tl.length})]}),u.jsxs("span",{children:[u.jsx("em",{children:"异常"}),u.jsx("strong",{children:Gn.length})]})]}),u.jsx("div",{className:"de-task-summary-scroll",children:u.jsx("div",{className:"de-task-summary-grid","aria-label":"任务执行汇总",children:mn.length===0?u.jsx("p",{className:"de-empty-text",children:"左侧选择任务后,这里会按任务生成执行次数和成功情况。"}):mn.map(v=>u.jsxs("button",{type:"button",className:`de-task-summary-card de-live-feed-row--${v.latest_status_tone||"info"}`,onClick:()=>Ia(At.find(J=>J.id===v.id)??At[0]),title:[v.description,v.ai_summary||v.business_summary].filter(Boolean).join(` `),children:[u.jsx("span",{className:"de-task-summary-title",children:v.title}),u.jsx("span",{className:`de-badge ${sc(v.latest_status_tone)}`,children:v.latest_status_label}),u.jsxs("div",{className:"de-task-summary-counts",children:[u.jsxs("span",{children:[u.jsx("em",{children:"执行"}),u.jsx("strong",{children:v.total_count})]}),u.jsxs("span",{children:[u.jsx("em",{children:"成功"}),u.jsx("strong",{children:v.success_count})]}),u.jsxs("span",{children:[u.jsx("em",{children:"失败"}),u.jsx("strong",{children:v.failure_count})]})]})]},v.id))})}),fn.length>0&&u.jsx("div",{className:"de-task-agent-control-strip","aria-label":"Task Agent 控制台",children:fn.slice(0,2).map(v=>{const J=S===`task-agent:${v.task_id}:retry_task`,ue=S===`task-agent:${v.task_id}:skip_task`,ze=S===`task-agent:${v.task_id}:cancel_task`;return u.jsxs("div",{className:`de-task-agent-control de-live-feed-row--${v.status_tone||"info"}`,children:[u.jsxs("div",{className:"de-task-agent-control-main",children:[u.jsx("span",{children:"Task Agent"}),u.jsx("strong",{children:v.title}),u.jsxs("small",{children:[v.status_label," · ",v.next_action]})]}),u.jsxs("div",{className:"de-task-agent-control-actions",children:[v.can_retry&&u.jsxs("button",{type:"button",className:"de-btn-secondary de-btn-sm",disabled:!!S,title:"记录重试任务命令",onClick:()=>{Mi(v,"retry_task")},children:[u.jsx(Yp,{size:13,"aria-hidden":"true"}),u.jsx("span",{children:J?"重试中":"重试"})]}),v.can_skip&&u.jsxs("button",{type:"button",className:"de-btn-secondary de-btn-sm",disabled:!!S,title:"记录跳过任务命令",onClick:()=>{Mi(v,"skip_task")},children:[u.jsx(O0,{size:13,"aria-hidden":"true"}),u.jsx("span",{children:ue?"跳过中":"跳过"})]}),v.can_cancel&&u.jsxs("button",{type:"button",className:"de-btn-secondary de-btn-sm de-task-agent-cancel-btn",disabled:!!S,title:"记录取消任务命令",onClick:()=>{Mi(v,"cancel_task")},children:[u.jsx($0,{size:12,"aria-hidden":"true"}),u.jsx("span",{children:ze?"取消中":"取消"})]})]})]},v.agent_id)})}),u.jsxs("div",{className:"de-stage-feed-tools",children:[u.jsxs("span",{children:["展示 ",wt.length," / 共 ",Xe.length," 条",qc?" · 已暂停":" · 自动滚动"]}),u.jsxs("div",{children:[u.jsx("button",{type:"button",className:"de-btn-secondary de-btn-sm",onClick:()=>be(v=>!v),children:ne?"继续滚动":"暂停滚动"}),u.jsx("button",{type:"button",className:"de-btn-secondary de-btn-sm",onClick:Dn,children:"查看全部记录"})]})]}),u.jsxs("div",{className:"de-run-detail-panel",children:[u.jsxs("div",{className:"de-run-detail-head",children:[u.jsx("span",{children:"运行明细"}),u.jsxs("small",{children:["展示 ",Yn.length," / 共 ",wi.length," 条"]})]}),u.jsxs("div",{className:"de-run-detail-list de-run-detail-list-scroll","aria-label":"运行明细",children:[u.jsxs("div",{className:"de-run-detail-row de-run-detail-row--head",children:[u.jsx("span",{children:"时间"}),u.jsx("span",{children:"任务名称"}),u.jsx("span",{children:"步骤名称"}),u.jsx("span",{children:"执行状态"}),u.jsx("span",{children:"结果"})]}),Yn.length===0?u.jsx("p",{className:"de-empty-text",children:"任务执行后,这里会滚动显示每个步骤的时间、任务、步骤和结果。"}):Yn.map(v=>u.jsxs("button",{type:"button",className:`de-run-detail-row de-live-feed-row--${v.status_tone||"info"}`,onClick:()=>{const J=Xe.find(ue=>ue.id===v.id);J&&Rl(J)},title:v.business_detail,children:[u.jsx("span",{children:Hx(v)}),u.jsx("strong",{children:v.task_name}),u.jsx("span",{children:v.step_name||v.operation_name||"执行步骤"}),u.jsx("span",{children:u.jsx("i",{className:`de-badge ${sc(v.status_tone)}`,children:v.status_label})}),u.jsx("em",{children:v.business_detail})]},v.id))]})]})]})]}),u.jsxs("div",{className:"de-report-summary",children:[u.jsxs("div",{className:"de-card-title-bar de-report-summary-head de-report-summary-head--bar",children:[u.jsx("div",{className:"de-report-summary-title-row",children:u.jsx("h3",{children:"日报生成"})}),u.jsx("span",{className:`de-report-badge ${(pe==null?void 0:pe.status)==="ready"?"de-report-badge--ready":"de-report-badge--waiting"}`,children:(pe==null?void 0:pe.status)==="ready"?"已生成":"待生成"})]}),u.jsxs("div",{className:"de-report-summary-body",children:[u.jsxs("div",{className:"de-report-schedule-row",children:[u.jsxs("label",{children:[u.jsx("span",{children:"生成时间"}),u.jsx("input",{type:"time",value:tt,onChange:v=>Un(v.target.value||"18:00")})]}),u.jsx("button",{type:"button",className:"de-btn-secondary de-btn-sm",disabled:S==="update_report_schedule",onClick:()=>{ga()},children:"设置时间"}),u.jsx("button",{type:"button",className:"de-btn-primary de-btn-sm",disabled:S==="generate_daily_report",onClick:()=>{Js()},children:S==="generate_daily_report"?"生成中...":"生成日报"}),u.jsxs("button",{type:"button",className:"de-btn-secondary de-btn-sm de-report-preview-btn",disabled:!fa,onClick:()=>Oe(!0),title:fa?"预览日报文字内容":"生成日报后可预览文字内容",children:[u.jsx(Gp,{size:14,"aria-hidden":"true"}),"预览日报"]}),u.jsxs("button",{type:"button",className:"de-btn-secondary de-btn-sm de-report-download-btn",disabled:!(pe!=null&&pe.pdf_available),onClick:Ri,title:pe!=null&&pe.pdf_available?"下载本地日报文本":"生成日报后可下载本地日报",children:[u.jsx(fc,{size:14,"aria-hidden":"true"}),"下载日报"]})]}),u.jsxs("div",{className:"de-report-meta",children:[u.jsx("p",{children:(pe==null?void 0:pe.summary)??"点击生成日报后,AI 会基于当天所有任务写出总分结构日报。"}),((pe==null?void 0:pe.detail_lines)??[]).slice(0,3).map(v=>u.jsx("p",{children:v},v))]})]})]})]})})]}),Me&&pe&&u.jsx("div",{className:"de-task-manager-modal-overlay de-report-preview-overlay",role:"presentation",onClick:()=>Oe(!1),children:u.jsxs("div",{className:"de-report-preview-modal",role:"dialog","aria-modal":"true","aria-label":"日报预览",onClick:v=>v.stopPropagation(),children:[u.jsxs("div",{className:"de-task-manager-modal-head",children:[u.jsxs("div",{children:[u.jsx("span",{className:"de-drawer-eyebrow",children:"DAILY REPORT"}),u.jsx("h3",{children:pe.title||"数字员工日报"}),u.jsxs("p",{children:[En," 生成时间 ",pe.report_schedule_time,",来源:",pe.generated_by==="ai"?"AI 生成":"规则兜底"]})]}),u.jsx("button",{type:"button",className:"de-schedule-close",onClick:()=>Oe(!1),children:"×"})]}),u.jsxs("div",{className:"de-report-preview-summary",children:[u.jsxs("div",{children:[u.jsx("span",{children:"任务总数"}),u.jsx("strong",{children:da})]}),u.jsxs("div",{children:[u.jsx("span",{children:"执行次数"}),u.jsx("strong",{children:ki})]}),u.jsxs("div",{children:[u.jsx("span",{children:"成功次数"}),u.jsx("strong",{children:Lc})]}),u.jsxs("div",{children:[u.jsx("span",{children:"失败次数"}),u.jsx("strong",{children:Uc})]})]}),u.jsx("div",{className:"de-report-preview-content",children:Cl.length===0?u.jsx("p",{className:"de-empty-text",children:"当前日报暂无可预览文字。"}):Cl.map((v,J)=>u.jsx("p",{children:v},`${J}-${v}`))}),u.jsxs("div",{className:"de-event-modal-actions",children:[u.jsx("button",{type:"button",className:"de-btn-secondary de-btn-sm",onClick:()=>Oe(!1),children:"关闭"}),u.jsxs("button",{type:"button",className:"de-btn-secondary de-btn-sm de-report-download-btn",disabled:!pe.pdf_available,onClick:Ri,children:[u.jsx(fc,{size:14,"aria-hidden":"true"}),"下载日报"]})]})]})}),X&&u.jsx("div",{className:"de-task-manager-modal-overlay",role:"presentation",onClick:()=>W(!1),children:u.jsxs("div",{className:"de-profile-settings-modal",role:"dialog","aria-modal":"true","aria-label":"数字员工特性设置",onClick:v=>v.stopPropagation(),children:[u.jsxs("div",{className:"de-task-manager-modal-head",children:[u.jsxs("div",{children:[u.jsx("span",{className:"de-drawer-eyebrow",children:"PROFILE"}),u.jsx("h3",{children:"特性设置"}),u.jsx("p",{children:"维护数字员工在首页展示的姓名、单位、岗位和当前状态。"})]}),u.jsx("button",{type:"button",className:"de-schedule-close",onClick:()=>W(!1),children:"×"})]}),u.jsxs("div",{className:"de-profile-settings-grid",children:[u.jsxs("label",{children:[u.jsx("span",{children:"姓名"}),u.jsx("input",{value:yt.name,onChange:v=>Te(J=>({...J,name:v.target.value}))})]}),u.jsxs("label",{children:[u.jsx("span",{children:"单位"}),u.jsx("input",{value:yt.company,onChange:v=>Te(J=>({...J,company:v.target.value}))})]}),u.jsxs("label",{children:[u.jsx("span",{children:"岗位"}),u.jsx("input",{value:yt.position,onChange:v=>Te(J=>({...J,position:v.target.value}))})]}),u.jsxs("div",{className:"de-profile-status-toggle",children:[u.jsx("span",{children:"当前状态"}),u.jsxs("div",{children:[u.jsx("button",{type:"button",className:yt.currentStatus==="working"?"active":"",onClick:()=>Te(v=>({...v,currentStatus:"working"})),children:"工作中"}),u.jsx("button",{type:"button",className:yt.currentStatus==="resting"?"active":"",onClick:()=>Te(v=>({...v,currentStatus:"resting"})),children:"休息中"})]})]})]}),u.jsxs("div",{className:"de-event-modal-actions",children:[u.jsx("button",{type:"button",className:"de-btn-secondary de-btn-sm",onClick:()=>W(!1),children:"取消"}),u.jsx("button",{type:"button",className:"de-btn-primary de-btn-sm",disabled:S==="update_profile",onClick:()=>{zi()},children:S==="update_profile"?"保存中...":"保存设置"})]})]})}),xe&&u.jsx("div",{className:"de-task-manager-modal-overlay",role:"presentation",onClick:()=>kt(null),children:u.jsxs("div",{className:"de-event-detail-modal",role:"dialog","aria-modal":"true","aria-label":"同步失败详情",onClick:v=>v.stopPropagation(),children:[u.jsxs("div",{className:"de-task-manager-modal-head",children:[u.jsxs("div",{children:[u.jsx("span",{className:"de-drawer-eyebrow",children:"SYNC FAILURE"}),u.jsx("h3",{children:"同步失败详情"}),u.jsxs("p",{children:[Ns(xe.entityType)," / ",xe.operation]})]}),u.jsx("button",{type:"button",className:"de-schedule-close",onClick:()=>kt(null),children:"×"})]}),u.jsxs("div",{className:"de-event-detail-grid",children:[u.jsxs("div",{children:[u.jsx("span",{children:"Outbox"}),u.jsx("strong",{children:xe.id})]}),u.jsxs("div",{children:[u.jsx("span",{children:"实体"}),u.jsx("strong",{children:xe.entityId})]}),((qi=xe.entitySummary)==null?void 0:qi.title)&&u.jsxs("div",{children:[u.jsx("span",{children:"业务"}),u.jsx("strong",{children:xe.entitySummary.title})]}),((ba=xe.entitySummary)==null?void 0:ba.status)&&u.jsxs("div",{children:[u.jsx("span",{children:"业务状态"}),u.jsx("strong",{children:xe.entitySummary.status})]}),u.jsxs("div",{children:[u.jsx("span",{children:"类型"}),u.jsx("strong",{children:Ns(xe.entityType)})]}),u.jsxs("div",{children:[u.jsx("span",{children:"操作"}),u.jsx("strong",{children:xe.operation})]}),u.jsxs("div",{children:[u.jsx("span",{children:"重试"}),u.jsxs("strong",{children:[xe.attempts," 次"]})]}),u.jsxs("div",{children:[u.jsx("span",{children:"上次尝试"}),u.jsx("strong",{children:Pp(xe)})]}),u.jsxs("div",{children:[u.jsx("span",{children:"下次重试"}),u.jsx("strong",{children:wy(xe)})]}),u.jsxs("div",{children:[u.jsx("span",{children:"状态"}),u.jsx("strong",{children:xe.dueForRetry?"等待补偿":"退避中"})]})]}),u.jsxs("div",{className:"de-event-detail-result",children:[u.jsx("span",{children:"失败原因"}),u.jsx("p",{children:xe.error||"暂无错误详情。"})]}),((en=xe.entitySummary)==null?void 0:en.summary)&&u.jsxs("div",{className:"de-event-detail-result",children:[u.jsx("span",{children:"业务摘要"}),u.jsx("p",{children:xe.entitySummary.summary})]}),((($l=xe.attemptHistory)==null?void 0:$l.length)??0)>0&&u.jsxs("div",{className:"de-sync-attempt-history",children:[u.jsx("span",{children:"重试历史"}),u.jsx("div",{className:"de-sync-attempt-list",children:(Sa=xe.attemptHistory)==null?void 0:Sa.map(v=>u.jsxs("div",{className:`de-sync-attempt-row de-sync-attempt-row--${$x(v.status)}`,children:[u.jsxs("div",{children:[u.jsxs("strong",{children:["第 ",v.attemptNo," 次"]}),u.jsx("em",{children:Ox(v.status)}),u.jsx("span",{children:wl(v.finishedAt)||v.finishedAt})]}),v.error&&u.jsx("small",{children:v.error})]},`${v.attemptNo}-${v.finishedAt}`))})]}),u.jsxs("div",{className:"de-event-modal-actions",children:[u.jsx("button",{type:"button",className:"de-btn-secondary de-btn-sm",onClick:()=>kt(null),children:"关闭"}),u.jsxs("button",{type:"button",className:"de-btn-secondary de-btn-sm",onClick:()=>{Rt(xe)},children:[u.jsx(R0,{size:14}),"复制诊断"]}),u.jsxs("button",{type:"button",className:"de-btn-secondary de-btn-sm",onClick:()=>Di(xe),children:[u.jsx(fc,{size:14}),"导出诊断"]}),xe.managementRecordUrl&&u.jsxs("button",{type:"button",className:"de-btn-secondary de-btn-sm",onClick:()=>window.open(xe.managementRecordUrl||"","_blank","noopener,noreferrer"),children:[u.jsx(Gp,{size:14}),"查看管理端记录"]}),u.jsx("button",{type:"button",className:"de-btn-primary de-btn-sm",disabled:S==="flush_management_sync",onClick:()=>{Zs().then(()=>kt(null))},children:S==="flush_management_sync"?"同步中...":"立即重试"})]})]})}),L&&u.jsx("div",{className:"de-task-manager-modal-overlay",role:"presentation",onClick:Bt,children:u.jsxs("div",{className:"de-event-detail-modal",role:"dialog","aria-modal":"true","aria-label":"执行记录详情",onClick:v=>v.stopPropagation(),children:[u.jsxs("div",{className:"de-task-manager-modal-head",children:[u.jsxs("div",{children:[u.jsx("span",{className:"de-drawer-eyebrow",children:"EXECUTION DETAIL"}),u.jsx("h3",{children:"执行记录详情"}),u.jsx("p",{children:"这条记录已被锁定,滚动不会把它刷掉。"})]}),u.jsx("button",{type:"button",className:"de-schedule-close",onClick:Bt,children:"×"})]}),u.jsxs("div",{className:"de-event-detail-grid",children:[u.jsxs("div",{children:[u.jsx("span",{children:"业务"}),u.jsx("strong",{children:L.plan_title})]}),u.jsxs("div",{children:[u.jsx("span",{children:"操作"}),u.jsx("strong",{children:L.task_title})]}),u.jsxs("div",{children:[u.jsx("span",{children:"状态"}),u.jsx("strong",{children:Wp(L)})]}),u.jsxs("div",{children:[u.jsx("span",{children:"计划时间"}),u.jsx("strong",{children:jy(L)})]}),u.jsxs("div",{children:[u.jsx("span",{children:"执行时间"}),u.jsx("strong",{children:Ey(L)})]}),u.jsxs("div",{children:[u.jsx("span",{children:"数据来源"}),u.jsx("strong",{children:Tn})]})]}),u.jsxs("div",{className:"de-event-detail-result",children:[u.jsx("span",{children:"操作结果"}),u.jsx("p",{children:hc(L)})]}),u.jsxs("div",{className:"de-event-modal-actions",children:[u.jsx("button",{type:"button",className:"de-btn-secondary de-btn-sm",onClick:Bt,children:"关闭"}),u.jsx("button",{type:"button",className:"de-btn-primary de-btn-sm",onClick:()=>Ws(L),children:"打开任务中心详情"})]})]})}),Q&&u.jsx("div",{className:"de-task-manager-modal-overlay",role:"presentation",onClick:Ml,children:u.jsxs("div",{className:"de-event-history-modal",role:"dialog","aria-modal":"true","aria-label":"全部执行记录",onClick:v=>v.stopPropagation(),children:[u.jsxs("div",{className:"de-task-manager-modal-head",children:[u.jsxs("div",{children:[u.jsx("span",{className:"de-drawer-eyebrow",children:"EXECUTION HISTORY"}),u.jsx("h3",{children:"运行明细"}),u.jsxs("p",{children:["当前日期共 ",Xe.length," 条记录,本窗口展示最新 ",Math.min(ji.length,Fp)," 条。"]})]}),u.jsx("button",{type:"button",className:"de-schedule-close",onClick:Ml,children:"×"})]}),u.jsx("div",{className:"de-event-history-toolbar",children:fx.map(v=>u.jsx("button",{type:"button",className:`de-filter-chip ${Y===v.id?"active":""}`,onClick:()=>ae(v.id),children:v.label},v.id))}),u.jsx("div",{className:"de-event-history-list",children:ji.length===0?u.jsx("p",{className:"de-empty-text",children:"当前筛选下没有执行记录。"}):kl.map(v=>u.jsxs("button",{type:"button",className:`de-event-history-row de-live-feed-row--${v.status_tone||"info"}`,onClick:()=>{N(v),re(!1),Re(!0)},children:[u.jsxs("span",{children:[u.jsx("em",{children:"业务"}),u.jsx("strong",{children:v.plan_title})]}),u.jsxs("span",{children:[u.jsx("em",{children:"操作"}),u.jsx("strong",{children:v.task_title})]}),u.jsxs("span",{children:[u.jsx("em",{children:"状态"}),u.jsx("strong",{children:Wp(v)})]}),u.jsxs("span",{children:[u.jsx("em",{children:"操作结果"}),u.jsx("strong",{children:hc(v)}),u.jsx("small",{children:ng(v)})]})]},v.id))})]})}),w&&u.jsx("div",{className:"de-task-manager-modal-overlay de-plan-action-overlay",role:"presentation",onClick:()=>B(null),children:u.jsxs("div",{className:"de-plan-action-modal",role:"dialog","aria-modal":"true","aria-label":"定时任务",onClick:v=>v.stopPropagation(),children:[u.jsxs("div",{className:"de-task-manager-modal-head",children:[u.jsxs("div",{children:[u.jsx("span",{className:"de-drawer-eyebrow",children:"PLAN SCHEDULE"}),u.jsx("h3",{children:"定时任务"}),u.jsx("p",{children:"定时会把任务注册到后端调度链路,每天按设置时间自动派发。"})]}),u.jsx("button",{type:"button",className:"de-schedule-close",onClick:()=>B(null),children:"×"})]}),u.jsxs("div",{className:"de-plan-action-body",children:[u.jsxs("div",{className:"de-event-detail-result",children:[u.jsx("span",{children:"任务"}),u.jsx("p",{children:w.title})]}),u.jsxs("label",{className:"de-plan-action-field",children:[u.jsx("span",{children:"每日定时时间"}),u.jsx("input",{type:"time",value:de,onChange:v=>_e(v.target.value||"09:00")})]}),u.jsxs("div",{className:"de-event-detail-grid de-plan-action-grid",children:[u.jsxs("div",{children:[u.jsx("span",{children:"调度注册"}),u.jsx("strong",{children:Ip(de)})]}),u.jsxs("div",{children:[u.jsx("span",{children:"任务步骤"}),u.jsxs("strong",{children:[w.stepCount," 步"]})]}),u.jsxs("div",{children:[u.jsx("span",{children:"执行步骤"}),u.jsxs("strong",{children:[w.taskCount," 项"]})]})]}),u.jsx("div",{className:"de-schedule-result de-schedule-result--success",children:"这里不是本地假定时;提交后如果后端调度链路不可用,会直接显示真实失败原因。"})]}),u.jsxs("div",{className:"de-event-modal-actions",children:[u.jsx("button",{type:"button",className:"de-btn-secondary de-btn-sm",onClick:()=>B(null),children:"取消"}),u.jsx("button",{type:"button",className:"de-btn-primary de-btn-sm",disabled:S===`schedule:${w.id}`,onClick:()=>{Fs(w)},children:S===`schedule:${w.id}`?"注册中...":"确认定时"})]})]})}),V&&u.jsx("div",{className:"de-task-manager-modal-overlay de-plan-action-overlay",role:"presentation",onClick:()=>I(null),children:u.jsxs("div",{className:"de-plan-action-modal",role:"dialog","aria-modal":"true","aria-label":"执行任务",onClick:v=>v.stopPropagation(),children:[u.jsxs("div",{className:"de-task-manager-modal-head",children:[u.jsxs("div",{children:[u.jsx("span",{className:"de-drawer-eyebrow",children:"PLAN EXECUTION"}),u.jsx("h3",{children:"执行任务"}),u.jsx("p",{children:"确认后立即创建并派发任务步骤,不需要先进入任务中心设置。"})]}),u.jsx("button",{type:"button",className:"de-schedule-close",onClick:()=>I(null),children:"×"})]}),u.jsxs("div",{className:"de-plan-action-body",children:[u.jsxs("div",{className:"de-event-detail-result",children:[u.jsx("span",{children:"任务"}),u.jsx("p",{children:V.title})]}),u.jsxs("div",{className:"de-event-detail-grid de-plan-action-grid",children:[u.jsxs("div",{children:[u.jsx("span",{children:"当前状态"}),u.jsx("strong",{children:V.statusLabel})]}),u.jsxs("div",{children:[u.jsx("span",{children:"任务步骤"}),u.jsxs("strong",{children:[V.stepCount," 步"]})]}),u.jsxs("div",{children:[u.jsx("span",{children:"执行步骤"}),u.jsxs("strong",{children:[V.taskCount," 项"]})]})]}),u.jsx("div",{className:`de-schedule-result ${rc(V)?"de-schedule-result--success":"de-schedule-result--pending"}`,children:rc(V)?"确认后立即调用后端派发接口,按任务步骤进入真实执行链路。":cc(V)})]}),u.jsxs("div",{className:"de-event-modal-actions",children:[u.jsx("button",{type:"button",className:"de-btn-secondary de-btn-sm",onClick:()=>I(null),children:"取消"}),u.jsx("button",{type:"button",className:"de-btn-primary de-btn-sm",disabled:S===`execute:${V.id}`||!rc(V),onClick:()=>{Oi(V)},children:S===`execute:${V.id}`?"触发中...":"确认执行"})]})]})}),bi&&Ni&&u.jsx("div",{className:"de-task-manager-modal-overlay de-workday-guide-overlay",role:"presentation",onClick:$i,children:u.jsxs("div",{className:"de-task-manager-modal de-workday-guide-modal",role:"dialog","aria-modal":"true","aria-label":"开始今天的任务",onClick:v=>v.stopPropagation(),children:[u.jsxs("div",{className:"de-task-manager-modal-head de-workday-guide-head",children:[u.jsxs("div",{children:[u.jsx("span",{className:"de-drawer-eyebrow",children:"WORKDAY START"}),u.jsx("h3",{children:"开始今天的任务"}),u.jsx("p",{children:"像值班员早上交接一样,先确认日期和执行内容,再让数字员工开始接单、外呼、汇总和汇报。"})]}),u.jsx("button",{type:"button",className:"de-schedule-close",onClick:$i,children:"×"})]}),u.jsx("div",{className:"de-workday-guide-steps","aria-label":"开工引导步骤",children:hx.map((v,J)=>u.jsxs("div",{className:"de-workday-guide-step",children:[u.jsx("span",{children:J+1}),u.jsx("strong",{children:v.title}),u.jsx("p",{children:v.body})]},v.title))}),u.jsxs("div",{className:"de-workday-guide-body",children:[u.jsxs("section",{className:"de-task-manager-column de-workday-guide-column",children:[u.jsxs("div",{className:"de-task-manager-section-head",children:[u.jsxs("div",{children:[u.jsx("strong",{children:"选择今天要执行的任务"}),u.jsxs("span",{children:[At.length," 项已选,",Bn.length," 项总任务,",Ja.length," 项待选择"]})]}),u.jsx("span",{className:`de-badge ${lt}`,children:Tn})]}),u.jsx("div",{className:"de-workday-guide-duty-list",children:g?u.jsx("div",{className:"de-loading-skeleton",style:{height:220}}):Ct.length===0?u.jsx("p",{className:"de-empty-text",children:"暂无任务,首页不再展示硬编码任务。请先在任务中心创建或同步。"}):Ct.map(v=>Is(v,"guide"))})]}),u.jsxs("aside",{className:"de-workday-guide-side",children:[u.jsxs("div",{className:"de-workday-guide-summary",children:[u.jsx("span",{children:"日期"}),u.jsx("strong",{children:i}),u.jsx("p",{children:hn})]}),u.jsxs("div",{className:"de-workday-guide-summary",children:[u.jsx("span",{children:"确认后会发生什么"}),u.jsx("strong",{children:"右侧进入执行滚动"}),u.jsx("p",{children:"首页会展示当前动作、下一步、操作状态和操作结果;需要人工决策时会在右侧停下来提示。"})]}),(O||Z||(c==null?void 0:c.demo_reason))&&u.jsx("div",{className:`de-schedule-result ${O?"de-schedule-result--error":"de-schedule-result--success"}`,children:O||(Z?"已调整任务勾选,点击确认后生效。":c==null?void 0:c.demo_reason)}),u.jsxs("div",{className:"de-workday-guide-actions",children:[u.jsx("button",{type:"button",className:"de-btn-secondary de-btn-sm",onClick:$i,children:"稍后设置"}),u.jsx("button",{type:"button",className:"de-btn-primary de-btn-sm",disabled:S==="confirm_workday"||g,onClick:()=>{Fa()},children:S==="confirm_workday"?"确认中...":"确认并开始任务"})]})]})]})]})}),me&&u.jsx("div",{className:"de-task-manager-modal-overlay",role:"presentation",onClick:()=>Se(!1),children:u.jsxs("div",{className:"de-task-manager-modal",role:"dialog","aria-modal":"true","aria-label":"任务设置",onClick:v=>v.stopPropagation(),children:[u.jsxs("div",{className:"de-task-manager-modal-head",children:[u.jsxs("div",{children:[u.jsx("span",{className:"de-drawer-eyebrow",children:"TASK MANAGER"}),u.jsx("h3",{children:"任务设置"}),u.jsx("p",{children:"像员工早上确认工作一样,勾选今天要执行的内容,必要时进入详情或处理待决策事项。"})]}),u.jsx("button",{type:"button",className:"de-schedule-close",onClick:()=>Se(!1),children:"×"})]}),u.jsxs("div",{className:"de-task-manager-modal-body",children:[u.jsxs("section",{className:"de-task-manager-column de-task-manager-column--duties",children:[u.jsxs("div",{className:"de-task-manager-section-head",children:[u.jsxs("div",{children:[u.jsx("strong",{children:"任务设置清单"}),u.jsxs("span",{children:[At.length," 项已选,",Bn.length," 项总任务,",Ja.length," 项待选择"]})]}),u.jsx("button",{type:"button",className:"de-btn-primary de-btn-sm",disabled:S==="confirm_workday"||g,onClick:()=>{Fa()},children:S==="confirm_workday"?"确认中...":Ne!=null&&Ne.confirmed?"重新任务执行":"确认并开始任务"})]}),u.jsx("div",{className:"de-task-manager-duty-list",children:g?u.jsx("div",{className:"de-loading-skeleton",style:{height:180}}):Ct.length===0?u.jsx("p",{className:"de-empty-text",children:"暂无任务,首页不会显示硬编码任务。可进入任务中心创建。"}):Ct.map(v=>Is(v,"manager"))})]}),u.jsxs("aside",{className:"de-task-manager-column de-task-manager-column--actions",children:[u.jsx("div",{className:"de-task-manager-section-head",children:u.jsxs("div",{children:[u.jsx("strong",{children:"待解决事项"}),u.jsx("span",{children:oa.length>0?`${oa.length} 项需要人处理`:"暂无阻塞事项"})]})}),u.jsx("div",{className:"de-task-manager-decision-list",children:((c==null?void 0:c.decisions)??[]).length===0?u.jsx("p",{className:"de-empty-text",children:"没有需要你确认的事项。"}):((c==null?void 0:c.decisions)??[]).map(v=>u.jsxs("div",{className:"de-task-manager-decision-card",children:[u.jsxs("div",{className:"de-log-entry-meta",children:[u.jsx("strong",{children:v.title}),u.jsx("span",{children:v.status_label})]}),u.jsx("p",{children:v.scenario}),u.jsxs("div",{className:"de-decision-chain-note",children:[u.jsx("span",{className:"de-badge de-badge-success",children:"本地记录"}),u.jsx("span",{children:Po(v.status)?"处理结果会写入 qimingclaw runtime event。":"该事项已在本地状态中处理。"})]}),u.jsxs("div",{className:"de-workbench-actions",children:[v.actions.map(J=>u.jsx("button",{type:"button",className:J.tone==="primary"?"de-workbench-action-accent":"",disabled:S===`${v.id}:${J.id}`||!Po(v.status),onClick:()=>{ya(v,J.id)},children:S===`${v.id}:${J.id}`?"处理中...":J.label},J.id)),u.jsx("button",{type:"button",onClick:()=>a({tab:"missions",date:i,missionId:v.id}),children:"查看上下文"})]})]},v.id))})]})]})]})})]})}function Os({children:a,className:i="",style:s}){return u.jsx("div",{className:`de-card ${i}`,style:s,children:a})}function Oc({title:a,children:i}){return u.jsxs("div",{className:"de-card-title-bar",children:[u.jsx("span",{className:"de-card-title-bar-text",children:a}),i]})}const t1={info:"de-badge-info",success:"de-badge-success",warning:"de-badge-warning",danger:"de-badge-danger"};function pd({variant:a,label:i}){return u.jsx("span",{className:`de-badge ${t1[a]}`,children:i})}function gd(a){return Array.isArray(a)?a:[]}function sg(a){return a&&typeof a=="object"&&!Array.isArray(a)?a:null}function De(a,i=""){return typeof a=="string"?a:typeof a=="number"?String(a):i}function vi(a){return/[\u4e00-\u9fff]/.test(a)}const rg={queued:"排队中",ready:"就绪",idle:"待执行",pending:"待处理",pending_authorization:"待授权",waiting_input:"待输入",draft:"草稿",reviewing:"审核中",approved:"已批准",preparing:"准备中",running:"执行中",active:"运行中",blocked:"已阻塞",succeeded:"已完成",success:"成功",finished:"已完成",complete:"已完成",completed:"已完成",failed:"失败",error:"错误",cancelled:"已取消",canceled:"已取消",aborted:"已终止",rejected:"已拒绝",deferred:"已暂缓",dispatched:"已下发",scheduled:"已设置定时",enabled:"已启用",disabled:"已停用",paused:"已暂停",unknown:"未知"},cg={plan:"计划",task:"任务",task_running:"处理中",task_done:"任务完成",run:"执行开始",run_done:"执行完成",skill_tool:"技能调用",artifact:"产物",task_summary:"结果",entered_session:"会话",start:"目标",RunStarted:"开始调用",RequestDispatched:"请求已发出",ResponseReceived:"收到返回",RunSkipped:"本次跳过",RunCompleted:"执行完成",waiting_for_authorization:"等待授权",pending_authorization:"等待授权",authorization_approved:"授权通过",authorization_rejected:"授权拒绝",authorization_deferred:"稍后处理",failed:"执行失败",completed:"执行完成"};function Ut(a,i="未知"){const s=De(a).trim();if(!s)return i;const c=rg[s]??rg[s.toLowerCase()];return c||(vi(s)?s:i)}function n1(a){const i=De(a).trim();return i?cg[i]??cg[i.toLowerCase()]??(vi(i)?i:"事件"):"事件"}function ky(a,i="暂无事件内容"){const s=De(a).trim();if(!s)return i;if(vi(s))return s;const c=Ut(s,"");if(c)return c;const d=s.match(/^(Succeeded|Failed|Running|Completed)\s*\(attempt\s*#(\d+)\)$/i);return d?`${Ut(d[1])}(第 ${d[2]} 次)`:/request failed/i.test(s)?"请求失败":/backend unavailable/i.test(s)?"后端服务不可达":/not found/i.test(s)?"未找到对应资源":i}function Ts(a,i="未命名内容"){const s=De(a).trim();if(!s||/unnamed/i.test(s))return i;if(vi(s))return s;const c=Ut(s,"");if(c)return c;const d=Ay(s);return d||s}function yd(a){return["succeeded","success","finished","complete","completed"].includes(a.toLowerCase())}function _d(a){return["failed","error","cancelled","canceled","aborted","rejected","deadletter"].includes(a.toLowerCase())}function a1(a,i){const s=De(a).trim().toLowerCase();return i.length===0?s||"pending":i.some(c=>_d(c.status))?"failed":i.some(c=>["running","active","leased"].includes(c.status.toLowerCase()))?"running":i.some(c=>["queued","ready","pending"].includes(c.status.toLowerCase()))?"queued":i.every(c=>yd(c.status))?"succeeded":s||"pending"}function l1(a,i){const s=De(a,"unknown").trim().toLowerCase();return yd(s)||_d(s)?s:i.some(c=>_d(c.status))?"failed":i.some(c=>["running","active","queued","leased"].includes(c.status.toLowerCase()))?"running":i.length>0&&i.every(c=>yd(c.status))?"succeeded":s||"unknown"}function ug(a){return a?a.map(i=>{const s=De(i.plan_id),d=gd(i.steps).map(h=>{const p=gd(h.tasks).map(g=>({id:De(g.task_id),title:Ts(g.title,"子任务"),description:De(g.description),status:De(g.status,"pending"),assignedSkillId:g.assigned_skill_id?De(g.assigned_skill_id):null,startedAt:g.started_at?De(g.started_at):null,finishedAt:g.finished_at?De(g.finished_at):null}));return{id:De(h.step_id),title:Ts(h.title,"任务步骤"),description:De(h.description),status:a1(h.status,p),preferredSkills:Array.isArray(h.preferred_skills)?h.preferred_skills:[],tasks:p}}),f=[];for(const h of d)for(const _ of h.tasks)f.push(_.id);return{id:s,title:Ts(i.title,"未命名任务"),objective:Ts(i.objective||i.description,"暂无任务说明"),status:l1(i.status,d),createdAt:i.created_at?De(i.created_at):null,updatedAt:i.updated_at?De(i.updated_at):null,steps:d,sourceIds:{planId:s||void 0,taskIds:f}}}):[]}const ed={"decision-analyzer":"决策分析","git-log-collector":"Git 日志采集","number-generator":"数据生成","office-export-xlsx":"Excel 导出","task-tracker":"任务跟踪","weekly-report-writer":"周报撰写","zhihu-hotlist-detail":"知乎热榜明细","zhihu-hotlist":"知乎热榜","tq-lineloss-report":"台区线损报表","archive-workorder-grid-push-monitor":"归档工单推送监控","available-balance-below-zero-monitor":"可用余额监控","command-center-fee-control-monitor":"费用管控监控","sgcc-todo-crawler":"SGCC 待办爬取","appointment-workorder-monitor":"约时工单监控","fault-location-monitor":"故障定位监控","fudian-failure-monitor":"复电失败监控","important-service-expiry-monitor":"服务到期预警","by-95598-customer-satisfaction-report":"95598 满意率日报","by-daily-report-statistics":"日报统计","by-fire-fault-monthly-report":"火警故障月报","by-risk-control-next-day-plan-report":"风控次日计划","by-risk-control-week-plan-report":"风控周计划","by-supervision-workorder-detail-report":"督办工单明细","age-file-encryption":"文件加解密","anonymous-file-upload":"匿名文件上传","browser-automation-agent":"浏览器自动化","bulk-github-star":"批量仓库标星","changelog-generator":"更新日志生成","code-reviewer":"代码审查","commit-automation":"自动提交","crypto-trading-signal":"交易信号分析","csv-to-json":"CSV 转 JSON","data-analysis":"数据分析","deep-research":"深度调研","dependency-updater":"依赖更新","deploy-automation":"自动部署","dns-lookup":"DNS 查询","document-generator":"文档生成","email-automation":"邮件自动化","file-converter":"文件格式转换","git-history-analyzer":"Git 历史分析","github-issue-manager":"Issue 管理","image-optimizer":"图片优化","json-schema-validator":"JSON Schema 校验","log-analyzer":"日志分析","markdown-to-pdf":"Markdown 转 PDF","meeting-summarizer":"会议纪要","news-aggregator":"新闻聚合","pdf-extractor":"PDF 提取","performance-profiler":"性能分析","pr-review-bot":"PR 审查","release-notes-generator":"发布说明生成","screenshot-automation":"截图自动化","search-engine-scraper":"搜索引擎抓取","sentiment-analysis":"情感分析","shell-command-runner":"命令执行","slack-notification":"Slack 通知","spreadsheet-generator":"电子表格生成","text-summarizer":"文本摘要","torrent-search":"资源搜索","translate-text":"文本翻译","web-scraper":"网页抓取","website-monitor":"网站监控","whitepaper-analyzer":"白皮书分析","xml-to-json":"XML 转 JSON"};function Ay(a){if(ed[a])return ed[a];for(const[i,s]of Object.entries(ed))if(a.includes(i)||i.includes(a))return s;return null}function og(a,i){const s=Ay(a);return s||(vi(i)?i:"自动化技能")}const dg={"decision-analyzer":"数字化","git-log-collector":"数字化","number-generator":"数字化","office-export-xlsx":"办公","task-tracker":"办公","weekly-report-writer":"报表","zhihu-hotlist-detail":"数字化","zhihu-hotlist":"数字化","tq-lineloss-report":"报表","archive-workorder-grid-push-monitor":"监控巡检","available-balance-below-zero-monitor":"监控巡检","command-center-fee-control-monitor":"监控巡检","sgcc-todo-crawler":"监控巡检","appointment-workorder-monitor":"监控巡检","fault-location-monitor":"监控巡检","fudian-failure-monitor":"监控巡检","important-service-expiry-monitor":"监控巡检","by-95598-customer-satisfaction-report":"报表","by-daily-report-statistics":"报表","by-fire-fault-monthly-report":"报表","by-risk-control-next-day-plan-report":"报表","by-risk-control-week-plan-report":"报表","by-supervision-workorder-detail-report":"报表","age-file-encryption":"数字化","anonymous-file-upload":"通信","browser-automation-agent":"数字化","bulk-github-star":"发展","changelog-generator":"发展","chat-logger":"通信","check-crypto-address-balance":"财务","city-distance":"发展","city-tourism-website-builder":"营销","crawl-websites-at-scale":"数字化","csv-data-summarizer":"财务","d3js-data-visualization":"数字化","database-query-and-export":"数字化","file-tracker":"综合","free-geocoding-and-maps":"发展","free-translation-api":"综合","free-weather-data":"综合","generate-asset-price-chart":"财务","generate-qr-code-natively":"数字化","get-crypto-price":"财务","git-worktree-cli":"发展","github-stats":"发展","html-to-markdown":"数字化","image-compressor":"综合","json-to-csv":"数字化","llm-council":"数字化","markdown-table-generator":"综合","multi-format-converter":"综合","npm-package-info":"发展","pdf-generator":"综合","random-number-generator":"综合","readability-score":"综合","rss-feed-reader":"通信","sql-formatter":"数字化","text-diff":"综合","torrent-search":"通信","unit-converter":"综合","url-shortener":"通信","youtube-transcript":"通信","zip-extractor":"综合"};function fg(a){return dg[a]?dg[a]:"综合"}function i1(a){return a==="core"||a==="standard"||a==="specialized"||a==="experimental"?a:"standard"}function s1(a,i,s){const c=De(i).trim();return c&&vi(c)?c:a.includes("monitor")?`${s}能力,用于按排班自动巡检并提示异常。`:a.includes("report")?`${s}能力,用于自动生成和整理业务报表。`:`${s}能力,可由数字员工按需执行或定时处理。`}function r1(a){return a?a.map(i=>{const s=De(i.skill_id,De(i.id)),c=sg(i.governance);return{id:s,name:og(s,De(i.name,s)),version:i.version?De(i.version):null,enabled:!!i.enabled,description:s1(s,i.description,og(s,De(i.name,s))),category:i.category?De(i.category,fg(s)):fg(s),capabilityLevel:i1(i.capability_level??i.capabilityLevel),source:"skill-api",serverId:i.server_id?De(i.server_id):null,transport:i.transport?De(i.transport):null,running:typeof i.running=="boolean"?i.running:null,toolCount:mg(i.tool_count),tools:td(i.tools),allowTools:td(i.allow_tools??(c==null?void 0:c.server_allow_tools)??(c==null?void 0:c.global_allow_tools)),denyTools:td(i.deny_tools??(c==null?void 0:c.server_deny_tools)??(c==null?void 0:c.global_deny_tools)),governancePolicy:c1(i.governance_policy??(c==null?void 0:c.effective_policy)),recentCalls:gd(i.recent_calls).map(d=>{const f=sg(d)??{};return{eventId:De(f.event_id,De(f.id)),message:De(f.message),status:f.status?De(f.status):null,occurredAt:De(f.occurred_at,De(f.occurredAt)),toolName:f.tool_name?De(f.tool_name):null,projectId:f.project_id?De(f.project_id):null}}).filter(d=>d.eventId||d.message),callCount:mg(i.call_count)??0,lastCalledAt:i.last_called_at?De(i.last_called_at):null}}):[]}function td(a){return Array.isArray(a)?a.filter(i=>typeof i=="string"&&i.trim().length>0).map(i=>i.trim()):[]}function mg(a){if(typeof a=="number"&&Number.isFinite(a))return a;if(typeof a=="string"&&a.trim()){const i=Number(a);return Number.isFinite(i)?i:null}return null}function c1(a){return a==="allow"||a==="deny"||a==="open"||a==="disabled"?a:null}function $c(a){return a.replace(/[^a-zA-Z0-9_-]/g,"_")}function u1(a){switch(a){case"succeeded":case"completed":return"success";case"failed":case"error":return"danger";case"running":case"active":return"info";default:return"warning"}}function o1(a){return["draft","reviewing","approved"].includes(a.toLowerCase())}function d1(a){const i=`${a.id} ${a.title} ${a.objective}`.toLowerCase();return i.includes("month")||i.includes("monthly")||i.includes("月")?"月度任务":i.includes("week")||i.includes("weekly")||i.includes("周")?"周任务":i.includes("临时")||i.includes("adhoc")||i.includes("hotlist")||i.includes("monitor")?"临时任务":"日常任务"}function vl(a){return["succeeded","success","finished","complete","completed"].includes(a.toLowerCase())}function Ty(a){return["failed","error","cancelled","canceled","aborted","rejected","deadletter"].includes(a.toLowerCase())}function f1(a){const i=a.steps.length;if(i===0)return Ut(a.status);const s=a.steps.filter(h=>vl(h.status)).length,c=a.steps.filter(h=>Ty(h.status)).length,d=a.steps.filter(h=>["running","active","queued","leased"].includes(h.status.toLowerCase())).length,f=[`已完成 ${s}/${i}`];return c>0&&f.push(`失败 ${c}`),d>0&&c===0&&f.push(`处理中 ${d}`),f.join(",")}function m1(a){const i=a.steps.find(d=>Ty(d.status));if(i)return`执行失败:${i.title}`;const s=a.steps.find(d=>["running","active"].includes(d.status.toLowerCase()));if(s)return`正在处理:${s.title}`;const c=a.steps.find(d=>!vl(d.status));return c?`准备处理:${c.title}`:vl(a.status)?"本轮任务已完成,等待你查看结果":a.status.toLowerCase()==="failed"?"执行遇到异常,等待你检查后重新执行":"等待你委托数字员工开始处理"}function h1(a,i){const s=a.status.toLowerCase();return s==="failed"||s==="error"?"查看详情后重新执行本任务":["running","active"].includes(s)?"等待完成或查看过程":vl(s)?"查看产物,必要时重新执行":i?"确认目标后点击委托执行":"查看详情确认当前状态"}function p1(a){const i=`${a.title} ${a.objective}`.toLowerCase();return i.includes("excel")||i.includes("xlsx")||i.includes("导出")||i.includes("报表")?"导出报表":i.includes("brief")||i.includes("简报")||i.includes("日程")?"工作简报":i.includes("snapshot")||i.includes("快照")||i.includes("热榜")?"结果快照":vl(a.status)?"查看完成结果":"完成后生成"}function Ny(a){if(!a)return"";const i=new Date(a);return Number.isNaN(i.getTime())?"":[i.getFullYear(),String(i.getMonth()+1).padStart(2,"0"),String(i.getDate()).padStart(2,"0")].join("-")}function Cy(){return Ny(new Date().toISOString())}function g1(a){if(!a)return"时间未记录";const i=new Date(a);return Number.isNaN(i.getTime())?"时间未记录":i.toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",hour12:!1})}function y1(a){if(!a)return"";const i=new Date(a);return Number.isNaN(i.getTime())?"":i.toLocaleString("zh-CN",{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",hour12:!1})}function _1(a){const i=`${a.title} ${a.id}`.match(/(?:^|\D)(\d{1,2})[::](\d{2})(?:\D|$)/);if(!i)return null;const s=Number(i[1]),c=Number(i[2]);return!Number.isInteger(s)||!Number.isInteger(c)||s>23||c>59?null:`${String(s).padStart(2,"0")}:${String(c).padStart(2,"0")}`}function v1(a){return a.steps.flatMap(i=>i.tasks.flatMap(s=>[s.startedAt,s.finishedAt])).filter(i=>!!i)}function b1(a,i){return v1(a).filter(c=>Ny(c)===i).sort((c,d)=>d.localeCompare(c))[0]??null}function S1(a,i){const s=b1(a,i);if(s)return`实际执行 ${g1(s)}`;const c=i===Cy()?"今日未执行":"当日未执行";return`计划执行 ${_1(a)||"待确认"};${c}`}function x1({mission:a,onSelect:i,onRun:s,onRestart:c,dateFilter:d,selected:f,focusLabel:h,running:_}){const p=o1(a.status),g=vl(a.status)||a.steps.some(E=>vl(E.status)),j=d||Cy(),S=y1(a.updatedAt||a.createdAt);return u.jsxs("div",{id:`mission-card-${$c(a.id)}`,className:`de-mission-card ${f?"de-mission-card--selected":""}`,onClick:()=>i(a),onKeyDown:E=>{(E.key==="Enter"||E.key===" ")&&(E.preventDefault(),i(a))},role:"button",tabIndex:0,children:[u.jsxs("div",{className:"de-mission-card-header",children:[u.jsx("span",{className:"de-mission-card-title",children:a.title}),u.jsxs("div",{className:"de-mission-card-badges",children:[h&&u.jsx("span",{className:"de-mission-card-focus-chip",children:h}),u.jsx(pd,{variant:u1(a.status),label:Ut(a.status)})]})]}),a.objective&&u.jsxs("p",{className:"de-mission-card-desc",children:["业务目标:",a.objective]}),u.jsxs("div",{className:"de-mission-card-meta",children:[u.jsxs("span",{children:["周期:",d1(a)]}),u.jsxs("span",{children:["当前进度:",f1(a)]}),S&&u.jsxs("span",{children:["同步于 ",S]})]}),u.jsx("div",{className:"de-mission-card-meta",children:u.jsx("span",{children:m1(a)})}),u.jsxs("div",{className:"de-mission-card-meta",children:[u.jsxs("span",{children:["下一步:",h1(a,p)]}),u.jsxs("span",{children:["产物入口:",p1(a)]})]}),u.jsxs("div",{className:"de-mission-card-actions",children:[u.jsxs("span",{className:"de-mission-card-time",children:[S1(a,j),g?";重新执行可能覆盖本任务结果":""]}),u.jsx("button",{type:"button",className:"de-btn-restart",disabled:_,onClick:E=>{E.stopPropagation(),_||c==null||c(a)},title:g?"重新执行本任务,可能覆盖已有结果":"重新执行本任务",children:"重新执行本任务"}),u.jsx("button",{type:"button",className:"de-btn-run",disabled:!p||_,onClick:E=>{E.stopPropagation(),p&&!_&&(s==null||s(a))},children:_?"执行中...":p?"委托执行":Ut(a.status)})]})]})}function hg(a){switch(a){case"succeeded":case"completed":case"Succeeded":return"success";case"failed":return"danger";case"Failed":return"danger";case"running":case"active":case"Running":return"info";default:return"warning"}}function Qa(a){return a?new Date(a).toLocaleString("zh-CN",{hour12:!1}):"未记录"}function pg(a){const i=`${a.id} ${a.title} ${a.objective}`.toLowerCase();return i.includes("month")||i.includes("monthly")||i.includes("月")?"月度任务":i.includes("week")||i.includes("weekly")||i.includes("周")?"周任务":i.includes("临时")||i.includes("adhoc")||i.includes("hotlist")||i.includes("monitor")?"临时任务":"日常任务"}function j1(a){return["succeeded","success","finished","complete","completed"].includes(a.toLowerCase())}function Cs(a){return["failed","error","cancelled","canceled","aborted","rejected","deadletter"].includes(a.toLowerCase())}function gg(a){const i=a.steps.length;if(i===0)return Ut(a.status);const s=a.steps.filter(h=>j1(h.status)).length,c=a.steps.filter(h=>Cs(h.status)).length,d=a.steps.filter(h=>["running","active","queued","leased"].includes(h.status.toLowerCase())).length,f=[`已完成 ${s}/${i}`];return c>0&&f.push(`失败 ${c}`),d>0&&c===0&&f.push(`处理中 ${d}`),f.join(",")}function yg(a){return a.replace(/^启动计划:/,"接收委托:").replace(/^准备步骤:/,"准备工作:").replace(/^创建任务:/,"安排工作:").replace(/^任务失败:/,"工作失败:").replace(/^开始处理:/,"开始处理:").replace(/^完成任务:/,"完成工作:").replace(/^调用技能:/,"数字员工处理:").replace(/^执行开始:/,"开始执行:").replace(/^执行完成:/,"执行完成:").replace(/^执行失败:/,"执行失败:").replace(/,将使用[^,。]+/,"").replace(/,分配给[^,。]+/,"")}function pc(a){return/失败|failed|error|timeout|unavailable/i.test(a)}function _g(a,i=""){return pc(i)?"失败":a==="artifact"?"产物":a==="task_summary"?"结果":a==="task_running"||a==="run"?"处理中":a==="task_done"||a==="run_done"?"完成":"过程"}function w1(a){return a==="user"?"用户":a==="assistant"?"数字员工":a==="system"?"系统":"消息"}function nd(a){return Ts(a||"",a||"自动化技能")}function E1(a,i,s){const c=i==="true"?"成功":"失败";return a.includes("zhihu-hotlist")&&a.includes("extract_hotlist")?`调用技能:知乎热榜采集,结果:${c},耗时 ${s}ms`:a.includes("office-export-xlsx")&&a.includes("export_xlsx")?`调用技能:Excel 导出,结果:${c},耗时 ${s}ms`:`调用技能:${a},结果:${c},耗时 ${s}ms`}function ad(a){return typeof a=="string"?a:""}function Ec(a){return a.occurred_at||""}function vg(a){return a.filter(i=>!!i).sort((i,s)=>i.localeCompare(s))[0]||null}function k1(a){var s;const i=new Map;for(const c of a){const d=((s=c.message.split(",结果:")[0])==null?void 0:s.split(",状态:")[0])||c.message,f=i.get(d);(!f||Ec(c).localeCompare(Ec(f))>0)&&i.set(d,c)}return Array.from(i.values())}function A1(a){return a&&typeof a=="object"&&!Array.isArray(a)?a:null}function bg(a){return a.replace(/\\\\/g,"\\")}function T1(a,i,s,c,d){const f=[],h=(p,g,j,S)=>{j.trim()&&f.push({event_id:S,kind:p,occurred_at:g??null,message:j})},_=(p,g,j,S)=>{let E=!1;try{const R=A1(JSON.parse(p));if(R){const q=typeof R.label=="string"?R.label.trim():"",F=R.value;q&&F!==void 0&&F!==null&&h("task_summary",g,`${q}:${String(F)}`,`metric-${j}-${S}`);const Z=typeof R.output_path=="string"?R.output_path.trim():"";Z&&(E=!0,h("artifact",g,`产物生成:${bg(Z)}`,`artifact-${j}-${S}`))}}catch{}const $=p.match(/"row_count"\s*:\s*(\d+)/);$!=null&&$[1]&&h("task_summary",g,`数据处理完成:共 ${$[1]} 条记录`,`rows-${j}-${S}`);const A=p.match(/"output_path"\s*:\s*"([^"]+\.(?:xlsx|xls|csv|json|html|pdf|png|jpg|jpeg|txt))"/i),O=A==null?void 0:A[1];O&&!E&&h("artifact",g,`产物生成:${bg(O)}`,`artifact-regex-${j}-${S}`)};if(h("plan",a.createdAt||a.updatedAt,`启动计划:${a.title},目标:${a.objective}`,`plan-${a.id}`),i.length===0)for(const p of a.steps){const g=p.preferredSkills.map(nd).join("、")||"自动化技能";h("task",a.updatedAt||a.createdAt,`准备步骤:${p.title},将使用 ${g}`,`step-${p.id}`)}for(const p of i){const g=nd(p.assigned_skill_id),j=s.filter($=>$.task_id===p.task_id),S=vg(j.map($=>$.created_at)),E=vg([p.created_at,p.started_at,S]);if(h("task",E,`创建任务:${p.title||"子任务"},分配给 ${g}`,`task-create-${p.task_id}`),p.started_at&&h("task_running",p.started_at,`开始处理:${p.title||"子任务"}`,`task-start-${p.task_id}`),p.finished_at){const $=Cs(p.status)?"任务失败":"完成任务",A=Cs(p.status)&&p.error_message?`,原因:${p.error_message}`:"";h("task_done",p.finished_at,`${$}:${p.title||"子任务"},状态:${Ut(p.status)}${A}`,`task-finish-${p.task_id}`)}}for(const p of s){const g=i.find($=>$.task_id===p.task_id),j=(g==null?void 0:g.title)||"任务执行",S=nd(p.skill_id||(g==null?void 0:g.assigned_skill_id));if(c.some($=>($.content||"").includes(`[Task ${p.task_id}] tool_call`))||h("skill_tool",p.created_at,`调用技能:${S},处理:${j}`,`run-skill-${p.run_id}`),h("run",p.created_at,`执行开始:${j},第 ${p.attempt_no||1} 次`,`run-start-${p.run_id}`),p.completed_at){const $=Cs(p.lifecycle)?"执行失败":"执行完成";h("run_done",p.completed_at,`${$}:${j},结果:${Ut(p.lifecycle)}`,`run-done-${p.run_id}`)}for(const[$,A]of(p.events||[]).entries())_(ad(A.message),A.occurred_at||p.completed_at||p.created_at,`run-${p.run_id}-${A.event_id||$}`,p.skill_id||(g==null?void 0:g.assigned_skill_id)||"run");for(const[$,A]of(p.artifacts||[]).entries()){const O=ad(A.uri),R=ad(A.name)||O;(O||R)&&h("artifact",p.completed_at||p.created_at,`产物生成:${R}${O&&O!==R?`(${O})`:""}`,`run-artifact-${p.run_id}-${$}`)}}for(const p of c){const g=p.content||"",j=g.match(/\[Task ([^\]]+)\] tool_call name=([^\s]+) success=(true|false) elapsed_ms=(\d+) args=(.*?) output=(.*)$/s);if(j){const E=j[1]||"",$=j[2]||"",A=j[3]||"false",O=j[4]||"0",R=j[6]||"";h("skill_tool",p.created_at,E1($,A,O),`tool-${E}-${p.created_at}-${$}`),_(R,p.created_at,`message-${p.created_at}`,$);continue}const S=g.match(/共采集到\s*\**\s*(\d+)\s*条/);if(S!=null&&S[1]){h("task_summary",p.created_at,`采集完成:获得 ${S[1]} 条知乎热榜数据`,`summary-hotlist-${p.created_at}`);continue}g.includes("[Task ")&&g.includes("Excel")&&h("task_summary",p.created_at,"导出完成:Excel 文件已生成",`summary-excel-${p.created_at}`)}if(f.length<=1)for(const p of d||[])h(p.kind,p.occurred_at,ky(p.message,p.message),p.event_id);return f.sort((p,g)=>(p.occurred_at||"").localeCompare(g.occurred_at||"")).slice(-40)}function N1({mission:a,onClose:i}){const[s,c]=b.useState([]),[d,f]=b.useState([]),[h,_]=b.useState(null),[p,g]=b.useState(!0),[j,S]=b.useState([]),[E,$]=b.useState(!1),[A,O]=b.useState(!1),[R,q]=b.useState(!1),[F,Z]=b.useState(null),P=a.sourceIds.planId||a.id;b.useEffect(()=>{let Q=!1;const re=()=>{g(!0),Promise.allSettled([lx(P),ix(P),Vp(P)]).then(([N,Y,ae])=>{var me;Q||(N.status==="fulfilled"?(c(N.value.tasks??[]),f(N.value.runs??[])):(c([]),f([])),Y.status==="fulfilled"&&((me=Y.value)!=null&&me.events)&&Y.value.events.length>0?_(Y.value):_(null),ae.status==="fulfilled"&&ae.value.messages.length>0?S(ae.value.messages):S([]))}).finally(()=>{Q||g(!1)})};re();const L=window.setInterval(re,3e3);return()=>{Q=!0,window.clearInterval(L)}},[P]),b.useEffect(()=>{S([]),$(!1),O(!1),Z(null)},[P]);const te=async()=>{if(!R){$(!0),q(!0),Z(null);try{const Q=await Vp(P);Q.messages&&Q.messages.length>0?S(Q.messages):S([])}catch(Q){S([]),Z(Q instanceof Error?Q.message:"读取会话失败")}finally{q(!1)}}},he=b.useMemo(()=>{const Q=new Map;for(const re of d){const L=Q.get(re.task_id)||[];L.push(re),Q.set(re.task_id,L)}for(const re of Q.values())re.sort((L,N)=>(N.created_at||"").localeCompare(L.created_at||""));return Q},[d]),K=b.useMemo(()=>T1(a,s,d,j,h==null?void 0:h.events),[h==null?void 0:h.events,a,d,j,s]),ie=b.useMemo(()=>K.filter(Q=>Q.kind!=="skill_tool").slice(-12),[K]),ne=b.useMemo(()=>{const Q=K.filter(Y=>["artifact","task_summary"].includes(Y.kind)),re=K.filter(Y=>Y.kind==="task_done"),L=k1(K.filter(Y=>Y.kind==="run_done")),N=re.length>0?re:L;return[...Q,...N].sort((Y,ae)=>Ec(Y).localeCompare(Ec(ae))).slice(-6)},[K]),be=b.useMemo(()=>K.reduce((Q,re)=>re.occurred_at&&(!Q||re.occurred_at.localeCompare(Q)>0)?re.occurred_at:Q,null),[K]),Be=a.updatedAt||be,Re=()=>{const Q=!A;O(Q),Q&&!E&&te()};return u.jsxs("div",{className:"de-drawer",role:"dialog","aria-label":a.title,children:[u.jsxs("div",{className:"de-drawer-head",children:[u.jsxs("div",{className:"de-drawer-title-group",children:[u.jsx("span",{className:"de-drawer-eyebrow",children:"委托详情"}),u.jsx("h3",{children:a.title})]}),u.jsx("button",{className:"de-btn-secondary",onClick:i,"aria-label":"关闭",children:"✕"})]}),u.jsxs("div",{className:"de-drawer-status-line",children:[u.jsx(pd,{variant:hg(a.status),label:Ut(a.status)}),u.jsx("span",{className:"de-drawer-meta",children:pg(a)}),u.jsx("span",{className:"de-drawer-meta",children:gg(a)})]}),u.jsxs("div",{className:"de-drawer-timeline",children:[u.jsxs("section",{className:"de-detail-section",children:[u.jsx("div",{className:"de-detail-section-head",children:u.jsx("h4",{children:"委托概览"})}),u.jsxs("div",{className:"de-detail-kv",children:[u.jsx("span",{children:"业务目标"}),u.jsx("strong",{children:a.objective||"未填写"}),u.jsx("span",{children:"周期"}),u.jsx("strong",{children:pg(a)}),u.jsx("span",{children:"当前进度"}),u.jsx("strong",{children:gg(a)}),u.jsx("span",{children:"启动时间"}),u.jsx("strong",{children:Qa(a.createdAt)}),u.jsx("span",{children:"状态"}),u.jsx("strong",{children:Ut(a.status)}),u.jsx("span",{children:"更新时间"}),u.jsx("strong",{children:Qa(Be)})]})]}),u.jsxs("section",{className:"de-detail-section de-execution-chain",children:[u.jsxs("div",{className:"de-detail-section-head",children:[u.jsx("h4",{children:"业务过程"}),u.jsxs("span",{className:"de-chain-plan-id",children:["最近更新:",Qa(Be||a.createdAt)]})]}),p&&ie.length===0?u.jsx("p",{className:"de-empty-text",children:"正在读取业务过程..."}):ie.length===0?u.jsx("p",{className:"de-empty-text",children:"暂无业务过程。重新执行本任务后会显示处理进展。"}):u.jsx("div",{className:"de-chain-list",children:ie.map(Q=>u.jsxs("div",{className:`de-chain-row de-chain-row--${Q.kind} ${pc(Q.message)?"de-chain-row--danger":""}`,children:[u.jsx("strong",{children:_g(Q.kind,Q.message)}),u.jsx("span",{children:yg(Q.message)}),u.jsx("time",{children:Qa(Q.occurred_at)})]},`chain-${Q.event_id}`))})]}),u.jsxs("section",{className:"de-detail-section",children:[u.jsx("h4",{children:"结果与产物"}),ne.length>0?u.jsx("div",{className:"de-event-list",children:[...ne].reverse().map(Q=>u.jsxs("div",{className:`de-event-row ${pc(Q.message)?"de-event-row--danger":""}`,children:[u.jsx("strong",{children:_g(Q.kind,Q.message)}),u.jsx("span",{children:yg(Q.message)}),u.jsx("time",{children:Qa(Q.occurred_at)})]},`result-${Q.event_id}`))}):u.jsx("p",{className:"de-empty-text",children:"任务完成后,这里会显示结果摘要和产物入口。"})]}),u.jsxs("section",{className:"de-detail-section",children:[u.jsx("h4",{children:"步骤进展"}),p?u.jsx("p",{className:"de-empty-text",children:"正在读取执行情况..."}):null,a.steps.length===0?u.jsx("p",{className:"de-empty-text",children:"暂无步骤进展"}):a.steps.map((Q,re)=>u.jsxs("div",{className:"de-step-node",children:[u.jsx("div",{className:`de-step-dot de-step-dot--${Q.status}`}),re0?u.jsx("div",{className:"de-event-list",children:K.slice(-20).reverse().map(Q=>u.jsxs("div",{className:`de-event-row ${pc(Q.message)?"de-event-row--danger":""}`,children:[u.jsx("strong",{children:n1(Q.kind)}),u.jsx("span",{children:Q.message}),u.jsx("time",{children:Qa(Q.occurred_at)})]},Q.event_id))}):u.jsx("p",{className:"de-empty-text",children:"暂无事件日志"})]}),u.jsxs("section",{className:"de-detail-section",children:[u.jsxs("div",{className:"de-detail-section-head",children:[u.jsx("h4",{children:"会话记录"}),u.jsx("button",{className:"de-btn-secondary de-btn-sm",onClick:te,disabled:R,children:"刷新"})]}),F?u.jsxs("p",{className:"de-empty-text",children:["会话读取失败:",F]}):R?u.jsx("p",{className:"de-empty-text",children:"正在读取会话..."}):j.length===0?u.jsx("p",{className:"de-empty-text",children:"暂无会话消息。"}):u.jsx("div",{className:"de-session-message-list",children:j.map((Q,re)=>u.jsxs("div",{className:`de-session-message de-session-message--${Q.role==="user"?"user":"agent"}`,children:[u.jsx("div",{className:"de-session-message-role",children:w1(Q.role)}),u.jsx("p",{children:ky(Q.content,Q.content)})]},`${Q.role}-${re}`))})]}),u.jsxs("section",{className:"de-detail-section",children:[u.jsx("h4",{children:"任务与执行记录"}),s.length===0?u.jsx("p",{className:"de-empty-text",children:"暂无原始任务记录"}):s.map(Q=>{const re=he.get(Q.task_id)||[],L=re[0];return u.jsxs("div",{className:"de-task-run-card",children:[u.jsxs("div",{className:"de-task-run-head",children:[u.jsx("span",{children:Q.title||"子任务"}),u.jsx(pd,{variant:hg(Q.status),label:Ut(Q.status)})]}),u.jsxs("div",{className:"de-task-run-meta",children:[u.jsxs("span",{children:["skill_id:",Q.assigned_skill_id||"未分配"]}),u.jsxs("span",{children:["开始:",Qa(Q.started_at)]}),u.jsxs("span",{children:["结束:",Qa(Q.finished_at)]})]}),u.jsxs("div",{className:"de-task-run-meta",children:[u.jsxs("span",{children:["task_id:",Q.task_id]}),u.jsxs("span",{children:["执行记录:",re.length," 次"]}),L?u.jsxs("span",{children:["最近结果:",Ut(L.lifecycle)]}):null]}),Cs(Q.status)&&Q.error_message?u.jsxs("div",{className:"de-task-run-error",children:[u.jsx("strong",{children:"失败原因:"}),Q.error_message]}):null]},Q.task_id)})]})]}):u.jsx("p",{className:"de-empty-text",children:"默认隐藏排障信息;需要排障时可展开。"})]})]})]})}const Sg={zh:{"nav.dashboard":"仪表盘","nav.plans":"计划","nav.execution":"执行","nav.governance":"治理","nav.scheduler":"调度器","nav.skills":"技能","nav.agent":"智能体","nav.tools":"工具","nav.cron":"Cron 任务","nav.integrations":"集成","nav.memory":"记忆","nav.config":"配置","nav.cost":"成本追踪","nav.logs":"日志","nav.devtools":"工具","nav.swimlane":"泳道","nav.doctor":"诊断","nav.canvas":"画布","planb.nav.chat":"对话","planb.nav.browser":"AI浏览器","planb.nav.monitor":"运行监测","planb.nav.dashboard":"仪表盘","planb.nav.settings":"设置","planb.nav.more":"更多工具","planb.layout.switch_to_wide":"切换到宽屏模式","planb.layout.switch_to_compact":"切换到紧凑模式","planb.layout.pop_out":"弹出独立窗口","planb.browser.title":"AI浏览器","planb.browser.subtitle":"启动 SuperRPA 浏览器自动化","planb.browser.launch":"启动浏览器","planb.browser.url_placeholder":"https://example.com","planb.browser.active_sessions":"活跃会话","planb.browser.no_sessions":"没有活跃的浏览器会话,在上方输入 URL 启动。","planb.browser.status_launching":"启动中","planb.browser.status_running":"运行中","planb.browser.status_idle":"空闲","planb.browser.status_error":"错误","planb.browser.status_stopped":"已停止","planb.browser.launch_error":"启动浏览器失败","planb.browser.close_error":"关闭会话失败","planb.browser.backend_not_configured":"SuperRPA 未配置,请设置 SGCLAW_SUPERRPA_PATH 环境变量。","planb.chat.welcome":"今天我能帮你什么?","planb.chat.placeholder":"问点什么...","planb.chat.sessions":"对话历史","planb.chat.new_chat":"新对话","planb.chat.no_sessions":"暂无对话历史","planb.chat.untitled":"未命名对话","planb.chat.thought":"思考","planb.chat.chip_browse":"浏览网页","planb.chat.chip_code":"写代码","planb.chat.chip_analyze":"分析数据","planb.chat.chip_plan":"帮我规划","planb.chat.regenerate":"重新生成","planb.settings.quick":"快速设置","planb.settings.advanced":"高级配置","planb.settings.quick_hint":"快速设置功能即将推出。现在请使用高级配置编辑器修改 TOML 配置。","planb.settings.open_advanced":"打开高级配置","dashboard.title":"仪表盘","dashboard.provider":"提供商","dashboard.model":"模型","dashboard.uptime":"运行时间","dashboard.temperature":"温度","dashboard.gateway_port":"网关端口","dashboard.memory_backend":"记忆后端","dashboard.paired":"已配对","dashboard.channels":"频道","dashboard.health":"健康状态","dashboard.status":"状态","dashboard.overview":"概览","dashboard.system_info":"系统信息","dashboard.quick_actions":"快速操作","agent.title":"智能体对话","agent.send":"发送","agent.placeholder":"输入消息...","agent.start_conversation":"发送消息开始对话","agent.type_message":"输入消息...","agent.connecting":"连接中...","agent.connected":"已连接","agent.disconnected":"已断开","agent.reconnecting":"重新连接中...","agent.thinking":"思考中...","agent.tool_call":"工具调用","agent.tool_result":"工具结果","agent.connection_error":"连接错误,正在尝试重连...","agent.tool_call_prefix":"[工具调用]","agent.tool_result_prefix":"[工具结果]","agent.error_prefix":"[错误]","agent.unknown_error":"未知错误","agent.send_error":"发送消息失败,请重试。","agent.copy_message":"复制消息","agent.connected_status":"已连接","agent.disconnected_status":"已断开","tools.title":"可用工具","tools.name":"名称","tools.description":"描述","tools.parameters":"参数","tools.search":"搜索工具...","tools.empty":"暂无可用工具。","tools.count":"工具总数","tools.agent_tools":"智能体工具箱","tools.cli_tools":"CLI 工具箱","tools.parameter_schema":"参数结构","tools.path":"路径","tools.version":"版本","tools.category":"类别","tools.load_error":"加载工具失败","cron.title":"定时任务","cron.scheduled_tasks":"定时任务","cron.add":"添加任务","cron.add_job":"添加任务","cron.add_modal_title":"添加 Cron 任务","cron.delete":"删除","cron.enable":"启用","cron.disable":"禁用","cron.name":"名称","cron.name_optional":"名称(可选)","cron.command":"命令","cron.command_required":"命令","cron.schedule":"计划","cron.schedule_required":"计划","cron.next_run":"下次执行","cron.last_run":"上次执行","cron.last_status":"上次状态","cron.enabled":"已启用","cron.enabled_status":"启用","cron.disabled_status":"禁用","cron.empty":"暂无定时任务。","cron.confirm_delete":"确定要删除此任务吗?","cron.load_error":"加载定时任务失败","cron.validation_error":"计划和命令是必需的。","cron.add_error":"添加任务失败","cron.delete_error":"删除任务失败","cron.cancel":"取消","cron.adding":"添加中...","cron.id":"ID","cron.actions":"操作","cron.loading_run_history":"加载运行历史...","cron.load_run_history_error":"加载运行历史失败","cron.no_runs":"暂无运行记录。","cron.recent_runs":"最近运行","cron.yes":"是","cron.no":"否","cron.edit":"编辑","cron.edit_modal_title":"编辑 Cron 任务","cron.edit_error":"更新任务失败","cron.saving":"保存中...","cron.save":"保存","integrations.title":"集成","integrations.available":"可用","integrations.active":"活跃","integrations.coming_soon":"即将推出","integrations.category":"类别","integrations.status":"状态","integrations.search":"搜索集成...","integrations.empty":"未找到集成。","integrations.activate":"激活","integrations.deactivate":"停用","integrations.load_error":"加载集成失败","integrations.status_active":"活跃","integrations.status_available":"可用","integrations.status_coming_soon":"即将推出","memory.title":"记忆存储","memory.memory_title":"记忆","memory.search":"搜索记忆...","memory.search_placeholder":"搜索记忆条目...","memory.add":"存储记忆","memory.add_memory":"添加记忆","memory.add_modal_title":"添加记忆","memory.delete":"删除","memory.key":"键","memory.key_required":"键","memory.content":"内容","memory.content_required":"内容","memory.category":"类别","memory.category_optional":"类别(可选)","memory.timestamp":"时间戳","memory.session":"会话","memory.score":"分数","memory.empty":"未找到记忆条目。","memory.confirm_delete":"确定要删除此记忆条目吗?","memory.all_categories":"所有类别","memory.search_button":"搜索","memory.load_error":"加载记忆失败","memory.saving":"保存中...","memory.validation_error":"键和内容是必需的。","memory.store_error":"保存记忆失败","memory.delete_error":"删除记忆失败","memory.delete_confirm":"删除?","memory.yes":"是","memory.no":"否","memory.cancel":"取消","config.title":"配置","config.save":"保存","config.saving":"保存中...","config.reset":"重置","config.saved":"配置保存成功。","config.error":"配置保存失败。","config.loading":"加载配置中...","config.editor_placeholder":"TOML 配置...","config.configuration_title":"配置","config.sensitive_title":"敏感字段已隐藏","config.sensitive_hint":"API 密钥、令牌和密码已隐藏以保护安全。要更新已隐藏的字段,请将整个隐藏值替换为您的新值。","config.save_success":"配置保存成功。","config.save_error":"保存配置失败","config.toml_label":"TOML 配置","config.lines":"行","cost.title":"成本追踪","cost.session":"会话成本","cost.daily":"每日成本","cost.monthly":"每月成本","cost.total_tokens":"总 Tokens","cost.request_count":"请求数","cost.by_model":"按模型统计","cost.model":"模型","cost.tokens":"Token","cost.requests":"请求","cost.usd":"成本(美元)","cost.load_error":"加载成本数据失败","cost.session_cost":"会话成本","cost.daily_cost":"每日成本","cost.monthly_cost":"每月成本","cost.total_requests":"总请求数","cost.token_statistics":"Token 统计","cost.avg_tokens_per_request":"平均 Token / 请求","cost.cost_per_1k_tokens":"每 1K Token 成本","cost.model_breakdown":"模型细分","cost.no_model_data":"没有模型数据可用。","cost.cost":"成本","cost.share":"占比","logs.title":"实时日志","logs.live_logs":"实时日志","logs.clear":"清除","logs.pause":"暂停","logs.resume":"继续","logs.filter":"筛选日志...","logs.filter_label":"筛选","logs.empty":"暂无日志条目。","logs.connected":"已连接","logs.disconnected":"已断开","logs.events":"事件","logs.jump_to_bottom":"跳转到底部","logs.paused_hint":"日志流已暂停。","logs.waiting_hint":"等待事件...","doctor.title":"系统诊断","doctor.diagnostics_title":"系统诊断","doctor.run":"运行诊断","doctor.run_diagnostics":"运行诊断","doctor.running":"正在运行诊断...","doctor.running_btn":"运行中...","doctor.running_desc":"正在运行诊断...","doctor.running_hint":"这可能需要几秒钟。","doctor.ok":"正常","doctor.warn":"警告","doctor.error":"错误","doctor.severity":"严重程度","doctor.category":"类别","doctor.message":"消息","doctor.empty":"尚未运行诊断。","doctor.summary":"诊断摘要","doctor.issues_found":"发现问题","doctor.warnings_summary":"警告","doctor.all_clear":"一切正常","doctor.system_diagnostics":"系统诊断","doctor.empty_hint":'点击"运行诊断"检查您的 ZeroClaw 安装。',"auth.pair":"配对设备","auth.pairing_code":"配对码","auth.pair_button":"配对","auth.logout":"退出","auth.pairing_success":"配对成功!","auth.pairing_failed":"配对失败,请重试。","auth.enter_code":"请输入配对码以连接到智能体。","common.loading":"加载中...","common.error":"发生错误。","common.retry":"重试","common.cancel":"取消","common.confirm":"确认","common.save":"保存","common.delete":"删除","common.edit":"编辑","common.close":"关闭","common.yes":"是","common.no":"否","common.search":"搜索...","common.no_data":"暂无数据。","common.refresh":"刷新","common.back":"返回","common.actions":"操作","common.name":"名称","common.description":"描述","common.status":"状态","common.created":"创建时间","common.updated":"更新时间","health.title":"系统健康","health.component":"组件","health.status":"状态","health.last_ok":"上次正常","health.last_error":"上次错误","health.restart_count":"重启次数","health.pid":"进程 ID","health.uptime":"运行时间","health.updated_at":"最后更新","dashboard.provider_model":"提供商 / 模型","dashboard.since_last_restart":"自上次重启","dashboard.paired_yes":"是","dashboard.paired_no":"否","dashboard.cost_overview":"成本概览","dashboard.active_channels":"活跃频道","dashboard.filter_active":"活跃","dashboard.filter_all":"全部","dashboard.no_active_channels":"没有活跃频道","dashboard.component_health":"组件健康","dashboard.load_error":"加载仪表盘失败","dashboard.session_label":"会话","dashboard.daily_label":"每日","dashboard.monthly_label":"每月","dashboard.total_tokens_label":"总 Tokens","dashboard.requests_label":"请求","dashboard.no_channels":"未配置频道","dashboard.active":"活跃","dashboard.inactive":"非活跃","dashboard.no_components":"没有组件报告","dashboard.restarts":"重启次数","dashboard.tab_overview":"概览","dashboard.tab_sessions":"会话","dashboard.tab_channels":"频道","dashboard.sessions_title":"活跃会话","dashboard.no_sessions":"没有活跃会话","dashboard.session_id":"会话 ID","dashboard.session_channel":"频道","dashboard.session_started":"开始时间","dashboard.session_last_activity":"最近活动","dashboard.session_status":"状态","dashboard.session_messages":"消息数","dashboard.session_details":"会话详情","dashboard.session_history":"查看历史","dashboard.channels_title":"频道状态","dashboard.no_channels_detail":"没有频道详情","dashboard.channel_type":"类型","dashboard.channel_messages":"消息数","dashboard.channel_last_message":"最近消息","dashboard.channel_config":"配置摘要","dashboard.channel_enabled":"已启用","dashboard.channel_disabled":"已禁用","dashboard.loading_sessions":"加载会话中...","dashboard.loading_channels":"加载频道中...","dashboard.load_sessions_error":"加载会话失败","dashboard.load_channels_error":"加载频道失败","dashboard.never":"从未","settings.title":"设置","settings.tab.appearance":"外观","settings.tab.typography":"排版","settings.appearance":"外观设置","settings.typography":"字体设置","settings.fontUi":"界面字体","settings.fontMono":"代码字体","settings.fontSize":"界面字号","settings.fontMonoSize":"代码字号","settings.preview":"预览","settings.previewText":"界面字体预览文本","settings.fontNote":"字体设置需要刷新页面后生效","settings.language":"界面语言","theme.mode":"主题模式","theme.accent":"强调色","theme.system":"跟随系统","theme.dark":"深色","theme.light":"浅色","theme.oled":"纯黑","console.nav.commandDeck":"指挥舱","console.nav.missionCenter":"任务中心","console.nav.skillLibrary":"技能库","console.nav.dailyReport":"日报","console.nav.settings":"设置","console.role.finance":"财务","console.role.engineering":"工程","console.role.executive":"管理","console.role.hr":"人事","console.role.sales":"销售","console.state.loading":"加载中...","console.state.empty":"暂无数据","console.state.backendDown":"后端服务不可达","console.state.partialData":"部分数据源加载失败","console.state.stale":"数据已过期","console.state.unauthorized":"未授权","console.action.refresh":"刷新","console.action.approve":"批准","console.action.reject":"驳回","console.action.retry":"重试","console.action.create":"新建任务","console.skill.capabilityLevel":"能力等级","console.skill.enable":"启用","console.skill.disable":"停用","console.skill.core":"核心","console.skill.standard":"标准","console.skill.specialized":"专业","console.skill.experimental":"实验","console.report.dailyTitle":"日报","console.report.sourceLinks":"数据来源","console.report.noEvents":"当日无执行记录"},en:{"nav.dashboard":"Dashboard","nav.plans":"Plans","nav.execution":"Execution","nav.governance":"Governance","nav.scheduler":"Scheduler","nav.skills":"Skills","nav.agent":"Agent","nav.tools":"Tools","nav.cron":"Cron Jobs","nav.integrations":"Integrations","nav.memory":"Memory","nav.config":"Configuration","nav.cost":"Cost Tracker","nav.logs":"Logs","nav.devtools":"Tools","nav.swimlane":"Swimlane","nav.doctor":"Doctor","nav.canvas":"Canvas","planb.nav.chat":"Chat","planb.nav.browser":"AI Browser","planb.nav.dashboard":"Dashboard","planb.nav.settings":"Settings","planb.nav.more":"More Tools","planb.layout.switch_to_wide":"Switch to Desktop","planb.layout.switch_to_compact":"Switch to Compact","planb.layout.pop_out":"Pop Out Window","planb.browser.title":"AI Browser","planb.browser.subtitle":"Launch SuperRPA browser automation","planb.browser.launch":"Launch Browser","planb.browser.url_placeholder":"https://example.com","planb.browser.active_sessions":"Active Sessions","planb.browser.no_sessions":"No active browser sessions. Launch one above.","planb.browser.status_launching":"Launching","planb.browser.status_running":"Running","planb.browser.status_idle":"Idle","planb.browser.status_error":"Error","planb.browser.status_stopped":"Stopped","planb.browser.launch_error":"Failed to launch browser","planb.browser.close_error":"Failed to close session","planb.browser.backend_not_configured":"SuperRPA is not configured. Set SGCLAW_SUPERRPA_PATH environment variable.","planb.chat.welcome":"How can I help you today?","planb.chat.placeholder":"Ask anything...","planb.chat.sessions":"Chat History","planb.chat.new_chat":"New Chat","planb.chat.no_sessions":"No chat history","planb.chat.untitled":"Untitled","planb.chat.thought":"Thought","planb.chat.chip_browse":"Browse Web","planb.chat.chip_code":"Write Code","planb.chat.chip_analyze":"Analyze Data","planb.chat.chip_plan":"Plan Project","planb.chat.regenerate":"Regenerate","planb.settings.quick":"Quick Settings","planb.settings.advanced":"Advanced","planb.settings.quick_hint":"Quick settings are coming soon. Use the advanced editor to modify TOML configuration for now.","planb.settings.open_advanced":"Open Advanced Editor","dashboard.title":"Dashboard","dashboard.provider":"Provider","dashboard.model":"Model","dashboard.uptime":"Uptime","dashboard.temperature":"Temperature","dashboard.gateway_port":"Gateway Port","dashboard.memory_backend":"Memory Backend","dashboard.paired":"Paired","dashboard.channels":"Channels","dashboard.health":"Health","dashboard.status":"Status","dashboard.overview":"Overview","dashboard.system_info":"System Information","dashboard.quick_actions":"Quick Actions","agent.title":"Agent Chat","agent.send":"Send","agent.placeholder":"Type a message...","agent.start_conversation":"Send a message to start the conversation","agent.type_message":"Type a message...","agent.connecting":"Connecting...","agent.connected":"Connected","agent.disconnected":"Disconnected","agent.reconnecting":"Reconnecting...","agent.thinking":"Thinking...","agent.tool_call":"Tool Call","agent.tool_result":"Tool Result","agent.connection_error":"Connection error. Attempting to reconnect...","agent.tool_call_prefix":"[Tool Call]","agent.tool_result_prefix":"[Tool Result]","agent.error_prefix":"[Error]","agent.unknown_error":"Unknown error","agent.send_error":"Failed to send message. Please try again.","agent.copy_message":"Copy message","agent.connected_status":"Connected","agent.disconnected_status":"Disconnected","tools.title":"Available Tools","tools.name":"Name","tools.description":"Description","tools.parameters":"Parameters","tools.search":"Search tools...","tools.empty":"No tools available.","tools.count":"Total tools","tools.agent_tools":"Agent Tools","tools.cli_tools":"CLI Tools","tools.parameter_schema":"Parameter Schema","tools.path":"Path","tools.version":"Version","tools.category":"Category","tools.load_error":"Failed to load tools","cron.title":"Scheduled Jobs","cron.scheduled_tasks":"Scheduled Tasks","cron.add":"Add Job","cron.add_job":"Add Job","cron.add_modal_title":"Add Cron Job","cron.delete":"Delete","cron.enable":"Enable","cron.disable":"Disable","cron.name":"Name","cron.name_optional":"Name (optional)","cron.command":"Command","cron.command_required":"Command","cron.schedule":"Schedule","cron.schedule_required":"Schedule","cron.next_run":"Next Run","cron.last_run":"Last Run","cron.last_status":"Last Status","cron.enabled":"Enabled","cron.enabled_status":"Enabled","cron.disabled_status":"Disabled","cron.empty":"No scheduled jobs.","cron.confirm_delete":"Are you sure you want to delete this job?","cron.load_error":"Failed to load cron jobs","cron.validation_error":"Schedule and command are required.","cron.add_error":"Failed to add job","cron.delete_error":"Failed to delete job","cron.cancel":"Cancel","cron.adding":"Adding...","cron.id":"ID","cron.actions":"Actions","cron.loading_run_history":"Loading run history...","cron.load_run_history_error":"Failed to load run history","cron.no_runs":"No runs recorded yet.","cron.recent_runs":"Recent Runs","cron.yes":"Yes","cron.no":"No","cron.edit":"Edit","cron.edit_modal_title":"Edit Cron Job","cron.edit_error":"Failed to update job","cron.saving":"Saving...","cron.save":"Save","integrations.title":"Integrations","integrations.available":"Available","integrations.active":"Active","integrations.coming_soon":"Coming Soon","integrations.category":"Category","integrations.status":"Status","integrations.search":"Search integrations...","integrations.empty":"No integrations found.","integrations.activate":"Activate","integrations.deactivate":"Deactivate","integrations.load_error":"Failed to load integrations","integrations.status_active":"Active","integrations.status_available":"Available","integrations.status_coming_soon":"Coming Soon","memory.title":"Memory Store","memory.memory_title":"Memory","memory.search":"Search memory...","memory.search_placeholder":"Search memory entries...","memory.add":"Store Memory","memory.add_memory":"Add Memory","memory.add_modal_title":"Add Memory","memory.delete":"Delete","memory.key":"Key","memory.key_required":"Key","memory.content":"Content","memory.content_required":"Content","memory.category":"Category","memory.category_optional":"Category (optional)","memory.timestamp":"Timestamp","memory.session":"Session","memory.score":"Score","memory.empty":"No memory entries found.","memory.confirm_delete":"Are you sure you want to delete this memory entry?","memory.all_categories":"All Categories","memory.search_button":"Search","memory.load_error":"Failed to load memory","memory.saving":"Saving...","memory.validation_error":"Key and content are required.","memory.store_error":"Failed to store memory","memory.delete_error":"Failed to delete memory","memory.delete_confirm":"Delete?","memory.yes":"Yes","memory.no":"No","memory.cancel":"Cancel","config.title":"Configuration","config.save":"Save","config.saving":"Saving...","config.reset":"Reset","config.saved":"Configuration saved successfully.","config.error":"Failed to save configuration.","config.loading":"Loading configuration...","config.editor_placeholder":"TOML configuration...","config.configuration_title":"Configuration","config.sensitive_title":"Sensitive fields are masked","config.sensitive_hint":"API keys, tokens, and passwords are hidden for security. To update a masked field, replace the entire masked value with your new value.","config.save_success":"Configuration saved successfully.","config.save_error":"Failed to save configuration","config.toml_label":"TOML Configuration","config.lines":"lines","cost.title":"Cost Tracker","cost.session":"Session Cost","cost.daily":"Daily Cost","cost.monthly":"Monthly Cost","cost.total_tokens":"Total Tokens","cost.request_count":"Requests","cost.by_model":"Cost by Model","cost.model":"Model","cost.tokens":"Tokens","cost.requests":"Requests","cost.usd":"Cost (USD)","cost.load_error":"Failed to load cost data","cost.session_cost":"Session Cost","cost.daily_cost":"Daily Cost","cost.monthly_cost":"Monthly Cost","cost.total_requests":"Total Requests","cost.token_statistics":"Token Statistics","cost.avg_tokens_per_request":"Avg Tokens / Request","cost.cost_per_1k_tokens":"Cost per 1K Tokens","cost.model_breakdown":"Model Breakdown","cost.no_model_data":"No model data available.","cost.cost":"Cost","cost.share":"Share","logs.title":"Live Logs","logs.live_logs":"Live Logs","logs.clear":"Clear","logs.pause":"Pause","logs.resume":"Resume","logs.filter":"Filter logs...","logs.filter_label":"Filter","logs.empty":"No log entries.","logs.connected":"Connected","logs.disconnected":"Disconnected","logs.events":"events","logs.jump_to_bottom":"Jump to bottom","logs.paused_hint":"Log streaming is paused.","logs.waiting_hint":"Waiting for events...","doctor.title":"System Diagnostics","doctor.diagnostics_title":"Diagnostics","doctor.run":"Run Diagnostics","doctor.run_diagnostics":"Run Diagnostics","doctor.running":"Running diagnostics...","doctor.running_btn":"Running...","doctor.running_desc":"Running diagnostics...","doctor.running_hint":"This may take a few seconds.","doctor.ok":"OK","doctor.warn":"Warning","doctor.error":"Error","doctor.severity":"Severity","doctor.category":"Category","doctor.message":"Message","doctor.empty":"No diagnostics have been run yet.","doctor.summary":"Diagnostic Summary","doctor.issues_found":"Issues Found","doctor.warnings_summary":"Warnings","doctor.all_clear":"All Clear","doctor.system_diagnostics":"System Diagnostics","doctor.empty_hint":'Click "Run Diagnostics" to check your ZeroClaw installation.',"auth.pair":"Pair Device","auth.pairing_code":"Pairing Code","auth.pair_button":"Pair","auth.logout":"Logout","auth.pairing_success":"Pairing successful!","auth.pairing_failed":"Pairing failed. Please try again.","auth.enter_code":"Enter your pairing code to connect to the agent.","common.loading":"Loading...","common.error":"An error occurred.","common.retry":"Retry","common.cancel":"Cancel","common.confirm":"Confirm","common.save":"Save","common.delete":"Delete","common.edit":"Edit","common.close":"Close","common.yes":"Yes","common.no":"No","common.search":"Search...","common.no_data":"No data available.","common.refresh":"Refresh","common.back":"Back","common.actions":"Actions","common.name":"Name","common.description":"Description","common.status":"Status","common.created":"Created","common.updated":"Updated","health.title":"System Health","health.component":"Component","health.status":"Status","health.last_ok":"Last OK","health.last_error":"Last Error","health.restart_count":"Restarts","health.pid":"Process ID","health.uptime":"Uptime","health.updated_at":"Last Updated","dashboard.provider_model":"Provider / Model","dashboard.since_last_restart":"Since last restart","dashboard.paired_yes":"Yes","dashboard.paired_no":"No","dashboard.cost_overview":"Cost Overview","dashboard.active_channels":"Active Channels","dashboard.filter_active":"Active","dashboard.filter_all":"All","dashboard.no_active_channels":"No active channels","dashboard.component_health":"Component Health","dashboard.load_error":"Failed to load dashboard","dashboard.session_label":"Session","dashboard.daily_label":"Daily","dashboard.monthly_label":"Monthly","dashboard.total_tokens_label":"Total Tokens","dashboard.requests_label":"Requests","dashboard.no_channels":"No channels configured","dashboard.active":"Active","dashboard.inactive":"Inactive","dashboard.no_components":"No components reporting","dashboard.restarts":"Restarts","dashboard.tab_overview":"Overview","dashboard.tab_sessions":"Sessions","dashboard.tab_channels":"Channels","dashboard.sessions_title":"Active Sessions","dashboard.no_sessions":"No active sessions","dashboard.session_id":"Session ID","dashboard.session_channel":"Channel","dashboard.session_started":"Started","dashboard.session_last_activity":"Last Activity","dashboard.session_status":"Status","dashboard.session_messages":"Messages","dashboard.session_details":"Session Details","dashboard.session_history":"View History","dashboard.channels_title":"Channel Status","dashboard.no_channels_detail":"No channel details available","dashboard.channel_type":"Type","dashboard.channel_messages":"Messages","dashboard.channel_last_message":"Last Message","dashboard.channel_config":"Configuration","dashboard.channel_enabled":"Enabled","dashboard.channel_disabled":"Disabled","dashboard.loading_sessions":"Loading sessions...","dashboard.loading_channels":"Loading channels...","dashboard.load_sessions_error":"Failed to load sessions","dashboard.load_channels_error":"Failed to load channels","dashboard.never":"Never","settings.title":"Settings","settings.tab.appearance":"Appearance","settings.tab.typography":"Typography","settings.appearance":"Appearance","settings.typography":"Typography","settings.fontUi":"UI Font","settings.fontMono":"Code Font","settings.fontSize":"UI Font Size","settings.fontMonoSize":"Code Font Size","settings.preview":"Preview","settings.previewText":"The quick brown fox jumps over the lazy dog.","settings.fontNote":"Font changes apply on page reload.","settings.language":"Language","theme.mode":"Theme Mode","theme.accent":"Accent Color","theme.system":"System","theme.dark":"Dark","theme.light":"Light","theme.oled":"OLED Black","console.nav.commandDeck":"Command Deck","console.nav.missionCenter":"Mission Center","console.nav.skillLibrary":"Skill Library","console.nav.dailyReport":"Daily Report","console.nav.settings":"Settings","console.role.finance":"Finance","console.role.engineering":"Engineering","console.role.executive":"Executive","console.role.hr":"HR","console.role.sales":"Sales","console.state.loading":"Loading...","console.state.empty":"No data","console.state.backendDown":"Backend unreachable","console.state.partialData":"Partial data loaded","console.state.stale":"Data stale","console.state.unauthorized":"Unauthorized","console.action.refresh":"Refresh","console.action.approve":"Approve","console.action.reject":"Reject","console.action.retry":"Retry","console.action.create":"Create","console.skill.capabilityLevel":"Capability Level","console.skill.enable":"Enable","console.skill.disable":"Disable","console.skill.core":"Core","console.skill.standard":"Standard","console.skill.specialized":"Specialized","console.skill.experimental":"Experimental","console.report.dailyTitle":"Daily Report","console.report.sourceLinks":"Source Links","console.report.noEvents":"No events today"},tr:{"nav.dashboard":"Kontrol Paneli","nav.plans":"Planlar","nav.execution":"Yürütme","nav.governance":"Yönetişim","nav.scheduler":"Zamanlayıcı","nav.skills":"Beceriler","nav.agent":"Ajan","nav.tools":"Araçlar","nav.cron":"Cron Görevleri","nav.integrations":"Entegrasyonlar","nav.memory":"Hafıza","nav.config":"Yapılandırma","nav.cost":"Maliyet Takibi","nav.logs":"Kayıtlar","nav.devtools":"Araçlar","nav.swimlane":"Yüzme Şeridi","nav.doctor":"Doktor","nav.canvas":"Tuval","planb.nav.chat":"Sohbet","planb.nav.browser":"AI Tarayıcı","planb.nav.dashboard":"Kontrol Paneli","planb.nav.settings":"Ayarlar","planb.nav.more":"Daha Fazla","planb.layout.switch_to_wide":"Masaüstüne Geç","planb.layout.switch_to_compact":"Kompakta Geç","planb.layout.pop_out":"Pencereyi Ayır","planb.browser.title":"AI Tarayıcı","planb.browser.subtitle":"SuperRPA tarayıcı otomasyonunu başlat","planb.browser.launch":"Tarayıcıyı Başlat","planb.browser.url_placeholder":"https://example.com","planb.browser.active_sessions":"Aktif Oturumlar","planb.browser.no_sessions":"Aktif tarayıcı oturumu yok.","planb.browser.status_launching":"Başlatılıyor","planb.browser.status_running":"Çalışıyor","planb.browser.status_idle":"Boşta","planb.browser.status_error":"Hata","planb.browser.status_stopped":"Durduruldu","planb.browser.launch_error":"Tarayıcı başlatılamadı","planb.browser.close_error":"Oturum kapatılamadı","planb.browser.backend_not_configured":"SuperRPA yapılandırılmamış.","planb.chat.welcome":"Bugün size nasıl yardımcı olabilirim?","planb.chat.placeholder":"Bir şey sor...","planb.chat.sessions":"Sohbet Geçmişi","planb.chat.new_chat":"Yeni Sohbet","planb.chat.no_sessions":"Sohbet geçmişi yok","planb.chat.untitled":"Başlıksız","planb.chat.thought":"Düşünce","planb.chat.chip_browse":"Webde Gezin","planb.chat.chip_code":"Kod Yaz","planb.chat.chip_analyze":"Veri Analizi","planb.chat.chip_plan":"Proje Planla","planb.chat.regenerate":"Yeniden Oluştur","planb.settings.quick":"Hızlı Ayarlar","planb.settings.advanced":"Gelişmiş","planb.settings.quick_hint":"Hızlı ayarlar yakında gelecek. Şimdilik gelişmiş düzenleyiciyi kullanın.","planb.settings.open_advanced":"Gelişmiş Düzenleyiciyi Aç","dashboard.title":"Kontrol Paneli","dashboard.provider":"Sağlayıcı","dashboard.model":"Model","dashboard.uptime":"Çalışma Süresi","dashboard.temperature":"Sıcaklık","dashboard.gateway_port":"Ağ Geçidi Portu","dashboard.locale":"Dil","dashboard.memory_backend":"Hafıza Motoru","dashboard.paired":"Eşleştirilmiş","dashboard.channels":"Kanallar","dashboard.health":"Sağlık","dashboard.status":"Durum","dashboard.overview":"Genel Bakış","dashboard.system_info":"Sistem Bilgisi","dashboard.quick_actions":"Hızlı İşlemler","dashboard.provider_model":"Sağlayıcı / Model","dashboard.since_last_restart":"Son Yeniden Başlatmadan Beri","dashboard.paired_yes":"Evet","dashboard.paired_no":"Hayır","dashboard.cost_overview":"Maliyet Genel Bakışı","dashboard.active_channels":"Aktif Kanallar","dashboard.filter_active":"Aktif","dashboard.filter_all":"Tümü","dashboard.no_active_channels":"Aktif kanal yok","dashboard.component_health":"Bileşen Sağlığı","dashboard.load_error":"Kontrol paneli yüklenemedi","dashboard.session_label":"Oturum","dashboard.daily_label":"Günlük","dashboard.monthly_label":"Aylık","dashboard.total_tokens_label":"Toplam Token","dashboard.requests_label":"İstekler","dashboard.no_channels":"Kanal yapılandırılmamış","dashboard.active":"Aktif","dashboard.inactive":"Aktif Değil","dashboard.no_components":"Bileşen raporlamıyor","dashboard.restarts":"Yeniden Başlatmalar","dashboard.tab_overview":"Genel Bakış","dashboard.tab_sessions":"Oturumlar","dashboard.tab_channels":"Kanallar","dashboard.sessions_title":"Aktif Oturumlar","dashboard.no_sessions":"Aktif oturum yok","dashboard.session_id":"Oturum Kimliği","dashboard.session_channel":"Kanal","dashboard.session_started":"Başlangıç","dashboard.session_last_activity":"Son Etkinlik","dashboard.session_status":"Durum","dashboard.session_messages":"Mesajlar","dashboard.session_details":"Oturum Ayrıntıları","dashboard.session_history":"Geçmişi Görüntüle","dashboard.channels_title":"Kanal Durumu","dashboard.no_channels_detail":"Kanal ayrıntısı yok","dashboard.channel_type":"Tür","dashboard.channel_messages":"Mesajlar","dashboard.channel_last_message":"Son Mesaj","dashboard.channel_config":"Yapılandırma","dashboard.channel_enabled":"Etkin","dashboard.channel_disabled":"Devre Dışı","dashboard.loading_sessions":"Oturumlar yükleniyor...","dashboard.loading_channels":"Kanallar yükleniyor...","dashboard.load_sessions_error":"Oturumlar yüklenemedi","dashboard.load_channels_error":"Kanallar yüklenemedi","dashboard.never":"Hiç","agent.title":"Ajan Sohbeti","agent.send":"Gönder","agent.placeholder":"Bir mesaj yazın...","agent.start_conversation":"Sohbeti başlatmak için mesaj gönderin","agent.type_message":"Bir mesaj yazın...","agent.connecting":"Bağlanıyor...","agent.connected":"Bağlandı","agent.disconnected":"Bağlantı kesildi","agent.reconnecting":"Yeniden bağlanıyor...","agent.thinking":"Düşünüyor...","agent.tool_call":"Araç Çağrısı","agent.tool_result":"Araç Sonucu","agent.connection_error":"Bağlantı hatası. Yeniden bağlanmaya çalışılıyor...","agent.tool_call_prefix":"[Araç Çağrısı]","agent.tool_result_prefix":"[Araç Sonucu]","agent.error_prefix":"[Hata]","agent.unknown_error":"Bilinmeyen hata","agent.send_error":"Mesaj gönderilemedi. Lütfen tekrar deneyin.","agent.copy_message":"Mesajı kopyala","agent.connected_status":"Bağlandı","agent.disconnected_status":"Bağlantı kesildi","tools.title":"Mevcut Araçlar","tools.name":"Ad","tools.description":"Açıklama","tools.parameters":"Parametreler","tools.search":"Araç ara...","tools.empty":"Araç bulunamadı.","tools.count":"Toplam araç","tools.agent_tools":"Ajan Araçları","tools.cli_tools":"CLI Araçları","tools.parameter_schema":"Parametre Şeması","tools.path":"Yol","tools.version":"Sürüm","tools.category":"Kategori","tools.load_error":"Araçlar yüklenemedi","cron.title":"Zamanlanmış Görevler","cron.scheduled_tasks":"Zamanlanmış Görevler","cron.add":"Görev Ekle","cron.add_job":"Görev Ekle","cron.add_modal_title":"Cron Görevi Ekle","cron.delete":"Sil","cron.enable":"Etkinleştir","cron.disable":"Devre Dışı Bırak","cron.name":"Ad","cron.name_optional":"Ad (isteğe bağlı)","cron.command":"Komut","cron.command_required":"Komut","cron.schedule":"Zamanlama","cron.schedule_required":"Zamanlama","cron.next_run":"Sonraki Çalıştırma","cron.last_run":"Son Çalıştırma","cron.last_status":"Son Durum","cron.enabled":"Etkin","cron.enabled_status":"Etkin","cron.disabled_status":"Devre Dışı","cron.empty":"Zamanlanmış görev bulunamadı.","cron.confirm_delete":"Bu görevi silmek istediğinizden emin misiniz?","cron.load_error":"Cron görevleri yüklenemedi","cron.validation_error":"Zamanlama ve komut gereklidir.","cron.add_error":"Görev eklenemedi","cron.delete_error":"Görev silinemedi","cron.cancel":"İptal","cron.adding":"Ekleniyor...","cron.id":"ID","cron.actions":"İşlemler","cron.loading_run_history":"Çalıştırma geçmişi yükleniyor...","cron.load_run_history_error":"Çalıştırma geçmişi yüklenemedi","cron.no_runs":"Henüz çalıştırma kaydı yok.","cron.recent_runs":"Son Çalıştırmalar","cron.yes":"Evet","cron.no":"Hayır","cron.edit":"Düzenle","cron.edit_modal_title":"Cron Görevini Düzenle","cron.edit_error":"Görev güncellenemedi","cron.saving":"Kaydediliyor...","cron.save":"Kaydet","integrations.title":"Entegrasyonlar","integrations.available":"Mevcut","integrations.active":"Aktif","integrations.coming_soon":"Yakında","integrations.category":"Kategori","integrations.status":"Durum","integrations.search":"Entegrasyon ara...","integrations.empty":"Entegrasyon bulunamadı.","integrations.activate":"Etkinleştir","integrations.deactivate":"Devre Dışı Bırak","integrations.load_error":"Entegrasyonlar yüklenemedi","integrations.all":"Tümü","integrations.status_active":"Aktif","integrations.status_available":"Mevcut","integrations.status_coming_soon":"Yakında","memory.title":"Hafıza Deposu","memory.memory_title":"Hafıza","memory.search":"Hafıza ara...","memory.search_placeholder":"Hafıza girişleri ara...","memory.add":"Hafıza Ekle","memory.add_memory":"Hafıza Ekle","memory.add_modal_title":"Hafıza Ekle","memory.delete":"Sil","memory.key":"Anahtar","memory.key_required":"Anahtar","memory.content":"İçerik","memory.content_required":"İçerik","memory.category":"Kategori","memory.category_optional":"Kategori (isteğe bağlı)","memory.timestamp":"Zaman Damgası","memory.session":"Oturum","memory.score":"Puan","memory.empty":"Hafıza girişi bulunamadı.","memory.confirm_delete":"Bu hafıza girişini silmek istediğinizden emin misiniz?","memory.all_categories":"Tüm Kategoriler","memory.search_button":"Ara","memory.load_error":"Hafıza yüklenemedi","memory.saving":"Kaydediliyor...","memory.validation_error":"Anahtar ve içerik gereklidir.","memory.store_error":"Hafıza kaydedilemedi","memory.delete_error":"Hafıza silinemedi","memory.delete_confirm":"Sil?","memory.yes":"Evet","memory.no":"Hayır","memory.cancel":"İptal","config.title":"Yapılandırma","config.save":"Kaydet","config.saving":"Kaydediliyor...","config.reset":"Sıfırla","config.saved":"Yapılandırma başarıyla kaydedildi.","config.error":"Yapılandırma kaydedilemedi.","config.loading":"Yapılandırma yükleniyor...","config.editor_placeholder":"TOML yapılandırması...","config.configuration_title":"Yapılandırma","config.sensitive_title":"Hassas alanlar gizlendi","config.sensitive_hint":"API anahtarları, belirteçler ve parolalar güvenlik için gizlendi. Maskeli bir alanı güncellemek için, tüm maskeli değeri yeni değerinizle değiştirin.","config.save_success":"Yapılandırma başarıyla kaydedildi.","config.save_error":"Yapılandırma kaydedilemedi","config.toml_label":"TOML Yapılandırması","config.lines":"satır","cost.title":"Maliyet Takibi","cost.session":"Oturum Maliyeti","cost.daily":"Günlük Maliyet","cost.monthly":"Aylık Maliyet","cost.total_tokens":"Toplam Token","cost.request_count":"İstek Sayısı","cost.by_model":"Modele Göre Maliyet","cost.model":"Model","cost.tokens":"Token","cost.requests":"İstekler","cost.usd":"Maliyet (USD)","cost.load_error":"Maliyet verileri yüklenemedi","cost.session_cost":"Oturum Maliyeti","cost.daily_cost":"Günlük Maliyet","cost.monthly_cost":"Aylık Maliyet","cost.total_requests":"Toplam İstek","cost.token_statistics":"Token İstatistikleri","cost.avg_tokens_per_request":"Ortalama Token / İstek","cost.cost_per_1k_tokens":"1K Token Başına Maliyet","cost.model_breakdown":"Model Detayı","cost.no_model_data":"Model verisi mevcut değil.","cost.cost":"Maliyet","cost.share":"Pay","logs.title":"Canlı Kayıtlar","logs.live_logs":"Canlı Kayıtlar","logs.clear":"Temizle","logs.pause":"Duraklat","logs.resume":"Devam Et","logs.filter":"Kayıtları filtrele...","logs.filter_label":"Filtre","logs.empty":"Kayıt girişi bulunamadı.","logs.connected":"Bağlandı","logs.disconnected":"Bağlantı kesildi","logs.events":"olay","logs.jump_to_bottom":"En alta atla","logs.paused_hint":"Kayıt akışı duraklatıldı.","logs.waiting_hint":"Olay bekleniyor...","doctor.title":"Sistem Tanıları","doctor.diagnostics_title":"Tanılar","doctor.run":"Tanı Çalıştır","doctor.run_diagnostics":"Tanı Çalıştır","doctor.running":"Tanı çalıştırılıyor...","doctor.running_btn":"Çalıştırılıyor...","doctor.running_desc":"Tanı çalıştırılıyor...","doctor.running_hint":"Bu birkaç saniye sürebilir.","doctor.ok":"Tamam","doctor.warn":"Uyarı","doctor.error":"Hata","doctor.severity":"Şiddet","doctor.category":"Kategori","doctor.message":"Mesaj","doctor.empty":"Henüz tanı çalıştırılmadı.","doctor.summary":"Tanı Özeti","doctor.issues_found":"Sorunlar Bulundu","doctor.warnings_summary":"Uyarılar","doctor.all_clear":"Her Şey Yolunda","doctor.system_diagnostics":"Sistem Tanıları","doctor.empty_hint":'ZeroClaw kurulumunuzu kontrol etmek için "Tanı Çalıştır" düğmesine tıklayın.',"auth.pair":"Cihaz Eşleştir","auth.pairing_code":"Eşleştirme Kodu","auth.pair_button":"Eşleştir","auth.logout":"Çıkış Yap","auth.pairing_success":"Eşleştirme başarılı!","auth.pairing_failed":"Eşleştirme başarısız. Lütfen tekrar deneyin.","auth.enter_code":"Akıllı birine bağlanmak için eşleştirme kodunuzu girin.","common.loading":"Yükleniyor...","common.error":"Bir hata oluştu.","common.retry":"Tekrar Dene","common.cancel":"İptal","common.confirm":"Onayla","common.save":"Kaydet","common.delete":"Sil","common.edit":"Düzenle","common.close":"Kapat","common.yes":"Evet","common.no":"Hayır","common.search":"Ara...","common.no_data":"Veri mevcut değil.","common.refresh":"Yenile","common.back":"Geri","common.actions":"İşlemler","common.name":"Ad","common.description":"Açıklama","common.status":"Durum","common.created":"Oluşturulma","common.updated":"Güncellenme","health.title":"Sistem Sağlığı","health.component":"Bileşen","health.status":"Durum","health.last_ok":"Son Başarılı","health.last_error":"Son Hata","health.restart_count":"Yeniden Başlatmalar","health.pid":"İşlem Kimliği","health.uptime":"Çalışma Süresi","health.updated_at":"Son Güncelleme","settings.title":"Ayarlar","settings.tab.appearance":"Görünüm","settings.tab.typography":"Tipografi","settings.appearance":"Görünüm","settings.typography":"Tipografi","settings.fontUi":"Arayüz Yazı Tipi","settings.fontMono":"Kod Yazı Tipi","settings.fontSize":"Arayüz Boyutu","settings.fontMonoSize":"Kod Boyutu","settings.preview":"Önizleme","settings.previewText":"Tembel köpek üzerinde hızlı kahverengi tilki zıplar.","settings.fontNote":"Yazı tipi değişiklikleri sayfa yeniden yüklendikten sonra geçerli olur.","settings.language":"Dil","theme.mode":"Tema Modu","theme.accent":"Vurgu Rengi","theme.system":"Sistem","theme.dark":"Koyu","theme.light":"Açık","theme.oled":"OLED Siyah","console.nav.commandDeck":"Command Deck","console.nav.missionCenter":"Mission Center","console.nav.skillLibrary":"Skill Library","console.nav.dailyReport":"Daily Report","console.nav.settings":"Settings","console.role.finance":"Finance","console.role.engineering":"Engineering","console.role.executive":"Executive","console.role.hr":"HR","console.role.sales":"Sales","console.state.loading":"Loading...","console.state.empty":"No data","console.state.backendDown":"Backend unreachable","console.state.partialData":"Partial data loaded","console.state.stale":"Data stale","console.state.unauthorized":"Unauthorized","console.action.refresh":"Refresh","console.action.approve":"Approve","console.action.reject":"Reject","console.action.retry":"Retry","console.action.create":"Create","console.skill.capabilityLevel":"Capability Level","console.skill.enable":"Enable","console.skill.disable":"Disable","console.skill.core":"Core","console.skill.standard":"Standard","console.skill.specialized":"Specialized","console.skill.experimental":"Experimental","console.report.dailyTitle":"Daily Report","console.report.sourceLinks":"Source Links","console.report.noEvents":"No events today"}};let C1="zh";function vd(a){var i;return((i=Sg[C1])==null?void 0:i[a])??Sg.en[a]??a}const gc=["qimingclaw-client-readiness","qimingclaw-remote-task-ingress","qimingclaw-daily-report"],D1=[{key:"all",label:"全部委托"},{key:"daily",label:"日常任务"},{key:"weekly",label:"周任务"},{key:"monthly",label:"月度任务"},{key:"adhoc",label:"临时任务"}];function bd(a){const i=typeof a.updated_at=="string"?a.updated_at:typeof a.created_at=="string"?a.created_at:"",s=i?new Date(i).getTime():0;return Number.isFinite(s)?s:0}function bl(a){if(!a)return"";const i=new Date(a);return Number.isNaN(i.getTime())?"":[i.getFullYear(),String(i.getMonth()+1).padStart(2,"0"),String(i.getDate()).padStart(2,"0")].join("-")}function gl(){return bl(new Date().toISOString())}function xg(a,i){const s=a?new Date(`${a}T12:00:00`):new Date;return Number.isNaN(s.getTime())?gl():(s.setDate(s.getDate()+i),bl(s.toISOString()))}function Qd(a){const i=`${a.title} ${a.id}`.match(/(?:^|\D)(\d{1,2})[::](\d{2})(?:\D|$)/);if(!i)return null;const s=Number(i[1]),c=Number(i[2]);return!Number.isInteger(s)||!Number.isInteger(c)||s>23||c>59?null:{text:`${String(s).padStart(2,"0")}:${String(c).padStart(2,"0")}`,minutes:s*60+c}}function Kd(a){return a.steps.flatMap(i=>i.tasks.flatMap(s=>[s.startedAt,s.finishedAt])).filter(i=>!!i)}function z1(a,i){return Kd(a).map(bl).filter(Boolean).includes(i)||Qd(a)?!0:[a.updatedAt,a.createdAt].map(bl).includes(i)}function R1(a){return Qd(a)&&`${a.title}`.trim().toLowerCase()||a.id}function M1(a,i){return Kd(a).some(s=>bl(s)===i)}function jg(a,i){const s=M1(a,i)?1e4:0,c=gc.includes(a.id)?1e3:0,d=[a.updatedAt,a.createdAt].map(bl).includes(i)?100:0;return s+c+d+bd({updated_at:a.updatedAt||"",created_at:a.createdAt||""})/1e13}function O1(a,i){const s=new Map;for(const c of a){const d=R1(c),f=s.get(d);(!f||jg(c,i)>jg(f,i))&&s.set(d,c)}return Array.from(s.values())}function wg(a,i){const s=Qd(a);if(s)return s.minutes;const c=Kd(a).filter(d=>bl(d)===i).sort();if(c[0]){const d=new Date(c[0]);return d.getHours()*60+d.getMinutes()}return 1440}function $1(a){const i=`${a.id} ${a.title} ${a.objective}`.toLowerCase();return i.includes("month")||i.includes("monthly")||i.includes("月")?"monthly":i.includes("week")||i.includes("weekly")||i.includes("周")?"weekly":i.includes("临时")||i.includes("adhoc")||i.includes("hotlist")||i.includes("monitor")?"adhoc":"daily"}async function Dy(a,i,s={}){const c=Date.now(),d=await md({command_kind:a,context_refs:i,payload:{source:"digital-mission-center",...s},correlation_id:`mission-${a}-${c}`,idempotency_key:`mission-${a}-${Object.values(i).join("-")||"new"}-${c}`});if(!d.accepted)throw new Error(d.message||`command 未被接受:${d.command_id||a}`);return d}async function vn(a,i,s={}){return Dy(i,{plan_id:a},s)}async function Eg(a){const i=a.sourceIds.planId;if(!i)return null;const s=a.status.toLowerCase();if(s==="draft")await vn(i,"submit_plan",{requested_action:"mission_dispatch"}),await vn(i,"approve_plan",{requested_action:"mission_dispatch"});else if(s==="reviewing")await vn(i,"approve_plan",{requested_action:"mission_dispatch"});else if(!["approved","active","running"].includes(s))return await vn(i,"amend_plan",{requested_action:"reopen_for_execution",summary:"数字员工任务中心请求重新执行任务"}),null;return await vn(i,"activate_plan",{requested_action:"mission_dispatch"}),i}function q1(a){const i=a.steps.map((s,c)=>{const d=new Set;s.preferredSkills.forEach(h=>{h.trim()&&d.add(h)}),s.tasks.forEach(h=>{var _;(_=h.assignedSkillId)!=null&&_.trim()&&d.add(h.assignedSkillId)});const f=[s.description,...s.tasks.map(h=>h.description),s.title,a.objective,a.title].find(h=>typeof h=="string"&&h.trim());return{title:s.title||`${a.title} 第 ${c+1} 步`,description:f||s.title||a.objective||a.title,skills:Array.from(d),depends_on:c===0?[]:[`step-${c}`]}}).filter(s=>s.skills.length>0);if(i.length===0)throw new Error("当前任务没有可复用的 skill,不能创建真实重新执行计划。");return i}function zy(a){return`${a.replace(/(\s*重新执行)+$/u,"").trim()||a} 重新执行`}async function L1(a){var d,f;const i=await Dy("create_plan",{session_id:"digital-mission-center",plan_id:a.sourceIds.planId||a.id},{requested_action:"mission_restart",title:zy(a.title),description:a.objective||a.title,steps:q1(a),original_plan_id:a.sourceIds.planId||a.id}),s=typeof((d=i.result)==null?void 0:d.plan_id)=="string"?i.result.plan_id:"";if(!s)throw new Error("重新执行计划已提交,但后端没有返回 plan_id。");const c=typeof((f=i.result)==null?void 0:f.status)=="string"?i.result.status.toLowerCase():"";return c==="draft"?(await vn(s,"submit_plan",{requested_action:"mission_restart"}),await vn(s,"approve_plan",{requested_action:"mission_restart"}),await vn(s,"activate_plan",{requested_action:"mission_restart"})):c==="reviewing"?(await vn(s,"approve_plan",{requested_action:"mission_restart"}),await vn(s,"activate_plan",{requested_action:"mission_restart"})):c==="approved"&&await vn(s,"activate_plan",{requested_action:"mission_restart"}),s}function U1({focusMissionId:a,focusTaskId:i,focusDate:s}){const c=s||gl(),[d,f]=b.useState([]),[h,_]=b.useState(null),[p,g]=b.useState(!0),[j,S]=b.useState(!1),[E,$]=b.useState("all"),[A,O]=b.useState(()=>c),[R,q]=b.useState(!1),[F,Z]=b.useState(null),[P,te]=b.useState(!1),[he,K]=b.useState(null),[ie,ne]=b.useState(null),[be,Be]=b.useState(null),Re=b.useRef(null),Q=b.useRef(!1);b.useEffect(()=>(Q.current=!0,()=>{Q.current=!1}),[]);const re=b.useCallback(async()=>{g(!0),S(!1);try{const X=await ax();if(!Q.current)return[];const W=new Map,Me=Te=>{const tt=typeof Te.plan_id=="string"?Te.plan_id:"";tt&&!W.has(tt)&&W.set(tt,Te)};(Array.isArray(X)?X:[]).forEach(Me);const Oe=gc.filter(Te=>!W.has(Te));if(Oe.length>0){const Te=await Promise.allSettled(Oe.map(async tt=>({id:tt,plans:await Jp(tt,20)})));for(const tt of Te)if(tt.status==="fulfilled"){const Un=tt.value.plans.find(bi=>bi.plan_id===tt.value.id);Un&&Me(Un)}}const xe=gc.map(Te=>W.get(Te)).filter(Te=>!!Te),yt=[...[...W.entries()].filter(([Te])=>!gc.includes(Te)).map(([,Te])=>Te).sort((Te,tt)=>bd(tt)-bd(Te)),...xe];if(yt.length>0){const Te=ug(yt);return f(Te),Te}return f([]),[]}catch(X){return Q.current?(console.error("[MissionCenter] fetch failed:",X),f([]),S(!0),[]):[]}finally{Q.current&&g(!1)}},[]);b.useEffect(()=>{re()},[re]),b.useEffect(()=>{O(s||gl()),q(!1)},[s]);const L=b.useCallback(X=>{_(X),ne(X.id),window.setTimeout(()=>{var W;(W=Re.current)==null||W.scrollIntoView({block:"start",inline:"nearest",behavior:"smooth"})},40)},[]),N=b.useCallback(X=>{L(X),Be({kind:"selected",missionId:X.id,title:X.title,planId:X.sourceIds.planId})},[L]);b.useEffect(()=>{if(!a&&!i)return;const X=d.find(W=>W.id===a||W.sourceIds.planId===a||(i?W.sourceIds.taskIds.includes(i):!1));X&&($("all"),N(X),window.setTimeout(()=>{var W;(W=document.getElementById(`mission-card-${$c(X.id)}`))==null||W.scrollIntoView({block:"center",behavior:"smooth"})},80))},[a,i,d,N]);const Y=b.useCallback(async X=>{if(Z(X.id),S(!1),K(null),!X.sourceIds.planId){K("当前任务没有 qimingclaw Plan 记录,无法委托执行。"),Z(null);return}try{const W=await Eg(X),Me=await re();if($("all"),W){const Oe=Me.find(xe=>xe.id===W||xe.sourceIds.planId===W);if(Oe)L(Oe),Be({kind:"dispatched",missionId:Oe.id,title:Oe.title,planId:W});else{const xe=await Jp(W,5),kt=ug(xe).find(yt=>yt.id===W);kt?(L(kt),Be({kind:"dispatched",missionId:kt.id,title:kt.title,planId:W})):_(null)}}else _(Oe=>(Oe==null?void 0:Oe.id)===X.id?null:Oe)}catch(W){console.error("[MissionCenter] dispatch failed:",W),S(!1),K(W instanceof Error?W.message:"任务委托失败")}finally{Z(null)}},[re,L]),ae=b.useCallback(async X=>{if(Z(X.id),S(!1),K(null),!X.sourceIds.planId){K("当前任务没有 qimingclaw Plan 记录,无法重新执行。"),Z(null);return}try{const W=await L1(X),Me=await re();$("all");const Oe=Me.find(xe=>xe.id===W||xe.sourceIds.planId===W);Oe?(L(Oe),Be({kind:"created",missionId:Oe.id,title:Oe.title,planId:W})):(ne(W),Be({kind:"created",missionId:W,title:zy(X.title),planId:W}))}catch(W){console.error("[MissionCenter] restart failed:",W),S(!1),K(W instanceof Error?W.message:"重新执行失败")}finally{Z(null)}},[re,L]),me=A||gl(),Se=O1(R?d:d.filter(X=>z1(X,me)),me),w=Se.filter(X=>X.sourceIds.planId&&["draft","reviewing","approved"].includes(X.status.toLowerCase())),B=b.useCallback(async()=>{if(w.length!==0){te(!0),S(!1);try{for(const X of w)Z(X.id),await Eg(X);await re(),_(null)}catch(X){console.error("[MissionCenter] batch dispatch failed:",X),S(!1),K(X instanceof Error?X.message:"批量委托失败")}finally{Z(null),te(!1)}}},[re,w]),I=(E==="all"?Se:Se.filter(X=>$1(X)===E)).map((X,W)=>({mission:X,index:W})).sort((X,W)=>{const Me=Oe=>(Oe.id===ie?2:0)+(Oe.id===(h==null?void 0:h.id)?1:0);return Me(W.mission)-Me(X.mission)||wg(X.mission,me)-wg(W.mission,me)||X.index-W.index}).map(({mission:X})=>X),de=(be==null?void 0:be.kind)==="created"?"刚创建重新执行任务":(be==null?void 0:be.kind)==="dispatched"?"刚委托执行任务":"当前查看任务",_e=X=>X.id!==ie?null:(be==null?void 0:be.missionId)===X.id&&be.kind==="created"?"刚创建":(be==null?void 0:be.missionId)===X.id&&be.kind==="dispatched"?"刚委托":"当前查看";return u.jsx("div",{className:"de-mission-center-page",children:u.jsxs("div",{className:"de-mission-center-layout",children:[u.jsx("div",{className:"de-mc-list",children:u.jsxs(Os,{children:[u.jsxs(Oc,{title:"任务委托",children:[u.jsx("button",{onClick:B,className:"de-btn-primary de-btn-sm",disabled:P||w.length===0,children:P?"委托中...":`委托可执行任务(${w.length})`}),u.jsx("button",{onClick:re,className:"de-btn-secondary de-btn-sm",children:vd("console.action.refresh")})]}),u.jsxs("div",{className:"de-card-body",children:[he&&u.jsx("div",{className:"de-schedule-result de-schedule-result--error",style:{marginBottom:12},children:he}),be&&u.jsxs("div",{className:"de-mission-focus-notice",children:[u.jsx("strong",{children:de}),u.jsx("span",{children:be.title}),be.planId&&u.jsx("code",{children:be.planId})]}),u.jsxs("div",{className:"de-date-filter-row",children:[u.jsxs("label",{className:"de-date-filter-field",children:[u.jsx("span",{children:"选择日期"}),u.jsx("input",{type:"date",value:me,onChange:X=>{q(!1),O(X.target.value||gl())}})]}),u.jsxs("div",{className:"de-date-filter-actions","aria-label":"日期切换",children:[u.jsx("button",{type:"button",className:"de-filter-chip",onClick:()=>{q(!1),O(xg(me,-1))},children:"前一天"}),u.jsx("button",{type:"button",className:"de-filter-chip active",onClick:()=>{q(!1),O(gl())},children:"今天"}),u.jsx("button",{type:"button",className:"de-filter-chip",onClick:()=>{q(!1),O(xg(me,1))},children:"后一天"})]}),u.jsx("span",{className:"de-date-filter-summary",children:R?`全部 ${Se.length} 项任务`:`${Se.length} 项任务`})]}),u.jsx("div",{className:"de-filter-row",children:D1.map(X=>u.jsx("button",{className:`de-filter-chip ${E===X.key?"active":""}`,onClick:()=>$(X.key),children:X.label},X.key))}),p?u.jsx("div",{className:"de-loading-skeleton",style:{height:300}}):j?u.jsx("p",{className:"de-empty-text",children:vd("console.state.backendDown")}):I.length===0?u.jsxs("div",{className:"de-mission-empty-panel",children:[u.jsx("strong",{children:"当前日期暂无任务"}),u.jsx("p",{children:"这个日期没有匹配到 qimingclaw 任务记录,可以临时查看全部任务。"}),u.jsxs("div",{className:"de-mission-empty-actions",children:[u.jsx("button",{type:"button",className:"de-btn-primary de-btn-sm",onClick:()=>{q(!0),$("all")},children:"查看全部任务"}),u.jsx("button",{type:"button",className:"de-btn-secondary de-btn-sm",onClick:()=>{q(!1),O(s||gl())},children:"返回当前日期"})]})]}):u.jsx("div",{className:"de-mc-card-list",children:I.map(X=>u.jsx(x1,{mission:X,selected:(h==null?void 0:h.id)===X.id,focusLabel:_e(X),dateFilter:me,running:F===X.id,onSelect:N,onRun:Y,onRestart:ae},X.id))})]})]})}),u.jsx("div",{className:"de-mc-detail",ref:Re,children:h?u.jsx(N1,{mission:h,onClose:()=>_(null)}):u.jsx(Os,{children:u.jsx("div",{className:"de-card-body",children:u.jsxs("div",{className:"de-mission-empty-panel de-mission-empty-panel--detail",children:[u.jsx("strong",{children:"选择一个任务后,右侧会显示执行步骤、运行记录和交付结果。"}),u.jsx("p",{children:"任务详情会优先展示 qimingclaw 本地 Plan / Task / Run / Event 记录,以及从执行 payload 中整理出的产物线索。"})]})})})})]})})}const B1=[{value:"all",label:"全部任务"},{value:"daily",label:"日常任务"},{value:"weekly",label:"周任务"},{value:"monthly",label:"月度任务"},{value:"adhoc",label:"临时任务"}],H1={daily:"日常",weekly:"周",monthly:"月度",adhoc:"临时"},G1={allow:"白名单",deny:"黑名单",open:"开放",disabled:"停用"};function Ry(a){const i=`${a.id} ${a.name} ${a.description} ${a.category}`.toLowerCase();return/weekly|week|周/.test(i)?"weekly":/monthly|month|月报|月度/.test(i)?"monthly":/monitor|crawler|巡检|监控|待办|日程|日报|日终|收件箱|工作台|客户跟进/.test(i)?"daily":"adhoc"}function ld(a){const i=`${a.id} ${a.name} ${a.description} ${a.category}`.toLowerCase();return a.capabilityLevel==="specialized"||a.capabilityLevel==="experimental"||/加密|深度|分析|自动化|部署|代码|审查|调研|批量|converter|crypto|github|deploy|review|research/.test(i)}function Y1(a){const i=`${a.id} ${a.name} ${a.description} ${a.category}`.toLowerCase();return/日报|周报|报表|待办|日程|巡检|客户|知识库|经营|费用|收件箱|工作台/.test(i)}function Q1(a){const i=a.name,s=`${a.id} ${a.name} ${a.description} ${a.category}`.toLowerCase();return/report|报表|日报|周报|月报|汇报/.test(s)?`自动整理${i}材料,减少手工汇总和重复填报。`:/monitor|巡检|监控|预警/.test(s)?`按约定频率完成${i},及时提示异常和遗漏。`:/todo|待办|task|看板|日程/.test(s)?`帮你梳理${i},把后续处理事项集中呈现。`:/客户|crm|回访|满意/.test(s)?"汇总客户相关信息,形成可直接跟进的处理建议。":/知识|文档|制度|模板/.test(s)?"查找和核对资料内容,减少人工翻找和版本确认。":a.description}function K1(a,i,s){return a.enabled?"已学习":a.enabled?s?"需确认后学习":i?"建议学习":"可学习":"暂不使用"}function X1(a){var s,c;const i=[];return a.serverId&&i.push(a.serverId),a.running!==null&&a.running!==void 0&&i.push(a.running?"运行中":"未运行"),a.governancePolicy&&i.push(G1[a.governancePolicy]),typeof a.toolCount=="number"&&i.push(`${a.toolCount} 工具`),(s=a.allowTools)!=null&&s.length&&i.push(`allow ${a.allowTools.length}`),(c=a.denyTools)!=null&&c.length&&i.push(`deny ${a.denyTools.length}`),i.slice(0,5)}function Z1(a){var c;const i=(c=a.recentCalls)==null?void 0:c[0];return i?`${i.toolName?`${i.toolName} · `:""}${i.message||i.status||"最近调用"}`:typeof a.callCount=="number"&&a.callCount>0?`${a.callCount} 次调用`:null}function V1({skill:a,recommended:i=!1,advanced:s=!1,selected:c=!1,updating:d=!1,onSelect:f,onToggle:h}){const _=Ry(a),p=K1(a,i,s),g=X1(a),j=Z1(a);return u.jsxs("div",{id:`skill-card-${$c(a.id)}`,className:`de-skill-card ${c?"de-skill-card--selected":""}`,role:"button",tabIndex:0,onClick:()=>f==null?void 0:f(a),onKeyDown:S=>{(S.key==="Enter"||S.key===" ")&&(S.preventDefault(),f==null||f(a))},children:[u.jsxs("div",{className:"de-skill-card-head",children:[u.jsx("span",{className:"de-skill-name",children:a.name}),u.jsx("span",{className:`de-skill-status ${a.enabled?"enabled":"disabled"}`,children:p})]}),u.jsx("p",{className:"de-skill-desc",children:Q1(a)}),g.length>0&&u.jsx("div",{className:"de-skill-meta-row",children:g.map(S=>u.jsx("span",{className:"de-skill-meta-chip",children:S},S))}),j&&u.jsxs("p",{className:"de-skill-recent",children:["最近:",j]}),u.jsxs("div",{className:"de-skill-card-foot",children:[u.jsxs("span",{className:"de-skill-version",children:["适用任务:",H1[_]]}),u.jsx("button",{className:`de-skill-btn ${a.enabled?"de-skill-btn--danger":""}`,disabled:d,title:a.enabled?"暂时停用此技能,后续路由不会选择它。":"恢复使用此技能。",onClick:S=>{S.stopPropagation(),d||h==null||h(a)},children:d?"处理中...":a.enabled?"暂不使用":"恢复使用"})]})]})}function J1({focusSkillId:a}){const[i,s]=b.useState([]),[c,d]=b.useState(!0),[f,h]=b.useState(!1),[_,p]=b.useState(""),[g,j]=b.useState("all"),[S,E]=b.useState(a??null),[$,A]=b.useState(null),[O,R]=b.useState(null),q=b.useRef(!1);b.useEffect(()=>(q.current=!0,()=>{q.current=!1}),[]);const F=b.useCallback(async()=>{d(!0),h(!1);try{const L=await sx();if(!q.current)return;s(Array.isArray(L)?r1(L):[])}catch(L){if(!q.current)return;console.error("[SkillLibrary] fetch failed:",L),s([]),h(!0)}finally{q.current&&d(!1)}},[]);b.useEffect(()=>{F()},[F]),b.useEffect(()=>{a&&(E(a),j("all"),p(""),window.setTimeout(()=>{var L;(L=document.getElementById(`skill-card-${$c(a)}`))==null||L.scrollIntoView({block:"center",behavior:"smooth"})},80))},[a,i.length]);const Z=b.useCallback(async L=>{const N=!L.enabled;A(L.id),R(null);try{const Y=await rx(L.id,N);if(!Y.ok)throw new Error(Y.error||"技能状态变更失败");s(ae=>ae.map(me=>me.id===L.id?{...me,enabled:N}:me)),E(L.id)}catch(Y){R(Y instanceof Error?Y.message:"技能状态变更失败")}finally{A(null)}},[]),P=i.filter(L=>g==="all"||Ry(L)===g).filter(L=>_?[L.name,L.description,L.category,L.serverId,...L.tools??[],...L.allowTools??[],...L.denyTools??[]].filter(Boolean).join(" ").includes(_):!0),te=P.filter(ld),he=new Set(te.map(L=>L.id)),K=P.filter(L=>L.enabled&&!he.has(L.id)),ie=P.filter(L=>!L.enabled&&Y1(L)&&!ld(L)),ne=P.filter(L=>!L.enabled&&!ld(L)),be=(ie.length>0?ie:ne).slice(0,4),Be=new Set(be.map(L=>L.id)),Re=ne.filter(L=>!Be.has(L.id)),Q=[{key:"recommended",title:"推荐学习",hint:"优先补齐高频工作能力,适合让数字员工尽快接手重复事务。",skills:be,emptyText:"暂无推荐学习项。"},{key:"learnable",title:"可学习技能",hint:"可纳入数字员工日常工作的业务能力,学习入口待接入后启用。",skills:Re,emptyText:"当前没有可学习技能。"},{key:"learned",title:"已学技能",hint:"数字员工已经掌握并可被业务场景调用的能力。",skills:K,emptyText:"当前还没有已学习技能。"},{key:"advanced",title:"高级技能",hint:"适合有明确边界或需要确认后再交给数字员工处理的能力。",skills:te,emptyText:"暂无高级技能。"}],re=L=>u.jsxs("section",{style:{display:"grid",gap:10},children:[u.jsxs("div",{style:{display:"flex",alignItems:"baseline",justifyContent:"space-between",gap:12},children:[u.jsxs("div",{children:[u.jsx("h3",{style:{margin:0,fontSize:16,color:"var(--de-text-primary)"},children:L.title}),u.jsx("p",{style:{margin:"4px 0 0",fontSize:12,color:"var(--de-text-muted)"},children:L.hint})]}),u.jsxs("span",{className:"de-capability-badge de-capability-standard",children:[L.skills.length," 项"]})]}),L.skills.length===0?u.jsx("p",{className:"de-empty-text",style:{margin:0},children:L.emptyText}):u.jsx("div",{className:"de-skill-grid",children:L.skills.map(N=>u.jsx(V1,{skill:N,recommended:L.key==="recommended",advanced:L.key==="advanced",selected:S===N.id,updating:$===N.id,onSelect:Y=>E(Y.id),onToggle:Z},`${L.key}-${N.id}`))})]},L.key);return u.jsx("div",{style:{padding:"14px 18px"},children:u.jsxs(Os,{children:[u.jsx(Oc,{title:"学习技能",children:u.jsx("button",{onClick:F,className:"de-btn-secondary de-btn-sm",children:"刷新"})}),u.jsxs("div",{className:"de-card-body",children:[O&&u.jsx("div",{className:"de-schedule-result de-schedule-result--error",style:{marginBottom:12},children:O}),u.jsxs("div",{className:"de-skill-toolbar",children:[u.jsx("input",{type:"text",className:"de-input",placeholder:"搜索业务能力...",value:_,onChange:L=>p(L.target.value)}),u.jsx("div",{className:"de-filter-row",children:B1.map(L=>u.jsx("button",{className:`de-filter-chip ${g===L.value?"active":""}`,onClick:()=>j(L.value),children:L.label},L.value))})]}),c?u.jsx("div",{className:"de-loading-skeleton",style:{height:300}}):f?u.jsx("p",{className:"de-empty-text",children:"技能目录暂不可用,请检查 qimingclaw bridge 或稍后刷新。"}):P.length===0&&i.length>0?u.jsx("p",{className:"de-empty-text",children:"无匹配技能,请调整搜索或筛选条件"}):P.length===0?u.jsx("p",{className:"de-empty-text",children:"暂无可展示的学习技能。"}):u.jsx("div",{style:{display:"grid",gap:18},children:Q.map(re)})]})]})})}const F1={display:"grid",gridTemplateColumns:"repeat(auto-fit, minmax(260px, 1fr))",gap:12},uc={border:"1px solid var(--de-glass-border-lighter)",borderRadius:10,padding:"12px 14px",background:"linear-gradient(180deg, rgba(244,250,255,0.82), rgba(235,246,255,0.58))"};function I1(){const a=new Date;return[a.getFullYear(),String(a.getMonth()+1).padStart(2,"0"),String(a.getDate()).padStart(2,"0")].join("-")}function W1(a){return(a==null?void 0:a.status)==="ready"?"已生成":(a==null?void 0:a.status)==="generating"?"生成中":(a==null?void 0:a.status)==="failed"?"生成失败":"待生成"}function P1(a){return(a==null?void 0:a.status)==="ready"?"de-report-badge--ready":"de-report-badge--waiting"}function ej(a){return a?a.generated_by==="ai"?`AI 已生成日报${a.model?`:${a.model}`:""}`:"AI 不可用时已使用规则兜底生成日报":"AI 将基于当天任务和运行明细生成日报"}function tj(a){if(!a)return[];const i=a.duties.filter(s=>s.selected).map(s=>s.id);return i.length>0?i:a.duties.filter(s=>s.implemented).map(s=>s.id)}function My(a){if(!a)return"暂未生成";const i=new Date(a);return Number.isNaN(i.getTime())?a:i.toLocaleString("zh-CN",{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"})}function nj(a,i){const s=new Blob([i],{type:"text/plain;charset=utf-8"}),c=URL.createObjectURL(s),d=document.createElement("a");d.href=c,d.download=a,document.body.appendChild(d),d.click(),d.remove(),window.setTimeout(()=>URL.revokeObjectURL(c),1e3)}function aj(a){return`qimingclaw-digital-report-${a}.txt`}function lj(a,i,s,c,d){return[i.title||`${a} 数字员工日报`,`日期:${a}`,`生成时间:${My(i.generated_at)}`,`生成来源:${i.generated_by==="ai"?"AI":"qimingclaw adapter"}`,"","## 摘要",i.summary||"暂无摘要。","","## 指标",`任务总数:${i.totals.task_count}`,`执行次数:${i.totals.execution_count}`,`成功次数:${i.totals.success_count}`,`失败次数:${i.totals.failure_count}`,`运行中:${i.totals.running_count??0}`,"","## 任务汇总",...s.length>0?s.map(f=>`- ${f.title}:${f.latest_status_label},执行 ${f.total_count} 次,成功 ${f.success_count},失败 ${f.failure_count}。${f.ai_summary||f.business_summary||""}`):["暂无任务汇总。"],"","## 运行明细",...c.length>0?c.map(f=>`- ${f.time||"--:--"} ${f.task_name} / ${f.step_name||f.operation_name||"任务执行"}:${f.status_label},${f.business_detail}`):["暂无运行明细。"],"","## 产物来源",...d.length>0?d.map(f=>`- ${f.name}:${f.source_label||f.source_type||"未知来源"}${f.uri?`,${f.uri}`:""}`):["暂无产物来源。"],"","## 详情",...(i.detail_lines??[]).length>0?i.detail_lines:["暂无详情。"]].join(` `)}function ij({sections:a}){return a.length===0?u.jsx("p",{className:"de-empty-text",style:{padding:"18px 0 6px"},children:"今天还没有可汇总的任务。"}):u.jsx("div",{className:"de-task-summary-grid","aria-label":"日报任务汇总",children:a.map(i=>u.jsxs("div",{className:`de-task-summary-card de-live-feed-row--${i.latest_status_tone||"info"}`,children:[u.jsx("span",{className:"de-task-summary-title",children:i.title}),u.jsx("span",{className:"de-badge de-badge-info",children:i.latest_status_label}),u.jsxs("strong",{children:["执行次数 ",i.total_count]}),u.jsxs("small",{children:["成功次数 ",i.success_count," · 失败次数 ",i.failure_count]}),u.jsx("em",{children:i.ai_summary||i.business_summary})]},i.id))})}function sj({details:a}){return a.length===0?u.jsx("p",{className:"de-empty-text",style:{padding:"18px 0 6px"},children:"任务执行后,这里会展示时间、任务、步骤和执行情况。"}):u.jsxs("div",{className:"de-run-detail-list de-run-detail-list-scroll","aria-label":"日报运行明细",children:[u.jsxs("div",{className:"de-run-detail-row de-run-detail-row--head",children:[u.jsx("span",{children:"时间"}),u.jsx("span",{children:"任务名称"}),u.jsx("span",{children:"步骤名称"}),u.jsx("span",{children:"执行状态"}),u.jsx("span",{children:"执行情况"})]}),a.map(i=>u.jsxs("div",{className:`de-run-detail-row de-live-feed-row--${i.status_tone||"info"}`,children:[u.jsx("span",{children:i.time||"--:--"}),u.jsx("strong",{children:i.task_name}),u.jsx("em",{children:i.step_name||i.operation_name||"任务执行"}),u.jsx("i",{className:"de-badge de-badge-info",children:i.status_label}),u.jsx("span",{children:i.business_detail})]},i.id))]})}function rj({artifacts:a}){return a.length===0?u.jsx("p",{className:"de-empty-text",style:{padding:"18px 0 6px"},children:"运行产物出现后,这里会展示文件、输出和来源记录。"}):u.jsx("div",{className:"de-artifact-source-list","aria-label":"日报产物来源",children:a.map(i=>u.jsxs("div",{className:"de-artifact-source-row",children:[u.jsx("strong",{children:i.name}),u.jsx("span",{children:i.source_label||i.source_type||"未知来源"}),i.uri?u.jsx("code",{children:i.uri}):u.jsx("em",{children:i.kind||"artifact"})]},i.id))})}function cj({focusSection:a}){const i=b.useMemo(()=>I1(),[]),[s,c]=b.useState(null),[d,f]=b.useState("18:00"),[h,_]=b.useState(!0),[p,g]=b.useState(null),[j,S]=b.useState(null),E=b.useRef(!1),$=(s==null?void 0:s.source)==="live",A=$?(s==null?void 0:s.daily_report)??null:null,O=$?(A==null?void 0:A.task_sections)??(s==null?void 0:s.execution_summaries)??[]:[],R=$?(s==null?void 0:s.run_details)??[]:[],q=$?(A==null?void 0:A.artifact_sources)??[]:[],F=$?null:(s==null?void 0:s.demo_reason)??"当前没有真实运行投影,日报区域暂不展示兜底数据。",Z=(A==null?void 0:A.totals)??{task_count:O.length,execution_count:O.reduce((ie,ne)=>ie+ne.total_count,0),success_count:O.reduce((ie,ne)=>ie+ne.success_count,0),failure_count:O.reduce((ie,ne)=>ie+ne.failure_count,0),running_count:O.reduce((ie,ne)=>ie+ne.running_count,0)},P=b.useCallback(async()=>{var ie;_(!0),S(null);try{const ne=await mc(i);if(!E.current)return;c(ne),f(ne.source==="live"&&((ie=ne.daily_report)==null?void 0:ie.report_schedule_time)||"18:00")}catch(ne){if(!E.current)return;S(ne instanceof Error?ne.message:"日报数据加载失败")}finally{E.current&&_(!1)}},[i]);b.useEffect(()=>(E.current=!0,P(),()=>{E.current=!1}),[P]),b.useEffect(()=>{!a||h||window.setTimeout(()=>{var ie;(ie=document.getElementById(`report-section-${a}`))==null||ie.scrollIntoView({block:"center",behavior:"smooth"})},80)},[a,h]);const te=b.useCallback(async()=>{var ie;g("update_report_schedule"),S(null);try{const ne=await yl({action:"update_report_schedule",date:i,report_schedule_time:d});if(!E.current)return;c(ne),f(ne.source==="live"&&((ie=ne.daily_report)==null?void 0:ie.report_schedule_time)||d),S("日报生成时间已更新。")}catch(ne){if(!E.current)return;S(ne instanceof Error?ne.message:"日报生成时间设置失败")}finally{E.current&&g(null)}},[d,i]),he=b.useCallback(async()=>{var ie;g("generate_daily_report"),S(null);try{const ne=await yl({action:"generate_daily_report",date:i,duty_ids:$?tj(s):[],report_schedule_time:d});if(!E.current)return;c(ne),f(ne.source==="live"&&((ie=ne.daily_report)==null?void 0:ie.report_schedule_time)||d),S("日报已生成,可下载本地文本。")}catch(ne){if(!E.current)return;S(ne instanceof Error?ne.message:"日报生成失败")}finally{E.current&&g(null)}},[$,s,d,i]),K=b.useCallback(()=>{!A||A.status!=="ready"||nj(aj(i),lj(i,A,O,R,q))},[q,A,R,O,i]);return u.jsx("div",{style:{padding:"14px 18px"},children:u.jsxs(Os,{children:[u.jsx(Oc,{title:"日报生成",children:u.jsx("span",{className:"de-card-meta-text",children:i})}),u.jsx("div",{className:"de-card-body",children:h?u.jsx("div",{className:"de-loading-skeleton",style:{height:420}}):u.jsxs(u.Fragment,{children:[u.jsxs("section",{id:"report-section-today",className:"de-report-summary",style:{marginBottom:12},children:[u.jsxs("div",{className:"de-report-summary-head",children:[u.jsxs("div",{className:"de-report-summary-title-row",children:[u.jsx("h3",{children:(A==null?void 0:A.title)||"数字员工日报"}),u.jsx("p",{children:ej(A)})]}),u.jsx("span",{className:`de-report-badge ${P1(A)}`,children:W1(A)})]}),u.jsxs("div",{className:"de-report-summary-body",children:[u.jsxs("div",{className:"de-report-schedule-row",children:[u.jsxs("label",{children:[u.jsx("span",{children:"生成时间"}),u.jsx("input",{type:"time",value:d,onChange:ie=>f(ie.target.value||"18:00")})]}),u.jsx("button",{type:"button",className:"de-btn-secondary de-btn-sm",disabled:p==="update_report_schedule",onClick:()=>{te()},children:"设置时间"}),u.jsx("button",{type:"button",className:"de-btn-primary de-btn-sm",disabled:p==="generate_daily_report",onClick:()=>{he()},children:p==="generate_daily_report"?"生成中...":"生成日报"}),u.jsxs("button",{type:"button",className:"de-btn-secondary de-btn-sm de-report-download-btn",disabled:!(A!=null&&A.pdf_available),onClick:K,title:A!=null&&A.pdf_available?"下载本地日报文本":"生成日报后可下载本地日报",children:[u.jsx(fc,{size:14,"aria-hidden":"true"}),"下载日报"]})]}),u.jsxs("div",{className:"de-report-metrics",children:[u.jsxs("div",{className:"de-report-metric",children:[u.jsx("span",{children:"任务总数"}),u.jsx("strong",{children:Z.task_count})]}),u.jsxs("div",{className:"de-report-metric",children:[u.jsx("span",{children:"执行次数"}),u.jsx("strong",{children:Z.execution_count})]}),u.jsxs("div",{className:"de-report-metric",children:[u.jsx("span",{children:"成功次数"}),u.jsx("strong",{children:Z.success_count})]}),u.jsxs("div",{className:"de-report-metric",children:[u.jsx("span",{children:"失败次数"}),u.jsx("strong",{children:Z.failure_count})]})]}),u.jsxs("div",{className:"de-report-meta",children:[u.jsx("p",{children:(A==null?void 0:A.summary)||"点击生成日报后,AI 会基于当天所有任务写出总分结构日报。"}),F?u.jsx("p",{children:F}):null,u.jsxs("p",{children:["计划生成时间:",d,";最近生成:",My(A==null?void 0:A.generated_at)]}),j?u.jsx("p",{children:j}):null]})]})]}),u.jsxs("div",{style:F1,children:[u.jsxs("section",{id:"report-section-tasks",style:uc,children:[u.jsx("h3",{className:"de-settings-heading",style:{marginTop:0},children:"任务汇总"}),u.jsx(ij,{sections:O})]}),u.jsxs("section",{id:"report-section-details",style:uc,children:[u.jsx("h3",{className:"de-settings-heading",style:{marginTop:0},children:"运行明细"}),u.jsx(sj,{details:R})]}),u.jsxs("section",{id:"report-section-artifacts",style:uc,children:[u.jsx("h3",{className:"de-settings-heading",style:{marginTop:0},children:"产物来源"}),u.jsx(rj,{artifacts:q})]}),u.jsxs("section",{id:"report-section-summary",style:uc,children:[u.jsx("h3",{className:"de-settings-heading",style:{marginTop:0},children:"日报内容"}),((A==null?void 0:A.detail_lines)??[]).length===0?u.jsx("p",{className:"de-empty-text",style:{padding:"18px 0 6px"},children:"生成日报后会展示 AI 整理后的分项说明。"}):u.jsx("div",{className:"de-report-meta",children:((A==null?void 0:A.detail_lines)??[]).map(ie=>u.jsx("p",{children:ie},ie))})]})]})]})})]})})}const uj=["sales","engineering","hr","finance","executive"],Sd="qimingclaw:digital-role-preferences",xd="sgrobot-role-preferences",Ds={workStart:"09:00",workEnd:"18:00",notification:"system",reportTime:"17:30",avatarStyle:"professional",reminderLevel:"important"},oj={compact:"紧凑",balanced:"均衡",presentation:"汇报"},dj={display:"grid",gridTemplateColumns:"repeat(auto-fit, minmax(220px, 1fr))",gap:12},mi={display:"flex",flexDirection:"column",gap:6,border:"1px solid var(--de-glass-border-lighter)",borderRadius:10,padding:"12px 14px",background:"linear-gradient(180deg, rgba(244,250,255,0.82), rgba(235,246,255,0.58))"},hi={minHeight:34,borderRadius:8,border:"1px solid var(--de-glass-border-light)",background:"rgba(255,255,255,0.72)",color:"var(--de-text-primary)",padding:"0 10px"};function fj(){try{const a=localStorage.getItem(Sd)??localStorage.getItem(xd);return a?{...Ds,...JSON.parse(a)}:Ds}catch{return Ds}}function mj(a){return!a||typeof a!="object"||Array.isArray(a)?Ds:{...Ds,...a}}function hj(){const{role:a,profile:i,setRole:s}=H0(),[c,d]=b.useState(fj),[f,h]=b.useState(!1),_=b.useRef(null);b.useEffect(()=>()=>{_.current&&clearTimeout(_.current)},[]),b.useEffect(()=>{let E=!1;return Zg().then($=>{if(E||!($!=null&&$.rolePreferences))return;const A=mj($.rolePreferences);d(A);try{localStorage.setItem(Sd,JSON.stringify(A)),localStorage.removeItem(xd)}catch{}}),()=>{E=!0}},[]);const p=()=>{h(!0),_.current&&clearTimeout(_.current),_.current=setTimeout(()=>h(!1),2e3)},g=E=>{d(E);try{localStorage.setItem(Sd,JSON.stringify(E)),localStorage.removeItem(xd)}catch{}Vg({rolePreferences:E},{action:"update_role_preferences",metadata:{preferences:E}}),p()},j=(E,$)=>{g({...c,[E]:$})},S=E=>{s(E),p()};return u.jsx("div",{style:{padding:"14px 18px"},children:u.jsxs(Os,{children:[u.jsx(Oc,{title:"角色偏好",children:f&&u.jsx("span",{className:"de-card-meta-text",children:"已保存"})}),u.jsxs("div",{className:"de-card-body",children:[u.jsxs("section",{className:"de-settings-section",children:[u.jsx("h3",{className:"de-settings-heading",children:"数字员工角色"}),u.jsx("p",{className:"de-settings-desc",children:"选择日常协作身份,数字员工会按你的岗位重点调整提醒和汇总口径。"}),u.jsx("div",{className:"de-role-grid",children:uj.map(E=>u.jsxs("button",{className:`de-role-card ${a===E?"active":""}`,onClick:()=>S(E),children:[u.jsx("span",{className:"de-role-label",children:vd(Rs[E].labelKey)}),u.jsxs("span",{className:"de-role-density",children:[oj[Rs[E].density]??"均衡","视图"]})]},E))})]}),u.jsxs("section",{className:"de-settings-section",children:[u.jsx("h3",{className:"de-settings-heading",children:"工作偏好"}),u.jsxs("div",{style:dj,children:[u.jsxs("label",{style:mi,children:[u.jsx("span",{className:"de-role-label",children:"工作开始时间"}),u.jsx("input",{style:hi,type:"time",value:c.workStart,onChange:E=>j("workStart",E.target.value)})]}),u.jsxs("label",{style:mi,children:[u.jsx("span",{className:"de-role-label",children:"工作结束时间"}),u.jsx("input",{style:hi,type:"time",value:c.workEnd,onChange:E=>j("workEnd",E.target.value)})]}),u.jsxs("label",{style:mi,children:[u.jsx("span",{className:"de-role-label",children:"默认日报时间"}),u.jsx("input",{style:hi,type:"time",value:c.reportTime,onChange:E=>j("reportTime",E.target.value)})]}),u.jsxs("label",{style:mi,children:[u.jsx("span",{className:"de-role-label",children:"通知方式"}),u.jsxs("select",{style:hi,value:c.notification,onChange:E=>j("notification",E.target.value),children:[u.jsx("option",{value:"system",children:"系统通知"}),u.jsx("option",{value:"email",children:"邮件提醒"}),u.jsx("option",{value:"silent",children:"只在页面显示"})]})]}),u.jsxs("label",{style:mi,children:[u.jsx("span",{className:"de-role-label",children:"数字员工形象偏好"}),u.jsxs("select",{style:hi,value:c.avatarStyle,onChange:E=>j("avatarStyle",E.target.value),children:[u.jsx("option",{value:"professional",children:"专业稳重"}),u.jsx("option",{value:"friendly",children:"亲和协作"}),u.jsx("option",{value:"concise",children:"简洁高效"})]})]}),u.jsxs("label",{style:mi,children:[u.jsx("span",{className:"de-role-label",children:"任务提醒偏好"}),u.jsxs("select",{style:hi,value:c.reminderLevel,onChange:E=>j("reminderLevel",E.target.value),children:[u.jsx("option",{value:"important",children:"只提醒重要事项"}),u.jsx("option",{value:"all",children:"所有进展都提醒"}),u.jsx("option",{value:"quiet",children:"尽量少打扰"})]})]})]})]}),u.jsxs("details",{className:"de-settings-section",style:{marginBottom:0},children:[u.jsx("summary",{className:"de-settings-heading",style:{cursor:"pointer"},children:"高级技术设置"}),u.jsxs("p",{className:"de-settings-desc",children:["默认隐藏,仅供技术人员排查使用。当前角色刷新阈值:",Math.round(i.staleDataThresholdMs/1e3)," 秒。"]})]})]})]})})}const Oy=[{id:"home",label:"首页"},{id:"missions",label:"任务中心"},{id:"skills",label:"技能库"},{id:"reports",label:"日报"},{id:"settings",label:"设置"}],pj="qimingclaw:digital-close";function $y(a){return!!(a&&Oy.some(i=>i.id===a))}function gj(a){const i=a.split("/").filter(Boolean),s=i.length>0?i[i.length-1]:null;return $y(s)?s:null}function kg(a,i){const s=new URLSearchParams(i),c=s.get("tab");return{tab:$y(c)?c:gj(a)??"home",date:s.get("date"),missionId:s.get("mission"),taskId:s.get("task"),skillId:s.get("skill"),reportSection:s.get("section")}}function yj({target:a,onNavigate:i}){switch(a.tab){case"home":return u.jsx(e1,{onNavigate:i});case"missions":return u.jsx(U1,{focusMissionId:a.missionId,focusTaskId:a.taskId,focusDate:a.date});case"skills":return u.jsx(J1,{focusSkillId:a.skillId});case"reports":return u.jsx(cj,{focusSection:a.reportSection});case"settings":return u.jsx(hj,{})}}function _j(){if(window.parent&&window.parent!==window){const a=window.location.origin==="null"?"*":window.location.origin;window.parent.postMessage({type:pj},a);return}window.close()}function vj(){const a=xn(),i=kd(),[s,c]=b.useState(()=>kg(a.pathname,a.search));b.useEffect(()=>{c(kg(a.pathname,a.search))},[a.pathname,a.search]);const d=b.useCallback(f=>{c(f);const h=new URLSearchParams;f.tab!=="home"&&h.set("tab",f.tab),f.date&&h.set("date",f.date),f.missionId&&h.set("mission",f.missionId),f.taskId&&h.set("task",f.taskId),f.skillId&&h.set("skill",f.skillId),f.reportSection&&h.set("section",f.reportSection),i({pathname:a.pathname,search:h.toString()?`?${h.toString()}`:""},{replace:!1})},[a.pathname,i]);return u.jsx(B0,{children:u.jsxs("div",{className:"de-shell",children:[u.jsx("header",{className:"de-header",children:u.jsxs("div",{className:"de-header-content",children:[u.jsxs("div",{className:"de-header-left",children:[u.jsx("div",{className:"de-header-accent-bar"}),u.jsx("h1",{className:"de-header-title",children:"智能数字人系统"})]}),u.jsx("div",{className:"de-header-center",children:Oy.map(f=>u.jsx("button",{className:`de-nav-btn ${s.tab===f.id?"active":""}`,onClick:()=>d({tab:f.id}),children:u.jsx("span",{children:f.label})},f.id))}),u.jsxs("div",{className:"de-header-right",children:[u.jsx("span",{className:"de-header-welcome",children:"欢迎您,"}),u.jsx("span",{className:"de-header-username",children:"王琦"}),u.jsx("button",{type:"button",className:"de-header-icon",title:"消息",children:u.jsx(M0,{size:16})}),u.jsx("button",{type:"button",className:"de-header-icon",title:"通知",children:u.jsx(z0,{size:16})}),u.jsx("button",{type:"button",className:"de-header-icon de-header-close",title:"关闭",onClick:_j,children:u.jsx(q0,{size:17})})]})]})}),u.jsx("div",{className:"de-shell-body",children:u.jsx(yj,{target:s,onNavigate:d})})]})})}function bj(){return u.jsx(v0,{children:u.jsxs(Jb,{children:[u.jsx(sd,{path:"/digital",element:u.jsx(vj,{})}),u.jsx(sd,{path:"*",element:u.jsx(Zb,{to:"/digital",replace:!0})})]})})}Fv.createRoot(document.getElementById("root")).render(u.jsx(Yv.StrictMode,{children:u.jsx(bj,{})})); diff --git a/qimingclaw/crates/agent-electron-client/public/sgrobot-digital/index.html b/qimingclaw/crates/agent-electron-client/public/sgrobot-digital/index.html index 174d7425..732d6d8f 100644 --- a/qimingclaw/crates/agent-electron-client/public/sgrobot-digital/index.html +++ b/qimingclaw/crates/agent-electron-client/public/sgrobot-digital/index.html @@ -16,7 +16,7 @@ console.warn("[qimingclaw] digital employee auth bootstrap skipped", error); } - + diff --git a/qimingclaw/crates/agent-electron-client/src/main/services/digitalEmployee/stateService.test.ts b/qimingclaw/crates/agent-electron-client/src/main/services/digitalEmployee/stateService.test.ts index 8660ff02..e06fd9fa 100644 --- a/qimingclaw/crates/agent-electron-client/src/main/services/digitalEmployee/stateService.test.ts +++ b/qimingclaw/crates/agent-electron-client/src/main/services/digitalEmployee/stateService.test.ts @@ -481,6 +481,158 @@ describe("digital employee state service", () => { expect(mockState.db?.outbox.get("run:upsert:run-governance")).toMatchObject({ entity_type: "run" }); }); + it("marks dependent plan steps ready when skipped dependencies are satisfied", async () => { + const { recordDigitalEmployeeGovernanceCommand } = await import("./stateService"); + + createGovernableTask(); + addPlanStep({ id: "step-dependent", title: "后续执行步骤", seq: 2, dependsOn: ["step-governance"] }); + + recordDigitalEmployeeGovernanceCommand({ + commandKind: "skip_task", + commandId: "command-unlock-dependent", + planId: "plan-governance", + taskId: "task-governance", + runId: "run-governance", + stepId: "step-governance", + accepted: true, + payload: { reason: "跳过前置步骤" }, + }); + + expect(mockState.db?.planSteps.get("step-dependent")).toMatchObject({ + status: "ready", + sync_status: "pending", + }); + expect(JSON.parse(mockState.db?.planSteps.get("step-dependent")?.payload ?? "{}")).toMatchObject({ + dependencyGraph: { + status: "ready", + triggeredByStepId: "step-governance", + satisfiedDependencies: ["step-governance"], + }, + }); + expect(Array.from(mockState.db?.events.values() ?? [])).toEqual(expect.arrayContaining([ + expect.objectContaining({ kind: "plan_step_ready", plan_id: "plan-governance" }), + ])); + expect(mockState.db?.outbox.get("plan_step:upsert:step-dependent")).toMatchObject({ + entity_type: "plan_step", + entity_id: "step-dependent", + status: "pending", + }); + }); + + it("blocks dependent plan steps on cancellation and returns them to pending on retry", async () => { + const { recordDigitalEmployeeGovernanceCommand } = await import("./stateService"); + + createGovernableTask(); + addPlanStep({ id: "step-dependent", title: "后续执行步骤", seq: 2, dependsOn: ["step-governance"] }); + + recordDigitalEmployeeGovernanceCommand({ + commandKind: "cancel_task", + commandId: "command-block-dependent", + planId: "plan-governance", + taskId: "task-governance", + runId: "run-governance", + stepId: "step-governance", + accepted: true, + payload: { reason: "取消前置步骤" }, + }); + + expect(mockState.db?.planSteps.get("step-dependent")).toMatchObject({ status: "blocked" }); + expect(Array.from(mockState.db?.events.values() ?? [])).toEqual(expect.arrayContaining([ + expect.objectContaining({ kind: "plan_step_blocked" }), + ])); + + recordDigitalEmployeeGovernanceCommand({ + commandKind: "retry_task", + commandId: "command-wait-dependent", + planId: "plan-governance", + taskId: "task-governance", + runId: "run-governance", + stepId: "step-governance", + accepted: true, + payload: { reason: "重试前置步骤" }, + }); + + expect(mockState.db?.planSteps.get("step-governance")).toMatchObject({ status: "running" }); + expect(mockState.db?.planSteps.get("step-dependent")).toMatchObject({ status: "pending" }); + expect(Array.from(mockState.db?.events.values() ?? [])).toEqual(expect.arrayContaining([ + expect.objectContaining({ kind: "plan_step_waiting" }), + ])); + expect(JSON.parse(mockState.db?.planSteps.get("step-dependent")?.payload ?? "{}")).toMatchObject({ + dependencyGraph: { + status: "pending", + waitingDependencies: ["step-governance"], + }, + }); + }); + + it("waits for all dependencies before marking a plan step ready", async () => { + const { recordDigitalEmployeeGovernanceCommand } = await import("./stateService"); + + createGovernableTask(); + addPlanStep({ id: "step-other", title: "第二个前置步骤", seq: 2 }); + addGovernableTaskForStep({ taskId: "task-other", runId: "run-other", stepId: "step-other" }); + addPlanStep({ id: "step-dependent", title: "汇总步骤", seq: 3, dependsOn: ["step-governance", "step-other"] }); + + recordDigitalEmployeeGovernanceCommand({ + commandKind: "skip_task", + commandId: "command-first-dependency", + planId: "plan-governance", + taskId: "task-governance", + runId: "run-governance", + stepId: "step-governance", + accepted: true, + }); + + expect(mockState.db?.planSteps.get("step-dependent")).toMatchObject({ status: "pending" }); + + recordDigitalEmployeeGovernanceCommand({ + commandKind: "skip_task", + commandId: "command-second-dependency", + planId: "plan-governance", + taskId: "task-other", + runId: "run-other", + stepId: "step-other", + accepted: true, + }); + + expect(mockState.db?.planSteps.get("step-dependent")).toMatchObject({ status: "ready" }); + expect(JSON.parse(mockState.db?.planSteps.get("step-dependent")?.payload ?? "{}")).toMatchObject({ + dependencyGraph: { + status: "ready", + satisfiedDependencies: ["step-governance", "step-other"], + }, + }); + }); + + it("does not overwrite already running or completed dependent plan steps", async () => { + const { recordDigitalEmployeeGovernanceCommand } = await import("./stateService"); + + createGovernableTask(); + addPlanStep({ id: "step-running-dependent", status: "running", seq: 2, dependsOn: ["step-governance"] }); + addPlanStep({ id: "step-completed-dependent", status: "completed", seq: 3, dependsOn: ["step-governance"] }); + + recordDigitalEmployeeGovernanceCommand({ + commandKind: "skip_task", + commandId: "command-preserve-dependent", + planId: "plan-governance", + taskId: "task-governance", + runId: "run-governance", + stepId: "step-governance", + accepted: true, + }); + + expect(mockState.db?.planSteps.get("step-running-dependent")).toMatchObject({ + status: "running", + sync_status: "synced", + }); + expect(mockState.db?.planSteps.get("step-completed-dependent")).toMatchObject({ + status: "completed", + sync_status: "synced", + }); + expect(mockState.db?.outbox.has("plan_step:upsert:step-running-dependent")).toBe(false); + expect(mockState.db?.outbox.has("plan_step:upsert:step-completed-dependent")).toBe(false); + }); + it("creates a retry run and preserves the failed source run", async () => { const { recordDigitalEmployeeGovernanceCommand } = await import("./stateService"); @@ -754,6 +906,59 @@ function createGovernableTask(options: { }); } +function addPlanStep(options: { + id: string; + title?: string; + status?: string; + seq?: number; + dependsOn?: string[]; +}): void { + mockState.db?.planSteps.set(options.id, { + id: options.id, + plan_id: "plan-governance", + title: options.title ?? options.id, + status: options.status ?? "pending", + seq: options.seq ?? 2, + depends_on: JSON.stringify(options.dependsOn ?? []), + preferred_skill_ids: JSON.stringify([]), + payload: JSON.stringify({ source: "test" }), + sync_status: "synced", + created_at: "2026-06-07T07:00:00.000Z", + updated_at: "2026-06-07T07:00:00.000Z", + }); +} + +function addGovernableTaskForStep(options: { + taskId: string; + runId: string; + stepId: string; + status?: string; +}): void { + mockState.db?.tasks.set(options.taskId, { + id: options.taskId, + plan_id: "plan-governance", + title: `${options.stepId} 任务`, + status: options.status ?? "running", + assigned_skill_id: "qimingclaw-task-agent", + payload: JSON.stringify({ source: "test", stepId: options.stepId }), + sync_status: "synced", + created_at: "2026-06-07T07:00:00.000Z", + updated_at: "2026-06-07T07:00:00.000Z", + }); + mockState.db?.runs.set(options.runId, { + id: options.runId, + plan_id: "plan-governance", + task_id: options.taskId, + status: options.status ?? "running", + started_at: "2026-06-07T07:10:00.000Z", + finished_at: null, + payload: JSON.stringify({ source: "test" }), + sync_status: "synced", + created_at: "2026-06-07T07:10:00.000Z", + updated_at: "2026-06-07T07:10:00.000Z", + }); +} + interface TestPlanRow { id: string; title: string; @@ -808,7 +1013,7 @@ interface TestEventRow { id: string; plan_id: string; task_id: string; - run_id: string; + run_id: string | null; kind: string; message: string; payload: string; @@ -946,9 +1151,17 @@ class TestDb { }; } - private all(sql: string, _args: unknown[]): unknown[] { + private all(sql: string, args: unknown[]): unknown[] { if (sql.includes("FROM digital_plans")) return Array.from(this.plans.values()); - if (sql.includes("FROM digital_plan_steps")) return Array.from(this.planSteps.values()); + if (sql.includes("FROM digital_plan_steps")) { + const rows = Array.from(this.planSteps.values()); + if (sql.includes("WHERE plan_id = ?")) { + return rows + .filter((step) => step.plan_id === args[0]) + .sort((left, right) => left.seq - right.seq || left.created_at.localeCompare(right.created_at)); + } + return rows; + } if (sql.includes("FROM digital_schedules")) return Array.from(this.schedules.values()); if (sql.includes("FROM digital_schedule_runs")) return Array.from(this.scheduleRuns.values()); if (sql.includes("FROM digital_tasks")) return Array.from(this.tasks.values()); @@ -1304,7 +1517,7 @@ class TestDb { string, string, string, - string, + string | null, string, string, string, diff --git a/qimingclaw/crates/agent-electron-client/src/main/services/digitalEmployee/stateService.ts b/qimingclaw/crates/agent-electron-client/src/main/services/digitalEmployee/stateService.ts index b119feff..0450d6d4 100644 --- a/qimingclaw/crates/agent-electron-client/src/main/services/digitalEmployee/stateService.ts +++ b/qimingclaw/crates/agent-electron-client/src/main/services/digitalEmployee/stateService.ts @@ -1921,7 +1921,7 @@ function shouldUpdateTaskForGovernance(commandKind: string): boolean { } function shouldUpdateStepForGovernance(commandKind: string): boolean { - return ["retry_task", "skip_task", "pause_task", "resume_task", "cancel_task", "start_run"].includes(commandKind); + return ["retry_task", "skip_task", "pause_task", "resume_task", "cancel_task", "start_run", "cancel_run"].includes(commandKind); } function mergeGovernancePayload( @@ -2003,6 +2003,195 @@ function updatePlanStepForGovernance(input: { payload, now: input.now, }, input.now); + advancePlanStepDependencyGraph({ + planId: stringValue(row.plan_id), + changedStepId: input.stepId, + now: input.now, + }); +} + +function advancePlanStepDependencyGraph(input: { + planId: string; + changedStepId: string; + now: string; +}): void { + const db = getDigitalEmployeeDb(); + if (!db || !input.planId || !input.changedStepId) return; + const rows = db.prepare(` + SELECT id, plan_id, title, status, seq, depends_on, preferred_skill_ids, payload, created_at + FROM digital_plan_steps + WHERE plan_id = ? + ORDER BY seq ASC, created_at ASC + `).all(input.planId) as Array>; + if (rows.length === 0) return; + + const stepsById = new Map(rows.map((row) => [stringValue(row.id), row])); + const queue = [input.changedStepId]; + const visited = new Set(); + + while (queue.length > 0) { + const sourceStepId = queue.shift() || ""; + if (!sourceStepId || visited.has(sourceStepId)) continue; + visited.add(sourceStepId); + for (const row of rows) { + const stepId = stringValue(row.id); + const dependsOn = parseStringArray(row.depends_on); + if (!stepId || !dependsOn.includes(sourceStepId)) continue; + const currentStatus = normalizePlanStepStatus(row.status); + if (!canAdvanceDependentPlanStep(currentStatus)) continue; + const nextState = evaluatePlanStepDependencyState(row, stepsById, input.now, input.changedStepId); + if (!nextState || nextState.status === currentStatus) continue; + updatePlanStepForDependencyState({ + row, + dependsOn, + status: nextState.status, + eventKind: nextState.eventKind, + message: nextState.message, + dependencyGraph: nextState.dependencyGraph, + now: input.now, + }); + row.status = nextState.status; + row.payload = stringify({ + ...(objectRecord(parseStoredPayload(row.payload)) ?? {}), + dependencyGraph: nextState.dependencyGraph, + }); + queue.push(stepId); + } + } +} + +function evaluatePlanStepDependencyState( + row: Record, + stepsById: Map>, + now: string, + triggeredByStepId: string, +): { + status: "ready" | "blocked" | "pending"; + eventKind: "plan_step_ready" | "plan_step_blocked" | "plan_step_waiting"; + message: string; + dependencyGraph: Record; +} | null { + const stepId = stringValue(row.id); + const dependsOn = parseStringArray(row.depends_on); + if (!stepId || dependsOn.length === 0) return null; + const dependencyStates = dependsOn.map((dependencyId) => { + const dependency = stepsById.get(dependencyId); + return { + id: dependencyId, + status: normalizePlanStepStatus(dependency?.status), + exists: Boolean(dependency), + }; + }); + const blockedDependencies = dependencyStates + .filter((dependency) => isBlockingPlanStepStatus(dependency.status)) + .map((dependency) => dependency.id); + const waitingDependencies = dependencyStates + .filter((dependency) => !dependency.exists || !isSatisfiedPlanStepStatus(dependency.status)) + .map((dependency) => dependency.id); + const satisfiedDependencies = dependencyStates + .filter((dependency) => isSatisfiedPlanStepStatus(dependency.status)) + .map((dependency) => dependency.id); + + const dependencyGraph = { + evaluatedAt: now, + triggeredByStepId, + dependencies: dependencyStates, + satisfiedDependencies, + waitingDependencies, + blockedDependencies, + }; + + if (blockedDependencies.length > 0) { + return { + status: "blocked", + eventKind: "plan_step_blocked", + message: `计划步骤“${stringValue(row.title) || stepId}”因依赖阻塞,等待人工处理。`, + dependencyGraph: { ...dependencyGraph, status: "blocked" }, + }; + } + if (waitingDependencies.length === 0) { + return { + status: "ready", + eventKind: "plan_step_ready", + message: `计划步骤“${stringValue(row.title) || stepId}”依赖已满足,等待启动。`, + dependencyGraph: { ...dependencyGraph, status: "ready" }, + }; + } + return { + status: "pending", + eventKind: "plan_step_waiting", + message: `计划步骤“${stringValue(row.title) || stepId}”重新等待依赖完成。`, + dependencyGraph: { ...dependencyGraph, status: "pending" }, + }; +} + +function updatePlanStepForDependencyState(input: { + row: Record; + dependsOn: string[]; + status: "ready" | "blocked" | "pending"; + eventKind: "plan_step_ready" | "plan_step_blocked" | "plan_step_waiting"; + message: string; + dependencyGraph: Record; + now: string; +}): void { + const db = getDigitalEmployeeDb(); + if (!db) return; + const stepId = stringValue(input.row.id); + const planId = stringValue(input.row.plan_id); + const payload = { + ...(objectRecord(parseStoredPayload(input.row.payload)) ?? {}), + dependencyGraph: input.dependencyGraph, + }; + db.prepare(` + UPDATE digital_plan_steps + SET status = ?, payload = ?, sync_status = 'pending', updated_at = ? + WHERE id = ? + `).run(input.status, stringify(payload), input.now, stepId); + markOutbox("plan_step", stepId, "upsert", { + id: stepId, + planId, + title: stringValue(input.row.title), + status: input.status, + seq: typeof input.row.seq === "number" ? input.row.seq : Number(input.row.seq) || 0, + dependsOn: input.dependsOn, + preferredSkillIds: parseStringArray(input.row.preferred_skill_ids), + payload, + now: input.now, + }, input.now); + insertEvent( + { + event_id: `${stepId}:dependency:${input.status}:${safeId(stringValue(input.dependencyGraph.triggeredByStepId))}:${safeId(input.now)}`, + kind: input.eventKind, + occurred_at: input.now, + message: input.message, + plan_id: planId, + task_id: null, + }, + null, + { + source: "qimingclaw-plan-step-dependency", + stepId, + planId, + status: input.status, + dependencyGraph: input.dependencyGraph, + }, + ); +} + +function canAdvanceDependentPlanStep(status: string): boolean { + return ["pending", "ready", "blocked"].includes(status); +} + +function isSatisfiedPlanStepStatus(status: string): boolean { + return ["completed", "succeeded", "success", "done", "skipped"].includes(status); +} + +function isBlockingPlanStepStatus(status: string): boolean { + return ["failed", "error", "cancelled", "canceled", "rejected", "blocked"].includes(status); +} + +function normalizePlanStepStatus(status: unknown): string { + return stringValue(status).toLowerCase() || "pending"; } function persistTaskGovernanceRun(input: { @@ -3247,7 +3436,7 @@ function upsertApproval(input: { function insertEvent( event: DigitalEmployeeStateEvent, - runId: string, + runId: string | null, payload: unknown, ): void { const db = getDigitalEmployeeDb(); diff --git a/qimingclaw/docs/digital-employee-frontend-integration-plan.md b/qimingclaw/docs/digital-employee-frontend-integration-plan.md index 0208574e..8a1dc6ee 100644 --- a/qimingclaw/docs/digital-employee-frontend-integration-plan.md +++ b/qimingclaw/docs/digital-employee-frontend-integration-plan.md @@ -538,11 +538,11 @@ GET /api/digital-employee/approvals 以下清单按当前 qimingclaw 已落地状态盘点,不重复列出已完成的前端嵌入、本地 Plan / Task / Run / Event / Artifact / Approval / MemoryEntry、outbox 同步、技能投影和同步诊断。 -1. **PlanStep 与依赖图(已开始)** +1. **PlanStep 与依赖图(依赖图调度已开始)** - 已吸收:Plan / Task / Run 记录、计划模板、`create_plan` 中的 steps/tasks 可物化为任务;PlanStep 已开始作为正式本地实体落入 `digital_plan_steps`。 - - 当前能力:PlanStep 会进入 `digital_sync_outbox`,entity type 为 `plan_step`;任务中心 flow 和 debug store 优先读取真实 PlanStep 生成步骤图;Task Agent 的 retry / skip / cancel / pause / resume / input / run 控制已可更新真实 Task、PlanStep、Run、Event 和 outbox。 - - 后续缺口:步骤依赖调度和跨任务编排执行仍待吸收。 - - 建议:下一轮围绕依赖图调度,把已完成/跳过/取消的步骤继续驱动到后续步骤。 + - 当前能力:PlanStep 会进入 `digital_sync_outbox`,entity type 为 `plan_step`;任务中心 flow 和 debug store 优先读取真实 PlanStep 生成步骤图;Task Agent 的 retry / skip / cancel / pause / resume / input / run 控制已可更新真实 Task、PlanStep、Run、Event 和 outbox;前置步骤跳过、取消或重试后会重新评估后继步骤,推进为 ready / blocked / pending 并写入依赖图事件。 + - 后续缺口:跨任务编排执行、ready 步骤自动调度、依赖阻塞人工处理 UI 和管理端依赖图视图仍待吸收。 + - 建议:下一轮围绕入口路由/任务分流,把 ready PlanStep 接入安全的执行触发策略。 2. **调度 / 定时 / 周期任务** - 已吸收:`digital_schedules`、`digital_schedule_runs` 已进入 qimingclaw 本地 SQLite 与 outbox,entity type 为 `schedule` / `schedule_run`;旧 `/api/cron`、`/api/scheduler/jobs` 和治理命令会优先读取真实本地调度记录。