octiqflow-linux-x64 0.3.32 → 0.3.33
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/bin/octiq-server +0 -0
- package/bin/v2/assets/DiskPage-BHQ6vXWD.js +2 -0
- package/bin/v2/assets/DiskPage-BHQ6vXWD.js.br +0 -0
- package/bin/v2/assets/DiskPage-BHQ6vXWD.js.gz +0 -0
- package/bin/v2/assets/DiskPage-C6EDo7e0.css +1 -0
- package/bin/v2/assets/DiskPage-C6EDo7e0.css.br +0 -0
- package/bin/v2/assets/DiskPage-C6EDo7e0.css.gz +0 -0
- package/bin/v2/assets/{IslandPage-DsePQ8su.js → IslandPage-Qq4QwLeF.js} +1 -1
- package/bin/v2/assets/IslandPage-Qq4QwLeF.js.br +0 -0
- package/bin/v2/assets/{IslandPage-DsePQ8su.js.gz → IslandPage-Qq4QwLeF.js.gz} +0 -0
- package/bin/v2/assets/{index-D5P52Re7.js → index-B3M2dqjT.js} +1 -1
- package/bin/v2/assets/index-B3M2dqjT.js.br +0 -0
- package/bin/v2/assets/index-B3M2dqjT.js.gz +0 -0
- package/bin/v2/assets/{index-C6QuNI4z.js → index-BEWqNsHw.js} +1 -1
- package/bin/v2/assets/index-BEWqNsHw.js.br +0 -0
- package/bin/v2/assets/index-BEWqNsHw.js.gz +0 -0
- package/bin/v2/assets/{index-D4ivKf0F.js → index-Brzuk1-3.js} +1 -1
- package/bin/v2/assets/index-Brzuk1-3.js.br +0 -0
- package/bin/v2/assets/index-Brzuk1-3.js.gz +0 -0
- package/bin/v2/assets/{index-Q9HuFPqC.js → index-BtMUb1SW.js} +1 -1
- package/bin/v2/assets/index-BtMUb1SW.js.br +0 -0
- package/bin/v2/assets/index-BtMUb1SW.js.gz +0 -0
- package/bin/v2/assets/{index-Bwctb-s1.js → index-Co3uxkEw.js} +1 -1
- package/bin/v2/assets/index-Co3uxkEw.js.br +0 -0
- package/bin/v2/assets/index-Co3uxkEw.js.gz +0 -0
- package/bin/v2/assets/{index-eXVgoPmr.js → index-CzmdQnci.js} +154 -154
- package/bin/v2/assets/index-CzmdQnci.js.br +0 -0
- package/bin/v2/assets/index-CzmdQnci.js.gz +0 -0
- package/bin/v2/assets/{index-Dy0IWUpN.css → index-DWMHLBXe.css} +1 -1
- package/bin/v2/assets/index-DWMHLBXe.css.br +0 -0
- package/bin/v2/assets/{index-Dy0IWUpN.css.gz → index-DWMHLBXe.css.gz} +0 -0
- package/bin/v2/assets/{index-DQ7hoPJc.js → index-Dcyibowf.js} +1 -1
- package/bin/v2/assets/index-Dcyibowf.js.br +0 -0
- package/bin/v2/assets/index-Dcyibowf.js.gz +0 -0
- package/bin/v2/assets/{index-ByyRxa_r.js → index-DgipX4Jo.js} +1 -1
- package/bin/v2/assets/index-DgipX4Jo.js.br +0 -0
- package/bin/v2/assets/index-DgipX4Jo.js.gz +0 -0
- package/bin/v2/assets/{index-Bvv92xJD.js → index-DkCVJgWk.js} +1 -1
- package/bin/v2/assets/index-DkCVJgWk.js.br +0 -0
- package/bin/v2/assets/index-DkCVJgWk.js.gz +0 -0
- package/bin/v2/assets/{index-CBi-wV4i.js → index-cShCsMR4.js} +1 -1
- package/bin/v2/assets/index-cShCsMR4.js.br +0 -0
- package/bin/v2/assets/index-cShCsMR4.js.gz +0 -0
- package/bin/v2/assets/{index-DYvN8rpK.js → index-s-iKxzP8.js} +1 -1
- package/bin/v2/assets/index-s-iKxzP8.js.br +0 -0
- package/bin/v2/assets/index-s-iKxzP8.js.gz +0 -0
- package/bin/v2/assets/{index-D52Nl5Gj.js → index-v7xV5kGw.js} +1 -1
- package/bin/v2/assets/index-v7xV5kGw.js.br +0 -0
- package/bin/v2/assets/index-v7xV5kGw.js.gz +0 -0
- package/bin/v2/assets/{portrait-BzejVzFs.js → portrait-DEXFdiVX.js} +1 -1
- package/bin/v2/assets/portrait-DEXFdiVX.js.br +0 -0
- package/bin/v2/assets/portrait-DEXFdiVX.js.gz +0 -0
- package/bin/v2/index.html +2 -2
- package/package.json +1 -1
- package/bin/v2/assets/DiskPage-ChaJ1CyF.js +0 -3
- package/bin/v2/assets/DiskPage-ChaJ1CyF.js.br +0 -0
- package/bin/v2/assets/DiskPage-ChaJ1CyF.js.gz +0 -0
- package/bin/v2/assets/DiskPage-V8JcTuXz.css +0 -1
- package/bin/v2/assets/DiskPage-V8JcTuXz.css.br +0 -0
- package/bin/v2/assets/DiskPage-V8JcTuXz.css.gz +0 -0
- package/bin/v2/assets/IslandPage-DsePQ8su.js.br +0 -0
- package/bin/v2/assets/index-Bvv92xJD.js.br +0 -0
- package/bin/v2/assets/index-Bvv92xJD.js.gz +0 -0
- package/bin/v2/assets/index-Bwctb-s1.js.br +0 -0
- package/bin/v2/assets/index-Bwctb-s1.js.gz +0 -0
- package/bin/v2/assets/index-ByyRxa_r.js.br +0 -0
- package/bin/v2/assets/index-ByyRxa_r.js.gz +0 -0
- package/bin/v2/assets/index-C6QuNI4z.js.br +0 -0
- package/bin/v2/assets/index-C6QuNI4z.js.gz +0 -0
- package/bin/v2/assets/index-CBi-wV4i.js.br +0 -0
- package/bin/v2/assets/index-CBi-wV4i.js.gz +0 -0
- package/bin/v2/assets/index-D4ivKf0F.js.br +0 -0
- package/bin/v2/assets/index-D4ivKf0F.js.gz +0 -0
- package/bin/v2/assets/index-D52Nl5Gj.js.br +0 -0
- package/bin/v2/assets/index-D52Nl5Gj.js.gz +0 -0
- package/bin/v2/assets/index-D5P52Re7.js.br +0 -0
- package/bin/v2/assets/index-D5P52Re7.js.gz +0 -0
- package/bin/v2/assets/index-DQ7hoPJc.js.br +0 -0
- package/bin/v2/assets/index-DQ7hoPJc.js.gz +0 -0
- package/bin/v2/assets/index-DYvN8rpK.js.br +0 -0
- package/bin/v2/assets/index-DYvN8rpK.js.gz +0 -0
- package/bin/v2/assets/index-Dy0IWUpN.css.br +0 -0
- package/bin/v2/assets/index-Q9HuFPqC.js.br +0 -0
- package/bin/v2/assets/index-Q9HuFPqC.js.gz +0 -0
- package/bin/v2/assets/index-eXVgoPmr.js.br +0 -0
- package/bin/v2/assets/index-eXVgoPmr.js.gz +0 -0
- package/bin/v2/assets/portrait-BzejVzFs.js.br +0 -0
- package/bin/v2/assets/portrait-BzejVzFs.js.gz +0 -0
package/bin/octiq-server
CHANGED
|
Binary file
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as k,b as A,l as s,W as re,m as ee,F as se,n as te}from"./index-CzmdQnci.js";const U=e=>e&&typeof e=="object"?e:{},N=(e,t="")=>typeof e=="string"?e:t,z=e=>typeof e=="number"&&Number.isFinite(e)&&e>=0?e:0,W=e=>typeof e=="number"&&Number.isFinite(e)&&e>=0?e:null;function oe(e){const t=U(e);if(!N(t.scanId))return null;const u=new Set,h=(Array.isArray(t.items)?t.items:[]).flatMap(r=>{const l=U(r),x=N(l.id);if(!x||u.has(x))return[];u.add(x);const m=l.worktree?U(l.worktree):null;return[{id:x,key:N(l.key,x),group:l.group==="clean"||l.group==="review"?l.group:"work",kind:N(l.kind),label:N(l.label,N(l.kind,"Folder")),path:N(l.path),bytes:z(l.bytes),effect:N(l.effect),note:N(l.note),notRecommended:l.notRecommended===!0,action:["tool","docker","worktree","rm","rmOlderThan"].includes(N(U(l.action).type))?l.action:null,previousBytes:W(l.previousBytes),grew:l.grew===!0,worktree:m?{repo:N(m.repo),branch:N(m.branch),clean:typeof m.clean=="boolean"?m.clean:void 0,merged:typeof m.merged=="boolean"?m.merged:void 0,mainline:typeof m.mainline=="boolean"?m.mainline:void 0,inUse:typeof m.inUse=="boolean"?m.inUse:void 0,eligible:typeof m.eligible=="boolean"?m.eligible:void 0,idleDays:W(m.idleDays)??void 0,ignoredBytes:z(m.ignoredBytes)}:void 0}]});return{scanId:N(t.scanId),scannedAt:z(t.scannedAt),platform:t.platform==="macos"||t.platform==="windows"||t.platform==="linux"?t.platform:"unknown",home:N(t.home),thresholdBytes:z(t.thresholdBytes),totalBytes:W(t.totalBytes)??h.reduce((r,l)=>r+l.bytes,0),items:h,skipped:(Array.isArray(t.skipped)?t.skipped:[]).map(r=>{const l=U(r);return{path:N(l.path),reason:N(l.reason,"Unknown reason")}}),previousScanAt:W(t.previousScanAt)}}function ne(e){const t=U(e);return N(t.scanId)?{scanId:N(t.scanId),startedAt:z(t.startedAt),phase:N(t.phase,"home"),entries:z(t.entries),bytes:z(t.bytes),path:N(t.path)}:null}function ce(e){const t=U(e);return{running:ne(t.running),report:oe(t.report)}}function de(e,t){return e.filter(u=>u.group===t).sort((u,h)=>h.bytes-u.bytes)}function L(e){return e.group!=="work"&&e.action!==null}function ue(e,t){const u=new Set(e),h=t.filter(L),r=h.every(l=>e.has(l.id));return h.forEach(l=>r?u.delete(l.id):u.add(l.id)),u}function he(e,t,u){const h=e.filter(r=>L(r)&&t.has(r.id));return{ids:h.map(r=>r.id),count:h.length,bytes:h.reduce((r,l)=>r+l.bytes,0),skippedCount:h.filter(r=>!u&&(!r.action||r.action.type==="rm"||r.action.type==="rmOlderThan")).length}}function B(e){const t=z(e);return t<1e6?`${(t/1e3).toLocaleString("en-US",{maximumFractionDigits:0})} KB`:t<1e9?`${(t/1e6).toLocaleString("en-US",{maximumFractionDigits:1})} MB`:`${(t/1e9).toLocaleString("en-US",{maximumFractionDigits:2})} GB`}function P(e){if(!e)return"an unknown date";const t=new Date(e<1e12?e*1e3:e);return Number.isNaN(t.getTime())?"an unknown date":t.toLocaleString("en-US",{dateStyle:"medium",timeStyle:"short"})}const F={clean:"Safe to clean",review:"Review first",work:"Your work"};function q(e,t,u){if(!(t>0&&u>0&&Number.isFinite(t*u)))return[];const h=e.filter(a=>a.bytes>0&&Number.isFinite(a.bytes)),r=h.reduce((a,b)=>Math.max(a,b.bytes),0),l=h.reduce((a,b)=>a+b.bytes/r,0),x=h.map(a=>({id:a.id,area:a.bytes/r/l*t*u})),m=[];let j=0,g=0,p=t,i=u,o=0;const f=(a,b)=>{const w=a.reduce((c,d)=>c+d.area,0),n=a.map(c=>c.area);return Math.max(b*b*Math.max(...n)/(w*w),w*w/(b*b*Math.min(...n)))};for(;o<x.length;){const a=[x[o++]],b=Math.min(p,i);for(;o<x.length&&f([...a,x[o]],b)<=f(a,b);)a.push(x[o++]);const w=a.reduce((y,v)=>y+v.area,0),n=p>=i,c=w/(n?i:p);let d=0;a.forEach((y,v)=>{const R=v===a.length-1?(n?i:p)-d:y.area/c;m.push({id:y.id,x:j+(n?0:d),y:g+(n?d:0),width:n?c:R,height:n?R:c}),d+=R}),n?(j+=c,p=Math.max(0,t-j)):(g+=c,i=Math.max(0,u-g))}return m}function pe(e,t,u=.015){const h=[];for(const r of["clean","review","work"]){const l=new Map;for(const i of e){if(i.group!==r||!(i.bytes>0&&Number.isFinite(i.bytes)))continue;const o=l.get(i.kind)??[];o.push(i),l.set(i.kind,o)}const x=(i,o,f)=>({id:i,group:r,label:o,items:[...f].sort((a,b)=>b.bytes-a.bytes),bytes:f.reduce((a,b)=>a+b.bytes,0),selectedCount:f.filter(a=>L(a)&&t.has(a.id)).length}),m=[...l].map(([i,o])=>{const f=o.length===1?o[0].label:i==="git-worktree"?"Linked Git worktrees":o.every(a=>a.label===o[0].label)?o[0].label:(i.replace(/[-_]/g," ")||"Folders").replace(/^./,a=>a.toUpperCase());return x(JSON.stringify([r,i]),f,o)}),j=m.reduce((i,o)=>i+o.bytes,0),g=m.filter(i=>i.bytes/j<u),p=m.filter(i=>i.bytes/j>=u);g.length&&p.push(x(JSON.stringify([r,null]),"Other",g.flatMap(i=>[...i.items]))),h.push(...p.sort((i,o)=>o.bytes-i.bytes||i.id.localeCompare(o.id)))}return h}const K=(e,t)=>t.bytes-e.bytes||e.id.localeCompare(t.id);function T(e,t,u){return{id:u,label:t,group:e[0].group,bytes:e.reduce((h,r)=>h+r.bytes,0),selectedCount:e.reduce((h,r)=>h+r.selectedCount,0),items:e.flatMap(h=>[...h.items]).sort((h,r)=>r.bytes-h.bytes)}}function me(e,t,u,h){const r=["clean","review","work"].flatMap(g=>{const p=e.filter(i=>i.group===g);return p.length?[T(p,F[g],JSON.stringify([g]))]:[]}),l=(g,p)=>{const i=h(p);return g.width>=i.width&&g.height>=i.height},x=[],m=new Map(r.map(g=>[g.id,e.filter(p=>p.group===g.group).sort(K)]));let j=r;for(;;){const g=q(j,t,u),p=[];let i=!1;for(const o of j){const f=g.find(d=>d.id===o.id);if(!f||!l(f,o)){x.push(o),m.delete(o.id),i=!0;continue}let a=m.get(o.id);const b=q(a,f.width,f.height),w=a.filter(d=>!l(b.find(y=>y.id===d.id),d));if(!w.length){p.push({box:f,tiles:b.map(d=>({...a.find(y=>y.id===d.id),...d}))});continue}if(i=!0,a.length===1){m.set(o.id,[o]);continue}const n=JSON.stringify([o.group,null]),c=a.find(d=>d.id===n);if(c&&w.every(d=>d===c))x.push(c),a=a.filter(d=>d!==c);else{const d=a.filter(v=>v!==c).at(-1);a=a.filter(v=>v!==d&&v!==c);const y=x.findIndex(v=>v.id===n);y>=0?x[y]=T([d,x[y]],"Other",n):(a.push(T(c?[d,c]:[d],"Other",n)),a.sort(K)),a.length===1&&(a=[T(a,o.label,o.id)])}m.set(o.id,a)}if(!i)return{regions:p,summaries:x};j=j.filter(o=>m.has(o.id)).map(o=>T(m.get(o.id),o.label,o.id))}}const V=e=>String(e?.message??e);function fe(e){const[t,u]=k.useState({running:null,report:null}),[h,r]=k.useState(null),[l,x]=k.useState(!1),[m,j]=k.useState(!0),g=k.useRef(0),p=k.useRef(!1),i=k.useRef(t),o=k.useRef(new Set),f=k.useCallback(w=>{i.current=w,u(w)},[]),a=k.useCallback(async()=>{const w=++g.current;try{const n=await A.invoke("disk_scan_state",{});if(!p.current||w!==g.current)return;const c=ce(n);c.running&&o.current.has(c.running.scanId)&&(c.running=null),f(c),r(null)}catch(n){p.current&&w===g.current&&r(V(n))}finally{p.current&&w===g.current&&j(!1)}},[f]);k.useEffect(()=>(p.current=!0,()=>{p.current=!1,++g.current}),[]),k.useEffect(()=>{if(!e){j(!1);return}const w=A.on("disk-scan-progress",c=>{const d=ne(c);!d||o.current.has(d.scanId)||i.current.running&&i.current.running.scanId!==d.scanId||(++g.current,f({...i.current,running:d}),j(!1))}),n=A.on("disk-scan-done",c=>{c?.scanId&&(o.current.add(c.scanId),i.current.running?.scanId===c.scanId&&f({...i.current,running:null}),a().then(()=>{p.current&&c.error&&r(String(c.error))}))});return a(),()=>{w(),n(),++g.current}},[e,a,f]);const b=k.useCallback(async()=>{if(!e||l)return;x(!0),r(null);const w=i.current.running;try{await A.invoke(w?"disk_scan_cancel":"disk_scan_start",w?{scanId:w.scanId}:{}),p.current&&await a()}catch(n){p.current&&r(V(n))}finally{p.current&&x(!1)}},[e,l,a]);return{...t,error:h,pending:l,loading:m,scan:b}}function Se({connected:e,onClose:t}){const u=fe(e);return s.jsx(ke,{...u,connected:e,onScan:()=>{u.scan()},onClose:t})}const ge=[],Q=new Set;function ke({report:e,running:t=null,error:u,pending:h=!1,loading:r=!1,connected:l=!0,onScan:x,onClose:m}){const[j,g]=k.useState({scanId:"",ids:Q}),[p,i]=k.useState(null),o=!!e&&p===e.scanId,[f,a]=k.useState(null),[b,w]=k.useState(null),[n,c]=k.useState(!1),d=k.useRef(e?.scanId);d.current=e?.scanId;const y=k.useRef(!0);k.useEffect(()=>(y.current=!0,()=>{y.current=!1}),[]),k.useEffect(()=>{a(null),w(null)},[e?.scanId]);const v=k.useRef(new Map),R=e?.items??ge,M=j.scanId===e?.scanId?j.ids:Q,D=he(R,M,o),G=S=>{e&&g({scanId:e.scanId,ids:S})},[Y,J]=k.useState(null),O=Y?.scanId===e?.scanId?Y:null,ae=S=>{J({scanId:e.scanId,ids:new Set(S.items.map(E=>E.id)),label:S.label});const I=v.current.get(S.items[0].id);I?.scrollIntoView({block:"center",behavior:"instant"}),I?.focus({preventScroll:!0})},_=l?t?"Wait for the scan to finish before downloading a script.":D.count?null:"Select at least one item to download a script.":"Connect to the host to download a script.",le=async()=>{if(!e||_||n)return;const S=e.scanId;c(!0),w(null);try{const I=await A.invoke("disk_cleanup_script",{scanId:S,itemIds:D.ids,allowRm:o});if(!y.current||d.current!==S)return;if(typeof I?.script!="string"||typeof I?.fileName!="string"||!I.fileName)throw new Error("The host did not return a cleanup script.");const E=I.fileName.split(/[\\/]/).pop()||(e.platform==="windows"?"disk-cleanup.ps1":"disk-cleanup.sh"),$=URL.createObjectURL(new Blob([I.script],{type:"text/plain;charset=utf-8"})),C=document.createElement("a");C.href=$,C.download=E,document.body.append(C),C.click(),C.remove(),window.setTimeout(()=>URL.revokeObjectURL($),1e3),a({scanId:S,fileName:E})}catch(I){y.current&&d.current===S&&w(String(I?.message??I))}finally{y.current&&c(!1)}},H=f?.scanId===e?.scanId?f?.fileName:e?.platform==="windows"?"disk-cleanup.ps1":"disk-cleanup.sh";return s.jsxs("section",{className:"disk-page","aria-label":"Disk report",children:[s.jsx(re,{root:!0,title:s.jsx("h1",{children:"Disk"}),back:{label:"Chat",onClick:m},actions:s.jsx("button",{className:`disk-button${t?" is-scanning":""}`,type:"button",disabled:!l||h||r,onClick:x,children:h?t?"Cancelling…":"Starting…":t?"Cancel scan":"Scan"})}),s.jsxs("div",{className:"disk-body",children:[s.jsxs("div",{className:"disk-intro",children:[s.jsxs("div",{children:[s.jsx("h2",{children:"Development leftovers"}),s.jsx("p",{children:"Manual scans of your home folder and system temp. Metadata, Git and open-file checks only."})]}),e&&s.jsxs("div",{className:"disk-total",children:[s.jsx("strong",{children:B(e.totalBytes)}),s.jsxs("span",{children:[e.platform==="macos"?"macOS":e.platform==="windows"?"Windows":e.platform==="linux"?"Linux":"Unknown platform"," · Last scanned ",P(e.scannedAt)]})]})]}),s.jsx("p",{className:"disk-promise",children:"OctiqFlow never deletes anything. You choose items, download a cleanup script and run it yourself."}),!l&&s.jsx("p",{className:"disk-message",role:"status",children:"Connect to the host to scan."}),u&&s.jsx("p",{className:"disk-error",role:"alert",children:u}),t&&s.jsxs("div",{className:"disk-progress",role:"status",children:[s.jsx("span",{className:"disk-progress-mark","aria-hidden":"true"}),s.jsxs("span",{children:["Scanning ",be(t.phase)," · ",t.entries.toLocaleString("en-US")," entries · ",B(t.bytes)," counted"]})]}),r&&!e&&s.jsx("p",{className:"disk-message",children:"Reading the last report…"}),!e&&!r&&s.jsxs("div",{className:"disk-empty",children:[s.jsx("h2",{children:"No scan yet"}),s.jsx("p",{children:"Scan when you want to review large development leftovers. Nothing is selected automatically."})]}),e&&s.jsxs(s.Fragment,{children:[s.jsxs("p",{className:"disk-threshold",children:["Items ≥ ",B(e.thresholdBytes)," · Size history: ",s.jsx("code",{children:"~/disk-report/sizes.csv"}),e.previousScanAt?` · Compared with ${P(e.previousScanAt)}`:" · First recorded scan"]}),s.jsxs("div",{className:"disk-layout",children:[s.jsxs("div",{className:"disk-map-column",children:[s.jsx(xe,{items:R,selected:M,onFocus:ae}),s.jsx("p",{className:"disk-map-help",children:"Area represents size. Choose a cleanup tile to highlight its rows. Your work is labelled only."})]}),s.jsxs("div",{className:"disk-list-column",children:[O&&s.jsxs("div",{className:"disk-found",role:"status",children:[O.label," · ",O.ids.size," ",O.ids.size===1?"row":"rows"," highlighted ",s.jsx("button",{type:"button",onClick:()=>J(null),children:"Clear highlight"})]}),["clean","review"].map(S=>{const I=de(R,S),E=I.filter(L);return s.jsxs("section",{className:`disk-section disk-${S}`,"aria-label":F[S],children:[s.jsxs("div",{className:"disk-section-heading",children:[s.jsxs("h2",{children:[F[S]," ",s.jsx("span",{children:I.length})]}),s.jsxs("label",{className:"disk-tick-all",children:[s.jsx("input",{type:"checkbox",checked:E.length>0&&E.every($=>M.has($.id)),disabled:!E.length,onChange:()=>G(ue(M,I))}),"Select all",s.jsxs("span",{className:"sr-only",children:[" ",F[S]]})]})]}),!I.length&&s.jsx("p",{className:"disk-message",children:"No items in this section."}),I.map($=>s.jsx(ye,{item:$,highlighted:O?.ids.has($.id),previousScanAt:e.previousScanAt,checked:M.has($.id),onTick:()=>{if(!L($))return;const C=new Set(M);C.has($.id)?C.delete($.id):C.add($.id),G(C)},rowRef:C=>{C?v.current.set($.id,C):v.current.delete($.id)}},`${e.scanId}:${$.id}`))]},S)}),s.jsx(ve,{report:e}),s.jsxs("section",{className:"disk-controls","aria-label":"Cleanup script",children:[s.jsxs("label",{className:"disk-rm-switch",children:[s.jsx("input",{type:"checkbox",role:"switch",checked:o,onChange:S=>i(S.target.checked?e.scanId:null)}),s.jsx("span",{children:"Use rm -rf for items with no tool command"})]}),s.jsx("p",{children:o?e.platform==="windows"?"The script can use PowerShell Remove-Item for these items.":"The script can use rm -rf for these items.":"Items with no tool command are printed as Skipped."}),s.jsxs("div",{className:"disk-download-row",children:[s.jsxs("strong",{children:[D.count," selected · ",B(D.bytes)]}),s.jsx("button",{className:"disk-button",type:"button",disabled:!!_||n,"aria-describedby":"disk-download-reason",onClick:()=>{le()},children:n?"Preparing script…":"Download cleanup script"})]}),D.skippedCount>0&&s.jsxs("p",{children:[D.skippedCount," selected ",D.skippedCount===1?"item will":"items will"," be printed as Skipped."]}),s.jsx("p",{id:"disk-download-reason",children:_??"Review the script before running it."}),b&&s.jsx("p",{className:"disk-error",role:"alert",children:b}),s.jsxs("p",{className:"disk-run-example",children:["Run it in your terminal, for example: ",s.jsx("code",{children:e.platform==="windows"?`powershell -File "$HOME\\Downloads\\${H}"`:`bash ~/Downloads/${H}`})]})]})]})]})]})]})]})}function be(e){return{home:"home folder",temp:"system temp",git:"Git worktrees",history:"size history"}[e]??e}function X(e,t,u){return{left:`${e.x/t*100}%`,top:`${e.y/u*100}%`,width:`${e.width/t*100}%`,height:`${e.height/u*100}%`}}function xe({items:e,selected:t,onFocus:u}){const h=k.useRef(null),[r,l]=k.useState(0),[x,m]=k.useState(null),[j,g]=we();k.useLayoutEffect(()=>{const n=h.current;if(!n)return;l(n.getBoundingClientRect().width);const c=new ResizeObserver(d=>{const y=d[0]?.contentRect.width;y>0&&l(y)});return c.observe(n),()=>c.disconnect()},[]);const p=Math.max(340,Math.min(520,r*1.1)),i=k.useMemo(()=>pe(e,t),[e,t]),o=k.useMemo(()=>["clean","review","work"].map(n=>({id:n,bytes:i.filter(c=>c.group===n).reduce((c,d)=>c+d.bytes,0)})),[i]),f=k.useMemo(()=>j?me(i,r,p,j):{regions:[],summaries:i},[i,r,p,j]),a=[...f.regions.flatMap(n=>n.tiles),...f.summaries],b=a.find(n=>n.id===x),w=(n,c)=>{const d=Z(n),y=!c,v=y?s.jsxs(s.Fragment,{children:[s.jsxs("span",{className:"disk-tile-label",children:[n.label,n.label==="Other"?` in ${F[n.group]}`:""," · ",n.items.length," ",n.items.length===1?"item":"items"]}),s.jsx("span",{className:"disk-tile-size",children:ie(n)})]}):s.jsx(je,{entry:n}),R=`${d}
|
|
2
|
+
${n.items.length===1?n.items[0].path:`${n.items.length} items in ${F[n.group]}`}`,M={onMouseEnter:()=>{h.current?.parentElement?.contains(document.activeElement)||m(n.id)},onFocus:()=>m(n.id)},D=`${y?"disk-map-summary":"disk-tile"} disk-${n.group}${n.group==="work"?" is-work":""}${n.selectedCount?" is-selected":""}`;return n.group==="work"?s.jsx("div",{className:D,style:c,title:R,"aria-label":`${d}. Your work is labelled only.`,tabIndex:0,...M,children:v},n.id):s.jsx("button",{type:"button",className:D,style:c,title:R,"aria-label":`${d}. Find in ${F[n.group]}`,onClick:()=>u(n),...M,children:v},n.id)};return s.jsxs("section",{className:"disk-map-panel","aria-label":"Disk size treemap",children:[s.jsx("h2",{children:"Where the space goes"}),s.jsx("div",{className:"disk-map-legend",children:o.map(n=>s.jsxs("span",{className:`disk-${n.id}`,children:[s.jsx("i",{"aria-hidden":"true"}),F[n.id]," · ",B(n.bytes)]},n.id))}),g,s.jsx("div",{className:"disk-map",ref:h,style:{height:f.regions.length?p:0},children:f.regions.map(({box:n,tiles:c})=>s.jsx("div",{className:`disk-map-region disk-${c[0].group}`,style:X(n,r,p),"aria-label":F[c[0].group],children:c.map(d=>w(d,X(d,n.width,n.height)))},n.id))}),!i.length&&s.jsx("p",{className:"disk-message",children:"No large development leftovers found."}),!!f.summaries.length&&s.jsxs("div",{className:"disk-map-summaries","aria-label":"Groups summarized outside the map",children:[j&&s.jsx("p",{className:"disk-message",children:"Small items are summarized here. Map area represents only the items shown above."}),f.summaries.map(n=>w(n))]}),a.some(n=>n.selectedCount>0)&&s.jsx("p",{className:"disk-map-ticked","aria-live":"polite",children:a.filter(n=>n.selectedCount>0).map(n=>`${n.label} · ${n.selectedCount} ticked`).join("; ")}),s.jsx("div",{className:"disk-map-inspector","aria-live":"polite",children:b?s.jsxs(s.Fragment,{children:[s.jsx("strong",{children:Z(b)}),s.jsx("code",{children:b.items.length===1?b.items[0].path:`${b.items.length} items in ${F[b.group]}${b.group==="work"?" · Your work is labelled only.":" · Choose to highlight their rows."}`})]}):"Hover or focus a tile to see its full name, count and size."})]})}function Z(e){return`${e.label}, ${e.items.length} ${e.items.length===1?"item":"items"}, ${B(e.bytes)}${e.selectedCount?`, ${e.selectedCount} ticked`:""}`}function ie(e){return`${B(e.bytes)}${e.selectedCount?` · ${e.selectedCount} ticked`:""}`}function we(){const e=k.useRef(null),t=k.useRef(null),[u,h]=k.useState(null);return k.useLayoutEffect(()=>{const r=e.current,l=t.current;if(!r||!l)return;let x=!0,m="";const j=()=>{if(!x)return;const p=getComputedStyle(r),i=getComputedStyle(l),o=r.getBoundingClientRect(),f=l.getBoundingClientRect(),a=[p.font,i.font,p.letterSpacing,i.letterSpacing,o.width,o.height,f.width,f.height].join("|");if(a===m)return;m=a;const b=document.createElement("canvas").getContext("2d");if(!b)return;const w=(y,v)=>(b.font=v.font,b.measureText(y).width+(parseFloat(v.letterSpacing)||0)*y.length),n={font:p.font,letterSpacing:p.letterSpacing},c={font:i.font,letterSpacing:i.letterSpacing},d=Math.max(..."0123456789".split("").map(y=>w(y,c)));h(()=>y=>{const v=y.items.filter(L).length,R=w(B(y.bytes),c)+(v?w(" · ticked",c)+String(v).length*d:0),M=w(`${y.label.split(/\s+/)[0].slice(0,10)}…`,n);return{width:Math.ceil(Math.max(R,M))+26,height:Math.ceil(o.height+f.height)+6+26}})},g=new ResizeObserver(j);return g.observe(r),g.observe(l),j(),document.fonts.ready.then(j),()=>{x=!1,g.disconnect()}},[]),[u,s.jsxs("span",{className:"disk-map-probes","aria-hidden":"true",children:[s.jsx("span",{className:"disk-tile-label",ref:e,children:"Overview…"}),s.jsx("span",{className:"disk-tile-size",ref:t,children:"888.8 GB · 888 ticked"})]},"font-probes")]}function je({entry:e}){return s.jsxs("span",{className:"disk-tile-content","data-fit":"full","aria-hidden":"true",children:[s.jsxs("span",{className:"disk-tile-label disk-tile-visible-label",children:[e.label,e.items.length>1?` · ${e.items.length} items`:""]}),s.jsx("span",{className:"disk-tile-size disk-tile-visible-size",children:ie(e)})]})}function ye({item:e,checked:t,highlighted:u,onTick:h,previousScanAt:r,rowRef:l}){const x=ee(e.id),m=k.useId(),j=L(e),g=e.effect.length>200,p=(e.note?.length??0)>200,i=e.worktree,o=i?[{label:"Working tree clean",pass:i.clean},{label:"Merged to mainline",pass:i.merged},{label:"Not a mainline worktree",pass:i.mainline===void 0?void 0:!i.mainline},{label:"Not in use",pass:i.inUse===void 0?void 0:!i.inUse}]:[];return s.jsxs("article",{ref:l,tabIndex:-1,className:`disk-item${t?" is-selected":""}${u?" is-found":""}`,"aria-label":e.label,children:[s.jsxs("div",{className:"disk-item-heading",children:[s.jsxs("label",{children:[s.jsx("input",{type:"checkbox",checked:j&&t,"aria-disabled":!j||void 0,"aria-describedby":!j||e.notRecommended?m:void 0,onChange:()=>{j&&h()}}),s.jsx("strong",{children:e.label})]}),s.jsx("strong",{className:"disk-item-size",children:B(e.bytes)})]}),s.jsx("code",{className:"disk-path",title:e.path,children:e.path}),(!j||e.notRecommended)&&s.jsx("p",{id:m,className:"disk-not-recommended",children:e.notRecommended?"Not recommended to delete":"No safe cleanup command for this item"}),!g&&e.effect&&s.jsx("p",{children:e.effect}),!p&&e.note&&s.jsx("p",{className:"disk-note",children:e.note}),e.grew&&e.previousBytes!==null&&e.bytes>e.previousBytes&&s.jsxs("p",{className:"disk-growth",children:["+",((e.bytes-e.previousBytes)/1e6).toLocaleString("en-US",{maximumFractionDigits:1})," MB since ",P(r)]}),i&&s.jsxs(s.Fragment,{children:[s.jsx("ul",{className:"disk-worktree-facts",children:o.map(f=>s.jsxs("li",{className:f.pass===!0?"is-pass":"is-fail",children:[s.jsx("span",{children:f.pass===!0?"✓ Pass":f.pass===!1?"✕ Fail":"? Unknown"})," ",f.label]},f.label))}),!!i.ignoredBytes&&s.jsxs("p",{className:"disk-not-recommended",children:["Includes ",B(i.ignoredBytes)," of ignored files. Git does not protect these files."]})]}),s.jsx(se,{fold:x,labels:["Full path",g&&`Effect · ${e.effect.length} characters`,p&&`Note · ${e.note.length} characters`,i&&"Worktree details"],what:`details for ${e.label}`}),s.jsxs(te,{fold:x,bounded:!1,children:[s.jsx("code",{className:"disk-full-path",children:e.path}),g&&s.jsx("p",{children:e.effect}),p&&s.jsx("p",{children:e.note}),i&&s.jsxs("p",{children:["Repository: ",s.jsx("code",{children:i.repo||"Unknown"}),s.jsx("br",{}),"Branch: ",s.jsx("code",{children:i.branch||"Unknown"}),s.jsx("br",{}),"Idle: ",i.idleDays??"Unknown"," days · Eligible: ",i.eligible===void 0?"Unknown":i.eligible?"Yes":"No"]})]})]})}function ve({report:e}){const t=ee(`${e.scanId}:skipped`);return s.jsxs("div",{className:"disk-skipped",children:[s.jsx(se,{fold:t,labels:[`${e.skipped.length} folders skipped`],what:"skipped folders"}),s.jsxs(te,{fold:t,bounded:!1,children:[s.jsx("ul",{children:e.skipped.map((u,h)=>s.jsxs("li",{children:[s.jsx("code",{children:u.path}),s.jsx("p",{children:u.reason})]},h))}),!e.skipped.length&&s.jsx("p",{children:"No folders were skipped."})]})]})}export{xe as DiskMap,ke as DiskReportPage,Se as default};
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.disk-page{display:flex;flex:1;min-width:0;min-height:0;flex-direction:column;color:var(--fg-1);background:var(--bg-0)}.disk-page h1{margin:0;font-size:16px}.disk-page h2{margin:0;color:var(--fg-0);font-size:16px;font-weight:600}.disk-page p{margin:8px 0;line-height:1.55;overflow-wrap:anywhere}.disk-page code{font-family:var(--mono);font-size:12px;overflow-wrap:anywhere}.disk-page .sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}.disk-body{flex:1;overflow:auto;min-height:0;padding:24px;scrollbar-gutter:stable}.disk-intro{display:flex;align-items:flex-start;justify-content:space-between;gap:20px}.disk-intro h2{font-size:22px}.disk-intro p,.disk-promise,.disk-threshold,.disk-map-help,.disk-message{color:var(--fg-2);font-size:13px}.disk-total{display:flex;flex-direction:column;gap:6px;text-align:right;font-size:12px;color:var(--fg-2)}.disk-total strong{color:var(--fg-0);font-size:24px;font-variant-numeric:tabular-nums}.disk-page .disk-promise{margin:12px 0 20px}.disk-layout{display:grid;grid-template-columns:minmax(280px,1fr) minmax(320px,1.1fr);gap:24px;align-items:start;margin-top:18px}.disk-map-column{position:sticky;top:0;min-width:0}.disk-map-column:has(.disk-map-summaries){position:static}.disk-map-panel,.disk-section,.disk-controls{border:1px solid var(--border);border-radius:var(--r-md);background:var(--bg-1);padding:16px;min-width:0}.disk-map-legend{display:flex;flex-wrap:wrap;gap:8px 16px;font-size:12px;margin:14px 0}.disk-map-legend>span{display:flex;align-items:center;gap:6px;color:var(--fg-1)}.disk-clean{--disk-state: var(--ok)}.disk-review{--disk-state: var(--warn)}.disk-work{--disk-state: var(--fg-2)}.disk-map-legend i{width:8px;height:8px;border-radius:2px;background:var(--disk-state)}.disk-map{position:relative;width:100%}.disk-map-region{position:absolute}.disk-map,.disk-map-region{transition-property:none}.disk-tile{position:absolute;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:6px;padding:0;min-width:0;min-height:0;overflow:hidden;border:2px solid var(--bg-1);border-radius:5px;background:color-mix(in srgb,var(--disk-state) 17%,var(--bg-1));box-shadow:inset 3px 0 var(--disk-state);color:var(--fg-0);text-align:left;font-size:13px;cursor:pointer}.disk-tile,.disk-map-summary{transition-property:background-color,border-color,box-shadow,color}.disk-tile.is-work{cursor:default}.disk-tile-content{position:absolute;inset:10px;display:flex;flex-direction:column;justify-content:center;gap:6px;min-width:0}.disk-tile-label{display:block;flex:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:600;line-height:20px}.disk-tile-size{display:block;flex:none;white-space:nowrap;font-size:12px;line-height:18px;color:var(--fg-1)}.disk-map-probes{position:absolute;visibility:hidden;width:max-content;pointer-events:none;font-size:13px}.disk-map-summaries{display:grid;gap:8px}.disk-map-summary{display:flex;flex-direction:column;gap:6px;width:100%;min-width:0;border:1px solid var(--border);border-radius:5px;padding:10px 12px;background:var(--bg-2);color:var(--fg-0);text-align:left;font-size:13px;cursor:pointer}.disk-map-summary.is-work{cursor:default}.disk-map-summary .disk-tile-label,.disk-map-summary .disk-tile-size{white-space:normal;overflow-wrap:anywhere}.disk-map-summary.is-selected{border-color:var(--disk-state)}.disk-tile.is-selected{box-shadow:inset 0 0 0 2px var(--disk-state);background:color-mix(in srgb,var(--disk-state) 28%,var(--bg-1))}.disk-tile:hover{background:color-mix(in srgb,var(--disk-state) 25%,var(--bg-1))}.disk-tile:focus-visible{z-index:1}.disk-map-inspector{min-height:58px;padding-top:12px;font-size:12px;color:var(--fg-2);overflow-wrap:anywhere}.disk-map-inspector strong{color:var(--fg-1)}.disk-map-inspector code{display:block;margin-top:3px}.disk-list-column{display:flex;flex-direction:column;gap:16px;min-width:0}.disk-section-heading{display:flex;justify-content:space-between;align-items:center;gap:12px;margin-bottom:8px}.disk-section-heading h2{display:flex;align-items:center;gap:8px}.disk-section-heading h2:before{content:"";display:inline-block;width:3px;height:16px;background:var(--disk-state)}.disk-section-heading h2 span{color:var(--fg-2);font-size:12px}.disk-tick-all{display:inline-flex;align-items:center;gap:6px;font-size:12px;white-space:nowrap;min-height:32px}.disk-page input[type=checkbox]{width:16px;height:16px;flex-shrink:0;margin:0;accent-color:var(--decide);cursor:pointer}.disk-item{padding:16px 0;border-top:1px solid var(--border);font-size:13px;scroll-margin-block:20px}.disk-item.is-selected{border-top-color:var(--disk-state)}.disk-item-heading{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}.disk-item-heading label{display:flex;align-items:flex-start;gap:10px;color:var(--fg-0);min-width:0;cursor:pointer;line-height:1.4}.disk-item-heading label strong{overflow-wrap:anywhere}.disk-item-heading input{margin-top:2px!important}.disk-item-size{font-variant-numeric:tabular-nums;white-space:nowrap;color:var(--fg-1)}.disk-path{display:block;color:var(--fg-2);margin:8px 0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.disk-full-path{display:block;white-space:pre-wrap;color:var(--fg-1)}.disk-note{color:var(--fg-2)}.disk-not-recommended,.disk-growth{color:var(--warn)}.disk-growth{display:inline-block;margin-top:4px!important;border:1px solid color-mix(in srgb,var(--warn) 40%,var(--border));border-radius:var(--r-sm);padding:3px 6px;font-size:12px}.disk-worktree-facts{list-style:none;padding:0;margin:10px 0;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:7px 10px;font-size:12px}.disk-worktree-facts li{overflow-wrap:anywhere}.disk-worktree-facts span{display:block;margin-bottom:2px}.disk-worktree-facts .is-pass span{color:var(--ok)}.disk-worktree-facts .is-fail span{color:var(--warn)}.disk-skipped{padding:0 12px}.disk-skipped ul{list-style:none;padding:0;font-size:13px}.disk-skipped li{margin:12px 0}.disk-skipped code{display:block}.disk-controls{background:var(--bg-sunken)}.disk-rm-switch{display:flex;align-items:center;gap:10px;color:var(--fg-0);font-size:13px;cursor:pointer}.disk-controls p{color:var(--fg-2);font-size:12px}.disk-download-row{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:12px;margin-top:20px;font-size:13px}.disk-button{min-height:36px;border:1px solid var(--border-strong);border-radius:var(--r-sm);padding:8px 12px;background:var(--bg-2);color:var(--fg-0);font-size:13px;cursor:pointer}.disk-button:hover:not(:disabled){border-color:var(--fg-2)}.disk-button:disabled{cursor:default;opacity:.55}.disk-page .disk-error{color:var(--danger);font-size:13px}.disk-page .disk-run-example{margin-top:16px}.disk-run-example code{display:block;margin-top:4px;color:var(--fg-1)}.disk-progress{display:flex;align-items:center;gap:10px;padding:10px 0;color:var(--accent);font-size:13px}.disk-progress-mark{width:28px;height:2px;flex-shrink:0;background:var(--accent);transform-origin:left;animation:disk-scan 2s ease-in-out infinite alternate}.disk-button.is-scanning{border-color:var(--accent)}.disk-empty{padding:48px 0;color:var(--fg-2)}.disk-page :is(button,input,[tabindex]):focus-visible,.disk-item:focus{outline:2px solid var(--focus);outline-offset:2px}@keyframes disk-scan{0%{transform:scaleX(.25)}to{transform:scaleX(1)}}@media(prefers-reduced-motion:reduce){.disk-progress-mark{animation:none}}@media(max-width:859px){.disk-body{padding:16px}.disk-intro{flex-direction:column;gap:12px}.disk-total{text-align:left}.disk-layout{grid-template-columns:minmax(0,1fr);gap:16px}.disk-map-column{position:static}.disk-map-panel,.disk-section,.disk-controls{padding:14px}.disk-button,.disk-tick-all,.disk-rm-switch{min-height:44px}.disk-item-heading label{min-height:28px}.disk-download-row{align-items:stretch;flex-direction:column}.disk-page .workspace-actions.is-inline{padding:12px 16px 0}}.disk-found{padding:10px 12px;border:1px solid var(--border-strong);border-radius:var(--r-sm);background:var(--bg-2);color:var(--fg-1);font-size:12px}.disk-found button{margin-left:8px;border:0;padding:4px;background:transparent;color:var(--fg-0);text-decoration:underline;cursor:pointer}.disk-item.is-found{box-shadow:inset 3px 0 var(--disk-state);padding-inline:12px;background:var(--bg-2)}.disk-page .disk-map-ticked{margin:10px 0 0;color:var(--fg-1);font-size:12px}
|
|
Binary file
|
|
Binary file
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as I,b as qe,a as Mt,T as Re,c as Ve,d as Is,p as Ce,e as ce,C as Pe,o as Lt,f as gs,P as wt,g as Os,S as Ht,h as Ws,u as $s,i as Us,j as Bs,k as Fs,w as Et,l as x,W as Gs,A as Ks}from"./index-eXVgoPmr.js";import{G as he,B as ht,M as ze,a as O,c as ys,p as xs,C as Nt,b as ee,d as ct,A as It,S as lt,e as ws,R as zt,f as Ys,V as oe,g as Je,T as Ze,Q as qt,h as Zt,i as Me,j as Hs,P as qs,k as Zs,l as bs,m as H,N as Xs,n as Ot,o as Wt,q as Qs,r as Dt,s as Xe,t as Xt,I as Vs,u as Qt,D as Rt,v as ks,w as bt,x as Js,y as Ms,F as ei,z as ti,E as si,W as ii,H as ni,J as ai,K as oi,L as ri,O as ci,U as li,X as hi,Y as di,Z as ui,_ as Vt,$ as pi,a0 as fi,a1 as Jt,a2 as At,a3 as mi}from"./robot-CzDIvswk.js";const gi=o=>String(o?.message??o);function yi(o){const[e,t]=I.useState(null),[s,i]=I.useState(null),[n,a]=I.useState(null),r=I.useRef(null),l=I.useRef(0),h=I.useCallback(()=>{const p=++l.current;qe.invoke("island_get").then(c=>{if(p!==l.current||!c?.island)return;const d=c.island;r.current&&r.current.rev>d.rev||(r.current=d,t(d),i(null))}).catch(c=>{p===l.current&&i(gi(c))})},[]);I.useEffect(()=>{if(!o)return;h();const p=qe.on("island-changed",d=>{d&&(r.current&&d.rev<=r.current.rev||(a(d),h()))}),c=qe.on("chat-status",d=>{d?.key.startsWith("chat:island-wish-")&&h()});return()=>{p(),c()}},[o,h]);const m=I.useCallback(async(p,c={})=>{await qe.invoke(p,c),h()},[h]);return{island:e,error:s,change:n,reload:h,dismissWish:p=>m("island_wish_dismiss",{id:p}),grantWish:p=>m("island_wish_start",{id:p}),rollWish:()=>m("island_wish_roll"),inviteBot:()=>m("island_bot_invite"),farewell:p=>m("island_bot_farewell",{id:p}),setPace:p=>m("island_settings_set",{wishPace:p}),setBuildPace:p=>m("island_build_pace",{pace:p})}}function xi(o,e=Date.now()){const t=new Map;for(const s of o){const i=a=>s.activities.find(r=>r.state===a)?.title,n=s.state==="working"?{state:"working",label:i("working")}:s.state==="needs_you"?{state:"needs_you",label:i("needs_you")}:s.state==="failed"?{state:"failed",label:i("failed")}:{state:"free",...s.recent?{idleFor:Math.max(0,Math.round((e-s.recent.at)/6e4))}:{}};t.set(`agent:${s.id}`,n)}return t}function wi(o,e=Date.now()){const t=Math.max(0,Math.round((e-o)/6e4));if(t<1)return"just now";if(t<60)return`${t} min ago`;const s=Math.round(t/60);return s<24?`${s} h ago`:`${Math.round(s/24)} d ago`}function zs(o,e){const t=new Map;for(const c of[...e].sort((d,g)=>d.key.localeCompare(g.key))){const d=c.agent?.teamId?`team:${c.agent.teamId}`:"general";t.set(d,[...t.get(d)??[],c])}t.has("general")||t.set("general",[]);const s=[],i=o.assets.filter(c=>c.kind==="accessory"),n=[],a=[],r=new Map,l=o.plots.filter(c=>c.owner.kind==="home"&&c.owner.id.startsWith("public:")||o.placed.some(d=>d.plot===c.id&&o.assets.some(g=>g.id===d.asset&&g.kind==="building"&&g.name!=="Workshop"))),h=[];for(let c=1;h.length<t.size+l.length;c++)h.push(...Mt(c).filter(([d,g])=>(d!==-1||g!==0)&&(d!==0||g!==-1)));const m=(c,d,g)=>({shape:"box",size:c,at:d,color:g});for(const[c,[d,g]]of[...t].sort(([j],[b])=>j.localeCompare(b)).entries()){const[j,b]=h[c],k=Ve(j,b),f=`office:${d}`,E=d==="general"?"Agent Tower":`${g[0].agent?.teamName??"Team"} Office`,z={id:f,owner:{kind:"home",id:d},ring:Math.max(Math.abs(j),Math.abs(b),Math.abs(j+b)),slot:c,q:j,r:b,...k,facing:Math.atan2(-k.x,-k.z)*180/Math.PI,radius:Re,claimedAt:0,members:g.map(A=>A.owner.id),officeName:E};s.push(z);const _=Math.max(d==="general"?3:1,Math.ceil(g.length/6)),L=[];for(let A=0;A<_;A++){const S=A*2.3;L.push(m([8,.08,6],[0,S+.04,-.7],"#d6dce5")),L.push({...m([8,2,.14],[0,S+1,-3.6],"#b6c9dd"),finish:"glass"}),L.push({...m([.16,2.3,6],[-3.95,S+1.15,-.7],"#7a94b1"),finish:"glass"}),L.push({...m([.16,2.3,6],[3.95,S+1.15,-.7],"#7a94b1"),finish:"glass"});for(const N of[-2.7,0,2.7])L.push({...m([1.5,1,.025],[N,S+1.2,-3.51],"#b5e5fa"),finish:"glass"})}i.push({id:f,rev:_,name:E,kind:"building",parts:L,by:{name:"Island offices"},madeAt:0,updatedAt:0}),n.push({id:f,asset:f,plot:f,x:0,z:0,y:0,turn:0});for(const[A,S]of g.entries()){a.push({...S,plot:z});const N=`office-desk:${S.key}`,$=(A%3-1)*2.4,W=Math.floor(A%6/3)*2.5-2.4,X=Math.floor(A/6)*2.3;i.push({id:N,rev:Number.parseInt(S.look.trim.slice(1)+S.look.glow.slice(1),16),name:`${S.name}'s desk`,kind:"furniture",use:"desk",spot:{at:[0,0,.65],face:180},parts:[m([1.3,.08,.7],[0,.6,0],"#cfa783"),m([.12,.6,.12],[-.5,.3,0],S.look.trim),m([.12,.6,.12],[.5,.3,0],S.look.trim),m([.65,.42,.08],[0,.88,-.18],"#26354a"),{...m([.55,.32,.02],[0,.88,-.13],S.look.glow),finish:"glow"}],by:{name:S.name,agentId:S.owner.id},madeAt:0,updatedAt:0}),n.push({id:N,asset:N,plot:f,x:$,z:W,y:X,turn:0}),r.set(N,S.key);const Y=o.placed.filter(F=>F.plot===S.plot?.id).filter(F=>{const V=o.assets.find(ve=>ve.id===F.asset);return V&&V.kind!=="building"&&V.name!=="Workshop"&&V.name!=="Desk"&&V.use!=="bed"});for(const[F,V]of Y.entries()){const ve=o.assets.find(fe=>fe.id===V.asset);i.some(fe=>fe.id===ve.id)||i.push(ve);const ne=(A+F/Math.max(1,Y.length))/g.length*Math.PI*2;n.push({...V,plot:f,x:Math.sin(ne)*4.8,z:Math.cos(ne)*4.8,y:0})}}}for(const[c,d]of l.entries()){const[g,j]=h[t.size+c],b=Ve(g,j),k=o.placed.filter(z=>z.plot===d.id&&o.assets.some(_=>_.id===z.asset&&(d.owner.kind==="home"||_.kind==="building"&&_.name!=="Workshop"))),f=o.assets.find(z=>k.some(_=>_.asset===z.id)&&z.kind==="building"),E={...d,q:g,r:j,...b,ring:Math.max(Math.abs(g),Math.abs(j),Math.abs(g+j)),facing:Math.atan2(-b.x,-b.z)*180/Math.PI,officeName:f?.name??"Public project"};s.push(E),n.push(...k);for(const z of k){const _=o.assets.find(L=>L.id===z.asset);_&&!i.some(L=>L.id===_.id)&&i.push(_)}}const p=Math.max(30,o.radius,...s.map(c=>Math.hypot(c.x,c.z)+Re+4));return{island:{...o,plots:s,assets:i,placed:n,radius:p},residents:a,deskOwners:r}}function bi(){const o=new he;o.name="planted-seedlings";const e=new he;o.add(e);const t=new ht(1,1,1),s=new ze({color:"#88674b"}),i=new ze({color:"#64a856"}),n=new O(t,s);n.scale.set(.8,.035,.45),n.position.y=.02,o.add(n);for(const r of[-.26,0,.26]){const l=new O(t,i);l.scale.set(.025,.3,.025),l.position.set(r,.17,0),e.add(l);for(const h of[-1,1]){const m=new O(t,i);m.scale.set(.17,.045,.08),m.position.set(r+h*.07,.23,0),m.rotation.z=h*.4,e.add(m)}}let a=0;return{root:o,update(r,l){l&&(a=Math.min(1,a+r/12)),e.scale.setScalar(.12+a*.88),o.visible=a>0},dispose(){t.dispose(),s.dispose(),i.dispose()}}}const we=Ve(0,-1),ki={x:we.x,z:we.z-.8};function Mi(o){return{x:we.x+(o%4-1.5)*1.6,z:we.z+.6+Math.floor(o/4)*1}}function zi(){const o=new he;o.name="bot-society",o.position.set(we.x,.05,we.z);const e=new ht(1,1,1),t=new ze({color:"#ded8c9",roughness:.8}),s=new ze({color:"#caa45c",metalness:.5,roughness:.3}),i=new ze({color:"#b8e5f0",transparent:!0,opacity:.22,depthWrite:!1}),n=(c,d,g,j,b,k,f=t)=>{const E=new O(e,f);E.position.set(c,d,g),E.scale.set(j,b,k),o.add(E)};n(0,.05,0,8,.1,7),n(-3.9,1.2,0,.15,2.4,7,i),n(3.9,1.2,0,.15,2.4,7,i);for(const c of[-3.2,3.2])n(c,1.5,2.8,.45,3,.45),n(c,3.1,2.8,.75,.2,.75,s);n(0,3.15,2.8,6.8,.25,.35,s),n(0,.45,-1.6,3.2,.9,.65),n(0,.94,-1.6,3.5,.1,.9,s),n(0,.5,-3.7,2.4,1,1.8),n(0,1.07,-3.7,2.7,.15,2,s);const a=Is({id:"bot-society-statue",agent:"codex",model:"sol"}),r=ys({...a,shell:"#d7c592",trim:"#a98642",glow:"#fff2af",antenna:"crown"});xs(r,"raise",0,{calm:!0}),r.root.scale.setScalar(4.5),r.root.position.set(0,1.15,-3.7),o.add(r.root);const l=document.createElement("canvas");l.width=768,l.height=128;const h=l.getContext("2d");h.fillStyle="#f7e8bd",h.fillRect(0,0,768,128),h.fillStyle="#5d4828",h.font="bold 56px sans-serif",h.textAlign="center",h.fillText("BOT SOCIETY",384,80);const m=new Nt(l),p=new ee({map:m});return n(0,3.15,3.02,4.8,.8,.04,p),{root:o,solids:[{cx:we.x-3.9,cz:we.z,hx:.08,hz:3.5,yaw:0},{cx:we.x+3.9,cz:we.z,hx:.08,hz:3.5,yaw:0},{cx:we.x,cz:we.z-1.6,hx:1.7,hz:.45,yaw:0},{cx:we.x,cz:we.z-3.7,hx:1.4,hz:1.1,yaw:0}],dispose(){r.dispose(),e.dispose(),t.dispose(),s.dispose(),i.dispose(),m.dispose(),p.dispose()}}}function vi(o){if(o.kind==="accessory"||o.use==="none")return null;if(["read","paint","garden","perform","play","observe"].includes(o.use??""))return o.use;const e=o.name.toLowerCase();for(const[t,s]of[["garden",/garden|planter|greenhouse|seedling|herb|mint|花|种植|种子|盆栽|薄荷|温室|苗/],["paint",/easel|paint|画架|绘画|畫架/],["read",/library|bookshelf|bookcase|café|cafe|reading|书架|图书|書架|咖啡/],["perform",/music|concert|stage|piano|音乐|合奏|舞台|钢琴/],["play",/arcade|game|toy|游戏|玩具|游乐/],["observe",/lamp|light|灯|燈/]])if(s.test(e))return t;return/\b(chair|bench|stool|bed)\b|椅|凳|床/.test(e)&&!o.use?null:!o.use&&/\b(table|desk|workbench)\b|桌|工作台/.test(e)?/workbench|工作台/.test(e)?"play":"read":o.use==="desk"?/workbench|工作台/.test(e)?"play":"read":o.use==="seat"||o.use==="bed"?null:o.kind==="building"||o.kind==="furniture"||o.kind==="decor"?"observe":null}function _i(o,e,t){if(t.id.startsWith("office-desk:"))return null;const s=vi(o);if(!s||!o.parts.length)return null;const i=Math.max(...o.parts.map(c=>ct(c).max[2])),n=Math.max(0,...o.parts.map(c=>ct(c)).filter(c=>c.max[1]<=.35&&c.max[1]-c.min[1]<=.16).map(c=>c.max[1])),a=o.spot??(o.kind==="building"&&s!=="observe"?{at:[0,n,0],face:180}:{at:[0,0,i+.85],face:180}),r=t.turn*Math.PI/180,[l,h,m]=a.at,p=Ce(e,t.x+l*Math.cos(r)+m*Math.sin(r),t.z-l*Math.sin(r)+m*Math.cos(r));return{key:t.id,name:o.name,activity:s,...p,y:ce+t.y+h,face:(e.facing+t.turn+a.face)*Math.PI/180}}function es(o,e){const t={garden:"gardening",read:"reading",paint:"painting",perform:"music",play:"games"};return e==="observe"||!!o?.includes(t[e])}function Si(){const o=new he,e=new ht(1,1,1),t=["#f1e7cb","#6b86b6","#f5a14a","#76b9a5","#71c7ff"].map(m=>new ee({color:m})),s=(m,p,c)=>{const d=new he;d.name=m;const g=new O(e,t[c]);return g.scale.set(...p),d.add(g),o.add(d),d.visible=!1,d},i=s("read",[.32,.24,.05],1),n=s("paint",[.035,.32,.035],2),a=s("garden",[.22,.16,.17],3),r=s("register",[.24,.3,.02],0),l=s("play",[.25,.1,.1],1),h=new O(e,t[4]);return h.scale.set(.18,.035,.035),h.position.x=.16,a.add(h),{root:o,show(m){for(const p of[i,n,a,r,l])p.visible=p.name===m},dispose(){e.dispose(),t.forEach(m=>m.dispose())}}}function Pi(){const o=new he;o.name="concert-stage";const e=new ee({color:"#253044"}),t=new ee({color:"#9d8dff"}),s=new ee({color:"#c2a1ff",transparent:!0,opacity:.32,depthWrite:!1}),i=new ee({color:"#b997ff",transparent:!0,opacity:.13,depthWrite:!1,blending:It}),n=new lt(.75,20,12),a=new O(n,i);a.position.y=.65,o.add(a);const r=new ht(.5,.8,.4),l=new ws(.16,20),h=new zt(.7,1.25,40),m=new O(h,s);m.rotation.x=-Math.PI/2,m.position.y=.05,o.add(m);const p=[];for(const d of[-1,1]){const g=new he;g.position.set(d*1.2,.4,0),g.add(new O(r,e));for(const j of[-.19,.19]){const b=new O(l,t);b.position.set(0,j,.205),g.add(b)}o.add(g),p.push(g)}o.visible=!1;let c=0;return{root:o,update(d,g,j,b){c=Math.max(0,Math.min(1,c+(d?1:-1)*g*3)),o.visible=c>0;const k=b?1:1+Math.sin(j*8)*.09;o.scale.setScalar(Math.max(.001,c)),m.scale.setScalar(k),a.scale.setScalar(k),s.opacity=.24+(b?0:(Math.sin(j*8)+1)*.1),p.forEach(f=>f.scale.set(1,k,k))},dispose(){n.dispose(),i.dispose(),r.dispose(),l.dispose(),h.dispose(),e.dispose(),t.dispose(),s.dispose()}}}const ts={type:"change"},$t={type:"start"},vs={type:"end"},gt=new Hs,ss=new qs,ji=Math.cos(70*Zs.DEG2RAD),ae=new oe,xe=2*Math.PI,K={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_PAN:4,TOUCH_DOLLY_PAN:5,TOUCH_DOLLY_ROTATE:6},Tt=1e-6;class Ei extends Ys{constructor(e,t=null){super(e,t),this.state=K.NONE,this.target=new oe,this.cursor=new oe,this.minDistance=0,this.maxDistance=1/0,this.minZoom=0,this.maxZoom=1/0,this.minTargetRadius=0,this.maxTargetRadius=1/0,this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.minAzimuthAngle=-1/0,this.maxAzimuthAngle=1/0,this.enableDamping=!1,this.dampingFactor=.05,this.enableZoom=!0,this.zoomSpeed=1,this.enableRotate=!0,this.rotateSpeed=1,this.keyRotateSpeed=1,this.enablePan=!0,this.panSpeed=1,this.screenSpacePanning=!0,this.keyPanSpeed=7,this.zoomToCursor=!1,this.autoRotate=!1,this.autoRotateSpeed=2,this.keys={LEFT:"ArrowLeft",UP:"ArrowUp",RIGHT:"ArrowRight",BOTTOM:"ArrowDown"},this.mouseButtons={LEFT:Je.ROTATE,MIDDLE:Je.DOLLY,RIGHT:Je.PAN},this.touches={ONE:Ze.ROTATE,TWO:Ze.DOLLY_PAN},this.target0=this.target.clone(),this.position0=this.object.position.clone(),this.zoom0=this.object.zoom,this._cursorStyle="auto",this._domElementKeyEvents=null,this._lastPosition=new oe,this._lastQuaternion=new qt,this._lastTargetPosition=new oe,this._quat=new qt().setFromUnitVectors(e.up,new oe(0,1,0)),this._quatInverse=this._quat.clone().invert(),this._spherical=new Zt,this._sphericalDelta=new Zt,this._scale=1,this._panOffset=new oe,this._rotateStart=new Me,this._rotateEnd=new Me,this._rotateDelta=new Me,this._panStart=new Me,this._panEnd=new Me,this._panDelta=new Me,this._dollyStart=new Me,this._dollyEnd=new Me,this._dollyDelta=new Me,this._dollyDirection=new oe,this._mouse=new Me,this._performCursorZoom=!1,this._pointers=[],this._pointerPositions={},this._controlActive=!1,this._onPointerMove=Ti.bind(this),this._onPointerDown=Ai.bind(this),this._onPointerUp=Li.bind(this),this._onContextMenu=Wi.bind(this),this._onMouseWheel=Ci.bind(this),this._onKeyDown=Ni.bind(this),this._onTouchStart=Ii.bind(this),this._onTouchMove=Oi.bind(this),this._onMouseDown=Di.bind(this),this._onMouseMove=Ri.bind(this),this._interceptControlDown=$i.bind(this),this._interceptControlUp=Ui.bind(this),this.domElement!==null&&this.connect(this.domElement),this.update()}set cursorStyle(e){this._cursorStyle=e,e==="grab"?this.domElement.style.cursor="grab":this.domElement.style.cursor="auto"}get cursorStyle(){return this._cursorStyle}connect(e){super.connect(e),this.domElement.addEventListener("pointerdown",this._onPointerDown),this.domElement.addEventListener("pointercancel",this._onPointerUp),this.domElement.addEventListener("contextmenu",this._onContextMenu),this.domElement.addEventListener("wheel",this._onMouseWheel,{passive:!1}),this.domElement.getRootNode().addEventListener("keydown",this._interceptControlDown,{passive:!0,capture:!0}),this.domElement.style.touchAction="none"}disconnect(){this.domElement.removeEventListener("pointerdown",this._onPointerDown),this.domElement.ownerDocument.removeEventListener("pointermove",this._onPointerMove),this.domElement.ownerDocument.removeEventListener("pointerup",this._onPointerUp),this.domElement.removeEventListener("pointercancel",this._onPointerUp),this.domElement.removeEventListener("wheel",this._onMouseWheel),this.domElement.removeEventListener("contextmenu",this._onContextMenu),this.stopListenToKeyEvents(),this.domElement.getRootNode().removeEventListener("keydown",this._interceptControlDown,{capture:!0}),this.domElement.style.touchAction=""}dispose(){this.disconnect()}getPolarAngle(){return this._spherical.phi}getAzimuthalAngle(){return this._spherical.theta}getDistance(){return this.object.position.distanceTo(this.target)}listenToKeyEvents(e){e.addEventListener("keydown",this._onKeyDown),this._domElementKeyEvents=e}stopListenToKeyEvents(){this._domElementKeyEvents!==null&&(this._domElementKeyEvents.removeEventListener("keydown",this._onKeyDown),this._domElementKeyEvents=null)}saveState(){this.target0.copy(this.target),this.position0.copy(this.object.position),this.zoom0=this.object.zoom}reset(){this.target.copy(this.target0),this.object.position.copy(this.position0),this.object.zoom=this.zoom0,this.object.updateProjectionMatrix(),this.dispatchEvent(ts),this.update(),this.state=K.NONE}pan(e,t){this._pan(e,t),this.update()}dollyIn(e){this._dollyIn(e),this.update()}dollyOut(e){this._dollyOut(e),this.update()}rotateLeft(e){this._rotateLeft(e),this.update()}rotateUp(e){this._rotateUp(e),this.update()}update(e=null){const t=this.object.position;ae.copy(t).sub(this.target),ae.applyQuaternion(this._quat),this._spherical.setFromVector3(ae),this.autoRotate&&this.state===K.NONE&&this._rotateLeft(this._getAutoRotationAngle(e)),this.enableDamping?(this._spherical.theta+=this._sphericalDelta.theta*this.dampingFactor,this._spherical.phi+=this._sphericalDelta.phi*this.dampingFactor):(this._spherical.theta+=this._sphericalDelta.theta,this._spherical.phi+=this._sphericalDelta.phi);let s=this.minAzimuthAngle,i=this.maxAzimuthAngle;isFinite(s)&&isFinite(i)&&(s<-Math.PI?s+=xe:s>Math.PI&&(s-=xe),i<-Math.PI?i+=xe:i>Math.PI&&(i-=xe),s<=i?this._spherical.theta=Math.max(s,Math.min(i,this._spherical.theta)):this._spherical.theta=this._spherical.theta>(s+i)/2?Math.max(s,this._spherical.theta):Math.min(i,this._spherical.theta)),this._spherical.phi=Math.max(this.minPolarAngle,Math.min(this.maxPolarAngle,this._spherical.phi)),this._spherical.makeSafe(),this.enableDamping===!0?this.target.addScaledVector(this._panOffset,this.dampingFactor):this.target.add(this._panOffset),this.target.sub(this.cursor),this.target.clampLength(this.minTargetRadius,this.maxTargetRadius),this.target.add(this.cursor);let n=!1;if(this.zoomToCursor&&this._performCursorZoom||this.object.isOrthographicCamera)this._spherical.radius=this._clampDistance(this._spherical.radius);else{const a=this._spherical.radius;this._spherical.radius=this._clampDistance(this._spherical.radius*this._scale),n=a!=this._spherical.radius}if(ae.setFromSpherical(this._spherical),ae.applyQuaternion(this._quatInverse),t.copy(this.target).add(ae),this.object.lookAt(this.target),this.enableDamping===!0?(this._sphericalDelta.theta*=1-this.dampingFactor,this._sphericalDelta.phi*=1-this.dampingFactor,this._panOffset.multiplyScalar(1-this.dampingFactor)):(this._sphericalDelta.set(0,0,0),this._panOffset.set(0,0,0)),this.zoomToCursor&&this._performCursorZoom){let a=null;if(this.object.isPerspectiveCamera){const r=ae.length();a=this._clampDistance(r*this._scale);const l=r-a;this.object.position.addScaledVector(this._dollyDirection,l),this.object.updateMatrixWorld(),n=!!l}else if(this.object.isOrthographicCamera){const r=new oe(this._mouse.x,this._mouse.y,0);r.unproject(this.object);const l=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),this.object.updateProjectionMatrix(),n=l!==this.object.zoom;const h=new oe(this._mouse.x,this._mouse.y,0);h.unproject(this.object),this.object.position.sub(h).add(r),this.object.updateMatrixWorld(),a=ae.length()}else console.warn("WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled."),this.zoomToCursor=!1;a!==null&&(this.screenSpacePanning?this.target.set(0,0,-1).transformDirection(this.object.matrix).multiplyScalar(a).add(this.object.position):(gt.origin.copy(this.object.position),gt.direction.set(0,0,-1).transformDirection(this.object.matrix),Math.abs(this.object.up.dot(gt.direction))<ji?this.object.lookAt(this.target):(ss.setFromNormalAndCoplanarPoint(this.object.up,this.target),gt.intersectPlane(ss,this.target))))}else if(this.object.isOrthographicCamera){const a=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),a!==this.object.zoom&&(this.object.updateProjectionMatrix(),n=!0)}return this._scale=1,this._performCursorZoom=!1,n||this._lastPosition.distanceToSquared(this.object.position)>Tt||8*(1-this._lastQuaternion.dot(this.object.quaternion))>Tt||this._lastTargetPosition.distanceToSquared(this.target)>Tt?(this.dispatchEvent(ts),this._lastPosition.copy(this.object.position),this._lastQuaternion.copy(this.object.quaternion),this._lastTargetPosition.copy(this.target),!0):!1}_getAutoRotationAngle(e){return e!==null?xe/60*this.autoRotateSpeed*e:xe/60/60*this.autoRotateSpeed}_getZoomScale(e){const t=Math.abs(e*.01);return Math.pow(.95,this.zoomSpeed*t)}_rotateLeft(e){this._sphericalDelta.theta-=e}_rotateUp(e){this._sphericalDelta.phi-=e}_panLeft(e,t){ae.setFromMatrixColumn(t,0),ae.multiplyScalar(-e),this._panOffset.add(ae)}_panUp(e,t){this.screenSpacePanning===!0?ae.setFromMatrixColumn(t,1):(ae.setFromMatrixColumn(t,0),ae.crossVectors(this.object.up,ae)),ae.multiplyScalar(e),this._panOffset.add(ae)}_pan(e,t){const s=this.domElement;if(this.object.isPerspectiveCamera){const i=this.object.position;ae.copy(i).sub(this.target);let n=ae.length();n*=Math.tan(this.object.fov/2*Math.PI/180),this._panLeft(2*e*n/s.clientHeight,this.object.matrix),this._panUp(2*t*n/s.clientHeight,this.object.matrix)}else this.object.isOrthographicCamera?(this._panLeft(e*(this.object.right-this.object.left)/this.object.zoom/s.clientWidth,this.object.matrix),this._panUp(t*(this.object.top-this.object.bottom)/this.object.zoom/s.clientHeight,this.object.matrix)):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."),this.enablePan=!1)}_dollyOut(e){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale/=e:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_dollyIn(e){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale*=e:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_updateZoomParameters(e,t){if(!this.zoomToCursor)return;this._performCursorZoom=!0;const s=this.domElement.getBoundingClientRect(),i=e-s.left,n=t-s.top,a=s.width,r=s.height;this._mouse.x=i/a*2-1,this._mouse.y=-(n/r)*2+1,this._dollyDirection.set(this._mouse.x,this._mouse.y,1).unproject(this.object).sub(this.object.position).normalize()}_clampDistance(e){return Math.max(this.minDistance,Math.min(this.maxDistance,e))}_handleMouseDownRotate(e){this._rotateStart.set(e.clientX,e.clientY)}_handleMouseDownDolly(e){this._updateZoomParameters(e.clientX,e.clientX),this._dollyStart.set(e.clientX,e.clientY)}_handleMouseDownPan(e){this._panStart.set(e.clientX,e.clientY)}_handleMouseMoveRotate(e){this._rotateEnd.set(e.clientX,e.clientY),this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const t=this.domElement;this._rotateLeft(xe*this._rotateDelta.x/t.clientHeight),this._rotateUp(xe*this._rotateDelta.y/t.clientHeight),this._rotateStart.copy(this._rotateEnd),this.update()}_handleMouseMoveDolly(e){this._dollyEnd.set(e.clientX,e.clientY),this._dollyDelta.subVectors(this._dollyEnd,this._dollyStart),this._dollyDelta.y>0?this._dollyOut(this._getZoomScale(this._dollyDelta.y)):this._dollyDelta.y<0&&this._dollyIn(this._getZoomScale(this._dollyDelta.y)),this._dollyStart.copy(this._dollyEnd),this.update()}_handleMouseMovePan(e){this._panEnd.set(e.clientX,e.clientY),this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd),this.update()}_handleMouseWheel(e){this._updateZoomParameters(e.clientX,e.clientY),e.deltaY<0?this._dollyIn(this._getZoomScale(e.deltaY)):e.deltaY>0&&this._dollyOut(this._getZoomScale(e.deltaY)),this.update()}_handleKeyDown(e){let t=!1;switch(e.code){case this.keys.UP:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateUp(xe*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,this.keyPanSpeed),t=!0;break;case this.keys.BOTTOM:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateUp(-xe*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,-this.keyPanSpeed),t=!0;break;case this.keys.LEFT:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateLeft(xe*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(this.keyPanSpeed,0),t=!0;break;case this.keys.RIGHT:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateLeft(-xe*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(-this.keyPanSpeed,0),t=!0;break}t&&(e.preventDefault(),this.update())}_handleTouchStartRotate(e){if(this._pointers.length===1)this._rotateStart.set(e.pageX,e.pageY);else{const t=this._getSecondPointerPosition(e),s=.5*(e.pageX+t.x),i=.5*(e.pageY+t.y);this._rotateStart.set(s,i)}}_handleTouchStartPan(e){if(this._pointers.length===1)this._panStart.set(e.pageX,e.pageY);else{const t=this._getSecondPointerPosition(e),s=.5*(e.pageX+t.x),i=.5*(e.pageY+t.y);this._panStart.set(s,i)}}_handleTouchStartDolly(e){const t=this._getSecondPointerPosition(e),s=e.pageX-t.x,i=e.pageY-t.y,n=Math.sqrt(s*s+i*i);this._dollyStart.set(0,n)}_handleTouchStartDollyPan(e){this.enableZoom&&this._handleTouchStartDolly(e),this.enablePan&&this._handleTouchStartPan(e)}_handleTouchStartDollyRotate(e){this.enableZoom&&this._handleTouchStartDolly(e),this.enableRotate&&this._handleTouchStartRotate(e)}_handleTouchMoveRotate(e){if(this._pointers.length==1)this._rotateEnd.set(e.pageX,e.pageY);else{const s=this._getSecondPointerPosition(e),i=.5*(e.pageX+s.x),n=.5*(e.pageY+s.y);this._rotateEnd.set(i,n)}this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const t=this.domElement;this._rotateLeft(xe*this._rotateDelta.x/t.clientHeight),this._rotateUp(xe*this._rotateDelta.y/t.clientHeight),this._rotateStart.copy(this._rotateEnd)}_handleTouchMovePan(e){if(this._pointers.length===1)this._panEnd.set(e.pageX,e.pageY);else{const t=this._getSecondPointerPosition(e),s=.5*(e.pageX+t.x),i=.5*(e.pageY+t.y);this._panEnd.set(s,i)}this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd)}_handleTouchMoveDolly(e){const t=this._getSecondPointerPosition(e),s=e.pageX-t.x,i=e.pageY-t.y,n=Math.sqrt(s*s+i*i);this._dollyEnd.set(0,n),this._dollyDelta.set(0,Math.pow(this._dollyEnd.y/this._dollyStart.y,this.zoomSpeed)),this._dollyOut(this._dollyDelta.y),this._dollyStart.copy(this._dollyEnd);const a=(e.pageX+t.x)*.5,r=(e.pageY+t.y)*.5;this._updateZoomParameters(a,r)}_handleTouchMoveDollyPan(e){this.enableZoom&&this._handleTouchMoveDolly(e),this.enablePan&&this._handleTouchMovePan(e)}_handleTouchMoveDollyRotate(e){this.enableZoom&&this._handleTouchMoveDolly(e),this.enableRotate&&this._handleTouchMoveRotate(e)}_addPointer(e){this._pointers.push(e.pointerId)}_removePointer(e){delete this._pointerPositions[e.pointerId];for(let t=0;t<this._pointers.length;t++)if(this._pointers[t]==e.pointerId){this._pointers.splice(t,1);return}}_isTrackingPointer(e){for(let t=0;t<this._pointers.length;t++)if(this._pointers[t]==e.pointerId)return!0;return!1}_trackPointer(e){let t=this._pointerPositions[e.pointerId];t===void 0&&(t=new Me,this._pointerPositions[e.pointerId]=t),t.set(e.pageX,e.pageY)}_getSecondPointerPosition(e){const t=e.pointerId===this._pointers[0]?this._pointers[1]:this._pointers[0];return this._pointerPositions[t]}_customWheelEvent(e){const t=e.deltaMode,s={clientX:e.clientX,clientY:e.clientY,deltaY:e.deltaY};switch(t){case 1:s.deltaY*=16;break;case 2:s.deltaY*=100;break}return e.ctrlKey&&!this._controlActive&&(s.deltaY*=10),s}}function Ai(o){this.enabled!==!1&&(this._pointers.length===0&&(this.domElement.setPointerCapture(o.pointerId),this.domElement.ownerDocument.addEventListener("pointermove",this._onPointerMove),this.domElement.ownerDocument.addEventListener("pointerup",this._onPointerUp)),!this._isTrackingPointer(o)&&(this._addPointer(o),o.pointerType==="touch"?this._onTouchStart(o):this._onMouseDown(o),this._cursorStyle==="grab"&&(this.domElement.style.cursor="grabbing")))}function Ti(o){this.enabled!==!1&&(o.pointerType==="touch"?this._onTouchMove(o):this._onMouseMove(o))}function Li(o){switch(this._removePointer(o),this._pointers.length){case 0:this.domElement.releasePointerCapture(o.pointerId),this.domElement.ownerDocument.removeEventListener("pointermove",this._onPointerMove),this.domElement.ownerDocument.removeEventListener("pointerup",this._onPointerUp),this.dispatchEvent(vs),this.state=K.NONE,this._cursorStyle==="grab"&&(this.domElement.style.cursor="grab");break;case 1:const e=this._pointers[0],t=this._pointerPositions[e];this._onTouchStart({pointerId:e,pageX:t.x,pageY:t.y});break}}function Di(o){let e;switch(o.button){case 0:e=this.mouseButtons.LEFT;break;case 1:e=this.mouseButtons.MIDDLE;break;case 2:e=this.mouseButtons.RIGHT;break;default:e=-1}switch(e){case Je.DOLLY:if(this.enableZoom===!1)return;this._handleMouseDownDolly(o),this.state=K.DOLLY;break;case Je.ROTATE:if(o.ctrlKey||o.metaKey||o.shiftKey){if(this.enablePan===!1)return;this._handleMouseDownPan(o),this.state=K.PAN}else{if(this.enableRotate===!1)return;this._handleMouseDownRotate(o),this.state=K.ROTATE}break;case Je.PAN:if(o.ctrlKey||o.metaKey||o.shiftKey){if(this.enableRotate===!1)return;this._handleMouseDownRotate(o),this.state=K.ROTATE}else{if(this.enablePan===!1)return;this._handleMouseDownPan(o),this.state=K.PAN}break;default:this.state=K.NONE}this.state!==K.NONE&&this.dispatchEvent($t)}function Ri(o){switch(this.state){case K.ROTATE:if(this.enableRotate===!1)return;this._handleMouseMoveRotate(o);break;case K.DOLLY:if(this.enableZoom===!1)return;this._handleMouseMoveDolly(o);break;case K.PAN:if(this.enablePan===!1)return;this._handleMouseMovePan(o);break}}function Ci(o){this.enabled===!1||this.enableZoom===!1||this.state!==K.NONE||(o.preventDefault(),this.dispatchEvent($t),this._handleMouseWheel(this._customWheelEvent(o)),this.dispatchEvent(vs))}function Ni(o){this.enabled!==!1&&this._handleKeyDown(o)}function Ii(o){switch(this._trackPointer(o),this._pointers.length){case 1:switch(this.touches.ONE){case Ze.ROTATE:if(this.enableRotate===!1)return;this._handleTouchStartRotate(o),this.state=K.TOUCH_ROTATE;break;case Ze.PAN:if(this.enablePan===!1)return;this._handleTouchStartPan(o),this.state=K.TOUCH_PAN;break;default:this.state=K.NONE}break;case 2:switch(this.touches.TWO){case Ze.DOLLY_PAN:if(this.enableZoom===!1&&this.enablePan===!1)return;this._handleTouchStartDollyPan(o),this.state=K.TOUCH_DOLLY_PAN;break;case Ze.DOLLY_ROTATE:if(this.enableZoom===!1&&this.enableRotate===!1)return;this._handleTouchStartDollyRotate(o),this.state=K.TOUCH_DOLLY_ROTATE;break;default:this.state=K.NONE}break;default:this.state=K.NONE}this.state!==K.NONE&&this.dispatchEvent($t)}function Oi(o){switch(this._trackPointer(o),this.state){case K.TOUCH_ROTATE:if(this.enableRotate===!1)return;this._handleTouchMoveRotate(o),this.update();break;case K.TOUCH_PAN:if(this.enablePan===!1)return;this._handleTouchMovePan(o),this.update();break;case K.TOUCH_DOLLY_PAN:if(this.enableZoom===!1&&this.enablePan===!1)return;this._handleTouchMoveDollyPan(o),this.update();break;case K.TOUCH_DOLLY_ROTATE:if(this.enableZoom===!1&&this.enableRotate===!1)return;this._handleTouchMoveDollyRotate(o),this.update();break;default:this.state=K.NONE}}function Wi(o){this.enabled!==!1&&o.preventDefault()}function $i(o){o.key==="Control"&&(this._controlActive=!0,this.domElement.getRootNode().addEventListener("keyup",this._interceptControlUp,{passive:!0,capture:!0}))}function Ui(o){o.key==="Control"&&(this._controlActive=!1,this.domElement.getRootNode().removeEventListener("keyup",this._interceptControlUp,{passive:!0,capture:!0}))}function Bi(o){if(o.kind!=="building"||!o.parts.length)return[];const e=o.parts.map(ct).filter(({min:t,max:s})=>(s[1]<=1.2+1e-6||s[1]-t[1]<.3)&&s[0]-t[0]>1&&s[2]-t[2]>1);if(!e.length){const t=Qs(o);e.push({min:[t.min[0],0,t.min[2]],max:[t.max[0],0,t.max[2]]})}return e.map(({min:t,max:s})=>({x:(t[0]+s[0])/2,y:s[1]+.012,z:(t[2]+s[2])/2,width:(s[0]-t[0])*.96,depth:(s[2]-t[2])*.96}))}class _s{group=new he;material=new bs({uniforms:{night:{value:0},warmth:{value:new H("#ffb24d")},strength:{value:.34}},vertexShader:`varying vec2 lightUv;
|
|
1
|
+
import{r as I,b as qe,a as Mt,T as Re,c as Ve,d as Is,p as Ce,e as ce,C as Pe,o as Lt,f as gs,P as wt,g as Os,S as Ht,h as Ws,u as $s,i as Us,j as Bs,k as Fs,w as Et,l as x,W as Gs,A as Ks}from"./index-CzmdQnci.js";import{G as he,B as ht,M as ze,a as O,c as ys,p as xs,C as Nt,b as ee,d as ct,A as It,S as lt,e as ws,R as zt,f as Ys,V as oe,g as Je,T as Ze,Q as qt,h as Zt,i as Me,j as Hs,P as qs,k as Zs,l as bs,m as H,N as Xs,n as Ot,o as Wt,q as Qs,r as Dt,s as Xe,t as Xt,I as Vs,u as Qt,D as Rt,v as ks,w as bt,x as Js,y as Ms,F as ei,z as ti,E as si,W as ii,H as ni,J as ai,K as oi,L as ri,O as ci,U as li,X as hi,Y as di,Z as ui,_ as Vt,$ as pi,a0 as fi,a1 as Jt,a2 as At,a3 as mi}from"./robot-CzDIvswk.js";const gi=o=>String(o?.message??o);function yi(o){const[e,t]=I.useState(null),[s,i]=I.useState(null),[n,a]=I.useState(null),r=I.useRef(null),l=I.useRef(0),h=I.useCallback(()=>{const p=++l.current;qe.invoke("island_get").then(c=>{if(p!==l.current||!c?.island)return;const d=c.island;r.current&&r.current.rev>d.rev||(r.current=d,t(d),i(null))}).catch(c=>{p===l.current&&i(gi(c))})},[]);I.useEffect(()=>{if(!o)return;h();const p=qe.on("island-changed",d=>{d&&(r.current&&d.rev<=r.current.rev||(a(d),h()))}),c=qe.on("chat-status",d=>{d?.key.startsWith("chat:island-wish-")&&h()});return()=>{p(),c()}},[o,h]);const m=I.useCallback(async(p,c={})=>{await qe.invoke(p,c),h()},[h]);return{island:e,error:s,change:n,reload:h,dismissWish:p=>m("island_wish_dismiss",{id:p}),grantWish:p=>m("island_wish_start",{id:p}),rollWish:()=>m("island_wish_roll"),inviteBot:()=>m("island_bot_invite"),farewell:p=>m("island_bot_farewell",{id:p}),setPace:p=>m("island_settings_set",{wishPace:p}),setBuildPace:p=>m("island_build_pace",{pace:p})}}function xi(o,e=Date.now()){const t=new Map;for(const s of o){const i=a=>s.activities.find(r=>r.state===a)?.title,n=s.state==="working"?{state:"working",label:i("working")}:s.state==="needs_you"?{state:"needs_you",label:i("needs_you")}:s.state==="failed"?{state:"failed",label:i("failed")}:{state:"free",...s.recent?{idleFor:Math.max(0,Math.round((e-s.recent.at)/6e4))}:{}};t.set(`agent:${s.id}`,n)}return t}function wi(o,e=Date.now()){const t=Math.max(0,Math.round((e-o)/6e4));if(t<1)return"just now";if(t<60)return`${t} min ago`;const s=Math.round(t/60);return s<24?`${s} h ago`:`${Math.round(s/24)} d ago`}function zs(o,e){const t=new Map;for(const c of[...e].sort((d,g)=>d.key.localeCompare(g.key))){const d=c.agent?.teamId?`team:${c.agent.teamId}`:"general";t.set(d,[...t.get(d)??[],c])}t.has("general")||t.set("general",[]);const s=[],i=o.assets.filter(c=>c.kind==="accessory"),n=[],a=[],r=new Map,l=o.plots.filter(c=>c.owner.kind==="home"&&c.owner.id.startsWith("public:")||o.placed.some(d=>d.plot===c.id&&o.assets.some(g=>g.id===d.asset&&g.kind==="building"&&g.name!=="Workshop"))),h=[];for(let c=1;h.length<t.size+l.length;c++)h.push(...Mt(c).filter(([d,g])=>(d!==-1||g!==0)&&(d!==0||g!==-1)));const m=(c,d,g)=>({shape:"box",size:c,at:d,color:g});for(const[c,[d,g]]of[...t].sort(([j],[b])=>j.localeCompare(b)).entries()){const[j,b]=h[c],k=Ve(j,b),f=`office:${d}`,E=d==="general"?"Agent Tower":`${g[0].agent?.teamName??"Team"} Office`,z={id:f,owner:{kind:"home",id:d},ring:Math.max(Math.abs(j),Math.abs(b),Math.abs(j+b)),slot:c,q:j,r:b,...k,facing:Math.atan2(-k.x,-k.z)*180/Math.PI,radius:Re,claimedAt:0,members:g.map(A=>A.owner.id),officeName:E};s.push(z);const _=Math.max(d==="general"?3:1,Math.ceil(g.length/6)),L=[];for(let A=0;A<_;A++){const S=A*2.3;L.push(m([8,.08,6],[0,S+.04,-.7],"#d6dce5")),L.push({...m([8,2,.14],[0,S+1,-3.6],"#b6c9dd"),finish:"glass"}),L.push({...m([.16,2.3,6],[-3.95,S+1.15,-.7],"#7a94b1"),finish:"glass"}),L.push({...m([.16,2.3,6],[3.95,S+1.15,-.7],"#7a94b1"),finish:"glass"});for(const N of[-2.7,0,2.7])L.push({...m([1.5,1,.025],[N,S+1.2,-3.51],"#b5e5fa"),finish:"glass"})}i.push({id:f,rev:_,name:E,kind:"building",parts:L,by:{name:"Island offices"},madeAt:0,updatedAt:0}),n.push({id:f,asset:f,plot:f,x:0,z:0,y:0,turn:0});for(const[A,S]of g.entries()){a.push({...S,plot:z});const N=`office-desk:${S.key}`,$=(A%3-1)*2.4,W=Math.floor(A%6/3)*2.5-2.4,X=Math.floor(A/6)*2.3;i.push({id:N,rev:Number.parseInt(S.look.trim.slice(1)+S.look.glow.slice(1),16),name:`${S.name}'s desk`,kind:"furniture",use:"desk",spot:{at:[0,0,.65],face:180},parts:[m([1.3,.08,.7],[0,.6,0],"#cfa783"),m([.12,.6,.12],[-.5,.3,0],S.look.trim),m([.12,.6,.12],[.5,.3,0],S.look.trim),m([.65,.42,.08],[0,.88,-.18],"#26354a"),{...m([.55,.32,.02],[0,.88,-.13],S.look.glow),finish:"glow"}],by:{name:S.name,agentId:S.owner.id},madeAt:0,updatedAt:0}),n.push({id:N,asset:N,plot:f,x:$,z:W,y:X,turn:0}),r.set(N,S.key);const Y=o.placed.filter(F=>F.plot===S.plot?.id).filter(F=>{const V=o.assets.find(ve=>ve.id===F.asset);return V&&V.kind!=="building"&&V.name!=="Workshop"&&V.name!=="Desk"&&V.use!=="bed"});for(const[F,V]of Y.entries()){const ve=o.assets.find(fe=>fe.id===V.asset);i.some(fe=>fe.id===ve.id)||i.push(ve);const ne=(A+F/Math.max(1,Y.length))/g.length*Math.PI*2;n.push({...V,plot:f,x:Math.sin(ne)*4.8,z:Math.cos(ne)*4.8,y:0})}}}for(const[c,d]of l.entries()){const[g,j]=h[t.size+c],b=Ve(g,j),k=o.placed.filter(z=>z.plot===d.id&&o.assets.some(_=>_.id===z.asset&&(d.owner.kind==="home"||_.kind==="building"&&_.name!=="Workshop"))),f=o.assets.find(z=>k.some(_=>_.asset===z.id)&&z.kind==="building"),E={...d,q:g,r:j,...b,ring:Math.max(Math.abs(g),Math.abs(j),Math.abs(g+j)),facing:Math.atan2(-b.x,-b.z)*180/Math.PI,officeName:f?.name??"Public project"};s.push(E),n.push(...k);for(const z of k){const _=o.assets.find(L=>L.id===z.asset);_&&!i.some(L=>L.id===_.id)&&i.push(_)}}const p=Math.max(30,o.radius,...s.map(c=>Math.hypot(c.x,c.z)+Re+4));return{island:{...o,plots:s,assets:i,placed:n,radius:p},residents:a,deskOwners:r}}function bi(){const o=new he;o.name="planted-seedlings";const e=new he;o.add(e);const t=new ht(1,1,1),s=new ze({color:"#88674b"}),i=new ze({color:"#64a856"}),n=new O(t,s);n.scale.set(.8,.035,.45),n.position.y=.02,o.add(n);for(const r of[-.26,0,.26]){const l=new O(t,i);l.scale.set(.025,.3,.025),l.position.set(r,.17,0),e.add(l);for(const h of[-1,1]){const m=new O(t,i);m.scale.set(.17,.045,.08),m.position.set(r+h*.07,.23,0),m.rotation.z=h*.4,e.add(m)}}let a=0;return{root:o,update(r,l){l&&(a=Math.min(1,a+r/12)),e.scale.setScalar(.12+a*.88),o.visible=a>0},dispose(){t.dispose(),s.dispose(),i.dispose()}}}const we=Ve(0,-1),ki={x:we.x,z:we.z-.8};function Mi(o){return{x:we.x+(o%4-1.5)*1.6,z:we.z+.6+Math.floor(o/4)*1}}function zi(){const o=new he;o.name="bot-society",o.position.set(we.x,.05,we.z);const e=new ht(1,1,1),t=new ze({color:"#ded8c9",roughness:.8}),s=new ze({color:"#caa45c",metalness:.5,roughness:.3}),i=new ze({color:"#b8e5f0",transparent:!0,opacity:.22,depthWrite:!1}),n=(c,d,g,j,b,k,f=t)=>{const E=new O(e,f);E.position.set(c,d,g),E.scale.set(j,b,k),o.add(E)};n(0,.05,0,8,.1,7),n(-3.9,1.2,0,.15,2.4,7,i),n(3.9,1.2,0,.15,2.4,7,i);for(const c of[-3.2,3.2])n(c,1.5,2.8,.45,3,.45),n(c,3.1,2.8,.75,.2,.75,s);n(0,3.15,2.8,6.8,.25,.35,s),n(0,.45,-1.6,3.2,.9,.65),n(0,.94,-1.6,3.5,.1,.9,s),n(0,.5,-3.7,2.4,1,1.8),n(0,1.07,-3.7,2.7,.15,2,s);const a=Is({id:"bot-society-statue",agent:"codex",model:"sol"}),r=ys({...a,shell:"#d7c592",trim:"#a98642",glow:"#fff2af",antenna:"crown"});xs(r,"raise",0,{calm:!0}),r.root.scale.setScalar(4.5),r.root.position.set(0,1.15,-3.7),o.add(r.root);const l=document.createElement("canvas");l.width=768,l.height=128;const h=l.getContext("2d");h.fillStyle="#f7e8bd",h.fillRect(0,0,768,128),h.fillStyle="#5d4828",h.font="bold 56px sans-serif",h.textAlign="center",h.fillText("BOT SOCIETY",384,80);const m=new Nt(l),p=new ee({map:m});return n(0,3.15,3.02,4.8,.8,.04,p),{root:o,solids:[{cx:we.x-3.9,cz:we.z,hx:.08,hz:3.5,yaw:0},{cx:we.x+3.9,cz:we.z,hx:.08,hz:3.5,yaw:0},{cx:we.x,cz:we.z-1.6,hx:1.7,hz:.45,yaw:0},{cx:we.x,cz:we.z-3.7,hx:1.4,hz:1.1,yaw:0}],dispose(){r.dispose(),e.dispose(),t.dispose(),s.dispose(),i.dispose(),m.dispose(),p.dispose()}}}function vi(o){if(o.kind==="accessory"||o.use==="none")return null;if(["read","paint","garden","perform","play","observe"].includes(o.use??""))return o.use;const e=o.name.toLowerCase();for(const[t,s]of[["garden",/garden|planter|greenhouse|seedling|herb|mint|花|种植|种子|盆栽|薄荷|温室|苗/],["paint",/easel|paint|画架|绘画|畫架/],["read",/library|bookshelf|bookcase|café|cafe|reading|书架|图书|書架|咖啡/],["perform",/music|concert|stage|piano|音乐|合奏|舞台|钢琴/],["play",/arcade|game|toy|游戏|玩具|游乐/],["observe",/lamp|light|灯|燈/]])if(s.test(e))return t;return/\b(chair|bench|stool|bed)\b|椅|凳|床/.test(e)&&!o.use?null:!o.use&&/\b(table|desk|workbench)\b|桌|工作台/.test(e)?/workbench|工作台/.test(e)?"play":"read":o.use==="desk"?/workbench|工作台/.test(e)?"play":"read":o.use==="seat"||o.use==="bed"?null:o.kind==="building"||o.kind==="furniture"||o.kind==="decor"?"observe":null}function _i(o,e,t){if(t.id.startsWith("office-desk:"))return null;const s=vi(o);if(!s||!o.parts.length)return null;const i=Math.max(...o.parts.map(c=>ct(c).max[2])),n=Math.max(0,...o.parts.map(c=>ct(c)).filter(c=>c.max[1]<=.35&&c.max[1]-c.min[1]<=.16).map(c=>c.max[1])),a=o.spot??(o.kind==="building"&&s!=="observe"?{at:[0,n,0],face:180}:{at:[0,0,i+.85],face:180}),r=t.turn*Math.PI/180,[l,h,m]=a.at,p=Ce(e,t.x+l*Math.cos(r)+m*Math.sin(r),t.z-l*Math.sin(r)+m*Math.cos(r));return{key:t.id,name:o.name,activity:s,...p,y:ce+t.y+h,face:(e.facing+t.turn+a.face)*Math.PI/180}}function es(o,e){const t={garden:"gardening",read:"reading",paint:"painting",perform:"music",play:"games"};return e==="observe"||!!o?.includes(t[e])}function Si(){const o=new he,e=new ht(1,1,1),t=["#f1e7cb","#6b86b6","#f5a14a","#76b9a5","#71c7ff"].map(m=>new ee({color:m})),s=(m,p,c)=>{const d=new he;d.name=m;const g=new O(e,t[c]);return g.scale.set(...p),d.add(g),o.add(d),d.visible=!1,d},i=s("read",[.32,.24,.05],1),n=s("paint",[.035,.32,.035],2),a=s("garden",[.22,.16,.17],3),r=s("register",[.24,.3,.02],0),l=s("play",[.25,.1,.1],1),h=new O(e,t[4]);return h.scale.set(.18,.035,.035),h.position.x=.16,a.add(h),{root:o,show(m){for(const p of[i,n,a,r,l])p.visible=p.name===m},dispose(){e.dispose(),t.forEach(m=>m.dispose())}}}function Pi(){const o=new he;o.name="concert-stage";const e=new ee({color:"#253044"}),t=new ee({color:"#9d8dff"}),s=new ee({color:"#c2a1ff",transparent:!0,opacity:.32,depthWrite:!1}),i=new ee({color:"#b997ff",transparent:!0,opacity:.13,depthWrite:!1,blending:It}),n=new lt(.75,20,12),a=new O(n,i);a.position.y=.65,o.add(a);const r=new ht(.5,.8,.4),l=new ws(.16,20),h=new zt(.7,1.25,40),m=new O(h,s);m.rotation.x=-Math.PI/2,m.position.y=.05,o.add(m);const p=[];for(const d of[-1,1]){const g=new he;g.position.set(d*1.2,.4,0),g.add(new O(r,e));for(const j of[-.19,.19]){const b=new O(l,t);b.position.set(0,j,.205),g.add(b)}o.add(g),p.push(g)}o.visible=!1;let c=0;return{root:o,update(d,g,j,b){c=Math.max(0,Math.min(1,c+(d?1:-1)*g*3)),o.visible=c>0;const k=b?1:1+Math.sin(j*8)*.09;o.scale.setScalar(Math.max(.001,c)),m.scale.setScalar(k),a.scale.setScalar(k),s.opacity=.24+(b?0:(Math.sin(j*8)+1)*.1),p.forEach(f=>f.scale.set(1,k,k))},dispose(){n.dispose(),i.dispose(),r.dispose(),l.dispose(),h.dispose(),e.dispose(),t.dispose(),s.dispose()}}}const ts={type:"change"},$t={type:"start"},vs={type:"end"},gt=new Hs,ss=new qs,ji=Math.cos(70*Zs.DEG2RAD),ae=new oe,xe=2*Math.PI,K={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_PAN:4,TOUCH_DOLLY_PAN:5,TOUCH_DOLLY_ROTATE:6},Tt=1e-6;class Ei extends Ys{constructor(e,t=null){super(e,t),this.state=K.NONE,this.target=new oe,this.cursor=new oe,this.minDistance=0,this.maxDistance=1/0,this.minZoom=0,this.maxZoom=1/0,this.minTargetRadius=0,this.maxTargetRadius=1/0,this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.minAzimuthAngle=-1/0,this.maxAzimuthAngle=1/0,this.enableDamping=!1,this.dampingFactor=.05,this.enableZoom=!0,this.zoomSpeed=1,this.enableRotate=!0,this.rotateSpeed=1,this.keyRotateSpeed=1,this.enablePan=!0,this.panSpeed=1,this.screenSpacePanning=!0,this.keyPanSpeed=7,this.zoomToCursor=!1,this.autoRotate=!1,this.autoRotateSpeed=2,this.keys={LEFT:"ArrowLeft",UP:"ArrowUp",RIGHT:"ArrowRight",BOTTOM:"ArrowDown"},this.mouseButtons={LEFT:Je.ROTATE,MIDDLE:Je.DOLLY,RIGHT:Je.PAN},this.touches={ONE:Ze.ROTATE,TWO:Ze.DOLLY_PAN},this.target0=this.target.clone(),this.position0=this.object.position.clone(),this.zoom0=this.object.zoom,this._cursorStyle="auto",this._domElementKeyEvents=null,this._lastPosition=new oe,this._lastQuaternion=new qt,this._lastTargetPosition=new oe,this._quat=new qt().setFromUnitVectors(e.up,new oe(0,1,0)),this._quatInverse=this._quat.clone().invert(),this._spherical=new Zt,this._sphericalDelta=new Zt,this._scale=1,this._panOffset=new oe,this._rotateStart=new Me,this._rotateEnd=new Me,this._rotateDelta=new Me,this._panStart=new Me,this._panEnd=new Me,this._panDelta=new Me,this._dollyStart=new Me,this._dollyEnd=new Me,this._dollyDelta=new Me,this._dollyDirection=new oe,this._mouse=new Me,this._performCursorZoom=!1,this._pointers=[],this._pointerPositions={},this._controlActive=!1,this._onPointerMove=Ti.bind(this),this._onPointerDown=Ai.bind(this),this._onPointerUp=Li.bind(this),this._onContextMenu=Wi.bind(this),this._onMouseWheel=Ci.bind(this),this._onKeyDown=Ni.bind(this),this._onTouchStart=Ii.bind(this),this._onTouchMove=Oi.bind(this),this._onMouseDown=Di.bind(this),this._onMouseMove=Ri.bind(this),this._interceptControlDown=$i.bind(this),this._interceptControlUp=Ui.bind(this),this.domElement!==null&&this.connect(this.domElement),this.update()}set cursorStyle(e){this._cursorStyle=e,e==="grab"?this.domElement.style.cursor="grab":this.domElement.style.cursor="auto"}get cursorStyle(){return this._cursorStyle}connect(e){super.connect(e),this.domElement.addEventListener("pointerdown",this._onPointerDown),this.domElement.addEventListener("pointercancel",this._onPointerUp),this.domElement.addEventListener("contextmenu",this._onContextMenu),this.domElement.addEventListener("wheel",this._onMouseWheel,{passive:!1}),this.domElement.getRootNode().addEventListener("keydown",this._interceptControlDown,{passive:!0,capture:!0}),this.domElement.style.touchAction="none"}disconnect(){this.domElement.removeEventListener("pointerdown",this._onPointerDown),this.domElement.ownerDocument.removeEventListener("pointermove",this._onPointerMove),this.domElement.ownerDocument.removeEventListener("pointerup",this._onPointerUp),this.domElement.removeEventListener("pointercancel",this._onPointerUp),this.domElement.removeEventListener("wheel",this._onMouseWheel),this.domElement.removeEventListener("contextmenu",this._onContextMenu),this.stopListenToKeyEvents(),this.domElement.getRootNode().removeEventListener("keydown",this._interceptControlDown,{capture:!0}),this.domElement.style.touchAction=""}dispose(){this.disconnect()}getPolarAngle(){return this._spherical.phi}getAzimuthalAngle(){return this._spherical.theta}getDistance(){return this.object.position.distanceTo(this.target)}listenToKeyEvents(e){e.addEventListener("keydown",this._onKeyDown),this._domElementKeyEvents=e}stopListenToKeyEvents(){this._domElementKeyEvents!==null&&(this._domElementKeyEvents.removeEventListener("keydown",this._onKeyDown),this._domElementKeyEvents=null)}saveState(){this.target0.copy(this.target),this.position0.copy(this.object.position),this.zoom0=this.object.zoom}reset(){this.target.copy(this.target0),this.object.position.copy(this.position0),this.object.zoom=this.zoom0,this.object.updateProjectionMatrix(),this.dispatchEvent(ts),this.update(),this.state=K.NONE}pan(e,t){this._pan(e,t),this.update()}dollyIn(e){this._dollyIn(e),this.update()}dollyOut(e){this._dollyOut(e),this.update()}rotateLeft(e){this._rotateLeft(e),this.update()}rotateUp(e){this._rotateUp(e),this.update()}update(e=null){const t=this.object.position;ae.copy(t).sub(this.target),ae.applyQuaternion(this._quat),this._spherical.setFromVector3(ae),this.autoRotate&&this.state===K.NONE&&this._rotateLeft(this._getAutoRotationAngle(e)),this.enableDamping?(this._spherical.theta+=this._sphericalDelta.theta*this.dampingFactor,this._spherical.phi+=this._sphericalDelta.phi*this.dampingFactor):(this._spherical.theta+=this._sphericalDelta.theta,this._spherical.phi+=this._sphericalDelta.phi);let s=this.minAzimuthAngle,i=this.maxAzimuthAngle;isFinite(s)&&isFinite(i)&&(s<-Math.PI?s+=xe:s>Math.PI&&(s-=xe),i<-Math.PI?i+=xe:i>Math.PI&&(i-=xe),s<=i?this._spherical.theta=Math.max(s,Math.min(i,this._spherical.theta)):this._spherical.theta=this._spherical.theta>(s+i)/2?Math.max(s,this._spherical.theta):Math.min(i,this._spherical.theta)),this._spherical.phi=Math.max(this.minPolarAngle,Math.min(this.maxPolarAngle,this._spherical.phi)),this._spherical.makeSafe(),this.enableDamping===!0?this.target.addScaledVector(this._panOffset,this.dampingFactor):this.target.add(this._panOffset),this.target.sub(this.cursor),this.target.clampLength(this.minTargetRadius,this.maxTargetRadius),this.target.add(this.cursor);let n=!1;if(this.zoomToCursor&&this._performCursorZoom||this.object.isOrthographicCamera)this._spherical.radius=this._clampDistance(this._spherical.radius);else{const a=this._spherical.radius;this._spherical.radius=this._clampDistance(this._spherical.radius*this._scale),n=a!=this._spherical.radius}if(ae.setFromSpherical(this._spherical),ae.applyQuaternion(this._quatInverse),t.copy(this.target).add(ae),this.object.lookAt(this.target),this.enableDamping===!0?(this._sphericalDelta.theta*=1-this.dampingFactor,this._sphericalDelta.phi*=1-this.dampingFactor,this._panOffset.multiplyScalar(1-this.dampingFactor)):(this._sphericalDelta.set(0,0,0),this._panOffset.set(0,0,0)),this.zoomToCursor&&this._performCursorZoom){let a=null;if(this.object.isPerspectiveCamera){const r=ae.length();a=this._clampDistance(r*this._scale);const l=r-a;this.object.position.addScaledVector(this._dollyDirection,l),this.object.updateMatrixWorld(),n=!!l}else if(this.object.isOrthographicCamera){const r=new oe(this._mouse.x,this._mouse.y,0);r.unproject(this.object);const l=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),this.object.updateProjectionMatrix(),n=l!==this.object.zoom;const h=new oe(this._mouse.x,this._mouse.y,0);h.unproject(this.object),this.object.position.sub(h).add(r),this.object.updateMatrixWorld(),a=ae.length()}else console.warn("WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled."),this.zoomToCursor=!1;a!==null&&(this.screenSpacePanning?this.target.set(0,0,-1).transformDirection(this.object.matrix).multiplyScalar(a).add(this.object.position):(gt.origin.copy(this.object.position),gt.direction.set(0,0,-1).transformDirection(this.object.matrix),Math.abs(this.object.up.dot(gt.direction))<ji?this.object.lookAt(this.target):(ss.setFromNormalAndCoplanarPoint(this.object.up,this.target),gt.intersectPlane(ss,this.target))))}else if(this.object.isOrthographicCamera){const a=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),a!==this.object.zoom&&(this.object.updateProjectionMatrix(),n=!0)}return this._scale=1,this._performCursorZoom=!1,n||this._lastPosition.distanceToSquared(this.object.position)>Tt||8*(1-this._lastQuaternion.dot(this.object.quaternion))>Tt||this._lastTargetPosition.distanceToSquared(this.target)>Tt?(this.dispatchEvent(ts),this._lastPosition.copy(this.object.position),this._lastQuaternion.copy(this.object.quaternion),this._lastTargetPosition.copy(this.target),!0):!1}_getAutoRotationAngle(e){return e!==null?xe/60*this.autoRotateSpeed*e:xe/60/60*this.autoRotateSpeed}_getZoomScale(e){const t=Math.abs(e*.01);return Math.pow(.95,this.zoomSpeed*t)}_rotateLeft(e){this._sphericalDelta.theta-=e}_rotateUp(e){this._sphericalDelta.phi-=e}_panLeft(e,t){ae.setFromMatrixColumn(t,0),ae.multiplyScalar(-e),this._panOffset.add(ae)}_panUp(e,t){this.screenSpacePanning===!0?ae.setFromMatrixColumn(t,1):(ae.setFromMatrixColumn(t,0),ae.crossVectors(this.object.up,ae)),ae.multiplyScalar(e),this._panOffset.add(ae)}_pan(e,t){const s=this.domElement;if(this.object.isPerspectiveCamera){const i=this.object.position;ae.copy(i).sub(this.target);let n=ae.length();n*=Math.tan(this.object.fov/2*Math.PI/180),this._panLeft(2*e*n/s.clientHeight,this.object.matrix),this._panUp(2*t*n/s.clientHeight,this.object.matrix)}else this.object.isOrthographicCamera?(this._panLeft(e*(this.object.right-this.object.left)/this.object.zoom/s.clientWidth,this.object.matrix),this._panUp(t*(this.object.top-this.object.bottom)/this.object.zoom/s.clientHeight,this.object.matrix)):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."),this.enablePan=!1)}_dollyOut(e){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale/=e:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_dollyIn(e){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale*=e:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_updateZoomParameters(e,t){if(!this.zoomToCursor)return;this._performCursorZoom=!0;const s=this.domElement.getBoundingClientRect(),i=e-s.left,n=t-s.top,a=s.width,r=s.height;this._mouse.x=i/a*2-1,this._mouse.y=-(n/r)*2+1,this._dollyDirection.set(this._mouse.x,this._mouse.y,1).unproject(this.object).sub(this.object.position).normalize()}_clampDistance(e){return Math.max(this.minDistance,Math.min(this.maxDistance,e))}_handleMouseDownRotate(e){this._rotateStart.set(e.clientX,e.clientY)}_handleMouseDownDolly(e){this._updateZoomParameters(e.clientX,e.clientX),this._dollyStart.set(e.clientX,e.clientY)}_handleMouseDownPan(e){this._panStart.set(e.clientX,e.clientY)}_handleMouseMoveRotate(e){this._rotateEnd.set(e.clientX,e.clientY),this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const t=this.domElement;this._rotateLeft(xe*this._rotateDelta.x/t.clientHeight),this._rotateUp(xe*this._rotateDelta.y/t.clientHeight),this._rotateStart.copy(this._rotateEnd),this.update()}_handleMouseMoveDolly(e){this._dollyEnd.set(e.clientX,e.clientY),this._dollyDelta.subVectors(this._dollyEnd,this._dollyStart),this._dollyDelta.y>0?this._dollyOut(this._getZoomScale(this._dollyDelta.y)):this._dollyDelta.y<0&&this._dollyIn(this._getZoomScale(this._dollyDelta.y)),this._dollyStart.copy(this._dollyEnd),this.update()}_handleMouseMovePan(e){this._panEnd.set(e.clientX,e.clientY),this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd),this.update()}_handleMouseWheel(e){this._updateZoomParameters(e.clientX,e.clientY),e.deltaY<0?this._dollyIn(this._getZoomScale(e.deltaY)):e.deltaY>0&&this._dollyOut(this._getZoomScale(e.deltaY)),this.update()}_handleKeyDown(e){let t=!1;switch(e.code){case this.keys.UP:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateUp(xe*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,this.keyPanSpeed),t=!0;break;case this.keys.BOTTOM:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateUp(-xe*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,-this.keyPanSpeed),t=!0;break;case this.keys.LEFT:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateLeft(xe*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(this.keyPanSpeed,0),t=!0;break;case this.keys.RIGHT:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateLeft(-xe*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(-this.keyPanSpeed,0),t=!0;break}t&&(e.preventDefault(),this.update())}_handleTouchStartRotate(e){if(this._pointers.length===1)this._rotateStart.set(e.pageX,e.pageY);else{const t=this._getSecondPointerPosition(e),s=.5*(e.pageX+t.x),i=.5*(e.pageY+t.y);this._rotateStart.set(s,i)}}_handleTouchStartPan(e){if(this._pointers.length===1)this._panStart.set(e.pageX,e.pageY);else{const t=this._getSecondPointerPosition(e),s=.5*(e.pageX+t.x),i=.5*(e.pageY+t.y);this._panStart.set(s,i)}}_handleTouchStartDolly(e){const t=this._getSecondPointerPosition(e),s=e.pageX-t.x,i=e.pageY-t.y,n=Math.sqrt(s*s+i*i);this._dollyStart.set(0,n)}_handleTouchStartDollyPan(e){this.enableZoom&&this._handleTouchStartDolly(e),this.enablePan&&this._handleTouchStartPan(e)}_handleTouchStartDollyRotate(e){this.enableZoom&&this._handleTouchStartDolly(e),this.enableRotate&&this._handleTouchStartRotate(e)}_handleTouchMoveRotate(e){if(this._pointers.length==1)this._rotateEnd.set(e.pageX,e.pageY);else{const s=this._getSecondPointerPosition(e),i=.5*(e.pageX+s.x),n=.5*(e.pageY+s.y);this._rotateEnd.set(i,n)}this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const t=this.domElement;this._rotateLeft(xe*this._rotateDelta.x/t.clientHeight),this._rotateUp(xe*this._rotateDelta.y/t.clientHeight),this._rotateStart.copy(this._rotateEnd)}_handleTouchMovePan(e){if(this._pointers.length===1)this._panEnd.set(e.pageX,e.pageY);else{const t=this._getSecondPointerPosition(e),s=.5*(e.pageX+t.x),i=.5*(e.pageY+t.y);this._panEnd.set(s,i)}this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd)}_handleTouchMoveDolly(e){const t=this._getSecondPointerPosition(e),s=e.pageX-t.x,i=e.pageY-t.y,n=Math.sqrt(s*s+i*i);this._dollyEnd.set(0,n),this._dollyDelta.set(0,Math.pow(this._dollyEnd.y/this._dollyStart.y,this.zoomSpeed)),this._dollyOut(this._dollyDelta.y),this._dollyStart.copy(this._dollyEnd);const a=(e.pageX+t.x)*.5,r=(e.pageY+t.y)*.5;this._updateZoomParameters(a,r)}_handleTouchMoveDollyPan(e){this.enableZoom&&this._handleTouchMoveDolly(e),this.enablePan&&this._handleTouchMovePan(e)}_handleTouchMoveDollyRotate(e){this.enableZoom&&this._handleTouchMoveDolly(e),this.enableRotate&&this._handleTouchMoveRotate(e)}_addPointer(e){this._pointers.push(e.pointerId)}_removePointer(e){delete this._pointerPositions[e.pointerId];for(let t=0;t<this._pointers.length;t++)if(this._pointers[t]==e.pointerId){this._pointers.splice(t,1);return}}_isTrackingPointer(e){for(let t=0;t<this._pointers.length;t++)if(this._pointers[t]==e.pointerId)return!0;return!1}_trackPointer(e){let t=this._pointerPositions[e.pointerId];t===void 0&&(t=new Me,this._pointerPositions[e.pointerId]=t),t.set(e.pageX,e.pageY)}_getSecondPointerPosition(e){const t=e.pointerId===this._pointers[0]?this._pointers[1]:this._pointers[0];return this._pointerPositions[t]}_customWheelEvent(e){const t=e.deltaMode,s={clientX:e.clientX,clientY:e.clientY,deltaY:e.deltaY};switch(t){case 1:s.deltaY*=16;break;case 2:s.deltaY*=100;break}return e.ctrlKey&&!this._controlActive&&(s.deltaY*=10),s}}function Ai(o){this.enabled!==!1&&(this._pointers.length===0&&(this.domElement.setPointerCapture(o.pointerId),this.domElement.ownerDocument.addEventListener("pointermove",this._onPointerMove),this.domElement.ownerDocument.addEventListener("pointerup",this._onPointerUp)),!this._isTrackingPointer(o)&&(this._addPointer(o),o.pointerType==="touch"?this._onTouchStart(o):this._onMouseDown(o),this._cursorStyle==="grab"&&(this.domElement.style.cursor="grabbing")))}function Ti(o){this.enabled!==!1&&(o.pointerType==="touch"?this._onTouchMove(o):this._onMouseMove(o))}function Li(o){switch(this._removePointer(o),this._pointers.length){case 0:this.domElement.releasePointerCapture(o.pointerId),this.domElement.ownerDocument.removeEventListener("pointermove",this._onPointerMove),this.domElement.ownerDocument.removeEventListener("pointerup",this._onPointerUp),this.dispatchEvent(vs),this.state=K.NONE,this._cursorStyle==="grab"&&(this.domElement.style.cursor="grab");break;case 1:const e=this._pointers[0],t=this._pointerPositions[e];this._onTouchStart({pointerId:e,pageX:t.x,pageY:t.y});break}}function Di(o){let e;switch(o.button){case 0:e=this.mouseButtons.LEFT;break;case 1:e=this.mouseButtons.MIDDLE;break;case 2:e=this.mouseButtons.RIGHT;break;default:e=-1}switch(e){case Je.DOLLY:if(this.enableZoom===!1)return;this._handleMouseDownDolly(o),this.state=K.DOLLY;break;case Je.ROTATE:if(o.ctrlKey||o.metaKey||o.shiftKey){if(this.enablePan===!1)return;this._handleMouseDownPan(o),this.state=K.PAN}else{if(this.enableRotate===!1)return;this._handleMouseDownRotate(o),this.state=K.ROTATE}break;case Je.PAN:if(o.ctrlKey||o.metaKey||o.shiftKey){if(this.enableRotate===!1)return;this._handleMouseDownRotate(o),this.state=K.ROTATE}else{if(this.enablePan===!1)return;this._handleMouseDownPan(o),this.state=K.PAN}break;default:this.state=K.NONE}this.state!==K.NONE&&this.dispatchEvent($t)}function Ri(o){switch(this.state){case K.ROTATE:if(this.enableRotate===!1)return;this._handleMouseMoveRotate(o);break;case K.DOLLY:if(this.enableZoom===!1)return;this._handleMouseMoveDolly(o);break;case K.PAN:if(this.enablePan===!1)return;this._handleMouseMovePan(o);break}}function Ci(o){this.enabled===!1||this.enableZoom===!1||this.state!==K.NONE||(o.preventDefault(),this.dispatchEvent($t),this._handleMouseWheel(this._customWheelEvent(o)),this.dispatchEvent(vs))}function Ni(o){this.enabled!==!1&&this._handleKeyDown(o)}function Ii(o){switch(this._trackPointer(o),this._pointers.length){case 1:switch(this.touches.ONE){case Ze.ROTATE:if(this.enableRotate===!1)return;this._handleTouchStartRotate(o),this.state=K.TOUCH_ROTATE;break;case Ze.PAN:if(this.enablePan===!1)return;this._handleTouchStartPan(o),this.state=K.TOUCH_PAN;break;default:this.state=K.NONE}break;case 2:switch(this.touches.TWO){case Ze.DOLLY_PAN:if(this.enableZoom===!1&&this.enablePan===!1)return;this._handleTouchStartDollyPan(o),this.state=K.TOUCH_DOLLY_PAN;break;case Ze.DOLLY_ROTATE:if(this.enableZoom===!1&&this.enableRotate===!1)return;this._handleTouchStartDollyRotate(o),this.state=K.TOUCH_DOLLY_ROTATE;break;default:this.state=K.NONE}break;default:this.state=K.NONE}this.state!==K.NONE&&this.dispatchEvent($t)}function Oi(o){switch(this._trackPointer(o),this.state){case K.TOUCH_ROTATE:if(this.enableRotate===!1)return;this._handleTouchMoveRotate(o),this.update();break;case K.TOUCH_PAN:if(this.enablePan===!1)return;this._handleTouchMovePan(o),this.update();break;case K.TOUCH_DOLLY_PAN:if(this.enableZoom===!1&&this.enablePan===!1)return;this._handleTouchMoveDollyPan(o),this.update();break;case K.TOUCH_DOLLY_ROTATE:if(this.enableZoom===!1&&this.enableRotate===!1)return;this._handleTouchMoveDollyRotate(o),this.update();break;default:this.state=K.NONE}}function Wi(o){this.enabled!==!1&&o.preventDefault()}function $i(o){o.key==="Control"&&(this._controlActive=!0,this.domElement.getRootNode().addEventListener("keyup",this._interceptControlUp,{passive:!0,capture:!0}))}function Ui(o){o.key==="Control"&&(this._controlActive=!1,this.domElement.getRootNode().removeEventListener("keyup",this._interceptControlUp,{passive:!0,capture:!0}))}function Bi(o){if(o.kind!=="building"||!o.parts.length)return[];const e=o.parts.map(ct).filter(({min:t,max:s})=>(s[1]<=1.2+1e-6||s[1]-t[1]<.3)&&s[0]-t[0]>1&&s[2]-t[2]>1);if(!e.length){const t=Qs(o);e.push({min:[t.min[0],0,t.min[2]],max:[t.max[0],0,t.max[2]]})}return e.map(({min:t,max:s})=>({x:(t[0]+s[0])/2,y:s[1]+.012,z:(t[2]+s[2])/2,width:(s[0]-t[0])*.96,depth:(s[2]-t[2])*.96}))}class _s{group=new he;material=new bs({uniforms:{night:{value:0},warmth:{value:new H("#ffb24d")},strength:{value:.34}},vertexShader:`varying vec2 lightUv;
|
|
2
2
|
void main() { lightUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); }`,fragmentShader:`uniform float night; uniform vec3 warmth; uniform float strength; varying vec2 lightUv;
|
|
3
3
|
void main() {
|
|
4
4
|
vec2 p = lightUv * 2.0 - 1.0;
|
|
Binary file
|
|
Binary file
|