dsh-mutipleagent 0.0.0-stage → 0.4.0
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.
- package/CHANGELOG.md +214 -0
- package/CONTRIBUTING.md +49 -0
- package/LICENSE +21 -0
- package/README.en.md +125 -0
- package/README.md +302 -2
- package/SECURITY.md +27 -0
- package/THIRD_PARTY_NOTICES.md +29 -0
- package/assets/agents/MAGPIE-LICENSE +21 -0
- package/assets/agents/README.md +47 -0
- package/assets/agents/antigravity.png +0 -0
- package/assets/agents/claude.png +0 -0
- package/assets/agents/codex.png +0 -0
- package/assets/agents/copilot.svg +1 -0
- package/assets/agents/dsh.svg +1 -0
- package/assets/agents/gemini.png +0 -0
- package/assets/agents/grok.svg +1 -0
- package/assets/agents/hermes.svg +1 -0
- package/assets/agents/kimi.svg +1 -0
- package/assets/agents/omp.svg +7 -0
- package/assets/agents/opencode.svg +1 -0
- package/assets/agents/pi.svg +1 -0
- package/assets/kenney/LICENSE-furniture-kit.txt +23 -0
- package/assets/kenney/LICENSE-mini-characters.txt +28 -0
- package/assets/kenney/characters/Textures/colormap.png +0 -0
- package/assets/kenney/characters/character-female-a.glb +0 -0
- package/assets/kenney/characters/character-female-b.glb +0 -0
- package/assets/kenney/characters/character-female-c.glb +0 -0
- package/assets/kenney/characters/character-female-d.glb +0 -0
- package/assets/kenney/characters/character-female-e.glb +0 -0
- package/assets/kenney/characters/character-female-f.glb +0 -0
- package/assets/kenney/characters/character-male-a.glb +0 -0
- package/assets/kenney/characters/character-male-b.glb +0 -0
- package/assets/kenney/characters/character-male-c.glb +0 -0
- package/assets/kenney/characters/character-male-d.glb +0 -0
- package/assets/kenney/characters/character-male-e.glb +0 -0
- package/assets/kenney/characters/character-male-f.glb +0 -0
- package/assets/kenney/furniture/benchCushion.glb +0 -0
- package/assets/kenney/furniture/bookcaseOpen.glb +0 -0
- package/assets/kenney/furniture/books.glb +0 -0
- package/assets/kenney/furniture/cabinetTelevision.glb +0 -0
- package/assets/kenney/furniture/cardboardBoxClosed.glb +0 -0
- package/assets/kenney/furniture/chairCushion.glb +0 -0
- package/assets/kenney/furniture/chairDesk.glb +0 -0
- package/assets/kenney/furniture/chairModernCushion.glb +0 -0
- package/assets/kenney/furniture/coatRackStanding.glb +0 -0
- package/assets/kenney/furniture/computerKeyboard.glb +0 -0
- package/assets/kenney/furniture/computerMouse.glb +0 -0
- package/assets/kenney/furniture/computerScreen.glb +0 -0
- package/assets/kenney/furniture/desk.glb +0 -0
- package/assets/kenney/furniture/doorway.glb +0 -0
- package/assets/kenney/furniture/kitchenBar.glb +0 -0
- package/assets/kenney/furniture/kitchenCabinet.glb +0 -0
- package/assets/kenney/furniture/kitchenCoffeeMachine.glb +0 -0
- package/assets/kenney/furniture/kitchenFridgeLarge.glb +0 -0
- package/assets/kenney/furniture/kitchenMicrowave.glb +0 -0
- package/assets/kenney/furniture/kitchenSink.glb +0 -0
- package/assets/kenney/furniture/lampRoundFloor.glb +0 -0
- package/assets/kenney/furniture/lampSquareTable.glb +0 -0
- package/assets/kenney/furniture/laptop.glb +0 -0
- package/assets/kenney/furniture/loungeChairRelax.glb +0 -0
- package/assets/kenney/furniture/loungeSofa.glb +0 -0
- package/assets/kenney/furniture/plantSmall1.glb +0 -0
- package/assets/kenney/furniture/plantSmall2.glb +0 -0
- package/assets/kenney/furniture/plantSmall3.glb +0 -0
- package/assets/kenney/furniture/pottedPlant.glb +0 -0
- package/assets/kenney/furniture/radio.glb +0 -0
- package/assets/kenney/furniture/rugRectangle.glb +0 -0
- package/assets/kenney/furniture/rugRound.glb +0 -0
- package/assets/kenney/furniture/sideTable.glb +0 -0
- package/assets/kenney/furniture/speaker.glb +0 -0
- package/assets/kenney/furniture/stoolBar.glb +0 -0
- package/assets/kenney/furniture/table.glb +0 -0
- package/assets/kenney/furniture/tableCoffee.glb +0 -0
- package/assets/kenney/furniture/tableRound.glb +0 -0
- package/assets/kenney/furniture/televisionModern.glb +0 -0
- package/assets/kenney/furniture/toaster.glb +0 -0
- package/assets/kenney/furniture/trashcan.glb +0 -0
- package/assets/kenney/furniture/wallWindow.glb +0 -0
- package/assets/logo.svg +12 -0
- package/assets/scene-icons/arcade.png +0 -0
- package/assets/scene-icons/cafe.png +0 -0
- package/assets/scene-icons/castle.png +0 -0
- package/assets/scene-icons/christmas.png +0 -0
- package/assets/scene-icons/graveyard.png +0 -0
- package/assets/scene-icons/map.png +0 -0
- package/assets/scene-icons/office.png +0 -0
- package/assets/scene-icons/pirate.png +0 -0
- package/assets/scene-icons/station.png +0 -0
- package/assets/scenes/arcade.jpg +0 -0
- package/assets/scenes/cafe.jpg +0 -0
- package/assets/scenes/castle.jpg +0 -0
- package/assets/scenes/christmas.jpg +0 -0
- package/assets/scenes/graveyard.jpg +0 -0
- package/assets/scenes/office.jpg +0 -0
- package/assets/scenes/pirate.jpg +0 -0
- package/assets/scenes/station.jpg +0 -0
- package/client.js +144 -0
- package/cordis.patch.yml +3 -0
- package/harness.cjs +49 -0
- package/package.json +89 -4
- package/public/app.js +1 -0
- package/public/chunks/chunk-MU3LEDFF.js +4305 -0
- package/public/demo-icons/arrow-counterclockwise.svg +4 -0
- package/public/demo-icons/arrow-right.svg +3 -0
- package/public/demo-icons/bell.svg +3 -0
- package/public/demo-icons/box-seam-fill.svg +3 -0
- package/public/demo-icons/chat-left-text-fill.svg +3 -0
- package/public/demo-icons/check-lg.svg +3 -0
- package/public/demo-icons/chevron-down.svg +3 -0
- package/public/demo-icons/cpu-fill.svg +4 -0
- package/public/demo-icons/crosshair.svg +3 -0
- package/public/demo-icons/diagram-3-fill.svg +3 -0
- package/public/demo-icons/file-earmark-code-fill.svg +3 -0
- package/public/demo-icons/fullscreen.svg +3 -0
- package/public/demo-icons/pause-fill.svg +3 -0
- package/public/demo-icons/people-fill.svg +3 -0
- package/public/demo-icons/pie-chart-fill.svg +3 -0
- package/public/demo-icons/play-fill.svg +3 -0
- package/public/demo-icons/search.svg +3 -0
- package/public/demo-icons/shield-check.svg +4 -0
- package/public/demo-icons/stack.svg +4 -0
- package/public/demo-icons/x-lg.svg +3 -0
- package/public/demo.css +225 -0
- package/public/demo.html +67 -0
- package/public/demo.js +7 -0
- package/public/index.html +59 -0
- package/public/style.css +15 -0
- package/public/vendor/office.js +1631 -0
- package/src/codex.js +674 -0
- package/src/demo.js +103 -0
- package/src/harness-watcher.js +584 -0
- package/src/server.js +239 -0
- package/vendor/licenses/BOOTSTRAP-ICONS-LICENSE.txt +21 -0
- package/vendor/licenses/ESBUILD-LICENSE.txt +21 -0
- package/vendor/licenses/MESHOPTIMIZER-LICENSE.txt +22 -0
- package/vendor/licenses/PLAYWRIGHT-LICENSE.txt +202 -0
- package/vendor/licenses/PLAYWRIGHT-NOTICE.txt +5 -0
- package/vendor/licenses/THREE-LICENSE.txt +21 -0
package/public/demo.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{a as ft,b as it,c as _,d as We,e as mt,f as gt,g as Ne,h as Ce,i as yt,j as vt,k as bt,l as kt,m as rt,n as wt,o as at,p as xt,q as Et,r as St,s as Ct,t as ct,u as n,v as J,w as Rt,x as Re,y as pe,z as _e}from"./chunks/chunk-MU3LEDFF.js";var lt=[4.5,9.1,13.7,18.3],dt=[6.2,11.2,16.2],De=23,He=21,It={blue:"#1769e8",white:"#f6f9fe",steel:"#d2dce8",navy:"#233d61"},T=(t,e,o,s,r,u={})=>({f:t,x:e,y:o,w:s,d:r,...u}),W=(t,e,o,s,r,u,i=0)=>({special:"box",x:t,y:e,w:o,d:s,h:r,color:u,y0:i,abs:!0});function jt({props:t,solid:e,stations:o},s,r){t.push({special:"floor",x:s-2.05,y:r-2,w:4.1,d:4,color:"#e4ebf5",color2:"#dde6f1",y0:.02}),t.push(W(s-1.65,r-.8,3.3,1.6,.9,"#f7faff")),t.push(W(s-1.7,r-.85,3.4,1.7,.06,"#eaf1fb",.9)),t.push(W(s-1.7,r-.85,3.4,.14,.09,"#176de8",.9)),t.push(W(s-1.7,r+.71,3.4,.14,.09,"#176de8",.9)),t.push(W(s-1.7,r-.85,.07,1.7,.96,"#397bd5")),t.push(W(s+1.63,r-.85,.07,1.7,.96,"#397bd5")),t.push(T("computerScreen",s-.64,r-.34,1.02,.34,{h:.62,y0:.96,abs:!0,rot:180})),t.push(T("computerScreen",s-.64,r+.34,1.02,.34,{h:.62,y0:.96,abs:!0,rot:0})),t.push(T("computerScreen",s+.56,r-.5,.74,.3,{h:.5,y0:.96,abs:!0,rot:192})),t.push(T("computerScreen",s+.56,r+.5,.74,.3,{h:.5,y0:.96,abs:!0,rot:12})),t.push(T("computerKeyboard",s-.62,r-.8,.72,.22,{y0:.96,abs:!0})),t.push(T("computerKeyboard",s-.62,r+.58,.72,.22,{y0:.96,abs:!0,rot:180})),t.push(T("computerMouse",s+.12,r-.78,.13,.18,{y0:.96,abs:!0})),t.push(T("computerMouse",s+.12,r+.6,.13,.18,{y0:.96,abs:!0,rot:180})),t.push(T("plantSmall1",s+1.25,r-.16,.32,.32,{h:.42,y0:.96,abs:!0})),t.push(T("books",s-1.42,r+.16,.5,.3,{h:.16,y0:.96,abs:!0})),t.push(T("books",s+1.24,r+.4,.32,.22,{h:.14,y0:.96,abs:!0})),t.push(T("chairDesk",s-.375,r-1.75,.75,.8,{h:1,rot:0})),t.push(T("chairDesk",s-.375,r+.95,.75,.8,{h:1,rot:180}));for(let[u,i,h]of[[s-.375,r-1.75,0],[s-.375,r+1.35,180]])o.push({x:u+.375,y:i+.4,yaw:h,pose:"sit"});e.push([s-1.7,r-.85,3.4,1.7])}function Kt(t=4,e="codex"){let o=[{special:"floor",x:-200,y:-210,w:440,d:440,color:"#dde5ef",color2:"#d6dfeb",tile:8},{special:"floor",x:.1,y:.1,w:De-.4,d:He-.5,color:"#e9edf3",color2:"#dee5ee",tile:4.2,y0:.012},{special:"wall",axis:"x",x:-1,y:.05,len:De+2,h:4.3,color:"#e7eef7",holes:[[1.1,4.5,1.3,3.8],[7.4,4.5,1.3,3.8],[13.6,4.5,1.3,3.8],[19.2,3.5,1.3,3.8]],frame:"#c3cfdf"},{special:"wall",axis:"z",x:.05,y:0,len:He,h:3.4,color:"#e4ebf5",holes:[[2.4,3,1.1,2.9],[8,3,1.1,2.9],[14,3,1.1,2.9]],frame:"#c7d2e1"},W(0,.15,De-1,.1,.12,"#bbcbdc"),W(.15,0,.1,He-1,.12,"#bbcbdc")],s=[],r=[];for(let u of dt)for(let i of lt)jt({props:o,solid:s,stations:r},i,u);for(let u=r.length;u<t;u++){let i=u-r.length,h=lt[i%lt.length],a=dt[dt.length-1]+3.4;o.push(W(h-1.65,a-1.65,3.3,1,.92,"#f7faff")),o.push(W(h-1.7,a-1.7,3.4,1.1,.08,It.blue,.92)),o.push(T("computerScreen",h-.6,a-1.5,1,.35,{h:.62,y0:1,abs:!0})),o.push(T("chairDesk",h-.375,a-.4,.75,.8,{h:1,rot:180})),s.push([h-1.7,a-1.7,3.4,1.1]),r.push({x:h,y:a+.35,yaw:180,pose:"sit"})}o.push({special:"floor",x:1.2,y:1.1,w:5.6,d:3,color:"#dbe6f2",color2:"#dbe6f2",y0:.03},{special:"glass",x:6.85,y:1.1,w:.05,d:3,h:2.5,abs:!0},W(6.8,1.1,.12,3,.07,"#9cacbf",2.5),W(6.8,1.1,.1,.1,2.5,"#becddd"),W(6.8,4,.1,.1,2.5,"#becddd"),T("table",1.9,1.7,3.2,1.5,{h:.86,stretch:!0}),T("laptop",3.1,2.1,.7,.6,{y0:.88,abs:!0,rot:180}),T("computerScreen",4.2,4.42,.92,.3,{h:.56,y0:.88,abs:!0,rot:180}),T("computerKeyboard",4.15,4.15,.66,.2,{y0:.88,abs:!0}),T("computerMouse",4.85,4.15,.12,.17,{y0:.88,abs:!0}),T("chairModernCushion",2.6,3.5,.65,.7,{rot:180}),T("chairModernCushion",2.6,1,.65,.7),T("chairModernCushion",4,3.5,.65,.7,{rot:180}),T("chairModernCushion",4,1,.65,.7),T("pottedPlant",6.3,4.1,.6,.6,{h:1.5})),s.push([1.9,1.7,3.2,1.5],[6.8,1.1,.12,2.9]);for(let[u,i]of[[9.6,.9],[11.5,.9],[15.4,.9],[17.3,.9],[21.4,2]]){o.push(W(u,i,1.7,.95,2.6,"#e9eff6"));for(let h of[0,1.63])o.push(W(u+h,i,.07,.95,2.7,It.blue));for(let h of[.18,.72,1.26,1.8,2.34])o.push(W(u+.12,i+.92,1.46,.05,.35,"#455b78",h)),o.push({special:"glow",x:u+.22,y:i+.975,y0:h+.12,w:.12,d:.025,h:.035,color:"#52b9ff",intensity:1,abs:!0});s.push([u,i,1.7,.95])}return o.push(T("bookcaseOpen",.45,3.2,.5,2.6,{h:1.8}),T("books",.55,3.4,.35,2.2,{h:.3,y0:1,abs:!0}),T("kitchenCabinet",.45,8.2,1.5,3.6,{h:1,stretch:!0}),T("kitchenCoffeeMachine",.5,8.8,.6,.55,{h:.65,y0:1.01,abs:!0}),T("kitchenSink",.55,10.6,.9,.7,{h:.15,y0:1.01,abs:!0}),T("pottedPlant",.9,5.8,.55,.55,{h:1.4}),T("pottedPlant",.9,13.2,.6,.6,{h:1.5})),o.push(T("bookcaseOpen",21.3,6,.55,3,{h:1.9}),T("books",21.4,6.2,.4,2.6,{h:.32,y0:1.05,abs:!0}),T("bookcaseOpen",21.3,11.4,.55,3,{h:1.9}),T("books",21.4,11.6,.4,2.6,{h:.32,y0:1.05,abs:!0}),T("pottedPlant",21.2,16,.65,.65,{h:1.6}),T("pottedPlant",21.4,19.1,.6,.6,{h:1.4})),o.push(T("loungeSofa",8.2,19.2,3.8,1.3,{h:1.05}),T("tableCoffee",8.9,17.9,2,.8,{h:.5}),T("books",9.3,18.1,.5,.3,{h:.18,y0:.52,abs:!0}),T("pottedPlant",6.2,19.3,.7,.7,{h:1.5}),T("cardboardBoxClosed",12.6,19.6,.55,.5,{h:.45}),{special:"sign",x:4.2,y:.12,z:3.1,w:3,h:.64,text:n(e==="harness"?"scene.sign.harness":"scene.sign.codex"),bg:"#f0f5fc",fg:"#265a9d"},{special:"sign",x:17.4,y:.12,z:3.1,w:3.2,h:.65,text:n("scene.sign.agents"),bg:"#edf4fe",fg:"#3d6591"}),{W:De,D:He,viewH:4.3,background:"#dde5ef",sky:"#dcecff",spawn:{x:1,y:18.4},walk:[[0,0,De,He]],solid:s,stations:r,pois:[],props:o}}function Oe(t){t.traverse(e=>{if(e.geometry?.dispose(),e.material)for(let o of Array.isArray(e.material)?e.material:[e.material])o.dispose()})}var Ie=class extends Ct{constructor(e,{onSelect:o,reduced:s=!1,pins:r,pinFloor:u,count:i=4,live:h=!1,source:a="codex"}){super(e,{count:i,onSelect:o,reduced:s,live:h,scene:Kt(i,a)}),this.pins=r,this.pinFloor=typeof u=="function"?u:()=>70,this.selectCallback=o,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 St,this.onFrame=()=>this.updatePins(),this.offLang=pe(()=>this.paintScreens(!0)),this.canvas.addEventListener("pointerdown",y=>{this.downPoint={x:y.clientX,y:y.clientY}}),this.gl&&(this.gl.toneMappingExposure=1.15,this.gl.setClearColor("#dde5ef"),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 o=this.cw<850,s=new _(o?10.6:11.5,.35,o?10.4:11.5);(e||!this.fitted)&&(this.camera.position.copy(s).add(new _(24,23.5,24)),this.controls.target.copy(s),this.camera.zoom=1,this.fitted=!0);let r=o?32:Math.max(31,36*this.ch/this.cw),u=r*this.cw/this.ch;Object.assign(this.camera,{left:-u/2,right:u/2,top:r/2,bottom:-r/2}),this.camera.lookAt(this.controls.target),this.camera.updateProjectionMatrix(),this.sun.position.set(3,22,5),this.sun.target.position.set(11.5,0,10.5);let i=22;Object.assign(this.sun.shadow.camera,{left:-i,right:i,top:i,bottom:-i,near:1,far:72}),this.sun.shadow.camera.updateProjectionMatrix()}build(){super.build(),this.floorMark("COORDINATION",11.5,3.35,5,.6),this.floorMark("AGENT WORKSPACE",4.5,8.7,4.4,.5),this.floorMark("COLLABORATION LANE",15.5,13.7,5.2,.55),this.floorMark("VERIFICATION",11.5,18.8,3.9,.5);let e=new We;for(let s=0;s<8;s++){let r=new Ce(new rt(.28,1.3),new xt({color:"#f6faff",roughness:.9}));r.rotation.x=-Math.PI/2,r.rotation.z=-.55,r.position.set(9.4+s*.45,.03,13.7),e.add(r)}this.room.add(e),this.screens=new Map,this.screenMeshes=[],this.screenList=[];let o=new Map;for(let s of this.sceneScreens||[]){if(s.kind!=="computerScreen")continue;let r=null,u=1/0;for(let i of this.plan.desks){let h=Math.hypot(s.x-i.seat.x,s.z-i.seat.y);h<u&&(u=h,r=i)}r&&u<2.2&&(s.mesh.userData.desk=r,this.screenMeshes.push(s.mesh),this.screenList.push({desk:r,mesh:s.mesh,record:s}),(!o.has(r)||u<o.get(r))&&(o.set(r,u),this.screens.set(r,s.mesh)))}this.routeId=null,this.makeRoute(this.selectedId||this.rootId),this.paintScreens(!0)}floorMark(e,o,s,r,u){let i=document.createElement("canvas");i.width=768,i.height=128;let h=i.getContext("2d");h.clearRect(0,0,768,128),h.fillStyle="#899eb9",h.font='600 38px "Segoe UI",sans-serif',h.textAlign="center",h.textBaseline="middle",h.fillText(e,384,64);let a=new vt(i);a.colorSpace=ft;let y=new Ce(new rt(r,u),new Ne({map:a,transparent:!0,depthWrite:!1}));y.rotation.x=-Math.PI/2,y.position.set(o,.036,s),this.room.add(y)}actorFor(e){let o=super.actorFor(e);return o?(o.demoScale||(o.obj.scale.multiplyScalar(1.65),o.head&&o.head.scale.multiplyScalar(.78),o.obj.userData.agentId=e.s.id,o.demoScale=!0),o):null}setTeam(e,o){this.rootId!==o&&(this.clearEventRoutes(),this.routeId=null),super.setTeam(e,o);for(let s of this.people.values())s.desk.pose="sit";this.selectedId&&!this.people.has(this.selectedId)&&(this.selectedId=o),this.makeRoute(this.selectedId||o),this.paintScreens()}bubble(){}screenPoint(e){let o=e.desk.seat;return new _(o.x+.1,1.3,o.y-1.15)}pathBetween(e,o){if(!e?.desk||!o?.desk||e===o)return null;let s=this.screenPoint(e),r=this.screenPoint(o),u=s.distanceTo(r),i=new _((s.x+r.x)/2,Math.max(s.y,r.y)+.75+Math.min(1.3,u*.1),(s.z+r.z)/2+.35);return new bt([s,i,r],!1,"centripetal",.5)}addRouteLine(e,o){for(let[r,u,i]of[[.18,"#42c8ff",.16],[.065,"#0870ff",.94]])e.add(new Ce(new at(o,100,r,6,!1),new Ne({color:u,transparent:!0,opacity:i,depthWrite:!1,depthTest:!1})));let s=new yt(new mt().setFromPoints(o.getPoints(70)),new Et({color:"#e9fbff",dashSize:.12,gapSize:.18,linewidth:2}));s.computeLineDistances(),e.add(s)}clearEventRoutes(){for(let e of this.eventRoutes||[])this.scene?.remove(e.group),Oe(e.group);this.eventRoutes=[]}makeRoute(e){let o=this.people?.get(e);if(!this.loaded||!this.room||!o)return;let s=this.people.get(o.s.parentId),r=[e,o.desk.seat.x,o.desk.seat.y,s?.s.id,s?.desk.seat.x,s?.desk.seat.y].join(":");if(this.routeId===e&&this.routeSignature===r)return;this.routeGroup&&(this.scene.remove(this.routeGroup),Oe(this.routeGroup)),this.routeId=e,this.routeSignature=r,this.routeGroup=new We,this.scene.add(this.routeGroup);let u=o.desk.seat;this.routeCurve=this.pathBetween(s,o),this.packet=null,this.routeCurve&&(this.addRouteLine(this.routeGroup,this.routeCurve),this.packet=null);for(let i of[-1,1])for(let h of[-1,1]){let a=u.x+i*1.95,y=u.y-.4+h*1.4;for(let c of[[new _(a,.05,y),new _(a-i*.6,.05,y)],[new _(a,.05,y),new _(a,.05,y-h*.5)],[new _(a,.05,y),new _(a,.7,y)]]){let v=new kt(c[0],c[1]);this.routeGroup.add(new Ce(new at(v,1,.035,6,!1),new Ne({color:"#08a0ff"})))}}}select(e,o=!1){if(this.selectedId=e,this.makeRoute(e),o&&this.cw<850){let s=this.people.get(e);if(s&&this.camera){let r=new _(s.x,.3,s.y);this.camera.position.add(r.clone().sub(this.controls.target)),this.controls.target.copy(r)}}}updatePins(){if(!this.pins||!this.camera||!this.loaded)return;let e=Math.max(70,this.pinFloor()||0),o=[];for(let r of this.pins.children){let u=this.people.get(r.dataset.agent);if(!u)continue;let i=new _(u.x,2.2,u.y-.4).project(this.camera),h=(i.x+1)*.5*this.cw,a=(1-i.y)*.5*this.ch,y=r.offsetWidth||110,c=r.offsetHeight||40,v=Math.max(a,e+c);o.push({pin:r,x:h,y:a,w:y,h:c,top:v-c,bottom:v,hidden:i.z>1||h<-40||h>this.cw+40||a<e-56||a>this.ch-70})}o.sort((r,u)=>r.top-u.top||r.x-u.x);let s=[];for(let r of o)if(!r.hidden){for(let u=0;u<6;u+=1){let i=s.find(a=>r.x+r.w/2>a.left-8&&r.x-r.w/2<a.right+8&&r.top<a.bottom+6&&r.bottom>a.top-6);if(!i)break;let h=i.bottom+8-r.top;r.top+=h,r.bottom+=h}s.push({left:r.x-r.w/2,right:r.x+r.w/2,top:r.top,bottom:r.bottom})}for(let r of o)r.pin.style.left=r.x+"px",r.pin.style.top=r.bottom+"px",r.pin.hidden=r.hidden}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 o=this.people.get(e.sessionId),s=this.people.get(e.type==="report"?o?.s.parentId:e.targetId),r=this.pathBetween(o,s);if(!r)return;let u=new We;this.addRouteLine(u,r);let i=performance.now(),h=[];for(let a=0;a<3;a++){let y=new Ce(new wt(.105,12,8),new Ne({color:a?"#bfefff":"#ffffff",transparent:!0,opacity:.95,depthWrite:!1,depthTest:!1}));y.visible=!1,u.add(y),h.push(y)}this.scene.add(u);for(let a of[o,s])if(a?.desk)for(let y of this.screenList||[])y.desk===a.desk&&(y.mesh.userData.flashUntil=i+900);for(this.eventRoutes.push({group:u,curve:r,packets:h,start:i});this.eventRoutes.length>12;){let a=this.eventRoutes.shift();this.scene.remove(a.group),Oe(a.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,o){if(this.screenModal)return;if(!o){if(e.buttons||!this.camera||!this.loaded)return;let y=this.canvas.getBoundingClientRect();this.raycaster.setFromCamera(new it((e.clientX-y.left)/y.width*2-1,1-(e.clientY-y.top)/y.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 s=this.canvas.getBoundingClientRect();this.raycaster.setFromCamera(new it((e.clientX-s.left)/s.width*2-1,1-(e.clientY-s.top)/s.height*2),this.camera);let r=this.raycaster.intersectObjects([...this.actors.values()].map(y=>y.obj),!0),i=this.raycaster.intersectObjects(this.screenMeshes||[],!1)[0];if(i&&(!r[0]||i.distance<r[0].distance)){let y=i.object.userData.desk;if(y){this.openScreen(y,i.object);return}}for(let y of r){let c=y.object;for(;c&&!c.userData.agentId;)c=c.parent;if(c?.userData.agentId){this.selectCallback(c.userData.agentId);return}}let h=new gt(new _(0,1,0),0),a=new _;if(this.raycaster.ray.intersectPlane(h,a))for(let y of this.people.values()){let c=y.desk.seat;if(Math.abs(a.x-c.x)<2.1&&Math.abs(a.z-c.y+.5)<1.8){this.selectCallback(y.s.id);return}}}screenStatus(e){let o={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"},s="scene.screen."+e;return[ct(s)?n(s):String(e||n("scene.screen.unknown")),o[e]||"#8fa6c6"]}remember(e){let o=e.sessionId||e.targetId;if(!o)return;let s="scene.activity."+e.type,r=ct(s)?n(s):n("scene.activity.event"),u=this.activityLog.get(o)||[],i=Number(e.at),h=new Date(Number.isFinite(i)&&i>0?i:Date.now()).toLocaleTimeString(J(),{hour12:!1});u.unshift({time:h,label:r,text:e.preview||e.title||""}),this.activityLog.set(o,u.slice(0,6))}screenInfo(e){if(!e)return{empty:!0};let o=e.s,[s,r]=this.screenStatus(o.status);return{name:o.name,code:o.code,statusText:s,statusColor:r,task:o.task||o.title||n("scene.screen.waitingTask"),context:o.file&&o.file!==n("common.notRecorded")?o.file:"",log:this.activityLog.get(o.id)||[],updated:new Date().toLocaleTimeString(J(),{hour12:!1})}}paintScreens(e=!1){for(let o of this.screenList||[]){let s=[...this.people.values()].find(a=>a.desk===o.desk)||null,r=this.screenInfo(s),u=s?[s.s.id,s.s.status,s.s.task,s.s.file,r.log[0]?.time||""].join("|"):"empty";if(!e&&o.sig===u)continue;o.sig=u;let i=this.screenCanvas(o.record.seed,512,r);o.record.canvas=i;let h=o.mesh.userData.screenTexture;h&&(h.image=i,h.needsUpdate=!0)}this.screenModal&&this.updateScreenModal()}screenText(e,o){if(!o)return[n("scene.screen.unassigned"),"",n("scene.screen.waitingSeat")].join(`
|
|
2
|
+
`);let[s]=this.screenStatus(o.s.status),r=[o.s.name+" \xB7 "+(o.s.role||n("common.agent")),n("scene.screen.statusLine",{status:s}),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 u of e.log)r.push(u.time+" "+u.label+" "+u.text);else r.push(n("scene.screen.noEvents"));return r.join(`
|
|
3
|
+
`)}updateScreenModal(){let e=this.screenRefs;if(!e||!this.screenDesk)return;let o=[...this.people.values()].find(h=>h.desk===this.screenDesk)||null,s=this.screenInfo(o),[r,u]=this.screenStatus(o?.s.status);e.name.textContent=o?.s.name||n("scene.screen.idleSeat"),e.sub.textContent=o?[o.s.role||n("common.agent"),r].filter(Boolean).join(" \xB7 "):n("scene.screen.noAgentSeated"),e.dot.style.background=u,e.dot.style.boxShadow="0 0 10px "+u,e.card.dataset.status=o?.s.status||"empty";let i=Number(this.screenMesh?.userData?.screenSeed)||0;e.body.replaceChildren(this.screenCanvas(i,1280,s)),e.live.textContent=this.screenText(s,o),e.meta.textContent=o?[o.s.code||"AGENT",s.context?n("scene.screen.contextLine",{value:s.context}):n("scene.screen.contextNone")].join(" \xB7 "):n("scene.screen.unassigned"),e.task.textContent=o?s.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 o=this.people.get(e);if(!o?.desk)return!1;let s=(this.screenList||[]).find(r=>r.desk===o.desk);return s?(this.openScreen(o.desk,s.mesh),!0):!1}openScreen(e,o){this.screenModal&&this.closeScreen(),this.screenDesk=e,this.screenMesh=o||(this.screenList||[]).find(k=>k.desk===e)?.mesh||null,this.screenReturnFocus=document.activeElement;let s=document.createElement("div");s.className="screen-modal";let r=document.createElement("div");r.className="screen-modal-card",r.setAttribute("role","dialog"),r.setAttribute("aria-modal","true");let u="screen-modal-title-"+Math.random().toString(36).slice(2,8);r.setAttribute("aria-labelledby",u);let i=document.createElement("header"),h=document.createElement("span");h.className="screen-modal-dot";let a=document.createElement("div");a.className="screen-modal-title";let y=document.createElement("strong");y.id=u;let c=document.createElement("small");a.append(y,c);let v=document.createElement("button");v.type="button",v.className="screen-modal-close",v.setAttribute("aria-label",n("scene.screen.closeAria")),v.textContent="\xD7",i.append(h,a,v);let C=document.createElement("div");C.className="screen-modal-body";let I=document.createElement("pre");I.className="screen-modal-live";let L=document.createElement("footer"),M=document.createElement("span");M.className="screen-modal-meta";let D=document.createElement("span");D.className="screen-modal-task";let f=document.createElement("span");f.className="screen-modal-hint",f.textContent=n("scene.screen.escHint"),L.append(M,D,f),r.append(i,C,I,L),s.appendChild(r),this.screenRefs={overlay:s,card:r,name:y,sub:c,dot:h,body:C,live:I,meta:M,task:D,hint:f,close:v},s.addEventListener("click",k=>{k.target===s&&this.closeScreen()}),v.addEventListener("click",()=>this.closeScreen()),s.addEventListener("keydown",k=>{k.key==="Escape"?(k.preventDefault(),this.closeScreen()):k.key==="Tab"?(k.preventDefault(),v.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!==s&&!["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(s),this.screenModal=s,this.updateScreenModal(),v.focus()}closeScreen(){this.screenEsc&&window.removeEventListener("keydown",this.screenEsc),this.screenEsc=null,this.screenModal&&(this.screenModal.remove(),this.screenModal=null);for(let o of this.screenInert||[])o.inert=o.dataset.screenInert==="1",delete o.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 s of this.eventRoutes||[]){let r=e-s.start;for(let u=0;u<s.packets.length;u++){let i=s.packets[u],h=(r-120-u*240)/1500;if(h<0||h>1){i.visible=!1;continue}i.visible=!0,i.position.copy(s.curve.getPoint(h)),i.scale.setScalar(1-.3*Math.max(0,h-.72)/.28)}r>=2200&&(this.scene.remove(s.group),Oe(s.group))}this.eventRoutes&&(this.eventRoutes=this.eventRoutes.filter(s=>e-s.start<2200));let o=super.draw();if(this.packet&&this.routeCurve){let s=this.reduced||!this.playing?.58:performance.now()%4500/4500;this.packet.position.copy(this.routeCurve.getPoint(s)),this.packet.position.y+=.09}return o}destroy(){this.offLang?.(),this.closeScreen(),this.clearEventRoutes(),this.routeGroup&&Oe(this.routeGroup),super.destroy()}};var le=48,At=["search","review"],Bt={search:"TASK-07843",review:"TASK-07844"},Fe=(t,e)=>[0,1,2,3].map(o=>n("demo.scenario."+t+"."+e+"."+o));function Ut(t){let e=At.includes(t)?t:"search",o={title:n("demo.scenario."+e+".title"),project:n("demo.scenario."+e+".project"),code:Bt[e],titles:Fe(e,"titles"),tasks:Fe(e,"tasks"),files:Fe(e,"files"),reports:Fe(e,"reports")};return e==="review"&&(o.roles=Fe(e,"roles")),o}var ht=(t,e,o)=>Math.max(e,Math.min(o,t)),be=["main","api","frontend","test"],Ae=[0,3,5,7],ut=[48,23,31,37],qt=["diagram-3-fill","cpu-fill","file-earmark-code-fill","shield-check"];function Gt(t=16,e="search"){let o=ht(Number(t)||0,0,le),s=Ut(e),r=be.map(c=>n("demo.name."+c)),u=be.map(c=>n("demo.role."+c)),i=be.map(c=>n("demo.zone."+c)),h=o<7?0:o<25?1:o<37?2:3,a=be.map((c,v)=>{let C=Math.round(v===0?o/le*100:ht((o-Ae[v])/(ut[v]-Ae[v]),0,1)*100),I=o>=ut[v];return{id:c,key:c,parentId:v?"main":null,rootId:"main",agent:"codex",subagent:v>0,name:r[v],title:s.titles[v],role:(s.roles||u)[v],zone:i[v],icon:qt[v],task:s.tasks[v],file:s.files[v],code:s.code.slice(0,-1)+(Number(s.code.slice(-1))+v),progress:C,status:I?"done":o<Ae[v]?"unknown":v===0&&o>=7&&o<37?"waiting_agents":"tool",startedAt:Ae[v]*1e3,report:I?s.reports[v]:null,reportPreview:I?n("demo.preview.ready"):v?C<25?n("demo.preview.analyzing"):C<75?n("demo.preview.running"):n("demo.preview.compiling"):n("demo.preview.coordinating")}}),y=[...be.slice(1).map((c,v)=>({id:"assign-"+c,sessionId:"main",targetId:c,type:"assign",at:Ae[v+1],preview:s.tasks[v+1]})),...be.slice(1).map((c,v)=>({id:"report-"+c,sessionId:c,targetId:"main",type:"report",at:ut[v+1],preview:s.reports[v+1]})),{id:"final-main",sessionId:"main",type:"report",at:48,preview:s.reports[0]}].filter(c=>c.at<=o).sort((c,v)=>c.at-v.at);return{mode:"demo",rootId:"main",scenario:e,config:s,seconds:o,stage:h,agents:a,events:y,assigned:a.slice(1).filter(c=>o>=Ae[be.indexOf(c.id)]).length,received:a.slice(1).filter(c=>c.status==="done").length,active:a.filter(c=>c.status!=="done"&&c.status!=="unknown").length,progress:Math.round(o/le*100),complete:o>=le}}var Je=class extends EventTarget{constructor(){super(),this.seconds=16,this.playing=!1,this.scenario="search"}get snapshot(){return Gt(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){At.includes(e)&&(this.scenario=e,this.seconds=16,this.playing=!1,this.changed())}advance(e){!this.playing||!Number.isFinite(e)||e<=0||(this.seconds=ht(this.seconds+e,0,le),this.seconds===le&&(this.playing=!1),this.changed())}};var zt=new Set(["thinking","tool","typing","waiting","waiting_agents"]),pt=new Set(["done","error","interrupted","closed"]);function je(t,e=68){let o=typeof t=="string"?t.replace(/\s+/g," ").trim():"";return o.length>e?o.slice(0,e)+"\u2026":o}function Vt(t){return typeof t=="string"?t.replace(/[\\/]+$/,"").split(/[\\/]/).pop():""}function Tt(t,e){return t?e+"-"+String(t).slice(-8):e}function Wt(t,e,o){if(e)return n("live.reportReady");if(t.reportEventId)return o?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 je(t.activity)||n("live.waitingUser");case"waiting_agents":return n("live.awaitingSubagents");case"typing":return n("live.typingMessage");case"tool":return je(t.activity)||n("live.runningTool");case"thinking":return n("live.thinking");case"idle":return n("live.idle");default:return n("live.awaitingLog")}}function _t(t,e){if(e)return"diagram-3-fill";let o=[t.role,t.task].filter(Boolean).join(" ");return/测试|检查|审查|review|test/i.test(o)?"shield-check":/前端|界面|frontend|\bUI\b/i.test(o)?"file-earmark-code-fill":"cpu-fill"}function Jt(t,e,o){if(!Number.isFinite(e?.turnStartedAt)||!pt.has(t.status))return!1;let s=[t.lastEventAt,t.endedAt].filter(Number.isFinite);return!s.length||Math.max(...s)>=e.turnStartedAt?!1:!o.concat(Array.isArray(t.events)?t.events:[]).some(u=>u.targetId===t.id&&(u.type==="assign"||u.type==="message")&&u.at>=e.turnStartedAt)}function Xt(t,e,o){if(!t.reportEventId)return!1;let s=o.concat(Array.isArray(t.events)?t.events:[]),r=s.find(a=>a.id===t.reportEventId&&a.type==="report"),u=s.filter(a=>t.id!==e?.id&&a.targetId===t.id&&(a.type==="assign"||a.type==="message")&&Number.isFinite(a.at)),i=[e?.turnStartedAt,t.turnStartedAt,...u.map(a=>a.at)].filter(Number.isFinite),h=Number.isFinite(r?.at)?r.at:Number.isFinite(t.endedAt)?t.endedAt:t.lastEventAt;return!Number.isFinite(h)||!i.length||h>=Math.max(...i)}var Xe=class{constructor(){this.rootId=null,this.slots=new Map,this.nextSlot=1}update(e={},o=Date.now()){let s=e.rootId||null;s!==this.rootId&&(this.rootId=s,this.slots.clear(),this.nextSlot=1),s&&this.slots.set(s,0);let r=Array.isArray(e.roots)?e.roots:[],u=Array.isArray(e.agents)?e.agents:[],i=Array.isArray(e.events)?e.events:[],h=u.find(f=>f.id===s),a=r.find(f=>f.id===s),y=u.map(f=>{let k=f.id===s;this.slots.has(f.id)||this.slots.set(f.id,this.nextSlot++);let H=this.slots.get(f.id),F=f.name||(k?n("live.leadName"):n("live.subName",{id:String(f.id).slice(-8)})),q=!k&&Jt(f,h,i),G=Xt(f,h,i);return{...f,agent:f.agent||(e.source==="harness"?"dsh":"codex"),source:f,slot:H,historical:q,name:F,title:je(f.task||k&&a?.title||f.role||F),role:f.role||(k?n("app.roleLead"):n("app.roleSubAgent")),zone:k?n("live.zoneLead"):n("live.zoneSlot",{slot:H}),icon:_t(f,k),file:je(f.activity||f.model)||n("common.notRecorded"),code:Tt(f.id,"AGENT"),progress:f.status==="done"?100:null,report:null,hasReport:G,currentHasReport:G,reportPreview:Wt(f,G,q)}}).sort((f,k)=>f.slot-k.slot),c=y.filter(f=>f.id!==s&&f.parentId&&!f.historical),v=c.filter(f=>f.hasReport).length,C=h?.status==="done",I=c.length?1:0;v&&(I=2),(C||y.find(f=>f.id===s)?.hasReport||h?.status==="typing"&&c.length>0&&c.every(f=>pt.has(f.status)))&&(I=3);let L=Number.isFinite(h?.turnStartedAt),M=o;pt.has(h?.status)&&(M=Number.isFinite(h.endedAt)?h.endedAt:Number.isFinite(h.lastEventAt)?h.lastEventAt:o);let D=L?Math.max(0,Math.floor((M-h.turnStartedAt)/1e3)):0;return{...e,mode:"live",rootId:s,scenario:s,config:{title:je(h?.task||a?.title||h?.name)||(e.source==="harness"?n("live.harnessSession"):n("live.codexSession")),project:Vt(h?.cwd||a?.cwd)||(e.source==="harness"?n("live.harnessName"):n("live.codexName")),code:Tt(s,"SESSION")},seconds:D,elapsedKnown:L,stage:I,agents:y,events:i,roots:r,warnings:Array.isArray(e.warnings)?e.warnings:[],assigned:c.length,received:v,active:y.filter(f=>zt.has(f.status)).length,progress:C?100:null,complete:C}}};function ke(t=""){let e=new URL(".",globalThis.document?.baseURI||location.href);return new URL(t.replace(/^\/+/,""),e).href}function Ke(){return new URLSearchParams(location.search).get("source")==="harness"?"harness":"codex"}function Be(t=!1,e=Ke()){let o=new URL(ke("demo.html"));return t&&o.searchParams.set("mode","live"),e==="harness"&&o.searchParams.set("source","harness"),o.href}function $e(t,e=!1){if(t!=="harness")return;document.title=n(e?"meta.harnessLive":"meta.harnessDemo");let o=document.querySelector(".brand");o.href=Be(e,t),o.querySelector(":scope > span:last-child").replaceChildren("DSH",Object.assign(document.createElement("span"),{className:"brand-light",textContent:"Office"})),document.querySelector(".profile-avatar img").src=ke("assets/agents/dsh.svg"),document.getElementById("dialog-mode").textContent="DSH OFFICE / "+(e?"LIVE":"DEMO")}function we(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 Ye(t=[]){let e=new Map;for(let o of t){let s=we(o.cwd);e.has(s)||e.set(s,{key:s,path:o.cwd?.trim()||n("common.noDirectory"),count:0}),e.get(s).count++}return[...e.values()]}function Ue(t=[],e){return t.filter(o=>we(o.cwd)===e)}function qe(t){let e=typeof t.title=="string"?t.title.replace(/\s+/g," ").trim():"",o=Number.isFinite(t.createdAt)?t.createdAt:t.at,s=Number.isFinite(o)?new Date(o):null,r=s&&!Number.isNaN(s.getTime())?s.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"),r,String(t.id).slice(-8)].join(" \xB7 ")}var Qe=class extends EventTarget{constructor(e){super(),this.adapter=new Xe,this.kind=Ke(),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.embed=new URLSearchParams(location.search).get("embed")==="1",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 o=++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 s=await fetch(ke("api/sessions?"+new URLSearchParams(e?{rootId:e}:{})),{signal:this.abort.signal});s.status===404&&e&&(this.embed||!new URLSearchParams(location.search).get("rootId"))&&(this.explicitRootId=null,this.follow=!1,s=await fetch(ke("api/sessions"),{signal:this.abort.signal}));let r=await s.json();if(!s.ok)throw new Error(r.error||n("source.sessionReadFail"));if(o!==this.generation||(this.accept(r),o!==this.generation))return;let u=new URLSearchParams(this.rootId?{rootId:this.rootId}:{}),i=this.source=new EventSource(ke("events?"+u));i.onopen=()=>{o===this.generation&&(this.baseline=!0,this.connection="connected",this.error="",this.changed(!0))},i.onmessage=h=>{if(o===this.generation)try{this.accept(JSON.parse(h.data))}catch(a){this.error=n("source.eventReadFail",{message:a.message}),this.changed(!0)}},i.onerror=()=>{o===this.generation&&(this.baseline=!0,this.connection="reconnecting",this.error=n("source.disconnected"),this.changed(!0))}}catch(s){if(o!==this.generation||s.name==="AbortError")return;this.connection="error",this.error=s.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 o=e.roots||[],s=o;if(this.kind==="harness"&&o.length){let h=o.find(y=>y.id===e.rootId),a=Ye(o);if((this.explicitRootId===h?.id||!a.some(y=>y.key===this.directoryKey))&&(this.directoryKey=we((h||o[0]).cwd)),this.explicitRootId=null,localStorage.setItem("office.harness.live.directory",this.directoryKey),s=Ue(o,this.directoryKey),!s.some(y=>y.id===e.rootId)){this.raw={...this.raw,roots:o},this.select(s[0].id,!0);return}}let r=s[0],u=this.knownRoots.size&&r&&!this.knownRoots.has(r.id);for(let h of e.roots||[])this.knownRoots.add(h.id);if(this.follow&&u&&r.id!==e.rootId){this.raw={...this.raw,roots:o},this.select(r.id,!0);return}let i=this.baseline||e.rootId!==this.raw.rootId||e.agents?.some(h=>h.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(h=>h.loading)}select(e,o=!1){if(this.kind==="harness"){let r=this.raw.roots?.find(u=>u.id===e);if(!r||this.directoryKey!==null&&we(r.cwd)!==this.directoryKey)return Promise.resolve(!1);this.directoryKey=we(r.cwd),localStorage.setItem("office.harness.live.directory",this.directoryKey)}this.explicitRootId=null,o||(this.follow=!1),this.raw={source:this.kind,rootId:e,roots:this.raw.roots||[],agents:[],events:[]},this.records.clear();let s=new URL(location.href);return s.searchParams.set("rootId",e),history.replaceState(null,"",s),this.connect(e)}async openSession(e){let o=this.raw.roots?.find(s=>s.id===e);if(!o)return!1;this.kind==="harness"&&(this.directoryKey=we(o.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 o=Ue(this.raw.roots,e);if(!o.length)return Promise.resolve(!1);this.directoryKey=e,localStorage.setItem("office.harness.live.directory",e);let s=o.find(r=>r.id===this.rootId)||o[0];return this.select(s.id,!0)}async record(e,o){let s=e+":"+o;if(this.records.has(s))return this.records.get(s);let r=await fetch(ke("api/report?"+new URLSearchParams({sessionId:e,eventId:o}))),u=await r.json();if(!r.ok)throw new Error(u.error||n("source.recordReadFail"));return this.records.set(s,u.text),u.text}destroy(){this.generation++,this.abort?.abort(),this.source?.close()}};var fe=null,$t=0,X=(t,e,o)=>{let s=document.createElement(t);return e&&(s.className=e),o!=null&&(s.textContent=o),s},Ze=(t,e)=>{let o=X("img",e);return o.src="./demo-icons/"+t+".svg",o.alt="",o},Pt=t=>t.trim().toLowerCase().replace(/\\/g,"/");function Te(){fe?.close()}function me(t,{filterable:e=!0}={}){t.id||(t.id="office-select-"+ ++$t);let o=X("div","office-select"),s=X("button","select-trigger");s.type="button",s.id=t.id+"-trigger";let r=[...t.labels];for(let b of r)b.htmlFor=s.id;let u=X("span","select-value");s.append(u,Ze("chevron-down","select-chevron")),o.append(s),t.after(o),t.hidden=!0;let i=X("div","select-popover");i.id=t.id+"-popover",i.setAttribute("popover","manual"),i.hidden=!0,(t.closest("dialog")||document.body).append(i);let h=X("form","select-filter"),a=X("input","select-filter-input");a.type="text",a.autocomplete="off",a.spellcheck=!1;let y=X("button","select-filter-clear");y.type="button",y.setAttribute("aria-label",n("controls.clearFilter")),y.append(Ze("x-lg")),h.append(Ze("search"),a,y);let c=X("div","select-options");c.id=t.id+"-options",c.role="listbox";let v=X("p","select-empty",n("controls.noMatch"));v.role="status",e?i.append(h,c,v):i.append(c,v),s.setAttribute("aria-haspopup","listbox"),s.setAttribute("aria-controls",c.id),e&&(a.setAttribute("role","combobox"),a.setAttribute("aria-autocomplete","list"),a.setAttribute("aria-controls",c.id));let C=new AbortController,I=C.signal,L=[],M=[],D=null,f=!1,k=!1,H="",F="";function q(){if(!f)return;let b=s.getBoundingClientRect(),S=window.visualViewport;if(!b.width||!b.height){O();return}let N=(S?.offsetLeft||0)+12,j=(S?.offsetTop||0)+12,E=N+(S?.width||innerWidth)-24,U=j+(S?.height||innerHeight)-24,ne=Number(t.dataset.popoverMinWidth)||360,V=Math.min(Math.max(b.width,ne),E-N),Q=U-b.bottom-8,Z=b.top-j-8,ge=Q<260&&Z>Q;i.style.width=V+"px",i.style.maxHeight=Math.max(0,Math.min(380,ge?Z:Q))+"px",i.style.left=Math.max(N,Math.min(b.left,E-V))+"px",i.style.top=(ge?b.top-8-i.getBoundingClientRect().height:b.bottom+8)+"px"}function G(b,S=!1){D=b?.value??null;let N;for(let j of c.children){let E=D!==null&&j.dataset.value===D;j.dataset.active=String(E),E&&(N=j)}N?a.setAttribute("aria-activedescendant",N.id):a.removeAttribute("aria-activedescendant"),S&&N?.scrollIntoView({block:"nearest"})}function z(){let b=Pt(a.value),S=b!==H,N=S?0:c.scrollTop;H=b,M=L.filter(E=>Pt(E.search).includes(b));let j=JSON.stringify([b,J(),t.value,M.map(E=>[E.index,E.value,E.label,E.description,E.disabled])]);j!==F&&(F=j,c.replaceChildren(...M.map(E=>{let U=X("div","select-option");U.role="option",U.id=t.id+"-option-"+E.index,U.dataset.value=E.value,U.setAttribute("aria-selected",String(E.value===t.value)),U.setAttribute("aria-disabled",String(E.disabled));let ne=X("span","select-option-copy");ne.append(X("strong","",E.label)),E.description&&ne.append(X("small","",E.description));let V=Ze("check-lg","select-check");return V.hidden=E.value!==t.value,U.append(ne,V),U.addEventListener("pointermove",()=>{E.disabled||G(E)}),U.addEventListener("pointerdown",Q=>Q.preventDefault()),U.addEventListener("click",()=>$(E)),U}))),v.hidden=M.length>0,y.setAttribute("aria-hidden",String(!a.value)),y.tabIndex=a.value?0:-1,G(M.find(E=>E.value===D&&!E.disabled)||M.find(E=>E.value===t.value&&!E.disabled)||M.find(E=>!E.disabled)),c.scrollTop=N,S&&G(M.find(E=>E.value===D),!0),q()}function O(b=!1){f&&(f=!1,i.showPopover&&i.matches(":popover-open")&&i.hidePopover(),i.hidden=!0,a.value="",k=!1,s.setAttribute("aria-expanded","false"),a.setAttribute("aria-expanded","false"),a.removeAttribute("aria-activedescendant"),fe===se&&(fe=null),b&&s.isConnected&&s.focus())}function de(){t.disabled||f||(Te(),fe=se,f=!0,D=t.value,i.hidden=!1,i.showPopover&&i.showPopover(),s.setAttribute("aria-expanded","true"),e&&a.setAttribute("aria-expanded","true"),z(),e?a.focus():s.focus(),G(M.find(b=>b.value===D),!0))}function $(b){if(!b||b.disabled||k)return;let S=t.value!==b.value;t.value=b.value,O(!0),Y(),S&&t.dispatchEvent(new Event("change",{bubbles:!0}))}function Y(){let b=t.getAttribute("aria-label")||n("controls.selectOption");e&&(a.setAttribute("aria-label",n("controls.filterPrefix",{label:b.replace(/^(选择|Select)\s*/,"")})),a.placeholder=n("controls.filterPlaceholder")),c.setAttribute("aria-label",n("controls.optionsAria",{label:b})),L=[...t.options].map((S,N)=>({value:S.value,label:S.dataset.label||S.textContent,description:S.dataset.description||"",search:S.dataset.search||S.textContent,disabled:S.disabled,index:N})),u.textContent=t.selectedOptions[0]?.dataset.label||t.selectedOptions[0]?.textContent||n("controls.choose"),s.setAttribute("aria-label",[b,u.textContent,t.selectedOptions[0]?.dataset.description].filter(Boolean).join(n("common.listSeparator"))),s.title=t.title||t.selectedOptions[0]?.textContent||"",s.disabled=t.disabled,t.disabled&&O(),f&&z()}let se={refresh:Y,close:O,destroy(){O(),C.abort(),i.remove(),o.remove(),t.hidden=!1;for(let b of r)b.htmlFor=t.id}};s.setAttribute("aria-expanded","false"),a.setAttribute("aria-expanded","false"),s.addEventListener("click",()=>f?O(!0):de(),{signal:I}),s.addEventListener("keydown",b=>{if(!f){(b.key==="ArrowDown"||b.key==="ArrowUp")&&(b.preventDefault(),de());return}if(e)return;let S=M.filter(N=>!N.disabled);if(S.length)if(["ArrowDown","ArrowUp","Home","End"].includes(b.key)){b.preventDefault();let N=S.findIndex(E=>E.value===D),j=b.key==="Home"?0:b.key==="End"?S.length-1:(N+(b.key==="ArrowDown"?1:-1)+S.length)%S.length;G(S[j],!0)}else b.key==="Enter"?(b.preventDefault(),$(S.find(N=>N.value===D))):b.key==="Escape"&&(b.preventDefault(),O(!0))},{signal:I}),a.addEventListener("compositionstart",()=>{k=!0},{signal:I}),a.addEventListener("compositionend",()=>{k=!1,z()},{signal:I}),a.addEventListener("input",z,{signal:I}),h.addEventListener("submit",b=>{b.preventDefault(),k||$(M.find(S=>S.value===D))},{signal:I}),y.addEventListener("click",()=>{a.value="",z(),a.focus()},{signal:I}),i.addEventListener("keydown",b=>{if(!(b.isComposing||k||b.keyCode===229))if(b.key==="Escape")b.preventDefault(),b.stopPropagation(),O(!0);else if(b.key==="Tab")O(!0);else if(b.target===a&&["ArrowDown","ArrowUp","Home","End"].includes(b.key)){b.preventDefault();let S=M.filter(E=>!E.disabled),N=S.findIndex(E=>E.value===D);if(!S.length)return;let j=b.key==="Home"?0:b.key==="End"?S.length-1:(N+(b.key==="ArrowDown"?1:-1)+S.length)%S.length;G(S[j],!0)}else b.target===a&&b.key==="Enter"&&(b.preventDefault(),$(M.find(S=>S.value===D)))},{signal:I}),document.addEventListener("pointerdown",b=>{f&&!o.contains(b.target)&&!i.contains(b.target)&&O()},{signal:I}),document.addEventListener("focusin",b=>{f&&!o.contains(b.target)&&!i.contains(b.target)&&O()},{signal:I}),t.addEventListener("change",Y,{signal:I});let ue=t.closest("dialog");return ue?.addEventListener("close",()=>{ue.open||O()},{signal:I}),window.addEventListener("resize",q,{signal:I}),window.addEventListener("scroll",q,{capture:!0,signal:I}),window.visualViewport?.addEventListener("resize",q,{signal:I}),Y(),se}function et({input:t,form:e,results:o,list:s,status:r,clear:u,onClear:i,onOpen:h}){let a=new AbortController,y=a.signal,c=null,v=!1,C=()=>[...s.querySelectorAll(".search-result")];t.setAttribute("role","combobox"),t.setAttribute("aria-autocomplete","list"),t.setAttribute("aria-controls",s.id),t.setAttribute("aria-expanded","false"),s.role="listbox",s.setAttribute("aria-label",n("controls.matchesAria"));function I(f,k=!1){c=f?.dataset.value??null;for(let H of C()){let F=H===f;H.dataset.active=String(F),H.setAttribute("aria-selected",String(F))}f?t.setAttribute("aria-activedescendant",f.id):t.removeAttribute("aria-activedescendant"),k&&f?.scrollIntoView({block:"nearest"})}function L(){o.hidden=!0,t.setAttribute("aria-expanded","false"),t.removeAttribute("aria-activedescendant"),fe===D&&(fe=null)}function M(){let f=!!t.value.trim(),k=C();u.setAttribute("aria-hidden",String(!t.value)),u.tabIndex=t.value?0:-1;for(let[H,F]of k.entries())F.id=s.id+"-option-"+H,F.role="option",F.tabIndex=-1;if(r.textContent=f?k.length?n("controls.found",{count:k.length}):n("controls.noMatches"):"",!f){c=null,L();return}fe!==D&&(Te(),fe=D),o.hidden=!1,t.setAttribute("aria-expanded","true"),I(k.find(H=>H.dataset.value===c)||k[0])}let D={refresh:M,close:L,destroy(){L(),a.abort()}};return t.addEventListener("compositionstart",()=>{v=!0},{signal:y}),t.addEventListener("compositionend",()=>{v=!1},{signal:y}),t.addEventListener("keydown",f=>{if(!(f.isComposing||v||f.keyCode===229)){if(f.key==="Escape")f.preventDefault(),f.stopPropagation(),o.hidden?i():L();else if(f.key==="Enter")f.preventDefault(),o.hidden||C().find(k=>k.dataset.value===c)?.click();else if(f.key==="ArrowDown"||f.key==="ArrowUp"||!o.hidden&&(f.key==="Home"||f.key==="End")){if(f.preventDefault(),o.hidden){h();return}let k=C(),H=k.findIndex(q=>q.dataset.value===c);if(!k.length)return;let F=f.key==="Home"?0:f.key==="End"?k.length-1:(H+(f.key==="ArrowDown"?1:-1)+k.length)%k.length;I(k[F],!0)}}},{signal:y}),e.addEventListener("submit",f=>{f.preventDefault(),!(v||o.hidden)&&C().find(k=>k.dataset.value===c)?.click()},{signal:y}),s.addEventListener("pointermove",f=>{let k=f.target.closest(".search-result");k&&I(k)},{signal:y}),s.addEventListener("pointerdown",f=>f.preventDefault(),{signal:y}),document.addEventListener("pointerdown",f=>{e.parentElement.contains(f.target)||L()},{signal:y}),document.addEventListener("focusin",f=>{e.parentElement.contains(f.target)||L()},{signal:y}),D}var Yt=t=>String(t?.id??`${t?.at??""}:${t?.type??""}`),Ge=t=>t.length?Yt(t[t.length-1]):"",Lt=t=>"office.notify.seen.v1."+t;function tt({mode:t,button:e,dot:o,panel:s,getEvents:r}){let u="";try{u=localStorage.getItem(Lt(t))||""}catch{}let i=!1,h=I=>{i=!!I,o.hidden=!i,e.classList.toggle("has-unread",i),e.setAttribute("aria-label",i?n("notify.ariaUnread"):n("notify.aria"))},a=()=>{let I=Ge(r());if(!I||I===u){h(!1);return}u=I;try{localStorage.setItem(Lt(t),I)}catch{}h(!1)},y=()=>{if(!s.hidden){a();return}h(!!Ge(r())&&Ge(r())!==u)},c=()=>{s.hidden=!1,e.setAttribute("aria-expanded","true"),a()},v=()=>{s.hidden=!0,e.setAttribute("aria-expanded","false")},C=()=>s.hidden?c():v();return h(!!Ge(r())&&Ge(r())!==u),pe(()=>h(i)),{update:y,markRead:a,open:c,close:v,toggle:C}}function Mt(){let t=l=>document.getElementById(l),e=(l,p,m)=>{let x=document.createElement(l);return p&&(x.className=p),m!=null&&(x.textContent=m),x},o=l=>{let p=e("img");return p.src="./demo-icons/"+l+".svg",p.alt="",p},s=()=>[n("demo.stage.analysis"),n("demo.stage.parallel"),n("demo.stage.reports"),n("demo.stage.summary")],r=new Set(["assign","message","report","complete","approval","error","interrupted"]),u=()=>c.events.filter(l=>r.has(l.type)),i=new Qe(new URLSearchParams(location.search).get("rootId")),h=new URLSearchParams(location.search).get("embed")==="1";h&&(document.body.dataset.embed="true");let a=()=>i.kind==="harness"?"DeepSeek Harness":"Codex",y=()=>({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,v=null,C=null,I=0,L="",M=!1,D=null,f=new Set,k=null,H="",F="",q="",G="",z,O=0,de=!1,$=me(t("workspace-directory")),Y=me(t("scenario")),se=me(t("mode-select"),{filterable:!1}),ue=t("mode-select");ue.value="live",se.refresh();let b=tt({mode:"live",button:t("notifications-button"),dot:t("notification-dot"),panel:t("notifications"),getEvents:u}),S=null,N=et({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:re}),j=[],E=()=>c.agents.filter(l=>M||!l.historical),U=()=>c.agents.find(l=>l.id===v)||E()[0]||y(),ne=()=>i.kind==="harness"?Ue(c.roots,i.directoryKey):c.roots,V=l=>c.agents.find(p=>p.id===l)?.name||"Agent "+(l||"").slice(-8),Q=l=>Rt(l.status),Z=l=>!L||[l.name,l.task,l.role,l.file,l.id,l.zone,l.title].join(" ").toLowerCase().includes(L.toLowerCase()),ge=l=>{let p=Math.max(0,Math.floor(l));return(p>=3600?String(Math.floor(p/3600)).padStart(2,"0")+":":"")+String(Math.floor(p/60)%60).padStart(2,"0")+":"+String(p%60).padStart(2,"0")};function ae(l){clearTimeout(z),t("demo-toast").textContent=l,t("demo-toast").hidden=!1,z=setTimeout(()=>{t("demo-toast").hidden=!0},3e3)}function ie(l){t("agent-details").hidden=!l,t("open-details").hidden=l}function ee(l,p=!0){v=l,O++,ie(!0),ye(),C?.select(l,p)}function he(l,p,m=U().icon){Te(),S?.destroy(),S=null,t("dialog-title").textContent=l,t("dialog-content").textContent=p,t("dialog-icon").src="./demo-icons/"+m+".svg",t("copy-demo-report").textContent=n("demo.copy"),t("demo-dialog").open||t("demo-dialog").showModal()}async function xe(l,p,m){let x=++O;he(l,n("dialog.loading"));try{let A=await i.record(p,m);x===O&&t("demo-dialog").open&&he(l,A)}catch(A){x===O&&t("demo-dialog").open&&he(l,n("livePage.recordFailed",{message:A.message}))}}function d(l=!1){let p=U();if(!l&&(p.hasReport||p.historical&&p.reportEventId))return xe(p.name+" \xB7 "+n(p.historical?"livePage.pastReportTitle":"livePage.reportTitle"),p.id,p.reportEventId);if(p.taskEventId)return xe(p.name+" \xB7 "+n("livePage.taskSourceTitle"),p.taskSessionId||p.id,p.taskEventId);he(p.name+" \xB7 "+n("livePage.taskDetailsTitle"),p.task||n("livePage.taskNotLogged"))}function g(){O++,he(n("livePage.chooseTeam"),"","people-fill");let l=t("dialog-content");l.append(e("strong","",n("livePage.currentTeam")));for(let p of c.agents){let m=e("button","session-choice",p.name+" \xB7 "+Q(p)+(p.historical?" \xB7 "+n("livePage.pastMember"):"")+`
|
|
4
|
+
`+p.title);m.onclick=()=>{p.historical&&(M=!0),t("demo-dialog").close(),ee(p.id)},l.append(m)}if(i.kind==="harness"){let p=e("label","session-picker-field"),m=e("select");m.id="team-workspace-directory",p.htmlFor=m.id,p.append(e("span","",n("livePage.directory")),m),m.setAttribute("aria-label",n("livePage.teamDirectoryAria")),Le(m),m.onchange=x=>{i.selectDirectory(x.target.value),g()},l.append(p),S=me(m)}l.append(e("strong","",n(i.kind==="harness"?"livePage.harnessSessions":"livePage.mainSession")));for(let p of ne()){let m=e("button","session-choice",i.kind==="harness"?qe(p):p.title||p.id);m.setAttribute("aria-pressed",p.id===c.rootId),m.onclick=()=>{t("demo-dialog").close(),L="",t("task-search").value="",re(),i.select(p.id)},l.append(m)}}function R(l,p){t(l).style.width=p==null?"0%":p+"%",t(l).parentElement.classList.toggle("unrecorded",p==null)}function P(){let l=U(),p=l.hasReport||l.historical&&l.reportEventId;t("detail-icon").src=t("detail-agent-icon").src="./demo-icons/"+l.icon+".svg",t("detail-code").textContent=l.code,t("detail-badge").textContent=Q(l),t("detail-badge").classList.toggle("done",l.status==="done"),t("detail-task-title").textContent=l.title,t("detail-task-title").title=l.task||l.title,t("detail-project").textContent=c.config.project,t("detail-role").textContent=l.role,t("detail-type").textContent=l.historical?n("livePage.pastMember"):l.parentId?n("livePage.subtask"):n("livePage.mainTask"),t("detail-progress-label").textContent=l.reportPreview||n("livePage.awaitingLog"),R("detail-progress-fill",l.progress),R("current-progress-fill",l.progress),t("detail-percent").textContent=l.progress==null?n("livePage.progressUnknown"):l.progress+"%",t("detail-zone").textContent=l.zone,t("detail-file").textContent=l.file,t("detail-file").title=l.source?.activity||l.file,t("detail-parent").textContent=l.parentId?V(l.parentId)+" \u2192 "+l.name:n("livePage.leadMembers",{count:c.assigned}),t("detail-name").textContent=l.name,t("detail-stage").textContent=c.complete?n("demo.stageComplete"):s()[c.stage],t("view-report").replaceChildren(document.createTextNode(n(p?"demo.viewFullReport":"demo.viewReport")),o("arrow-right")),t("view-report").disabled=!l.id,t("view-task").hidden=!p,t("view-screen").hidden=!C?.openScreenFor||!l.id,t("current-task-code").textContent=l.code,t("current-task-agent").textContent=l.name+" \xB7 "+l.zone.split(" \xB7 ")[0],t("current-task-description").textContent=l.title,t("current-task-icon").src="./demo-icons/"+l.icon+".svg"}function K(){let l=E().filter(m=>m.id!==v&&Z(m)),p=JSON.stringify([v,L,l.map(m=>[m.id,m.name,m.status,m.title])]);p!==F&&(F=p,t("queue-heading").textContent=n("demo.queueHeading",{label:n(L?"demo.matchingTasks":"demo.teamTasks"),count:l.length}),t("task-queue").replaceChildren(...l.map(m=>{let x=e("button","queue-item");return x.setAttribute("aria-label",n("demo.ariaViewTask",{name:m.name})),x.title=m.name+" \xB7 "+m.title,x.append(e("strong","",m.name),e("span","",m.zone.split(" \xB7 ")[0]),e("span","queue-status "+(m.status==="done"?"done":"running"),Q(m))),x.onclick=()=>ee(m.id),x})),l.length||t("task-queue").append(e("div","queue-empty",n("demo.noMatchingTasks"))))}function ce(){L="",t("task-search").value="",K()}let Pe="";function re(){let l=t("search-result-list"),p=L.toLowerCase(),m=L&&i.kind==="harness"?(c.roots||[]).filter(w=>[w.title,w.cwd,w.id].join(" ").toLowerCase().includes(p)):[],x=L?E().filter(Z):[],A=L?(c.events||[]).filter(w=>[w.type,Re(w.type),w.preview].join(" ").toLowerCase().includes(p)):[],te=Math.min(m.length,8)+Math.min(x.length,8)+Math.min(A.length,5),Ee=m.length+x.length+A.length,Ve=JSON.stringify([L,J(),Ee,te,m.slice(0,8).map(w=>[w.id,w.title,w.cwd,w.createdAt,w.at]),x.slice(0,8).map(w=>[w.id,w.name,w.title,w.file,w.role,w.icon]),A.slice(0,5).map(w=>[w.id,w.type,w.preview,w.at,w.sessionId])]);if(Ve===Pe){N.refresh();return}if(Pe=Ve,l.replaceChildren(),L){Ee>te&&l.append(e("p","search-note",n("livePage.searchNote",{total:Ee,shown:te})));for(let w of m.slice(0,8)){let B=e("button","search-result"),oe=e("span"),Se=Number.isFinite(w.createdAt)?w.createdAt:w.at,Me=new Date(Se);B.type="button",B.dataset.value="session:"+w.id,oe.append(e("strong","",w.title?.trim()||n("common.unnamedSession")),e("small","",n("livePage.sessionLine",{path:w.cwd||n("common.noDirectory"),time:Number.isNaN(Me.getTime())?n("common.timeNotRecorded"):Me.toLocaleString(J(),{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",hour12:!1}),id:String(w.id).slice(-8)}))),B.append(o("diagram-3-fill"),oe),B.onclick=()=>{ce(),N.close(),i.openSession(w.id).then(st=>{st===!1&&ae(n("livePage.cannotOpenSession"))})},l.append(B)}for(let w of x.slice(0,8)){let B=e("button","search-result"),oe=e("span");B.type="button",B.dataset.value="agent:"+w.id,oe.append(e("strong","",w.name+" \xB7 "+w.title),e("small","",n("livePage.agentLine",{detail:w.file||w.role||n("common.notRecorded")}))),B.append(o(w.icon),oe),B.onclick=()=>{ce(),ee(w.id),N.close()},l.append(B)}for(let w of A.slice(0,5)){let B=e("button","search-result"),oe=e("span");B.type="button",B.dataset.value="event:"+w.id,oe.append(e("strong","",Re(w.type)+(w.preview?" \xB7 "+w.preview:"")),e("small","",n("livePage.eventLine",{name:V(w.sessionId),time:new Date(w.at).toLocaleTimeString(J(),{hour12:!1})}))),B.append(o("bell"),oe),B.onclick=()=>{ce(),N.close();let Se=["assign","message"].includes(w.type)&&w.targetId||w.sessionId,Me=c.agents.find(st=>st.id===Se);Me&&(Me.historical&&(M=!0),ee(Se)),w.hasText&&xe(V(w.sessionId)+" \xB7 "+Re(w.type),w.sessionId,w.id)},l.append(B)}}N.refresh()}function ze(){let l=u().slice(-12).reverse(),p=JSON.stringify(l);p!==G&&(G=p,t("notification-list").replaceChildren(...l.map(m=>{let x=e("button","notification-item"),A=["assign","message","report"].includes(m.type)?m.type:"activity",te=e("span","notify-type");te.append(o(A==="assign"?"diagram-3-fill":A==="report"?"check-lg":A==="message"?"chat-left-text-fill":"cpu-fill"));let Ee=e("span","notify-copy"),Ve=A==="activity"?n("demo.updates"):Re(m.type),w=V(m.sessionId)+(m.targetId&&m.targetId!==m.sessionId?" \u2192 "+V(m.targetId):"");return Ee.append(e("strong","notify-title",Ve),e("small","notify-preview",w+(m.preview?" \xB7 "+m.preview:"")),e("em","notify-time",new Date(m.at).toLocaleTimeString(J(),{hour12:!1}))),x.append(te,Ee),x.onclick=()=>{let B=["assign","message"].includes(m.type)&&m.targetId||m.sessionId,oe=c.agents.find(Se=>Se.id===B);oe&&(oe.historical&&(M=!0),ee(B)),b.markRead(),b.close(),m.hasText&&xe(V(m.sessionId)+" \xB7 "+Re(m.type),m.sessionId,m.id)},x})),l.length||t("notification-list").append(e("div","empty",n("livePage.waitingEvents"))),b.update())}function nt(){let l=JSON.stringify([i.kind,i.directoryKey,c.rootId,c.roots]);if(l===q)return;q=l;let p=i.kind==="harness";t("directory-field").hidden=!p||h,t("directory-field").parentElement.classList.toggle("harness-picker",p),p&&(Le(t("workspace-directory")),S&&(Le(t("team-workspace-directory")),S.refresh()));let m=ne();if(t("scenario").replaceChildren(...m.map(x=>{let A=e("option","",p?qe(x):x.title||x.id);return A.value=x.id,A.dataset.label=x.title?.replace(/\s+/g," ").trim()||n("common.unnamedSession"),A.dataset.description=qe(x).split(" \xB7 ").slice(-2).join(" \xB7 "),A.dataset.search=[x.title,qe(x),x.id].join(" "),A})),!m.length){let x=e("option","",n("livePage.noSessions",{host:a()}));x.value="",t("scenario").append(x)}t("scenario").value=c.rootId||"",t("scenario").disabled=!m.length,t("scenario").title=t("scenario").selectedOptions[0]?.textContent||"",Y.refresh()}function Le(l){let p=Ye(c.roots);if(l.replaceChildren(...p.map(m=>{let x=e("option","",m.path+" ("+m.count+")");return x.value=m.key,x.dataset.label=m.path,x.dataset.description=n("livePage.sessionCount",{count:m.count}),x})),!p.length){let m=e("option","",n("livePage.noDirectories"));m.value="",l.append(m)}l.disabled=!p.length,l.value=p.length?i.directoryKey??"":"",l.title=p.find(m=>m.key===i.directoryKey)?.path||"",l===t("workspace-directory")&&$.refresh()}function Ht(){let l=JSON.stringify(E().map(p=>[p.id,p.name,p.zone]));l!==H&&(H=l,t("scene-pins").replaceChildren(...E().map(p=>{let m=e("button","scene-pin"),x=e("span");return m.dataset.agent=p.id,m.setAttribute("aria-label",n("demo.ariaSelectAgent",{name:p.name})),x.append(e("strong","",p.name),e("small","",p.zone)),m.append(o(p.icon),x),m.onclick=()=>ee(p.id),m})));for(let p of t("scene-pins").children)p.classList.toggle("selected",p.dataset.agent===v),p.classList.toggle("done",c.agents.find(m=>m.id===p.dataset.agent)?.status==="done")}function Ot(){if(de)return;let l=Math.max(4,...E().map(p=>p.slot+1));if(!(C&&l<=I)){C?.destroy(),C=null,I=l;try{let p=C=new Ie(t("demo-scene"),{count:l,live:!0,source:i.kind,onSelect:ee,reduced:t("demo-reduced").checked,pins:t("scene-pins"),pinFloor:()=>{let m=document.querySelector(".stats"),x=m&&m.getBoundingClientRect();return x&&x.height?Math.round(x.bottom)+10:70}});p.setTeam(E(),c.rootId),p.select(v),p.ready.then(m=>{if(C===p){if(t("scene-loading").hidden=m,document.body.dataset.demoReady=m?"true":"fallback",m||(t("scene-loading").textContent=n("livePage.sceneUnavailable"),p.visible=!1),m)for(let x of j)p.animateEvent(x);j=[]}})}catch(p){de=!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",p)}}}function ot(){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("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"),ve.textContent=n("livePage.viewScreen")}function ye({baseline:l=!1}={}){c=i.snapshot,D!==i.kind&&(D=i.kind,$e(i.kind,!0),ot(),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!==k&&(v=c.rootId,l=!0,O++,t("demo-dialog").close()),E().some(A=>A.id===v)||(v=E()[0]?.id||null),l&&(f=new Set(c.events.map(A=>A.id)),j=[]);let p=h?c.roots?.find(A=>A.id===c.rootId):null;t("workspace-name").textContent=p!=null?p.title?.replace(/\s+/g," ").trim()||n("common.unnamedSession"):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?ge(c.seconds):"\u2014",t("team-count-caption").textContent=n("livePage.memberCaption",{count:c.assigned}),t("assigned-caption").textContent=n("livePage.nestedCaption");let m=ue.querySelector('option[value="live"]');m.textContent=i.connection==="connected"?n("demo.modeLive"):i.connection==="connecting"?n("livePage.connecting"):n("livePage.disconnected"),ue.closest(".mode-field")?.classList.toggle("disconnected",i.connection!=="connected"),se.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:a()}),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(M?"livePage.historyHide":"livePage.historyShow",{count:c.agents.filter(A=>A.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:E().filter(A=>A.id!==c.rootId&&["tool","thinking","typing"].includes(A.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 A of document.querySelectorAll(".stage")){let te=Number(A.dataset.stage);A.classList.toggle("active",te===c.stage),A.classList.toggle("completed",te<c.stage||c.complete),A.setAttribute("aria-pressed",te===c.stage),A.title=n("demo.previewStage",{stage:s()[te]}),A.querySelector("em").textContent=te===c.stage?n(c.complete?"demo.markerDone":"demo.markerRunning"):""}let x=t("progress-ring").getContext("2d");if(x.clearRect(0,0,112,112),x.lineWidth=15,x.lineCap="round",x.strokeStyle=c.complete?"#126cfa":"#e5edfc",x.beginPath(),x.arc(56,56,39,0,Math.PI*2),x.stroke(),nt(),Ht(),P(),K(),ze(),L&&!t("search-results").hidden&&re(),Ot(),C&&(C.setTeam(E(),c.rootId),C.select(v),C.playing=!0,!l))for(let A of c.events)f.has(A.id)||(C.loaded?C.animateEvent(A):j.push(A));f=new Set(c.events.map(A=>A.id)),k=c.rootId}document.body.dataset.mode="live",_e(document);let ve=document.createElement("button");ve.id="view-screen",ve.type="button",ve.className="text-button",ve.hidden=!0,t("view-task").before(ve),ot(),t("mode-select").onchange=l=>{l.target.value==="demo"?location.href=Be(!1,i.kind):(l.target.value="live",se.refresh())},t("play-icon").src="./demo-icons/crosshair.svg",t("history-toggle").hidden=t("team-picker").hidden=!1,t("close-details").onclick=()=>ie(!1),t("open-details").onclick=()=>ie(!0),t("view-report").onclick=()=>d(),t("view-task").onclick=()=>d(!0),ve.onclick=()=>{let l=U();l?.id&&C?.openScreenFor?.(l.id)},t("current-task-button").onclick=()=>{ie(!0),d()},t("close-demo-dialog").onclick=()=>{O++,t("demo-dialog").close()},t("demo-dialog").addEventListener("close",()=>{t("demo-dialog").open||(S?.destroy(),S=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{ae(n("common.copyFailedToast"))}},t("toggle-play").onclick=()=>{i.follow=!i.follow,ye(),ae(n(i.follow?i.kind==="harness"?"livePage.toastFollowHarness":"livePage.toastFollowNew":"livePage.toastFixed"))},t("restart-demo").onclick=()=>{i.connect(),ae(n("livePage.toastReconnect"))},t("reset-demo-camera").onclick=()=>C?.resetCamera(),t("history-toggle").onclick=()=>{M=!M,ye({baseline:!0})},t("scenario").onchange=l=>{L="",t("task-search").value="",re(),i.select(l.target.value)},t("workspace-directory").onchange=l=>{L="",t("task-search").value="",re(),i.selectDirectory(l.target.value)},t("task-search").oninput=l=>{L=l.target.value.trim(),K(),re()},t("task-search").onfocus=re,t("clear-search").onclick=()=>{L="",t("task-search").value="",K(),re(),t("task-search").focus()},t("notifications-button").onclick=()=>b.toggle(),t("mark-read").onclick=()=>{b.markRead(),ze()},t("show-team").onclick=t("team-picker").onclick=g,t("dock-toggle").onclick=()=>{let l=t("workflow-dock").classList.toggle("expanded");t("dock-toggle").setAttribute("aria-expanded",l)};for(let l of document.querySelectorAll(".stage"))l.onclick=()=>ae(n("livePage.stageToast",{stage:s()[c.stage],host:a()}));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=l=>{localStorage.setItem("office.demo.reduced",l.target.checked),document.body.dataset.reducedMotion=String(l.target.checked),C?.setReduced(l.target.checked)},document.addEventListener("keydown",l=>{l.key==="/"&&!["INPUT","TEXTAREA","SELECT"].includes(document.activeElement.tagName)&&!t("demo-dialog").open&&(l.preventDefault(),t("task-search").focus())}),document.addEventListener("click",l=>{!l.target.closest("#notifications")&&!l.target.closest("#notifications-button")&&b.close()}),document.addEventListener("visibilitychange",()=>{C&&(C.visible=!document.hidden&&!C.loadError)}),pe(()=>{H=F=q=G="",D=null,I=0,C?.destroy(),C=null,ot(),ye({baseline:!0})}),ie(innerWidth>1050&&innerHeight>820),ye({baseline:!0}),i.addEventListener("change",l=>ye(l.detail)),i.connect();let Ft=setInterval(()=>{document.hidden||ye()},1e3);window.addEventListener("beforeunload",()=>{clearInterval(Ft),clearTimeout(z),$.destroy(),Y.destroy(),S?.destroy(),N.destroy(),i.destroy(),C?.destroy()})}var Nt="office.shell";function Dt(){if(typeof document>"u")return()=>{};let t=document.body,e=document.getElementById("toggle-shell"),o=document.getElementById("shell-restore");if(!e&&!o)return()=>{};let s="";try{s=localStorage.getItem(Nt)||""}catch{s=""}let r=()=>t.dataset.shell==="scene",u=i=>{i?t.dataset.shell="scene":delete t.dataset.shell,o&&(o.hidden=!i),e?.setAttribute("aria-pressed",i?"true":"false");try{localStorage.setItem(Nt,i?"scene":"all")}catch{}};return e?.addEventListener("click",()=>u(!r())),o?.addEventListener("click",()=>{u(!1),e?.focus()}),window.addEventListener("keydown",i=>{if(i.defaultPrevented||i.metaKey||i.ctrlKey||i.altKey)return;let h=i.target?.tagName;h==="INPUT"||h==="SELECT"||h==="TEXTAREA"||(i.key==="h"||i.key==="H"?(i.preventDefault(),u(!r())):i.key==="Escape"&&r()&&u(!1))}),u(s==="scene"),()=>u(!1)}Dt();new URLSearchParams(location.search).get("mode")==="live"?Mt():Qt();function Qt(){let t=Ke();$e(t),_e(document);let e=d=>document.getElementById(d),o=(d,g,R)=>{let P=document.createElement(d);return g&&(P.className=g),R!=null&&(P.textContent=R),P},s=d=>{let g=o("img");return g.src="./demo-icons/"+d+".svg",g.alt="",g},r=()=>[n("demo.stage.analysis"),n("demo.stage.parallel"),n("demo.stage.reports"),n("demo.stage.summary")],u=()=>({main:n("demo.type.main"),api:n("demo.type.api"),frontend:n("demo.type.frontend"),test:n("demo.type.test")}),i=new Je,h=()=>{let d=i.snapshot;return t==="harness"?{...d,config:{...d.config,project:d.config.project.replace("Codex","Harness")},agents:d.agents.map(g=>({...g,agent:"dsh"}))}:d},a=h(),y="frontend",c=null,v="",C=null,I=new Set(a.events.map(d=>d.id)),L=innerWidth>1050&&innerHeight>820,M=a.seconds,D=a.scenario,f=performance.now(),k="",H="",F=me(e("scenario")),q=me(e("mode-select"),{filterable:!1}),G=e("mode-select");G.value="demo",q.refresh();let z=tt({mode:"demo",button:e("notifications-button"),dot:e("notification-dot"),panel:e("notifications"),getEvents:()=>a.events}),O=et({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:Z}),de=d=>a.agents.find(g=>g.id===d)?.name||n("common.agent"),$=()=>a.agents.find(d=>d.id===y)||a.agents[0],Y=d=>d.status==="done"?n("status.done"):d.status==="unknown"?n("status.pending"):d.status==="waiting_agents"?n("status.coordinating"):n("status.running"),se=d=>"00:"+String(Math.floor(d)).padStart(2,"0"),ue=()=>{for(let d of e("scenario").options)d.dataset.label=n(d.value==="review"?"demo.scenarioReview":"demo.scenarioSearch");F.refresh(),q.refresh()};function b(d){clearTimeout(C),e("demo-toast").textContent=d,e("demo-toast").hidden=!1,C=setTimeout(()=>{e("demo-toast").hidden=!0},2300)}function S(d){L=d,e("agent-details").hidden=!d,e("open-details").hidden=d}function N(d,g=!0){y=d,S(!0),c?.select(d,g),H="",ee()}function j(d){let g=e("progress-ring").getContext("2d");g.clearRect(0,0,112,112),g.lineWidth=15,g.lineCap="round",g.strokeStyle="#e5edfc",g.beginPath(),g.arc(56,56,39,0,Math.PI*2),g.stroke(),g.strokeStyle="#126cfa",g.beginPath(),g.arc(56,56,39,-Math.PI/2,-Math.PI/2+Math.PI*2*d/100),g.stroke()}function E(){e("scene-pins").replaceChildren(...a.agents.map(g=>{let R=o("button","scene-pin");R.dataset.agent=g.id,R.setAttribute("aria-label",n("demo.ariaSelectAgent",{name:g.name}));let P=o("span");return P.append(o("strong","",g.name),o("small","",g.zone)),R.append(s(g.icon),P),R.onclick=()=>N(g.id),R}))}function U(){let d=$();e("detail-icon").src="./demo-icons/"+d.icon+".svg",e("detail-agent-icon").src="./demo-icons/"+d.icon+".svg",e("detail-code").textContent=n("demo.detailCode",{code:d.code}),e("detail-badge").textContent=Y(d),e("detail-badge").classList.toggle("done",d.status==="done"),e("detail-task-title").textContent=d.title,e("detail-project").textContent=a.scenario==="search"?n("demo.projectTaskBoard"):n("demo.projectApi"),e("detail-role").textContent=d.role,e("detail-type").textContent=a.scenario==="review"&&d.parentId?n("demo.type.reviewOnly"):u()[d.id],e("detail-progress-label").textContent=d.report?n("demo.detailProgressDone"):d.reportPreview,e("detail-progress-fill").style.width=d.progress+"%",e("detail-percent").textContent=d.progress+"%",e("detail-zone").textContent=d.zone,e("detail-file").textContent=d.file,e("detail-parent").textContent=d.parentId?n("demo.parentMain"):n("demo.parentLead",{count:3}),e("detail-name").textContent=d.name,e("detail-stage").textContent=a.complete?n("demo.stageComplete"):r()[a.stage],e("view-report").replaceChildren(document.createTextNode(d.report?n("demo.viewFullReport"):n("demo.viewReport")),s("arrow-right")),e("current-task-code").textContent=d.code,e("current-task-agent").textContent=d.name+" \xB7 "+d.zone.split(" \xB7 ")[0],e("current-task-description").textContent=d.title,e("current-task-icon").src="./demo-icons/"+d.icon+".svg",e("current-progress-fill").style.width=d.progress+"%"}function ne(d){return!v||[d.name,d.role,d.zone,d.task,d.file,d.code,d.title].join(" ").toLowerCase().includes(v.toLowerCase())}function V(){let d=a.agents.filter(P=>P.id!==y&&ne(P)),g=JSON.stringify([a.scenario,y,v,d.map(P=>[P.id,P.status,P.progress])]);if(g===H)return;H=g,e("queue-heading").textContent=n("demo.queueHeading",{label:v?n("demo.matchingTasks"):n("demo.teamTasks"),count:d.length});let R=e("task-queue");R.replaceChildren();for(let P of d){let K=o("button","queue-item");K.setAttribute("aria-label",n("demo.ariaViewTask",{name:P.name})),K.append(o("strong","",P.code),o("span","",P.zone.split(" \xB7 ")[0]),o("span","queue-status "+(P.status==="done"?"done":P.status==="unknown"?"":"running"),Y(P))),K.onclick=()=>N(P.id),R.append(K)}d.length||R.append(o("div","queue-empty",n("demo.noMatchingTasks")))}let Q="";function Z(){let d=e("search-result-list"),g=v?a.agents.filter(ne):[],R=JSON.stringify([v,J(),g.map(P=>[P.id,P.name,P.title,P.file,P.icon])]);if(R===Q){O.refresh();return}Q=R,d.replaceChildren();for(let P of g){let K=o("button","search-result");K.type="button",K.dataset.value=P.id;let ce=o("span");ce.append(o("strong","",P.name+" \xB7 "+P.title),o("small","",P.file)),K.append(s(P.icon),ce),K.onclick=()=>{N(P.id),e("task-search").focus(),O.close()},d.append(K)}O.refresh()}function ge(){let d=e("notification-list");d.replaceChildren();let g=a.events.slice(-6).reverse();for(let R of g){let P=a.agents.find(Le=>Le.id===(R.targetId||R.sessionId)),K=o("button","notification-item");K.type="button";let ce=o("span","notify-type");ce.append(s(R.type==="assign"?"diagram-3-fill":R.type==="report"?"check-lg":"chat-left-text-fill"));let Pe=o("span","notify-copy"),re=R.type==="assign"?n("demo.notifyAssign"):R.type==="report"?n("demo.notifyReport"):n("demo.notifyMessage"),ze=R.type==="assign"?n("demo.notifyRouteLead"):de(R.sessionId)+" \xB7 ",nt=R.type==="assign"?P?.title||de(R.targetId):R.type==="report"?n("demo.notifySummary"):R.preview||n("demo.notifyProgress");Pe.append(o("strong","notify-title",re),o("small","notify-preview",ze+nt),o("em","notify-time",n("demo.notifyTime",{time:se(R.at)}))),K.append(ce,Pe),K.onclick=()=>{P&&N(P.id),z.markRead(),z.close()},d.append(K)}g.length||d.append(o("div","empty",n("demo.notifyEmpty"))),z.update()}function ae(d,g,R=$().icon){Te(),e("dialog-title").textContent=d,e("dialog-content").textContent=g,e("dialog-icon").src="./demo-icons/"+R+".svg",e("copy-demo-report").textContent=n("demo.copy"),e("demo-dialog").open||e("demo-dialog").showModal()}function ie(){let d=$();d.report?ae(n(d.id==="main"?"demo.dialogFinalTitle":"demo.dialogReportTitle",{name:d.name}),d.report):ae(n("demo.dialogTaskTitle",{name:d.name}),[n("demo.fieldTask",{value:d.title}),n("demo.fieldCode",{value:d.code}),n("demo.fieldZone",{value:d.zone}),n("demo.fieldFile",{value:d.file}),"",d.task,"",n("demo.fieldStatus",{value:Y(d),percent:d.progress}),"",n("demo.doneHint"),"",n("demo.demoOnlyHint")].join(`
|
|
5
|
+
`)),k=d.id+":"+!!d.report+":"+a.scenario}function ee(){a=h();let d=a.seconds<M||a.scenario!==D;if(d&&(I=new Set(a.events.map(g=>g.id)),e("demo-dialog").close(),k="",c))for(let g of c.people.values())g.path=[],g.mode="work",g.reportUntil=null,g.x=g.desk.seat.x,g.y=g.desk.seat.y;e("workspace-name").textContent=a.config.project,e("workflow-subtitle").textContent=n("demo.subtitleSim",{title:a.config.title}),e("metric-active").textContent=a.active,e("metric-assigned").textContent=a.assigned,e("metric-reports").textContent=a.received,e("metric-progress").textContent=a.progress+"%",e("active-hint").textContent=a.complete?n("demo.hintComplete"):a.active>1?n("demo.hintParallel"):n("demo.hintCoordinating"),e("assigned-hint").textContent=a.assigned===3?n("demo.assignedReady"):n("demo.assignedSplitting"),e("report-hint").textContent=a.received===3?n("demo.reportsReady"):a.received?n("demo.reportsCollecting"):n("demo.reportsWaiting"),e("stage-caption").textContent=a.complete?n("demo.demoComplete"):n("demo.runningStage",{stage:r()[a.stage]}),e("demo-clock").textContent=se(a.seconds),e("play-label").textContent=i.playing?n("demo.pause"):a.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,a.seconds/le*100)+"%",e("stage-0-description").textContent=n("demo.stageAssigned",{done:a.assigned,total:3}),e("stage-1-description").textContent=n("demo.stageRunning",{count:a.agents.slice(1).filter(g=>g.status==="tool").length}),e("stage-2-description").textContent=n("demo.stageReported",{done:a.received,total:3}),e("stage-3-description").textContent=a.complete?n("demo.stageSummaryReady"):a.stage===3?n("demo.stageConcluding"):n("demo.stageAwaitReports");for(let g of document.querySelectorAll(".stage")){let R=Number(g.dataset.stage);g.classList.toggle("active",R===a.stage),g.classList.toggle("completed",R<a.stage||a.complete),g.setAttribute("aria-pressed",R===a.stage),g.title=n("demo.previewStage",{stage:r()[R]}),g.querySelector("em").textContent=R===a.stage?a.complete?n("demo.markerDone"):i.playing?n("demo.markerRunning"):n("demo.markerPaused"):""}j(a.progress),U(),V(),ge();for(let g of e("scene-pins").children)g.classList.toggle("selected",g.dataset.agent===y),g.classList.toggle("done",a.agents.find(R=>R.id===g.dataset.agent)?.status==="done");if(c&&(c.setTeam(a.agents,"main"),c.select(y),c.playing=i.playing,!d))for(let g of a.events)I.has(g.id)||c.animateEvent(g);if(I=new Set(a.events.map(g=>g.id)),M=a.seconds,D=a.scenario,e("demo-dialog").open&&k){let g=$();g.id+":"+!!g.report+":"+a.scenario!==k&&ie()}}e("close-details").onclick=()=>S(!1),e("open-details").onclick=()=>S(!0),e("view-report").onclick=ie,e("current-task-button").onclick=()=>{S(!0),ie()},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=d=>{d.target.value==="live"?location.href=Be(!0,t):(d.target.value="demo",q.refresh())},e("restart-demo").onclick=()=>{i.restart(),b(n("demo.toastRestart"))},e("reset-demo-camera").onclick=()=>c?.resetCamera(),e("scenario").onchange=d=>{v="",e("task-search").value="",Z(),i.setScenario(d.target.value)},e("task-search").oninput=d=>{v=d.target.value.trim(),H="",V(),Z()},e("task-search").onfocus=()=>Z(),e("clear-search").onclick=()=>{v="",e("task-search").value="",V(),Z(),e("task-search").focus()},e("notifications-button").onclick=()=>z.toggle(),e("mark-read").onclick=()=>{z.markRead(),ge()},e("show-team").onclick=()=>{k="",ae(n("demo.dialogTeamTitle",{title:a.config.title}),a.agents.map(d=>n("demo.teamMemberLine",{name:d.name,zone:d.zone,task:d.task,status:Y(d),percent:d.progress})).join(`
|
|
6
|
+
|
|
7
|
+
`),"people-fill")},e("dock-toggle").onclick=()=>{let d=e("workflow-dock").classList.toggle("expanded");e("dock-toggle").setAttribute("aria-expanded",d)};for(let d of document.querySelectorAll(".stage"))d.onclick=()=>{i.seconds=[2,16,32,42][Number(d.dataset.stage)],i.playing=!1,i.changed(),b(n("demo.toastPreview",{stage:r()[Number(d.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=d=>{document.body.dataset.reducedMotion=String(d.target.checked),c?.setReduced(d.target.checked)},document.addEventListener("keydown",d=>{d.key==="/"&&!["INPUT","TEXTAREA","SELECT"].includes(document.activeElement.tagName)&&!e("demo-dialog").open&&!document.querySelector(".screen-modal")&&(d.preventDefault(),e("task-search").focus())}),document.addEventListener("click",d=>{!d.target.closest("#notifications")&&!d.target.closest("#notifications-button")&&z.close()}),document.addEventListener("visibilitychange",()=>{f=performance.now(),c&&(c.visible=!document.hidden&&!c.loadError)}),pe(()=>{ue(),H="",k="",ee(),E(),Z(),e("demo-dialog").open&&ie(),c?.destroy(),c=null,he()}),E(),S(L),ee(),he();function he(){try{let d=new Ie(e("demo-scene"),{source:t,onSelect:g=>N(g),reduced:e("demo-reduced").checked,pins:e("scene-pins"),pinFloor:()=>{let g=document.querySelector(".stats"),R=g&&g.getBoundingClientRect();return R&&R.height?Math.round(R.bottom)+10:70}});c=d,d.setTeam(a.agents,"main"),d.select(y),d.ready.then(g=>{e("scene-loading").hidden=g,document.body.dataset.demoReady=g?"true":"fallback",g||(e("scene-loading").textContent=n("demo.failed3d"),d.visible=!1)})}catch{e("scene-loading").textContent=n("demo.failed3d"),document.body.dataset.demoReady="fallback"}}i.addEventListener("change",ee);let xe=setInterval(()=>{let d=performance.now(),g=Math.min(.5,(d-f)/1e3);f=d,document.hidden||i.advance(g)},250);window.addEventListener("beforeunload",()=>{clearInterval(xe),clearTimeout(C),F.destroy(),O.destroy(),c?.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>
|
package/public/style.css
ADDED
|
@@ -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}}
|