dsh-mutipleagent 0.0.0-stage → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +149 -0
- package/CONTRIBUTING.md +49 -0
- package/LICENSE +21 -0
- package/README.en.md +95 -0
- package/README.md +273 -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 +90 -0
- package/cordis.patch.yml +3 -0
- package/harness.cjs +49 -0
- package/package.json +87 -4
- package/public/app.js +1 -0
- package/public/chunks/chunk-RQUUGNU7.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 +173 -0
- package/public/demo.html +64 -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/package.json
CHANGED
|
@@ -1,6 +1,89 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-mutipleagent",
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"description": "
|
|
6
|
-
|
|
3
|
+
"displayName": "DSH 多 Agent 办公室",
|
|
4
|
+
"version": "0.2.1",
|
|
5
|
+
"description": "DeepSeek Harness 多 Agent 3D 协作办公室插件:在 3D 场景中观察真实主会话、子 Agent、工具活动与汇报,支持目录/会话切换和跨目录搜索。",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"icon": "./assets/agents/dsh.svg",
|
|
8
|
+
"engines": {
|
|
9
|
+
"node": "^22.19.0 || >=24.0.0",
|
|
10
|
+
"dsh": "^0.2.2-rc.1"
|
|
11
|
+
},
|
|
12
|
+
"main": "harness.cjs",
|
|
13
|
+
"exports": {
|
|
14
|
+
".": "./harness.cjs",
|
|
15
|
+
"./client": "./client.js",
|
|
16
|
+
"./cordis.patch.yml": "./cordis.patch.yml",
|
|
17
|
+
"./package.json": "./package.json",
|
|
18
|
+
"./icon": "./assets/agents/dsh.svg"
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"harness.cjs",
|
|
22
|
+
"client.js",
|
|
23
|
+
"cordis.patch.yml",
|
|
24
|
+
"src",
|
|
25
|
+
"public",
|
|
26
|
+
"assets",
|
|
27
|
+
"!assets/screenshots",
|
|
28
|
+
"vendor/licenses",
|
|
29
|
+
"LICENSE",
|
|
30
|
+
"README.md",
|
|
31
|
+
"README.en.md",
|
|
32
|
+
"SECURITY.md",
|
|
33
|
+
"CONTRIBUTING.md",
|
|
34
|
+
"CHANGELOG.md",
|
|
35
|
+
"THIRD_PARTY_NOTICES.md"
|
|
36
|
+
],
|
|
37
|
+
"repository": {
|
|
38
|
+
"type": "git",
|
|
39
|
+
"url": "https://github.com/lkuliuying/dsh-mutipleagent.git"
|
|
40
|
+
},
|
|
41
|
+
"homepage": "https://github.com/lkuliuying/dsh-mutipleagent",
|
|
42
|
+
"bugs": {
|
|
43
|
+
"url": "https://github.com/lkuliuying/dsh-mutipleagent/issues"
|
|
44
|
+
},
|
|
45
|
+
"keywords": [
|
|
46
|
+
"dsh-plugin",
|
|
47
|
+
"deepseek-harness",
|
|
48
|
+
"multi-agent",
|
|
49
|
+
"3d-office"
|
|
50
|
+
],
|
|
51
|
+
"dsh": {
|
|
52
|
+
"bundle": {
|
|
53
|
+
"patch": "./cordis.patch.yml"
|
|
54
|
+
},
|
|
55
|
+
"client": {
|
|
56
|
+
"platform": "web",
|
|
57
|
+
"inject": [
|
|
58
|
+
"@deepseek-ai/dsh-client-ui-layout",
|
|
59
|
+
"@deepseek-ai/dsh-client-ui-sidebar"
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
"scripts": {
|
|
64
|
+
"start": "node src/server.js --open",
|
|
65
|
+
"demo": "node src/server.js --demo --open",
|
|
66
|
+
"build": "node scripts/build.mjs",
|
|
67
|
+
"lint": "eslint .",
|
|
68
|
+
"format": "prettier --write \"**/*.{js,cjs,mjs,yml}\"",
|
|
69
|
+
"format:check": "prettier --check \"**/*.{js,cjs,mjs,yml}\"",
|
|
70
|
+
"check:compat": "node scripts/check-compat.mjs",
|
|
71
|
+
"test": "node --test tests/*.test.js",
|
|
72
|
+
"test:ui": "node tests/browser.cjs",
|
|
73
|
+
"test:plugin:ui": "node tests/plugin-browser.cjs",
|
|
74
|
+
"smoke:host": "node scripts/smoke-host.cjs",
|
|
75
|
+
"release": "node scripts/release.mjs",
|
|
76
|
+
"screenshots": "node scripts/screenshots.mjs",
|
|
77
|
+
"test:coverage": "node --test --experimental-test-coverage --test-coverage-lines=85 --test-coverage-functions=80 --test-coverage-branches=75 tests/*.test.js"
|
|
78
|
+
},
|
|
79
|
+
"devDependencies": {
|
|
80
|
+
"@eslint/js": "^9.39.5",
|
|
81
|
+
"esbuild": "^0.25.12",
|
|
82
|
+
"eslint": "^9.39.4",
|
|
83
|
+
"globals": "^15.15.0",
|
|
84
|
+
"playwright": "^1.62.1",
|
|
85
|
+
"prettier": "^3.9.10",
|
|
86
|
+
"semver": "^7.8.6",
|
|
87
|
+
"three": "^0.186.1"
|
|
88
|
+
}
|
|
89
|
+
}
|
package/public/app.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{s as J,u as a,v as F,w as S,x as v,y as P,z as U}from"./chunks/chunk-RQUUGNU7.js";var e=t=>document.getElementById(t),O={assign:"\u2197",message:"\u2194",wait:"\u25F7",report:"\u2199",complete:"\u2713",error:"!",interrupted:"\u2161",close:"\xD7",approval:"?"},st=new Set(["thinking","tool","typing"]),ct=new Set(["done","error","interrupted","closed"]),r=null,g=null,I=null,u=null,A=0,W=new Set,k=!0,B=null,q="activity",w="",j=!1,K=Date.now(),E="",C="",L="",b="",_=!1,$=null,N=new Map,z=t=>{try{return localStorage.getItem(t)}catch{return null}},G=(t,n)=>{try{localStorage.setItem(t,n)}catch{}},M=t=>t?new Date(t).toLocaleTimeString(F(),{hour12:!1,hour:"2-digit",minute:"2-digit",second:"2-digit"}):"\u2014",c=(t,n,i)=>{let p=document.createElement(t);return n&&(p.className=n),i!=null&&(p.textContent=i),p},h=t=>c("div","empty",t),y=()=>r?.agents.find(t=>t.id===g),dt=t=>c("span","state-dot "+t),x=t=>r?.agents.find(n=>n.id===t)?.name||a("common.agent");function Q(t){e("notice").textContent=t,e("notice").hidden=!t}function T(t){e("connection").classList.toggle("connected",t),e("connection").textContent=t?a("topbar.connected"):a("topbar.reconnecting")}function V(t,n=!1){return c("span","agent-avatar"+(t.id===r.rootId?" lead":""),t.id===r.rootId?"\u25C8":n?"\u25C7":String(r.agents.indexOf(t)).padStart(2,"0"))}function D(t,n=!1){g=t,b="",C="",w="",u&&(u.selectedId=t,n&&u.focus(t)),X(),Z()}function pt(){let t=JSON.stringify(r.roots);if(t===E)return;E=t;let n=e("task-select");n.replaceChildren();for(let i of r.roots){let p=c("option","",i.title.slice(0,80));p.value=i.id,n.append(p)}r.roots.length||n.append(c("option","",a("sidebar.noSessions"))),n.value=r.rootId||""}function X(){if(!r)return;let t=JSON.stringify([g,r.agents.map(o=>[o.id,o.name,o.status,o.parentId,o.relationship])]);if(C===t)return;C=t;let n=e("team-tree");n.replaceChildren(),e("team-count").textContent=r.agents.length;let i=[],p=(o,s)=>{let d=r.agents.find(l=>l.id===o);if(!(!d||i.some(l=>l.s.id===o))){i.push({s:d,depth:s});for(let l of r.agents.filter(f=>f.parentId===o))p(l.id,s+1)}};p(r.rootId,0);for(let o of r.agents)i.some(s=>s.s.id===o.id)||i.push({s:o,depth:0});for(let{s:o,depth:s}of i){let d=c("button","agent-card"+(s?" child":"")+(o.id===g?" selected":""));d.type="button",d.setAttribute("aria-pressed",o.id===g),d.setAttribute("aria-label",a("app.ariaAgentStatus",{name:o.name,status:S(o.status)}));let l=c("div","agent-card-body"),f=c("div","agent-card-name");f.append(c("span","",o.name),dt(o.status)),l.append(f,c("div","agent-card-role",(s>1?"\u21B3 ".repeat(Math.min(3,s-1)):"")+(o.role||(s?a("app.roleSubAgent"):a("app.roleLead")))+" \xB7 "+S(o.status))),d.append(V(o),l),d.onclick=()=>D(o.id,!0),n.append(d)}i.length||n.append(h(a("app.teamEmpty")))}function lt(){let t=r.events.filter(s=>O[s.type]).slice(-40),n=JSON.stringify(t);if(n===L)return;L=n;let i=e("timeline"),p=i.scrollLeft,o=i.scrollWidth-i.clientWidth-p<30;i.replaceChildren(),e("event-count").textContent=t.length?a("main.recentEvents",{count:t.length}):a("main.noEvents");for(let s of t){let d=c("button","event-card "+s.type),l=c("div","event-card-top"),f=c("span","event-type");f.append(c("i","",O[s.type]),document.createTextNode(v(s.type))),l.append(f,c("time","",M(s.at)));let m=s.type==="assign"||s.type==="message"?x(s.sessionId)+" \u2192 "+x(s.targetId):s.type==="wait"?a("app.waitingResult",{name:x(s.sessionId)}):s.preview||x(s.sessionId)+" \xB7 "+v(s.type);d.append(l,c("p","",m)),d.onclick=()=>{D(s.sessionId,!0),s.hasText&&R(s)},d.title=m,i.append(d)}t.length||i.append(h(a("main.timelineEmpty"))),i.scrollLeft=o||k?i.scrollWidth:p}function Y(t){if(!t?.turnStartedAt)return"\u2014";let n=Math.max(0,Math.floor(((ct.has(t.status)?t.endedAt:Date.now())-t.turnStartedAt)/1e3));return n>=3600?a("app.durationHours",{hours:Math.floor(n/3600),minutes:Math.floor(n%3600/60)}):a("app.durationMinutes",{minutes:Math.floor(n/60),seconds:n%60})}function Z(){let t=y();if(!t){e("agent-header").replaceChildren(h(a("details.selectAgent"))),e("agent-metadata").replaceChildren(),e("agent-task").textContent=a("details.noTask"),e("agent-activity").replaceChildren(),e("open-task").disabled=!0,e("report-content").replaceChildren(h(a("details.noReport")));return}let n=JSON.stringify([t.id,t.status,t.model,t.role,t.relationship,t.task,t.events,t.reports,t.reportEventId]);if(n===b)return;b=n;let i=c("div");i.append(c("h3","",t.name),c("p","",t.role||(t.parentId?a("app.roleSplit"):a("app.roleLeadTask")))),e("agent-header").replaceChildren(V(t,!0),i);let p=[["status-pill",a("app.metadataStatus"),S(t.status)],["elapsed",a("app.metadataElapsed"),Y(t)],["",a("app.metadataModel"),t.model||a("common.notRecorded")],["",a("app.metadataRelation"),t.relationship==="conflict"?a("app.relationConflict"):t.parentId?x(t.parentId):a("app.relationMain")]];e("agent-metadata").replaceChildren(...p.map(([d,l,f])=>{let m=c("div","metadata-row");return m.append(c("span","",l),c("span",d,f)),m})),e("agent-task").textContent=t.task||a("app.noTaskLogged"),e("open-task").disabled=!t.taskEventId;let o=e("agent-activity");o.replaceChildren();let s=t.events.filter(d=>d.type!=="task").slice(-16).reverse();for(let d of s){let l=c("div","activity-item");if(l.append(c("time","",M(d.at)+" \xB7 "+v(d.type)),c("p","",d.preview||v(d.type))),d.hasText){let f=c("button","",a("details.viewRecord"));f.onclick=()=>R(d),l.append(f)}o.append(l)}s.length||o.append(h(a("details.noActivity"))),q==="report"&&et(t)}async function tt(t,n){let i=t+":"+n;if(N.has(i))return N.get(i);let p=await fetch("./api/report?"+new URLSearchParams({sessionId:t,eventId:n})),o=await p.json();if(!p.ok)throw new Error(o.error||a("app.readFailed"));return N.set(i,o.text),o.text}async function R(t){e("dialog-title").textContent=(O[t.type]?v(t.type):a("dialog.title"))+" \xB7 "+x(t.sessionId),e("dialog-body").textContent=a("dialog.loading"),e("copy-text").textContent=a("dialog.copy"),e("text-dialog").open||e("text-dialog").showModal();let n=t.id;e("text-dialog").dataset.eventId=n;try{let i=await tt(t.sessionId,t.id);e("text-dialog").dataset.eventId===n&&(e("dialog-body").textContent=i||a("dialog.emptyBody"))}catch(i){e("text-dialog").dataset.eventId===n&&(e("dialog-body").textContent=i.message)}}async function et(t){let n=t.reports||[],i=t.id+":"+n.join(",");if(i===w)return;w=i;let p=e("report-content");if(p.replaceChildren(),!n.length){p.append(h(a("app.reportEmpty")));return}p.append(h(a("app.reportLoading")));let o=await Promise.all(n.slice(-8).reverse().map(async s=>{try{return{id:s,text:await tt(t.id,s)}}catch(d){return{id:s,error:d.message}}}));if(!(y()?.id!==t.id||i!==w)){p.replaceChildren();for(let s of o){let d=c("section","report-block"),l=t.events.find(rt=>rt.id===s.id),f=c("header");f.append(c("span","",(s.id===t.reportEventId?a("app.reportCurrent"):a("app.reportHistory"))+(t.parentId?a("app.reportSub"):a("app.reportLead"))),c("time","",M(l?.at))),d.append(f,c("pre",s.error?"error-text":"",s.error||s.text));let m=c("button","report-open",a("app.reportOpen"));m.onclick=()=>R({id:s.id,sessionId:t.id,type:"report"}),d.append(m),p.append(d)}n.length>8&&p.append(c("p","muted",a("app.reportLimit")))}}function nt(t){q=t;for(let n of["activity","report"]){let i=t===n;e(n+"-tab").classList.toggle("active",i),e(n+"-tab").setAttribute("aria-selected",i),e(n+"-panel").hidden=!i}t==="report"&&y()&&et(y())}async function ut(){if(!u||r.agents.length>A){u?.destroy(),A=Math.max(7,Math.ceil(r.agents.length/2)*2+1),e("scene-status").hidden=!1;try{let t=new J(e("scene"),{count:A,reduced:e("reduced-motion").checked,onSelect:i=>D(i)});u=t,t.setTeam(r.agents,r.rootId),t.selectedId=g;let n=await t.ready;if(u!==t)return;e("scene-status").hidden=!!n,n||(e("scene-status").textContent=a("main.sceneUnavailable"),t.visible=!1)}catch{e("scene-status").hidden=!1,e("scene-status").textContent=a("main.sceneFailed")}}else u.setTeam(r.agents,r.rootId),u.selectedId=g}function ot(t){let n=t.rootId!==B;r=t,n&&(B=r.rootId,g=r.rootId,k=!0,C="",L="",b="",w=""),r.agents.some(o=>o.id===g)||(g=r.rootId),e("mode").textContent=r.mode==="demo"?a("app.demoMode"):a("topbar.readonly"),e("mode").classList.toggle("demo",r.mode==="demo");let i=r.agents.find(o=>o.id===r.rootId);e("project-path").textContent=i?.cwd||"",e("project-path").title=i?.cwd||"",e("task-title").textContent=i?.task||a("main.subtitle"),e("task-title").title=i?.task||"",e("working-count").textContent=r.agents.filter(o=>st.has(o.status)).length,e("done-count").textContent=r.agents.filter(o=>o.status==="done").length,e("waiting-count").textContent=r.agents.filter(o=>o.status==="waiting"||o.status==="waiting_agents").length,Q(r.mode==="demo"?a("app.demoNotice"):r.warnings.join(a("common.listSeparator"))||(r.rootId?"":a("app.noRecentSessions"))),pt(),X(),lt(),Z(),ut();let p=r.agents.some(o=>o.loading);if(!k&&!j&&!p&&u)for(let o of r.events)!W.has(o.id)&&o.at>=K&&u.animateEvent(o);j=p,W=new Set(r.events.map(o=>o.id)),k=!1,G("codex-office-root",r.rootId||"")}function at(t){I?.close(),k=!0,j=!0,K=Date.now();let n=new EventSource("./events"+(t?"?"+new URLSearchParams({rootId:t}):""));I=n,n.onopen=()=>{k=!0,T(!0)},n.onmessage=i=>{I===n&&(T(!0),ot(JSON.parse(i.data)))},n.onerror=()=>{I===n&&T(!1)}}async function it(){try{let t=await fetch("./api/sessions");if(!t.ok)throw new Error(a("app.editFailed"));let n=await t.json(),i=z("codex-office-root"),p=n.roots.find(o=>o.id===i)?.id||n.rootId;at(p)}catch(t){T(!1),Q(a("app.retrying",{message:t.message})),_||($=setTimeout(it,2500))}}e("task-select").onchange=t=>{E="",at(t.target.value)};e("reset-camera").onclick=()=>u?.resetCamera();e("activity-tab").onclick=()=>nt("activity");e("report-tab").onclick=()=>nt("report");e("open-task").onclick=()=>{let t=y();t?.taskEventId&&R({id:t.taskEventId,sessionId:t.taskSessionId||t.id,type:"task"})};e("close-dialog").onclick=()=>e("text-dialog").close();e("copy-text").onclick=async()=>{try{await navigator.clipboard.writeText(e("dialog-body").textContent),e("copy-text").textContent=a("common.copied")}catch{e("copy-text").textContent=a("common.copyFailed")}};var H=z("codex-office-reduced");e("reduced-motion").checked=H==null?matchMedia("(prefers-reduced-motion: reduce)").matches:H==="true";e("reduced-motion").onchange=t=>{G("codex-office-reduced",t.target.checked),u?.setReduced(t.target.checked)};var ft=setInterval(()=>{e("clock").textContent=M(Date.now());let t=document.querySelector(".elapsed");t&&y()&&(t.textContent=Y(y()))},1e3);document.addEventListener("visibilitychange",()=>{u&&(u.visible=!document.hidden&&!u.loadError)});P(()=>{E="",C="",L="",b="",w="",r&&ot(r)});U(document);window.addEventListener("beforeunload",()=>{_=!0,clearInterval(ft),clearTimeout($),I?.close(),u?.destroy()});it();
|