dsh-mutipleagent 0.0.0-stage → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/CHANGELOG.md +149 -0
  2. package/CONTRIBUTING.md +49 -0
  3. package/LICENSE +21 -0
  4. package/README.en.md +95 -0
  5. package/README.md +273 -2
  6. package/SECURITY.md +27 -0
  7. package/THIRD_PARTY_NOTICES.md +29 -0
  8. package/assets/agents/MAGPIE-LICENSE +21 -0
  9. package/assets/agents/README.md +47 -0
  10. package/assets/agents/antigravity.png +0 -0
  11. package/assets/agents/claude.png +0 -0
  12. package/assets/agents/codex.png +0 -0
  13. package/assets/agents/copilot.svg +1 -0
  14. package/assets/agents/dsh.svg +1 -0
  15. package/assets/agents/gemini.png +0 -0
  16. package/assets/agents/grok.svg +1 -0
  17. package/assets/agents/hermes.svg +1 -0
  18. package/assets/agents/kimi.svg +1 -0
  19. package/assets/agents/omp.svg +7 -0
  20. package/assets/agents/opencode.svg +1 -0
  21. package/assets/agents/pi.svg +1 -0
  22. package/assets/kenney/LICENSE-furniture-kit.txt +23 -0
  23. package/assets/kenney/LICENSE-mini-characters.txt +28 -0
  24. package/assets/kenney/characters/Textures/colormap.png +0 -0
  25. package/assets/kenney/characters/character-female-a.glb +0 -0
  26. package/assets/kenney/characters/character-female-b.glb +0 -0
  27. package/assets/kenney/characters/character-female-c.glb +0 -0
  28. package/assets/kenney/characters/character-female-d.glb +0 -0
  29. package/assets/kenney/characters/character-female-e.glb +0 -0
  30. package/assets/kenney/characters/character-female-f.glb +0 -0
  31. package/assets/kenney/characters/character-male-a.glb +0 -0
  32. package/assets/kenney/characters/character-male-b.glb +0 -0
  33. package/assets/kenney/characters/character-male-c.glb +0 -0
  34. package/assets/kenney/characters/character-male-d.glb +0 -0
  35. package/assets/kenney/characters/character-male-e.glb +0 -0
  36. package/assets/kenney/characters/character-male-f.glb +0 -0
  37. package/assets/kenney/furniture/benchCushion.glb +0 -0
  38. package/assets/kenney/furniture/bookcaseOpen.glb +0 -0
  39. package/assets/kenney/furniture/books.glb +0 -0
  40. package/assets/kenney/furniture/cabinetTelevision.glb +0 -0
  41. package/assets/kenney/furniture/cardboardBoxClosed.glb +0 -0
  42. package/assets/kenney/furniture/chairCushion.glb +0 -0
  43. package/assets/kenney/furniture/chairDesk.glb +0 -0
  44. package/assets/kenney/furniture/chairModernCushion.glb +0 -0
  45. package/assets/kenney/furniture/coatRackStanding.glb +0 -0
  46. package/assets/kenney/furniture/computerKeyboard.glb +0 -0
  47. package/assets/kenney/furniture/computerMouse.glb +0 -0
  48. package/assets/kenney/furniture/computerScreen.glb +0 -0
  49. package/assets/kenney/furniture/desk.glb +0 -0
  50. package/assets/kenney/furniture/doorway.glb +0 -0
  51. package/assets/kenney/furniture/kitchenBar.glb +0 -0
  52. package/assets/kenney/furniture/kitchenCabinet.glb +0 -0
  53. package/assets/kenney/furniture/kitchenCoffeeMachine.glb +0 -0
  54. package/assets/kenney/furniture/kitchenFridgeLarge.glb +0 -0
  55. package/assets/kenney/furniture/kitchenMicrowave.glb +0 -0
  56. package/assets/kenney/furniture/kitchenSink.glb +0 -0
  57. package/assets/kenney/furniture/lampRoundFloor.glb +0 -0
  58. package/assets/kenney/furniture/lampSquareTable.glb +0 -0
  59. package/assets/kenney/furniture/laptop.glb +0 -0
  60. package/assets/kenney/furniture/loungeChairRelax.glb +0 -0
  61. package/assets/kenney/furniture/loungeSofa.glb +0 -0
  62. package/assets/kenney/furniture/plantSmall1.glb +0 -0
  63. package/assets/kenney/furniture/plantSmall2.glb +0 -0
  64. package/assets/kenney/furniture/plantSmall3.glb +0 -0
  65. package/assets/kenney/furniture/pottedPlant.glb +0 -0
  66. package/assets/kenney/furniture/radio.glb +0 -0
  67. package/assets/kenney/furniture/rugRectangle.glb +0 -0
  68. package/assets/kenney/furniture/rugRound.glb +0 -0
  69. package/assets/kenney/furniture/sideTable.glb +0 -0
  70. package/assets/kenney/furniture/speaker.glb +0 -0
  71. package/assets/kenney/furniture/stoolBar.glb +0 -0
  72. package/assets/kenney/furniture/table.glb +0 -0
  73. package/assets/kenney/furniture/tableCoffee.glb +0 -0
  74. package/assets/kenney/furniture/tableRound.glb +0 -0
  75. package/assets/kenney/furniture/televisionModern.glb +0 -0
  76. package/assets/kenney/furniture/toaster.glb +0 -0
  77. package/assets/kenney/furniture/trashcan.glb +0 -0
  78. package/assets/kenney/furniture/wallWindow.glb +0 -0
  79. package/assets/logo.svg +12 -0
  80. package/assets/scene-icons/arcade.png +0 -0
  81. package/assets/scene-icons/cafe.png +0 -0
  82. package/assets/scene-icons/castle.png +0 -0
  83. package/assets/scene-icons/christmas.png +0 -0
  84. package/assets/scene-icons/graveyard.png +0 -0
  85. package/assets/scene-icons/map.png +0 -0
  86. package/assets/scene-icons/office.png +0 -0
  87. package/assets/scene-icons/pirate.png +0 -0
  88. package/assets/scene-icons/station.png +0 -0
  89. package/assets/scenes/arcade.jpg +0 -0
  90. package/assets/scenes/cafe.jpg +0 -0
  91. package/assets/scenes/castle.jpg +0 -0
  92. package/assets/scenes/christmas.jpg +0 -0
  93. package/assets/scenes/graveyard.jpg +0 -0
  94. package/assets/scenes/office.jpg +0 -0
  95. package/assets/scenes/pirate.jpg +0 -0
  96. package/assets/scenes/station.jpg +0 -0
  97. package/client.js +90 -0
  98. package/cordis.patch.yml +3 -0
  99. package/harness.cjs +49 -0
  100. package/package.json +87 -4
  101. package/public/app.js +1 -0
  102. package/public/chunks/chunk-RQUUGNU7.js +4305 -0
  103. package/public/demo-icons/arrow-counterclockwise.svg +4 -0
  104. package/public/demo-icons/arrow-right.svg +3 -0
  105. package/public/demo-icons/bell.svg +3 -0
  106. package/public/demo-icons/box-seam-fill.svg +3 -0
  107. package/public/demo-icons/chat-left-text-fill.svg +3 -0
  108. package/public/demo-icons/check-lg.svg +3 -0
  109. package/public/demo-icons/chevron-down.svg +3 -0
  110. package/public/demo-icons/cpu-fill.svg +4 -0
  111. package/public/demo-icons/crosshair.svg +3 -0
  112. package/public/demo-icons/diagram-3-fill.svg +3 -0
  113. package/public/demo-icons/file-earmark-code-fill.svg +3 -0
  114. package/public/demo-icons/fullscreen.svg +3 -0
  115. package/public/demo-icons/pause-fill.svg +3 -0
  116. package/public/demo-icons/people-fill.svg +3 -0
  117. package/public/demo-icons/pie-chart-fill.svg +3 -0
  118. package/public/demo-icons/play-fill.svg +3 -0
  119. package/public/demo-icons/search.svg +3 -0
  120. package/public/demo-icons/shield-check.svg +4 -0
  121. package/public/demo-icons/stack.svg +4 -0
  122. package/public/demo-icons/x-lg.svg +3 -0
  123. package/public/demo.css +173 -0
  124. package/public/demo.html +64 -0
  125. package/public/demo.js +7 -0
  126. package/public/index.html +59 -0
  127. package/public/style.css +15 -0
  128. package/public/vendor/office.js +1631 -0
  129. package/src/codex.js +674 -0
  130. package/src/demo.js +103 -0
  131. package/src/harness-watcher.js +584 -0
  132. package/src/server.js +239 -0
  133. package/vendor/licenses/BOOTSTRAP-ICONS-LICENSE.txt +21 -0
  134. package/vendor/licenses/ESBUILD-LICENSE.txt +21 -0
  135. package/vendor/licenses/MESHOPTIMIZER-LICENSE.txt +22 -0
  136. package/vendor/licenses/PLAYWRIGHT-LICENSE.txt +202 -0
  137. package/vendor/licenses/PLAYWRIGHT-NOTICE.txt +5 -0
  138. package/vendor/licenses/THREE-LICENSE.txt +21 -0
package/public/demo.js ADDED
@@ -0,0 +1,7 @@
1
+ import{a as dt,b as st,c as W,d as qe,e as ut,f as ht,g as Me,h as Ce,i as pt,j as ft,k as mt,l as gt,m as ot,n as yt,o as it,p as vt,q as bt,r as kt,s as wt,t as rt,u as n,v as J,w as xt,x as Se,y as he,z as Ge}from"./chunks/chunk-RQUUGNU7.js";var Et=[{x:5.5,y:5.35,yaw:180,pose:"sit"},{x:5.5,y:12,yaw:180,pose:"sit"},{x:11.2,y:9.4,yaw:180,pose:"sit"},{x:16.9,y:6.5,yaw:180,pose:"sit"}],Lt={blue:"#1769e8",white:"#f6f9fe",steel:"#d2dce8",navy:"#233d61"},M=(t,e,s,o,d,p={})=>({f:t,x:e,y:s,w:o,d,...p}),Z=(t,e,s,o,d,p,i=0)=>({special:"box",x:t,y:e,w:s,d:o,h:d,color:p,y0:i,abs:!0});function Mt(t=4,e="codex"){let s=Et.map(i=>({...i}));for(let i=s.length;i<t;i++){let u=i-Et.length;s.push({x:5.5+u%3*5.7,y:21.5+Math.floor(u/3)*5.5,yaw:180,pose:"sit"})}let o=Math.max(20,...s.map(i=>i.y+2.8)),d=[{special:"floor",x:-12,y:-12,w:48,d:o+26,color:"#dce4ee",color2:"#d2dce8",tile:8},{special:"floor",x:.1,y:.1,w:22,d:o-2.1,color:"#e9edf3",color2:"#dee5ee",tile:4.2,y0:.012},{special:"wall",axis:"x",x:-1,y:.05,len:25,h:4.3,color:"#e7eef7",holes:[[1.1,4.5,1.3,3.8],[7,4.5,1.3,3.8],[13,4.5,1.3,3.8],[19,3.5,1.3,3.8]],frame:"#c3cfdf"},{special:"wall",axis:"z",x:.05,y:0,len:o,h:3.4,color:"#e4ebf5",holes:[[2,3,1.1,2.9],[7,3,1.1,2.9],[13,3,1.1,2.9]],frame:"#c7d2e1"},Z(0,.15,22,.1,.12,"#bbcbdc"),Z(.15,0,.1,o-2,.12,"#bbcbdc"),{special:"floor",x:1.2,y:1.8,w:6.5,d:5.2,color:"#d6e3ef",color2:"#d6e3ef",y0:.02},{special:"glass",x:7.65,y:1.7,w:.05,d:4.9,h:2.5,abs:!0},Z(7.6,1.7,.12,4.9,.07,"#9cacbf",2.5),Z(7.6,1.7,.1,.1,2.5,"#becddd"),Z(7.6,6.5,.1,.1,2.5,"#becddd"),M("table",3,3.4,3.8,1.6,{h:.88,stretch:!0}),M("laptop",4.6,3.8,.7,.6,{y0:.9,abs:!0,rot:180}),M("computerScreen",5.2,4.3,.95,.32,{h:.6,y0:.9,abs:!0,rot:0}),M("computerKeyboard",5.15,4.72,.7,.22,{y0:.9,abs:!0}),M("computerMouse",5.95,4.72,.12,.18,{y0:.9,abs:!0}),M("chairDesk",5.125,4.95,.75,.8,{h:1,rot:180}),M("chairModernCushion",3.2,5.1,.65,.7,{rot:180}),M("chairModernCushion",3.2,2.6,.65,.7),M("chairModernCushion",5.6,2.6,.65,.7),M("bookcaseOpen",1.1,.35,2.5,.5,{h:1.8}),M("books",1.3,.5,1.4,.25,{h:.3,y0:1,abs:!0}),M("pottedPlant",7,.7,.6,.6,{h:1.6}),M("pottedPlant",.7,7,.55,.55,{h:1.4}),{special:"sign",x:4.5,y:.12,z:2.75,w:3,h:.64,text:n(e==="harness"?"scene.sign.harness":"scene.sign.codex"),bg:"#f0f5fc",fg:"#265a9d"}],p=[[3,3.4,3.8,1.6],[7.6,1.7,.12,4.8]];for(let i of s.slice(1)){let{x:u,y:r}=i;d.push({special:"floor",x:u-2.2,y:r-2.7,w:4.5,d:3.9,color:"#e1e9f3",color2:"#e1e9f3",y0:.024},Z(u-1.65,r-1.65,3.3,1,.92,"#f7faff"),Z(u-1.7,r-1.7,3.4,1.1,.08,"#176de8",.92),Z(u-1.7,r-1.7,.07,1.1,.96,"#397bd5"),Z(u+1.63,r-1.7,.07,1.1,.96,"#397bd5"),M("computerScreen",u-.6,r-1.5,1,.35,{h:.62,y0:1,abs:!0,rot:0}),M("computerScreen",u+.45,r-1.45,.75,.3,{h:.53,y0:1,abs:!0,rot:-12}),M("computerKeyboard",u-.45,r-.74,.75,.22,{y0:1.02,abs:!0}),M("computerMouse",u+.45,r-.72,.13,.18,{y0:1.02,abs:!0}),M("chairDesk",u-.375,r-.4,.75,.8,{h:1,rot:180}),M("plantSmall1",u-1.3,r-1.3,.3,.3,{h:.4,y0:1.02,abs:!0}),M("cardboardBoxClosed",u+1,r+.35,.55,.5,{h:.45})),p.push([u-1.7,r-1.7,3.4,1.1])}for(let[i,u]of[[10.1,1.4],[13,1.4],[16,1.4],[19,1.4],[20.3,7.3],[20.3,10.4]]){d.push(Z(i,u,1.8,1,2.6,"#e9eff6"));for(let r of[0,1.73])d.push(Z(i+r,u,.07,1,2.7,Lt.blue));for(let r of[.18,.72,1.26,1.8,2.34])d.push(Z(i+.12,u+.97,1.55,.05,.35,"#455b78",r)),d.push({special:"glow",x:i+.23,y:u+1.025,y0:r+.12,w:.12,d:.025,h:.035,color:"#52b9ff",intensity:1,abs:!0});p.push([i,u,1.8,1])}return d.push(M("loungeSofa",15.5,14.7,3.8,1.3,{h:1.05}),M("tableCoffee",16.4,16.2,2.1,.8,{h:.5}),M("books",16.9,16.4,.5,.3,{h:.18,y0:.52,abs:!0}),M("kitchenCabinet",1,17,4,.9,{h:1,stretch:!0}),M("kitchenCoffeeMachine",1.4,17.2,.65,.5,{h:.65,y0:1.01,abs:!0}),M("kitchenSink",3.4,17.1,1,.7,{h:.15,y0:1.01,abs:!0}),M("pottedPlant",20.7,15.7,.7,.7,{h:1.5}),M("pottedPlant",8.7,16.8,.6,.6,{h:1.5}),{special:"sign",x:17.5,y:.12,z:3,w:3.2,h:.65,text:n("scene.sign.agents"),bg:"#edf4fe",fg:"#3d6591"}),{W:23,D:o,viewH:4.3,background:"#e7edf7",sky:"#dcecff",spawn:{x:1,y:15},walk:[[0,0,23,o]],solid:p,stations:s,pois:[],props:d}}function Ne(t){t.traverse(e=>{if(e.geometry?.dispose(),e.material)for(let s of Array.isArray(e.material)?e.material:[e.material])s.dispose()})}var Re=class extends wt{constructor(e,{onSelect:s,reduced:o=!1,pins:d,count:p=4,live:i=!1,source:u="codex"}){super(e,{count:p,onSelect:s,reduced:o,live:i,scene:Mt(p,u)}),this.pins=d,this.selectCallback=s,this.routeGroup=null,this.routeId=null,this.eventRoutes=[],this.activityLog=new Map,this.screenDesk=null,this.screenMesh=null,this.screenRefs=null,this.screenReturnFocus=null,this.screenInert=[],this.playing=!1,this.raycaster=new kt,this.onFrame=()=>this.updatePins(),this.offLang=he(()=>this.paintScreens(!0)),this.canvas.addEventListener("pointerdown",r=>{this.downPoint={x:r.clientX,y:r.clientY}}),this.gl&&(this.gl.toneMappingExposure=1.15,this.gl.setClearColor("#e7edf7"),this.hemi.color.set("#f2f8ff"),this.hemi.groundColor.set("#a2b2ca"),this.sun.color.set("#ffffff"),this.sun.shadow.mapSize.set(2048,2048),this.sun.shadow.radius=4)}fitCamera3D(e){if(!this.camera||!this.controls||!this.sun)return;let s=this.cw<850,o=Math.max(0,this.plan.D-20),d=new W(s?10.2:12.65,.35,(s?8.8:8.15)+o*.45);(e||!this.fitted)&&(this.camera.position.copy(d).add(new W(22,21.5,22)),this.controls.target.copy(d),this.camera.zoom=1,this.fitted=!0);let p=(s?21:Math.max(19.5,28*this.ch/this.cw))+o*.85,i=p*this.cw/this.ch;Object.assign(this.camera,{left:-i/2,right:i/2,top:p/2,bottom:-p/2}),this.camera.lookAt(this.controls.target),this.camera.updateProjectionMatrix(),this.sun.position.set(5,19,7),this.sun.target.position.set(11,0,9+o*.5);let u=18+o;Object.assign(this.sun.shadow.camera,{left:-u,right:u,top:u,bottom:-u,near:1,far:55+o}),this.sun.shadow.camera.updateProjectionMatrix()}build(){super.build(),this.floorMark("COORDINATION",4.8,7.1,3.9,.55),this.floorMark("AGENT WORKSPACE",4.5,14,4.4,.5),this.floorMark("COLLABORATION LANE",11,12.6,5.2,.55),this.floorMark("VERIFICATION",16.5,9,3.9,.5);let e=new qe;for(let o=0;o<8;o++){let d=new Ce(new ot(.28,1.3),new vt({color:"#f6faff",roughness:.9}));d.rotation.x=-Math.PI/2,d.rotation.z=-.55,d.position.set(8+o*.45,.03,15.3),e.add(d)}this.room.add(e),this.screens=new Map,this.screenMeshes=[],this.screenList=[];let s=new Map;for(let o of this.sceneScreens||[]){if(o.kind!=="computerScreen")continue;let d=null,p=1/0;for(let i of this.plan.desks){let u=Math.hypot(o.x-i.seat.x,o.z-i.seat.y);u<p&&(p=u,d=i)}d&&p<2.2&&(o.mesh.userData.desk=d,this.screenMeshes.push(o.mesh),this.screenList.push({desk:d,mesh:o.mesh,record:o}),(!s.has(d)||p<s.get(d))&&(s.set(d,p),this.screens.set(d,o.mesh)))}this.routeId=null,this.makeRoute(this.selectedId||this.rootId),this.paintScreens(!0)}floorMark(e,s,o,d,p){let i=document.createElement("canvas");i.width=768,i.height=128;let u=i.getContext("2d");u.clearRect(0,0,768,128),u.fillStyle="#899eb9",u.font='600 38px "Segoe UI",sans-serif',u.textAlign="center",u.textBaseline="middle",u.fillText(e,384,64);let r=new ft(i);r.colorSpace=dt;let c=new Ce(new ot(d,p),new Me({map:r,transparent:!0,depthWrite:!1}));c.rotation.x=-Math.PI/2,c.position.set(s,.036,o),this.room.add(c)}actorFor(e){let s=super.actorFor(e);return s?(s.demoScale||(s.obj.scale.multiplyScalar(1.65),s.head&&s.head.scale.multiplyScalar(.78),s.obj.userData.agentId=e.s.id,s.demoScale=!0),s):null}setTeam(e,s){this.rootId!==s&&(this.clearEventRoutes(),this.routeId=null),super.setTeam(e,s);for(let o of this.people.values())o.desk.pose="sit";this.selectedId&&!this.people.has(this.selectedId)&&(this.selectedId=s),this.makeRoute(this.selectedId||s),this.paintScreens()}bubble(){}screenPoint(e){let s=e.desk.seat;return new W(s.x+.1,1.3,s.y-1.15)}pathBetween(e,s){if(!e?.desk||!s?.desk||e===s)return null;let o=this.screenPoint(e),d=this.screenPoint(s),p=o.distanceTo(d),i=new W((o.x+d.x)/2,Math.max(o.y,d.y)+.75+Math.min(1.3,p*.1),(o.z+d.z)/2+.35);return new mt([o,i,d],!1,"centripetal",.5)}addRouteLine(e,s){for(let[d,p,i]of[[.18,"#42c8ff",.16],[.065,"#0870ff",.94]])e.add(new Ce(new it(s,100,d,6,!1),new Me({color:p,transparent:!0,opacity:i,depthWrite:!1,depthTest:!1})));let o=new pt(new ut().setFromPoints(s.getPoints(70)),new bt({color:"#e9fbff",dashSize:.12,gapSize:.18,linewidth:2}));o.computeLineDistances(),e.add(o)}clearEventRoutes(){for(let e of this.eventRoutes||[])this.scene?.remove(e.group),Ne(e.group);this.eventRoutes=[]}makeRoute(e){let s=this.people?.get(e);if(!this.loaded||!this.room||!s)return;let o=this.people.get(s.s.parentId),d=[e,s.desk.seat.x,s.desk.seat.y,o?.s.id,o?.desk.seat.x,o?.desk.seat.y].join(":");if(this.routeId===e&&this.routeSignature===d)return;this.routeGroup&&(this.scene.remove(this.routeGroup),Ne(this.routeGroup)),this.routeId=e,this.routeSignature=d,this.routeGroup=new qe,this.scene.add(this.routeGroup);let p=s.desk.seat;this.routeCurve=this.pathBetween(o,s),this.packet=null,this.routeCurve&&(this.addRouteLine(this.routeGroup,this.routeCurve),this.packet=null);for(let i of[-1,1])for(let u of[-1,1]){let r=p.x+i*1.95,c=p.y-.4+u*1.4;for(let m of[[new W(r,.05,c),new W(r-i*.6,.05,c)],[new W(r,.05,c),new W(r,.05,c-u*.5)],[new W(r,.05,c),new W(r,.7,c)]]){let y=new gt(m[0],m[1]);this.routeGroup.add(new Ce(new it(y,1,.035,6,!1),new Me({color:"#08a0ff"})))}}}select(e,s=!1){if(this.selectedId=e,this.makeRoute(e),s&&this.cw<850){let o=this.people.get(e);if(o&&this.camera){let d=new W(o.x,.3,o.y);this.camera.position.add(d.clone().sub(this.controls.target)),this.controls.target.copy(d)}}}updatePins(){if(!(!this.pins||!this.camera||!this.loaded))for(let e of this.pins.children){let s=this.people.get(e.dataset.agent);if(!s)continue;let o=new W(s.x,2.2,s.y-.4).project(this.camera),d=(o.x+1)*.5*this.cw,p=(1-o.y)*.5*this.ch;e.style.left=d+"px",e.style.top=p+"px",e.hidden=o.z>1||d<-40||d>this.cw+40||p<70||p>this.ch-70}}animateEvent(e){if(this.remember(e),e.type==="report"&&super.animateEvent(e),this.flows=[],this.reduced||!this.loaded||!["assign","message","report"].includes(e.type))return;let s=this.people.get(e.sessionId),o=this.people.get(e.type==="report"?s?.s.parentId:e.targetId),d=this.pathBetween(s,o);if(!d)return;let p=new qe;this.addRouteLine(p,d);let i=performance.now(),u=[];for(let r=0;r<3;r++){let c=new Ce(new yt(.105,12,8),new Me({color:r?"#bfefff":"#ffffff",transparent:!0,opacity:.95,depthWrite:!1,depthTest:!1}));c.visible=!1,p.add(c),u.push(c)}this.scene.add(p);for(let r of[s,o])if(r?.desk)for(let c of this.screenList||[])c.desk===r.desk&&(c.mesh.userData.flashUntil=i+900);for(this.eventRoutes.push({group:p,curve:d,packets:u,start:i});this.eventRoutes.length>12;){let r=this.eventRoutes.shift();this.scene.remove(r.group),Ne(r.group)}}setReduced(e){super.setReduced(e),e&&this.clearEventRoutes()}step(e){this.playing&&super.step(e)}syncActors(e){this.hemi&&(this.hemi.intensity=1.6),this.sun&&(this.sun.intensity=2),super.syncActors(this.playing?e:0)}pointer(e,s){if(this.screenModal)return;if(!s){if(e.buttons||!this.camera||!this.loaded)return;let c=this.canvas.getBoundingClientRect();this.raycaster.setFromCamera(new st((e.clientX-c.left)/c.width*2-1,1-(e.clientY-c.top)/c.height*2),this.camera),this.canvas.style.cursor=this.raycaster.intersectObjects(this.screenMeshes||[],!1).length?"pointer":"";return}if(!this.camera||!this.loaded||this.downPoint&&Math.hypot(e.clientX-this.downPoint.x,e.clientY-this.downPoint.y)>6)return;let o=this.canvas.getBoundingClientRect();this.raycaster.setFromCamera(new st((e.clientX-o.left)/o.width*2-1,1-(e.clientY-o.top)/o.height*2),this.camera);let d=this.raycaster.intersectObjects([...this.actors.values()].map(c=>c.obj),!0),i=this.raycaster.intersectObjects(this.screenMeshes||[],!1)[0];if(i&&(!d[0]||i.distance<d[0].distance)){let c=i.object.userData.desk;if(c){this.openScreen(c,i.object);return}}for(let c of d){let m=c.object;for(;m&&!m.userData.agentId;)m=m.parent;if(m?.userData.agentId){this.selectCallback(m.userData.agentId);return}}let u=new ht(new W(0,1,0),0),r=new W;if(this.raycaster.ray.intersectPlane(u,r))for(let c of this.people.values()){let m=c.desk.seat;if(Math.abs(r.x-m.x)<2.1&&Math.abs(r.z-m.y+.5)<1.8){this.selectCallback(c.s.id);return}}}screenStatus(e){let s={working:"#5ee0a0",tool:"#5ee0a0",typing:"#5ee0a0",thinking:"#f0c35e",done:"#5ee0a0",waiting:"#f0c35e",waiting_agents:"#f0c35e",error:"#ff7a6b",interrupted:"#f0a35e",closed:"#8fa6c6",idle:"#8fa6c6",unknown:"#8fa6c6"},o="scene.screen."+e;return[rt(o)?n(o):String(e||n("scene.screen.unknown")),s[e]||"#8fa6c6"]}remember(e){let s=e.sessionId||e.targetId;if(!s)return;let o="scene.activity."+e.type,d=rt(o)?n(o):n("scene.activity.event"),p=this.activityLog.get(s)||[],i=Number(e.at),u=new Date(Number.isFinite(i)&&i>0?i:Date.now()).toLocaleTimeString(J(),{hour12:!1});p.unshift({time:u,label:d,text:e.preview||e.title||""}),this.activityLog.set(s,p.slice(0,6))}screenInfo(e){if(!e)return{empty:!0};let s=e.s,[o,d]=this.screenStatus(s.status);return{name:s.name,code:s.code,statusText:o,statusColor:d,task:s.task||s.title||n("scene.screen.waitingTask"),context:s.file&&s.file!==n("common.notRecorded")?s.file:"",log:this.activityLog.get(s.id)||[],updated:new Date().toLocaleTimeString(J(),{hour12:!1})}}paintScreens(e=!1){for(let s of this.screenList||[]){let o=[...this.people.values()].find(r=>r.desk===s.desk)||null,d=this.screenInfo(o),p=o?[o.s.id,o.s.status,o.s.task,o.s.file,d.log[0]?.time||""].join("|"):"empty";if(!e&&s.sig===p)continue;s.sig=p;let i=this.screenCanvas(s.record.seed,512,d);s.record.canvas=i;let u=s.mesh.userData.screenTexture;u&&(u.image=i,u.needsUpdate=!0)}this.screenModal&&this.updateScreenModal()}screenText(e,s){if(!s)return[n("scene.screen.unassigned"),"",n("scene.screen.waitingSeat")].join(`
2
+ `);let[o]=this.screenStatus(s.s.status),d=[s.s.name+" \xB7 "+(s.s.role||n("common.agent")),n("scene.screen.statusLine",{status:o}),n("scene.screen.taskLine",{task:e.task||n("scene.screen.waitingTask")}),e.context?n("scene.screen.contextLine",{value:e.context}):n("scene.screen.contextNone"),"",n("scene.screen.recent")];if(e.log.length)for(let p of e.log)d.push(p.time+" "+p.label+" "+p.text);else d.push(n("scene.screen.noEvents"));return d.join(`
3
+ `)}updateScreenModal(){let e=this.screenRefs;if(!e||!this.screenDesk)return;let s=[...this.people.values()].find(u=>u.desk===this.screenDesk)||null,o=this.screenInfo(s),[d,p]=this.screenStatus(s?.s.status);e.name.textContent=s?.s.name||n("scene.screen.idleSeat"),e.sub.textContent=s?[s.s.role||n("common.agent"),d].filter(Boolean).join(" \xB7 "):n("scene.screen.noAgentSeated"),e.dot.style.background=p,e.dot.style.boxShadow="0 0 10px "+p,e.card.dataset.status=s?.s.status||"empty";let i=Number(this.screenMesh?.userData?.screenSeed)||0;e.body.replaceChildren(this.screenCanvas(i,1280,o)),e.live.textContent=this.screenText(o,s),e.meta.textContent=s?[s.s.code||"AGENT",o.context?n("scene.screen.contextLine",{value:o.context}):n("scene.screen.contextNone")].join(" \xB7 "):n("scene.screen.unassigned"),e.task.textContent=s?o.task:n("scene.screen.waitingSeat"),e.task.title=e.task.textContent,e.hint.textContent=n("scene.screen.escHint"),e.close.setAttribute("aria-label",n("scene.screen.closeAria"))}openScreenFor(e){let s=this.people.get(e);if(!s?.desk)return!1;let o=(this.screenList||[]).find(d=>d.desk===s.desk);return o?(this.openScreen(s.desk,o.mesh),!0):!1}openScreen(e,s){this.screenModal&&this.closeScreen(),this.screenDesk=e,this.screenMesh=s||(this.screenList||[]).find(k=>k.desk===e)?.mesh||null,this.screenReturnFocus=document.activeElement;let o=document.createElement("div");o.className="screen-modal";let d=document.createElement("div");d.className="screen-modal-card",d.setAttribute("role","dialog"),d.setAttribute("aria-modal","true");let p="screen-modal-title-"+Math.random().toString(36).slice(2,8);d.setAttribute("aria-labelledby",p);let i=document.createElement("header"),u=document.createElement("span");u.className="screen-modal-dot";let r=document.createElement("div");r.className="screen-modal-title";let c=document.createElement("strong");c.id=p;let m=document.createElement("small");r.append(c,m);let y=document.createElement("button");y.type="button",y.className="screen-modal-close",y.setAttribute("aria-label",n("scene.screen.closeAria")),y.textContent="\xD7",i.append(u,r,y);let T=document.createElement("div");T.className="screen-modal-body";let E=document.createElement("pre");E.className="screen-modal-live";let D=document.createElement("footer"),L=document.createElement("span");L.className="screen-modal-meta";let P=document.createElement("span");P.className="screen-modal-task";let g=document.createElement("span");g.className="screen-modal-hint",g.textContent=n("scene.screen.escHint"),D.append(L,P,g),d.append(i,T,E,D),o.appendChild(d),this.screenRefs={overlay:o,card:d,name:c,sub:m,dot:u,body:T,live:E,meta:L,task:P,hint:g,close:y},o.addEventListener("click",k=>{k.target===o&&this.closeScreen()}),y.addEventListener("click",()=>this.closeScreen()),o.addEventListener("keydown",k=>{k.key==="Escape"?(k.preventDefault(),this.closeScreen()):k.key==="Tab"?(k.preventDefault(),y.focus()):k.key==="/"&&k.preventDefault()}),this.screenEsc=k=>{k.key==="Escape"&&this.screenModal&&this.closeScreen()},window.addEventListener("keydown",this.screenEsc),this.screenInert=[...document.body.children].filter(k=>k!==o&&!["SCRIPT","STYLE","LINK"].includes(k.tagName));for(let k of this.screenInert)k.dataset.screenInert=k.inert?"1":"0",k.inert=!0;document.body.appendChild(o),this.screenModal=o,this.updateScreenModal(),y.focus()}closeScreen(){this.screenEsc&&window.removeEventListener("keydown",this.screenEsc),this.screenEsc=null,this.screenModal&&(this.screenModal.remove(),this.screenModal=null);for(let s of this.screenInert||[])s.inert=s.dataset.screenInert==="1",delete s.dataset.screenInert;this.screenInert=[],this.screenRefs=null,this.screenDesk=null,this.screenMesh=null;let e=this.screenReturnFocus;if(this.screenReturnFocus=null,e&&e.isConnected)try{e.focus({preventScroll:!0})}catch{}}draw(){let e=performance.now();for(let o of this.eventRoutes||[]){let d=e-o.start;for(let p=0;p<o.packets.length;p++){let i=o.packets[p],u=(d-120-p*240)/1500;if(u<0||u>1){i.visible=!1;continue}i.visible=!0,i.position.copy(o.curve.getPoint(u)),i.scale.setScalar(1-.3*Math.max(0,u-.72)/.28)}d>=2200&&(this.scene.remove(o.group),Ne(o.group))}this.eventRoutes&&(this.eventRoutes=this.eventRoutes.filter(o=>e-o.start<2200));let s=super.draw();if(this.packet&&this.routeCurve){let o=this.reduced||!this.playing?.58:performance.now()%4500/4500;this.packet.position.copy(this.routeCurve.getPoint(o)),this.packet.position.y+=.09}return s}destroy(){this.offLang?.(),this.closeScreen(),this.clearEventRoutes(),this.routeGroup&&Ne(this.routeGroup),super.destroy()}};var le=48,Ct=["search","review"],Nt={search:"TASK-07843",review:"TASK-07844"},De=(t,e)=>[0,1,2,3].map(s=>n("demo.scenario."+t+"."+e+"."+s));function Dt(t){let e=Ct.includes(t)?t:"search",s={title:n("demo.scenario."+e+".title"),project:n("demo.scenario."+e+".project"),code:Nt[e],titles:De(e,"titles"),tasks:De(e,"tasks"),files:De(e,"files"),reports:De(e,"reports")};return e==="review"&&(s.roles=De(e,"roles")),s}var ct=(t,e,s)=>Math.max(e,Math.min(s,t)),ve=["main","api","frontend","test"],Ie=[0,3,5,7],at=[48,23,31,37],Ht=["diagram-3-fill","cpu-fill","file-earmark-code-fill","shield-check"];function Ot(t=16,e="search"){let s=ct(Number(t)||0,0,le),o=Dt(e),d=ve.map(m=>n("demo.name."+m)),p=ve.map(m=>n("demo.role."+m)),i=ve.map(m=>n("demo.zone."+m)),u=s<7?0:s<25?1:s<37?2:3,r=ve.map((m,y)=>{let T=Math.round(y===0?s/le*100:ct((s-Ie[y])/(at[y]-Ie[y]),0,1)*100),E=s>=at[y];return{id:m,key:m,parentId:y?"main":null,rootId:"main",agent:"codex",subagent:y>0,name:d[y],title:o.titles[y],role:(o.roles||p)[y],zone:i[y],icon:Ht[y],task:o.tasks[y],file:o.files[y],code:o.code.slice(0,-1)+(Number(o.code.slice(-1))+y),progress:T,status:E?"done":s<Ie[y]?"unknown":y===0&&s>=7&&s<37?"waiting_agents":"tool",startedAt:Ie[y]*1e3,report:E?o.reports[y]:null,reportPreview:E?n("demo.preview.ready"):y?T<25?n("demo.preview.analyzing"):T<75?n("demo.preview.running"):n("demo.preview.compiling"):n("demo.preview.coordinating")}}),c=[...ve.slice(1).map((m,y)=>({id:"assign-"+m,sessionId:"main",targetId:m,type:"assign",at:Ie[y+1],preview:o.tasks[y+1]})),...ve.slice(1).map((m,y)=>({id:"report-"+m,sessionId:m,targetId:"main",type:"report",at:at[y+1],preview:o.reports[y+1]})),{id:"final-main",sessionId:"main",type:"report",at:48,preview:o.reports[0]}].filter(m=>m.at<=s).sort((m,y)=>m.at-y.at);return{mode:"demo",rootId:"main",scenario:e,config:o,seconds:s,stage:u,agents:r,events:c,assigned:r.slice(1).filter(m=>s>=Ie[ve.indexOf(m.id)]).length,received:r.slice(1).filter(m=>m.status==="done").length,active:r.filter(m=>m.status!=="done"&&m.status!=="unknown").length,progress:Math.round(s/le*100),complete:s>=le}}var Ve=class extends EventTarget{constructor(){super(),this.seconds=16,this.playing=!1,this.scenario="search"}get snapshot(){return Ot(this.seconds,this.scenario)}changed(){this.dispatchEvent(new Event("change"))}play(){this.seconds>=le&&(this.seconds=0),this.playing=!this.playing,this.changed()}restart(){this.seconds=0,this.playing=!0,this.changed()}setScenario(e){Ct.includes(e)&&(this.scenario=e,this.seconds=16,this.playing=!1,this.changed())}advance(e){!this.playing||!Number.isFinite(e)||e<=0||(this.seconds=ct(this.seconds+e,0,le),this.seconds===le&&(this.playing=!1),this.changed())}};var jt=new Set(["thinking","tool","typing","waiting","waiting_agents"]),lt=new Set(["done","error","interrupted","closed"]);function He(t,e=68){let s=typeof t=="string"?t.replace(/\s+/g," ").trim():"";return s.length>e?s.slice(0,e)+"\u2026":s}function Ft(t){return typeof t=="string"?t.replace(/[\\/]+$/,"").split(/[\\/]/).pop():""}function St(t,e){return t?e+"-"+String(t).slice(-8):e}function zt(t,e,s){if(e)return n("live.reportReady");if(t.reportEventId)return s?n("live.reportHistorical"):n("live.reportPending");switch(t.status){case"done":return n("live.endedNoReport");case"error":return n("live.errored");case"interrupted":return n("live.interrupted");case"closed":return n("live.agentClosed");case"waiting":return He(t.activity)||n("live.waitingUser");case"waiting_agents":return n("live.awaitingSubagents");case"typing":return n("live.typingMessage");case"tool":return He(t.activity)||n("live.runningTool");case"thinking":return n("live.thinking");case"idle":return n("live.idle");default:return n("live.awaitingLog")}}function Kt(t,e){if(e)return"diagram-3-fill";let s=[t.role,t.task].filter(Boolean).join(" ");return/测试|检查|审查|review|test/i.test(s)?"shield-check":/前端|界面|frontend|\bUI\b/i.test(s)?"file-earmark-code-fill":"cpu-fill"}function Ut(t,e,s){if(!Number.isFinite(e?.turnStartedAt)||!lt.has(t.status))return!1;let o=[t.lastEventAt,t.endedAt].filter(Number.isFinite);return!o.length||Math.max(...o)>=e.turnStartedAt?!1:!s.concat(Array.isArray(t.events)?t.events:[]).some(p=>p.targetId===t.id&&(p.type==="assign"||p.type==="message")&&p.at>=e.turnStartedAt)}function Bt(t,e,s){if(!t.reportEventId)return!1;let o=s.concat(Array.isArray(t.events)?t.events:[]),d=o.find(r=>r.id===t.reportEventId&&r.type==="report"),p=o.filter(r=>t.id!==e?.id&&r.targetId===t.id&&(r.type==="assign"||r.type==="message")&&Number.isFinite(r.at)),i=[e?.turnStartedAt,t.turnStartedAt,...p.map(r=>r.at)].filter(Number.isFinite),u=Number.isFinite(d?.at)?d.at:Number.isFinite(t.endedAt)?t.endedAt:t.lastEventAt;return!Number.isFinite(u)||!i.length||u>=Math.max(...i)}var We=class{constructor(){this.rootId=null,this.slots=new Map,this.nextSlot=1}update(e={},s=Date.now()){let o=e.rootId||null;o!==this.rootId&&(this.rootId=o,this.slots.clear(),this.nextSlot=1),o&&this.slots.set(o,0);let d=Array.isArray(e.roots)?e.roots:[],p=Array.isArray(e.agents)?e.agents:[],i=Array.isArray(e.events)?e.events:[],u=p.find(g=>g.id===o),r=d.find(g=>g.id===o),c=p.map(g=>{let k=g.id===o;this.slots.has(g.id)||this.slots.set(g.id,this.nextSlot++);let H=this.slots.get(g.id),j=g.name||(k?n("live.leadName"):n("live.subName",{id:String(g.id).slice(-8)})),B=!k&&Ut(g,u,i),G=Bt(g,u,i);return{...g,agent:g.agent||(e.source==="harness"?"dsh":"codex"),source:g,slot:H,historical:B,name:j,title:He(g.task||k&&r?.title||g.role||j),role:g.role||(k?n("app.roleLead"):n("app.roleSubAgent")),zone:k?n("live.zoneLead"):n("live.zoneSlot",{slot:H}),icon:Kt(g,k),file:He(g.activity||g.model)||n("common.notRecorded"),code:St(g.id,"AGENT"),progress:g.status==="done"?100:null,report:null,hasReport:G,currentHasReport:G,reportPreview:zt(g,G,B)}}).sort((g,k)=>g.slot-k.slot),m=c.filter(g=>g.id!==o&&g.parentId&&!g.historical),y=m.filter(g=>g.hasReport).length,T=u?.status==="done",E=m.length?1:0;y&&(E=2),(T||c.find(g=>g.id===o)?.hasReport||u?.status==="typing"&&m.length>0&&m.every(g=>lt.has(g.status)))&&(E=3);let D=Number.isFinite(u?.turnStartedAt),L=s;lt.has(u?.status)&&(L=Number.isFinite(u.endedAt)?u.endedAt:Number.isFinite(u.lastEventAt)?u.lastEventAt:s);let P=D?Math.max(0,Math.floor((L-u.turnStartedAt)/1e3)):0;return{...e,mode:"live",rootId:o,scenario:o,config:{title:He(u?.task||r?.title||u?.name)||(e.source==="harness"?n("live.harnessSession"):n("live.codexSession")),project:Ft(u?.cwd||r?.cwd)||(e.source==="harness"?n("live.harnessName"):n("live.codexName")),code:St(o,"SESSION")},seconds:P,elapsedKnown:D,stage:E,agents:c,events:i,roots:d,warnings:Array.isArray(e.warnings)?e.warnings:[],assigned:m.length,received:y,active:c.filter(g=>jt.has(g.status)).length,progress:T?100:null,complete:T}}};function be(t=""){let e=new URL(".",globalThis.document?.baseURI||location.href);return new URL(t.replace(/^\/+/,""),e).href}function Oe(){return new URLSearchParams(location.search).get("source")==="harness"?"harness":"codex"}function je(t=!1,e=Oe()){let s=new URL(be("demo.html"));return t&&s.searchParams.set("mode","live"),e==="harness"&&s.searchParams.set("source","harness"),s.href}function Je(t,e=!1){if(t!=="harness")return;document.title=n(e?"meta.harnessLive":"meta.harnessDemo");let s=document.querySelector(".brand");s.href=je(e,t),s.querySelector(":scope > span:last-child").replaceChildren("DSH",Object.assign(document.createElement("span"),{className:"brand-light",textContent:"Office"})),document.querySelector(".profile-avatar img").src=be("assets/agents/dsh.svg"),document.getElementById("dialog-mode").textContent="DSH OFFICE / "+(e?"LIVE":"DEMO")}function ke(t){if(typeof t!="string"||!t.trim())return"";let e=t.trim().replace(/\\/g,"/").replace(/\/+$/,"")||"/";return/^[a-z]:\//i.test(e)||/^[a-z]:$/i.test(e)||e.startsWith("//")?e.toLowerCase():e}function _e(t=[]){let e=new Map;for(let s of t){let o=ke(s.cwd);e.has(o)||e.set(o,{key:o,path:s.cwd?.trim()||n("common.noDirectory"),count:0}),e.get(o).count++}return[...e.values()]}function Fe(t=[],e){return t.filter(s=>ke(s.cwd)===e)}function ze(t){let e=typeof t.title=="string"?t.title.replace(/\s+/g," ").trim():"",s=Number.isFinite(t.createdAt)?t.createdAt:t.at,o=Number.isFinite(s)?new Date(s):null,d=o&&!Number.isNaN(o.getTime())?o.toLocaleString(J(),{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",hour12:!1}):n("common.timeNotRecorded");return[e?e.slice(0,46)+(e.length>46?"\u2026":""):n("common.unnamedSession"),d,String(t.id).slice(-8)].join(" \xB7 ")}var $e=class extends EventTarget{constructor(e){super(),this.adapter=new We,this.kind=Oe(),this.storageKey=this.kind==="harness"?"office.harness.live.root":"office.live.root",this.directoryKey=this.kind==="harness"?localStorage.getItem("office.harness.live.directory")??null:null,this.explicitRootId=e||null,this.raw={source:this.kind},this.rootId=e||localStorage.getItem(this.storageKey)||"",this.follow=!e,this.connection="connecting",this.error="",this.generation=0,this.baseline=!0,this.knownRoots=new Set,this.records=new Map}get snapshot(){return this.adapter.update(this.raw)}changed(e=!1){this.dispatchEvent(new CustomEvent("change",{detail:{baseline:e}}))}async connect(e=this.rootId){let s=++this.generation;this.rootId=e||"",this.source?.close(),this.abort?.abort(),this.abort=new AbortController,this.baseline=!0,this.connection="connecting",this.error="",this.changed(!0);try{let o=await fetch(be("api/sessions?"+new URLSearchParams(e?{rootId:e}:{})),{signal:this.abort.signal});o.status===404&&e&&!new URLSearchParams(location.search).get("rootId")&&(o=await fetch(be("api/sessions"),{signal:this.abort.signal}));let d=await o.json();if(!o.ok)throw new Error(d.error||n("source.sessionReadFail"));if(s!==this.generation||(this.accept(d),s!==this.generation))return;let p=new URLSearchParams(this.rootId?{rootId:this.rootId}:{}),i=this.source=new EventSource(be("events?"+p));i.onopen=()=>{s===this.generation&&(this.baseline=!0,this.connection="connected",this.error="",this.changed(!0))},i.onmessage=u=>{if(s===this.generation)try{this.accept(JSON.parse(u.data))}catch(r){this.error=n("source.eventReadFail",{message:r.message}),this.changed(!0)}},i.onerror=()=>{s===this.generation&&(this.baseline=!0,this.connection="reconnecting",this.error=n("source.disconnected"),this.changed(!0))}}catch(o){if(s!==this.generation||o.name==="AbortError")return;this.connection="error",this.error=o.message,this.changed(!0)}}accept(e){if(e.mode&&e.mode!=="live")throw new Error(n("source.demoData"));e.source==="harness"&&this.kind!=="harness"&&(this.kind="harness",this.storageKey="office.harness.live.root",this.directoryKey=localStorage.getItem("office.harness.live.directory")??null);let s=e.roots||[],o=s;if(this.kind==="harness"&&s.length){let u=s.find(c=>c.id===e.rootId),r=_e(s);if((this.explicitRootId===u?.id||!r.some(c=>c.key===this.directoryKey))&&(this.directoryKey=ke((u||s[0]).cwd)),this.explicitRootId=null,localStorage.setItem("office.harness.live.directory",this.directoryKey),o=Fe(s,this.directoryKey),!o.some(c=>c.id===e.rootId)){this.raw={...this.raw,roots:s},this.select(o[0].id,!0);return}}let d=o[0],p=this.knownRoots.size&&d&&!this.knownRoots.has(d.id);for(let u of e.roots||[])this.knownRoots.add(u.id);if(this.follow&&p&&d.id!==e.rootId){this.raw={...this.raw,roots:s},this.select(d.id,!0);return}let i=this.baseline||e.rootId!==this.raw.rootId||e.agents?.some(u=>u.loading);this.raw={...e,source:this.kind},this.rootId=e.rootId||"",this.rootId&&localStorage.setItem(this.storageKey,this.rootId),this.changed(i),this.baseline=!!e.agents?.some(u=>u.loading)}select(e,s=!1){if(this.kind==="harness"){let d=this.raw.roots?.find(p=>p.id===e);if(!d||this.directoryKey!==null&&ke(d.cwd)!==this.directoryKey)return Promise.resolve(!1);this.directoryKey=ke(d.cwd),localStorage.setItem("office.harness.live.directory",this.directoryKey)}this.explicitRootId=null,s||(this.follow=!1),this.raw={source:this.kind,rootId:e,roots:this.raw.roots||[],agents:[],events:[]},this.records.clear();let o=new URL(location.href);return o.searchParams.set("rootId",e),history.replaceState(null,"",o),this.connect(e)}async openSession(e){let s=this.raw.roots?.find(o=>o.id===e);if(!s)return!1;this.kind==="harness"&&(this.directoryKey=ke(s.cwd),localStorage.setItem("office.harness.live.directory",this.directoryKey)),this.explicitRootId=null,this.follow=!1;try{return await this.select(e)!==!1}catch{return!1}}selectDirectory(e){let s=Fe(this.raw.roots,e);if(!s.length)return Promise.resolve(!1);this.directoryKey=e,localStorage.setItem("office.harness.live.directory",e);let o=s.find(d=>d.id===this.rootId)||s[0];return this.select(o.id,!0)}async record(e,s){let o=e+":"+s;if(this.records.has(o))return this.records.get(o);let d=await fetch(be("api/report?"+new URLSearchParams({sessionId:e,eventId:s}))),p=await d.json();if(!d.ok)throw new Error(p.error||n("source.recordReadFail"));return this.records.set(o,p.text),p.text}destroy(){this.generation++,this.abort?.abort(),this.source?.close()}};var pe=null,qt=0,_=(t,e,s)=>{let o=document.createElement(t);return e&&(o.className=e),s!=null&&(o.textContent=s),o},Xe=(t,e)=>{let s=_("img",e);return s.src="./demo-icons/"+t+".svg",s.alt="",s},Rt=t=>t.trim().toLowerCase().replace(/\\/g,"/");function Ae(){pe?.close()}function fe(t,{filterable:e=!0}={}){t.id||(t.id="office-select-"+ ++qt);let s=_("div","office-select"),o=_("button","select-trigger");o.type="button",o.id=t.id+"-trigger";let d=[...t.labels];for(let b of d)b.htmlFor=o.id;let p=_("span","select-value");o.append(p,Xe("chevron-down","select-chevron")),s.append(o),t.after(s),t.hidden=!0;let i=_("div","select-popover");i.id=t.id+"-popover",i.setAttribute("popover","manual"),i.hidden=!0,(t.closest("dialog")||document.body).append(i);let u=_("form","select-filter"),r=_("input","select-filter-input");r.type="text",r.autocomplete="off",r.spellcheck=!1;let c=_("button","select-filter-clear");c.type="button",c.setAttribute("aria-label",n("controls.clearFilter")),c.append(Xe("x-lg")),u.append(Xe("search"),r,c);let m=_("div","select-options");m.id=t.id+"-options",m.role="listbox";let y=_("p","select-empty",n("controls.noMatch"));y.role="status",e?i.append(u,m,y):i.append(m,y),o.setAttribute("aria-haspopup","listbox"),o.setAttribute("aria-controls",m.id),e&&(r.setAttribute("role","combobox"),r.setAttribute("aria-autocomplete","list"),r.setAttribute("aria-controls",m.id));let T=new AbortController,E=T.signal,D=[],L=[],P=null,g=!1,k=!1,H="",j="";function B(){if(!g)return;let b=o.getBoundingClientRect(),C=window.visualViewport;if(!b.width||!b.height){z();return}let A=(C?.offsetLeft||0)+12,N=(C?.offsetTop||0)+12,S=A+(C?.width||innerWidth)-24,q=N+(C?.height||innerHeight)-24,V=Number(t.dataset.popoverMinWidth)||360,X=Math.min(Math.max(b.width,V),S-A),te=q-b.bottom-8,ne=b.top-N-8,se=te<260&&ne>te;i.style.width=X+"px",i.style.maxHeight=Math.max(0,Math.min(380,se?ne:te))+"px",i.style.left=Math.max(A,Math.min(b.left,S-X))+"px",i.style.top=(se?b.top-8-i.getBoundingClientRect().height:b.bottom+8)+"px"}function G(b,C=!1){P=b?.value??null;let A;for(let N of m.children){let S=P!==null&&N.dataset.value===P;N.dataset.active=String(S),S&&(A=N)}A?r.setAttribute("aria-activedescendant",A.id):r.removeAttribute("aria-activedescendant"),C&&A?.scrollIntoView({block:"nearest"})}function F(){let b=Rt(r.value),C=b!==H,A=C?0:m.scrollTop;H=b,L=D.filter(S=>Rt(S.search).includes(b));let N=JSON.stringify([b,J(),t.value,L.map(S=>[S.index,S.value,S.label,S.description,S.disabled])]);N!==j&&(j=N,m.replaceChildren(...L.map(S=>{let q=_("div","select-option");q.role="option",q.id=t.id+"-option-"+S.index,q.dataset.value=S.value,q.setAttribute("aria-selected",String(S.value===t.value)),q.setAttribute("aria-disabled",String(S.disabled));let V=_("span","select-option-copy");V.append(_("strong","",S.label)),S.description&&V.append(_("small","",S.description));let X=Xe("check-lg","select-check");return X.hidden=S.value!==t.value,q.append(V,X),q.addEventListener("pointermove",()=>{S.disabled||G(S)}),q.addEventListener("pointerdown",te=>te.preventDefault()),q.addEventListener("click",()=>Q(S)),q}))),y.hidden=L.length>0,c.setAttribute("aria-hidden",String(!r.value)),c.tabIndex=r.value?0:-1,G(L.find(S=>S.value===P&&!S.disabled)||L.find(S=>S.value===t.value&&!S.disabled)||L.find(S=>!S.disabled)),m.scrollTop=A,C&&G(L.find(S=>S.value===P),!0),B()}function z(b=!1){g&&(g=!1,i.showPopover&&i.matches(":popover-open")&&i.hidePopover(),i.hidden=!0,r.value="",k=!1,o.setAttribute("aria-expanded","false"),r.setAttribute("aria-expanded","false"),r.removeAttribute("aria-activedescendant"),pe===re&&(pe=null),b&&o.isConnected&&o.focus())}function de(){t.disabled||g||(Ae(),pe=re,g=!0,P=t.value,i.hidden=!1,i.showPopover&&i.showPopover(),o.setAttribute("aria-expanded","true"),e&&r.setAttribute("aria-expanded","true"),F(),e?r.focus():o.focus(),G(L.find(b=>b.value===P),!0))}function Q(b){if(!b||b.disabled||k)return;let C=t.value!==b.value;t.value=b.value,z(!0),$(),C&&t.dispatchEvent(new Event("change",{bubbles:!0}))}function $(){let b=t.getAttribute("aria-label")||n("controls.selectOption");e&&(r.setAttribute("aria-label",n("controls.filterPrefix",{label:b.replace(/^(选择|Select)\s*/,"")})),r.placeholder=n("controls.filterPlaceholder")),m.setAttribute("aria-label",n("controls.optionsAria",{label:b})),D=[...t.options].map((C,A)=>({value:C.value,label:C.dataset.label||C.textContent,description:C.dataset.description||"",search:C.dataset.search||C.textContent,disabled:C.disabled,index:A})),p.textContent=t.selectedOptions[0]?.dataset.label||t.selectedOptions[0]?.textContent||n("controls.choose"),o.setAttribute("aria-label",[b,p.textContent,t.selectedOptions[0]?.dataset.description].filter(Boolean).join(n("common.listSeparator"))),o.title=t.title||t.selectedOptions[0]?.textContent||"",o.disabled=t.disabled,t.disabled&&z(),g&&F()}let re={refresh:$,close:z,destroy(){z(),T.abort(),i.remove(),s.remove(),t.hidden=!1;for(let b of d)b.htmlFor=t.id}};o.setAttribute("aria-expanded","false"),r.setAttribute("aria-expanded","false"),o.addEventListener("click",()=>g?z(!0):de(),{signal:E}),o.addEventListener("keydown",b=>{if(!g){(b.key==="ArrowDown"||b.key==="ArrowUp")&&(b.preventDefault(),de());return}if(e)return;let C=L.filter(A=>!A.disabled);if(C.length)if(["ArrowDown","ArrowUp","Home","End"].includes(b.key)){b.preventDefault();let A=C.findIndex(S=>S.value===P),N=b.key==="Home"?0:b.key==="End"?C.length-1:(A+(b.key==="ArrowDown"?1:-1)+C.length)%C.length;G(C[N],!0)}else b.key==="Enter"?(b.preventDefault(),Q(C.find(A=>A.value===P))):b.key==="Escape"&&(b.preventDefault(),z(!0))},{signal:E}),r.addEventListener("compositionstart",()=>{k=!0},{signal:E}),r.addEventListener("compositionend",()=>{k=!1,F()},{signal:E}),r.addEventListener("input",F,{signal:E}),u.addEventListener("submit",b=>{b.preventDefault(),k||Q(L.find(C=>C.value===P))},{signal:E}),c.addEventListener("click",()=>{r.value="",F(),r.focus()},{signal:E}),i.addEventListener("keydown",b=>{if(!(b.isComposing||k||b.keyCode===229))if(b.key==="Escape")b.preventDefault(),b.stopPropagation(),z(!0);else if(b.key==="Tab")z(!0);else if(b.target===r&&["ArrowDown","ArrowUp","Home","End"].includes(b.key)){b.preventDefault();let C=L.filter(S=>!S.disabled),A=C.findIndex(S=>S.value===P);if(!C.length)return;let N=b.key==="Home"?0:b.key==="End"?C.length-1:(A+(b.key==="ArrowDown"?1:-1)+C.length)%C.length;G(C[N],!0)}else b.target===r&&b.key==="Enter"&&(b.preventDefault(),Q(L.find(C=>C.value===P)))},{signal:E}),document.addEventListener("pointerdown",b=>{g&&!s.contains(b.target)&&!i.contains(b.target)&&z()},{signal:E}),document.addEventListener("focusin",b=>{g&&!s.contains(b.target)&&!i.contains(b.target)&&z()},{signal:E}),t.addEventListener("change",$,{signal:E});let ee=t.closest("dialog");return ee?.addEventListener("close",()=>{ee.open||z()},{signal:E}),window.addEventListener("resize",B,{signal:E}),window.addEventListener("scroll",B,{capture:!0,signal:E}),window.visualViewport?.addEventListener("resize",B,{signal:E}),$(),re}function Qe({input:t,form:e,results:s,list:o,status:d,clear:p,onClear:i,onOpen:u}){let r=new AbortController,c=r.signal,m=null,y=!1,T=()=>[...o.querySelectorAll(".search-result")];t.setAttribute("role","combobox"),t.setAttribute("aria-autocomplete","list"),t.setAttribute("aria-controls",o.id),t.setAttribute("aria-expanded","false"),o.role="listbox",o.setAttribute("aria-label",n("controls.matchesAria"));function E(g,k=!1){m=g?.dataset.value??null;for(let H of T()){let j=H===g;H.dataset.active=String(j),H.setAttribute("aria-selected",String(j))}g?t.setAttribute("aria-activedescendant",g.id):t.removeAttribute("aria-activedescendant"),k&&g?.scrollIntoView({block:"nearest"})}function D(){s.hidden=!0,t.setAttribute("aria-expanded","false"),t.removeAttribute("aria-activedescendant"),pe===P&&(pe=null)}function L(){let g=!!t.value.trim(),k=T();p.setAttribute("aria-hidden",String(!t.value)),p.tabIndex=t.value?0:-1;for(let[H,j]of k.entries())j.id=o.id+"-option-"+H,j.role="option",j.tabIndex=-1;if(d.textContent=g?k.length?n("controls.found",{count:k.length}):n("controls.noMatches"):"",!g){m=null,D();return}pe!==P&&(Ae(),pe=P),s.hidden=!1,t.setAttribute("aria-expanded","true"),E(k.find(H=>H.dataset.value===m)||k[0])}let P={refresh:L,close:D,destroy(){D(),r.abort()}};return t.addEventListener("compositionstart",()=>{y=!0},{signal:c}),t.addEventListener("compositionend",()=>{y=!1},{signal:c}),t.addEventListener("keydown",g=>{if(!(g.isComposing||y||g.keyCode===229)){if(g.key==="Escape")g.preventDefault(),g.stopPropagation(),s.hidden?i():D();else if(g.key==="Enter")g.preventDefault(),s.hidden||T().find(k=>k.dataset.value===m)?.click();else if(g.key==="ArrowDown"||g.key==="ArrowUp"||!s.hidden&&(g.key==="Home"||g.key==="End")){if(g.preventDefault(),s.hidden){u();return}let k=T(),H=k.findIndex(B=>B.dataset.value===m);if(!k.length)return;let j=g.key==="Home"?0:g.key==="End"?k.length-1:(H+(g.key==="ArrowDown"?1:-1)+k.length)%k.length;E(k[j],!0)}}},{signal:c}),e.addEventListener("submit",g=>{g.preventDefault(),!(y||s.hidden)&&T().find(k=>k.dataset.value===m)?.click()},{signal:c}),o.addEventListener("pointermove",g=>{let k=g.target.closest(".search-result");k&&E(k)},{signal:c}),o.addEventListener("pointerdown",g=>g.preventDefault(),{signal:c}),document.addEventListener("pointerdown",g=>{e.parentElement.contains(g.target)||D()},{signal:c}),document.addEventListener("focusin",g=>{e.parentElement.contains(g.target)||D()},{signal:c}),P}var Gt=t=>String(t?.id??`${t?.at??""}:${t?.type??""}`),Ke=t=>t.length?Gt(t[t.length-1]):"",It=t=>"office.notify.seen.v1."+t;function Ye({mode:t,button:e,dot:s,panel:o,getEvents:d}){let p="";try{p=localStorage.getItem(It(t))||""}catch{}let i=!1,u=E=>{i=!!E,s.hidden=!i,e.classList.toggle("has-unread",i),e.setAttribute("aria-label",i?n("notify.ariaUnread"):n("notify.aria"))},r=()=>{let E=Ke(d());if(!E||E===p){u(!1);return}p=E;try{localStorage.setItem(It(t),E)}catch{}u(!1)},c=()=>{if(!o.hidden){r();return}u(!!Ke(d())&&Ke(d())!==p)},m=()=>{o.hidden=!1,e.setAttribute("aria-expanded","true"),r()},y=()=>{o.hidden=!0,e.setAttribute("aria-expanded","false")},T=()=>o.hidden?m():y();return u(!!Ke(d())&&Ke(d())!==p),he(()=>u(i)),{update:c,markRead:r,open:m,close:y,toggle:T}}function At(){let t=a=>document.getElementById(a),e=(a,h,f)=>{let w=document.createElement(a);return h&&(w.className=h),f!=null&&(w.textContent=f),w},s=a=>{let h=e("img");return h.src="./demo-icons/"+a+".svg",h.alt="",h},o=()=>[n("demo.stage.analysis"),n("demo.stage.parallel"),n("demo.stage.reports"),n("demo.stage.summary")],d=new Set(["assign","message","report","complete","approval","error","interrupted"]),p=()=>c.events.filter(a=>d.has(a.type)),i=new $e(new URLSearchParams(location.search).get("rootId")),u=()=>i.kind==="harness"?"DeepSeek Harness":"Codex",r=()=>({id:"",icon:"diagram-3-fill",name:n("livePage.noAgent"),title:n("livePage.logWaiting"),code:"\u2014",zone:n("common.notRecorded"),file:n("common.notRecorded"),role:n("common.notRecorded"),status:"unknown",progress:null}),c=i.snapshot,m=null,y=null,T=0,E="",D=!1,L=null,P=new Set,g=null,k="",H="",j="",B="",G,F=0,z=!1,de=fe(t("workspace-directory")),Q=fe(t("scenario")),$=fe(t("mode-select"),{filterable:!1}),re=t("mode-select");re.value="live",$.refresh();let ee=Ye({mode:"live",button:t("notifications-button"),dot:t("notification-dot"),panel:t("notifications"),getEvents:p}),b=null,C=Qe({input:t("task-search"),form:t("search-form"),results:t("search-results"),list:t("search-result-list"),status:t("search-status"),clear:t("clear-search"),onClear:()=>t("clear-search").click(),onOpen:oe}),A=[],N=()=>c.agents.filter(a=>D||!a.historical),S=()=>c.agents.find(a=>a.id===m)||N()[0]||r(),q=()=>i.kind==="harness"?Fe(c.roots,i.directoryKey):c.roots,V=a=>c.agents.find(h=>h.id===a)?.name||"Agent "+(a||"").slice(-8),X=a=>xt(a.status),te=a=>!E||[a.name,a.task,a.role,a.file,a.id,a.zone,a.title].join(" ").toLowerCase().includes(E.toLowerCase()),ne=a=>{let h=Math.max(0,Math.floor(a));return(h>=3600?String(Math.floor(h/3600)).padStart(2,"0")+":":"")+String(Math.floor(h/60)%60).padStart(2,"0")+":"+String(h%60).padStart(2,"0")};function se(a){clearTimeout(G),t("demo-toast").textContent=a,t("demo-toast").hidden=!1,G=setTimeout(()=>{t("demo-toast").hidden=!0},3e3)}function ce(a){t("agent-details").hidden=!a,t("open-details").hidden=a}function Y(a,h=!0){m=a,F++,ce(!0),ge(),y?.select(a,h)}function ae(a,h,f=S().icon){Ae(),b?.destroy(),b=null,t("dialog-title").textContent=a,t("dialog-content").textContent=h,t("dialog-icon").src="./demo-icons/"+f+".svg",t("copy-demo-report").textContent=n("demo.copy"),t("demo-dialog").open||t("demo-dialog").showModal()}async function me(a,h,f){let w=++F;ae(a,n("dialog.loading"));try{let O=await i.record(h,f);w===F&&t("demo-dialog").open&&ae(a,O)}catch(O){w===F&&t("demo-dialog").open&&ae(a,n("livePage.recordFailed",{message:O.message}))}}function Te(a=!1){let h=S();if(!a&&(h.hasReport||h.historical&&h.reportEventId))return me(h.name+" \xB7 "+n(h.historical?"livePage.pastReportTitle":"livePage.reportTitle"),h.id,h.reportEventId);if(h.taskEventId)return me(h.name+" \xB7 "+n("livePage.taskSourceTitle"),h.taskSessionId||h.id,h.taskEventId);ae(h.name+" \xB7 "+n("livePage.taskDetailsTitle"),h.task||n("livePage.taskNotLogged"))}function l(){F++,ae(n("livePage.chooseTeam"),"","people-fill");let a=t("dialog-content");a.append(e("strong","",n("livePage.currentTeam")));for(let h of c.agents){let f=e("button","session-choice",h.name+" \xB7 "+X(h)+(h.historical?" \xB7 "+n("livePage.pastMember"):"")+`
4
+ `+h.title);f.onclick=()=>{h.historical&&(D=!0),t("demo-dialog").close(),Y(h.id)},a.append(f)}if(i.kind==="harness"){let h=e("label","session-picker-field"),f=e("select");f.id="team-workspace-directory",h.htmlFor=f.id,h.append(e("span","",n("livePage.directory")),f),f.setAttribute("aria-label",n("livePage.teamDirectoryAria")),Pe(f),f.onchange=w=>{i.selectDirectory(w.target.value),l()},a.append(h),b=fe(f)}a.append(e("strong","",n(i.kind==="harness"?"livePage.harnessSessions":"livePage.mainSession")));for(let h of q()){let f=e("button","session-choice",i.kind==="harness"?ze(h):h.title||h.id);f.setAttribute("aria-pressed",h.id===c.rootId),f.onclick=()=>{t("demo-dialog").close(),E="",t("task-search").value="",oe(),i.select(h.id)},a.append(f)}}function v(a,h){t(a).style.width=h==null?"0%":h+"%",t(a).parentElement.classList.toggle("unrecorded",h==null)}function I(){let a=S(),h=a.hasReport||a.historical&&a.reportEventId;t("detail-icon").src=t("detail-agent-icon").src="./demo-icons/"+a.icon+".svg",t("detail-code").textContent=a.code,t("detail-badge").textContent=X(a),t("detail-badge").classList.toggle("done",a.status==="done"),t("detail-task-title").textContent=a.title,t("detail-task-title").title=a.task||a.title,t("detail-project").textContent=c.config.project,t("detail-role").textContent=a.role,t("detail-type").textContent=a.historical?n("livePage.pastMember"):a.parentId?n("livePage.subtask"):n("livePage.mainTask"),t("detail-progress-label").textContent=a.reportPreview||n("livePage.awaitingLog"),v("detail-progress-fill",a.progress),v("current-progress-fill",a.progress),t("detail-percent").textContent=a.progress==null?n("livePage.progressUnknown"):a.progress+"%",t("detail-zone").textContent=a.zone,t("detail-file").textContent=a.file,t("detail-file").title=a.source?.activity||a.file,t("detail-parent").textContent=a.parentId?V(a.parentId)+" \u2192 "+a.name:n("livePage.leadMembers",{count:c.assigned}),t("detail-name").textContent=a.name,t("detail-stage").textContent=c.complete?n("demo.stageComplete"):o()[c.stage],t("view-report").replaceChildren(document.createTextNode(n(h?"demo.viewFullReport":"demo.viewReport")),s("arrow-right")),t("view-report").disabled=!a.id,t("view-task").hidden=!h,t("view-screen").hidden=!y?.openScreenFor||!a.id,t("current-task-code").textContent=a.code,t("current-task-agent").textContent=a.name+" \xB7 "+a.zone.split(" \xB7 ")[0],t("current-task-description").textContent=a.title,t("current-task-icon").src="./demo-icons/"+a.icon+".svg"}function R(){let a=N().filter(f=>f.id!==m&&te(f)),h=JSON.stringify([m,E,a.map(f=>[f.id,f.name,f.status,f.title])]);h!==H&&(H=h,t("queue-heading").textContent=n("demo.queueHeading",{label:n(E?"demo.matchingTasks":"demo.teamTasks"),count:a.length}),t("task-queue").replaceChildren(...a.map(f=>{let w=e("button","queue-item");return w.setAttribute("aria-label",n("demo.ariaViewTask",{name:f.name})),w.title=f.name+" \xB7 "+f.title,w.append(e("strong","",f.name),e("span","",f.zone.split(" \xB7 ")[0]),e("span","queue-status "+(f.status==="done"?"done":"running"),X(f))),w.onclick=()=>Y(f.id),w})),a.length||t("task-queue").append(e("div","queue-empty",n("demo.noMatchingTasks"))))}function U(){E="",t("task-search").value="",R()}let ue="";function oe(){let a=t("search-result-list"),h=E.toLowerCase(),f=E&&i.kind==="harness"?(c.roots||[]).filter(x=>[x.title,x.cwd,x.id].join(" ").toLowerCase().includes(h)):[],w=E?N().filter(te):[],O=E?(c.events||[]).filter(x=>[x.type,Se(x.type),x.preview].join(" ").toLowerCase().includes(h)):[],we=Math.min(f.length,8)+Math.min(w.length,8)+Math.min(O.length,5),xe=f.length+w.length+O.length,Be=JSON.stringify([E,J(),xe,we,f.slice(0,8).map(x=>[x.id,x.title,x.cwd,x.createdAt,x.at]),w.slice(0,8).map(x=>[x.id,x.name,x.title,x.file,x.role,x.icon]),O.slice(0,5).map(x=>[x.id,x.type,x.preview,x.at,x.sessionId])]);if(Be===ue){C.refresh();return}if(ue=Be,a.replaceChildren(),E){xe>we&&a.append(e("p","search-note",n("livePage.searchNote",{total:xe,shown:we})));for(let x of f.slice(0,8)){let K=e("button","search-result"),ie=e("span"),Ee=Number.isFinite(x.createdAt)?x.createdAt:x.at,Le=new Date(Ee);K.type="button",K.dataset.value="session:"+x.id,ie.append(e("strong","",x.title?.trim()||n("common.unnamedSession")),e("small","",n("livePage.sessionLine",{path:x.cwd||n("common.noDirectory"),time:Number.isNaN(Le.getTime())?n("common.timeNotRecorded"):Le.toLocaleString(J(),{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",hour12:!1}),id:String(x.id).slice(-8)}))),K.append(s("diagram-3-fill"),ie),K.onclick=()=>{U(),C.close(),i.openSession(x.id).then(nt=>{nt===!1&&se(n("livePage.cannotOpenSession"))})},a.append(K)}for(let x of w.slice(0,8)){let K=e("button","search-result"),ie=e("span");K.type="button",K.dataset.value="agent:"+x.id,ie.append(e("strong","",x.name+" \xB7 "+x.title),e("small","",n("livePage.agentLine",{detail:x.file||x.role||n("common.notRecorded")}))),K.append(s(x.icon),ie),K.onclick=()=>{U(),Y(x.id),C.close()},a.append(K)}for(let x of O.slice(0,5)){let K=e("button","search-result"),ie=e("span");K.type="button",K.dataset.value="event:"+x.id,ie.append(e("strong","",Se(x.type)+(x.preview?" \xB7 "+x.preview:"")),e("small","",n("livePage.eventLine",{name:V(x.sessionId),time:new Date(x.at).toLocaleTimeString(J(),{hour12:!1})}))),K.append(s("bell"),ie),K.onclick=()=>{U(),C.close();let Ee=["assign","message"].includes(x.type)&&x.targetId||x.sessionId,Le=c.agents.find(nt=>nt.id===Ee);Le&&(Le.historical&&(D=!0),Y(Ee)),x.hasText&&me(V(x.sessionId)+" \xB7 "+Se(x.type),x.sessionId,x.id)},a.append(K)}}C.refresh()}function Ue(){let a=p().slice(-12).reverse(),h=JSON.stringify(a);h!==B&&(B=h,t("notification-list").replaceChildren(...a.map(f=>{let w=e("button","notification-item"),O=["assign","message","report"].includes(f.type)?f.type:"activity",we=e("span","notify-type");we.append(s(O==="assign"?"diagram-3-fill":O==="report"?"check-lg":O==="message"?"chat-left-text-fill":"cpu-fill"));let xe=e("span","notify-copy"),Be=O==="activity"?n("demo.updates"):Se(f.type),x=V(f.sessionId)+(f.targetId&&f.targetId!==f.sessionId?" \u2192 "+V(f.targetId):"");return xe.append(e("strong","notify-title",Be),e("small","notify-preview",x+(f.preview?" \xB7 "+f.preview:"")),e("em","notify-time",new Date(f.at).toLocaleTimeString(J(),{hour12:!1}))),w.append(we,xe),w.onclick=()=>{let K=["assign","message"].includes(f.type)&&f.targetId||f.sessionId,ie=c.agents.find(Ee=>Ee.id===K);ie&&(ie.historical&&(D=!0),Y(K)),ee.markRead(),ee.close(),f.hasText&&me(V(f.sessionId)+" \xB7 "+Se(f.type),f.sessionId,f.id)},w})),a.length||t("notification-list").append(e("div","empty",n("livePage.waitingEvents"))),ee.update())}function Ze(){let a=JSON.stringify([i.kind,i.directoryKey,c.rootId,c.roots]);if(a===j)return;j=a;let h=i.kind==="harness";t("directory-field").hidden=!h,t("directory-field").parentElement.classList.toggle("harness-picker",h),h&&(Pe(t("workspace-directory")),b&&(Pe(t("team-workspace-directory")),b.refresh()));let f=q();if(t("scenario").replaceChildren(...f.map(w=>{let O=e("option","",h?ze(w):w.title||w.id);return O.value=w.id,O.dataset.label=w.title?.replace(/\s+/g," ").trim()||n("common.unnamedSession"),O.dataset.description=ze(w).split(" \xB7 ").slice(-2).join(" \xB7 "),O.dataset.search=[w.title,ze(w),w.id].join(" "),O})),!f.length){let w=e("option","",n("livePage.noSessions",{host:u()}));w.value="",t("scenario").append(w)}t("scenario").value=c.rootId||"",t("scenario").disabled=!f.length,t("scenario").title=t("scenario").selectedOptions[0]?.textContent||"",Q.refresh()}function Pe(a){let h=_e(c.roots);if(a.replaceChildren(...h.map(f=>{let w=e("option","",f.path+" ("+f.count+")");return w.value=f.key,w.dataset.label=f.path,w.dataset.description=n("livePage.sessionCount",{count:f.count}),w})),!h.length){let f=e("option","",n("livePage.noDirectories"));f.value="",a.append(f)}a.disabled=!h.length,a.value=h.length?i.directoryKey??"":"",a.title=h.find(f=>f.key===i.directoryKey)?.path||"",a===t("workspace-directory")&&de.refresh()}function et(){let a=JSON.stringify(N().map(h=>[h.id,h.name,h.zone]));a!==k&&(k=a,t("scene-pins").replaceChildren(...N().map(h=>{let f=e("button","scene-pin"),w=e("span");return f.dataset.agent=h.id,f.setAttribute("aria-label",n("demo.ariaSelectAgent",{name:h.name})),w.append(e("strong","",h.name),e("small","",h.zone)),f.append(s(h.icon),w),f.onclick=()=>Y(h.id),f})));for(let h of t("scene-pins").children)h.classList.toggle("selected",h.dataset.agent===m),h.classList.toggle("done",c.agents.find(f=>f.id===h.dataset.agent)?.status==="done")}function Tt(){if(z)return;let a=Math.max(4,...N().map(h=>h.slot+1));if(!(y&&a<=T)){y?.destroy(),y=null,T=a;try{let h=y=new Re(t("demo-scene"),{count:a,live:!0,source:i.kind,onSelect:Y,reduced:t("demo-reduced").checked,pins:t("scene-pins")});h.setTeam(N(),c.rootId),h.select(m),h.ready.then(f=>{if(y===h){if(t("scene-loading").hidden=f,document.body.dataset.demoReady=f?"true":"fallback",f||(t("scene-loading").textContent=n("livePage.sceneUnavailable"),h.visible=!1),f)for(let w of A)h.animateEvent(w);A=[]}})}catch(h){z=!0,t("scene-loading").hidden=!1,t("scene-loading").textContent=n("livePage.sceneUnavailable"),document.body.dataset.demoReady="fallback",console.error("\u534F\u4F5C\u573A\u666F\u52A0\u8F7D\u5931\u8D25",h)}}}function tt(){document.title=i.kind==="harness"?n("meta.harnessLive"):n("meta.liveTitle"),t("task-search").setAttribute("aria-label",n("livePage.searchAria")),t("scenario").setAttribute("aria-label",n("livePage.scenarioAria")),t("metric-progress-title").textContent=n("livePage.progressTitle"),t("event-mode").textContent=n("livePage.eventMode"),t("detail-activity-label").textContent=n("livePage.activityLabel"),t("detail-disclaimer").textContent=n("livePage.disclaimer",{host:u()}),t("dialog-mode").textContent=n("livePage.dialogMode"),t("dialog-caption").textContent=n("livePage.dialogCaption"),t("mode-select").setAttribute("aria-label",n("livePage.modeAria")),t("restart-demo").title=n("livePage.reconnect"),t("restart-demo").setAttribute("aria-label",n("livePage.reconnect")),t("toggle-play").title=n("livePage.toggleCodex"),ye.textContent=n("livePage.viewScreen")}function ge({baseline:a=!1}={}){c=i.snapshot,L!==i.kind&&(L=i.kind,Je(i.kind,!0),tt(),t("toggle-play").title=n(i.kind==="harness"?"livePage.toggleHarness":"livePage.toggleCodex"),t("team-picker").textContent=n(i.kind==="harness"?"livePage.teamLabelHarness":"livePage.teamLabelCodex")),c.rootId!==g&&(m=c.rootId,a=!0,F++,t("demo-dialog").close()),N().some(w=>w.id===m)||(m=N()[0]?.id||null),a&&(P=new Set(c.events.map(w=>w.id)),A=[]),t("workspace-name").textContent=i.kind==="harness"?n("livePage.session"):c.config.project,t("workflow-subtitle").textContent=n("livePage.realSubtitle",{title:c.config.title}),t("workflow-subtitle").title=c.config.title,t("metric-active").textContent=c.active,t("metric-assigned").textContent=c.assigned,t("metric-reports").textContent=c.received,t("metric-progress").textContent=c.progress==null?"\u2014":c.progress+"%",t("active-hint").textContent=c.complete?n("demo.hintComplete"):c.active>1?n("demo.hintParallel"):n("demo.hintCoordinating"),t("assigned-hint").textContent=n("livePage.realSplit"),t("report-hint").textContent=c.received&&c.received===c.assigned?n("demo.reportsReady"):c.received?n("demo.reportsCollecting"):n("demo.reportsWaiting"),t("stage-caption").textContent=c.complete?n("demo.stageComplete"):n("livePage.noPercent"),t("demo-clock").textContent=c.elapsedKnown?ne(c.seconds):"\u2014",t("team-count-caption").textContent=n("livePage.memberCaption",{count:c.assigned}),t("assigned-caption").textContent=n("livePage.nestedCaption");let h=re.querySelector('option[value="live"]');h.textContent=i.connection==="connected"?n("demo.modeLive"):i.connection==="connecting"?n("livePage.connecting"):n("livePage.disconnected"),re.closest(".mode-field")?.classList.toggle("disconnected",i.connection!=="connected"),$.refresh(),t("profile-caption").textContent=i.error||n(i.kind==="harness"?"livePage.profileHarness":"livePage.profileCodex"),t("profile-caption").title=i.error||n("livePage.profileTitle",{host:u()}),t("source-status").hidden=!i.error&&!c.warnings.length,t("source-status").textContent=[i.error,...c.warnings].filter(Boolean).join(n("common.listSeparator")),t("play-label").textContent=i.follow?n(i.kind==="harness"?"livePage.followHarness":"livePage.followNew"):n("livePage.fixedSession"),t("toggle-play").setAttribute("aria-label",t("play-label").textContent),t("history-toggle").textContent=n(D?"livePage.historyHide":"livePage.historyShow",{count:c.agents.filter(w=>w.historical).length}),t("stage-track-fill").style.width=(c.complete?100:c.stage/3*100)+"%",t("stage-0-description").textContent=n("livePage.subtasks",{count:c.assigned}),t("stage-1-description").textContent=n("livePage.running",{count:N().filter(w=>w.id!==c.rootId&&["tool","thinking","typing"].includes(w.status)).length}),t("stage-2-description").textContent=n("livePage.reported",{done:c.received,total:c.assigned}),t("stage-3-description").textContent=c.complete?n("demo.stageSummaryReady"):c.stage===3?n("demo.stageConcluding"):n("livePage.awaitingLead");for(let w of document.querySelectorAll(".stage")){let O=Number(w.dataset.stage);w.classList.toggle("active",O===c.stage),w.classList.toggle("completed",O<c.stage||c.complete),w.setAttribute("aria-pressed",O===c.stage),w.title=n("demo.previewStage",{stage:o()[O]}),w.querySelector("em").textContent=O===c.stage?n(c.complete?"demo.markerDone":"demo.markerRunning"):""}let f=t("progress-ring").getContext("2d");if(f.clearRect(0,0,112,112),f.lineWidth=15,f.lineCap="round",f.strokeStyle=c.complete?"#126cfa":"#e5edfc",f.beginPath(),f.arc(56,56,39,0,Math.PI*2),f.stroke(),Ze(),et(),I(),R(),Ue(),E&&!t("search-results").hidden&&oe(),Tt(),y&&(y.setTeam(N(),c.rootId),y.select(m),y.playing=!0,!a))for(let w of c.events)P.has(w.id)||(y.loaded?y.animateEvent(w):A.push(w));P=new Set(c.events.map(w=>w.id)),g=c.rootId}document.body.dataset.mode="live",Ge(document);let ye=document.createElement("button");ye.id="view-screen",ye.type="button",ye.className="text-button",ye.hidden=!0,t("view-task").before(ye),tt(),t("mode-select").onchange=a=>{a.target.value==="demo"?location.href=je(!1,i.kind):(a.target.value="live",$.refresh())},t("play-icon").src="./demo-icons/crosshair.svg",t("history-toggle").hidden=t("team-picker").hidden=!1,t("close-details").onclick=()=>ce(!1),t("open-details").onclick=()=>ce(!0),t("view-report").onclick=()=>Te(),t("view-task").onclick=()=>Te(!0),ye.onclick=()=>{let a=S();a?.id&&y?.openScreenFor?.(a.id)},t("current-task-button").onclick=()=>{ce(!0),Te()},t("close-demo-dialog").onclick=()=>{F++,t("demo-dialog").close()},t("demo-dialog").addEventListener("close",()=>{t("demo-dialog").open||(b?.destroy(),b=null)}),t("copy-demo-report").onclick=async()=>{try{await navigator.clipboard.writeText(t("dialog-content").textContent),t("copy-demo-report").textContent=n("common.copied")}catch{se(n("common.copyFailedToast"))}},t("toggle-play").onclick=()=>{i.follow=!i.follow,ge(),se(n(i.follow?i.kind==="harness"?"livePage.toastFollowHarness":"livePage.toastFollowNew":"livePage.toastFixed"))},t("restart-demo").onclick=()=>{i.connect(),se(n("livePage.toastReconnect"))},t("reset-demo-camera").onclick=()=>y?.resetCamera(),t("history-toggle").onclick=()=>{D=!D,ge({baseline:!0})},t("scenario").onchange=a=>{E="",t("task-search").value="",oe(),i.select(a.target.value)},t("workspace-directory").onchange=a=>{E="",t("task-search").value="",oe(),i.selectDirectory(a.target.value)},t("task-search").oninput=a=>{E=a.target.value.trim(),R(),oe()},t("task-search").onfocus=oe,t("clear-search").onclick=()=>{E="",t("task-search").value="",R(),oe(),t("task-search").focus()},t("notifications-button").onclick=()=>ee.toggle(),t("mark-read").onclick=()=>{ee.markRead(),Ue()},t("show-team").onclick=t("team-picker").onclick=l,t("dock-toggle").onclick=()=>{let a=t("workflow-dock").classList.toggle("expanded");t("dock-toggle").setAttribute("aria-expanded",a)};for(let a of document.querySelectorAll(".stage"))a.onclick=()=>se(n("livePage.stageToast",{stage:o()[c.stage],host:u()}));t("demo-reduced").checked=localStorage.getItem("office.demo.reduced")==="true"||matchMedia("(prefers-reduced-motion: reduce)").matches,document.body.dataset.reducedMotion=String(t("demo-reduced").checked),t("demo-reduced").onchange=a=>{localStorage.setItem("office.demo.reduced",a.target.checked),document.body.dataset.reducedMotion=String(a.target.checked),y?.setReduced(a.target.checked)},document.addEventListener("keydown",a=>{a.key==="/"&&!["INPUT","TEXTAREA","SELECT"].includes(document.activeElement.tagName)&&!t("demo-dialog").open&&(a.preventDefault(),t("task-search").focus())}),document.addEventListener("click",a=>{!a.target.closest("#notifications")&&!a.target.closest("#notifications-button")&&ee.close()}),document.addEventListener("visibilitychange",()=>{y&&(y.visible=!document.hidden&&!y.loadError)}),he(()=>{k=H=j=B="",L=null,T=0,y?.destroy(),y=null,tt(),ge({baseline:!0})}),ce(innerWidth>1050&&innerHeight>820),ge({baseline:!0}),i.addEventListener("change",a=>ge(a.detail)),i.connect();let Pt=setInterval(()=>{document.hidden||ge()},1e3);window.addEventListener("beforeunload",()=>{clearInterval(Pt),clearTimeout(G),de.destroy(),Q.destroy(),b?.destroy(),C.destroy(),i.destroy(),y?.destroy()})}new URLSearchParams(location.search).get("mode")==="live"?At():Vt();function Vt(){let t=Oe();Je(t),Ge(document);let e=l=>document.getElementById(l),s=(l,v,I)=>{let R=document.createElement(l);return v&&(R.className=v),I!=null&&(R.textContent=I),R},o=l=>{let v=s("img");return v.src="./demo-icons/"+l+".svg",v.alt="",v},d=()=>[n("demo.stage.analysis"),n("demo.stage.parallel"),n("demo.stage.reports"),n("demo.stage.summary")],p=()=>({main:n("demo.type.main"),api:n("demo.type.api"),frontend:n("demo.type.frontend"),test:n("demo.type.test")}),i=new Ve,u=()=>{let l=i.snapshot;return t==="harness"?{...l,config:{...l.config,project:l.config.project.replace("Codex","Harness")},agents:l.agents.map(v=>({...v,agent:"dsh"}))}:l},r=u(),c="frontend",m=null,y="",T=null,E=new Set(r.events.map(l=>l.id)),D=innerWidth>1050&&innerHeight>820,L=r.seconds,P=r.scenario,g=performance.now(),k="",H="",j=fe(e("scenario")),B=fe(e("mode-select"),{filterable:!1}),G=e("mode-select");G.value="demo",B.refresh();let F=Ye({mode:"demo",button:e("notifications-button"),dot:e("notification-dot"),panel:e("notifications"),getEvents:()=>r.events}),z=Qe({input:e("task-search"),form:e("search-form"),results:e("search-results"),list:e("search-result-list"),status:e("search-status"),clear:e("clear-search"),onClear:()=>e("clear-search").click(),onOpen:ne}),de=l=>r.agents.find(v=>v.id===l)?.name||n("common.agent"),Q=()=>r.agents.find(l=>l.id===c)||r.agents[0],$=l=>l.status==="done"?n("status.done"):l.status==="unknown"?n("status.pending"):l.status==="waiting_agents"?n("status.coordinating"):n("status.running"),re=l=>"00:"+String(Math.floor(l)).padStart(2,"0"),ee=()=>{for(let l of e("scenario").options)l.dataset.label=n(l.value==="review"?"demo.scenarioReview":"demo.scenarioSearch");j.refresh(),B.refresh()};function b(l){clearTimeout(T),e("demo-toast").textContent=l,e("demo-toast").hidden=!1,T=setTimeout(()=>{e("demo-toast").hidden=!0},2300)}function C(l){D=l,e("agent-details").hidden=!l,e("open-details").hidden=l}function A(l,v=!0){c=l,C(!0),m?.select(l,v),H="",ae()}function N(l){let v=e("progress-ring").getContext("2d");v.clearRect(0,0,112,112),v.lineWidth=15,v.lineCap="round",v.strokeStyle="#e5edfc",v.beginPath(),v.arc(56,56,39,0,Math.PI*2),v.stroke(),v.strokeStyle="#126cfa",v.beginPath(),v.arc(56,56,39,-Math.PI/2,-Math.PI/2+Math.PI*2*l/100),v.stroke()}function S(){e("scene-pins").replaceChildren(...r.agents.map(v=>{let I=s("button","scene-pin");I.dataset.agent=v.id,I.setAttribute("aria-label",n("demo.ariaSelectAgent",{name:v.name}));let R=s("span");return R.append(s("strong","",v.name),s("small","",v.zone)),I.append(o(v.icon),R),I.onclick=()=>A(v.id),I}))}function q(){let l=Q();e("detail-icon").src="./demo-icons/"+l.icon+".svg",e("detail-agent-icon").src="./demo-icons/"+l.icon+".svg",e("detail-code").textContent=n("demo.detailCode",{code:l.code}),e("detail-badge").textContent=$(l),e("detail-badge").classList.toggle("done",l.status==="done"),e("detail-task-title").textContent=l.title,e("detail-project").textContent=r.scenario==="search"?n("demo.projectTaskBoard"):n("demo.projectApi"),e("detail-role").textContent=l.role,e("detail-type").textContent=r.scenario==="review"&&l.parentId?n("demo.type.reviewOnly"):p()[l.id],e("detail-progress-label").textContent=l.report?n("demo.detailProgressDone"):l.reportPreview,e("detail-progress-fill").style.width=l.progress+"%",e("detail-percent").textContent=l.progress+"%",e("detail-zone").textContent=l.zone,e("detail-file").textContent=l.file,e("detail-parent").textContent=l.parentId?n("demo.parentMain"):n("demo.parentLead",{count:3}),e("detail-name").textContent=l.name,e("detail-stage").textContent=r.complete?n("demo.stageComplete"):d()[r.stage],e("view-report").replaceChildren(document.createTextNode(l.report?n("demo.viewFullReport"):n("demo.viewReport")),o("arrow-right")),e("current-task-code").textContent=l.code,e("current-task-agent").textContent=l.name+" \xB7 "+l.zone.split(" \xB7 ")[0],e("current-task-description").textContent=l.title,e("current-task-icon").src="./demo-icons/"+l.icon+".svg",e("current-progress-fill").style.width=l.progress+"%"}function V(l){return!y||[l.name,l.role,l.zone,l.task,l.file,l.code,l.title].join(" ").toLowerCase().includes(y.toLowerCase())}function X(){let l=r.agents.filter(R=>R.id!==c&&V(R)),v=JSON.stringify([r.scenario,c,y,l.map(R=>[R.id,R.status,R.progress])]);if(v===H)return;H=v,e("queue-heading").textContent=n("demo.queueHeading",{label:y?n("demo.matchingTasks"):n("demo.teamTasks"),count:l.length});let I=e("task-queue");I.replaceChildren();for(let R of l){let U=s("button","queue-item");U.setAttribute("aria-label",n("demo.ariaViewTask",{name:R.name})),U.append(s("strong","",R.code),s("span","",R.zone.split(" \xB7 ")[0]),s("span","queue-status "+(R.status==="done"?"done":R.status==="unknown"?"":"running"),$(R))),U.onclick=()=>A(R.id),I.append(U)}l.length||I.append(s("div","queue-empty",n("demo.noMatchingTasks")))}let te="";function ne(){let l=e("search-result-list"),v=y?r.agents.filter(V):[],I=JSON.stringify([y,J(),v.map(R=>[R.id,R.name,R.title,R.file,R.icon])]);if(I===te){z.refresh();return}te=I,l.replaceChildren();for(let R of v){let U=s("button","search-result");U.type="button",U.dataset.value=R.id;let ue=s("span");ue.append(s("strong","",R.name+" \xB7 "+R.title),s("small","",R.file)),U.append(o(R.icon),ue),U.onclick=()=>{A(R.id),e("task-search").focus(),z.close()},l.append(U)}z.refresh()}function se(){let l=e("notification-list");l.replaceChildren();let v=r.events.slice(-6).reverse();for(let I of v){let R=r.agents.find(et=>et.id===(I.targetId||I.sessionId)),U=s("button","notification-item");U.type="button";let ue=s("span","notify-type");ue.append(o(I.type==="assign"?"diagram-3-fill":I.type==="report"?"check-lg":"chat-left-text-fill"));let oe=s("span","notify-copy"),Ue=I.type==="assign"?n("demo.notifyAssign"):I.type==="report"?n("demo.notifyReport"):n("demo.notifyMessage"),Ze=I.type==="assign"?n("demo.notifyRouteLead"):de(I.sessionId)+" \xB7 ",Pe=I.type==="assign"?R?.title||de(I.targetId):I.type==="report"?n("demo.notifySummary"):I.preview||n("demo.notifyProgress");oe.append(s("strong","notify-title",Ue),s("small","notify-preview",Ze+Pe),s("em","notify-time",n("demo.notifyTime",{time:re(I.at)}))),U.append(ue,oe),U.onclick=()=>{R&&A(R.id),F.markRead(),F.close()},l.append(U)}v.length||l.append(s("div","empty",n("demo.notifyEmpty"))),F.update()}function ce(l,v,I=Q().icon){Ae(),e("dialog-title").textContent=l,e("dialog-content").textContent=v,e("dialog-icon").src="./demo-icons/"+I+".svg",e("copy-demo-report").textContent=n("demo.copy"),e("demo-dialog").open||e("demo-dialog").showModal()}function Y(){let l=Q();l.report?ce(n(l.id==="main"?"demo.dialogFinalTitle":"demo.dialogReportTitle",{name:l.name}),l.report):ce(n("demo.dialogTaskTitle",{name:l.name}),[n("demo.fieldTask",{value:l.title}),n("demo.fieldCode",{value:l.code}),n("demo.fieldZone",{value:l.zone}),n("demo.fieldFile",{value:l.file}),"",l.task,"",n("demo.fieldStatus",{value:$(l),percent:l.progress}),"",n("demo.doneHint"),"",n("demo.demoOnlyHint")].join(`
5
+ `)),k=l.id+":"+!!l.report+":"+r.scenario}function ae(){r=u();let l=r.seconds<L||r.scenario!==P;if(l&&(E=new Set(r.events.map(v=>v.id)),e("demo-dialog").close(),k="",m))for(let v of m.people.values())v.path=[],v.mode="work",v.reportUntil=null,v.x=v.desk.seat.x,v.y=v.desk.seat.y;e("workspace-name").textContent=r.config.project,e("workflow-subtitle").textContent=n("demo.subtitleSim",{title:r.config.title}),e("metric-active").textContent=r.active,e("metric-assigned").textContent=r.assigned,e("metric-reports").textContent=r.received,e("metric-progress").textContent=r.progress+"%",e("active-hint").textContent=r.complete?n("demo.hintComplete"):r.active>1?n("demo.hintParallel"):n("demo.hintCoordinating"),e("assigned-hint").textContent=r.assigned===3?n("demo.assignedReady"):n("demo.assignedSplitting"),e("report-hint").textContent=r.received===3?n("demo.reportsReady"):r.received?n("demo.reportsCollecting"):n("demo.reportsWaiting"),e("stage-caption").textContent=r.complete?n("demo.demoComplete"):n("demo.runningStage",{stage:d()[r.stage]}),e("demo-clock").textContent=re(r.seconds),e("play-label").textContent=i.playing?n("demo.pause"):r.complete?n("demo.replay"):n("demo.play"),e("toggle-play").setAttribute("aria-label",i.playing?n("demo.pause"):n("demo.play")),e("toggle-play").title=e("play-label").textContent,e("play-icon").src="./demo-icons/"+(i.playing?"pause-fill":"play-fill")+".svg",e("stage-track-fill").style.width=Math.min(100,r.seconds/le*100)+"%",e("stage-0-description").textContent=n("demo.stageAssigned",{done:r.assigned,total:3}),e("stage-1-description").textContent=n("demo.stageRunning",{count:r.agents.slice(1).filter(v=>v.status==="tool").length}),e("stage-2-description").textContent=n("demo.stageReported",{done:r.received,total:3}),e("stage-3-description").textContent=r.complete?n("demo.stageSummaryReady"):r.stage===3?n("demo.stageConcluding"):n("demo.stageAwaitReports");for(let v of document.querySelectorAll(".stage")){let I=Number(v.dataset.stage);v.classList.toggle("active",I===r.stage),v.classList.toggle("completed",I<r.stage||r.complete),v.setAttribute("aria-pressed",I===r.stage),v.title=n("demo.previewStage",{stage:d()[I]}),v.querySelector("em").textContent=I===r.stage?r.complete?n("demo.markerDone"):i.playing?n("demo.markerRunning"):n("demo.markerPaused"):""}N(r.progress),q(),X(),se();for(let v of e("scene-pins").children)v.classList.toggle("selected",v.dataset.agent===c),v.classList.toggle("done",r.agents.find(I=>I.id===v.dataset.agent)?.status==="done");if(m&&(m.setTeam(r.agents,"main"),m.select(c),m.playing=i.playing,!l))for(let v of r.events)E.has(v.id)||m.animateEvent(v);if(E=new Set(r.events.map(v=>v.id)),L=r.seconds,P=r.scenario,e("demo-dialog").open&&k){let v=Q();v.id+":"+!!v.report+":"+r.scenario!==k&&Y()}}e("close-details").onclick=()=>C(!1),e("open-details").onclick=()=>C(!0),e("view-report").onclick=Y,e("current-task-button").onclick=()=>{C(!0),Y()},e("close-demo-dialog").onclick=()=>e("demo-dialog").close(),e("copy-demo-report").onclick=async()=>{try{await navigator.clipboard.writeText(e("dialog-content").textContent),e("copy-demo-report").textContent=n("common.copied")}catch{b(n("common.copyFailedToast"))}},e("toggle-play").onclick=()=>i.play(),e("mode-select").onchange=l=>{l.target.value==="live"?location.href=je(!0,t):(l.target.value="demo",B.refresh())},e("restart-demo").onclick=()=>{i.restart(),b(n("demo.toastRestart"))},e("reset-demo-camera").onclick=()=>m?.resetCamera(),e("scenario").onchange=l=>{y="",e("task-search").value="",ne(),i.setScenario(l.target.value)},e("task-search").oninput=l=>{y=l.target.value.trim(),H="",X(),ne()},e("task-search").onfocus=()=>ne(),e("clear-search").onclick=()=>{y="",e("task-search").value="",X(),ne(),e("task-search").focus()},e("notifications-button").onclick=()=>F.toggle(),e("mark-read").onclick=()=>{F.markRead(),se()},e("show-team").onclick=()=>{k="",ce(n("demo.dialogTeamTitle",{title:r.config.title}),r.agents.map(l=>n("demo.teamMemberLine",{name:l.name,zone:l.zone,task:l.task,status:$(l),percent:l.progress})).join(`
6
+
7
+ `),"people-fill")},e("dock-toggle").onclick=()=>{let l=e("workflow-dock").classList.toggle("expanded");e("dock-toggle").setAttribute("aria-expanded",l)};for(let l of document.querySelectorAll(".stage"))l.onclick=()=>{i.seconds=[2,16,32,42][Number(l.dataset.stage)],i.playing=!1,i.changed(),b(n("demo.toastPreview",{stage:d()[Number(l.dataset.stage)]}))};e("demo-reduced").checked=matchMedia("(prefers-reduced-motion: reduce)").matches,document.body.dataset.reducedMotion=String(e("demo-reduced").checked),e("demo-reduced").onchange=l=>{document.body.dataset.reducedMotion=String(l.target.checked),m?.setReduced(l.target.checked)},document.addEventListener("keydown",l=>{l.key==="/"&&!["INPUT","TEXTAREA","SELECT"].includes(document.activeElement.tagName)&&!e("demo-dialog").open&&!document.querySelector(".screen-modal")&&(l.preventDefault(),e("task-search").focus())}),document.addEventListener("click",l=>{!l.target.closest("#notifications")&&!l.target.closest("#notifications-button")&&F.close()}),document.addEventListener("visibilitychange",()=>{g=performance.now(),m&&(m.visible=!document.hidden&&!m.loadError)}),he(()=>{ee(),H="",k="",ae(),S(),ne(),e("demo-dialog").open&&Y(),m?.destroy(),m=null,me()}),S(),C(D),ae(),me();function me(){try{let l=new Re(e("demo-scene"),{source:t,onSelect:v=>A(v),reduced:e("demo-reduced").checked,pins:e("scene-pins")});m=l,l.setTeam(r.agents,"main"),l.select(c),l.ready.then(v=>{e("scene-loading").hidden=v,document.body.dataset.demoReady=v?"true":"fallback",v||(e("scene-loading").textContent=n("demo.failed3d"),l.visible=!1)})}catch{e("scene-loading").textContent=n("demo.failed3d"),document.body.dataset.demoReady="fallback"}}i.addEventListener("change",ae);let Te=setInterval(()=>{let l=performance.now(),v=Math.min(.5,(l-g)/1e3);g=l,document.hidden||i.advance(v)},250);window.addEventListener("beforeunload",()=>{clearInterval(Te),clearTimeout(T),j.destroy(),z.destroy(),m?.destroy()})}
@@ -0,0 +1,59 @@
1
+ <!doctype html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <meta name="color-scheme" content="light">
7
+ <title data-i18n="meta.title">Codex · 协作办公室</title>
8
+ <link rel="icon" href="./assets/logo.svg" type="image/svg+xml">
9
+ <link rel="stylesheet" href="./style.css">
10
+ </head>
11
+ <body>
12
+ <header class="topbar">
13
+ <a class="brand" href="./" aria-label="Codex 协作办公室首页" data-i18n-aria-label="brand.home"><span class="brand-mark">◈</span><span>Codex <b>Office</b></span><span class="brand-divider"></span><span class="brand-caption" data-i18n="brand.caption">协作办公室</span></a>
14
+ <div class="top-actions"><span id="mode" class="mode" data-i18n="topbar.readonly">只读观察</span><span id="connection" class="connection" role="status" data-i18n="topbar.connecting">正在连接</span><span id="clock" class="clock"></span><div class="lang-switch" data-lang-switch role="group" aria-label="Language"><button type="button" data-lang="zh" aria-pressed="true">中</button><button type="button" data-lang="en" aria-pressed="false">EN</button></div></div>
15
+ </header>
16
+ <div id="notice" class="notice" role="status" hidden></div>
17
+ <div class="app-layout">
18
+ <aside class="sidebar">
19
+ <div class="section-eyebrow">WORKSPACE <span>01</span></div>
20
+ <h1 data-i18n="sidebar.heading">任务与团队</h1>
21
+ <label class="field-label" for="task-select" data-i18n="sidebar.taskLabel">当前主任务</label>
22
+ <select id="task-select" aria-label="选择主任务" data-i18n-aria-label="sidebar.taskSelectAria"><option data-i18n="sidebar.discovering">正在发现会话…</option></select>
23
+ <div id="project-path" class="project-path"></div>
24
+ <div class="section-line"><span data-i18n="sidebar.team">协作团队</span><span id="team-count" class="count">0</span></div>
25
+ <div id="team-tree" class="team-tree" aria-label="Agent 团队" data-i18n-aria-label="sidebar.teamAria"></div>
26
+ <div class="sidebar-bottom"><span class="local-dot"></span><div><b data-i18n="sidebar.local">本机运行 · 只读连接</b><p data-i18n="sidebar.localNote">任务继续在 Codex 中执行</p></div></div>
27
+ </aside>
28
+ <main class="main">
29
+ <div class="workspace-heading">
30
+ <div><div class="section-eyebrow"><span class="live-dot"></span> LIVE WORKSPACE</div><h2 data-i18n="main.headline">协作,正在发生。</h2><p id="task-title" data-i18n="main.subtitle">从任务分配,到每一份汇报。</p></div>
31
+ <div class="summary" aria-label="团队状态" data-i18n-aria-label="main.summaryAria"><div><strong id="working-count">0</strong><span data-i18n="main.working">执行中</span></div><div><strong id="done-count">0</strong><span data-i18n="main.done">已完成</span></div><div><strong id="waiting-count">0</strong><span data-i18n="main.waiting">待处理</span></div></div>
32
+ </div>
33
+ <section class="office-panel" aria-label="三维协作办公室" data-i18n-aria-label="main.officeAria">
34
+ <div class="scene-toolbar"><span class="scene-label"><i></i> <span data-i18n="main.sceneLabel">团队办公室</span> <small>/ 3D</small></span><div class="scene-actions"><label class="motion-switch"><input id="reduced-motion" type="checkbox"><span data-i18n="main.reducedMotion">减少动画</span></label><button id="reset-camera" class="icon-button" title="复位镜头" data-i18n-title="main.resetCamera" aria-label="复位镜头" data-i18n-aria-label="main.resetCamera">⌖</button></div></div>
35
+ <div id="scene" class="scene"></div>
36
+ <div id="scene-status" class="scene-status" role="status" data-i18n="main.scenePreparing">正在准备办公室…</div>
37
+ <div class="scene-footer"><span data-i18n="main.sceneHint">拖动旋转 · 滚轮缩放 · 点击人物查看详情</span><span class="scene-watermark">CODEX / COLLABORATION</span></div>
38
+ </section>
39
+ <section class="timeline-panel" aria-label="协作时间线" data-i18n-aria-label="main.timelineAria">
40
+ <div class="timeline-heading"><div><span class="section-eyebrow">THE HANDOFFS</span><h3 data-i18n="main.timelineHeading">每一次协作,都有迹可循</h3></div><span id="event-count" class="muted" data-i18n="main.waitingEvents">等待事件</span></div>
41
+ <div id="timeline" class="timeline"></div>
42
+ </section>
43
+ <footer class="main-footer"><span data-i18n="main.footerSource">状态来自实际日志;消息块写入后同步。</span><span>Three.js × Codex</span></footer>
44
+ </main>
45
+ <aside class="details" aria-label="Agent 详情" data-i18n-aria-label="details.aria">
46
+ <div class="section-eyebrow">AGENT INSPECTOR <span>↗</span></div>
47
+ <div id="agent-header" class="agent-header"></div>
48
+ <div id="agent-metadata" class="agent-metadata"></div>
49
+ <div class="detail-tabs" role="tablist" aria-label="Agent 详情视图" data-i18n-aria-label="details.tabsAria"><button id="activity-tab" class="active" role="tab" aria-selected="true" data-i18n="details.activity">执行活动</button><button id="report-tab" role="tab" aria-selected="false" data-i18n="details.report">汇报全文</button></div>
50
+ <div id="activity-panel"><div class="detail-section-label"><span data-i18n="details.task">任务内容</span> <button id="open-task" class="text-button" data-i18n="details.openSource">查看原文 ↗</button></div><p id="agent-task" class="task-copy"></p><div class="detail-section-label" data-i18n="details.recent">最近活动</div><div id="agent-activity" class="activity-list"></div></div>
51
+ <div id="report-panel" hidden><div id="report-content" class="report-content"></div></div>
52
+ <div class="details-footer"><span data-i18n="details.footerLead">主 Agent 协调,子 Agent 各司其职。</span><br><span data-i18n="details.footerSub">这里展示它们实际留下的记录。</span></div>
53
+ </aside>
54
+ </div>
55
+ <dialog id="text-dialog"><div class="dialog-heading"><div><span class="section-eyebrow">SOURCE RECORD</span><h3 id="dialog-title" data-i18n="dialog.title">原始记录</h3></div><button id="close-dialog" class="icon-button" aria-label="关闭" data-i18n-aria-label="common.close">×</button></div><pre id="dialog-body"></pre><div class="dialog-footer"><span data-i18n="dialog.from">来自 Codex 可见消息</span><button id="copy-text" class="solid-button" data-i18n="dialog.copy">复制全文</button></div></dialog>
56
+ <script src="./vendor/office.js"></script>
57
+ <script type="module" src="./app.js"></script>
58
+ </body>
59
+ </html>
@@ -0,0 +1,15 @@
1
+ :root{--paper:#f7f8f5;--white:#fff;--ink:#253a34;--muted:#7e8b85;--line:#e5eae4;--green:#247a63;--light-green:#eaf3ed;--amber:#b37b2e;--red:#b65850;--sans:"Microsoft YaHei UI","PingFang SC","Noto Sans SC",sans-serif;--mono:"Cascadia Code","Consolas",monospace}
2
+ *{box-sizing:border-box}body{margin:0;background:var(--paper);color:var(--ink);font-family:var(--sans);font-size:13px;-webkit-font-smoothing:antialiased}button,select,input{font:inherit}button,a,input,select{-webkit-tap-highlight-color:transparent}button{cursor:pointer}button:focus-visible,select:focus-visible,a:focus-visible,input:focus-visible{outline:2px solid var(--green);outline-offset:3px}button:disabled{opacity:.45;cursor:default}[hidden]{display:none!important}a{color:inherit;text-decoration:none}.topbar{height:72px;background:var(--white);border-bottom:1px solid var(--line);display:flex;justify-content:space-between;align-items:center;padding:0 28px;gap:16px}.brand{display:flex;align-items:center;gap:10px;font-size:20px;letter-spacing:-.7px}.brand b{font-weight:400;color:#7d8981}.brand-mark{font-size:36px;line-height:1;color:var(--green)}.brand-divider{height:20px;width:1px;background:var(--line);margin:0 8px}.brand-caption{font-size:12px;color:#77867f;letter-spacing:2px}.top-actions{display:flex;align-items:center;gap:22px}.mode{font-size:11px;padding:6px 10px;background:#f0f4ef;border-radius:5px;color:#5d7065}.mode.demo{background:#fff1da;color:#a46a19}.connection{font-size:11px;color:var(--muted);display:flex;gap:7px;align-items:center}.connection:before{content:"";width:6px;height:6px;background:#b3bdb6;border-radius:50%}.connection.connected:before{background:#429572;box-shadow:0 0 0 3px #edf5ee}.clock{font:12px var(--mono);color:#87948d}.notice{padding:10px 28px;background:#fff4df;color:#865e23;border-bottom:1px solid #eddfbd;font-size:12px}.app-layout{display:grid;grid-template-columns:246px minmax(420px,1fr) 310px;min-height:calc(100vh - 72px)}.sidebar{padding:30px 20px 18px;border-right:1px solid var(--line);background:#fbfcf9;display:flex;flex-direction:column;min-width:0}.section-eyebrow{font:10px var(--mono);color:#8b9a90;letter-spacing:1.4px;display:flex;align-items:center;gap:8px}.section-eyebrow>span:last-child:not(.live-dot){margin-left:auto}.sidebar h1{font-size:21px;margin:14px 0 32px;font-weight:600;letter-spacing:1px}.field-label{font-size:10px;color:#8e9a92;margin-bottom:9px}select{width:100%;border:1px solid #dce5dc;background:#fff;border-radius:6px;color:var(--ink);padding:11px 26px 11px 10px;text-overflow:ellipsis;font-size:12px}.project-path{font:10px/1.7 var(--mono);color:#98a299;margin:10px 2px 28px;overflow-wrap:anywhere;max-height:52px;overflow:auto}.section-line{display:flex;align-items:center;justify-content:space-between;font-size:11px;color:#7f8e84;margin-bottom:16px}.count{font:10px var(--mono);padding:3px 6px;background:#eaf0e8;border-radius:4px}.team-tree{display:flex;flex-direction:column;gap:6px}.agent-card{border:1px solid transparent;background:transparent;border-radius:8px;display:flex;text-align:left;gap:10px;padding:12px 9px;width:100%;align-items:flex-start;color:var(--ink)}.agent-card:hover{background:#f1f5ef}.agent-card.selected{background:#eaf3ed;border-color:#d8e7dc}.agent-card.child{margin-left:12px;width:calc(100% - 12px);position:relative}.agent-card.child:before{content:"";position:absolute;width:7px;height:12px;border-left:1px solid #cedbce;border-bottom:1px solid #cedbce;left:-10px;top:12px}.agent-avatar{width:32px;height:34px;border-radius:7px;background:#dae8dd;display:grid;place-items:center;font:14px var(--mono);color:#3b735e;flex-shrink:0}.agent-avatar.lead{background:#2d6c56;color:#fff}.agent-card-body{min-width:0;flex:1}.agent-card-name{display:flex;align-items:center;justify-content:space-between;gap:4px;font-size:12px;font-weight:600}.agent-card-role{font-size:10px;color:#87968c;margin-top:5px;line-height:1.5}.state-dot{width:6px;height:6px;border-radius:50%;background:#7caaa0;display:inline-block;flex-shrink:0}.state-dot.done{background:#5b9876}.state-dot.waiting,.state-dot.waiting_agents{background:#c49c57}.state-dot.error{background:#c6685c}.state-dot.interrupted,.state-dot.closed,.state-dot.unknown{background:#a8afa9}.sidebar-bottom{display:flex;gap:9px;margin-top:auto;padding-top:46px;color:#8a978d;font-size:10px;align-items:flex-start}.sidebar-bottom b{font-weight:400;color:#6d8475}.sidebar-bottom p{margin:6px 0 0;font-size:10px}.local-dot{height:7px;width:7px;border:1px solid #8ea78e;border-radius:50%;margin-top:4px}.main{padding:30px 28px 0;min-width:0}.workspace-heading{display:flex;justify-content:space-between;align-items:center;gap:20px;margin-bottom:26px}.workspace-heading h2{font-size:29px;font-weight:500;letter-spacing:1.5px;margin:13px 0 10px}.workspace-heading p{color:#8b968f;font-size:11px;margin:0;max-width:440px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:1.8}.live-dot{width:5px;height:5px;border-radius:50%;background:#3e8769}.summary{display:flex;gap:24px;flex-shrink:0;padding-top:14px}.summary div{display:flex;flex-direction:column;gap:9px;text-align:center}.summary strong{font:25px var(--mono);font-weight:400;color:#3c6050}.summary span{font-size:10px;color:#8b978e}.office-panel{position:relative;height:clamp(370px,47vh,600px);min-height:370px;border:1px solid #e0e7de;border-radius:11px;overflow:hidden;background:radial-gradient(ellipse at 50% 55%,#f5f4e9 0%,#e9efe5 75%)}.scene{position:absolute;inset:0}.office-canvas,.office-gl{position:absolute;inset:0;display:block}.office-canvas{z-index:1}.scene-toolbar{position:absolute;z-index:3;left:18px;right:14px;top:14px;display:flex;align-items:center;justify-content:space-between;pointer-events:none}.scene-label{display:flex;gap:8px;align-items:center;font-size:11px;color:#526f5b}.scene-label i{height:7px;width:7px;border:1px solid #659178;border-radius:2px}.scene-label small{font:9px var(--mono);color:#9daa9b}.scene-actions{display:flex;align-items:center;gap:12px;pointer-events:auto}.motion-switch{display:flex;align-items:center;gap:5px;font-size:10px;color:#83937f;cursor:pointer;white-space:nowrap}.motion-switch input{accent-color:var(--green);width:12px;height:12px}.icon-button{width:29px;height:29px;border:1px solid #dce4d8;background:#fafff5b8;border-radius:5px;font-size:19px;color:#69816b;display:grid;place-items:center}.scene-status{position:absolute;left:50%;top:51%;transform:translate(-50%,-50%);max-width:80%;padding:10px 16px;background:#f8faf3e8;color:#788971;font-size:12px;z-index:2;border-radius:6px;text-align:center;pointer-events:none}.scene-footer{position:absolute;bottom:15px;left:18px;right:18px;display:flex;justify-content:space-between;gap:10px;pointer-events:none;color:#8f9e88;font-size:9px;z-index:2}.scene-footer i{font-style:normal;margin:0 7px}.scene-watermark{font:9px var(--mono);letter-spacing:1px}.timeline-panel{margin-top:27px}.timeline-heading{display:flex;justify-content:space-between;align-items:center;gap:12px}.timeline-heading h3{font-size:14px;font-weight:500;letter-spacing:.5px;margin:8px 0 0}.muted{color:#929e95;font-size:10px}.timeline{display:flex;gap:12px;overflow-x:auto;padding:20px 0 16px;min-height:132px;scrollbar-width:thin;scrollbar-color:#d4dfd1 transparent}.event-card{background:#fff;border:1px solid #e1e7de;border-radius:7px;padding:12px 14px;text-align:left;flex:0 0 192px;position:relative;color:var(--ink)}.event-card:hover{border-color:#8db6a0;box-shadow:0 3px 10px #234b3110}.event-card-top{display:flex;justify-content:space-between;font-size:10px;color:#93a087;align-items:center;gap:8px}.event-type{display:flex;gap:6px;align-items:center;color:#65816b}.event-type i{font-style:normal;color:#388366}.event-card p{font-size:11px;line-height:1.65;margin:9px 0 0;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;height:36px}.event-card.report{border-top:2px solid #64a187}.event-card.error,.event-card.interrupted{border-top:2px solid #c1796d}.empty{color:#a0aa9d;font-size:12px;line-height:1.9;padding:20px 0}.main-footer{display:flex;justify-content:space-between;gap:15px;color:#a2ada0;font-size:9px;padding:16px 0 18px;border-top:1px solid var(--line);margin-top:4px}.details{background:#fff;border-left:1px solid var(--line);padding:30px 22px 20px;min-width:0;display:flex;flex-direction:column}.agent-header{margin-top:27px;display:flex;gap:13px;align-items:center}.agent-header .agent-avatar{height:46px;width:43px;font-size:21px}.agent-header h3{font-size:17px;font-weight:500;margin:0 0 6px;overflow-wrap:anywhere}.agent-header p{color:#8a988c;font-size:10px;margin:0}.agent-metadata{margin:24px 0 23px;border-top:1px solid #edf0ea;padding-top:14px;display:grid;gap:11px;font-size:10px}.metadata-row{display:flex;justify-content:space-between;gap:10px}.metadata-row>span:first-child{color:#98a295;flex-shrink:0}.metadata-row>span:last-child{text-align:right;color:#65816b;overflow-wrap:anywhere;min-width:0}.status-pill{background:#eef4eb;padding:3px 7px;border-radius:4px;font-size:10px;color:#54816b}.detail-tabs{display:flex;border-bottom:1px solid var(--line);margin-bottom:23px;gap:25px}.detail-tabs button{border:0;background:none;color:#a0aa9d;padding:0 0 12px;font-size:11px}.detail-tabs button.active{color:#306e56;border-bottom:2px solid #398567}.detail-section-label{display:flex;justify-content:space-between;align-items:center;color:#92a08f;font-size:10px;margin:0 0 12px}.text-button{border:0;background:none;padding:0;color:#6c9279;font-size:10px}.task-copy{font-size:12px;line-height:1.95;color:#6d7f70;margin:0 0 27px;overflow-wrap:anywhere}.activity-list{display:flex;flex-direction:column;gap:20px;padding-left:12px;border-left:1px solid #e6ece2;margin-left:3px}.activity-item{position:relative;font-size:11px;line-height:1.7}.activity-item:before{content:"";height:5px;width:5px;position:absolute;left:-15px;top:6px;background:#b4c8af;border-radius:50%;box-shadow:0 0 0 4px #fff}.activity-item time{font:9px var(--mono);color:#a4afa0;display:block;margin-bottom:4px}.activity-item p{margin:0;color:#70846f;overflow-wrap:anywhere}.activity-item button{border:0;padding:0;background:transparent;color:#5c8d70;font-size:10px;margin-top:5px}.details-footer{color:#b0b8ab;font-size:9px;line-height:2;margin-top:auto;padding-top:28px}.report-content{font-size:12px;line-height:1.9;color:#607861;overflow-wrap:anywhere}.report-block{margin-bottom:24px}.report-block header{display:flex;justify-content:space-between;font-size:10px;color:#90a18b;margin-bottom:10px}.report-block pre{font:12px/1.95 var(--sans);white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.report-open{width:100%;border:1px solid var(--line);padding:8px;background:#f5f8f2;border-radius:5px;color:#63836a;margin:12px 0}.details #activity-panel,.details #report-panel{max-height:calc(100vh - 420px);min-height:160px;overflow:auto;scrollbar-width:thin;padding-right:2px}dialog{width:min(840px,92vw);max-height:88vh;border:1px solid #d7e3d7;border-radius:12px;padding:27px 30px;color:var(--ink);box-shadow:0 25px 120px #12332033}dialog::backdrop{background:#1b302a66;backdrop-filter:blur(3px)}.dialog-heading{display:flex;align-items:center;justify-content:space-between;gap:15px}.dialog-heading h3{font-weight:500;font-size:18px;margin:10px 0 0}#dialog-body{white-space:pre-wrap;overflow-wrap:anywhere;font:13px/2 var(--sans);max-height:58vh;overflow:auto;padding:20px 0;margin:15px 0}.dialog-footer{display:flex;align-items:center;justify-content:space-between;padding-top:15px;border-top:1px solid var(--line);font-size:10px;color:#99a493}.solid-button{background:#2d765b;border:0;border-radius:5px;padding:10px 16px;color:#fff;font-size:12px}.error-text{color:var(--red)}.empty-illustration{font-size:25px;margin-bottom:8px}.team-progress{height:3px;background:#e4ede0;margin-top:8px;border-radius:2px}
3
+ @media(min-width:1600px){.app-layout{grid-template-columns:270px minmax(520px,1fr) 345px}.main{padding:36px 38px 0}.sidebar{padding:36px 26px 20px}.details{padding:36px 28px 24px}.workspace-heading h2{font-size:34px}.office-panel{height:54vh}}
4
+ @media(max-width:1190px){.app-layout{grid-template-columns:210px minmax(350px,1fr) 270px}.main{padding:25px 18px 0}.sidebar{padding:25px 14px 16px}.details{padding:25px 17px 20px}.summary{gap:15px}.workspace-heading h2{font-size:24px}.scene-watermark{display:none}.workspace-heading p{max-width:240px}}
5
+ @media(max-width:950px){.app-layout{grid-template-columns:190px minmax(0,1fr)}.details{grid-column:1/-1;border-top:1px solid var(--line);border-left:0;display:grid;grid-template-columns:220px 1fr;gap:0 28px;padding:24px}.details>.section-eyebrow{grid-column:1/-1}.details .agent-header{grid-column:1;grid-row:2;margin-top:20px}.details .agent-metadata{grid-column:1;grid-row:3/5}.details .detail-tabs{grid-column:2;grid-row:2;align-self:end}.details #activity-panel,.details #report-panel{grid-column:2;grid-row:3/6;max-height:380px}.details-footer{grid-column:1}.summary{gap:18px}.office-panel{height:410px}.topbar{padding:0 20px}.top-actions{gap:12px}.brand-caption{display:none}.brand-divider{display:none}.workspace-heading p{max-width:280px}.sidebar-bottom{margin-top:35px}}
6
+ @media(max-width:620px){.topbar{height:60px;padding:0 15px}.brand{font-size:17px}.brand-mark{font-size:30px}.clock{display:none}.top-actions{gap:10px}.app-layout{grid-template-columns:1fr}.sidebar{border-right:0;border-bottom:1px solid var(--line);padding:18px}.sidebar>.section-eyebrow,.sidebar h1,.sidebar-bottom,.project-path,.sidebar .section-line{display:none}.sidebar .field-label{margin-bottom:7px}.team-tree{flex-direction:row;overflow:auto;margin-top:12px;gap:8px}.agent-card,.agent-card.child{flex:0 0 160px;margin-left:0;padding:9px;width:160px}.agent-card.child:before{display:none}.main{padding:22px 16px 0}.workspace-heading{gap:8px;margin-bottom:20px}.workspace-heading h2{font-size:23px;margin-top:10px}.workspace-heading p{max-width:200px;font-size:10px}.summary{gap:13px}.summary strong{font-size:21px}.summary span{font-size:9px}.office-panel{height:365px;min-height:365px}.scene-footer{font-size:8px;left:12px}.scene-toolbar{left:12px;right:10px}.scene-label{font-size:10px}.motion-switch{font-size:9px}.timeline-heading h3{font-size:12px}.event-card{flex-basis:174px}.details{display:flex;padding:24px 20px}.details #activity-panel,.details #report-panel{max-height:none}.details .agent-metadata{margin-bottom:23px}.details-footer{margin-top:20px}.main-footer{font-size:8px}.notice{padding:10px 15px}.details .detail-tabs{margin-top:0}.agent-header{margin-top:20px}dialog{padding:20px}}
7
+ @media(prefers-reduced-motion:reduce){*{scroll-behavior:auto!important;animation:none!important;transition:none!important}}
8
+
9
+ /* 语言切换(中 / EN) */
10
+ .lang-switch{display:flex;align-items:center;gap:2px;padding:2px;border:1px solid var(--line);border-radius:7px;background:#f5f7f3;flex:none}
11
+ .lang-switch button{border:0;background:transparent;color:#7d8b83;font:11px var(--mono);line-height:1;letter-spacing:.3px;padding:4px 7px;border-radius:5px}
12
+ .lang-switch button:hover{color:var(--ink)}
13
+ .lang-switch button[aria-pressed=true],.lang-switch button.active{background:var(--white);color:var(--green);box-shadow:0 1px 2px rgba(37,58,52,.12)}
14
+ @media(max-width:950px){.lang-switch{gap:0;padding:1px}.lang-switch button{padding:4px 6px;font-size:10px}}
15
+ @media(max-width:620px){.lang-switch button{padding:4px 5px;font-size:9px;letter-spacing:0}}