zen-gitsync 2.17.36 → 2.17.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +6 -6
  2. package/package.json +1 -1
  3. package/src/cli/ai/turn.js +3 -1
  4. package/src/config.js +7 -4
  5. package/src/ui/public/assets/{AgentEngineSelector-DVs4LGHZ.js → AgentEngineSelector-BMJAsMx_.js} +1 -1
  6. package/src/ui/public/assets/{AgentView-Blp40VRr.js → AgentView-BH5Ec4j1.js} +1 -1
  7. package/src/ui/public/assets/{AppVersionBadge-BEnoFzwh.js → AppVersionBadge-DNG70v26.js} +2 -2
  8. package/src/ui/public/assets/{BranchSelector-C7eXeFif.js → BranchSelector-DBI8ieGq.js} +1 -1
  9. package/src/ui/public/assets/{CommitForm-CK9jLJOC.js → CommitForm-BHwc5sEG.js} +1 -1
  10. package/src/ui/public/assets/{CommonDialog-BTeIpgGT.js → CommonDialog-DuI8Bsg7.js} +1 -1
  11. package/src/ui/public/assets/{EditorView-D00zvntf.js → EditorView-B3EO-mxZ.js} +1 -1
  12. package/src/ui/public/assets/{FileDiffViewer-zqgG9ok3.js → FileDiffViewer-DtGtQGLR.js} +1 -1
  13. package/src/ui/public/assets/{FlowExecutionViewer-VFnxkbIs.js → FlowExecutionViewer-sM9EwU3Q.js} +1 -1
  14. package/src/ui/public/assets/{FlowOrchestrationWorkspace-CIIdKK3v.js → FlowOrchestrationWorkspace-0Kh0IoGP.js} +1 -1
  15. package/src/ui/public/assets/{IconButton-Cgc5v9vb.js → IconButton-C07zojvw.js} +1 -1
  16. package/src/ui/public/assets/{LogList-DyQv-Yec.js → LogList-BatjYplm.js} +1 -1
  17. package/src/ui/public/assets/{MindmapView-EC2Wk_Qi.js → MindmapView-CTHfsYTC.js} +1 -1
  18. package/src/ui/public/assets/{MonitorView-Z5ZbGtaU.js → MonitorView-BblFdPFM.js} +1 -1
  19. package/src/ui/public/assets/{ProjectStartupButton-Ci19q1bL.js → ProjectStartupButton-CFQKlRoA.js} +1 -1
  20. package/src/ui/public/assets/{RecentDirectoriesChat-DT0sguEG.js → RecentDirectoriesChat-BVgA8lLY.js} +1 -1
  21. package/src/ui/public/assets/{RemoteManagerDialog-BRQpjMSK.js → RemoteManagerDialog-BxD0m5c-.js} +1 -1
  22. package/src/ui/public/assets/{RemoteRepoCard-yK90_VfS.js → RemoteRepoCard-kOIERvah.js} +1 -1
  23. package/src/ui/public/assets/{SourceMapView-C55ixUwz.js → SourceMapView-Bs3DYqDP.js} +1 -1
  24. package/src/ui/public/assets/{SvgIcon-ub85vovN.js → SvgIcon-YQZtv72i.js} +1 -1
  25. package/src/ui/public/assets/{TemplateManager-uDno_64z.js → TemplateManager-zSKmah02.js} +1 -1
  26. package/src/ui/public/assets/{UserInputNode-Ce55MMEZ.js → UserInputNode-DMCLoOUw.js} +1 -1
  27. package/src/ui/public/assets/{WorkbenchView-D1Pf6Etd.css → WorkbenchView-C_E3GV0q.css} +1 -1
  28. package/src/ui/public/assets/WorkbenchView-nHzg7gau.js +231 -0
  29. package/src/ui/public/assets/{_plugin-vue_export-helper-VuE2vqnn.js → _plugin-vue_export-helper-DcQKU19k.js} +2 -2
  30. package/src/ui/public/assets/{agentConversations-DcW54Tlt.js → agentConversations-D_TsndCC.js} +1 -1
  31. package/src/ui/public/assets/{configStore-De_8eQuS.js → configStore-u3FUM08v.js} +1 -1
  32. package/src/ui/public/assets/{gitStore-BP6TATf7.js → gitStore-ZjHYEyKS.js} +1 -1
  33. package/src/ui/public/assets/{index-Bq_-TrTP.js → index-DorcTBZN.js} +16 -16
  34. package/src/ui/public/assets/{previewSandbox-DcVlFmag.js → previewSandbox-KLKRAhm4.js} +1 -1
  35. package/src/ui/public/assets/{toolsStore-CQclze0T.js → toolsStore-CfyhqJeq.js} +1 -1
  36. package/src/ui/public/index.html +11 -11
  37. package/src/ui/server/routes/workbench/agentChat.js +1 -1
  38. package/src/ui/server/routes/workbench/orchestratorStore.js +4 -0
  39. package/src/ui/server/routes/workbench/orchestratorStore.progressReport.test.js +26 -0
  40. package/src/ui/public/assets/WorkbenchView-CtJD3pz-.js +0 -228
@@ -1,5 +1,5 @@
1
1
  const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/office-docx-CTz4O0Ml.js","assets/rolldown-runtime-C0FnF6B9.js","assets/element-plus-Buzx8xRf.js","assets/dagre-CDSwApuC.js","assets/element-plus-Qexo5hiM.css","assets/office-excel-DaZCapUD.js","assets/office-pptx-CFwyD4jf.js"])))=>i.map(i=>d[i]);
2
- import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{$n as t,Bn as n,Dn as r,En as i,Fn as a,Fr as o,Ht as s,In as c,J as l,Jr as u,On as d,Pn as f,Tn as p,W as m,Xr as h,Yn as g,Zn as _,br as v,cn as y,cr as b,ei as x,kn as S,nr as C,or as w,pr as T,qn as E,sn as D,wt as O,xn as k}from"./element-plus-Buzx8xRf.js";import{_ as A}from"./vendor-wERX2bc3.js";import{t as j}from"./_plugin-vue_export-helper-VuE2vqnn.js";import{ir as M}from"./dagre-CDSwApuC.js";import{n as N,r as P}from"./flow-mindmap-D-65aZb7.js";var F=new Set([`png`,`jpg`,`jpeg`,`gif`,`webp`,`bmp`,`ico`,`svg`]);function ee(e){if(!e)return!1;let t=e.split(`.`).pop()?.toLowerCase()??``;return F.has(t)}function te(e){return`/api/editor/raw?path=${encodeURIComponent(e)}`}var I=new Set([`doc`,`docx`,`xls`,`xlsx`,`ppt`,`pptx`,`odt`,`ods`,`odp`]);function L(e){return e.split(/[\\/]/).pop()?.split(`.`).pop()?.toLowerCase()||``}function R(e){return I.has(L(e))}function z(e,t={}){let n=new URLSearchParams({source:t.source||`worktree`,file:e});return t.rev&&n.set(`rev`,t.rev),t.side&&n.set(`side`,t.side),`/api/office/preview?${n.toString()}`}function B(e,t={}){let n=new URLSearchParams({source:t.source||`worktree`,file:e});return t.rev&&n.set(`rev`,t.rev),t.side&&n.set(`side`,t.side),`/api/office/raw?${n.toString()}`}n(),T();var V=c({__name:`ImagePreview`,props:{filePath:{type:String,required:!0},fileName:{type:String,required:!1}},setup(e,{expose:t}){t();let n=e,r=v(null),i=v(1),a=v(0),o=v(0),c=v(!1),u=v({x:0,y:0}),d=v(null),f=v(!1),m=v(null),h=()=>{if(!r.value||!d.value)return;let e=r.value.clientWidth-32,t=r.value.clientHeight-32;if(e<=0||t<=0)return;let n=Math.min(e/d.value.w,t/d.value.h,1);i.value=n,a.value=0,o.value=0},_=()=>{i.value=Math.min(i.value*1.2,8)},b=()=>{i.value=Math.max(i.value/1.2,.1)},x=()=>{i.value=1,a.value=0,o.value=0,h()},S=e=>{e.preventDefault(),e.deltaY<0?_():b()},C=e=>{e.button===0&&(c.value=!0,u.value={x:e.clientX-a.value,y:e.clientY-o.value})},T=e=>{c.value&&(a.value=e.clientX-u.value.x,o.value=e.clientY-u.value.y)},k=()=>{c.value=!1},A=e=>{let t=e.target;d.value={w:t.naturalWidth,h:t.naturalHeight},f.value=!1,requestAnimationFrame(()=>h())},j=()=>{f.value=!0},M=p(()=>n.fileName||n.filePath?.split(`/`).pop()||``),N=p(()=>te(n.filePath));g(()=>{window.addEventListener(`mousemove`,T),window.addEventListener(`mouseup`,k),window.addEventListener(`resize`,h)}),E(()=>{window.removeEventListener(`mousemove`,T),window.removeEventListener(`mouseup`,k),window.removeEventListener(`resize`,h)}),w(()=>n.filePath,()=>{d.value=null,f.value=!1,i.value=1,a.value=0,o.value=0});let P={props:n,containerRef:r,scale:i,translateX:a,translateY:o,isDragging:c,dragStart:u,naturalSize:d,loadError:f,imgRef:m,fit:h,zoomIn:_,zoomOut:b,reset:x,onWheel:S,onMouseDown:C,onMouseMove:T,onMouseUp:k,onImgLoad:A,onImgError:j,displayName:M,imageUrl:N,get ElIcon(){return l},get ZoomIn(){return D},get ZoomOut(){return y},get Refresh(){return s},get FullScreen(){return O}};return Object.defineProperty(P,"__isScriptSetup",{enumerable:!1,value:!0}),P}});n(),o();var H={class:`image-preview-toolbar`},U=[`title`],W={key:0,class:`image-preview-dim`},G={key:1,class:`image-preview-dim`},K={key:0,class:`image-preview-error`},q={class:`image-preview-error-path`},J=[`src`,`alt`],Y={class:`image-preview-footer`},X={class:`image-preview-zoom`};function Z(e,t,n,r,a,o){let s=m;return _(),S(`div`,{class:`image-preview`,ref:`containerRef`,onWheel:r.onWheel},[d(` 顶部工具条 `),i(`div`,H,[i(`span`,{class:`image-preview-name`,title:r.props.filePath},x(r.displayName),9,U),r.naturalSize?(_(),S(`span`,W,x(r.naturalSize.w)+` × `+x(r.naturalSize.h)+` px`,1)):(_(),S(`span`,G,x(Math.round(r.scale*100))+`%`,1)),t[0]||=i(`div`,{class:`image-preview-spacer`},null,-1),f(s,{content:`放大`,placement:`top`},{default:b(()=>[i(`button`,{class:`image-preview-btn`,onClick:r.zoomIn},[f(r.ElIcon,null,{default:b(()=>[f(r.ZoomIn)]),_:1})])]),_:1}),f(s,{content:`缩小`,placement:`top`},{default:b(()=>[i(`button`,{class:`image-preview-btn`,onClick:r.zoomOut},[f(r.ElIcon,null,{default:b(()=>[f(r.ZoomOut)]),_:1})])]),_:1}),f(s,{content:`适应窗口`,placement:`top`},{default:b(()=>[i(`button`,{class:`image-preview-btn`,onClick:r.reset},[f(r.ElIcon,null,{default:b(()=>[f(r.Refresh)]),_:1})])]),_:1})]),d(` 图片区域 `),i(`div`,{class:u([`image-preview-stage`,{"is-dragging":r.isDragging}]),onMousedown:r.onMouseDown},[r.loadError?(_(),S(`div`,K,[f(r.ElIcon,{size:`32`,color:`var(--color-danger)`},{default:b(()=>[f(r.FullScreen)]),_:1}),t[1]||=i(`p`,null,`图片加载失败`,-1),i(`p`,q,x(r.props.filePath),1)])):(_(),S(`img`,{key:1,ref:`imgRef`,src:r.imageUrl,alt:r.displayName,class:`image-preview-img`,style:h({transform:`translate(${r.translateX}px, ${r.translateY}px) scale(${r.scale})`}),onLoad:r.onImgLoad,onError:r.onImgError,draggable:`false`},null,44,J))],34),d(` 底部提示 `),i(`div`,Y,[t[2]||=i(`span`,null,`滚轮缩放 · 拖拽平移 · 双击重置`,-1),i(`span`,X,x(Math.round(r.scale*100))+`%`,1)])],544)}var ne=j(V,[[`render`,Z],[`__scopeId`,`data-v-88f42dc3`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/ImagePreview.vue`]]);n();var re=c({__name:`MarkdownPreview`,props:{content:{type:String,required:!0},allowHtml:{type:Boolean,required:!1,default:!0}},setup(e,{expose:t}){t();let n=e;function r(e){if(typeof document>`u`)return e;let t=document.createElement(`template`);return t.innerHTML=e,t.content.querySelectorAll(`script, style, iframe, object, embed, form, input, button, textarea, select`).forEach(e=>e.remove()),t.content.querySelectorAll(`*`).forEach(e=>{for(let t of Array.from(e.attributes)){let n=t.name.toLowerCase();if(n.startsWith(`on`)||n===`style`||n===`srcdoc`){e.removeAttribute(t.name);continue}if(n===`href`||n===`src`||n===`xlink:href`){let r=t.value.trim().replace(/[\u0000-\u0020]+/g,``);/^(https?:|mailto:|tel:|#|\/|\.\/|\.\.\/)/i.test(r)||n===`src`&&/^data:image\/(?:png|gif|jpe?g|webp);base64,/i.test(r)||e.removeAttribute(t.name)}}e.getAttribute(`target`)===`_blank`&&e.setAttribute(`rel`,`noopener noreferrer`)}),t.innerHTML}let i={props:n,sanitizeRenderedHtml:r,segments:p(()=>{let e=n.content||``,t=[],i=`@@FLOWDASH_MINDMAP_BLOCK_`,a=e.replace(/```[ \t]*mindmap[ \t]*\n([\s\S]*?)```/gi,(e,n)=>{let r=t.length;return t.push({id:r,md:n}),`${i}${r}@@`}),o=A(a,{className:!1,html:n.allowHtml}),s=n.allowHtml?o:r(o),c=RegExp(`(?:<p>)?\\s*${i}(\\d+)@@\\s*(?:</p>)?`,`g`),l=[],u=0,d;for(;(d=c.exec(s))!==null;){d.index>u&&l.push({type:`html`,html:s.slice(u,d.index)});let e=Number(d[1]);l.push({type:`mindmap`,id:e,md:t[e].md,data:N(t[e].md)}),u=d.index+d[0].length}return u<s.length&&l.push({type:`html`,html:s.slice(u)}),l.length===0&&l.push({type:`html`,html:`<p class="md-empty">无内容</p>`}),l}),get MindMap(){return P}};return Object.defineProperty(i,"__isScriptSetup",{enumerable:!1,value:!0}),i}});n();var ie={class:`md-preview`},ae=[`innerHTML`],oe={key:1,class:`md-mindmap`};function se(e,n,r,a,o,s){return _(),S(`div`,ie,[(_(!0),S(k,null,t(a.segments,(e,t)=>(_(),S(k,{key:t},[e.type===`html`?(_(),S(`div`,{key:0,class:`md-segment`,innerHTML:e.html},null,8,ae)):(_(),S(`div`,oe,[n[0]||=i(`div`,{class:`md-mindmap-title`},`四维导图`,-1),f(a.MindMap,{data:e.data,"preview-mode":``,class:`md-mindmap-canvas`},null,8,[`data`])]))],64))),128))])}var ce=j(re,[[`render`,se],[`__scopeId`,`data-v-c5fe3d4b`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/MarkdownPreview.vue`]]);n(),T();var le=c({__name:`OfficePreview`,props:{filePath:{type:String,required:!0},source:{type:String,required:!1,default:`worktree`},rev:{type:String,required:!1,default:``},side:{type:String,required:!1,default:`new`}},setup(t,{expose:n}){n();let r=t,i=a(()=>M(()=>import(`./office-docx-CTz4O0Ml.js`).then(t=>e(t.t(),1)),__vite__mapDeps([0,1,2,3,4]))),o=a(()=>M(()=>import(`./office-excel-DaZCapUD.js`).then(t=>e(t.t(),1)),__vite__mapDeps([5,1,0,2,3,4]))),s=a(()=>M(()=>import(`./office-pptx-CFwyD4jf.js`).then(t=>e(t.t(),1)),__vite__mapDeps([6,1,0,2,3,4]))),c=p(()=>L(r.filePath)),l=p(()=>c.value===`docx`?i:c.value===`xls`||c.value===`xlsx`?o:c.value===`pptx`?s:null),u=p(()=>B(r.filePath,{source:r.source,rev:r.rev,side:r.side})),d=p(()=>z(r.filePath,{source:r.source,rev:r.rev,side:r.side})),f=v(null),m=v(``),h=v(!1),g=v(!1),_=v(!1),y=0;function b(){m.value&&URL.revokeObjectURL(m.value),m.value=``}async function x(e){try{let t=await fetch(d.value);if(!t.ok)throw Error(`HTTP ${t.status}`);if(e!==y)return;m.value=URL.createObjectURL(await t.blob()),_.value=!0,g.value=!1}catch{e===y&&(g.value=!0)}}async function S(){let e=++y;if(h.value=!0,g.value=!1,_.value=!1,f.value=null,b(),!l.value){await x(e),e===y&&(h.value=!1);return}try{let t=await fetch(u.value);if(!t.ok)throw Error(`HTTP ${t.status}`);if(e!==y)return;f.value=await t.arrayBuffer()}catch{await x(e)}finally{e===y&&(h.value=!1)}}function C(){if(!_.value){let e=y;f.value=null,h.value=!0,x(e).finally(()=>{e===y&&(h.value=!1)})}}function T(){S()}w(u,()=>{S()},{immediate:!0}),E(()=>{y++,b()});let D={props:r,DocxPreview:i,ExcelPreview:o,PptxPreview:s,ext:c,officeComponent:l,rawUrl:u,fallbackUrl:d,sourceData:f,fallbackBlobUrl:m,loading:h,failed:g,usingFallback:_,get requestId(){return y},set requestId(e){y=e},revokeFallbackUrl:b,fetchFallback:x,loadPreview:S,onRenderError:C,reload:T};return Object.defineProperty(D,"__isScriptSetup",{enumerable:!1,value:!0}),D}});n(),o();var ue={class:`office-preview`},de={class:`office-preview-toolbar`},fe={class:`office-preview-badge`},pe={key:0,class:`office-preview-side`},me={key:0,class:`office-preview-state`},Q={key:1,class:`office-preview-state office-preview-error`},he=[`src`];function ge(e,t,n,a,o,s){return _(),S(`div`,ue,[i(`div`,de,[t[0]||=i(`span`,{class:`office-preview-title`},`Office 预览`,-1),i(`span`,fe,x(a.ext.toUpperCase()),1),n.source===`git`?(_(),S(`span`,pe,x(n.side===`old`?`旧版本`:`新版本`),1)):d(`v-if`,!0),i(`button`,{class:`office-preview-reload`,type:`button`,onClick:a.reload},`刷新`)]),a.loading?(_(),S(`div`,me,`正在生成预览…`)):a.failed?(_(),S(`div`,Q,[...t[1]||=[i(`p`,null,`无法预览此 Office 文件。`,-1),i(`p`,{class:`office-preview-hint`},`支持 docx、xls/xlsx、pptx;老格式需要安装 LibreOffice 才能兜底预览。`,-1)]])):a.usingFallback?(_(),S(`iframe`,{key:2,class:`office-preview-frame`,src:a.fallbackBlobUrl,title:`Office 文件 PDF 预览`},null,8,he)):a.officeComponent&&a.sourceData?(_(),r(C(a.officeComponent),{key:3,class:`office-preview-document`,src:a.sourceData,onError:a.onRenderError},null,40,[`src`])):d(`v-if`,!0)])}var _e=j(le,[[`render`,ge],[`__scopeId`,`data-v-93e099c2`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/OfficePreview.vue`]]),ve=`allow-scripts allow-forms allow-popups allow-modals`,$=`<script>(function(){
2
+ import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{$n as t,Bn as n,Dn as r,En as i,Fn as a,Fr as o,Ht as s,In as c,J as l,Jr as u,On as d,Pn as f,Tn as p,W as m,Xr as h,Yn as g,Zn as _,br as v,cn as y,cr as b,ei as x,kn as S,nr as C,or as w,pr as T,qn as E,sn as D,wt as O,xn as k}from"./element-plus-Buzx8xRf.js";import{_ as A}from"./vendor-wERX2bc3.js";import{t as j}from"./_plugin-vue_export-helper-DcQKU19k.js";import{ir as M}from"./dagre-CDSwApuC.js";import{n as N,r as P}from"./flow-mindmap-D-65aZb7.js";var F=new Set([`png`,`jpg`,`jpeg`,`gif`,`webp`,`bmp`,`ico`,`svg`]);function ee(e){if(!e)return!1;let t=e.split(`.`).pop()?.toLowerCase()??``;return F.has(t)}function te(e){return`/api/editor/raw?path=${encodeURIComponent(e)}`}var I=new Set([`doc`,`docx`,`xls`,`xlsx`,`ppt`,`pptx`,`odt`,`ods`,`odp`]);function L(e){return e.split(/[\\/]/).pop()?.split(`.`).pop()?.toLowerCase()||``}function R(e){return I.has(L(e))}function z(e,t={}){let n=new URLSearchParams({source:t.source||`worktree`,file:e});return t.rev&&n.set(`rev`,t.rev),t.side&&n.set(`side`,t.side),`/api/office/preview?${n.toString()}`}function B(e,t={}){let n=new URLSearchParams({source:t.source||`worktree`,file:e});return t.rev&&n.set(`rev`,t.rev),t.side&&n.set(`side`,t.side),`/api/office/raw?${n.toString()}`}n(),T();var V=c({__name:`ImagePreview`,props:{filePath:{type:String,required:!0},fileName:{type:String,required:!1}},setup(e,{expose:t}){t();let n=e,r=v(null),i=v(1),a=v(0),o=v(0),c=v(!1),u=v({x:0,y:0}),d=v(null),f=v(!1),m=v(null),h=()=>{if(!r.value||!d.value)return;let e=r.value.clientWidth-32,t=r.value.clientHeight-32;if(e<=0||t<=0)return;let n=Math.min(e/d.value.w,t/d.value.h,1);i.value=n,a.value=0,o.value=0},_=()=>{i.value=Math.min(i.value*1.2,8)},b=()=>{i.value=Math.max(i.value/1.2,.1)},x=()=>{i.value=1,a.value=0,o.value=0,h()},S=e=>{e.preventDefault(),e.deltaY<0?_():b()},C=e=>{e.button===0&&(c.value=!0,u.value={x:e.clientX-a.value,y:e.clientY-o.value})},T=e=>{c.value&&(a.value=e.clientX-u.value.x,o.value=e.clientY-u.value.y)},k=()=>{c.value=!1},A=e=>{let t=e.target;d.value={w:t.naturalWidth,h:t.naturalHeight},f.value=!1,requestAnimationFrame(()=>h())},j=()=>{f.value=!0},M=p(()=>n.fileName||n.filePath?.split(`/`).pop()||``),N=p(()=>te(n.filePath));g(()=>{window.addEventListener(`mousemove`,T),window.addEventListener(`mouseup`,k),window.addEventListener(`resize`,h)}),E(()=>{window.removeEventListener(`mousemove`,T),window.removeEventListener(`mouseup`,k),window.removeEventListener(`resize`,h)}),w(()=>n.filePath,()=>{d.value=null,f.value=!1,i.value=1,a.value=0,o.value=0});let P={props:n,containerRef:r,scale:i,translateX:a,translateY:o,isDragging:c,dragStart:u,naturalSize:d,loadError:f,imgRef:m,fit:h,zoomIn:_,zoomOut:b,reset:x,onWheel:S,onMouseDown:C,onMouseMove:T,onMouseUp:k,onImgLoad:A,onImgError:j,displayName:M,imageUrl:N,get ElIcon(){return l},get ZoomIn(){return D},get ZoomOut(){return y},get Refresh(){return s},get FullScreen(){return O}};return Object.defineProperty(P,"__isScriptSetup",{enumerable:!1,value:!0}),P}});n(),o();var H={class:`image-preview-toolbar`},U=[`title`],W={key:0,class:`image-preview-dim`},G={key:1,class:`image-preview-dim`},K={key:0,class:`image-preview-error`},q={class:`image-preview-error-path`},J=[`src`,`alt`],Y={class:`image-preview-footer`},X={class:`image-preview-zoom`};function Z(e,t,n,r,a,o){let s=m;return _(),S(`div`,{class:`image-preview`,ref:`containerRef`,onWheel:r.onWheel},[d(` 顶部工具条 `),i(`div`,H,[i(`span`,{class:`image-preview-name`,title:r.props.filePath},x(r.displayName),9,U),r.naturalSize?(_(),S(`span`,W,x(r.naturalSize.w)+` × `+x(r.naturalSize.h)+` px`,1)):(_(),S(`span`,G,x(Math.round(r.scale*100))+`%`,1)),t[0]||=i(`div`,{class:`image-preview-spacer`},null,-1),f(s,{content:`放大`,placement:`top`},{default:b(()=>[i(`button`,{class:`image-preview-btn`,onClick:r.zoomIn},[f(r.ElIcon,null,{default:b(()=>[f(r.ZoomIn)]),_:1})])]),_:1}),f(s,{content:`缩小`,placement:`top`},{default:b(()=>[i(`button`,{class:`image-preview-btn`,onClick:r.zoomOut},[f(r.ElIcon,null,{default:b(()=>[f(r.ZoomOut)]),_:1})])]),_:1}),f(s,{content:`适应窗口`,placement:`top`},{default:b(()=>[i(`button`,{class:`image-preview-btn`,onClick:r.reset},[f(r.ElIcon,null,{default:b(()=>[f(r.Refresh)]),_:1})])]),_:1})]),d(` 图片区域 `),i(`div`,{class:u([`image-preview-stage`,{"is-dragging":r.isDragging}]),onMousedown:r.onMouseDown},[r.loadError?(_(),S(`div`,K,[f(r.ElIcon,{size:`32`,color:`var(--color-danger)`},{default:b(()=>[f(r.FullScreen)]),_:1}),t[1]||=i(`p`,null,`图片加载失败`,-1),i(`p`,q,x(r.props.filePath),1)])):(_(),S(`img`,{key:1,ref:`imgRef`,src:r.imageUrl,alt:r.displayName,class:`image-preview-img`,style:h({transform:`translate(${r.translateX}px, ${r.translateY}px) scale(${r.scale})`}),onLoad:r.onImgLoad,onError:r.onImgError,draggable:`false`},null,44,J))],34),d(` 底部提示 `),i(`div`,Y,[t[2]||=i(`span`,null,`滚轮缩放 · 拖拽平移 · 双击重置`,-1),i(`span`,X,x(Math.round(r.scale*100))+`%`,1)])],544)}var ne=j(V,[[`render`,Z],[`__scopeId`,`data-v-88f42dc3`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/ImagePreview.vue`]]);n();var re=c({__name:`MarkdownPreview`,props:{content:{type:String,required:!0},allowHtml:{type:Boolean,required:!1,default:!0}},setup(e,{expose:t}){t();let n=e;function r(e){if(typeof document>`u`)return e;let t=document.createElement(`template`);return t.innerHTML=e,t.content.querySelectorAll(`script, style, iframe, object, embed, form, input, button, textarea, select`).forEach(e=>e.remove()),t.content.querySelectorAll(`*`).forEach(e=>{for(let t of Array.from(e.attributes)){let n=t.name.toLowerCase();if(n.startsWith(`on`)||n===`style`||n===`srcdoc`){e.removeAttribute(t.name);continue}if(n===`href`||n===`src`||n===`xlink:href`){let r=t.value.trim().replace(/[\u0000-\u0020]+/g,``);/^(https?:|mailto:|tel:|#|\/|\.\/|\.\.\/)/i.test(r)||n===`src`&&/^data:image\/(?:png|gif|jpe?g|webp);base64,/i.test(r)||e.removeAttribute(t.name)}}e.getAttribute(`target`)===`_blank`&&e.setAttribute(`rel`,`noopener noreferrer`)}),t.innerHTML}let i={props:n,sanitizeRenderedHtml:r,segments:p(()=>{let e=n.content||``,t=[],i=`@@FLOWDASH_MINDMAP_BLOCK_`,a=e.replace(/```[ \t]*mindmap[ \t]*\n([\s\S]*?)```/gi,(e,n)=>{let r=t.length;return t.push({id:r,md:n}),`${i}${r}@@`}),o=A(a,{className:!1,html:n.allowHtml}),s=n.allowHtml?o:r(o),c=RegExp(`(?:<p>)?\\s*${i}(\\d+)@@\\s*(?:</p>)?`,`g`),l=[],u=0,d;for(;(d=c.exec(s))!==null;){d.index>u&&l.push({type:`html`,html:s.slice(u,d.index)});let e=Number(d[1]);l.push({type:`mindmap`,id:e,md:t[e].md,data:N(t[e].md)}),u=d.index+d[0].length}return u<s.length&&l.push({type:`html`,html:s.slice(u)}),l.length===0&&l.push({type:`html`,html:`<p class="md-empty">无内容</p>`}),l}),get MindMap(){return P}};return Object.defineProperty(i,"__isScriptSetup",{enumerable:!1,value:!0}),i}});n();var ie={class:`md-preview`},ae=[`innerHTML`],oe={key:1,class:`md-mindmap`};function se(e,n,r,a,o,s){return _(),S(`div`,ie,[(_(!0),S(k,null,t(a.segments,(e,t)=>(_(),S(k,{key:t},[e.type===`html`?(_(),S(`div`,{key:0,class:`md-segment`,innerHTML:e.html},null,8,ae)):(_(),S(`div`,oe,[n[0]||=i(`div`,{class:`md-mindmap-title`},`四维导图`,-1),f(a.MindMap,{data:e.data,"preview-mode":``,class:`md-mindmap-canvas`},null,8,[`data`])]))],64))),128))])}var ce=j(re,[[`render`,se],[`__scopeId`,`data-v-c5fe3d4b`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/MarkdownPreview.vue`]]);n(),T();var le=c({__name:`OfficePreview`,props:{filePath:{type:String,required:!0},source:{type:String,required:!1,default:`worktree`},rev:{type:String,required:!1,default:``},side:{type:String,required:!1,default:`new`}},setup(t,{expose:n}){n();let r=t,i=a(()=>M(()=>import(`./office-docx-CTz4O0Ml.js`).then(t=>e(t.t(),1)),__vite__mapDeps([0,1,2,3,4]))),o=a(()=>M(()=>import(`./office-excel-DaZCapUD.js`).then(t=>e(t.t(),1)),__vite__mapDeps([5,1,0,2,3,4]))),s=a(()=>M(()=>import(`./office-pptx-CFwyD4jf.js`).then(t=>e(t.t(),1)),__vite__mapDeps([6,1,0,2,3,4]))),c=p(()=>L(r.filePath)),l=p(()=>c.value===`docx`?i:c.value===`xls`||c.value===`xlsx`?o:c.value===`pptx`?s:null),u=p(()=>B(r.filePath,{source:r.source,rev:r.rev,side:r.side})),d=p(()=>z(r.filePath,{source:r.source,rev:r.rev,side:r.side})),f=v(null),m=v(``),h=v(!1),g=v(!1),_=v(!1),y=0;function b(){m.value&&URL.revokeObjectURL(m.value),m.value=``}async function x(e){try{let t=await fetch(d.value);if(!t.ok)throw Error(`HTTP ${t.status}`);if(e!==y)return;m.value=URL.createObjectURL(await t.blob()),_.value=!0,g.value=!1}catch{e===y&&(g.value=!0)}}async function S(){let e=++y;if(h.value=!0,g.value=!1,_.value=!1,f.value=null,b(),!l.value){await x(e),e===y&&(h.value=!1);return}try{let t=await fetch(u.value);if(!t.ok)throw Error(`HTTP ${t.status}`);if(e!==y)return;f.value=await t.arrayBuffer()}catch{await x(e)}finally{e===y&&(h.value=!1)}}function C(){if(!_.value){let e=y;f.value=null,h.value=!0,x(e).finally(()=>{e===y&&(h.value=!1)})}}function T(){S()}w(u,()=>{S()},{immediate:!0}),E(()=>{y++,b()});let D={props:r,DocxPreview:i,ExcelPreview:o,PptxPreview:s,ext:c,officeComponent:l,rawUrl:u,fallbackUrl:d,sourceData:f,fallbackBlobUrl:m,loading:h,failed:g,usingFallback:_,get requestId(){return y},set requestId(e){y=e},revokeFallbackUrl:b,fetchFallback:x,loadPreview:S,onRenderError:C,reload:T};return Object.defineProperty(D,"__isScriptSetup",{enumerable:!1,value:!0}),D}});n(),o();var ue={class:`office-preview`},de={class:`office-preview-toolbar`},fe={class:`office-preview-badge`},pe={key:0,class:`office-preview-side`},me={key:0,class:`office-preview-state`},Q={key:1,class:`office-preview-state office-preview-error`},he=[`src`];function ge(e,t,n,a,o,s){return _(),S(`div`,ue,[i(`div`,de,[t[0]||=i(`span`,{class:`office-preview-title`},`Office 预览`,-1),i(`span`,fe,x(a.ext.toUpperCase()),1),n.source===`git`?(_(),S(`span`,pe,x(n.side===`old`?`旧版本`:`新版本`),1)):d(`v-if`,!0),i(`button`,{class:`office-preview-reload`,type:`button`,onClick:a.reload},`刷新`)]),a.loading?(_(),S(`div`,me,`正在生成预览…`)):a.failed?(_(),S(`div`,Q,[...t[1]||=[i(`p`,null,`无法预览此 Office 文件。`,-1),i(`p`,{class:`office-preview-hint`},`支持 docx、xls/xlsx、pptx;老格式需要安装 LibreOffice 才能兜底预览。`,-1)]])):a.usingFallback?(_(),S(`iframe`,{key:2,class:`office-preview-frame`,src:a.fallbackBlobUrl,title:`Office 文件 PDF 预览`},null,8,he)):a.officeComponent&&a.sourceData?(_(),r(C(a.officeComponent),{key:3,class:`office-preview-document`,src:a.sourceData,onError:a.onRenderError},null,40,[`src`])):d(`v-if`,!0)])}var _e=j(le,[[`render`,ge],[`__scopeId`,`data-v-93e099c2`],[`__file`,`C:/workspace/github_workspace/xz333221/zen-gitsync/src/ui/client/src/components/OfficePreview.vue`]]),ve=`allow-scripts allow-forms allow-popups allow-modals`,$=`<script>(function(){
3
3
  try{window.localStorage.getItem('__zk')}catch(e){
4
4
  var d={};var s={getItem:function(k){return Object.prototype.hasOwnProperty.call(d,k)?d[k]:null},setItem:function(k,v){d[k]=String(v)},removeItem:function(k){delete d[k]},clear:function(){d={}},key:function(i){var ks=Object.keys(d);return i<ks.length?ks[i]:null}};
5
5
  Object.defineProperty(window,'localStorage',{get:function(){return s},configurable:true});
@@ -1 +1 @@
1
- import{br as e,pr as t}from"./element-plus-Buzx8xRf.js";import{S as n}from"./vendor-wERX2bc3.js";import{n as r}from"./_plugin-vue_export-helper-VuE2vqnn.js";import{a as i,i as a}from"./configStore-De_8eQuS.js";t();var o=6e5;function s(e){if(!e||typeof e!=`object`)return null;let t=e;return typeof t.name!=`string`||!t.name?null:{name:t.name,detail:typeof t.detail==`string`&&t.detail?t.detail:null,provider:typeof t.provider==`string`&&t.provider?t.provider:null,source:t.source===`config`||t.source===`state`?t.source:null}}var c=n(`tools`,()=>{let t=e(!1),n=e(!1),c=e(!1),l=e(!1),u=e(!1),d=e(!1),f=e(!1),p=e(null),m=e(!1),h=e(``),g=e({}),_=e({}),v=e({}),y=e(!1),b=0,x=null;function S(e=!1){return!e&&Date.now()-b<3e5?Promise.resolve():x||(y.value=!0,x=(async()=>{try{let e=await(await fetch(`/api/latest-tool-versions`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({})})).json();e.success&&e.latest&&typeof e.latest==`object`&&(v.value=e.latest,b=Date.now())}catch{}finally{y.value=!1,x=null}})(),x)}let C=null;function w(){return C||(m.value=!0,C=(async()=>{try{let e=await(await fetch(`/api/check-tools`)).json();e.success&&(t.value=!!e.vscode,n.value=!!e.claude,c.value=!!e.codex,l.value=!!e.opencode,u.value=!!e.kimi,d.value=!!e.zcode,f.value=!!e.dsh,h.value=typeof e.platform==`string`?e.platform:``,g.value=e.installers&&typeof e.installers==`object`?e.installers:{},_.value=e.versions&&typeof e.versions==`object`?e.versions:{},p.value=Date.now())}catch{}finally{m.value=!1,C=null}})(),C)}function T(e){switch(e){case`vscode`:return t.value;case`claude`:return n.value;case`codex`:return c.value;case`opencode`:return l.value;case`kimi`:return u.value;case`zcode`:return d.value;case`dsh`:return f.value}}let E=e({}),D=e(!1),O=0,k=null;function A(e){if(!D.value)return{status:`unknown`};if(!i(e))return{status:`unset`};let t=E.value[e];return t?{status:`set`,info:t}:{status:`unset`}}function j(e=!1){return!e&&D.value&&Date.now()-O<6e5?Promise.resolve():k||(k=(async()=>{try{let e=await(await fetch(`/api/workbench/executor-models`)).json();if(e?.success&&e.models&&typeof e.models==`object`){let t={};for(let n of a)t[n.id]=s(e.models[n.id]);E.value=t,D.value=!0,O=Date.now()}}catch{}finally{k=null}})(),k)}function M(e){let t=A(e);return t.status===`unknown`?``:t.status===`set`?t.info.name:r(`@42BB9:未在配置中指定`)}function N(e){let t=A(e);return t.status===`set`?[t.info.source===`state`?r(`@42BB9:CLI 内最近使用`):``,t.info.detail,t.info.provider].filter(Boolean).join(` · `):``}let P=null;function F(){P||=(w(),j(),setInterval(()=>{w(),j()},o))}function I(){P&&=(clearInterval(P),null)}return{vscodeAvailable:t,claudeAvailable:n,codexAvailable:c,opencodeAvailable:l,kimiAvailable:u,zcodeAvailable:d,dshAvailable:f,lastCheckedAt:p,isChecking:m,platform:h,installers:g,versions:_,latestVersions:v,isFetchingLatest:y,isToolAvailable:T,executorModels:E,executorModelsReady:D,executorModelState:A,executorModelText:M,executorModelDetail:N,fetchExecutorModels:j,checkTools:w,fetchLatestVersions:S,startPolling:F,stopPolling:I}});export{c as t};
1
+ import{br as e,pr as t}from"./element-plus-Buzx8xRf.js";import{S as n}from"./vendor-wERX2bc3.js";import{n as r}from"./_plugin-vue_export-helper-DcQKU19k.js";import{a as i,i as a}from"./configStore-u3FUM08v.js";t();var o=6e5;function s(e){if(!e||typeof e!=`object`)return null;let t=e;return typeof t.name!=`string`||!t.name?null:{name:t.name,detail:typeof t.detail==`string`&&t.detail?t.detail:null,provider:typeof t.provider==`string`&&t.provider?t.provider:null,source:t.source===`config`||t.source===`state`?t.source:null}}var c=n(`tools`,()=>{let t=e(!1),n=e(!1),c=e(!1),l=e(!1),u=e(!1),d=e(!1),f=e(!1),p=e(null),m=e(!1),h=e(``),g=e({}),_=e({}),v=e({}),y=e(!1),b=0,x=null;function S(e=!1){return!e&&Date.now()-b<3e5?Promise.resolve():x||(y.value=!0,x=(async()=>{try{let e=await(await fetch(`/api/latest-tool-versions`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({})})).json();e.success&&e.latest&&typeof e.latest==`object`&&(v.value=e.latest,b=Date.now())}catch{}finally{y.value=!1,x=null}})(),x)}let C=null;function w(){return C||(m.value=!0,C=(async()=>{try{let e=await(await fetch(`/api/check-tools`)).json();e.success&&(t.value=!!e.vscode,n.value=!!e.claude,c.value=!!e.codex,l.value=!!e.opencode,u.value=!!e.kimi,d.value=!!e.zcode,f.value=!!e.dsh,h.value=typeof e.platform==`string`?e.platform:``,g.value=e.installers&&typeof e.installers==`object`?e.installers:{},_.value=e.versions&&typeof e.versions==`object`?e.versions:{},p.value=Date.now())}catch{}finally{m.value=!1,C=null}})(),C)}function T(e){switch(e){case`vscode`:return t.value;case`claude`:return n.value;case`codex`:return c.value;case`opencode`:return l.value;case`kimi`:return u.value;case`zcode`:return d.value;case`dsh`:return f.value}}let E=e({}),D=e(!1),O=0,k=null;function A(e){if(!D.value)return{status:`unknown`};if(!i(e))return{status:`unset`};let t=E.value[e];return t?{status:`set`,info:t}:{status:`unset`}}function j(e=!1){return!e&&D.value&&Date.now()-O<6e5?Promise.resolve():k||(k=(async()=>{try{let e=await(await fetch(`/api/workbench/executor-models`)).json();if(e?.success&&e.models&&typeof e.models==`object`){let t={};for(let n of a)t[n.id]=s(e.models[n.id]);E.value=t,D.value=!0,O=Date.now()}}catch{}finally{k=null}})(),k)}function M(e){let t=A(e);return t.status===`unknown`?``:t.status===`set`?t.info.name:r(`@42BB9:未在配置中指定`)}function N(e){let t=A(e);return t.status===`set`?[t.info.source===`state`?r(`@42BB9:CLI 内最近使用`):``,t.info.detail,t.info.provider].filter(Boolean).join(` · `):``}let P=null;function F(){P||=(w(),j(),setInterval(()=>{w(),j()},o))}function I(){P&&=(clearInterval(P),null)}return{vscodeAvailable:t,claudeAvailable:n,codexAvailable:c,opencodeAvailable:l,kimiAvailable:u,zcodeAvailable:d,dshAvailable:f,lastCheckedAt:p,isChecking:m,platform:h,installers:g,versions:_,latestVersions:v,isFetchingLatest:y,isToolAvailable:T,executorModels:E,executorModelsReady:D,executorModelState:A,executorModelText:M,executorModelDetail:N,fetchExecutorModels:j,checkTools:w,fetchLatestVersions:S,startPolling:F,stopPolling:I}});export{c as t};
@@ -10,26 +10,26 @@
10
10
  <meta name="theme-color" content="#141820" media="(prefers-color-scheme: dark)" />
11
11
  <title>Zen GitSync</title>
12
12
  <!-- 字体改为自托管(@font-face 见 src/main.css),不再依赖 Google Fonts 外链 -->
13
- <script type="module" crossorigin src="/assets/index-Bq_-TrTP.js"></script>
13
+ <script type="module" crossorigin src="/assets/index-DorcTBZN.js"></script>
14
14
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-C0FnF6B9.js">
15
15
  <link rel="modulepreload" crossorigin href="/assets/dagre-CDSwApuC.js">
16
16
  <link rel="modulepreload" crossorigin href="/assets/element-plus-Buzx8xRf.js">
17
17
  <link rel="modulepreload" crossorigin href="/assets/vendor-wERX2bc3.js">
18
- <link rel="modulepreload" crossorigin href="/assets/_plugin-vue_export-helper-VuE2vqnn.js">
19
- <link rel="modulepreload" crossorigin href="/assets/SvgIcon-ub85vovN.js">
20
- <link rel="modulepreload" crossorigin href="/assets/IconButton-Cgc5v9vb.js">
21
- <link rel="modulepreload" crossorigin href="/assets/configStore-De_8eQuS.js">
18
+ <link rel="modulepreload" crossorigin href="/assets/_plugin-vue_export-helper-DcQKU19k.js">
19
+ <link rel="modulepreload" crossorigin href="/assets/SvgIcon-YQZtv72i.js">
20
+ <link rel="modulepreload" crossorigin href="/assets/IconButton-C07zojvw.js">
21
+ <link rel="modulepreload" crossorigin href="/assets/configStore-u3FUM08v.js">
22
22
  <link rel="modulepreload" crossorigin href="/assets/socket-io-BFqQXqAp.js">
23
- <link rel="modulepreload" crossorigin href="/assets/gitStore-BP6TATf7.js">
23
+ <link rel="modulepreload" crossorigin href="/assets/gitStore-ZjHYEyKS.js">
24
24
  <link rel="modulepreload" crossorigin href="/assets/fileIcon-B5p5pGN9.js">
25
25
  <link rel="modulepreload" crossorigin href="/assets/flow-mindmap-D-65aZb7.js">
26
- <link rel="modulepreload" crossorigin href="/assets/previewSandbox-DcVlFmag.js">
26
+ <link rel="modulepreload" crossorigin href="/assets/previewSandbox-KLKRAhm4.js">
27
27
  <link rel="modulepreload" crossorigin href="/assets/monaco-BD8Gy_t7.js">
28
28
  <link rel="modulepreload" crossorigin href="/assets/useThemeObserver-CWioG2jb.js">
29
- <link rel="modulepreload" crossorigin href="/assets/CommonDialog-BTeIpgGT.js">
30
- <link rel="modulepreload" crossorigin href="/assets/FileDiffViewer-zqgG9ok3.js">
31
- <link rel="modulepreload" crossorigin href="/assets/toolsStore-CQclze0T.js">
32
- <link rel="modulepreload" crossorigin href="/assets/TemplateManager-uDno_64z.js">
29
+ <link rel="modulepreload" crossorigin href="/assets/CommonDialog-DuI8Bsg7.js">
30
+ <link rel="modulepreload" crossorigin href="/assets/FileDiffViewer-DtGtQGLR.js">
31
+ <link rel="modulepreload" crossorigin href="/assets/toolsStore-CfyhqJeq.js">
32
+ <link rel="modulepreload" crossorigin href="/assets/TemplateManager-zSKmah02.js">
33
33
  <link rel="modulepreload" crossorigin href="/assets/vue-flow-KUZI4f_9.js">
34
34
  <link rel="stylesheet" crossorigin href="/assets/element-plus-Qexo5hiM.css">
35
35
  <link rel="stylesheet" crossorigin href="/assets/vendor-CP-WuGZG.css">
@@ -50,7 +50,7 @@ import configManager from '../../../../config.js';
50
50
 
51
51
  // 单轮工具调用循环数的兜底值(防失控);实际值取全局配置 aiMaxToolIterations,
52
52
  // 与 CLI 侧 src/cli/ai/agent.js 共用同一个配置项。
53
- const DEFAULT_MAX_TOOL_ITERATIONS = 200;
53
+ const DEFAULT_MAX_TOOL_ITERATIONS = 1000;
54
54
 
55
55
  // 读取全局配置里的单轮工具调用上限。
56
56
  // 读配置失败不该把整轮对话打挂 —— 退回默认值继续跑,比用户消息直接发不出去好。
@@ -363,6 +363,10 @@ function normalizeReport(raw) {
363
363
  .filter(t => t && typeof t === 'object')
364
364
  .map(t => ({
365
365
  taskId: typeof t.taskId === 'string' ? t.taskId : null,
366
+ // 这一轮执行的 job id。**别再把它归一掉**(2026-10-03 补):面板靠它判断
367
+ // 「这份报告讲的活还在不在跑」—— 同一个任务重跑一轮会换一个 job,
368
+ // 只比 taskId 会把上一轮的报告认成当前的。老记录没有这一项,留 null。
369
+ jobId: typeof t.jobId === 'string' && t.jobId ? t.jobId : null,
366
370
  taskTitle: typeof t.taskTitle === 'string' ? t.taskTitle : '',
367
371
  projectName: typeof t.projectName === 'string' ? t.projectName : '',
368
372
  startedAt: typeof t.startedAt === 'string' ? t.startedAt : null,
@@ -222,3 +222,29 @@ test('老报告(没有 percent 这个字段)读出来是 null,不是 0', a
222
222
  // 字段本身得在:前端拿 undefined 和拿 null 是两种分支,缺字段会让"不画"那条路走不到
223
223
  assert.ok('percent' in r.tasks[0]);
224
224
  });
225
+
226
+ // ── jobId(面板判"这份报告讲的活还在不在跑")────────────────────────────
227
+ //
228
+ // 2026-10-03:面板改成"报告只在它讲的任务还在跑时才挂在主位",判据就是事实里的 jobId
229
+ // 对上 running 里的 jobId(同一个任务重跑一轮会换一个 job,只比 taskId 会把上一轮
230
+ // 的报告认成当前的)。而 jobId 是 buildRunningFacts 早就写好的,**只差 normalizeReport
231
+ // 没把它留下来** —— 归一时被抹掉的话,面板永远退化成"拿不到 id",这个判据形同虚设。
232
+
233
+ test('事实里的 jobId 写进去、读回来都还在(别在归一那一步抹掉)', async () => {
234
+ await seed([]);
235
+ await appendReport(rawReport({
236
+ text: '正在收尾。',
237
+ tasks: [{ ...fact('t1', '任务 A'), jobId: 'job-1' }],
238
+ }));
239
+ const [r] = await readReports();
240
+ assert.equal(r.tasks[0].jobId, 'job-1');
241
+ // 落盘那份也得带着(读的那条可能来自内存缓存,写错字段要到下一次读盘才暴露)
242
+ assert.equal((await onDisk())[0].tasks[0].jobId, 'job-1');
243
+ });
244
+
245
+ test('老记录没有 jobId 时是 null(不是 undefined —— 前端两种走的是不同分支)', async () => {
246
+ await seed([rawReport({ id: 'legacy', tasks: [fact('t1', '老任务')] })]);
247
+ const [r] = await readReports();
248
+ assert.ok('jobId' in r.tasks[0], '字段本身必须在');
249
+ assert.equal(r.tasks[0].jobId, null);
250
+ });