@soba-so/react 0.0.20 → 0.0.22

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/dist/index.mjs CHANGED
@@ -1,8 +1,8 @@
1
1
  "use client"
2
- import{useEffect as Ns,useRef as xs,useState as At}from"react";var yn=class extends Error{status;constructor(n,t){super(n),this.name="ConnectError",this.status=t}},hs=5*6e4,Tn=class{session;baseUrl;doFetch;lastMachines=null;machinesUrl=null;gatewayBackUntil=0;constructor(n){this.session=n.session,this.baseUrl=(n.baseUrl??"").replace(/\/+$/,""),this.doFetch=n.fetchImpl??fetch.bind(globalThis)}async context(){let n=await this.request("GET","/v1/connect");return this.setMachinesUrl(n.machines_url),n}setMachinesUrl(n){typeof n=="string"&&/^https?:\/\//.test(n)&&(this.machinesUrl=n)}async machines(){let n=this.lastMachines,t=n?`?v=${encodeURIComponent(n.version)}`:"",r;if(this.machinesUrl&&Date.now()>=this.gatewayBackUntil)try{r=await this.request("GET",`${this.machinesUrl}${t}`)}catch(s){if(s instanceof yn&&s.status===401)throw s;this.gatewayBackUntil=Date.now()+hs}if(r??=await this.request("GET",`/v1/machines${t}`),r.unchanged&&n)return n.machines;let o=Array.isArray(r.machines)?r.machines:[];return this.lastMachines=typeof r.version=="string"?{version:r.version,machines:o}:null,o}async runs(){let n=await this.request("GET","/v1/machines/runs");return Array.isArray(n.runs)?n.runs:[]}async stopRun(n){let t=this.machinesUrl?.replace(/\/v1\/machines$/,"");if(!t)throw new yn("This page can't stop runs yet: it hasn't been told where Soba's gateway is.",501);await this.request("POST",`${t}/v1/runs/${encodeURIComponent(n)}/stop`,{})}lookup(n){return this.request("GET",`/v1/device/lookup?code=${encodeURIComponent(n)}`)}approve(n){return this.request("POST","/v1/device/approve",{user_code:n})}claim(n){return this.request("POST","/v1/device/claim",{pairing_nonce:n})}deny(n){return this.request("POST","/v1/device/deny",{user_code:n})}plans(){return this.request("GET","/v1/plans")}selectPlan(n){return this.request("POST","/v1/plans/select",{plan:n})}checkoutPlan(n,t){return this.request("POST","/v1/plans/checkout",{plan:n,...t?.successUrl?{success_url:t.successUrl}:{},...t?.cancelUrl?{cancel_url:t.cancelUrl}:{}})}leavePlan(){return this.request("DELETE","/v1/plans/select")}hosted(){return this.request("GET","/v1/hosted")}startHosted(){return this.request("POST","/v1/hosted/start")}disconnectHosted(n){return this.request("DELETE",n?`/v1/hosted?provider=${encodeURIComponent(n)}`:"/v1/hosted")}approveRuntime(n,t){return this.request("POST","/v1/runtimes/approve",{machine_id:n,runtime_id:t})}preferRuntime(n,t){return this.request("POST","/v1/runtimes/prefer",{machine_id:n,runtime_id:t})}async request(n,t,r){let o=await this.doFetch(/^https?:\/\//.test(t)?t:`${this.baseUrl}${t}`,{method:n,headers:{authorization:`Bearer ${this.session}`,...r?{"content-type":"application/json"}:{}},...r?{body:JSON.stringify(r)}:{}}),s={};try{s=await o.json()}catch{}if(!o.ok){let a=typeof s.error=="string"?s.error:`Request failed (${o.status})`;throw new yn(a,o.status)}return s}};function Bn(e){let n=/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(e.trim());if(!n?.[1])return"#ffffff";let t=n[1].length===3?[...n[1]].map(s=>s+s).join(""):n[1],r=s=>{let a=Number.parseInt(t.slice(s*2,s*2+2),16)/255;return a<=.04045?a/12.92:((a+.055)/1.055)**2.4};return .2126*r(0)+.7152*r(1)+.0722*r(2)>.45?"#101012":"#ffffff"}function Tt(e){let n=/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(e.trim());if(!n?.[1])return null;let t=n[1].length===3?[...n[1]].map(r=>r+r).join(""):n[1];return[0,1,2].map(r=>Number.parseInt(t.slice(r*2,r*2+2),16))}function bn(e,n,t){let r=Tt(e),o=Tt(n);return!r||!o?e:`#${r.map((a,l)=>Math.round(a+(o[l]-a)*t)).map(a=>a.toString(16).padStart(2,"0")).join("")}`}function rn(e,n){if(!Tt(e))return{};let t=Bn(e),r=n?.trim();return{"--sc-ground":e,"--sc-shell":e,"--sc-sheet":bn(e,t,.07),"--sc-raised":bn(e,t,.13),"--sc-line":bn(e,t,.18),"--sc-line-2":bn(e,t,.28),"--sc-text":t,"--sc-text-2":bn(t,e,.15),"--sc-muted":bn(t,e,.38),...r?{"--sc-accent":r,"--sc-accent-fg":Bn(r)}:{"--sc-accent":t,"--sc-accent-fg":e}}}function Gn(e){return e.authenticated===!0?{tone:"ok",text:"signed in"}:e.authenticated===!1?{tone:"warn",text:e.auth_hint??"signed out on that machine"}:{tone:"unknown",text:"could not tell"}}function Wn(e){let{platform:n,arch:t}=e;if(!n)return null;let r=n==="darwin"||n==="macos",o=r?"Mac":n==="win32"||n==="windows"?"Windows PC":"Linux machine";return r?`${t==="aarch64"||t==="arm64"?"Apple silicon ":""}${o}`:o}function on(e){return e.find(n=>n.state==="offline")??null}function Bt(e){return e.state==="busy"?{tone:"busy",text:`serving ${e.active} of ${e.capacity}`}:e.state==="online"?{tone:"ok",text:"connected"}:{tone:"off",text:"asleep or offline"}}function _(e){let n=e.label?.trim(),t=e.name?.trim();return n&&(!t||n!==t)?n:(t??n??"").replace(/\.(local|lan|home|internal)$/i,"").replace(/[-_]+/g," ").trim()||n||"This machine"}function mt(e,n){let t=o=>o.state==="busy"?0:o.state==="online"?1:2,r=o=>o.last_seen_at?Date.parse(o.last_seen_at):0;return t(e)-t(n)||r(n)-r(e)}function Ie(e){return[...e].sort(mt)[0]??null}function sn(e){return e?e.state==="busy"?{tone:"busy",word:"Serving"}:e.state==="online"?{tone:"ok",word:"Connected"}:{tone:"off",word:"Asleep"}:{tone:"off",word:"No compute"}}function wn(e){let n=sn(e);return{label:e?n.word:"Connect compute",ariaLabel:e?`${n.word} on ${_(e)}`:"Connect compute",connected:e!==null,state:n}}function Gt(e){return e.state==="online"||e.state==="busy"}function Hn(e){if(!e)return"never seen";let n=Date.parse(e);if(Number.isNaN(n))return"never seen";let t=Date.now()-n,r=6e4;return t<2*r?"just now":t<60*r?`${Math.floor(t/r)} min ago`:t<24*60*r?`${Math.floor(t/(60*r))} hr ago`:`${Math.floor(t/(24*60*r))} days ago`}function Wt(e,n){let t=r=>r.absent?2:r.quarantined?1:0;return t(e)-t(n)||e.display_name.localeCompare(n.display_name)}function Ht(e){return e.runtimes.filter(n=>n.id!=="shell")}function ye(e){return e.runtimes.filter(n=>n.id!=="shell"&&!n.quarantined&&!n.absent)}function Ge(e){let n=a=>a?e.runtimes.find(l=>l.id===a)??null:null;if(e.requested_runtime)return{by:"app",runtimeId:e.requested_runtime,runtime:n(e.requested_runtime)};let t=ye(e),r=t.find(a=>a.id===e.preferred_runtime);if(r)return{by:"you",runtimeId:r.id,runtime:r};let o=a=>a.id==="claude-code"?0:a.id==="codex"?1:2,s=[...t].sort((a,l)=>o(a)-o(l))[0]??null;return{by:"default",runtimeId:s?.id??null,runtime:s}}var Dt={"claude-code":"data:image/png;base64,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",codex:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAARGVYSWZNTQAqAAAACAABh2kABAAAAAEAAAAaAAAAAAADoAEAAwAAAAEAAQAAoAIABAAAAAEAAABAoAMABAAAAAEAAABAAAAAAEZRQrAAAAHLaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT4xPC9leGlmOkNvbG9yU3BhY2U+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4yNTY8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MjU2PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CuYattQAAA5sSURBVHgB7Zrbj1xHtYfX7u4Zj+/jOLHBiYnJAXKBgIkCJAGBELcX4MADEejonIfzghD/yPkHeOEFCSEkbkJCXIO4mEASASEEbEJsbGznZsf3u2emu/f5vtW7Om1DPN32JH4Yl1WzqmrXrr1+v1q1alW1q5oUyzi1ljH2hH6DgBsWsMwZuLEElrkBxLK3gM7rZQF9oo1urw6lqVVFdNpKCtcxveYEnL5Qx5nzERcvVtFbqKLfH6BtYXtT03XMzNSxZmXEmpkqrgcXrxkB5+bqOHg44vwpgENAdyGi14Cvm0lvtytIiJheFbF6fR1v3Dgg4vU0iOq1CIVfPF7HP/ZFtE9X0Z2L6AO4hbkHMmcZ6UowCC8WMb2CJTEbsfW2OjYju5DlM7nSWjrktutmidOSE3DgcD92/rkV6+YbcCgu6AqZaBoMWsGQBAq93gDoqs0RGzbWsXChigWsRqNpY6fTMxGrVtcxuyZiFouplmi9LCkBR0734ze/aMWmLlqPAE7w4hd8QwClAQFIQaaTtECSmDnAawVmuMnxXCprboq46ZY63npbxPpVI4PZ5yrSkhHQBcGPfx6x8nAVqzDn4Ww3oAv40YlLX+AyoLvmniRY1yJo02ewcUSXPE/DRfIC5SmIWL8p4r576tiGvIRVqxOkJXOCew/WcXZfKzau5+somuAAn3PEH+uFBPWz7DPwRMs/JmSHLAGWqybrK2yf4gWJOXs24vS5iGPHq/jwA3W8ZQsPR02L2rhJQ12CVMczf61iFgUXMP8uWvaQo7lPvS5ZgiyLpskVslUyM98mt0ZyRTkzWNto7dI4fjzikUerOHxSAq4uXTMBZy/WsfslZv9MFW08vQQUErpNubRlO22FGElJYhoSJKQG2JAUy6WO9FnJWpC7y7ETEb98gt3GtXIV6aqXwIV5Zv25iMPPVzH3UhWrMUu2/jTnS0wdpYq5u4uZrRepzlSHSRgugdwiKYsrM+AbnlIKPvtORezeW8Weu/px9zaHGR3N+pXTVRHgPv+rp6o4+0/W5WkydmRYq2km2Ea5AlwVEnyRPC/10kdZkuDT+dGgA9TxwXewMUSXfpkpS4hE+OypXVXceftgXJrHThMSUMeBI3V8m61u4SAen1mZZgZUsIM2rlknIMEoGzWsu9bMBH+DsrIpI7LcdB/MLGNKgqAFSFgxyHReYKAhEfYDxcHndYzGCY42fpqIgONnIr7x81ac3EdQwndq1zzAOwBPYCiWM+ozsqpk5k8hYChp4/UErrfPJaHevkDKrZB23MSQAILKmGcACe8qqeey4PunOGscwxnOruFhGYTSYmlsAvpo9IPHIw7sJW5nVAK1NE/BdwRopj2BWCCJJQlBp7KlZR/aL5f2tS2tB+kyEHwuASTnqLSABO8zvqsVpJVQr2HjHFvjpGlsAvbi6R97GhX52BxC5lXQAdq0FQKKJayCpTUELOc9CV7gNRSWBN93qSQ5VJMI2ygnWUhTOkHaJUCgEmC2ngGSZfoVAtxC6wwgeDBBGosAfzr47c4qzgFkJW+okCYOjughBa8DNHvo2XxLxCcejLiVKO2FlyN+8UTE0aMDs84FroIAudwqsq1RvhCQJk5bzjbf8Xs9vpOyIWMBReA6ZjhZ0jTBAhhMYPPJVxdnONPv2s8+D/iarOctybKzXqOUPsE+d7014u43D3qsQ56CuEcew4SxhtzimpcFmSRYt4xIK0EaGgvGGU6iLdvOd0o9Jc/nMQXPCbMcqSdlAHUXT0dPEXUZ6Bjjo0ChWAVVWqU88FQNAdmH9tSUDvdCwq4DEXv2D0AIJAMepYOYSYLPIsiSKCpKc4KnT5+CwO2X5FDw1HiYb794oorNN/NggiScRVIdJ85wPOXDLegyt9n6zBU5MLtQjuQ9XIS4YyQRKLiaG5/33IWJ4hf6vN9H2R6522S3NbMe3u1Ob5+Zdw2uzB6GSkQ5D2CzwOd5wcjy2MmIr/2sHYdP0HmCNAYBg4/ltiYBADULvuTSJjkV+Qje+KmDzeyqDDrdeWvEHVspSxR9XC6S4ZLKZWUdbSTlkn2e7jq7EhC53t0BnBBNP8NtyobUz+6J+PYOr93GJ2EsAlagZHp5JQoWoGkR1i9rk6ydL0YcYlaKFazAUt53JzsDFxoSUMgbWk5DhMQYICRBSK1F/6LF6G80f00/7wmoeJGSy8IHWMOOJ6vY/cISEuAa3bCWy0sUdMGXmx3X+yUZJSVkEN1EnMTxPfncYIZoBQUWwK6wdTPv0U+rKUspLQqCJGW0PCSJ/n5LUtLZokfxQ+IWbjpU5MljEY/upJCtyisnVV4kVXnG37yujhfmq+iMvOGHh4ELSllXMaVe/CgHJM20o/OkcQoAq7jakqTEkC8Amr72d5b1dsOjL20ek62Xo3QZv3k1x7GcDpRCxfd2cjg6xyl1NTfNi6UROP++qwBXMtC73tyPA39pR9+1T1tuX0jNUpPXNm0XiNVpRr7njQBuwNt4km3wEDvK6BVZAuEdgymBpslTdkYdS/PWzNPa9BEuWjNAc2vwYyTHycw7Lx+r4vjZPgTY0nSw079JixLgOxVffM/dvfjds3WcJBwz9M1tz2dNOU0z+6IIM3kbd3f3bvHtV9If9rNdQYA6+Z63vZYzfG66lW1R1SXAy5V5tgSv1ZM43jEQSkIgQQvJ2IByxie8OIcvOAXZW5sxryTGIsDr6M0bq/jo9l5854lOzANQpQsQI8DhzKH0Omb9gTuwHGefujP2PLc3v98LGIBk4v0Znm+/HUUhK8drHhUhCRKw5xC7yr4m1pcwvq/3d1xDYAmQlJS+RB+tZpw0FgHOVhuUD72jGy8c68evn2kNnI7KNAoZAbofK7dti3gbzi7BI1Rmx9+ZfUgwOZPeAwr+s++mTP1K6X76uf39cffAzDX/tEBBN2X1MDx2GU3jUA2Lx0ljEeBAHb6weqYVH3pnL3Y81YrzzKSKm70KcwfI3/rwERtwdJbL7O88yI7wj4EpJ3je6aDgFn4ASfBayRXSFGNv2UBfv0PfXCb0V3nNXuBlCJ3leo7Es6tq+i3+cxuqjJe0gmmufk6facXLL7LOCHbm8PIXyRcoF3mB+tN7me0mBjAW+OEfiAy5u3MtG7kZwc1dxFs/h1kb8qmFmW/8S6b9BOvZZVCA20d90gqQkpjEUtYh3/6GOtaN+ZvB2BaAaplOcAUmyBkoL2aoQ3J2rLu3//WZiP8jFL6dXeD5I4MTocrnDNLPZWL5yWfZGRhr683M5giIJKH5ngHPfk6S/s6ouZfAx7OEO0Rxmm4Blo0x7n9bn12olSQ1w7yqmJiAPI87iwzpLDhzlxMhuL9B1N9Y9y6PXCLIJIAvZhtynmDpaYjaCWmlnzLHdGxSHooasGVbVJbb4SxLBOR4Vrjj1jq2/4dMNAMMhnnVvxMT4MFGR9NF+WKKQ4ULGYBIEy2grZcyX5SIISlaTdOmH7E9CVX/BsMQLLgK+JzxhggdgNaxgl3l0+/vcS3Wwjm/RgTcgjNy+zrH2nbtodMg+T0JKHKEDAELqlhAIWPYNkJOEtO8OyTAj5CTiKZcTF4pKVPo9JkP9GL7W2r0ao9rAOlIGwSLC9fYG/jl9tYt/CbwMkhRXH1SifI6zUmCRFgWvAALIc1sJ3jbCvhG5jmhEOAQjkMSvMVc89lgBZ+A2EAc8ZkP9uJj9/ViBbG6O9a4CXUmSVV61wfu78euP7czfE3wxRkxVCFEb1yISJMG1JCQBmBaxuUENGRl3zKGKjJwgeUvSG5/K9cRbd5Zxycf7BKqUyf+nkpv6gvjpYkIEJC/y3/0wV786JF2HNlPXWCidj2imDOSpBRtqQ6JyPepAzLH4t2yPIolXGItjuU7SpJSC1hPkLV9ex3vJTy/d1s/buK3gBWctASf38re4/2ZiACH9FywbXM/Hv5sL77yFZCU0FZH1BDheX1oqryT5QZFAV5kWRopJaZYh3LwwUsI8CLkwQ/048v/uRAz/Fw8TcQl8DT7wpTvjZkmJkBF2/z5FGtu33NV/PB7rVwKYs/THAq6XtMzIwTvs8GfBpTgUPYSsLQ5dhKBNLZ3KRcSHCLHZMt87z39mF3NEsR8PKdMOus5VvNnYgJ8z3PBGsLdL36ui5Kd+NH3W9Fj388zueAlAaF3zqWBzF9+k4lXgBcCPElazguPxgdIRJ7uRmbVCPLd99fx/u2G2gPwfOGa0lURIONTkLBxbTu+9PlubHtTK77z3U4c3EV8YGjL85x5iTB6I7tP54wKVJXp45bnTuJJ0lhAwtKK6CMBbqtpAvR1jLWs/f/5XC82sObH3ecZ4Yrpmv6LjAovEKvOsTD3H61jx+/b8fjvWvHP3VWc4WpqnnjfmTc8XstWdZofSeaJ/HR8JonMwEdJH6/APFpnm+DtxzND3vZaLO7LvfjCx7mew+F1/DFiCdI1EeD3nWn/c4JEzBOoexHxEv915dBRSCDOF+Q6LkJv3tiPn/6yHd/6ajsuEtvnfSAAy7rPKFACbMMa3A0E78yv3hTx3//bi4c/0mfpAV5vvwTgHeKaCSh6aA09toH877BU+jDjv/wI6krUeX7n/snjrfjm1zux90+Qx5nCo25H4I00ENL0Xf9twu677qvjvx7uxkNvr3OfH/eQU/RaTC4ZAcMPAVTYg6v5AQE5lbR2OUnNccVzkOXya5bLY4+24gDL5RwXJRIoCdP8eDJ7S8Qdd+PsiDceemc/Nq17Zbu7Fo8/1HGksPQEjAx+ebEsl67LhYV9mgPVIe4JjrBkzp0fbGfruYLfRLi9iShvzQruH3EKznrrGre7y3Up9deVgPJRiSjLpcfU++uzbSYjTT28+7v/l/ha9/nBqK/+97oQMKqOwDMXfwF4HdxSm/roN0fL152AUWWuR9nddlmnGwQs6+kH/A0LuGEBy5yBZb8E/h81Y99qUvR12AAAAABJRU5ErkJggg==",ollama:"data:image/png;base64,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","cursor-agent":"data:image/png;base64,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",antigravity:"data:image/png;base64,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",opencode:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAQKADAAQAAAABAAAAQAAAAABGUUKwAAACRUlEQVR4Ae2bzWoCQQzHs1+K4kEsVbwIFuyxSH0goTehD1B8jYLHgg9k74JU8AGkFy/WXbsRFsTClkmMs+wkUFQ0k+SXv5nZbevdNZtHcNh8h2s/la4AVAGOE9CvgOMCAFWAKsBxAiG3/uPR7kHS8zxWCWwAvm93jHAbQAaAgZH++2wGD/0+qwtU56/1Gl4nE8hyoaxDBpAFex6N4HEwyF7e9LHZarHjsfX7s9+zk6AucI3YbADU5IvipwCK0glbeTivAPYukNc53J72zCFZqVRO221eHM57ogB2ux28jMew2WwgCM1CxYcD9Ho9+JjPodFocGrM9TXLKnepv2+iAlarFSyXSwgNARxSAKgeXEPSRAFg4lh4FEXGAPCUaQqNAsr5IagAKLIpk4/4DMAhlv2YgKP4mKyffVYcAA5A3MtNBxreZ0BfaRMFgJP8aTiEdqcDQRAY1RLHMXS7XdFDECYkCgADVKtVqNVqJADoK23iALLvMj6aWOZn4kP5rG6DFGpl8lEFlKmblFpUARRqZfJRBZSpm5RaVAEUamXycV4B4tcCSZIAXtmZGvqgr7SJAsDL4fb9PYTppbBveDmcpABa6W9/cQ1JEwVQr9fhbTpl5S99U0QUAHYP7wYV2ZwfggqgyPK8RW6qAC7lyOKQu0Zs9i7wuVjA93bL5Ujyxz+T45rH/Z8h6YPKfwWa3m2+XI+tgFscVy+TPn/NbQAbADeB82JsPNddwAb1IsVUBRSpGzZyUQXYoF6kmKqAInXDRi7OK+AXu4OD+Y9GPOkAAAAASUVORK5CYII=",grok:"data:image/png;base64,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",huggingface:"data:image/png;base64,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"};import{useEffect as io,useRef as gs}from"react";import{Fragment as bs,jsx as Ne,jsxs as Ut}from"react/jsx-runtime";function Dn({anchor:e,label:n,options:t,current:r,onClose:o,onPick:s}){let a=gs(null);return io(()=>{let i=a.current,c=e.current;if(!i||!c)return;try{typeof i.showPopover=="function"&&i.showPopover()}catch{}let u=c.getBoundingClientRect(),p=i.offsetWidth,f=i.offsetHeight,g=Math.max(8,Math.min(u.right-p,window.innerWidth-p-8)),m=u.bottom+6,y=m+f>window.innerHeight-8&&u.top-6-f>8?u.top-6-f:m;i.style.left=`${Math.round(g)}px`,i.style.top=`${Math.round(y)}px`,i.querySelector('[aria-checked="true"]')?.focus()},[e]),io(()=>{let i=c=>{let u=c.target;!u||a.current?.contains(u)||e.current?.contains(u)||o()};return document.addEventListener("pointerdown",i,!0),()=>document.removeEventListener("pointerdown",i,!0)},[e,o]),Ne("div",{ref:a,role:"menu","aria-label":n,className:"sc-menu",popover:"manual",onKeyDown:i=>{let c=[...a.current?.querySelectorAll("[role=menuitemradio]")??[]],u=c.indexOf(document.activeElement);if(i.key==="Escape")i.stopPropagation(),i.nativeEvent.stopImmediatePropagation(),o(),e.current?.focus();else if(i.key==="ArrowDown"||i.key==="ArrowUp"){i.preventDefault();let p=i.key==="ArrowDown"?1:-1;c[(u+p+c.length)%c.length]?.focus()}else i.key==="Tab"&&o()},children:t.map(i=>Ne(fs,{option:i,checked:r===i.id,onClose:o,onPick:s},i.id??""))})}function fs({option:e,checked:n,onClose:t,onPick:r}){return Ut(bs,{children:[e.heading?Ne("div",{className:"sc-menu-head",role:"presentation",children:e.heading}):e.rule?Ne("div",{className:"sc-menu-sep"}):null,Ut("button",{type:"button",role:"menuitemradio","aria-checked":n,className:"sc-menu-item",onClick:()=>n?t():r(e.id),children:[e.glyph,Ut("span",{className:"sc-menu-text",children:[Ne("span",{className:"sc-menu-label",children:e.label}),e.note&&Ne("span",{className:"sc-menu-note",children:e.note})]}),n&&Ne(As,{})]})]})}function As(){return Ne("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:"sc-menu-check",children:Ne("path",{d:"M5 12.5l4.5 4.5L19 7.5",fill:"none",stroke:"currentColor",strokeWidth:"2.2",strokeLinecap:"round",strokeLinejoin:"round"})})}function Cn({open:e}){return Ne("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e?"sc-chev sc-chev-open":"sc-chev",children:Ne("path",{d:"M9 6l6 6-6 6",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}import{jsx as we,jsxs as ws}from"react/jsx-runtime";function X({className:e}){return ws("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e,children:[we("path",{d:"M18.125 7.039A8.6 8.6 0 1 0 18.125 16.961A6 6 0 0 1 18.125 7.039Z",fill:"currentColor"}),we("path",{d:"M19.925 7.039A8.6 8.6 0 0 1 19.925 16.961A6 6 0 0 0 19.925 7.039Z",fill:"currentColor"})]})}function lo({className:e}){return we("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e,children:we("path",{fill:"currentColor",d:"M17.3041 3.541h-3.6718l6.696 16.918H24Zm-10.6082 0L0 20.459h3.7442l1.3693-3.5527h7.0052l1.3693 3.5528h3.7442L10.5363 3.5409Zm-.3712 10.2232 2.2914-5.9456 2.2914 5.9456Z"})})}function an({className:e}){return we("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e,children:we("path",{fill:"currentColor",d:"M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z"})})}function ht({className:e}){return we("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e,children:we("path",{d:"M4 5h16v11H4zM9 20h6M12 16v4",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function ys({className:e}){return we("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e,children:we("path",{d:"M5 7l5 5-5 5M12 18h7",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function Ft({className:e}){return we("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e,children:we("path",{d:"M5 6h14v10H5zM2.5 19.5h19",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}var Ye={claude:lo,chatgpt:an,local:ht},co={shell:ys};function po(e,n){return n<2*6e4?e:n<10*6e4?Math.max(e,6e4):n<30*6e4?Math.max(e,3*6e4):Math.max(e,10*6e4)}var Cs=3e3,vs=2*6e4,gt=Date.now(),ft=new Set,uo=!1;function ks(){if(uo||typeof window>"u")return;uo=!0;let e=()=>{let t=gt;if(gt=Date.now(),gt-t>vs)for(let r of ft)r()};for(let t of["pointerdown","keydown","wheel","touchstart"])window.addEventListener(t,e,{capture:!0,passive:!0});let n=()=>{if(!document.hidden)for(let t of ft)t()};window.addEventListener("focus",n),document.addEventListener("visibilitychange",n)}function Ce(e,n,t={}){ks();let r,o=t.immediate===!1?Date.now():0,s=!1,a=!1,l=()=>{a||(r=setTimeout(i,t.idle===!1?n:po(n,Date.now()-gt)))},i=async()=>{if(clearTimeout(r),!(a||s)){if(typeof document>"u"||!document.hidden){s=!0,o=Date.now();try{await e()}catch{}finally{s=!1}}l()}},c=()=>{Date.now()-o>Math.min(n,Cs)&&i()};return ft.add(c),t.immediate===!1?l():i(),()=>{a=!0,clearTimeout(r),ft.delete(c)}}var ce=[{id:"claude",costClass:"user-subscription",short:"Claude Code",label:"Continue with Claude",title:"The Claude plan you already pay for",cost:"Nothing beyond the plan",prerequisite:"Claude Code installed and signed in",hint:"Install it from claude.ai/code, then run `claude` once and sign in.",install:"https://claude.com/product/claude-code",expects:["claude-code"]},{id:"chatgpt",costClass:"user-subscription",short:"Codex",label:"Continue with ChatGPT",title:"The ChatGPT plan you already pay for",cost:"Nothing beyond the plan",prerequisite:"Codex installed and signed in",hint:"Install Codex, then run `codex` once and sign in.",install:"https://learn.chatgpt.com/codex/cli",expects:["codex"]},{id:"local",costClass:"user-hardware",short:"Local models",label:"Use a model on this machine",title:"A model on your own machine",cost:"Free. You bought the hardware",prerequisite:"Ollama running, with a model pulled",hint:"Install Ollama, then `ollama pull` a model before pairing.",install:"https://ollama.com",expects:["ollama","openai-api"]}],mo=["claude","chatgpt"];function Qt(){return ce.filter(e=>mo.includes(e.id))}function Jt(e){return ce.filter(n=>n.costClass===e)}function Vt(e){return ce.find(n=>n.expects.includes(e))??null}import{Fragment as Ao,jsx as A,jsxs as I}from"react/jsx-runtime";function ln({machines:e,hosted:n=[],onApproveRuntime:t,onPreferRuntime:r,onDisconnectHosted:o,onPair:s,onRefresh:a,refreshing:l,busy:i,appName:c,error:u,runs:p,loadRuns:f,loading:g,machineMenu:m,machineNote:y,children:R,onStopRun:S}){let k=Ie(e),W=e.filter(M=>M.id!==k?.id),[F,O]=At(!1),[P,Q]=At(null),T=p===void 0&&!!f,K=T?P:p??null,q=p!==void 0||!!f;Ns(()=>{if(!T||!F||!f)return;let M=!0,De=Ce(async()=>{let Y=await f();M&&Q(Y)},3e3);return()=>{M=!1,De()}},[T,F,f]);let de=k&&K?Ps(K,k):{},V=k?Ht(k):[];return!k&&n.length===0&&!s?A("p",{className:"sc-note",children:"Nothing connected yet."}):I("div",{className:"sc-tray",children:[k&&I(vn,{title:"This machine",action:(a||m)&&I("span",{className:"sc-cap-acts",children:[a&&A("button",{type:"button",className:"sc-disc",onClick:a,disabled:l,"aria-label":"Refresh",title:"Refresh",children:A(Fs,{spinning:!!l})}),m]}),children:[A(Rs,{machine:k,...q?{onToggle:()=>O(M=>!M),open:F}:{}}),y]}),k&&q&&F&&A(Ms,{machine:k,runs:K,...S?{onStop:S}:{}}),k&&A(vn,{title:"Agents on it",action:A(Gs,{machine:k,appName:c,busy:i,...r?{onPick:M=>r(k.id,M)}:{}}),children:g&&V.length===0?A("p",{className:"sc-row-note",children:"Looking\u2026"}):V.length>0?[...V].sort(Wt).map(M=>A(Ts,{runtime:M,serving:de[M.id]??M.serving??0,...t?{onApprove:()=>t(k.id,M.id)}:{}},M.id)):A("p",{className:"sc-row-note",children:"No agent advertised. Install Claude Code, Codex or Ollama on that machine."})}),n.length>0&&A(vn,{title:n.length>1?"Connected plans":"Connected plan",children:n.map(M=>A(Hs,{credential:M,appName:c,busy:i,...o?{onDisconnect:()=>o(M.provider)}:{}},M.provider))}),(W.length>0||s)&&I(vn,{title:W.length>0?"Your other machines":k?"Add a machine":"Your machines",children:[W.map(M=>A(Ls,{machine:M},M.id)),s&&I("button",{type:"button",className:"sc-pair",onClick:s,children:[A("span",{className:"sc-otile","aria-hidden":"true",children:A(Ds,{})}),A("span",{className:"sc-oname",children:e.length>0?"Pair another machine":"Connect a machine"})]})]}),R,u&&A("p",{className:"sc-error sc-tray-error",children:u})]})}function vn({title:e,action:n,children:t}){return I("section",{className:"sc-group",children:[I("div",{className:"sc-group-cap",children:[A("p",{className:"sc-group-title",children:e}),n]}),A("div",{className:"sc-group-card",children:t})]})}function Rs({machine:e,onToggle:n,open:t}){let r=Gt(e),o=[r?null:e.pairing_lost?"No longer connected here":"Asleep or offline",Wn(e),e.always_on?"always on":null,r&&e.capacity>0?`${e.active} of ${e.capacity} in flight`:Hn(e.last_seen_at)].filter(Boolean),s=I(Ao,{children:[I("span",{className:"sc-mtile","aria-hidden":"true",children:[A(fo,{}),A("span",{className:`sc-mbadge sc-mbadge-${sn(e).tone}`})]}),I("span",{className:"sc-mid",children:[A("span",{className:"sc-mname",children:_(e)}),A("span",{className:"sc-mmeta",children:o.map((a,l)=>I("span",{children:[l>0&&A("span",{className:"sc-mmeta-sep",children:"\xB7"}),a]},a))})]})]});return!n||!r?A("div",{className:"sc-mrow",children:s}):I("button",{type:"button",className:"sc-mrow sc-mrow-btn",onClick:n,"aria-expanded":!!t,title:t?"Hide what it is running":"See what it is running",children:[s,A(Cn,{open:!!t})]})}function Ss(e,n){return e.filter(t=>t.machine_id===n.id||t.machine_id===null)}function Ps(e,n){let t={};for(let r of e)r.machine_id!==n.id||r.status!=="running"||!r.runtime_id||(t[r.runtime_id]=(t[r.runtime_id]??0)+1);return t}function Ms({machine:e,runs:n,onStop:t}){let r=n?Ss(n,e):[],[o,s]=At(new Set),a=async l=>{s(i=>new Set(i).add(l));try{await t?.(l)}catch{s(i=>{let c=new Set(i);return c.delete(l),c})}};return A(vn,{title:"Running now",children:n===null?A("p",{className:"sc-row-note",children:"Looking\u2026"}):r.length===0?A("p",{className:"sc-row-note",children:"Nothing running."}):r.map(l=>A(Es,{run:l,stopping:o.has(l.id),...t?{onStop:()=>void a(l.id)}:{}},l.id))})}function Es({run:e,stopping:n,onStop:t}){return I("div",{className:"sc-rrow",children:[A(Yt,{id:e.runtime_id}),I("span",{className:"sc-mid",children:[I("span",{className:"sc-rtop",children:[A("span",{className:"sc-aname",children:ho(e)}),A("span",{className:"sc-averdict",children:Os(e.started_at)})]}),A("span",{className:"sc-rstep",children:n?"Stopping\u2026":Is(e)})]}),t&&A("button",{type:"button",className:"sc-disc sc-rstop",onClick:t,disabled:n,"aria-label":`Stop ${ho(e)}`,title:"Stop",children:A(Qs,{})})]})}function go(e){let n=Vt(e);return(n?Ye[n.id]:null)??co[e]??null}function ho(e){if(e.label)return e.label;if(e.task){let n=e.task.replace(/[_-]+/g," ").trim();return n.charAt(0).toUpperCase()+n.slice(1)}return"A run"}function Is(e){if(e.status==="queued")return"Waiting for a free slot";if(e.step)return e.step;switch(e.phase?.kind){case"thinking":return"Thinking";case"writing":return"Writing";case"tool":return e.phase.tool?`Using ${e.phase.tool}`:"Using a tool";case"approval":return e.phase.tool?`Waiting for you to allow ${e.phase.tool}`:"Waiting for your approval";default:return e.first_output_at?"Working":"Starting"}}function Os(e){let n=Math.max(0,Math.round((Date.now()-new Date(e).getTime())/1e3));if(n<60)return`${n}s`;let t=Math.floor(n/60);return t<60?`${t}m ${String(n%60).padStart(2,"0")}s`:`${Math.floor(t/60)}h ${String(t%60).padStart(2,"0")}m`}function Ls({machine:e}){let n=sn(e);return I("div",{className:"sc-orow",children:[A("span",{className:"sc-otile","aria-hidden":"true",children:A(fo,{})}),A("span",{className:"sc-oname",children:_(e)}),A("span",{className:"sc-oword",children:n.word}),A("span",{className:`sc-dot sc-dot-${n.tone}`,"aria-hidden":"true"})]})}function Ts({runtime:e,serving:n=0,onApprove:t}){let r=Gn(e),o=I(Ao,{children:[A(Yt,{id:e.id,name:e.display_name}),I("span",{className:e.absent?"sc-aname sc-aname-absent":"sc-aname",children:[e.display_name,e.version&&I("span",{className:"sc-aversion",children:[" ",e.version]})]}),n>0?I("span",{className:"sc-averdict",children:[A(Us,{}),A("span",{className:"sc-aserving",children:n>1?`${n} running`:"running"})]}):e.absent?A("span",{className:"sc-averdict sc-tone-absent",children:"not offered"}):e.quarantined?t?A("button",{type:"button",className:"sc-row-act",onClick:t,children:"Let it serve"}):A("span",{className:"sc-averdict sc-tone-warn",children:"new, not serving yet"}):r.tone==="ok"?I("span",{className:"sc-averdict",children:[A("span",{className:"sc-dot sc-dot-ok","aria-hidden":"true"}),A("span",{className:"sc-sr",children:r.text})]}):A("span",{className:`sc-averdict sc-tone-${r.tone}`,children:r.text})]});return A("div",{className:"sc-arow",children:o})}function Yt({id:e,name:n}){return A("span",{className:"sc-runtime-tile","aria-hidden":"true",children:A(Bs,{id:e,...n?{name:n}:{}})})}function Bs({id:e,name:n}){if(!e)return null;let t=Dt[e];if(t)return A("img",{src:t,alt:"",className:"sc-runtime-logo"});let r=go(e);return r?A(r,{className:"sc-runtime-mark"}):n?A("span",{className:"sc-runtime-letter",children:n.slice(0,1).toUpperCase()}):null}function Gs({machine:e,appName:n,busy:t,onPick:r}){let o=Ge(e),s=ye(e),[a,l]=At(!1),i=xs(null);if(o.by!=="app"&&s.length===0)return null;let c=f=>f?A(Yt,{id:f.id,name:f.display_name}):null,u=f=>{if(!f)return null;let g=Dt[f.id];if(g)return A("img",{src:g,alt:"",className:"sc-runs-logo"});let m=go(f.id);return m?A(m,{className:"sc-runs-glyph"}):null},p;return o.by==="app"?p=I("span",{className:"sc-runs-fixed",title:`Set by ${n??"the app"}`,children:[u(o.runtime),o.runtime?.display_name??o.runtimeId]}):!r||s.length<2?p=I("span",{className:"sc-runs-fixed",children:[u(o.runtime),o.runtime?.display_name]}):p=I("button",{ref:i,type:"button",className:"sc-runs-btn","aria-haspopup":"menu","aria-expanded":a,"aria-label":`Runs go to ${o.runtime?.display_name??"the default"}. Change`,disabled:t,onClick:()=>l(f=>!f),children:[u(o.runtime),A("span",{className:"sc-runs-label",children:o.runtime?.display_name}),A(Cn,{open:!0})]}),I("span",{className:"sc-runs-to",children:[A("span",{className:"sc-runs-cap",children:o.by==="app"?`${n??"App"} uses`:"Runs on"}),p,a&&r&&A(Ws,{anchor:i,machine:e,tile:c,onClose:()=>l(!1),onPick:f=>{l(!1),r(f)}})]})}function Ws({anchor:e,machine:n,tile:t,onClose:r,onPick:o}){let s=Ge(n),a=Ge({...n,preferred_runtime:null}).runtime,l=s.by==="you"?s.runtimeId:null,i=[{id:null,label:"Automatic",...a?{note:`Uses ${a.display_name}`}:{},glyph:t(a)},...ye(n).map((c,u)=>({id:c.id,label:c.display_name,glyph:t(c),...u===0?{rule:!0}:{}}))];return A(Dn,{anchor:e,label:"Which agent runs go to",options:i,current:l,onClose:r,onPick:o})}function Hs({credential:e,appName:n,busy:t,onDisconnect:r}){return I("div",{className:"sc-hrow",children:[I("div",{className:"sc-orow",children:[A("span",{className:"sc-otile","aria-hidden":"true",children:A(an,{className:"sc-omark"})}),I("span",{className:"sc-mid",children:[A("span",{className:"sc-oname",children:e.provider==="openai-chatgpt"?"ChatGPT plan":e.provider}),A("span",{className:"sc-mmeta",children:e.account_label??"signed in"})]}),r&&A("button",{type:"button",className:"sc-row-act",onClick:r,disabled:t,children:"Disconnect"})]}),r&&I("p",{className:"sc-row-note",children:[n??"This app"," stops using it. To withdraw the grant entirely, remove it in your OpenAI settings."]})]})}function fo(){return I("svg",{viewBox:"0 0 32 24","aria-hidden":"true",focusable:"false",className:"sc-mglyph",children:[A("rect",{x:"4",y:"1.5",width:"24",height:"15",rx:"2.5",fill:"var(--sc-sheet, #ffffff)",stroke:"currentColor",strokeWidth:"2"}),A("rect",{x:"1",y:"19.5",width:"30",height:"2.5",rx:"1.25",fill:"currentColor"})]})}function Ds(){return A("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:"sc-oglyph",children:A("path",{d:"M12 5v14M5 12h14",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"})})}function Us(){return I("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:"sc-sglyph sc-spin",children:[A("circle",{cx:"12",cy:"12",r:"9",fill:"none",stroke:"currentColor",strokeWidth:"3",opacity:"0.25"}),A("path",{d:"M12 3a9 9 0 0 1 9 9",fill:"none",stroke:"currentColor",strokeWidth:"3",strokeLinecap:"round"})]})}function Fs({spinning:e}){return A("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e?"sc-dglyph sc-spin":"sc-dglyph",children:A("path",{d:"M21 12a9 9 0 1 1-2.64-6.36M21 3v6h-6",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function Qs(){return A("svg",{className:"sc-dglyph",viewBox:"0 0 16 16","aria-hidden":"true",children:A("rect",{x:"4",y:"4",width:"8",height:"8",rx:"1.5",fill:"currentColor"})})}import{jsx as Js}from"react/jsx-runtime";function Un({machines:e,onApproveRuntime:n}){return Js(ln,{machines:e,...n?{onApproveRuntime:n}:{}})}var jt={ready:{arc:!0},serving:{arc:!0,slot:"stream"},paused:{arc:!1,slot:"zzz"},thinking:{arc:!1,slot:"dots"},connecting:{arc:!1,slot:"orbit"},attention:{arc:!1,slot:"bang"},gone:{arc:!1,slot:"cross"},snap:{arc:!1,slot:"snap"},listening:{arc:!1,slot:"bars"},permission:{arc:!1,slot:"ring"},ai:{arc:!1,slot:"sparks"}};var zt="105 162 420 420",qt="M407.1 308.9 A158 158 0 1 0 407.1 491.1 A116 116 0 0 1 407.1 308.9 Z",cn="M448.5 320 A110 110 0 0 1 448.5 480";import{Fragment as Qn,jsx as x,jsxs as je}from"react/jsx-runtime";function Zt({kind:e,size:n=44,className:t}){let r=jt[e];return je("svg",{className:`bx${t?` ${t}`:""}`,"data-expression":e,viewBox:zt,overflow:"visible",width:n,height:n,"aria-hidden":"true",children:[x("path",{d:qt,fill:"currentColor"}),x("path",{className:"bx-arc",d:cn,fill:"none",stroke:"currentColor",strokeWidth:17,strokeLinecap:"round"}),r.slot==="stream"&&x(Vs,{}),r.slot==="zzz"&&x(Ys,{}),r.slot==="dots"&&x(js,{}),r.slot==="bang"&&x(zs,{}),r.slot==="orbit"&&x(qs,{}),r.slot==="cross"&&x(Zs,{}),r.slot==="snap"&&x(Xs,{}),r.slot==="bars"&&x(Ks,{}),r.slot==="ring"&&x(_s,{}),r.slot==="sparks"&&x($s,{})]})}function Vs(){return x("path",{className:"bx-st",d:"M475.3 290.3 A150 150 0 0 1 475.3 509.7",fill:"none",stroke:"currentColor",strokeWidth:"15",strokeLinecap:"round",strokeDasharray:"0.1 31"})}function Ys(){return je(Qn,{children:[x("g",{className:"bx-z1",children:x("path",{d:"M444 372 H496 L444 436 H496",fill:"none",stroke:"currentColor",strokeWidth:"20",strokeLinecap:"round",strokeLinejoin:"round"})}),x("g",{className:"bx-z2",children:x("path",{d:"M492 300 H522 L492 338 H522",fill:"none",stroke:"currentColor",strokeWidth:"15",strokeLinecap:"round",strokeLinejoin:"round"})})]})}function js(){return je(Qn,{children:[x("circle",{className:"bx-th",cx:"463.1",cy:"336.9",r:"21",fill:"currentColor"}),x("circle",{className:"bx-th bx-th2",cx:"483",cy:"400",r:"21",fill:"currentColor"}),x("circle",{className:"bx-th bx-th3",cx:"463.1",cy:"463.1",r:"21",fill:"currentColor"})]})}function zs(){return je("g",{className:"bx-at",children:[x("line",{x1:"490",y1:"312",x2:"490",y2:"414",stroke:"currentColor",strokeWidth:"46",strokeLinecap:"round"}),x("circle",{cx:"490",cy:"484",r:"28",fill:"currentColor"})]})}function qs(){return je("g",{className:"bx-ob",children:[x("path",{d:cn,fill:"none",stroke:"var(--tile-bg, transparent)",strokeWidth:41,strokeLinecap:"round"}),x("path",{d:cn,fill:"none",stroke:"currentColor",strokeWidth:17,strokeLinecap:"round"})]})}function Zs(){return je(Qn,{children:[x("path",{className:"bx-xa",d:cn,fill:"none",stroke:"currentColor",strokeWidth:17,strokeLinecap:"round"}),x("g",{className:"bx-xx",children:x("path",{d:"M442 364 L514 436 M514 364 L442 436",fill:"none",stroke:"currentColor",strokeWidth:"24",strokeLinecap:"round"})})]})}function Xs(){return x("path",{className:"bx-snap",d:cn,fill:"none",stroke:"currentColor",strokeWidth:17,strokeLinecap:"round"})}function Ks(){return je("g",{stroke:"currentColor",strokeWidth:"17",strokeLinecap:"round",children:[x("line",{className:"bx-vb",x1:"452",y1:"370",x2:"452",y2:"430"}),x("line",{className:"bx-vb bx-vb2",x1:"482",y1:"330",x2:"482",y2:"470"}),x("line",{className:"bx-vb bx-vb3",x1:"512",y1:"355",x2:"512",y2:"445"})]})}function _s(){return x(Qn,{children:[[450,366],[474,376],[484,400],[474,424],[450,434],[426,424],[416,400],[426,376]].map(([n,t],r)=>x("circle",{className:"bx-w",cx:n,cy:t,r:"11",fill:"currentColor",style:{animationDelay:`${-1.2+r*.15}s`}},r))})}function $s(){return je(Qn,{children:[x("g",{className:"bx-sp",children:x("path",{d:"M460 300 Q465.4 324.6 490 330 Q465.4 335.4 460 360 Q454.6 335.4 430 330 Q454.6 324.6 460 300 Z",fill:"currentColor"})}),x("g",{className:"bx-sp bx-sp2",children:x("path",{d:"M486 356 Q493.92 392.08 530 400 Q493.92 407.92 486 444 Q478.08 407.92 442 400 Q478.08 392.08 486 356 Z",fill:"currentColor"})}),x("g",{className:"bx-sp bx-sp3",children:x("path",{d:"M460 440 Q465.4 464.6 490 470 Q465.4 475.4 460 500 Q454.6 475.4 430 470 Q454.6 464.6 460 440 Z",fill:"currentColor"})})]})}import{useCallback as ae,useEffect as ue,useId as oa,useMemo as ze,useRef as kn,useState as J}from"react";var Jn=[{slug:"mac-arm",label:"macOS, Apple silicon"},{slug:"mac-intel",label:"macOS, Intel"},{slug:"windows",label:"Windows"},{slug:"linux",label:"Linux"}];function Vn(e){if(!e)return"";try{return new URL(e).origin}catch{return""}}var Xt="soba";function yo(){return`${Xt}://show`}function Yn(e,n,t){let r=`${Xt}://connect?url=${encodeURIComponent(e)}`;return n&&(r+=`&nonce=${encodeURIComponent(n)}`),t&&(r+=`&want=${encodeURIComponent(t)}`),r}function jn(){let e=globalThis.crypto;if(!e?.getRandomValues)return null;let n=e.getRandomValues(new Uint8Array(32)),t="";for(let r of n)t+=String.fromCharCode(r);return btoa(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}var ea=1600;function Kt(e={}){return er(e)}async function _t(e,n={}){if(typeof window>"u"||typeof document>"u")return"unknown";let t=er(n);try{window.location.href=Yn(e,n.nonce,n.want)}catch{return"absent"}return t}async function $t(e={}){if(typeof window>"u"||typeof document>"u")return"unknown";let n=er(e);try{window.location.href=yo()}catch{return"absent"}return n}async function er(e){if(typeof window>"u"||typeof document>"u")return"unknown";let n=e.graceMs??ea,t=document.visibilityState==="visible"&&document.hasFocus(),r=!1,o=()=>{r=!0},s=()=>{document.visibilityState==="hidden"&&(r=!0)};return window.addEventListener("blur",o),window.addEventListener("pagehide",o),document.addEventListener("visibilitychange",s),await new Promise(a=>setTimeout(a,n)),window.removeEventListener("blur",o),window.removeEventListener("pagehide",o),document.removeEventListener("visibilitychange",s),t?r?"opened":"absent":"unknown"}var wo="soba.connect.choice",na=180*24*60*60*1e3;function nr(e){let n=2166136261;for(let t=0;t<e.length;t++)n^=e.charCodeAt(t),n=Math.imul(n,16777619);return(n>>>0).toString(36)}function tr(e,n){return e?n?`${wo}.${e}.${nr(n)}`:`${wo}.${e}`:null}function rr(e){if(!e||typeof localStorage>"u")return null;try{let n=localStorage.getItem(e);if(!n)return null;let t=JSON.parse(n);if(Date.now()-Date.parse(t.at)>na)return null;let r=ce.find(o=>o.id===t.choice);return r?r.id:null}catch{return null}}function or(e,n){if(!(!e||typeof localStorage>"u"))try{localStorage.setItem(e,JSON.stringify({choice:n,at:new Date().toISOString()}))}catch{}}var Co="soba.connect.model",ta=180*24*60*60*1e3;function sr(e,n){return e?n?`${Co}.${e}.${nr(n)}`:`${Co}.${e}`:null}function bt(e){if(!e||typeof localStorage>"u")return null;try{let n=localStorage.getItem(e);if(!n)return null;let t=JSON.parse(n);if(Date.now()-Date.parse(t.at)>ta)return null;let r=t.choice;return typeof r!="string"||!r||r.length>120?null:/^[\w.:@+-]+(\/[\w.:@+-]+)?$/.test(r)?r:null}catch{return null}}function ar(e,n){if(!(!e||typeof localStorage>"u"))try{localStorage.setItem(e,JSON.stringify({choice:n,at:new Date().toISOString()}))}catch{}}var vo="soba.connect.dismissed",ra=30*24*60*60*1e3;function ir(e,n){return e?n?`${vo}.${e}.${nr(n)}`:`${vo}.${e}`:null}function lr(e){if(!e||typeof localStorage>"u")return!1;try{let n=localStorage.getItem(e);if(!n)return!1;let t=JSON.parse(n);return Date.now()-Date.parse(t.at)<ra}catch{return!1}}function cr(e){if(!(!e||typeof localStorage>"u"))try{localStorage.setItem(e,JSON.stringify({at:new Date().toISOString()}))}catch{}}import{Fragment as Ct,jsx as d,jsxs as N}from"react/jsx-runtime";var ur=2e3,sa=1e4,aa=9e4,ia=6e4;function dr(e,n,t,r=[],o){return e?"code":n&&(t.length>0||r.length>0)?"manage":o?"launch":"choose"}function la(e){let n=Math.max(0,Math.round(e/1e3));return`${Math.floor(n/60)}:${String(n%60).padStart(2,"0")}`}function hr({client:e,initialCode:n,initialChoice:t,onConnected:r,showStatus:o=!0,initialContext:s=null,initialMachines:a,onClose:l,headingId:i,theme:c,reason:u,active:p=!0}){let f=!!s&&a!==void 0,[g,m]=J(f?dr(n,o,a??[],[],t):"loading"),[y,R]=J(s),[S,k]=J(a??[]),[W,F]=J(n??""),[O,P]=J(null),[Q,T]=J(null),[K,q]=J(!1),[de,V]=J(0),[M,De]=J(()=>Date.now()),[Y,pe]=J(null),[Ke,Se]=J(!1),[me,te]=J(!1),[mn,Ue]=J("browser"),[Fe,ie]=J(null),[he,re]=J([]),[Qe,hn]=J(0),[Pe,Te]=J(null),oe=kn(null),[w,j]=J(t??null),[E,Mt]=J(null),Je=ze(()=>{let h=y?.accent?.trim(),v=y?.background?.trim();if(!(!h&&!v))return v?{...rn(v,h),background:v,borderRadius:"inherit"}:{"--sc-accent":h,"--sc-accent-fg":Bn(h)}},[y?.accent,y?.background]),ge=oa(),se=i??ge,Ve=kn(null);ue(()=>{if(!e||f)return;let h=!0;return Promise.all([e.context(),e.machines()]).then(([v,H])=>{h&&(R(v),k(H),m(dr(n,o,H)))}).catch(v=>{h&&(T(v.message),m("choose"))}),()=>{h=!1}},[e,n,o,f]),ue(()=>{g!=="loading"||!f||m(dr(n,o,a??[]))},[g,f,n,o,a]),ue(()=>{a&&k(a)},[a]),ue(()=>{s&&R(s)},[s]);let gn=kn(!1),fn=kn(g);fn.current=g;let _e=kn(he);_e.current=he;let $e=!!y?.hosted_available;ue(()=>{!o&&fn.current==="manage"&&m("choose")},[o]),ue(()=>{if(!e||!p||g!=="manage")return;let h=!0,v=Ce(async()=>{try{let H=await e.machines();if(!h)return;k(H);let U=!$e||gn.current;H.length===0&&_e.current.length===0&&U&&fn.current==="manage"&&m("choose")}catch{}},sa,{immediate:!1});return()=>{h=!1,v()}},[g,e,$e,p]);let en=tr(y?.publishable_key??null);ue(()=>{Mt(rr(en))},[en]),ue(()=>{if(!e||!$e)return;let h=!0;return e.hosted().then(v=>{h&&(re(v.credentials),!gn.current&&(gn.current=!0,v.credentials.length>0&&o&&fn.current==="choose"&&m("manage")))}).catch(()=>{}),()=>{h=!1}},[e,$e,o]),ue(()=>{if(!e||!p||g!=="hosted")return;let h=!0,v=async()=>{try{let Ee=await e.hosted();if(!h)return!1;if(re(Ee.credentials),Ee.credentials.length>0)return m("hosted_connected"),Te(null),!0}catch{}return!1},H=async()=>{oe.current?.closed&&(oe.current=null,!await v()&&h&&m("choose"))},U=Ce(v,ur,{immediate:!1}),tn=setInterval(H,400),ke=Ee=>{let Ln=Ee.data;Ln?.source==="soba"&&Ln.type==="hosted_result"&&v()};return window.addEventListener("message",ke),()=>{h=!1,U(),clearInterval(tn),window.removeEventListener("message",ke),oe.current=null}},[e,g,p]);let Et=ae(()=>{if(!e)return;let h=window.open("","soba-connect-plan","width=520,height=760,noopener=no");oe.current=h,m("hosted"),hn(Date.now()),Te(null),T(null),e.startHosted().then(({url:v})=>{if(h&&!h.closed){h.location.href=v;return}Te(v)}).catch(v=>{h?.close(),oe.current=null,T(v.message),m("choose")})},[e]),it=ae(async h=>{if(e){q(!0);try{await e.disconnectHosted(h),re((await e.hosted()).credentials)}catch(v){T(v.message)}finally{q(!1)}}},[e]);ue(()=>{if(!e||!p||g!=="waiting")return;let h=!0,v=Ce(async()=>{try{let H=await e.machines();if(!h)return;k(H);let U=Ve.current;if(!U)return;let tn=H.filter(Ee=>!U.has(Ee.id)),ke=tn.find(Ee=>Ee.state!=="offline")??tn[0];if(ke){ie(ke.id),w&&or(en,w);let Ee=ce.find(Lt=>Lt.id===w)?.expects??[],Ln=ye(ke).find(Lt=>Ee.includes(Lt.id));Ln&&e.preferRuntime(ke.id,Ln.id).catch(()=>{}),m("connected"),r?.(H)}}catch{}},ur,{immediate:!1});return()=>{h=!1,v()}},[g,e,r,w,en,p]);let lt=ae(async()=>{if(e){T(null),q(!0);try{let h=await e.lookup(W);P(h),m("confirm")}catch(h){T(h.message)}finally{q(!1)}}},[e,W]),An=ae(async()=>{if(e){T(null),q(!0);try{try{Ve.current=new Set((await e.machines()).map(h=>h.id))}catch{Ve.current=new Set(S.map(h=>h.id))}await e.approve(W),m("waiting"),V(Date.now())}catch(h){T(h.message)}finally{q(!1)}}},[e,W,S]),ct=ae(async()=>{if(e){q(!0);try{await e.deny(W),Ue("browser"),m("denied")}catch(h){T(h.message)}finally{q(!1)}}},[e,W]),z=ze(()=>y?.connect_url??null,[y]),[Me,fe]=J(()=>jn()),nn=ze(()=>z?Yn(z,Me??void 0,w??void 0):null,[z,Me,w]),ut=ze(()=>Vn(z),[z]),It=ae(h=>{if(S.length===0)return null;let v=ce.find(U=>U.id===h);if(!v)return null;let H=S.flatMap(U=>U.runtimes??[]).filter(U=>v.expects.includes(U.id));return H.length===0?{tone:"dim",text:"not installed"}:H.some(U=>U.authenticated===!0)?{tone:"ok",text:"ready"}:H.every(U=>U.authenticated===!1)?{tone:"warn",text:"needs signing in"}:{tone:"dim",text:"installed"}},[S]),C=ae((h=null)=>{j(h),T(null),pe(null),Se(!1),te(!1),Z.current=!1,fe(jn()),m("launch")},[]),Z=kn(!!t);ue(()=>{g!=="launch"||!z||Z.current||(Z.current=!0,Se(!0),_t(z,{...Me?{nonce:Me}:{},...w?{want:w}:{}}).then(pe))},[g,z,Me,w]);let le=ae(()=>{Se(!0),Kt().then(pe)},[]),dt=ae(h=>{if(me){let v=jn();te(!1),fe(v),z&&(h.preventDefault(),window.location.href=Yn(z,v??void 0,w??void 0))}le()},[me,le,z,w]),Ae=ze(()=>{let h=y?.runtimes;return h?ce.filter(v=>h.includes(v.id)):Qt()},[y?.runtimes]),ve=ze(()=>{let h=ce.find(v=>v.id===w);return h?{choice:h,Mark:Ye[h.id]??null}:null},[w]),Be=ze(()=>S.find(h=>h.id===Fe),[S,Fe]);ue(()=>{let h=Me;if(!e||!p||g!=="launch"||!h)return;let v=!1,H=Date.now()+15e4,U=()=>{};return U=Ce(async()=>{if(Date.now()>H){U(),te(!0);return}try{let tn=await e.claim(h);if(v)return;if(tn.declined){U(),pe(null),Ue("machine"),m("denied");return}if(!tn.claimed)return;U();try{Ve.current=new Set((await e.machines()).map(ke=>ke.id))}catch{Ve.current=new Set(S.map(ke=>ke.id))}m("waiting"),V(Date.now())}catch{}},ur,{immediate:!1,idle:!1}),()=>{v=!0,U()}},[e,g,S,Me,p]);let be=ze(()=>{if(!O)return null;if(O.approved||O.denied)return"answered";let h=O.expires_at?Date.parse(O.expires_at):Number.NaN;return Number.isFinite(h)&&h<=M?"expired":"live"},[O,M]);ue(()=>{if(!(g==="confirm"&&be==="live"||g==="waiting"||g==="hosted"))return;let v=setInterval(()=>De(Date.now()),1e3);return()=>clearInterval(v)},[g,be]);let pt=ae(async(h,v)=>{if(e)try{await e.approveRuntime(h,v),k(await e.machines())}catch(H){T(H.message)}},[e]),Ot=ae(async(h,v)=>{if(e)try{await e.preferRuntime(h,v),k(await e.machines())}catch(H){T(H.message)}},[e]);return g==="loading"?d("div",{className:"soba-connect",...c?{"data-theme":c}:{},style:Je,children:d("div",{className:"sc-card",children:d("p",{className:"sc-note",children:"Loading\u2026"})})}):N("div",{className:"soba-connect",...c?{"data-theme":c}:{},style:Je,children:[l&&d("button",{type:"button",className:"sc-modal-close",onClick:l,"aria-label":"Close",children:"\xD7"}),g==="manage"&&N("div",{className:"sc-card",children:[d("h2",{className:"sc-title",id:se,children:"Your compute"}),N("p",{className:"sc-sub",children:[d(yt,{context:y})," ",S.length>0&&he.length>0?"runs on your connected plan, and on these machines while they are awake.":he.length>0?"runs on the plan you connected. Nothing here is charged to you.":"runs on these machines, while they are awake."]}),d(ln,{machines:S,hosted:he,onApproveRuntime:pt,onPreferRuntime:(h,v)=>void Ot(h,v),onDisconnectHosted:h=>void it(h),onPair:()=>m("choose"),busy:K,...y?.app.name?{appName:y.app.name}:{}}),Q&&d("p",{className:"sc-error",children:Q})]}),g==="choose"&&N("div",{className:"sc-card",children:[d(ua,{context:y}),d("h2",{className:"sc-h",id:se,children:u==="payment_required"?"Carry on with your own AI":u==="no_compute"?"This run needs a machine":"Connect your AI"}),d("p",{className:"sc-p",children:"Use compute you already have."}),z&&Ae.length>0&&N(Ct,{children:[d("div",{className:"sc-opts",children:Ae.map(h=>{let v=Ye[h.id];return N("button",{type:"button",className:"sc-opt",onClick:()=>C(h.id),children:[d("span",{className:"sc-opt-tile","aria-hidden":"true",children:v&&d(v,{className:"sc-opt-mark"})}),d("span",{className:"sc-opt-text",children:d("span",{className:"sc-opt-label",children:h.label})}),(()=>{let H=It(h.id);return H?d("span",{className:`sc-opt-has sc-opt-has-${H.tone}`,children:H.text}):E===h.id?d("span",{className:"sc-opt-last",children:"last used"}):d(pr,{className:"sc-opt-go"})})()]},h.id)})}),N("p",{className:"sc-opt-note",children:["Your accounts stay there. ",ko(y)," never sees them."]})]}),(!z||Ae.length===0)&&d("p",{className:"sc-error",style:{marginTop:16},children:"This app has no publishable key yet, so there is nothing to pair against."}),Q&&d("p",{className:"sc-error",children:Q}),z&&y?.show_code===!0&&d("div",{className:"sc-opt-alt",children:d("button",{type:"button",className:"sc-alt-link",onClick:()=>m("code"),children:"I have a code"})})]}),g==="launch"&&N("div",{className:"sc-card",children:[N("div",{className:"sc-head",children:[d(Nn,{onClick:()=>m("choose")}),d("p",{className:"sc-head-title",children:"Soba App"})]}),d(wt,{mark:ve?.Mark??X,still:me||!Ke&&Y===null}),d("h2",{className:"sc-h",id:se,children:me?"No answer from this machine":Y==="absent"?"Nothing opened":Y===null?"Opening Soba App\u2026":"Approve it on this machine"}),me?d("p",{className:"sc-p",children:"The Soba app did not answer. It may not be open, or nobody was there. Try again when you are ready."}):Y==="absent"?d("p",{className:"sc-p",children:"Nothing opened on this machine. Open it yourself below, or install it if it is not here yet."}):d("p",{className:"sc-p",children:Y===null?"Approve it there and this page does the rest.":"This page finishes on its own."}),ve&&N("p",{className:"sc-prereq",children:[ve.Mark&&d(ve.Mark,{className:"sc-rt-mark"}),"Needs ",ve.choice.prerequisite]}),N("div",{className:"sc-stack",style:{marginTop:18},children:[d("a",{className:Y==="absent"||me?"sc-btn sc-btn-primary":"sc-btn",href:nn??"#",onClick:dt,children:me?"Try again":Y==="absent"?"Open Soba App":"Open it again"}),d("p",{className:"sc-note",children:Y===null?"Your browser will ask permission first.":"Your browser asks permission the first time."}),ve&&Y==="absent"&&d("p",{className:"sc-note",children:d(da,{text:ve.choice.hint})}),N("div",{className:"sc-foot-strip",children:[d("span",{children:"Not installed on this machine?"}),N("button",{type:"button",className:"sc-foot-go",onClick:()=>m("get"),children:["Get it",d(pr,{})]})]})]})]}),g==="get"&&N("div",{className:"sc-card",children:[N("div",{className:"sc-head",children:[d(Nn,{onClick:()=>m("launch")}),d("p",{className:"sc-head-title",children:"Get Soba App"})]}),d("div",{className:"sc-opts",children:Jn.map(h=>N("a",{className:"sc-opt",href:`${ut}/download/${h.slug}`,target:"_blank",rel:"noreferrer noopener",children:[d("span",{className:"sc-opt-tile","aria-hidden":"true",children:d(Ft,{className:"sc-opt-mark"})}),d("span",{className:"sc-opt-text",children:d("span",{className:"sc-opt-label",children:h.label})}),d(pr,{className:"sc-opt-go"})]},h.slug))}),d("p",{className:"sc-opt-note",children:"Install it, then come back here and press the row you started with."})]}),g==="code"&&N("div",{className:"sc-card",children:[N("div",{className:"sc-head",children:[d(Nn,{onClick:()=>m("choose")}),d("p",{className:"sc-head-title",children:"Soba App"})]}),d("h2",{className:"sc-h",id:se,children:"Enter the code from that machine"}),d("p",{className:"sc-p",children:"Eight characters, shown by the Soba app once you paste the link."}),N("form",{className:"sc-stack",style:{marginTop:16},onSubmit:h=>{h.preventDefault(),lt()},children:[d("input",{className:"sc-input",value:W,onChange:h=>F(h.target.value),placeholder:"ACDE-F234",autoComplete:"off",autoFocus:!0,"aria-label":"Pairing code"}),Q&&d("p",{className:"sc-error",children:Q}),d("button",{type:"submit",className:"sc-btn sc-btn-primary",disabled:K||W.length<8,children:K?"Checking\u2026":"Continue"})]})]}),g==="confirm"&&O&&N("div",{className:"sc-card",children:[N("div",{className:"sc-head",children:[d(Nn,{onClick:()=>m("code")}),d("p",{className:"sc-head-title",children:"Soba App"})]}),d("h2",{className:"sc-title",children:"Attach this machine to your account?"}),N("p",{className:"sc-sub",children:[d(yt,{context:y})," may send your runs to it once you approve. It can never see the account or the keys on it."]}),N("ul",{className:"sc-facts",children:[d(zn,{k:"Code",v:O.user_code}),d(zn,{k:"Machine",v:O.hostname??"not stated"}),d(zn,{k:"System",v:[O.platform,O.arch].filter(Boolean).join(" / ")||"not stated"}),d(zn,{k:"Asked by",v:O.client??"not stated"}),O.labels.length>0&&d(zn,{k:"Labels",v:O.labels.join(", ")})]}),d("p",{className:"sc-note",style:{marginTop:12},children:"Every line above is what that machine said about itself. If none of it looks like a computer of yours, say no."}),be==="expired"&&d("p",{className:"sc-error",children:"That code has expired. Ask the machine for a new one. It prints a fresh code each time it starts."}),be==="answered"&&d("p",{className:"sc-error",children:"That code has already been answered. If it was not you, deny the next one."}),Q&&d("p",{className:"sc-error",children:Q}),N("div",{className:"sc-row",style:{marginTop:16},children:[d("button",{type:"button",className:"sc-btn sc-btn-primary",onClick:()=>void An(),disabled:K||be!=="live",children:"Approve"}),d("button",{type:"button",className:"sc-btn",onClick:()=>void ct(),disabled:K||be==="answered",children:"No, deny it"})]}),be==="live"&&O.expires_at&&N("p",{className:"sc-note",style:{marginTop:10},children:["This code expires in ",la(Date.parse(O.expires_at)-M),"."]})]}),g==="waiting"&&N("div",{className:"sc-card",children:[N("div",{className:"sc-head",children:[d(Nn,{onClick:()=>m("choose")}),d("p",{className:"sc-head-title",children:ve?.choice.short??"Soba App"})]}),d(wt,{mark:ve?.Mark??X}),d("h2",{className:"sc-h",id:se,children:"Approved. Waiting for it to connect"}),d("p",{className:"sc-p",children:"Nothing more to do here. This page changes when it arrives."}),de>0&&M-de>aa&&d("p",{className:"sc-note sc-tone-warn",style:{marginTop:14,textAlign:"center"},children:"Still nothing. Look at the Soba app on that machine: it says what it is doing. This keeps watching either way."})]}),g==="connected"&&N("div",{className:"sc-card",children:[d(mr,{tone:"ok"}),d("h2",{className:"sc-h",id:se,children:Be?.label?`${Be.label} is connected`:"Connected"}),N("p",{className:"sc-p",children:[d(yt,{context:y})," will use ",Be?.label?"it":"this machine"," from now on, while it is awake."]}),o&&N(Ct,{children:[d("div",{style:{marginTop:16},children:d(Un,{machines:S,onApproveRuntime:pt})}),d("button",{type:"button",className:"sc-btn sc-btn-wide",style:{marginTop:14},onClick:()=>m("manage"),children:"Done"})]})]}),g==="hosted"&&N("div",{className:"sc-card",children:[N("div",{className:"sc-head",children:[d(Nn,{onClick:()=>m("choose")}),d("p",{className:"sc-head-title",children:"ChatGPT"})]}),Pe?d(wt,{mark:an,still:!0}):d(wt,{mark:an}),d("h2",{className:"sc-h",id:se,children:Pe?"Your browser blocked the window":"Finish signing in to ChatGPT"}),d("p",{className:"sc-p",children:Pe?"Nothing opened. Open the sign-in yourself below. A link you click is allowed where a window we open is not.":"Approve it in the window that opened."}),N("div",{className:"sc-stack",style:{marginTop:18},children:[Pe&&d("a",{className:"sc-btn sc-btn-primary",href:Pe,target:"soba-connect-plan",rel:"noreferrer",children:"Open the ChatGPT sign-in"}),Q&&d("p",{className:"sc-error",children:Q}),Qe>0&&M-Qe>ia&&d("p",{className:"sc-note sc-tone-warn",children:"Still nothing. The window may have been closed before it finished, or the sign-in may have been declined. This keeps watching either way."})]})]}),g==="hosted_connected"&&N("div",{className:"sc-card",children:[d(mr,{tone:"ok"}),d("h2",{className:"sc-h",id:se,children:"ChatGPT is connected"}),N("p",{className:"sc-p",children:[d(yt,{context:y})," will run on your ChatGPT plan",he[0]?.account_label?` (${he[0].account_label})`:"",". Nothing more to pay, nothing to install."]}),d("p",{className:"sc-opt-note",style:{textAlign:"center"},children:"It runs on our side, so it has no access to your files or your terminal."}),o&&N(Ct,{children:[d("button",{type:"button",className:"sc-btn sc-btn-wide",style:{marginTop:16},onClick:()=>m("manage"),children:"Done"}),d("div",{className:"sc-opt-alt",children:d("button",{type:"button",className:"sc-alt-link",onClick:()=>m("choose"),children:"Connect a machine too"})})]})]}),g==="denied"&&N("div",{className:"sc-card",children:[d(mr,{tone:"off"}),d("h2",{className:"sc-h",id:se,children:"Declined"}),d("p",{className:"sc-p",children:mn==="machine"?"Nothing was connected. You can ask again whenever you like.":"That machine was not attached to your account, and the terminal has been told so."}),d("button",{type:"button",className:"sc-btn sc-btn-wide",style:{marginTop:16},onClick:()=>m("choose"),children:"Back to the start"})]})]})}function ko(e){return e?.app.name??"this app"}function ca(e){let n=e?.app.icon_urls;if(n?.length)return n;let t=e?.app.icon_url;return t?[t]:[]}function No(e){let n=ca(e),[t,r]=J([]),o=ae(l=>{l&&r(i=>i.includes(l)?i:[...i,l])},[]),s=ae(l=>o(l.currentTarget.getAttribute("src")),[o]),a=ae(l=>{l?.complete&&l.naturalWidth===0&&o(l.getAttribute("src"))},[o]);return{icon:n.find(l=>!t.includes(l)),onError:s,ref:a}}function ua({context:e}){let{icon:n,onError:t,ref:r}=No(e);return e?.app.mark==="soba"?d(X,{className:"sc-app-mark"}):n?d("img",{className:"sc-app-mark",src:n,alt:"","aria-hidden":"true",ref:r,onError:t}):null}function yt({context:e}){let{icon:n,onError:t,ref:r}=No(e),o=e?.app.mark==="soba";return N("span",{className:"sc-app",children:[o&&d(X,{className:"sc-app-icon"}),!o&&n&&d("img",{className:"sc-app-icon",src:n,alt:"",ref:r,onError:t}),ko(e)]})}function Nn({onClick:e}){return d("button",{type:"button",className:"sc-head-back",onClick:e,"aria-label":"Back",children:d("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",children:d("path",{d:"M15 5 8 12l7 7",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})})}function pr({className:e}){return d("svg",{className:e,viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",children:d("path",{d:"M9 5l7 7-7 7",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function wt({mark:e,still:n}){return N("span",{className:"sc-waiting","aria-hidden":"true",children:[!n&&d("svg",{className:"sc-waiting-orbit",viewBox:"0 0 100 100","aria-hidden":"true",focusable:"false",children:d("circle",{className:"sc-waiting-arc",cx:"50",cy:"50",r:"46"})}),d(e,{className:"sc-waiting-mark"})]})}function mr({tone:e}){return d("span",{className:`sc-result sc-result-${e}`,"aria-hidden":"true",children:d(Zt,{kind:e==="ok"?"snap":"gone",size:84})})}function da({text:e}){return d(Ct,{children:e.split("`").map((n,t)=>t%2===1?d("code",{className:"sc-inline-code",children:n},t):n)})}function zn({k:e,v:n}){return N("li",{className:"sc-fact",children:[d("span",{className:"sc-fact-key",children:e}),d("span",{children:n})]})}import{forwardRef as pa}from"react";import{jsx as gr,jsxs as fr}from"react/jsx-runtime";var Ar=pa(function({machine:n,className:t,...r},o){if(!n)return null;let{ariaLabel:s,state:a}=wn(n);return fr("button",{ref:o,type:"button","aria-label":s,className:["sc-btn","sc-btn-connected",t].filter(Boolean).join(" "),...r,children:[gr("span",{className:"sc-pill-tile","aria-hidden":"true",children:gr(X,{className:a.tone==="busy"?"sc-pill-mark sc-pill-mark-busy":"sc-pill-mark"})}),fr("span",{className:"sc-btn-connected-text",children:[a.word,fr("span",{className:"sc-btn-connected-where",children:[" on ",_(n)]})]}),gr("i",{className:`sc-dot sc-dot-${a.tone}`,"aria-hidden":"true"})]})});import{useEffect as ma,useRef as yr}from"react";var vt=0,br=null;function xo(){if(typeof document>"u")return()=>{};vt===0&&(br=document.body.style.overflow,document.body.style.overflow="hidden"),vt+=1;let e=!1;return()=>{e||(e=!0,vt-=1,vt===0&&(document.body.style.overflow=br??"",br=null))}}import{jsx as Ro}from"react/jsx-runtime";function qn({open:e,onClose:n,labelledBy:t,theme:r,style:o,children:s}){let a=yr(null),l=yr(null),i=yr(null);return ma(()=>{let c=a.current;if(c){if(!e){c.open&&c.close();return}return c.open||c.showModal(),document.activeElement===c&&l.current?.focus(),xo()}},[e]),Ro("dialog",{ref:a,className:"soba-connect sc-modal","aria-labelledby":t,...r?{"data-theme":r}:{},style:o,onCancel:c=>{c.preventDefault(),n()},onPointerDown:c=>{i.current=c.target},onClick:c=>{c.target===c.currentTarget&&i.current===c.currentTarget&&n()},children:Ro("div",{className:"sc-modal-sheet",ref:l,tabIndex:-1,children:s})})}import{useRef as fa,useState as Aa}from"react";var ha={"claude-code":{small:"haiku",large:"opus"}};function So(e){let n=ha[e];return!!(n?.small||n?.large)}var ga={haiku:"Haiku",sonnet:"Sonnet",opus:"Opus",fable:"Fable"};function Po(e){return ga[e]??e}function wr(e){let n=[...e].sort(mt),t=Ie([...e]),r=t?Ge(t):null,s=[{id:"auto",kind:"auto",label:"Automatic",model:"auto",...r?.runtime?{note:`Uses ${r.runtime.display_name}`}:{}}];n.some(u=>ye(u).some(p=>So(p.id)))&&s.push({id:"small",kind:"size",label:"Fast",note:"quick and cheap",model:"small"},{id:"large",kind:"size",label:"Best",note:"the most capable",model:"large"});let l=new Map;for(let u of n)for(let p of ye(u))for(let f of p.models){if(!f)continue;let g=`${p.id}/${f}`,m=l.get(g);if(m){m.machines.add(_(u));continue}l.set(g,{option:{id:g,kind:"named",label:Po(f),model:f,runtime:p.id,runtimeName:p.display_name,costClass:p.cost_class},machines:new Set([_(u)])})}let i=new Set;for(let{machines:u}of l.values())for(let p of u)i.add(p);let c=i.size>1;for(let{option:u,machines:p}of l.values()){let f=c&&p.size===1?[...p][0]:void 0;s.push(f?{...u,machine:f}:u)}return s}function Zn(e){let n=[],t=[];for(let r of e){if(r.kind!=="named"){n.push(r);continue}let o=r.runtimeName??r.runtime??"",s=t.find(a=>a.heading===o);s?s.options.push(r):t.push({heading:o,options:[r]})}return n.length?[{heading:null,options:n},...t]:t}function Cr(e,n){let t=e.find(o=>o.kind==="auto")??{id:"auto",kind:"auto",label:"Automatic",model:"auto"};if(!n||n==="auto")return{selected:t,unavailable:null};let r=e.find(o=>o.id===n);return r?{selected:r,unavailable:null}:{selected:t,unavailable:n}}function vr(e){return e.runtime?{model:e.model,runtime:e.runtime}:{model:e.model}}function Xn(e){return e.length>1}import{jsx as kt,jsxs as Mo}from"react/jsx-runtime";function kr({options:e,selected:n,onPick:t,caption:r,disabled:o,className:s}){let[a,l]=Aa(!1),i=fa(null);if(!Xn(e))return null;let c=s?`sc-mp ${s}`:"sc-mp";return Mo("span",{className:c,children:[r&&kt("span",{className:"sc-mp-cap",children:r}),Mo("button",{ref:i,type:"button",className:"sc-mp-btn","aria-haspopup":"menu","aria-expanded":a,"aria-label":`Model: ${n.label}. Change`,disabled:o,onClick:()=>l(u=>!u),children:[kt("span",{className:"sc-mp-label",children:n.label}),kt(Cn,{open:!0})]}),a&&kt(Dn,{anchor:i,label:"Which model answers",options:ba(e),current:n.id,onClose:()=>l(!1),onPick:u=>{l(!1),u&&t(u)}})]})}function ba(e){let n=[];for(let t of Zn(e))t.options.forEach((r,o)=>{let s=ya(r);n.push({id:r.id,label:r.label,...s?{note:s}:{},...t.heading&&o===0?{heading:t.heading}:{},...!t.heading&&r.kind==="size"&&o===1?{rule:!0}:{}})});return n}function ya(e){return e.kind!=="named"?e.note:e.machine?`on ${e.machine}`:void 0}import{useEffect as Nr,useRef as wa}from"react";import{jsx as Ca}from"react/jsx-runtime";var un=8;function xr({open:e,onClose:n,anchor:t,label:r,theme:o,style:s,children:a}){let l=wa(null);return Nr(()=>{let i=l.current;if(!(!i||!(typeof i.showPopover=="function")))try{e?i.showPopover():i.hidePopover()}catch{}},[e]),Nr(()=>{if(!e)return;let i=()=>{let u=l.current,p=t.current;if(!u||!p)return;let f=p.getBoundingClientRect(),g=u.offsetWidth,m=u.offsetHeight,y=window.innerWidth-g-un,R=Math.max(un,Math.min(f.right-g,Math.max(un,y))),S=f.bottom+un,k=f.top-un-m,W=S+m>window.innerHeight-un&&k>un?k:S;u.style.left=`${Math.round(R)}px`,u.style.top=`${Math.round(W)}px`};i();let c=requestAnimationFrame(i);return window.addEventListener("scroll",i,!0),window.addEventListener("resize",i),()=>{cancelAnimationFrame(c),window.removeEventListener("scroll",i,!0),window.removeEventListener("resize",i)}},[e,t]),Nr(()=>{if(!e)return;let i=u=>{u.key==="Escape"&&n()},c=u=>{let p=u.target;p&&(l.current?.contains(p)||t.current?.contains(p)||n())};return document.addEventListener("keydown",i),document.addEventListener("pointerdown",c,!0),()=>{document.removeEventListener("keydown",i),document.removeEventListener("pointerdown",c,!0)}},[e,n,t]),Ca("div",{ref:l,role:"dialog","aria-label":r,className:"soba-connect sc-pop",...o?{"data-theme":o}:{},popover:"manual",hidden:!e,style:s,children:a})}var Kn=new Map,xn=new Map,Eo=!1;function va(){Eo||typeof window>"u"||(Eo=!0,window.addEventListener("storage",e=>{!e.key||!Kn.has(e.key)||(xn.set(e.key,bt(e.key)),Rr(e.key))}))}function Rr(e){for(let n of Kn.get(e)??[])n()}function _n(e){return e??""}function Sr(e,n){let t=_n(e);va();let r=Kn.get(t)??new Set;return r.add(n),Kn.set(t,r),()=>{r.delete(n),r.size===0&&Kn.delete(t)}}function Nt(e){let n=_n(e),t=xn.get(n);if(t!==void 0)return t;let r=e?bt(e):null;return xn.set(n,r),r}function Pr(){return null}function Mr(e,n){Nt(e)===null&&(xn.set(_n(e),n),Rr(_n(e)))}function Er(e,n){let t=_n(e);xn.get(t)!==n&&(xn.set(t,n),ar(e,n),Rr(t))}function We(e){let n=`${e.unit}s`;return e.reward==="unlimited"?`Unlimited ${n} on your own AI`:e.reward==="included"&&e.includedUnits!==null?`${Na(e.includedUnits)} ${n} a month once you connect`:e.reward==="credit"&&e.creditMicros>0?`${ka(e.creditMicros)} back each month you stay connected`:null}function He(e){return e==="unlimited"||e==="included"}var Oo=new Set(["user-hardware","user-subscription"]),Io=new Set(["open-weights","frontier"]);function xe(e){return e===null||e.length===0?!1:e.every(n=>Oo.has(n))}var ka=e=>(e/1e6).toLocaleString("en-US",{style:"currency",currency:"USD",minimumFractionDigits:2,maximumFractionDigits:2}),Na=e=>e.toLocaleString("en-US");function Ir(e,n){if(!(n===null||n.some(s=>Io.has(s))))return!1;let r=e.findIndex(s=>Oo.has(s));if(r===-1)return!1;let o=e.findIndex(s=>Io.has(s));return o===-1||r<o}import{createContext as Lo,useContext as To}from"react";var Or=Lo(null);function Rn(){return To(Or)}var Lr=Lo({context:null,machines:void 0,theme:"light"});function B(){return To(Lr)}import{useMemo as Sa}from"react";import{createContext as xa,useContext as Ra}from"react";var Tr=xa(null);function D(){let e=Ra(Tr);if(!e)throw new Error("useSoba() must be used inside a <SobaProvider>.");return e}function $n(){let{compute:e}=D();return Sa(()=>{let n=e.machines,t=[...n].sort((s,a)=>Ie([s,a])===s?-1:1).map(Pa),r=Ie([...n]),o=on(n);return{view:t.length?"machines":e.loading?"loading":e.error?"error":"empty",machines:t,primary:r?t.find(s=>s.machine.id===r.id)??null:null,connected:e.connected,online:e.online,stalled:e.connected&&!e.online&&o?t.find(s=>s.machine.id===o.id)??null:null,loading:e.loading,error:e.error,refresh:e.refresh}},[e])}function Pa(e){let n=Ge(e);return{machine:e,name:_(e),state:sn(e),status:Bt(e),hardware:Wn(e),lastSeen:e.state==="offline"?Hn(e.last_seen_at):null,runtimes:ye(e).map(t=>({runtime:t,name:t.display_name,auth:Gn(t),quarantined:!!t.quarantined})),runsOn:{by:n.by,name:n.runtime?.display_name??null}}}import{jsx as et}from"react/jsx-runtime";function Ma({className:e}){let{theme:n}=B(),t=e?`soba-connect ${e}`:"soba-connect";return et("div",{className:t,"data-theme":n,children:et(Br,{})})}function Br(){let e=$n();return e.view==="loading"?et("p",{className:"sc-note",children:"Loading\u2026"}):e.view==="error"?et("p",{className:"sc-error",children:e.error?.message}):et(Un,{machines:e.machines.map(n=>n.machine)})}import{useCallback as tt,useEffect as Dr,useMemo as Wa,useRef as Ur,useState as Pn}from"react";import{useId as Ea}from"react";import{jsx as Sn,jsxs as xt}from"react/jsx-runtime";function nt({open:e,onOpenChange:n,initialCode:t,onConnected:r,showStatus:o,reason:s}){let{error:a}=D(),l=Rn(),i=B(),c=()=>n(!1),u=Ea(),p=i.context?.background?.trim(),f=p?rn(p,i.context?.accent):void 0;return xt(qn,{open:e,onClose:c,labelledBy:u,theme:i.theme,style:f,children:[a?xt("div",{className:"sc-card",children:[Sn("h2",{className:"sc-title",id:u,children:"Could not start"}),Sn("p",{className:"sc-error",children:a.message})]}):!l&&!i.context?xt("div",{className:"sc-card",children:[Sn("h2",{className:"sc-title",id:u,children:"One moment"}),Sn("p",{className:"sc-note",children:"Getting your compute\u2026"})]}):Sn(hr,{client:l,active:e,onClose:c,headingId:u,theme:i.theme,initialContext:i.context,...i.machines!==void 0?{initialMachines:i.machines}:{},...t?{initialCode:t}:{},...r?{onConnected:r}:{},...o===void 0?{}:{showStatus:o},...s?{reason:s}:{}}),xt("p",{className:"sc-modal-foot",children:[Sn(X,{className:"sc-foot-mark"}),"Secured by Soba"]})]})}import{forwardRef as Ia}from"react";import{jsx as Oa}from"react/jsx-runtime";var Gr=Ia(function(n,t){let{theme:r}=B();return Oa(Ar,{ref:t,"data-theme":r,...n})});import{useCallback as La}from"react";function Ta(){let{connect:e}=D(),n=$n(),t=La(()=>e.open("manual"),[e]);return{...wn(n.primary?.machine??null),machine:n.primary,open:t,canOpen:e.hasModal,loading:n.view==="loading"}}function Wr(e){return wn(e)}import{useCallback as Bo,useEffect as Ba,useState as Ga}from"react";function Hr({enabled:e=!0,intervalMs:n=3e3}={}){let t=Rn(),[r,o]=Ga(null),s=Bo(async()=>{t&&o(await t.runs())},[t]);Ba(()=>{if(!e||!t)return;let l=!0,i=Ce(async()=>{let c=await t.runs();l&&o(c)},n);return()=>{l=!1,i()}},[e,t,n]);let a=Bo(async l=>{if(!t)throw new Error("Stopping a run needs <SobaProvider>.");await t.stopRun(l),await s().catch(()=>{})},[t,s]);return{runs:r,refresh:s,stop:a}}import{Fragment as Go,jsx as Mn,jsxs as Wo}from"react/jsx-runtime";function dn({children:e,variant:n,className:t,initialCode:r,onConnected:o,defaultOpen:s,open:a,onOpenChange:l,showConnected:i=!0}){let{compute:c,connect:u}=D(),p=B(),{theme:f}=p,g=Rn(),[m,y]=Pn(s??!!r),R=Ur(null),S=a!==void 0,k=!S&&!s&&!r&&u.hasModal,W=S?a:k?u.isOpen:m,F=w=>{k?w?u.open("manual"):u.close():S||y(w),l?.(w)},O=Ur(W);Dr(()=>{O.current&&!W&&R.current?.focus(),O.current=W},[W]);let[P,Q]=Pn(!1),{runs:T,stop:K}=Hr({enabled:P}),q=Wa(()=>P&&T?Ha(c.machines,T):c.machines,[c.machines,P,T]),de=Ie(q),V=i&&Wr(de).connected,M=tt(()=>Q(!1),[]),[De,Y]=Pn(!1),pe=tt(async()=>{Y(!0);try{await c.refresh()}finally{Y(!1)}},[c]),Ke=Ur(pe);Ke.current=pe,Dr(()=>{P&&Ke.current()},[P]);let[Se,me]=Pn(!1),[te,mn]=Pn([]),Ue=!!p.context?.hosted_available;Dr(()=>{if(!P||!g||!Ue)return;let w=!0;return g.hosted().then(j=>{w&&mn(j.credentials)}).catch(()=>{}),()=>{w=!1}},[P,g,Ue]);let[Fe,ie]=Pn(null),he=tt(async(w,j)=>{if(g){ie(null);try{await g.approveRuntime(w,j),await c.refresh()}catch(E){ie(E.message)}}},[g,c]),re=tt(async(w,j)=>{if(g){ie(null);try{await g.preferRuntime(w,j),await c.refresh()}catch(E){ie(E.message)}}},[g,c]),Qe=tt(async w=>{if(g){ie(null);try{await g.disconnectHosted(w),mn((await g.hosted()).credentials)}catch(j){ie(j.message)}}},[g]),hn=p.context?.background?.trim(),Pe=hn?rn(hn,p.context?.accent):void 0,Te=V&&!e,oe=()=>{if(Te&&!S&&!s&&!r){Q(w=>!w);return}F(!0)};return Wo(Go,{children:[Te?Mn(Gr,{ref:R,machine:de,"aria-haspopup":"dialog","aria-expanded":P,onClick:oe,...t?{className:t}:{}}):Mn("button",{ref:R,type:"button","data-theme":f,className:["sc-btn","sc-btn-icon",n==="primary"?"sc-btn-primary":"",t].filter(Boolean).join(" "),onClick:oe,children:e??Wo(Go,{children:[Mn(X,{className:"sc-btn-mark"}),"Connect compute"]})}),Mn(xr,{open:P,onClose:M,anchor:R,label:"Your compute",theme:f,...Pe?{style:Pe}:{},children:Mn(ln,{machines:q,hosted:te,onApproveRuntime:(w,j)=>void he(w,j),onPreferRuntime:(w,j)=>void re(w,j),onDisconnectHosted:w=>void Qe(w),onRefresh:()=>void pe(),refreshing:De,error:Fe,runs:T,onStopRun:async w=>{ie(null);try{await K(w)}catch(j){throw ie(j.message),j}},onPair:()=>{Q(!1),k?u.open("pair"):(me(!0),F(!0))},...p.context?.app.name?{appName:p.context.app.name}:{}})}),!k&&Mn(nt,{open:W,onOpenChange:w=>{w||me(!1),F(w)},...Se?{showStatus:!1}:{},...r?{initialCode:r}:{},...o?{onConnected:o}:{}})]})}function Ha(e,n){return e.map(t=>{if(t.state==="offline")return t;let r=n.filter(o=>o.machine_id===t.id).length;return{...t,active:r,state:r>0?"busy":"online"}})}import{jsx as Fr,jsxs as Ua}from"react/jsx-runtime";function Da({initialCode:e,onConnected:n,className:t,showStatus:r=!0}){let{theme:o}=B();return Ua("div",{className:t?`soba-connect ${t}`:"soba-connect","data-theme":o,children:[r&&Fr(Br,{}),Fr("div",{className:"sc-compute-act",children:Fr(dn,{...e?{initialCode:e}:{},...n?{onConnected:n}:{}})})]})}import{useId as _a,useState as $a}from"react";import{useCallback as Jr,useEffect as Qo,useState as Jo}from"react";import{useCallback as Fa,useState as Qa}from"react";function rt(){let[e,n]=Qa(null);return{open:Fa(()=>{n(null),$t().then(n)},[]),launch:e,note:e==="absent"?"Nothing opened here. That machine may be a different computer, or asleep.":null}}import{useCallback as Ho,useMemo as Do}from"react";function pn(e){if(!e)return null;if(typeof e=="string")return e;if(typeof Response<"u"&&e instanceof Response)return Uo(e.status);let n=e,t=n.error;return typeof t?.code=="string"?t.code:typeof t?.type=="string"?t.type:typeof n.code=="string"?n.code:typeof n.status=="number"?Uo(n.status):n.cause&&n.cause!==e?pn(n.cause):null}function Uo(e){return e===402?"payment_required":e===409?"no_compute":null}function Qr(...e){let[n,t]=e,{plan:r,compute:o,connect:s}=D(),a=t?.predict??e.length===0,l=Va(Ja(n),o)??(a?Ya(r,o):null),i=r.plan,c=r.plans,u=Do(()=>{if(l!=="payment_required")return null;let m=i?.price??0,y=i?.included_units??0;return c.find(R=>R.id!==i?.id&&R.price>m&&(R.included_units===null||R.included_units>y))??null},[l,c,i]),p=Ho(async()=>{if(!u)return;if(u.selectable){await r.select(u.id);return}let m=await r.checkout(u.id);window.location.assign(m)},[u,r]),f=s.open,g=Ho(()=>{l&&f(l)},[f,l]);return Do(()=>{if(!l)return null;let m=i?We({unit:i.unit,reward:i.connected_reward,includedUnits:i.connected_included_units,creditMicros:i.connected_credit*1e6}):null,y=i&&He(i.connected_reward)?m:null;return{reason:l,...ja(l,{connectOffer:y,connected:o.connected,online:o.online,machine:on(o.machines)?.label??null,unit:i?.unit??"message",interval:i?.interval??"month",upgrade:u!==null,resets:r.current?.period_end??null}),connectOffer:y,upgradeTo:u,connect:g,upgrade:p}},[l,i,o,u,g,p,r.current?.period_end])}function Ja(e){let n=pn(e);return n==="payment_required"||n==="no_compute"?n:null}function Va(e,n){return e==="no_compute"&&n.connected&&n.online?null:e}function Ya(e,n){let t=e.plan;return!t||n.loading?null:xe(t.route_allow)&&!n.online?"no_compute":e.remaining===0&&t.overage==="stop"?"payment_required":null}function ja(e,n){if(e==="payment_required"){let t=`No ${n.unit}s left this ${n.interval}`;return n.connectOffer&&!n.connected?{title:t,body:`${n.connectOffer}. Connecting takes a minute and costs nothing.`}:n.connectOffer&&!n.online?{title:t,body:`${n.connectOffer}. Waking ${n.machine??"your machine"} is enough.`}:n.upgrade?{title:t,body:n.resets?`A larger plan carries on now. This one comes back on ${Fo(n.resets)}.`:"A larger plan carries on now, or wait for this one to renew."}:{title:t,body:n.resets?`Your allowance comes back on ${Fo(n.resets)}.`:"Your allowance comes back at the start of the next period."}}return n.connected&&!n.online?{title:`${n.machine??"Your machine"} can't be reached`,body:"This run needs it awake and connected. Open Soba App on that machine, or connect another one."}:{title:"Nothing connected yet",body:"This app runs on AI you already pay for, on a machine of your own. Connect one and this run has somewhere to go."}}function Fo(e){let n=new Date(e);return Number.isNaN(n.getTime())?e:n.toLocaleDateString(void 0,{day:"numeric",month:"long"})}function za(e){let{plan:n,allowance:t,connected:r,online:o,quiet:s,error:a,predict:l,at:i,waved:c}=e;if(!n)return null;let u=e.allow!==void 0?e.allow:n.route_allow;if(r){if(o)return null;let y=xe(u);return{reason:"stalled",title:`${s??"Your machine"} can\u2019t be reached`,detail:y?"The Soba app there has stopped reporting in, so runs have nowhere to go until it is back.":"The Soba app there has stopped reporting in, so nothing will run on your own AI until it is back.",meter:null,dismissible:!1,atTheWall:!1,ownCompute:y}}let p=pn(a),f=p==="payment_required"||p==="no_compute",g=n.ask_to_connect!==!1&&Ir(n.route_prefer,u);if(!l&&!f&&!g)return null;let m=xe(u)?qa(n.unit,xe(n.route_allow)):He(n.connected_reward)?Xa(t,n,i):g?Za(n.unit):null;return!m||m.dismissible&&c?null:{...m,dismissible:!!m.dismissible,ownCompute:!1,atTheWall:!m.dismissible&&(!l||m.meter!==null&&m.meter.left===0)}}function Vr(e={}){let{at:n=.25,error:t,allow:r}=e,o=e.predict??!(e.errorGiven??t!==void 0),{plan:s,compute:a,connect:l}=D(),i=ir(l.publishableKey),[c,u]=Jo(!1);Qo(()=>{u(lr(i))},[i]);let p=Jr(()=>{u(!0),cr(i)},[i]),f=Jr(()=>l.open("manual"),[l]),g=Jr(()=>l.open("no_compute"),[l]),m=rt(),[y,R]=Jo(!1),{refresh:S}=a,{launch:k}=m;Qo(()=>{if(k===null||k==="absent")return;R(!1);let Q=setInterval(()=>void S(),3e3),T=setTimeout(()=>{clearInterval(Q),R(!0)},2e4);return()=>{clearInterval(Q),clearTimeout(T)}},[k,S]);let W=Ka(l.app?.name,Vn(l.connectUrl)),F=s.loading||a.loading,O=on(a.machines),P=F?null:za({plan:s.plan,allowance:{remaining:s.remaining,included:s.included},connected:a.connected,online:a.online,quiet:O?_(O):null,error:t,predict:o,...r!==void 0?{allow:r}:{},at:n,waved:c});return{reason:P?.reason??null,visible:P!==null,title:P?.title??null,detail:P?.detail??null,meter:P?.meter??null,dismissible:P?.dismissible??!1,dismissed:c,dismiss:p,open:f,atTheWall:P?.atTheWall??!1,steps:W,stalled:P?.reason==="stalled"?{machine:O?_(O):null,ownCompute:P.ownCompute,wake:m.open,launch:m.launch,note:m.note,stuck:y,connectAnother:g}:null,loading:F}}function qa(e,n){return{reason:"needed",title:n?"This plan runs on your own AI.":`These ${e}s run on your own AI.`,detail:`Connect a machine and your ${e}s run there, free, on access you already have.`,meter:null}}function Za(e){return{reason:"preferred",title:"This plan prefers your own AI.",detail:`Connect a machine and your ${e}s run there instead, on access you already have.`,meter:null,dismissible:!0}}function Xa(e,n,t){let{remaining:r,included:o}=e;if(r===null||o===null||o===0||r>Math.ceil(o*t))return null;let s=We({unit:n.unit,reward:n.connected_reward,includedUnits:n.connected_included_units,creditMicros:n.connected_credit*1e6});return s?{reason:"running",title:r===0?`No ${n.unit}s left this month.`:`${r} ${n.unit}${r===1?"":"s"} left this month.`,detail:`${s}.`,meter:{left:r,of:o}}:null}function Ka(e,n){return[{lead:"Download Soba App",detail:"",...n?{linksLead:"Get it for"}:{},links:n?Jn.map(t=>({label:t.label,href:`${n}/download/${t.slug}`})):[]},{lead:"Connect compute",detail:"Press this, then approve the pairing when the app asks.",opens:!0,links:[]},{lead:"Let your AIs serve",detail:`It finds what is installed on that machine. Allow one, and ${e??"this app"} sends every run there.`,linksLead:"Nothing on it yet?",links:ce.map(t=>({label:t.short,href:t.install}))}]}import{Fragment as Yo,jsx as L,jsxs as qe}from"react/jsx-runtime";function ei(e){let{className:n,fallback:t=null}=e,r=Vr({...e.at===void 0?{}:{at:e.at},...e.predict===void 0?{}:{predict:e.predict},...e.allow===void 0?{}:{allow:e.allow},error:e.error,errorGiven:"error"in e}),{connect:o}=D(),{theme:s}=B(),[a,l]=$a(null),i=_a(),c=L(Yo,{children:t});if(!r.visible)return c;if(r.stalled)return L(Vo,{className:n,theme:s,stalled:!0,children:L(ni,{title:r.title??"",detail:r.detail??"",stalled:r.stalled})});let u=a??r.atTheWall;return qe(Vo,{className:n,theme:s,children:[qe("div",{className:"sc-nudge-top",children:[qe("div",{className:"sc-nudge-say",children:[L("p",{className:"sc-nudge-title",children:r.title}),L("p",{className:"sc-nudge-detail",children:r.detail}),qe("button",{type:"button",className:"sc-btn sc-btn-quiet sc-nudge-more","aria-expanded":u,"aria-controls":i,onClick:()=>l(!u),children:[u?"Hide the details":"How it works",L(ri,{})]})]}),r.dismissible?L("button",{type:"button",className:"sc-nudge-dismiss","aria-label":"Dismiss",title:"Dismiss",onClick:r.dismiss,children:L(ti,{})}):null]}),u?L("ol",{className:"sc-nudge-steps",id:i,children:r.steps.map(p=>qe("li",{children:[p.opens?L("button",{type:"button",className:"sc-step-lead",onClick:()=>o.open("manual"),children:p.lead}):L("strong",{children:p.lead}),p.detail?L("span",{children:p.detail}):null,p.links.length>0?qe("span",{className:"sc-step-links",children:[p.linksLead,p.links.map(f=>L("a",{href:f.href,target:"_blank",rel:"noreferrer noopener",children:f.label},f.href))]}):null]},p.lead))}):null,L(dn,{variant:"primary"})]})}function Vo({className:e,theme:n,stalled:t,children:r}){return L("div",{className:e?`soba-connect sc-fill ${e}`:"soba-connect sc-fill","data-theme":n,children:L("div",{className:t?"sc-nudge sc-nudge-stalled":"sc-nudge",children:r})})}function ni({title:e,detail:n,stalled:t}){return qe(Yo,{children:[L("div",{className:"sc-nudge-top",children:qe("div",{className:"sc-nudge-say",children:[L("p",{className:"sc-nudge-title",children:e}),L("p",{className:"sc-nudge-detail",children:n}),t.note&&L("p",{className:"sc-nudge-note",children:t.note}),t.stuck&&L("p",{className:"sc-nudge-note",children:"The Soba app is open, but this machine still isn\u2019t reporting in. It may no longer be connected to this app."}),(t.launch==="absent"||t.stuck)&&L("button",{type:"button",className:"sc-btn sc-btn-quiet sc-nudge-more",onClick:t.connectAnother,children:t.stuck?"Connect it again":"Connect another machine"})]})}),L("button",{type:"button",className:"sc-btn sc-btn-primary",onClick:t.wake,children:"Open Soba App"})]})}function ti(){return L("svg",{viewBox:"0 0 16 16","aria-hidden":"true",focusable:"false",className:"sc-nudge-x",children:L("path",{d:"m4.8 4.8 6.4 6.4M11.2 4.8l-6.4 6.4",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round"})})}function ri(){return L("svg",{viewBox:"0 0 16 16","aria-hidden":"true",focusable:"false",className:"sc-nudge-chev",children:L("path",{d:"M4.5 6.5 8 10l3.5-3.5",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round"})})}var oi=new Set(["delta","thinking","status","done","error"]);function En(e){let n;try{n=JSON.parse(e)}catch{return null}if(!n||typeof n!="object")return null;let t=n,r=t.type==="event"?t.event:t;if(!r||typeof r!="object")return null;let o=r;if(typeof o.type!="string"||!oi.has(o.type))return null;let s={type:o.type};return typeof o.text=="string"&&(s.text=o.text),typeof o.message=="string"&&(s.message=o.message),typeof o.tool=="string"&&(s.tool=o.tool),typeof o.tier=="string"&&(s.tier=o.tier),o.usage&&typeof o.usage=="object"&&(s.usage=o.usage),typeof o.session=="string"&&(s.session=o.session),typeof o.toolInput=="string"&&(s.toolInput=o.toolInput),o.git&&typeof o.git=="object"&&(s.git=o.git),o.turn&&typeof o.turn=="object"&&typeof o.turn.text=="string"&&(s.turn={text:o.turn.text}),typeof o.reason=="string"&&(s.reason=o.reason),typeof o.retryable=="boolean"&&(s.retryable=o.retryable),(o.state==="interrupted"||o.state==="resumed")&&(s.state=o.state),s}async function*Yr(e){let n=e.body;if(!n)throw new Error("That run response had no body to stream.");let t=(e.headers.get("content-type")??"").includes("ndjson"),r=n.getReader(),o=new TextDecoder,s="",a=[];try{for(;;){let i=await r.read();if(i.done)break;for(s+=o.decode(i.value,{stream:!0});;){let c=s.indexOf(`
3
- `);if(c===-1)break;let u=zo(s.slice(0,c));if(s=s.slice(c+1),t){let p=u.trim()?En(u):null;p&&(yield p);continue}if(u===""){let p=a.join(`
4
- `);if(a=[],p==="[DONE]")return;let f=p?En(p):null;f&&(yield f);continue}jo(u,a)}}!t&&s&&jo(zo(s),a);let l=t?s.trim():a.join(`
5
- `);if(l&&l!=="[DONE]"){let i=En(l);i&&(yield i)}}finally{r.cancel().catch(()=>{})}}function jo(e,n){if(!e||e.startsWith(":"))return;let t=e.indexOf(":");if(t===-1||e.slice(0,t)!=="data")return;let r=e.slice(t+1);n.push(r.startsWith(" ")?r.slice(1):r)}function zo(e){return e.endsWith("\r")?e.slice(0,-1):e}async function si(e){let n="";for await(let t of e)if(t.type==="delta"&&t.text&&(n+=t.text),t.type==="error")throw new Error(t.message??"The run ended with an error.");return n}import{useCallback as jr,useEffect as ai,useMemo as zr,useSyncExternalStore as ii}from"react";function qr(e={}){let{compute:n,connect:t}=D(),{value:r,onChange:o,defaultValue:s,remember:a=!0,user:l}=e,i=r!==void 0,c=a&&!i?sr(t.publishableKey,l):null,u=jr(k=>Sr(c,k),[c]),p=ii(u,jr(()=>Nt(c),[c]),Pr),f=zr(()=>wr(n.machines),[n.machines]),g=zr(()=>Zn(f),[f]);ai(()=>{i||!s||Mr(c,s)},[i,s,c]);let m=i?r:p??s??null,{selected:y,unavailable:R}=zr(()=>Cr(f,m??null),[f,m]),S=jr(k=>{i||Er(c,k),o?.(k)},[i,c,o]);return{options:f,groups:g,selected:y,select:S,run:vr(y),unavailable:R,pickable:Xn(f),loading:n.loading&&!n.machines.length}}import{jsx as qo}from"react/jsx-runtime";function li({caption:e,disabled:n,className:t,...r}){let{theme:o}=B(),{options:s,selected:a,select:l,pickable:i}=qr(r);return i?qo("span",{className:"soba-connect sc-inline","data-theme":o,children:qo(kr,{options:s,selected:a,onPick:l,...e?{caption:e}:{},...n?{disabled:n}:{},...t?{className:t}:{}})}):null}import{useEffect as ci}from"react";var Zo="data-soba-react",Xo=!1;function ot(){if(Xo||typeof document>"u"||(Xo=!0,document.querySelector(`style[${Zo}]`)))return;let e=document.createElement("style");e.setAttribute(Zo,""),e.textContent=`.soba-connect {
2
+ var Yt={ready:{arc:!0},serving:{arc:!0,slot:"stream"},paused:{arc:!1,slot:"zzz"},thinking:{arc:!1,slot:"dots"},connecting:{arc:!1,slot:"orbit"},attention:{arc:!1,slot:"bang"},gone:{arc:!1,slot:"cross"},snap:{arc:!1,slot:"snap"},listening:{arc:!1,slot:"bars"},permission:{arc:!1,slot:"ring"},ai:{arc:!1,slot:"sparks"}};var zt="105 162 420 420",jt="M407.1 308.9 A158 158 0 1 0 407.1 491.1 A116 116 0 0 1 407.1 308.9 Z",un="M448.5 320 A110 110 0 0 1 448.5 480";import{Fragment as Qn,jsx as R,jsxs as Ke}from"react/jsx-runtime";function Xe({kind:e,size:n=44,className:t}){let r=Yt[e];return Ke("svg",{className:`bx${t?` ${t}`:""}`,"data-expression":e,viewBox:zt,overflow:"visible",width:n,height:n,"aria-hidden":"true",children:[R("path",{d:jt,fill:"currentColor"}),R("path",{className:"bx-arc",d:un,fill:"none",stroke:"currentColor",strokeWidth:17,strokeLinecap:"round"}),r.slot==="stream"&&R(gs,{}),r.slot==="zzz"&&R(fs,{}),r.slot==="dots"&&R(As,{}),r.slot==="bang"&&R(bs,{}),r.slot==="orbit"&&R(ys,{}),r.slot==="cross"&&R(ws,{}),r.slot==="snap"&&R(Cs,{}),r.slot==="bars"&&R(vs,{}),r.slot==="ring"&&R(ks,{}),r.slot==="sparks"&&R(Ns,{})]})}function gs(){return R("path",{className:"bx-st",d:"M475.3 290.3 A150 150 0 0 1 475.3 509.7",fill:"none",stroke:"currentColor",strokeWidth:"15",strokeLinecap:"round",strokeDasharray:"0.1 31"})}function fs(){return Ke(Qn,{children:[R("g",{className:"bx-z1",children:R("path",{d:"M444 372 H496 L444 436 H496",fill:"none",stroke:"currentColor",strokeWidth:"20",strokeLinecap:"round",strokeLinejoin:"round"})}),R("g",{className:"bx-z2",children:R("path",{d:"M492 300 H522 L492 338 H522",fill:"none",stroke:"currentColor",strokeWidth:"15",strokeLinecap:"round",strokeLinejoin:"round"})})]})}function As(){return Ke(Qn,{children:[R("circle",{className:"bx-th",cx:"463.1",cy:"336.9",r:"21",fill:"currentColor"}),R("circle",{className:"bx-th bx-th2",cx:"483",cy:"400",r:"21",fill:"currentColor"}),R("circle",{className:"bx-th bx-th3",cx:"463.1",cy:"463.1",r:"21",fill:"currentColor"})]})}function bs(){return Ke("g",{className:"bx-at",children:[R("line",{x1:"490",y1:"312",x2:"490",y2:"414",stroke:"currentColor",strokeWidth:"46",strokeLinecap:"round"}),R("circle",{cx:"490",cy:"484",r:"28",fill:"currentColor"})]})}function ys(){return Ke("g",{className:"bx-ob",children:[R("path",{d:un,fill:"none",stroke:"var(--tile-bg, transparent)",strokeWidth:41,strokeLinecap:"round"}),R("path",{d:un,fill:"none",stroke:"currentColor",strokeWidth:17,strokeLinecap:"round"})]})}function ws(){return Ke(Qn,{children:[R("path",{className:"bx-xa",d:un,fill:"none",stroke:"currentColor",strokeWidth:17,strokeLinecap:"round"}),R("g",{className:"bx-xx",children:R("path",{d:"M442 364 L514 436 M514 364 L442 436",fill:"none",stroke:"currentColor",strokeWidth:"24",strokeLinecap:"round"})})]})}function Cs(){return R("path",{className:"bx-snap",d:un,fill:"none",stroke:"currentColor",strokeWidth:17,strokeLinecap:"round"})}function vs(){return Ke("g",{stroke:"currentColor",strokeWidth:"17",strokeLinecap:"round",children:[R("line",{className:"bx-vb",x1:"452",y1:"370",x2:"452",y2:"430"}),R("line",{className:"bx-vb bx-vb2",x1:"482",y1:"330",x2:"482",y2:"470"}),R("line",{className:"bx-vb bx-vb3",x1:"512",y1:"355",x2:"512",y2:"445"})]})}function ks(){return R(Qn,{children:[[450,366],[474,376],[484,400],[474,424],[450,434],[426,424],[416,400],[426,376]].map(([n,t],r)=>R("circle",{className:"bx-w",cx:n,cy:t,r:"11",fill:"currentColor",style:{animationDelay:`${-1.2+r*.15}s`}},r))})}function Ns(){return Ke(Qn,{children:[R("g",{className:"bx-sp",children:R("path",{d:"M460 300 Q465.4 324.6 490 330 Q465.4 335.4 460 360 Q454.6 335.4 430 330 Q454.6 324.6 460 300 Z",fill:"currentColor"})}),R("g",{className:"bx-sp bx-sp2",children:R("path",{d:"M486 356 Q493.92 392.08 530 400 Q493.92 407.92 486 444 Q478.08 407.92 442 400 Q478.08 392.08 486 356 Z",fill:"currentColor"})}),R("g",{className:"bx-sp bx-sp3",children:R("path",{d:"M460 440 Q465.4 464.6 490 470 Q465.4 475.4 460 500 Q454.6 475.4 430 470 Q454.6 464.6 460 440 Z",fill:"currentColor"})})]})}var xs={"claude-code":{small:"haiku",large:"opus"}};function kt(e){let n=xs[e];return!!(n?.small||n?.large)}import{useEffect as Qs,useRef as Vs,useState as Rt}from"react";var Sn=class extends Error{status;constructor(n,t){super(n),this.name="ConnectError",this.status=t}},Ms=5*6e4,Vn=class{session;baseUrl;doFetch;lastMachines=null;machinesUrl=null;gatewayBackUntil=0;constructor(n){this.session=n.session,this.baseUrl=(n.baseUrl??"").replace(/\/+$/,""),this.doFetch=n.fetchImpl??fetch.bind(globalThis)}async context(){let n=await this.request("GET","/v1/connect");return this.setMachinesUrl(n.machines_url),n}setMachinesUrl(n){typeof n=="string"&&/^https?:\/\//.test(n)&&(this.machinesUrl=n)}async machines(){let n=this.lastMachines,t=n?`?v=${encodeURIComponent(n.version)}`:"",r;if(this.machinesUrl&&Date.now()>=this.gatewayBackUntil)try{r=await this.request("GET",`${this.machinesUrl}${t}`)}catch(s){if(s instanceof Sn&&s.status===401)throw s;this.gatewayBackUntil=Date.now()+Ms}if(r??=await this.request("GET",`/v1/machines${t}`),r.unchanged&&n)return n.machines;let o=Array.isArray(r.machines)?r.machines:[];return this.lastMachines=typeof r.version=="string"?{version:r.version,machines:o}:null,o}async runs(){let n=await this.request("GET","/v1/machines/runs");return Array.isArray(n.runs)?n.runs:[]}async stopRun(n){let t=this.machinesUrl?.replace(/\/v1\/machines$/,"");if(!t)throw new Sn("This page can't stop runs yet: it hasn't been told where Soba's gateway is.",501);await this.request("POST",`${t}/v1/runs/${encodeURIComponent(n)}/stop`,{})}lookup(n){return this.request("GET",`/v1/device/lookup?code=${encodeURIComponent(n)}`)}approve(n){return this.request("POST","/v1/device/approve",{user_code:n})}claim(n){return this.request("POST","/v1/device/claim",{pairing_nonce:n})}deny(n){return this.request("POST","/v1/device/deny",{user_code:n})}plans(){return this.request("GET","/v1/plans")}selectPlan(n){return this.request("POST","/v1/plans/select",{plan:n})}checkoutPlan(n,t){return this.request("POST","/v1/plans/checkout",{plan:n,...t?.successUrl?{success_url:t.successUrl}:{},...t?.cancelUrl?{cancel_url:t.cancelUrl}:{}})}leavePlan(){return this.request("DELETE","/v1/plans/select")}hosted(){return this.request("GET","/v1/hosted")}startHosted(){return this.request("POST","/v1/hosted/start")}disconnectHosted(n){return this.request("DELETE",n?`/v1/hosted?provider=${encodeURIComponent(n)}`:"/v1/hosted")}approveRuntime(n,t){return this.request("POST","/v1/runtimes/approve",{machine_id:n,runtime_id:t})}preferRuntime(n,t){return this.request("POST","/v1/runtimes/prefer",{machine_id:n,runtime_id:t})}async request(n,t,r){let o=await this.doFetch(/^https?:\/\//.test(t)?t:`${this.baseUrl}${t}`,{method:n,headers:{authorization:`Bearer ${this.session}`,...r?{"content-type":"application/json"}:{}},...r?{body:JSON.stringify(r)}:{}}),s={};try{s=await o.json()}catch{}if(!o.ok){let a=typeof s.error=="string"?s.error:`Request failed (${o.status})`;throw new Sn(a,o.status)}return s}};function Jn(e){let n=/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(e.trim());if(!n?.[1])return"#ffffff";let t=n[1].length===3?[...n[1]].map(s=>s+s).join(""):n[1],r=s=>{let a=Number.parseInt(t.slice(s*2,s*2+2),16)/255;return a<=.04045?a/12.92:((a+.055)/1.055)**2.4};return .2126*r(0)+.7152*r(1)+.0722*r(2)>.45?"#101012":"#ffffff"}function qt(e){let n=/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(e.trim());if(!n?.[1])return null;let t=n[1].length===3?[...n[1]].map(r=>r+r).join(""):n[1];return[0,1,2].map(r=>Number.parseInt(t.slice(r*2,r*2+2),16))}function Mn(e,n,t){let r=qt(e),o=qt(n);return!r||!o?e:`#${r.map((a,l)=>Math.round(a+(o[l]-a)*t)).map(a=>a.toString(16).padStart(2,"0")).join("")}`}function dn(e,n){if(!qt(e))return{};let t=Jn(e),r=n?.trim();return{"--sc-ground":e,"--sc-shell":e,"--sc-sheet":Mn(e,t,.07),"--sc-raised":Mn(e,t,.13),"--sc-line":Mn(e,t,.18),"--sc-line-2":Mn(e,t,.28),"--sc-text":t,"--sc-text-2":Mn(t,e,.15),"--sc-muted":Mn(t,e,.38),...r?{"--sc-accent":r,"--sc-accent-fg":Jn(r)}:{"--sc-accent":t,"--sc-accent-fg":e}}}function _e(e){return e.authenticated===!0?{tone:"ok",text:"signed in"}:e.authenticated===!1?{tone:"warn",text:e.auth_hint??"signed out on that machine"}:{tone:"unknown",text:"could not tell"}}function Yn(e){let{platform:n,arch:t}=e;if(!n)return null;let r=n==="darwin"||n==="macos",o=r?"Mac":n==="win32"||n==="windows"?"Windows PC":"Linux machine";return r?`${t==="aarch64"||t==="arm64"?"Apple silicon ":""}${o}`:o}function pn(e){return e.find(n=>n.state==="offline")??null}function Zt(e){return e.state==="busy"?{tone:"busy",text:`serving ${e.active} of ${e.capacity}`}:e.state==="online"?{tone:"ok",text:"connected"}:{tone:"off",text:"asleep or offline"}}function j(e){let n=e.label?.trim(),t=e.name?.trim();return n&&(!t||n!==t)?n:(t??n??"").replace(/\.(local|lan|home|internal)$/i,"").replace(/[-_]+/g," ").trim()||n||"This machine"}function Nt(e,n){let t=o=>o.state==="busy"?0:o.state==="online"?1:2,r=o=>o.last_seen_at?Date.parse(o.last_seen_at):0;return t(e)-t(n)||r(n)-r(e)}function De(e){return[...e].sort(Nt)[0]??null}function mn(e){return e?e.state==="busy"?{tone:"busy",word:"Serving"}:e.state==="online"?{tone:"ok",word:"Connected"}:e.pairing_lost?{tone:"off",word:"Not connected"}:{tone:"off",word:"Asleep"}:{tone:"off",word:"No compute"}}function Pn(e){let n=mn(e);return{label:e?n.word:"Connect compute",ariaLabel:e?e.pairing_lost?`${j(e)} is not connected`:`${n.word} on ${j(e)}`:"Connect compute",connected:e!==null,state:n}}function hn(e){return e.state==="online"||e.state==="busy"}function zn(e){if(!e)return"never seen";let n=Date.parse(e);if(Number.isNaN(n))return"never seen";let t=Date.now()-n,r=6e4;return t<2*r?"just now":t<60*r?`${Math.floor(t/r)} min ago`:t<24*60*r?`${Math.floor(t/(60*r))} hr ago`:`${Math.floor(t/(24*60*r))} days ago`}function Xt(e){return e.runtimes.filter(n=>n.id!=="shell")}function Ne(e){return e.runtimes.filter(n=>n.id!=="shell"&&!n.quarantined&&!n.absent)}function Ie(e){let n=a=>a?e.runtimes.find(l=>l.id===a)??null:null;if(e.requested_runtime)return{by:"app",runtimeId:e.requested_runtime,runtime:n(e.requested_runtime)};let t=Ne(e),r=t.find(a=>a.id===e.preferred_runtime);if(r)return{by:"you",runtimeId:r.id,runtime:r};let o=a=>a.id==="claude-code"?0:a.id==="codex"?1:2,s=[...t].sort((a,l)=>o(a)-o(l))[0]??null;return{by:"default",runtimeId:s?.id??null,runtime:s}}var Kt="soba";function jn(){return`${Kt}://show`}function qn(e,n,t){let r=`${Kt}://connect?url=${encodeURIComponent(e)}`;return n&&(r+=`&nonce=${encodeURIComponent(n)}`),t&&(r+=`&want=${encodeURIComponent(t)}`),r}function Zn(){let e=globalThis.crypto;if(!e?.getRandomValues)return null;let n=e.getRandomValues(new Uint8Array(32)),t="";for(let r of n)t+=String.fromCharCode(r);return btoa(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}var Ss=1600;function _t(e={}){return er(e)}async function $t(e,n={}){if(typeof window>"u"||typeof document>"u")return"unknown";let t=er(n);try{window.location.href=qn(e,n.nonce,n.want)}catch{return"absent"}return t}async function Xn(e={}){if(typeof window>"u"||typeof document>"u")return"unknown";let n=er(e);try{window.location.href=jn()}catch{return"absent"}return n}async function er(e){if(typeof window>"u"||typeof document>"u")return"unknown";let n=e.graceMs??Ss,t=document.visibilityState==="visible"&&document.hasFocus(),r=!1,o=()=>{r=!0},s=()=>{document.visibilityState==="hidden"&&(r=!0)};return window.addEventListener("blur",o),window.addEventListener("pagehide",o),document.addEventListener("visibilitychange",s),await new Promise(a=>setTimeout(a,n)),window.removeEventListener("blur",o),window.removeEventListener("pagehide",o),document.removeEventListener("visibilitychange",s),t?r?"opened":"absent":"unknown"}var po={"claude-code":"data:image/png;base64,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",codex:"data:image/png;base64,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",ollama:"data:image/png;base64,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","cursor-agent":"data:image/png;base64,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",antigravity:"data:image/png;base64,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",opencode:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAQKADAAQAAAABAAAAQAAAAABGUUKwAAACRUlEQVR4Ae2bzWoCQQzHs1+K4kEsVbwIFuyxSH0goTehD1B8jYLHgg9k74JU8AGkFy/WXbsRFsTClkmMs+wkUFQ0k+SXv5nZbevdNZtHcNh8h2s/la4AVAGOE9CvgOMCAFWAKsBxAiG3/uPR7kHS8zxWCWwAvm93jHAbQAaAgZH++2wGD/0+qwtU56/1Gl4nE8hyoaxDBpAFex6N4HEwyF7e9LHZarHjsfX7s9+zk6AucI3YbADU5IvipwCK0glbeTivAPYukNc53J72zCFZqVRO221eHM57ogB2ux28jMew2WwgCM1CxYcD9Ho9+JjPodFocGrM9TXLKnepv2+iAlarFSyXSwgNARxSAKgeXEPSRAFg4lh4FEXGAPCUaQqNAsr5IagAKLIpk4/4DMAhlv2YgKP4mKyffVYcAA5A3MtNBxreZ0BfaRMFgJP8aTiEdqcDQRAY1RLHMXS7XdFDECYkCgADVKtVqNVqJADoK23iALLvMj6aWOZn4kP5rG6DFGpl8lEFlKmblFpUARRqZfJRBZSpm5RaVAEUamXycV4B4tcCSZIAXtmZGvqgr7SJAsDL4fb9PYTppbBveDmcpABa6W9/cQ1JEwVQr9fhbTpl5S99U0QUAHYP7wYV2ZwfggqgyPK8RW6qAC7lyOKQu0Zs9i7wuVjA93bL5Ujyxz+T45rH/Z8h6YPKfwWa3m2+XI+tgFscVy+TPn/NbQAbADeB82JsPNddwAb1IsVUBRSpGzZyUQXYoF6kmKqAInXDRi7OK+AXu4OD+Y9GPOkAAAAASUVORK5CYII=",grok:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAQAAAAAYLlVAAAABGdBTUEAALGPC/xhBQAADQRpQ0NQa0NHQ29sb3JTcGFjZUdlbmVyaWNHcmF5R2FtbWEyXzIAAFiFpVcHXJPXFr/fyACSsKeMsJFlQIEAMiIzgOwhuIhJIIEQYgYC4kKKFaxbHDgqKopaXBWBOlGLVurGrQ9qqaDUYi0urL6bBBCr7Xvv97787nf/3z3n3HPOPeeeewOA7kaORCJCAQB5Yrk0IpGVPik9g066B8jAGGgDd6DN4cokrPj4GMgCxPliPvjkeXEDIMr+mptyrk/p//gQeHwZF/YnYSviybh5ACDjASCbcSVSOQAak+C47Sy5RIlLIDbITU4MgXg55KEMyiofqwi+mC8VcukRUk4RPYKTl8ehe7p70uOl+VlC0Wes/n+fPJFiWDdsFFluUjTs3aH9ZTxOqBL7QXyQywlLgpgJcW+BMDUW4mAAUDuJfEIixFEQ8xS5KSyIXSGuz5KGp0AcCPEdgSJSiccBgJkUC5LTIDaDOCY3P1opawNxlnhGbJxaF/YlVxaSAbETxC0CPlsZMzuIH0vzE5U8zgDgNB4/NAxiaAfOFMrZyYO4XFaQFKa2E79eLAiJVesiUHI4UfEQO0DswBdFJKrnIcRI5PHKOeE3oUAsio1R+0U4x5ep/IXfRLJckBwJsSfEyXJpcqLaHmJ5ljCcDXE4xLsF0shEtb/EPolIlWdwTUjuHGlYhHpNSIVSRWKK2kfSdr44RTk/zBHSA5CKcAAf5IMZ8M0FYtAJ6EAGhKBAhbIBB+TBRocWuMIWAbnEsEkhhwzkqjikoGuYPiShlHEDEkjLB1mQVwQlh8bpgAdnUEsqZ8mHTfmlnLlbNcYd1OgOW4jlDqCAXwLQC+kCiCaCDtVIIbQwD/YhcFQBadkQj9Silo9XWau2gT5of8+glnyVLZxhuQ+2hUC6GBTDEdmQb7gxzsDHwuaPx+ABOEMlJYUcRcBNNT5eNTak9YPnSt96hrXOhLaO9H7kig2t4ikoJYffIuiheHB9ZNCat1Amd1D6L34uN1M4SSRVSxPY02rVI6XS6ULupWV9rSVHTQD9xpKT5wF9r07TuWEb6e1445RrlNaSf4jqp7Z9HNW4kXmjyiTeJ3kDdRGuEi4THhCuAzrsfya0E7ohuku4B3+3h+35EAP12gzlhNouLoIN28CCmkUqah5sQhWPbDgeCojl8J2lknb7SywiPvFoJD1/WHs2bPl/tWEwY/gq/ZzPrs//skNGrGSWeLmZRDKttmSAL1GvhzJ2/EWxL2JBqStjP6OXsZ2xl/Gc8eBD/Bg3Gb8y2hlbIeUJtgo7jB3DmrBmrA3Q4VczdgprUqG92FH4O/A3OyL7MztCmWHcwR2gpMoHc3DkXhnpM2tENJT8Q2uY8zf5PTKHlGv531k0cp6PKwj/wy6l2dI8aCSaM82LxqIhNGv486QFQ2RLs6HF0IwhNZLmSAuljRqRd+qIiQYzSPhRPVBbnA6pQ5kmVlUjDuRUcnAG/f2rj/SPvFR6JhyZGwgV5oZwRA35XO2if7TXUqCsEMxSyctU1UGskpN8lN8yVdWCI8hkVQw/YxvRj+hIDCM6ftBDDCVGEsNh76EcJ44hRkHsq+TCLXEPnA2rWxyg4yzcCw8exOqKN1TzVFHFgyA1EA/Fmcoa+dFO4P5HT0fuQnjXkPML5cqLQUi+pEgqzBbI6Sx4M+LT2WKuuyvdk+EBT0TlPUt9fXieoLo/IUZtXIW0QD2GK18EoAnvYAbAFFgCW3iqu0FdPsAfnrNh8IyMA8kwstOgdQJojRSubQlYAMpBJVgO1oANYAvYDupAPTgIjoCjsCp/Dy6Ay6Ad3IUnUBd4AvrACzCAIAgJoSL6iClihdgjLognwkQCkTAkBklE0pFMJBsRIwqkBFmIVCIrkQ3IVqQOOYA0IaeQ88gV5DbSifQgvyNvUAyloAaoBeqAjkGZKAuNRpPRqWg2OhMtRsvQpeg6tAbdizagp9ALaDvagT5B+zGAaWFGmDXmhjGxECwOy8CyMCk2F6vAqrAarB5WgVbsGtaB9WKvcSKuj9NxNxibSDwF5+Iz8bn4EnwDvgtvwM/g1/BOvA9/R6ASzAkuBD8CmzCJkE2YRSgnVBFqCYcJZ2HV7iK8IBKJRjAvfGC+pBNziLOJS4ibiPuIJ4lXiA+J/SQSyZTkQgogxZE4JDmpnLSetJd0gnSV1EV6RdYiW5E9yeHkDLKYXEquIu8mHydfJT8iD2joaNhr+GnEafA0ijSWaWzXaNa4pNGlMaCpq+moGaCZrJmjuUBznWa95lnNe5rPtbS0bLR8tRK0hFrztdZp7dc6p9Wp9ZqiR3GmhFCmUBSUpZSdlJOU25TnVCrVgRpMzaDKqUupddTT1AfUVzR9mjuNTePR5tGqaQ20q7Sn2hra9tos7WnaxdpV2oe0L2n36mjoOOiE6HB05upU6zTp3NTp19XX9dCN083TXaK7W/e8brceSc9BL0yPp1emt03vtN5DfUzfVj9En6u/UH+7/ln9LgOigaMB2yDHoNLgG4OLBn2GeobjDFMNCw2rDY8ZdhhhRg5GbCOR0TKjg0Y3jN4YWxizjPnGi43rja8avzQZZRJswjepMNln0m7yxpRuGmaaa7rC9IjpfTPczNkswWyW2Wazs2a9owxG+Y/ijqoYdXDUHXPU3Nk80Xy2+TbzNvN+C0uLCAuJxXqL0xa9lkaWwZY5lqstj1v2WOlbBVoJrVZbnbB6TDeks+gi+jr6GXqftbl1pLXCeqv1ResBG0ebFJtSm3029201bZm2WbarbVts++ys7Cbaldjtsbtjr2HPtBfYr7VvtX/p4OiQ5rDI4YhDt6OJI9ux2HGP4z0nqlOQ00ynGqfro4mjmaNzR28afdkZdfZyFjhXO19yQV28XYQum1yuuBJcfV3FrjWuN90obiy3Arc9bp3uRu4x7qXuR9yfjrEbkzFmxZjWMe8YXgwRPN/ueuh5RHmUejR7/O7p7Mn1rPa8PpY6NnzsvLGNY5+NcxnHH7d53C0vfa+JXou8Wrz+9PbxlnrXe/f42Plk+mz0uck0YMYzlzDP+RJ8J/jO8z3q+9rP20/ud9DvN383/1z/3f7d4x3H88dvH/8wwCaAE7A1oCOQHpgZ+HVgR5B1ECeoJuinYNtgXnBt8CPWaFYOay/r6QTGBOmEwxNehviFzAk5GYqFRoRWhF4M0wtLCdsQ9iDcJjw7fE94X4RXxOyIk5GEyOjIFZE32RZsLruO3RflEzUn6kw0JTopekP0TzHOMdKY5onoxKiJqybei7WPFcceiQNx7LhVcffjHeNnxn+XQEyIT6hO+CXRI7EksTVJP2l60u6kF8kTkpcl301xSlGktKRqp05JrUt9mRaatjKtY9KYSXMmXUg3SxemN2aQMlIzajP6J4dNXjO5a4rXlPIpN6Y6Ti2cen6a2TTRtGPTtadzph/KJGSmZe7OfMuJ49Rw+mewZ2yc0ccN4a7lPuEF81bzevgB/JX8R1kBWSuzurMDsldl9wiCBFWCXmGIcIPwWU5kzpacl7lxuTtz34vSRPvyyHmZeU1iPXGu+Ey+ZX5h/hWJi6Rc0jHTb+aamX3SaGmtDJFNlTXKDeCf0jaFk+ILRWdBYEF1watZqbMOFeoWigvbipyLFhc9Kg4v3jEbn82d3VJiXbKgpHMOa87WucjcGXNb5tnOK5vXNT9i/q4FmgtyF/xYyihdWfrHwrSFzWUWZfPLHn4R8cWeclq5tPzmIv9FW77EvxR+eXHx2MXrF7+r4FX8UMmorKp8u4S75IevPL5a99X7pVlLLy7zXrZ5OXG5ePmNFUErdq3UXVm88uGqiasaVtNXV6z+Y830NeerxlVtWau5VrG2Y13Musb1duuXr3+7QbChvXpC9b6N5hsXb3y5ibfp6ubgzfVbLLZUbnnztfDrW1sjtjbUONRUbSNuK9j2y/bU7a07mDvqas1qK2v/3Cne2bErcdeZOp+6ut3mu5ftQfco9vTsnbL38jeh3zTWu9Vv3We0r3I/2K/Y//hA5oEbB6MPthxiHqr/1v7bjYf1D1c0IA1FDX1HBEc6GtMbrzRFNbU0+zcf/s79u51HrY9WHzM8tuy45vGy4+9PFJ/oPyk52Xsq+9TDluktd09POn39TMKZi2ejz577Pvz7062s1hPnAs4dPe93vukH5g9HLnhfaGjzajv8o9ePhy96X2y45HOp8bLv5eYr468cvxp09dS10GvfX2dfv9Ae237lRsqNWzen3Oy4xbvVfVt0+9mdgjsDd+fDi33FfZ37VQ/MH9T8a/S/9nV4dxzrDO1s+ynpp7sPuQ+f/Cz7+W1X2S/UX6oeWT2q6/bsPtoT3nP58eTHXU8kTwZ6y3/V/XXjU6en3/4W/Ftb36S+rmfSZ+9/X/Lc9PnOP8b90dIf3//gRd6LgZcVr0xf7XrNfN36Ju3No4FZb0lv1/05+s/md9Hv7r3Pe//+3wkP+GJO5GKFAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAABsZVhJZk1NACoAAAAIAAQBGgAFAAAAAQAAAD4BGwAFAAAAAQAAAEYBKAADAAAAAQACAACHaQAEAAAAAQAAAE4AAAAAAAAAkAAAAAEAAACQAAAAAQACoAIABAAAAAEAAABAoAMABAAAAAEAAABAAAAAACx7q7YAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAULSURBVGgF7VltbBRFGH5ve3e1FI1EicQCco0NNGoo2JTEDxBF/PghQiwStDGaaoiCxvhDwR/WqPwgGiKaosQYsYk/GlFLwCpR2mBFaEQaIyBpAhbFNq39bu+4u717nN2d3c7M3rVX6O396VxyO+/n88y7s7uzOz5SWrQ0WR6vKljp9yuGKxR1PdIUqNN+zT+TNlGNFl2vNyUjyGJLRvSm6PoaLQWJSLF+MIvIUmr9YKRYoTC6NHlO8smykDw3ulSgEAklzmcZ0ZU+cT4S4hTg1xtddg8UDNWa6NFKD9BSQkQribT6PP9m4Wx42vVvrs/zRRcF2nz5nuI6YIjGy7RkRa7giXz5yQotVuUQykEnVuWLx6f6pjuZcei6D5hMwNT7prorTz2KkrGb2sge9xQ/8xQkRYzRKWqmw9RKeaw3y7R6RGCAgX5LTXSadBM2QBe9ItBHR2g/G3WHU41SWkNraSGXs1iBEWqhL+kQ/e1AX0cP00ZaTjMcDVGWCJygemqgswJQOT1J62ieoOHdlE+JK1B24xPcgwDYNOe/QlTiO8TS5JQqABqmAI1dmaCr3IzH0ZykvazoFwWPOazkz9AtgkbtSgSIGmk7jTASVgMr2Q4Sly5quC3H6Xvaw8531FawY4iq6SkqEjQpu2plGlHsFM8o4rXYrboo8hA+RYUUQyjBTvyn+KUWya3uwkYl3RPocruZmj7sQqniHWLg/Wn83eoUBAynWjZyexIZx4X4wRXbz4BulrwIN+At9Lg8x1OkIQCcwDIl+Q4knUyj+IiREikSZmALOhyPTDtpCQBDeBE+B2Q1WjiBBOqxxNHbJB5hlC+njUPASFePGxnUPDbNEjx7C1a7wEuZ3+W2CQgAZ1GDCzz7BWxCUIEvwGvo4/ZuHJs0jwkJ2Bnj7KwXKeCEu/ALd0jgczYl/diGyb1cZkjgN9zvAp+JdziYzmg84NhX4pTNOoNjBgQuYTuudtLbk26ZUO5O3CrZZ7NqZNomJNCGFVJyg4CGVzAsIfyFtYrXc87MkBxdwgQEPlRuSAb8XHzF0wziZbyOS6aUwLsolEiU4agLzq0Yh0AnNkgJreLfi3ae5WfcbtpXsSvFai1YLEXMxHvO5euGtjRpCRzBIimZBf8SwmZcGG8L452DL3j+XlQrUeucizg1hTQEaoX0FjQxzR4nRw/uU4CexwC3fobrJVsIB5w4dycFgQhekBJYBObiRyk6zmpQIPmVo5V7/IHlksWPrbxyUgpTcBHowkNSsAW/BKd57BAGzd8wm3xfY77kew0+4F5hvIo8ybYizd1BIXAGZVKYBb8KnWbiKLv85gu/EsxyeT+OfzmJ/VggWWdjL7eIB4nAMdwkhVjwj7HnotH+wYMprJaP+F+CQxyhA48qEdXo5Tb7ILycHqYN1ONatj1Nu8n4fqHTLvaKEXTZDYWP/qTfBUuQttFW0zdBO+kNCgu2xVRLdwgyr0AS+6SltD2iTYjbVMc9DkprByP6Tpzk64efcJtShzd5TY2UvAIj9D71Cwtyi2IRbXHpRPJy/xs6KihitICepUJT00sf04BjS1KCvaLczWXhFDgennbG3kI8hR0DmyYwXYHpCmi69dVo7LrwtKfrWrjZU0QFLNysBesUnadisE7TWiF+1vAUHlGtVWtox3FPUQUwHG9oZ2Jut2wYgZxvWhHleNvOOCk53rg0KOR469agkJvNa58BLTavt+//BxiwmkGWwUf3AAAAAElFTkSuQmCC",huggingface:"data:image/png;base64,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"};import{useEffect as mo,useRef as Ps}from"react";import{Fragment as Is,jsx as xe,jsxs as nr}from"react/jsx-runtime";function Kn({anchor:e,label:n,options:t,current:r,onClose:o,onPick:s}){let a=Ps(null);return mo(()=>{let i=a.current,c=e.current;if(!i||!c)return;try{typeof i.showPopover=="function"&&i.showPopover()}catch{}let u=c.getBoundingClientRect();u.width>i.offsetWidth&&(i.style.width=`${Math.round(u.width)}px`);let p=i.offsetWidth,A=i.offsetHeight,g=u.width>248?u.left:u.right-p,h=Math.max(8,Math.min(g,window.innerWidth-p-8)),y=u.bottom+6,M=y+A>window.innerHeight-8&&u.top-6-A>8?u.top-6-A:y;i.style.left=`${Math.round(h)}px`,i.style.top=`${Math.round(M)}px`,i.querySelector('[aria-checked="true"]')?.focus()},[e]),mo(()=>{let i=c=>{let u=c.target;!u||a.current?.contains(u)||e.current?.contains(u)||o()};return document.addEventListener("pointerdown",i,!0),()=>document.removeEventListener("pointerdown",i,!0)},[e,o]),xe("div",{ref:a,role:"menu","aria-label":n,className:"sc-menu",popover:"manual",onKeyDown:i=>{let c=[...a.current?.querySelectorAll("[role=menuitemradio]")??[]],u=c.indexOf(document.activeElement);if(i.key==="Escape")i.stopPropagation(),i.nativeEvent.stopImmediatePropagation(),o(),e.current?.focus();else if(i.key==="ArrowDown"||i.key==="ArrowUp"){i.preventDefault();let p=i.key==="ArrowDown"?1:-1;c[(u+p+c.length)%c.length]?.focus()}else i.key==="Tab"&&o()},children:t.map(i=>xe(Rs,{option:i,checked:r===i.id,onClose:o,onPick:s},i.id??""))})}function Rs({option:e,checked:n,onClose:t,onPick:r}){return nr(Is,{children:[e.heading?xe("div",{className:"sc-menu-head",role:"presentation",children:e.heading}):e.rule?xe("div",{className:"sc-menu-sep"}):null,nr("button",{type:"button",role:"menuitemradio","aria-checked":n,className:"sc-menu-item",onClick:()=>{e.onChoose?(e.onChoose(),t()):n?t():r(e.id)},children:[e.glyph,nr("span",{className:"sc-menu-text",children:[xe("span",{className:"sc-menu-label",children:e.label}),e.note&&xe("span",{className:"sc-menu-note",children:e.note})]}),e.trailing?xe("span",{className:"sc-menu-act",children:e.trailing}):n&&xe(Es,{})]})]})}function Es(){return xe("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:"sc-menu-check",children:xe("path",{d:"M5 12.5l4.5 4.5L19 7.5",fill:"none",stroke:"currentColor",strokeWidth:"2.2",strokeLinecap:"round",strokeLinejoin:"round"})})}function Rn({open:e}){return xe("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e?"sc-chev sc-chev-open":"sc-chev",children:xe("path",{d:"M9 6l6 6-6 6",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}import{useRef as Ls,useState as Ts}from"react";var Os={haiku:"Haiku",sonnet:"Sonnet",opus:"Opus",fable:"Fable"};function gn(e){return Os[e]??e}function _n(e){let n=[...e].sort(Nt),t=De([...e]),r=t?Ie(t):null,s=[{id:"auto",kind:"auto",label:"Automatic",model:"auto",...r?.runtime?{note:r.runtime.default_model?`Uses ${gn(r.runtime.default_model)}`:`Uses ${r.runtime.display_name}`}:{}}];n.some(u=>Ne(u).some(p=>kt(p.id)))&&s.push({id:"small",kind:"size",label:"Fast",note:"quick and cheap",model:"small"},{id:"large",kind:"size",label:"Best",note:"the most capable",model:"large"});let l=new Map;for(let u of n)for(let p of Ne(u))for(let A of p.models){if(!A)continue;let g=`${p.id}/${A}`,h=l.get(g);if(h){h.machines.add(j(u));continue}l.set(g,{option:{id:g,kind:"named",label:gn(A),model:A,runtime:p.id,runtimeName:p.display_name,costClass:p.cost_class},machines:new Set([j(u)])})}let i=new Set;for(let{machines:u}of l.values())for(let p of u)i.add(p);let c=i.size>1;for(let{option:u,machines:p}of l.values()){let A=c&&p.size===1?[...p][0]:void 0;s.push(A?{...u,machine:A}:u)}return s}function $n(e){let n=[],t=[];for(let r of e){if(r.kind!=="named"){n.push(r);continue}let o=r.runtimeName??r.runtime??"",s=t.find(a=>a.heading===o);s?s.options.push(r):t.push({heading:o,options:[r]})}return n.length?[{heading:null,options:n},...t]:t}function tr(e,n){let t=e.find(o=>o.kind==="auto")??{id:"auto",kind:"auto",label:"Automatic",model:"auto"};if(!n||n==="auto")return{selected:t,unavailable:null};let r=e.find(o=>o.id===n);return r?{selected:r,unavailable:null}:{selected:t,unavailable:n}}function rr(e){return e.runtime?{model:e.model,runtime:e.runtime}:{model:e.model}}function fn(e){return e.length>1}import{jsx as xt,jsxs as ho}from"react/jsx-runtime";function et({options:e,selected:n,onPick:t,caption:r,disabled:o,className:s}){let[a,l]=Ts(!1),i=Ls(null);if(!fn(e))return null;let c=s?`sc-mp ${s}`:"sc-mp";return ho("span",{className:c,children:[r&&xt("span",{className:"sc-mp-cap",children:r}),ho("button",{ref:i,type:"button",className:"sc-mp-btn","aria-haspopup":"menu","aria-expanded":a,"aria-label":`Model: ${n.label}. Change`,disabled:o,onClick:()=>l(u=>!u),children:[xt("span",{className:"sc-mp-label",children:n.label}),xt(Rn,{open:!0})]}),a&&xt(Kn,{anchor:i,label:"Which model answers",options:Bs(e),current:n.id,onClose:()=>l(!1),onPick:u=>{l(!1),u&&t(u)}})]})}function Bs(e){let n=[];for(let t of $n(e))t.options.forEach((r,o)=>{let s=Gs(r);n.push({id:r.id,label:r.label,...s?{note:s}:{},...t.heading&&o===0?{heading:t.heading}:{},...!t.heading&&r.kind==="size"&&o===1?{rule:!0}:{}})});return n}function Gs(e){return e.kind!=="named"?e.note:e.machine?`on ${e.machine}`:void 0}import{jsx as Me,jsxs as Hs}from"react/jsx-runtime";function te({className:e}){return Hs("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e,children:[Me("path",{d:"M18.125 7.039A8.6 8.6 0 1 0 18.125 16.961A6 6 0 0 1 18.125 7.039Z",fill:"currentColor"}),Me("path",{d:"M19.925 7.039A8.6 8.6 0 0 1 19.925 16.961A6 6 0 0 0 19.925 7.039Z",fill:"currentColor"})]})}function go({className:e}){return Me("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e,children:Me("path",{fill:"currentColor",d:"M17.3041 3.541h-3.6718l6.696 16.918H24Zm-10.6082 0L0 20.459h3.7442l1.3693-3.5527h7.0052l1.3693 3.5528h3.7442L10.5363 3.5409Zm-.3712 10.2232 2.2914-5.9456 2.2914 5.9456Z"})})}function An({className:e}){return Me("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e,children:Me("path",{fill:"currentColor",d:"M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z"})})}function Mt({className:e}){return Me("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e,children:Me("path",{d:"M4 5h16v11H4zM9 20h6M12 16v4",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function Ws({className:e}){return Me("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e,children:Me("path",{d:"M5 7l5 5-5 5M12 18h7",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function or({className:e}){return Me("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e,children:Me("path",{d:"M5 6h14v10H5zM2.5 19.5h19",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}var $e={claude:go,chatgpt:An,local:Mt},fo={shell:Ws};function bo(e,n){return n<2*6e4?e:n<10*6e4?Math.max(e,6e4):n<30*6e4?Math.max(e,3*6e4):Math.max(e,10*6e4)}var Ds=3e3,Us=2*6e4,St=Date.now(),Pt=new Set,Ao=!1;function Fs(){if(Ao||typeof window>"u")return;Ao=!0;let e=()=>{let t=St;if(St=Date.now(),St-t>Us)for(let r of Pt)r()};for(let t of["pointerdown","keydown","wheel","touchstart"])window.addEventListener(t,e,{capture:!0,passive:!0});let n=()=>{if(!document.hidden)for(let t of Pt)t()};window.addEventListener("focus",n),document.addEventListener("visibilitychange",n)}function Se(e,n,t={}){Fs();let r,o=t.immediate===!1?Date.now():0,s=!1,a=!1,l=()=>{a||(r=setTimeout(i,t.idle===!1?n:bo(n,Date.now()-St)))},i=async()=>{if(clearTimeout(r),!(a||s)){if(typeof document>"u"||!document.hidden){s=!0,o=Date.now();try{await e()}catch{}finally{s=!1}}l()}},c=()=>{Date.now()-o>Math.min(n,Ds)&&i()};return Pt.add(c),t.immediate===!1?l():i(),()=>{a=!0,clearTimeout(r),Pt.delete(c)}}var me=[{id:"claude",costClass:"user-subscription",short:"Claude Code",label:"Continue with Claude",title:"The Claude plan you already pay for",cost:"Nothing beyond the plan",prerequisite:"Claude Code installed and signed in",hint:"Install it from claude.ai/code, then run `claude` once and sign in.",install:"https://claude.com/product/claude-code",expects:["claude-code"]},{id:"chatgpt",costClass:"user-subscription",short:"Codex",label:"Continue with ChatGPT",title:"The ChatGPT plan you already pay for",cost:"Nothing beyond the plan",prerequisite:"Codex installed and signed in",hint:"Install Codex, then run `codex` once and sign in.",install:"https://learn.chatgpt.com/codex/cli",expects:["codex"]},{id:"local",costClass:"user-hardware",short:"Local models",label:"Use a model on this machine",title:"A model on your own machine",cost:"Free. You bought the hardware",prerequisite:"Ollama running, with a model pulled",hint:"Install Ollama, then `ollama pull` a model before pairing.",install:"https://ollama.com",expects:["ollama","openai-api"]}],yo=["claude","chatgpt"];function sr(){return me.filter(e=>yo.includes(e.id))}function ar(e){return me.filter(n=>n.costClass===e)}function ir(e){return me.find(n=>n.expects.includes(e))??null}import{Fragment as nt,jsx as d,jsxs as v}from"react/jsx-runtime";function bn({machines:e,hosted:n=[],onApproveRuntime:t,onPreferRuntime:r,onDisconnectHosted:o,onPair:s,onWake:a,onOpenApp:l,onRefresh:i,refreshing:c,busy:u,appName:p,model:A,onPickModel:g,error:h,runs:y,loadRuns:M,loading:E,machineMenu:I,machineNote:B,onReconnect:V,openApp:L=!0,children:x,onStopRun:G}){let w=De(e),ae=e.filter(C=>C.id!==w?.id),K=w?.state==="online",[ge,_]=Rt(()=>K?[]:null),[ne,Qe]=Rt("no"),z=y===void 0&&!!M,ue=z?ge:y??(K?[]:null),Be=y!==void 0||!!M,ie=!!(w&&hn(w));Qs(()=>{if(!z||!M||!ie)return;let C=!0,S=Se(async()=>{let Ve=await M();C&&_(Ve)},3e3);return()=>{C=!1,S()}},[z,M,ie]);let q=(w?Xt(w):[]).filter(C=>C.quarantined&&!C.absent),Ae=w?Ie(w).runtime:null,Pe=Ae?.cost_class==="user-hardware"?Ae:null,de=Pe?aa(Pe.default_model):null,be=!!w&&!hn(w),Q=(()=>{if(!w||be||!Ae||_e(Ae).tone!=="warn")return null;let S=j(w);return{title:`${Ae.display_name} is signed out`,detail:`Sign in on ${S} so Soba can start runs.`}})(),$=()=>{l?.(),Qe("going"),Xn().then(C=>Qe(C==="absent"?"absent":"no"))},Ge=()=>{$(),a?.()},je={label:ne==="going"?"Opening Soba\u2026":"Open Soba",onPress:$,spin:ne==="going"},W=w?je:s?{label:"Connect to Soba",onPress:s}:null,ye=!!w&&W===je,Z=ye&&!!i,O=i&&d("button",{type:"button",className:"sc-disc",onClick:i,disabled:c,"aria-label":"Refresh",title:"Refresh",children:d(ua,{spinning:!!c})});return!w&&n.length===0&&!s?d("p",{className:"sc-note",children:"Nothing connected yet."}):v("div",{className:"sc-tray",children:[w&&v(Oe,{title:"This machine",action:(i&&!Z||L||I)&&v("span",{className:"sc-cap-acts",children:[!Z&&O,L&&d($s,{}),I]}),children:[d(Js,{machine:w}),B]}),w&&be&&!w.pairing_lost&&d(Oe,{title:"Soba",children:v("div",{className:"sc-away",children:[d("span",{className:"sc-away-mark","aria-hidden":"true",children:d(Xe,{kind:"paused",size:30})}),v("span",{className:"sc-away-say",children:[d("span",{className:"sc-away-title",children:"Wake it up"}),v("span",{className:"sc-away-body",children:["Soba on ",j(w)," is not answering. Waking it opens the app there."]})]}),d("button",{type:"button",className:"sc-away-go",onClick:Ge,disabled:u||ne==="going",children:ne==="going"?"Waking\u2026":"Wake"})]})}),w?.pairing_lost&&!hn(w)&&d(Oe,{title:"Soba",children:v("div",{className:"sc-away",children:[d("span",{className:"sc-away-mark","aria-hidden":"true",children:d(Xe,{kind:"gone",size:30})}),v("span",{className:"sc-away-say",children:[d("span",{className:"sc-away-title",children:"Connect it again"}),d("span",{className:"sc-away-body",children:"Its pairing has ended, so it cannot take runs until it is connected again."})]}),V&&d("button",{type:"button",className:"sc-away-go",onClick:V,disabled:u,children:"Connect"})]})}),w&&!be&&d(Oe,{title:"Runs on",children:Ae?d(ra,{machine:w,appName:p,busy:u,...A?{model:A}:{},...g?{onPickModel:g}:{},...r?{onPick:C=>r(w.id,C)}:{},...t?{onApprove:C=>t(w.id,C)}:{}}):v("div",{className:"sc-blank",children:[d("span",{className:"sc-blank-mark","aria-hidden":"true",children:d(js,{})}),v("span",{className:"sc-blank-say",children:[d("span",{className:"sc-blank-title",children:E?"Looking\u2026":"No agent on this machine"}),d("span",{className:"sc-blank-body",children:E?"Reading what it can run.":"Install Claude Code, Codex or Ollama there and it will appear here."})]}),!E&&L&&v("a",{className:"sc-blank-act",href:jn(),children:[d("span",{children:"Add agents"}),d(lr,{})]})]})}),w&&(Q||de)&&v(Oe,{title:"Needs attention",children:[Q&&v("div",{className:"sc-alarm",children:[d("span",{className:"sc-alarm-mark","aria-hidden":"true",children:d(Co,{})}),v("span",{className:"sc-alarm-say",children:[d("span",{className:"sc-alarm-title",children:Q.title}),d("span",{className:"sc-alarm-body",children:Q.detail})]})]}),de&&v("div",{className:"sc-alarm sc-alarm-warn",children:[d("span",{className:"sc-alarm-mark","aria-hidden":"true",children:d(Co,{})}),v("span",{className:"sc-alarm-say",children:[d("span",{className:"sc-alarm-title",children:"A large model on this computer"}),v("span",{className:"sc-alarm-body",children:["Your ",de," model can take all this computer's memory while it answers."]})]})]})]}),w&&Be&&!be&&d(zs,{machine:w,runs:ue,...G?{onStop:G}:{}}),w&&d(nt,{children:q.length>0&&!be&&!(r&&t&&Ie(w).by!=="app")&&d(Oe,{title:"New on this machine",children:q.map(C=>d(na,{runtime:C,...t?{onApprove:()=>t(w.id,C.id)}:{}},C.id))})}),n.length>0&&d(Oe,{title:n.length>1?"Connected plans":"Connected plan",children:n.map(C=>d(la,{credential:C,appName:p,busy:u,...o?{onDisconnect:()=>o(C.provider)}:{}},C.provider))}),ae.length>0&&d(Oe,{title:"Your other machines",children:ae.map(C=>d(ea,{machine:C},C.id))}),!w&&s&&d(Oe,{title:"Your machines",children:v("button",{type:"button",className:"sc-pair",onClick:s,children:[d("span",{className:"sc-otile","aria-hidden":"true",children:d(ca,{})}),d("span",{className:"sc-oname",children:"Connect a machine"})]})}),W&&v("div",{className:"sc-acts",children:[ye&&W?v("div",{className:"sc-acts-row",children:[Z?O:d("span",{}),v("button",{type:"button",className:"sc-act-small",onClick:W.onPress,disabled:u||W.spin,"data-spin":W.spin?"true":void 0,children:[W.spin&&d(vo,{}),W.label,!W.spin&&d(lr,{})]})]}):W&&v("button",{type:"button",className:"sc-act-go",onClick:W.onPress,disabled:u||W.spin,"data-spin":W.spin?"true":void 0,children:[W.spin&&d(vo,{}),W.label]}),ne==="absent"&&v("p",{className:"sc-act-miss",children:["Nothing opened here. ",w?j(w):"That machine"," may be a different computer, or the Soba app is not installed on this one."]})]}),x,h&&d("p",{className:"sc-error sc-tray-error",children:h})]})}function Oe({title:e,action:n,children:t}){return v("section",{className:"sc-group",children:[v("div",{className:"sc-group-cap",children:[d("p",{className:"sc-group-title",children:e}),n]}),d("div",{className:"sc-group-card",children:t})]})}function Js({machine:e,onToggle:n,open:t}){let r=hn(e),o=[r?null:e.pairing_lost?"Not connected to Soba":"Soba is asleep",r?Yn(e):null,e.always_on?"always on":null].filter(Boolean),s=r&&e.capacity>0?e.active>0?`${e.active} of ${e.capacity} running`:null:zn(e.last_seen_at),a=v(nt,{children:[v("span",{className:"sc-mtile","aria-hidden":"true",children:[d(ko,{}),d("span",{className:`sc-mbadge sc-mbadge-${r?mn(e).tone:e.pairing_lost?"off":"away"}`})]}),v("span",{className:"sc-mid",children:[d("span",{className:"sc-mname",children:j(e)}),v("span",{className:"sc-mmeta",children:[d("span",{className:"sc-mmeta-is",children:o.map((l,i)=>v("span",{children:[i>0&&d("span",{className:"sc-mmeta-sep",children:"\xB7"}),l]},l))}),s&&d("span",{className:"sc-mmeta-now",children:s})]})]})]});return!n||!r?d("div",{className:"sc-mrow",children:a}):v("button",{type:"button",className:"sc-mrow sc-mrow-btn",onClick:n,"aria-expanded":!!t,title:t?"Hide what it is running":"See what it is running",children:[a,d(Rn,{open:!!t})]})}function Ys(e,n){return e.filter(t=>t.machine_id===n.id||t.machine_id===null)}function zs({machine:e,runs:n,onStop:t}){let r=n?Ys(n,e):[],[o,s]=Rt(new Set),a=async i=>{s(c=>new Set(c).add(i));try{await t?.(i)}catch{s(c=>{let u=new Set(c);return u.delete(i),u})}},l=()=>{for(let i of r)a(i.id)};return d(Oe,{title:"Active runs",...t&&r.length>1?{action:d("button",{type:"button",className:"sc-cap-link",onClick:l,children:"Stop all"})}:{},children:n===null?d("p",{className:"sc-row-note",children:"Looking\u2026"}):r.length===0?v("p",{className:"sc-nilrow",children:[d("span",{className:"sc-nilrow-mark","aria-hidden":"true",children:d(qs,{})}),"Nothing running"]}):r.map(i=>d(Zs,{run:i,stopping:o.has(i.id),...t?{onStop:()=>void a(i.id)}:{}},i.id))})}function js(){return v("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:"sc-blank-glyph",children:[d("rect",{x:"3",y:"4.5",width:"18",height:"15",rx:"2.5",fill:"none",stroke:"currentColor",strokeWidth:"1.8"}),d("path",{d:"M7.5 10l2.5 2.2-2.5 2.2M12.5 14.6h4",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round"})]})}function qs(){return v("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:"sc-blank-glyph",children:[d("circle",{cx:"12",cy:"12",r:"9",fill:"none",stroke:"currentColor",strokeWidth:"1.8"}),d("path",{d:"M9 12.5l2.2 2.2L15.5 9.8",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round"})]})}function Zs({run:e,stopping:n,onStop:t}){return v("div",{className:"sc-rrow",children:[d("span",{className:n?"sc-rdot":"sc-rdot sc-rdot-live","aria-hidden":"true"}),v("span",{className:"sc-mid",children:[d("span",{className:"sc-rtitle",children:wo(e)}),d("span",{className:"sc-rstep",children:n?"Stopping\u2026":`${Ks(e)} \xB7 ${_s(e.started_at)}`})]}),t&&d("button",{type:"button",className:"sc-rstop",onClick:t,disabled:n,"aria-label":`Stop ${wo(e)}`,children:d("span",{className:"sc-rstop-ring",children:d(da,{})})})]})}function Xs(e){let n=ir(e);return(n?$e[n.id]:null)??fo[e]??null}function wo(e){if(e.label)return e.label;if(e.task){let n=e.task.replace(/[_-]+/g," ").trim();return n.charAt(0).toUpperCase()+n.slice(1)}return"A run"}function Ks(e){if(e.status==="queued")return"Waiting for a free slot";if(e.step)return e.step;switch(e.phase?.kind){case"thinking":return"Thinking";case"writing":return"Writing";case"tool":return e.phase.tool?`Using ${e.phase.tool}`:"Using a tool";case"approval":return e.phase.tool?`Waiting for you to allow ${e.phase.tool}`:"Waiting for your approval";default:return e.first_output_at?"Working":"Starting"}}function _s(e){let n=Math.max(0,Math.round((Date.now()-new Date(e).getTime())/1e3));if(n<60)return`${n}s`;let t=Math.floor(n/60);return t<60?`${t}m ${String(n%60).padStart(2,"0")}s`:`${Math.floor(t/60)}h ${String(t%60).padStart(2,"0")}m`}function $s(){return d("a",{className:"sc-disc sc-open-app",href:jn(),"aria-label":"Open Soba App",title:"Open Soba App",children:d(lr,{})})}function lr(){return d("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:"sc-dglyph",children:d("path",{d:"M14 4h6v6M20 4l-8.5 8.5M18 14.5V19a1 1 0 01-1 1H5a1 1 0 01-1-1V7a1 1 0 011-1h4.5",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function ea({machine:e}){let n=mn(e);return v("div",{className:"sc-orow",children:[d("span",{className:"sc-otile","aria-hidden":"true",children:d(ko,{})}),d("span",{className:"sc-oname",children:j(e)}),d("span",{className:"sc-oword",children:n.word}),d("span",{className:`sc-dot sc-dot-${n.tone}`,"aria-hidden":"true"})]})}function na({runtime:e,onApprove:n}){return v("div",{className:"sc-mrow",children:[d("span",{className:"sc-mtile sc-atile","aria-hidden":"true",children:d(Et,{id:e.id,name:e.display_name})}),v("span",{className:"sc-mid",children:[d("span",{className:"sc-mname",children:e.display_name}),d("span",{className:"sc-mmeta",children:e.version??"waiting to be let in"})]}),n?d("button",{type:"button",className:"sc-row-act",onClick:n,children:"Let it serve"}):d("span",{className:"sc-averdict sc-tone-warn",children:"not serving yet"})]})}function ta({id:e,name:n}){return d("span",{className:"sc-runtime-tile","aria-hidden":"true",children:d(Et,{id:e,...n?{name:n}:{}})})}function Et({id:e,name:n}){if(!e)return null;let t=po[e];if(t)return d("img",{src:t,alt:"",className:"sc-runtime-logo"});let r=Xs(e);return r?d(r,{className:"sc-runtime-mark"}):n?d("span",{className:"sc-runtime-letter",children:n.slice(0,1).toUpperCase()}):null}function ra({machine:e,appName:n,busy:t,onPick:r,model:o,onPickModel:s,onApprove:a}){let l=Ie(e),i=Ne(e),c=a?e.runtimes.filter(x=>x.quarantined&&!x.absent):[],[u,p]=Rt(!1),A=Vs(null);if(l.by!=="app"&&i.length===0)return null;let g=x=>x?d(ta,{id:x.id,name:x.display_name}):null,h=l.runtime?.display_name??l.runtimeId??"\u2014",y=l.by!=="app"&&!!r&&(i.length>=2||c.length>0),M=l.runtime?.id??l.runtimeId,E=!hn(e),I=l.runtime&&_e(l.runtime).tone==="warn"?"Signed out":null,B=o?_n([e]).filter(x=>x.kind==="named"?x.runtime===M:x.kind==="size"?!!M&&kt(M):!0):[],V=(()=>{if(!o)return;if(o.kind!=="auto")return o;let x=l.runtime?.default_model;if(!x)return o;let G=gn(x);return{...o,label:G.length>16?G:`${o.label} \xB7 ${G}`}})(),L=l.by==="app"?`Set by ${n??"the app"}`:l.runtime?sa(l.runtime):null;return v(nt,{children:[y?v("button",{ref:A,type:"button",className:E?"sc-runs-agent sc-runs-dim":"sc-runs-agent","aria-haspopup":"menu","aria-expanded":u,"aria-label":`Runs go to ${h}. Change`,disabled:t,onClick:()=>p(x=>!x),children:[d("span",{className:"sc-runs-tile","aria-hidden":"true",children:d(Et,{id:M??null,name:h})}),v("span",{className:"sc-runs-said-name",children:[d("span",{className:"sc-runs-name",children:h}),I&&d("span",{className:"sc-runs-ill",children:I})]}),d(Rn,{open:!1})]}):v("span",{className:E?"sc-runs-agent sc-runs-fixed sc-runs-dim":"sc-runs-agent sc-runs-fixed",children:[d("span",{className:"sc-runs-tile","aria-hidden":"true",children:d(Et,{id:M??null,name:h})}),v("span",{className:"sc-runs-said-name",children:[d("span",{className:"sc-runs-name",children:h}),I&&d("span",{className:"sc-runs-ill",children:I})]}),l.by==="app"&&v("span",{className:"sc-runs-told",children:["set by ",n??"the app"]})]}),V&&s&&fn(B)?v(nt,{children:[d("span",{className:"sc-runs-rule","aria-hidden":"true"}),d(et,{options:B,selected:V,onPick:s,caption:"Model",className:E?"sc-runs-model sc-runs-dim":"sc-runs-model",...t?{disabled:t}:{}})]}):L&&v(nt,{children:[d("span",{className:"sc-runs-rule","aria-hidden":"true"}),v("span",{className:"sc-runs-said",children:[d("span",{className:"sc-runs-key",children:"Model"}),d("span",{className:"sc-runs-val",children:L})]})]}),u&&r&&d(oa,{anchor:A,machine:e,tile:g,waiting:c,...a?{onApprove:a}:{},onClose:()=>p(!1),onPick:x=>{p(!1),r(x)}})]})}function oa({anchor:e,machine:n,tile:t,waiting:r,onApprove:o,onClose:s,onPick:a}){let l=Ie(n),i=Ie({...n,preferred_runtime:null}).runtime,c=l.by==="you"?l.runtimeId:null,u=[{id:null,label:"Automatic",...i?{note:`Uses ${i.display_name}`}:{},glyph:t(i)},...Ne(n).map((p,A)=>{let g=ia(p);return{id:p.id,label:p.display_name,glyph:t(p),...g?{note:g}:{},...A===0?{rule:!0}:{}}}),...o?r.map((p,A)=>({id:`waiting:${p.id}`,label:p.display_name,glyph:t(p),...p.version?{note:p.version}:{},trailing:"Let it serve",onChoose:()=>o(p.id),...A===0?{heading:"New on this machine"}:{}})):[]];return d(Kn,{anchor:e,label:"Which agent runs go to",options:u,current:c,onClose:s,onPick:a})}function sa(e){let n=_e(e);return n.tone==="warn"?n.text:e.default_model?gn(e.default_model):"Automatic"}function aa(e){if(!e)return null;let n=/(\d+(?:\.\d+)?)\s*b\b/i.exec(e),t=n?.[1]?Number(n[1]):Number.NaN;return!Number.isFinite(t)||t<20?null:`${n?.[1]}B`}function ia(e){let n=_e(e);return n.tone==="warn"?n.text:e.default_model?gn(e.default_model):e.cost_class==="user-hardware"?"In this machine's memory":n.tone!=="ok"?n.text:e.version??void 0}function la({credential:e,appName:n,busy:t,onDisconnect:r}){return v("div",{className:"sc-hrow",children:[v("div",{className:"sc-orow",children:[d("span",{className:"sc-otile","aria-hidden":"true",children:d(An,{className:"sc-omark"})}),v("span",{className:"sc-mid",children:[d("span",{className:"sc-oname",children:e.provider==="openai-chatgpt"?"ChatGPT plan":e.provider}),d("span",{className:"sc-mmeta",children:e.account_label??"signed in"})]}),r&&d("button",{type:"button",className:"sc-row-act",onClick:r,disabled:t,children:"Disconnect"})]}),r&&v("p",{className:"sc-row-note",children:[n??"This app"," stops using it. To withdraw the grant entirely, remove it in your OpenAI settings."]})]})}function ko(){return v("svg",{viewBox:"0 0 32 24","aria-hidden":"true",focusable:"false",className:"sc-mglyph",children:[d("rect",{x:"4",y:"1.5",width:"24",height:"15",rx:"2.5",fill:"var(--sc-sheet, #ffffff)",stroke:"currentColor",strokeWidth:"2"}),d("rect",{x:"1",y:"19.5",width:"30",height:"2.5",rx:"1.25",fill:"currentColor"})]})}function ca(){return d("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:"sc-oglyph",children:d("path",{d:"M12 5v14M5 12h14",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"})})}function Co(){return v("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:"sc-hglyph",children:[d("circle",{cx:"12",cy:"12",r:"9",fill:"none",stroke:"currentColor",strokeWidth:"2"}),d("path",{d:"M12 7.5v5.5",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"}),d("circle",{cx:"12",cy:"16.5",r:"1.15",fill:"currentColor"})]})}function vo(){return v("svg",{className:"sc-act-glyph sc-spin",viewBox:"0 0 16 16","aria-hidden":"true",focusable:"false",children:[d("circle",{cx:"8",cy:"8",r:"6.2",fill:"none",stroke:"currentColor",strokeWidth:"2",opacity:"0.3"}),d("path",{d:"M8 1.8a6.2 6.2 0 0 1 6.2 6.2",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"})]})}function ua({spinning:e}){return d("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e?"sc-dglyph sc-spin":"sc-dglyph",children:d("path",{d:"M21 12a9 9 0 1 1-2.64-6.36M21 3v6h-6",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function da(){return d("svg",{className:"sc-dglyph",viewBox:"0 0 14 14","aria-hidden":"true",children:d("rect",{x:"2",y:"2",width:"10",height:"10",rx:"2",fill:"currentColor"})})}import{jsx as pa}from"react/jsx-runtime";function tt({machines:e,onApproveRuntime:n,model:t,onPickModel:r}){return pa(bn,{machines:e,...n?{onApproveRuntime:n}:{},...t?{model:t}:{},...r?{onPickModel:r}:{}})}import{useCallback as ce,useEffect as he,useId as fa,useMemo as en,useRef as En,useState as Y}from"react";var rt=[{slug:"mac-arm",label:"macOS, Apple silicon"},{slug:"mac-intel",label:"macOS, Intel"},{slug:"windows",label:"Windows"},{slug:"linux",label:"Linux"}];function ot(e){if(!e)return"";try{return new URL(e).origin}catch{return""}}var No="soba.connect.choice",ma=180*24*60*60*1e3;function cr(e){let n=2166136261;for(let t=0;t<e.length;t++)n^=e.charCodeAt(t),n=Math.imul(n,16777619);return(n>>>0).toString(36)}function ur(e,n){return e?n?`${No}.${e}.${cr(n)}`:`${No}.${e}`:null}function dr(e){if(!e||typeof localStorage>"u")return null;try{let n=localStorage.getItem(e);if(!n)return null;let t=JSON.parse(n);if(Date.now()-Date.parse(t.at)>ma)return null;let r=me.find(o=>o.id===t.choice);return r?r.id:null}catch{return null}}function pr(e,n){if(!(!e||typeof localStorage>"u"))try{localStorage.setItem(e,JSON.stringify({choice:n,at:new Date().toISOString()}))}catch{}}var xo="soba.connect.model",ha=180*24*60*60*1e3;function mr(e,n){return e?n?`${xo}.${e}.${cr(n)}`:`${xo}.${e}`:null}function It(e){if(!e||typeof localStorage>"u")return null;try{let n=localStorage.getItem(e);if(!n)return null;let t=JSON.parse(n);if(Date.now()-Date.parse(t.at)>ha)return null;let r=t.choice;return typeof r!="string"||!r||r.length>120?null:/^[\w.:@+-]+(\/[\w.:@+-]+)?$/.test(r)?r:null}catch{return null}}function hr(e,n){if(!(!e||typeof localStorage>"u"))try{localStorage.setItem(e,JSON.stringify({choice:n,at:new Date().toISOString()}))}catch{}}var Mo="soba.connect.dismissed",ga=30*24*60*60*1e3;function gr(e,n){return e?n?`${Mo}.${e}.${cr(n)}`:`${Mo}.${e}`:null}function fr(e){if(!e||typeof localStorage>"u")return!1;try{let n=localStorage.getItem(e);if(!n)return!1;let t=JSON.parse(n);return Date.now()-Date.parse(t.at)<ga}catch{return!1}}function Ar(e){if(!(!e||typeof localStorage>"u"))try{localStorage.setItem(e,JSON.stringify({at:new Date().toISOString()}))}catch{}}import{Fragment as Tt,jsx as m,jsxs as P}from"react/jsx-runtime";var br=2e3,Aa=1e4,ba=9e4,ya=6e4;function yr(e,n,t,r=[],o){return e?"code":n&&(t.length>0||r.length>0)?"manage":o?"launch":"choose"}function wa(e){let n=Math.max(0,Math.round(e/1e3));return`${Math.floor(n/60)}:${String(n%60).padStart(2,"0")}`}function vr({client:e,initialCode:n,initialChoice:t,onConnected:r,showStatus:o=!0,initialContext:s=null,initialMachines:a,onClose:l,headingId:i,theme:c,reason:u,active:p=!0}){let A=!!s&&a!==void 0,[g,h]=Y(A?yr(n,o,a??[],[],t):"loading"),[y,M]=Y(s),[E,I]=Y(a??[]),[B,V]=Y(n??""),[L,x]=Y(null),[G,w]=Y(null),[ae,K]=Y(!1),[ge,_]=Y(0),[ne,Qe]=Y(()=>Date.now()),[z,ue]=Y(null),[Be,ie]=Y(!1),[fe,q]=Y(!1),[Ae,Pe]=Y("browser"),[de,be]=Y(null),[Q,$]=Y([]),[Ge,je]=Y(0),[W,ye]=Y(null),Z=En(null),[O,C]=Y(t??null),[S,Ve]=Y(null),qe=en(()=>{let f=y?.accent?.trim(),N=y?.background?.trim();if(!(!f&&!N))return N?{...dn(N,f),background:N,borderRadius:"inherit"}:{"--sc-accent":f,"--sc-accent-fg":Jn(f)}},[y?.accent,y?.background]),we=fa(),le=i??we,Ze=En(null);he(()=>{if(!e||A)return;let f=!0;return Promise.all([e.context(),e.machines()]).then(([N,U])=>{f&&(M(N),I(U),h(yr(n,o,U)))}).catch(N=>{f&&(w(N.message),h("choose"))}),()=>{f=!1}},[e,n,o,A]),he(()=>{g!=="loading"||!A||h(yr(n,o,a??[]))},[g,A,n,o,a]),he(()=>{a&&I(a)},[a]),he(()=>{s&&M(s)},[s]);let kn=En(!1),Nn=En(g);Nn.current=g;let on=En(Q);on.current=Q;let sn=!!y?.hosted_available;he(()=>{!o&&Nn.current==="manage"&&h("choose")},[o]),he(()=>{if(!e||!p||g!=="manage")return;let f=!0,N=Se(async()=>{try{let U=await e.machines();if(!f)return;I(U);let J=!sn||kn.current;U.length===0&&on.current.length===0&&J&&Nn.current==="manage"&&h("choose")}catch{}},Aa,{immediate:!1});return()=>{f=!1,N()}},[g,e,sn,p]);let an=ur(y?.publishable_key??null);he(()=>{Ve(dr(an))},[an]),he(()=>{if(!e||!sn)return;let f=!0;return e.hosted().then(N=>{f&&($(N.credentials),!kn.current&&(kn.current=!0,N.credentials.length>0&&o&&Nn.current==="choose"&&h("manage")))}).catch(()=>{}),()=>{f=!1}},[e,sn,o]),he(()=>{if(!e||!p||g!=="hosted")return;let f=!0,N=async()=>{try{let He=await e.hosted();if(!f)return!1;if($(He.credentials),He.credentials.length>0)return h("hosted_connected"),ye(null),!0}catch{}return!1},U=async()=>{Z.current?.closed&&(Z.current=null,!await N()&&f&&h("choose"))},J=Se(N,br,{immediate:!1}),cn=setInterval(U,400),Ee=He=>{let Un=He.data;Un?.source==="soba"&&Un.type==="hosted_result"&&N()};return window.addEventListener("message",Ee),()=>{f=!1,J(),clearInterval(cn),window.removeEventListener("message",Ee),Z.current=null}},[e,g,p]);let Ft=ce(()=>{if(!e)return;let f=window.open("","soba-connect-plan","width=520,height=760,noopener=no");Z.current=f,h("hosted"),je(Date.now()),ye(null),w(null),e.startHosted().then(({url:N})=>{if(f&&!f.closed){f.location.href=N;return}ye(N)}).catch(N=>{f?.close(),Z.current=null,w(N.message),h("choose")})},[e]),At=ce(async f=>{if(e){K(!0);try{await e.disconnectHosted(f),$((await e.hosted()).credentials)}catch(N){w(N.message)}finally{K(!1)}}},[e]);he(()=>{if(!e||!p||g!=="waiting")return;let f=!0,N=Se(async()=>{try{let U=await e.machines();if(!f)return;I(U);let J=Ze.current;if(!J)return;let cn=U.filter(He=>!J.has(He.id)),Ee=cn.find(He=>He.state!=="offline")??cn[0];if(Ee){be(Ee.id),O&&pr(an,O);let He=me.find(Jt=>Jt.id===O)?.expects??[],Un=Ne(Ee).find(Jt=>He.includes(Jt.id));Un&&e.preferRuntime(Ee.id,Un.id).catch(()=>{}),h("connected"),r?.(U)}}catch{}},br,{immediate:!1});return()=>{f=!1,N()}},[g,e,r,O,an,p]);let bt=ce(async()=>{if(e){w(null),K(!0);try{let f=await e.lookup(B);x(f),h("confirm")}catch(f){w(f.message)}finally{K(!1)}}},[e,B]),xn=ce(async()=>{if(e){w(null),K(!0);try{try{Ze.current=new Set((await e.machines()).map(f=>f.id))}catch{Ze.current=new Set(E.map(f=>f.id))}await e.approve(B),h("waiting"),_(Date.now())}catch(f){w(f.message)}finally{K(!1)}}},[e,B,E]),yt=ce(async()=>{if(e){K(!0);try{await e.deny(B),Pe("browser"),h("denied")}catch(f){w(f.message)}finally{K(!1)}}},[e,B]),X=en(()=>y?.connect_url??null,[y]),[We,Ce]=Y(()=>Zn()),ln=en(()=>X?qn(X,We??void 0,O??void 0):null,[X,We,O]),wt=en(()=>ot(X),[X]),Qt=ce(f=>{if(E.length===0)return null;let N=me.find(J=>J.id===f);if(!N)return null;let U=E.flatMap(J=>J.runtimes??[]).filter(J=>N.expects.includes(J.id));return U.length===0?{tone:"dim",text:"not installed"}:U.some(J=>J.authenticated===!0)?{tone:"ok",text:"ready"}:U.every(J=>J.authenticated===!1)?{tone:"warn",text:"needs signing in"}:{tone:"dim",text:"installed"}},[E]),k=ce((f=null)=>{C(f),w(null),ue(null),ie(!1),q(!1),ee.current=!1,Ce(Zn()),h("launch")},[]),ee=En(!!t);he(()=>{g!=="launch"||!X||ee.current||(ee.current=!0,ie(!0),$t(X,{...We?{nonce:We}:{},...O?{want:O}:{}}).then(ue))},[g,X,We,O]);let pe=ce(()=>{ie(!0),_t().then(ue)},[]),Ct=ce(f=>{if(fe){let N=Zn();q(!1),Ce(N),X&&(f.preventDefault(),window.location.href=qn(X,N??void 0,O??void 0))}pe()},[fe,pe,X,O]),ve=en(()=>{let f=y?.runtimes;return f?me.filter(N=>f.includes(N.id)):sr()},[y?.runtimes]),Re=en(()=>{let f=me.find(N=>N.id===O);return f?{choice:f,Mark:$e[f.id]??null}:null},[O]),Je=en(()=>E.find(f=>f.id===de),[E,de]);he(()=>{let f=We;if(!e||!p||g!=="launch"||!f)return;let N=!1,U=Date.now()+15e4,J=()=>{};return J=Se(async()=>{if(Date.now()>U){J(),q(!0);return}try{let cn=await e.claim(f);if(N)return;if(cn.declined){J(),ue(null),Pe("machine"),h("denied");return}if(!cn.claimed)return;J();try{Ze.current=new Set((await e.machines()).map(Ee=>Ee.id))}catch{Ze.current=new Set(E.map(Ee=>Ee.id))}h("waiting"),_(Date.now())}catch{}},br,{immediate:!1,idle:!1}),()=>{N=!0,J()}},[e,g,E,We,p]);let ke=en(()=>{if(!L)return null;if(L.approved||L.denied)return"answered";let f=L.expires_at?Date.parse(L.expires_at):Number.NaN;return Number.isFinite(f)&&f<=ne?"expired":"live"},[L,ne]);he(()=>{if(!(g==="confirm"&&ke==="live"||g==="waiting"||g==="hosted"))return;let N=setInterval(()=>Qe(Date.now()),1e3);return()=>clearInterval(N)},[g,ke]);let vt=ce(async(f,N)=>{if(e)try{await e.approveRuntime(f,N),I(await e.machines())}catch(U){w(U.message)}},[e]),Vt=ce(async(f,N)=>{if(e)try{await e.preferRuntime(f,N),I(await e.machines())}catch(U){w(U.message)}},[e]);return g==="loading"?m("div",{className:"soba-connect",...c?{"data-theme":c}:{},style:qe,children:m("div",{className:"sc-card",children:m("p",{className:"sc-note",children:"Loading\u2026"})})}):P("div",{className:"soba-connect",...c?{"data-theme":c}:{},style:qe,children:[l&&m("button",{type:"button",className:"sc-modal-close",onClick:l,"aria-label":"Close",children:"\xD7"}),g==="manage"&&P("div",{className:"sc-card",children:[m("h2",{className:"sc-title",id:le,children:"Your compute"}),P("p",{className:"sc-sub",children:[m(Ot,{context:y})," ",E.length>0&&Q.length>0?"runs on your connected plan, and on these machines while they are awake.":Q.length>0?"runs on the plan you connected. Nothing here is charged to you.":"runs on these machines, while they are awake."]}),m(bn,{machines:E,hosted:Q,onApproveRuntime:vt,onPreferRuntime:(f,N)=>void Vt(f,N),onDisconnectHosted:f=>void At(f),onPair:()=>h("choose"),busy:ae,...y?.app.name?{appName:y.app.name}:{}}),G&&m("p",{className:"sc-error",children:G})]}),g==="choose"&&P("div",{className:"sc-card",children:[m(va,{context:y}),m("h2",{className:"sc-h",id:le,children:u==="payment_required"?"Carry on with your own AI":u==="no_compute"?"This run needs a machine":"Connect your AI"}),m("p",{className:"sc-p",children:"Use compute you already have."}),X&&ve.length>0&&P(Tt,{children:[m("div",{className:"sc-opts",children:ve.map(f=>{let N=$e[f.id];return P("button",{type:"button",className:"sc-opt",onClick:()=>k(f.id),children:[m("span",{className:"sc-opt-tile","aria-hidden":"true",children:N&&m(N,{className:"sc-opt-mark"})}),m("span",{className:"sc-opt-text",children:m("span",{className:"sc-opt-label",children:f.label})}),(()=>{let U=Qt(f.id);return U?m("span",{className:`sc-opt-has sc-opt-has-${U.tone}`,children:U.text}):S===f.id?m("span",{className:"sc-opt-last",children:"last used"}):m(wr,{className:"sc-opt-go"})})()]},f.id)})}),P("p",{className:"sc-opt-note",children:["Your accounts stay there. ",So(y)," never sees them."]})]}),(!X||ve.length===0)&&m("p",{className:"sc-error",style:{marginTop:16},children:"This app has no publishable key yet, so there is nothing to pair against."}),G&&m("p",{className:"sc-error",children:G}),X&&y?.show_code===!0&&m("div",{className:"sc-opt-alt",children:m("button",{type:"button",className:"sc-alt-link",onClick:()=>h("code"),children:"I have a code"})})]}),g==="launch"&&P("div",{className:"sc-card",children:[P("div",{className:"sc-head",children:[m(In,{onClick:()=>h("choose")}),m("p",{className:"sc-head-title",children:"Soba App"})]}),m(Lt,{mark:Re?.Mark??te,still:fe||!Be&&z===null}),m("h2",{className:"sc-h",id:le,children:fe?"No answer from this machine":z==="absent"?"Nothing opened":z===null?"Opening Soba App\u2026":"Approve it on this machine"}),fe?m("p",{className:"sc-p",children:"The Soba app did not answer. It may not be open, or nobody was there. Try again when you are ready."}):z==="absent"?m("p",{className:"sc-p",children:"Nothing opened on this machine. Open it yourself below, or install it if it is not here yet."}):m("p",{className:"sc-p",children:z===null?"Approve it there and this page does the rest.":"This page finishes on its own."}),Re&&P("p",{className:"sc-prereq",children:[Re.Mark&&m(Re.Mark,{className:"sc-rt-mark"}),"Needs ",Re.choice.prerequisite]}),P("div",{className:"sc-stack",style:{marginTop:18},children:[m("a",{className:z==="absent"||fe?"sc-btn sc-btn-primary":"sc-btn",href:ln??"#",onClick:Ct,children:fe?"Try again":z==="absent"?"Open Soba App":"Open it again"}),m("p",{className:"sc-note",children:z===null?"Your browser will ask permission first.":"Your browser asks permission the first time."}),Re&&z==="absent"&&m("p",{className:"sc-note",children:m(ka,{text:Re.choice.hint})}),P("div",{className:"sc-foot-strip",children:[m("span",{children:"Not installed on this machine?"}),P("button",{type:"button",className:"sc-foot-go",onClick:()=>h("get"),children:["Get it",m(wr,{})]})]})]})]}),g==="get"&&P("div",{className:"sc-card",children:[P("div",{className:"sc-head",children:[m(In,{onClick:()=>h("launch")}),m("p",{className:"sc-head-title",children:"Get Soba App"})]}),m("div",{className:"sc-opts",children:rt.map(f=>P("a",{className:"sc-opt",href:`${wt}/download/${f.slug}`,target:"_blank",rel:"noreferrer noopener",children:[m("span",{className:"sc-opt-tile","aria-hidden":"true",children:m(or,{className:"sc-opt-mark"})}),m("span",{className:"sc-opt-text",children:m("span",{className:"sc-opt-label",children:f.label})}),m(wr,{className:"sc-opt-go"})]},f.slug))}),m("p",{className:"sc-opt-note",children:"Install it, then come back here and press the row you started with."})]}),g==="code"&&P("div",{className:"sc-card",children:[P("div",{className:"sc-head",children:[m(In,{onClick:()=>h("choose")}),m("p",{className:"sc-head-title",children:"Soba App"})]}),m("h2",{className:"sc-h",id:le,children:"Enter the code from that machine"}),m("p",{className:"sc-p",children:"Eight characters, shown by the Soba app once you paste the link."}),P("form",{className:"sc-stack",style:{marginTop:16},onSubmit:f=>{f.preventDefault(),bt()},children:[m("input",{className:"sc-input",value:B,onChange:f=>V(f.target.value),placeholder:"ACDE-F234",autoComplete:"off",autoFocus:!0,"aria-label":"Pairing code"}),G&&m("p",{className:"sc-error",children:G}),m("button",{type:"submit",className:"sc-btn sc-btn-primary",disabled:ae||B.length<8,children:ae?"Checking\u2026":"Continue"})]})]}),g==="confirm"&&L&&P("div",{className:"sc-card",children:[P("div",{className:"sc-head",children:[m(In,{onClick:()=>h("code")}),m("p",{className:"sc-head-title",children:"Soba App"})]}),m("h2",{className:"sc-title",children:"Attach this machine to your account?"}),P("p",{className:"sc-sub",children:[m(Ot,{context:y})," may send your runs to it once you approve. It can never see the account or the keys on it."]}),P("ul",{className:"sc-facts",children:[m(st,{k:"Code",v:L.user_code}),m(st,{k:"Machine",v:L.hostname??"not stated"}),m(st,{k:"System",v:[L.platform,L.arch].filter(Boolean).join(" / ")||"not stated"}),m(st,{k:"Asked by",v:L.client??"not stated"}),L.labels.length>0&&m(st,{k:"Labels",v:L.labels.join(", ")})]}),m("p",{className:"sc-note",style:{marginTop:12},children:"Every line above is what that machine said about itself. If none of it looks like a computer of yours, say no."}),ke==="expired"&&m("p",{className:"sc-error",children:"That code has expired. Ask the machine for a new one. It prints a fresh code each time it starts."}),ke==="answered"&&m("p",{className:"sc-error",children:"That code has already been answered. If it was not you, deny the next one."}),G&&m("p",{className:"sc-error",children:G}),P("div",{className:"sc-row",style:{marginTop:16},children:[m("button",{type:"button",className:"sc-btn sc-btn-primary",onClick:()=>void xn(),disabled:ae||ke!=="live",children:"Approve"}),m("button",{type:"button",className:"sc-btn",onClick:()=>void yt(),disabled:ae||ke==="answered",children:"No, deny it"})]}),ke==="live"&&L.expires_at&&P("p",{className:"sc-note",style:{marginTop:10},children:["This code expires in ",wa(Date.parse(L.expires_at)-ne),"."]})]}),g==="waiting"&&P("div",{className:"sc-card",children:[P("div",{className:"sc-head",children:[m(In,{onClick:()=>h("choose")}),m("p",{className:"sc-head-title",children:Re?.choice.short??"Soba App"})]}),m(Lt,{mark:Re?.Mark??te}),m("h2",{className:"sc-h",id:le,children:"Approved. Waiting for it to connect"}),m("p",{className:"sc-p",children:"Nothing more to do here. This page changes when it arrives."}),ge>0&&ne-ge>ba&&m("p",{className:"sc-note sc-tone-warn",style:{marginTop:14,textAlign:"center"},children:"Still nothing. Look at the Soba app on that machine: it says what it is doing. This keeps watching either way."})]}),g==="connected"&&P("div",{className:"sc-card",children:[m(Cr,{tone:"ok"}),m("h2",{className:"sc-h",id:le,children:Je?.label?`${Je.label} is connected`:"Connected"}),P("p",{className:"sc-p",children:[m(Ot,{context:y})," will use ",Je?.label?"it":"this machine"," from now on, while it is awake."]}),o&&P(Tt,{children:[m("div",{style:{marginTop:16},children:m(tt,{machines:E,onApproveRuntime:vt})}),m("button",{type:"button",className:"sc-btn sc-btn-wide",style:{marginTop:14},onClick:()=>h("manage"),children:"Done"})]})]}),g==="hosted"&&P("div",{className:"sc-card",children:[P("div",{className:"sc-head",children:[m(In,{onClick:()=>h("choose")}),m("p",{className:"sc-head-title",children:"ChatGPT"})]}),W?m(Lt,{mark:An,still:!0}):m(Lt,{mark:An}),m("h2",{className:"sc-h",id:le,children:W?"Your browser blocked the window":"Finish signing in to ChatGPT"}),m("p",{className:"sc-p",children:W?"Nothing opened. Open the sign-in yourself below. A link you click is allowed where a window we open is not.":"Approve it in the window that opened."}),P("div",{className:"sc-stack",style:{marginTop:18},children:[W&&m("a",{className:"sc-btn sc-btn-primary",href:W,target:"soba-connect-plan",rel:"noreferrer",children:"Open the ChatGPT sign-in"}),G&&m("p",{className:"sc-error",children:G}),Ge>0&&ne-Ge>ya&&m("p",{className:"sc-note sc-tone-warn",children:"Still nothing. The window may have been closed before it finished, or the sign-in may have been declined. This keeps watching either way."})]})]}),g==="hosted_connected"&&P("div",{className:"sc-card",children:[m(Cr,{tone:"ok"}),m("h2",{className:"sc-h",id:le,children:"ChatGPT is connected"}),P("p",{className:"sc-p",children:[m(Ot,{context:y})," will run on your ChatGPT plan",Q[0]?.account_label?` (${Q[0].account_label})`:"",". Nothing more to pay, nothing to install."]}),m("p",{className:"sc-opt-note",style:{textAlign:"center"},children:"It runs on our side, so it has no access to your files or your terminal."}),o&&P(Tt,{children:[m("button",{type:"button",className:"sc-btn sc-btn-wide",style:{marginTop:16},onClick:()=>h("manage"),children:"Done"}),m("div",{className:"sc-opt-alt",children:m("button",{type:"button",className:"sc-alt-link",onClick:()=>h("choose"),children:"Connect a machine too"})})]})]}),g==="denied"&&P("div",{className:"sc-card",children:[m(Cr,{tone:"off"}),m("h2",{className:"sc-h",id:le,children:"Declined"}),m("p",{className:"sc-p",children:Ae==="machine"?"Nothing was connected. You can ask again whenever you like.":"That machine was not attached to your account, and the terminal has been told so."}),m("button",{type:"button",className:"sc-btn sc-btn-wide",style:{marginTop:16},onClick:()=>h("choose"),children:"Back to the start"})]})]})}function So(e){return e?.app.name??"this app"}function Ca(e){let n=e?.app.icon_urls;if(n?.length)return n;let t=e?.app.icon_url;return t?[t]:[]}function Po(e){let n=Ca(e),[t,r]=Y([]),o=ce(l=>{l&&r(i=>i.includes(l)?i:[...i,l])},[]),s=ce(l=>o(l.currentTarget.getAttribute("src")),[o]),a=ce(l=>{l?.complete&&l.naturalWidth===0&&o(l.getAttribute("src"))},[o]);return{icon:n.find(l=>!t.includes(l)),onError:s,ref:a}}function va({context:e}){let{icon:n,onError:t,ref:r}=Po(e);return e?.app.mark==="soba"?m(te,{className:"sc-app-mark"}):n?m("img",{className:"sc-app-mark",src:n,alt:"","aria-hidden":"true",ref:r,onError:t}):null}function Ot({context:e}){let{icon:n,onError:t,ref:r}=Po(e),o=e?.app.mark==="soba";return P("span",{className:"sc-app",children:[o&&m(te,{className:"sc-app-icon"}),!o&&n&&m("img",{className:"sc-app-icon",src:n,alt:"",ref:r,onError:t}),So(e)]})}function In({onClick:e}){return m("button",{type:"button",className:"sc-head-back",onClick:e,"aria-label":"Back",children:m("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",children:m("path",{d:"M15 5 8 12l7 7",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})})}function wr({className:e}){return m("svg",{className:e,viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",children:m("path",{d:"M9 5l7 7-7 7",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function Lt({mark:e,still:n}){return P("span",{className:"sc-waiting","aria-hidden":"true",children:[!n&&m("svg",{className:"sc-waiting-orbit",viewBox:"0 0 100 100","aria-hidden":"true",focusable:"false",children:m("circle",{className:"sc-waiting-arc",cx:"50",cy:"50",r:"46"})}),m(e,{className:"sc-waiting-mark"})]})}function Cr({tone:e}){return m("span",{className:`sc-result sc-result-${e}`,"aria-hidden":"true",children:m(Xe,{kind:e==="ok"?"snap":"gone",size:84})})}function ka({text:e}){return m(Tt,{children:e.split("`").map((n,t)=>t%2===1?m("code",{className:"sc-inline-code",children:n},t):n)})}function st({k:e,v:n}){return P("li",{className:"sc-fact",children:[m("span",{className:"sc-fact-key",children:e}),m("span",{children:n})]})}import{forwardRef as Na}from"react";import{jsx as kr,jsxs as Nr}from"react/jsx-runtime";var xr=Na(function({machine:n,className:t,...r},o){if(!n)return null;let{ariaLabel:s,state:a}=Pn(n);return Nr("button",{ref:o,type:"button","aria-label":s,className:["sc-btn","sc-btn-connected",t].filter(Boolean).join(" "),...r,children:[kr("span",{className:"sc-pill-tile","aria-hidden":"true",children:kr(Xe,{kind:a.tone==="busy"?"serving":a.tone==="ok"?"ready":n.pairing_lost?"gone":"paused",size:16,className:"sc-pill-mark"})}),Nr("span",{className:"sc-btn-connected-text",children:[a.word,!n.pairing_lost&&Nr("span",{className:"sc-btn-connected-where",children:[" on ",j(n)]})]}),kr("i",{className:`sc-dot sc-dot-${a.tone}`,"aria-hidden":"true"})]})});import{useEffect as xa,useRef as Sr}from"react";var Bt=0,Mr=null;function Ro(){if(typeof document>"u")return()=>{};Bt===0&&(Mr=document.body.style.overflow,document.body.style.overflow="hidden"),Bt+=1;let e=!1;return()=>{e||(e=!0,Bt-=1,Bt===0&&(document.body.style.overflow=Mr??"",Mr=null))}}import{jsx as Eo}from"react/jsx-runtime";function at({open:e,onClose:n,labelledBy:t,theme:r,style:o,children:s}){let a=Sr(null),l=Sr(null),i=Sr(null);return xa(()=>{let c=a.current;if(c){if(!e){c.open&&c.close();return}return c.open||c.showModal(),document.activeElement===c&&l.current?.focus(),Ro()}},[e]),Eo("dialog",{ref:a,className:"soba-connect sc-modal","aria-labelledby":t,...r?{"data-theme":r}:{},style:o,onCancel:c=>{c.preventDefault(),n()},onPointerDown:c=>{i.current=c.target},onClick:c=>{c.target===c.currentTarget&&i.current===c.currentTarget&&n()},children:Eo("div",{className:"sc-modal-sheet",ref:l,tabIndex:-1,children:s})})}import{useEffect as Pr,useRef as Ma}from"react";import{jsx as Sa}from"react/jsx-runtime";var yn=8;function Rr({open:e,onClose:n,anchor:t,label:r,theme:o,style:s,children:a}){let l=Ma(null);return Pr(()=>{let i=l.current;if(!(!i||!(typeof i.showPopover=="function")))try{e?i.showPopover():i.hidePopover()}catch{}},[e]),Pr(()=>{if(!e)return;let i=()=>{let u=l.current,p=t.current;if(!u||!p)return;let A=p.getBoundingClientRect(),g=u.offsetWidth,h=u.offsetHeight,y=window.innerWidth-g-yn,M=Math.max(yn,Math.min(A.right-g,Math.max(yn,y))),E=A.bottom+yn,I=A.top-yn-h,B=E+h>window.innerHeight-yn&&I>yn?I:E;u.style.left=`${Math.round(M)}px`,u.style.top=`${Math.round(B)}px`};i();let c=requestAnimationFrame(i);return window.addEventListener("scroll",i,!0),window.addEventListener("resize",i),()=>{cancelAnimationFrame(c),window.removeEventListener("scroll",i,!0),window.removeEventListener("resize",i)}},[e,t]),Pr(()=>{if(!e)return;let i=u=>{u.key==="Escape"&&n()},c=u=>{let p=u.target;p&&(l.current?.contains(p)||t.current?.contains(p)||n())};return document.addEventListener("keydown",i),document.addEventListener("pointerdown",c,!0),()=>{document.removeEventListener("keydown",i),document.removeEventListener("pointerdown",c,!0)}},[e,n,t]),Sa("div",{ref:l,role:"dialog","aria-label":r,className:"soba-connect sc-pop",...o?{"data-theme":o}:{},popover:"manual",hidden:!e,style:s,children:a})}var it=new Map,On=new Map,Io=!1;function Pa(){Io||typeof window>"u"||(Io=!0,window.addEventListener("storage",e=>{!e.key||!it.has(e.key)||(On.set(e.key,It(e.key)),Er(e.key))}))}function Er(e){for(let n of it.get(e)??[])n()}function lt(e){return e??""}function Ir(e,n){let t=lt(e);Pa();let r=it.get(t)??new Set;return r.add(n),it.set(t,r),()=>{r.delete(n),r.size===0&&it.delete(t)}}function Gt(e){let n=lt(e),t=On.get(n);if(t!==void 0)return t;let r=e?It(e):null;return On.set(n,r),r}function Or(){return null}function Lr(e,n){Gt(e)===null&&(On.set(lt(e),n),Er(lt(e)))}function Tr(e,n){let t=lt(e);On.get(t)!==n&&(On.set(t,n),hr(e,n),Er(t))}function Ye(e){let n=`${e.unit}s`;return e.reward==="unlimited"?`Unlimited ${n} on your own AI`:e.reward==="included"&&e.includedUnits!==null?`${Ea(e.includedUnits)} ${n} a month once you connect`:e.reward==="credit"&&e.creditMicros>0?`${Ra(e.creditMicros)} back each month you stay connected`:null}function ze(e){return e==="unlimited"||e==="included"}var Lo=new Set(["user-hardware","user-subscription"]),Oo=new Set(["open-weights","frontier"]);function Le(e){return e===null||e.length===0?!1:e.every(n=>Lo.has(n))}var Ra=e=>(e/1e6).toLocaleString("en-US",{style:"currency",currency:"USD",minimumFractionDigits:2,maximumFractionDigits:2}),Ea=e=>e.toLocaleString("en-US");function Br(e,n){if(!(n===null||n.some(s=>Oo.has(s))))return!1;let r=e.findIndex(s=>Lo.has(s));if(r===-1)return!1;let o=e.findIndex(s=>Oo.has(s));return o===-1||r<o}import{createContext as To,useContext as Bo}from"react";var Gr=To(null);function Ln(){return Bo(Gr)}var Wr=To({context:null,machines:void 0,theme:"light"});function H(){return Bo(Wr)}import{useMemo as La}from"react";import{createContext as Ia,useContext as Oa}from"react";var Hr=Ia(null);function F(){let e=Oa(Hr);if(!e)throw new Error("useSoba() must be used inside a <SobaProvider>.");return e}function ct(){let{compute:e}=F();return La(()=>{let n=e.machines,t=[...n].sort((s,a)=>De([s,a])===s?-1:1).map(Ta),r=De([...n]),o=pn(n);return{view:t.length?"machines":e.loading?"loading":e.error?"error":"empty",machines:t,primary:r?t.find(s=>s.machine.id===r.id)??null:null,connected:e.connected,online:e.online,stalled:e.connected&&!e.online&&o?t.find(s=>s.machine.id===o.id)??null:null,loading:e.loading,error:e.error,refresh:e.refresh}},[e])}function Ta(e){let n=Ie(e);return{machine:e,name:j(e),state:mn(e),status:Zt(e),hardware:Yn(e),lastSeen:e.state==="offline"?zn(e.last_seen_at):null,runtimes:Ne(e).map(t=>({runtime:t,name:t.display_name,auth:_e(t),quarantined:!!t.quarantined})),runsOn:{by:n.by,name:n.runtime?.display_name??null}}}import{useCallback as Dr,useEffect as Ba,useMemo as Ur,useSyncExternalStore as Ga}from"react";function wn(e={}){let{compute:n,connect:t}=F(),{value:r,onChange:o,defaultValue:s,remember:a=!0,user:l}=e,i=r!==void 0,c=a&&!i?mr(t.publishableKey,l):null,u=Dr(I=>Ir(c,I),[c]),p=Ga(u,Dr(()=>Gt(c),[c]),Or),A=Ur(()=>_n(n.machines),[n.machines]),g=Ur(()=>$n(A),[A]);Ba(()=>{i||!s||Lr(c,s)},[i,s,c]);let h=i?r:p??s??null,{selected:y,unavailable:M}=Ur(()=>tr(A,h??null),[A,h]),E=Dr(I=>{i||Tr(c,I),o?.(I)},[i,c,o]);return{options:A,groups:g,selected:y,select:E,run:rr(y),unavailable:M,pickable:fn(A),loading:n.loading&&!n.machines.length}}import{jsx as ut}from"react/jsx-runtime";function Wa({className:e}){let{theme:n}=H(),t=e?`soba-connect ${e}`:"soba-connect";return ut("div",{className:t,"data-theme":n,children:ut(Fr,{})})}function Fr(){let e=ct(),n=wn();return e.view==="loading"?ut("p",{className:"sc-note",children:"Loading\u2026"}):e.view==="error"?ut("p",{className:"sc-error",children:e.error?.message}):ut(tt,{machines:e.machines.map(t=>t.machine),model:n.selected,onPickModel:n.select})}import{useCallback as pt,useEffect as Yr,useMemo as Ya,useRef as zr,useState as Bn}from"react";import{useId as Ha}from"react";import{jsx as Tn,jsxs as Wt}from"react/jsx-runtime";function dt({open:e,onOpenChange:n,initialCode:t,onConnected:r,showStatus:o,reason:s}){let{error:a}=F(),l=Ln(),i=H(),c=()=>n(!1),u=Ha(),p=i.context?.background?.trim(),A=p?dn(p,i.context?.accent):void 0;return Wt(at,{open:e,onClose:c,labelledBy:u,theme:i.theme,style:A,children:[a?Wt("div",{className:"sc-card",children:[Tn("h2",{className:"sc-title",id:u,children:"Could not start"}),Tn("p",{className:"sc-error",children:a.message})]}):!l&&!i.context?Wt("div",{className:"sc-card",children:[Tn("h2",{className:"sc-title",id:u,children:"One moment"}),Tn("p",{className:"sc-note",children:"Getting your compute\u2026"})]}):Tn(vr,{client:l,active:e,onClose:c,headingId:u,theme:i.theme,initialContext:i.context,...i.machines!==void 0?{initialMachines:i.machines}:{},...t?{initialCode:t}:{},...r?{onConnected:r}:{},...o===void 0?{}:{showStatus:o},...s?{reason:s}:{}}),Wt("p",{className:"sc-modal-foot",children:[Tn(te,{className:"sc-foot-mark"}),"Secured by Soba"]})]})}import{forwardRef as Da}from"react";import{jsx as Ua}from"react/jsx-runtime";var Qr=Da(function(n,t){let{theme:r}=H();return Ua(xr,{ref:t,"data-theme":r,...n})});import{useCallback as Fa}from"react";function Qa(){let{connect:e}=F(),n=ct(),t=Fa(()=>e.open("manual"),[e]);return{...Pn(n.primary?.machine??null),machine:n.primary,open:t,canOpen:e.hasModal,loading:n.view==="loading"}}function Vr(e){return Pn(e)}import{useCallback as Go,useEffect as Va,useState as Ja}from"react";function Jr({enabled:e=!0,intervalMs:n=3e3}={}){let t=Ln(),[r,o]=Ja(null),s=Go(async()=>{t&&o(await t.runs())},[t]);Va(()=>{if(!e||!t)return;let l=!0,i=Se(async()=>{let c=await t.runs();l&&o(c)},n);return()=>{l=!1,i()}},[e,t,n]);let a=Go(async l=>{if(!t)throw new Error("Stopping a run needs <SobaProvider>.");await t.stopRun(l),await s().catch(()=>{})},[t,s]);return{runs:r,refresh:s,stop:a}}import{Fragment as Wo,jsx as Gn,jsxs as Ho}from"react/jsx-runtime";function Cn({children:e,variant:n,className:t,initialCode:r,onConnected:o,defaultOpen:s,open:a,onOpenChange:l,showConnected:i=!0}){let{compute:c,connect:u}=F(),p=H(),{theme:A}=p,g=Ln(),[h,y]=Bn(s??!!r),M=zr(null),E=a!==void 0,I=!E&&!s&&!r&&u.hasModal,B=E?a:I?u.isOpen:h,V=C=>{I?C?u.open("manual"):u.close():E||y(C),l?.(C)},L=zr(B);Yr(()=>{L.current&&!B&&M.current?.focus(),L.current=B},[B]);let[x,G]=Bn(!1),{runs:w,stop:ae}=Jr({enabled:x}),K=wn(),ge=Ya(()=>x&&w?za(c.machines,w):c.machines,[c.machines,x,w]),_=De(ge),ne=i&&Vr(_).connected,Qe=pt(()=>G(!1),[]),[z,ue]=Bn(!1),Be=pt(async()=>{ue(!0);try{await c.refresh()}finally{ue(!1)}},[c]),ie=zr(Be);ie.current=Be,Yr(()=>{x&&ie.current()},[x]);let[fe,q]=Bn(!1),[Ae,Pe]=Bn([]),de=!!p.context?.hosted_available;Yr(()=>{if(!x||!g||!de)return;let C=!0;return g.hosted().then(S=>{C&&Pe(S.credentials)}).catch(()=>{}),()=>{C=!1}},[x,g,de]);let[be,Q]=Bn(null),$=pt(async(C,S)=>{if(g){Q(null);try{await g.approveRuntime(C,S),await c.refresh()}catch(Ve){Q(Ve.message)}}},[g,c]),Ge=pt(async(C,S)=>{if(g){Q(null);try{await g.preferRuntime(C,S),await c.refresh()}catch(Ve){Q(Ve.message)}}},[g,c]),je=pt(async C=>{if(g){Q(null);try{await g.disconnectHosted(C),Pe((await g.hosted()).credentials)}catch(S){Q(S.message)}}},[g]),W=p.context?.background?.trim(),ye=W?dn(W,p.context?.accent):void 0,Z=ne&&!e,O=()=>{if(Z&&!E&&!s&&!r){G(C=>!C);return}V(!0)};return Ho(Wo,{children:[Z?Gn(Qr,{ref:M,machine:_,"aria-haspopup":"dialog","aria-expanded":x,onClick:O,...t?{className:t}:{}}):Gn("button",{ref:M,type:"button","data-theme":A,className:["sc-btn","sc-btn-icon",n==="primary"?"sc-btn-primary":"",t].filter(Boolean).join(" "),onClick:O,children:e??Ho(Wo,{children:[Gn(te,{className:"sc-btn-mark"}),"Connect compute"]})}),Gn(Rr,{open:x,onClose:Qe,anchor:M,label:"Your compute",theme:A,...ye?{style:ye}:{},children:Gn(bn,{machines:ge,hosted:Ae,onApproveRuntime:(C,S)=>void $(C,S),onPreferRuntime:(C,S)=>void Ge(C,S),onDisconnectHosted:C=>void je(C),onRefresh:()=>void Be(),refreshing:z,model:K.selected,onPickModel:K.select,error:be,runs:w,onStopRun:async C=>{Q(null);try{await ae(C)}catch(S){throw Q(S.message),S}},onPair:()=>{G(!1),I?u.open("pair"):(q(!0),V(!0))},...p.context?.app.name?{appName:p.context.app.name}:{}})}),!I&&Gn(dt,{open:B,onOpenChange:C=>{C||q(!1),V(C)},...fe?{showStatus:!1}:{},...r?{initialCode:r}:{},...o?{onConnected:o}:{}})]})}function za(e,n){return e.map(t=>{if(t.state==="offline")return t;let r=n.filter(o=>o.machine_id===t.id).length;return{...t,active:r,state:r>0?"busy":"online"}})}import{jsx as jr,jsxs as qa}from"react/jsx-runtime";function ja({initialCode:e,onConnected:n,className:t,showStatus:r=!0}){let{theme:o}=H();return qa("div",{className:t?`soba-connect ${t}`:"soba-connect","data-theme":o,children:[r&&jr(Fr,{}),jr("div",{className:"sc-compute-act",children:jr(Cn,{...e?{initialCode:e}:{},...n?{onConnected:n}:{}})})]})}import{useId as ai,useState as ii}from"react";import{useCallback as Zr,useEffect as Vo,useState as Jo}from"react";import{useCallback as Za,useState as Xa}from"react";function mt(){let[e,n]=Xa(null);return{open:Za(()=>{n(null),Xn().then(n)},[]),launch:e,note:e==="absent"?"Nothing opened here. That machine may be a different computer, or asleep.":null}}import{useCallback as Do,useMemo as Uo}from"react";function vn(e){if(!e)return null;if(typeof e=="string")return e;if(typeof Response<"u"&&e instanceof Response)return Fo(e.status);let n=e,t=n.error;return typeof t?.code=="string"?t.code:typeof t?.type=="string"?t.type:typeof n.code=="string"?n.code:typeof n.status=="number"?Fo(n.status):n.cause&&n.cause!==e?vn(n.cause):null}function Fo(e){return e===402?"payment_required":e===409?"no_compute":null}function qr(...e){let[n,t]=e,{plan:r,compute:o,connect:s}=F(),a=t?.predict??e.length===0,l=_a(Ka(n),o)??(a?$a(r,o):null),i=r.plan,c=r.plans,u=Uo(()=>{if(l!=="payment_required")return null;let h=i?.price??0,y=i?.included_units??0;return c.find(M=>M.id!==i?.id&&M.price>h&&(M.included_units===null||M.included_units>y))??null},[l,c,i]),p=Do(async()=>{if(!u)return;if(u.selectable){await r.select(u.id);return}let h=await r.checkout(u.id);window.location.assign(h)},[u,r]),A=s.open,g=Do(()=>{l&&A(l)},[A,l]);return Uo(()=>{if(!l)return null;let h=i?Ye({unit:i.unit,reward:i.connected_reward,includedUnits:i.connected_included_units,creditMicros:i.connected_credit*1e6}):null,y=i&&ze(i.connected_reward)?h:null;return{reason:l,...ei(l,{connectOffer:y,connected:o.connected,online:o.online,machine:pn(o.machines)?.label??null,unit:i?.unit??"message",interval:i?.interval??"month",upgrade:u!==null,resets:r.current?.period_end??null}),connectOffer:y,upgradeTo:u,connect:g,upgrade:p}},[l,i,o,u,g,p,r.current?.period_end])}function Ka(e){let n=vn(e);return n==="payment_required"||n==="no_compute"?n:null}function _a(e,n){return e==="no_compute"&&n.connected&&n.online?null:e}function $a(e,n){let t=e.plan;return!t||n.loading?null:Le(t.route_allow)&&!n.online?"no_compute":e.remaining===0&&t.overage==="stop"?"payment_required":null}function ei(e,n){if(e==="payment_required"){let t=`No ${n.unit}s left this ${n.interval}`;return n.connectOffer&&!n.connected?{title:t,body:`${n.connectOffer}. Connecting takes a minute and costs nothing.`}:n.connectOffer&&!n.online?{title:t,body:`${n.connectOffer}. Waking ${n.machine??"your machine"} is enough.`}:n.upgrade?{title:t,body:n.resets?`A larger plan carries on now. This one comes back on ${Qo(n.resets)}.`:"A larger plan carries on now, or wait for this one to renew."}:{title:t,body:n.resets?`Your allowance comes back on ${Qo(n.resets)}.`:"Your allowance comes back at the start of the next period."}}return n.connected&&!n.online?{title:`${n.machine??"Your machine"} can't be reached`,body:"This run needs it awake and connected. Open Soba App on that machine, or connect another one."}:{title:"Nothing connected yet",body:"This app runs on AI you already pay for, on a machine of your own. Connect one and this run has somewhere to go."}}function Qo(e){let n=new Date(e);return Number.isNaN(n.getTime())?e:n.toLocaleDateString(void 0,{day:"numeric",month:"long"})}function ni(e){let{plan:n,allowance:t,connected:r,online:o,quiet:s,error:a,predict:l,at:i,waved:c}=e;if(!n)return null;let u=e.allow!==void 0?e.allow:n.route_allow;if(r){if(o)return null;let y=Le(u);return{reason:"stalled",title:`${s??"Your machine"} can\u2019t be reached`,detail:y?"The Soba app there has stopped reporting in, so runs have nowhere to go until it is back.":"The Soba app there has stopped reporting in, so nothing will run on your own AI until it is back.",meter:null,dismissible:!1,atTheWall:!1,ownCompute:y}}let p=vn(a),A=p==="payment_required"||p==="no_compute",g=n.ask_to_connect!==!1&&Br(n.route_prefer,u);if(!l&&!A&&!g)return null;let h=Le(u)?ti(n.unit,Le(n.route_allow)):ze(n.connected_reward)?oi(t,n,i):g?ri(n.unit):null;return!h||h.dismissible&&c?null:{...h,dismissible:!!h.dismissible,ownCompute:!1,atTheWall:!h.dismissible&&(!l||h.meter!==null&&h.meter.left===0)}}function Xr(e={}){let{at:n=.25,error:t,allow:r}=e,o=e.predict??!(e.errorGiven??t!==void 0),{plan:s,compute:a,connect:l}=F(),i=gr(l.publishableKey),[c,u]=Jo(!1);Vo(()=>{u(fr(i))},[i]);let p=Zr(()=>{u(!0),Ar(i)},[i]),A=Zr(()=>l.open("manual"),[l]),g=Zr(()=>l.open("no_compute"),[l]),h=mt(),[y,M]=Jo(!1),{refresh:E}=a,{launch:I}=h;Vo(()=>{if(I===null||I==="absent")return;M(!1);let G=setInterval(()=>void E(),3e3),w=setTimeout(()=>{clearInterval(G),M(!0)},2e4);return()=>{clearInterval(G),clearTimeout(w)}},[I,E]);let B=si(l.app?.name,ot(l.connectUrl)),V=s.loading||a.loading,L=pn(a.machines),x=V?null:ni({plan:s.plan,allowance:{remaining:s.remaining,included:s.included},connected:a.connected,online:a.online,quiet:L?j(L):null,error:t,predict:o,...r!==void 0?{allow:r}:{},at:n,waved:c});return{reason:x?.reason??null,visible:x!==null,title:x?.title??null,detail:x?.detail??null,meter:x?.meter??null,dismissible:x?.dismissible??!1,dismissed:c,dismiss:p,open:A,atTheWall:x?.atTheWall??!1,steps:B,stalled:x?.reason==="stalled"?{machine:L?j(L):null,ownCompute:x.ownCompute,wake:h.open,launch:h.launch,note:h.note,stuck:y,connectAnother:g}:null,loading:V}}function ti(e,n){return{reason:"needed",title:n?"This plan runs on your own AI.":`These ${e}s run on your own AI.`,detail:`Connect a machine and your ${e}s run there, free, on access you already have.`,meter:null}}function ri(e){return{reason:"preferred",title:"This plan prefers your own AI.",detail:`Connect a machine and your ${e}s run there instead, on access you already have.`,meter:null,dismissible:!0}}function oi(e,n,t){let{remaining:r,included:o}=e;if(r===null||o===null||o===0||r>Math.ceil(o*t))return null;let s=Ye({unit:n.unit,reward:n.connected_reward,includedUnits:n.connected_included_units,creditMicros:n.connected_credit*1e6});return s?{reason:"running",title:r===0?`No ${n.unit}s left this month.`:`${r} ${n.unit}${r===1?"":"s"} left this month.`,detail:`${s}.`,meter:{left:r,of:o}}:null}function si(e,n){return[{lead:"Download Soba App",detail:"",...n?{linksLead:"Get it for"}:{},links:n?rt.map(t=>({label:t.label,href:`${n}/download/${t.slug}`})):[]},{lead:"Connect compute",detail:"Press this, then approve the pairing when the app asks.",opens:!0,links:[]},{lead:"Let your AIs serve",detail:`It finds what is installed on that machine. Allow one, and ${e??"this app"} sends every run there.`,linksLead:"Nothing on it yet?",links:me.map(t=>({label:t.short,href:t.install}))}]}import{Fragment as zo,jsx as T,jsxs as nn}from"react/jsx-runtime";function li(e){let{className:n,fallback:t=null}=e,r=Xr({...e.at===void 0?{}:{at:e.at},...e.predict===void 0?{}:{predict:e.predict},...e.allow===void 0?{}:{allow:e.allow},error:e.error,errorGiven:"error"in e}),{connect:o}=F(),{theme:s}=H(),[a,l]=ii(null),i=ai(),c=T(zo,{children:t});if(!r.visible)return c;if(r.stalled)return T(Yo,{className:n,theme:s,stalled:!0,children:T(ci,{title:r.title??"",detail:r.detail??"",stalled:r.stalled})});let u=a??r.atTheWall;return nn(Yo,{className:n,theme:s,children:[nn("div",{className:"sc-nudge-top",children:[nn("div",{className:"sc-nudge-say",children:[T("p",{className:"sc-nudge-title",children:r.title}),T("p",{className:"sc-nudge-detail",children:r.detail}),nn("button",{type:"button",className:"sc-btn sc-btn-quiet sc-nudge-more","aria-expanded":u,"aria-controls":i,onClick:()=>l(!u),children:[u?"Hide the details":"How it works",T(di,{})]})]}),r.dismissible?T("button",{type:"button",className:"sc-nudge-dismiss","aria-label":"Dismiss",title:"Dismiss",onClick:r.dismiss,children:T(ui,{})}):null]}),u?T("ol",{className:"sc-nudge-steps",id:i,children:r.steps.map(p=>nn("li",{children:[p.opens?T("button",{type:"button",className:"sc-step-lead",onClick:()=>o.open("manual"),children:p.lead}):T("strong",{children:p.lead}),p.detail?T("span",{children:p.detail}):null,p.links.length>0?nn("span",{className:"sc-step-links",children:[p.linksLead,p.links.map(A=>T("a",{href:A.href,target:"_blank",rel:"noreferrer noopener",children:A.label},A.href))]}):null]},p.lead))}):null,T(Cn,{variant:"primary"})]})}function Yo({className:e,theme:n,stalled:t,children:r}){return T("div",{className:e?`soba-connect sc-fill ${e}`:"soba-connect sc-fill","data-theme":n,children:T("div",{className:t?"sc-nudge sc-nudge-stalled":"sc-nudge",children:r})})}function ci({title:e,detail:n,stalled:t}){return nn(zo,{children:[T("div",{className:"sc-nudge-top",children:nn("div",{className:"sc-nudge-say",children:[T("p",{className:"sc-nudge-title",children:e}),T("p",{className:"sc-nudge-detail",children:n}),t.note&&T("p",{className:"sc-nudge-note",children:t.note}),t.stuck&&T("p",{className:"sc-nudge-note",children:"The Soba app is open, but this machine still isn\u2019t reporting in. It may no longer be connected to this app."}),(t.launch==="absent"||t.stuck)&&T("button",{type:"button",className:"sc-btn sc-btn-quiet sc-nudge-more",onClick:t.connectAnother,children:t.stuck?"Connect it again":"Connect another machine"})]})}),T("button",{type:"button",className:"sc-btn sc-btn-primary",onClick:t.wake,children:"Open Soba App"})]})}function ui(){return T("svg",{viewBox:"0 0 16 16","aria-hidden":"true",focusable:"false",className:"sc-nudge-x",children:T("path",{d:"m4.8 4.8 6.4 6.4M11.2 4.8l-6.4 6.4",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round"})})}function di(){return T("svg",{viewBox:"0 0 16 16","aria-hidden":"true",focusable:"false",className:"sc-nudge-chev",children:T("path",{d:"M4.5 6.5 8 10l3.5-3.5",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round"})})}var pi=new Set(["delta","thinking","status","done","error"]);function Wn(e){let n;try{n=JSON.parse(e)}catch{return null}if(!n||typeof n!="object")return null;let t=n,r=t.type==="event"?t.event:t;if(!r||typeof r!="object")return null;let o=r;if(typeof o.type!="string"||!pi.has(o.type))return null;let s={type:o.type};return typeof o.text=="string"&&(s.text=o.text),typeof o.message=="string"&&(s.message=o.message),typeof o.tool=="string"&&(s.tool=o.tool),typeof o.tier=="string"&&(s.tier=o.tier),o.usage&&typeof o.usage=="object"&&(s.usage=o.usage),typeof o.session=="string"&&(s.session=o.session),typeof o.toolInput=="string"&&(s.toolInput=o.toolInput),o.git&&typeof o.git=="object"&&(s.git=o.git),o.turn&&typeof o.turn=="object"&&typeof o.turn.text=="string"&&(s.turn={text:o.turn.text}),typeof o.reason=="string"&&(s.reason=o.reason),typeof o.retryable=="boolean"&&(s.retryable=o.retryable),(o.state==="interrupted"||o.state==="resumed")&&(s.state=o.state),s}async function*Kr(e){let n=e.body;if(!n)throw new Error("That run response had no body to stream.");let t=(e.headers.get("content-type")??"").includes("ndjson"),r=n.getReader(),o=new TextDecoder,s="",a=[];try{for(;;){let i=await r.read();if(i.done)break;for(s+=o.decode(i.value,{stream:!0});;){let c=s.indexOf(`
3
+ `);if(c===-1)break;let u=qo(s.slice(0,c));if(s=s.slice(c+1),t){let p=u.trim()?Wn(u):null;p&&(yield p);continue}if(u===""){let p=a.join(`
4
+ `);if(a=[],p==="[DONE]")return;let A=p?Wn(p):null;A&&(yield A);continue}jo(u,a)}}!t&&s&&jo(qo(s),a);let l=t?s.trim():a.join(`
5
+ `);if(l&&l!=="[DONE]"){let i=Wn(l);i&&(yield i)}}finally{r.cancel().catch(()=>{})}}function jo(e,n){if(!e||e.startsWith(":"))return;let t=e.indexOf(":");if(t===-1||e.slice(0,t)!=="data")return;let r=e.slice(t+1);n.push(r.startsWith(" ")?r.slice(1):r)}function qo(e){return e.endsWith("\r")?e.slice(0,-1):e}async function mi(e){let n="";for await(let t of e)if(t.type==="delta"&&t.text&&(n+=t.text),t.type==="error")throw new Error(t.message??"The run ended with an error.");return n}import{jsx as Zo}from"react/jsx-runtime";function hi({caption:e,disabled:n,className:t,...r}){let{theme:o}=H(),{options:s,selected:a,select:l,pickable:i}=wn(r);return i?Zo("span",{className:"soba-connect sc-inline","data-theme":o,children:Zo(et,{options:s,selected:a,onPick:l,...e?{caption:e}:{},...n?{disabled:n}:{},...t?{className:t}:{}})}):null}import{useEffect as gi}from"react";var Xo="data-soba-react",Ko=!1;function ht(){if(Ko||typeof document>"u"||(Ko=!0,document.querySelector(`style[${Xo}]`)))return;let e=document.createElement("style");e.setAttribute(Xo,""),e.textContent=`.soba-connect {
6
6
  --sc-ground: #ffffff;
7
7
  --sc-sheet: #ffffff;
8
8
  --sc-raised: #f6f6f7;
@@ -16,11 +16,18 @@ import{useEffect as Ns,useRef as xs,useState as At}from"react";var yn=class exte
16
16
  --sc-ok: #22a06b;
17
17
  --sc-warn: #b06f14;
18
18
 
19
- --sc-tray: var(--sc-raised, #f6f6f7);
19
+ --sc-danger: #c2452d;
20
+
21
+ --sc-warn-dot: #d9a21b;
22
+
23
+
24
+ --sc-tray: #f3f3f2;
20
25
  --sc-tray-card: var(--sc-sheet, #ffffff);
21
- --sc-tray-sunk: var(--sc-raised, #f6f6f7);
26
+ --sc-tray-sunk: #efefed;
22
27
 
23
28
  --sc-font-size: 15px;
29
+
30
+ --sc-scale: 1;
24
31
  --sc-fs-label: max(11px, calc(var(--sc-font-size) * 0.77));
25
32
 
26
33
  --sc-fs-small: max(12px, calc(var(--sc-font-size) * 0.87));
@@ -204,10 +211,6 @@ a.sc-btn {
204
211
  color: var(--sc-muted, #6b6b73);
205
212
  }
206
213
 
207
- .sc-tone-absent {
208
- color: var(--sc-faint, #a1a1aa);
209
- }
210
-
211
214
  .sc-error {
212
215
  color: var(--sc-warn, #b06f14);
213
216
  font-size: var(--sc-fs-body);
@@ -256,10 +259,11 @@ a.sc-btn {
256
259
 
257
260
  .sc-tray {
258
261
  display: grid;
259
- gap: 8px;
260
- padding: 6px;
261
- border-radius: 18px;
262
- background: var(--sc-tray, #f6f6f7);
262
+
263
+ gap: calc(16px * var(--sc-scale, 1));
264
+ padding: calc(16px * var(--sc-scale, 1));
265
+ border-radius: calc(18px * var(--sc-scale, 1));
266
+ background: var(--sc-tray, #f3f3f2);
263
267
  }
264
268
 
265
269
  .sc-group {
@@ -269,16 +273,17 @@ a.sc-btn {
269
273
  .sc-group-cap {
270
274
  display: flex;
271
275
  align-items: center;
272
- gap: 4px;
273
- min-height: 24px;
274
- padding: 0 2px 3px 12px;
276
+ gap: calc(4px * var(--sc-scale, 1));
277
+ min-height: calc(22px * var(--sc-scale, 1));
278
+
279
+ padding: 0 0 calc(8px * var(--sc-scale, 1)) calc(4px * var(--sc-scale, 1));
275
280
  }
276
281
 
277
282
  .sc-cap-acts {
278
283
  flex: none;
279
284
  display: flex;
280
285
  align-items: center;
281
- gap: 4px;
286
+ gap: calc(4px * var(--sc-scale, 1));
282
287
  }
283
288
 
284
289
  .sc-group-title {
@@ -288,24 +293,28 @@ a.sc-btn {
288
293
  overflow: hidden;
289
294
  text-overflow: ellipsis;
290
295
  white-space: nowrap;
291
- font-size: var(--sc-fs-label);
296
+ font-size: calc(var(--sc-font-size, 15px) * 0.9333);
292
297
  letter-spacing: 0;
293
298
  color: var(--sc-muted, #6b6b73);
294
299
  }
295
300
 
296
301
  .sc-group-card {
297
- padding: 6px 0 6px 12px;
298
- border-radius: var(--sc-r-lg, 14px);
302
+ padding: calc(7px * var(--sc-scale, 1)) 0 calc(7px * var(--sc-scale, 1))
303
+ calc(12px * var(--sc-scale, 1));
304
+ border-radius: calc(12px * var(--sc-scale, 1));
299
305
  background: var(--sc-tray-card, #ffffff);
300
- box-shadow: var(--sc-shadow-1);
306
+ box-shadow:
307
+ var(--sc-shadow-1),
308
+ inset 0 0 0 1px color-mix(in srgb, var(--sc-line, #e9e9eb) 70%, transparent);
301
309
  }
302
310
 
303
311
  .sc-disc {
304
312
  flex: none;
305
313
  display: grid;
306
314
  place-items: center;
307
- width: 26px;
308
- height: 26px;
315
+
316
+ width: calc(36px * var(--sc-scale, 1));
317
+ height: calc(36px * var(--sc-scale, 1));
309
318
  padding: 0;
310
319
  border: 0;
311
320
  border-radius: 50%;
@@ -326,8 +335,8 @@ a.sc-btn {
326
335
  }
327
336
 
328
337
  .sc-dglyph {
329
- width: 13px;
330
- height: 13px;
338
+ width: calc(13px * var(--sc-scale, 1));
339
+ height: calc(13px * var(--sc-scale, 1));
331
340
  }
332
341
 
333
342
  @keyframes sc-spin {
@@ -343,9 +352,10 @@ a.sc-btn {
343
352
  .sc-mrow {
344
353
  display: flex;
345
354
  align-items: center;
346
- gap: 10px;
347
- min-height: 52px;
348
- padding: 4px 12px 4px 0;
355
+ gap: calc(14px * var(--sc-scale, 1));
356
+ min-height: calc(52px * var(--sc-scale, 1));
357
+ padding: calc(7px * var(--sc-scale, 1)) calc(16px * var(--sc-scale, 1))
358
+ calc(7px * var(--sc-scale, 1)) calc(4px * var(--sc-scale, 1));
349
359
  }
350
360
 
351
361
  .sc-mtile {
@@ -353,27 +363,29 @@ a.sc-btn {
353
363
  flex: none;
354
364
  display: grid;
355
365
  place-items: center;
356
- width: 38px;
357
- height: 38px;
358
- border-radius: 12px;
359
- background: var(--sc-tray-sunk, #f6f6f7);
360
- box-shadow: inset 0 0 0 1px var(--sc-line, #e9e9eb);
361
- color: var(--sc-text, #1a1a1c);
366
+ width: calc(36px * var(--sc-scale, 1));
367
+ height: calc(36px * var(--sc-scale, 1));
368
+
369
+ border-radius: calc(9px * var(--sc-scale, 1));
370
+
371
+ background: var(--sc-tray-sunk, #efefed);
372
+ color: var(--sc-text, #1b1b1a);
362
373
  }
363
374
 
364
375
  .sc-mglyph {
365
- width: 24px;
366
- height: 18px;
376
+ width: calc(24px * var(--sc-scale, 1));
377
+ height: calc(19px * var(--sc-scale, 1));
367
378
  }
368
379
 
369
380
  .sc-mbadge {
370
381
  position: absolute;
371
- right: 0;
372
- bottom: 0;
373
- width: 10px;
374
- height: 10px;
382
+ left: auto;
383
+ bottom: calc(-3px * var(--sc-scale, 1));
384
+ right: calc(-3px * var(--sc-scale, 1));
385
+ width: calc(14px * var(--sc-scale, 1));
386
+ height: calc(14px * var(--sc-scale, 1));
375
387
  border-radius: 50%;
376
- transform: translate(30%, 30%);
388
+ transform: none;
377
389
  box-shadow: 0 0 0 2.5px var(--sc-tray-card, #ffffff);
378
390
  }
379
391
 
@@ -389,43 +401,60 @@ a.sc-btn {
389
401
  background: var(--sc-line-2, #dcdce0);
390
402
  }
391
403
 
404
+ .sc-mbadge-away {
405
+ background: var(--sc-warn-dot, #d9a21b);
406
+ }
407
+
392
408
  .sc-mid {
393
409
  display: flex;
394
410
  flex: 1;
395
411
  min-width: 0;
396
412
  flex-direction: column;
397
- gap: 1px;
413
+ gap: 2px;
398
414
  }
399
415
 
400
416
  .sc-mname {
401
417
  overflow: hidden;
402
418
  text-overflow: ellipsis;
403
419
  white-space: nowrap;
404
- font-size: var(--sc-fs-small);
405
- font-weight: 550;
420
+ font-size: calc(var(--sc-font-size, 15px) * 1.0667);
421
+ font-weight: 600;
406
422
  }
407
423
 
408
424
  .sc-mmeta {
409
425
  display: flex;
410
- flex-wrap: wrap;
411
- align-items: center;
412
- gap: 1px 6px;
413
- font-size: var(--sc-fs-label);
426
+ align-items: baseline;
427
+ gap: calc(10px * var(--sc-scale, 1));
428
+ font-size: calc(var(--sc-font-size, 15px) * 0.9333);
414
429
  line-height: 1.35;
415
430
  color: var(--sc-muted, #6b6b73);
416
431
  }
417
432
 
433
+ .sc-mmeta-is {
434
+ min-width: 0;
435
+ overflow: hidden;
436
+ text-overflow: ellipsis;
437
+ white-space: nowrap;
438
+ }
439
+
440
+ .sc-mmeta-now {
441
+ flex: none;
442
+ margin-left: auto;
443
+ color: var(--sc-text-2, #3f3f46);
444
+ font-variant-numeric: tabular-nums;
445
+ }
446
+
418
447
  .sc-mmeta-sep {
419
- padding-right: 6px;
448
+ padding: 0 calc(6px * var(--sc-scale, 1));
420
449
  color: var(--sc-line-2, #dcdce0);
421
450
  }
422
451
 
423
452
  .sc-mrow-btn {
424
- width: calc(100% + 4px);
425
- margin-left: -4px;
426
- padding-left: 4px;
453
+ width: calc(100% + calc(4px * var(--sc-scale, 1)));
454
+ margin-left: calc(-4px * var(--sc-scale, 1));
455
+ padding-left: calc(4px * var(--sc-scale, 1));
427
456
  border: 0;
428
- border-radius: 10px;
457
+ border-radius: calc(10px * var(--sc-scale, 1));
429
458
  background: transparent;
430
459
  color: inherit;
431
460
  font: inherit;
@@ -444,8 +473,8 @@ a.sc-btn {
444
473
 
445
474
  .sc-chev {
446
475
  flex: none;
447
- width: 14px;
448
- height: 14px;
476
+ width: calc(14px * var(--sc-scale, 1));
477
+ height: calc(14px * var(--sc-scale, 1));
449
478
  color: var(--sc-muted, #6b6b73);
450
479
  transition: transform 120ms ease;
451
480
  }
@@ -454,66 +483,408 @@ a.sc-btn {
454
483
  transform: rotate(90deg);
455
484
  }
456
485
 
486
+ .sc-group-card:has(> .sc-rrow) {
487
+ padding: 0 calc(16px * var(--sc-scale, 1));
488
+ }
457
489
  .sc-rrow {
458
490
  display: flex;
459
- align-items: flex-start;
460
- gap: 10px;
461
- padding: 6px 12px 6px 0;
491
+ align-items: center;
492
+ gap: calc(14px * var(--sc-scale, 1));
493
+ padding: calc(14px * var(--sc-scale, 1)) 0;
462
494
  }
463
-
464
- .sc-rrow .sc-runtime-tile {
465
- margin-top: 1px;
495
+ .sc-rrow + .sc-rrow {
496
+ box-shadow: inset 0 1px 0 var(--sc-line, #e9e9e7);
466
497
  }
467
-
468
- .sc-rtop {
469
- display: flex;
470
- align-items: baseline;
471
- gap: 8px;
498
+ .sc-rdot {
499
+ flex: none;
500
+ width: calc(10px * var(--sc-scale, 1));
501
+ height: calc(10px * var(--sc-scale, 1));
502
+ border-radius: 50%;
503
+ background: var(--sc-line-2, #dcdce0);
472
504
  }
473
-
474
- .sc-rtop .sc-averdict {
475
- font-variant-numeric: tabular-nums;
505
+ .sc-rdot-live {
506
+ background: var(--sc-ok, #1e8e5a);
507
+ }
508
+ @media (prefers-reduced-motion: no-preference) {
509
+ .sc-rdot-live {
510
+ animation: sc-breathe 1.6s ease-in-out infinite;
511
+ }
512
+ }
513
+ @keyframes sc-breathe {
514
+ 0%,
515
+ 100% {
516
+ opacity: 1;
517
+ }
518
+ 50% {
519
+ opacity: 0.35;
520
+ }
521
+ }
522
+ .sc-rtitle {
523
+ overflow: hidden;
524
+ text-overflow: ellipsis;
525
+ white-space: nowrap;
526
+ font-size: calc(var(--sc-font-size, 15px) * 1);
527
+ font-weight: 500;
476
528
  }
477
529
 
478
530
  .sc-rstop {
479
- align-self: center;
480
- width: 24px;
481
- height: 24px;
531
+ flex: none;
532
+ display: grid;
533
+ place-items: center;
534
+ width: calc(44px * var(--sc-scale, 1));
535
+ height: calc(44px * var(--sc-scale, 1));
536
+ margin: calc(-8px * var(--sc-scale, 1)) calc(-10px * var(--sc-scale, 1))
537
+ calc(-8px * var(--sc-scale, 1)) 0;
538
+ padding: 0;
539
+ border: 0;
540
+ border-radius: 50%;
541
+ background: transparent;
542
+ color: var(--sc-muted, #6b6b69);
543
+ cursor: pointer;
482
544
  }
483
545
 
546
+ .sc-rstop-ring {
547
+ display: grid;
548
+ place-items: center;
549
+ width: calc(28px * var(--sc-scale, 1));
550
+ height: calc(28px * var(--sc-scale, 1));
551
+ border-radius: 50%;
552
+ box-shadow: inset 0 0 0 1px var(--sc-line, #e9e9e7);
553
+ transition:
554
+ background-color 120ms ease,
555
+ box-shadow 120ms ease,
556
+ color 120ms ease;
557
+ }
558
+ .sc-rstop:hover:not(:disabled) {
559
+ color: var(--sc-text, #1b1b1a);
560
+ }
561
+ .sc-rstop:hover:not(:disabled) .sc-rstop-ring {
562
+ background: var(--sc-tray-sunk, #efefed);
563
+ box-shadow: inset 0 0 0 1px transparent;
564
+ }
565
+ .sc-rstop .sc-dglyph {
566
+ width: calc(10px * var(--sc-scale, 1));
567
+ height: calc(10px * var(--sc-scale, 1));
568
+ }
569
+ .sc-rstop:disabled {
570
+ cursor: default;
571
+ opacity: 0.5;
572
+ }
484
573
  .sc-rstep {
485
574
  display: -webkit-box;
486
575
  overflow: hidden;
487
576
  -webkit-box-orient: vertical;
488
577
  -webkit-line-clamp: 2;
489
- font-size: var(--sc-fs-label);
578
+ line-clamp: 2;
579
+ font-size: max(12px, calc(var(--sc-font-size, 15px) * 0.8667));
490
580
  line-height: 1.4;
581
+ color: var(--sc-muted, #6b6b69);
582
+ font-variant-numeric: tabular-nums;
583
+ }
584
+
585
+ .sc-blank {
586
+ display: flex;
587
+ flex-direction: column;
588
+ align-items: center;
589
+ gap: calc(12px * var(--sc-scale, 1));
590
+ padding: calc(24px * var(--sc-scale, 1)) calc(24px * var(--sc-scale, 1))
591
+ calc(26px * var(--sc-scale, 1));
592
+ text-align: center;
593
+ }
594
+ .sc-blank-mark {
595
+ display: grid;
596
+ place-items: center;
597
+ width: calc(36px * var(--sc-scale, 1));
598
+ height: calc(36px * var(--sc-scale, 1));
599
+ border-radius: 50%;
600
+ background: var(--sc-tray-sunk, #efefed);
601
+ color: var(--sc-faint, #8c8c89);
602
+ }
603
+ .sc-blank-glyph {
604
+ width: calc(20px * var(--sc-scale, 1));
605
+ height: calc(20px * var(--sc-scale, 1));
606
+ }
607
+ .sc-blank-say {
608
+ display: flex;
609
+ flex-direction: column;
610
+ gap: calc(4px * var(--sc-scale, 1));
611
+ }
612
+ .sc-blank-title {
613
+ font-size: calc(var(--sc-font-size, 15px) * 1.0667);
614
+ font-weight: 600;
615
+ }
616
+ .sc-blank-body {
617
+ font-size: calc(var(--sc-font-size, 15px) * 0.9333);
618
+ line-height: calc(20px * var(--sc-scale, 1));
619
+ color: var(--sc-muted, #6b6b69);
620
+ }
621
+
622
+ .sc-blank-act {
623
+ display: inline-flex;
624
+ align-items: center;
625
+ gap: calc(7px * var(--sc-scale, 1));
626
+ height: calc(36px * var(--sc-scale, 1));
627
+ padding: 0 calc(14px * var(--sc-scale, 1));
628
+ border: 1px solid var(--sc-line, #e6e6e3);
629
+ border-radius: calc(11px * var(--sc-scale, 1));
630
+ color: var(--sc-text, #1b1b1a);
631
+ font-size: calc(var(--sc-font-size, 15px) * 0.9333);
632
+ font-weight: 600;
633
+ text-decoration: none;
634
+ transition: background 120ms ease;
635
+ }
636
+ .sc-blank-act:hover {
637
+ background: var(--sc-tray-sunk, #efefed);
638
+ }
639
+
640
+ .sc-alarm {
641
+ display: flex;
642
+ align-items: flex-start;
643
+ gap: calc(14px * var(--sc-scale, 1));
644
+ margin: calc(-7px * var(--sc-scale, 1)) -0 calc(-7px * var(--sc-scale, 1))
645
+ calc(-12px * var(--sc-scale, 1));
646
+ padding: calc(16px * var(--sc-scale, 1));
647
+ border-radius: calc(12px * var(--sc-scale, 1));
648
+ background: color-mix(in srgb, var(--sc-danger, #c2452d) 9%, var(--sc-tray-card, #ffffff));
649
+ }
650
+
651
+ .sc-alarm-mark {
652
+ flex: none;
653
+ display: grid;
654
+ place-items: center;
655
+ width: calc(30px * var(--sc-scale, 1));
656
+ margin-top: 1px;
657
+ color: var(--sc-danger, #c2452d);
658
+ }
659
+ .sc-alarm-mark .sc-hglyph {
660
+ width: calc(22px * var(--sc-scale, 1));
661
+ height: calc(22px * var(--sc-scale, 1));
662
+ }
663
+
664
+ .sc-alarm-warn {
665
+ background: color-mix(in srgb, var(--sc-warn, #b06f14) 10%, var(--sc-tray-card, #ffffff));
666
+ }
667
+ .sc-alarm-warn .sc-alarm-mark {
668
+ color: var(--sc-warn, #b06f14);
669
+ }
670
+ .sc-alarm + .sc-alarm {
671
+ margin-top: calc(8px * var(--sc-scale, 1));
672
+ }
673
+ .sc-alarm-say {
674
+ display: flex;
675
+ flex-direction: column;
676
+ gap: calc(4px * var(--sc-scale, 1));
677
+ min-width: 0;
678
+ }
679
+ .sc-alarm-title {
680
+ font-size: calc(var(--sc-font-size, 15px) * 1.0667);
681
+ font-weight: 600;
682
+ }
683
+ .sc-alarm-body {
684
+ font-size: calc(var(--sc-font-size, 15px) * 0.9333);
685
+ line-height: calc(20px * var(--sc-scale, 1));
686
+ color: var(--sc-text-2, #5a4a46);
687
+ }
688
+
689
+ .sc-away {
690
+ display: flex;
691
+ align-items: center;
692
+ gap: calc(12px * var(--sc-scale, 1));
693
+ padding: calc(6px * var(--sc-scale, 1)) calc(12px * var(--sc-scale, 1))
694
+ calc(6px * var(--sc-scale, 1)) 0;
695
+ }
696
+ .sc-away-mark {
697
+ flex: none;
698
+ display: grid;
699
+ place-items: center;
700
+ width: calc(36px * var(--sc-scale, 1));
701
+ height: calc(36px * var(--sc-scale, 1));
702
+ border-radius: calc(9px * var(--sc-scale, 1));
703
+ background: var(--sc-tray-sunk, #efefed);
704
+ color: var(--sc-text, #1b1b1a);
705
+ }
706
+ .sc-away-mark .bx {
707
+ width: calc(26px * var(--sc-scale, 1));
708
+ height: calc(26px * var(--sc-scale, 1));
709
+ --bx-w: 24;
710
+ }
711
+ .sc-away-say {
712
+ flex: 1;
713
+ display: flex;
714
+ flex-direction: column;
715
+ gap: 2px;
716
+ min-width: 0;
717
+ }
718
+ .sc-away-title {
719
+ font-size: calc(var(--sc-font-size, 15px) * 1);
720
+ font-weight: 600;
721
+ }
722
+ .sc-away-body {
723
+ font-size: calc(var(--sc-font-size, 15px) * 0.8667);
724
+ line-height: 1.35;
725
+ color: var(--sc-muted, #6b6b73);
726
+ }
727
+ .sc-away-go {
728
+ flex: none;
729
+ height: calc(32px * var(--sc-scale, 1));
730
+ padding: 0 calc(14px * var(--sc-scale, 1));
731
+ border: 0;
732
+ border-radius: 999px;
733
+ background: var(--sc-accent, #1b1b1a);
734
+ color: var(--sc-accent-fg, #ffffff);
735
+ font: inherit;
736
+ font-size: calc(var(--sc-font-size, 15px) * 0.9333);
737
+ font-weight: 600;
738
+ cursor: pointer;
739
+ transition: opacity 120ms ease;
740
+ }
741
+ .sc-away-go:hover:not(:disabled) {
742
+ opacity: 0.88;
743
+ }
744
+ .sc-away-go:disabled {
745
+ opacity: 0.5;
746
+ cursor: default;
747
+ }
748
+
749
+ .sc-cap-link {
750
+ flex: none;
751
+ margin: calc(-8px * var(--sc-scale, 1)) calc(-4px * var(--sc-scale, 1))
752
+ calc(-8px * var(--sc-scale, 1)) 0;
753
+ padding: calc(8px * var(--sc-scale, 1)) calc(4px * var(--sc-scale, 1));
754
+ border: 0;
755
+ background: transparent;
756
+ font: inherit;
757
+ font-size: max(12px, calc(var(--sc-font-size, 15px) * 0.8667));
758
+ color: var(--sc-text-2, #3f3f46);
759
+ text-decoration: underline;
760
+ text-underline-offset: 2px;
761
+ cursor: pointer;
762
+ }
763
+ .sc-cap-link:hover {
764
+ color: var(--sc-text, #1b1b1a);
765
+ }
766
+
767
+ .sc-acts {
768
+ display: flex;
769
+ flex-direction: column;
770
+ gap: calc(4px * var(--sc-scale, 1));
771
+ }
772
+ .sc-act-go {
773
+ display: flex;
774
+ align-items: center;
775
+ justify-content: center;
776
+ gap: calc(9px * var(--sc-scale, 1));
777
+ height: calc(48px * var(--sc-scale, 1));
778
+ border: 0;
779
+ border-radius: calc(10px * var(--sc-scale, 1));
780
+ background: var(--sc-accent, #1b1b1a);
781
+ color: var(--sc-accent-fg, #ffffff);
782
+ font: inherit;
783
+ font-size: calc(var(--sc-font-size, 15px) * 1);
784
+ font-weight: 600;
785
+ cursor: pointer;
786
+ transition: opacity 120ms ease;
787
+ }
788
+ .sc-act-go:hover:not(:disabled) {
789
+ opacity: 0.88;
790
+ }
791
+
792
+ .sc-acts-row {
793
+ display: flex;
794
+ align-items: center;
795
+ justify-content: space-between;
796
+ }
797
+ .sc-act-small {
798
+ display: inline-flex;
799
+ align-items: center;
800
+ gap: calc(7px * var(--sc-scale, 1));
801
+ height: calc(36px * var(--sc-scale, 1));
802
+ padding: 0 calc(12px * var(--sc-scale, 1)) 0 calc(15px * var(--sc-scale, 1));
803
+ border: 0;
804
+ border-radius: 999px;
805
+ background: var(--sc-tray-card, #ffffff);
806
+ box-shadow:
807
+ var(--sc-shadow-1),
808
+ inset 0 0 0 1px color-mix(in srgb, var(--sc-line, #e9e9eb) 70%, transparent);
809
+ color: var(--sc-text, #1a1a1c);
810
+ font: inherit;
811
+ font-size: calc(var(--sc-font-size, 15px) * 0.9333);
812
+ font-weight: 550;
813
+ letter-spacing: -0.005em;
814
+ cursor: pointer;
815
+ transition:
816
+ box-shadow 140ms ease,
817
+ transform 140ms ease;
818
+ }
819
+ .sc-act-small .sc-dglyph {
820
+ width: calc(12px * var(--sc-scale, 1));
821
+ height: calc(12px * var(--sc-scale, 1));
491
822
  color: var(--sc-muted, #6b6b73);
823
+ transition:
824
+ color 140ms ease,
825
+ transform 140ms ease;
826
+ }
827
+ .sc-act-small:hover:not(:disabled) {
828
+ box-shadow:
829
+ var(--sc-shadow-1),
830
+ inset 0 0 0 1px var(--sc-line, #e9e9eb);
831
+ }
832
+ .sc-act-small:hover:not(:disabled) .sc-dglyph {
833
+ color: var(--sc-text, #1a1a1c);
834
+ transform: translate(1px, -1px);
835
+ }
836
+ .sc-act-small:active:not(:disabled) {
837
+ transform: scale(0.98);
838
+ }
839
+ @media (prefers-reduced-motion: reduce) {
840
+ .sc-act-small,
841
+ .sc-act-small .sc-dglyph {
842
+ transition: none;
843
+ }
844
+ .sc-act-small:active:not(:disabled),
845
+ .sc-act-small:hover:not(:disabled) .sc-dglyph {
846
+ transform: none;
847
+ }
848
+ }
849
+ .sc-act-go:disabled,
850
+ .sc-act-go[data-spin],
851
+ .sc-act-glyph {
852
+ flex: none;
853
+ width: calc(15px * var(--sc-scale, 1));
854
+ height: calc(15px * var(--sc-scale, 1));
855
+ }
856
+
857
+ .sc-act-miss {
858
+ margin: calc(4px * var(--sc-scale, 1)) 2px 0;
859
+ font-size: max(12px, calc(var(--sc-font-size, 15px) * 0.8667));
860
+ line-height: 1.5;
861
+ color: var(--sc-muted, #6b6b69);
862
+ text-align: center;
492
863
  }
493
864
 
494
865
  .sc-arow {
495
866
  display: flex;
496
867
  align-items: center;
497
- gap: 10px;
498
- min-height: 30px;
499
- padding-right: 12px;
868
+ gap: calc(10px * var(--sc-scale, 1));
869
+ min-height: calc(30px * var(--sc-scale, 1));
870
+ padding-right: calc(12px * var(--sc-scale, 1));
500
871
  }
501
872
 
502
873
  .sc-runtime-tile {
503
874
  flex: none;
504
875
  display: grid;
505
876
  place-items: center;
506
- width: 22px;
507
- height: 22px;
508
- border-radius: var(--sc-r-sm, 6px);
877
+ width: calc(30px * var(--sc-scale, 1));
878
+ height: calc(30px * var(--sc-scale, 1));
879
+ border-radius: var(--sc-r-sm, calc(6px * var(--sc-scale, 1)));
509
880
  border: 1px solid var(--sc-line, #e9e9eb);
510
881
  background: var(--sc-tray-sunk, #f6f6f7);
511
882
  }
512
883
 
513
884
  .sc-runtime-logo {
514
- width: 15px;
515
- height: 15px;
516
- border-radius: 3px;
885
+ width: calc(15px * var(--sc-scale, 1));
886
+ height: calc(15px * var(--sc-scale, 1));
887
+ border-radius: calc(3px * var(--sc-scale, 1));
517
888
  object-fit: contain;
518
889
  }
519
890
 
@@ -524,17 +895,9 @@ a.sc-btn {
524
895
  color: var(--sc-muted, #6b6b73);
525
896
  }
526
897
 
527
- .sc-runs-logo {
528
- flex: none;
529
- width: 14px;
530
- height: 14px;
531
- border-radius: 3px;
532
- object-fit: contain;
533
- }
534
-
535
898
  .sc-runtime-mark {
536
- width: 13px;
537
- height: 13px;
899
+ width: calc(13px * var(--sc-scale, 1));
900
+ height: calc(13px * var(--sc-scale, 1));
538
901
  color: var(--sc-text-2, #3f3f46);
539
902
  }
540
903
 
@@ -547,10 +910,6 @@ a.sc-btn {
547
910
  font-size: var(--sc-fs-small);
548
911
  }
549
912
 
550
- .sc-aname-absent {
551
- color: var(--sc-muted, #6b6b73);
552
- }
553
-
554
913
  .sc-aversion {
555
914
  color: var(--sc-muted, #6b6b73);
556
915
  }
@@ -564,46 +923,34 @@ a.sc-btn {
564
923
  color: var(--sc-muted, #6b6b73);
565
924
  }
566
925
 
567
- .sc-sglyph {
568
- flex: none;
569
- width: 11px;
570
- height: 11px;
571
- color: var(--sc-ok, #22a06b);
572
- }
573
-
574
- .sc-aserving {
575
- margin-left: 5px;
576
- font-variant-numeric: tabular-nums;
577
- }
578
-
579
926
  .sc-orow {
580
927
  display: flex;
581
928
  align-items: center;
582
- gap: 10px;
583
- min-height: 34px;
584
- padding-right: 12px;
929
+ gap: calc(18px * var(--sc-scale, 1));
930
+ min-height: calc(34px * var(--sc-scale, 1));
931
+ padding-right: calc(12px * var(--sc-scale, 1));
585
932
  }
586
933
 
587
934
  .sc-otile {
588
935
  flex: none;
589
936
  display: grid;
590
937
  place-items: center;
591
- width: 22px;
592
- height: 22px;
593
- border-radius: var(--sc-r-sm, 6px);
938
+ width: calc(22px * var(--sc-scale, 1));
939
+ height: calc(22px * var(--sc-scale, 1));
940
+ border-radius: var(--sc-r-sm, calc(6px * var(--sc-scale, 1)));
594
941
  background: var(--sc-tray-sunk, #f6f6f7);
595
942
  color: var(--sc-muted, #6b6b73);
596
943
  }
597
944
 
598
945
  .sc-otile .sc-mglyph {
599
- width: 15px;
600
- height: 11px;
946
+ width: calc(15px * var(--sc-scale, 1));
947
+ height: calc(11px * var(--sc-scale, 1));
601
948
  }
602
949
 
603
950
  .sc-oglyph,
604
951
  .sc-omark {
605
- width: 13px;
606
- height: 13px;
952
+ width: calc(13px * var(--sc-scale, 1));
953
+ height: calc(13px * var(--sc-scale, 1));
607
954
  }
608
955
 
609
956
  .sc-oname {
@@ -625,13 +972,13 @@ a.sc-btn {
625
972
  .sc-pair {
626
973
  display: flex;
627
974
  align-items: center;
628
- gap: 10px;
629
- width: calc(100% + 4px);
630
- min-height: 34px;
631
- margin-left: -4px;
632
- padding: 0 12px 0 4px;
975
+ gap: calc(18px * var(--sc-scale, 1));
976
+ width: calc(100% + calc(4px * var(--sc-scale, 1)));
977
+ min-height: calc(34px * var(--sc-scale, 1));
978
+ margin-left: calc(-4px * var(--sc-scale, 1));
979
+ padding: 0 calc(12px * var(--sc-scale, 1)) 0 calc(4px * var(--sc-scale, 1));
633
980
  border: 0;
634
- border-radius: 8px;
981
+ border-radius: calc(8px * var(--sc-scale, 1));
635
982
  background: transparent;
636
983
  font: inherit;
637
984
  font-size: var(--sc-fs-small);
@@ -645,7 +992,8 @@ a.sc-btn {
645
992
  }
646
993
 
647
994
  .sc-open-app {
648
- color: inherit;
995
+
996
+ color: var(--sc-muted, #6b6b73);
649
997
  text-decoration: none;
650
998
  }
651
999
 
@@ -655,105 +1003,78 @@ a.sc-btn {
655
1003
 
656
1004
  .sc-row-note {
657
1005
  margin: 0;
658
- padding: 2px 12px 4px 0;
1006
+ padding: 2px calc(12px * var(--sc-scale, 1)) calc(4px * var(--sc-scale, 1)) 0;
659
1007
  font-size: var(--sc-fs-label);
660
1008
  line-height: 1.45;
661
1009
  color: var(--sc-muted, #6b6b73);
662
1010
  }
663
1011
 
664
- .sc-runs-to {
665
- display: inline-flex;
666
- flex: none;
1012
+ .sc-nilrow {
1013
+ display: flex;
667
1014
  align-items: center;
668
- gap: 2px;
669
- min-width: 0;
670
- max-width: 62%;
671
- font-size: var(--sc-fs-label);
672
- color: var(--sc-muted, #6b6b73);
673
- }
674
-
675
- .sc-runs-cap {
676
- flex: none;
677
- white-space: nowrap;
1015
+ gap: calc(10px * var(--sc-scale, 1));
1016
+ margin: 0;
1017
+ padding: calc(9px * var(--sc-scale, 1)) 0;
1018
+ font-size: calc(var(--sc-font-size, 15px) * 0.9333);
1019
+ color: var(--sc-muted, #6b6b69);
678
1020
  }
679
1021
 
680
- .sc-runs-fixed,
681
- .sc-runs-btn {
682
- display: inline-flex;
683
- align-items: center;
684
- gap: 5px;
685
- min-width: 0;
686
- height: 24px;
687
- padding: 0 6px;
688
- font-size: var(--sc-fs-label);
689
- font-weight: 500;
690
- color: var(--sc-text-2, #3f3f46);
1022
+ .sc-group-card:has(> .sc-nilrow) {
1023
+ padding: calc(7px * var(--sc-scale, 1)) calc(16px * var(--sc-scale, 1));
691
1024
  }
692
-
693
- .sc-runs-btn {
694
- padding-right: 4px;
695
- border: 0;
696
- border-radius: var(--sc-r-pill, 999px);
697
- background: transparent;
698
- font-family: inherit;
699
- cursor: pointer;
700
- transition:
701
- background-color 120ms ease,
702
- color 120ms ease;
1025
+ .sc-nilrow-mark {
1026
+ display: grid;
1027
+ place-items: center;
1028
+ flex: none;
1029
+ width: calc(28px * var(--sc-scale, 1));
1030
+ height: calc(28px * var(--sc-scale, 1));
1031
+ border-radius: 50%;
1032
+ background: var(--sc-tray-sunk, #efefed);
1033
+ color: var(--sc-faint, #8c8c89);
703
1034
  }
704
-
705
- .sc-runs-btn:hover:not(:disabled),
706
- .sc-runs-btn[aria-expanded="true"] {
707
- background: var(--sc-tray-card, #ffffff);
708
- color: var(--sc-text, #1a1a1c);
1035
+ .sc-nilrow-mark .sc-blank-glyph {
1036
+ width: calc(15px * var(--sc-scale, 1));
1037
+ height: calc(15px * var(--sc-scale, 1));
709
1038
  }
710
1039
 
711
- .sc-runs-btn:disabled {
712
- opacity: 0.5;
713
- cursor: default;
714
- }
715
-
716
- .sc-runs-glyph {
717
- flex: none;
718
- width: 12px;
719
- height: 12px;
1040
+ .sc-heads {
1041
+ display: flex;
1042
+ align-items: flex-start;
1043
+ gap: calc(8px * var(--sc-scale, 1));
1044
+ margin: 2px calc(12px * var(--sc-scale, 1)) calc(3px * var(--sc-scale, 1)) 0;
1045
+ padding: calc(8px * var(--sc-scale, 1)) calc(10px * var(--sc-scale, 1));
1046
+ border-radius: var(--sc-r, calc(10px * var(--sc-scale, 1)));
1047
+ background: color-mix(in srgb, var(--sc-warn, #b06f14) 9%, var(--sc-tray-card, #ffffff));
720
1048
  }
721
-
722
- .sc-runs-mark {
723
- display: inline-grid;
1049
+ .sc-heads-mark {
724
1050
  flex: none;
1051
+ display: grid;
725
1052
  place-items: center;
726
- width: 14px;
727
- height: 14px;
1053
+
1054
+ margin-top: 1px;
1055
+ color: var(--sc-warn, #b06f14);
728
1056
  }
729
-
730
- .sc-runs-mark > * {
731
- max-width: 14px;
732
- max-height: 14px;
1057
+ .sc-hglyph {
1058
+ width: calc(13px * var(--sc-scale, 1));
1059
+ height: calc(13px * var(--sc-scale, 1));
733
1060
  }
734
-
735
- .sc-runs-label {
736
- min-width: 0;
737
- overflow: hidden;
738
- text-overflow: ellipsis;
739
- white-space: nowrap;
740
- }
741
-
742
- .sc-runs-btn .sc-chev {
743
- width: 11px;
744
- height: 11px;
745
- color: var(--sc-faint, #a1a1aa);
1061
+ .sc-heads-say {
1062
+ margin: 0;
1063
+ font-size: var(--sc-fs-label);
1064
+ line-height: 1.45;
1065
+ color: var(--sc-text-2, #3f3f46);
746
1066
  }
747
1067
 
748
1068
  .sc-menu {
749
1069
  position: fixed;
750
1070
  inset: auto;
751
1071
  z-index: 2147483647;
752
- width: 248px;
1072
+
1073
+ width: calc(320px * var(--sc-scale, 1));
753
1074
  margin: 0;
754
- padding: 4px;
1075
+ padding: calc(4px * var(--sc-scale, 1));
755
1076
  border: 1px solid var(--sc-line, #e9e9eb);
756
- border-radius: 12px;
1077
+ border-radius: calc(10px * var(--sc-scale, 1));
757
1078
  background: var(--sc-tray-card, #ffffff);
758
1079
  box-shadow:
759
1080
  0 10px 30px rgba(0, 0, 0, 0.12),
@@ -768,15 +1089,16 @@ a.sc-btn {
768
1089
  .sc-menu-item {
769
1090
  display: flex;
770
1091
  align-items: center;
771
- gap: 10px;
1092
+ gap: calc(14px * var(--sc-scale, 1));
772
1093
  width: 100%;
773
- min-height: 34px;
774
- padding: 5px 8px;
1094
+
1095
+ min-height: calc(44px * var(--sc-scale, 1));
1096
+ padding: calc(7px * var(--sc-scale, 1)) calc(12px * var(--sc-scale, 1));
775
1097
  border: 0;
776
- border-radius: 8px;
1098
+ border-radius: calc(7px * var(--sc-scale, 1));
777
1099
  background: transparent;
778
1100
  font: inherit;
779
- font-size: var(--sc-fs-small);
1101
+ font-size: calc(var(--sc-font-size, 15px) * 1);
780
1102
  color: inherit;
781
1103
  text-align: left;
782
1104
  cursor: pointer;
@@ -800,29 +1122,54 @@ a.sc-btn {
800
1122
  text-overflow: ellipsis;
801
1123
  white-space: nowrap;
802
1124
  }
803
-
804
- .sc-menu-note {
805
- font-size: var(--sc-fs-label);
806
- line-height: 1.4;
807
- color: var(--sc-muted, #6b6b73);
1125
+
1126
+ .sc-menu-note {
1127
+ font-size: max(12px, calc(var(--sc-font-size, 15px) * 0.9));
1128
+ line-height: 1.4;
1129
+ color: var(--sc-muted, #6b6b69);
1130
+ }
1131
+
1132
+ .sc-row-act {
1133
+ flex: none;
1134
+ padding: calc(6px * var(--sc-scale, 1)) calc(8px * var(--sc-scale, 1));
1135
+ margin-right: calc(-8px * var(--sc-scale, 1));
1136
+ border: 0;
1137
+ border-radius: calc(7px * var(--sc-scale, 1));
1138
+ background: transparent;
1139
+ color: var(--sc-text, #1a1a1c);
1140
+ font: inherit;
1141
+ font-size: calc(var(--sc-font-size, 15px) * 0.9333);
1142
+ font-weight: 600;
1143
+ cursor: pointer;
1144
+ }
1145
+ .sc-row-act:hover {
1146
+ background: var(--sc-tray-sunk, #efefed);
808
1147
  }
809
1148
 
1149
+ .sc-menu-act {
1150
+ flex: none;
1151
+ margin-left: auto;
1152
+ padding-left: calc(10px * var(--sc-scale, 1));
1153
+ font-size: calc(var(--sc-font-size, 15px) * 0.8667);
1154
+ font-weight: 600;
1155
+ color: var(--sc-text, #1a1a1c);
1156
+ }
810
1157
  .sc-menu-check {
811
1158
  flex: none;
812
- width: 15px;
813
- height: 15px;
1159
+ width: calc(15px * var(--sc-scale, 1));
1160
+ height: calc(15px * var(--sc-scale, 1));
814
1161
  color: var(--sc-text-2, #3f3f46);
815
1162
  }
816
1163
 
817
1164
  .sc-menu-sep {
818
1165
  height: 1px;
819
- margin: 4px 6px;
1166
+ margin: calc(4px * var(--sc-scale, 1)) calc(6px * var(--sc-scale, 1));
820
1167
  background: var(--sc-line, #e9e9eb);
821
1168
  }
822
1169
 
823
1170
  .sc-menu-head {
824
- margin: 6px 6px 2px;
825
- padding-top: 7px;
1171
+ margin: calc(6px * var(--sc-scale, 1)) calc(6px * var(--sc-scale, 1)) 2px;
1172
+ padding-top: calc(7px * var(--sc-scale, 1));
826
1173
  border-top: 1px solid var(--sc-line, #e9e9eb);
827
1174
  font-size: var(--sc-fs-label);
828
1175
  font-weight: 500;
@@ -835,6 +1182,11 @@ a.sc-btn {
835
1182
  border-top: 0;
836
1183
  }
837
1184
 
1185
+ .sc-tray-error {
1186
+ margin: 0;
1187
+ padding: 0 calc(12px * var(--sc-scale, 1)) 2px;
1188
+ }
1189
+
838
1190
  .sc-mp {
839
1191
  display: inline-flex;
840
1192
  align-items: center;
@@ -853,12 +1205,12 @@ a.sc-btn {
853
1205
  .sc-mp-btn {
854
1206
  display: inline-flex;
855
1207
  align-items: center;
856
- gap: 5px;
1208
+ gap: calc(5px * var(--sc-scale, 1));
857
1209
  min-width: 0;
858
- height: 26px;
859
- padding: 0 5px 0 7px;
1210
+ height: calc(26px * var(--sc-scale, 1));
1211
+ padding: 0 calc(5px * var(--sc-scale, 1)) 0 calc(7px * var(--sc-scale, 1));
860
1212
  border: 0;
861
- border-radius: var(--sc-r-pill, 999px);
1213
+ border-radius: var(--sc-r-pill, calc(999px * var(--sc-scale, 1)));
862
1214
  background: transparent;
863
1215
  font: inherit;
864
1216
  font-size: var(--sc-fs-label);
@@ -885,13 +1237,13 @@ a.sc-btn {
885
1237
  display: inline-grid;
886
1238
  flex: none;
887
1239
  place-items: center;
888
- width: 13px;
889
- height: 13px;
1240
+ width: calc(13px * var(--sc-scale, 1));
1241
+ height: calc(13px * var(--sc-scale, 1));
890
1242
  }
891
1243
 
892
1244
  .sc-mp-glyph {
893
- max-width: 13px;
894
- max-height: 13px;
1245
+ max-width: calc(13px * var(--sc-scale, 1));
1246
+ max-height: calc(13px * var(--sc-scale, 1));
895
1247
  }
896
1248
 
897
1249
  .sc-mp-label {
@@ -902,37 +1254,171 @@ a.sc-btn {
902
1254
  }
903
1255
 
904
1256
  .sc-mp-btn .sc-chev {
905
- width: 11px;
906
- height: 11px;
1257
+ width: calc(11px * var(--sc-scale, 1));
1258
+ height: calc(11px * var(--sc-scale, 1));
907
1259
  color: var(--sc-faint, #a1a1aa);
908
1260
  }
909
1261
 
910
- .sc-row-act {
911
- flex: none;
912
- padding: 3px 9px;
913
- border: 1px solid transparent;
914
- border-radius: var(--sc-r-pill, 999px);
915
- background: var(--sc-tray-sunk, #f6f6f7);
1262
+ .sc-atile .sc-runtime-logo {
1263
+ width: calc(25px * var(--sc-scale, 1));
1264
+ height: calc(25px * var(--sc-scale, 1));
1265
+ border-radius: calc(7px * var(--sc-scale, 1));
1266
+ }
1267
+ .sc-atile .sc-runtime-mark {
1268
+ width: calc(22px * var(--sc-scale, 1));
1269
+ height: calc(22px * var(--sc-scale, 1));
1270
+ }
1271
+ .sc-atile .sc-runtime-letter {
1272
+ font-size: calc(var(--sc-font-size, 15px) * 1);
1273
+ }
1274
+
1275
+ .sc-group-card:has(> .sc-runs-agent) {
1276
+ padding: 0 calc(16px * var(--sc-scale, 1));
1277
+ }
1278
+ .sc-runs-agent {
1279
+ display: flex;
1280
+ align-items: center;
1281
+ gap: calc(14px * var(--sc-scale, 1));
1282
+ width: 100%;
1283
+ min-width: 0;
1284
+ margin: 0;
1285
+ padding: calc(14px * var(--sc-scale, 1)) 0;
1286
+ border: 0;
1287
+ background: transparent;
916
1288
  font: inherit;
917
- font-size: var(--sc-fs-label);
918
- font-weight: 500;
919
- color: var(--sc-text-2, #3f3f46);
1289
+ color: inherit;
1290
+ text-align: left;
920
1291
  cursor: pointer;
1292
+ }
1293
+
1294
+ .sc-runs-dim {
1295
+ opacity: 0.55;
1296
+ }
1297
+ .sc-runs-agent:disabled,
1298
+ .sc-runs-fixed {
1299
+ cursor: default;
1300
+ }
1301
+ .sc-runs-agent:focus-visible {
1302
+ outline: 2px solid var(--sc-accent, #18181b);
1303
+ outline-offset: -2px;
1304
+ border-radius: var(--sc-r-sm, calc(6px * var(--sc-scale, 1)));
1305
+ }
1306
+
1307
+ .sc-runs-tile {
1308
+ flex: none;
1309
+ display: grid;
1310
+ place-items: center;
1311
+ width: calc(36px * var(--sc-scale, 1));
1312
+ height: calc(36px * var(--sc-scale, 1));
1313
+ border-radius: calc(9px * var(--sc-scale, 1));
1314
+ background: var(--sc-tray-sunk, #efefed);
1315
+ }
1316
+
1317
+ .sc-runs-tile .sc-runtime-logo {
1318
+ width: calc(34px * var(--sc-scale, 1));
1319
+ height: calc(34px * var(--sc-scale, 1));
1320
+ border-radius: calc(7px * var(--sc-scale, 1));
1321
+ }
1322
+ .sc-runs-tile .sc-runtime-mark {
1323
+ width: calc(30px * var(--sc-scale, 1));
1324
+ height: calc(30px * var(--sc-scale, 1));
1325
+ }
1326
+ .sc-runs-tile .sc-runtime-letter {
1327
+ font-size: calc(var(--sc-font-size, 15px) * 1.2667);
1328
+ }
1329
+ .sc-runs-name {
1330
+ flex: 1;
1331
+ min-width: 0;
1332
+ overflow: hidden;
1333
+ text-overflow: ellipsis;
921
1334
  white-space: nowrap;
1335
+ font-size: calc(var(--sc-font-size, 15px) * 1.0667);
1336
+ font-weight: 600;
1337
+ }
1338
+ .sc-runs-agent .sc-chev {
1339
+ flex: none;
1340
+ width: calc(16px * var(--sc-scale, 1));
1341
+ height: calc(16px * var(--sc-scale, 1));
1342
+ color: var(--sc-faint, #a1a1aa);
922
1343
  }
923
1344
 
924
- .sc-row-act:hover:not(:disabled) {
925
- color: var(--sc-text, #1a1a1c);
1345
+ .sc-runs-told {
1346
+ flex: none;
1347
+ font-size: calc(var(--sc-font-size, 15px) * 0.9333);
1348
+ color: var(--sc-muted, #6b6b69);
926
1349
  }
927
1350
 
928
- .sc-row-act:disabled {
929
- opacity: 0.5;
930
- cursor: default;
1351
+ .sc-runs-rule {
1352
+ display: block;
1353
+ height: 1px;
1354
+ background: var(--sc-line, #e9e9e7);
931
1355
  }
932
1356
 
933
- .sc-tray-error {
934
- margin: 0;
935
- padding: 0 12px 2px;
1357
+ .sc-runs-model {
1358
+ display: flex;
1359
+ align-items: center;
1360
+ gap: 0;
1361
+ width: 100%;
1362
+ max-width: none;
1363
+ min-width: 0;
1364
+ }
1365
+ .sc-runs-model .sc-mp-cap,
1366
+ .sc-runs-key {
1367
+ flex: none;
1368
+ width: calc(58px * var(--sc-scale, 1));
1369
+ font-size: calc(var(--sc-font-size, 15px) * 1);
1370
+ color: var(--sc-muted, #6b6b69);
1371
+ }
1372
+ .sc-runs-model .sc-mp-btn {
1373
+ flex: 1;
1374
+ justify-content: flex-start;
1375
+ gap: calc(14px * var(--sc-scale, 1));
1376
+ min-width: 0;
1377
+ height: auto;
1378
+ min-height: calc(44px * var(--sc-scale, 1));
1379
+ padding: 0;
1380
+ border-radius: 0;
1381
+ background: transparent;
1382
+ font-size: calc(var(--sc-font-size, 15px) * 1);
1383
+ font-weight: 400;
1384
+ color: var(--sc-text, #1b1b1a);
1385
+ }
1386
+ .sc-runs-model .sc-mp-btn:hover:not(:disabled),
1387
+ .sc-runs-model .sc-mp-btn[aria-expanded="true"] {
1388
+ background: transparent;
1389
+ color: var(--sc-text, #1b1b1a);
1390
+ }
1391
+ .sc-runs-model .sc-mp-label {
1392
+ flex: 1;
1393
+ min-width: 0;
1394
+ overflow: hidden;
1395
+ text-overflow: ellipsis;
1396
+ white-space: nowrap;
1397
+ text-align: left;
1398
+ }
1399
+ .sc-runs-model .sc-mp-btn .sc-chev {
1400
+ flex: none;
1401
+ width: calc(16px * var(--sc-scale, 1));
1402
+ height: calc(16px * var(--sc-scale, 1));
1403
+ color: var(--sc-faint, #a1a1aa);
1404
+ }
1405
+ .sc-runs-model .sc-mp-btn .sc-chev-open {
1406
+ transform: none;
1407
+ }
1408
+
1409
+ .sc-runs-said {
1410
+ display: flex;
1411
+ align-items: center;
1412
+ gap: 0;
1413
+ min-height: calc(44px * var(--sc-scale, 1));
1414
+ font-size: calc(var(--sc-font-size, 15px) * 1);
1415
+ }
1416
+ .sc-runs-val {
1417
+ flex: 1;
1418
+ min-width: 0;
1419
+ overflow: hidden;
1420
+ text-overflow: ellipsis;
1421
+ white-space: nowrap;
936
1422
  }
937
1423
 
938
1424
  .sc-pop {
@@ -942,8 +1428,9 @@ a.sc-btn {
942
1428
  right: auto;
943
1429
  bottom: auto;
944
1430
  z-index: 2147483000;
945
- width: min(92vw, 320px);
946
- max-width: min(92vw, 320px);
1431
+
1432
+ width: min(92vw, 420px);
1433
+ max-width: min(92vw, 420px);
947
1434
 
948
1435
  max-height: calc(100vh - 24px);
949
1436
  overflow-y: auto;
@@ -959,11 +1446,6 @@ a.sc-btn {
959
1446
  var(--sc-shadow-2);
960
1447
  }
961
1448
 
962
- .sc-pop > .sc-tray {
963
- background: transparent;
964
- border-radius: inherit;
965
- }
966
-
967
1449
  @keyframes sc-pop-in {
968
1450
  from {
969
1451
  opacity: 0;
@@ -1026,6 +1508,8 @@ a.sc-btn {
1026
1508
 
1027
1509
  --sc-ok: #4cb782;
1028
1510
  --sc-warn: #f2994a;
1511
+ --sc-danger: #e4705a;
1512
+ --sc-warn-dot: #e0ad33;
1029
1513
 
1030
1514
  --sc-tray: var(--sc-ground, #0f0f11);
1031
1515
  --sc-tray-card: var(--sc-raised, #1d1d20);
@@ -1051,6 +1535,7 @@ a.sc-btn {
1051
1535
 
1052
1536
  --sc-ok: #4cb782;
1053
1537
  --sc-warn: #f2994a;
1538
+ --sc-danger: #e4705a;
1054
1539
 
1055
1540
  --sc-tray: var(--sc-ground, #0f0f11);
1056
1541
  --sc-tray-card: var(--sc-raised, #1d1d20);
@@ -1909,10 +2394,12 @@ a.sc-btn {
1909
2394
  .sc-step-lead:focus-visible,
1910
2395
  .sc-step-links a:focus-visible,
1911
2396
  .sc-alt-link:focus-visible,
1912
- .sc-runs-btn:focus-visible,
2397
+ .sc-runs-agent:focus-visible,
1913
2398
  .sc-mp-btn:focus-visible,
1914
2399
  .sc-row-act:focus-visible,
1915
2400
  .sc-disc:focus-visible,
2401
+ .sc-act-small:focus-visible,
2402
+ .sc-away-go:focus-visible,
1916
2403
  .sc-pair:focus-visible,
1917
2404
  .sc-mrow-btn:focus-visible,
1918
2405
  .sc-input:focus-visible,
@@ -2009,12 +2496,7 @@ a.sc-btn {
2009
2496
  .sc-pill-mark {
2010
2497
  width: 16px;
2011
2498
  height: 16px;
2012
- }
2013
-
2014
- @media (prefers-reduced-motion: no-preference) {
2015
- .sc-pill-mark-busy {
2016
- animation: sc-spin 2400ms linear infinite;
2017
- }
2499
+ --bx-w: 34;
2018
2500
  }
2019
2501
 
2020
2502
  .sc-btn-connected .sc-dot {
@@ -3045,7 +3527,283 @@ li.sc-plan-row.sc-plan-current {
3045
3527
  .sc-opt-has-warn {
3046
3528
  color: var(--sc-warn, #b06f14);
3047
3529
  }
3048
- `,document.head.appendChild(e)}import{jsx as Oe,jsxs as st}from"react/jsx-runtime";function Ko(e){if(!e)return null;let n=pn(e);if(n==="payment_required"||n==="no_compute")return null;if(typeof e=="string")return e||null;let t=e,r=t.error?.message;return typeof r=="string"&&r?r:typeof t.message=="string"&&t.message?t.message:"The run ended with an error."}function ui(){return st("svg",{viewBox:"0 0 16 16",fill:"none","aria-hidden":"true",children:[Oe("path",{d:"M8 5v4",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round"}),Oe("circle",{cx:"8",cy:"11.6",r:"0.9",fill:"currentColor"}),Oe("circle",{cx:"8",cy:"8",r:"6.4",stroke:"currentColor",strokeWidth:"1.3"})]})}function di({error:e,onRetry:n,onDismiss:t,title:r,className:o}){let s=Ko(e),a=B();return ci(()=>ot(),[]),s?Oe("div",{className:o?`soba-connect ${o}`:"soba-connect","data-theme":a.theme,role:"alert",children:st("div",{className:"sc-card sc-limit sc-run-error",children:[st("div",{className:"sc-limit-head",children:[Oe("span",{className:"sc-limit-mark sc-run-error-mark","aria-hidden":"true",children:Oe(ui,{})}),st("div",{children:[Oe("h2",{className:"sc-limit-title",children:r??"That run did not finish"}),Oe("p",{className:"sc-limit-body sc-run-error-message",children:s})]})]}),(t||n)&&st("div",{className:"sc-limit-actions",children:[t&&Oe("button",{type:"button",className:"sc-btn sc-btn-quiet",onClick:t,children:"Dismiss"}),n&&Oe("button",{type:"button",className:"sc-btn sc-btn-primary",onClick:n,children:"Try again"})]})]})}):null}import{useId as pi,useState as _o}from"react";import{jsx as $,jsxs as Rt}from"react/jsx-runtime";function mi({reason:e}){return $("span",{className:"sc-limit-mark","aria-hidden":"true",children:e==="no_compute"?$(ht,{}):$(X,{})})}function hi(e){let{error:n,variant:t="card",onDismiss:r,className:o}=e,s=Qr(n,{predict:e.predict??!("error"in e)}),a=pi(),l=B();if(!s)return null;let i=$(gi,{offer:s,headingId:a,onDismiss:r});return t==="dialog"?$(qn,{open:!0,onClose:()=>r?.(),labelledBy:a,theme:l.theme,children:i}):$("div",{className:o?`soba-connect ${o}`:"soba-connect","data-theme":l.theme,children:i})}function gi({offer:e,headingId:n,onDismiss:t}){let{compute:r}=D(),[o,s]=_o(!1),[a,l]=_o(null),i=e.reason==="no_compute"&&r.connected&&!r.online,c=i||e.connectOffer!==null||!r.connected,u=rt();async function p(){s(!0),l(null);try{await e.upgrade()}catch(f){l(f.message)}finally{s(!1)}}return Rt("div",{className:"sc-card sc-limit",children:[Rt("div",{className:"sc-limit-head",children:[$(mi,{reason:e.reason}),Rt("div",{children:[$("h2",{className:"sc-limit-title",id:n,children:e.title}),$("p",{className:"sc-limit-body",children:e.body})]})]}),a&&$("p",{className:"sc-error",children:a}),i&&u.note&&$("p",{className:"sc-limit-note",children:u.note}),Rt("div",{className:"sc-limit-actions",children:[t&&$("button",{type:"button",className:"sc-btn sc-btn-quiet",onClick:t,disabled:o,children:"Not now"}),e.upgradeTo&&$("button",{type:"button",className:c?"sc-btn":"sc-btn sc-btn-primary",onClick:()=>void p(),disabled:o,children:o?"Opening\u2026":e.upgradeTo.selectable?`Switch to ${e.upgradeTo.name}`:`${e.upgradeTo.name} for $${e.upgradeTo.price.toLocaleString()}/${e.upgradeTo.interval}`}),c&&$("button",{type:"button",className:i?"sc-btn":"sc-btn sc-btn-primary",onClick:e.connect,disabled:o,children:i?"Connect another machine":"Connect compute"}),i&&$("button",{type:"button",className:"sc-btn sc-btn-primary",onClick:u.open,disabled:o,children:"Open Soba App"})]})]})}import{useMemo as fi}from"react";function at(){let{plan:e,compute:n,connect:t}=D();return fi(()=>{let r=e.plan,o=e.current,s={plan:r,assignment:o,loading:e.loading,error:e.error,periodEnd:o?.period_end?new Date(o.period_end):null};if(!r)return{...s,state:"none",trialDaysLeft:null,ceiling:null,raised:!1,uncounted:!1,used:0,remaining:null,percent:null,unlimited:!1,reward:null,summary:"Nothing is assigned to this account, so runs are bounded by whatever the app allows."};let a=yi(o?.trial_ends_at??null),l=r.connected_reward==="included"&&n.connected&&r.connected_included_units!==null,i=l?r.connected_included_units:r.included_units,c=r.connected_reward==="unlimited"&&n.connected,u=i===null,p=e.used??0,f=i===null?null:Math.max(0,i-p),g=i&&i>0?Math.min(100,Math.round(p/i*100)):null,m=i!==null&&p>=i,y=a!==null?"trial":u?"unlimited":m?r.overage==="meter"?"metered":"spent":"within";return{...s,state:y,trialDaysLeft:a,ceiling:i,raised:l,uncounted:c,used:p,remaining:f,percent:g,unlimited:u,reward:Ai(r,l||c,n.connected,()=>t.open("manual")),summary:bi({plan:r,assignment:o,used:p,ceiling:i,trialDaysLeft:a,raised:l,uncounted:c,state:y})}},[e,n.connected,t])}function Ai(e,n,t,r){let o=We({unit:e.unit,reward:e.connected_reward,includedUnits:e.connected_included_units,creditMicros:e.connected_credit*1e6});return o?{line:o,inForce:n,required:!1,connected:t,actionable:He(e.connected_reward)&&!t,open:r}:xe(e.route_allow)&&!t?{line:"Nothing connected yet, so nothing can run.",inForce:!1,required:!0,connected:t,actionable:!0,open:r}:null}function bi(e){let{plan:n,assignment:t,used:r,ceiling:o,trialDaysLeft:s,raised:a,uncounted:l,state:i}=e,c=`${n.unit}${r===1?"":"s"}`,u=l?" Runs your own AI serves do not count toward it.":"";if(i==="trial"&&s!==null){let g=n.price===0?"it continues free":`it is $${n.price.toLocaleString()} a ${n.interval}`;return`${s} ${s===1?"day":"days"} left of your trial, then ${g}.`}if(i==="unlimited")return`${r.toLocaleString()} ${c} this period. No ceiling on this plan.`;if(i==="metered"){let g=r-(o??0);return n.overage_per_unit>0?`${g.toLocaleString()} past the allowance, billed at $${n.overage_per_unit} a ${n.unit}.${u}`:`${g.toLocaleString()} past the allowance.${u}`}if(i==="spent")return t?.period_end?`Allowance spent. It comes back on ${$o(t.period_end)}.${u}`:`Allowance spent. It comes back at the start of the next period.${u}`;let p=Math.max(0,(o??0)-r),f=a?` Raised from ${(n.included_units??0).toLocaleString()} while your own AI is connected.`:t?.period_end?` Resets ${$o(t.period_end)}.`:"";return`${p.toLocaleString()} of ${(o??0).toLocaleString()} ${n.unit}s left.${f}${u}`}function yi(e){if(!e)return null;let n=new Date(e).getTime()-Date.now();return Number.isNaN(n)||n<=0?null:Math.max(1,Math.ceil(n/864e5))}function $o(e){let n=new Date(e);return Number.isNaN(n.getTime())?e:n.toLocaleDateString(void 0,{day:"numeric",month:"long"})}import{Fragment as Ci,jsx as ee,jsxs as Re}from"react/jsx-runtime";function Zr({heading:e="Current plan",showUsage:n=!0,showName:t=!0,className:r}){let o=at(),{theme:s}=B(),a=f=>ee("section",{className:r?`soba-connect sc-fill ${r}`:"soba-connect sc-fill","data-theme":s,children:Re("div",{className:"sc-card sc-current",children:[e&&ee("h2",{className:"sc-section-title",children:e}),f]})});if(o.error)return a(ee("p",{className:"sc-error",children:o.error.message}));if(o.loading)return a(ee("p",{className:"sc-note",children:"Loading\u2026"}));if(!o.plan)return a(Re("div",{className:"sc-current-main",children:[ee("p",{className:"sc-current-name",children:"No plan"}),ee("p",{className:"sc-sub",children:o.summary})]}));let{plan:l,trialDaysLeft:i,percent:c,unlimited:u,reward:p}=o;return a(Re(Ci,{children:[Re("div",{className:"sc-current-grid",children:[(t||i!==null)&&Re("div",{className:"sc-current-main",children:[t?Re("p",{className:"sc-current-name",children:[l.name,i!==null&&Re("span",{className:"sc-trial-badge",children:[i," ",i===1?"day":"days"," left"]})]}):i!==null&&ee("p",{className:"sc-current-trial",children:Re("span",{className:"sc-trial-badge",children:[i," ",i===1?"day":"days"," left"]})}),t&&l.description&&ee("p",{className:"sc-sub",children:l.description})]}),n&&Re("div",{className:"sc-usage",children:[Re("div",{className:"sc-row-between",children:[ee("span",{className:"sc-fact-key",children:"Usage"}),ee("span",{className:c!==null&&c>=100?"sc-usage-figure sc-usage-over":"sc-usage-figure",children:u?"Unlimited":c===null?"Metered":`${c}% used`})]}),c!==null&&ee("div",{className:"sc-meter",role:"presentation",children:c>0&&ee("span",{className:c>=100?"sc-meter-fill sc-meter-full":"sc-meter-fill",style:{width:`${c}%`}})}),ee("p",{className:"sc-usage-line",children:o.summary})]})]}),p&&Re("div",{className:"sc-current-foot",children:[ee("p",{className:p.required?"sc-plan-reward-line sc-plan-reward-need":p.inForce?"sc-plan-reward-line":"sc-plan-reward-line sc-plan-reward-open",children:p.required?p.line:p.inForce?`In force: ${wi(p.line)}.`:p.line}),(p.actionable||p.connected)&&ee(dn,{})]})]}))}var wi=e=>e.charAt(0).toLowerCase()+e.slice(1);import{useCallback as vi,useMemo as ki,useState as es}from"react";var Ni={"user-hardware":"your own machine","user-subscription":"your own AI subscription","open-weights":"open models we host",frontier:"frontier models"},xi=new Set(["user-hardware","user-subscription"]);function Xr(e={}){let{plan:n,compute:t,connect:r}=D(),[o,s]=es(null),[a,l]=es(null),{featured:i,onSelect:c,successUrl:u,cancelUrl:p}=e,f=vi(async m=>{s(m.id),l(null);try{if(m.selectable)await n.select(m.id);else if(c)c(m);else{let y=await n.checkout(m.id,{...u?{successUrl:u}:{},...p?{cancelUrl:p}:{}});window.location.assign(y);return}}catch(y){throw l(y.message),y}finally{(m.selectable||c)&&s(null)}},[n,c,u,p]),g=ki(()=>n.plans.map(m=>{let y=n.current?.plan_id===m.id;return{plan:m,current:y,featured:i===m.id&&!y,price:Ri(m),allowance:m.included_units===null?`Unlimited ${m.unit}s`:`${m.included_units.toLocaleString()} ${m.unit}${m.included_units===1?"":"s"}`,allowanceNote:Si(m),computeLabel:m.route_allow===null?"any compute":m.route_allow.length===0?"no compute":null,compute:(m.route_allow??[]).map(R=>({costClass:R,label:Ni[R]??R,owned:xi.has(R),runtimes:Jt(R).map(S=>S.id)})),connect:Pi(m,y,t.connected,()=>r.open("manual")),cta:{label:Mi(m,y,o===m.id),disabled:y||o!==null,busy:o===m.id,take:()=>f(m)}}}),[n.plans,n.current,i,t.connected,r,o,f]);return{offers:g,current:g.find(m=>m.current)??null,loading:n.loading,error:n.error,failed:a}}function Ri(e){return e.price===0?{amount:"Free",interval:null,free:!0}:{amount:`$${e.price.toLocaleString()}`,interval:e.interval,free:!1}}function Si(e){let n=[];return e.included_units===null?n.push("No ceiling on this plan"):(n.push(`Included each ${e.interval}`),e.overage==="meter"&&e.overage_per_unit>0?n.push(`then $${e.overage_per_unit} a ${e.unit}`):e.included_units>0&&n.push(`then ${e.unit}s stop`)),e.trial_days>0&&n.push(`${e.trial_days}-day trial`),n.join(" \xB7 ")}function Pi(e,n,t,r){let o=We({unit:e.unit,reward:e.connected_reward,includedUnits:e.connected_included_units,creditMicros:e.connected_credit*1e6}),s=xe(e.route_allow)&&!t;if(!o&&!s)return null;let a=He(e.connected_reward);return{key:o?"Connect your own":"To use this",line:o??(n?"Nothing connected yet, so nothing can run.":"Runs only on compute you connect."),reward:o!==null,actionable:n&&(a||s)&&!t,open:r}}function Mi(e,n,t){return n?"Your plan":t?e.selectable?"Switching\u2026":"Opening\u2026":e.selectable?"Choose":`Subscribe for $${e.price.toLocaleString()}/${e.interval}`}import{jsx as b,jsxs as G}from"react/jsx-runtime";function St(e){return e?`soba-connect sc-fill ${e}`:"soba-connect sc-fill"}function Kr({onSelect:e,successUrl:n,cancelUrl:t,showCompute:r=!0,showConnect:o=!1,variant:s="cards",featured:a,className:l}){let{offers:i,loading:c,error:u,failed:p}=Xr({...a?{featured:a}:{},...e?{onSelect:e}:{},...n?{successUrl:n}:{},...t?{cancelUrl:t}:{}}),{theme:f}=B();if(u)return b("div",{className:St(l),"data-theme":f,children:b("div",{className:"sc-card",children:b("p",{className:"sc-error",children:u.message})})});if(c)return b("div",{className:St(l),"data-theme":f,children:b("div",{className:"sc-card",children:b("p",{className:"sc-note",children:"Loading plans\u2026"})})});if(i.length===0)return b("div",{className:St(l),"data-theme":f,children:b("div",{className:"sc-card",children:b("p",{className:"sc-note",children:"This app has no plans yet."})})});let g={showCompute:r,showConnect:o};return G("div",{className:St(l),"data-theme":f,"data-variant":s,children:[s==="rows"?b(Ii,{offers:i,shelf:g}):s==="table"?b(Oi,{offers:i,shelf:g}):b(Ei,{offers:i,shelf:g}),p&&b("p",{className:"sc-error",children:p})]})}function Ei({offers:e,shelf:n}){return b("div",{className:"sc-plans",children:e.map(t=>G("div",{className:ns("sc-plan",t),children:[G("div",{className:"sc-row-between",children:[b("span",{className:"sc-title",children:t.plan.name}),b(_r,{offer:t})]}),b("p",{className:"sc-sub",children:t.plan.description}),b($r,{price:t.price,free:"forever"}),b(to,{offer:t,shelf:n}),b(ts,{offer:t}),b("div",{className:"sc-plan-band",children:n.showCompute&&b(no,{offer:t})}),b("div",{className:"sc-plan-band",children:b(eo,{offer:t})})]},t.plan.id))})}function Ii({offers:e,shelf:n}){return b("ul",{className:"sc-plan-rows",children:e.map(t=>G("li",{className:ns("sc-plan-row",t),children:[G("div",{className:"sc-row-main",children:[G("span",{className:"sc-row-name",children:[b("span",{className:"sc-title",children:t.plan.name}),b(_r,{offer:t})]}),t.plan.description&&b("p",{className:"sc-sub",children:t.plan.description}),b(ts,{offer:t}),n.showCompute&&b(no,{offer:t,inline:!0}),b(eo,{offer:t,inline:!0})]}),G("div",{className:"sc-row-side",children:[b($r,{price:t.price,free:"forever",small:!0}),b(to,{offer:t,shelf:n})]})]},t.plan.id))})}function Oi({offers:e,shelf:n}){let t=e.some(a=>a.plan.overage_per_unit>0),r=e.some(a=>a.plan.trial_days>0),o=e.some(a=>a.connect!==null),s=a=>[a.current?"sc-col-current":"",a.featured?"sc-col-featured":""].filter(Boolean).join(" ")||void 0;return b("div",{className:"sc-table-scroll",children:G("table",{className:"sc-plan-table",children:[b("thead",{children:G("tr",{children:[b("td",{}),e.map(a=>G("th",{scope:"col",className:s(a),children:[G("span",{className:"sc-row-name",children:[b("span",{className:"sc-title",children:a.plan.name}),b(_r,{offer:a})]}),b($r,{price:a.price,small:!0})]},a.plan.id))]})}),G("tbody",{children:[G("tr",{children:[b("th",{scope:"row",children:"Included"}),e.map(a=>b("td",{className:s(a),children:a.allowance},a.plan.id))]}),t&&G("tr",{children:[b("th",{scope:"row",children:"Then"}),e.map(a=>b("td",{className:s(a),children:a.plan.overage_per_unit>0?`$${a.plan.overage_per_unit} / ${a.plan.unit}`:b("span",{className:"sc-muted-cell",children:"Stops"})},a.plan.id))]}),r&&G("tr",{children:[b("th",{scope:"row",children:"Trial"}),e.map(a=>b("td",{className:s(a),children:a.plan.trial_days>0?`${a.plan.trial_days} days`:b("span",{className:"sc-muted-cell",children:"None"})},a.plan.id))]}),n.showCompute&&G("tr",{children:[b("th",{scope:"row",children:"Runs on"}),e.map(a=>b("td",{className:s(a),children:b(no,{offer:a,bare:!0})},a.plan.id))]}),o&&G("tr",{children:[b("th",{scope:"row",children:"Connect your own"}),e.map(a=>b("td",{className:s(a),children:b(eo,{offer:a,bare:!0})},a.plan.id))]}),G("tr",{className:"sc-table-buy",children:[b("td",{}),e.map(a=>b("td",{className:s(a),children:b(to,{offer:a,shelf:n})},a.plan.id))]})]})]})})}function ns(e,n){return[e,n.current?"sc-plan-current":"",n.featured?"sc-plan-featured":""].filter(Boolean).join(" ")}function _r({offer:e}){return e.current?b("span",{className:"sc-plan-badge",children:"Current"}):e.featured?b("span",{className:"sc-plan-badge-soft",children:"Recommended"}):null}function $r({price:e,small:n,free:t}){return G("p",{className:n?"sc-plan-price sc-plan-price-sm":"sc-plan-price",children:[b("span",{className:"sc-plan-amount",children:e.amount}),e.interval?G("span",{className:"sc-plan-interval",children:["/",e.interval]}):t&&b("span",{className:"sc-plan-interval sc-plan-after",children:t})]})}function ts({offer:e}){return G("p",{className:"sc-plan-allowance",children:[b("span",{className:"sc-plan-figure",children:e.allowance}),b("span",{className:"sc-plan-qualifier",children:e.allowanceNote})]})}function eo({offer:e,inline:n,bare:t}){let r=e.connect;if(!r)return t?b("span",{className:"sc-muted-cell",children:"None"}):null;let o=r.reward?"sc-plan-reward-line":"sc-plan-reward-line sc-plan-reward-need",s=r.actionable?G("button",{type:"button",className:`${o} sc-plan-reward-act`,"aria-label":"Connect compute",onClick:r.open,children:[b("span",{className:"sc-reward-said",children:r.line}),G("span",{className:"sc-reward-do","aria-hidden":!0,children:[b(X,{className:"sc-reward-mark"}),"Connect compute"]})]}):b("p",{className:o,children:r.line});return t?s:b("div",{className:n?"sc-plan-reward sc-plan-reward-inline":"sc-plan-reward",children:s})}function no({offer:e,inline:n,bare:t}){let r=e.computeLabel?b("ul",{className:n?"sc-compute sc-compute-inline":"sc-compute",children:b("li",{children:e.computeLabel})}):b("ul",{className:n?"sc-compute sc-compute-inline":"sc-compute",children:e.compute.map(o=>G("li",{className:o.owned?"sc-compute-own":void 0,children:[o.label,b(Li,{runtimes:o.runtimes})]},o.costClass))});return t?r:G("div",{className:n?"sc-plan-compute sc-plan-compute-inline":"sc-plan-compute",children:[b("span",{className:"sc-fact-key",children:"Runs on"}),r]})}function to({offer:e,shelf:n}){let t=e.connect;return n.showConnect&&t?.actionable?G("button",{type:"button",className:"sc-btn sc-btn-primary sc-btn-icon",onClick:t.open,children:[b(X,{className:"sc-btn-mark"}),"Connect compute"]}):b("button",{type:"button",className:e.current?"sc-btn":"sc-btn sc-btn-primary",disabled:e.cta.disabled,onClick:()=>void e.cta.take().catch(()=>{}),children:e.cta.label})}function Li({runtimes:e}){return e.length===0?null:b("span",{className:"sc-compute-marks",children:e.map(n=>{let t=Ye[n];return t?b(t,{className:"sc-rt-mark"},n):null})})}import{jsx as ro,jsxs as rs}from"react/jsx-runtime";function Ti({heading:e,plansHeading:n,showUsage:t=!0,showName:r=!0,className:o,...s}){let{plan:a,loading:l}=at(),{theme:i}=B(),c=n??(l?"Plans":a?"Change plan":"Choose a plan");return rs("div",{className:o?`soba-connect sc-fill sc-billing ${o}`:"soba-connect sc-fill sc-billing","data-theme":i,children:[ro(Zr,{...e===void 0?{}:{heading:e},showUsage:t,showName:r}),rs("section",{className:"sc-billing-plans",children:[c&&ro("h2",{className:"sc-section-title",children:c}),ro(Kr,{...s})]})]})}import{useCallback as os,useState as ss}from"react";function oo({plan:e,successUrl:n,cancelUrl:t,label:r}){let{plan:o}=D(),[s,a]=ss(!1),[l,i]=ss(null),c=os(()=>o.checkout(e.id,{...n?{successUrl:n}:{},...t?{cancelUrl:t}:{}}),[o,e.id,n,t]),u=os(async()=>{a(!0),i(null);try{window.location.assign(await c())}catch(p){i(p.message),a(!1)}},[c]);return{label:s?"Opening\u2026":r??`Subscribe for $${e.price.toLocaleString()}/${e.interval}`,busy:s,error:l,buy:u,session:c}}import{jsx as as,jsxs as Gi}from"react/jsx-runtime";function Bi({plan:e,successUrl:n,cancelUrl:t,label:r,className:o}){let{theme:s}=B(),a=oo({plan:e,...n?{successUrl:n}:{},...t?{cancelUrl:t}:{},...r?{label:r}:{}});return Gi("div",{className:o?`soba-connect ${o}`:"soba-connect","data-theme":s,children:[as("button",{type:"button",className:"sc-btn sc-btn-primary",disabled:a.busy,onClick:()=>void a.buy(),children:a.label}),a.error&&as("p",{className:"sc-error",children:a.error})]})}import{useCallback as Le,useEffect as Ze,useMemo as On,useRef as Xe,useState as ne}from"react";var Wi="soba.session:";function is(e){return!e.cacheKey||!e.endpoint?null:Wi+JSON.stringify([e.endpoint,e.user??null,e.cacheKey])}function Hi(e){try{let n=globalThis.localStorage?.getItem(e);if(!n)return null;let t=JSON.parse(n);return typeof t.token!="string"||typeof t.expiresAt!="number"?null:{token:t.token,expiresAt:t.expiresAt}}catch{return null}}function Di(e,n){try{n?globalThis.localStorage?.setItem(e,JSON.stringify(n)):globalThis.localStorage?.removeItem(e)}catch{}}var ls=6e4,Ui=1e4,Pt=class{#e;#n=null;#r=null;#t;#o=new Set;constructor(n){this.#t=n,this.#e=n.token??null;let t=is(n),r=t&&!this.#e?Hi(t):null;r&&r.expiresAt-ls>Date.now()&&(this.#e=r.token,this.#n=r.expiresAt)}get token(){return this.#e}get expiresAt(){return this.#n}get canRefresh(){return!!this.#t.endpoint}get refreshAt(){return!this.canRefresh||this.#n===null?null:Math.max(Date.now()+Ui,this.#n-ls)}subscribe(n){return this.#o.add(n),()=>this.#o.delete(n)}async ensure(){return this.#e?this.#e:this.refresh()}async refresh(){if(this.#r)return this.#r;let n=this.#t.endpoint;if(!n)throw new Error("This Soba session cannot be refreshed. Pass `sessionEndpoint` so the provider can mint a new one.");let t=this.#t.fetchImpl??fetch.bind(globalThis);this.#r=(async()=>{let r=await t(n,{method:"POST",headers:{"content-type":"application/json"},credentials:"same-origin",body:JSON.stringify(this.#t.user?{user:this.#t.user}:{})});if(!r.ok)throw new Error(`Could not start a Soba session (${r.status} from ${n}).`);let o=await r.json(),s=o.session??o.token;if(!s)throw new Error(`${n} answered without a \`session\`. See @soba-so/react's README.`);let a=o.expires_in??o.expiresIn;this.#e=s,this.#n=typeof a=="number"?Date.now()+a*1e3:null;let l=is(this.#t);l&&Di(l,this.#n===null?null:{token:s,expiresAt:this.#n});for(let i of this.#o)i();return s})();try{return await this.#r}finally{this.#r=null}}},In=new Map,cs=new WeakMap,Fi=1;function Qi(e){if(e.token||!e.endpoint)return null;let n=0;return e.fetchImpl&&(n=cs.get(e.fetchImpl)??Fi++,cs.set(e.fetchImpl,n)),JSON.stringify([e.endpoint,e.user??null,n,e.cacheKey??null])}function us(e){let n=Qi(e);if(!n)return new Pt(e);let t=In.get(n)??{holder:new Pt(e),users:0};return In.set(n,t),t.holder}function ds(e){for(let n of In.values())n.holder===e&&n.users++}function ps(e){for(let[n,t]of In)if(t.holder===e){setTimeout(()=>{--t.users<=0&&In.get(n)===t&&In.delete(n)},0);return}}function ms(e,n=fetch.bind(globalThis)){return async(t,r)=>{let o=await n(t,r);if(o.status!==401||!e.canRefresh)return o;let s;try{s=await e.refresh()}catch{return o}return n(t,Ji(r,s))}}function Ji(e,n){let t=new Headers(e?.headers);return t.set("authorization",`Bearer ${n}`),{...e,headers:t}}import{jsx as so,jsxs as zi}from"react/jsx-runtime";var Vi="https://www.soba.so",Yi=3e4;function ji(e){let{children:n,session:t,sessionEndpoint:r,user:o,sessionCacheKey:s,runEndpoint:a,theme:l,initialMachines:i,initialConnect:c=null,initialPlans:u,initialCurrentPlan:p=null,baseUrl:f=Vi,pollMs:g=Yi,injectStyles:m=!0,modal:y=!0,fetchImpl:R,onError:S}=e,[k,W]=ne(t??null),[F,O]=ne(null),[P,Q]=ne(c),[T,K]=ne(null),[q,de]=ne(c===null),[V,M]=ne(i??[]),[De,Y]=ne(null),[pe,Ke]=ne(i===void 0),[Se,me]=ne(u??[]),[te,mn]=ne(p),[Ue,Fe]=ne(null),[ie,he]=ne(u===void 0),[re,Qe]=ne(null),[hn,Pe]=ne(!1),Te=Xe(S);Te.current=S;let oe=Le(C=>{O(C),Te.current?.(C)},[]);Ze(()=>{m&&ot()},[m]);let w=On(()=>us({...t?{token:t}:{},...r?{endpoint:r}:{},...o?{user:o}:{},...R?{fetchImpl:R}:{},...s?{cacheKey:s}:{}}),[t,r,o,R,s]);Ze(()=>{let C=!0;ds(w);let Z=w.subscribe(()=>{C&&W(w.token)});return!w.token&&!w.canRefresh?oe(new Error("<SobaProvider> needs a `session` or a `sessionEndpoint`. A browser cannot mint one: that takes your secret key.")):w.ensure().then(()=>C&&W(w.token),le=>C&&oe(le)),()=>{C=!1,Z(),ps(w)}},[w,oe]),Ze(()=>{F&&(de(!1),Ke(!1),he(!1),K(C=>C??F),Y(C=>C??F),Fe(C=>C??F))},[F]),Ze(()=>{let C=w.refreshAt;if(C===null)return;let Z=()=>{w.refresh().catch(Ae=>oe(Ae))},le=()=>{document.hidden||(document.removeEventListener("visibilitychange",le),Z())},dt=setTimeout(()=>{typeof document<"u"&&document.hidden?document.addEventListener("visibilitychange",le):Z()},Math.max(0,C-Date.now()));return()=>{clearTimeout(dt),typeof document<"u"&&document.removeEventListener("visibilitychange",le)}},[w,oe,k]);let j=Xe(c?.machines_url??null),E=On(()=>{if(!k)return null;let C=new Tn({session:k,baseUrl:f,fetchImpl:ms(w,R??fetch.bind(globalThis))});return C.setMachinesUrl(j.current),C},[k,f,w,R]),Mt=Xe(c!==null);Ze(()=>{if(!E||Mt.current)return;let C=!0;return de(!0),E.context().then(Z=>{C&&(Q(Z),K(null),de(!1))},Z=>{C&&(K(Z),de(!1))}),()=>{C=!1}},[E]);let Je=Le(async()=>{if(E)try{let C=await E.machines();M(Array.isArray(C)?C:[]),Y(null)}catch(C){Y(C)}finally{Ke(!1)}},[E]),ge=Le(async()=>{if(E)try{let C=await E.plans();me(C.plans),mn(C.current),Fe(null)}catch(C){Fe(C)}finally{he(!1)}},[E]),se=Xe(!1),[Ve,gn]=ne(!1),fn=Xe(u!==void 0),_e=Xe(!1),$e=Le(()=>{se.current||(se.current=!0,_e.current&&queueMicrotask(()=>{_e.current&&gn(!0)}))},[]);Ze(()=>(_e.current=!0,se.current&&gn(!0),()=>{_e.current=!1}),[]),Ze(()=>{!E||!Ve||fn.current||ge()},[E,Ve,ge]);let en=Le(async C=>{if(!E)throw new Error("No session yet.");await E.selectPlan(C),await ge()},[E,ge]),Et=Le(async(C,Z)=>{if(!E)throw new Error("No session yet.");let le=await E.checkoutPlan(C,Z);if(!le.url)throw new Error("Checkout could not be started.");return le.url},[E]),it=Le(async()=>{if(!E)throw new Error("No session yet.");await E.leavePlan(),await ge()},[E,ge]),lt=Xe(i!==void 0);Ze(()=>{if(!E)return;let C=Ce(Je,g,{immediate:!lt.current});return lt.current=!1,C},[E,Je,g]);let An=Le((C="manual")=>{y&&(Pe(!0),Qe(C))},[y]),ct=Le(()=>Qe(null),[]),z=Xe(V);z.current=V;let Me=Le(async C=>{if(!a)throw new Error("Pass `runEndpoint` to <SobaProvider> to start runs from the browser. It is your own route: it holds your secret key, calls soba.run(), and forwards the stream.");let{signal:Z,...le}=C,Ae=await(R??fetch.bind(globalThis))(a,{method:"POST",headers:{"content-type":"application/json",accept:"text/event-stream"},credentials:"same-origin",body:JSON.stringify(le),...Z?{signal:Z}:{}});if(!Ae.ok){let Be=await Ae.json().catch(()=>null),be=new Error(Be?.error?.message??`${a} answered ${Ae.status}.`);be.status=Ae.status,Be?.error?.code&&(be.code=Be.error.code),Be?.error&&(be.error=Be.error);let pt=z.current.length>0&&!z.current.some(Ot=>Ot.state!=="offline");throw Ae.status===409&&pt&&An("no_compute"),be}let ve=Yr(Ae);return async function*(){try{yield*ve}finally{se.current&&ge()}}()},[a,R,ge,An]),fe=On(()=>te?Se.find(C=>C.id===te.plan_id)??null:null,[Se,te]),nn=On(()=>fe?fe.connected_reward==="included"&&V.length>0&&fe.connected_included_units!==null?fe.connected_included_units:fe.included_units:null,[fe,V]),ut=On(()=>({plans:Se,current:te,plan:fe,used:te?.units_used??null,included:nn,remaining:nn!==null&&te?Math.max(0,nn-te.units_used):null,unlimited:fe!==null&&nn===null,loading:ie,error:Ue,select:en,checkout:Et,leave:it,refresh:ge}),[Se,te,fe,nn,ie,Ue,en,Et,it,ge]),It=On(()=>({session:k,client:E,error:F,get plan(){return $e(),ut},compute:{machines:V,connected:V.length>0,online:V.some(C=>C.state!=="offline"),loading:pe,error:De,refresh:Je},connect:{app:P?.app??null,command:P?.command??null,connectUrl:P?.connect_url??null,publishableKey:P?.publishable_key??null,loading:q,error:T,open:An,close:ct,isOpen:re!==null,hasModal:y},run:Me}),[k,E,F,ut,$e,re,An,ct,y,V,pe,De,Je,P,q,T,Me]);return so(Or.Provider,{value:E,children:so(Lr.Provider,{value:{context:P,machines:pe?void 0:V,theme:l??P?.theme??"light"},children:zi(Tr.Provider,{value:It,children:[n,y&&hn&&so(nt,{open:re!==null,onOpenChange:C=>Qe(C?re??"manual":null),onConnected:()=>{Je()},...re==="payment_required"||re==="no_compute"?{reason:re}:{},...re==="pair"?{showStatus:!1}:{}})]})})})}function qi(e){return e?Zi[e]??e:null}var Zi={"user-hardware":"your own computer","user-subscription":"your own AI plan","user-api-key":"your own API key","open-weights":"open models we host",frontier:"a frontier model we pay for"};async function Xi(e,n,t){let r=n.local;if(!r?.session||n.after)return null;let o=/\/v1\/runs\/([^/]+)\/events/.exec(e.url)?.[1];if(!o)return null;let s=`http://127.0.0.1:${r.port??47321}/v1/runs/${o}/events`,a=new AbortController,l=()=>a.abort();n.signal?.addEventListener("abort",l);let i=setTimeout(()=>a.abort(),r.timeoutMs??3e3);try{let c=await t(s,{headers:{authorization:`Bearer ${r.session}`,accept:"text/event-stream"},signal:a.signal});return c.ok?{url:s,bearer:r.session,open:c}:null}catch{return null}finally{clearTimeout(i),n.signal?.removeEventListener("abort",l)}}async function*Ki(e){let n=e.body;if(!n)return;let t=n.getReader(),r=new TextDecoder,o="",s=null,a=[];try{for(;;){let l=await t.read();if(l.done)return;o+=r.decode(l.value,{stream:!0});for(let i=o.indexOf(`
3530
+
3531
+ .bx * {
3532
+ transform-box: view-box;
3533
+ }
3534
+
3535
+ .bx-arc,
3536
+ .bx-st,
3537
+ .bx-z1 path,
3538
+ .bx-z2 path,
3539
+ .bx-ob path {
3540
+ stroke-width: var(--bx-w, 17);
3541
+ }
3542
+
3543
+ .bx[data-expression="thinking"] .bx-arc,
3544
+ .bx[data-expression="paused"] .bx-arc,
3545
+ .bx[data-expression="attention"] .bx-arc,
3546
+ .bx[data-expression="connecting"] .bx-arc,
3547
+ .bx[data-expression="gone"] .bx-arc,
3548
+ .bx[data-expression="snap"] .bx-arc,
3549
+ .bx[data-expression="listening"] .bx-arc,
3550
+ .bx[data-expression="permission"] .bx-arc,
3551
+ .bx[data-expression="ai"] .bx-arc {
3552
+ display: none;
3553
+ }
3554
+
3555
+ @keyframes bx-stream {
3556
+ to {
3557
+ stroke-dashoffset: -62;
3558
+ }
3559
+ }
3560
+
3561
+ .bx-st {
3562
+ animation: bx-stream 0.9s linear infinite;
3563
+ }
3564
+
3565
+ @keyframes bx-think {
3566
+ 0%,
3567
+ 100% {
3568
+ opacity: 0.26;
3569
+ }
3570
+ 33% {
3571
+ opacity: 1;
3572
+ }
3573
+ }
3574
+
3575
+ .bx-th {
3576
+ opacity: 0.26;
3577
+ animation: bx-think 1.2s ease-in-out infinite;
3578
+ }
3579
+
3580
+ .bx-th2 {
3581
+ animation-delay: 0.4s;
3582
+ }
3583
+
3584
+ .bx-th3 {
3585
+ animation-delay: 0.8s;
3586
+ }
3587
+
3588
+ @keyframes bx-att {
3589
+ 0%,
3590
+ 80%,
3591
+ 100% {
3592
+ transform: rotate(0);
3593
+ }
3594
+ 85% {
3595
+ transform: rotate(-8deg);
3596
+ }
3597
+ 95% {
3598
+ transform: rotate(8deg);
3599
+ }
3600
+ }
3601
+
3602
+ .bx-at {
3603
+
3604
+ transform-box: fill-box;
3605
+ transform-origin: 50% 100%;
3606
+ animation: bx-att 2s ease-in-out infinite;
3607
+ }
3608
+
3609
+ @keyframes bx-z {
3610
+ 0% {
3611
+ opacity: 0;
3612
+ transform: translate(0, 12px);
3613
+ }
3614
+ 25%,
3615
+ 70% {
3616
+ opacity: 1;
3617
+ transform: translate(0, 0);
3618
+ }
3619
+ 100% {
3620
+ opacity: 0;
3621
+ transform: translate(8px, -16px);
3622
+ }
3623
+ }
3624
+
3625
+ .bx-z1 {
3626
+ animation: bx-z 3s ease-in-out infinite;
3627
+ }
3628
+
3629
+ .bx-z2 {
3630
+ animation: bx-z 3s ease-in-out 0.75s infinite;
3631
+ }
3632
+
3633
+ @keyframes bx-orb {
3634
+ to {
3635
+ transform: rotate(360deg);
3636
+ }
3637
+ }
3638
+
3639
+ .bx-ob {
3640
+ transform-origin: 278px 400px;
3641
+ animation: bx-orb 1.15s cubic-bezier(0.45, 0, 0.55, 1) infinite;
3642
+ }
3643
+
3644
+ @keyframes bx-xa {
3645
+ 0% {
3646
+ opacity: 0;
3647
+ transform: translateX(0);
3648
+ }
3649
+ 8%,
3650
+ 22% {
3651
+ opacity: 1;
3652
+ transform: translateX(0);
3653
+ }
3654
+ 45%,
3655
+ 100% {
3656
+ opacity: 0;
3657
+ transform: translateX(40px);
3658
+ }
3659
+ }
3660
+
3661
+ .bx-xa {
3662
+ opacity: 0;
3663
+ animation: bx-xa 3.2s cubic-bezier(0.45, 0, 0.55, 1) infinite;
3664
+ }
3665
+
3666
+ @keyframes bx-xx {
3667
+ 0%,
3668
+ 40% {
3669
+ opacity: 0;
3670
+ transform: scale(0.4);
3671
+ }
3672
+ 54% {
3673
+ opacity: 1;
3674
+ transform: scale(1.08);
3675
+ }
3676
+ 60%,
3677
+ 90% {
3678
+ opacity: 1;
3679
+ transform: scale(1);
3680
+ }
3681
+ 100% {
3682
+ opacity: 0;
3683
+ transform: scale(1);
3684
+ }
3685
+ }
3686
+
3687
+ .bx-xx {
3688
+ transform-box: fill-box;
3689
+ transform-origin: center;
3690
+ animation: bx-xx 3.2s ease-out infinite;
3691
+ }
3692
+
3693
+ @keyframes bx-voice {
3694
+ 0%,
3695
+ 100% {
3696
+ transform: scaleY(0.45);
3697
+ }
3698
+ 50% {
3699
+ transform: scaleY(1);
3700
+ }
3701
+ }
3702
+
3703
+ .bx-vb {
3704
+ transform-box: fill-box;
3705
+ transform-origin: center;
3706
+ animation: bx-voice 0.9s ease-in-out infinite;
3707
+ }
3708
+
3709
+ .bx-vb2 {
3710
+ animation-delay: 0.15s;
3711
+ }
3712
+
3713
+ .bx-vb3 {
3714
+ animation-delay: 0.3s;
3715
+ }
3716
+
3717
+ @keyframes bx-wait {
3718
+ 0% {
3719
+ opacity: 1;
3720
+ }
3721
+ 100% {
3722
+ opacity: 0.15;
3723
+ }
3724
+ }
3725
+
3726
+ .bx-w {
3727
+ opacity: 0.15;
3728
+ animation: bx-wait 1.2s linear infinite;
3729
+ }
3730
+
3731
+ @keyframes bx-spark {
3732
+ 0%,
3733
+ 100% {
3734
+ transform: scale(1) rotate(0);
3735
+ }
3736
+ 50% {
3737
+ transform: scale(0.7) rotate(22deg);
3738
+ }
3739
+ }
3740
+
3741
+ .bx-sp {
3742
+ transform-box: fill-box;
3743
+ transform-origin: center;
3744
+ animation: bx-spark 2.6s ease-in-out infinite;
3745
+ }
3746
+
3747
+ .bx-sp2 {
3748
+ animation-delay: -0.87s;
3749
+ }
3750
+
3751
+ .bx-sp3 {
3752
+ animation-delay: -1.73s;
3753
+ }
3754
+
3755
+ @keyframes bx-snap {
3756
+ 0%,
3757
+ 6% {
3758
+ transform: translateX(90px);
3759
+ opacity: 0;
3760
+ }
3761
+ 24% {
3762
+ transform: translateX(-10px);
3763
+ opacity: 1;
3764
+ }
3765
+ 30% {
3766
+ transform: translateX(4px);
3767
+ }
3768
+ 35%,
3769
+ 100% {
3770
+ transform: translateX(0);
3771
+ opacity: 1;
3772
+ }
3773
+ }
3774
+
3775
+ .bx-snap {
3776
+ animation: bx-snap 3.6s cubic-bezier(0.3, 0, 0.2, 1) infinite;
3777
+ }
3778
+
3779
+ @media (prefers-reduced-motion: reduce) {
3780
+ .bx .bx-st,
3781
+ .bx .bx-th,
3782
+ .bx .bx-at,
3783
+ .bx .bx-z1,
3784
+ .bx .bx-z2,
3785
+ .bx .bx-ob,
3786
+ .bx .bx-xa,
3787
+ .bx .bx-xx,
3788
+ .bx .bx-snap,
3789
+ .bx .bx-vb,
3790
+ .bx .bx-w,
3791
+ .bx .bx-sp {
3792
+ animation: none;
3793
+ }
3794
+
3795
+
3796
+ .bx .bx-th,
3797
+ .bx .bx-z1,
3798
+ .bx .bx-z2,
3799
+ .bx .bx-xx,
3800
+ .bx .bx-snap,
3801
+ .bx .bx-w {
3802
+ opacity: 1;
3803
+ transform: none;
3804
+ }
3805
+ }
3806
+ `,document.head.appendChild(e)}import{jsx as Ue,jsxs as gt}from"react/jsx-runtime";function _o(e){if(!e)return null;let n=vn(e);if(n==="payment_required"||n==="no_compute")return null;if(typeof e=="string")return e||null;let t=e,r=t.error?.message;return typeof r=="string"&&r?r:typeof t.message=="string"&&t.message?t.message:"The run ended with an error."}function fi(){return gt("svg",{viewBox:"0 0 16 16",fill:"none","aria-hidden":"true",children:[Ue("path",{d:"M8 5v4",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round"}),Ue("circle",{cx:"8",cy:"11.6",r:"0.9",fill:"currentColor"}),Ue("circle",{cx:"8",cy:"8",r:"6.4",stroke:"currentColor",strokeWidth:"1.3"})]})}function Ai({error:e,onRetry:n,onDismiss:t,title:r,className:o}){let s=_o(e),a=H();return gi(()=>ht(),[]),s?Ue("div",{className:o?`soba-connect ${o}`:"soba-connect","data-theme":a.theme,role:"alert",children:gt("div",{className:"sc-card sc-limit sc-run-error",children:[gt("div",{className:"sc-limit-head",children:[Ue("span",{className:"sc-limit-mark sc-run-error-mark","aria-hidden":"true",children:Ue(fi,{})}),gt("div",{children:[Ue("h2",{className:"sc-limit-title",children:r??"That run did not finish"}),Ue("p",{className:"sc-limit-body sc-run-error-message",children:s})]})]}),(t||n)&&gt("div",{className:"sc-limit-actions",children:[t&&Ue("button",{type:"button",className:"sc-btn sc-btn-quiet",onClick:t,children:"Dismiss"}),n&&Ue("button",{type:"button",className:"sc-btn sc-btn-primary",onClick:n,children:"Try again"})]})]})}):null}import{useId as bi,useState as $o}from"react";import{jsx as re,jsxs as Ht}from"react/jsx-runtime";function yi({reason:e}){return re("span",{className:"sc-limit-mark","aria-hidden":"true",children:e==="no_compute"?re(Mt,{}):re(te,{})})}function wi(e){let{error:n,variant:t="card",onDismiss:r,className:o}=e,s=qr(n,{predict:e.predict??!("error"in e)}),a=bi(),l=H();if(!s)return null;let i=re(Ci,{offer:s,headingId:a,onDismiss:r});return t==="dialog"?re(at,{open:!0,onClose:()=>r?.(),labelledBy:a,theme:l.theme,children:i}):re("div",{className:o?`soba-connect ${o}`:"soba-connect","data-theme":l.theme,children:i})}function Ci({offer:e,headingId:n,onDismiss:t}){let{compute:r}=F(),[o,s]=$o(!1),[a,l]=$o(null),i=e.reason==="no_compute"&&r.connected&&!r.online,c=i||e.connectOffer!==null||!r.connected,u=mt();async function p(){s(!0),l(null);try{await e.upgrade()}catch(A){l(A.message)}finally{s(!1)}}return Ht("div",{className:"sc-card sc-limit",children:[Ht("div",{className:"sc-limit-head",children:[re(yi,{reason:e.reason}),Ht("div",{children:[re("h2",{className:"sc-limit-title",id:n,children:e.title}),re("p",{className:"sc-limit-body",children:e.body})]})]}),a&&re("p",{className:"sc-error",children:a}),i&&u.note&&re("p",{className:"sc-limit-note",children:u.note}),Ht("div",{className:"sc-limit-actions",children:[t&&re("button",{type:"button",className:"sc-btn sc-btn-quiet",onClick:t,disabled:o,children:"Not now"}),e.upgradeTo&&re("button",{type:"button",className:c?"sc-btn":"sc-btn sc-btn-primary",onClick:()=>void p(),disabled:o,children:o?"Opening\u2026":e.upgradeTo.selectable?`Switch to ${e.upgradeTo.name}`:`${e.upgradeTo.name} for $${e.upgradeTo.price.toLocaleString()}/${e.upgradeTo.interval}`}),c&&re("button",{type:"button",className:i?"sc-btn":"sc-btn sc-btn-primary",onClick:e.connect,disabled:o,children:i?"Connect another machine":"Connect compute"}),i&&re("button",{type:"button",className:"sc-btn sc-btn-primary",onClick:u.open,disabled:o,children:"Open Soba App"})]})]})}import{useMemo as vi}from"react";function ft(){let{plan:e,compute:n,connect:t}=F();return vi(()=>{let r=e.plan,o=e.current,s={plan:r,assignment:o,loading:e.loading,error:e.error,periodEnd:o?.period_end?new Date(o.period_end):null};if(!r)return{...s,state:"none",trialDaysLeft:null,ceiling:null,raised:!1,uncounted:!1,used:0,remaining:null,percent:null,unlimited:!1,reward:null,summary:"Nothing is assigned to this account, so runs are bounded by whatever the app allows."};let a=xi(o?.trial_ends_at??null),l=r.connected_reward==="included"&&n.connected&&r.connected_included_units!==null,i=l?r.connected_included_units:r.included_units,c=r.connected_reward==="unlimited"&&n.connected,u=i===null,p=e.used??0,A=i===null?null:Math.max(0,i-p),g=i&&i>0?Math.min(100,Math.round(p/i*100)):null,h=i!==null&&p>=i,y=a!==null?"trial":u?"unlimited":h?r.overage==="meter"?"metered":"spent":"within";return{...s,state:y,trialDaysLeft:a,ceiling:i,raised:l,uncounted:c,used:p,remaining:A,percent:g,unlimited:u,reward:ki(r,l||c,n.connected,()=>t.open("manual")),summary:Ni({plan:r,assignment:o,used:p,ceiling:i,trialDaysLeft:a,raised:l,uncounted:c,state:y})}},[e,n.connected,t])}function ki(e,n,t,r){let o=Ye({unit:e.unit,reward:e.connected_reward,includedUnits:e.connected_included_units,creditMicros:e.connected_credit*1e6});return o?{line:o,inForce:n,required:!1,connected:t,actionable:ze(e.connected_reward)&&!t,open:r}:Le(e.route_allow)&&!t?{line:"Nothing connected yet, so nothing can run.",inForce:!1,required:!0,connected:t,actionable:!0,open:r}:null}function Ni(e){let{plan:n,assignment:t,used:r,ceiling:o,trialDaysLeft:s,raised:a,uncounted:l,state:i}=e,c=`${n.unit}${r===1?"":"s"}`,u=l?" Runs your own AI serves do not count toward it.":"";if(i==="trial"&&s!==null){let g=n.price===0?"it continues free":`it is $${n.price.toLocaleString()} a ${n.interval}`;return`${s} ${s===1?"day":"days"} left of your trial, then ${g}.`}if(i==="unlimited")return`${r.toLocaleString()} ${c} this period. No ceiling on this plan.`;if(i==="metered"){let g=r-(o??0);return n.overage_per_unit>0?`${g.toLocaleString()} past the allowance, billed at $${n.overage_per_unit} a ${n.unit}.${u}`:`${g.toLocaleString()} past the allowance.${u}`}if(i==="spent")return t?.period_end?`Allowance spent. It comes back on ${es(t.period_end)}.${u}`:`Allowance spent. It comes back at the start of the next period.${u}`;let p=Math.max(0,(o??0)-r),A=a?` Raised from ${(n.included_units??0).toLocaleString()} while your own AI is connected.`:t?.period_end?` Resets ${es(t.period_end)}.`:"";return`${p.toLocaleString()} of ${(o??0).toLocaleString()} ${n.unit}s left.${A}${u}`}function xi(e){if(!e)return null;let n=new Date(e).getTime()-Date.now();return Number.isNaN(n)||n<=0?null:Math.max(1,Math.ceil(n/864e5))}function es(e){let n=new Date(e);return Number.isNaN(n.getTime())?e:n.toLocaleDateString(void 0,{day:"numeric",month:"long"})}import{Fragment as Si,jsx as oe,jsxs as Te}from"react/jsx-runtime";function _r({heading:e="Current plan",showUsage:n=!0,showName:t=!0,className:r}){let o=ft(),{theme:s}=H(),a=A=>oe("section",{className:r?`soba-connect sc-fill ${r}`:"soba-connect sc-fill","data-theme":s,children:Te("div",{className:"sc-card sc-current",children:[e&&oe("h2",{className:"sc-section-title",children:e}),A]})});if(o.error)return a(oe("p",{className:"sc-error",children:o.error.message}));if(o.loading)return a(oe("p",{className:"sc-note",children:"Loading\u2026"}));if(!o.plan)return a(Te("div",{className:"sc-current-main",children:[oe("p",{className:"sc-current-name",children:"No plan"}),oe("p",{className:"sc-sub",children:o.summary})]}));let{plan:l,trialDaysLeft:i,percent:c,unlimited:u,reward:p}=o;return a(Te(Si,{children:[Te("div",{className:"sc-current-grid",children:[(t||i!==null)&&Te("div",{className:"sc-current-main",children:[t?Te("p",{className:"sc-current-name",children:[l.name,i!==null&&Te("span",{className:"sc-trial-badge",children:[i," ",i===1?"day":"days"," left"]})]}):i!==null&&oe("p",{className:"sc-current-trial",children:Te("span",{className:"sc-trial-badge",children:[i," ",i===1?"day":"days"," left"]})}),t&&l.description&&oe("p",{className:"sc-sub",children:l.description})]}),n&&Te("div",{className:"sc-usage",children:[Te("div",{className:"sc-row-between",children:[oe("span",{className:"sc-fact-key",children:"Usage"}),oe("span",{className:c!==null&&c>=100?"sc-usage-figure sc-usage-over":"sc-usage-figure",children:u?"Unlimited":c===null?"Metered":`${c}% used`})]}),c!==null&&oe("div",{className:"sc-meter",role:"presentation",children:c>0&&oe("span",{className:c>=100?"sc-meter-fill sc-meter-full":"sc-meter-fill",style:{width:`${c}%`}})}),oe("p",{className:"sc-usage-line",children:o.summary})]})]}),p&&Te("div",{className:"sc-current-foot",children:[oe("p",{className:p.required?"sc-plan-reward-line sc-plan-reward-need":p.inForce?"sc-plan-reward-line":"sc-plan-reward-line sc-plan-reward-open",children:p.required?p.line:p.inForce?`In force: ${Mi(p.line)}.`:p.line}),(p.actionable||p.connected)&&oe(Cn,{})]})]}))}var Mi=e=>e.charAt(0).toLowerCase()+e.slice(1);import{useCallback as Pi,useMemo as Ri,useState as ns}from"react";var Ei={"user-hardware":"your own machine","user-subscription":"your own AI subscription","open-weights":"open models we host",frontier:"frontier models"},Ii=new Set(["user-hardware","user-subscription"]);function $r(e={}){let{plan:n,compute:t,connect:r}=F(),[o,s]=ns(null),[a,l]=ns(null),{featured:i,onSelect:c,successUrl:u,cancelUrl:p}=e,A=Pi(async h=>{s(h.id),l(null);try{if(h.selectable)await n.select(h.id);else if(c)c(h);else{let y=await n.checkout(h.id,{...u?{successUrl:u}:{},...p?{cancelUrl:p}:{}});window.location.assign(y);return}}catch(y){throw l(y.message),y}finally{(h.selectable||c)&&s(null)}},[n,c,u,p]),g=Ri(()=>n.plans.map(h=>{let y=n.current?.plan_id===h.id;return{plan:h,current:y,featured:i===h.id&&!y,price:Oi(h),allowance:h.included_units===null?`Unlimited ${h.unit}s`:`${h.included_units.toLocaleString()} ${h.unit}${h.included_units===1?"":"s"}`,allowanceNote:Li(h),computeLabel:h.route_allow===null?"any compute":h.route_allow.length===0?"no compute":null,compute:(h.route_allow??[]).map(M=>({costClass:M,label:Ei[M]??M,owned:Ii.has(M),runtimes:ar(M).map(E=>E.id)})),connect:Ti(h,y,t.connected,()=>r.open("manual")),cta:{label:Bi(h,y,o===h.id),disabled:y||o!==null,busy:o===h.id,take:()=>A(h)}}}),[n.plans,n.current,i,t.connected,r,o,A]);return{offers:g,current:g.find(h=>h.current)??null,loading:n.loading,error:n.error,failed:a}}function Oi(e){return e.price===0?{amount:"Free",interval:null,free:!0}:{amount:`$${e.price.toLocaleString()}`,interval:e.interval,free:!1}}function Li(e){let n=[];return e.included_units===null?n.push("No ceiling on this plan"):(n.push(`Included each ${e.interval}`),e.overage==="meter"&&e.overage_per_unit>0?n.push(`then $${e.overage_per_unit} a ${e.unit}`):e.included_units>0&&n.push(`then ${e.unit}s stop`)),e.trial_days>0&&n.push(`${e.trial_days}-day trial`),n.join(" \xB7 ")}function Ti(e,n,t,r){let o=Ye({unit:e.unit,reward:e.connected_reward,includedUnits:e.connected_included_units,creditMicros:e.connected_credit*1e6}),s=Le(e.route_allow)&&!t;if(!o&&!s)return null;let a=ze(e.connected_reward);return{key:o?"Connect your own":"To use this",line:o??(n?"Nothing connected yet, so nothing can run.":"Runs only on compute you connect."),reward:o!==null,actionable:n&&(a||s)&&!t,open:r}}function Bi(e,n,t){return n?"Your plan":t?e.selectable?"Switching\u2026":"Opening\u2026":e.selectable?"Choose":`Subscribe for $${e.price.toLocaleString()}/${e.interval}`}import{jsx as b,jsxs as D}from"react/jsx-runtime";function Dt(e){return e?`soba-connect sc-fill ${e}`:"soba-connect sc-fill"}function eo({onSelect:e,successUrl:n,cancelUrl:t,showCompute:r=!0,showConnect:o=!1,variant:s="cards",featured:a,className:l}){let{offers:i,loading:c,error:u,failed:p}=$r({...a?{featured:a}:{},...e?{onSelect:e}:{},...n?{successUrl:n}:{},...t?{cancelUrl:t}:{}}),{theme:A}=H();if(u)return b("div",{className:Dt(l),"data-theme":A,children:b("div",{className:"sc-card",children:b("p",{className:"sc-error",children:u.message})})});if(c)return b("div",{className:Dt(l),"data-theme":A,children:b("div",{className:"sc-card",children:b("p",{className:"sc-note",children:"Loading plans\u2026"})})});if(i.length===0)return b("div",{className:Dt(l),"data-theme":A,children:b("div",{className:"sc-card",children:b("p",{className:"sc-note",children:"This app has no plans yet."})})});let g={showCompute:r,showConnect:o};return D("div",{className:Dt(l),"data-theme":A,"data-variant":s,children:[s==="rows"?b(Wi,{offers:i,shelf:g}):s==="table"?b(Hi,{offers:i,shelf:g}):b(Gi,{offers:i,shelf:g}),p&&b("p",{className:"sc-error",children:p})]})}function Gi({offers:e,shelf:n}){return b("div",{className:"sc-plans",children:e.map(t=>D("div",{className:ts("sc-plan",t),children:[D("div",{className:"sc-row-between",children:[b("span",{className:"sc-title",children:t.plan.name}),b(no,{offer:t})]}),b("p",{className:"sc-sub",children:t.plan.description}),b(to,{price:t.price,free:"forever"}),b(so,{offer:t,shelf:n}),b(rs,{offer:t}),b("div",{className:"sc-plan-band",children:n.showCompute&&b(oo,{offer:t})}),b("div",{className:"sc-plan-band",children:b(ro,{offer:t})})]},t.plan.id))})}function Wi({offers:e,shelf:n}){return b("ul",{className:"sc-plan-rows",children:e.map(t=>D("li",{className:ts("sc-plan-row",t),children:[D("div",{className:"sc-row-main",children:[D("span",{className:"sc-row-name",children:[b("span",{className:"sc-title",children:t.plan.name}),b(no,{offer:t})]}),t.plan.description&&b("p",{className:"sc-sub",children:t.plan.description}),b(rs,{offer:t}),n.showCompute&&b(oo,{offer:t,inline:!0}),b(ro,{offer:t,inline:!0})]}),D("div",{className:"sc-row-side",children:[b(to,{price:t.price,free:"forever",small:!0}),b(so,{offer:t,shelf:n})]})]},t.plan.id))})}function Hi({offers:e,shelf:n}){let t=e.some(a=>a.plan.overage_per_unit>0),r=e.some(a=>a.plan.trial_days>0),o=e.some(a=>a.connect!==null),s=a=>[a.current?"sc-col-current":"",a.featured?"sc-col-featured":""].filter(Boolean).join(" ")||void 0;return b("div",{className:"sc-table-scroll",children:D("table",{className:"sc-plan-table",children:[b("thead",{children:D("tr",{children:[b("td",{}),e.map(a=>D("th",{scope:"col",className:s(a),children:[D("span",{className:"sc-row-name",children:[b("span",{className:"sc-title",children:a.plan.name}),b(no,{offer:a})]}),b(to,{price:a.price,small:!0})]},a.plan.id))]})}),D("tbody",{children:[D("tr",{children:[b("th",{scope:"row",children:"Included"}),e.map(a=>b("td",{className:s(a),children:a.allowance},a.plan.id))]}),t&&D("tr",{children:[b("th",{scope:"row",children:"Then"}),e.map(a=>b("td",{className:s(a),children:a.plan.overage_per_unit>0?`$${a.plan.overage_per_unit} / ${a.plan.unit}`:b("span",{className:"sc-muted-cell",children:"Stops"})},a.plan.id))]}),r&&D("tr",{children:[b("th",{scope:"row",children:"Trial"}),e.map(a=>b("td",{className:s(a),children:a.plan.trial_days>0?`${a.plan.trial_days} days`:b("span",{className:"sc-muted-cell",children:"None"})},a.plan.id))]}),n.showCompute&&D("tr",{children:[b("th",{scope:"row",children:"Runs on"}),e.map(a=>b("td",{className:s(a),children:b(oo,{offer:a,bare:!0})},a.plan.id))]}),o&&D("tr",{children:[b("th",{scope:"row",children:"Connect your own"}),e.map(a=>b("td",{className:s(a),children:b(ro,{offer:a,bare:!0})},a.plan.id))]}),D("tr",{className:"sc-table-buy",children:[b("td",{}),e.map(a=>b("td",{className:s(a),children:b(so,{offer:a,shelf:n})},a.plan.id))]})]})]})})}function ts(e,n){return[e,n.current?"sc-plan-current":"",n.featured?"sc-plan-featured":""].filter(Boolean).join(" ")}function no({offer:e}){return e.current?b("span",{className:"sc-plan-badge",children:"Current"}):e.featured?b("span",{className:"sc-plan-badge-soft",children:"Recommended"}):null}function to({price:e,small:n,free:t}){return D("p",{className:n?"sc-plan-price sc-plan-price-sm":"sc-plan-price",children:[b("span",{className:"sc-plan-amount",children:e.amount}),e.interval?D("span",{className:"sc-plan-interval",children:["/",e.interval]}):t&&b("span",{className:"sc-plan-interval sc-plan-after",children:t})]})}function rs({offer:e}){return D("p",{className:"sc-plan-allowance",children:[b("span",{className:"sc-plan-figure",children:e.allowance}),b("span",{className:"sc-plan-qualifier",children:e.allowanceNote})]})}function ro({offer:e,inline:n,bare:t}){let r=e.connect;if(!r)return t?b("span",{className:"sc-muted-cell",children:"None"}):null;let o=r.reward?"sc-plan-reward-line":"sc-plan-reward-line sc-plan-reward-need",s=r.actionable?D("button",{type:"button",className:`${o} sc-plan-reward-act`,"aria-label":"Connect compute",onClick:r.open,children:[b("span",{className:"sc-reward-said",children:r.line}),D("span",{className:"sc-reward-do","aria-hidden":!0,children:[b(te,{className:"sc-reward-mark"}),"Connect compute"]})]}):b("p",{className:o,children:r.line});return t?s:b("div",{className:n?"sc-plan-reward sc-plan-reward-inline":"sc-plan-reward",children:s})}function oo({offer:e,inline:n,bare:t}){let r=e.computeLabel?b("ul",{className:n?"sc-compute sc-compute-inline":"sc-compute",children:b("li",{children:e.computeLabel})}):b("ul",{className:n?"sc-compute sc-compute-inline":"sc-compute",children:e.compute.map(o=>D("li",{className:o.owned?"sc-compute-own":void 0,children:[o.label,b(Di,{runtimes:o.runtimes})]},o.costClass))});return t?r:D("div",{className:n?"sc-plan-compute sc-plan-compute-inline":"sc-plan-compute",children:[b("span",{className:"sc-fact-key",children:"Runs on"}),r]})}function so({offer:e,shelf:n}){let t=e.connect;return n.showConnect&&t?.actionable?D("button",{type:"button",className:"sc-btn sc-btn-primary sc-btn-icon",onClick:t.open,children:[b(te,{className:"sc-btn-mark"}),"Connect compute"]}):b("button",{type:"button",className:e.current?"sc-btn":"sc-btn sc-btn-primary",disabled:e.cta.disabled,onClick:()=>void e.cta.take().catch(()=>{}),children:e.cta.label})}function Di({runtimes:e}){return e.length===0?null:b("span",{className:"sc-compute-marks",children:e.map(n=>{let t=$e[n];return t?b(t,{className:"sc-rt-mark"},n):null})})}import{jsx as ao,jsxs as os}from"react/jsx-runtime";function Ui({heading:e,plansHeading:n,showUsage:t=!0,showName:r=!0,className:o,...s}){let{plan:a,loading:l}=ft(),{theme:i}=H(),c=n??(l?"Plans":a?"Change plan":"Choose a plan");return os("div",{className:o?`soba-connect sc-fill sc-billing ${o}`:"soba-connect sc-fill sc-billing","data-theme":i,children:[ao(_r,{...e===void 0?{}:{heading:e},showUsage:t,showName:r}),os("section",{className:"sc-billing-plans",children:[c&&ao("h2",{className:"sc-section-title",children:c}),ao(eo,{...s})]})]})}import{useCallback as ss,useState as as}from"react";function io({plan:e,successUrl:n,cancelUrl:t,label:r}){let{plan:o}=F(),[s,a]=as(!1),[l,i]=as(null),c=ss(()=>o.checkout(e.id,{...n?{successUrl:n}:{},...t?{cancelUrl:t}:{}}),[o,e.id,n,t]),u=ss(async()=>{a(!0),i(null);try{window.location.assign(await c())}catch(p){i(p.message),a(!1)}},[c]);return{label:s?"Opening\u2026":r??`Subscribe for $${e.price.toLocaleString()}/${e.interval}`,busy:s,error:l,buy:u,session:c}}import{jsx as is,jsxs as Qi}from"react/jsx-runtime";function Fi({plan:e,successUrl:n,cancelUrl:t,label:r,className:o}){let{theme:s}=H(),a=io({plan:e,...n?{successUrl:n}:{},...t?{cancelUrl:t}:{},...r?{label:r}:{}});return Qi("div",{className:o?`soba-connect ${o}`:"soba-connect","data-theme":s,children:[is("button",{type:"button",className:"sc-btn sc-btn-primary",disabled:a.busy,onClick:()=>void a.buy(),children:a.label}),a.error&&is("p",{className:"sc-error",children:a.error})]})}import{useCallback as Fe,useEffect as tn,useMemo as Dn,useRef as rn,useState as se}from"react";var Vi="soba.session:";function ls(e){return!e.cacheKey||!e.endpoint?null:Vi+JSON.stringify([e.endpoint,e.user??null,e.cacheKey])}function Ji(e){try{let n=globalThis.localStorage?.getItem(e);if(!n)return null;let t=JSON.parse(n);return typeof t.token!="string"||typeof t.expiresAt!="number"?null:{token:t.token,expiresAt:t.expiresAt}}catch{return null}}function Yi(e,n){try{n?globalThis.localStorage?.setItem(e,JSON.stringify(n)):globalThis.localStorage?.removeItem(e)}catch{}}var cs=6e4,zi=1e4,Ut=class{#e;#n=null;#r=null;#t;#o=new Set;constructor(n){this.#t=n,this.#e=n.token??null;let t=ls(n),r=t&&!this.#e?Ji(t):null;r&&r.expiresAt-cs>Date.now()&&(this.#e=r.token,this.#n=r.expiresAt)}get token(){return this.#e}get expiresAt(){return this.#n}get canRefresh(){return!!this.#t.endpoint}get refreshAt(){return!this.canRefresh||this.#n===null?null:Math.max(Date.now()+zi,this.#n-cs)}subscribe(n){return this.#o.add(n),()=>this.#o.delete(n)}async ensure(){return this.#e?this.#e:this.refresh()}async refresh(){if(this.#r)return this.#r;let n=this.#t.endpoint;if(!n)throw new Error("This Soba session cannot be refreshed. Pass `sessionEndpoint` so the provider can mint a new one.");let t=this.#t.fetchImpl??fetch.bind(globalThis);this.#r=(async()=>{let r=await t(n,{method:"POST",headers:{"content-type":"application/json"},credentials:"same-origin",body:JSON.stringify(this.#t.user?{user:this.#t.user}:{})});if(!r.ok)throw new Error(`Could not start a Soba session (${r.status} from ${n}).`);let o=await r.json(),s=o.session??o.token;if(!s)throw new Error(`${n} answered without a \`session\`. See @soba-so/react's README.`);let a=o.expires_in??o.expiresIn;this.#e=s,this.#n=typeof a=="number"?Date.now()+a*1e3:null;let l=ls(this.#t);l&&Yi(l,this.#n===null?null:{token:s,expiresAt:this.#n});for(let i of this.#o)i();return s})();try{return await this.#r}finally{this.#r=null}}},Hn=new Map,us=new WeakMap,ji=1;function qi(e){if(e.token||!e.endpoint)return null;let n=0;return e.fetchImpl&&(n=us.get(e.fetchImpl)??ji++,us.set(e.fetchImpl,n)),JSON.stringify([e.endpoint,e.user??null,n,e.cacheKey??null])}function ds(e){let n=qi(e);if(!n)return new Ut(e);let t=Hn.get(n)??{holder:new Ut(e),users:0};return Hn.set(n,t),t.holder}function ps(e){for(let n of Hn.values())n.holder===e&&n.users++}function ms(e){for(let[n,t]of Hn)if(t.holder===e){setTimeout(()=>{--t.users<=0&&Hn.get(n)===t&&Hn.delete(n)},0);return}}function hs(e,n=fetch.bind(globalThis)){return async(t,r)=>{let o=await n(t,r);if(o.status!==401||!e.canRefresh)return o;let s;try{s=await e.refresh()}catch{return o}return n(t,Zi(r,s))}}function Zi(e,n){let t=new Headers(e?.headers);return t.set("authorization",`Bearer ${n}`),{...e,headers:t}}import{jsx as lo,jsxs as $i}from"react/jsx-runtime";var Xi="https://soba.so",Ki=3e4;function _i(e){let{children:n,session:t,sessionEndpoint:r,user:o,sessionCacheKey:s,runEndpoint:a,theme:l,initialMachines:i,initialConnect:c=null,initialPlans:u,initialCurrentPlan:p=null,baseUrl:A=Xi,pollMs:g=Ki,injectStyles:h=!0,modal:y=!0,fetchImpl:M,onError:E}=e,[I,B]=se(t??null),[V,L]=se(null),[x,G]=se(c),[w,ae]=se(null),[K,ge]=se(c===null),[_,ne]=se(i??[]),[Qe,z]=se(null),[ue,Be]=se(i===void 0),[ie,fe]=se(u??[]),[q,Ae]=se(p),[Pe,de]=se(null),[be,Q]=se(u===void 0),[$,Ge]=se(null),[je,W]=se(!1),ye=rn(E);ye.current=E;let Z=Fe(k=>{L(k),ye.current?.(k)},[]);tn(()=>{h&&ht()},[h]);let O=Dn(()=>ds({...t?{token:t}:{},...r?{endpoint:r}:{},...o?{user:o}:{},...M?{fetchImpl:M}:{},...s?{cacheKey:s}:{}}),[t,r,o,M,s]);tn(()=>{let k=!0;ps(O);let ee=O.subscribe(()=>{k&&B(O.token)});return!O.token&&!O.canRefresh?Z(new Error("<SobaProvider> needs a `session` or a `sessionEndpoint`. A browser cannot mint one: that takes your secret key.")):O.ensure().then(()=>k&&B(O.token),pe=>k&&Z(pe)),()=>{k=!1,ee(),ms(O)}},[O,Z]),tn(()=>{V&&(ge(!1),Be(!1),Q(!1),ae(k=>k??V),z(k=>k??V),de(k=>k??V))},[V]),tn(()=>{let k=O.refreshAt;if(k===null)return;let ee=()=>{O.refresh().catch(ve=>Z(ve))},pe=()=>{document.hidden||(document.removeEventListener("visibilitychange",pe),ee())},Ct=setTimeout(()=>{typeof document<"u"&&document.hidden?document.addEventListener("visibilitychange",pe):ee()},Math.max(0,k-Date.now()));return()=>{clearTimeout(Ct),typeof document<"u"&&document.removeEventListener("visibilitychange",pe)}},[O,Z,I]);let C=rn(c?.machines_url??null),S=Dn(()=>{if(!I)return null;let k=new Vn({session:I,baseUrl:A,fetchImpl:hs(O,M??fetch.bind(globalThis))});return k.setMachinesUrl(C.current),k},[I,A,O,M]),Ve=rn(c!==null);tn(()=>{if(!S||Ve.current)return;let k=!0;return ge(!0),S.context().then(ee=>{k&&(G(ee),ae(null),ge(!1))},ee=>{k&&(ae(ee),ge(!1))}),()=>{k=!1}},[S]);let qe=Fe(async()=>{if(S)try{let k=await S.machines();ne(Array.isArray(k)?k:[]),z(null)}catch(k){z(k)}finally{Be(!1)}},[S]),we=Fe(async()=>{if(S)try{let k=await S.plans();fe(k.plans),Ae(k.current),de(null)}catch(k){de(k)}finally{Q(!1)}},[S]),le=rn(!1),[Ze,kn]=se(!1),Nn=rn(u!==void 0),on=rn(!1),sn=Fe(()=>{le.current||(le.current=!0,on.current&&queueMicrotask(()=>{on.current&&kn(!0)}))},[]);tn(()=>(on.current=!0,le.current&&kn(!0),()=>{on.current=!1}),[]),tn(()=>{!S||!Ze||Nn.current||we()},[S,Ze,we]);let an=Fe(async k=>{if(!S)throw new Error("No session yet.");await S.selectPlan(k),await we()},[S,we]),Ft=Fe(async(k,ee)=>{if(!S)throw new Error("No session yet.");let pe=await S.checkoutPlan(k,ee);if(!pe.url)throw new Error("Checkout could not be started.");return pe.url},[S]),At=Fe(async()=>{if(!S)throw new Error("No session yet.");await S.leavePlan(),await we()},[S,we]),bt=rn(i!==void 0);tn(()=>{if(!S)return;let k=Se(qe,g,{immediate:!bt.current});return bt.current=!1,k},[S,qe,g]);let xn=Fe((k="manual")=>{y&&(W(!0),Ge(k))},[y]),yt=Fe(()=>Ge(null),[]),X=rn(_);X.current=_;let We=Fe(async k=>{if(!a)throw new Error("Pass `runEndpoint` to <SobaProvider> to start runs from the browser. It is your own route: it holds your secret key, calls soba.run(), and forwards the stream.");let{signal:ee,...pe}=k,ve=await(M??fetch.bind(globalThis))(a,{method:"POST",headers:{"content-type":"application/json",accept:"text/event-stream"},credentials:"same-origin",body:JSON.stringify(pe),...ee?{signal:ee}:{}});if(!ve.ok){let Je=await ve.json().catch(()=>null),ke=new Error(Je?.error?.message??`${a} answered ${ve.status}.`);ke.status=ve.status,Je?.error?.code&&(ke.code=Je.error.code),Je?.error&&(ke.error=Je.error);let vt=X.current.length>0&&!X.current.some(Vt=>Vt.state!=="offline");throw ve.status===409&&vt&&xn("no_compute"),ke}let Re=Kr(ve);return async function*(){try{yield*Re}finally{le.current&&we()}}()},[a,M,we,xn]),Ce=Dn(()=>q?ie.find(k=>k.id===q.plan_id)??null:null,[ie,q]),ln=Dn(()=>Ce?Ce.connected_reward==="included"&&_.length>0&&Ce.connected_included_units!==null?Ce.connected_included_units:Ce.included_units:null,[Ce,_]),wt=Dn(()=>({plans:ie,current:q,plan:Ce,used:q?.units_used??null,included:ln,remaining:ln!==null&&q?Math.max(0,ln-q.units_used):null,unlimited:Ce!==null&&ln===null,loading:be,error:Pe,select:an,checkout:Ft,leave:At,refresh:we}),[ie,q,Ce,ln,be,Pe,an,Ft,At,we]),Qt=Dn(()=>({session:I,client:S,error:V,get plan(){return sn(),wt},compute:{machines:_,connected:_.length>0,online:_.some(k=>k.state!=="offline"),loading:ue,error:Qe,refresh:qe},connect:{app:x?.app??null,command:x?.command??null,connectUrl:x?.connect_url??null,publishableKey:x?.publishable_key??null,loading:K,error:w,open:xn,close:yt,isOpen:$!==null,hasModal:y},run:We}),[I,S,V,wt,sn,$,xn,yt,y,_,ue,Qe,qe,x,K,w,We]);return lo(Gr.Provider,{value:S,children:lo(Wr.Provider,{value:{context:x,machines:ue?void 0:_,theme:l??x?.theme??"light"},children:$i(Hr.Provider,{value:Qt,children:[n,y&&je&&lo(dt,{open:$!==null,onOpenChange:k=>Ge(k?$??"manual":null),onConnected:()=>{qe()},...$==="payment_required"||$==="no_compute"?{reason:$}:{},...$==="pair"?{showStatus:!1}:{}})]})})})}function el(e){return e?nl[e]??e:null}var nl={"user-hardware":"your own computer","user-subscription":"your own AI plan","user-api-key":"your own API key","open-weights":"open models we host",frontier:"a frontier model we pay for"};async function tl(e,n,t){let r=n.local;if(!r?.session||n.after)return null;let o=/\/v1\/runs\/([^/]+)\/events/.exec(e.url)?.[1];if(!o)return null;let s=`http://127.0.0.1:${r.port??47321}/v1/runs/${o}/events`,a=new AbortController,l=()=>a.abort();n.signal?.addEventListener("abort",l);let i=setTimeout(()=>a.abort(),r.timeoutMs??3e3);try{let c=await t(s,{headers:{authorization:`Bearer ${r.session}`,accept:"text/event-stream"},signal:a.signal});return c.ok?{url:s,bearer:r.session,open:c}:null}catch{return null}finally{clearTimeout(i),n.signal?.removeEventListener("abort",l)}}async function*rl(e){let n=e.body;if(!n)return;let t=n.getReader(),r=new TextDecoder,o="",s=null,a=[];try{for(;;){let l=await t.read();if(l.done)return;o+=r.decode(l.value,{stream:!0});for(let i=o.indexOf(`
3049
3807
  `);i!==-1;i=o.indexOf(`
3050
3808
  `)){let c=o.slice(0,i).replace(/\r$/,"");if(o=o.slice(i+1),c==="")a.length&&(yield{id:s,data:a.join(`
3051
- `)}),s=null,a=[];else if(c.startsWith("id:")){let u=Number(c.slice(3).trim());s=Number.isFinite(u)?u:null}else if(c.startsWith("data:")){let u=c.slice(5);a.push(u.startsWith(" ")?u.slice(1):u)}}}}finally{t.cancel().catch(()=>{})}}var ao=(e,n)=>new Promise(t=>{let r=setTimeout(t,e);n?.addEventListener("abort",()=>{clearTimeout(r),t()})});async function*_i(e,n={}){let t=n.fetchImpl??fetch.bind(globalThis),r=await Xi(e,n,t)??{url:e.url,bearer:e.token,open:null},o=n.maxRetries??6,s=n.after??0,a=0;for(;;){if(n.signal?.aborted)return;let l;try{l=r.open??await t(r.url,{headers:{authorization:`Bearer ${r.bearer}`,accept:"text/event-stream",...s?{"last-event-id":String(s)}:{}},...n.signal?{signal:n.signal}:{}}),r.open=null}catch(i){if(n.signal?.aborted)return;if(++a>o)throw i;await ao(1e3*a,n.signal);continue}if(l.status===503&&a<o){a++,await ao(Number(l.headers.get("retry-after")??3)*1e3,n.signal);continue}if(!l.ok){let i=`Could not read this run (${l.status}).`;try{let c=await l.json();c.error?.message&&(i=c.error.message)}catch{}throw new Error(i)}for await(let i of Ki(l)){i.id!==null&&(s=i.id),a=0;let c=En(i.data);if(c&&(yield c,c.type==="done"||c.type==="error"))return}if(n.signal?.aborted)return;if(++a>o)throw new Error("Lost this run's stream and could not get it back.");await ao(1e3*a,n.signal)}}export{Ma as ComputeStatus,dn as ConnectButton,Da as ConnectCompute,nt as ConnectModal,ei as ConnectNudge,Gr as ConnectPill,li as ModelPicker,di as RunError,hi as RunLimit,Ti as SobaBilling,Bi as SobaCheckout,Zr as SobaCurrentPlan,Kr as SobaPlans,ji as SobaProvider,si as collectText,Wr as connectSays,ot as injectStyles,En as parseEvent,Yr as readEvents,Ko as runErrorMessage,pn as sobaErrorCode,qi as tierLabel,oo as useCheckout,$n as useCompute,Ta as useConnectButton,Vr as useConnectNudge,at as useCurrentPlan,Hr as useMachineRuns,qr as useModel,rt as useOpenSobaConnect,Xr as usePlans,Qr as useRunLimit,D as useSoba,_i as watchRun};
3809
+ `)}),s=null,a=[];else if(c.startsWith("id:")){let u=Number(c.slice(3).trim());s=Number.isFinite(u)?u:null}else if(c.startsWith("data:")){let u=c.slice(5);a.push(u.startsWith(" ")?u.slice(1):u)}}}}finally{t.cancel().catch(()=>{})}}var co=(e,n)=>new Promise(t=>{let r=setTimeout(t,e);n?.addEventListener("abort",()=>{clearTimeout(r),t()})});async function*ol(e,n={}){let t=n.fetchImpl??fetch.bind(globalThis),r=await tl(e,n,t)??{url:e.url,bearer:e.token,open:null},o=n.maxRetries??6,s=n.after??0,a=0;for(;;){if(n.signal?.aborted)return;let l;try{l=r.open??await t(r.url,{headers:{authorization:`Bearer ${r.bearer}`,accept:"text/event-stream",...s?{"last-event-id":String(s)}:{}},...n.signal?{signal:n.signal}:{}}),r.open=null}catch(i){if(n.signal?.aborted)return;if(++a>o)throw i;await co(1e3*a,n.signal);continue}if(l.status===503&&a<o){a++,await co(Number(l.headers.get("retry-after")??3)*1e3,n.signal);continue}if(!l.ok){let i=`Could not read this run (${l.status}).`;try{let c=await l.json();c.error?.message&&(i=c.error.message)}catch{}throw new Error(i)}for await(let i of rl(l)){i.id!==null&&(s=i.id),a=0;let c=Wn(i.data);if(c&&(yield c,c.type==="done"||c.type==="error"))return}if(n.signal?.aborted)return;if(++a>o)throw new Error("Lost this run's stream and could not get it back.");await co(1e3*a,n.signal)}}export{Wa as ComputeStatus,Cn as ConnectButton,ja as ConnectCompute,dt as ConnectModal,li as ConnectNudge,Qr as ConnectPill,hi as ModelPicker,Ai as RunError,wi as RunLimit,Ui as SobaBilling,Fi as SobaCheckout,_r as SobaCurrentPlan,eo as SobaPlans,_i as SobaProvider,mi as collectText,Vr as connectSays,ht as injectStyles,Wn as parseEvent,Kr as readEvents,_o as runErrorMessage,vn as sobaErrorCode,el as tierLabel,io as useCheckout,ct as useCompute,Qa as useConnectButton,Xr as useConnectNudge,ft as useCurrentPlan,Jr as useMachineRuns,wn as useModel,mt as useOpenSobaConnect,$r as usePlans,qr as useRunLimit,F as useSoba,ol as watchRun};