getbotons 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +505 -2
- package/installer/admin.mjs +6 -0
- package/installer/botons.mjs +430 -0
- package/installer/brain-clis.mjs +28 -0
- package/installer/linger.mjs +39 -0
- package/installer/output.mjs +27 -0
- package/installer/revision.mjs +30 -0
- package/installer/shell-path.mjs +66 -0
- package/installer/source-lock.json +2891 -0
- package/package.json +26 -4
- package/payload/LICENSE +21 -0
- package/payload/SECURITY.md +33 -0
- package/payload/installer/admin.mjs +6 -0
- package/payload/installer/botons.mjs +430 -0
- package/payload/installer/brain-clis.mjs +28 -0
- package/payload/installer/linger.mjs +39 -0
- package/payload/installer/output.mjs +27 -0
- package/payload/installer/revision.mjs +30 -0
- package/payload/installer/shell-path.mjs +66 -0
- package/payload/installer/source-lock.json +2891 -0
- package/payload/npm-shrinkwrap.json +51 -0
- package/payload/package.json +13 -0
- package/payload/scripts/backup.ts +47 -0
- package/payload/scripts/botons-backup.service +15 -0
- package/payload/scripts/botons-backup.timer +11 -0
- package/payload/scripts/botons.service +36 -0
- package/payload/scripts/check-browser.ts +90 -0
- package/payload/scripts/doctor.ts +790 -0
- package/payload/scripts/install-backup-timer.ts +52 -0
- package/payload/scripts/install-service.ts +206 -0
- package/payload/scripts/login.ts +17 -0
- package/payload/scripts/migrate-names.ts +47 -0
- package/payload/scripts/pair.ts +163 -0
- package/payload/scripts/restore.ts +108 -0
- package/payload/server/bin/botons +4 -0
- package/payload/server/bin/legacy/minion +4 -0
- package/payload/server/bin/legacy/tots +4 -0
- package/payload/server/src/acting.ts +16 -0
- package/payload/server/src/api-keys.ts +544 -0
- package/payload/server/src/api.ts +1484 -0
- package/payload/server/src/app.ts +546 -0
- package/payload/server/src/approvals.ts +873 -0
- package/payload/server/src/ask-rules.ts +181 -0
- package/payload/server/src/audit.ts +158 -0
- package/payload/server/src/auth.ts +497 -0
- package/payload/server/src/backup.ts +382 -0
- package/payload/server/src/brain-login.ts +75 -0
- package/payload/server/src/browser-cert.ts +67 -0
- package/payload/server/src/browser-handoff.ts +119 -0
- package/payload/server/src/browser-handover.ts +175 -0
- package/payload/server/src/browser-policy.ts +210 -0
- package/payload/server/src/browser-proxy.ts +580 -0
- package/payload/server/src/browser-request.ts +335 -0
- package/payload/server/src/browser-screenshot.ts +56 -0
- package/payload/server/src/browser-send.ts +155 -0
- package/payload/server/src/browser.ts +2164 -0
- package/payload/server/src/callback.ts +218 -0
- package/payload/server/src/capabilities.ts +90 -0
- package/payload/server/src/cards.ts +243 -0
- package/payload/server/src/cli/approve-mcp.ts +119 -0
- package/payload/server/src/cli/botons.ts +629 -0
- package/payload/server/src/cli/browser-mcp.ts +168 -0
- package/payload/server/src/cli/workspace-file.ts +78 -0
- package/payload/server/src/cli-homes.ts +38 -0
- package/payload/server/src/cli-install.ts +104 -0
- package/payload/server/src/cli-updates.ts +112 -0
- package/payload/server/src/codex-config-repair.ts +80 -0
- package/payload/server/src/config.ts +473 -0
- package/payload/server/src/connector-access.ts +158 -0
- package/payload/server/src/connector-launch.ts +203 -0
- package/payload/server/src/connectors.ts +947 -0
- package/payload/server/src/disk-usage.ts +62 -0
- package/payload/server/src/engine.ts +2328 -0
- package/payload/server/src/env-init.ts +5 -0
- package/payload/server/src/events.ts +46 -0
- package/payload/server/src/files.ts +528 -0
- package/payload/server/src/github-access.ts +52 -0
- package/payload/server/src/health.ts +117 -0
- package/payload/server/src/held-dir.ts +96 -0
- package/payload/server/src/hooks.ts +141 -0
- package/payload/server/src/http.ts +207 -0
- package/payload/server/src/index.ts +139 -0
- package/payload/server/src/install-type.ts +11 -0
- package/payload/server/src/instructions.ts +204 -0
- package/payload/server/src/isolation.ts +234 -0
- package/payload/server/src/legacy-upgrade.ts +668 -0
- package/payload/server/src/limits.ts +44 -0
- package/payload/server/src/lock.ts +75 -0
- package/payload/server/src/log.ts +137 -0
- package/payload/server/src/managed-clis.ts +65 -0
- package/payload/server/src/mcp-client.ts +229 -0
- package/payload/server/src/notify.ts +193 -0
- package/payload/server/src/oauth-connections.ts +650 -0
- package/payload/server/src/oauth.ts +311 -0
- package/payload/server/src/outbound.ts +142 -0
- package/payload/server/src/portable.ts +1669 -0
- package/payload/server/src/prompt.ts +676 -0
- package/payload/server/src/providers/api-brain.ts +612 -0
- package/payload/server/src/providers/api-history.ts +131 -0
- package/payload/server/src/providers/api-tools.ts +481 -0
- package/payload/server/src/providers/api-wire.ts +690 -0
- package/payload/server/src/providers/claude-cli.ts +620 -0
- package/payload/server/src/providers/cli-check.ts +265 -0
- package/payload/server/src/providers/cli-turn.ts +20 -0
- package/payload/server/src/providers/codex-cli.ts +552 -0
- package/payload/server/src/providers/codex-workspace.ts +61 -0
- package/payload/server/src/providers/failures.ts +143 -0
- package/payload/server/src/providers/index.ts +131 -0
- package/payload/server/src/providers/mcp-stdio.ts +147 -0
- package/payload/server/src/providers/mock.ts +94 -0
- package/payload/server/src/providers/process.ts +268 -0
- package/payload/server/src/providers/readiness.ts +43 -0
- package/payload/server/src/providers/sse.ts +73 -0
- package/payload/server/src/providers/types.ts +173 -0
- package/payload/server/src/rates.ts +128 -0
- package/payload/server/src/reactions.ts +266 -0
- package/payload/server/src/recent-logs.ts +489 -0
- package/payload/server/src/rehearsal.ts +593 -0
- package/payload/server/src/rehearsals.ts +303 -0
- package/payload/server/src/replay.ts +165 -0
- package/payload/server/src/sandbox.ts +767 -0
- package/payload/server/src/schedule.ts +214 -0
- package/payload/server/src/scheduler.ts +24 -0
- package/payload/server/src/schema.ts +882 -0
- package/payload/server/src/secrets.ts +46 -0
- package/payload/server/src/setup.ts +356 -0
- package/payload/server/src/skill-packages.ts +363 -0
- package/payload/server/src/skills.ts +527 -0
- package/payload/server/src/spend.ts +255 -0
- package/payload/server/src/ssrf.ts +126 -0
- package/payload/server/src/starter-gate.ts +168 -0
- package/payload/server/src/starters.ts +610 -0
- package/payload/server/src/storage.ts +32 -0
- package/payload/server/src/store.ts +3087 -0
- package/payload/server/src/tailnet.ts +132 -0
- package/payload/server/src/templates.ts +454 -0
- package/payload/server/src/trash.ts +772 -0
- package/payload/server/src/util.ts +97 -0
- package/payload/server/src/webhooks.ts +216 -0
- package/payload/server/src/work-feed.ts +473 -0
- package/payload/shared/app-version.d.mts +1 -0
- package/payload/shared/app-version.mjs +3 -0
- package/payload/shared/boton.ts +323 -0
- package/payload/shared/brand.ts +107 -0
- package/payload/shared/cards.ts +427 -0
- package/payload/shared/effort.ts +91 -0
- package/payload/shared/files.ts +104 -0
- package/payload/shared/handoff.ts +97 -0
- package/payload/shared/install-commands.ts +7 -0
- package/payload/shared/legacy-names.d.mts +35 -0
- package/payload/shared/legacy-names.mjs +244 -0
- package/payload/shared/live-view.ts +94 -0
- package/payload/shared/look-critter.ts +189 -0
- package/payload/shared/look-tater.ts +127 -0
- package/payload/shared/look.ts +200 -0
- package/payload/shared/reactions.ts +43 -0
- package/payload/shared/seeded.ts +34 -0
- package/payload/shared/services.ts +90 -0
- package/payload/shared/types.ts +3016 -0
- package/payload/shared/util.ts +68 -0
- package/payload/shared/versions.ts +44 -0
- package/payload/shared/wake.ts +164 -0
- package/payload/web/dist/apple-touch-icon.png +0 -0
- package/payload/web/dist/assets/Icons-nytVAa9g.js +1 -0
- package/payload/web/dist/assets/NewBotDialog-DXr2XhDP.js +1 -0
- package/payload/web/dist/assets/PairScreen-CMcJO7cQ.js +1 -0
- package/payload/web/dist/assets/Panel-Bvqz3I3m.js +4 -0
- package/payload/web/dist/assets/ReactionPicker-B0SKsjiy.js +1 -0
- package/payload/web/dist/assets/SettingRows-CvLomtuo.js +4 -0
- package/payload/web/dist/assets/SettingsDialog-CQ41LV-P.js +8 -0
- package/payload/web/dist/assets/Setup-C-3P7Mtn.js +1 -0
- package/payload/web/dist/assets/Skills-DXMH69kH.js +1 -0
- package/payload/web/dist/assets/StarterSetup-Ce2V1_Cs.js +5 -0
- package/payload/web/dist/assets/Steps-CKtB3GAM.js +1 -0
- package/payload/web/dist/assets/emoji-catalog-DfpPz8qw.js +540 -0
- package/payload/web/dist/assets/index-BEU7FDxV.css +1 -0
- package/payload/web/dist/assets/index-Dhwn-rf0.js +3 -0
- package/payload/web/dist/assets/react-C1iE8mnY.js +9 -0
- package/payload/web/dist/assets/reactions-rw0YeCmA.js +1 -0
- package/payload/web/dist/assets/rolldown-runtime-XKyaHtl9.js +1 -0
- package/payload/web/dist/assets/util-Cx5feSJu.js +1 -0
- package/payload/web/dist/assets/vendor-B3qdcjGo.js +14 -0
- package/payload/web/dist/favicon.svg +1 -0
- package/payload/web/dist/icon-192.png +0 -0
- package/payload/web/dist/icon-512.png +0 -0
- package/payload/web/dist/icon.svg +1 -0
- package/payload/web/dist/index.html +67 -0
- package/payload/web/dist/manifest.webmanifest +12 -0
- package/shared/legacy-names.d.mts +35 -0
- package/shared/legacy-names.mjs +244 -0
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ReactionPicker-B0SKsjiy.js","assets/react-C1iE8mnY.js","assets/rolldown-runtime-XKyaHtl9.js","assets/reactions-rw0YeCmA.js","assets/util-Cx5feSJu.js","assets/NewBotDialog-DXr2XhDP.js","assets/Setup-C-3P7Mtn.js","assets/Icons-nytVAa9g.js","assets/StarterSetup-Ce2V1_Cs.js","assets/PairScreen-CMcJO7cQ.js","assets/Panel-Bvqz3I3m.js","assets/Steps-CKtB3GAM.js","assets/SettingRows-CvLomtuo.js","assets/SettingsDialog-CQ41LV-P.js","assets/Skills-DXMH69kH.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{i as e,n as t,r as n,t as r}from"./react-C1iE8mnY.js";import{B as i,C as a,D as o,E as s,S as c,T as l,_ as u,a as d,b as f,c as p,f as m,i as h,j as g,m as _,n as v,o as y,p as b,r as x,s as ee,t as S,v as C,w,x as T,y as E}from"./util-Cx5feSJu.js";import{C as te,b as ne,f as D,g as re,n as O,p as k,t as A,w as j,x as M,y as N}from"./Steps-CKtB3GAM.js";import{A as ie,C as ae,D as P,E as oe,O as se,S as ce,T as le,_ as ue,a as F,b as I,c as L,g as de,h as R,i as fe,k as pe,l as me,m as he,n as ge,o as _e,p as ve,r as ye,s as be,t as xe,v as Se,w as Ce,x as we,y as Te}from"./Icons-nytVAa9g.js";import{n as Ee,r as De,t as Oe}from"./vendor-B3qdcjGo.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var z=e(),ke=t();function Ae(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return t>>>0}var je=(e,t)=>t[Math.min(t.length-1,Math.floor(e()*t.length))];function Me(e,t){let n=e()*t.reduce((e,t)=>e+t[1],0);for(let[e,r]of t)if(n-=r,n<0)return e;return t[t.length-1][0]}var Ne=[`round`,`pill`,`key`],Pe=[`dots`,`rings`,`bars`,`happy`,`wink`,`lidded`],Fe=[`none`,`soft`,`straight`,`arched`,`bold`],Ie=[`smile`,`grin`,`smirk`,`o`,`calm`,`wave`],Le=[`none`,`antenna`,`twin`,`dish`,`coil`,`fin`,`beacon`,`halo`],Re=[`none`,`bolts`,`pods`,`fins`,`knobs`],ze=[`none`,`goggles`,`monocle`,`band`],Be=[`none`,`holes`,`grill`,`leds`,`dial`,`switch`],Ve=[`none`,`nubs`,`wave`,`cheer`],He={snow:`#eef2f7`,steel:`#a9b4c6`,graphite:`#323a4c`,sun:`#f4c53d`,signal:`#f0624d`,cobalt:`#3f63e0`,violet:`#8457e6`,teal:`#17a99d`},Ue={cyan:`#3ee6ff`,pink:`#ff6ad5`,lime:`#a8ff5c`,amber:`#ffbe45`,violet:`#b49bff`,ice:`#e8f6ff`},We={mist:`#e7ecf3`,ice:`#d4f2fa`,mint:`#d3f4e2`,lilac:`#e6defa`,blush:`#fbdde8`,night:`#121b36`,plum:`#2a1842`,grid:`#090d18`},Ge=[`night`,`plum`,`grid`],Ke=Object.keys(He),qe=Object.keys(Ue),Je=Object.keys(We),Ye={shape:Ne,shell:Ke,glow:qe,eyes:Pe,brows:Fe,mouth:Ie,top:Le,ears:Re,visor:ze,panel:Be,arms:Ve,backdrop:Je},Xe={shape:`round`,shell:`snow`,glow:`cyan`,eyes:`dots`,brows:`none`,mouth:`smile`,top:`antenna`,ears:`none`,visor:`none`,panel:`none`,arms:`nubs`,backdrop:`night`,cheeks:!0},Ze=[[`dots`,5],[`rings`,3],[`bars`,3],[`happy`,2],[`wink`,1],[`lidded`,1]],Qe=[[`none`,5],[`soft`,2],[`straight`,1],[`arched`,1],[`bold`,1]],$e=[[`smile`,5],[`grin`,2],[`calm`,2],[`smirk`,1],[`o`,1],[`wave`,1]],et=[[`antenna`,4],[`none`,3],[`twin`,1],[`dish`,1],[`coil`,1],[`fin`,1],[`beacon`,1],[`halo`,1]],tt=[[`none`,6],[`bolts`,1],[`pods`,1],[`fins`,1],[`knobs`,1]],nt=[[`none`,8],[`goggles`,1],[`monocle`,1],[`band`,1]],rt=[[`none`,6],[`holes`,2],[`grill`,1],[`leds`,1],[`dial`,1],[`switch`,1]],it=[[`nubs`,6],[`none`,2],[`wave`,1],[`cheer`,1]];function at(e=Math.random){return{shape:Me(e,[[`round`,3],[`pill`,2],[`key`,2]]),shell:je(e,Ke),glow:je(e,qe),eyes:Me(e,Ze),brows:Me(e,Qe),mouth:Me(e,$e),top:Me(e,et),ears:Me(e,tt),visor:Me(e,nt),panel:Me(e,rt),arms:Me(e,it),backdrop:je(e,Je),cheeks:e()<.6}}var ot={shape:{round:`Round`,pill:`Pill`,key:`Key`},shell:{snow:`Snow`,steel:`Steel`,graphite:`Graphite`,sun:`Sun`,signal:`Signal`,cobalt:`Cobalt`,violet:`Violet`,teal:`Teal`},glow:{cyan:`Cyan`,pink:`Pink`,lime:`Lime`,amber:`Amber`,violet:`Violet`,ice:`Ice`},eyes:{dots:`Dots`,rings:`Rings`,bars:`Bars`,happy:`Happy`,wink:`Wink`,lidded:`Lidded`},brows:{none:`None`,soft:`Soft`,straight:`Straight`,arched:`Arched`,bold:`Bold`},mouth:{smile:`Smile`,grin:`Grin`,smirk:`Smirk`,o:`Oh`,calm:`Calm`,wave:`Wave`},top:{none:`None`,antenna:`Antenna`,twin:`Twin`,dish:`Dish`,coil:`Coil`,fin:`Fin`,beacon:`Beacon`,halo:`Halo`},ears:{none:`None`,bolts:`Bolts`,pods:`Pods`,fins:`Fins`,knobs:`Knobs`},visor:{none:`None`,goggles:`Goggles`,monocle:`Monocle`,band:`Band`},panel:{none:`None`,holes:`Button holes`,grill:`Grill`,leds:`Lights`,dial:`Dial`,switch:`Switch`},arms:{none:`None`,nubs:`Nubs`,wave:`Wave`,cheer:`Cheer`},backdrop:{mist:`Mist`,ice:`Ice`,mint:`Mint`,lilac:`Lilac`,blush:`Blush`,night:`Night`,plum:`Plum`,grid:`Grid`}},st=ot;function ct(e){let t=e=>e.toLowerCase(),n=e=>/^[aeiou]/i.test(e)?`an`:`a`,r=e=>`${n(e)} ${t(e)}`,i=[`${r(ot.glow[e.glow])} glow`,e.top===`none`?``:r(ot.top[e.top]+(e.top===`twin`?` antennas`:``)).replace(/^a twin/,`twin`),e.ears===`none`?``:`${t(ot.ears[e.ears])} for ears`,e.visor===`goggles`?`goggles`:e.visor===`none`?``:r(ot.visor[e.visor]),e.panel===`none`?``:e.panel===`holes`?`button holes`:e.panel===`leds`?`a row of lights`:r(ot.panel[e.panel])].filter(Boolean),a=i.length>1?`${i.slice(0,-1).join(`, `)} and ${i.at(-1)}`:i[0];return`${ot.shell[e.shell]} ${t(ot.shape[e.shape])} Boton with ${a}, on ${t(ot.backdrop[e.backdrop])}`}var lt=e=>e<=28?0:e<=72?1:2,ut=[`idle`,`working`,`approval`,`error`,`asleep`],dt=`#0a0f1c`,ft=.5,pt=`#ff6b6b`,mt=`#ffbe45`,ht=`#56607a`,gt=`#8e98ab`,B=e=>Math.round(e*100)/100,_t=e=>[1,3,5].map(t=>parseInt(e.slice(t,t+2),16)),vt=e=>`#${e.map(e=>Math.round(Math.max(0,Math.min(255,e))).toString(16).padStart(2,`0`)).join(``)}`,yt=(e,t,n)=>{let r=_t(e),i=_t(t);return vt(r.map((e,t)=>e+(i[t]-e)*n))},bt=e=>yt(e,`#05070d`,ft),xt=(e,t)=>e.motion&&t?` class="${t}"`:``,St={round:{cap:{kind:`c`,cx:50,cy:55,r:29},top:26,side:21,ey:53,d:{x:31,y:40,w:38,h:25,rx:11},p:74,ax:25,ay:68,dx:8.36},pill:{cap:{kind:`r`,x:12,y:38,w:76,h:42,rx:21},top:38,side:12,ey:59,d:{x:27,y:45,w:46,h:24,rx:11},p:74.5,ax:16,ay:70,dx:10},key:{cap:{kind:`k`,x:20,y:27,w:60,h:54,rx:12},top:27,side:17,ey:49,d:{x:29,y:35,w:42,h:26,rx:8},p:71,ax:19,ay:72,dx:9.24}},Ct=e=>B(e.d.y+e.d.h*.74);function wt(e,t,n=0,r=0){if(e.kind===`c`)return`<circle cx="${e.cx}" cy="${B(e.cy+n)}" r="${B(e.r+r)}" ${t}/>`;let i=e.kind===`k`&&r?r+2:r;return`<rect x="${B(e.x-i)}" y="${B(e.y+n)}" width="${B(e.w+i*2)}" height="${B(e.h+(e.kind===`k`?r*2:0))}" rx="${B(e.rx+i/2)}" ${t}/>`}function V(e,t,n,r){let i=`stroke="${t}" fill="none" stroke-linecap="round" stroke-linejoin="round"`;return`${r?`<path d="${e}" ${i} stroke-width="${B(n+3.4)}" stroke-opacity=".22"/>`:``}<path d="${e}" ${i} stroke-width="${n}"/>`}var Tt=(e,t,n,r,i)=>`${i?`<circle cx="${B(e)}" cy="${B(t)}" r="${B(n+2)}" fill="${r}" opacity=".22"/>`:``}<circle cx="${B(e)}" cy="${B(t)}" r="${n}" fill="${r}"/>`;function Et(e,t,n,r){let{ey:i,dx:a}=t,o=n.halo,s=(e,t)=>{switch(t){case`rings`:return V(`M${B(e-3.6)} ${i}a3.6 3.6 0 1 0 7.2 0a3.6 3.6 0 1 0 -7.2 0`,r,2.2,o);case`bars`:return V(`M${B(e)} ${B(i-3.4)}V${B(i+3.4)}`,r,4.2,o);case`happy`:return V(`M${B(e-4)} ${B(i+1.6)}Q${B(e)} ${B(i-4.4)} ${B(e+4)} ${B(i+1.6)}`,r,2.6,o);case`lidded`:return`<path d="M${B(e-4)} ${B(i-.6)}H${B(e+4)}a4 4 0 0 1 -8 0Z" fill="${r}"/>`;case`closed`:return V(`M${B(e-3.6)} ${B(i+.6)}Q${B(e)} ${B(i+3)} ${B(e+3.6)} ${B(i+.6)}`,r,2,!1);case`wide`:return`${Tt(e,i,4.4,r,o)}<circle cx="${B(e+1.2)}" cy="${B(i-1.4)}" r="1.4" fill="${dt}"/>`;case`down`:return Tt(e,i+1.6,3.2,r,o);case`worried`:return Tt(e,i+.6,3.2,r,o);default:return Tt(e,i,3.6,r,o)}};return e===`wink`?s(50-a,`dots`)+V(`M${B(50+a-4)} ${i}Q${B(50+a)} ${B(i+2.4)} ${B(50+a+4)} ${i}`,r,2.6,o):`<g${xt(n,n.state===`idle`?`av-blink`:``)}>${s(50-a,e)}${s(50+a,e)}</g>`}function Dt(e,t,n,r){let i=t.ey-7.4,a=50-t.dx,o=50+t.dx,s={soft:[`M${B(a-3.6)} ${B(i+.6)}Q${B(a)} ${B(i-1.4)} ${B(a+3.6)} ${B(i+.6)}`,`M${B(o-3.6)} ${B(i+.6)}Q${B(o)} ${B(i-1.4)} ${B(o+3.6)} ${B(i+.6)}`,1.8],straight:[`M${B(a-3.6)} ${B(i)}H${B(a+3.6)}`,`M${B(o-3.6)} ${B(i)}H${B(o+3.6)}`,2],arched:[`M${B(a-4)} ${B(i+1.4)}Q${B(a)} ${B(i-3)} ${B(a+4)} ${B(i+1.4)}`,`M${B(o-4)} ${B(i+1.4)}Q${B(o)} ${B(i-3)} ${B(o+4)} ${B(i+1.4)}`,1.9],bold:[`M${B(a-4)} ${B(i-.4)}L${B(a+4)} ${B(i+1)}`,`M${B(o-4)} ${B(i+1)}L${B(o+4)} ${B(i-.4)}`,3],worried:[`M${B(a-4)} ${B(i+1.6)}L${B(a+3.4)} ${B(i-.8)}`,`M${B(o-3.4)} ${B(i-.8)}L${B(o+4)} ${B(i+1.6)}`,2],focused:[`M${B(a-4)} ${B(i-.2)}L${B(a+4)} ${B(i+1.4)}`,`M${B(o-4)} ${B(i+1.4)}L${B(o+4)} ${B(i-.2)}`,2]};if(e===`none`)return``;let[c,l,u]=s[e];return V(`${c}${l}`,r,u,n.halo)}function Ot(e,t,n,r){let i=Ct(t),a=n.halo;switch(e){case`grin`:return`<path d="M44.4 ${B(i-1.2)}H55.6a5.6 5 0 0 1 -11.2 0Z" fill="${r}"/>`;case`smirk`:return V(`M45 ${B(i+.4)}Q51 ${B(i+2.6)} 55.6 ${B(i-1.6)}`,r,2.4,a);case`o`:return V(`M47.4 ${i}a2.6 2.6 0 1 0 5.2 0a2.6 2.6 0 1 0 -5.2 0`,r,2.2,a);case`calm`:return V(`M46 ${i}H54`,r,2.4,a);case`wave`:return V(`M43.4 ${i}q1.65 -3 3.3 0t3.3 0t3.3 0t3.3 0`,r,2,a);case`dots`:return`<g fill="${r}"><circle cx="45.6" cy="${i}" r="1.6"/><circle cx="50" cy="${i}" r="1.6"/><circle cx="54.4" cy="${i}" r="1.6"/></g>`;case`wobbly`:return V(`M44.6 ${B(i+1.2)}q2.7 -2.6 5.4 0t5.4 0`,r,2.2,a);case`flat`:return V(`M46.6 ${B(i+.6)}H53.4`,r,2,!1);default:return V(`M44.6 ${B(i-1)}Q50 ${B(i+4)} 55.4 ${B(i-1)}`,r,2.6,a)}}function kt(e,t,n){let r=t.top,{shell:i,skirt:a,glow:o,lit:s,halo:c}=n,l=(e,t,n=3.4)=>`${s&&c?`<circle cx="${e}" cy="${B(t)}" r="${B(n+2.6)}" fill="${o}" opacity=".25"/>`:``}<circle cx="${e}" cy="${B(t)}" r="${n}" fill="${s?o:a}" stroke="${a}" stroke-width="1.2"/>`,u=(e,t=2.6)=>`<path d="${e}" stroke="${a}" stroke-width="${t}" fill="none" stroke-linecap="round" stroke-linejoin="round"/>`;switch(e){case`antenna`:return u(`M50 ${r+1}V${r-13}`)+l(50,r-15);case`twin`:return u(`M44 ${r+2}L38 ${r-11}M56 ${r+2}L62 ${r-11}`)+l(37,r-13,3)+l(63,r-13,3);case`dish`:return u(`M50 ${r+1}V${r-7}`)+`<path d="M39 ${r-15}Q50 ${r-2} 61 ${r-15}Z" fill="${i}" stroke="${a}" stroke-width="1.6" stroke-linejoin="round" transform="rotate(-16 50 ${r-9})"/>`+l(50,r-12,1.8);case`coil`:return u(`M50 ${r+1}V${r-2}l-4 -2.2 8 -2.6 -8 -2.6 8 -2.6 -4 -2.2`,2.2)+l(50,r-16,3.2);case`fin`:return`<path d="M40 ${r+3}Q42 ${r-14} 58 ${r-15}Q55 ${r-6} 60 ${r+3}Z" fill="${i}" stroke="${a}" stroke-width="1.6" stroke-linejoin="round"/>${s&&n.lod?V(`M44 ${r-1}Q46 ${r-10} 55 ${B(r-11.4)}`,o,1.6,c):``}`;case`beacon`:return`<rect x="42" y="${r-3}" width="16" height="5" rx="2" fill="${a}"/><path d="M43.5 ${r-3}a6.5 6.5 0 0 1 13 0Z" fill="${s?o:yt(a,`#ffffff`,.3)}" stroke="${a}" stroke-width="1.2"/>`;case`halo`:return s?V(`M33 ${r-9}a17 5 0 1 0 34 0a17 5 0 1 0 -34 0`,o,2.2,c):`<ellipse cx="50" cy="${r-9}" rx="17" ry="5" fill="none" stroke="${a}" stroke-width="2.2"/>`;default:return``}}function At(e,t,n){let{ey:r}=t,{shell:i,skirt:a,glow:o,lit:s}=n,c=t.side+1,l=100-t.side-1;switch(e){case`bolts`:return[c,l].map(e=>`<rect x="${e-4}" y="${r-4}" width="8" height="8" rx="2" fill="${a}"/><circle cx="${e+(e<50?-1:1)}" cy="${r}" r="1.6" fill="${i}"/>`).join(``);case`pods`:return[c-2,l+2].map(e=>`<rect x="${B(e-4.6)}" y="${r-9}" width="9.2" height="18" rx="4.6" fill="${i}" stroke="${a}" stroke-width="1.8"/>${s?`<rect x="${e-1}" y="${r-5}" width="2" height="10" rx="1" fill="${o}"/>`:``}`).join(``);case`fins`:return`<path d="M${c+2} ${r-7}L${c-9} ${r-13}L${c-5} ${r+5}Z" fill="${i}" stroke="${a}" stroke-width="1.6" stroke-linejoin="round"/><path d="M${l-2} ${r-7}L${l+9} ${r-13}L${l+5} ${r+5}Z" fill="${i}" stroke="${a}" stroke-width="1.6" stroke-linejoin="round"/>`;case`knobs`:return[[c,-1],[l,1]].map(([e,t])=>`<rect x="${t<0?e-5:e}" y="${r-2}" width="5" height="4" fill="${a}"/><circle cx="${e+t*7}" cy="${r}" r="3.8" fill="${s?o:i}" stroke="${a}" stroke-width="1.6"/>`).join(``);default:return``}}function jt(e,t,n){let{ey:r,dx:i,d:a}=t,o=B(50-i),s=B(50+i),{skirt:c,glow:l}=n;switch(e){case`goggles`:return`<g fill="${l}" fill-opacity=".12" stroke="${c}" stroke-width="2.4"><circle cx="${o}" cy="${r}" r="6.6"/><circle cx="${s}" cy="${r}" r="6.6"/></g><path d="M${B(o+6.6)} ${r}H${B(s-6.6)}M${a.x-1} ${r}H${B(o-6.6)}M${B(s+6.6)} ${r}H${a.x+a.w+1}" stroke="${c}" stroke-width="2.4"/>`;case`monocle`:return`<circle cx="${s}" cy="${r}" r="7" fill="${l}" fill-opacity=".1" stroke="${c}" stroke-width="2.4"/><path d="M${B(s+5)} ${r+5}Q${B(s+9)} ${r+12} ${B(s+6)} ${a.y+a.h+3}" stroke="${c}" stroke-width="1.2" fill="none"/>`;case`band`:return`<rect x="${a.x-2}" y="${B(r-5.6)}" width="${a.w+4}" height="11.2" rx="5.6" fill="${l}" fill-opacity=".16" stroke="${l}" stroke-opacity=".7" stroke-width="1.4"/>`;default:return``}}function Mt(e,t,n){let r=t.p,{skirt:i,glow:a,lit:o,shell:s}=n;switch(e){case`holes`:return`<g fill="${i}"><circle cx="46.6" cy="${B(r-2.2)}" r="1.5"/><circle cx="53.4" cy="${B(r-2.2)}" r="1.5"/><circle cx="46.6" cy="${B(r+2.2)}" r="1.5"/><circle cx="53.4" cy="${B(r+2.2)}" r="1.5"/></g>`;case`grill`:return`<path d="M44 ${B(r-2.6)}H56M43 ${r}H57M44 ${B(r+2.6)}H56" stroke="${i}" stroke-width="1.8" stroke-linecap="round"/>`;case`leds`:return[44,50,56].map((e,t)=>`<circle cx="${e}" cy="${r}" r="2" fill="${o?t===1?a:yt(a,i,.55):i}"/>`).join(``);case`dial`:return`<circle cx="50" cy="${r}" r="4.2" fill="${yt(s,`#ffffff`,.25)}" stroke="${i}" stroke-width="1.6"/><path d="M50 ${r}L52.4 ${B(r-2.4)}" stroke="${i}" stroke-width="1.6" stroke-linecap="round"/>`;case`switch`:return`<rect x="44" y="${B(r-2.6)}" width="12" height="5.2" rx="2.6" fill="${i}"/><circle cx="${o?53.4:46.6}" cy="${r}" r="2.1" fill="${o?a:s}"/>`;default:return``}}function Nt(e,t,n){let r=n.state===`approval`?`raise`:e;if(r===`none`)return``;let{ax:i,ay:a}=t,o=i,s=100-i,c=e=>`<path d="${e}" stroke="${n.skirt}" stroke-width="5.4" fill="none" stroke-linecap="round"/>`,l=(e,t)=>c(`M${e} ${a}l${t*6} 7`),u=(e,t)=>c(`M${e+t*2} ${a-3}l${t*9} -13`)+`<circle cx="${e+t*11}" cy="${a-17}" r="3.6" fill="${n.skirt}"/>`;switch(r){case`wave`:return l(o,-1)+u(s,1);case`raise`:return(e===`none`?``:l(o,-1))+`<g${xt(n,`av-wave`)} style="transform-origin:${s+2}px ${a-3}px">${u(s,1)}</g>`;case`cheer`:return u(o,-1)+u(s,1);default:return l(o,-1)+l(s,1)}}function Pt(e,t={}){let n=t.state??`idle`,r=t.lod??lt(t.size??48),i=(t.uid??`tt`).replace(/[^A-Za-z0-9_-]/g,``),a=St[e.shape],o=n===`asleep`,s=o?yt(He[e.shell],`#8a92a3`,.35):He[e.shell],c=n===`error`?pt:Ue[e.glow],l={state:n,lod:r,uid:i,motion:!t.still,shell:s,skirt:bt(s),glow:c,lit:!o,halo:r>=1&&!o},u=o?ht:c,d=Ge.includes(e.backdrop),{cap:f,d:p}=a,m=Nt(e.arms,a,l);m+=kt(e.top,a,l),r>=1&&(m+=At(e.ears,a,l));let h=``;if(r>=1&&(h+=`<linearGradient id="${i}g" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="${yt(s,`#ffffff`,.22)}"/><stop offset=".55" stop-color="${s}"/><stop offset="1" stop-color="${yt(s,`#05070d`,.12)}"/></linearGradient>`),m+=wt(f,`fill="${l.skirt}"`,4.5,f.kind===`k`?1:.5),m+=wt(f,`fill="${r>=1?`url(#${i}g)`:s}"`),m+=wt(f,`fill="none" stroke="${o?gt:c}" stroke-width="${r?1.3:1.8}" stroke-opacity=".9"`),r>=1){let e=f.kind===`c`?`M${B(f.cx-f.r*.62)} ${B(f.cy-f.r*.5)}Q${B(f.cx-f.r*.25)} ${B(f.cy-f.r*.86)} ${B(f.cx+f.r*.1)} ${B(f.cy-f.r*.9)}`:`M${B(f.x+f.rx*.6)} ${f.y+4}H${B(f.x+f.w*.45)}`;m+=`<path d="${e}" stroke="#fff" stroke-opacity=".45" stroke-width="2.2" fill="none" stroke-linecap="round"/>`}m+=`<rect x="${p.x}" y="${p.y}" width="${p.w}" height="${p.h}" rx="${p.rx}" fill="${o?`#141927`:dt}" stroke="${o?ht:c}" stroke-opacity=".5" stroke-width="1.1"/>`,r>=1&&!o&&(m+=`<path d="M${p.x+4} ${B(p.y+3.5)}H${B(p.x+p.w*.42)}" stroke="#fff" stroke-opacity=".14" stroke-width="1.6" stroke-linecap="round"/>`),n===`error`&&r>=1&&(m+=`<path d="M${p.x+3} ${p.y+6}h9M${p.x+p.w-14} ${p.y+p.h-5}h10" stroke="${pt}" stroke-opacity=".45" stroke-width="1.2"/>`);let[g,_,v]={idle:[e.eyes,e.brows,e.mouth],working:[`down`,`focused`,`dots`],approval:[`wide`,`arched`,`o`],error:[`worried`,`worried`,`wobbly`],asleep:[`closed`,`none`,`flat`]}[n];if(e.cheeks&&r>=1&&n===`idle`&&(m+=`<g fill="#ff7eb6" opacity=".55"><rect x="${B(50-a.dx-8)}" y="${a.ey+5}" width="4.6" height="2.2" rx="1.1"/><rect x="${B(50+a.dx+3.4)}" y="${a.ey+5}" width="4.6" height="2.2" rx="1.1"/></g>`),m+=Dt(_,a,l,u)+Et(g,a,l,u)+Ot(v,a,l,u),r>=1&&n===`idle`&&(m+=jt(e.visor,a,l)),r>=1&&(m+=Mt(e.panel,a,l)),n===`working`){let e=f.kind===`c`?`M50 ${B(f.cy-f.r-6.5)}a${B(f.r+6.5)} ${B(f.r+6.5)} 0 0 1 ${B((f.r+6.5)*.87)} ${B((f.r+6.5)*1.5)}`:`M${f.x+f.w/2} ${f.y-5}H${f.x+f.w-f.rx}q${f.rx+5} 0 ${f.rx+5} ${f.rx+5}V${B(f.y+f.h*.55)}`,t=f.kind===`c`?f.cy:f.y+f.h/2;m+=`<g${xt(l,`av-spin`)} style="transform-origin:50px ${t}px">${V(e,c,r?2.4:2.8,l.halo)}</g>`}if(n===`approval`||n===`error`){let e=f.kind===`c`?72:f.x+f.w-2,t=f.kind===`c`?32:f.y+1,i=r?6.4:8,a=`stroke="${d?dt:`#ffffff`}" stroke-width="1.6"`;m+=n===`approval`?`<circle cx="${e}" cy="${t}" r="${i}" fill="${mt}" ${a}/><path d="M${e} ${B(t-3.2)}V${B(t+.6)}" stroke="${dt}" stroke-width="2" stroke-linecap="round"/><circle cx="${e}" cy="${t+3}" r="1.1" fill="${dt}"/>`:`<circle cx="${e}" cy="${t}" r="${i}" fill="#e5484d" ${a}/><path d="M${B(e-2.4)} ${B(t-2.4)}l4.8 4.8m0 -4.8l-4.8 4.8" stroke="#fff" stroke-width="1.8" stroke-linecap="round"/>`}if(o){let e=d?`#c7cfdd`:ht;m+=`<g${xt(l,`av-zzz`)} fill="none" stroke="${e}" stroke-width="${r?1.8:2.4}" stroke-linecap="round" stroke-linejoin="round"><path d="M70 ${a.top-4}h6l-6 7h6"/>${r?`<path d="M80 ${a.top-12}h4.4l-4.4 5h4.4"/>`:``}</g>`,r>=1&&(m+=`<circle cx="${p.x+p.w-5}" cy="${B(p.y+p.h-4.5)}" r="1.5" fill="#ff8a5c"/>`)}let y=t.frame??`circle`,b=`<g>${m}</g>`;if(y===`none`)return`${h?`<defs>${h}</defs>`:``}${b}`;let x=We[e.backdrop],ee=y===`square`?`<rect width="100" height="100"/>`:`<circle cx="50" cy="50" r="50"/>`,S=y===`square`?`<rect width="100" height="100" fill="${x}"/>`:`<circle cx="50" cy="50" r="50" fill="${x}"/>`,C=e.backdrop===`grid`&&r>=1?`<path d="M0 62H100M0 70H100M0 81H100M0 96H100${[10,26,42,58,74,90].map(e=>`M${B(50+(e-50)*.25)} 62L${B(e*1.6-30)} 100`).join(``)}" stroke="${Ue[e.glow]}" stroke-opacity=".28" stroke-width=".8" fill="none"/>`:``;return`<defs><clipPath id="${i}c">${ee}</clipPath>${h}</defs><g clip-path="url(#${i}c)">${S}${C}${b}</g>`}var H=r();function U(e){let{look:t,size:n=40,state:r=`idle`,seed:i=``,label:a}=e,o=e.still??n<24,s=`av${(0,z.useId)().replace(/[^A-Za-z0-9_-]/g,``)}`,c=`${t.shape} ${t.shell} ${t.glow} ${t.eyes} ${t.brows} ${t.mouth} ${t.top} ${t.ears} ${t.visor} ${t.panel} ${t.arms} ${t.backdrop} ${t.cheeks}`,l=(0,z.useMemo)(()=>Pt(t,{size:n,state:r,uid:s,still:o}),[c,n,r,s,o]),u=Ae(i),d={"--ph":(u%997/99.7).toFixed(2),"--blink":`${(5+u%3001/1e3).toFixed(2)}s`};return(0,H.jsx)(`svg`,{width:n,height:n,viewBox:`0 0 100 100`,className:`avatar`,style:d,...a?{role:`img`,"aria-label":a}:{"aria-hidden":!0},dangerouslySetInnerHTML:{__html:l}})}function Ft(e,t,n=!1){return t>0?`approval`:e.status.state===`working`?`working`:n?`asleep`:e.status.state===`idle`&&e.lastMessage?.role===`error`?`error`:`idle`}var It=`botons.avatarMotion`;function Lt(){try{return i(window.localStorage,It)!==`off`}catch{return!0}}function Rt(e=Lt()){document.documentElement.dataset.avatarMotion=e?`on`:`off`}function zt(){let[e,t]=(0,z.useState)(Lt);return(0,H.jsxs)(`section`,{className:`server-info`,"aria-labelledby":`avatar-motion-title`,children:[(0,H.jsx)(`h4`,{id:`avatar-motion-title`,children:`On this device`}),(0,H.jsxs)(`label`,{className:`check`,children:[(0,H.jsx)(`input`,{type:`checkbox`,checked:e,onChange:e=>{let n=e.target.checked;t(n);try{window.localStorage.setItem(It,n?`on`:`off`)}catch{}Rt(n)}}),(0,H.jsx)(`span`,{children:`Animate Botons`})]}),(0,H.jsx)(`p`,{className:`hint`,children:`Blinks, the thinking ring and waves. Off, every Boton keeps still and its face and pose still show what it is doing. Your system's reduced-motion setting turns them off too.`})]})}var Bt={cyan:`#3ee6ff`,glass:`#0a0f1c`,shell:`#eef2f7`,shellLight:`#f2f5f9`,shellDeep:`#d2d6db`,skirt:`#7a7d82`,cheek:`#ff7eb6`,nightTop:`#16214a`,nightMid:`#0a0f1f`,void:`#05070d`},Vt=e=>e.replace(/[^A-Za-z0-9_-]/g,``),Ht=`20 4 60 86`;function Ut(e){let{cyan:t,glass:n,skirt:r}=Bt;return`<defs><linearGradient id="${e}" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="${Bt.shellLight}"/><stop offset=".55" stop-color="${Bt.shell}"/><stop offset="1" stop-color="${Bt.shellDeep}"/></linearGradient></defs><path d="M50 27V13" stroke="${r}" stroke-width="2.6" stroke-linecap="round"/><circle cx="50" cy="11" r="6" fill="${t}" opacity=".25"/><circle cx="50" cy="11" r="3.4" fill="${t}" stroke="${r}" stroke-width="1.2"/><circle cx="50" cy="59.5" r="29.5" fill="${r}"/><circle cx="50" cy="55" r="29" fill="url(#${e})"/><circle cx="50" cy="55" r="29" fill="none" stroke="${t}" stroke-width="1.3" stroke-opacity=".75"/><path d="M32 40.5Q42.8 30.1 52.9 28.9" stroke="#fff" stroke-opacity=".45" stroke-width="2.2" fill="none" stroke-linecap="round"/><rect x="31" y="40" width="38" height="25" rx="11" fill="${n}" stroke="${t}" stroke-opacity=".5" stroke-width="1.1"/><path d="M35 43.5H47" stroke="#fff" stroke-opacity=".14" stroke-width="1.6" stroke-linecap="round"/><g fill="${Bt.cheek}" opacity=".55"><rect x="33.6" y="58" width="4.6" height="2.2" rx="1.1"/><rect x="61.8" y="58" width="4.6" height="2.2" rx="1.1"/></g><g fill="${t}"><circle cx="41.6" cy="53" r="5.6" opacity=".22"/><circle cx="41.6" cy="53" r="3.6"/><circle cx="58.4" cy="53" r="5.6" opacity=".22"/><circle cx="58.4" cy="53" r="3.6"/></g><g stroke="${t}" fill="none" stroke-linecap="round"><path d="M44.6 57.5Q50 62.5 55.4 57.5" stroke-width="6" stroke-opacity=".22"/><path d="M44.6 57.5Q50 62.5 55.4 57.5" stroke-width="2.6"/></g>`}function Wt(e=`bm`){return Ut(`${Vt(e)}g`)}function Gt(e=`currentColor`,t=9){return`<g stroke="${e}" stroke-width="${t}" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M8 6V46"/><circle cx="21.5" cy="32" r="13.5"/><circle cx="64.5" cy="32" r="13.5"/><path d="M102 6V36Q102 46 112 46"/><path d="M94 19H112"/><circle cx="141.5" cy="32" r="13.5"/><path d="M171 46V18.5"/><path d="M171 32A13.5 13.5 0 0 1 198 32V46"/><path d="M236.5 21Q231.5 17.5 224.5 18Q216.5 19 217 25Q217.5 30 225.5 31.5Q235.5 33 235.5 39Q235 46 224.5 46Q217.5 46 214 42"/></g>`}function Kt({ink:e=`currentColor`,uid:t=`logo`,height:n}={}){return`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 318 60"${n?` height="${n}" width="${Math.round(n*318/60)}"`:``} role="img" aria-label="Botons"><svg x="0" y="0" width="62" height="60" viewBox="${Ht}">${Wt(t)}</svg><g transform="translate(70 6)">${Gt(e)}</g></svg>`}var qt=e=>`b${e.replace(/[^A-Za-z0-9_-]/g,``)}`;function Jt({size:e=40,label:t}){let n=qt((0,z.useId)());return(0,H.jsx)(`svg`,{className:`brand-mark`,width:Math.round(e*60/86),height:e,viewBox:Ht,...t?{role:`img`,"aria-label":t}:{"aria-hidden":!0},dangerouslySetInnerHTML:{__html:Wt(n)}})}function Yt({height:e=26}){let t=qt((0,z.useId)());return(0,H.jsx)(`span`,{className:`logo`,style:{height:e},dangerouslySetInnerHTML:{__html:Kt({uid:t,height:e})}})}function Xt(e){if(e.role!==`user`)return!1;if(e.meta?.fromBotId)return!0;let t=e.meta?.kind;return!!t&&t!==`card.answered`&&t!==`browser.handed_back`}var Zt=new Set([`memory.saved`,`memory.forgotten`,`file.shared`,`notify.sent`,`ask.sent`,`routine.created`,`routine.updated`,`routine.paused`,`routine.resumed`,`routine.deleted`,`skill.created`,`skill.updated`]);function Qt(e){if(e.role===`user`)return Xt(e);if(e.role===`bot`)return!0;if(e.role!==`event`)return!1;let t=e.meta?.kind??``;return t===`routine.run`||Zt.has(t)}function $t(e){let t=new Set;for(let n of e)n.meta?.quiet&&Qt(n)&&t.add(n.id);return t}function en(e){if(typeof e!=`string`)return null;let t=e.replace(/[\p{Cc}\p{Cf}\p{Zl}\p{Zp}]+/gu,` `).replace(/\s+/g,` `).trim();if(!t)return null;let n=[...t];return n.length>80?`${n.slice(0,79).join(``).trimEnd()}…`:t}var tn={finished:`finished`,needs_input:`needs input`,failed:`failed`,cancelled:`was cancelled`,delegated_ended:`delegated work ended`};function nn(e){return e?e.slice(e.indexOf(`:`)+1):``}function rn(e){let t=/^https:\/\/[^/\s]+\/[^/\s]+\/[^/\s]+\/(?:pull|pulls|merge_requests)\/(\d{1,9})(?:[/?#]|$)/.exec(e??``);return t?`PR #${t[1]}`:null}function an(e,t=`Work update`){if(!e)return{text:t,detail:t,warn:!1};let n=nn(e.connectorId)||`A connector`,r=rn(e.link),i=en(e.title),a=tn[e.kind]??`changed`,o=i?`“${i}”${r?` (${r})`:``}`:r??(e.kind===`delegated_ended`?``:`work`),s=[`Job ${e.jobId}`,e.state?`state ${e.state}`:null,e.unowned?`not known to be any Boton’s`:null].filter(Boolean).join(` · `);return{text:`${n}: ${o?`${o} `:``}${a}`,detail:s,warn:e.kind===`failed`}}function on(e){let t=e?.routineName?.trim()||`a routine`;return{text:`Routine: ${t}${e?.trigger&&e.trigger!==`schedule`?` · ${e.trigger}`:``}${(e?.attempt??1)>1?` · attempt ${e?.attempt}`:``}`,detail:e?.runId?`Run ${e.runId}`:`Routine: ${t}`,warn:!1}}function sn(e,t){if(!e.lastAt)return null;let n=e.lastHour;return`${n===0?`No background updates in the last hour`:`${n} background ${n===1?`update`:`updates`} in the last hour`}${n>0&&e.quietLastHour>0?e.quietLastHour===n?n===1?`, quiet`:`, all quiet`:`, ${e.quietLastHour} quiet`:``} · last ${t(e.lastAt)}`}function cn(e,t,n=`end`){let r=e.findIndex(e=>e.id===t.id);if(r>=0){let n=e.slice();return n[r]=t,n}return n===`start`?[t,...e]:[...e,t]}function ln(e,t){let n=new Set(t.map(e=>e.id)),r=e.findIndex(e=>n.has(e.id));if(r<0)return null;let i=e.slice(r).filter(e=>!n.has(e.id));return{items:[...e.slice(0,r),...t,...i],keptOlder:r>0}}function un(e,t){let n=new Map(e.map(e=>[e.id,e])),r=e.length===t.length,i=t.map((t,i)=>{let a=n.get(t.id),o=a!==void 0&&(a===t||JSON.stringify(a)===JSON.stringify(t))?a:t;return o!==e[i]&&(r=!1),o});return r?e:i}function dn(e,t,n){if(e[0]?.id!==t)return null;let r=new Set(e.map(e=>e.id));return[...n.filter(e=>!r.has(e.id)),...e]}function fn(e,t,n){if(e.at(-1)?.id!==t)return null;let r=new Set(e.map(e=>e.id));return[...e,...n.filter(e=>!r.has(e.id))]}function pn(e,t,n){let r=t.at(-1)?.createdAt,i=new Set(t.map(e=>e.id));return e.filter(e=>!i.has(e.id)&&(r===void 0?!n.has(e.id):e.createdAt>r))}function mn(e,t){if(t<=0)return null;let n=null,r=0;for(let i=e.length-1;i>=0&&r<t;i--)(e[i].role===`bot`||e[i].role===`error`)&&(n=e[i].id,r++);return n}function hn(e){return e===`claude-cli`?`claude`:e===`codex-cli`?`codex`:null}function gn(e,t){let n=t?`docker compose exec -it botons botons`:`botons`;return e===`claude-cli`?`${n} login claude`:e===`codex-cli`?`${n} login codex`:null}function _n(e,t){let n=t?`docker compose exec botons `:``;return e===`claude-cli`?`${n}claude auth status`:e===`codex-cli`?`${n}codex login status`:null}var vn=e=>e===`claude-cli`?`BOTONS_CLAUDE_BIN`:e===`codex-cli`?`BOTONS_CODEX_BIN`:null,yn=`Its Botons' turns are still tried, and fail until it is ready: a message gets an error, a routine run fails (it isn't held for later).`;function bn(e,t){return e.usageLimitUntil&&Date.parse(e.usageLimitUntil)>t?e.usageLimitUntil:null}var xn=e=>`Its turns also hit a usage limit, so its Botons' messages and routine runs wait until it resets ${d(e)}. Then they are tried, and fail until it is ready: the reset doesn't fix this. A paused Boton waits until you resume it.`;function Sn(e,t){let n=e.readiness,r=hn(e.id),i=r?`\`${r}\``:e.label,a={text:`Check again.`,command:null},o=bn(n,t.now??Date.now()),s=o?xn(o):yn;switch(n.state){case`ready`:return{status:`Ready`,tone:`ok`,why:null,fix:null,work:null};case`usage-limited`:return!o&&n.usageLimitUntil?{status:`Usage limit reset`,tone:`unknown`,why:`Its usage limit reset ${d(n.usageLimitUntil)}; whether it is ready now isn't shown yet.`,fix:a,work:`Its Botons' held messages and routine runs are tried again, unless paused (resume first).`}:{status:`Out of usage`,tone:`warn`,why:n.usageLimitUntil?`Its turns hit a usage limit; it resets ${d(n.usageLimitUntil)}.`:`Its turns hit a usage limit.`,fix:null,work:`Its Botons' messages and routine runs wait, and carry on by themselves when it resets, unless paused (resume first).`};case`signed-out`:{if(e.kind===`api`&&e.id!==`mock`)return{status:`No key`,tone:`bad`,why:e.reason??`There is no API key for it.`,fix:{text:`Save a key in Settings → API keys.`,command:null},work:s};let n=gn(e.id,t.container);return{status:`Not signed in`,tone:`bad`,why:`${i} is installed but signed out.`,fix:n?{text:`Sign it in on the server, as the user Botons runs as, then check again. Botons never signs in for you.`,command:n}:a,work:s}}case`not-installed`:{let n=vn(e.id);return{status:`Not installed`,tone:`bad`,why:`The server can't find ${i}.`,fix:t.container?{text:`The image comes with it: rebuild and restart the container, then check again.`,command:`docker compose up -d --build`}:{text:`Install it for the user Botons runs as, and make sure the server finds it: on its PATH, or with ${n?`\`${n}\``:`its path setting`} (the systemd service reads both from its env file, \`~/.config/botons/env\`). Then restart the server and check again.`,command:null},work:s}}case`unavailable`:return n.problem===`incompatible-version`?{status:`Upgrade needed`,tone:`bad`,why:`Botons requires stable Codex 0.166.0 or newer. Older bubblewrap helpers can fail on protected missing paths with Bad file descriptor.`,fix:t.container?{text:`Set BOTONS_CODEX_VERSION (the image CODEX_VERSION build argument) to a compatible stable version before rebuilding. Keep Workspace sandboxing enabled, then Check again.`,command:`docker compose up -d --build`}:{text:`Open Settings → Brains for the reviewed upgrade action. For npm installs, upgrade with the permissions used to install Codex. Run codex --version as the server user; if BOTONS_CODEX_BIN is set, run that executable with --version instead. Then Check again. Keep Workspace sandboxing enabled.`,command:`npm install -g @openai/codex@latest`},work:s}:{status:`Can't run`,tone:`bad`,why:n.problem===`not-runnable`?`${i} is there but couldn't be started (permissions, say).`:n.problem===`version-failed`?`${i} is there but \`${r??`its`} --version\` failed.`:`${e.label} can't run turns on this server.`,fix:{text:`Check that it runs for the user Botons runs as (the doctor on the server shows more), then check again.`,command:null},work:s};case`unknown`:return n.problem===`not-checked`&&e.kind!==`cli`?{status:`Not checked`,tone:`unknown`,why:`The server doesn’t check this brain: its turns show whether it works.`,fix:null,work:null}:e.kind===`api`&&e.id!==`mock`?{status:`Key not tested lately`,tone:`unknown`,why:`Its key was last tested a while ago: its turns show whether it works.`,fix:{text:`Test key in Settings → API keys.`,command:null},work:null}:{status:Cn(n),tone:`unknown`,why:wn(n,t.now),fix:Tn(e.id,n,t.container),work:En(n)}}}function Cn(e){return e.problem===`not-checked`?`Not checked yet`:e.problem===`outdated`?`Not checked lately`:e.problem===`clock-changed`?`Check needs redoing`:`Sign-in unconfirmed`}function wn(e,t){switch(e.problem){case`not-checked`:return`The server hasn’t checked it yet.`;case`outdated`:return`Its last check was ${b(e.checkedAt,t)}, too long ago to go by.`;case`clock-changed`:return`The server’s clock was set back since its last check, so how old that check is can’t be told.`;case`timed-out`:return`It didn’t answer the server’s check in time, so whether it is signed in isn’t known.`;default:return`It is installed, but the server couldn’t read whether it is signed in.`}}function Tn(e,t,n){let r=_n(e,n);return t.problem===`not-checked`||t.problem===`outdated`||t.problem===`clock-changed`||!r?{text:`Check again.`,command:null}:{text:`Check again. If it stays unconfirmed, see what the CLI itself says on the server:`,command:r}}function En(e){return e.problem===`not-checked`||e.problem===`outdated`||e.problem===`clock-changed`?null:`Its Botons' turns are tried as usual: if it can't run them, they fail with its error.`}var Dn=e=>e.label.replace(/ \(.*\)$/,``);function On(e){return e?e.readiness.state===`usage-limited`?{kind:`limited`,until:e.readiness.usageLimitUntil}:An(e)?{kind:`none`}:null:{kind:`none`}}var kn=e=>e.kind===`limited`?`At its usage limit`:`No working brain`;function An(e){return e.readiness.state!==`ready`&&e.readiness.state!==`unknown`}function jn(e,t,n){let r=t.filter(t=>t.provider===e);if(!r.length)return{count:0,text:`No Boton uses it.`};let i=r.slice(0,5).map(e=>`${e.name}${e.paused&&!n?` (paused)`:``}`),a=r.length>i.length?` and ${r.length-i.length} more`:``;return{count:r.length,text:`Used by ${i.join(`, `)}${a}${n?` (all Botons are paused)`:``}.`}}function Mn(e,t,n){return t.map(t=>{let r=e.find(e=>e.id===t.id);if(!r?.readiness)return t;if(r.readiness.boot!==t.readiness.boot)return n?t:r;let[i,a]=[r.readiness.generation,t.readiness.generation];return a>i||a===i&&n?t:r})}var Nn=e=>`${e.readiness.boot}:${e.readiness.generation}`;function Pn(e,t){return e===`waiting`&&t===`finished`}var Fn=[{id:`claude-cli`,name:`Claude subscription`,blurb:`Sign in with your Claude plan.`,key:null},{id:`codex-cli`,name:`ChatGPT subscription (Codex)`,blurb:`Sign in with your ChatGPT plan.`,key:null},{id:`anthropic-api`,name:`Anthropic API key`,blurb:`Pay per use, with an optional daily cap per Boton.`,key:`anthropic`},{id:`openai-api`,name:`OpenAI API key`,blurb:`Pay per use, with an optional daily cap per Boton.`,key:`openai`}];function In(e,t){return t.filter(t=>t.provider===e)}function Ln(e){return e.length?`Used by ${e.map(e=>`${e.name}${e.paused?` (paused)`:``}`).join(`, `)}`:`No Botons yet`}function Rn(e,t){return t?t.source!==`none`:e?e.readiness.state!==`signed-out`&&e.readiness.state!==`not-installed`:!1}var zn=e=>`$${e<.01&&e>0?e.toFixed(4):e.toFixed(2)}`,W={ready:!1,loadError:null,pairing:null,connected:!1,updated:!1,info:null,settings:null,setup:null,providers:[],bots:[],sidebar:null,messages:{},routines:{},runs:{},memories:{},connectors:null,mcpServers:null,oauth:null,skills:null,apiKeys:null,approvals:{}},Bn=new Set;function G(e){let t=typeof e==`function`?e(W):e;W={...W,...t};for(let e of Bn)e()}function K(e){return(0,z.useSyncExternalStore)(e=>(Bn.add(e),()=>Bn.delete(e)),()=>e(W))}var Vn=()=>W,Hn=100,q={page:Hn,window:300,kept:Hn,chats:10},Un=new Map,Wn=[];function Gn(e,t){return e.items.length>t?{...e,items:e.items.slice(-t),hasMore:!0}:e}var Kn={staleMs:6e4,watchdogMs:15e3,retryMs:1e3,maxRetryMs:3e4,providersMs:6e4},qn=e=>e.lastMessage?.createdAt??e.createdAt,Jn=e=>[...e].sort((e,t)=>qn(t).localeCompare(qn(e))),Yn=[];function Xn(e){Yn.includes(e)||(Yn.push(e),Yn.length>200&&Yn.shift())}function Zn(e){let t=e.status.draft;return t&&Yn.includes(t.turnId)?{...e,status:{...e.status,draft:null}}:e}var Qn=e=>Jn(e.map(Zn));function $n(e,t){let n=t.flatMap(e=>e.meta?.turnId||[]);for(let e of n)Xn(e);n.length&&G(t=>({bots:t.bots.map(t=>t.id===e?Zn(t):t)}))}function J(e){switch(e.type){case`hello`:W.info&&e.build!==void 0&&e.build!==W.info.build&&G({updated:!0});break;case`bot.upserted`:G(t=>({bots:Jn(cn(t.bots,Zn(e.bot)))}));break;case`bot.deleted`:G(t=>({bots:t.bots.filter(t=>t.id!==e.botId),approvals:Object.fromEntries(Object.entries(t.approvals).filter(([,t])=>t.botId!==e.botId))}));break;case`bot.status`:G(t=>({bots:t.bots.map(t=>t.id===e.botId?Zn({...t,status:e.status}):t)}));break;case`message.draft`:if(Yn.includes(e.draft.turnId))break;G(t=>({bots:t.bots.map(t=>t.id===e.botId&&t.status.state===`working`?{...t,status:{...t.status,draft:e.draft}}:t)}));break;case`message.created`:{let t=e.message,n=t.meta?.turnId;n&&Xn(n),G(e=>{let r=n?e.bots.map(e=>e.id===t.botId&&e.status.draft?.turnId===n?{...e,status:{...e.status,draft:null}}:e):e.bots,i=e.messages[t.botId];if(!i||i.hasNewer||i.items.some(e=>e.id===t.id))return{bots:r};let a={...i,items:[...i.items,t]};return{bots:r,messages:{...e.messages,[t.botId]:Un.has(t.botId)?a:Gn(a,q.kept)}}});break}case`message.updated`:for(let t of sr.get(e.message.id)??[])t.overtaken=!0;ur(e.message);break;case`routine.upserted`:G(t=>{let n=t.routines[e.routine.botId];return n?{routines:{...t.routines,[e.routine.botId]:cn(n,e.routine)}}:{}});break;case`routine.deleted`:G(t=>{let n=t.routines[e.botId];return n?{routines:{...t.routines,[e.botId]:n.filter(t=>t.id!==e.routineId)}}:{}});break;case`run.upserted`:G(t=>{let n=t.runs[e.run.routineId];return n?{runs:{...t.runs,[e.run.routineId]:cn(n,e.run,`start`).slice(0,40)}}:{}});break;case`memory.upserted`:G(t=>{let n=t.memories[e.memory.botId];return n?{memories:{...t.memories,[e.memory.botId]:cn(n,e.memory)}}:{}});break;case`memory.deleted`:G(t=>{let n=t.memories[e.botId];return n?{memories:{...t.memories,[e.botId]:n.filter(t=>t.id!==e.memoryId)}}:{}});break;case`settings.updated`:G({settings:e.settings});break;case`skill.upserted`:G(t=>t.skills?{skills:dr([...t.skills.filter(t=>t.name!==e.skill.name),e.skill])}:{});break;case`skill.deleted`:G(t=>t.skills?{skills:t.skills.filter(t=>t.name!==e.name)}:{});break;case`approval.upserted`:G(t=>{if(ir(e.approval))return{approvals:{...t.approvals,[e.approval.id]:e.approval}};if(!t.approvals[e.approval.id])return{};let{[e.approval.id]:n,...r}=t.approvals;return{approvals:r}});break;case`oauth.upserted`:G(t=>t.oauth?{oauth:{...t.oauth,connections:[...t.oauth.connections.filter(t=>t.id!==e.connection.id),e.connection].sort((e,t)=>e.name.localeCompare(t.name))}}:{});break;case`sidebar.updated`:er++,G({sidebar:e.layout});break;case`api_keys.updated`:G({apiKeys:e.view});break;case`oauth.deleted`:G(t=>t.oauth?{oauth:{...t.oauth,connections:t.oauth.connections.filter(t=>t.id!==e.id)}}:{})}}var er=0;async function tr(e,t){let n=er,r=await e();return er===n&&G({sidebar:t(r)}),r}var nr=e=>e,rr=e=>Object.fromEntries(e.map(e=>[e.id,e])),ir=e=>e.status===`pending`||Un.has(e.botId)||!!W.messages[e.botId],ar=e=>Object.fromEntries(Object.entries(e).filter(([,e])=>ir(e)));function or(e){return Object.values(e).filter(e=>e.status===`pending`).sort((e,t)=>e.createdAt.localeCompare(t.createdAt))}var sr=new Map;async function cr(e,t){let n={overtaken:!1},r=sr.get(e.id)??new Set;sr.set(e.id,r.add(n));try{let e=await t();n.overtaken||ur(e)}finally{r.delete(n),r.size||sr.delete(e.id)}}async function lr(e,t){let n=(W.messages[e]?.items??[]).map(e=>{let t={overtaken:!1},n=sr.get(e.id)??new Set;return sr.set(e.id,n.add(t)),{id:e.id,w:t,inFlight:n}});try{let r=await t(),i=new Map((W.messages[e]?.items??[]).map(e=>[e.id,e])),a=new Set(n.filter(e=>e.w.overtaken).map(e=>e.id));return r.map(e=>a.has(e.id)?i.get(e.id)??e:e)}finally{for(let{id:e,w:t,inFlight:r}of n)r.delete(t),r.size||sr.delete(e)}}function ur(e){G(t=>{let n=t.messages[e.botId];return n?.items.some(t=>t.id===e.id)?{messages:{...t.messages,[e.botId]:{...n,items:n.items.map(t=>t.id===e.id?e:t)}}}:{}})}var dr=e=>[...e].sort((e,t)=>e.name.localeCompare(t.name));function Y(e,t){G(n=>{let r=n.messages[e]??{items:[],hasMore:!1,hasNewer:!1,loading:!1,loadingEarlier:!1,loadingLater:!1,error:null},i={...r,...t(r)};return{messages:{...n.messages,[e]:Un.has(e)?i:Gn(i,q.kept)}}})}var fr=new Map,pr=new Map,X=e=>pr.get(e)??0;function mr(e){pr.set(e,X(e)+1),fr.delete(e)}function hr(e,t=!1){let n=fr.get(e);if(n&&!t)return n;if(n){let t=X(e),r=()=>X(e)===t?hr(e):Promise.resolve();return n.then(r,r)}let r=null;return r=(async()=>{let t=X(e),n=new Set(W.messages[e]?.items.map(e=>e.id));Y(e,()=>({loading:!0}));try{let r=await lr(e,()=>s.messages(e,{},Hn));if($n(e,r),t!==X(e))return;Y(e,e=>{if(e.hasNewer)return{loading:!1};let t=e.error?.retry===`latest`?null:e.error,i=ln(e.items,r);return{...i?{items:un(e.items,i.items),hasMore:i.keptOlder?e.hasMore:r.length===Hn}:{items:un(e.items,[...r,...pn(e.items,r,n)]),hasMore:r.length===Hn},loading:!1,error:t}})}catch(n){if(t!==X(e))return;throw Y(e,()=>({loading:!1,error:{message:f(n),retry:`latest`}})),n}finally{fr.get(e)===r&&fr.delete(e)}})(),fr.set(e,r),r}var gr=new Map,_r=new Map,vr=300;function yr(e,t,n){G(r=>({[e]:{...r[e],[t]:n}}))}async function br(e,t,n){try{yr(e,t,await n(t))}catch(n){if(!(n instanceof l&&n.status===404))throw n;G(n=>{let{[t]:r,...i}=n[e];return{[e]:i}})}}var xr=(e,t)=>Object.fromEntries(Object.entries(e).filter(([e])=>t.has(e)));async function Sr(){let e=er;jr=Date.now();let[t,n,r,i,a]=await Promise.all([s.bots(),s.settings(),Pr(),s.approvals(),s.sidebar()]),o=new Set(t.map(e=>e.id)),c=Object.keys(W.messages).filter(e=>o.has(e)),l=await Promise.all(c.map(e=>s.botApprovals(e).catch(()=>[])));for(let e of Object.keys(W.messages))o.has(e)||mr(e);G(s=>({bots:Qn(t),sidebar:er===e?a:s.sidebar,settings:n,providers:r(s.providers),messages:xr(s.messages,o),routines:xr(s.routines,o),memories:xr(s.memories,o),approvals:ar({...rr(l.flat()),...rr(i)})}));let u=W;await Promise.all([...u.skills?[Q.loadSkills()]:[],...Object.keys(u.messages).map(e=>hr(e,!0)),...Object.keys(u.routines).map(e=>br(`routines`,e,s.routines)),...Object.keys(u.runs).map(e=>br(`runs`,e,s.runs)),...Object.keys(u.memories).map(e=>br(`memories`,e,s.memories))])}var Cr=1,wr=2,Z=null,Tr=0,Er=!1,Dr=!1,Or=0,kr,Ar,jr=0,Mr=0,Nr=0;async function Pr(e=!1){let t=++Mr,n=await s.providers(e);return e=>{let r=t>Nr;return Nr=Math.max(Nr,t),Mn(e,n,r)}}function Fr(){Z?.close();let e=s.events();Z=e,Tr=Date.now(),e.onmessage=t=>{if(e!==Z)return;Tr=Date.now();let n;try{n=JSON.parse(t.data)}catch{return}n.type===`hello`&&(Er?Ir():G({connected:!0})),J(n),n.type===`message.created`&&n.message.role===`error`&&Q.loadProviders().catch(()=>{})},e.onerror=()=>{e===Z&&(Er=!0,G({connected:!1}),e.readyState===wr&&Q.checkAuth().catch(()=>{}))}}async function Ir(){if(clearTimeout(kr),!Dr){Dr=!0;try{for(;Er&&Z?.readyState===Cr;)Er=!1,await Sr(),Or=0;!Er&&Z?.readyState===Cr&&G({connected:!0})}catch(e){Er=!0;let t=Math.min(Kn.retryMs*2**Or++,Kn.maxRetryMs);console.warn(`[Botons] catching up after a reconnect failed; retrying in ${t} ms`,e),kr=setTimeout(()=>void Ir(),t)}finally{Dr=!1}}}function Lr(){Er=!0,G({connected:!1}),Fr()}function Rr(){Z&&(Z.readyState===wr||Date.now()-Tr>Kn.staleMs?Lr():Date.now()-jr>=Kn.providersMs&&(typeof document>`u`||document.visibilityState===`visible`)&&Q.loadProviders().catch(()=>{}))}var zr=()=>{document.visibilityState===`visible`&&Rr()},Br=()=>{Z&&Lr()};function Vr(){Fr(),clearInterval(Ar),Ar=setInterval(Rr,Kn.watchdogMs),typeof document<`u`&&document.addEventListener(`visibilitychange`,zr),typeof window<`u`&&window.addEventListener(`online`,Br)}function Hr(){Z?.close(),Z=null,clearInterval(Ar),clearTimeout(kr),typeof document<`u`&&document.removeEventListener(`visibilitychange`,zr),typeof window<`u`&&window.removeEventListener(`online`,Br),G({connected:!1})}function Ur(e){return J({type:`bot.upserted`,bot:e}),e}var Q={react(e,t){return cr(e,()=>s.react(e.botId,e.id,t))},unreact(e,t){return cr(e,()=>s.unreact(e.botId,e.id,t))},async pinMessage(e,t){await cr(e,()=>s.pinMessage(e.botId,e.id,t))},async init(){try{if(!await Q.checkAuth())return;jr=Date.now();let[e,t,n,r,i,a,o]=await Promise.all([s.info(),s.settings(),s.providers(),s.bots(),s.approvals(),s.setup(),s.sidebar()]);G({info:e,settings:t,setup:a,providers:n,bots:Qn(r),sidebar:o,approvals:rr(i),ready:!0,loadError:null}),Er=!1,Vr()}catch(e){G({loadError:f(e)})}},async checkAuth(){let e=await s.authStatus();return e.caller===`device`?(W.pairing&&G({pairing:null}),!0):(Hr(),G({pairing:e,ready:!1,connected:!1,loadError:null}),!1)},async loadSetup(){G({setup:await s.setup()})},async updateSetup(e){let t=await s.updateSetup(e);return G({setup:t}),t},async loadProviders(e=!1){jr=Date.now();let t=await Pr(e);G(e=>({providers:t(e.providers)}))},async signOut(){await s.logout(),await Q.checkAuth()},async loadMessages(e){await hr(e).catch(()=>{})},async loadEarlier(e){let t=W.messages[e];if(!t||t.loadingEarlier||!t.hasMore||!t.items.length)return!1;let n=t.items[0].id,r=X(e);Y(e,()=>({loadingEarlier:!0}));try{let t=await lr(e,()=>s.messages(e,{before:n},Hn));if(r!==X(e))return!1;let i=!1;return Y(e,e=>{let r=dn(e.items,n,t);if(!r)return{loadingEarlier:!1};i=r.length!==e.items.length;let a=r.length>q.window;return{items:a?r.slice(0,q.window):r,hasMore:t.length===Hn,hasNewer:e.hasNewer||a,loadingEarlier:!1,error:e.error?.retry===`earlier`?null:e.error}}),i}catch(t){return r===X(e)&&Y(e,()=>({loadingEarlier:!1,error:{message:f(t),retry:`earlier`}})),!1}},async loadLater(e){let t=W.messages[e];if(!t||t.loadingLater||!t.hasNewer||!t.items.length)return!1;let n=t.items.at(-1).id,r=X(e);Y(e,()=>({loadingLater:!0}));let i=!1,a=!1;try{let t=await lr(e,()=>s.messages(e,{after:n},Hn));if($n(e,t),r!==X(e))return!1;Y(e,e=>{let r=fn(e.items,n,t);if(!r)return{loadingLater:!1};i=r.length!==e.items.length,a=t.length<Hn;let o=Math.max(0,r.length-q.window);return{items:o?r.slice(o):r,hasNewer:!a,hasMore:e.hasMore||o>0,loadingLater:!1,error:e.error?.retry===`later`?null:e.error}})}catch(t){return r===X(e)&&(Y(e,()=>({loadingLater:!1})),t instanceof l&&t.status===404?(await Q.jumpToLatest(e),!0):(Y(e,()=>({error:{message:f(t),retry:`later`}})),!1))}return a&&await hr(e,!0).catch(()=>{}),i},async jumpToLatest(e){let t=W.messages[e];(!t||t.hasNewer)&&(mr(e),Y(e,()=>({items:[],hasMore:!1,hasNewer:!1,loading:!0,loadingEarlier:!1,loadingLater:!1,error:null})),await Q.loadMessages(e))},keepWindow(e,t=`oldest`){let n=W.messages[e];if(!n||n.hasNewer||n.items.length<=q.window)return;let r=t===`oldest`?Gn(n,q.window):{...n,items:n.items.slice(0,q.window),hasNewer:!0};G(t=>({messages:{...t.messages,[e]:r}}))},openChat(e){Un.set(e,(Un.get(e)??0)+1);let t=Wn.indexOf(e);t>=0&&Wn.splice(t,1)},leaveChat(e){let t=(Un.get(e)??0)-1;if(t>0){Un.set(e,t);return}Un.delete(e),Wn.push(e);let n=new Set(Wn.splice(0,Math.max(0,Wn.length-q.chats)));W.messages[e]?.hasNewer&&n.add(e);for(let e of n)mr(e);G(t=>{let r=t.messages[e],i=Object.fromEntries(Object.entries(t.messages).filter(([e])=>!n.has(e)));return r&&!n.has(e)&&(i[e]=Gn({...r,loadingEarlier:!1,error:r.error?.retry===`latest`?r.error:null},q.kept)),{messages:i}}),G(e=>{let t=ar(e.approvals);return Object.keys(t).length===Object.keys(e.approvals).length?{}:{approvals:t}});let r=Wn.indexOf(e);n.has(e)&&r>=0&&Wn.splice(r,1)},retryMessages(e){let t=W.messages[e]?.error;return t?.retry===`earlier`?Q.loadEarlier(e):t?.retry===`later`?Q.loadLater(e):Q.loadMessages(e)},async send(e,t,n=[]){J({type:`message.created`,message:await s.send(e,t,n)})},async createBot(e){return Ur(await s.createBot(e))},async duplicateBot(e,t){return Ur(await s.duplicateBot(e,t))},async updateBot(e,t){return Ur(await s.updateBot(e,t))},sidebar:{async createGroup(e){return(await tr(()=>s.createSidebarGroup(e),e=>e.layout)).groupId},renameGroup:(e,t)=>tr(()=>s.updateSidebarGroup(e,{name:t}),nr),deleteGroup:e=>tr(()=>s.deleteSidebarGroup(e),nr),moveGroup:(e,t)=>tr(()=>s.moveSidebarGroup(e,t),nr),moveBot:(e,t,n)=>tr(()=>s.moveSidebarBot(e,t,n),nr),pin:(e,t,n)=>tr(()=>s.pinSidebarBot(e,t,n),nr),collapse:(e,t)=>tr(()=>typeof e==`string`?s.setSidebarSection(e,t):s.updateSidebarGroup(e.groupId,{collapsed:t}),nr)},async deleteBot(e){await s.deleteBot(e),J({type:`bot.deleted`,botId:e})},async loadRoutines(e){yr(`routines`,e,await s.routines(e))},async loadRuns(e){yr(`runs`,e,await s.runs(e))},async loadApprovals(e){let t=await s.botApprovals(e);G(e=>({approvals:ar({...e.approvals,...rr(t)})}))},async loadApproval(e){J({type:`approval.upserted`,approval:await s.approval(e)})},async decideApproval(e,t){let n=await s.decideApproval(e,t);return J({type:`approval.upserted`,approval:n}),n},async answerCard(e,t,n){let r=await s.answerCard(e,t,n);return J({type:`message.updated`,message:r}),r},async reloadCard(e){J({type:`message.updated`,message:await s.card(e)})},async loadMemories(e){yr(`memories`,e,await s.memories(e))},markRead(e,t){gr.get(e)!==t&&(gr.set(e,t),G(t=>({bots:t.bots.map(t=>t.id===e&&t.unread?{...t,unread:0}:t)})),clearTimeout(_r.get(e)),_r.set(e,setTimeout(()=>{_r.delete(e),s.markRead(e,t).catch(n=>{gr.get(e)===t&&gr.delete(e),console.warn(`[Botons] could not mark ${e} read`,n)})},vr)))},async forgetMemory(e){J({type:`memory.deleted`,memoryId:e.id,botId:e.botId});try{await s.deleteMemory(e.id)}catch(t){if(t instanceof l&&t.status===404)return;throw G(t=>{let n=t.memories[e.botId];return!n||n.some(t=>t.id===e.id)?{}:{memories:{...t.memories,[e.botId]:[...n,e].sort((e,t)=>e.createdAt.localeCompare(t.createdAt))}}}),t}},async updateSettings(e){G({settings:await s.updateSettings(e)})},async pauseBot(e,t){Ur(await s.pauseBot(e,t))},async pauseAll(e){G({settings:await s.pauseAll(e)})},async loadConnectors(){G({connectors:await s.connectors()})},async loadMcpServers(){G({mcpServers:await s.mcpServers()})},async saveMcpServer(e,t){e?await s.updateMcpServer(e,t):await s.createMcpServer(t),await Promise.all([Q.loadMcpServers(),Q.loadConnectors()])},async loadSkills(){G({skills:dr(await s.skills())})},async saveSkill(e,t){let n=e?await s.updateSkill(e,{description:t.description,body:t.body}):await s.createSkill({...t,name:t.name??``});return J({type:`skill.upserted`,skill:n}),n},async approveSkill(e,t){J({type:`skill.upserted`,skill:await s.approveSkill(e,t)})},skillChanged(e){J({type:`skill.upserted`,skill:e})},async deleteSkill(e){await s.deleteSkill(e),J({type:`skill.deleted`,name:e})},async loadApiKeys(){G({apiKeys:await s.apiKeys()})},apiKeyChanged(e){G(t=>t.apiKeys?{apiKeys:{providers:t.apiKeys.providers.map(t=>t.provider===e.provider?e:t)}}:{})},async loadOAuth(){G({oauth:await s.oauthConnections()})},async addOAuth(e){let t=await s.createOAuthConnection(e);return J({type:`oauth.upserted`,connection:t}),await Q.loadConnectors(),t},async updateOAuth(e,t){J({type:`oauth.upserted`,connection:await s.updateOAuthConnection(e,t)})},async deleteOAuth(e){await s.deleteOAuthConnection(e),J({type:`oauth.deleted`,id:e}),await Q.loadConnectors()},async connectOAuth(e){let{authorizeUrl:t}=await s.connectOAuth(e,location.origin);location.assign(t)},async checkOAuth(e){J({type:`oauth.upserted`,connection:await s.checkOAuth(e)})},async testConnector(e){let t=await s.testConnector(e);return await Q.loadConnectors(),t},async setConnectorPolicy(e,t){await s.setConnectorPolicy(e,t),await Q.loadConnectors()},async deleteMcpServer(e){await s.deleteMcpServer(e),await Promise.all([Q.loadMcpServers(),Q.loadConnectors()])}};o(()=>{Q.checkAuth().catch(()=>{})});function Wr(){let e=this.data();(e.micromarkExtensions??=[]).push(Oe()),(e.fromMarkdownExtensions??=[]).push(Ee())}var Gr=[Wr],Kr=(0,z.memo)(function(e){let{botId:t,workspace:n,dir:r,onOpenFile:i}=e,a=e=>t&&n&&typeof e==`string`?re(e,n,r):null;return(0,H.jsx)(`div`,{className:`md`,children:(0,H.jsx)(De,{remarkPlugins:Gr,components:{a:({node:e,href:n,...r})=>{let o=a(n);if(o===null||!t)return(0,H.jsx)(`a`,{...r,href:n,target:`_blank`,rel:`noreferrer noopener`});let s=e=>{!i||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey||(e.preventDefault(),i(o))};return(0,H.jsx)(`a`,{...r,href:D(t,o),target:`_blank`,rel:`noreferrer noopener`,onClick:s})},thead:({node:e,...t})=>(0,H.jsx)(`tbody`,{...t}),th:({node:e,...t})=>(0,H.jsx)(`th`,{scope:`col`,...t}),img:({node:e,src:n,alt:r,...i})=>{let o=a(n);return(0,H.jsx)(`img`,{...i,alt:r??``,src:o===null||!t?n:D(t,o),loading:`lazy`})}},children:e.text})})});function qr(e){return e.trigger===`chat`?e.askedBy.length?`a chat turn, answering ${e.askedBy.join(` and `)}`:`a chat turn`:`a ${e.trigger===`schedule`?`scheduled`:e.trigger} run of`}function Jr(){let e=K(e=>e.approvals);return(0,z.useMemo)(()=>or(e),[e])}function Yr({bot:e,m:t,onOpenRoutine:n}){let r=t.meta?.approvalId??``,i=K(e=>r?e.approvals[r]:void 0),[a,o]=(0,z.useState)(null);if((0,z.useEffect)(()=>{if(!r||i)return;let e=setTimeout(()=>{Vn().approvals[r]||Q.loadApproval(r).catch(e=>o(f(e)))},800);return()=>clearTimeout(e)},[r,i]),!i)return(0,H.jsxs)(`div`,{className:`approval-card loading`,id:`approval-${r}`,"aria-busy":!a,children:[(0,H.jsxs)(`div`,{className:`approval-head`,children:[(0,H.jsx)(P,{size:16}),(0,H.jsxs)(`span`,{children:[e.name,` asks for your approval`]})]}),(0,H.jsx)(`p`,{className:`approval-title`,children:t.meta?.approvalTitle??t.text}),(0,H.jsx)(`p`,{className:`hint`,children:a?`Couldn't load this request: ${a}`:`Loading…`})]});let s=i.kind===`skill`;return(0,H.jsxs)(`div`,{className:h(`approval-card`,`is-${i.status}`,i.from.sandboxed&&`outside`),id:`approval-${i.id}`,role:`group`,"aria-label":`Approval request: ${i.title}`,children:[(0,H.jsxs)(`div`,{className:`approval-head`,children:[(0,H.jsx)(P,{size:16}),(0,H.jsx)(`span`,{children:s?`${e.name} saved a skill for your approval`:`${e.name} asks for your approval`}),(0,H.jsx)(`span`,{className:`approval-time`,title:d(i.createdAt),children:v(i.createdAt)})]}),(0,H.jsx)(`p`,{className:`approval-title`,children:i.title}),i.tool&&(0,H.jsxs)(H.Fragment,{children:[(0,H.jsx)(`p`,{className:`approval-rule`,children:i.tool.browser?(0,H.jsxs)(H.Fragment,{children:[e.name,`'s browser is holding a request the page tried to send after `,e.name,` clicked or typed. Exactly this is sent, once, if you allow it while`,` `,e.name,` waits. Labels and text from the page are the site's own, not proof of what it does:`]}):i.tool.rule?(0,H.jsxs)(H.Fragment,{children:[`A tool call your Ask first rule `,(0,H.jsx)(`code`,{children:i.tool.rule}),` paused. Exactly this runs if you allow it:`]}):(0,H.jsx)(H.Fragment,{children:`A tool call Claude Code asked about (none of your Ask first rules names it). Exactly this runs if you allow it:`})}),(0,H.jsx)(`pre`,{className:`approval-call`,tabIndex:0,children:i.details})]}),!i.tool&&i.details&&(i.from.sandboxed?(0,H.jsx)(`p`,{className:`approval-details plain`,children:i.details}):(0,H.jsx)(`div`,{className:`approval-details`,children:(0,H.jsx)(Kr,{text:i.details})})),i.followUp&&(0,H.jsxs)(`div`,{className:`approval-then`,children:[(0,H.jsx)(`p`,{className:`approval-then-label`,children:i.from.sandboxed?`Exactly what ${e.name} will be told to do, with its usual access and connectors:`:`What ${e.name} will be told to do once allowed:`}),(0,H.jsx)(`p`,{className:`plain`,tabIndex:i.followUp.length>600?0:void 0,children:i.followUp})]}),(0,H.jsxs)(`p`,{className:`approval-origin`,children:[s?`Saved`:`Asked`,` in `,qr(i.from),i.from.routineId&&(0,H.jsxs)(`button`,{className:`chip-link`,onClick:()=>n(i.from.routineId),children:[(0,H.jsx)(be,{size:14}),i.from.routineName??`a routine`]}),i.from.trigger===`test`&&(0,H.jsx)(`span`,{children:` (a test run: it pushes nothing)`})]}),i.from.sandboxed&&(0,H.jsx)(`p`,{className:`approval-warn`,children:i.tool?`${e.name} made this call during a webhook run, whose payload came from outside: read all of it before you allow it.`:`It was written during a webhook run, whose payload came from outside. If you allow it, ${e.name} does ${i.followUp?`the text above`:`what the title and details say`} with its usual access and connectors, so read all of it.`}),i.status===`pending`?(0,H.jsx)(Xr,{a:i,bot:e,skill:s}):(0,H.jsx)(Zr,{a:i,bot:e})]})}function Xr({a:e,bot:t,skill:n}){let[r,i]=(0,z.useState)(()=>Date.now());(0,z.useEffect)(()=>{let e=setInterval(()=>i(Date.now()),3e4);return()=>clearInterval(e)},[]);let[o,s]=(0,z.useState)(!1),[c,l]=(0,z.useState)(!1),[u,p]=(0,z.useState)(``),m=async(t,n=!1)=>{s(!0);try{await Q.decideApproval(e.id,{decision:t,...n?{always:n}:{},...u.trim()?{note:u.trim()}:{}})}catch(n){a({kind:`error`,text:`Couldn't ${t} “${e.title}”: ${f(n)}`},8e3),Q.loadApproval(e.id).catch(()=>{})}finally{s(!1)}};return(0,H.jsxs)(H.Fragment,{children:[c&&(0,H.jsx)(`textarea`,{className:`approval-note`,rows:2,maxLength:2e3,value:u,autoFocus:!0,placeholder:`A note for ${t.name} with your decision (optional)`,"aria-label":`Note for ${t.name}`,onChange:e=>p(e.target.value)}),(0,H.jsxs)(`div`,{className:`approval-actions`,children:[(0,H.jsx)(`button`,{className:`btn small primary`,disabled:o,onClick:()=>void m(`allow`),children:n?`Approve for every Boton`:e.kind===`connector`?`Allow`:`Allow once`}),e.action&&(0,H.jsxs)(`button`,{className:`btn small`,disabled:o,onClick:()=>void m(`allow`,!0),title:e.tool?`Allow this, and from now on let ${t.name} make the calls “${e.tool.rule}” covers without asking`:`Allow this, and from now on let ${t.name} do “${e.action}” without asking`,children:[`Always allow “`,e.tool?.rule??e.action,`”`]}),(0,H.jsx)(`button`,{className:`btn small danger`,disabled:o,onClick:()=>void m(`deny`),children:n?`Keep it ${t.name}'s`:`Deny`}),!c&&(0,H.jsx)(`button`,{className:`link-btn`,onClick:()=>l(!0),children:`Add a note`})]}),e.tool&&new Date(e.tool.waitUntil).getTime()>r?(0,H.jsxs)(`p`,{className:`approval-expiry is-waiting`,title:d(e.tool.waitUntil),children:[t.name,` is waiting for your answer, until `,v(e.tool.waitUntil),`. After that it carries on without `,e.tool.browser?`sending it`:`this call`,`.`]}):e.expiresAt&&(0,H.jsxs)(`p`,{className:`approval-expiry`,title:d(e.expiresAt),children:[new Date(e.expiresAt).getTime()<=r?`Expiring…`:`Expires ${b(e.expiresAt,r)}`,` ·`,` `,e.tool?`${t.name} stopped waiting: if you allow it, ${t.name} gets a turn in which this call is allowed once`:`${t.name} gets a turn with your decision`]}),n&&(0,H.jsxs)(`p`,{className:`approval-expiry`,children:[`Until you approve it, only `,t.name,` can use it.`]})]})}function Zr({a:e,bot:t}){let n=e.decidedAt?` · ${v(e.decidedAt)}`:``,r;switch(e.status){case`allowed`:{let n=e.tool?.rule??e.action;if(r=e.auto?`Allowed without asking: “${n}” is always allowed`:e.kind===`skill`?`Approved for every Boton`:e.always?`Allowed, and “${n}” from now on`:`Allowed`,e.tool?.browser){let t=e.tool.usedAt?e.tool.delivery:null;r=t===`sent`?`Allowed: sent once`:t===`unknown`?`Allowed and sent, but the connection broke before the site answered: it may have arrived. Check on the site before asking for it again`:t===`sending`?`Allowed: sending. If this stays, the server stopped mid-send and it may have arrived: check on the site`:t===`not-sent`?`Allowed, but not sent: it failed before it left`:`Allowed, but not sent: the page, its cookies, the browser or the sites changed first`}else e.tool&&!e.auto&&(r+=e.tool.inTurn?`: ${t.name} went ahead`:e.tool.usedAt?`: ${t.name} made the call in a later turn`:`: ${t.name} gets a turn to make the call`);break}case`denied`:r=e.kind===`skill`?`Kept as ${t.name}'s own`:e.tool?.browser?`Denied: not sent`:e.tool?.inTurn?`Denied: ${t.name}'s call failed`:`Denied`;break;case`expired`:r=`Expired: nobody decided in time, so nothing was done`;break;default:r=e.kind===`skill`?`The skill was deleted`:e.tool?.browser?`Withdrawn: the browser step ended first, so nothing was sent`:`Withdrawn by ${t.name}`}return(0,H.jsxs)(`div`,{className:h(`approval-outcome`,`is-${e.status}`),role:`status`,children:[(0,H.jsxs)(`span`,{children:[r,n]}),e.note&&(0,H.jsxs)(`span`,{className:`chip-quote`,children:[`“`,e.note,`”`]})]})}function Qr({m:e}){let t=e.meta?.decision===`allowed`,n=e.meta?.approvalTitle??``;return(0,H.jsxs)(`div`,{className:h(`event-chip decision`,!t&&`warn`),title:d(e.createdAt),children:[(0,H.jsx)(`span`,{children:t?`You allowed`:`You denied`}),(0,H.jsxs)(`span`,{className:`chip-title`,children:[`“`,S(n,80),`”`]}),e.meta?.note&&(0,H.jsxs)(`span`,{className:`chip-quote`,children:[`“`,S(e.meta.note,60),`”`]})]})}function $r({bot:e}){let t=Jr().filter(t=>t.botId===e.id);if(!t.length)return null;let n=t[0];return(0,H.jsxs)(`div`,{className:`approvals-bar`,role:`status`,children:[(0,H.jsx)(P,{size:16}),(0,H.jsxs)(`span`,{children:[(0,H.jsx)(`strong`,{children:t.length===1?`Waiting for your approval:`:`${t.length} requests wait for your approval. The first:`}),` `,n.title]}),(0,H.jsx)(`button`,{className:`btn small`,onClick:()=>{let e=document.getElementById(`approval-${n.id}`);e?e.scrollIntoView({behavior:window.matchMedia(`(prefers-reduced-motion: reduce)`).matches?`auto`:`smooth`,block:`center`}):a({kind:`info`,text:`The request is further up the chat: scroll up (Load earlier messages) to find it.`})},children:`Show`})]})}var ei=2048,ti=1572864,ni=/^image\/(jpeg|png|webp|heic|heif)$/;async function ri(e){if(!ni.test(e.type)||typeof createImageBitmap!=`function`)return e;let t=null;try{t=await createImageBitmap(e,{imageOrientation:`from-image`});let n=Math.min(1,ei/Math.max(t.width,t.height)),r=/hei[cf]$/.test(e.type);if(n===1&&!r&&e.size<=ti)return e;let i=document.createElement(`canvas`);i.width=Math.max(1,Math.round(t.width*n)),i.height=Math.max(1,Math.round(t.height*n));let a=i.getContext(`2d`);if(!a)return e;a.drawImage(t,0,0,i.width,i.height);let o=e.type===`image/png`?`image/png`:`image/jpeg`,s=await new Promise(e=>i.toBlob(e,o,.85));if(!s||s.size>=e.size&&!r)return e;let c=e.name.replace(/\.[^.]*$/,``)||`image`;return new File([s],o===`image/png`?`${c}.png`:`${c}.jpg`,{type:o,lastModified:e.lastModified})}catch{return e}finally{t?.close()}}var ii=1;function ai(e){let[t,n]=(0,z.useState)([]),r=(0,z.useRef)(new Set),i=(0,z.useRef)(new Map),o=(0,z.useRef)(new Set),c=(e,t)=>n(n=>n.map(n=>n.id===e?{...n,...t}:n)),l=(0,z.useCallback)(e=>{i.current.get(e.id)?.abort(),i.current.delete(e.id),e.preview&&(URL.revokeObjectURL(e.preview),o.current.delete(e.preview))},[]);return(0,z.useEffect)(()=>()=>{for(let e of i.current.values())e.abort();i.current.clear();for(let e of o.current)URL.revokeObjectURL(e);o.current.clear(),r.current.clear(),n([])},[e]),{items:t,add:t=>{let l=10-r.current.size;t.length>l&&a({kind:`error`,text:`You can send up to 10 files with a message.`},6e3);for(let a of t.slice(0,Math.max(0,l))){let t=ii++;r.current.add(t);let l=new AbortController;i.current.set(t,l),n(e=>[...e,{id:t,name:a.name||`file`,preview:null,progress:0,ref:null,error:null}]),(async()=>{let n=await ri(a);if(!l.signal.aborted){if(ne(n.name)===`image`){let e=URL.createObjectURL(n);o.current.add(e),c(t,{preview:e,name:n.name})}if(n.size>26214400)c(t,{error:`Too big (${M(n.size)}; the limit is ${M(N)})`});else try{let r=await s.upload(e,n,n.name,e=>c(t,{progress:e}),l.signal);l.signal.aborted||c(t,{ref:r,progress:1})}catch(e){l.signal.aborted||c(t,{error:f(e)})}finally{i.current.delete(t)}}})()}},remove:e=>{let i=t.find(t=>t.id===e);i&&l(i),r.current.delete(e),n(t=>t.filter(t=>t.id!==e))},clear:()=>{for(let e of t)l(e);r.current.clear(),n([])},busy:t.some(e=>!e.ref&&!e.error),ready:t.flatMap(e=>e.ref?[e.ref]:[])}}function oi({items:e,onRemove:t}){return e.length?(0,H.jsx)(`ul`,{className:`pending-files`,"aria-label":`Files to send`,children:e.map(e=>{let n=e.error?`failed`:e.ref?`ready`:`uploading`;return(0,H.jsxs)(`li`,{className:h(`pending-file`,n),title:e.error??e.name,children:[e.preview?(0,H.jsx)(`img`,{src:e.preview,alt:``}):(0,H.jsx)(he,{size:18}),(0,H.jsx)(`span`,{className:`pending-name`,children:e.error?e.error:e.name}),n===`uploading`&&(0,H.jsx)(`span`,{className:`pending-progress`,role:`progressbar`,"aria-label":`Uploading ${e.name}`,"aria-valuenow":Math.round(e.progress*100),children:(0,H.jsx)(`i`,{style:{width:`${Math.max(4,e.progress*100)}%`}})}),n===`failed`&&(0,H.jsx)(xe,{size:14,className:`error-icon`}),(0,H.jsx)(`button`,{type:`button`,className:`pending-remove`,"aria-label":`Remove ${e.name}`,onClick:()=>t(e.id),children:(0,H.jsx)(L,{size:12})})]},e.id)})}):null}function si({bot:e,files:t,onOpen:n}){return(0,H.jsx)(`div`,{className:`sent-files`,children:t.map(t=>{let r=e=>{e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey||(e.preventDefault(),n(t.path))},i=ne(t.name);return i===`image`||i===`svg`?(0,H.jsx)(`a`,{className:`sent-thumb`,href:D(e.id,t.path),target:`_blank`,rel:`noreferrer noopener`,onClick:r,title:t.name,children:(0,H.jsx)(`img`,{src:D(e.id,t.path),alt:t.name,loading:`lazy`})},t.path):(0,H.jsxs)(`a`,{className:`sent-file`,href:D(e.id,t.path),target:`_blank`,rel:`noreferrer noopener`,onClick:r,title:t.name,children:[(0,H.jsx)(he,{size:16}),(0,H.jsx)(`span`,{children:t.name}),(0,H.jsx)(`span`,{className:`sent-size`,children:M(t.size)})]},t.path)})})}var ci=n();function li(e,t){return e.state===`requested`&&e.expiresAt>t}var ui=class{#e=new Uint8Array;push(e){let t=new Uint8Array(this.#e.length+e.length);t.set(this.#e),t.set(e,this.#e.length);let n=[],r=0;for(;t.length-r>=5;){let e=new DataView(t.buffer,t.byteOffset+r),i=e.getUint8(0),a=e.getUint32(1);if(a>16777216)throw Error(`The live view sent a chunk too large to be one`);if(t.length-r-5<a)break;let o=t.slice(r+5,r+5+a);if(r+=5+a,i===1&&o.length>=4){let e=new DataView(o.buffer);n.push({kind:`frame`,width:e.getUint16(0),height:e.getUint16(2),jpeg:o.slice(4)})}else if(i===2)try{n.push({kind:`notice`,notice:JSON.parse(new TextDecoder().decode(o))})}catch{}}return this.#e=t.slice(r),n}};function di(e,t,n,r){if(!(n.width>0&&n.height>0&&r.width>0&&r.height>0))return null;let i=Math.min(n.width/r.width,n.height/r.height),a=r.width*i,o=r.height*i,s=n.left+(n.width-a)/2,c=n.top+(n.height-o)/2,l=(e-s)/i,u=(t-c)/i;return l<0||u<0||l>=r.width||u>=r.height?null:{x:Math.min(r.width-1,Math.floor(l)),y:Math.min(r.height-1,Math.floor(u))}}var fi=null,pi=new Set,mi=()=>pi.forEach(e=>e()),hi={open(e){fi=e,mi()},close(){fi=null,mi()},subscribe(e){return pi.add(e),()=>void pi.delete(e)},current:()=>fi};function gi(){return(0,z.useSyncExternalStore)(hi.subscribe,hi.current,()=>null)}var _i=new Set([`a`,`z`,`y`]);function vi(e){let t=e.ctrlKey||e.metaKey,n=[...e.shiftKey?[`Shift`]:[],...t?[`Control`]:[]];if(e.altKey)return{kind:`own`};if(t){let t=e.key.length===1?e.key.toLowerCase():e.key;return t===`c`?{kind:`copy`,cut:!1}:t===`x`?{kind:`copy`,cut:!0}:t===`v`?{kind:`paste`}:_i.has(t)||[`ArrowLeft`,`ArrowRight`,`ArrowUp`,`ArrowDown`,`Backspace`,`Delete`,`Home`,`End`].includes(t)?{kind:`key`,key:t,mods:n}:{kind:`own`}}return e.key===` `?{kind:`text`}:e.key===`Tab`&&e.shiftKey?{kind:`key`,key:`Shift+Tab`,mods:[]}:g.includes(e.key)?{kind:`key`,key:e.key,mods:e.shiftKey?[`Shift`]:[]}:{kind:`text`}}var yi=[],bi=()=>yi;function xi({page:e=!1}){let t=(0,z.useSyncExternalStore)(w.subscribe,w.get,bi),n=(0,z.useSyncExternalStore)(T.subscribe,()=>T.top()!==null,()=>!1);return e&&n?null:(0,H.jsx)(`div`,{className:`toasts`,"aria-live":`polite`,children:t.map(e=>(0,H.jsxs)(`div`,{className:h(`toast`,e.kind),role:e.kind===`error`?`alert`:`status`,children:[(0,H.jsx)(`span`,{className:`toast-text`,children:e.text}),e.action&&(0,H.jsx)(`button`,{className:`toast-action`,onClick:()=>{E(e.id),e.action.run()},children:e.action.label}),(0,H.jsx)(`button`,{className:`icon-btn small`,"aria-label":`Dismiss`,onClick:()=>E(e.id),children:(0,H.jsx)(L,{size:14})})]},e.id))})}var Si=60,Ci=25,wi=250;function Ti(){let e=gi(),t=K(t=>e?t.bots.find(t=>t.id===e)??null:null);return!e||!t?null:(0,H.jsx)(ki,{bot:t,onClose:()=>hi.close()},e)}var Ei=class{send;onResult;#e=[];#t=!1;constructor(e,t){this.send=e,this.onResult=t}push(e){let t=this.#e.at(-1);t&&t.action===`move`&&e.action===`move`?this.#e[this.#e.length-1]=e:t&&t.action===`wheel`&&e.action===`wheel`?this.#e[this.#e.length-1]={...e,dx:Di(t.dx+e.dx),dy:Di(t.dy+e.dy)}:t&&t.action===`type`&&e.action===`type`&&t.text.length+e.text.length<=1e3?this.#e[this.#e.length-1]={action:`type`,text:t.text+e.text}:this.#e.push(e),this.#n()}async#n(){if(!this.#t){this.#t=!0;try{for(;this.#e.length;){let e=this.#e.shift(),t=await this.send(e);t&&this.onResult(e,t)}}finally{this.#t=!1}}}clear(){this.#e=[]}},Di=e=>Math.max(-4e3,Math.min(4e3,Math.round(e)));function Oi(e){let t=e?.getBoundingClientRect();return t?{width:Math.floor(t.width),height:Math.floor(t.height)}:{width:1280,height:800}}function ki({bot:e,onClose:t}){let n=(0,z.useRef)(null),r=(0,z.useRef)(null),i=(0,z.useRef)(null),a=(0,z.useRef)(null),[o,c]=(0,z.useState)(null),[u,d]=(0,z.useState)(null),[p,m]=(0,z.useState)(null),[h,g]=(0,z.useState)(``),[_,v]=(0,z.useState)(!1),[y,b]=(0,z.useState)(null),[x,ee]=(0,z.useState)(null),[S,C]=(0,z.useState)(!1),[w,E]=(0,z.useState)(!1),[ne,D]=(0,z.useState)(!1),[re,O]=(0,z.useState)(null),k=(0,z.useRef)({width:1280,height:800}),A=(0,z.useRef)(!1),j=(0,z.useRef)(!1),M=(0,z.useRef)(null),[N,ie]=(0,z.useState)(null),ae=(0,z.useSyncExternalStore)(T.subscribe,T.top,()=>null);(0,z.useLayoutEffect)(()=>{let e=T.open();M.current=e,ie(e);let t=n.current;return t&&!t.open&&t.showModal(),()=>{T.close(e),t?.open&&t.close()}},[]);let P=(0,z.useRef)(!1),oe=async()=>{P.current=!0,A.current=!0;let n=ue.current;n&&await s.finishHandover(e.id,n.id).catch(()=>null),t()},se=e=>{A.current=!0,d({text:e})};(0,z.useEffect)(()=>{let t=!1;return(async()=>{try{let n=(await s.browser(e.id)).handover;if(t){P.current&&n?.byThisDevice&&s.finishHandover(e.id,n.id).catch(()=>null);return}if(n&&!n.byThisDevice){d({text:`${e.name}'s browser is open on ${n.deviceLabel}.`,elsewhere:{id:n.id,device:n.deviceLabel}});return}let i=Oi(r.current),a=n??await s.takeOverBrowser(e.id,{width:i.width,height:i.height});if(t){P.current&&s.finishHandover(e.id,a.id).catch(()=>null);return}k.current=a.viewport,c(a),m(a.page)}catch(e){t||d({text:f(e)})}})(),()=>{t=!0}},[e.id]);let ce=(0,z.useRef)(()=>{});(0,z.useEffect)(()=>{let e=null,t=!1,n=async()=>{if(!t){for(t=!0;e;){let{jpeg:t,w:n,h:r}=e;e=null;try{let e=await createImageBitmap(t),a=i.current;a&&((a.width!==e.width||a.height!==e.height)&&(a.width=e.width,a.height=e.height),a.getContext(`2d`)?.drawImage(e,0,0),k.current={width:n,height:r},D(!0)),e.close()}catch{}}t=!1}};ce.current=(t,r,i)=>{e={jpeg:t,w:r,h:i},n()}},[]),(0,z.useEffect)(()=>{if(!o)return;let t=!1,n=new AbortController,r=0,i=!1,a=t=>{t.type===`page`?(m({url:t.url,title:t.title}),b(e=>e&&e.url===t.url?e:null)):t.type===`site-error`?b({url:t.url,status:t.status}):t.type===`paused`?ee(e=>({url:t.url,why:t.why,n:(e?.n??0)+1})):t.type===`ended`&&se(`${e.name} has its browser back.`)},c=async()=>{let i=(await s.handoverStream(e.id,n.signal)).body.getReader(),o=new ui,c=0;for(;;){let{value:e,done:n}=await i.read();if(t)return;if(n){if(!c&&!A.current)throw Error(`The live view sent no frames`);return}for(let t of o.push(e))t.kind===`frame`?(c++||(r=0),ce.current(new Blob([t.jpeg],{type:`image/jpeg`}),t.width,t.height)):a(t.notice)}},u=async()=>{let t=await s.handoverFrame(e.id,n.signal),r=await createImageBitmap(t);ce.current(t,r.width,r.height),r.close(),await new Promise(e=>setTimeout(e,wi))},d=async()=>{for(;!t&&!A.current;)if(document.visibilityState!==`visible`)await new Promise(e=>setTimeout(e,500));else try{i?await u():await c()}catch(e){if(t)return;if(e instanceof l&&(e.status===409||e.status===403))return se(f(e));!i&&++r>=2&&!(e instanceof DOMException)&&(i=!0),await new Promise(e=>setTimeout(e,600))}},p=()=>{n.abort(),n=new AbortController};return document.addEventListener(`visibilitychange`,p),d(),()=>{t=!0,n.abort(),document.removeEventListener(`visibilitychange`,p)}},[o?.id]);let le=(0,z.useRef)(null);le.current||=new Ei(async t=>{if(A.current||!ue.current)return null;try{return await s.handoverInput(e.id,{...t,handover:ue.current.id})}catch(e){return e instanceof l&&e.status===409?(le.current?.clear(),se(f(e))):e instanceof l&&e.status===429||O(f(e)),null}},(e,t)=>{t.outcome===`refused`&&O(t.message);let n=e.action===`open`||e.action===`resume`||e.action===`back`||e.action===`forward`||e.action===`reload`;n&&t.outcome!==`refused`&&O(null),t.page&&n&&m(t.page),e.action===`copy`&&t.copied&&te(t.copied),j.current&&t.editable===!1&&a.current?.blur()});let ue=(0,z.useRef)(null);ue.current=o;let F=e=>le.current.push(e);(0,z.useEffect)(()=>{if(!o||!r.current)return;let e,t=new ResizeObserver(()=>{clearTimeout(e),e=setTimeout(()=>{let e=Oi(r.current);e.width>0&&e.height>0&&F({action:`resize`,...e})},250)});return t.observe(r.current),()=>{clearTimeout(e),t.disconnect()}},[o?.id]);let I=e=>{let t=i.current;if(!t)return null;let n=t.getBoundingClientRect();return di(e.clientX,e.clientY,{left:n.left,top:n.top,width:n.width,height:n.height},k.current)},L=()=>a.current?.focus({preventScroll:!0}),de=(0,z.useRef)(0),R=(0,z.useRef)(null),fe=[`left`,`middle`,`right`],pe=e=>{if(!o)return;if(e.preventDefault(),j.current=e.pointerType===`touch`,e.pointerType===`touch`){R.current={x:e.clientX,y:e.clientY,lastX:e.clientX,lastY:e.clientY,scrolled:!1};return}L();let t=I(e);t&&(e.currentTarget.setPointerCapture(e.pointerId),F({action:`down`,...t,button:fe[e.button]??`left`,...e.detail>1?{count:Math.min(3,e.detail)}:{}}))},me=e=>{if(!o)return;if(e.pointerType===`touch`){let t=R.current;if(!t||!t.scrolled&&Math.hypot(e.clientX-t.x,e.clientY-t.y)<8)return;t.scrolled=!0;let n=I(e)??I({clientX:t.x,clientY:t.y}),r=i.current?k.current.width/i.current.getBoundingClientRect().width:1;n&&F({action:`wheel`,...n,dx:Di((t.lastX-e.clientX)*r),dy:Di((t.lastY-e.clientY)*r)}),t.lastX=e.clientX,t.lastY=e.clientY;return}let t=performance.now();if(t-de.current<(e.buttons?Ci:Si))return;de.current=t;let n=I(e);n&&F({action:`move`,...n})},he=e=>{if(!o)return;if(e.pointerType===`touch`){let t=R.current;if(R.current=null,!t||t.scrolled)return;L();let n=I(e);n&&F({action:`click`,...n});return}let t=I(e);t&&F({action:`up`,...t,button:fe[e.button]??`left`,...e.detail>1?{count:Math.min(3,e.detail)}:{}})};(0,z.useEffect)(()=>{let e=i.current;if(!e)return;let t=e=>{e.preventDefault();let t=I(e);if(!t)return;let n=e.deltaMode===1?16:e.deltaMode===2?k.current.height:1;F({action:`wheel`,...t,dx:Di(e.deltaX*n),dy:Di(e.deltaY*n)})};return e.addEventListener(`wheel`,t,{passive:!1}),()=>e.removeEventListener(`wheel`,t)},[o?.id]);let _e=(0,z.useRef)(!1);(0,z.useEffect)(()=>{let e=a.current;if(!e)return;let t=e=>{if(_e.current||e.isComposing)return;let t=vi(e);t.kind!==`own`&&t.kind!==`text`&&t.kind!==`paste`&&(e.preventDefault(),e.stopPropagation(),t.kind===`copy`?(F({action:`copy`}),t.cut&&F({action:`key`,key:`Backspace`})):F({action:`key`,key:t.key,...t.mods.length?{mods:t.mods}:{}}))},n=e=>{e.inputType!==`insertCompositionText`&&(e.preventDefault(),(e.inputType===`insertText`||e.inputType===`insertReplacementText`)&&e.data?ve(e.data):e.inputType===`deleteContentBackward`?F({action:`key`,key:`Backspace`}):e.inputType===`deleteContentForward`?F({action:`key`,key:`Delete`}):(e.inputType===`insertLineBreak`||e.inputType===`insertParagraph`)&&F({action:`key`,key:`Enter`}))},r=()=>_e.current=!0,i=t=>{_e.current=!1,t.data&&ve(t.data),e.value=``},o=e=>{e.preventDefault();let t=e.clipboardData?.getData(`text/plain`)??``;for(let e=0;e<t.length;e+=5e3)F({action:`paste`,text:t.slice(e,e+5e3)})};return e.addEventListener(`keydown`,t),e.addEventListener(`beforeinput`,n),e.addEventListener(`compositionstart`,r),e.addEventListener(`compositionend`,i),e.addEventListener(`paste`,o),()=>{e.removeEventListener(`keydown`,t),e.removeEventListener(`beforeinput`,n),e.removeEventListener(`compositionstart`,r),e.removeEventListener(`compositionend`,i),e.removeEventListener(`paste`,o)}},[o?.id]);let ve=e=>{for(let t of e.split(/([\t\n])/))if(t===` `)F({action:`key`,key:`Tab`});else if(t===`
|
|
3
|
+
`)F({action:`key`,key:`Enter`});else if(t)for(let e=0;e<t.length;e+=1e3)F({action:`type`,text:t.slice(e,e+1e3).replace(/[\u0000-\u001f\u007f]/g,``)})},ye=e=>{e.preventDefault();let t=h.trim();t&&(v(!1),document.activeElement?.blur(),F({action:`open`,url:t}),!j.current&&!matchMedia(`(pointer: coarse)`).matches&&L())},be=p?.url??``,xe=e=>{try{return new URL(e).host}catch{return e}},Se=!o&&!u;return(0,ci.createPortal)((0,H.jsxs)(`dialog`,{ref:n,className:[`takeover`,w&&`full`].filter(Boolean).join(` `),"aria-label":`${e.name}'s browser`,onCancel:e=>{e.preventDefault()},children:[(0,H.jsxs)(`div`,{className:`takeover-bar`,children:[(0,H.jsxs)(`span`,{className:`takeover-who`,children:[(0,H.jsx)(U,{look:e.look,size:22,seed:e.id}),(0,H.jsx)(`span`,{className:`takeover-name`,children:e.name})]}),(0,H.jsxs)(`div`,{className:`takeover-nav`,role:`group`,"aria-label":`Navigation`,children:[(0,H.jsx)(`button`,{type:`button`,className:`icon-btn round`,"aria-label":`Back`,title:`Back`,disabled:!o,onClick:()=>F({action:`back`}),children:(0,H.jsx)(ge,{})}),(0,H.jsx)(`button`,{type:`button`,className:`icon-btn round takeover-forward`,"aria-label":`Forward`,title:`Forward`,disabled:!o,onClick:()=>F({action:`forward`}),children:(0,H.jsx)(ge,{style:{transform:`scaleX(-1)`}})}),(0,H.jsx)(`button`,{type:`button`,className:`icon-btn round`,"aria-label":`Reload`,title:`Reload`,disabled:!o,onClick:()=>F({action:`reload`}),children:(0,H.jsx)(Ce,{})})]}),(0,H.jsx)(`form`,{className:`takeover-url`,onSubmit:ye,children:(0,H.jsx)(`input`,{"aria-label":`Address`,value:_?h:be,placeholder:`Search or type an address`,spellCheck:!1,autoCapitalize:`off`,autoCorrect:`off`,inputMode:`url`,enterKeyHint:`go`,disabled:!o,onFocus:e=>{v(!0),g(be),requestAnimationFrame(()=>e.target.select())},onBlur:()=>v(!1),onChange:e=>g(e.target.value)})}),(0,H.jsx)(`button`,{type:`button`,className:`icon-btn round desktop-only`,"aria-label":w?`Exit full screen`:`Full screen`,title:w?`Exit full screen`:`Full screen`,onClick:()=>E(e=>!e),children:(0,H.jsx)(Ai,{full:w})}),(0,H.jsx)(`button`,{type:`button`,className:`btn primary takeover-done`,onClick:()=>void oe(),children:`Done — hand back`})]}),(0,H.jsxs)(`p`,{className:`takeover-line`,children:[`Only you drive it. `,e.name,` waits until you hand back.`,` `,(0,H.jsx)(`button`,{type:`button`,className:`link-btn`,"aria-expanded":S,onClick:()=>C(e=>!e),children:`Details`})]}),S&&(0,H.jsxs)(`p`,{className:`takeover-details`,children:[`What you type goes into the page and nowhere else: Botons doesn't keep, log or show it, and `,e.name,` never sees it. Only this device drives the browser, and only `,e.name,`'s sites load. A sign-in stays in `,e.name,`'s browser after you hand back. It hands back by itself after 10 quiet minutes.`]}),y&&(0,H.jsxs)(`p`,{className:`takeover-site`,role:`status`,children:[(0,H.jsx)(`strong`,{children:xe(y.url)}),` answered with an error (`,y.status,`). That's the site's own page, not Botons.`]}),x&&(0,H.jsxs)(`p`,{className:`takeover-paused`,role:`status`,title:x.why,children:[`Botons paused `,x.n>1?`${x.n} requests`:`a request`,` `,xe(x.url),` sent on its own. What you click and type still goes.`]}),(0,H.jsxs)(`div`,{className:`takeover-view`,ref:r,children:[(0,H.jsx)(`canvas`,{ref:i,className:ne?`shown`:``,"aria-label":p?`${e.name}'s browser: ${p.title||p.url}`:`${e.name}'s browser`,role:`img`,onPointerDown:pe,onPointerMove:me,onPointerUp:he,onPointerCancel:()=>R.current=null,onContextMenu:e=>e.preventDefault()}),(0,H.jsx)(`textarea`,{ref:a,className:`takeover-keys`,"aria-label":`Type into the page`,autoCapitalize:`off`,autoCorrect:`off`,autoComplete:`off`,spellCheck:!1}),Se&&(0,H.jsxs)(`p`,{className:`takeover-state`,children:[`Opening `,e.name,`'s browser…`]}),u&&(0,H.jsxs)(`div`,{className:`takeover-state`,children:[(0,H.jsx)(`p`,{children:u.text}),u.elsewhere&&(0,H.jsx)(`button`,{type:`button`,className:`btn`,onClick:()=>void s.finishHandover(e.id,u.elsewhere.id).then(()=>t()).catch(e=>d({text:f(e)})),children:`End it there`}),(0,H.jsx)(`button`,{type:`button`,className:`btn primary`,onClick:t,children:`Close`})]}),o&&ne&&!p&&!u&&(0,H.jsx)(`div`,{className:`takeover-start`,children:o.resume?(0,H.jsxs)(`button`,{type:`button`,className:`btn primary`,onClick:()=>F({action:`resume`}),children:[`Open `,xe(o.resume)]}):(0,H.jsx)(`p`,{children:`Type an address above to begin.`})}),re&&!u&&(0,H.jsx)(`p`,{className:`takeover-note`,role:`status`,children:re})]}),N!==null&&ae===N&&(0,H.jsx)(xi,{})]}),document.body)}function Ai({full:e}){return(0,H.jsx)(`svg`,{width:18,height:18,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:1.8,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,children:e?(0,H.jsx)(`path`,{d:`M9 4v5H4M15 4v5h5M9 20v-5H4M15 20v-5h5`}):(0,H.jsx)(`path`,{d:`M4 9V4h5M20 9V4h-5M4 15v5h5M20 15v5h-5`})})}function ji({bot:e}){return(0,H.jsx)(`button`,{className:`icon-btn round`,"aria-label":`Open ${e.name}'s browser`,title:`Browser`,onClick:()=>hi.open(e.id),children:(0,H.jsx)(Mi,{})})}function Mi({size:e=18}){return(0,H.jsxs)(`svg`,{width:e,height:e,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:1.8,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,children:[(0,H.jsx)(`circle`,{cx:`12`,cy:`12`,r:`9`}),(0,H.jsx)(`path`,{d:`M3 12h18M12 3c2.5 2.6 3.8 5.6 3.8 9s-1.3 6.4-3.8 9c-2.5-2.6-3.8-5.6-3.8-9s1.3-6.4 3.8-9z`})]})}function Ni({bot:e,m:t}){let n=t.meta?.browserHandoff,[r,i]=(0,z.useState)(()=>new Date().toISOString());if((0,z.useEffect)(()=>{let e=setInterval(()=>i(new Date().toISOString()),3e4);return()=>clearInterval(e)},[]),!n)return null;let a=li(n,r)?`requested`:n.state===`requested`?`closed`:n.state,o=()=>hi.open(e.id);return(0,H.jsxs)(`section`,{className:`tcard handoff is-${a}`,id:`card-${t.id}`,"aria-label":`Your turn in ${e.name}'s browser`,children:[(0,H.jsxs)(`div`,{className:`tcard-head`,children:[(0,H.jsx)(Mi,{size:15}),(0,H.jsx)(`span`,{children:a===`requested`?`${e.name} needs you`:`${e.name}'s browser`}),(0,H.jsx)(`span`,{className:`tcard-time`,title:d(t.createdAt),children:v(t.createdAt)})]}),(0,H.jsx)(`h3`,{className:`tcard-title`,children:a===`requested`?`Your turn in ${e.name}'s browser`:a===`taken`?`You have ${e.name}'s browser`:a===`handed-back`?`Handed back`:`No longer needed`}),(0,H.jsxs)(`p`,{className:`tcard-text handoff-reason`,children:[`“`,n.reason,`”`]}),a===`requested`&&(0,H.jsx)(`div`,{className:`handoff-actions`,children:(0,H.jsx)(`button`,{type:`button`,className:`btn primary`,onClick:o,children:`Take over`})}),a===`taken`&&(0,H.jsxs)(`div`,{className:`handoff-actions`,children:[(0,H.jsx)(`button`,{type:`button`,className:`btn`,onClick:o,children:`Open`}),n.takenBy&&(0,H.jsxs)(`span`,{className:`tcard-faint`,children:[`on `,n.takenBy]})]}),a===`handed-back`&&(0,H.jsxs)(`p`,{className:`tcard-faint`,children:[n.page?`Left on ${n.page}`:`No page open`,n.how&&n.how!==`finished`?` · ${n.how}`:``]})]})}function Pi(e){return e.split("`").map((e,t)=>t%2?(0,H.jsx)(`code`,{children:e},t):(0,H.jsx)(z.Fragment,{children:e},t))}function Fi({className:e}){let[t,n]=(0,z.useState)(!1),[r,i]=(0,z.useState)(null);return(0,H.jsxs)(`span`,{className:h(`brain-check`,e),children:[(0,H.jsx)(`button`,{type:`button`,className:`btn small`,disabled:t,onClick:async()=>{n(!0),i(null);let e=new Map(Vn().providers.map(e=>[e.id,Nn(e)]));if(await C(`check again`,()=>Q.loadProviders(!0))){let t=Vn().providers.filter(e=>e.readiness.generation>0),n=t.length>0&&t.every(t=>Nn(t)===e.get(t.id));i(n?`The server checked moments ago, so this is that check: try again in a minute.`:null)}n(!1)},children:t?`Checking…`:`Check again`}),r&&(0,H.jsx)(`span`,{className:`hint`,role:`status`,children:r})]})}function Ii({providers:e,provider:t}){let n=K(e=>e.setup?.exposure.container??!1),r=e.find(e=>e.id===t);if(!e.length)return null;if(!r)return(0,H.jsxs)(`div`,{className:`brain-warning`,role:`status`,children:[(0,H.jsx)(xe,{size:16,className:`warn-icon`}),(0,H.jsxs)(`span`,{children:[`This brain (`,t,`) is not on this server: its turns fail. Move the Boton to another in its settings.`]})]});let i=r.readiness;if(!An(r)&&(i.state!==`unknown`||i.problem===`not-checked`||i.problem===`outdated`||i.problem===`clock-changed`))return null;let a=Sn(r,{container:n});return(0,H.jsxs)(`div`,{className:`brain-warning`,role:`status`,"data-state":i.state,children:[(0,H.jsx)(xe,{size:16,className:`warn-icon`}),(0,H.jsxs)(`span`,{children:[Dn(r),`: `,a.status,`. `,a.why&&Pi(a.why),` `,a.fix&&Pi(a.fix.text),a.fix?.command&&(0,H.jsxs)(H.Fragment,{children:[` `,(0,H.jsx)(`code`,{children:a.fix.command})]}),a.work&&(0,H.jsxs)(H.Fragment,{children:[` `,a.work]})]}),a.fix&&(0,H.jsx)(Fi,{})]})}function Li(){return(0,z.useSyncExternalStore)(T.subscribe,()=>T.top()!==null,()=>!1)}function Ri({title:e,onClose:t,children:n,wide:r,className:i}){let a=(0,z.useRef)(null),[o,s]=(0,z.useState)(null);(0,z.useEffect)(()=>{let e=T.open();return s(e),()=>T.close(e)},[]);let c=(0,z.useSyncExternalStore)(T.subscribe,T.top,()=>null),l=o!==null&&c===o;return(0,z.useLayoutEffect)(()=>{let e=a.current;if(!e)return;let t=document.activeElement instanceof HTMLElement&&document.activeElement!==document.body?document.activeElement:null;return e.open||(e.showModal(),e.querySelector(`[data-autofocus]`)?.focus()),()=>{e.open&&e.close(),t?.isConnected&&(!document.activeElement||document.activeElement===document.body||e.contains(document.activeElement))&&t.focus({preventScroll:!0})}},[]),(0,H.jsxs)(`dialog`,{ref:a,className:[`dialog`,r&&`wide`,i].filter(Boolean).join(` `),"aria-label":e,onCancel:e=>{e.preventDefault(),t()},onClick:e=>{e.target===a.current&&t()},children:[(0,H.jsxs)(`div`,{className:`dialog-inner`,children:[(0,H.jsxs)(`header`,{className:`dialog-header`,children:[(0,H.jsx)(`h2`,{children:e}),(0,H.jsx)(`button`,{type:`button`,className:`icon-btn round`,"aria-label":`Close`,onClick:t,children:(0,H.jsx)(L,{})})]}),n]}),l&&(0,H.jsx)(xi,{})]})}function zi(e){let[t,n]=(0,z.useState)(!1),[r,i]=(0,z.useState)(null),a=async()=>{n(!0),i(null);let t=await C(e.what,e.onConfirm,i);n(!1),t&&e.onClose()};return(0,ci.createPortal)((0,H.jsxs)(Ri,{title:e.title,onClose:()=>!t&&e.onClose(),children:[(0,H.jsx)(`div`,{className:`confirm-body`,children:e.children}),r&&(0,H.jsx)(`p`,{className:`form-error`,role:`alert`,children:r}),(0,H.jsxs)(`div`,{className:`form-actions`,children:[(0,H.jsx)(`button`,{type:`button`,className:`btn ghost`,onClick:e.onClose,disabled:t,"data-autofocus":e.danger?!0:void 0,children:`Cancel`}),(0,H.jsx)(`button`,{type:`button`,className:e.danger?`btn danger-solid`:`btn primary`,onClick:()=>void a(),disabled:t,"data-autofocus":!e.danger||void 0,children:t?e.busyLabel??`Working…`:e.confirmLabel})]})]}),document.body)}function Bi(e){let t,n=null;return{loaded:()=>t,load:()=>n??=e().then(e=>t=e,e=>{throw n=null,e})}}function Vi(e){let[t,n]=(0,z.useState)(e),[r,i]=(0,z.useState)(()=>e.loaded()),[a,o]=(0,z.useState)(!1),[s,c]=(0,z.useState)(0);return t!==e&&(n(e),i(()=>e.loaded()),o(!1),c(0)),(0,z.useEffect)(()=>{if(t!==e||r)return;let n=!0;return o(!1),e.load().then(e=>n&&i(()=>e),e=>{console.error(`[Botons] could not load part of the page`,e),n&&o(!0)}),()=>{n=!1}},[e,t,r,s]),{mod:t===e?r:e.loaded(),failed:t===e&&a,retry:()=>c(e=>e+1)}}function Hi({what:e,onRetry:t}){return(0,H.jsxs)(`div`,{className:`load-error`,role:`alert`,children:[(0,H.jsxs)(`span`,{children:[`Couldn't load `,e,`. Check the connection to the server, or reload the page if Botons was updated.`]}),(0,H.jsxs)(`span`,{className:`deferred-actions`,children:[(0,H.jsx)(`button`,{type:`button`,className:`link-btn`,onClick:t,children:`Retry`}),(0,H.jsx)(`button`,{type:`button`,className:`link-btn`,onClick:()=>location.reload(),children:`Reload`})]})]})}function Ui(){return(0,H.jsx)(`p`,{className:`muted deferred-loading`,role:`status`,children:`Loading…`})}function Wi(e){let{mod:t,failed:n,retry:r}=Vi(e.part);return t?e.children(t):(0,H.jsx)(Ri,{title:e.title,onClose:e.onClose,children:n?(0,H.jsx)(Hi,{what:e.title,onRetry:r}):(0,H.jsx)(Ui,{})})}function Gi(e){let{mod:t,failed:n,retry:r}=Vi(e.part);return t?e.children(t):(0,H.jsxs)(`aside`,{className:`panel`,"aria-label":e.label,children:[(0,H.jsxs)(`header`,{className:`panel-header`,children:[(0,H.jsx)(`div`,{className:`tabs`}),(0,H.jsx)(`button`,{className:`icon-btn round`,"aria-label":`Close panel`,onClick:e.onClose,children:(0,H.jsx)(L,{})})]}),(0,H.jsx)(`div`,{className:`panel-scroll`,children:(0,H.jsx)(`div`,{className:`tab-body`,children:n?(0,H.jsx)(Hi,{what:`the panel`,onRetry:r}):(0,H.jsx)(Ui,{})})})]})}function Ki(e){let{mod:t,failed:n,retry:r}=Vi(e.part);return t?e.children(t):n?(0,H.jsx)(`div`,{className:`boot`,children:(0,H.jsx)(Hi,{what:e.what,onRetry:r})}):(0,H.jsx)(`div`,{className:`boot muted`,children:`Loading…`})}var qi=`modulepreload`,Ji=function(e){return`/`+e},Yi={},Xi=function(e){return e.pathname.endsWith(`.css`)},Zi=function(e,t,n){if(t in e)return e[t];let r=n();if(!r){e[t]=void 0;return}let i=r.then(()=>{e[t]=void 0},n=>{throw e[t]=void 0,n});return e[t]=i,i},Qi=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e,i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?new URL(import.meta.resolve(e)):new URL(e,import.meta.url)}r=o(t.map(t=>{t=Ji(t,n);let r=s(t),i=Xi(r);return Zi(Yi,r.href,()=>{if(e===void 0){e={all:new Set,styles:new Set};let t=document.getElementsByTagName(`link`);for(let n=t.length-1;n>=0;n--){let r=t[n];e.all.add(r.href),r.rel===`stylesheet`&&e.styles.add(r.href)}}if((i?e.styles:e.all).has(r.href))return;let t=document.createElement(`link`);if(t.rel=i?`stylesheet`:qi,i||(t.as=`script`),t.crossOrigin=``,t.href=r.href,a&&t.setAttribute(`nonce`,a),document.head.appendChild(t),i)return new Promise((e,n)=>{t.addEventListener(`load`,e),t.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${r}`)))})})}).filter(e=>e!==void 0))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},$i=Bi(()=>Qi(()=>import(`./ReactionPicker-B0SKsjiy.js`),__vite__mapDeps([0,1,2,3,4]))),ea=()=>void $i.load().catch(()=>{}),ta=null,na=new Set,ra={subscribe(e){return na.add(e),()=>void na.delete(e)},get:()=>ta};function ia(e){ta=e;for(let e of na)e()}function aa(e,t,n){let r=e.reactions?.some(e=>e.by===`owner`&&e.emoji===t);return C(r?`take off your ${t}`:`react ${t} to ${n}'s message`,()=>r?Q.unreact(e,t):Q.react(e,t))}function oa({m:e,bot:t}){let n=(0,z.useRef)(null),r=(0,z.useSyncExternalStore)(ra.subscribe,()=>ra.get()?.messageId===e.id);return(0,H.jsx)(`button`,{ref:n,type:`button`,className:`msg-react`,"aria-label":`React to ${t.name}'s message`,title:`Add a reaction`,"aria-haspopup":`dialog`,"aria-expanded":r,onPointerEnter:ea,onFocus:ea,onClick:()=>{if(r)return ia(null);let t=n.current?.closest(`.msg`)?.querySelector(`.bubble`)??n.current;ia({botId:e.botId,messageId:e.id,anchor:t,returnTo:n.current})},children:(0,H.jsx)(se,{size:14})})}var sa=500,ca=10;function la(e,t){if(e.pointerType!==`touch`||!e.isPrimary)return;let n=e.currentTarget,r=e.clientX,i=e.clientY;ea();let a=()=>{clearTimeout(s),removeEventListener(`pointermove`,o,!0),removeEventListener(`pointerup`,a,!0),removeEventListener(`pointercancel`,a,!0),removeEventListener(`scroll`,a,!0)},o=t=>{t.pointerId===e.pointerId&&Math.hypot(t.clientX-r,t.clientY-i)>ca&&a()},s=setTimeout(()=>{a();let e=n.closest(`.msg`)?.querySelector(`.msg-react`)??null;ia({botId:t.botId,messageId:t.id,anchor:n,returnTo:e})},sa);addEventListener(`pointermove`,o,!0),addEventListener(`pointerup`,a,!0),addEventListener(`pointercancel`,a,!0),addEventListener(`scroll`,a,!0)}function ua({bot:e}){let t=(0,z.useSyncExternalStore)(ra.subscribe,ra.get),n=t&&t.botId===e.id?t:null,r=K(t=>n?t.messages[e.id]?.items.find(e=>e.id===n.messageId):void 0);return(0,z.useEffect)(()=>{!t||n&&r||ia(null)},[t,n,r]),(0,z.useEffect)(()=>()=>ia(null),[e.id]),n&&r?(0,H.jsx)(da,{p:n,m:r,bot:e},r.id):null}function da({p:e,m:t,bot:n}){let r=K(e=>e.settings?.reactionFollowUps),{mod:i,failed:o}=Vi($i);if((0,z.useEffect)(()=>{o&&(ia(null),a({kind:`error`,text:`Couldn't load the reactions. Check the connection to the server, or reload the page if Botons was updated.`},8e3))},[o]),!i)return null;let s=t=>{ia(null),t&&e.returnTo?.isConnected&&e.returnTo.focus({preventScroll:!0})};return(0,H.jsx)(i.ReactionPicker,{m:t,botName:n.name,anchor:e.anchor,followUps:r??[],onPick:e=>{s(!0),aa(t,e,n.name)},onClose:s})}function fa({m:e,bot:t}){let n=e.reactions;if(!n?.length)return null;let r=n.filter(e=>e.by===`owner`),i=n.filter(e=>e.by===`boton`);return(0,H.jsxs)(`div`,{className:`reactions`,role:`group`,"aria-label":e.role===`bot`?`Your reactions`:`${t.name}'s reaction`,children:[r.map(n=>(0,H.jsx)(pa,{m:e,emoji:n.emoji,at:n.at,botName:t.name},n.emoji)),i.map(e=>(0,H.jsx)(ma,{botId:t.id,name:t.name,emoji:e.emoji,at:e.at},e.emoji))]})}function pa({m:e,emoji:t,at:n,botName:r}){let[i,a]=(0,z.useState)(!1),o=(0,z.useRef)(null);return(0,H.jsx)(`button`,{ref:o,type:`button`,className:`reaction mine`,"aria-pressed":`true`,"aria-label":t,title:`You reacted ${t} at ${v(n)}. Click to take it off.`,disabled:i,onClick:async()=>{let n=o.current?.closest(`.msg`),i=o.current?.nextElementSibling??o.current?.previousElementSibling;a(!0);let s=await aa(e,t,r);o.current?.isConnected&&a(!1),s&&!o.current?.isConnected&&(i?.isConnected?i:n?.querySelector(`.msg-react`))?.focus({preventScroll:!0})},children:t})}function ma({botId:e,name:t,emoji:n,at:r}){let i=K(t=>t.bots.find(t=>t.id===e)?.look);return(0,H.jsxs)(`span`,{className:`reaction theirs`,role:`img`,"aria-label":`${t} reacted ${n}`,title:`${t} reacted ${n} · ${d(r)}`,children:[i&&(0,H.jsx)(U,{look:i,size:16,still:!0}),(0,H.jsx)(`span`,{"aria-hidden":`true`,children:n})]})}function ha({m:e,bot:t}){let n=e.meta?.reactionTo,r=K(e=>n?e.messages[t.id]?.items.find(e=>e.id===n)?.text:void 0),i=e.meta?.emoji??``,a=!!e.meta?.withdrawn;return(0,H.jsxs)(`div`,{className:h(`event-chip reaction-followup`,a&&`withdrawn`),title:d(e.createdAt),children:[(0,H.jsx)(`span`,{children:a?`You took off ${i} before ${t.name} followed up: no follow-up`:`You reacted ${i}: ${t.name} follows up`}),r&&(0,H.jsxs)(`span`,{className:`chip-quote`,children:[`“`,S(r.replace(/\s+/g,` `),60),`”`]})]})}var ga=e=>e.pending&&e.updatedBy.kind===`boton`?e.updatedBy:null;function _a(e,t){return t?t.filter(t=>!t.disabled&&(e.skills===null||e.skills.includes(t.name))&&(!t.pending||ga(t)?.botId===e.id)):[]}function va(){let e=K(e=>e.skills),[t,n]=(0,z.useState)(null);return(0,z.useEffect)(()=>{e||C(`load the skills`,()=>Q.loadSkills(),n)},[e]),{skills:e,error:t}}var ya=[];function ba(e,t,n){let{skills:r}=va(),[i,a]=(0,z.useState)(0),[o,s]=(0,z.useState)(null),c=(0,z.useId)(),l=t.length<=65&&t.startsWith(`/`)?/^\/([a-z0-9-]*)$/.exec(t)?.[1]:void 0,u=l===void 0||o===t,d=(0,z.useMemo)(()=>u?ya:_a(e,r).filter(e=>e.name.startsWith(l)||l.length>1&&e.name.includes(l)),[u,l,r,e.id,e.skills]),f=Math.min(i,Math.max(0,d.length-1));(0,z.useEffect)(()=>a(0),[l]);let p=e=>`${c}-skill-${e}`;(0,z.useEffect)(()=>{d.length&&document.getElementById(p(f))?.scrollIntoView?.({block:`nearest`})},[f,d.length]);let m=e=>{n(`/${e.name} `),s(null)},g=e=>{if(!d.length)return!1;if(e.key===`ArrowDown`||e.key===`ArrowUp`)a((f+(e.key===`ArrowDown`?1:d.length-1))%d.length);else if(e.key===`Enter`||e.key===`Tab`)m(d[f]);else if(e.key===`Escape`)s(t);else return!1;return e.preventDefault(),!0},_=d.length>0,v=_?(0,H.jsx)(`ul`,{className:`skill-picker`,id:`${c}-skills`,role:`listbox`,"aria-label":`Skills`,children:d.map((e,t)=>(0,H.jsxs)(`li`,{id:p(t),role:`option`,"aria-selected":t===f,className:h(t===f&&`on`),onMouseDown:e=>e.preventDefault(),onClick:()=>m(e),onMouseEnter:()=>a(t),children:[(0,H.jsxs)(`code`,{children:[`/`,e.name]}),(0,H.jsx)(`span`,{children:e.description})]},e.name))}):null,y=_?`${d.length===1?`1 skill matches`:`${d.length} skills match`}: up and down arrows to choose, Enter to use it.`:``;return{menu:v,onKey:g,inputProps:{role:`combobox`,"aria-autocomplete":`list`,"aria-expanded":_,"aria-controls":_?`${c}-skills`:void 0,"aria-activedescendant":_?p(f):void 0},announce:y}}function xa(e){let t;try{t=new URL(e)}catch{return`is not a valid URL`}return t.protocol===`https:`?t.username||t.password?`must not have a user name or password in it`:!t.hostname||!t.hostname.includes(`.`)?`must name a site`:null:`must be an https:// link`}function Sa(e){return e.type===`choice`||e.type===`form`||e.type===`connector`}function Ca(e){return e.blocks.find(Sa)??null}function wa(){let[e,t]=(0,z.useState)(()=>typeof navigator>`u`||navigator.onLine);return(0,z.useEffect)(()=>{let e=()=>t(!0),n=()=>t(!1);return window.addEventListener(`online`,e),window.addEventListener(`offline`,n),()=>{window.removeEventListener(`online`,e),window.removeEventListener(`offline`,n)}},[]),e}function Ta(e=3e4){let[t,n]=(0,z.useState)(()=>Date.now());return(0,z.useEffect)(()=>{let t=setInterval(()=>n(Date.now()),e);return()=>clearInterval(t)},[e]),t}function Ea({bot:e,m:t,onOpenFile:n,onOpenRoutine:r}){let i=t.meta?.card,a=Ta(),o=(0,z.useId)();if(!i)return null;let s=Ca(i.descriptor),c=i.status===`pending`&&new Date(i.expiresAt).getTime()<=a?`expired`:i.status;return(0,H.jsxs)(`section`,{className:h(`tcard`,`is-${c}`,i.from.sandboxed&&`outside`),id:`card-${t.id}`,"aria-labelledby":o,children:[(0,H.jsxs)(`div`,{className:`tcard-head`,children:[(0,H.jsx)(`span`,{children:s?`${e.name} asks you`:`${e.name} posted a card`}),(0,H.jsx)(`span`,{className:`tcard-time`,title:d(t.createdAt),children:v(t.createdAt)})]}),(0,H.jsx)(`h3`,{className:`tcard-title`,id:o,children:i.descriptor.title}),i.descriptor.blocks.map((t,r)=>(0,H.jsx)(Da,{b:t,bot:e,card:i,onOpenFile:n},r)),(i.from.routineId||i.from.sandboxed)&&(0,H.jsxs)(`p`,{className:`approval-origin`,children:[`Posted in `,i.from.trigger===`chat`?`a chat turn`:`a ${i.from.trigger===`schedule`?`scheduled`:i.from.trigger} run of`,i.from.routineId&&(0,H.jsxs)(`button`,{className:`chip-link`,onClick:()=>r(i.from.routineId),children:[(0,H.jsx)(be,{size:14}),i.from.routineName??`a routine`]})]}),i.from.sandboxed&&s&&(0,H.jsxs)(`p`,{className:`approval-warn`,children:[e.name,` posted this during a webhook run, whose payload came from outside: its text may not be `,e.name,`'s own words. Read all of it before you answer.`]}),s&&(c===`pending`?(0,H.jsx)(ka,{m:t,bot:e,card:i,ask:s,now:a}):(0,H.jsx)(ja,{card:i,status:c,bot:e}))]})}function Da({b:e,bot:t,card:n,onOpenFile:r}){switch(e.type){case`text`:return(0,H.jsx)(`p`,{className:`plain tcard-text`,children:e.text});case`status`:return(0,H.jsxs)(`p`,{className:h(`tcard-status`,`tone-${e.tone}`),children:[(0,H.jsx)(`span`,{className:`tcard-tone`,children:Oa[e.tone]}),e.text]});case`progress`:{let t=Math.round(e.value/e.max*100);return(0,H.jsxs)(`div`,{className:`tcard-progress`,children:[(0,H.jsxs)(`div`,{className:`tcard-progress-label`,children:[(0,H.jsx)(`span`,{children:e.label}),(0,H.jsxs)(`span`,{className:`tcard-faint`,children:[e.value.toLocaleString(),` of `,e.max.toLocaleString(),` (`,t,`%)`]})]}),(0,H.jsx)(`progress`,{value:e.value,max:e.max,"aria-label":`${e.label}: ${e.value} of ${e.max}`})]})}case`table`:return(0,H.jsx)(`div`,{className:`tcard-table`,role:`region`,"aria-label":`Table: ${e.columns.join(`, `)}`,tabIndex:0,children:(0,H.jsxs)(`table`,{children:[(0,H.jsx)(`thead`,{children:(0,H.jsx)(`tr`,{children:e.columns.map((e,t)=>(0,H.jsx)(`th`,{scope:`col`,children:e},t))})}),(0,H.jsx)(`tbody`,{children:e.rows.length===0?(0,H.jsx)(`tr`,{children:(0,H.jsx)(`td`,{colSpan:e.columns.length,className:`tcard-faint`,children:`No rows`})}):e.rows.map((e,t)=>(0,H.jsx)(`tr`,{children:e.map((e,t)=>(0,H.jsx)(`td`,{className:typeof e==`number`?`num`:void 0,children:e===null?`—`:typeof e==`number`?e.toLocaleString():e},t))},t))})]})});case`file`:return(0,H.jsxs)(`button`,{className:`chip-link tcard-file`,onClick:()=>r(e.path),title:`Open ${e.path} from ${t.name}'s workspace`,children:[(0,H.jsx)(he,{size:14}),(0,H.jsx)(`span`,{children:e.title??e.path}),e.title&&(0,H.jsx)(`span`,{className:`tcard-faint`,children:e.path})]});case`link`:{if(xa(e.url))return(0,H.jsx)(`p`,{className:`plain tcard-text`,children:e.label});let t=new URL(e.url).host;return(0,H.jsxs)(`a`,{className:`tcard-link`,href:e.url,target:`_blank`,rel:`noopener noreferrer nofollow`,referrerPolicy:`no-referrer`,children:[(0,H.jsx)(`span`,{children:e.label}),(0,H.jsx)(`span`,{className:`tcard-faint`,children:t}),(0,H.jsx)(ve,{size:13})]})}case`choice`:return(0,H.jsx)(`p`,{className:`tcard-prompt`,children:e.prompt});case`form`:return e.prompt?(0,H.jsx)(`p`,{className:`tcard-prompt`,children:e.prompt}):null;case`connector`:return(0,H.jsxs)(`p`,{className:`tcard-text`,children:[t.name,` asks for the connector `,(0,H.jsx)(`strong`,{children:n.connector?.name??e.connectorId}),` `,(0,H.jsxs)(`span`,{className:`tcard-faint`,children:[`(`,e.connectorId,`)`]}),`. If you give it, it becomes one of `,t.name,`'s connectors from its next turn, until you take it off in its settings, the same as giving it there.`]})}}var Oa={info:`Note`,success:`Done`,warning:`Warning`,error:`Problem`,working:`In progress`};function ka({m:e,bot:t,card:n,ask:r,now:i}){let a=wa(),[o,s]=(0,z.useState)(!1),[c,l]=(0,z.useState)(null),u=async t=>{s(!0),l(null);try{await Q.answerCard(e.botId,e.id,t)}catch(t){l(f(t)),Q.reloadCard(e.id).catch(()=>{})}finally{s(!1)}},p=o||!a,m=(0,H.jsx)(`button`,{type:`button`,className:`btn small`,disabled:p,onClick:()=>void u({action:`decline`}),children:r.type===`connector`?`Decline`:`Decline to answer`});return(0,H.jsxs)(`div`,{className:`tcard-answer`,"aria-busy":o,children:[r.type===`choice`&&(0,H.jsxs)(`div`,{className:`approval-actions`,role:`group`,"aria-label":r.prompt,children:[r.options.map(e=>(0,H.jsx)(`button`,{type:`button`,className:`btn small`,disabled:p,onClick:()=>void u({action:`choose`,option:e.id}),children:e.label},e.id)),m]}),r.type===`form`&&(0,H.jsx)(Aa,{ask:r,bot:t,disabled:p,decline:m,onSubmit:e=>void u({action:`submit`,values:e})}),r.type===`connector`&&(0,H.jsxs)(`div`,{className:`approval-actions`,children:[(0,H.jsxs)(`button`,{type:`button`,className:`btn small primary`,disabled:p,onClick:()=>void u({action:`grant`}),children:[`Give `,t.name,` `,n.connector?.name??r.connectorId]}),m]}),c&&(0,H.jsxs)(`p`,{className:`form-error`,role:`alert`,children:[`Couldn't send your answer: `,c]}),!a&&(0,H.jsx)(`p`,{className:`hint`,children:`You're offline: answer once you're back online.`}),(0,H.jsxs)(`p`,{className:`approval-expiry`,title:d(n.expiresAt),children:[`Expires `,b(n.expiresAt,i),` · `,t.name,` gets a turn with your answer`]})]})}function Aa({ask:e,bot:t,disabled:n,decline:r,onSubmit:i}){let a=(0,z.useId)(),[o,s]=(0,z.useState)(()=>Object.fromEntries(e.fields.map(e=>[e.id,e.kind!==`checkbox`&&``]))),c=t=>{t.preventDefault();let n={};for(let t of e.fields){let e=o[t.id];typeof e==`boolean`?n[t.id]=e:e.trim()!==``&&(n[t.id]=t.kind===`number`?Number(e):e)}i(n)},l=(e,t)=>s(n=>({...n,[e.id]:t}));return(0,H.jsxs)(`form`,{className:`tcard-form`,onSubmit:c,children:[e.fields.map(e=>{let t=`${a}-${e.id}`;return e.kind===`checkbox`?(0,H.jsxs)(`label`,{className:`tcard-check`,htmlFor:t,children:[(0,H.jsx)(`input`,{id:t,type:`checkbox`,checked:o[e.id]===!0,required:e.required,disabled:n,onChange:t=>l(e,t.target.checked)}),(0,H.jsx)(`span`,{children:e.label})]},e.id):(0,H.jsxs)(`div`,{className:`tcard-field`,children:[(0,H.jsxs)(`label`,{className:`field-label`,htmlFor:t,children:[e.label,e.required&&(0,H.jsx)(`span`,{"aria-hidden":`true`,children:` *`})]}),e.kind===`select`?(0,H.jsxs)(`select`,{id:t,value:String(o[e.id]),required:e.required,disabled:n,onChange:t=>l(e,t.target.value),children:[(0,H.jsx)(`option`,{value:``,children:`Choose…`}),e.options.map(e=>(0,H.jsx)(`option`,{value:e.id,children:e.label},e.id))]}):e.kind===`textarea`?(0,H.jsx)(`textarea`,{id:t,rows:3,value:String(o[e.id]),maxLength:e.maxLength??2e3,required:e.required,disabled:n,placeholder:e.placeholder,onChange:t=>l(e,t.target.value)}):(0,H.jsx)(`input`,{id:t,type:e.kind===`number`?`number`:`text`,inputMode:e.kind===`number`?`decimal`:void 0,step:e.kind===`number`?`any`:void 0,min:e.min,max:e.max,value:String(o[e.id]),maxLength:e.kind===`text`?e.maxLength??2e3:void 0,required:e.required,disabled:n,placeholder:e.placeholder,autoComplete:`off`,onChange:t=>l(e,t.target.value)})]},e.id)}),(0,H.jsxs)(`p`,{className:`hint`,children:[`Your answer goes to `,t.name,` and stays in this chat. Never type a password, key or code here.`]}),(0,H.jsxs)(`div`,{className:`approval-actions`,children:[(0,H.jsx)(`button`,{type:`submit`,className:`btn small primary`,disabled:n,children:e.submit??`Send answer`}),r]})]})}function ja({card:e,status:t,bot:n}){let r=e.answer,i=r?` · ${v(r.at)}`:``,a;switch(t){case`answered`:a=r?.action===`grant`?r.result===`already`?`${n.name} already had ${e.connector?.name??`the connector`}: nothing changed`:`You gave ${n.name} ${e.connector?.name??`the connector`}`:r?.action===`choose`?`You chose “${r.option?.label??``}”`:`You sent your answer`;break;case`declined`:a=`You declined`;break;case`expired`:a=`Expired: nobody answered in time, so nothing was done`;break;default:a=`Closed without doing anything: ${e.reason??`it could no longer be done`}`}return(0,H.jsx)(`div`,{className:h(`approval-outcome`,t===`answered`?`is-allowed`:t===`expired`?`is-expired`:t===`refused`?`is-denied`:``),role:`status`,children:(0,H.jsxs)(`span`,{children:[a,i]})})}var Ma=e=>Array.from(e.dataTransfer?.types??[]).includes(`Files`),Na={"routine.created":`Created routine`,"routine.updated":`Updated routine`,"routine.paused":`Paused routine`,"routine.resumed":`Resumed routine`,"routine.deleted":`Deleted routine`,"memory.saved":`Saved to memory`,"memory.forgotten":`Forgot a memory`,"session.reset":`Started a fresh conversation`,"notify.sent":`Sent a notification`,"bot.paused":`Paused`,"bot.resumed":`Resumed`,"file.shared":`Shared a file`,"ask.sent":`Asked`,"skill.created":`Saved a skill`,"skill.updated":`Updated a skill`,"approval.auto":`Allowed without asking`,"approval.expired":`Approval request expired`,"approval.cancelled":`Withdrew an approval request`,"connector.granted":`Got a connector it asked for`};function Pa(e){let t=e.meta;if(t)return t.kind===`connector.reconnect`?t.connectorId:t.kind===`approval.decided`?t.note:t.kind?.startsWith(`approval.`)?t.approvalTitle:t.memoryText??t.notifyText??t.askText??(t.skillName?`/${t.skillName}`:void 0)}async function Fa(e){let t;try{t=await s.stopBot(e.id)}catch(t){a({kind:`error`,text:`Couldn't stop ${e.name}: ${f(t)}`},8e3);return}if(!t.stopped){a({kind:`info`,text:`${e.name} had nothing running to stop.`});return}if(!t.queuedRuns){a({kind:`info`,text:`Stopped ${e.name}.`});return}let n=t.queuedRuns===1?`1 queued routine run`:`${t.queuedRuns} queued routine runs`;a({kind:`info`,text:`Stopped ${e.name}. ${n} will still run.`,action:{label:`Cancel them`,run:()=>void Ia(e)}},1e4)}async function Ia(e){try{let{cancelledRuns:t}=await s.cancelRuns(e.id),n=t===1?`1 queued run`:`${t} queued runs`;a({kind:`info`,text:t?`Cancelled ${n} of ${e.name}.`:`${e.name} had no queued runs left to cancel.`})}catch(e){a({kind:`error`,text:`Couldn't cancel the queued runs: ${f(e)}`},8e3)}}var La=[],Ra=e=>e.scrollHeight-e.scrollTop-e.clientHeight<120,za=e=>!e.hasAttribute(`data-edge`)&&!e.classList.contains(`day-sep`)&&!e.classList.contains(`burst-time`)&&!e.classList.contains(`new-divider`);function Ba(e){let t=e.firstElementChild?.children;if(!t)return null;let n=e.getBoundingClientRect().top,r=0,i=t.length;for(;r<i;){let e=r+i>>1;t[e].getBoundingClientRect().bottom<=n?r=e+1:i=e}for(let e=r;e<t.length;e++)if(za(t[e]))return{el:t[e],top:t[e].getBoundingClientRect().top-n};return null}function Va(e,t){if(!t?.el.isConnected)return;let n=t.el.getBoundingClientRect().top-e.getBoundingClientRect().top-t.top;Math.abs(n)>=1&&(e.scrollTop+=n),t.heldAt=e.scrollTop}function Ha(e,t){let n=Ba(e);return n&&t&&n.el===t.el&&t.heldAt===e.scrollTop?{...n,top:t.top,heldAt:t.heldAt}:n}function Ua(e){let{bot:t}=e,n=Li(),r=!!e.covered||n,i=K(e=>e.messages[t.id]),a=i?.items??La,o=(0,z.useMemo)(()=>{let e=$t(a);return e.size?a.filter(t=>!e.has(t.id)):a},[a]),s=(0,z.useRef)(null),c=(0,z.useRef)(!0),l=(0,z.useRef)(0),u=(0,z.useRef)(null),f=(0,z.useRef)(null),p=(0,z.useRef)(null),[g,b]=(0,z.useState)(!0),x=ai(t.id),[ee,S]=(0,z.useState)(!1),w=(0,z.useRef)(e);(0,z.useLayoutEffect)(()=>{w.current=e});let T=(0,z.useCallback)(e=>w.current.onOpenPanel(`files`,e),[]),E=(0,z.useCallback)(e=>w.current.onOpenPanel(`routines`,e),[]),te=(0,z.useCallback)(e=>w.current.onOpenBot(e),[]),ne=(0,z.useMemo)(()=>({id:t.id,name:t.name,workspace:t.workspace}),[t.id,t.name,t.workspace]),[D,re]=(0,z.useState)(null);D?.botId!==t.id&&i&&(a.length>0||!i.loading&&!i.error)&&re({botId:t.id,firstUnread:mn(a,t.unread)});let O=D?.botId===t.id?D:null,k=(0,z.useMemo)(()=>{let e=O?.firstUnread;if(!e||o===a||o.some(t=>t.id===e))return e??null;let t=a.findIndex(t=>t.id===e);return t<0?null:a.slice(t).find(e=>o.includes(e))?.id??null},[O?.firstUnread,a,o]),A=(0,z.useRef)(null);(0,z.useEffect)(()=>(Q.openChat(t.id),()=>Q.leaveChat(t.id)),[t.id]),(0,z.useEffect)(()=>{i||Q.loadMessages(t.id)},[t.id,i]);let j=!!i?.hasNewer;(0,z.useEffect)(()=>{Q.loadApprovals(t.id).catch(()=>{})},[t.id]);let M=a.at(-1)?.id,N=()=>{let e=s.current;e&&!r&&!j&&t.unread&&M&&Ra(e)&&document.visibilityState===`visible`&&document.hasFocus()&&Q.markRead(t.id,M)},ie=(0,z.useRef)(N);(0,z.useLayoutEffect)(()=>{ie.current=N}),(0,z.useEffect)(()=>{let e=()=>ie.current();return window.addEventListener(`focus`,e),document.addEventListener(`visibilitychange`,e),()=>{window.removeEventListener(`focus`,e),document.removeEventListener(`visibilitychange`,e)}},[]),(0,z.useEffect)(()=>{r||ie.current()},[r]);let ae=()=>{s.current&&(u.current=Ha(s.current,u.current))};(0,z.useLayoutEffect)(()=>{let e=s.current;if(!e)return;if(O&&A.current!==O){A.current=O,e.scrollTop=e.scrollHeight;let t=f.current;if(t){let n=t.getBoundingClientRect().top-e.getBoundingClientRect().top-72;n<0&&(e.scrollTop+=n)}}else c.current?e.scrollTop=e.scrollHeight:Va(e,u.current);ae();let n=Ra(e);if(c.current=n&&!j,b(n),N(),a.length>q.window){let n=e.scrollTop<e.scrollHeight-e.scrollTop-e.clientHeight;Q.keepWindow(t.id,c.current||!n?`oldest`:`newest`)}},[a,j,t.status.state,t.status.activity,t.status.draft?.text,O,t.unread]),(0,z.useEffect)(()=>{let e=s.current,t=e?.firstElementChild;if(!e||!t||typeof ResizeObserver>`u`)return;let n=new ResizeObserver(()=>{c.current?(e.scrollTop=e.scrollHeight,ie.current()):(Va(e,u.current),u.current=Ha(e,u.current))});return n.observe(e),n.observe(t),()=>n.disconnect()},[]);let P=()=>{ae(),Q.loadEarlier(t.id)},oe=()=>{ae(),Q.loadLater(t.id)},se=()=>{let e=s.current;if(!e)return;let t=Ra(e),n=e.scrollTop<l.current-1;l.current=e.scrollTop,c.current=!j&&(t||c.current&&!n),ae(),b(t),t&&N(),i&&!i.error&&(e.scrollTop<80&&i.hasMore&&!i.loadingEarlier?P():j&&e.scrollHeight-e.scrollTop-e.clientHeight<80&&!i.loadingLater&&oe())},le=()=>{let e=s.current;e&&(c.current=!0,j?(p.current?.focus(),Q.jumpToLatest(t.id)):e.scrollTo({top:e.scrollHeight,behavior:window.matchMedia(`(prefers-reduced-motion: reduce)`).matches?`auto`:`smooth`}))},ue=t.status.state!==`idle`,F=t.status.state===`working`&&t.status.draft?.text?t.status.draft:null,L=K(e=>e.settings?.paused??!1);return(0,H.jsxs)(`section`,{className:`chat`,"aria-label":`Chat with ${t.name}`,onDragOver:e=>{Ma(e)&&(e.preventDefault(),e.dataTransfer.dropEffect=`copy`,S(!0))},onDragLeave:e=>{e.currentTarget.contains(e.relatedTarget)||S(!1)},onDrop:e=>{Ma(e)&&(e.preventDefault(),S(!1),x.add(Array.from(e.dataTransfer.files)))},children:[ee&&(0,H.jsxs)(`div`,{className:`drop-overlay`,"aria-hidden":`true`,children:[(0,H.jsx)(Te,{size:28}),(0,H.jsxs)(`span`,{children:[`Drop to send to `,t.name]})]}),(0,H.jsxs)(`header`,{className:`chat-header`,children:[(0,H.jsx)(`button`,{className:`icon-btn round mobile-only`,"aria-label":`Back to Botons`,onClick:e.onBack,children:(0,H.jsx)(ge,{})}),(0,H.jsx)(Ga,{bot:t,onOpen:()=>e.onOpenPanel(`activity`)}),(0,H.jsxs)(`button`,{className:`title-chip`,onClick:()=>e.onOpenPanel(`settings`),title:`Boton settings`,children:[(0,H.jsx)(U,{look:t.look,size:26,seed:t.id}),(0,H.jsx)(`span`,{className:`title-chip-name`,children:t.name}),t.title&&(0,H.jsx)(`span`,{className:`title-chip-role`,children:t.title})]}),(0,H.jsxs)(`div`,{className:`chat-header-actions`,children:[(0,H.jsx)(`button`,{className:h(`icon-btn round`,t.paused&&`on`),"aria-label":t.paused?`Resume ${t.name}`:`Pause ${t.name}`,title:t.paused?`Resume`:`Pause`,onClick:()=>void C(t.paused?`resume ${t.name}`:`pause ${t.name}`,()=>Q.pauseBot(t.id,!t.paused)),children:t.paused?(0,H.jsx)(ce,{}):(0,H.jsx)(I,{})}),t.connections.includes(`lib:botons_browser`)&&(0,H.jsx)(ji,{bot:t}),(0,H.jsx)(`button`,{className:`icon-btn round`,"aria-label":`Routines`,title:`Routines`,onClick:()=>e.onOpenPanel(`routines`),children:(0,H.jsx)(be,{})}),(0,H.jsx)(`button`,{className:`icon-btn round`,"aria-label":`Memory`,title:`Memory`,onClick:()=>e.onOpenPanel(`memory`),children:(0,H.jsx)(fe,{})}),(0,H.jsx)(`button`,{className:`icon-btn round`,"aria-label":`Files`,title:`Files`,onClick:()=>e.onOpenPanel(`files`),children:(0,H.jsx)(R,{})}),(0,H.jsx)(`button`,{className:`icon-btn round`,"aria-label":`Boton settings`,title:`Settings`,onClick:()=>e.onOpenPanel(`settings`),children:(0,H.jsx)(Se,{})})]})]}),(0,H.jsx)(`div`,{className:`messages`,ref:s,onScroll:se,children:(0,H.jsxs)(`div`,{className:`messages-inner`,children:[i?.loading&&!a.length&&(0,H.jsx)(`p`,{className:`muted center`,"data-edge":``,children:`Loading…`}),i?.error?.retry===`earlier`&&(0,H.jsx)(Ja,{bot:t,error:i.error.message}),i?.hasMore&&!i.error&&(0,H.jsxs)(`div`,{className:`history-edge`,"data-edge":``,children:[(0,H.jsx)(`button`,{className:`load-earlier`,disabled:i.loadingEarlier,onClick:P,children:i.loadingEarlier?`Loading…`:`Load earlier messages`}),(0,H.jsx)(`p`,{className:`history-note`,children:`Find in page searches only the messages loaded here.`})]}),i&&!i.loading&&!i.error&&a.length===0&&(0,H.jsx)(fo,{bot:t,onPick:e=>p.current?.setDraft(e)}),o.map((e,t)=>{let n=o[t-1],r=_(n?.createdAt,e.createdAt);return(0,H.jsxs)(z.Fragment,{children:[r.day&&(0,H.jsx)(`div`,{className:`day-sep`,children:(0,H.jsx)(`time`,{dateTime:m(e.createdAt),children:y(e.createdAt)})}),e.id===k&&(0,H.jsx)(`div`,{className:`new-divider`,ref:f,role:`separator`,"aria-label":`New messages`,children:(0,H.jsx)(`span`,{children:`New`})}),r.time&&!Qa(e)&&(0,H.jsx)(`time`,{className:`burst-time`,dateTime:e.createdAt,title:d(e.createdAt),children:v(e.createdAt)}),(0,H.jsx)(no,{bot:ne,m:e,grouped:Xa(n,e),onOpenRoutine:E,onOpenFile:T,onOpenBot:te})]},e.id)}),j&&!i?.error&&(0,H.jsx)(`div`,{className:`history-edge`,"data-edge":``,children:(0,H.jsx)(`button`,{className:`load-later`,disabled:i?.loadingLater,onClick:oe,children:i?.loadingLater?`Loading…`:`Load newer messages`})}),(i?.error?.retry===`latest`||i?.error?.retry===`later`)&&(0,H.jsx)(Ja,{bot:t,error:i.error.message}),F&&(0,H.jsxs)(`div`,{className:`msg bot draft`,children:[(0,H.jsx)(`div`,{className:`bubble`,"aria-busy":`true`,children:(0,H.jsx)(Kr,{text:F.text})}),(0,H.jsxs)(`span`,{className:`draft-status`,"aria-live":`polite`,children:[(0,H.jsx)(Ka,{bot:t}),(0,H.jsxs)(`span`,{className:`typing-text`,children:[t.status.activity??`Writing`,`…`]})]})]}),ue&&!F&&(0,H.jsx)(`div`,{className:`msg bot typing`,"aria-live":`polite`,children:(0,H.jsxs)(`div`,{className:`bubble`,children:[(0,H.jsx)(Ka,{bot:t}),(0,H.jsxs)(`span`,{className:`typing-text`,children:[t.status.state===`queued`?`Up next`:t.status.activity??`Thinking`,`…`]})]})})]})}),(0,H.jsx)(`div`,{className:`pill-anchor`,children:(j||!g&&t.unread>0)&&(0,H.jsxs)(`button`,{className:`new-pill`,onClick:le,children:[t.unread>0?`${t.unread} new`:`Jump to latest`,` `,(0,H.jsx)(`span`,{"aria-hidden":`true`,children:`↓`})]})}),(0,H.jsx)(ua,{bot:ne}),(0,H.jsx)($r,{bot:t}),(t.paused||L)&&(0,H.jsx)(qa,{bot:t,all:L}),(0,H.jsx)(po,{ref:p,bot:t,files:x,busy:ue,onSent:()=>c.current=!0})]})}var Wa=e=>y(e)===`Today`?v(e):`${y(e)} ${v(e)}`;function Ga({bot:e,onOpen:t}){let[n,r]=(0,z.useState)(null),i=e.status.state===`idle`,a=e.lastMessage?.createdAt;(0,z.useEffect)(()=>{let t=!0,n=()=>s.background(e.id).then(n=>t&&r({botId:e.id,a:n}),()=>{});n();let i=setInterval(n,6e4);return()=>{t=!1,clearInterval(i)}},[e.id,i,a]);let o=n?.botId===e.id?n.a:null,c=o?sn(o,Wa):null;return!o||!c?null:(0,H.jsxs)(`button`,{type:`button`,className:`background-line desktop-only`,onClick:t,title:`Routines, webhooks, connector updates, other Botons and follow-ups that woke ${e.name}. A quiet one posts nothing in the chat; open Activity for each one and its note. Latest: ${d(o.lastAt)}`,children:[(0,H.jsx)(be,{size:13}),(0,H.jsx)(`span`,{children:c})]})}var Ka=({bot:e})=>(0,H.jsx)(`span`,{className:`typing-boton`,"aria-hidden":`true`,children:(0,H.jsx)(U,{look:e.look,size:26,state:`working`,seed:e.id})});function qa({bot:e,all:t}){let[n,r]=(0,z.useState)(!1),i=async()=>{r(!0),await C(t?`resume all Botons`:`resume ${e.name}`,()=>t?Q.pauseAll(!1):Q.pauseBot(e.id,!1)),r(!1)};return(0,H.jsxs)(`div`,{className:`paused-banner`,role:`status`,children:[(0,H.jsx)(I,{size:16}),(0,H.jsxs)(`span`,{children:[(0,H.jsx)(`strong`,{children:t?`All Botons are paused.`:`${e.name} is paused.`}),` Nothing runs, and messages wait, until you resume.`]}),(0,H.jsxs)(`button`,{className:`btn small`,disabled:n,onClick:()=>void i(),children:[(0,H.jsx)(ce,{size:14}),` `,t?`Resume all`:`Resume`]})]})}function Ja({bot:e,error:t}){let[n,r]=(0,z.useState)(!1);return(0,H.jsxs)(`div`,{className:`chat-load-error`,role:`alert`,"data-edge":``,children:[(0,H.jsx)(xe,{size:16,className:`error-icon`}),(0,H.jsxs)(`span`,{children:[`Couldn't load messages: `,t]}),(0,H.jsx)(`button`,{className:`btn small`,disabled:n,onClick:async()=>{r(!0),await Q.retryMessages(e.id),r(!1)},children:n?`Retrying…`:`Retry`})]})}var Ya=e=>e.meta?.fromBotId?`boton:${e.meta.fromBotId}`:e.meta?.kind===`reaction.followup`?`chip`:e.role,Xa=(e,t)=>!!e&&Ya(e)===Ya(t)&&new Date(t.createdAt).getTime()-new Date(e.createdAt).getTime()<12e4;function Za(e){let t=K(t=>e?t.bots.find(t=>t.id===e)?.name:void 0),n=K(t=>e?t.bots.find(t=>t.id===e)?.look:void 0);return e&&t!==void 0&&n?{id:e,name:t,look:n}:void 0}var Qa=e=>e.role===`event`&&e.meta?.kind===`routine.run`||e.role===`user`&&(e.meta?.kind===`work.event`||e.meta?.kind===`connector.granted`),$a=({iso:e})=>(0,H.jsx)(`time`,{className:`msg-time`,dateTime:e,children:d(e)}),eo=({iso:e})=>(0,H.jsx)(`time`,{className:`chip-time`,dateTime:e,children:v(e)});function to(){let[e,t]=(0,z.useState)(!1);return{shown:e,onClick:(0,z.useCallback)(e=>{e.nativeEvent.pointerType!==`mouse`&&(e.target.closest(`a, button, input, textarea, select, summary, label, [role="button"]`)||getSelection()?.toString()||t(e=>!e))},[])}}var no=(0,z.memo)(function({bot:e,m:t,grouped:n,onOpenRoutine:r,onOpenFile:i,onOpenBot:a}){let o=to(),s=e=>(0,H.jsxs)(`div`,{className:h(`timed-row`,o.shown&&`show-time`),onClick:o.onClick,title:d(t.createdAt),children:[e,(0,H.jsx)($a,{iso:t.createdAt})]});if(t.role===`event`&&t.meta?.kind===`approval.requested`)return s((0,H.jsx)(Yr,{bot:e,m:t,onOpenRoutine:r}));if(t.role===`event`&&t.meta?.kind===`browser.handoff`)return s((0,H.jsx)(Ni,{bot:e,m:t}));if(t.role===`user`&&t.meta?.kind===`browser.handed_back`)return s((0,H.jsxs)(`div`,{className:`event-chip wake-label`,title:d(t.createdAt),children:[(0,H.jsx)(`span`,{children:`You handed the browser back`}),(0,H.jsx)(eo,{iso:t.createdAt})]}));if(t.role===`event`&&t.meta?.kind===`card.posted`)return s((0,H.jsx)(Ea,{bot:e,m:t,onOpenFile:i,onOpenRoutine:r}));if(t.meta?.kind===`approval.decided`&&(t.role===`user`||t.role===`event`&&!t.meta.skillName))return s((0,H.jsx)(Qr,{m:t}));if(t.role===`user`&&t.meta?.kind===`reaction.followup`)return s((0,H.jsx)(ha,{m:t,bot:e}));if(t.role===`user`&&t.meta?.kind===`work.event`){let e=t.meta.work?.link?.startsWith(`https://`)?t.meta.work.link:null,n=an(t.meta.work);return s((0,H.jsxs)(`div`,{className:h(`event-chip wake-label`,n.warn&&`warn`),title:`${n.detail} · ${d(t.createdAt)}`,children:[(0,H.jsx)(`span`,{children:n.text}),(0,H.jsx)(eo,{iso:t.createdAt}),e&&(0,H.jsx)(`a`,{href:e,target:`_blank`,rel:`noreferrer noopener`,children:`Open`})]}))}if(t.role===`user`&&t.meta?.kind===`connector.granted`){let e=/^Connector .{1,80} added$/.test(t.text)?t.text:Na[`connector.granted`];return s((0,H.jsxs)(`div`,{className:`event-chip wake-label`,title:`${t.meta.connectorId??``} · ${d(t.createdAt)}`,children:[(0,H.jsx)(`span`,{children:e}),(0,H.jsx)(eo,{iso:t.createdAt})]}))}if(t.role===`event`)return s((0,H.jsx)(so,{bot:e,m:t,onOpenRoutine:r,onOpenFile:i,onOpenBot:a}));if(t.role===`user`&&t.meta?.fromBotId)return(0,H.jsx)(lo,{m:t,grouped:n,onOpenBot:a});let c=uo(t),l=t.meta?.attachments??[];return(0,H.jsxs)(`div`,{className:h(`msg`,t.role,n&&`grouped`,o.shown&&`show-time`),onClick:o.onClick,children:[t.meta?.kind===`provider.summary`&&(0,H.jsxs)(`div`,{className:`msg-from`,children:[`Summary for the move, from its session on `,t.meta.providerLabel??`the provider before`]}),l.length>0&&(0,H.jsx)(si,{bot:e,files:l,onOpen:i}),(t.text||!l.length)&&(0,H.jsxs)(`div`,{className:`bubble`,title:`${d(t.createdAt)}${c}`,onPointerDown:t.role===`bot`?e=>la(e,t):void 0,children:[t.role===`error`&&(0,H.jsx)(xe,{size:16,className:`error-icon`}),t.role===`user`?(0,H.jsx)(`p`,{className:`plain`,children:t.text}):(0,H.jsx)(Kr,{text:t.text,botId:e.id,workspace:e.workspace,onOpenFile:t.role===`bot`?i:void 0})]}),(0,H.jsx)(fa,{m:t,bot:e}),!!t.meta?.steps&&(0,H.jsx)(A,{count:t.meta.steps,load:O(t.id)}),(0,H.jsxs)(`div`,{className:`msg-foot`,children:[(0,H.jsx)($a,{iso:t.createdAt}),(0,H.jsx)(io,{m:t}),t.role===`bot`&&(0,H.jsx)(oa,{m:t,bot:e}),(t.role===`user`||t.role===`bot`)&&(0,H.jsx)(ao,{m:t})]})]})}),ro=1500;function io({m:e}){let t=j(e),[n,r]=(0,z.useState)(!1),i=(0,z.useRef)(void 0);if((0,z.useEffect)(()=>()=>clearTimeout(i.current),[]),t===null)return null;let o=async()=>{clearTimeout(i.current),await te(t)?(r(!0),i.current=setTimeout(()=>r(!1),ro)):(r(!1),a({kind:`error`,text:`Couldn't copy the message. Select its text and copy it instead.`},6e3))};return(0,H.jsxs)(`span`,{className:h(`msg-copy`,n&&`done`),children:[(0,H.jsx)(`button`,{type:`button`,className:`msg-copy-btn`,"aria-label":`Copy message`,title:`Copy`,onClick:()=>void o(),children:n?(0,H.jsx)(F,{size:14}):(0,H.jsx)(me,{size:14})}),(0,H.jsx)(`span`,{className:`msg-copy-status`,role:`status`,"aria-live":`polite`,children:n?`Copied`:``})]})}function ao({m:e}){let t=!!e.meta?.pinned,[n,r]=(0,z.useState)(!1),i=async()=>{r(!0),await C(t?`unpin it`:`pin it`,()=>Q.pinMessage(e,!t)),r(!1)};return(0,H.jsxs)(`button`,{type:`button`,className:h(`msg-pin`,t&&`on`),"aria-pressed":t,"aria-label":t?`Pinned`:`Pin`,disabled:n,onClick:()=>void i(),title:t?`Pinned: every new session is given this message, whatever its age (a long one as its start and end only). Click to unpin.`:`Pin it: every new session is given this message, whatever its age (a long one as its start and end only)`,children:[(0,H.jsx)(we,{size:13}),(0,H.jsx)(`span`,{className:`msg-pin-label`,children:t?`Pinned`:`Pin`})]})}function oo({m:e,onOpenRoutine:t}){let n=on(e.meta),r=e.meta?.routineName?.trim();return(0,H.jsxs)(`div`,{className:`event-chip wake-label`,title:`${n.detail} · ${d(e.createdAt)}`,children:[(0,H.jsx)(`span`,{children:`Routine:`}),r?(0,H.jsx)(`button`,{className:`chip-link`,"aria-label":n.text,onClick:()=>e.meta?.routineId&&t(e.meta.routineId),disabled:!e.meta?.routineId,children:n.text.slice(9)}):(0,H.jsx)(`span`,{children:n.text.slice(9)}),(0,H.jsx)(eo,{iso:e.createdAt})]})}function so({bot:e,m:t,onOpenRoutine:n,onOpenFile:r,onOpenBot:i}){return t.meta?.kind===`routine.run`?(0,H.jsx)(oo,{m:t,onOpenRoutine:n}):(0,H.jsx)(co,{bot:e,m:t,onOpenRoutine:n,onOpenFile:r,onOpenBot:i})}function co({bot:e,m:t,onOpenRoutine:n,onOpenFile:r,onOpenBot:i}){let a=k(t),o=Za(t.meta?.kind===`ask.sent`?t.meta.toBotId:void 0),s=t.meta?.kind===`notify.sent`&&t.meta.priority===`high`?`Sent an urgent notification`:Na[t.meta?.kind??``]??t.text,c=Pa(t);return(0,H.jsxs)(`div`,{className:h(`event-chip`,(t.meta?.kind===`ask.refused`||t.meta?.kind===`approval.expired`||t.meta?.kind===`instructions.restored`||t.meta?.kind===`connector.reconnect`)&&`warn`),title:c??d(t.createdAt),children:[(0,H.jsx)(`span`,{children:s}),o&&(0,H.jsxs)(`button`,{className:`chip-link`,onClick:()=>i(o.id),title:`Open ${o.name}'s chat`,children:[(0,H.jsx)(U,{look:o.look,size:16}),o.name]}),t.meta?.routineName&&(0,H.jsxs)(`button`,{className:`chip-link`,disabled:!t.meta.routineId||t.meta.kind===`routine.deleted`,onClick:()=>t.meta?.routineId&&n(t.meta.routineId),children:[(0,H.jsx)(be,{size:14}),t.meta.routineName]}),t.meta?.file&&(0,H.jsxs)(`button`,{className:`chip-link`,title:t.meta.file.path,onClick:()=>r(t.meta.file.path),children:[(0,H.jsx)(he,{size:14}),t.meta.file.title||t.meta.file.name]}),c&&(0,H.jsxs)(`span`,{className:`chip-quote`,children:[`“`,S(c,60),`”`]}),(t.meta?.kind===`turn.stopped`||t.meta?.kind===`turn.interrupted`)&&!!t.meta.steps&&(0,H.jsx)(A,{count:t.meta.steps,load:O(t.id)}),a&&(0,H.jsx)(`div`,{className:`chip-image`,children:(0,H.jsx)(si,{bot:e,files:[a],onOpen:r})})]})}function lo({m:e,grouped:t,onOpenBot:n}){let r=Za(e.meta?.fromBotId),i=r?.name??e.meta?.fromBotName??`Another Boton`,a=to();return(0,H.jsxs)(`div`,{className:h(`msg Boton`,t&&`grouped`,a.shown&&`show-time`),onClick:a.onClick,children:[!t&&(0,H.jsxs)(`div`,{className:`msg-from`,children:[r?(0,H.jsxs)(`button`,{className:`chip-link`,onClick:()=>n(r.id),title:`Open ${i}'s chat`,children:[(0,H.jsx)(U,{look:r.look,size:18}),i]}):(0,H.jsx)(`span`,{children:i}),(0,H.jsx)(`span`,{className:`muted`,children:e.meta?.kind===`ask.reply`?`replied to the ask`:`asks`})]}),(0,H.jsx)(`div`,{className:`bubble`,title:`${d(e.createdAt)} · from ${i}, another Boton`,children:(0,H.jsx)(Kr,{text:e.text})}),(0,H.jsxs)(`div`,{className:`msg-foot`,children:[(0,H.jsx)($a,{iso:e.createdAt}),(0,H.jsx)(io,{m:e})]})]})}function uo(e){let t=[];return e.meta?.durationMs&&t.push(ee(e.meta.durationMs)),e.meta?.model&&t.push(e.meta.model),e.meta?.usage&&t.push(u(e.meta.usage)),e.meta?.usage?.costUsd&&t.push(x(e.meta.usage.costUsd)),e.meta?.usage?.costHeldUsd&&t.push(`${x(e.meta.usage.costHeldUsd)} of it held for an answer that broke off`),t.map(e=>` · ${e}`).join(``)}function fo({bot:e,onPick:t}){let n=[`What can you help me with?`,`Every weekday at 8am, send me a short briefing on the top tech news.`,e.access===`host`?`How much free disk space does this computer have?`:`What files are in your workspace?`],r=t=>t.providers.length?On(t.providers.find(t=>t.id===e.provider)):null,i=K(e=>r(e)?.kind??null),a=K(e=>{let t=r(e);return t?.kind===`limited`?t.until:null});return(0,H.jsxs)(`div`,{className:`welcome`,children:[(0,H.jsx)(U,{look:e.look,size:112,seed:e.id,state:i?`asleep`:`idle`}),(0,H.jsx)(`h1`,{children:e.name}),e.title&&(0,H.jsx)(`p`,{className:`muted`,children:e.title}),i===`limited`?(0,H.jsxs)(`p`,{className:`welcome-copy`,children:[e.name,`'s brain is at its usage limit`,a?` until ${d(a)}`:``,`. It resets by itself; messages wait until then.`]}):i?(0,H.jsxs)(`p`,{className:`welcome-copy`,children:[e.name,` has no working brain yet. Give it one in Settings → Brains, and it wakes up.`]}):(0,H.jsxs)(`p`,{className:`welcome-copy`,children:[`Tell `,e.name,` what to own. Ask for a routine in plain words and it will set one up.`]}),(0,H.jsx)(`div`,{className:`ideas`,children:n.map(e=>(0,H.jsx)(`button`,{className:`idea`,onClick:()=>t(e),children:e},e))})]})}function po(e){let{bot:t,files:n}=e,[r,i]=(0,z.useState)(``);(0,z.useImperativeHandle)(e.ref,()=>({setDraft:i,focus:()=>o.current?.focus()}),[]),(0,z.useEffect)(()=>{i(``)},[t.id]);let a=K(e=>e.providers),o=(0,z.useRef)(null),s=(0,z.useRef)(null),[l,u]=(0,z.useState)(!1),[d,f]=(0,z.useState)(null),p=K(e=>e.connected);(0,z.useEffect)(()=>{p&&f(e=>e?.offline?null:e)},[p]);let m=ba(t,r,i);(0,z.useLayoutEffect)(()=>{let e=o.current;e&&(e.style.height=`auto`,e.style.height=`${Math.min(e.scrollHeight,220)}px`)},[r]),(0,z.useEffect)(()=>{window.matchMedia(`(pointer: fine)`).matches&&o.current?.focus()},[t.id]);let h=t.access===`workspace`?a.find(e=>e.id===t.provider)?.workspaceProblem:null,g=!h&&(!!r.trim()||n.ready.length>0)&&!n.busy&&!l,_=async()=>{let a=r.trim();if(g){u(!0),f(null);try{await Q.send(t.id,a,n.ready),i(``),n.clear(),e.onSent()}catch(e){f(c(e))}finally{u(!1),o.current?.focus()}}},v=e=>{let t=Array.from(e.clipboardData.files);t.length&&!e.clipboardData.getData(`text/plain`)&&(e.preventDefault(),n.add(t))};return(0,H.jsxs)(`div`,{className:`composer-wrap`,children:[h&&(0,H.jsxs)(`div`,{className:`hint`,role:`status`,children:[(0,H.jsx)(`strong`,{children:`Can't run sandboxed on this server`}),(0,H.jsx)(`p`,{children:h}),(0,H.jsx)(`button`,{className:`btn small`,type:`button`,disabled:l,onClick:async()=>{u(!0);try{await Q.updateBot(t.id,{access:`host`})}catch(e){f(c(e))}finally{u(!1)}},children:`Switch to Full computer`})]}),(0,H.jsx)(Ii,{providers:a,provider:t.provider}),d&&(0,H.jsx)(`p`,{className:`composer-error`,role:`alert`,children:d.text}),(0,H.jsx)(oi,{items:n.items,onRemove:n.remove}),m.menu,(0,H.jsx)(`span`,{className:`sr-only`,role:`status`,children:m.announce}),(0,H.jsxs)(`form`,{className:`composer`,onSubmit:e=>{e.preventDefault(),_()},children:[(0,H.jsx)(`input`,{ref:s,type:`file`,multiple:!0,hidden:!0,onChange:e=>{n.add(Array.from(e.target.files??[])),e.target.value=``}}),(0,H.jsx)(`button`,{type:`button`,className:`icon-btn round attach-btn`,"aria-label":`Attach files`,title:`Attach files or photos`,onClick:()=>s.current?.click(),children:(0,H.jsx)(Te,{})}),(0,H.jsx)(`textarea`,{ref:o,rows:1,value:r,placeholder:`Message ${t.name} (/ for skills)`,"aria-label":`Message ${t.name}`,...m.inputProps,onChange:e=>i(e.target.value),onPaste:v,onKeyDown:e=>{!e.nativeEvent.isComposing&&m.onKey(e)||e.key!==`Enter`||e.shiftKey||e.nativeEvent.isComposing||!window.matchMedia(`(pointer: fine)`).matches||(e.preventDefault(),_())}}),e.busy&&(0,H.jsx)(`button`,{type:`button`,className:`icon-btn round stop-btn`,"aria-label":`Stop`,title:`Stop`,onClick:()=>void Fa(t),children:(0,H.jsx)(ie,{})}),(0,H.jsx)(`button`,{type:`submit`,className:`icon-btn round send-btn`,"aria-label":`Send`,title:n.busy?`Waiting for the files to upload`:`Send (Enter)`,disabled:!g,children:(0,H.jsx)(oe,{})})]})]})}var mo=e=>(window.addEventListener(`botons-theme`,e),()=>window.removeEventListener(`botons-theme`,e)),ho=()=>window.botonsTheme.get();function go({quick:e=!1}){let t=(0,z.useSyncExternalStore)(mo,ho);return e?(0,H.jsx)(`button`,{type:`button`,className:`theme-quick`,"aria-label":`Toggle light or dark mode`,title:`Toggle light or dark mode`,onClick:()=>window.botonsTheme.set(document.documentElement.dataset.theme===`dark`?`light`:`dark`),children:`☀ / ☾`}):(0,H.jsxs)(`label`,{children:[(0,H.jsx)(`span`,{className:`field-label`,children:`Appearance`}),(0,H.jsxs)(`select`,{"aria-label":`Appearance`,value:t,onChange:e=>window.botonsTheme.set(e.target.value),children:[(0,H.jsx)(`option`,{value:`system`,children:`System`}),(0,H.jsx)(`option`,{value:`light`,children:`Light`}),(0,H.jsx)(`option`,{value:`dark`,children:`Dark`})]}),(0,H.jsx)(`span`,{className:`hint`,children:`Saved on this device. System follows your device’s appearance.`})]})}function _o(e,t){let n=new Map(t.map(e=>[e.id,e])),r=e=>e.flatMap(e=>n.get(e)??[]),i=e??vo(t),a=new Set;for(let e of i.groups)for(let t of e.botIds)a.add(t);for(let e of i.ungrouped.botIds)a.add(e);let o=new Set(i.groups.map(e=>e.id)),s=new Map;for(let e of t){if(a.has(e.id))continue;let t=e.groupId&&o.has(e.groupId)?e.groupId:null;s.set(t,[...s.get(t)??[],e])}let c=new Set(i.pinned.botIds);return{pinned:{key:`pinned`,kind:`pinned`,groupId:null,name:`Pinned`,collapsed:i.pinned.collapsed,bots:[...r(i.pinned.botIds),...t.filter(e=>e.pinned&&!c.has(e.id))]},groups:i.groups.map(e=>({key:e.id,kind:`group`,groupId:e.id,name:e.name,collapsed:e.collapsed,bots:[...r(e.botIds),...s.get(e.id)??[]]})),ungrouped:{key:`ungrouped`,kind:`ungrouped`,groupId:null,name:`Ungrouped`,collapsed:i.ungrouped.collapsed,bots:[...r(i.ungrouped.botIds),...s.get(null)??[]]}}}function vo(e){let t=new Map;for(let n of e){if(!n.groupId)continue;let e=t.get(n.groupId)??{id:n.groupId,name:n.group,botIds:[]};e.botIds.push(n.id),t.set(n.groupId,e)}return{pinned:{collapsed:!1,botIds:e.filter(e=>e.pinned).map(e=>e.id)},groups:[...t.values()].sort((e,t)=>e.name.localeCompare(t.name)).map(e=>({...e,collapsed:!1})),ungrouped:{collapsed:!1,botIds:e.filter(e=>!e.groupId).map(e=>e.id)}}}function yo(e,t){let n=0,r=0,i=0;for(let a of e)n+=a.unread,r+=t.get(a.id)??0,a.status.state!==`idle`&&i++;return{unread:n,approvals:r,busy:i}}function bo(e){return[e.unread&&`${e.unread} unread`,e.approvals&&`${e.approvals} waiting for approval`,e.busy&&`${e.busy} working`].filter(Boolean).join(`, `)}function xo(e,t){let n=t.trim().toLocaleLowerCase();if(!n)return[];let r=new Set,i=[];for(let t of[e.pinned,...e.groups,e.ungrouped])for(let e of t.bots)r.has(e.id)||`${e.name} ${e.title} ${e.group}`.toLocaleLowerCase().includes(n)&&(r.add(e.id),i.push(e));return i}function So(e,t,n){let r=e.indexOf(t);if(r<0)return null;let i=r+n;return i<0||i>=e.length?null:i}function Co(e,t,n){let r=e.filter(e=>e!==t);return r.splice(n===void 0?r.length:Math.min(Math.max(n,0),r.length),0,t),r}function wo(e,t){if(t.kind===`group`){if(!e.groups.find(e=>e.id===t.groupId))return e;let n=Co(e.groups.map(e=>e.id),t.groupId,t.index);return{...e,groups:n.map(t=>e.groups.find(e=>e.id===t))}}if(t.kind===`pin`)return t.index===void 0&&e.pinned.botIds.includes(t.botId)?e:{...e,pinned:{...e.pinned,botIds:Co(e.pinned.botIds,t.botId,t.index)}};let n=t.groupId===null?e.ungrouped:e.groups.find(e=>e.id===t.groupId);if(!n||t.index===void 0&&n.botIds.includes(t.botId))return e;let r=e=>e.filter(e=>e!==t.botId),i=e=>e===n?Co(e.botIds,t.botId,t.index):r(e.botIds);return{...e,groups:e.groups.map(e=>({...e,botIds:i(e)})),ungrouped:{...e.ungrouped,botIds:i(e.ungrouped)}}}function To(e,t){return JSON.stringify(wo(e,t))===JSON.stringify(e)}function Eo(e,t){let n=e.findIndex(e=>t<(e.start+e.end)/2);return n<0?e.length:n}var Do=5,Oo=8,ko=450,$=48;function Ao(e,t){let n=null,r=null,i=null,a=()=>{let e=e=>(e.preventDefault(),e.stopPropagation());window.addEventListener(`click`,e,{capture:!0,once:!0}),setTimeout(()=>window.removeEventListener(`click`,e,!0),0)},o=()=>e.querySelector(`[data-drag-scroll]`),s=()=>{i!==null&&(i=null,window.removeEventListener(`pointerup`,m,!0))},c=t=>{if(r||n||!t.isPrimary||t.pointerType===`mouse`&&t.button!==0)return;let i=t.target;if(i.closest(`.row-menu, .group-menu, input, dialog, .menu`))return;let a=i.closest(`[data-drag]`);if(!a||!e.contains(a))return;let o=t.pointerType!==`mouse`;n={id:t.pointerId,x:t.clientX,y:t.clientY,el:a,touch:o},o&&(n.timer=setTimeout(()=>n&&u(n.x,n.y),ko)),window.addEventListener(`pointermove`,l,!0),window.addEventListener(`pointerup`,m,!0),window.addEventListener(`pointercancel`,h,!0)},l=e=>{if(r){if(e.pointerId!==r.id)return;r.x=e.clientX,r.y=e.clientY;return}if(!n||e.pointerId!==n.id)return;let t=Math.hypot(e.clientX-n.x,e.clientY-n.y);n.touch?t>Oo&&y():t>Do&&u(e.clientX,e.clientY)},u=(e,i)=>{if(!n)return;let{el:a,id:o}=n;clearTimeout(n.timer),n=null;let s=a.dataset.drag,c=a.getBoundingClientRect(),l=a.cloneNode(!0);l.removeAttribute(`data-drag`),l.querySelectorAll(`[id]`).forEach(e=>e.removeAttribute(`id`)),l.className=`${l.className} drag-ghost`,l.setAttribute(`aria-hidden`,`true`),l.inert=!0,l.style.width=`${c.width}px`,l.style.height=`${c.height}px`;let u=document.createElement(`div`);u.className=`drop-line`,u.hidden=!0,document.body.append(l,u),a.setAttribute(`data-drag-source`,``),document.documentElement.setAttribute(`data-dragging`,s);let f=a.dataset.name??``;r={id:o,kind:s,el:a,name:f,ghost:l,line:u,dx:e-c.left,dy:i-c.top,x:e,y:i,target:null,over:null,frame:0},window.addEventListener(`keydown`,g,!0),window.addEventListener(`blur`,_),navigator.vibrate&&s!==`group`&&navigator.vibrate(8),t().onStart(s),t().announce(`Picked up ${f}. Escape puts it back.`),r.frame=requestAnimationFrame(d)},d=()=>{if(!r)return;let t=r;t.ghost.style.transform=`translate(${t.x-t.dx}px, ${t.y-t.dy}px)`;let n=o();if(n){let e=n.getBoundingClientRect(),r=t.x>=e.left&&t.x<=e.right;r&&t.y<e.top+$?n.scrollTop-=Math.ceil((e.top+$-t.y)/4):r&&t.y>e.bottom-$&&(n.scrollTop+=Math.ceil((t.y-(e.bottom-$))/4))}let i=e.querySelector(`.pinned`);if(i&&t.kind!==`group`){let e=i.getBoundingClientRect();t.y>=e.top&&t.y<=e.bottom&&t.x>=e.left&&t.x<=e.right&&(t.x<e.left+$?i.scrollLeft-=Math.ceil((e.left+$-t.x)/4):t.x>e.right-$&&(i.scrollLeft+=Math.ceil((t.x-(e.right-$))/4)))}p(t,f(t)),t.frame=requestAnimationFrame(d)},f=t=>{let n=o();if(!n)return null;let r=n.getBoundingClientRect();if(t.x<r.left||t.x>r.right||t.y>r.bottom)return null;if(t.y<r.top&&!(t.kind!==`group`&&document.elementFromPoint(t.x,t.y)?.closest(`.pin-zone`)))return t.y<r.top-$?null:t.target;if(t.kind===`group`){let n=t.el.dataset.groupId,i=[...e.querySelectorAll(`[data-drop-group]`)].filter(e=>e.dataset.dropGroup!==n);if(!i.length)return null;let a=i.map(e=>e.getBoundingClientRect()),o=Eo(a.map(e=>({start:e.top,end:e.bottom})),t.y),s=o<a.length?a[o].top-5:a[a.length-1].bottom+5;return{drop:{kind:`group`,groupId:n,index:o},line:{x:r.left+8,y:s,length:r.width-16,vertical:!1}}}let i=(document.elementFromPoint(t.x,t.y)?.closest(`.pin-zone`)??document.elementFromPoint(Math.min(Math.max(t.x,r.left+1),r.right-1),t.y))?.closest(`[data-drop]`);if(!i||!e.contains(i))return t.target;let a=i.dataset.drop,s=t.el.dataset.botId;if(t.kind===`pinned`&&a!==`pinned`)return null;let c=e=>a===`pinned`?{kind:`pin`,botId:s,index:e}:{kind:`bot`,botId:s,groupId:a===`ungrouped`?null:a,index:e},l=i.hasAttribute(`data-collapsed`)?[]:[...i.querySelectorAll(`[data-drag="bot"], [data-drag="pinned"]`)].filter(e=>e.dataset.botId!==s);if(!l.length)return{drop:c(i.hasAttribute(`data-collapsed`)?void 0:0),over:i};let u=a===`pinned`,d=l.map(e=>e.getBoundingClientRect()),f=Eo(d.map(e=>u?{start:e.left,end:e.right}:{start:e.top,end:e.bottom}),u?t.x:t.y),p=d[f],m=d[f-1];if(u){let e=p??m,t=p?p.left-2:m.right+2;return{drop:c(f),line:{x:t,y:e.top+4,length:e.height-8,vertical:!0}}}let h=p??m,g=p?p.top-1:m.bottom+1;return{drop:c(f),line:{x:h.left+6,y:g,length:h.width-12,vertical:!1}}},p=(e,t)=>{e.target=t;let n=t?.over??null;n!==e.over&&(e.over?.removeAttribute(`data-drop-over`),n?.setAttribute(`data-drop-over`,``),e.over=n);let r=t?.line;e.line.hidden=!r,r&&(e.line.classList.toggle(`vertical`,r.vertical),e.line.style.transform=`translate(${r.x}px, ${r.y}px)`,e.line.style[r.vertical?`height`:`width`]=`${r.length}px`,e.line.style[r.vertical?`width`:`height`]=``)},m=e=>{if(e.pointerId===i)i=null,a(),window.removeEventListener(`pointerup`,m,!0);else if(r&&e.pointerId===r.id){let e=(p(r,f(r)),r.target?.drop),n=r.name;a(),y(),e?t().onDrop(e):t().announce(`${n} put back.`)}else n&&e.pointerId===n.id&&y()},h=e=>{(r&&e.pointerId===r.id||n&&e.pointerId===n.id)&&v()},g=e=>{e.key===`Escape`&&r&&(e.preventDefault(),e.stopPropagation(),v())},_=()=>v(),v=()=>{let e=r?.name,n=r?.id;y(),n!==void 0&&(i=n,window.addEventListener(`pointerup`,m,!0)),e!==void 0&&t().announce(`${e} put back.`)},y=()=>{if(n&&clearTimeout(n.timer),n=null,window.removeEventListener(`pointermove`,l,!0),window.removeEventListener(`pointerup`,m,!0),window.removeEventListener(`pointercancel`,h,!0),!r)return;let e=r;r=null,cancelAnimationFrame(e.frame),e.ghost.remove(),e.line.remove(),e.over?.removeAttribute(`data-drop-over`),e.el.removeAttribute(`data-drag-source`),document.documentElement.removeAttribute(`data-dragging`),window.removeEventListener(`keydown`,g,!0),window.removeEventListener(`blur`,_),t().onEnd()},b=e=>{r&&e.cancelable&&e.preventDefault()},x=e=>{(r||n?.touch)&&e.preventDefault()};return window.addEventListener(`pointerdown`,s,!0),e.addEventListener(`pointerdown`,c),e.addEventListener(`touchmove`,b,{passive:!1}),e.addEventListener(`contextmenu`,x),()=>{y(),i=null,window.removeEventListener(`pointerdown`,s,!0),e.removeEventListener(`pointerdown`,c),e.removeEventListener(`touchmove`,b),e.removeEventListener(`contextmenu`,x)}}function jo(e){let[t,n]=(0,z.useState)(!1),r=(0,z.useRef)(null),i=(0,z.useRef)(!1);return(0,H.jsxs)(H.Fragment,{children:[(0,H.jsx)(`button`,{ref:r,type:`button`,className:e.className,"aria-label":e.label,title:e.label,"aria-haspopup":`menu`,"aria-expanded":t,onPointerDown:()=>i.current=t,onClick:()=>{n(e=>!e&&!i.current),i.current=!1},onKeyDown:e=>{(e.key===`ArrowDown`||e.key===`ArrowUp`)&&(e.preventDefault(),n(!0))},children:e.children}),t&&(0,H.jsx)(Mo,{label:e.label,anchor:r,entries:e.entries(),onClose:()=>n(!1)})]})}function Mo({label:e,anchor:t,entries:n,onClose:r}){let i=(0,z.useRef)(null);(0,z.useLayoutEffect)(()=>{let e=i.current,n=t.current;if(!e||!n)return;e.showPopover();let r=n.getBoundingClientRect(),a=e.getBoundingClientRect(),o=Math.max(8,Math.min(r.right-a.width,window.innerWidth-a.width-8)),s=r.bottom+4,c=s+a.height<=window.innerHeight-8?s:Math.max(8,r.top-a.height-4);return e.style.left=`${o}px`,e.style.top=`${c}px`,No(e)[0]?.focus(),()=>{let t=!document.activeElement||document.activeElement===document.body||e.contains(document.activeElement);e.matches(`:popover-open`)&&e.hidePopover(),t&&n.isConnected&&n.focus({preventScroll:!0})}},[t]);let a=e=>{e.disabled||(r(),e.onSelect())},o=e=>{let t=No(e.currentTarget),n=t.indexOf(document.activeElement),i=n=>{e.preventDefault(),t[(n+t.length)%t.length]?.focus()};e.key===`ArrowDown`?i(n+1):e.key===`ArrowUp`?i(n-1):e.key===`Home`?i(0):e.key===`End`?i(t.length-1):e.key===`Tab`?r():e.key===`Escape`&&(e.preventDefault(),r())},s=(e,t,n)=>(0,H.jsx)(`button`,{type:`button`,role:t?`menuitemradio`:`menuitem`,"aria-checked":t?!!e.checked:void 0,"aria-disabled":e.disabled||void 0,tabIndex:-1,className:h(`menu-item`,e.danger&&`danger`,e.checked&&`checked`),onClick:()=>a(e),children:e.label},n);return(0,H.jsx)(`div`,{ref:i,popover:`auto`,role:`menu`,"aria-label":e,className:`menu`,onKeyDown:o,onToggle:e=>e.newState===`closed`&&r(),children:n.map((e,t)=>e===`separator`?(0,H.jsx)(`div`,{role:`separator`,className:`menu-sep`},`sep${t}`):`heading`in e?(0,H.jsxs)(`div`,{role:`group`,"aria-label":e.heading,children:[(0,H.jsx)(`div`,{className:`menu-heading`,"aria-hidden":`true`,children:e.heading}),e.items.map((e,n)=>s(e,!0,`${t}.${n}`))]},`group${t}`):s(e,!1,String(t)))})}var No=e=>[...e.querySelectorAll(`[role^=menuitem]`)];function Po(e,t=null){return e.status.state===`working`?e.status.activity?`${e.status.activity}…`:`Working…`:e.status.state===`queued`?`Up next…`:e.paused?`Paused`:t?kn(t):e.lastMessage?(e.lastMessage.from?`${e.lastMessage.from}: `:e.lastMessage.role===`user`?`You: `:e.lastMessage.role===`error`?`Error: `:``)+(e.lastMessage.text.replace(/\*\*|__|`/g,``).replace(/^\s*(#+|>|[-*])\s+/gm,``).replace(/\s+/g,` `)||(e.lastMessage.role===`user`?`Sent a file`:``)):e.title||`New Boton`}function Fo(...e){requestAnimationFrame(()=>{let t=document.activeElement;if(!(t&&t!==document.body&&t.isConnected))for(let t of e){let e=document.querySelector(t);if(e)return e.focus()}})}var Io=(e,t)=>`[data-menu="${CSS.escape(`${e}:${t}`)}"] button`,Lo=e=>`[data-section="${CSS.escape(e)}"]`;function Ro(e){let t=K(e=>e.bots),n=K(e=>e.sidebar),r=K(e=>e.settings),i=K(e=>e.providers),a=(0,z.useMemo)(()=>i.length?new Map(i.map(e=>[e.id,On(e)])):null,[i]),o=r?.paused??!1,s=r?.primaryBotId??null,[c,l]=(0,z.useState)(!1),u=async()=>{l(!0),await C(o?`resume all Botons`:`pause all Botons`,()=>Q.pauseAll(!o)),l(!1)},[d,f]=(0,z.useState)(!1),[m,g]=(0,z.useState)(``),[_,v]=(0,z.useState)(null),y=Jr(),b=(0,z.useMemo)(()=>{let e=new Map;for(let t of y)e.set(t.botId,(e.get(t.botId)??0)+1);return e},[y]),x=[...new Set(y.map(e=>t.find(t=>t.id===e.botId)?.name).filter(Boolean))],[ee,S]=(0,z.useState)(null),w=ee&&ee.on===n?ee.layout:n,T=(0,z.useMemo)(()=>_o(w,t),[w,t]),E=(0,z.useMemo)(()=>xo(T,m),[T,m]),te=m.trim()!==``,[ne,D]=(0,z.useState)(null),re=(0,z.useRef)(null),O=(0,z.useRef)(null),k=e=>{O.current&&(O.current.textContent=e)},A=e=>{let r=w;if(!r||!n||To(r,e))return k(`Nothing moved.`);let i=N.current,a=e=>t.find(t=>t.id===e)?.name??`the Boton`,o=e.kind===`pin`?`Pinned`:e.kind===`bot`?e.groupId===null?`Ungrouped`:i.groups.find(t=>t.groupId===e.groupId)?.name??`the group`:``,s=e.kind===`group`?`move ${i.groups.find(t=>t.groupId===e.groupId)?.name??`the group`}`:`move ${a(e.botId)} to ${o}`;S({on:n,layout:wo(r,e)}),k(e.kind===`group`?`Moved group to position ${e.index+1}.`:`Moved ${a(e.botId)} to ${o}.`),C(s,()=>e.kind===`group`?Q.sidebar.moveGroup(e.groupId,e.index):e.kind===`pin`?Q.sidebar.pin(e.botId,!0,e.index):Q.sidebar.moveBot(e.botId,e.groupId,e.index)).then(()=>S(null))},j=(0,z.useRef)({onStart:D,onEnd:()=>D(null),onDrop:A,announce:k});j.current={onStart:D,onEnd:()=>D(null),onDrop:A,announce:k};let M=!!n&&!te;(0,z.useEffect)(()=>{if(M&&re.current)return Ao(re.current,()=>j.current)},[M]);let N=(0,z.useRef)(T);N.current=T;let ie=(0,z.useCallback)((e,t)=>zo(N.current,e,t,e=>v({kind:`create`,moving:e})),[]),oe=e=>{C(e.collapsed?`expand ${e.name}`:`collapse ${e.name}`,()=>Q.sidebar.collapse(e.kind===`group`?{groupId:e.groupId}:e.kind,!e.collapsed))},se=(t,n)=>{let r=T.groups.map(e=>e.key),i=e=>{let n=So(r,t.key,e);n!==null&&C(`move ${t.name}`,()=>Q.sidebar.moveGroup(t.groupId,n)).then(()=>Fo(`[data-group-menu="${CSS.escape(t.key)}"] button`))};return[{label:`New Boton in ${t.name}`,onSelect:()=>e.onNew(t.groupId)},{label:`Rename group…`,onSelect:()=>v({kind:`rename`,groupId:t.groupId,name:t.name})},{label:`Move group up`,disabled:n===0,onSelect:()=>i(-1)},{label:`Move group down`,disabled:n===r.length-1,onSelect:()=>i(1)},`separator`,{label:`Delete group…`,danger:!0,onSelect:()=>v({kind:`delete`,groupId:t.groupId,name:t.name,count:t.bots.length})}]},F=T.groups.length>0,R={selectedId:e.selectedId,onSelect:e.onSelect,waitingFor:b,brainRests:a,allPaused:o,primaryId:s,entriesFor:ie,draggable:M},fe=ne===`bot`;return(0,H.jsxs)(`nav`,{className:`sidebar`,"aria-label":`Botons`,ref:re,children:[(0,H.jsxs)(`div`,{className:`sidebar-top`,children:[d?(0,H.jsxs)(`div`,{className:`search`,children:[(0,H.jsx)(le,{size:16}),(0,H.jsx)(`input`,{autoFocus:!0,value:m,onChange:e=>g(e.target.value),placeholder:`Search Botons`,"aria-label":`Search Botons`,"aria-describedby":`sidebar-search-hint`,onKeyDown:t=>{t.key===`Escape`?(t.preventDefault(),g(``),f(!1)):t.key===`Enter`&&E[0]&&(t.preventDefault(),e.onSelect(E[0].id))}}),(0,H.jsx)(`span`,{id:`sidebar-search-hint`,className:`sr-only`,children:`Enter opens the first match.`}),(0,H.jsx)(`button`,{className:`icon-btn small`,"aria-label":`Close search`,onClick:()=>(g(``),f(!1)),children:(0,H.jsx)(L,{size:14})})]}):(0,H.jsxs)(H.Fragment,{children:[(0,H.jsx)(`div`,{className:`brand`,children:(0,H.jsx)(Yt,{height:26})}),(0,H.jsx)(`button`,{className:`icon-btn round`,"aria-label":`Search`,title:`Search`,onClick:()=>f(!0),children:(0,H.jsx)(le,{})}),(0,H.jsx)(`button`,{className:`icon-btn round`,"aria-label":`New Boton`,title:`New Boton`,onClick:()=>e.onNew(),children:(0,H.jsx)(ae,{})})]}),fe&&T.pinned.bots.length===0&&(0,H.jsx)(`div`,{className:`pin-zone`,"data-drop":`pinned`,children:`Drop here to pin`})]}),o&&(0,H.jsxs)(`div`,{className:`paused-banner`,role:`status`,children:[(0,H.jsx)(I,{size:16}),(0,H.jsxs)(`span`,{children:[(0,H.jsx)(`strong`,{children:`All Botons are paused.`}),` Nothing runs until you resume.`]}),(0,H.jsxs)(`button`,{className:`btn small`,disabled:c,onClick:()=>void u(),children:[(0,H.jsx)(ce,{size:14}),` Resume all`]})]}),y.length>0&&(0,H.jsxs)(`button`,{className:`approvals-banner`,onClick:()=>e.onSelect(y[0].botId),title:`Open the oldest request`,children:[(0,H.jsx)(P,{size:16}),(0,H.jsxs)(`span`,{children:[(0,H.jsx)(`strong`,{children:y.length===1?`1 approval waiting`:`${y.length} approvals waiting`}),x.length>0&&` · ${x.join(`, `)}`]})]}),(0,H.jsx)(`p`,{className:`sr-only`,"aria-live":`polite`,ref:O}),(0,H.jsxs)(`div`,{className:`sidebar-scroll`,"data-drag-scroll":!0,children:[t.length===0&&(0,H.jsxs)(`div`,{className:`sidebar-empty`,children:[(0,H.jsx)(`p`,{children:`No Botons yet.`}),(0,H.jsxs)(`button`,{className:`btn primary`,onClick:()=>e.onNew(),children:[(0,H.jsx)(ae,{size:16}),` New Boton`]})]}),te?t.length>0&&(E.length===0?(0,H.jsxs)(`p`,{className:`sidebar-empty muted`,role:`status`,children:[`No Botons match “`,m,`”.`]}):(0,H.jsxs)(`section`,{className:`group`,children:[(0,H.jsx)(`h2`,{className:`group-title plain`,role:`status`,children:E.length===1?`1 match`:`${E.length} matches`}),(0,H.jsx)(`ul`,{children:E.map(e=>(0,H.jsx)(Vo,{bot:e,...R},e.id))})]})):(0,H.jsxs)(H.Fragment,{children:[T.pinned.bots.length>0&&(0,H.jsxs)(`section`,{className:`group pinned-section`,"aria-label":`Pinned`,"data-drop":`pinned`,"data-collapsed":T.pinned.collapsed||void 0,children:[(0,H.jsx)(Bo,{section:T.pinned,summary:yo(T.pinned.bots,b),onToggle:()=>oe(T.pinned)}),!T.pinned.collapsed&&(0,H.jsx)(`ul`,{className:`pinned`,id:`sb-pinned`,children:T.pinned.bots.map(e=>(0,H.jsx)(Ho,{bot:e,...R},e.id))})]}),T.groups.map((e,t)=>(0,H.jsxs)(`section`,{className:`group`,"aria-label":e.name,"data-drop":e.key,"data-drop-group":e.key,"data-collapsed":e.collapsed||void 0,children:[(0,H.jsx)(Bo,{section:e,summary:yo(e.bots,b),onToggle:()=>oe(e),menu:(0,H.jsx)(jo,{label:`Options for group ${e.name}`,className:`icon-btn small group-menu-btn`,entries:()=>se(e,t),children:(0,H.jsx)(ue,{size:16})}),menuKey:e.key,draggable:M}),!e.collapsed&&(e.bots.length?(0,H.jsx)(`ul`,{id:`sb-${e.key}`,children:e.bots.map(t=>(0,H.jsx)(Vo,{bot:t,sectionKey:e.key,...R},t.id))}):(0,H.jsx)(`p`,{className:`group-empty`,id:`sb-${e.key}`,children:`No Botons here yet. Drag one here, or move one in from its menu.`}))]},e.key)),(T.ungrouped.bots.length>0||!F||fe)&&t.length>0&&(0,H.jsxs)(`section`,{className:`group`,"aria-label":F?`Ungrouped`:void 0,"data-drop":`ungrouped`,"data-collapsed":F&&T.ungrouped.collapsed||void 0,children:[F&&(0,H.jsx)(Bo,{section:T.ungrouped,summary:yo(T.ungrouped.bots,b),onToggle:()=>oe(T.ungrouped)}),(!F||!T.ungrouped.collapsed)&&(T.ungrouped.bots.length?(0,H.jsx)(`ul`,{id:`sb-ungrouped`,children:T.ungrouped.bots.map(e=>(0,H.jsx)(Vo,{bot:e,sectionKey:`ungrouped`,...R},e.id))}):(0,H.jsx)(`p`,{className:`group-empty`,id:`sb-ungrouped`,children:`Drop here to take it out of its group.`}))]}),t.length>0&&(0,H.jsxs)(`button`,{type:`button`,className:`new-group-btn`,onClick:()=>v({kind:`create`}),children:[(0,H.jsx)(ae,{size:15}),` New group`]})]})]}),(0,H.jsxs)(`div`,{className:`sidebar-foot`,children:[(0,H.jsx)(go,{quick:!0}),(0,H.jsx)(`span`,{className:`owner-chip`,"aria-hidden":`true`,children:p(r?.ownerName??``)}),(0,H.jsx)(`span`,{className:`owner-name`,children:r?.ownerName}),(0,H.jsx)(`button`,{className:h(`icon-btn round`,o&&`on`),"aria-label":o?`Resume all Botons`:`Pause all Botons`,title:o?`Resume all Botons`:`Pause all Botons`,disabled:c,onClick:()=>void u(),children:o?(0,H.jsx)(ce,{}):(0,H.jsx)(I,{})}),(0,H.jsx)(`button`,{className:`icon-btn round`,"aria-label":`Skills`,title:`Skills`,onClick:e.onSkills,children:(0,H.jsx)(ye,{})}),(0,H.jsx)(`button`,{className:`icon-btn round`,"aria-label":`Settings`,title:`Settings`,onClick:e.onSettings,children:(0,H.jsx)(de,{})})]}),_&&(_.kind===`delete`?(0,H.jsx)(zi,{title:`Delete ${_.name}?`,confirmLabel:`Delete group`,what:`delete ${_.name}`,danger:!0,onConfirm:()=>Q.sidebar.deleteGroup(_.groupId).then(()=>Fo(Lo(`ungrouped`),`.new-group-btn`)),onClose:()=>v(null),children:(0,H.jsxs)(`p`,{children:[_.count===0?`The group is empty.`:`Its ${_.count===1?`Boton moves`:`${_.count} Botons move`} to Ungrouped, in the same order.`,` `,`No Boton is deleted, and pins stay.`]})}):(0,H.jsx)(Uo,{dialog:_,onClose:()=>v(null)}))]})}function zo(e,t,n,r){let i=n.name,a=e.pinned.bots.map(e=>e.id),o=a.includes(n.id);if(t===`pinned`){let e=e=>{let t=So(a,n.id,e);t!==null&&C(`move ${i}`,()=>Q.sidebar.pin(n.id,!0,t)).then(()=>Fo(Io(`pinned`,n.id)))};return[{label:`Move left`,disabled:a[0]===n.id,onSelect:()=>e(-1)},{label:`Move right`,disabled:a.at(-1)===n.id,onSelect:()=>e(1)},`separator`,{label:`Unpin`,onSelect:()=>void C(`unpin ${i}`,()=>Q.sidebar.pin(n.id,!1)).then(()=>Fo(Lo(`pinned`),Io(n.groupId??`ungrouped`,n.id)))}]}let s=[...e.groups,e.ungrouped].find(e=>e.bots.some(e=>e.id===n.id))??e.ungrouped,c=s.bots.map(e=>e.id),l=e=>{let t=So(c,n.id,e);t!==null&&C(`move ${i}`,()=>Q.sidebar.moveBot(n.id,s.groupId,t)).then(()=>Fo(Io(s.key,n.id)))},u=e=>{e.key!==s.key&&C(`move ${i} to ${e.name}`,()=>Q.sidebar.moveBot(n.id,e.groupId)).then(()=>Fo(Io(e.key,n.id),Lo(e.key)))};return[o?{label:`Unpin`,onSelect:()=>void C(`unpin ${i}`,()=>Q.sidebar.pin(n.id,!1))}:{label:`Pin to top`,onSelect:()=>void C(`pin ${i}`,()=>Q.sidebar.pin(n.id,!0))},{label:`Move up`,disabled:c[0]===n.id,onSelect:()=>l(-1)},{label:`Move down`,disabled:c.at(-1)===n.id,onSelect:()=>l(1)},...e.groups.length?[{heading:`Move to group`,items:[...e.groups,e.ungrouped].map(e=>({label:e.name,checked:e.key===s.key,onSelect:()=>u(e)}))}]:[],{label:`Move to a new group…`,onSelect:()=>r(n)}]}function Bo(e){let{section:t,summary:n}=e,r=bo(n),i=t.collapsed?[t.name,t.bots.length===1?`1 Boton`:`${t.bots.length} Botons`,r].filter(Boolean).join(`, `):void 0;return(0,H.jsxs)(`div`,{className:`group-head`,...e.draggable&&t.groupId&&{"data-drag":`group`,"data-group-id":t.groupId,"data-name":t.name},children:[(0,H.jsx)(`h2`,{className:`group-title`,children:(0,H.jsxs)(`button`,{type:`button`,className:`group-toggle`,"data-section":t.key,"aria-expanded":!t.collapsed,"aria-controls":t.collapsed?void 0:`sb-${t.key}`,"aria-label":i,onClick:e.onToggle,children:[(0,H.jsx)(_e,{size:14,className:`group-chevron`}),(0,H.jsx)(`span`,{className:`group-name`,children:t.name}),t.collapsed&&(0,H.jsxs)(H.Fragment,{children:[(0,H.jsx)(`span`,{className:`group-count`,"aria-hidden":`true`,children:t.bots.length}),(0,H.jsxs)(`span`,{className:`group-summary`,"aria-hidden":`true`,children:[n.busy>0&&(0,H.jsx)(`span`,{className:`busy-count`,title:`${n.busy} working`,children:n.busy}),n.approvals>0&&(0,H.jsxs)(`span`,{className:`approval-badge`,title:`${n.approvals} waiting for your approval`,children:[(0,H.jsx)(P,{size:13}),n.approvals>9?`9+`:n.approvals]}),n.unread>0&&(0,H.jsx)(`span`,{className:`unread-badge`,title:`${n.unread} unread`,children:n.unread>99?`99+`:n.unread})]})]})]})}),e.menu&&(0,H.jsx)(`span`,{"data-group-menu":e.menuKey,className:`group-menu`,children:e.menu})]})}var Vo=(0,z.memo)(function({bot:e,sectionKey:t,selectedId:n,onSelect:r,waitingFor:i,brainRests:a,allPaused:o,primaryId:s,entriesFor:c,draggable:l}){let u=i.get(e.id)??0,d=a?a.has(e.provider)?a.get(e.provider):{kind:`none`}:null,f=!!d;return(0,H.jsxs)(`li`,{className:`bot-item`,...l&&t&&{"data-drag":`bot`,"data-bot-id":e.id,"data-name":e.name},children:[(0,H.jsxs)(`button`,{className:h(`bot-row`,e.id===n&&`selected`,e.unread>0&&`unread`),onClick:()=>r(e.id),"aria-current":e.id===n?`page`:void 0,children:[(0,H.jsx)(`span`,{className:h(`avatar-wrap`,e.status.state!==`idle`&&`busy`,(e.paused||o)&&`paused`),children:(0,H.jsx)(U,{look:e.look,size:42,seed:e.id,state:Ft(e,u,f)})}),(0,H.jsxs)(`span`,{className:`bot-row-text`,children:[(0,H.jsxs)(`span`,{className:`bot-row-name`,children:[e.id===s&&(0,H.jsx)(Wo,{}),e.name]}),(0,H.jsx)(`span`,{className:h(`bot-row-preview`,e.status.state!==`idle`&&`active`,e.lastMessage?.role===`error`&&e.status.state===`idle`&&`error`),children:Po(e,d)})]}),(0,H.jsx)(Go,{count:u}),e.unread>0&&(0,H.jsx)(Ko,{count:e.unread})]}),t&&(0,H.jsx)(`span`,{className:`row-menu`,"data-menu":`${t}:${e.id}`,children:(0,H.jsx)(jo,{label:`Options for ${e.name}`,className:`icon-btn small row-menu-btn`,entries:()=>c(t,e),children:(0,H.jsx)(ue,{size:16})})})]})}),Ho=(0,z.memo)(function({bot:e,selectedId:t,onSelect:n,waitingFor:r,brainRests:i,allPaused:a,primaryId:o,entriesFor:s,draggable:c}){let l=r.get(e.id)??0,u=i?i.has(e.provider)?i.get(e.provider):{kind:`none`}:null,d=!!u;return(0,H.jsxs)(`li`,{className:`pinned-tile`,...c&&{"data-drag":`pinned`,"data-bot-id":e.id,"data-name":e.name},children:[(0,H.jsxs)(`button`,{className:h(`pinned-item`,e.id===t&&`selected`,e.unread>0&&`unread`),onClick:()=>n(e.id),"aria-current":e.id===t?`page`:void 0,"aria-label":[e.name,u&&kn(u).toLowerCase(),e.unread&&`${e.unread} unread`].filter(Boolean).join(`, `),children:[(0,H.jsxs)(`span`,{className:h(`avatar-wrap`,e.status.state!==`idle`&&`busy`,(e.paused||a)&&`paused`),children:[(0,H.jsx)(U,{look:e.look,size:60,seed:e.id,state:Ft(e,l,d)}),e.unread>0&&(0,H.jsx)(Ko,{count:e.unread}),(0,H.jsx)(Go,{count:l})]}),(0,H.jsxs)(`span`,{className:`pinned-name`,children:[e.id===o&&(0,H.jsx)(Wo,{}),e.name]})]}),(0,H.jsx)(`span`,{className:`row-menu`,"data-menu":`pinned:${e.id}`,children:(0,H.jsx)(jo,{label:`Options for ${e.name} in Pinned`,className:`icon-btn small row-menu-btn`,entries:()=>s(`pinned`,e),children:(0,H.jsx)(ue,{size:16})})})]})});function Uo({dialog:e,onClose:t}){let[n,r]=(0,z.useState)(e.kind===`rename`?e.name:``),[i,a]=(0,z.useState)(!1),[o,s]=(0,z.useState)(null),c=e.kind===`rename`?`Rename ${e.name}`:e.moving?`New group for ${e.moving.name}`:`New group`,l=async()=>{let r=n.trim();if(!r)return s(`Give the group a name.`);a(!0),s(null);let i=await C(e.kind===`rename`?`rename ${e.name}`:`make the group ${r}`,async()=>{if(e.kind===`rename`)return void(r!==e.name&&await Q.sidebar.renameGroup(e.groupId,r));let t=await Q.sidebar.createGroup(r);e.moving&&await Q.sidebar.moveBot(e.moving.id,t)},s);a(!1),i&&t()};return(0,H.jsx)(Ri,{title:c,onClose:()=>!i&&t(),children:(0,H.jsxs)(`form`,{className:`group-name-form`,onSubmit:e=>{e.preventDefault(),l()},children:[(0,H.jsxs)(`label`,{children:[(0,H.jsx)(`span`,{className:`field-label`,children:`Name`}),(0,H.jsx)(`input`,{"data-autofocus":!0,value:n,onChange:e=>(r(e.target.value),s(null)),maxLength:40,placeholder:`Work`,"aria-invalid":!!o||void 0,"aria-describedby":o?`group-name-error`:void 0})]}),o&&(0,H.jsx)(`p`,{className:`form-error`,id:`group-name-error`,role:`alert`,children:o}),(0,H.jsxs)(`div`,{className:`form-actions`,children:[(0,H.jsx)(`button`,{type:`button`,className:`btn ghost`,onClick:t,disabled:i,children:`Cancel`}),(0,H.jsx)(`button`,{type:`submit`,className:`btn primary`,disabled:i,children:i?`Saving…`:e.kind===`rename`?`Rename`:`Make group`})]})]})})}function Wo(){return(0,H.jsxs)(`span`,{className:`primary-star`,title:`Primary Boton`,children:[(0,H.jsx)(pe,{size:13}),(0,H.jsx)(`span`,{className:`sr-only`,children:`Primary Boton: `})]})}function Go({count:e}){if(!e)return null;let t=`${e} waiting for your approval`;return(0,H.jsxs)(`span`,{className:`approval-badge`,title:t,children:[(0,H.jsx)(P,{size:13}),(0,H.jsx)(`span`,{"aria-hidden":`true`,children:e>9?`9+`:e}),(0,H.jsx)(`span`,{className:`sr-only`,children:t})]})}function Ko({count:e}){return(0,H.jsxs)(`span`,{className:`unread-badge`,title:`${e} unread`,children:[(0,H.jsx)(`span`,{"aria-hidden":`true`,children:e>99?`99+`:e}),(0,H.jsxs)(`span`,{className:`sr-only`,children:[e,` unread`]})]})}var qo=Bi(()=>Qi(()=>import(`./NewBotDialog-DXr2XhDP.js`),__vite__mapDeps([5,1,2,4,6,7,8]))),Jo=Bi(()=>Qi(()=>import(`./PairScreen-CMcJO7cQ.js`),__vite__mapDeps([9,1,2,4]))),Yo=Bi(()=>Qi(()=>import(`./Panel-Bvqz3I3m.js`),__vite__mapDeps([10,1,2,4,11,7,12,6,8]))),Xo=Bi(()=>Qi(()=>import(`./SettingsDialog-CQ41LV-P.js`),__vite__mapDeps([13,1,2,4,11,12,7,6,8,3]))),Zo=Bi(()=>Qi(()=>import(`./Setup-C-3P7Mtn.js`).then(e=>e.i),__vite__mapDeps([6,2,1,4,7]))),Qo=Bi(()=>Qi(()=>import(`./Skills-DXMH69kH.js`),__vite__mapDeps([14,1,2,4,7,6])));function $o(){let e=/^#\/m\/([\w-]+)/.exec(location.hash);return e?e[1]:null}var es=`(max-width: 1119px)`;function ts(e){let t=(0,z.useCallback)(t=>{let n=window.matchMedia(e);return n.addEventListener(`change`,t),()=>n.removeEventListener(`change`,t)},[e]);return(0,z.useSyncExternalStore)(t,()=>window.matchMedia(e).matches)}function ns(){let e=K(e=>e.ready),t=K(e=>e.loadError),n=K(e=>e.pairing),r=K(e=>e.connected),i=K(e=>e.updated),o=K(e=>e.bots),s=K(e=>e.setup?.completed??!0),[c,l]=(0,z.useState)($o),[u,d]=(0,z.useState)(null),[f,p]=(0,z.useState)(null),[m,g]=(0,z.useState)(void 0),_=ts(es);(0,z.useEffect)(()=>{let e=new URLSearchParams(location.search),t=e.get(`connector`),n=e.get(`signin`);t&&n&&(history.replaceState(null,``,`${location.pathname}${location.hash}`),a(n===`connected`?{kind:`info`,text:`${t} is connected.`}:{kind:`error`,text:`Signing in to ${t} didn't complete. Try again in Settings.`},8e3),p(`settings`))},[]),(0,z.useEffect)(()=>{let e=()=>l($o());return window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[]);let v=(0,z.useCallback)(e=>{location.hash=e?`/m/${e}`:``,l(e)},[]),[y,b]=(0,z.useState)(c);y!==c&&(b(c),u&&(!c||_)&&d(null)),(0,z.useEffect)(()=>{if(!u)return;let e=e=>{e.key!==`Escape`||e.defaultPrevented||e.isComposing||document.querySelector(`dialog[open]`)||e.target?.closest?.(`input, textarea, select, [contenteditable="true"]`)||d(null)};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[u]);let x=e=>{d(null),v(e)},ee=e=>{p(null),v(e),b(e),d({tab:`settings`,focus:null,at:Date.now()})},S=o.find(e=>e.id===c)??null,C=K(e=>e.settings?.primaryBotId??null);(0,z.useEffect)(()=>{e&&!S&&o.length&&window.matchMedia(`(min-width: 800px)`).matches&&v(o.find(e=>e.id===C)?.id??o[0].id)},[e,S,o,C,v]);let w=o.reduce((e,t)=>e+t.unread,0),T=S?.name;return(0,z.useEffect)(()=>{document.title=`${w?`(${w}) `:``}${T?`${T} · `:``}Botons`},[w,T]),n?(0,H.jsx)(Ki,{part:Jo,what:`the pairing screen`,children:e=>(0,H.jsx)(e.PairScreen,{status:n})}):t?(0,H.jsxs)(`div`,{className:`boot`,children:[(0,H.jsx)(Jt,{size:48}),(0,H.jsxs)(`p`,{children:[`Couldn't load Botons: `,t]}),(0,H.jsx)(`button`,{className:`btn primary`,onClick:()=>Q.init(),children:`Retry`})]}):e?s?(0,H.jsxs)(`div`,{className:h(`app`,S&&`has-bot`,u&&S&&`has-panel`),children:[!r&&(0,H.jsx)(`div`,{className:`offline`,children:`Reconnecting to the server…`}),r&&i&&(0,H.jsxs)(`div`,{className:`offline updated`,role:`status`,children:[`Botons was updated.`,` `,(0,H.jsx)(`button`,{className:`link-btn`,onClick:()=>location.reload(),children:`Reload`})]}),(0,H.jsx)(Ro,{selectedId:c,onSelect:v,onNew:e=>(g(e),p(`new`)),onSettings:()=>p(`settings`),onSkills:()=>p(`skills`)}),S?(0,H.jsx)(Ua,{bot:S,covered:!!u&&_,onOpenPanel:(e,t)=>d({tab:e,focus:t??null,at:Date.now()}),onOpenBot:x,onBack:()=>v(null)}):(0,H.jsx)(`main`,{className:`chat empty-main`,children:(0,H.jsxs)(`div`,{className:`welcome`,children:[(0,H.jsx)(`div`,{className:`welcome-crowd`,children:o.length?o.slice(0,5).map(e=>(0,H.jsx)(U,{look:e.look,size:64,seed:e.id},e.id)):(0,H.jsx)(U,{look:Xe,size:96,seed:`empty`})}),(0,H.jsx)(`h1`,{children:o.length?`Pick a Boton`:`Meet your Botons`}),(0,H.jsx)(`p`,{className:`welcome-copy`,children:o.length?`Each Boton is an agent with its own chat, routines and memory, running on this computer.`:`No Botons yet. Make your first one and give it a job.`}),(0,H.jsxs)(`button`,{className:`btn primary`,onClick:()=>(g(void 0),p(`new`)),children:[(0,H.jsx)(ae,{size:16}),` New Boton`]})]})}),S&&u&&(0,H.jsx)(Gi,{part:Yo,label:`${S.name} details`,onClose:()=>d(null),children:e=>(0,H.jsx)(e.Panel,{bot:S,tab:u.tab,focus:u.focus,focusAt:u.at,onTab:(e,t)=>d({tab:e,focus:t??null,at:Date.now()}),onClose:()=>d(null),onOpenBot:x,onDeleted:()=>x(null)})}),f===`new`&&(0,H.jsx)(Wi,{part:qo,title:`New Boton`,onClose:()=>p(null),children:e=>(0,H.jsx)(e.NewBotDialog,{groupId:m,onClose:()=>p(null),onCreated:e=>{p(null),x(e.id)}})}),f===`settings`&&(0,H.jsx)(Wi,{part:Xo,title:`Settings`,onClose:()=>p(null),children:e=>(0,H.jsx)(e.SettingsDialog,{onClose:()=>p(null),onOpenBot:ee})}),f===`skills`&&(0,H.jsx)(Wi,{part:Qo,title:`Skills`,onClose:()=>p(null),children:e=>(0,H.jsx)(e.SkillsDialog,{onClose:()=>p(null)})}),(0,H.jsx)(Ti,{}),(0,H.jsx)(xi,{page:!0})]}):(0,H.jsx)(Ki,{part:Zo,what:`setup`,children:e=>(0,H.jsx)(e.SetupWizard,{onDone:e=>e&&v(e)})}):(0,H.jsxs)(`div`,{className:`boot muted`,role:`status`,children:[(0,H.jsx)(Jt,{size:48}),`Loading…`]})}var rs=class extends z.Component{state={error:null};static getDerivedStateFromError(e){return{error:e instanceof Error?e:Error(String(e))}}componentDidCatch(e,t){console.error(`[Botons] the page failed to render`,e,t.componentStack)}render(){let{error:e}=this.state;return e?(0,H.jsxs)(`div`,{className:`boot crash`,role:`alert`,children:[(0,H.jsx)(Jt,{size:48}),(0,H.jsx)(`h1`,{children:`Something went wrong on this page`}),(0,H.jsx)(`p`,{className:`muted`,children:`Your Botons are fine; this is only the web page. Reloading usually fixes it.`}),(0,H.jsx)(`pre`,{className:`code crash-detail`,children:e.message}),(0,H.jsx)(`div`,{children:(0,H.jsx)(`button`,{className:`btn primary`,onClick:()=>location.reload(),children:`Reload`})})]}):this.props.children}};function is(){let e=document.documentElement,t=window.visualViewport,n=0,r=()=>{n=0,t&&t.scale!==1||(e.style.setProperty(`--app-height`,`${t?.height??window.innerHeight}px`),(window.scrollX||window.scrollY)&&window.scrollTo(0,0))},i=()=>{n||=requestAnimationFrame(r)},a=[[window,`resize`],[window,`orientationchange`],[window,`pageshow`],[document,`visibilitychange`],[document,`focusout`],...t?[[t,`resize`],[t,`scroll`]]:[]];for(let[e,t]of a)e.addEventListener(t,i);return r(),()=>{cancelAnimationFrame(n);for(let[e,t]of a)e.removeEventListener(t,i);e.style.removeProperty(`--app-height`)}}is(),Rt(),Q.init(),(0,ke.createRoot)(document.getElementById(`root`)).render((0,H.jsx)(z.StrictMode,{children:(0,H.jsx)(rs,{children:(0,H.jsx)(ns,{})})}));export{Yt as A,In as C,zn as D,Pn as E,Ye as F,ct as I,at as L,U as M,ut as N,Ln as O,st as P,Rn as S,gn as T,Q as _,_a as a,Fn as b,Vi as c,Ii as d,Fi as f,Kr as g,gi as h,ga as i,zt as j,Jt as k,zi as l,hi as m,go as n,Qi as o,Pi as p,va as r,Bi as s,jo as t,Ri as u,Vn as v,Sn as w,jn as x,K as y};
|