Problem: the hexagonal refactor churns the backend tree for nine more phases; the UI delivery stack (web/ SPA, cmd/desktop Wails wrapper, compose/web image) must move to its own repo first so doc/layout rewrites land once on a backend-only tree. Change: - New repo git.hubris.network/dtoro/oikos-web (v0.33.0): web/, desktop/ (updateURL repointed to oikos-web releases), compose/, own CI (web + desktop jobs), own deploy script (CI-green gate, TOCTOU guard, version-tagged images, prune-to-3), own webhook receiver on :9798 + launchd unit, own compose project publishing the same 8091:80. - Cutover executed on mac-mini in order: oikos stack's web service stopped+removed, oikos-web project brought up on 8091; outer Caddy untouched (targets the published port) — serving + Authentik flow + /wails 404 quirk verified post-cutover. - Stripped from oikos: web/, cmd/desktop/, compose/web/, desktop CI workflow, ci.yml web job, Makefile ui/desktop/desktop-package/install targets, the compose web service, oikos-web from deploy.sh's fallback prune list; wails + go-keyring dropped from go.mod, vendor synced. - README / CONTRIBUTING / AGENTS.md / .agents dev+operations docs now point at the new repo; mbse + mascot design docs carry a path note. Risk: production SPA serving depends on the new pipeline now; rollback is versioned-image re-up of the old web service from a pre-split checkout (port 8091). Desktop builds installed before the split still check dtoro/oikos releases — one manual reinstall, noted in the oikos-web release notes. Verification: go vet, make test (race), make generate-check, golangci (no new findings; baseline down 400→365); post-cutover curls — localhost:8091 200, /wails/runtime.js 404, outer Caddy 302 Authentik.
2 lines
36 KiB
JavaScript
2 lines
36 KiB
JavaScript
import{p as ce,W as T,Y as ve,cD as Fn,Z as ie,bO as Un,Q as z,j as L,_ as xe,a0 as He,a as v,b as ue,V as Wt,X as jt,cE as Bn,R as ne,bM as Yn,U as Xe,g as a,bN as Hn,bX as Xn,cF as Vn,u as P,a1 as Qe,cG as Gn,a2 as Ve,$ as Ue,f as $,bF as St,c as V,cH as Kn,bP as Wn,a7 as ae,a4 as zt,s as te,ad as jn,a6 as mt,o as pt,av as zn,af as kt,D as y,an as Be,a5 as Je,t as _e,C as Ye,y as Z,cI as lt,cJ as qn,cK as Qn,cL as At,x as qt,d as Re,aa as rt,ac as Qt,cM as Jn,e as Me,i as Zn,cN as $n,ag as ea,cy as ta,cO as na,cP as aa,cQ as oa,cR as ra,cS as sa,cT as ia,cU as la,cV as ca}from"./index-B5w8gw75.js";function ua(e,n){ce(n,!0);let t=T(n,"open",15,!1),o=T(n,"onOpenChange",3,ve),s=T(n,"onOpenChangeComplete",3,ve);Fn.create({open:ie(()=>t(),i=>{var p;t(i),(p=o())==null||p(i)}),onOpenChangeComplete:ie(()=>s())}),Un(e,{children:(i,p)=>{var m=z(),x=L(m);xe(x,()=>n.children??He),v(i,m)},$$slots:{default:!0}}),ue()}var da=new Set(["$$slots","$$events","$$legacy","id","ref","children","child","loop","onInteractOutside","forceMount","onEscapeKeydown","interactOutsideBehavior","escapeKeydownBehavior","onOpenAutoFocus","onCloseAutoFocus","onFocusOutside","side","trapFocus","style"]),Et=$("<div><div><!></div></div>");function fa(e,n){const t=Wt();ce(n,!0);let o=T(n,"id",19,()=>jt(t)),s=T(n,"ref",15,null),i=T(n,"loop",3,!0),p=T(n,"onInteractOutside",3,ve),m=T(n,"forceMount",3,!1),x=T(n,"onEscapeKeydown",3,ve),M=T(n,"interactOutsideBehavior",3,"defer-otherwise-close"),R=T(n,"escapeKeydownBehavior",3,"defer-otherwise-close"),_=T(n,"onOpenAutoFocus",3,ve),N=T(n,"onCloseAutoFocus",3,ve),C=T(n,"onFocusOutside",3,ve),G=T(n,"side",3,"right"),w=T(n,"trapFocus",3,!1),K=Ve(n,da);const f=Bn.create({id:ie(()=>o()),loop:ie(()=>i()),ref:ie(()=>s(),c=>s(c)),isSub:!0,onCloseAutoFocus:ie(()=>D)});function Y(c){const Q=c.currentTarget.contains(c.target),ee=Gn[f.parentMenu.root.opts.dir.current].includes(c.key);if(Q&&ee){f.parentMenu.onClose();const E=f.parentMenu.triggerNode;E==null||E.focus(),c.preventDefault()}}const W=P(()=>f.parentMenu.root.getBitsAttr("sub-content")),u=P(()=>Qe(K,f.props,{side:G(),onkeydown:Y,[a(W)]:""}));function l(c){_()(c),!c.defaultPrevented&&(c.preventDefault(),f.parentMenu.root.isUsingKeyboard&&f.parentMenu.contentNode&&Vn.dispatch(f.parentMenu.contentNode))}function D(c){N()(c),!c.defaultPrevented&&c.preventDefault()}function A(c){p()(c),!c.defaultPrevented&&f.parentMenu.onClose()}function U(c){x()(c),!c.defaultPrevented&&f.parentMenu.onClose()}function q(c){var E,de;if(C()(c),c.defaultPrevented||!Xn(c.target)||c.target.id===((E=f.parentMenu.triggerNode)==null?void 0:E.id))return;const Q=(de=f.parentMenu.parentMenu)==null?void 0:de.contentNode;if(Q!=null&&Q.contains(c.target)){f.parentMenu.onClose(),c.preventDefault();return}const ee=`[${f.parentMenu.root.getBitsAttr("sub-content")}]`;if(c.target.closest(ee)){c.preventDefault();return}f.parentMenu.onClose()}var F=z(),H=L(F);{var j=c=>{Yn(c,Xe(()=>a(u),{get ref(){return f.opts.ref},get interactOutsideBehavior(){return M()},get escapeKeydownBehavior(){return R()},onOpenAutoFocus:l,get enabled(){return f.parentMenu.opts.open.current},onInteractOutside:A,onEscapeKeydown:U,onFocusOutside:q,preventScroll:!1,get loop(){return i()},get trapFocus(){return w()},get shouldRender(){return f.shouldRender},popper:(ee,E)=>{let de=()=>(E==null?void 0:E()).props,pe=()=>(E==null?void 0:E()).wrapperProps;const oe=P(()=>Qe(de(),a(u),{style:St("menu")},{style:n.style}));var ge=z(),we=L(ge);{var he=B=>{var J=z(),se=L(J);{let fe=P(()=>({props:a(oe),wrapperProps:pe(),...f.snippetProps}));xe(se,()=>n.child,()=>a(fe))}v(B,J)},re=B=>{var J=Et();Ue(J,()=>({...pe()}));var se=V(J);Ue(se,()=>({...a(oe)}));var fe=V(se);xe(fe,()=>n.children??He),v(B,J)};ne(we,B=>{n.child?B(he):B(re,-1)})}v(ee,ge)},$$slots:{popper:!0}}))},O=c=>{Hn(c,Xe(()=>a(u),{get ref(){return f.opts.ref},get interactOutsideBehavior(){return M()},get escapeKeydownBehavior(){return R()},onCloseAutoFocus:D,onOpenAutoFocus:l,get open(){return f.parentMenu.opts.open.current},onInteractOutside:A,onEscapeKeydown:U,onFocusOutside:q,preventScroll:!1,get loop(){return i()},get trapFocus(){return w()},get shouldRender(){return f.shouldRender},popper:(ee,E)=>{let de=()=>(E==null?void 0:E()).props,pe=()=>(E==null?void 0:E()).wrapperProps;const oe=P(()=>Qe(de(),a(u),{style:St("menu")},{style:n.style}));var ge=z(),we=L(ge);{var he=B=>{var J=z(),se=L(J);{let fe=P(()=>({props:a(oe),wrapperProps:pe(),...f.snippetProps}));xe(se,()=>n.child,()=>a(fe))}v(B,J)},re=B=>{var J=Et();Ue(J,()=>({...pe()}));var se=V(J);Ue(se,()=>({...a(oe)}));var fe=V(se);xe(fe,()=>n.children??He),v(B,J)};ne(we,B=>{n.child?B(he):B(re,-1)})}v(ee,ge)},$$slots:{popper:!0}}))};ne(H,c=>{m()?c(j):m()||c(O,1)})}v(e,F),ue()}var ma=new Set(["$$slots","$$events","$$legacy","id","disabled","ref","children","child","onSelect","openDelay"]),pa=$("<div><!></div>");function ga(e,n){const t=Wt();ce(n,!0);let o=T(n,"id",19,()=>jt(t)),s=T(n,"disabled",3,!1),i=T(n,"ref",15,null),p=T(n,"onSelect",3,ve),m=T(n,"openDelay",3,0),x=Ve(n,ma);const M=Kn.create({disabled:ie(()=>s()),onSelect:ie(()=>p()),id:ie(()=>o()),ref:ie(()=>i(),_=>i(_)),openDelay:ie(()=>m())}),R=P(()=>Qe(x,M.props));Wn(e,{get id(){return o()},get ref(){return M.opts.ref},children:(_,N)=>{var C=z(),G=L(C);{var w=f=>{var Y=z(),W=L(Y);xe(W,()=>n.child,()=>({props:a(R)})),v(f,Y)},K=f=>{var Y=pa();Ue(Y,()=>({...a(R)}));var W=V(Y);xe(W,()=>n.children??He),v(f,Y)};ne(G,f=>{n.child?f(w):f(K,-1)})}v(_,C)},$$slots:{default:!0}}),ue()}var ha=new Set(["$$slots","$$events","$$legacy","open"]);function ba(e,n){ce(n,!0);let t=T(n,"open",15,!1),o=Ve(n,ha);var s=z(),i=L(s);ae(i,()=>ua,(p,m)=>{m(p,Xe(()=>o,{get open(){return t()},set open(x){t(x)}}))}),v(e,s),ue()}var va=new Set(["$$slots","$$events","$$legacy","ref","class"]);function ya(e,n){ce(n,!0);let t=T(n,"ref",15,null),o=Ve(n,va);var s=z(),i=L(s);{let p=P(()=>zt("data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 bg-popover text-popover-foreground min-w-32 rounded-md border p-1 shadow-lg duration-100",n.class));ae(i,()=>fa,(m,x)=>{x(m,Xe({"data-slot":"context-menu-sub-content",get class(){return a(p)}},()=>o,{get ref(){return t()},set ref(M){t(M)}}))})}v(e,s),ue()}var xa=new Set(["$$slots","$$events","$$legacy","ref","class","inset","children"]),_a=$("<!> <!>",1);function Ma(e,n){ce(n,!0);let t=T(n,"ref",15,null),o=Ve(n,xa);var s=z(),i=L(s);{let p=P(()=>zt("focus:bg-accent focus:text-accent-foreground data-open:bg-accent data-open:text-accent-foreground rounded-sm px-2 py-1.5 text-sm data-inset:pl-8 [&_svg:not([class*='size-'])]:size-4 flex cursor-default items-center outline-hidden select-none data-inset:ps-8 [&_svg]:pointer-events-none [&_svg]:shrink-0",n.class));ae(i,()=>ga,(m,x)=>{x(m,Xe({"data-slot":"context-menu-sub-trigger",get"data-inset"(){return n.inset},get class(){return a(p)}},()=>o,{get ref(){return t()},set ref(M){t(M)},children:(M,R)=>{var _=_a(),N=L(_);xe(N,()=>n.children??He);var C=te(N,2);jn(C,{class:"ml-auto"}),v(M,_)},$$slots:{default:!0}}))})}v(e,s),ue()}const De={src:"/mascot/egg-idle.png",frames:1,fps:1,loop:!0},wa={src:"/mascot/egg-shell.png",frames:1,fps:1,loop:!0},Jt={egg:{"egg-idle":De,"egg-wiggle":De,hatch:wa,dragged:De,"fall-flutter":De,land:De},chick:{idle:{src:"/mascot/idle.png",frames:4,fps:6,loop:!0},blink:{src:"/mascot/blink.png",frames:4,fps:6,loop:!0},walk:{src:"/mascot/walk.png",frames:4,fps:8,loop:!0},peck:{src:"/mascot/peck.png",frames:4,fps:6,loop:!0},flap:{src:"/mascot/jump.png",frames:4,fps:8,loop:!0},sleep:{src:"/mascot/sleep.png",frames:4,fps:4,loop:!0},talk:{src:"/mascot/peep.png",frames:2,fps:6,loop:!0},dragged:{src:"/mascot/jump.png",frames:4,fps:8,loop:!0},"fall-flutter":{src:"/mascot/jump.png",frames:4,fps:10,loop:!0},land:{src:"/mascot/hurt.png",frames:4,fps:8,loop:!1},"react-think":{src:"/mascot/react-sigh.png",frames:4,fps:4,loop:!0},"react-eureka":{src:"/mascot/react-joy.png",frames:4,fps:6,loop:!0},"react-alarm":{src:"/mascot/react-yell.png",frames:4,fps:8,loop:!0},"react-happy":{src:"/mascot/react-joy.png",frames:4,fps:6,loop:!0}},adult:{idle:{src:"/mascot/idle.png",frames:4,fps:6,loop:!0},blink:{src:"/mascot/blink.png",frames:4,fps:6,loop:!0},walk:{src:"/mascot/walk.png",frames:4,fps:8,loop:!0},peck:{src:"/mascot/peck.png",frames:4,fps:6,loop:!0},flap:{src:"/mascot/jump.png",frames:4,fps:8,loop:!0},sleep:{src:"/mascot/sleep.png",frames:4,fps:4,loop:!0},talk:{src:"/mascot/peep.png",frames:2,fps:6,loop:!0},dragged:{src:"/mascot/jump.png",frames:4,fps:8,loop:!0},"fall-flutter":{src:"/mascot/jump.png",frames:4,fps:10,loop:!0},land:{src:"/mascot/hurt.png",frames:4,fps:8,loop:!1},"react-think":{src:"/mascot/react-sigh.png",frames:4,fps:4,loop:!0},"react-eureka":{src:"/mascot/react-joy.png",frames:4,fps:6,loop:!0},"react-alarm":{src:"/mascot/react-yell.png",frames:4,fps:8,loop:!0},"react-happy":{src:"/mascot/react-joy.png",frames:4,fps:6,loop:!0}}},Tt={egg:1,chick:1,adult:1},Sa={src:"/mascot/idle.png",frames:4,fps:6,loop:!0};function ka(e,n){const t=Jt[e],o=t[n];if(o)return o;if(n!=="idle"){const s=t.idle;if(s)return s}return Sa}function Aa(e,n,t){const o=n-t;if(e.frames<=1)return 0;const s=Math.floor(o/1e3*e.fps);return e.loop?(s%e.frames+e.frames)%e.frames:Math.min(s,e.frames-1)}const ct=new Map;function Ea(e){const n=ct.get(e);return n&&n.complete?Promise.resolve(n):new Promise((t,o)=>{const s=new Image;s.src=e,s.onload=()=>{ct.set(e,s),t(s)},s.onerror=()=>o(new Error(`mascot: failed to load ${e}`))})}async function Ta(e=["egg","chick","adult"]){const n=new Set;for(const t of e)for(const o of Object.values(Jt[t]))o&&o.src&&n.add(o.src);await Promise.all([...n].map(Ea))}function Pa(e){const n=ct.get(e);return!n||!n.complete?null:n}const ye=20,Ae=28,Fe=16;function Ia(e,n,t,o,s){e.clearRect(0,0,ye,Ae);const i=t.src?Pa(t.src):null;if(!i)return;const m=Math.max(0,Math.min(o,t.frames-1))*Fe,x=s.scale,M=Fe*x,R=Fe*x,_=(ye-M)/2+Math.sin(s.wiggle)*1.2,N=Ae-R;e.save(),s.facing===-1&&(e.translate(ye,0),e.scale(-1,1)),e.imageSmoothingEnabled=!1,e.drawImage(i,m,0,Fe,Fe,_,N,M,R),e.restore()}const Pt=1400,ut=320,Ca=1e3,dt=36,be=24,Oa=330,It=600,Na=160,La=260,Ra=-150,Da=22,Fa=1.4,Ua=250,Ba=.34,Ya=1,Ha=140,Xa=420,Va=.5,Ga=900,Ct=150,Ot=.45,Ka=70,Nt=900,Lt=[1500,4e3],Rt=[2500,5e3],Dt=[1200,2200],Ft=[6e3,12e3],$e=400,Ut=1800,Wa=.12,ja=25e3,za=2200,Bt=["🐔 Bawk.","💭 Wonder what's up on hubris…","🌾 Any seeds around?","😌 Nice day for uptime.","📦 So many containers…","☁️ Backup time yet?","🥚 Remember when I was an egg?","🔧 *pecks at nothing in particular*","🐧 Penguins are cool too, I guess."];let Yt=0;function qa(e,n){return e+Math.random()*(n-e)}function Qa(e){const n=e.reduce((o,s)=>o+(s.weight??0),0);let t=Math.random()*n;for(const o of e)if(t-=o.weight??0,t<=0)return o;return e[0]}function Zt(e,n){e.fallPhaseAt=n;const t=Math.max(0,Math.min(1,e.vy/ut)),o=It-t*(It-Oa);e.flapCycleMs=o*(.85+Math.random()*.3)}function Oe(e){return e.groundY}function $t(e){const n=be/2,t=e.bounds.w-be/2;e.x<n&&(e.x=n,e.facing=1),e.x>t&&(e.x=t,e.facing=-1)}const ft={egg:{id:"egg",anim:()=>"egg-idle",tick:()=>{},next:()=>"egg",minMs:0,maxMs:0},idle:{id:"idle",anim:e=>{if(e.bubbleText)return"talk";const n=performance.now();return n>=e.blinkUntil&&n<e.blinkUntil+150?"blink":"idle"},enter:e=>{e.blinkUntil=performance.now()+2e3+Math.random()*4e3;const n=performance.now();n-Yt>ja&&Math.random()<Wa&&(Yt=n,e.bubbleText=Bt[Math.floor(Math.random()*Bt.length)],e.bubbleUntil=n+za)},tick:()=>{},next:()=>null,weight:3,minMs:Lt[0],maxMs:Lt[1]},wander:{id:"wander",anim:()=>"walk",enter:e=>{e.vx=e.facing*dt},tick:e=>{e.x+=e.vx*(1/60)},next:()=>null,weight:4,minMs:Rt[0],maxMs:Rt[1]},peck:{id:"peck",anim:()=>"peck",tick:()=>{},next:()=>null,weight:2,minMs:Dt[0],maxMs:Dt[1]},hop:{id:"hop",anim:()=>"flap",enter:e=>{e.vy=-210,e.vx=e.facing*Ka},tick:()=>{},next:()=>null,weight:2,minMs:Nt,maxMs:Nt*2},sleep:{id:"sleep",anim:()=>"sleep",tick:()=>{},next:()=>null,weight:1,minMs:Ft[0],maxMs:Ft[1]},dragged:{id:"dragged",anim:()=>"dragged",tick:()=>{},next:()=>null,minMs:0,maxMs:0},falling:{id:"falling",anim:e=>performance.now()-e.fallPhaseAt<Na?"flap":"fall-flutter",enter:e=>{e.bounceCount=0,Zt(e,performance.now())},tick:()=>{},next:()=>null,minMs:0,maxMs:0},land:{id:"land",anim:()=>"land",tick:()=>{},next:e=>e.investigateOnLand?(e.investigateOnLand=!1,"peck"):"idle",minMs:$e,maxMs:$e},react:{id:"react",anim:e=>e.reactAnim??"idle",tick:()=>{},next:()=>"idle",minMs:Ut,maxMs:Ut},busy:{id:"busy",anim:e=>e.busyTalking?"talk":"react-think",tick:()=>{},next:()=>"idle",minMs:0,maxMs:0}};function X(e,n,t){var s;e.behavior=n,t!=null&&t.anim&&(n==="react"?e.reactAnim=t.anim:(e.anim=t.anim,e.animStart=performance.now())),n==="react"&&(t!=null&&t.anim)&&(e.anim=t.anim,e.animStart=performance.now());const o=ft[n];t!=null&&t.durationMs?e.behaviorUntil=performance.now()+t.durationMs:o.maxMs>0?e.behaviorUntil=performance.now()+qa(o.minMs,o.maxMs):e.behaviorUntil=Number.POSITIVE_INFINITY,(s=o.enter)==null||s.call(o,e)}function Ja(e,n,t,o){const s=o/1e3,i=ft[e.behavior];switch(e.behavior){case"wander":{e.x+=e.vx*s,e.x<be/2?(e.x=be/2,e.facing=1,e.vx=dt):e.x>e.bounds.w-be/2&&(e.x=e.bounds.w-be/2,e.facing=-1,e.vx=-dt),e.y<Oe(e)-1&&X(e,"falling");break}case"idle":{e.y<Oe(e)-1&&X(e,"falling");break}case"falling":{t-e.fallPhaseAt>=e.flapCycleMs&&(e.vy=Math.max(Ra,e.vy-La),Zt(e,t)),e.vy+=Pt*s,e.vy>ut&&(e.vy=Math.max(ut,e.vy-Ca*s)),e.vx*=Math.max(0,1-Fa*s);const m=Math.sin(t/260)*Da;e.x+=(e.vx+m)*s,e.y+=e.vy*s,Math.abs(e.vx)>40&&(e.facing=e.vx>0?1:-1);const x=be/2,M=e.bounds.w-be/2;e.x<=x&&e.vx<-Ct?(e.x=x,e.vx=-e.vx*Ot):e.x>=M&&e.vx>Ct&&(e.x=M,e.vx=-e.vx*Ot);const R=Oe(e);if(e.y>=R&&e.vy>0){e.y=R;const _=e.vy;if(_>=Ua&&e.bounceCount<Ya)e.bounceCount++,e.vy=-_*Ba,e.impactVy=_*.8,e.squashAt=t;else{e.vy=0,e.impactVy=_,e.squashAt=t;const N=Math.abs(e.vx);e.vx=N>=Ha?Math.sign(e.vx)*Math.min(N,Xa)*Va:0,X(e,"land",{durationMs:$e})}}break}case"hop":{e.vy+=Pt*s,e.x+=e.vx*s,e.y+=e.vy*s;const m=Oe(e);e.vy>0&&m-e.y>48?X(e,"falling"):e.y>=m&&e.vy>0&&(e.y=m,e.impactVy=e.vy,e.squashAt=t,e.vy=0,e.vx=0,X(e,"idle"));break}case"land":{if(e.vx!==0){e.x+=e.vx*s;const m=Ga*s;e.vx=Math.abs(e.vx)<=m?0:e.vx-Math.sign(e.vx)*m}break}}if(e.behavior!=="dragged"&&$t(e),e.behavior==="react"&&e.reactAnim)e.anim=e.reactAnim;else{const m=i.anim(e,n);m!==e.anim&&(e.anim=m,e.animStart=t)}if(e.behavior==="dragged"||e.behavior==="falling"||e.behavior==="hop"||t<e.behaviorUntil)return;const p=i.next(e,t);if(p)X(e,p);else{const m=Object.values(ft).filter(x=>(x.weight??0)>0);if(m.length>0){const x=Qa(m);X(e,x.id)}}}function st(e){const n=Oe(e);e.y>=n?(e.y=n,e.vy=0,e.vx=0,e.impactVy=0,e.squashAt=performance.now(),X(e,"land",{durationMs:$e})):X(e,"falling")}function Za(e,n){const t=Oe(e);(e.y>=n-1||e.y>t)&&(e.y=t,e.vy=0),e.behavior!=="dragged"&&$t(e)}const gt="oikos-mascot",$a=300,en=200;function Te(){return{version:1,stage:"egg",name:null,hatchProgress:0,happiness:50,xp:0,hatchedAt:null,lastPos:null,lastSeen:Date.now()}}const I=mt(Te());function eo(e){if(e&&typeof e=="object"){const n=e;if(n.version===1)return{...Te(),...n,version:1}}return Te()}function to(){if(typeof localStorage>"u")return Te();const e=localStorage.getItem(gt);if(!e)return Te();try{return eo(JSON.parse(e))}catch{return Te()}}let Ee=null;function Ge(){typeof localStorage>"u"||(Ee&&clearTimeout(Ee),Ee=setTimeout(()=>{Ee=null;try{localStorage.setItem(gt,JSON.stringify(I))}catch{}},$a))}function no(){if(Ee&&(clearTimeout(Ee),Ee=null),typeof localStorage<"u")try{localStorage.setItem(gt,JSON.stringify(I))}catch{}}function tn(){if(typeof localStorage>"u")return;const e=to();Object.assign(I,e),I.lastSeen=Date.now(),typeof window<"u"&&window.addEventListener("beforeunload",no)}function le(){return I}function et(e){I.stage=e,e!=="egg"&&I.hatchedAt===null&&(I.hatchedAt=Date.now()),e==="adult"&&(I.xp=Math.max(I.xp,en)),Ge()}function ao(e){I.name=e.slice(0,24),Ge()}function nn(e){e!==0&&(I.xp=Math.max(0,I.xp+e),Ge())}function Ht(){I.happiness=Math.min(100,I.happiness+4),nn(1)}function oo(e){I.lastPos={x:e},Ge()}function ro(){Object.assign(I,Te()),Ge()}function so(e){const n=e/1e3;I.stage==="chick"&&(I.happiness=Math.max(0,I.happiness-.05*n)),I.lastSeen=Date.now(),an()}function an(){I.stage==="egg"&&I.hatchProgress>=1?et("chick"):I.stage==="chick"&&I.xp>=en&&et("adult")}function io(){I.stage==="egg"&&(I.hatchProgress=1,et("chick"))}var lo=$('<span class="bubble-cursor svelte-zc9y12"></span>'),co=$("<div><div><span> <!></span></div> <div></div></div>"),uo=$('<div class="whitespace-nowrap rounded-full bg-popover/40 px-1.5 py-0.5 text-[10px] font-normal text-popover-foreground/75 svelte-zc9y12"> </div>'),fo=$('<div class="pointer-events-none absolute left-0 top-0 select-none svelte-zc9y12"><!></div>'),mo=$("<canvas></canvas> <!>",1);function po(e,n){ce(n,!0);let t=T(n,"runtime",15);const o=3,s=5,i=6,p=12,m=4,x=120,M=900,R=400,_=16,N=100,C=1e3,G=.45,w=3,K=.32,f=280,Y=550,W=["#ffffff","#fef3c7","#fde68a"];let u=Z(null),l=null,D=0,A=0,U=0,q=Z(!1),F=null,H={x:0,y:0},j=!1,O=[],c=0,Q=Z(1),ee=Z(1),E=Z(0),de=Z(0),pe=16,oe=[],ge=0,we={order:[],windows:{}},he=0;const re=P(le);function B(){return a(re).stage}function J(r){let d=t().bounds.h;for(const h of we.order){const g=we.windows[h];if(!g||g.stage==="minimized")continue;const S=g.bounds,k=r>=S.x-4&&r<=S.x+S.width+4,b=S.y>=t().y-m;k&&b&&S.y<d&&(d=S.y)}return d}function se(){const r=t().anim;return{anim:ka(B(),r),name:r}}const fe={tasks:"📋 Tasks!",kb:"🗂️ Ooh, data!",ops:"🛡️ All clear?",signals:"📡 Anything new?",knowledge:"🔍 Curious…",learning:"📈 Growing!",settings:"⚙️ Tinkering?"},rn="👀 Ooh!";function sn(r,d){const h=qn();for(const g of Object.keys(h)){const S=h[g]??{col:0,row:0},{x:k,y:b}=Qn(S);if(r>=k&&r<=k+At.cell&&d>=b&&d<=b+At.cell)return g}return null}function ln(r){const d=Math.min(N,r-A);A=r;const h=J(t().x);if(t().behavior!=="falling"&&t().behavior!=="dragged"&&t().behavior!=="hop"){if(h-he>p&&t().y>=he-1)X(t(),"falling");else if(t().y!==h){const g=h-t().y;t(t().y+=Math.abs(g)<=i?g:Math.sign(g)*i,!0)}}if(t(t().groundY=h,!0),he=h,Ja(t(),a(re),r,d),pe=d,cn(r,d),t().bubbleText&&r>=t().bubbleUntil&&(t(t().bubbleText=null,!0),t(t().bubbleUntil=0,!0)),t().bubbleText&&a(Pe)<a(Ie)){const g=Math.min(An,En/a(Ie));y(Pe,Math.min(a(Ie),a(Pe)+d/g),!0)}U===0&&(U=r),r-U>=C&&(so(r-U),U=r,an(),a(re).stage!=="egg"&&t().behavior==="egg"&&X(t(),"idle"))}function cn(r,d){const h=(r-t().squashAt)/1e3;if(t().squashAt>0&&h<G){const k=Math.min(K,t().impactVy/1100)*Math.exp(-6.5*h)*Math.cos(h*Math.PI*2*w);y(Q,1+k*.75),y(ee,1-k)}else if(t().behavior==="falling"||t().behavior==="hop"){const S=Math.min(.15,Math.abs(t().vy)/1600);y(Q,1-S*.6),y(ee,1+S)}else y(Q,1),y(ee,1);let g=0;t().behavior==="falling"?g=Math.max(-14,Math.min(14,t().vx*.02)):t().behavior==="dragged"&&j&&O.length>1?g=Math.max(-16,Math.min(16,bt().vx*.018)):t().behavior==="land"&&(g=Math.max(-8,Math.min(8,t().vx*.012))),y(E,a(E)+(g-a(E))*Math.min(1,d/110)),y(de,t().behavior==="wander"?-Math.abs(Math.sin(r*Math.PI/250))*1.5:0,!0),t().squashAt!==ge&&(ge=t().squashAt,t().impactVy>=f&&un(t().impactVy))}function un(r){const d=Math.min(9,4+Math.floor(r/90)),h=performance.now();for(let g=0;g<d;g++)oe.push({x:t().x+(Math.random()-.5)*8,y:t().y-Math.random()*2,vx:(Math.random()-.5)*140,vy:-(40+Math.random()*120),born:h,life:450+Math.random()*300,size:Math.random()<.5?1:2,tint:W[Math.floor(Math.random()*W.length)]})}function dn(){if(!a(u)||!l)return;const r=performance.now();B()==="egg"&&t().behavior!=="dragged"?c+=.08:c=0;const{anim:h}=se(),g=Aa(h,r,t().animStart),S=Tt[B()];if(Ia(l,B(),h,g,{scale:S,facing:t().facing,wiggle:c}),oe.length>0){const k=pe/1e3;oe=oe.filter(b=>r-b.born<b.life);for(const b of oe)b.vy+=Y*k,b.vx*=Math.max(0,1-2.5*k),b.x+=b.vx*k,b.y+=b.vy*k,l.globalAlpha=Math.max(0,1-(r-b.born)/b.life),l.fillStyle=b.tint,l.fillRect(Math.round(ye/2+(b.x-t().x)),Math.round(Ae-(t().y-b.y)),b.size,b.size);l.globalAlpha=1}}function ht(){D=setTimeout(ht,_);const r=performance.now();ln(r),dn()}function fn(r){if(r.button!==0)return;const d=r.currentTarget;F=r.pointerId,H={x:r.clientX,y:r.clientY},j=!1,O=[],d.setPointerCapture(r.pointerId),X(t(),"dragged"),y(q,!0)}function mn(r){var g;if(F!==r.pointerId)return;const d=r.clientX-H.x,h=r.clientY-H.y;if(!j&&Math.hypot(d,h)>s&&(j=!0),j){const S=(g=r.currentTarget.parentElement)==null?void 0:g.parentElement,k=S==null?void 0:S.getBoundingClientRect();if(k){t(t().x=Math.max(0,Math.min(k.width,r.clientX-k.left)),!0),t(t().y=Math.max(0,Math.min(k.height,r.clientY-k.top)),!0);const b=performance.now();for(O.push({t:b,x:t().x,y:t().y});O.length>1&&b-O[0].t>x;)O.shift()}}}function bt(){if(O.length<2)return{vx:0,vy:0};const r=O[0],d=O[O.length-1],h=(d.t-r.t)/1e3;if(h<.01)return{vx:0,vy:0};const g=Math.max(-M,Math.min(M,(d.x-r.x)/h)),S=(d.y-r.y)/h,k=S<0?Math.max(-700,S):Math.min(R,S);return{vx:g,vy:k}}function Ke(r,d){var h;(h=d==null?void 0:d.hasPointerCapture)!=null&&h.call(d,r)&&d.releasePointerCapture(r),F=null,y(q,!1)}function pn(r){if(F===r.pointerId){if(j){oo(t().x);const{vx:d,vy:h}=bt();if(t(t().vx=d,!0),t(t().vy=h,!0),B()!=="egg"){const g=sn(t().x,t().y);g&&(t(t().bubbleText=fe[g.id]??rn,!0),t(t().bubbleUntil=performance.now()+1800,!0),t(t().investigateOnLand=!0,!0),Ht())}st(t())}else{if(B()==="egg"&&a(re).name===null){O=[],Ke(r.pointerId,r.currentTarget),n.onRequestName();return}Ht(),n.onPet(),t(t().bubbleText="❤️",!0),t(t().bubbleUntil=performance.now()+1500,!0),X(t(),"react",{anim:"react-happy",durationMs:1500})}O=[],Ke(r.pointerId,r.currentTarget)}}function gn(r){F===r.pointerId&&(O=[],t(t().vx=0,!0),t(t().vy=0,!0),st(t()),Ke(r.pointerId,r.currentTarget))}function vt(r){F===r.pointerId&&(O=[],t(t().vx=0,!0),t(t().vy=0,!0),st(t()),Ke(r.pointerId,a(u)))}function hn(){a(u)&&(a(u).width=ye,a(u).height=Ae,l=a(u).getContext("2d"),l&&(l.imageSmoothingEnabled=!1))}pt(async()=>{var S,k;tn(),hn(),await Ta(),A=performance.now(),U=0,t(t().groundY=J(t().x),!0),he=t().groundY,ht();const r=(k=(S=a(u))==null?void 0:S.parentElement)==null?void 0:k.parentElement;let d=t().bounds.h;const h=new ResizeObserver(()=>{const b=r==null?void 0:r.getBoundingClientRect();if(b){const Ce=b.height;t(t().bounds={w:b.width,h:Ce},!0),Za(t(),d),d=Ce}});r&&h.observe(r);const g=zn.subscribe(b=>{we=b});return()=>{D&&clearTimeout(D),h.disconnect(),g()}});const yt=P(()=>t().x-ye*o/2),xt=P(()=>Math.max(0,t().y-Ae*o)),bn=16,vn=P(()=>a(xt)+Math.max(0,(Ae-bn*Tt[B()])*o)),yn=P(()=>a(yt)+ye*o/2),xn=4,_n=18,Mn=40,wn=P(()=>Math.max(0,a(vn)-xn-(t().bubbleText?Mn:_n))),Sn=P(()=>`translate3d(${a(yt)}px, ${a(xt)+a(de)}px, 0) rotate(${a(E)}deg) scale(${a(Q)}, ${a(ee)})`);let tt=Z(null),nt=Z(null),Se=Z(0),Ne=Z(0);const kn=45,An=28,En=1400;let Pe=Z(0);kt(()=>{t().bubbleText,y(Pe,0)});const Ie=P(()=>t().bubbleText?Array.from(t().bubbleText).length:0),at=P(()=>!t().bubbleText||a(Pe)>=a(Ie)),Tn=P(()=>t().bubbleText?Array.from(t().bubbleText).slice(0,Math.ceil(a(Pe))).join(""):null),Pn=P(()=>a(Ie)>0&&a(Ie)<=2),Le=P(()=>{var r;return t().behavior==="react"&&((r=t().reactAnim)!=null&&r.startsWith("react-"))?t().reactAnim.slice(6):null}),_t={alarm:{card:"border-red-400/70 text-red-500 dark:text-red-300 shadow-red-500/25",border:"border-red-400/70"},eureka:{card:"border-amber-400/70 text-amber-600 dark:text-amber-300 shadow-amber-500/25",border:"border-amber-400/70"},think:{card:"border-sky-400/60 text-sky-600 dark:text-sky-300",border:"border-sky-400/60"},happy:{card:"border-rose-400/70 text-rose-500 dark:text-rose-300 shadow-rose-500/25",border:"border-rose-400/70"}};kt(()=>{t().bubbleText,a(at);const r=a(tt),d=a(nt);if(!r||!d||!a(at)){y(Se,0),y(Ne,0);return}const h=requestAnimationFrame(()=>{const g=d.scrollWidth-r.clientWidth;if(g>2){y(Se,-g),y(Ne,g/kn*2+1.6);const S=performance.now()+a(Ne)*1e3;t().bubbleUntil<S&&t(t().bubbleUntil=S,!0)}else y(Se,0),y(Ne,0)});return()=>cancelAnimationFrame(h)});var Mt=mo();Be("pointerup",lt,vt),Be("pointercancel",lt,vt);var me=L(Mt);Je(me,r=>y(u,r),()=>a(u));var In=te(me,2);{var Cn=r=>{var d=fo(),h=V(d);{var g=k=>{var b=z(),Ce=L(b);Jn(Ce,()=>t().bubbleText,On=>{var ot=co(),We=V(ot),je=V(We),wt=V(je),Nn=te(wt);{var Ln=ke=>{var Dn=lo();v(ke,Dn)};ne(Nn,ke=>{a(at)||ke(Ln)})}Je(je,ke=>y(nt,ke),()=>a(nt)),Je(We,ke=>y(tt,ke),()=>a(tt));var Rn=te(We,2);_e(()=>{Re(ot,1,`bubble-pop relative max-w-40 rounded-xl border bg-popover px-2.5 py-1 leading-[1.25] shadow-md ${(a(Le)?_t[a(Le)].card:"text-popover-foreground")??""} ${a(Le)==="alarm"?"bubble-shake":""} ${a(Pn)?"text-base":"text-sm"}`,"svelte-zc9y12"),Re(We,1,`overflow-hidden ${a(Se)===0?"text-center":"text-left"}`,"svelte-zc9y12"),Re(je,1,`inline-block whitespace-nowrap ${a(Se)!==0?"bubble-marquee":""}`,"svelte-zc9y12"),rt(je,a(Se)!==0?`--marquee-distance: ${a(Se)}px; --marquee-duration: ${a(Ne)}s;`:""),Me(wt,a(Tn)),Re(Rn,1,`absolute -bottom-[5px] left-1/2 h-2.5 w-2.5 -translate-x-1/2 rotate-45 border-r border-b bg-popover ${(a(Le)?_t[a(Le)].border:"")??""}`,"svelte-zc9y12")}),v(On,ot)}),v(k,b)},S=k=>{var b=uo(),Ce=V(b);_e(()=>Me(Ce,a(re).name)),v(k,b)};ne(h,k=>{t().bubbleText?k(g):k(S,-1)})}_e(()=>rt(d,`transform: translate3d(${a(yn)??""}px, ${a(wn)??""}px, 0) translateX(-50%); will-change: transform;`)),v(r,d)};ne(In,r=>{(t().bubbleText||a(re).name)&&r(Cn)})}_e(()=>{Re(me,1,`pointer-events-auto absolute left-0 top-0 select-none ${a(q)?"cursor-grabbing":"cursor-grab"}`,"svelte-zc9y12"),rt(me,`width: ${ye*o}px; height: ${Ae*o}px; transform: ${a(Sn)??""}; image-rendering: pixelated; will-change: transform; transform-origin: bottom center;`),Qt(me,"title",a(re).name??"Cluck")}),Ye("pointerdown",me,fn),Ye("pointermove",me,mn),Ye("pointerup",me,pn),Be("pointercancel",me,gn),v(e,Mt),ue()}qt(["pointerdown","pointermove","pointerup"]);var go=$("<!> ",1),ho=$("<!> <!>",1),bo=$('<span class="text-[11px] leading-snug font-normal text-muted-foreground"> </span>'),vo=$('<!> <span class="flex min-w-0 flex-1 flex-col"><span class="truncate"> </span> <!></span>',1);function on(e,n){ce(n,!0);const t=P(()=>n.actions.filter(i=>!i.visible||i.visible(n.ctx.model)));var o=z(),s=L(o);Zn(s,17,()=>a(t),i=>i.id,(i,p)=>{var m=z(),x=L(m);{var M=_=>{var N=z(),C=L(N);ae(C,()=>ba,(G,w)=>{w(G,{children:(K,f)=>{var Y=ho(),W=L(Y);ae(W,()=>Ma,(l,D)=>{D(l,{children:(A,U)=>{var q=go(),F=L(q);{var H=O=>{var c=z(),Q=L(c);ae(Q,()=>a(p).icon,(ee,E)=>{E(ee,{class:"size-4"})}),v(O,c)};ne(F,O=>{a(p).icon&&O(H)})}var j=te(F);_e(()=>Me(j,` ${a(p).label??""}`)),v(A,q)},$$slots:{default:!0}})});var u=te(W,2);ae(u,()=>ya,(l,D)=>{D(l,{class:"min-w-56 max-w-72",children:(A,U)=>{on(A,{get actions(){return a(p).children},get ctx(){return n.ctx}})},$$slots:{default:!0}})}),v(K,Y)},$$slots:{default:!0}})}),v(_,N)},R=_=>{var N=z(),C=L(N);ae(C,()=>$n,(G,w)=>{w(G,{onSelect:()=>{var K,f;(f=(K=a(p)).action)==null||f.call(K,n.ctx)},children:(K,f)=>{var Y=vo(),W=L(Y);{var u=F=>{var H=z(),j=L(H);ae(j,()=>a(p).icon,(O,c)=>{c(O,{class:"size-4"})}),v(F,H)};ne(W,F=>{a(p).icon&&F(u)})}var l=te(W,2),D=V(l),A=V(D),U=te(D,2);{var q=F=>{var H=bo(),j=V(H);_e(()=>Me(j,a(p).description)),v(F,H)};ne(U,F=>{a(p).description&&F(q)})}_e(()=>Me(A,a(p).label)),v(K,Y)},$$slots:{default:!0}})}),v(_,N)};ne(x,_=>{a(p).children&&a(p).children.length>0?_(M):_(R,-1)})}v(i,m)}),v(e,o),ue()}var yo=$('<button type="button" class="rounded-md px-3 py-1.5 text-sm text-popover-foreground/80 hover:bg-accent">Cancel</button>'),xo=$('<div class="fixed inset-0 z-[60] flex items-center justify-center bg-foreground/30 backdrop-blur-[1px]" role="presentation"><form class="w-80 rounded-xl border bg-popover p-5 text-popover-foreground shadow-xl ring-1 ring-foreground/10"><h2 class="mb-1 text-base font-semibold"> </h2> <p class="mb-3 text-xs text-popover-foreground/70"> </p> <input id="mascot-name-input" type="text" maxlength="24" class="w-full rounded-md border bg-background px-3 py-2 text-sm outline-none focus-visible:ring-2 focus-visible:ring-ring"/> <div class="mt-4 flex justify-end gap-2"><!> <button type="submit" class="rounded-md bg-primary px-4 py-1.5 text-sm font-medium text-primary-foreground hover:bg-primary/90"> </button></div></form></div>');function _o(e,n){ce(n,!0);let t=T(n,"mode",3,"hatch"),o=T(n,"initial",3,""),s=Z(mt(ea(()=>o())));pt(()=>{const l=document.getElementById("mascot-name-input");l==null||l.focus(),l==null||l.select()});function i(l){l.preventDefault();const D=a(s).trim();D&&n.onSubmit(D)}function p(l){l.key==="Escape"&&(l.preventDefault(),n.onCancel())}const m=P(()=>t()==="hatch"?"Your chick hatched!":"Rename your chicken"),x=P(()=>t()==="hatch"?"Name your chick…":"New name…");var M=xo();Be("keydown",lt,p);var R=V(M),_=V(R),N=V(_),C=te(_,2),G=V(C),w=te(C,2),K=te(w,2),f=V(K);{var Y=l=>{var D=yo();Ye("click",D,function(...A){var U;(U=n.onCancel)==null||U.apply(this,A)}),v(l,D)};ne(f,l=>{t()==="rename"&&l(Y)})}var W=te(f,2),u=V(W);_e(()=>{Me(N,a(m)),Me(G,t()==="hatch"?"Give it a name. It will follow your homelab activity from here on.":"Pick a new name."),Qt(w,"placeholder",a(x)),Me(u,t()==="hatch"?"Hatch!":"Save")}),Ye("click",M,l=>{l.currentTarget===l.target&&n.onCancel()}),Be("submit",R,i),ta(w,()=>a(s),l=>y(s,l)),v(e,M),ue()}qt(["click"]);const Ze={thinking:{id:"thinking",anim:"react-think",bubble:"💭 Thinking…",priority:1,cooldownMs:0,durationMs:4e3,interruptsSleep:!1},eureka:{id:"eureka",anim:"react-eureka",bubble:"💡 Eureka!",priority:2,cooldownMs:3e3,durationMs:2200,interruptsSleep:!1,effect:()=>nn(5)},alarmed:{id:"alarmed",anim:"react-alarm",bubble:"❗ Need your OK",priority:3,cooldownMs:3e3,durationMs:2500,interruptsSleep:!0},happy:{id:"happy",anim:"react-happy",bubble:"🎉 Nice work!",priority:1,cooldownMs:3e3,durationMs:2e3}},Xt=new Map;let Vt=0,Gt=0;const Mo=70;function Kt(e,n=Mo){return e.length>n?`${e.slice(0,n-1)}…`:e}function wo(e,n){const t=[];let o=null;return t.push(na.subscribe(s=>{if(o==null||o(),o=null,n(null),!s)return;const i=[],p=aa(s),m=oa(s),x=ra(s);i.push(sa([p.streaming,p.messages],([C,G])=>{if(!C)return null;const w=G[G.length-1];return(w==null?void 0:w.role)==="assistant"&&w.text.length>0?"talking":"thinking"}).subscribe(n));let M=new Set,R=!0;i.push(x.subscribe(C=>{const G=new Set;for(const w of C)G.add(w.id),!(R||M.has(w.id))&&(w.type==="knowledge"?it(Ze.eureka,e,`💡 ${Kt(w.description.replace(/^Recorded: /,""))}`):w.type==="complete"&&w.status!=="failed"&&it(Ze.happy,e,`🎉 ${Kt(w.description)}`));M=G,R=!1}));let _=!1,N=!0;i.push(m.openQuestion.subscribe(C=>{!N&&C&&!_&&it(Ze.alarmed,e),_=C!==null,N=!1})),o=()=>{for(const C of i)C()}})),t.push(()=>o==null?void 0:o()),()=>{for(const s of t)s()}}function it(e,n,t){const o=performance.now(),s=Xt.get(e.id)??0;e.cooldownMs>0&&o-s<e.cooldownMs||!(o>Gt)&&e.priority<Vt||(Xt.set(e.id,o),Vt=e.priority,Gt=o+e.durationMs,n(e,t))}function ze(e,n){var o;const t=Ze[n];e.runtime.bubbleText=t.bubble??null,e.runtime.bubbleUntil=performance.now()+t.durationMs,e.force("react",{anim:t.anim,durationMs:t.durationMs}),(o=t.effect)==null||o.call(t)}function qe(e,n,t){e.runtime.bubbleText=n,e.runtime.bubbleUntil=performance.now()+t}const So=[{id:"interact",label:"Interact",children:[{id:"pet",label:"Pet",action:e=>{qe(e,"❤️",1500),e.force("react",{anim:"react-happy",durationMs:1500}),e.refresh()}},{id:"feed",label:"Feed",children:[{id:"feed-seeds",label:"Seeds",action:e=>{e.model.happiness=Math.min(100,e.model.happiness+8),qe(e,"🌾 Yum!",1800),e.force("peck",{durationMs:1800}),e.refresh()}},{id:"feed-worm",label:"Worm",action:e=>{e.model.happiness=Math.min(100,e.model.happiness+16),qe(e,"🐛 Yum!",1800),e.force("peck",{durationMs:1800}),e.refresh()}}]}]},{id:"care",label:"Care",children:[{id:"sleep",label:"Sleep",visible:e=>e.stage!=="egg",action:e=>{qe(e,"😴 Zzz…",2e3),e.force("sleep",{durationMs:8e3}),e.refresh()}},{id:"wake",label:"Wake",visible:()=>!0,action:e=>{e.force("idle"),e.refresh()}}]},{id:"identity",label:"Identity",children:[{id:"rename",label:"Rename",visible:e=>e.stage!=="egg",action:e=>{e.requestRename(),e.refresh()}}]},{id:"debug",label:"Debug",children:[{id:"debug-lifecycle",label:"Lifecycle",children:[{id:"force-hatch",label:"Force hatch",description:"Normally fires the instant you submit a name for a fresh egg — hatching is tied to naming, not a timer.",visible:e=>e.stage==="egg",action:e=>{e.forceHatch(),e.refresh()}},{id:"force-chick",label:"Force chick",description:"Sets the stage directly. Normally happens automatically the moment a freshly-named egg hatches.",visible:e=>e.stage!=="chick",action:e=>{e.forceStage("chick"),e.force("idle"),e.refresh()}},{id:"force-adult",label:"Force adult",description:"Sets the stage directly. Normally happens once xp reaches 200 — earned by petting, feeding, and reactions like Eureka.",visible:e=>e.stage!=="adult",action:e=>{e.forceStage("adult"),e.force("idle"),e.refresh()}}]},{id:"debug-reactions",label:"Reactions",visible:e=>e.stage!=="egg",children:[{id:"trigger-thinking",label:"Trigger: Thinking",description:`Normally a continuous state (not a timed pulse like this button): the focused task window's session starts streaming a reply, before any text has arrived yet. Switches to the "talk" sprite the moment text starts appearing.`,action:e=>{ze(e,"thinking"),e.refresh()}},{id:"trigger-eureka",label:"Trigger: Eureka",description:`Normally fires when the focused task window records new knowledge (an "upsert_knowledge" tool result) — the real bubble shows the knowledge's own title. Grants +5 xp.`,action:e=>{ze(e,"eureka"),e.refresh()}},{id:"trigger-alarmed",label:"Trigger: Alarmed",description:"Normally fires when the focused task window raises a new operator question (permission needed to proceed). The only reaction that wakes the mascot from sleep.",action:e=>{ze(e,"alarmed"),e.refresh()}},{id:"trigger-happy",label:"Trigger: Happy",description:"Normally fires when the focused task window's task completes successfully — the real bubble shows the task's own summary.",action:e=>{ze(e,"happy"),e.refresh()}}]},{id:"force-fall",label:"Force fall",description:"Normally starts when you drop the mascot mid-air, it walks off the edge of a window, or the surface beneath it disappears (a window closes or moves away). Lifts it up first so there’s room to actually fall.",visible:e=>e.stage!=="egg",action:e=>{e.runtime.y=Math.max(0,e.runtime.y-160),e.force("falling"),e.refresh()}},{id:"reset",label:"Reset",description:"No natural trigger — clears all mascot state (stage, name, stats, position) back to a fresh, unnamed egg.",action:e=>{e.reset(),e.refresh()}}]}];var ko=$("<!> <!>",1),Ao=$('<div class="pointer-events-none absolute inset-0 z-[45]"><!></div> <!>',1);function To(e,n){ce(n,!0);let t=Z(null),o=Z(mt({x:100,y:100,vx:0,vy:0,facing:1,behavior:"egg",behaviorUntil:Number.POSITIVE_INFINITY,anim:"egg-idle",animStart:0,reactAnim:null,bounds:{w:800,h:600},groundY:600,bubbleText:null,bubbleUntil:0,blinkUntil:0,fallPhaseAt:0,flapCycleMs:0,squashAt:0,impactVy:0,bounceCount:0,investigateOnLand:!1,busyTalking:!1})),s=Z(!1),i=Z("hatch");const p=P(le);function m(){y(i,"rename"),y(s,!0)}function x(){const u=le().name===null;io(),a(o).behavior==="egg"&&X(a(o),"idle"),u&&(y(i,"hatch"),y(s,!0))}function M(u){et(u),X(a(o),"idle")}function R(){ro(),X(a(o),"egg")}function _(){}function N(){a(o).bubbleText="❤️",a(o).bubbleUntil=performance.now()+1500}function C(u){ao(u),a(i)==="hatch"&&x(),y(s,!1)}pt(()=>{var D;tn();const u=(D=a(t))==null?void 0:D.getBoundingClientRect();if(u){a(o).bounds={w:u.width,h:u.height},a(o).groundY=u.height;const A=le().lastPos;a(o).x=A?Math.max(24,Math.min(u.width-24,A.x)):u.width/2,a(o).y=u.height,a(o).anim=le().stage==="egg"?"egg-idle":"idle",a(o).behavior=le().stage==="egg"?"egg":"idle"}le().stage==="egg"&&le().name===null&&(y(i,"hatch"),y(s,!0));const l=wo((A,U)=>{if(le().stage==="egg"||a(o).behavior==="dragged"||a(o).behavior==="sleep"&&!A.interruptsSleep)return;const q=A.anim,F="react";a(o).reactAnim=q,X(a(o),F,{anim:q,durationMs:A.durationMs});const H=U??A.bubble;H&&(a(o).bubbleText=H,a(o).bubbleUntil=performance.now()+A.durationMs),A.effect&&A.effect()},A=>{if(le().stage!=="egg"&&!(a(o).behavior==="dragged"||a(o).behavior==="react")){if(A===null){a(o).behavior==="busy"&&X(a(o),"idle");return}a(o).behavior!=="sleep"&&(a(o).busyTalking=A==="talking",a(o).behavior!=="busy"&&X(a(o),"busy"))}});return()=>l()});const G=P(()=>({model:a(p),runtime:a(o),force:(u,l)=>X(a(o),u,l),requestRename:m,forceHatch:x,forceStage:M,reset:R,refresh:_}));var w=Ao(),K=L(w),f=V(K);ae(f,()=>ca,(u,l)=>{l(u,{children:(D,A)=>{var U=ko(),q=L(U);ae(q,()=>ia,(H,j)=>{j(H,{children:(O,c)=>{po(O,{onPet:N,onRequestName:()=>{y(i,"hatch"),y(s,!0)},get runtime(){return a(o)},set runtime(Q){y(o,Q,!0)}})},$$slots:{default:!0}})});var F=te(q,2);ae(F,()=>la,(H,j)=>{j(H,{class:"min-w-56 max-w-72",children:(O,c)=>{on(O,{get actions(){return So},get ctx(){return a(G)}})},$$slots:{default:!0}})}),v(D,U)},$$slots:{default:!0}})}),Je(K,u=>y(t,u),()=>a(t));var Y=te(K,2);{var W=u=>{{let l=P(()=>a(p).name??"");_o(u,{get mode(){return a(i)},get initial(){return a(l)},onSubmit:C,onCancel:()=>y(s,!1)})}};ne(Y,u=>{a(s)&&u(W)})}v(e,w),ue()}export{To as default};
|