Files
oikos/web/dist/assets/MascotLayer-D4qaTX9J.js
dtoro d4d99a7473
Some checks failed
ci / build-test (push) Has been cancelled
ci / docker-build (push) Has been cancelled
feat: Phase 1 — extract the client (web SPA + desktop) to dtoro/oikos-web
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.
2026-08-15 22:27:52 +02:00

2 lines
36 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 theres 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};