@soba-so/react 0.0.23 → 0.0.25
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 +126 -11
- package/dist/styles.css +118 -3
- package/package.json +9 -8
package/dist/index.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use client"
|
|
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 jn,jsx as R,jsxs as Ze}from"react/jsx-runtime";function qe({kind:e,size:n=44,className:t}){let r=Yt[e];return Ze("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(yo,{}),r.slot==="zzz"&&R(wo,{}),r.slot==="dots"&&R(Co,{}),r.slot==="bang"&&R(vo,{}),r.slot==="orbit"&&R(ko,{}),r.slot==="cross"&&R(No,{}),r.slot==="snap"&&R(xo,{}),r.slot==="bars"&&R(So,{}),r.slot==="ring"&&R(Mo,{}),r.slot==="sparks"&&R(Po,{})]})}function yo(){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 wo(){return Ze(jn,{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 Co(){return Ze(jn,{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 vo(){return Ze("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 ko(){return Ze("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 No(){return Ze(jn,{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 xo(){return R("path",{className:"bx-snap",d:un,fill:"none",stroke:"currentColor",strokeWidth:17,strokeLinecap:"round"})}function So(){return Ze("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 Mo(){return R(jn,{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 Po(){return Ze(jn,{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 Ro={"claude-code":{small:"haiku",large:"opus"}};function kt(e){let n=Ro[e];return!!(n?.small||n?.large)}import{useEffect as zo,useRef as jo,useState as Rt}from"react";var Pn=class extends Error{status;constructor(n,t){super(n),this.name="ConnectError",this.status=t}},Eo=5*6e4,qn=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(o){if(o instanceof Pn&&o.status===401)throw o;this.gatewayBackUntil=Date.now()+Eo}if(r??=await this.request("GET",`/v1/machines${t}`),r.unchanged&&n)return n.machines;let s=Array.isArray(r.machines)?r.machines:[];return this.lastMachines=typeof r.version=="string"?{version:r.version,machines:s}:null,s}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 Pn("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 s=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)}:{}}),o={};try{o=await s.json()}catch{}if(!s.ok){let a=typeof o.error=="string"?o.error:`Request failed (${s.status})`;throw new Pn(a,s.status)}return o}};function Zn(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(o=>o+o).join(""):n[1],r=o=>{let a=Number.parseInt(t.slice(o*2,o*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),s=qt(n);return!r||!s?e:`#${r.map((a,l)=>Math.round(a+(s[l]-a)*t)).map(a=>a.toString(16).padStart(2,"0")).join("")}`}function dn(e,n){if(!qt(e))return{};let t=Zn(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":Zn(r)}:{"--sc-accent":t,"--sc-accent-fg":e}}}function He(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 Xn(e){let{platform:n,arch:t}=e;if(!n)return null;let r=n==="darwin"||n==="macos",s=r?"Mac":n==="win32"||n==="windows"?"Windows PC":"Linux machine";return r?`${t==="aarch64"||t==="arm64"?"Apple silicon ":""}${s}`:s}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=s=>s.state==="busy"?0:s.state==="online"?1:2,r=s=>s.last_seen_at?Date.parse(s.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 Rn(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 Kn(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 ke(e){return e.runtimes.filter(n=>n.id!=="shell"&&!n.quarantined&&!n.absent)}function he(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=ke(e),r=t.find(a=>a.id===e.preferred_runtime);if(r)return{by:"you",runtimeId:r.id,runtime:r};let s=a=>a.id==="claude-code"?0:a.id==="codex"?1:2,o=[...t].sort((a,l)=>s(a)-s(l))[0]??null;return{by:"default",runtimeId:o?.id??null,runtime:o}}var Kt="soba";function _n(){return`${Kt}://show`}function $n(e,n,t){let r=`${Kt}://connect?url=${encodeURIComponent(e)}`;return n&&(r+=`&nonce=${encodeURIComponent(n)}`),t&&(r+=`&want=${encodeURIComponent(t)}`),r}function et(){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 Io=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=$n(e,n.nonce,n.want)}catch{return"absent"}return t}async function gn(e={}){if(typeof window>"u"||typeof document>"u")return"unknown";let n=er(e);try{window.location.href=_n()}catch{return"absent"}return n}async function er(e){if(typeof window>"u"||typeof document>"u")return"unknown";let n=e.graceMs??Io,t=document.visibilityState==="visible"&&document.hasFocus(),r=!1,s=()=>{r=!0},o=()=>{document.visibilityState==="hidden"&&(r=!0)};return window.addEventListener("blur",s),window.addEventListener("pagehide",s),document.addEventListener("visibilitychange",o),await new Promise(a=>setTimeout(a,n)),window.removeEventListener("blur",s),window.removeEventListener("pagehide",s),document.removeEventListener("visibilitychange",o),t?r?"opened":"absent":"unknown"}var ms={"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 hs,useRef as Oo}from"react";import{Fragment as Bo,jsx as Ne,jsxs as nr}from"react/jsx-runtime";function nt({anchor:e,label:n,options:t,current:r,onClose:s,onPick:o}){let a=Oo(null);return hs(()=>{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 m=i.offsetWidth,A=i.offsetHeight,g=u.width>248?u.left:u.right-m,h=Math.max(8,Math.min(g,window.innerWidth-m-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]),hs(()=>{let i=c=>{let u=c.target;!u||a.current?.contains(u)||e.current?.contains(u)||s()};return document.addEventListener("pointerdown",i,!0),()=>document.removeEventListener("pointerdown",i,!0)},[e,s]),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(),s(),e.current?.focus();else if(i.key==="ArrowDown"||i.key==="ArrowUp"){i.preventDefault();let m=i.key==="ArrowDown"?1:-1;c[(u+m+c.length)%c.length]?.focus()}else i.key==="Tab"&&s()},children:t.map(i=>Ne(Lo,{option:i,checked:r===i.id,onClose:s,onPick:o},i.id??""))})}function Lo({option:e,checked:n,onClose:t,onPick:r}){return nr(Bo,{children:[e.heading?Ne("div",{className:"sc-menu-head",role:"presentation",children:e.heading}):e.rule?Ne("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:[Ne("span",{className:"sc-menu-label",children:e.label}),e.note&&Ne("span",{className:"sc-menu-note",children:e.note})]}),e.trailing?Ne("span",{className:"sc-menu-act",children:e.trailing}):n&&Ne(To,{})]})]})}function To(){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 En({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{useRef as Wo,useState as Ho}from"react";var Go={haiku:"Haiku",sonnet:"Sonnet",opus:"Opus",fable:"Fable"};function fn(e){return Go[e]??e}function tt(e){let n=[...e].sort(Nt),t=De([...e]),r=t?he(t):null,o=[{id:"auto",kind:"auto",label:"Automatic",model:"auto",...r?.runtime?{note:r.runtime.default_model?`Uses ${fn(r.runtime.default_model)}`:`Uses ${r.runtime.display_name}`}:{}}];n.some(u=>ke(u).some(m=>kt(m.id)))&&o.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 m of ke(u))for(let A of m.models){if(!A)continue;let g=`${m.id}/${A}`,h=l.get(g);if(h){h.machines.add(j(u));continue}l.set(g,{option:{id:g,kind:"named",label:fn(A),model:A,runtime:m.id,runtimeName:m.display_name,costClass:m.cost_class},machines:new Set([j(u)])})}let i=new Set;for(let{machines:u}of l.values())for(let m of u)i.add(m);let c=i.size>1;for(let{option:u,machines:m}of l.values()){let A=c&&m.size===1?[...m][0]:void 0;o.push(A?{...u,machine:A}:u)}return o}function rt(e){let n=[],t=[];for(let r of e){if(r.kind!=="named"){n.push(r);continue}let s=r.runtimeName??r.runtime??"",o=t.find(a=>a.heading===s);o?o.options.push(r):t.push({heading:s,options:[r]})}return n.length?[{heading:null,options:n},...t]:t}function tr(e,n){let t=e.find(s=>s.kind==="auto")??{id:"auto",kind:"auto",label:"Automatic",model:"auto"};if(!n||n==="auto")return{selected:t,unavailable:null};let r=e.find(s=>s.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 An(e){return e.length>1}import{jsx as xt,jsxs as gs}from"react/jsx-runtime";function st({options:e,selected:n,onPick:t,caption:r,disabled:s,className:o}){let[a,l]=Ho(!1),i=Wo(null);if(!An(e))return null;let c=o?`sc-mp ${o}`:"sc-mp";return gs("span",{className:c,children:[r&&xt("span",{className:"sc-mp-cap",children:r}),gs("button",{ref:i,type:"button",className:"sc-mp-btn","aria-haspopup":"menu","aria-expanded":a,"aria-label":`Model: ${n.label}. Change`,disabled:s,onClick:()=>l(u=>!u),children:[xt("span",{className:"sc-mp-label",children:n.label}),xt(En,{open:!0})]}),a&&xt(nt,{anchor:i,label:"Which model answers",options:Do(e),current:n.id,onClose:()=>l(!1),onPick:u=>{l(!1),u&&t(u)}})]})}function Do(e){let n=[];for(let t of rt(e))t.options.forEach((r,s)=>{let o=Uo(r);n.push({id:r.id,label:r.label,...o?{note:o}:{},...t.heading&&s===0?{heading:t.heading}:{},...!t.heading&&r.kind==="size"&&s===1?{rule:!0}:{}})});return n}function Uo(e){return e.kind!=="named"?e.note:e.machine?`on ${e.machine}`:void 0}import{jsx as xe,jsxs as Qo}from"react/jsx-runtime";function oe({className:e}){return Qo("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e,children:[xe("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"}),xe("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 fs({className:e}){return xe("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e,children:xe("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 bn({className:e}){return xe("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e,children:xe("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 St({className:e}){return xe("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e,children:xe("path",{d:"M4 5h16v11H4zM9 20h6M12 16v4",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function Fo({className:e}){return xe("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e,children:xe("path",{d:"M5 7l5 5-5 5M12 18h7",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function sr({className:e}){return xe("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e,children:xe("path",{d:"M5 6h14v10H5zM2.5 19.5h19",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}var Xe={claude:fs,chatgpt:bn,local:St},As={shell:Fo};function ys(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 Vo=3e3,Jo=2*6e4,Mt=Date.now(),Pt=new Set,bs=!1;function Yo(){if(bs||typeof window>"u")return;bs=!0;let e=()=>{let t=Mt;if(Mt=Date.now(),Mt-t>Jo)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={}){Yo();let r,s=t.immediate===!1?Date.now():0,o=!1,a=!1,l=()=>{a||(r=setTimeout(i,t.idle===!1?n:ys(n,Date.now()-Mt)))},i=async()=>{if(clearTimeout(r),!(a||o)){if(typeof document>"u"||!document.hidden){o=!0,s=Date.now();try{await e()}catch{}finally{o=!1}}l()}},c=()=>{Date.now()-s>Math.min(n,Vo)&&i()};return Pt.add(c),t.immediate===!1?l():i(),()=>{a=!0,clearTimeout(r),Pt.delete(c)}}var ge=[{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"]}],ws=["claude","chatgpt"];function or(){return ge.filter(e=>ws.includes(e.id))}function ar(e){return ge.filter(n=>n.costClass===e)}function ir(e){return ge.find(n=>n.expects.includes(e))??null}import{Fragment as ot,jsx as p,jsxs as k}from"react/jsx-runtime";function yn({machines:e,hosted:n=[],onApproveRuntime:t,onPreferRuntime:r,onDisconnectHosted:s,onPair:o,onWake:a,onOpenApp:l,onRefresh:i,refreshing:c,busy:u,appName:m,model:A,onPickModel:g,error:h,runs:y,loadRuns:M,loading:I,machineMenu:E,machineNote:T,onReconnect:V,openApp:O=!0,children:S,onStopRun:B}){let C=De(e),ce=e.filter(w=>w.id!==C?.id),_=C?.state==="online",[Ae,$]=Rt(()=>_?[]:null),[Me,Le]=Rt("no"),ee=y===void 0&&!!M,Te=ee?Ae:y??(_?[]:null),q=y!==void 0||!!M,ne=!!(C&&hn(C));zo(()=>{if(!ee||!M||!ne)return;let w=!0,v=Se(async()=>{let Qe=await M();w&&$(Qe)},3e3);return()=>{w=!1,v()}},[ee,M,ne]);let Z=(C?Xt(C):[]).filter(w=>w.quarantined&&!w.absent),X=C?he(C).runtime:null,be=X?.cost_class==="user-hardware"?X:null,ye=be?ca(be.default_model):null,pe=!!C&&!hn(C),z=(()=>{if(!C||pe||!X||He(X).tone!=="warn")return null;let v=j(C);return{title:`${X.display_name} is signed out`,detail:`Sign in on ${v} so Soba can start runs.`}})(),te=()=>{l?.(),Le("going"),gn().then(w=>Le(w==="absent"?"absent":"no"))},re=()=>{te(),a?.()},Be={label:Me==="going"?"Opening Soba\u2026":"Open Soba",onPress:te,spin:Me==="going"},Q=C?Be:o?{label:"Connect to Soba",onPress:o}:null,Ge=!!C&&Q===Be,K=Ge&&!!i,U=i&&p("button",{type:"button",className:"sc-disc",onClick:i,disabled:c,"aria-label":"Refresh",title:"Refresh",children:p(ma,{spinning:!!c})});return!C&&n.length===0&&!o?p("p",{className:"sc-note",children:"Nothing connected yet."}):k("div",{className:"sc-tray",children:[C&&k(Ee,{title:"This machine",action:(i&&!K||O||E)&&k("span",{className:"sc-cap-acts",children:[!K&&U,O&&p(ra,{}),E]}),children:[p(qo,{machine:C}),T]}),C&&pe&&!C.pairing_lost&&p(Ee,{title:"Soba",children:k("div",{className:"sc-away",children:[p("span",{className:"sc-away-mark","aria-hidden":"true",children:p(qe,{kind:"paused",size:30})}),k("span",{className:"sc-away-say",children:[p("span",{className:"sc-away-title",children:"Wake it up"}),k("span",{className:"sc-away-body",children:["Soba on ",j(C)," is not answering. Waking it opens the app there."]})]}),p("button",{type:"button",className:"sc-away-go",onClick:re,disabled:u||Me==="going",children:Me==="going"?"Waking\u2026":"Wake"})]})}),C?.pairing_lost&&!hn(C)&&p(Ee,{title:"Soba",children:k("div",{className:"sc-away",children:[p("span",{className:"sc-away-mark","aria-hidden":"true",children:p(qe,{kind:"gone",size:30})}),k("span",{className:"sc-away-say",children:[p("span",{className:"sc-away-title",children:"Connect it again"}),p("span",{className:"sc-away-body",children:"Its pairing has ended, so it cannot take runs until it is connected again."})]}),V&&p("button",{type:"button",className:"sc-away-go",onClick:V,disabled:u,children:"Connect"})]})}),C&&!pe&&p(Ee,{title:"Runs on",children:X?p(aa,{machine:C,appName:m,busy:u,...A?{model:A}:{},...g?{onPickModel:g}:{},...r?{onPick:w=>r(C.id,w)}:{},...t?{onApprove:w=>t(C.id,w)}:{}}):k("div",{className:"sc-blank",children:[p("span",{className:"sc-blank-mark","aria-hidden":"true",children:p(Ko,{})}),k("span",{className:"sc-blank-say",children:[p("span",{className:"sc-blank-title",children:I?"Looking\u2026":"No agent on this machine"}),p("span",{className:"sc-blank-body",children:I?"Reading what it can run.":"Install Claude Code, Codex or Ollama there and it will appear here."})]}),!I&&O&&k("a",{className:"sc-blank-act",href:_n(),children:[p("span",{children:"Add agents"}),p(lr,{})]})]})}),C&&(z||ye)&&k(Ee,{title:"Needs attention",children:[z&&k("div",{className:"sc-alarm",children:[p("span",{className:"sc-alarm-mark","aria-hidden":"true",children:p(vs,{})}),k("span",{className:"sc-alarm-say",children:[p("span",{className:"sc-alarm-title",children:z.title}),p("span",{className:"sc-alarm-body",children:z.detail})]})]}),ye&&k("div",{className:"sc-alarm sc-alarm-warn",children:[p("span",{className:"sc-alarm-mark","aria-hidden":"true",children:p(vs,{})}),k("span",{className:"sc-alarm-say",children:[p("span",{className:"sc-alarm-title",children:"A large model on this computer"}),k("span",{className:"sc-alarm-body",children:["Your ",ye," model can take all this computer's memory while it answers."]})]})]})]}),C&&q&&!pe&&p(Xo,{machine:C,runs:Te,...B?{onStop:B}:{}}),C&&p(ot,{children:Z.length>0&&!pe&&!(r&&t&&he(C).by!=="app")&&p(Ee,{title:"New on this machine",children:Z.map(w=>p(oa,{runtime:w,...t?{onApprove:()=>t(C.id,w.id)}:{}},w.id))})}),n.length>0&&p(Ee,{title:n.length>1?"Connected plans":"Connected plan",children:n.map(w=>p(da,{credential:w,appName:m,busy:u,...s?{onDisconnect:()=>s(w.provider)}:{}},w.provider))}),ce.length>0&&p(Ee,{title:"Your other machines",children:ce.map(w=>p(sa,{machine:w},w.id))}),!C&&o&&p(Ee,{title:"Your machines",children:k("button",{type:"button",className:"sc-pair",onClick:o,children:[p("span",{className:"sc-otile","aria-hidden":"true",children:p(pa,{})}),p("span",{className:"sc-oname",children:"Connect a machine"})]})}),Q&&k("div",{className:"sc-acts",children:[Ge&&Q?k("div",{className:"sc-acts-row",children:[K?U:p("span",{}),k("button",{type:"button",className:"sc-act-small",onClick:Q.onPress,disabled:u||Q.spin,"data-spin":Q.spin?"true":void 0,children:[Q.spin&&p(ks,{}),Q.label,!Q.spin&&p(lr,{})]})]}):Q&&k("button",{type:"button",className:"sc-act-go",onClick:Q.onPress,disabled:u||Q.spin,"data-spin":Q.spin?"true":void 0,children:[Q.spin&&p(ks,{}),Q.label]}),Me==="absent"&&k("p",{className:"sc-act-miss",children:["Nothing opened here. ",C?j(C):"That machine"," may be a different computer, or the Soba app is not installed on this one."]})]}),S,h&&p("p",{className:"sc-error sc-tray-error",children:h})]})}function Ee({title:e,action:n,children:t}){return k("section",{className:"sc-group",children:[k("div",{className:"sc-group-cap",children:[p("p",{className:"sc-group-title",children:e}),n]}),p("div",{className:"sc-group-card",children:t})]})}function qo({machine:e,onToggle:n,open:t}){let r=hn(e),s=[r?null:e.pairing_lost?"Not connected to Soba":"Soba is asleep",r?Xn(e):null,e.always_on?"always on":null].filter(Boolean),o=r&&e.capacity>0?e.active>0?`${e.active} of ${e.capacity} running`:null:Kn(e.last_seen_at),a=k(ot,{children:[k("span",{className:"sc-mtile","aria-hidden":"true",children:[p(Ns,{}),p("span",{className:`sc-mbadge sc-mbadge-${r?mn(e).tone:e.pairing_lost?"off":"away"}`})]}),k("span",{className:"sc-mid",children:[p("span",{className:"sc-mname",children:j(e)}),k("span",{className:"sc-mmeta",children:[p("span",{className:"sc-mmeta-is",children:s.map((l,i)=>k("span",{children:[i>0&&p("span",{className:"sc-mmeta-sep",children:"\xB7"}),l]},l))}),o&&p("span",{className:"sc-mmeta-now",children:o})]})]})]});return!n||!r?p("div",{className:"sc-mrow",children:a}):k("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,p(En,{open:!!t})]})}function Zo(e,n){return e.filter(t=>t.machine_id===n.id||t.machine_id===null)}function Xo({machine:e,runs:n,onStop:t}){let r=n?Zo(n,e):[],[s,o]=Rt(new Set),a=async i=>{o(c=>new Set(c).add(i));try{await t?.(i)}catch{o(c=>{let u=new Set(c);return u.delete(i),u})}},l=()=>{for(let i of r)a(i.id)};return p(Ee,{title:"Active runs",...t&&r.length>1?{action:p("button",{type:"button",className:"sc-cap-link",onClick:l,children:"Stop all"})}:{},children:n===null?p("p",{className:"sc-row-note",children:"Looking\u2026"}):r.length===0?k("p",{className:"sc-nilrow",children:[p("span",{className:"sc-nilrow-mark","aria-hidden":"true",children:p(_o,{})}),"Nothing running"]}):r.map(i=>p($o,{run:i,stopping:s.has(i.id),...t?{onStop:()=>void a(i.id)}:{}},i.id))})}function Ko(){return k("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:"sc-blank-glyph",children:[p("rect",{x:"3",y:"4.5",width:"18",height:"15",rx:"2.5",fill:"none",stroke:"currentColor",strokeWidth:"1.8"}),p("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 _o(){return k("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:"sc-blank-glyph",children:[p("circle",{cx:"12",cy:"12",r:"9",fill:"none",stroke:"currentColor",strokeWidth:"1.8"}),p("path",{d:"M9 12.5l2.2 2.2L15.5 9.8",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round"})]})}function $o({run:e,stopping:n,onStop:t}){return k("div",{className:"sc-rrow",children:[p("span",{className:n?"sc-rdot":"sc-rdot sc-rdot-live","aria-hidden":"true"}),k("span",{className:"sc-mid",children:[p("span",{className:"sc-rtitle",children:Cs(e)}),p("span",{className:"sc-rstep",children:n?"Stopping\u2026":`${na(e)} \xB7 ${ta(e.started_at)}`})]}),t&&p("button",{type:"button",className:"sc-rstop",onClick:t,disabled:n,"aria-label":`Stop ${Cs(e)}`,children:p("span",{className:"sc-rstop-ring",children:p(ha,{})})})]})}function ea(e){let n=ir(e);return(n?Xe[n.id]:null)??As[e]??null}function Cs(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 na(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 ta(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 ra(){return p("a",{className:"sc-disc sc-open-app",href:_n(),"aria-label":"Open Soba App",title:"Open Soba App",children:p(lr,{})})}function lr(){return p("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:"sc-dglyph",children:p("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 sa({machine:e}){let n=mn(e);return k("div",{className:"sc-orow",children:[p("span",{className:"sc-otile","aria-hidden":"true",children:p(Ns,{})}),p("span",{className:"sc-oname",children:j(e)}),p("span",{className:"sc-oword",children:n.word}),p("span",{className:`sc-dot sc-dot-${n.tone}`,"aria-hidden":"true"})]})}function oa({runtime:e,onApprove:n}){return k("div",{className:"sc-mrow",children:[p("span",{className:"sc-mtile sc-atile","aria-hidden":"true",children:p(Et,{id:e.id,name:e.display_name})}),k("span",{className:"sc-mid",children:[p("span",{className:"sc-mname",children:e.display_name}),p("span",{className:"sc-mmeta",children:e.version??"waiting to be let in"})]}),n?p("button",{type:"button",className:"sc-row-act",onClick:n,children:"Let it serve"}):p("span",{className:"sc-averdict sc-tone-warn",children:"not serving yet"})]})}function cr({id:e,name:n}){return p("span",{className:"sc-runtime-tile","aria-hidden":"true",children:p(Et,{id:e,...n?{name:n}:{}})})}function Et({id:e,name:n}){if(!e)return null;let t=ms[e];if(t)return p("img",{src:t,alt:"",className:"sc-runtime-logo"});let r=ea(e);return r?p(r,{className:"sc-runtime-mark"}):n?p("span",{className:"sc-runtime-letter",children:n.slice(0,1).toUpperCase()}):null}function aa({machine:e,appName:n,busy:t,onPick:r,model:s,onPickModel:o,onApprove:a}){let l=he(e),i=ke(e),c=a?e.runtimes.filter(S=>S.quarantined&&!S.absent):[],[u,m]=Rt(!1),A=jo(null);if(l.by!=="app"&&i.length===0)return null;let g=S=>S?p(cr,{id:S.id,name:S.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,I=!hn(e),E=l.runtime&&He(l.runtime).tone==="warn"?"Signed out":null,T=s?tt([e]).filter(S=>S.kind==="named"?S.runtime===M:S.kind==="size"?!!M&&kt(M):!0):[],V=(()=>{if(!s)return;if(s.kind!=="auto")return s;let S=l.runtime?.default_model;if(!S)return s;let B=fn(S);return{...s,label:B.length>16?B:`${s.label} \xB7 ${B}`}})(),O=l.by==="app"?`Set by ${n??"the app"}`:l.runtime?la(l.runtime):null;return k(ot,{children:[y?k("button",{ref:A,type:"button",className:I?"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:()=>m(S=>!S),children:[p("span",{className:"sc-runs-tile","aria-hidden":"true",children:p(Et,{id:M??null,name:h})}),k("span",{className:"sc-runs-said-name",children:[p("span",{className:"sc-runs-name",children:h}),E&&p("span",{className:"sc-runs-ill",children:E})]}),p(En,{open:!1})]}):k("span",{className:I?"sc-runs-agent sc-runs-fixed sc-runs-dim":"sc-runs-agent sc-runs-fixed",children:[p("span",{className:"sc-runs-tile","aria-hidden":"true",children:p(Et,{id:M??null,name:h})}),k("span",{className:"sc-runs-said-name",children:[p("span",{className:"sc-runs-name",children:h}),E&&p("span",{className:"sc-runs-ill",children:E})]}),l.by==="app"&&k("span",{className:"sc-runs-told",children:["set by ",n??"the app"]})]}),V&&o&&An(T)?k(ot,{children:[p("span",{className:"sc-runs-rule","aria-hidden":"true"}),p(st,{options:T,selected:V,onPick:o,caption:"Model",className:I?"sc-runs-model sc-runs-dim":"sc-runs-model",...t?{disabled:t}:{}})]}):O&&k(ot,{children:[p("span",{className:"sc-runs-rule","aria-hidden":"true"}),k("span",{className:"sc-runs-said",children:[p("span",{className:"sc-runs-key",children:"Model"}),p("span",{className:"sc-runs-val",children:O})]})]}),u&&r&&p(ia,{anchor:A,machine:e,tile:g,waiting:c,...a?{onApprove:a}:{},onClose:()=>m(!1),onPick:S=>{m(!1),r(S)}})]})}function ia({anchor:e,machine:n,tile:t,waiting:r,onApprove:s,onClose:o,onPick:a}){let l=he(n),i=he({...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)},...ke(n).map((m,A)=>{let g=ua(m);return{id:m.id,label:m.display_name,glyph:t(m),...g?{note:g}:{},...A===0?{rule:!0}:{}}}),...s?r.map((m,A)=>({id:`waiting:${m.id}`,label:m.display_name,glyph:t(m),...m.version?{note:m.version}:{},trailing:"Let it serve",onChoose:()=>s(m.id),...A===0?{heading:"New on this machine"}:{}})):[]];return p(nt,{anchor:e,label:"Which agent runs go to",options:u,current:c,onClose:o,onPick:a})}function la(e){let n=He(e);return n.tone==="warn"?n.text:e.default_model?fn(e.default_model):"Automatic"}function ca(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 ua(e){let n=He(e);return n.tone==="warn"?n.text:e.default_model?fn(e.default_model):e.cost_class==="user-hardware"?"In this machine's memory":n.tone!=="ok"?n.text:e.version??void 0}function da({credential:e,appName:n,busy:t,onDisconnect:r}){return k("div",{className:"sc-hrow",children:[k("div",{className:"sc-orow",children:[p("span",{className:"sc-otile","aria-hidden":"true",children:p(bn,{className:"sc-omark"})}),k("span",{className:"sc-mid",children:[p("span",{className:"sc-oname",children:e.provider==="openai-chatgpt"?"ChatGPT plan":e.provider}),p("span",{className:"sc-mmeta",children:e.account_label??"signed in"})]}),r&&p("button",{type:"button",className:"sc-row-act",onClick:r,disabled:t,children:"Disconnect"})]}),r&&k("p",{className:"sc-row-note",children:[n??"This app"," stops using it. To withdraw the grant entirely, remove it in your OpenAI settings."]})]})}function Ns(){return k("svg",{viewBox:"0 0 32 24","aria-hidden":"true",focusable:"false",className:"sc-mglyph",children:[p("rect",{x:"4",y:"1.5",width:"24",height:"15",rx:"2.5",fill:"var(--sc-sheet, #ffffff)",stroke:"currentColor",strokeWidth:"2"}),p("rect",{x:"1",y:"19.5",width:"30",height:"2.5",rx:"1.25",fill:"currentColor"})]})}function pa(){return p("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:"sc-oglyph",children:p("path",{d:"M12 5v14M5 12h14",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"})})}function vs(){return k("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:"sc-hglyph",children:[p("circle",{cx:"12",cy:"12",r:"9",fill:"none",stroke:"currentColor",strokeWidth:"2"}),p("path",{d:"M12 7.5v5.5",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"}),p("circle",{cx:"12",cy:"16.5",r:"1.15",fill:"currentColor"})]})}function ks(){return k("svg",{className:"sc-act-glyph sc-spin",viewBox:"0 0 16 16","aria-hidden":"true",focusable:"false",children:[p("circle",{cx:"8",cy:"8",r:"6.2",fill:"none",stroke:"currentColor",strokeWidth:"2",opacity:"0.3"}),p("path",{d:"M8 1.8a6.2 6.2 0 0 1 6.2 6.2",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"})]})}function ma({spinning:e}){return p("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e?"sc-dglyph sc-spin":"sc-dglyph",children:p("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 ha(){return p("svg",{className:"sc-dglyph",viewBox:"0 0 14 14","aria-hidden":"true",children:p("rect",{x:"2",y:"2",width:"10",height:"10",rx:"2",fill:"currentColor"})})}import{jsx as ga}from"react/jsx-runtime";function ur({machines:e,onApproveRuntime:n,model:t,onPickModel:r}){return ga(yn,{machines:e,...n?{onApproveRuntime:n}:{},...t?{model:t}:{},...r?{onPickModel:r}:{}})}import{useCallback as de,useEffect as fe,useId as ya,useMemo as Ke,useRef as In,useState as Y}from"react";var at=[{slug:"mac-arm",label:"macOS, Apple silicon"},{slug:"mac-intel",label:"macOS, Intel"},{slug:"windows",label:"Windows"},{slug:"linux",label:"Linux"}];function it(e){if(!e)return"";try{return new URL(e).origin}catch{return""}}var xs="soba.connect.choice",fa=180*24*60*60*1e3;function dr(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 pr(e,n){return e?n?`${xs}.${e}.${dr(n)}`:`${xs}.${e}`:null}function mr(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)>fa)return null;let r=ge.find(s=>s.id===t.choice);return r?r.id: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 Ss="soba.connect.model",Aa=180*24*60*60*1e3;function gr(e,n){return e?n?`${Ss}.${e}.${dr(n)}`:`${Ss}.${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)>Aa)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 fr(e,n){if(!(!e||typeof localStorage>"u"))try{localStorage.setItem(e,JSON.stringify({choice:n,at:new Date().toISOString()}))}catch{}}var Ms="soba.connect.dismissed",ba=30*24*60*60*1e3;function Ar(e,n){return e?n?`${Ms}.${e}.${dr(n)}`:`${Ms}.${e}`:null}function br(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)<ba}catch{return!1}}function yr(e){if(!(!e||typeof localStorage>"u"))try{localStorage.setItem(e,JSON.stringify({at:new Date().toISOString()}))}catch{}}import{Fragment as Ln,jsx as d,jsxs as P}from"react/jsx-runtime";var wr=2e3,wa=1e4,Ca=9e4,va=6e4;function Cr(e,n,t,r=[],s){return e?"code":n&&(t.length>0||r.length>0)?"manage":s?"launch":"choose"}function ka(e){let n=Math.max(0,Math.round(e/1e3));return`${Math.floor(n/60)}:${String(n%60).padStart(2,"0")}`}function Nr({client:e,initialCode:n,initialChoice:t,onConnected:r,showStatus:s=!0,initialContext:o=null,initialMachines:a,onClose:l,headingId:i,theme:c,reason:u,active:m=!0}){let A=!!o&&a!==void 0,[g,h]=Y(A?Cr(n,s,a??[],[],t):"loading"),[y,M]=Y(o),[I,E]=Y(a??[]),[T,V]=Y(n??""),[O,S]=Y(null),[B,C]=Y(null),[ce,_]=Y(!1),[Ae,$]=Y(0),[Me,Le]=Y("app"),[ee,Te]=Y(()=>Date.now()),[q,ne]=Y(null),[Nn,Z]=Y(!1),[X,be]=Y(!1),[ye,pe]=Y("browser"),[z,te]=Y(null),[re,Be]=Y([]),[Q,Ge]=Y(0),[K,U]=Y(null),w=In(null),[v,Qe]=Y(t??null),[nn,we]=Y(null),tn=Ke(()=>{let f=y?.accent?.trim(),x=y?.background?.trim();if(!(!f&&!x))return x?{...dn(x,f),background:x,borderRadius:"inherit"}:{"--sc-accent":f,"--sc-accent-fg":Zn(f)}},[y?.accent,y?.background]),wt=ya(),Ce=i??wt,rn=In(null);fe(()=>{if(!e||A)return;let f=!0;return Promise.all([e.context(),e.machines()]).then(([x,H])=>{f&&(M(x),E(H),h(Cr(n,s,H)))}).catch(x=>{f&&(C(x.message),h("choose"))}),()=>{f=!1}},[e,n,s,A]),fe(()=>{g!=="loading"||!A||h(Cr(n,s,a??[]))},[g,A,n,s,a]),fe(()=>{a&&E(a)},[a]),fe(()=>{o&&M(o)},[o]);let je=In(!1),sn=In(g);sn.current=g;let Qn=In(re);Qn.current=re;let on=!!y?.hosted_available;fe(()=>{!s&&sn.current==="manage"&&h("choose")},[s]),fe(()=>{if(!e||!m||g!=="manage")return;let f=!0,x=Se(async()=>{try{let H=await e.machines();if(!f)return;E(H);let J=!on||je.current;H.length===0&&Qn.current.length===0&&J&&sn.current==="manage"&&h("choose")}catch{}},wa,{immediate:!1});return()=>{f=!1,x()}},[g,e,on,m]);let an=pr(y?.publishable_key??null);fe(()=>{we(mr(an))},[an]),fe(()=>{if(!e||!on)return;let f=!0;return e.hosted().then(x=>{f&&(Be(x.credentials),!je.current&&(je.current=!0,x.credentials.length>0&&s&&sn.current==="choose"&&h("manage")))}).catch(()=>{}),()=>{f=!1}},[e,on,s]),fe(()=>{if(!e||!m||g!=="hosted")return;let f=!0,x=async()=>{try{let We=await e.hosted();if(!f)return!1;if(Be(We.credentials),We.credentials.length>0)return h("hosted_connected"),U(null),!0}catch{}return!1},H=async()=>{w.current?.closed&&(w.current=null,!await x()&&f&&h("choose"))},J=Se(x,wr,{immediate:!1}),cn=setInterval(H,400),Re=We=>{let Yn=We.data;Yn?.source==="soba"&&Yn.type==="hosted_result"&&x()};return window.addEventListener("message",Re),()=>{f=!1,J(),clearInterval(cn),window.removeEventListener("message",Re),w.current=null}},[e,g,m]);let Ft=de(()=>{if(!e)return;let f=window.open("","soba-connect-plan","width=520,height=760,noopener=no");w.current=f,h("hosted"),Ge(Date.now()),U(null),C(null),e.startHosted().then(({url:x})=>{if(f&&!f.closed){f.location.href=x;return}U(x)}).catch(x=>{f?.close(),w.current=null,C(x.message),h("choose")})},[e]),xn=de(async f=>{if(e){_(!0);try{await e.disconnectHosted(f),Be((await e.hosted()).credentials)}catch(x){C(x.message)}finally{_(!1)}}},[e]);fe(()=>{if(!e||!m||g!=="waiting")return;let f=!0,x=Se(async()=>{try{let H=await e.machines();if(!f)return;E(H);let J=rn.current;if(!J)return;let cn=H.filter(We=>!J.has(We.id)),Re=cn.find(We=>We.state!=="offline")??cn[0];if(Re){te(Re.id),v&&hr(an,v);let We=ge.find(Jt=>Jt.id===v)?.expects??[],Yn=ke(Re).find(Jt=>We.includes(Jt.id));Yn&&e.preferRuntime(Re.id,Yn.id).catch(()=>{}),h("connected"),r?.(H)}}catch{}},wr,{immediate:!1});return()=>{f=!1,x()}},[g,e,r,v,an,m]);let Ct=de(async()=>{if(e){C(null),_(!0);try{let f=await e.lookup(T);S(f),h("confirm")}catch(f){C(f.message)}finally{_(!1)}}},[e,T]),Vn=de(async()=>{if(e){C(null),_(!0);try{try{rn.current=new Set((await e.machines()).map(f=>f.id))}catch{rn.current=new Set(I.map(f=>f.id))}await e.approve(T),Le("code"),h("waiting"),$(Date.now())}catch(f){C(f.message)}finally{_(!1)}}},[e,T,I]),vt=de(async()=>{if(e){_(!0);try{await e.deny(T),pe("browser"),h("denied")}catch(f){C(f.message)}finally{_(!1)}}},[e,T]),F=Ke(()=>y?.connect_url??null,[y]),[me,Jn]=Y(()=>et()),Qt=Ke(()=>F?$n(F,me??void 0,v??void 0):null,[F,me,v]),N=Ke(()=>it(F),[F]),se=de(f=>{if(I.length===0)return null;let x=ge.find(J=>J.id===f);if(!x)return null;let H=I.flatMap(J=>J.runtimes??[]).filter(J=>x.expects.includes(J.id));return H.length===0?{tone:"dim",text:"not installed"}:H.some(J=>J.authenticated===!0)?{tone:"ok",text:"ready"}:H.every(J=>J.authenticated===!1)?{tone:"warn",text:"needs signing in"}:{tone:"dim",text:"installed"}},[I]),ve=de((f=null)=>{Qe(f),C(null),ne(null),Z(!1),be(!1),Sn.current=!1,Jn(et()),h("launch")},[]),Sn=In(!!t);fe(()=>{g!=="launch"||!F||Sn.current||(Sn.current=!0,Z(!0),$t(F,{...me?{nonce:me}:{},...v?{want:v}:{}}).then(ne))},[g,F,me,v]);let Pe=de(()=>{Z(!0),_t().then(ne)},[]),Vt=de(f=>{if(X){let x=et();be(!1),Jn(x),F&&(f.preventDefault(),window.location.href=$n(F,x??void 0,v??void 0))}Pe()},[X,Pe,F,v]),Ve=Ke(()=>{let f=y?.runtimes;return f?ge.filter(x=>f.includes(x.id)):or()},[y?.runtimes]),ue=Ke(()=>{let f=ge.find(x=>x.id===v);return f?{choice:f,Mark:Xe[f.id]??null}:null},[v]),ln=Ke(()=>I.find(f=>f.id===z),[I,z]);fe(()=>{let f=me;if(!e||!m||g!=="launch"||!f)return;let x=!1,H=Date.now()+15e4,J=()=>{};return J=Se(async()=>{if(Date.now()>H){J(),be(!0);return}try{let cn=await e.claim(f);if(x)return;if(cn.declined){J(),ne(null),pe("machine"),h("denied");return}if(!cn.claimed)return;J();try{rn.current=new Set((await e.machines()).map(Re=>Re.id))}catch{rn.current=new Set(I.map(Re=>Re.id))}Le("app"),h("waiting"),$(Date.now())}catch{}},wr,{immediate:!1,idle:!1}),()=>{x=!0,J()}},[e,g,I,me,m]);let Je=Ke(()=>{if(!O)return null;if(O.approved||O.denied)return"answered";let f=O.expires_at?Date.parse(O.expires_at):Number.NaN;return Number.isFinite(f)&&f<=ee?"expired":"live"},[O,ee]);fe(()=>{if(!(g==="confirm"&&Je==="live"||g==="waiting"||g==="hosted"))return;let x=setInterval(()=>Te(Date.now()),1e3);return()=>clearInterval(x)},[g,Je]);let Ao=de(async(f,x)=>{if(e)try{await e.approveRuntime(f,x),E(await e.machines())}catch(H){C(H.message)}},[e]),bo=de(async(f,x)=>{if(e)try{await e.preferRuntime(f,x),E(await e.machines())}catch(H){C(H.message)}},[e]);return g==="loading"?d("div",{className:"soba-connect",...c?{"data-theme":c}:{},style:tn,children:d("div",{className:"sc-card",children:d("p",{className:"sc-note",children:"Loading\u2026"})})}):P("div",{className:"soba-connect",...c?{"data-theme":c}:{},style:tn,children:[l&&d("button",{type:"button",className:"sc-modal-close",onClick:l,"aria-label":"Close",children:"\xD7"}),g==="manage"&&P("div",{className:"sc-card",children:[d("h2",{className:"sc-title",id:Ce,children:"Your compute"}),P("p",{className:"sc-sub",children:[d(Ot,{context:y})," ",I.length>0&&re.length>0?"runs on your connected plan, and on these machines while they are awake.":re.length>0?"runs on the plan you connected. Nothing here is charged to you.":"runs on these machines, while they are awake."]}),d(yn,{machines:I,hosted:re,onApproveRuntime:Ao,onPreferRuntime:(f,x)=>void bo(f,x),onDisconnectHosted:f=>void xn(f),onPair:()=>h("choose"),busy:ce,...y?.app.name?{appName:y.app.name}:{}}),B&&d("p",{className:"sc-error",children:B})]}),g==="choose"&&P("div",{className:"sc-card",children:[d(xa,{context:y}),d("h2",{className:"sc-h",id:Ce,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."}),F&&Ve.length>0&&P(Ln,{children:[d("div",{className:"sc-opts",children:Ve.map(f=>{let x=Xe[f.id];return P("button",{type:"button",className:"sc-opt",onClick:()=>ve(f.id),children:[d("span",{className:"sc-opt-tile","aria-hidden":"true",children:x&&d(x,{className:"sc-opt-mark"})}),d("span",{className:"sc-opt-text",children:d("span",{className:"sc-opt-label",children:f.label})}),(()=>{let H=se(f.id);return H?d("span",{className:`sc-opt-has sc-opt-has-${H.tone}`,children:H.text}):nn===f.id?d("span",{className:"sc-opt-last",children:"last used"}):d(vr,{className:"sc-opt-go"})})()]},f.id)})}),P("p",{className:"sc-opt-note",children:["Your accounts stay there. ",Ps(y)," never sees them."]})]}),(!F||Ve.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."}),B&&d("p",{className:"sc-error",children:B}),F&&y?.show_code===!0&&d("div",{className:"sc-opt-alt",children:d("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:[d(On,{onClick:()=>h("choose")}),d("p",{className:"sc-head-title",children:"Soba App"})]}),d(Lt,{mark:ue?.Mark??oe,still:X||!Nn&&q===null}),d("h2",{className:"sc-h",id:Ce,children:X?"No answer from this machine":q==="absent"?"Nothing opened":q===null?"Opening Soba App\u2026":"Approve it on this machine"}),X?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."}):q==="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:q===null?"Approve it there and this page does the rest.":"This page finishes on its own."}),ue&&P("p",{className:"sc-prereq",children:[ue.Mark&&d(ue.Mark,{className:"sc-rt-mark"}),"Needs ",ue.choice.prerequisite]}),P("div",{className:"sc-stack",style:{marginTop:18},children:[d("a",{className:q==="absent"||X?"sc-btn sc-btn-primary":"sc-btn",href:Qt??"#",onClick:Vt,children:X?"Try again":q==="absent"?"Open Soba App":"Open it again"}),d("p",{className:"sc-note",children:q===null?"Your browser will ask permission first.":"Your browser asks permission the first time."}),ue&&q==="absent"&&d("p",{className:"sc-note",children:d(Ma,{text:ue.choice.hint})}),P("div",{className:"sc-foot-strip",children:[d("span",{children:"Not installed on this machine?"}),P("button",{type:"button",className:"sc-foot-go",onClick:()=>h("get"),children:["Get it",d(vr,{})]})]})]})]}),g==="get"&&P("div",{className:"sc-card",children:[P("div",{className:"sc-head",children:[d(On,{onClick:()=>h("launch")}),d("p",{className:"sc-head-title",children:"Get Soba App"})]}),d("div",{className:"sc-opts",children:at.map(f=>P("a",{className:"sc-opt",href:`${N}/download/${f.slug}`,target:"_blank",rel:"noreferrer noopener",children:[d("span",{className:"sc-opt-tile","aria-hidden":"true",children:d(sr,{className:"sc-opt-mark"})}),d("span",{className:"sc-opt-text",children:d("span",{className:"sc-opt-label",children:f.label})}),d(vr,{className:"sc-opt-go"})]},f.slug))}),d("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:[d(On,{onClick:()=>h("choose")}),d("p",{className:"sc-head-title",children:"Soba App"})]}),d("h2",{className:"sc-h",id:Ce,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."}),P("form",{className:"sc-stack",style:{marginTop:16},onSubmit:f=>{f.preventDefault(),Ct()},children:[d("input",{className:"sc-input",value:T,onChange:f=>V(f.target.value),placeholder:"ACDE-F234",autoComplete:"off",autoFocus:!0,"aria-label":"Pairing code"}),B&&d("p",{className:"sc-error",children:B}),d("button",{type:"submit",className:"sc-btn sc-btn-primary",disabled:ce||T.length<8,children:ce?"Checking\u2026":"Continue"})]})]}),g==="confirm"&&O&&P("div",{className:"sc-card",children:[P("div",{className:"sc-head",children:[d(On,{onClick:()=>h("code")}),d("p",{className:"sc-head-title",children:"Soba App"})]}),d("h2",{className:"sc-title",children:"Attach this machine to your account?"}),P("p",{className:"sc-sub",children:[d(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:[d(lt,{k:"Code",v:O.user_code}),d(lt,{k:"Machine",v:O.hostname??"not stated"}),d(lt,{k:"System",v:[O.platform,O.arch].filter(Boolean).join(" / ")||"not stated"}),d(lt,{k:"Asked by",v:O.client??"not stated"}),O.labels.length>0&&d(lt,{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."}),Je==="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."}),Je==="answered"&&d("p",{className:"sc-error",children:"That code has already been answered. If it was not you, deny the next one."}),B&&d("p",{className:"sc-error",children:B}),P("div",{className:"sc-row",style:{marginTop:16},children:[d("button",{type:"button",className:"sc-btn sc-btn-primary",onClick:()=>void Vn(),disabled:ce||Je!=="live",children:"Approve"}),d("button",{type:"button",className:"sc-btn",onClick:()=>void vt(),disabled:ce||Je==="answered",children:"No, deny it"})]}),Je==="live"&&O.expires_at&&P("p",{className:"sc-note",style:{marginTop:10},children:["This code expires in ",ka(Date.parse(O.expires_at)-ee),"."]})]}),g==="waiting"&&P("div",{className:"sc-card",children:[P("div",{className:"sc-head",children:[d(On,{onClick:()=>h("choose")}),d("p",{className:"sc-head-title",children:ue?.choice.short??"Soba App"})]}),d(Lt,{mark:ue?.Mark??oe}),d("h2",{className:"sc-h",id:Ce,children:"Approved. Waiting for it to connect"}),d("p",{className:"sc-p",children:"Nothing more to do here. This page changes when it arrives."}),Ae>0&&ee-Ae>Ca&&P("ol",{className:"sc-stall",children:[Me==="app"?P(Ln,{children:[d(Tt,{done:!0,title:"Soba Connect opened",line:"On this machine"}),d(Tt,{done:!0,title:"You approved it",line:"In Soba Connect"})]}):d(Tt,{done:!0,title:"You approved the code",line:"On this page"}),d(Tt,{title:`Still nothing from ${O?.hostname??"that machine"}`,line:"Look at Soba Connect on that machine: it says what it is doing. This keeps watching either way.",children:d("button",{type:"button",className:"sc-btn sc-stall-act",onClick:()=>void gn(),children:"Open Soba Connect"})})]})]}),g==="connected"&&P("div",{className:"sc-card",children:[d(kr,{tone:"ok"}),d("h2",{className:"sc-h",id:Ce,children:ln?.label?`${ln.label} is connected`:"Connected"}),P("p",{className:"sc-p",children:[d(Ot,{context:y})," will use ",ln?.label?"it":"this machine"," from now on, while it is awake."]}),s&&P(Ln,{children:[ln&&d(Sa,{machine:ln}),d("button",{type:"button",className:"sc-btn sc-btn-primary 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:[d(On,{onClick:()=>h("choose")}),d("p",{className:"sc-head-title",children:"ChatGPT"})]}),K?d(Lt,{mark:bn,still:!0}):d(Lt,{mark:bn}),d("h2",{className:"sc-h",id:Ce,children:K?"Your browser blocked the window":"Finish signing in to ChatGPT"}),d("p",{className:"sc-p",children:K?"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:[K&&d("a",{className:"sc-btn sc-btn-primary",href:K,target:"soba-connect-plan",rel:"noreferrer",children:"Open the ChatGPT sign-in"}),B&&d("p",{className:"sc-error",children:B}),Q>0&&ee-Q>va&&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"&&P("div",{className:"sc-card",children:[d(kr,{tone:"ok"}),d("h2",{className:"sc-h",id:Ce,children:"ChatGPT is connected"}),P("p",{className:"sc-p",children:[d(Ot,{context:y})," will run on your ChatGPT plan",re[0]?.account_label?` (${re[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."}),s&&P(Ln,{children:[d("button",{type:"button",className:"sc-btn sc-btn-wide",style:{marginTop:16},onClick:()=>h("manage"),children:"Done"}),d("div",{className:"sc-opt-alt",children:d("button",{type:"button",className:"sc-alt-link",onClick:()=>h("choose"),children:"Connect a machine too"})})]})]}),g==="denied"&&P("div",{className:"sc-card",children:[d(kr,{tone:"off"}),d("h2",{className:"sc-h",id:Ce,children:"Declined"}),d("p",{className:"sc-p",children:ye==="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:()=>h("choose"),children:"Back to the start"})]})]})}function Ps(e){return e?.app.name??"this app"}function Na(e){let n=e?.app.icon_urls;if(n?.length)return n;let t=e?.app.icon_url;return t?[t]:[]}function Rs(e){let n=Na(e),[t,r]=Y([]),s=de(l=>{l&&r(i=>i.includes(l)?i:[...i,l])},[]),o=de(l=>s(l.currentTarget.getAttribute("src")),[s]),a=de(l=>{l?.complete&&l.naturalWidth===0&&s(l.getAttribute("src"))},[s]);return{icon:n.find(l=>!t.includes(l)),onError:o,ref:a}}function xa({context:e}){let{icon:n,onError:t,ref:r}=Rs(e);return e?.app.mark==="soba"?d(oe,{className:"sc-app-mark"}):n?d("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}=Rs(e),s=e?.app.mark==="soba";return P("span",{className:"sc-app",children:[s&&d(oe,{className:"sc-app-icon"}),!s&&n&&d("img",{className:"sc-app-icon",src:n,alt:"",ref:r,onError:t}),Ps(e)]})}function On({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 vr({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 Lt({mark:e,still:n}){return P("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 kr({tone:e}){return d("span",{className:`sc-result sc-result-${e}`,"aria-hidden":"true",children:d(qe,{kind:e==="ok"?"snap":"gone",size:84})})}function Sa({machine:e}){let{runtime:n}=he(e);if(!n)return null;let t=He(n);return P("div",{className:"sc-arrived",children:[d(cr,{id:n.id,name:n.display_name}),d("span",{className:"sc-arrived-name",children:n.display_name}),P("span",{className:`sc-arrived-auth${t.tone==="warn"?" sc-tone-warn":""}`,children:[t.tone==="ok"&&d("i",{className:"sc-arrived-dot","aria-hidden":"true"}),t.tone==="ok"?"Signed in":t.tone==="warn"?"Signed out":"Could not tell"]})]})}function Tt({done:e,title:n,line:t,children:r}){return P("li",{className:"sc-stall-step",children:[P("svg",{viewBox:"0 0 20 20",className:e?"sc-stall-ok":"sc-stall-open","aria-hidden":"true",children:[d("circle",{cx:"10",cy:"10",r:"9"}),e?d("path",{d:"M6 10.3 8.7 13 14 7.5"}):P(Ln,{children:[d("path",{d:"M10 5.5v5.5"}),d("circle",{className:"sc-stall-pt",cx:"10",cy:"14.3",r:"1.2"})]})]}),d("span",{className:"sc-stall-title",children:n}),d("span",{className:"sc-stall-line",children:t}),r&&d("span",{className:"sc-stall-more",children:r})]})}function Ma({text:e}){return d(Ln,{children:e.split("`").map((n,t)=>t%2===1?d("code",{className:"sc-inline-code",children:n},t):n)})}function lt({k:e,v:n}){return P("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 xr,jsxs as Sr}from"react/jsx-runtime";var Mr=Pa(function({machine:n,className:t,...r},s){if(!n)return null;let{ariaLabel:o,state:a}=Rn(n);return Sr("button",{ref:s,type:"button","aria-label":o,className:["sc-btn","sc-btn-connected",t].filter(Boolean).join(" "),...r,children:[xr("span",{className:"sc-pill-tile","aria-hidden":"true",children:xr(qe,{kind:a.tone==="busy"?"serving":a.tone==="ok"?"ready":n.pairing_lost?"gone":"paused",size:16,className:"sc-pill-mark"})}),Sr("span",{className:"sc-btn-connected-text",children:[a.word,!n.pairing_lost&&Sr("span",{className:"sc-btn-connected-where",children:[" on ",j(n)]})]}),xr("i",{className:`sc-dot sc-dot-${a.tone}`,"aria-hidden":"true"})]})});import{useEffect as Ra,useRef as Rr}from"react";var Bt=0,Pr=null;function Es(){if(typeof document>"u")return()=>{};Bt===0&&(Pr=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=Pr??"",Pr=null))}}import{jsx as Is}from"react/jsx-runtime";function ct({open:e,onClose:n,labelledBy:t,theme:r,style:s,children:o}){let a=Rr(null),l=Rr(null),i=Rr(null);return Ra(()=>{let c=a.current;if(c){if(!e){c.open&&c.close();return}return c.open||c.showModal(),document.activeElement===c&&l.current?.focus(),Es()}},[e]),Is("dialog",{ref:a,className:"soba-connect sc-modal","aria-labelledby":t,...r?{"data-theme":r}:{},style:s,onCancel:c=>{c.preventDefault(),n()},onPointerDown:c=>{i.current=c.target},onClick:c=>{c.target===c.currentTarget&&i.current===c.currentTarget&&n()},children:Is("div",{className:"sc-modal-sheet",ref:l,tabIndex:-1,children:o})})}import{useEffect as Er,useRef as Ea}from"react";import{jsx as Ia}from"react/jsx-runtime";var wn=8;function Ir({open:e,onClose:n,anchor:t,label:r,theme:s,style:o,children:a}){let l=Ea(null);return Er(()=>{let i=l.current;if(!(!i||!(typeof i.showPopover=="function")))try{e?i.showPopover():i.hidePopover()}catch{}},[e]),Er(()=>{if(!e)return;let i=()=>{let u=l.current,m=t.current;if(!u||!m)return;let A=m.getBoundingClientRect(),g=u.offsetWidth,h=u.offsetHeight,y=window.innerWidth-g-wn,M=Math.max(wn,Math.min(A.right-g,Math.max(wn,y))),I=A.bottom+wn,E=A.top-wn-h,T=I+h>window.innerHeight-wn&&E>wn?E:I;u.style.left=`${Math.round(M)}px`,u.style.top=`${Math.round(T)}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]),Er(()=>{if(!e)return;let i=u=>{u.key==="Escape"&&n()},c=u=>{let m=u.target;m&&(l.current?.contains(m)||t.current?.contains(m)||n())};return document.addEventListener("keydown",i),document.addEventListener("pointerdown",c,!0),()=>{document.removeEventListener("keydown",i),document.removeEventListener("pointerdown",c,!0)}},[e,n,t]),Ia("div",{ref:l,role:"dialog","aria-label":r,className:"soba-connect sc-pop",...s?{"data-theme":s}:{},popover:"manual",hidden:!e,style:o,children:a})}var ut=new Map,Tn=new Map,Os=!1;function Oa(){Os||typeof window>"u"||(Os=!0,window.addEventListener("storage",e=>{!e.key||!ut.has(e.key)||(Tn.set(e.key,It(e.key)),Or(e.key))}))}function Or(e){for(let n of ut.get(e)??[])n()}function dt(e){return e??""}function Lr(e,n){let t=dt(e);Oa();let r=ut.get(t)??new Set;return r.add(n),ut.set(t,r),()=>{r.delete(n),r.size===0&&ut.delete(t)}}function Gt(e){let n=dt(e),t=Tn.get(n);if(t!==void 0)return t;let r=e?It(e):null;return Tn.set(n,r),r}function Tr(){return null}function Br(e,n){Gt(e)===null&&(Tn.set(dt(e),n),Or(dt(e)))}function Gr(e,n){let t=dt(e);Tn.get(t)!==n&&(Tn.set(t,n),fr(e,n),Or(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?`${Ta(e.includedUnits)} ${n} a month once you connect`:e.reward==="credit"&&e.creditMicros>0?`${La(e.creditMicros)} back each month you stay connected`:null}function ze(e){return e==="unlimited"||e==="included"}var Ts=new Set(["user-hardware","user-subscription"]),Ls=new Set(["open-weights","frontier"]);function Ie(e){return e===null||e.length===0?!1:e.every(n=>Ts.has(n))}var La=e=>(e/1e6).toLocaleString("en-US",{style:"currency",currency:"USD",minimumFractionDigits:2,maximumFractionDigits:2}),Ta=e=>e.toLocaleString("en-US");function Wr(e,n){if(!(n===null||n.some(o=>Ls.has(o))))return!1;let r=e.findIndex(o=>Ts.has(o));if(r===-1)return!1;let s=e.findIndex(o=>Ls.has(o));return s===-1||r<s}import{createContext as Bs,useContext as Gs}from"react";var Hr=Bs(null);function Bn(){return Gs(Hr)}var Dr=Bs({context:null,machines:void 0,theme:"light"});function G(){return Gs(Dr)}import{useMemo as Wa}from"react";import{createContext as Ba,useContext as Ga}from"react";var Ur=Ba(null);function D(){let e=Ga(Ur);if(!e)throw new Error("useSoba() must be used inside a <SobaProvider>.");return e}function pt(){let{compute:e}=D();return Wa(()=>{let n=e.machines,t=[...n].sort((o,a)=>De([o,a])===o?-1:1).map(Ha),r=De([...n]),s=pn(n);return{view:t.length?"machines":e.loading?"loading":e.error?"error":"empty",machines:t,primary:r?t.find(o=>o.machine.id===r.id)??null:null,connected:e.connected,online:e.online,stalled:e.connected&&!e.online&&s?t.find(o=>o.machine.id===s.id)??null:null,loading:e.loading,error:e.error,refresh:e.refresh}},[e])}function Ha(e){let n=he(e);return{machine:e,name:j(e),state:mn(e),status:Zt(e),hardware:Xn(e),lastSeen:e.state==="offline"?Kn(e.last_seen_at):null,runtimes:ke(e).map(t=>({runtime:t,name:t.display_name,auth:He(t),quarantined:!!t.quarantined})),runsOn:{by:n.by,name:n.runtime?.display_name??null}}}import{useCallback as Fr,useEffect as Da,useMemo as Qr,useSyncExternalStore as Ua}from"react";function Cn(e={}){let{compute:n,connect:t}=D(),{value:r,onChange:s,defaultValue:o,remember:a=!0,user:l}=e,i=r!==void 0,c=a&&!i?gr(t.publishableKey,l):null,u=Fr(E=>Lr(c,E),[c]),m=Ua(u,Fr(()=>Gt(c),[c]),Tr),A=Qr(()=>tt(n.machines),[n.machines]),g=Qr(()=>rt(A),[A]);Da(()=>{i||!o||Br(c,o)},[i,o,c]);let h=i?r:m??o??null,{selected:y,unavailable:M}=Qr(()=>tr(A,h??null),[A,h]),I=Fr(E=>{i||Gr(c,E),s?.(E)},[i,c,s]);return{options:A,groups:g,selected:y,select:I,run:rr(y),unavailable:M,pickable:An(A),loading:n.loading&&!n.machines.length}}import{jsx as mt}from"react/jsx-runtime";function Fa({className:e}){let{theme:n}=G(),t=e?`soba-connect ${e}`:"soba-connect";return mt("div",{className:t,"data-theme":n,children:mt(Vr,{})})}function Vr(){let e=pt(),n=Cn();return e.view==="loading"?mt("p",{className:"sc-note",children:"Loading\u2026"}):e.view==="error"?mt("p",{className:"sc-error",children:e.error?.message}):mt(ur,{machines:e.machines.map(t=>t.machine),model:n.selected,onPickModel:n.select})}import{useCallback as gt,useEffect as jr,useMemo as Za,useRef as qr,useState as Wn}from"react";import{useId as Qa}from"react";import{jsx as Gn,jsxs as Wt}from"react/jsx-runtime";function ht({open:e,onOpenChange:n,initialCode:t,onConnected:r,showStatus:s,reason:o}){let{error:a}=D(),l=Bn(),i=G(),c=()=>n(!1),u=Qa(),m=i.context?.background?.trim(),A=m?dn(m,i.context?.accent):void 0;return Wt(ct,{open:e,onClose:c,labelledBy:u,theme:i.theme,style:A,children:[a?Wt("div",{className:"sc-card",children:[Gn("h2",{className:"sc-title",id:u,children:"Could not start"}),Gn("p",{className:"sc-error",children:a.message})]}):!l&&!i.context?Wt("div",{className:"sc-card",children:[Gn("h2",{className:"sc-title",id:u,children:"One moment"}),Gn("p",{className:"sc-note",children:"Getting your compute\u2026"})]}):Gn(Nr,{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}:{},...s===void 0?{}:{showStatus:s},...o?{reason:o}:{}}),Wt("p",{className:"sc-modal-foot",children:[Gn(oe,{className:"sc-foot-mark"}),"Secured by Soba"]})]})}import{forwardRef as Va}from"react";import{jsx as Ja}from"react/jsx-runtime";var Jr=Va(function(n,t){let{theme:r}=G();return Ja(Mr,{ref:t,"data-theme":r,...n})});import{useCallback as Ya}from"react";function za(){let{connect:e}=D(),n=pt(),t=Ya(()=>e.open("manual"),[e]);return{...Rn(n.primary?.machine??null),machine:n.primary,open:t,canOpen:e.hasModal,loading:n.view==="loading"}}function Yr(e){return Rn(e)}import{useCallback as Ws,useEffect as ja,useState as qa}from"react";function zr({enabled:e=!0,intervalMs:n=3e3}={}){let t=Bn(),[r,s]=qa(null),o=Ws(async()=>{t&&s(await t.runs())},[t]);ja(()=>{if(!e||!t)return;let l=!0,i=Se(async()=>{let c=await t.runs();l&&s(c)},n);return()=>{l=!1,i()}},[e,t,n]);let a=Ws(async l=>{if(!t)throw new Error("Stopping a run needs <SobaProvider>.");await t.stopRun(l),await o().catch(()=>{})},[t,o]);return{runs:r,refresh:o,stop:a}}import{Fragment as Hs,jsx as Hn,jsxs as Ds}from"react/jsx-runtime";function vn({children:e,variant:n,className:t,initialCode:r,onConnected:s,defaultOpen:o,open:a,onOpenChange:l,showConnected:i=!0}){let{compute:c,connect:u}=D(),m=G(),{theme:A}=m,g=Bn(),[h,y]=Wn(o??!!r),M=qr(null),I=a!==void 0,E=!I&&!o&&!r&&u.hasModal,T=I?a:E?u.isOpen:h,V=w=>{E?w?u.open("manual"):u.close():I||y(w),l?.(w)},O=qr(T);jr(()=>{O.current&&!T&&M.current?.focus(),O.current=T},[T]);let[S,B]=Wn(!1),{runs:C,stop:ce}=zr({enabled:S}),_=Cn(),Ae=Za(()=>S&&C?Xa(c.machines,C):c.machines,[c.machines,S,C]),$=De(Ae),Me=i&&Yr($).connected,Le=gt(()=>B(!1),[]),[ee,Te]=Wn(!1),q=gt(async()=>{Te(!0);try{await c.refresh()}finally{Te(!1)}},[c]),ne=qr(q);ne.current=q,jr(()=>{S&&ne.current()},[S]);let[Nn,Z]=Wn(!1),[X,be]=Wn([]),ye=!!m.context?.hosted_available;jr(()=>{if(!S||!g||!ye)return;let w=!0;return g.hosted().then(v=>{w&&be(v.credentials)}).catch(()=>{}),()=>{w=!1}},[S,g,ye]);let[pe,z]=Wn(null),te=gt(async(w,v)=>{if(g){z(null);try{await g.approveRuntime(w,v),await c.refresh()}catch(Qe){z(Qe.message)}}},[g,c]),re=gt(async(w,v)=>{if(g){z(null);try{await g.preferRuntime(w,v),await c.refresh()}catch(Qe){z(Qe.message)}}},[g,c]),Be=gt(async w=>{if(g){z(null);try{await g.disconnectHosted(w),be((await g.hosted()).credentials)}catch(v){z(v.message)}}},[g]),Q=m.context?.background?.trim(),Ge=Q?dn(Q,m.context?.accent):void 0,K=Me&&!e,U=()=>{if(K&&!I&&!o&&!r){B(w=>!w);return}V(!0)};return Ds(Hs,{children:[K?Hn(Jr,{ref:M,machine:$,"aria-haspopup":"dialog","aria-expanded":S,onClick:U,...t?{className:t}:{}}):Hn("button",{ref:M,type:"button","data-theme":A,className:["sc-btn","sc-btn-icon",n==="primary"?"sc-btn-primary":"",t].filter(Boolean).join(" "),onClick:U,children:e??Ds(Hs,{children:[Hn(oe,{className:"sc-btn-mark"}),"Connect compute"]})}),Hn(Ir,{open:S,onClose:Le,anchor:M,label:"Your compute",theme:A,...Ge?{style:Ge}:{},children:Hn(yn,{machines:Ae,hosted:X,onApproveRuntime:(w,v)=>void te(w,v),onPreferRuntime:(w,v)=>void re(w,v),onDisconnectHosted:w=>void Be(w),onRefresh:()=>void q(),refreshing:ee,model:_.selected,onPickModel:_.select,error:pe,runs:C,onStopRun:async w=>{z(null);try{await ce(w)}catch(v){throw z(v.message),v}},onPair:()=>{B(!1),E?u.open("pair"):(Z(!0),V(!0))},...m.context?.app.name?{appName:m.context.app.name}:{}})}),!E&&Hn(ht,{open:T,onOpenChange:w=>{w||Z(!1),V(w)},...Nn?{showStatus:!1}:{},...r?{initialCode:r}:{},...s?{onConnected:s}:{}})]})}function Xa(e,n){return e.map(t=>{if(t.state==="offline")return t;let r=n.filter(s=>s.machine_id===t.id).length;return{...t,active:r,state:r>0?"busy":"online"}})}import{jsx as Zr,jsxs as _a}from"react/jsx-runtime";function Ka({initialCode:e,onConnected:n,className:t,showStatus:r=!0}){let{theme:s}=G();return _a("div",{className:t?`soba-connect ${t}`:"soba-connect","data-theme":s,children:[r&&Zr(Vr,{}),Zr("div",{className:"sc-compute-act",children:Zr(vn,{...e?{initialCode:e}:{},...n?{onConnected:n}:{}})})]})}import{useId as ui,useState as di}from"react";import{useCallback as Kr,useEffect as Js,useState as Ys}from"react";import{useCallback as $a,useState as ei}from"react";function ft(){let[e,n]=ei(null);return{open:$a(()=>{n(null),gn().then(n)},[]),launch:e,note:e==="absent"?"Nothing opened here. That machine may be a different computer, or asleep.":null}}import{useCallback as Us,useMemo as Fs}from"react";function kn(e){if(!e)return null;if(typeof e=="string")return e;if(typeof Response<"u"&&e instanceof Response)return Qs(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"?Qs(n.status):n.cause&&n.cause!==e?kn(n.cause):null}function Qs(e){return e===402?"payment_required":e===409?"no_compute":null}function Xr(...e){let[n,t]=e,{plan:r,compute:s,connect:o}=D(),a=t?.predict??e.length===0,l=ti(ni(n),s)??(a?ri(r,s):null),i=r.plan,c=r.plans,u=Fs(()=>{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]),m=Us(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=o.open,g=Us(()=>{l&&A(l)},[A,l]);return Fs(()=>{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,...si(l,{connectOffer:y,connected:s.connected,online:s.online,machine:pn(s.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:m}},[l,i,s,u,g,m,r.current?.period_end])}function ni(e){let n=kn(e);return n==="payment_required"||n==="no_compute"?n:null}function ti(e,n){return e==="no_compute"&&n.connected&&n.online?null:e}function ri(e,n){let t=e.plan;return!t||n.loading?null:Ie(t.route_allow)&&!n.online?"no_compute":e.remaining===0&&t.overage==="stop"?"payment_required":null}function si(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 ${Vs(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 ${Vs(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 Vs(e){let n=new Date(e);return Number.isNaN(n.getTime())?e:n.toLocaleDateString(void 0,{day:"numeric",month:"long"})}function oi(e){let{plan:n,allowance:t,connected:r,online:s,quiet:o,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(s)return null;let y=Ie(u);return{reason:"stalled",title:`${o??"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 m=kn(a),A=m==="payment_required"||m==="no_compute",g=n.ask_to_connect!==!1&&Wr(n.route_prefer,u);if(!l&&!A&&!g)return null;let h=Ie(u)?ai(n.unit,Ie(n.route_allow)):ze(n.connected_reward)?li(t,n,i):g?ii(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 _r(e={}){let{at:n=.25,error:t,allow:r}=e,s=e.predict??!(e.errorGiven??t!==void 0),{plan:o,compute:a,connect:l}=D(),i=Ar(l.publishableKey),[c,u]=Ys(!1);Js(()=>{u(br(i))},[i]);let m=Kr(()=>{u(!0),yr(i)},[i]),A=Kr(()=>l.open("manual"),[l]),g=Kr(()=>l.open("no_compute"),[l]),h=ft(),[y,M]=Ys(!1),{refresh:I}=a,{launch:E}=h;Js(()=>{if(E===null||E==="absent")return;M(!1);let B=setInterval(()=>void I(),3e3),C=setTimeout(()=>{clearInterval(B),M(!0)},2e4);return()=>{clearInterval(B),clearTimeout(C)}},[E,I]);let T=ci(l.app?.name,it(l.connectUrl)),V=o.loading||a.loading,O=pn(a.machines),S=V?null:oi({plan:o.plan,allowance:{remaining:o.remaining,included:o.included},connected:a.connected,online:a.online,quiet:O?j(O):null,error:t,predict:s,...r!==void 0?{allow:r}:{},at:n,waved:c});return{reason:S?.reason??null,visible:S!==null,title:S?.title??null,detail:S?.detail??null,meter:S?.meter??null,dismissible:S?.dismissible??!1,dismissed:c,dismiss:m,open:A,atTheWall:S?.atTheWall??!1,steps:T,stalled:S?.reason==="stalled"?{machine:O?j(O):null,ownCompute:S.ownCompute,wake:h.open,launch:h.launch,note:h.note,stuck:y,connectAnother:g}:null,loading:V}}function ai(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 ii(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 li(e,n,t){let{remaining:r,included:s}=e;if(r===null||s===null||s===0||r>Math.ceil(s*t))return null;let o=Ye({unit:n.unit,reward:n.connected_reward,includedUnits:n.connected_included_units,creditMicros:n.connected_credit*1e6});return o?{reason:"running",title:r===0?`No ${n.unit}s left this month.`:`${r} ${n.unit}${r===1?"":"s"} left this month.`,detail:`${o}.`,meter:{left:r,of:s}}:null}function ci(e,n){return[{lead:"Download Soba App",detail:"",...n?{linksLead:"Get it for"}:{},links:n?at.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:ge.map(t=>({label:t.short,href:t.install}))}]}import{Fragment as js,jsx as L,jsxs as _e}from"react/jsx-runtime";function pi(e){let{className:n,fallback:t=null}=e,r=_r({...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:s}=D(),{theme:o}=G(),[a,l]=di(null),i=ui(),c=L(js,{children:t});if(!r.visible)return c;if(r.stalled)return L(zs,{className:n,theme:o,stalled:!0,children:L(mi,{title:r.title??"",detail:r.detail??"",stalled:r.stalled})});let u=a??r.atTheWall;return _e(zs,{className:n,theme:o,children:[_e("div",{className:"sc-nudge-top",children:[_e("div",{className:"sc-nudge-say",children:[L("p",{className:"sc-nudge-title",children:r.title}),L("p",{className:"sc-nudge-detail",children:r.detail}),_e("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(gi,{})]})]}),r.dismissible?L("button",{type:"button",className:"sc-nudge-dismiss","aria-label":"Dismiss",title:"Dismiss",onClick:r.dismiss,children:L(hi,{})}):null]}),u?L("ol",{className:"sc-nudge-steps",id:i,children:r.steps.map(m=>_e("li",{children:[m.opens?L("button",{type:"button",className:"sc-step-lead",onClick:()=>s.open("manual"),children:m.lead}):L("strong",{children:m.lead}),m.detail?L("span",{children:m.detail}):null,m.links.length>0?_e("span",{className:"sc-step-links",children:[m.linksLead,m.links.map(A=>L("a",{href:A.href,target:"_blank",rel:"noreferrer noopener",children:A.label},A.href))]}):null]},m.lead))}):null,L(vn,{variant:"primary"})]})}function zs({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 mi({title:e,detail:n,stalled:t}){return _e(js,{children:[L("div",{className:"sc-nudge-top",children:_e("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 hi(){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 gi(){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 fi=new Set(["delta","thinking","status","done","error"]);function Dn(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 s=r;if(typeof s.type!="string"||!fi.has(s.type))return null;let o={type:s.type};return typeof s.text=="string"&&(o.text=s.text),typeof s.message=="string"&&(o.message=s.message),typeof s.tool=="string"&&(o.tool=s.tool),typeof s.tier=="string"&&(o.tier=s.tier),s.usage&&typeof s.usage=="object"&&(o.usage=s.usage),typeof s.session=="string"&&(o.session=s.session),typeof s.toolInput=="string"&&(o.toolInput=s.toolInput),s.git&&typeof s.git=="object"&&(o.git=s.git),s.turn&&typeof s.turn=="object"&&typeof s.turn.text=="string"&&(o.turn={text:s.turn.text}),typeof s.reason=="string"&&(o.reason=s.reason),typeof s.retryable=="boolean"&&(o.retryable=s.retryable),(s.state==="interrupted"||s.state==="resumed")&&(o.state=s.state),o}async function*$r(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(),s=new TextDecoder,o="",a=[];try{for(;;){let i=await r.read();if(i.done)break;for(o+=s.decode(i.value,{stream:!0});;){let c=o.indexOf(`
|
|
3
|
-
`);if(
|
|
4
|
-
`);if(
|
|
5
|
-
`);if(
|
|
2
|
+
var Zt={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 Xt="105 162 420 420",Kt="M407.1 308.9 A158 158 0 1 0 407.1 491.1 A116 116 0 0 1 407.1 308.9 Z",hn="M448.5 320 A110 110 0 0 1 448.5 480";import{Fragment as qn,jsx as S,jsxs as Xe}from"react/jsx-runtime";function Ze({kind:e,size:n=44,className:t}){let r=Zt[e];return Xe("svg",{className:`bx${t?` ${t}`:""}`,"data-expression":e,viewBox:Xt,overflow:"visible",width:n,height:n,"aria-hidden":"true",children:[S("path",{d:Kt,fill:"currentColor"}),S("path",{className:"bx-arc",d:hn,fill:"none",stroke:"currentColor",strokeWidth:17,strokeLinecap:"round"}),r.slot==="stream"&&S(Io,{}),r.slot==="zzz"&&S(Oo,{}),r.slot==="dots"&&S(Lo,{}),r.slot==="bang"&&S(To,{}),r.slot==="orbit"&&S(Bo,{}),r.slot==="cross"&&S(Go,{}),r.slot==="snap"&&S(Wo,{}),r.slot==="bars"&&S(Ho,{}),r.slot==="ring"&&S(Do,{}),r.slot==="sparks"&&S(Uo,{})]})}function Io(){return S("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 Oo(){return Xe(qn,{children:[S("g",{className:"bx-z1",children:S("path",{d:"M444 372 H496 L444 436 H496",fill:"none",stroke:"currentColor",strokeWidth:"20",strokeLinecap:"round",strokeLinejoin:"round"})}),S("g",{className:"bx-z2",children:S("path",{d:"M492 300 H522 L492 338 H522",fill:"none",stroke:"currentColor",strokeWidth:"15",strokeLinecap:"round",strokeLinejoin:"round"})})]})}function Lo(){return Xe(qn,{children:[S("circle",{className:"bx-th",cx:"463.1",cy:"336.9",r:"21",fill:"currentColor"}),S("circle",{className:"bx-th bx-th2",cx:"483",cy:"400",r:"21",fill:"currentColor"}),S("circle",{className:"bx-th bx-th3",cx:"463.1",cy:"463.1",r:"21",fill:"currentColor"})]})}function To(){return Xe("g",{className:"bx-at",children:[S("line",{x1:"490",y1:"312",x2:"490",y2:"414",stroke:"currentColor",strokeWidth:"46",strokeLinecap:"round"}),S("circle",{cx:"490",cy:"484",r:"28",fill:"currentColor"})]})}function Bo(){return Xe("g",{className:"bx-ob",children:[S("path",{d:hn,fill:"none",stroke:"var(--tile-bg, transparent)",strokeWidth:41,strokeLinecap:"round"}),S("path",{d:hn,fill:"none",stroke:"currentColor",strokeWidth:17,strokeLinecap:"round"})]})}function Go(){return Xe(qn,{children:[S("path",{className:"bx-xa",d:hn,fill:"none",stroke:"currentColor",strokeWidth:17,strokeLinecap:"round"}),S("g",{className:"bx-xx",children:S("path",{d:"M442 364 L514 436 M514 364 L442 436",fill:"none",stroke:"currentColor",strokeWidth:"24",strokeLinecap:"round"})})]})}function Wo(){return S("path",{className:"bx-snap",d:hn,fill:"none",stroke:"currentColor",strokeWidth:17,strokeLinecap:"round"})}function Ho(){return Xe("g",{stroke:"currentColor",strokeWidth:"17",strokeLinecap:"round",children:[S("line",{className:"bx-vb",x1:"452",y1:"370",x2:"452",y2:"430"}),S("line",{className:"bx-vb bx-vb2",x1:"482",y1:"330",x2:"482",y2:"470"}),S("line",{className:"bx-vb bx-vb3",x1:"512",y1:"355",x2:"512",y2:"445"})]})}function Do(){return S(qn,{children:[[450,366],[474,376],[484,400],[474,424],[450,434],[426,424],[416,400],[426,376]].map(([n,t],r)=>S("circle",{className:"bx-w",cx:n,cy:t,r:"11",fill:"currentColor",style:{animationDelay:`${-1.2+r*.15}s`}},r))})}function Uo(){return Xe(qn,{children:[S("g",{className:"bx-sp",children:S("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"})}),S("g",{className:"bx-sp bx-sp2",children:S("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"})}),S("g",{className:"bx-sp bx-sp3",children:S("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 ws={"claude-code":{small:"haiku",large:"opus"}};function Cs(e){return e==="small"||e==="large"}function vs(e,n){return ws[e]?.[n]}function Mt(e){let n=ws[e];return!!(n?.small||n?.large)}import{useEffect as la,useRef as ca,useState as at}from"react";var Pn=class extends Error{status;constructor(n,t){super(n),this.name="ConnectError",this.status=t}},Fo=5*6e4,Zn=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(a){if(a instanceof Pn&&a.status===401)throw a;this.gatewayBackUntil=Date.now()+Fo}if(r??=await this.request("GET",`/v1/machines${t}`),r.unchanged&&n)return n.machines;let s=Array.isArray(r.machines)?r.machines:[];return this.lastMachines=typeof r.version=="string"?{version:r.version,machines:s}:null,s}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 Pn("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 s=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)}:{}}),a={};try{a=await s.json()}catch{}if(!s.ok){let i=typeof a.error=="string"?a.error:`Request failed (${s.status})`;throw new Pn(i,s.status)}return a}};function Xn(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(a=>a+a).join(""):n[1],r=a=>{let i=Number.parseInt(t.slice(a*2,a*2+2),16)/255;return i<=.04045?i/12.92:((i+.055)/1.055)**2.4};return .2126*r(0)+.7152*r(1)+.0722*r(2)>.45?"#101012":"#ffffff"}function _t(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 Rn(e,n,t){let r=_t(e),s=_t(n);return!r||!s?e:`#${r.map((i,c)=>Math.round(i+(s[c]-i)*t)).map(i=>i.toString(16).padStart(2,"0")).join("")}`}function gn(e,n){if(!_t(e))return{};let t=Xn(e),r=n?.trim();return{"--sc-ground":e,"--sc-shell":e,"--sc-sheet":Rn(e,t,.07),"--sc-raised":Rn(e,t,.13),"--sc-line":Rn(e,t,.18),"--sc-line-2":Rn(e,t,.28),"--sc-text":t,"--sc-text-2":Rn(t,e,.15),"--sc-muted":Rn(t,e,.38),...r?{"--sc-accent":r,"--sc-accent-fg":Xn(r)}:{"--sc-accent":t,"--sc-accent-fg":e}}}function De(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 Kn(e){let{platform:n,arch:t}=e;if(!n)return null;let r=n==="darwin"||n==="macos",s=r?"Mac":n==="win32"||n==="windows"?"Windows PC":"Linux machine";return r?`${t==="aarch64"||t==="arm64"?"Apple silicon ":""}${s}`:s}function fn(e){return e.find(n=>n.state==="offline")??null}function $t(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 q(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 St(e,n){let t=s=>s.state==="busy"?0:s.state==="online"?1:2,r=s=>s.last_seen_at?Date.parse(s.last_seen_at):0;return t(e)-t(n)||r(n)-r(e)}function Ue(e){return[...e].sort(St)[0]??null}function An(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 En(e){let n=An(e);return{label:e?n.word:"Connect compute",ariaLabel:e?e.pairing_lost?`${q(e)} is not connected`:`${n.word} on ${q(e)}`:"Connect compute",connected:e!==null,state:n}}function Ye(e){return e.state==="online"||e.state==="busy"}function _n(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 er(e){return e.runtimes.filter(n=>n.id!=="shell")}function ge(e){return e.runtimes.filter(n=>n.id!=="shell"&&!n.quarantined&&!n.absent)}function Ne(e){let n=i=>i?e.runtimes.find(c=>c.id===i)??null:null;if(e.requested_runtime)return{by:"app",runtimeId:e.requested_runtime,runtime:n(e.requested_runtime)};let t=ge(e),r=t.find(i=>i.id===e.preferred_runtime);if(r)return{by:"you",runtimeId:r.id,runtime:r};let s=i=>i.id==="claude-code"?0:i.id==="codex"?1:2,a=[...t].sort((i,c)=>s(i)-s(c))[0]??null;return{by:"default",runtimeId:a?.id??null,runtime:a}}var nr="soba";function $n(){return`${nr}://show`}function et(e,n,t){let r=`${nr}://connect?url=${encodeURIComponent(e)}`;return n&&(r+=`&nonce=${encodeURIComponent(n)}`),t&&(r+=`&want=${encodeURIComponent(t)}`),r}function nt(){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 Qo=1600;function tr(e={}){return sr(e)}async function rr(e,n={}){if(typeof window>"u"||typeof document>"u")return"unknown";let t=sr(n);try{window.location.href=et(e,n.nonce,n.want)}catch{return"absent"}return t}async function bn(e={}){if(typeof window>"u"||typeof document>"u")return"unknown";let n=sr(e);try{window.location.href=$n()}catch{return"absent"}return n}async function sr(e){if(typeof window>"u"||typeof document>"u")return"unknown";let n=e.graceMs??Qo,t=document.visibilityState==="visible"&&document.hasFocus(),r=!1,s=()=>{r=!0},a=()=>{document.visibilityState==="hidden"&&(r=!0)};return window.addEventListener("blur",s),window.addEventListener("pagehide",s),document.addEventListener("visibilitychange",a),await new Promise(i=>setTimeout(i,n)),window.removeEventListener("blur",s),window.removeEventListener("pagehide",s),document.removeEventListener("visibilitychange",a),t?r?"opened":"absent":"unknown"}var ks={"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,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",huggingface:"data:image/png;base64,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"};import{useEffect as Ns,useRef as Vo}from"react";import{Fragment as zo,jsx as xe,jsxs as or}from"react/jsx-runtime";function tt({anchor:e,label:n,options:t,current:r,onClose:s,onPick:a}){let i=Vo(null);return Ns(()=>{let o=i.current,l=e.current;if(!o||!l)return;try{typeof o.showPopover=="function"&&o.showPopover()}catch{}let u=l.getBoundingClientRect();u.width>o.offsetWidth&&(o.style.width=`${Math.round(u.width)}px`);let m=o.offsetWidth,f=o.offsetHeight,g=u.width>248?u.left:u.right-m,h=Math.max(8,Math.min(g,window.innerWidth-m-8)),y=u.bottom+6,M=y+f>window.innerHeight-8&&u.top-6-f>8?u.top-6-f:y;o.style.left=`${Math.round(h)}px`,o.style.top=`${Math.round(M)}px`,o.querySelector('[aria-checked="true"]')?.focus()},[e]),Ns(()=>{let o=l=>{let u=l.target;!u||i.current?.contains(u)||e.current?.contains(u)||s()};return document.addEventListener("pointerdown",o,!0),()=>document.removeEventListener("pointerdown",o,!0)},[e,s]),xe("div",{ref:i,role:"menu","aria-label":n,className:"sc-menu",popover:"manual",onKeyDown:o=>{let l=[...i.current?.querySelectorAll("[role=menuitemradio]")??[]],u=l.indexOf(document.activeElement);if(o.key==="Escape")o.stopPropagation(),o.nativeEvent.stopImmediatePropagation(),s(),e.current?.focus();else if(o.key==="ArrowDown"||o.key==="ArrowUp"){o.preventDefault();let m=o.key==="ArrowDown"?1:-1;l[(u+m+l.length)%l.length]?.focus()}else o.key==="Tab"&&s()},children:t.map(o=>xe(Jo,{option:o,checked:r===o.id,onClose:s,onPick:a},o.id??""))})}function Jo({option:e,checked:n,onClose:t,onPick:r}){return or(zo,{children:[e.heading?xe("div",{className:"sc-menu-head",role:"presentation",children:e.heading}):e.rule?xe("div",{className:"sc-menu-sep"}):null,or("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,or("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(Yo,{})]})]})}function Yo(){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 In({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 Zo,useState as Xo}from"react";var jo={haiku:"Haiku",sonnet:"Sonnet",opus:"Opus",fable:"Fable"};function yn(e){return jo[e]??e}function rt(e){let n=[...e].sort(St),t=Ue([...e]),r=t?Ne(t):null,a=[{id:"auto",kind:"auto",label:"Automatic",model:"auto",...r?.runtime?{note:r.runtime.default_model?`Uses ${yn(r.runtime.default_model)}`:`Uses ${r.runtime.display_name}`}:{}}];n.some(u=>ge(u).some(m=>Mt(m.id)))&&a.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 c=new Map;for(let u of n)for(let m of ge(u))for(let f of m.models){if(!f)continue;let g=`${m.id}/${f}`,h=c.get(g);if(h){h.machines.add(q(u));continue}c.set(g,{option:{id:g,kind:"named",label:yn(f),model:f,runtime:m.id,runtimeName:m.display_name,costClass:m.cost_class},machines:new Set([q(u)])})}let o=new Set;for(let{machines:u}of c.values())for(let m of u)o.add(m);let l=o.size>1;for(let{option:u,machines:m}of c.values()){let f=l&&m.size===1?[...m][0]:void 0;a.push(f?{...u,machine:f}:u)}return a}function st(e){let n=[],t=[];for(let r of e){if(r.kind!=="named"){n.push(r);continue}let s=r.runtimeName??r.runtime??"",a=t.find(i=>i.heading===s);a?a.options.push(r):t.push({heading:s,options:[r]})}return n.length?[{heading:null,options:n},...t]:t}function ar(e,n){let t=e.find(s=>s.kind==="auto")??{id:"auto",kind:"auto",label:"Automatic",model:"auto"};if(!n||n==="auto")return{selected:t,unavailable:null};let r=e.find(s=>s.id===n);return r?{selected:r,unavailable:null}:{selected:t,unavailable:n}}function ir(e){return e.runtime?{model:e.model,runtime:e.runtime}:{model:e.model}}function Ke(e){return e.length>1}var qo={opus:"Most capable. Best for hard, multi-step work.",sonnet:"Balanced speed and quality for everyday runs.",haiku:"Fastest. Best for quick, simple runs."};function lr(e){if(e.kind==="auto"){let t=e.note?.replace(/^Uses /,"");return t?`Soba picks the model for each run. Currently using ${t}.`:"Soba picks the model for each run."}if(e.kind==="size")return e.id==="small"?"Quick and cheap. Whichever small model the agent serving has.":"The most capable model the agent serving has.";let n=qo[e.model];return n?e.machine?`${n} On ${e.machine}.`:n:e.machine?`On ${e.machine}.`:void 0}import{jsx as Rt,jsxs as xs}from"react/jsx-runtime";function ot({options:e,selected:n,onPick:t,caption:r,onOpen:s,disabled:a,className:i}){let[c,o]=Xo(!1),l=Zo(null);if(!Ke(e))return null;let u=i?`sc-mp ${i}`:"sc-mp";return xs("span",{className:u,children:[r&&Rt("span",{className:"sc-mp-cap",children:r}),xs("button",{ref:l,type:"button",className:"sc-mp-btn",...s?{}:{"aria-haspopup":"menu","aria-expanded":c},"aria-label":`Model: ${n.label}. Change`,disabled:a,onClick:s??(()=>o(m=>!m)),children:[Rt("span",{className:"sc-mp-label",children:n.label}),Rt(In,{open:!s})]}),c&&!s&&Rt(tt,{anchor:l,label:"Which model answers",options:Ko(e),current:n.id,onClose:()=>o(!1),onPick:m=>{o(!1),m&&t(m)}})]})}function Ko(e){let n=[];for(let t of st(e))t.options.forEach((r,s)=>{let a=_o(r);n.push({id:r.id,label:r.label,...a?{note:a}:{},...t.heading&&s===0?{heading:t.heading}:{},...!t.heading&&r.kind==="size"&&s===1?{rule:!0}:{}})});return n}function _o(e){return e.kind!=="named"?e.note:e.machine?`on ${e.machine}`:void 0}import{useEffect as $o,useRef as ea}from"react";import{jsx as pe,jsxs as Pt}from"react/jsx-runtime";function cr({options:e,selected:n,onPick:t,onClose:r,busy:s}){let a=ea(null);return $o(()=>{(a.current?.querySelector('[aria-checked="true"]')??a.current?.querySelector("[role=radio]"))?.focus()},[]),Pt("div",{className:"sc-tray sc-screen",onKeyDown:o=>{o.key==="Escape"&&(o.stopPropagation(),r())},children:[Pt("div",{className:"sc-screen-head",children:[pe("button",{type:"button",className:"sc-back","aria-label":"Back",onClick:r,disabled:s,children:pe(na,{})}),pe("h2",{className:"sc-screen-title",children:"Model"})]}),pe("div",{ref:a,role:"radiogroup","aria-label":"Model",className:"sc-group-card sc-mopts",onKeyDown:o=>{if(!["ArrowDown","ArrowRight","ArrowUp","ArrowLeft"].includes(o.key)||s)return;o.preventDefault();let u=e.findIndex(g=>g.id===n),m=o.key==="ArrowDown"||o.key==="ArrowRight"?1:-1,f=e[((u<0?0:u)+m+e.length)%e.length];f&&t(f.id)},children:e.map(o=>{let l=o.id===n,u=lr(o);return Pt("button",{type:"button",role:"radio","aria-checked":l,tabIndex:l?0:-1,className:"sc-mopt",disabled:s,onClick:()=>t(o.id),children:[Pt("span",{className:"sc-mopt-say",children:[pe("span",{className:"sc-mopt-name",children:o.label}),u&&pe("span",{className:"sc-mopt-desc",children:u})]}),pe("span",{className:l?"sc-ring sc-ring-on":"sc-ring","aria-hidden":"true",children:l&&pe(ta,{})})]},o.id)})}),pe("p",{className:"sc-screen-foot",children:"Applies to new runs. Runs already in progress keep the model they started with."}),pe("button",{type:"button",className:"sc-act-go",onClick:r,disabled:s,children:"Done"})]})}function na(){return pe("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:"sc-back-glyph",children:pe("path",{d:"M15 6l-6 6 6 6",fill:"none",stroke:"currentColor",strokeWidth:"2.2",strokeLinecap:"round",strokeLinejoin:"round"})})}function ta(){return pe("svg",{viewBox:"0 0 20 20","aria-hidden":"true",focusable:"false",className:"sc-ring-tick",children:pe("path",{d:"M5 10.5l3.2 3.2L15 6.5",fill:"none",stroke:"currentColor",strokeWidth:"2.6",strokeLinecap:"round",strokeLinejoin:"round"})})}import{jsx as Me,jsxs as sa}from"react/jsx-runtime";function re({className:e}){return sa("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 Ms({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 wn({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 Et({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 ra({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 ur({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:Ms,chatgpt:wn,local:Et},Ss={shell:ra};function Ps(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 oa=3e3,aa=2*6e4,It=Date.now(),Ot=new Set,Rs=!1;function ia(){if(Rs||typeof window>"u")return;Rs=!0;let e=()=>{let t=It;if(It=Date.now(),It-t>aa)for(let r of Ot)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 Ot)t()};window.addEventListener("focus",n),document.addEventListener("visibilitychange",n)}function Se(e,n,t={}){ia();let r,s=t.immediate===!1?Date.now():0,a=!1,i=!1,c=()=>{i||(r=setTimeout(o,t.idle===!1?n:Ps(n,Date.now()-It)))},o=async()=>{if(clearTimeout(r),!(i||a)){if(typeof document>"u"||!document.hidden){a=!0,s=Date.now();try{await e()}catch{}finally{a=!1}}c()}},l=()=>{Date.now()-s>Math.min(n,oa)&&o()};return Ot.add(l),t.immediate===!1?c():o(),()=>{i=!0,clearTimeout(r),Ot.delete(l)}}var fe=[{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"]}],Es=["claude","chatgpt"];function dr(){return fe.filter(e=>Es.includes(e.id))}function pr(e){return fe.filter(n=>n.costClass===e)}function mr(e){return fe.find(n=>n.expects.includes(e))??null}import{Fragment as it,jsx as d,jsxs as v}from"react/jsx-runtime";function Cn({machines:e,hosted:n=[],onApproveRuntime:t,onPreferRuntime:r,onDisconnectHosted:s,onPair:a,onWake:i,onOpenApp:c,onRefresh:o,refreshing:l,busy:u,appName:m,model:f,onPickModel:g,error:h,runs:y,loadRuns:M,loading:E,machineMenu:R,machineNote:G,onReconnect:Y,openApp:O=!0,children:L,onStopRun:T}){let w=Ue(e),le=e.filter(I=>I.id!==w?.id),$=w?.state==="online",[be,ee]=at(()=>$?[]:null),[Re,Be]=at("no"),[me,Pe]=at(!1),j=y===void 0&&!!M,ce=j?be:y??($?[]:null),rn=y!==void 0||!!M,Z=!!(w&&Ye(w));la(()=>{if(!j||!M||!Z)return;let I=!0,Ee=Se(async()=>{let ue=await M();I&&ee(ue)},3e3);return()=>{I=!1,Ee()}},[j,M,Z]);let we=(w?er(w):[]).filter(I=>I.quarantined&&!I.absent),ne=fr(w,f).runtime,Ge=ne?.cost_class==="user-hardware"?ne:null,X=Ge?Ma(xa(Ge,f)):null,K=!!w&&!Ye(w),_=(()=>{if(!w||K||!ne||De(ne).tone!=="warn")return null;let Ee=q(w);return{title:`${ne.display_name} is signed out`,detail:`Sign in on ${Ee} so Soba can start runs.`}})(),We=()=>{c?.(),Be("going"),bn().then(I=>Be(I==="absent"?"absent":"no"))},Ve=()=>{We(),i?.()},He={label:Re==="going"?"Opening Soba\u2026":"Open Soba",onPress:We,spin:Re==="going"},B=w?He:a?{label:"Connect to Soba",onPress:a}:null,Q=!!w&&B===He,P=Q&&!!o,C=o&&d("button",{type:"button",className:"sc-disc",onClick:o,disabled:l,"aria-label":"Refresh",title:"Refresh",children:d(Ea,{spinning:!!l})});if(!w&&n.length===0&&!a)return d("p",{className:"sc-note",children:"Nothing connected yet."});if(me&&w&&f&&g){let I=Ts(w,f);if(Ke(I.options))return d(cr,{options:I.options,selected:f.id,onPick:g,onClose:()=>Pe(!1),...u?{busy:u}:{}})}return v("div",{className:"sc-tray",children:[w&&v(Oe,{title:"This machine",action:(o&&!P||O||R)&&v("span",{className:"sc-cap-acts",children:[!P&&C,O&&d(ya,{}),R]}),children:[d(ua,{machine:w}),G]}),w&&K&&!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(Ze,{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 ",q(w)," is not answering. Waking it opens the app there."]})]}),d("button",{type:"button",className:"sc-away-go",onClick:Ve,disabled:u||Re==="going",children:Re==="going"?"Waking\u2026":"Wake"})]})}),w?.pairing_lost&&!Ye(w)&&d(Oe,{title:"Soba",children:v("div",{className:"sc-away",children:[d("span",{className:"sc-away-mark","aria-hidden":"true",children:d(Ze,{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."})]}),Y&&d("button",{type:"button",className:"sc-away-go",onClick:Y,disabled:u,children:"Connect"})]})}),w&&!K&&d(Oe,{title:"Runs on",children:ne?d(va,{machine:w,appName:m,busy:u,...f?{model:f}:{},...g?{onPickModel:g,onOpenModels:()=>Pe(!0)}:{},...r?{onPick:I=>r(w.id,I)}:{},...t?{onApprove:I=>t(w.id,I)}:{}}):v("div",{className:"sc-blank",children:[d("span",{className:"sc-blank-mark","aria-hidden":"true",children:d(ma,{})}),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&&O&&v("a",{className:"sc-blank-act",href:$n(),children:[d("span",{children:"Add agents"}),d(hr,{})]})]})}),w&&(_||X)&&v(Oe,{title:"Needs attention",children:[_&&v("div",{className:"sc-alarm",children:[d("span",{className:"sc-alarm-mark","aria-hidden":"true",children:d(Os,{})}),v("span",{className:"sc-alarm-say",children:[d("span",{className:"sc-alarm-title",children:_.title}),d("span",{className:"sc-alarm-body",children:_.detail})]})]}),X&&v("div",{className:"sc-alarm sc-alarm-warn",children:[d("span",{className:"sc-alarm-mark","aria-hidden":"true",children:d(Os,{})}),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 ",X," model can take all this computer's memory while it answers."]})]})]})]}),w&&rn&&!K&&d(pa,{machine:w,runs:ce,...T?{onStop:T}:{}}),w&&d(it,{children:we.length>0&&!K&&!(r&&t&&Ne(w).by!=="app")&&d(Oe,{title:"New on this machine",children:we.map(I=>d(Ca,{runtime:I,...t?{onApprove:()=>t(w.id,I.id)}:{}},I.id))})}),n.length>0&&d(Oe,{title:n.length>1?"Connected plans":"Connected plan",children:n.map(I=>d(Ra,{credential:I,appName:m,busy:u,...s?{onDisconnect:()=>s(I.provider)}:{}},I.provider))}),le.length>0&&d(Oe,{title:"Your other machines",children:le.map(I=>d(wa,{machine:I},I.id))}),!w&&a&&d(Oe,{title:"Your machines",children:v("button",{type:"button",className:"sc-pair",onClick:a,children:[d("span",{className:"sc-otile","aria-hidden":"true",children:d(Pa,{})}),d("span",{className:"sc-oname",children:"Connect a machine"})]})}),B&&v("div",{className:"sc-acts",children:[Q&&B?v("div",{className:"sc-acts-row",children:[P?C:d("span",{}),v("button",{type:"button",className:"sc-act-small",onClick:B.onPress,disabled:u||B.spin,"data-spin":B.spin?"true":void 0,children:[B.spin&&d(Ls,{}),B.label,!B.spin&&d(hr,{})]})]}):B&&v("button",{type:"button",className:"sc-act-go",onClick:B.onPress,disabled:u||B.spin,"data-spin":B.spin?"true":void 0,children:[B.spin&&d(Ls,{}),B.label]}),Re==="absent"&&v("p",{className:"sc-act-miss",children:["Nothing opened here. ",w?q(w):"That machine"," may be a different computer, or the Soba app is not installed on this one."]})]}),L,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 ua({machine:e,onToggle:n,open:t}){let r=Ye(e),s=[r?null:e.pairing_lost?"Not connected to Soba":"Soba is asleep",r?Kn(e):null,e.always_on?"always on":null].filter(Boolean),a=r&&e.capacity>0?e.active>0?`${e.active} of ${e.capacity} running`:null:_n(e.last_seen_at),i=v(it,{children:[v("span",{className:"sc-mtile","aria-hidden":"true",children:[d(Bs,{}),d("span",{className:`sc-mbadge sc-mbadge-${r?An(e).tone:e.pairing_lost?"off":"away"}`})]}),v("span",{className:"sc-mid",children:[d("span",{className:"sc-mname",children:q(e)}),v("span",{className:"sc-mmeta",children:[d("span",{className:"sc-mmeta-is",children:s.map((c,o)=>v("span",{children:[o>0&&d("span",{className:"sc-mmeta-sep",children:"\xB7"}),c]},c))}),a&&d("span",{className:"sc-mmeta-now",children:a})]})]})]});return!n||!r?d("div",{className:"sc-mrow",children:i}):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:[i,d(In,{open:!!t})]})}function da(e,n){return e.filter(t=>t.machine_id===n.id||t.machine_id===null)}function pa({machine:e,runs:n,onStop:t}){let r=n?da(n,e):[],[s,a]=at(new Set),i=async o=>{a(l=>new Set(l).add(o));try{await t?.(o)}catch{a(l=>{let u=new Set(l);return u.delete(o),u})}},c=()=>{for(let o of r)i(o.id)};return d(Oe,{title:"Active runs",...t&&r.length>1?{action:d("button",{type:"button",className:"sc-cap-link",onClick:c,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(ha,{})}),"Nothing running"]}):r.map(o=>d(ga,{run:o,stopping:s.has(o.id),...t?{onStop:()=>void i(o.id)}:{}},o.id))})}function ma(){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 ha(){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 ga({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:Is(e)}),d("span",{className:"sc-rstep",children:n?"Stopping\u2026":`${Aa(e)} \xB7 ${ba(e.started_at)}`})]}),t&&d("button",{type:"button",className:"sc-rstop",onClick:t,disabled:n,"aria-label":`Stop ${Is(e)}`,children:d("span",{className:"sc-rstop-ring",children:d(Ia,{})})})]})}function fa(e){let n=mr(e);return(n?_e[n.id]:null)??Ss[e]??null}function Is(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 Aa(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 ba(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 ya(){return d("a",{className:"sc-disc sc-open-app",href:$n(),"aria-label":"Open Soba App",title:"Open Soba App",children:d(hr,{})})}function hr(){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 wa({machine:e}){let n=An(e);return v("div",{className:"sc-orow",children:[d("span",{className:"sc-otile","aria-hidden":"true",children:d(Bs,{})}),d("span",{className:"sc-oname",children:q(e)}),d("span",{className:"sc-oword",children:n.word}),d("span",{className:`sc-dot sc-dot-${n.tone}`,"aria-hidden":"true"})]})}function Ca({runtime:e,onApprove:n}){return v("div",{className:"sc-mrow",children:[d("span",{className:"sc-mtile sc-atile","aria-hidden":"true",children:d(Lt,{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 gr({id:e,name:n}){return d("span",{className:"sc-runtime-tile","aria-hidden":"true",children:d(Lt,{id:e,...n?{name:n}:{}})})}function Lt({id:e,name:n}){if(!e)return null;let t=ks[e];if(t)return d("img",{src:t,alt:"",className:"sc-runtime-logo"});let r=fa(e);return r?d(r,{className:"sc-runtime-mark"}):n?d("span",{className:"sc-runtime-letter",children:n.slice(0,1).toUpperCase()}):null}function Ts(e,n){if(!n)return{options:[]};let t=fr(e,n),r=t.runtime?.id??t.runtimeId,s=rt([e]).filter(c=>c.kind==="named"?c.runtime===r:c.kind==="size"?!!r&&Mt(r):!0),a=t.runtime?.default_model;if(n.kind!=="auto"||!a)return{options:s,shown:n};let i=yn(a);return{options:s,shown:{...n,label:i.length>16?i:`${n.label} \xB7 ${i}`}}}function va({machine:e,appName:n,busy:t,onPick:r,model:s,onPickModel:a,onOpenModels:i,onApprove:c}){let o=fr(e,s),l=ge(e),u=c?e.runtimes.filter(T=>T.quarantined&&!T.absent):[],[m,f]=at(!1),g=ca(null);if(o.by!=="app"&&l.length===0)return null;let h=T=>T?d(gr,{id:T.id,name:T.display_name}):null,y=o.runtime?.display_name??o.runtimeId??"\u2014",M=o.by!=="app"&&o.by!=="model"&&!!r&&(l.length>=2||u.length>0),E=o.runtime?.id??o.runtimeId,R=!Ye(e),G=o.runtime&&De(o.runtime).tone==="warn"?"Signed out":null,{options:Y,shown:O}=Ts(e,s),L=o.by==="app"?`Set by ${n??"the app"}`:o.runtime?Na(o.runtime):null;return v(it,{children:[M?v("button",{ref:g,type:"button",className:R?"sc-runs-agent sc-runs-dim":"sc-runs-agent","aria-haspopup":"menu","aria-expanded":m,"aria-label":`Runs go to ${y}. Change`,disabled:t,onClick:()=>f(T=>!T),children:[d("span",{className:"sc-runs-tile","aria-hidden":"true",children:d(Lt,{id:E??null,name:y})}),v("span",{className:"sc-runs-said-name",children:[d("span",{className:"sc-runs-name",children:y}),G&&d("span",{className:"sc-runs-ill",children:G})]}),d(In,{open:!1})]}):v("span",{className:R?"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(Lt,{id:E??null,name:y})}),v("span",{className:"sc-runs-said-name",children:[d("span",{className:"sc-runs-name",children:y}),G&&d("span",{className:"sc-runs-ill",children:G})]}),o.by==="app"&&v("span",{className:"sc-runs-told",children:["set by ",n??"the app"]}),o.by==="model"&&d("span",{className:"sc-runs-told",children:"set by the model"})]}),O&&a&&Ke(Y)?v(it,{children:[d("span",{className:"sc-runs-rule","aria-hidden":"true"}),d(ot,{options:Y,selected:O,onPick:a,caption:"Model",...i?{onOpen:i}:{},className:R?"sc-runs-model sc-runs-dim":"sc-runs-model",...t?{disabled:t}:{}})]}):L&&v(it,{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})]})]}),m&&r&&d(ka,{anchor:g,machine:e,tile:h,waiting:u,...c?{onApprove:c}:{},onClose:()=>f(!1),onPick:T=>{f(!1),r(T)}})]})}function ka({anchor:e,machine:n,tile:t,waiting:r,onApprove:s,onClose:a,onPick:i}){let c=Ne(n),o=Ne({...n,preferred_runtime:null}).runtime,l=c.by==="you"?c.runtimeId:null,u=[{id:null,label:"Automatic",...o?{note:`Uses ${o.display_name}`}:{},glyph:t(o)},...ge(n).map((m,f)=>{let g=Sa(m);return{id:m.id,label:m.display_name,glyph:t(m),...g?{note:g}:{},...f===0?{rule:!0}:{}}}),...s?r.map((m,f)=>({id:`waiting:${m.id}`,label:m.display_name,glyph:t(m),...m.version?{note:m.version}:{},trailing:"Let it serve",onChoose:()=>s(m.id),...f===0?{heading:"New on this machine"}:{}})):[]];return d(tt,{anchor:e,label:"Which agent runs go to",options:u,current:l,onClose:a,onPick:i})}function Na(e){let n=De(e);return n.tone==="warn"?n.text:e.default_model?yn(e.default_model):"Automatic"}function fr(e,n){if(!e)return{by:"default",runtimeId:null,runtime:null};let t=Ne(e);if(t.by==="app"||n?.kind!=="named"||!n.runtime)return t;let r=ge(e).find(s=>s.id===n.runtime);return!r||r.id===t.runtimeId?t:{by:"model",runtimeId:r.id,runtime:r}}function xa(e,n){return!n||n.kind==="auto"?e.default_model:n.kind==="size"?(Cs(n.model)?vs(e.id,n.model):void 0)??e.default_model:n.runtime===e.id?n.model:e.default_model}function Ma(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 Sa(e){let n=De(e);return n.tone==="warn"?n.text:e.default_model?yn(e.default_model):e.cost_class==="user-hardware"?"In this machine's memory":n.tone!=="ok"?n.text:e.version??void 0}function Ra({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(wn,{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 Bs(){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 Pa(){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 Os(){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 Ls(){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 Ea({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 Ia(){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 Oa}from"react/jsx-runtime";function Ar({machines:e,onApproveRuntime:n,model:t,onPickModel:r}){return Oa(Cn,{machines:e,...n?{onApproveRuntime:n}:{},...t?{model:t}:{},...r?{onPickModel:r}:{}})}import{useCallback as se,useEffect as Ae,useId as Ga,useMemo as $e,useRef as On,useState as z}from"react";var lt=[{slug:"mac-arm",label:"macOS, Apple silicon"},{slug:"mac-intel",label:"macOS, Intel"},{slug:"windows",label:"Windows"},{slug:"linux",label:"Linux"}];function ct(e){if(!e)return"";try{return new URL(e).origin}catch{return""}}var Gs="soba.connect.choice",La=180*24*60*60*1e3;function br(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 yr(e,n){return e?n?`${Gs}.${e}.${br(n)}`:`${Gs}.${e}`:null}function wr(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)>La)return null;let r=fe.find(s=>s.id===t.choice);return r?r.id:null}catch{return null}}function Cr(e,n){if(!(!e||typeof localStorage>"u"))try{localStorage.setItem(e,JSON.stringify({choice:n,at:new Date().toISOString()}))}catch{}}var Ws="soba.connect.model",Ta=180*24*60*60*1e3;function vr(e,n){return e?n?`${Ws}.${e}.${br(n)}`:`${Ws}.${e}`:null}function Tt(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 kr(e,n){if(!(!e||typeof localStorage>"u"))try{localStorage.setItem(e,JSON.stringify({choice:n,at:new Date().toISOString()}))}catch{}}var Hs="soba.connect.dismissed",Ba=30*24*60*60*1e3;function Nr(e,n){return e?n?`${Hs}.${e}.${br(n)}`:`${Hs}.${e}`:null}function xr(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)<Ba}catch{return!1}}function Mr(e){if(!(!e||typeof localStorage>"u"))try{localStorage.setItem(e,JSON.stringify({at:new Date().toISOString()}))}catch{}}import{Fragment as Tn,jsx as p,jsxs as x}from"react/jsx-runtime";var Sr=2e3,Wa=1e4,Ha=9e4,Da=6e4;function Rr(e,n,t,r=[],s){return e?"code":n&&(t.length>0||r.length>0)?"manage":s?"launch":"choose"}function Ds(e){return Ye(e)&&!e.pairing_lost}function Bt(e){return new Map(e.map(n=>[n.id,Ds(n)]))}function Ua(e){let n=Math.max(0,Math.round(e/1e3));return`${Math.floor(n/60)}:${String(n%60).padStart(2,"0")}`}function Ir({client:e,initialCode:n,initialChoice:t,onConnected:r,showStatus:s=!0,initialContext:a=null,initialMachines:i,onClose:c,headingId:o,theme:l,reason:u,active:m=!0}){let f=!!a&&i!==void 0,[g,h]=z(f?Rr(n,s,i??[],[],t):"loading"),[y,M]=z(a),[E,R]=z(i??[]),[G,Y]=z(n??""),[O,L]=z(null),[T,w]=z(null),[le,$]=z(!1),[be,ee]=z(0),[Re,Be]=z("app"),[me,Pe]=z(()=>Date.now()),[j,ce]=z(null),[rn,Z]=z(!1),[ye,we]=z(!1),[ne,Ge]=z("browser"),[X,K]=z(null),[_,We]=z([]),[Ve,He]=z(0),[B,Q]=z(null),P=On(null),[C,I]=z(t??null),[Ee,ue]=z(null),sn=$e(()=>{let A=y?.accent?.trim(),N=y?.background?.trim();if(!(!A&&!N))return N?{...gn(N,A),background:N,borderRadius:"inherit"}:{"--sc-accent":A,"--sc-accent-fg":Xn(A)}},[y?.accent,y?.background]),vt=Ga(),Ce=o??vt,on=On(null);Ae(()=>{if(!e||f)return;let A=!0;return Promise.all([e.context(),e.machines()]).then(([N,U])=>{A&&(M(N),R(U),h(Rr(n,s,U)))}).catch(N=>{A&&(w(N.message),h("choose"))}),()=>{A=!1}},[e,n,s,f]),Ae(()=>{g!=="loading"||!f||h(Rr(n,s,i??[]))},[g,f,n,s,i]),Ae(()=>{i&&R(i)},[i]),Ae(()=>{a&&M(a)},[a]);let qe=On(!1),an=On(g);an.current=g;let Vn=On(_);Vn.current=_;let ln=!!y?.hosted_available;Ae(()=>{!s&&an.current==="manage"&&h("choose")},[s]),Ae(()=>{if(!e||!m||g!=="manage")return;let A=!0,N=Se(async()=>{try{let U=await e.machines();if(!A)return;R(U);let J=!ln||qe.current;U.length===0&&Vn.current.length===0&&J&&an.current==="manage"&&h("choose")}catch{}},Wa,{immediate:!1});return()=>{A=!1,N()}},[g,e,ln,m]);let cn=yr(y?.publishable_key??null);Ae(()=>{ue(wr(cn))},[cn]),Ae(()=>{if(!e||!ln)return;let A=!0;return e.hosted().then(N=>{A&&(We(N.credentials),!qe.current&&(qe.current=!0,N.credentials.length>0&&s&&an.current==="choose"&&h("manage")))}).catch(()=>{}),()=>{A=!1}},[e,ln,s]),Ae(()=>{if(!e||!m||g!=="hosted")return;let A=!0,N=async()=>{try{let ke=await e.hosted();if(!A)return!1;if(We(ke.credentials),ke.credentials.length>0)return h("hosted_connected"),Q(null),!0}catch{}return!1},U=async()=>{P.current?.closed&&(P.current=null,!await N()&&A&&h("choose"))},J=Se(N,Sr,{immediate:!1}),pn=setInterval(U,400),mn=ke=>{let zn=ke.data;zn?.source==="soba"&&zn.type==="hosted_result"&&N()};return window.addEventListener("message",mn),()=>{A=!1,J(),clearInterval(pn),window.removeEventListener("message",mn),P.current=null}},[e,g,m]);let Yt=se(()=>{if(!e)return;let A=window.open("","soba-connect-plan","width=520,height=760,noopener=no");P.current=A,h("hosted"),He(Date.now()),Q(null),w(null),e.startHosted().then(({url:N})=>{if(A&&!A.closed){A.location.href=N;return}Q(N)}).catch(N=>{A?.close(),P.current=null,w(N.message),h("choose")})},[e]),Mn=se(async A=>{if(e){$(!0);try{await e.disconnectHosted(A),We((await e.hosted()).credentials)}catch(N){w(N.message)}finally{$(!1)}}},[e]);Ae(()=>{if(!e||!m||g!=="waiting")return;let A=!0,N=Se(async()=>{try{let U=await e.machines();if(!A)return;R(U);let J=on.current;if(!J)return;let pn=U.filter(ke=>!J.has(ke.id)||J.get(ke.id)===!1&&Ds(ke)),mn=pn.find(ke=>ke.state!=="offline")??pn[0];if(mn){K(mn.id),C&&Cr(cn,C);let ke=fe.find(qt=>qt.id===C)?.expects??[],zn=ge(mn).find(qt=>ke.includes(qt.id));zn&&e.preferRuntime(mn.id,zn.id).catch(()=>{}),h("connected"),r?.(U)}}catch{}},Sr,{immediate:!1});return()=>{A=!1,N()}},[g,e,r,C,cn,m]);let kt=se(async()=>{if(e){w(null),$(!0);try{let A=await e.lookup(G);L(A),h("confirm")}catch(A){w(A.message)}finally{$(!1)}}},[e,G]),Jn=se(async()=>{if(e){w(null),$(!0);try{try{on.current=Bt(await e.machines())}catch{on.current=Bt(E)}await e.approve(G),Be("code"),h("waiting"),ee(Date.now())}catch(A){w(A.message)}finally{$(!1)}}},[e,G,E]),Nt=se(async()=>{if(e){$(!0);try{await e.deny(G),Ge("browser"),h("denied")}catch(A){w(A.message)}finally{$(!1)}}},[e,G]),V=$e(()=>y?.connect_url??null,[y]),[he,Yn]=z(()=>nt()),zt=$e(()=>V?et(V,he??void 0,C??void 0):null,[V,he,C]),k=$e(()=>ct(V),[V]),te=se(A=>{if(E.length===0)return null;let N=fe.find(J=>J.id===A);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]),ve=se((A=null)=>{I(A),w(null),ce(null),Z(!1),we(!1),Sn.current=!1,Yn(nt()),h("launch")},[]),Sn=On(!!t);Ae(()=>{g!=="launch"||!V||Sn.current||(Sn.current=!0,Z(!0),rr(V,{...he?{nonce:he}:{},...C?{want:C}:{}}).then(ce))},[g,V,he,C]);let Ie=se(()=>{Z(!0),tr().then(ce)},[]),jt=se(A=>{if(ye){let N=nt();we(!1),Yn(N),V&&(A.preventDefault(),window.location.href=et(V,N??void 0,C??void 0))}Ie()},[ye,Ie,V,C]),Je=$e(()=>{let A=y?.runtimes;return A?fe.filter(N=>A.includes(N.id)):dr()},[y?.runtimes]),de=$e(()=>{let A=fe.find(N=>N.id===C);return A?{choice:A,Mark:_e[A.id]??null}:null},[C]),un=$e(()=>E.find(A=>A.id===X),[E,X]),xt=se(()=>{h("manage"),c?.()},[c]);Ae(()=>{let A=he;if(!e||!m||g!=="launch"||!A)return;let N=!1,U=Date.now()+15e4,J=()=>{};return J=Se(async()=>{if(Date.now()>U){J(),we(!0);return}try{let pn=await e.claim(A);if(N)return;if(pn.declined){J(),ce(null),Ge("machine"),h("denied");return}if(!pn.claimed)return;J();try{on.current=Bt(await e.machines())}catch{on.current=Bt(E)}Be("app"),h("waiting"),ee(Date.now())}catch{}},Sr,{immediate:!1,idle:!1}),()=>{N=!0,J()}},[e,g,E,he,m]);let dn=$e(()=>{if(!O)return null;if(O.approved||O.denied)return"answered";let A=O.expires_at?Date.parse(O.expires_at):Number.NaN;return Number.isFinite(A)&&A<=me?"expired":"live"},[O,me]);Ae(()=>{if(!(g==="confirm"&&dn==="live"||g==="waiting"||g==="hosted"))return;let N=setInterval(()=>Pe(Date.now()),1e3);return()=>clearInterval(N)},[g,dn]);let Po=se(async(A,N)=>{if(e)try{await e.approveRuntime(A,N),R(await e.machines())}catch(U){w(U.message)}},[e]),Eo=se(async(A,N)=>{if(e)try{await e.preferRuntime(A,N),R(await e.machines())}catch(U){w(U.message)}},[e]);return g==="loading"?p("div",{className:"soba-connect",...l?{"data-theme":l}:{},style:sn,children:p("div",{className:"sc-card",children:p("p",{className:"sc-note",children:"Loading\u2026"})})}):x("div",{className:"soba-connect",...l?{"data-theme":l}:{},style:sn,children:[c&&p("button",{type:"button",className:"sc-modal-close",onClick:c,"aria-label":"Close",children:"\xD7"}),g==="manage"&&x("div",{className:"sc-card",children:[p("h2",{className:"sc-title",id:Ce,children:"Your compute"}),x("p",{className:"sc-sub",children:[p(Gt,{context:y})," ",E.length>0&&_.length>0?"runs on your connected plan, and on these machines while they are awake.":_.length>0?"runs on the plan you connected. Nothing here is charged to you.":"runs on these machines, while they are awake."]}),p(Cn,{machines:E,hosted:_,onApproveRuntime:Po,onPreferRuntime:(A,N)=>void Eo(A,N),onDisconnectHosted:A=>void Mn(A),onPair:()=>h("choose"),busy:le,...y?.app.name?{appName:y.app.name}:{}}),T&&p("p",{className:"sc-error",children:T})]}),g==="choose"&&x("div",{className:"sc-card",children:[p(Qa,{context:y}),p("h2",{className:"sc-h",id:Ce,children:u==="payment_required"?"Carry on with your own AI":u==="no_compute"?"This run needs a machine":"Connect your AI"}),p("p",{className:"sc-p",children:"Use compute you already have."}),V&&Je.length>0&&x(Tn,{children:[p("div",{className:"sc-opts",children:Je.map(A=>{let N=_e[A.id];return x("button",{type:"button",className:"sc-opt",onClick:()=>ve(A.id),children:[p("span",{className:"sc-opt-tile","aria-hidden":"true",children:N&&p(N,{className:"sc-opt-mark"})}),p("span",{className:"sc-opt-text",children:p("span",{className:"sc-opt-label",children:A.label})}),(()=>{let U=te(A.id);return U?p("span",{className:`sc-opt-has sc-opt-has-${U.tone}`,children:U.text}):Ee===A.id?p("span",{className:"sc-opt-last",children:"last used"}):p(Pr,{className:"sc-opt-go"})})()]},A.id)})}),x("p",{className:"sc-opt-note",children:["Your accounts stay there. ",Us(y)," never sees them."]})]}),(!V||Je.length===0)&&p("p",{className:"sc-error",style:{marginTop:16},children:"This app has no publishable key yet, so there is nothing to pair against."}),T&&p("p",{className:"sc-error",children:T}),V&&y?.show_code===!0&&p("div",{className:"sc-opt-alt",children:p("button",{type:"button",className:"sc-alt-link",onClick:()=>h("code"),children:"I have a code"})})]}),g==="launch"&&x("div",{className:"sc-card",children:[x("div",{className:"sc-head",children:[p(Ln,{onClick:()=>h("choose")}),p("p",{className:"sc-head-title",children:"Soba App"})]}),p(Wt,{mark:de?.Mark??re,still:ye||!rn&&j===null}),p("h2",{className:"sc-h",id:Ce,children:ye?"No answer from this machine":j==="absent"?"Nothing opened":j===null?"Opening Soba App\u2026":"Approve it on this machine"}),ye?p("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."}):j==="absent"?p("p",{className:"sc-p",children:"Nothing opened on this machine. Open it yourself below, or install it if it is not here yet."}):p("p",{className:"sc-p",children:j===null?"Approve it there and this page does the rest.":"This page finishes on its own."}),de&&x("p",{className:"sc-prereq",children:[de.Mark&&p(de.Mark,{className:"sc-rt-mark"}),"Needs ",de.choice.prerequisite]}),x("div",{className:"sc-stack",style:{marginTop:18},children:[p("a",{className:j==="absent"||ye?"sc-btn sc-btn-primary":"sc-btn",href:zt??"#",onClick:jt,children:ye?"Try again":j==="absent"?"Open Soba App":"Open it again"}),p("p",{className:"sc-note",children:j===null?"Your browser will ask permission first.":"Your browser asks permission the first time."}),de&&j==="absent"&&p("p",{className:"sc-note",children:p(Ja,{text:de.choice.hint})}),x("div",{className:"sc-foot-strip",children:[p("span",{children:"Not installed on this machine?"}),x("button",{type:"button",className:"sc-foot-go",onClick:()=>h("get"),children:["Get it",p(Pr,{})]})]})]})]}),g==="get"&&x("div",{className:"sc-card",children:[x("div",{className:"sc-head",children:[p(Ln,{onClick:()=>h("launch")}),p("p",{className:"sc-head-title",children:"Get Soba App"})]}),p("div",{className:"sc-opts",children:lt.map(A=>x("a",{className:"sc-opt",href:`${k}/download/${A.slug}`,target:"_blank",rel:"noreferrer noopener",children:[p("span",{className:"sc-opt-tile","aria-hidden":"true",children:p(ur,{className:"sc-opt-mark"})}),p("span",{className:"sc-opt-text",children:p("span",{className:"sc-opt-label",children:A.label})}),p(Pr,{className:"sc-opt-go"})]},A.slug))}),p("p",{className:"sc-opt-note",children:"Install it, then come back here and press the row you started with."})]}),g==="code"&&x("div",{className:"sc-card",children:[x("div",{className:"sc-head",children:[p(Ln,{onClick:()=>h("choose")}),p("p",{className:"sc-head-title",children:"Soba App"})]}),p("h2",{className:"sc-h",id:Ce,children:"Enter the code from that machine"}),p("p",{className:"sc-p",children:"Eight characters, shown by the Soba app once you paste the link."}),x("form",{className:"sc-stack",style:{marginTop:16},onSubmit:A=>{A.preventDefault(),kt()},children:[p("input",{className:"sc-input",value:G,onChange:A=>Y(A.target.value),placeholder:"ACDE-F234",autoComplete:"off",autoFocus:!0,"aria-label":"Pairing code"}),T&&p("p",{className:"sc-error",children:T}),p("button",{type:"submit",className:"sc-btn sc-btn-primary",disabled:le||G.length<8,children:le?"Checking\u2026":"Continue"})]})]}),g==="confirm"&&O&&x("div",{className:"sc-card",children:[x("div",{className:"sc-head",children:[p(Ln,{onClick:()=>h("code")}),p("p",{className:"sc-head-title",children:"Soba App"})]}),p("h2",{className:"sc-title",children:"Attach this machine to your account?"}),x("p",{className:"sc-sub",children:[p(Gt,{context:y})," may send your runs to it once you approve. It can never see the account or the keys on it."]}),x("ul",{className:"sc-facts",children:[p(ut,{k:"Code",v:O.user_code}),p(ut,{k:"Machine",v:O.hostname??"not stated"}),p(ut,{k:"System",v:[O.platform,O.arch].filter(Boolean).join(" / ")||"not stated"}),p(ut,{k:"Asked by",v:O.client??"not stated"}),O.labels.length>0&&p(ut,{k:"Labels",v:O.labels.join(", ")})]}),p("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."}),dn==="expired"&&p("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."}),dn==="answered"&&p("p",{className:"sc-error",children:"That code has already been answered. If it was not you, deny the next one."}),T&&p("p",{className:"sc-error",children:T}),x("div",{className:"sc-row",style:{marginTop:16},children:[p("button",{type:"button",className:"sc-btn sc-btn-primary",onClick:()=>void Jn(),disabled:le||dn!=="live",children:"Approve"}),p("button",{type:"button",className:"sc-btn",onClick:()=>void Nt(),disabled:le||dn==="answered",children:"No, deny it"})]}),dn==="live"&&O.expires_at&&x("p",{className:"sc-note",style:{marginTop:10},children:["This code expires in ",Ua(Date.parse(O.expires_at)-me),"."]})]}),g==="waiting"&&x("div",{className:"sc-card",children:[x("div",{className:"sc-head",children:[p(Ln,{onClick:()=>h("choose")}),p("p",{className:"sc-head-title",children:de?.choice.short??"Soba App"})]}),p(Wt,{mark:de?.Mark??re}),p("h2",{className:"sc-h",id:Ce,children:"Approved. Waiting for it to connect"}),p("p",{className:"sc-p",children:"Nothing more to do here. This page changes when it arrives."}),be>0&&me-be>Ha&&x("ol",{className:"sc-stall",children:[Re==="app"?x(Tn,{children:[p(Ht,{done:!0,title:"Soba Connect opened",line:"On this machine"}),p(Ht,{done:!0,title:"You approved it",line:"In Soba Connect"})]}):p(Ht,{done:!0,title:"You approved the code",line:"On this page"}),p(Ht,{title:`Still nothing from ${O?.hostname??"that machine"}`,line:"Look at Soba Connect on that machine: it says what it is doing. This keeps watching either way.",children:p("button",{type:"button",className:"sc-btn sc-stall-act",onClick:()=>void bn(),children:"Open Soba Connect"})})]})]}),g==="connected"&&x("div",{className:"sc-card",children:[p(Er,{tone:"ok"}),p("h2",{className:"sc-h",id:Ce,children:un?.label?`${un.label} is connected`:"Connected"}),x("p",{className:"sc-p",children:[p(Gt,{context:y})," will use ",un?.label?"it":"this machine"," from now on, while it is awake."]}),s&&x(Tn,{children:[un&&p(Va,{machine:un}),p("button",{type:"button",className:"sc-btn sc-btn-primary sc-btn-wide",style:{marginTop:14},onClick:xt,children:"Done"})]})]}),g==="hosted"&&x("div",{className:"sc-card",children:[x("div",{className:"sc-head",children:[p(Ln,{onClick:()=>h("choose")}),p("p",{className:"sc-head-title",children:"ChatGPT"})]}),B?p(Wt,{mark:wn,still:!0}):p(Wt,{mark:wn}),p("h2",{className:"sc-h",id:Ce,children:B?"Your browser blocked the window":"Finish signing in to ChatGPT"}),p("p",{className:"sc-p",children:B?"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."}),x("div",{className:"sc-stack",style:{marginTop:18},children:[B&&p("a",{className:"sc-btn sc-btn-primary",href:B,target:"soba-connect-plan",rel:"noreferrer",children:"Open the ChatGPT sign-in"}),T&&p("p",{className:"sc-error",children:T}),Ve>0&&me-Ve>Da&&p("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"&&x("div",{className:"sc-card",children:[p(Er,{tone:"ok"}),p("h2",{className:"sc-h",id:Ce,children:"ChatGPT is connected"}),x("p",{className:"sc-p",children:[p(Gt,{context:y})," will run on your ChatGPT plan",_[0]?.account_label?` (${_[0].account_label})`:"",". Nothing more to pay, nothing to install."]}),p("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."}),s&&x(Tn,{children:[p("button",{type:"button",className:"sc-btn sc-btn-wide",style:{marginTop:16},onClick:xt,children:"Done"}),p("div",{className:"sc-opt-alt",children:p("button",{type:"button",className:"sc-alt-link",onClick:()=>h("choose"),children:"Connect a machine too"})})]})]}),g==="denied"&&x("div",{className:"sc-card",children:[p(Er,{tone:"off"}),p("h2",{className:"sc-h",id:Ce,children:"Declined"}),p("p",{className:"sc-p",children:ne==="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."}),p("button",{type:"button",className:"sc-btn sc-btn-wide",style:{marginTop:16},onClick:()=>h("choose"),children:"Back to the start"})]})]})}function Us(e){return e?.app.name??"this app"}function Fa(e){let n=e?.app.icon_urls;if(n?.length)return n;let t=e?.app.icon_url;return t?[t]:[]}function Fs(e){let n=Fa(e),[t,r]=z([]),s=se(c=>{c&&r(o=>o.includes(c)?o:[...o,c])},[]),a=se(c=>s(c.currentTarget.getAttribute("src")),[s]),i=se(c=>{c?.complete&&c.naturalWidth===0&&s(c.getAttribute("src"))},[s]);return{icon:n.find(c=>!t.includes(c)),onError:a,ref:i}}function Qa({context:e}){let{icon:n,onError:t,ref:r}=Fs(e);return e?.app.mark==="soba"?p(re,{className:"sc-app-mark"}):n?p("img",{className:"sc-app-mark",src:n,alt:"","aria-hidden":"true",ref:r,onError:t}):null}function Gt({context:e}){let{icon:n,onError:t,ref:r}=Fs(e),s=e?.app.mark==="soba";return x("span",{className:"sc-app",children:[s&&p(re,{className:"sc-app-icon"}),!s&&n&&p("img",{className:"sc-app-icon",src:n,alt:"",ref:r,onError:t}),Us(e)]})}function Ln({onClick:e}){return p("button",{type:"button",className:"sc-head-back",onClick:e,"aria-label":"Back",children:p("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",children:p("path",{d:"M15 5 8 12l7 7",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})})}function Pr({className:e}){return p("svg",{className:e,viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",children:p("path",{d:"M9 5l7 7-7 7",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function Wt({mark:e,still:n}){return x("span",{className:"sc-waiting","aria-hidden":"true",children:[!n&&p("svg",{className:"sc-waiting-orbit",viewBox:"0 0 100 100","aria-hidden":"true",focusable:"false",children:p("circle",{className:"sc-waiting-arc",cx:"50",cy:"50",r:"46"})}),p(e,{className:"sc-waiting-mark"})]})}function Er({tone:e}){return p("span",{className:`sc-result sc-result-${e}`,"aria-hidden":"true",children:p(Ze,{kind:e==="ok"?"snap":"gone",size:84})})}function Va({machine:e}){let{runtime:n}=Ne(e);if(!n)return null;let t=De(n);return x("div",{className:"sc-arrived",children:[p(gr,{id:n.id,name:n.display_name}),p("span",{className:"sc-arrived-name",children:n.display_name}),x("span",{className:`sc-arrived-auth${t.tone==="warn"?" sc-tone-warn":""}`,children:[t.tone==="ok"&&p("i",{className:"sc-arrived-dot","aria-hidden":"true"}),t.tone==="ok"?"Signed in":t.tone==="warn"?"Signed out":"Could not tell"]})]})}function Ht({done:e,title:n,line:t,children:r}){return x("li",{className:"sc-stall-step",children:[x("svg",{viewBox:"0 0 20 20",className:e?"sc-stall-ok":"sc-stall-open","aria-hidden":"true",children:[p("circle",{cx:"10",cy:"10",r:"9"}),e?p("path",{d:"M6 10.3 8.7 13 14 7.5"}):x(Tn,{children:[p("path",{d:"M10 5.5v5.5"}),p("circle",{className:"sc-stall-pt",cx:"10",cy:"14.3",r:"1.2"})]})]}),p("span",{className:"sc-stall-title",children:n}),p("span",{className:"sc-stall-line",children:t}),r&&p("span",{className:"sc-stall-more",children:r})]})}function Ja({text:e}){return p(Tn,{children:e.split("`").map((n,t)=>t%2===1?p("code",{className:"sc-inline-code",children:n},t):n)})}function ut({k:e,v:n}){return x("li",{className:"sc-fact",children:[p("span",{className:"sc-fact-key",children:e}),p("span",{children:n})]})}import{forwardRef as Ya}from"react";import{jsx as Or,jsxs as Lr}from"react/jsx-runtime";var Tr=Ya(function({machine:n,className:t,...r},s){if(!n)return null;let{ariaLabel:a,state:i}=En(n);return Lr("button",{ref:s,type:"button","aria-label":a,className:["sc-btn","sc-btn-connected",t].filter(Boolean).join(" "),...r,children:[Or("span",{className:"sc-pill-tile","aria-hidden":"true",children:Or(Ze,{kind:i.tone==="busy"?"serving":i.tone==="ok"?"ready":n.pairing_lost?"gone":"paused",size:16,className:"sc-pill-mark"})}),Lr("span",{className:"sc-btn-connected-text",children:[i.word,!n.pairing_lost&&Lr("span",{className:"sc-btn-connected-where",children:[" on ",q(n)]})]}),Or("i",{className:`sc-dot sc-dot-${i.tone}`,"aria-hidden":"true"})]})});import{useEffect as za,useRef as Gr}from"react";var Dt=0,Br=null;function Qs(){if(typeof document>"u")return()=>{};Dt===0&&(Br=document.body.style.overflow,document.body.style.overflow="hidden"),Dt+=1;let e=!1;return()=>{e||(e=!0,Dt-=1,Dt===0&&(document.body.style.overflow=Br??"",Br=null))}}import{jsx as Vs}from"react/jsx-runtime";function dt({open:e,onClose:n,labelledBy:t,theme:r,style:s,children:a}){let i=Gr(null),c=Gr(null),o=Gr(null);return za(()=>{let l=i.current;if(l){if(!e){l.open&&l.close();return}return l.open||l.showModal(),document.activeElement===l&&c.current?.focus(),Qs()}},[e]),Vs("dialog",{ref:i,className:"soba-connect sc-modal","aria-labelledby":t,...r?{"data-theme":r}:{},style:s,onCancel:l=>{l.preventDefault(),n()},onPointerDown:l=>{o.current=l.target},onClick:l=>{l.target===l.currentTarget&&o.current===l.currentTarget&&n()},children:Vs("div",{className:"sc-modal-sheet",ref:c,tabIndex:-1,children:a})})}import{useEffect as Wr,useRef as ja}from"react";import{jsx as qa}from"react/jsx-runtime";var vn=8;function Hr({open:e,onClose:n,anchor:t,label:r,theme:s,style:a,children:i}){let c=ja(null);return Wr(()=>{let o=c.current;if(!(!o||!(typeof o.showPopover=="function")))try{e?o.showPopover():o.hidePopover()}catch{}},[e]),Wr(()=>{if(!e)return;let o=()=>{let u=c.current,m=t.current;if(!u||!m)return;let f=m.getBoundingClientRect(),g=u.offsetWidth,h=u.offsetHeight,y=window.innerWidth-g-vn,M=Math.max(vn,Math.min(f.right-g,Math.max(vn,y))),E=f.bottom+vn,R=f.top-vn-h,G=E+h>window.innerHeight-vn&&R>vn?R:E;u.style.left=`${Math.round(M)}px`,u.style.top=`${Math.round(G)}px`};o();let l=requestAnimationFrame(o);return window.addEventListener("scroll",o,!0),window.addEventListener("resize",o),()=>{cancelAnimationFrame(l),window.removeEventListener("scroll",o,!0),window.removeEventListener("resize",o)}},[e,t]),Wr(()=>{if(!e)return;let o=u=>{u.key==="Escape"&&n()},l=u=>{let m=u.target;m&&(c.current?.contains(m)||t.current?.contains(m)||n())};return document.addEventListener("keydown",o),document.addEventListener("pointerdown",l,!0),()=>{document.removeEventListener("keydown",o),document.removeEventListener("pointerdown",l,!0)}},[e,n,t]),qa("div",{ref:c,role:"dialog","aria-label":r,className:"soba-connect sc-pop",...s?{"data-theme":s}:{},popover:"manual",hidden:!e,style:a,children:i})}var pt=new Map,Bn=new Map,Js=!1;function Za(){Js||typeof window>"u"||(Js=!0,window.addEventListener("storage",e=>{!e.key||!pt.has(e.key)||(Bn.set(e.key,Tt(e.key)),Dr(e.key))}))}function Dr(e){for(let n of pt.get(e)??[])n()}function mt(e){return e??""}function Ur(e,n){let t=mt(e);Za();let r=pt.get(t)??new Set;return r.add(n),pt.set(t,r),()=>{r.delete(n),r.size===0&&pt.delete(t)}}function Ut(e){let n=mt(e),t=Bn.get(n);if(t!==void 0)return t;let r=e?Tt(e):null;return Bn.set(n,r),r}function Fr(){return null}function Qr(e,n){Ut(e)===null&&(Bn.set(mt(e),n),Dr(mt(e)))}function Vr(e,n){let t=mt(e);Bn.get(t)!==n&&(Bn.set(t,n),kr(e,n),Dr(t))}function ze(e){let n=`${e.unit}s`;return e.reward==="unlimited"?`Unlimited ${n} on your own AI`:e.reward==="included"&&e.includedUnits!==null?`${Ka(e.includedUnits)} ${n} a month once you connect`:e.reward==="credit"&&e.creditMicros>0?`${Xa(e.creditMicros)} back each month you stay connected`:null}function je(e){return e==="unlimited"||e==="included"}var zs=new Set(["user-hardware","user-subscription"]),Ys=new Set(["open-weights","frontier"]);function Le(e){return e===null||e.length===0?!1:e.every(n=>zs.has(n))}var Xa=e=>(e/1e6).toLocaleString("en-US",{style:"currency",currency:"USD",minimumFractionDigits:2,maximumFractionDigits:2}),Ka=e=>e.toLocaleString("en-US");function Jr(e,n){if(!(n===null||n.some(a=>Ys.has(a))))return!1;let r=e.findIndex(a=>zs.has(a));if(r===-1)return!1;let s=e.findIndex(a=>Ys.has(a));return s===-1||r<s}import{createContext as js,useContext as qs}from"react";var Yr=js(null);function Gn(){return qs(Yr)}var zr=js({context:null,machines:void 0,theme:"light"});function H(){return qs(zr)}import{useMemo as ei}from"react";import{createContext as _a,useContext as $a}from"react";var jr=_a(null);function F(){let e=$a(jr);if(!e)throw new Error("useSoba() must be used inside a <SobaProvider>.");return e}function ht(){let{compute:e}=F();return ei(()=>{let n=e.machines,t=[...n].sort((a,i)=>Ue([a,i])===a?-1:1).map(ni),r=Ue([...n]),s=fn(n);return{view:t.length?"machines":e.loading?"loading":e.error?"error":"empty",machines:t,primary:r?t.find(a=>a.machine.id===r.id)??null:null,connected:e.connected,online:e.online,stalled:e.connected&&!e.online&&s?t.find(a=>a.machine.id===s.id)??null:null,loading:e.loading,error:e.error,refresh:e.refresh}},[e])}function ni(e){let n=Ne(e);return{machine:e,name:q(e),state:An(e),status:$t(e),hardware:Kn(e),lastSeen:e.state==="offline"?_n(e.last_seen_at):null,runtimes:ge(e).map(t=>({runtime:t,name:t.display_name,auth:De(t),quarantined:!!t.quarantined})),runsOn:{by:n.by,name:n.runtime?.display_name??null}}}import{useCallback as qr,useEffect as ti,useMemo as Zr,useSyncExternalStore as ri}from"react";function kn(e={}){let{compute:n,connect:t}=F(),{value:r,onChange:s,defaultValue:a,remember:i=!0,user:c}=e,o=r!==void 0,l=i&&!o?vr(t.publishableKey,c):null,u=qr(R=>Ur(l,R),[l]),m=ri(u,qr(()=>Ut(l),[l]),Fr),f=Zr(()=>rt(n.machines),[n.machines]),g=Zr(()=>st(f),[f]);ti(()=>{o||!a||Qr(l,a)},[o,a,l]);let h=o?r:m??a??null,{selected:y,unavailable:M}=Zr(()=>ar(f,h??null),[f,h]),E=qr(R=>{o||Vr(l,R),s?.(R)},[o,l,s]);return{options:f,groups:g,selected:y,select:E,run:ir(y),unavailable:M,pickable:Ke(f),loading:n.loading&&!n.machines.length}}import{jsx as gt}from"react/jsx-runtime";function si({className:e}){let{theme:n}=H(),t=e?`soba-connect ${e}`:"soba-connect";return gt("div",{className:t,"data-theme":n,children:gt(Xr,{})})}function Xr(){let e=ht(),n=kn();return e.view==="loading"?gt("p",{className:"sc-note",children:"Loading\u2026"}):e.view==="error"?gt("p",{className:"sc-error",children:e.error?.message}):gt(Ar,{machines:e.machines.map(t=>t.machine),model:n.selected,onPickModel:n.select})}import{useCallback as At,useEffect as es,useMemo as pi,useRef as ns,useState as Hn}from"react";import{useId as oi}from"react";import{jsx as Wn,jsxs as Ft}from"react/jsx-runtime";function ft({open:e,onOpenChange:n,initialCode:t,onConnected:r,showStatus:s,reason:a}){let{error:i}=F(),c=Gn(),o=H(),l=()=>n(!1),u=oi(),m=o.context?.background?.trim(),f=m?gn(m,o.context?.accent):void 0;return Ft(dt,{open:e,onClose:l,labelledBy:u,theme:o.theme,style:f,children:[i?Ft("div",{className:"sc-card",children:[Wn("h2",{className:"sc-title",id:u,children:"Could not start"}),Wn("p",{className:"sc-error",children:i.message})]}):!c&&!o.context?Ft("div",{className:"sc-card",children:[Wn("h2",{className:"sc-title",id:u,children:"One moment"}),Wn("p",{className:"sc-note",children:"Getting your compute\u2026"})]}):Wn(Ir,{client:c,active:e,onClose:l,headingId:u,theme:o.theme,initialContext:o.context,...o.machines!==void 0?{initialMachines:o.machines}:{},...t?{initialCode:t}:{},...r?{onConnected:r}:{},...s===void 0?{}:{showStatus:s},...a?{reason:a}:{}}),Ft("p",{className:"sc-modal-foot",children:[Wn(re,{className:"sc-foot-mark"}),"Secured by Soba"]})]})}import{forwardRef as ai}from"react";import{jsx as ii}from"react/jsx-runtime";var Kr=ai(function(n,t){let{theme:r}=H();return ii(Tr,{ref:t,"data-theme":r,...n})});import{useCallback as li}from"react";function ci(){let{connect:e}=F(),n=ht(),t=li(()=>e.open("manual"),[e]);return{...En(n.primary?.machine??null),machine:n.primary,open:t,canOpen:e.hasModal,loading:n.view==="loading"}}function _r(e){return En(e)}import{useCallback as Zs,useEffect as ui,useState as di}from"react";function $r({enabled:e=!0,intervalMs:n=3e3}={}){let t=Gn(),[r,s]=di(null),a=Zs(async()=>{t&&s(await t.runs())},[t]);ui(()=>{if(!e||!t)return;let c=!0,o=Se(async()=>{let l=await t.runs();c&&s(l)},n);return()=>{c=!1,o()}},[e,t,n]);let i=Zs(async c=>{if(!t)throw new Error("Stopping a run needs <SobaProvider>.");await t.stopRun(c),await a().catch(()=>{})},[t,a]);return{runs:r,refresh:a,stop:i}}import{Fragment as Xs,jsx as Dn,jsxs as Ks}from"react/jsx-runtime";function Nn({children:e,variant:n,className:t,initialCode:r,onConnected:s,defaultOpen:a,open:i,onOpenChange:c,showConnected:o=!0}){let{compute:l,connect:u}=F(),m=H(),{theme:f}=m,g=Gn(),[h,y]=Hn(a??!!r),M=ns(null),E=i!==void 0,R=!E&&!a&&!r&&u.hasModal,G=E?i:R?u.isOpen:h,Y=P=>{R?P?u.open("manual"):u.close():E||y(P),c?.(P)},O=ns(G);es(()=>{O.current&&!G&&M.current?.focus(),O.current=G},[G]);let[L,T]=Hn(!1),{runs:w,stop:le}=$r({enabled:L}),$=kn(),be=pi(()=>L&&w?mi(l.machines,w):l.machines,[l.machines,L,w]),ee=Ue(be),Re=o&&_r(ee).connected,Be=At(()=>T(!1),[]),[me,Pe]=Hn(!1),j=At(async()=>{Pe(!0);try{await l.refresh()}finally{Pe(!1)}},[l]),ce=ns(j);ce.current=j,es(()=>{L&&ce.current()},[L]);let[rn,Z]=Hn(!1),[ye,we]=Hn([]),ne=!!m.context?.hosted_available;es(()=>{if(!L||!g||!ne)return;let P=!0;return g.hosted().then(C=>{P&&we(C.credentials)}).catch(()=>{}),()=>{P=!1}},[L,g,ne]);let[Ge,X]=Hn(null),K=At(async(P,C)=>{if(g){X(null);try{await g.approveRuntime(P,C),await l.refresh()}catch(I){X(I.message)}}},[g,l]),_=At(async(P,C)=>{if(g){X(null);try{await g.preferRuntime(P,C),await l.refresh()}catch(I){X(I.message)}}},[g,l]),We=At(async P=>{if(g){X(null);try{await g.disconnectHosted(P),we((await g.hosted()).credentials)}catch(C){X(C.message)}}},[g]),Ve=m.context?.background?.trim(),He=Ve?gn(Ve,m.context?.accent):void 0,B=Re&&!e,Q=()=>{if(B&&!E&&!a&&!r){T(P=>!P);return}Y(!0)};return Ks(Xs,{children:[B?Dn(Kr,{ref:M,machine:ee,"aria-haspopup":"dialog","aria-expanded":L,onClick:Q,...t?{className:t}:{}}):Dn("button",{ref:M,type:"button","data-theme":f,className:["sc-btn","sc-btn-icon",n==="primary"?"sc-btn-primary":"",t].filter(Boolean).join(" "),onClick:Q,children:e??Ks(Xs,{children:[Dn(re,{className:"sc-btn-mark"}),"Connect compute"]})}),Dn(Hr,{open:L,onClose:Be,anchor:M,label:"Your compute",theme:f,...He?{style:He}:{},children:Dn(Cn,{machines:be,hosted:ye,onApproveRuntime:(P,C)=>void K(P,C),onPreferRuntime:(P,C)=>void _(P,C),onDisconnectHosted:P=>void We(P),onRefresh:()=>void j(),refreshing:me,model:$.selected,onPickModel:$.select,error:Ge,runs:w,onStopRun:async P=>{X(null);try{await le(P)}catch(C){throw X(C.message),C}},onPair:()=>{T(!1),R?u.open("pair"):(Z(!0),Y(!0))},...m.context?.app.name?{appName:m.context.app.name}:{}})}),!R&&Dn(ft,{open:G,onOpenChange:P=>{P||Z(!1),Y(P)},...rn?{showStatus:!1}:{},...r?{initialCode:r}:{},...s?{onConnected:s}:{}})]})}function mi(e,n){return e.map(t=>{if(t.state==="offline")return t;let r=n.filter(s=>s.machine_id===t.id).length;return{...t,active:r,state:r>0?"busy":"online"}})}import{jsx as ts,jsxs as gi}from"react/jsx-runtime";function hi({initialCode:e,onConnected:n,className:t,showStatus:r=!0}){let{theme:s}=H();return gi("div",{className:t?`soba-connect ${t}`:"soba-connect","data-theme":s,children:[r&&ts(Xr,{}),ts("div",{className:"sc-compute-act",children:ts(Nn,{...e?{initialCode:e}:{},...n?{onConnected:n}:{}})})]})}import{useId as Si,useState as Ri}from"react";import{useCallback as ss,useEffect as to,useState as ro}from"react";import{useCallback as fi,useState as Ai}from"react";function bt(){let[e,n]=Ai(null);return{open:fi(()=>{n(null),bn().then(n)},[]),launch:e,note:e==="absent"?"Nothing opened here. That machine may be a different computer, or asleep.":null}}import{useCallback as _s,useMemo as $s}from"react";function xn(e){if(!e)return null;if(typeof e=="string")return e;if(typeof Response<"u"&&e instanceof Response)return eo(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"?eo(n.status):n.cause&&n.cause!==e?xn(n.cause):null}function eo(e){return e===402?"payment_required":e===409?"no_compute":null}function rs(...e){let[n,t]=e,{plan:r,compute:s,connect:a}=F(),i=t?.predict??e.length===0,c=yi(bi(n),s)??(i?wi(r,s):null),o=r.plan,l=r.plans,u=$s(()=>{if(c!=="payment_required")return null;let h=o?.price??0,y=o?.included_units??0;return l.find(M=>M.id!==o?.id&&M.price>h&&(M.included_units===null||M.included_units>y))??null},[c,l,o]),m=_s(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]),f=a.open,g=_s(()=>{c&&f(c)},[f,c]);return $s(()=>{if(!c)return null;let h=o?ze({unit:o.unit,reward:o.connected_reward,includedUnits:o.connected_included_units,creditMicros:o.connected_credit*1e6}):null,y=o&&je(o.connected_reward)?h:null;return{reason:c,...Ci(c,{connectOffer:y,connected:s.connected,online:s.online,machine:fn(s.machines)?.label??null,unit:o?.unit??"message",interval:o?.interval??"month",upgrade:u!==null,resets:r.current?.period_end??null}),connectOffer:y,upgradeTo:u,connect:g,upgrade:m}},[c,o,s,u,g,m,r.current?.period_end])}function bi(e){let n=xn(e);return n==="payment_required"||n==="no_compute"?n:null}function yi(e,n){return e==="no_compute"&&n.connected&&n.online?null:e}function wi(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 Ci(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 ${no(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 ${no(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 no(e){let n=new Date(e);return Number.isNaN(n.getTime())?e:n.toLocaleDateString(void 0,{day:"numeric",month:"long"})}function vi(e){let{plan:n,allowance:t,connected:r,online:s,quiet:a,error:i,predict:c,at:o,waved:l}=e;if(!n)return null;let u=e.allow!==void 0?e.allow:n.route_allow;if(r){if(s)return null;let y=Le(u);return{reason:"stalled",title:`${a??"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 m=xn(i),f=m==="payment_required"||m==="no_compute",g=n.ask_to_connect!==!1&&Jr(n.route_prefer,u);if(!c&&!f&&!g)return null;let h=Le(u)?ki(n.unit,Le(n.route_allow)):je(n.connected_reward)?xi(t,n,o):g?Ni(n.unit):null;return!h||h.dismissible&&l?null:{...h,dismissible:!!h.dismissible,ownCompute:!1,atTheWall:!h.dismissible&&(!c||h.meter!==null&&h.meter.left===0)}}function os(e={}){let{at:n=.25,error:t,allow:r}=e,s=e.predict??!(e.errorGiven??t!==void 0),{plan:a,compute:i,connect:c}=F(),o=Nr(c.publishableKey),[l,u]=ro(!1);to(()=>{u(xr(o))},[o]);let m=ss(()=>{u(!0),Mr(o)},[o]),f=ss(()=>c.open("manual"),[c]),g=ss(()=>c.open("no_compute"),[c]),h=bt(),[y,M]=ro(!1),{refresh:E}=i,{launch:R}=h;to(()=>{if(R===null||R==="absent")return;M(!1);let T=setInterval(()=>void E(),3e3),w=setTimeout(()=>{clearInterval(T),M(!0)},2e4);return()=>{clearInterval(T),clearTimeout(w)}},[R,E]);let G=Mi(c.app?.name,ct(c.connectUrl)),Y=a.loading||i.loading,O=fn(i.machines),L=Y?null:vi({plan:a.plan,allowance:{remaining:a.remaining,included:a.included},connected:i.connected,online:i.online,quiet:O?q(O):null,error:t,predict:s,...r!==void 0?{allow:r}:{},at:n,waved:l});return{reason:L?.reason??null,visible:L!==null,title:L?.title??null,detail:L?.detail??null,meter:L?.meter??null,dismissible:L?.dismissible??!1,dismissed:l,dismiss:m,open:f,atTheWall:L?.atTheWall??!1,steps:G,stalled:L?.reason==="stalled"?{machine:O?q(O):null,ownCompute:L.ownCompute,wake:h.open,launch:h.launch,note:h.note,stuck:y,connectAnother:g}:null,loading:Y}}function ki(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 Ni(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 xi(e,n,t){let{remaining:r,included:s}=e;if(r===null||s===null||s===0||r>Math.ceil(s*t))return null;let a=ze({unit:n.unit,reward:n.connected_reward,includedUnits:n.connected_included_units,creditMicros:n.connected_credit*1e6});return a?{reason:"running",title:r===0?`No ${n.unit}s left this month.`:`${r} ${n.unit}${r===1?"":"s"} left this month.`,detail:`${a}.`,meter:{left:r,of:s}}:null}function Mi(e,n){return[{lead:"Download Soba App",detail:"",...n?{linksLead:"Get it for"}:{},links:n?lt.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:fe.map(t=>({label:t.short,href:t.install}))}]}import{Fragment as oo,jsx as W,jsxs as en}from"react/jsx-runtime";function Pi(e){let{className:n,fallback:t=null}=e,r=os({...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:s}=F(),{theme:a}=H(),[i,c]=Ri(null),o=Si(),l=W(oo,{children:t});if(!r.visible)return l;if(r.stalled)return W(so,{className:n,theme:a,stalled:!0,children:W(Ei,{title:r.title??"",detail:r.detail??"",stalled:r.stalled})});let u=i??r.atTheWall;return en(so,{className:n,theme:a,children:[en("div",{className:"sc-nudge-top",children:[en("div",{className:"sc-nudge-say",children:[W("p",{className:"sc-nudge-title",children:r.title}),W("p",{className:"sc-nudge-detail",children:r.detail}),en("button",{type:"button",className:"sc-btn sc-btn-quiet sc-nudge-more","aria-expanded":u,"aria-controls":o,onClick:()=>c(!u),children:[u?"Hide the details":"How it works",W(Oi,{})]})]}),r.dismissible?W("button",{type:"button",className:"sc-nudge-dismiss","aria-label":"Dismiss",title:"Dismiss",onClick:r.dismiss,children:W(Ii,{})}):null]}),u?W("ol",{className:"sc-nudge-steps",id:o,children:r.steps.map(m=>en("li",{children:[m.opens?W("button",{type:"button",className:"sc-step-lead",onClick:()=>s.open("manual"),children:m.lead}):W("strong",{children:m.lead}),m.detail?W("span",{children:m.detail}):null,m.links.length>0?en("span",{className:"sc-step-links",children:[m.linksLead,m.links.map(f=>W("a",{href:f.href,target:"_blank",rel:"noreferrer noopener",children:f.label},f.href))]}):null]},m.lead))}):null,W(Nn,{variant:"primary"})]})}function so({className:e,theme:n,stalled:t,children:r}){return W("div",{className:e?`soba-connect sc-fill ${e}`:"soba-connect sc-fill","data-theme":n,children:W("div",{className:t?"sc-nudge sc-nudge-stalled":"sc-nudge",children:r})})}function Ei({title:e,detail:n,stalled:t}){return en(oo,{children:[W("div",{className:"sc-nudge-top",children:en("div",{className:"sc-nudge-say",children:[W("p",{className:"sc-nudge-title",children:e}),W("p",{className:"sc-nudge-detail",children:n}),t.note&&W("p",{className:"sc-nudge-note",children:t.note}),t.stuck&&W("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)&&W("button",{type:"button",className:"sc-btn sc-btn-quiet sc-nudge-more",onClick:t.connectAnother,children:t.stuck?"Connect it again":"Connect another machine"})]})}),W("button",{type:"button",className:"sc-btn sc-btn-primary",onClick:t.wake,children:"Open Soba App"})]})}function Ii(){return W("svg",{viewBox:"0 0 16 16","aria-hidden":"true",focusable:"false",className:"sc-nudge-x",children:W("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 Oi(){return W("svg",{viewBox:"0 0 16 16","aria-hidden":"true",focusable:"false",className:"sc-nudge-chev",children:W("path",{d:"M4.5 6.5 8 10l3.5-3.5",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round"})})}var Li=new Set(["delta","thinking","status","done","error"]);function Un(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 s=r;if(typeof s.type!="string"||!Li.has(s.type))return null;let a={type:s.type};return typeof s.text=="string"&&(a.text=s.text),typeof s.message=="string"&&(a.message=s.message),typeof s.tool=="string"&&(a.tool=s.tool),typeof s.tier=="string"&&(a.tier=s.tier),s.usage&&typeof s.usage=="object"&&(a.usage=s.usage),typeof s.session=="string"&&(a.session=s.session),typeof s.toolInput=="string"&&(a.toolInput=s.toolInput),s.git&&typeof s.git=="object"&&(a.git=s.git),s.turn&&typeof s.turn=="object"&&typeof s.turn.text=="string"&&(a.turn={text:s.turn.text}),typeof s.reason=="string"&&(a.reason=s.reason),typeof s.retryable=="boolean"&&(a.retryable=s.retryable),(s.state==="interrupted"||s.state==="resumed")&&(a.state=s.state),a}async function*as(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(),s=new TextDecoder,a="",i=[];try{for(;;){let o=await r.read();if(o.done)break;for(a+=s.decode(o.value,{stream:!0});;){let l=a.indexOf(`
|
|
3
|
+
`);if(l===-1)break;let u=io(a.slice(0,l));if(a=a.slice(l+1),t){let m=u.trim()?Un(u):null;m&&(yield m);continue}if(u===""){let m=i.join(`
|
|
4
|
+
`);if(i=[],m==="[DONE]")return;let f=m?Un(m):null;f&&(yield f);continue}ao(u,i)}}!t&&a&&ao(io(a),i);let c=t?a.trim():i.join(`
|
|
5
|
+
`);if(c&&c!=="[DONE]"){let o=Un(c);o&&(yield o)}}finally{r.cancel().catch(()=>{})}}function ao(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 io(e){return e.endsWith("\r")?e.slice(0,-1):e}async function Ti(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 lo}from"react/jsx-runtime";function Bi({caption:e,disabled:n,className:t,...r}){let{theme:s}=H(),{options:a,selected:i,select:c,pickable:o}=kn(r);return o?lo("span",{className:"soba-connect sc-inline","data-theme":s,children:lo(ot,{options:a,selected:i,onPick:c,...e?{caption:e}:{},...n?{disabled:n}:{},...t?{className:t}:{}})}):null}import{useEffect as Gi}from"react";var co="data-soba-react",uo=!1;function yt(){if(uo||typeof document>"u"||(uo=!0,document.querySelector(`style[${co}]`)))return;let e=document.createElement("style");e.setAttribute(co,""),e.textContent=`.soba-connect {
|
|
6
6
|
--sc-ground: #ffffff;
|
|
7
7
|
--sc-sheet: #ffffff;
|
|
8
8
|
--sc-raised: #f6f6f7;
|
|
@@ -862,6 +862,119 @@ a.sc-btn {
|
|
|
862
862
|
text-align: center;
|
|
863
863
|
}
|
|
864
864
|
|
|
865
|
+
.sc-screen-head {
|
|
866
|
+
display: flex;
|
|
867
|
+
align-items: center;
|
|
868
|
+
gap: calc(12px * var(--sc-scale, 1));
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
.sc-back {
|
|
872
|
+
flex: none;
|
|
873
|
+
display: grid;
|
|
874
|
+
place-items: center;
|
|
875
|
+
width: calc(36px * var(--sc-scale, 1));
|
|
876
|
+
height: calc(36px * var(--sc-scale, 1));
|
|
877
|
+
padding: 0;
|
|
878
|
+
border: 0;
|
|
879
|
+
border-radius: 50%;
|
|
880
|
+
background: var(--sc-tray-card, #ffffff);
|
|
881
|
+
color: var(--sc-text, #1b1b1a);
|
|
882
|
+
font: inherit;
|
|
883
|
+
cursor: pointer;
|
|
884
|
+
box-shadow: var(--sc-shadow-1);
|
|
885
|
+
transition: background-color 120ms ease;
|
|
886
|
+
}
|
|
887
|
+
.sc-back:hover:not(:disabled) {
|
|
888
|
+
background: var(--sc-tray-sunk, #efefed);
|
|
889
|
+
}
|
|
890
|
+
.sc-back:disabled {
|
|
891
|
+
cursor: default;
|
|
892
|
+
opacity: 0.5;
|
|
893
|
+
}
|
|
894
|
+
.sc-back-glyph {
|
|
895
|
+
width: calc(15px * var(--sc-scale, 1));
|
|
896
|
+
height: calc(15px * var(--sc-scale, 1));
|
|
897
|
+
}
|
|
898
|
+
.sc-screen-title {
|
|
899
|
+
margin: 0;
|
|
900
|
+
font-size: calc(var(--sc-font-size, 15px) * 1.3333);
|
|
901
|
+
font-weight: 600;
|
|
902
|
+
color: var(--sc-text, #1b1b1a);
|
|
903
|
+
}
|
|
904
|
+
|
|
905
|
+
.sc-group-card.sc-mopts {
|
|
906
|
+
padding: 0 calc(16px * var(--sc-scale, 1));
|
|
907
|
+
}
|
|
908
|
+
.sc-mopt {
|
|
909
|
+
display: flex;
|
|
910
|
+
align-items: center;
|
|
911
|
+
gap: calc(14px * var(--sc-scale, 1));
|
|
912
|
+
width: 100%;
|
|
913
|
+
padding: calc(16px * var(--sc-scale, 1)) 0;
|
|
914
|
+
border: 0;
|
|
915
|
+
background: transparent;
|
|
916
|
+
font: inherit;
|
|
917
|
+
color: inherit;
|
|
918
|
+
text-align: left;
|
|
919
|
+
cursor: pointer;
|
|
920
|
+
}
|
|
921
|
+
.sc-mopt + .sc-mopt {
|
|
922
|
+
box-shadow: inset 0 1px 0 var(--sc-line, #e9e9e7);
|
|
923
|
+
}
|
|
924
|
+
.sc-mopt:disabled {
|
|
925
|
+
cursor: default;
|
|
926
|
+
opacity: 0.5;
|
|
927
|
+
}
|
|
928
|
+
.sc-mopt-say {
|
|
929
|
+
display: flex;
|
|
930
|
+
flex: 1;
|
|
931
|
+
min-width: 0;
|
|
932
|
+
flex-direction: column;
|
|
933
|
+
gap: calc(2px * var(--sc-scale, 1));
|
|
934
|
+
}
|
|
935
|
+
.sc-mopt-name {
|
|
936
|
+
|
|
937
|
+
overflow-wrap: anywhere;
|
|
938
|
+
font-size: calc(var(--sc-font-size, 15px) * 1.0667);
|
|
939
|
+
font-weight: 600;
|
|
940
|
+
}
|
|
941
|
+
.sc-mopt-desc {
|
|
942
|
+
font-size: calc(var(--sc-font-size, 15px) * 0.9333);
|
|
943
|
+
line-height: calc(20px * var(--sc-scale, 1));
|
|
944
|
+
color: var(--sc-muted, #6b6b69);
|
|
945
|
+
}
|
|
946
|
+
|
|
947
|
+
.sc-ring {
|
|
948
|
+
flex: none;
|
|
949
|
+
box-sizing: border-box;
|
|
950
|
+
display: grid;
|
|
951
|
+
place-items: center;
|
|
952
|
+
width: calc(22px * var(--sc-scale, 1));
|
|
953
|
+
height: calc(22px * var(--sc-scale, 1));
|
|
954
|
+
border: 2px solid var(--sc-line-2, #cfcfcb);
|
|
955
|
+
border-radius: 50%;
|
|
956
|
+
color: var(--sc-accent-fg, #ffffff);
|
|
957
|
+
transition:
|
|
958
|
+
background-color 120ms ease,
|
|
959
|
+
border-color 120ms ease;
|
|
960
|
+
}
|
|
961
|
+
.sc-ring-on {
|
|
962
|
+
border-color: var(--sc-accent, #1b1b1a);
|
|
963
|
+
background: var(--sc-accent, #1b1b1a);
|
|
964
|
+
}
|
|
965
|
+
.sc-ring-tick {
|
|
966
|
+
width: calc(13px * var(--sc-scale, 1));
|
|
967
|
+
height: calc(13px * var(--sc-scale, 1));
|
|
968
|
+
}
|
|
969
|
+
|
|
970
|
+
.sc-screen-foot {
|
|
971
|
+
margin: 0;
|
|
972
|
+
padding: 0 calc(4px * var(--sc-scale, 1));
|
|
973
|
+
font-size: max(12px, calc(var(--sc-font-size, 15px) * 0.8667));
|
|
974
|
+
line-height: 1.5;
|
|
975
|
+
color: var(--sc-muted, #6b6b69);
|
|
976
|
+
}
|
|
977
|
+
|
|
865
978
|
.sc-arow {
|
|
866
979
|
display: flex;
|
|
867
980
|
align-items: center;
|
|
@@ -1429,8 +1542,10 @@ a.sc-btn {
|
|
|
1429
1542
|
bottom: auto;
|
|
1430
1543
|
z-index: 2147483000;
|
|
1431
1544
|
|
|
1432
|
-
width: min(92vw,
|
|
1433
|
-
max-width: min(92vw,
|
|
1545
|
+
width: min(92vw, 320px);
|
|
1546
|
+
max-width: min(92vw, 320px);
|
|
1547
|
+
--sc-font-size: 12.5px;
|
|
1548
|
+
--sc-scale: 0.8;
|
|
1434
1549
|
|
|
1435
1550
|
max-height: calc(100vh - 24px);
|
|
1436
1551
|
overflow-y: auto;
|
|
@@ -1438,7 +1553,7 @@ a.sc-btn {
|
|
|
1438
1553
|
margin: 0;
|
|
1439
1554
|
padding: 0;
|
|
1440
1555
|
border: 0;
|
|
1441
|
-
border-radius:
|
|
1556
|
+
border-radius: 16px;
|
|
1442
1557
|
background: var(--sc-tray, #f6f6f7);
|
|
1443
1558
|
|
|
1444
1559
|
box-shadow:
|
|
@@ -3896,7 +4011,7 @@ li.sc-plan-row.sc-plan-current {
|
|
|
3896
4011
|
transform: none;
|
|
3897
4012
|
}
|
|
3898
4013
|
}
|
|
3899
|
-
`,document.head.appendChild(e)}import{jsx as Ue,jsxs as bt}from"react/jsx-runtime";function $s(e){if(!e)return null;let n=kn(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 wi(){return bt("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 Ci({error:e,onRetry:n,onDismiss:t,title:r,className:s}){let o=$s(e),a=G();return yi(()=>At(),[]),o?Ue("div",{className:s?`soba-connect ${s}`:"soba-connect","data-theme":a.theme,role:"alert",children:bt("div",{className:"sc-card sc-limit sc-run-error",children:[bt("div",{className:"sc-limit-head",children:[Ue("span",{className:"sc-limit-mark sc-run-error-mark","aria-hidden":"true",children:Ue(wi,{})}),bt("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:o})]})]}),(t||n)&&bt("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 vi,useState as eo}from"react";import{jsx as ae,jsxs as Ht}from"react/jsx-runtime";function ki({reason:e}){return ae("span",{className:"sc-limit-mark","aria-hidden":"true",children:e==="no_compute"?ae(St,{}):ae(oe,{})})}function Ni(e){let{error:n,variant:t="card",onDismiss:r,className:s}=e,o=Xr(n,{predict:e.predict??!("error"in e)}),a=vi(),l=G();if(!o)return null;let i=ae(xi,{offer:o,headingId:a,onDismiss:r});return t==="dialog"?ae(ct,{open:!0,onClose:()=>r?.(),labelledBy:a,theme:l.theme,children:i}):ae("div",{className:s?`soba-connect ${s}`:"soba-connect","data-theme":l.theme,children:i})}function xi({offer:e,headingId:n,onDismiss:t}){let{compute:r}=D(),[s,o]=eo(!1),[a,l]=eo(null),i=e.reason==="no_compute"&&r.connected&&!r.online,c=i||e.connectOffer!==null||!r.connected,u=ft();async function m(){o(!0),l(null);try{await e.upgrade()}catch(A){l(A.message)}finally{o(!1)}}return Ht("div",{className:"sc-card sc-limit",children:[Ht("div",{className:"sc-limit-head",children:[ae(ki,{reason:e.reason}),Ht("div",{children:[ae("h2",{className:"sc-limit-title",id:n,children:e.title}),ae("p",{className:"sc-limit-body",children:e.body})]})]}),a&&ae("p",{className:"sc-error",children:a}),i&&u.note&&ae("p",{className:"sc-limit-note",children:u.note}),Ht("div",{className:"sc-limit-actions",children:[t&&ae("button",{type:"button",className:"sc-btn sc-btn-quiet",onClick:t,disabled:s,children:"Not now"}),e.upgradeTo&&ae("button",{type:"button",className:c?"sc-btn":"sc-btn sc-btn-primary",onClick:()=>void m(),disabled:s,children:s?"Opening\u2026":e.upgradeTo.selectable?`Switch to ${e.upgradeTo.name}`:`${e.upgradeTo.name} for $${e.upgradeTo.price.toLocaleString()}/${e.upgradeTo.interval}`}),c&&ae("button",{type:"button",className:i?"sc-btn":"sc-btn sc-btn-primary",onClick:e.connect,disabled:s,children:i?"Connect another machine":"Connect compute"}),i&&ae("button",{type:"button",className:"sc-btn sc-btn-primary",onClick:u.open,disabled:s,children:"Open Soba App"})]})]})}import{useMemo as Si}from"react";function yt(){let{plan:e,compute:n,connect:t}=D();return Si(()=>{let r=e.plan,s=e.current,o={plan:r,assignment:s,loading:e.loading,error:e.error,periodEnd:s?.period_end?new Date(s.period_end):null};if(!r)return{...o,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=Ri(s?.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,m=e.used??0,A=i===null?null:Math.max(0,i-m),g=i&&i>0?Math.min(100,Math.round(m/i*100)):null,h=i!==null&&m>=i,y=a!==null?"trial":u?"unlimited":h?r.overage==="meter"?"metered":"spent":"within";return{...o,state:y,trialDaysLeft:a,ceiling:i,raised:l,uncounted:c,used:m,remaining:A,percent:g,unlimited:u,reward:Mi(r,l||c,n.connected,()=>t.open("manual")),summary:Pi({plan:r,assignment:s,used:m,ceiling:i,trialDaysLeft:a,raised:l,uncounted:c,state:y})}},[e,n.connected,t])}function Mi(e,n,t,r){let s=Ye({unit:e.unit,reward:e.connected_reward,includedUnits:e.connected_included_units,creditMicros:e.connected_credit*1e6});return s?{line:s,inForce:n,required:!1,connected:t,actionable:ze(e.connected_reward)&&!t,open:r}:Ie(e.route_allow)&&!t?{line:"Nothing connected yet, so nothing can run.",inForce:!1,required:!0,connected:t,actionable:!0,open:r}:null}function Pi(e){let{plan:n,assignment:t,used:r,ceiling:s,trialDaysLeft:o,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"&&o!==null){let g=n.price===0?"it continues free":`it is $${n.price.toLocaleString()} a ${n.interval}`;return`${o} ${o===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-(s??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 ${no(t.period_end)}.${u}`:`Allowance spent. It comes back at the start of the next period.${u}`;let m=Math.max(0,(s??0)-r),A=a?` Raised from ${(n.included_units??0).toLocaleString()} while your own AI is connected.`:t?.period_end?` Resets ${no(t.period_end)}.`:"";return`${m.toLocaleString()} of ${(s??0).toLocaleString()} ${n.unit}s left.${A}${u}`}function Ri(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 no(e){let n=new Date(e);return Number.isNaN(n.getTime())?e:n.toLocaleDateString(void 0,{day:"numeric",month:"long"})}import{Fragment as Ii,jsx as ie,jsxs as Oe}from"react/jsx-runtime";function es({heading:e="Current plan",showUsage:n=!0,showName:t=!0,className:r}){let s=yt(),{theme:o}=G(),a=A=>ie("section",{className:r?`soba-connect sc-fill ${r}`:"soba-connect sc-fill","data-theme":o,children:Oe("div",{className:"sc-card sc-current",children:[e&&ie("h2",{className:"sc-section-title",children:e}),A]})});if(s.error)return a(ie("p",{className:"sc-error",children:s.error.message}));if(s.loading)return a(ie("p",{className:"sc-note",children:"Loading\u2026"}));if(!s.plan)return a(Oe("div",{className:"sc-current-main",children:[ie("p",{className:"sc-current-name",children:"No plan"}),ie("p",{className:"sc-sub",children:s.summary})]}));let{plan:l,trialDaysLeft:i,percent:c,unlimited:u,reward:m}=s;return a(Oe(Ii,{children:[Oe("div",{className:"sc-current-grid",children:[(t||i!==null)&&Oe("div",{className:"sc-current-main",children:[t?Oe("p",{className:"sc-current-name",children:[l.name,i!==null&&Oe("span",{className:"sc-trial-badge",children:[i," ",i===1?"day":"days"," left"]})]}):i!==null&&ie("p",{className:"sc-current-trial",children:Oe("span",{className:"sc-trial-badge",children:[i," ",i===1?"day":"days"," left"]})}),t&&l.description&&ie("p",{className:"sc-sub",children:l.description})]}),n&&Oe("div",{className:"sc-usage",children:[Oe("div",{className:"sc-row-between",children:[ie("span",{className:"sc-fact-key",children:"Usage"}),ie("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&&ie("div",{className:"sc-meter",role:"presentation",children:c>0&&ie("span",{className:c>=100?"sc-meter-fill sc-meter-full":"sc-meter-fill",style:{width:`${c}%`}})}),ie("p",{className:"sc-usage-line",children:s.summary})]})]}),m&&Oe("div",{className:"sc-current-foot",children:[ie("p",{className:m.required?"sc-plan-reward-line sc-plan-reward-need":m.inForce?"sc-plan-reward-line":"sc-plan-reward-line sc-plan-reward-open",children:m.required?m.line:m.inForce?`In force: ${Ei(m.line)}.`:m.line}),(m.actionable||m.connected)&&ie(vn,{})]})]}))}var Ei=e=>e.charAt(0).toLowerCase()+e.slice(1);import{useCallback as Oi,useMemo as Li,useState as to}from"react";var Ti={"user-hardware":"your own machine","user-subscription":"your own AI subscription","open-weights":"open models we host",frontier:"frontier models"},Bi=new Set(["user-hardware","user-subscription"]);function ns(e={}){let{plan:n,compute:t,connect:r}=D(),[s,o]=to(null),[a,l]=to(null),{featured:i,onSelect:c,successUrl:u,cancelUrl:m}=e,A=Oi(async h=>{o(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}:{},...m?{cancelUrl:m}:{}});window.location.assign(y);return}}catch(y){throw l(y.message),y}finally{(h.selectable||c)&&o(null)}},[n,c,u,m]),g=Li(()=>n.plans.map(h=>{let y=n.current?.plan_id===h.id;return{plan:h,current:y,featured:i===h.id&&!y,price:Gi(h),allowance:h.included_units===null?`Unlimited ${h.unit}s`:`${h.included_units.toLocaleString()} ${h.unit}${h.included_units===1?"":"s"}`,allowanceNote:Wi(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:Ti[M]??M,owned:Bi.has(M),runtimes:ar(M).map(I=>I.id)})),connect:Hi(h,y,t.connected,()=>r.open("manual")),cta:{label:Di(h,y,s===h.id),disabled:y||s!==null,busy:s===h.id,take:()=>A(h)}}}),[n.plans,n.current,i,t.connected,r,s,A]);return{offers:g,current:g.find(h=>h.current)??null,loading:n.loading,error:n.error,failed:a}}function Gi(e){return e.price===0?{amount:"Free",interval:null,free:!0}:{amount:`$${e.price.toLocaleString()}`,interval:e.interval,free:!1}}function Wi(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 Hi(e,n,t,r){let s=Ye({unit:e.unit,reward:e.connected_reward,includedUnits:e.connected_included_units,creditMicros:e.connected_credit*1e6}),o=Ie(e.route_allow)&&!t;if(!s&&!o)return null;let a=ze(e.connected_reward);return{key:s?"Connect your own":"To use this",line:s??(n?"Nothing connected yet, so nothing can run.":"Runs only on compute you connect."),reward:s!==null,actionable:n&&(a||o)&&!t,open:r}}function Di(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 W}from"react/jsx-runtime";function Dt(e){return e?`soba-connect sc-fill ${e}`:"soba-connect sc-fill"}function ts({onSelect:e,successUrl:n,cancelUrl:t,showCompute:r=!0,showConnect:s=!1,variant:o="cards",featured:a,className:l}){let{offers:i,loading:c,error:u,failed:m}=ns({...a?{featured:a}:{},...e?{onSelect:e}:{},...n?{successUrl:n}:{},...t?{cancelUrl:t}:{}}),{theme:A}=G();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:s};return W("div",{className:Dt(l),"data-theme":A,"data-variant":o,children:[o==="rows"?b(Fi,{offers:i,shelf:g}):o==="table"?b(Qi,{offers:i,shelf:g}):b(Ui,{offers:i,shelf:g}),m&&b("p",{className:"sc-error",children:m})]})}function Ui({offers:e,shelf:n}){return b("div",{className:"sc-plans",children:e.map(t=>W("div",{className:ro("sc-plan",t),children:[W("div",{className:"sc-row-between",children:[b("span",{className:"sc-title",children:t.plan.name}),b(rs,{offer:t})]}),b("p",{className:"sc-sub",children:t.plan.description}),b(ss,{price:t.price,free:"forever"}),b(is,{offer:t,shelf:n}),b(so,{offer:t}),b("div",{className:"sc-plan-band",children:n.showCompute&&b(as,{offer:t})}),b("div",{className:"sc-plan-band",children:b(os,{offer:t})})]},t.plan.id))})}function Fi({offers:e,shelf:n}){return b("ul",{className:"sc-plan-rows",children:e.map(t=>W("li",{className:ro("sc-plan-row",t),children:[W("div",{className:"sc-row-main",children:[W("span",{className:"sc-row-name",children:[b("span",{className:"sc-title",children:t.plan.name}),b(rs,{offer:t})]}),t.plan.description&&b("p",{className:"sc-sub",children:t.plan.description}),b(so,{offer:t}),n.showCompute&&b(as,{offer:t,inline:!0}),b(os,{offer:t,inline:!0})]}),W("div",{className:"sc-row-side",children:[b(ss,{price:t.price,free:"forever",small:!0}),b(is,{offer:t,shelf:n})]})]},t.plan.id))})}function Qi({offers:e,shelf:n}){let t=e.some(a=>a.plan.overage_per_unit>0),r=e.some(a=>a.plan.trial_days>0),s=e.some(a=>a.connect!==null),o=a=>[a.current?"sc-col-current":"",a.featured?"sc-col-featured":""].filter(Boolean).join(" ")||void 0;return b("div",{className:"sc-table-scroll",children:W("table",{className:"sc-plan-table",children:[b("thead",{children:W("tr",{children:[b("td",{}),e.map(a=>W("th",{scope:"col",className:o(a),children:[W("span",{className:"sc-row-name",children:[b("span",{className:"sc-title",children:a.plan.name}),b(rs,{offer:a})]}),b(ss,{price:a.price,small:!0})]},a.plan.id))]})}),W("tbody",{children:[W("tr",{children:[b("th",{scope:"row",children:"Included"}),e.map(a=>b("td",{className:o(a),children:a.allowance},a.plan.id))]}),t&&W("tr",{children:[b("th",{scope:"row",children:"Then"}),e.map(a=>b("td",{className:o(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&&W("tr",{children:[b("th",{scope:"row",children:"Trial"}),e.map(a=>b("td",{className:o(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&&W("tr",{children:[b("th",{scope:"row",children:"Runs on"}),e.map(a=>b("td",{className:o(a),children:b(as,{offer:a,bare:!0})},a.plan.id))]}),s&&W("tr",{children:[b("th",{scope:"row",children:"Connect your own"}),e.map(a=>b("td",{className:o(a),children:b(os,{offer:a,bare:!0})},a.plan.id))]}),W("tr",{className:"sc-table-buy",children:[b("td",{}),e.map(a=>b("td",{className:o(a),children:b(is,{offer:a,shelf:n})},a.plan.id))]})]})]})})}function ro(e,n){return[e,n.current?"sc-plan-current":"",n.featured?"sc-plan-featured":""].filter(Boolean).join(" ")}function rs({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 ss({price:e,small:n,free:t}){return W("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?W("span",{className:"sc-plan-interval",children:["/",e.interval]}):t&&b("span",{className:"sc-plan-interval sc-plan-after",children:t})]})}function so({offer:e}){return W("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 os({offer:e,inline:n,bare:t}){let r=e.connect;if(!r)return t?b("span",{className:"sc-muted-cell",children:"None"}):null;let s=r.reward?"sc-plan-reward-line":"sc-plan-reward-line sc-plan-reward-need",o=r.actionable?W("button",{type:"button",className:`${s} sc-plan-reward-act`,"aria-label":"Connect compute",onClick:r.open,children:[b("span",{className:"sc-reward-said",children:r.line}),W("span",{className:"sc-reward-do","aria-hidden":!0,children:[b(oe,{className:"sc-reward-mark"}),"Connect compute"]})]}):b("p",{className:s,children:r.line});return t?o:b("div",{className:n?"sc-plan-reward sc-plan-reward-inline":"sc-plan-reward",children:o})}function as({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(s=>W("li",{className:s.owned?"sc-compute-own":void 0,children:[s.label,b(Vi,{runtimes:s.runtimes})]},s.costClass))});return t?r:W("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 is({offer:e,shelf:n}){let t=e.connect;return n.showConnect&&t?.actionable?W("button",{type:"button",className:"sc-btn sc-btn-primary sc-btn-icon",onClick:t.open,children:[b(oe,{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 Vi({runtimes:e}){return e.length===0?null:b("span",{className:"sc-compute-marks",children:e.map(n=>{let t=Xe[n];return t?b(t,{className:"sc-rt-mark"},n):null})})}import{jsx as ls,jsxs as oo}from"react/jsx-runtime";function Ji({heading:e,plansHeading:n,showUsage:t=!0,showName:r=!0,className:s,...o}){let{plan:a,loading:l}=yt(),{theme:i}=G(),c=n??(l?"Plans":a?"Change plan":"Choose a plan");return oo("div",{className:s?`soba-connect sc-fill sc-billing ${s}`:"soba-connect sc-fill sc-billing","data-theme":i,children:[ls(es,{...e===void 0?{}:{heading:e},showUsage:t,showName:r}),oo("section",{className:"sc-billing-plans",children:[c&&ls("h2",{className:"sc-section-title",children:c}),ls(ts,{...o})]})]})}import{useCallback as ao,useState as io}from"react";function cs({plan:e,successUrl:n,cancelUrl:t,label:r}){let{plan:s}=D(),[o,a]=io(!1),[l,i]=io(null),c=ao(()=>s.checkout(e.id,{...n?{successUrl:n}:{},...t?{cancelUrl:t}:{}}),[s,e.id,n,t]),u=ao(async()=>{a(!0),i(null);try{window.location.assign(await c())}catch(m){i(m.message),a(!1)}},[c]);return{label:o?"Opening\u2026":r??`Subscribe for $${e.price.toLocaleString()}/${e.interval}`,busy:o,error:l,buy:u,session:c}}import{jsx as lo,jsxs as zi}from"react/jsx-runtime";function Yi({plan:e,successUrl:n,cancelUrl:t,label:r,className:s}){let{theme:o}=G(),a=cs({plan:e,...n?{successUrl:n}:{},...t?{cancelUrl:t}:{},...r?{label:r}:{}});return zi("div",{className:s?`soba-connect ${s}`:"soba-connect","data-theme":o,children:[lo("button",{type:"button",className:"sc-btn sc-btn-primary",disabled:a.busy,onClick:()=>void a.buy(),children:a.label}),a.error&&lo("p",{className:"sc-error",children:a.error})]})}import{useCallback as Fe,useEffect as $e,useMemo as Fn,useRef as en,useState as le}from"react";var ji="soba.session:";function co(e){return!e.cacheKey||!e.endpoint?null:ji+JSON.stringify([e.endpoint,e.user??null,e.cacheKey])}function qi(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 Zi(e,n){try{n?globalThis.localStorage?.setItem(e,JSON.stringify(n)):globalThis.localStorage?.removeItem(e)}catch{}}var uo=6e4,Xi=1e4,Ut=class{#e;#n=null;#r=null;#t;#s=new Set;constructor(n){this.#t=n,this.#e=n.token??null;let t=co(n),r=t&&!this.#e?qi(t):null;r&&r.expiresAt-uo>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()+Xi,this.#n-uo)}subscribe(n){return this.#s.add(n),()=>this.#s.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 s=await r.json(),o=s.session??s.token;if(!o)throw new Error(`${n} answered without a \`session\`. See @soba-so/react's README.`);let a=s.expires_in??s.expiresIn;this.#e=o,this.#n=typeof a=="number"?Date.now()+a*1e3:null;let l=co(this.#t);l&&Zi(l,this.#n===null?null:{token:o,expiresAt:this.#n});for(let i of this.#s)i();return o})();try{return await this.#r}finally{this.#r=null}}},Un=new Map,po=new WeakMap,Ki=1;function _i(e){if(e.token||!e.endpoint)return null;let n=0;return e.fetchImpl&&(n=po.get(e.fetchImpl)??Ki++,po.set(e.fetchImpl,n)),JSON.stringify([e.endpoint,e.user??null,n,e.cacheKey??null])}function mo(e){let n=_i(e);if(!n)return new Ut(e);let t=Un.get(n)??{holder:new Ut(e),users:0};return Un.set(n,t),t.holder}function ho(e){for(let n of Un.values())n.holder===e&&n.users++}function go(e){for(let[n,t]of Un)if(t.holder===e){setTimeout(()=>{--t.users<=0&&Un.get(n)===t&&Un.delete(n)},0);return}}function fo(e,n=fetch.bind(globalThis)){return async(t,r)=>{let s=await n(t,r);if(s.status!==401||!e.canRefresh)return s;let o;try{o=await e.refresh()}catch{return s}return n(t,$i(r,o))}}function $i(e,n){let t=new Headers(e?.headers);return t.set("authorization",`Bearer ${n}`),{...e,headers:t}}import{jsx as us,jsxs as rl}from"react/jsx-runtime";var el="https://soba.so",nl=3e4;function tl(e){let{children:n,session:t,sessionEndpoint:r,user:s,sessionCacheKey:o,runEndpoint:a,theme:l,initialMachines:i,initialConnect:c=null,initialPlans:u,initialCurrentPlan:m=null,baseUrl:A=el,pollMs:g=nl,injectStyles:h=!0,modal:y=!0,fetchImpl:M,onError:I}=e,[E,T]=le(t??null),[V,O]=le(null),[S,B]=le(c),[C,ce]=le(null),[_,Ae]=le(c===null),[$,Me]=le(i??[]),[Le,ee]=le(null),[Te,q]=le(i===void 0),[ne,Nn]=le(u??[]),[Z,X]=le(m),[be,ye]=le(null),[pe,z]=le(u===void 0),[te,re]=le(null),[Be,Q]=le(!1),Ge=en(I);Ge.current=I;let K=Fe(N=>{O(N),Ge.current?.(N)},[]);$e(()=>{h&&At()},[h]);let U=Fn(()=>mo({...t?{token:t}:{},...r?{endpoint:r}:{},...s?{user:s}:{},...M?{fetchImpl:M}:{},...o?{cacheKey:o}:{}}),[t,r,s,M,o]);$e(()=>{let N=!0;ho(U);let se=U.subscribe(()=>{N&&T(U.token)});return!U.token&&!U.canRefresh?K(new Error("<SobaProvider> needs a `session` or a `sessionEndpoint`. A browser cannot mint one: that takes your secret key.")):U.ensure().then(()=>N&&T(U.token),ve=>N&&K(ve)),()=>{N=!1,se(),go(U)}},[U,K]),$e(()=>{V&&(Ae(!1),q(!1),z(!1),ce(N=>N??V),ee(N=>N??V),ye(N=>N??V))},[V]),$e(()=>{let N=U.refreshAt;if(N===null)return;let se=()=>{U.refresh().catch(Pe=>K(Pe))},ve=()=>{document.hidden||(document.removeEventListener("visibilitychange",ve),se())},Sn=setTimeout(()=>{typeof document<"u"&&document.hidden?document.addEventListener("visibilitychange",ve):se()},Math.max(0,N-Date.now()));return()=>{clearTimeout(Sn),typeof document<"u"&&document.removeEventListener("visibilitychange",ve)}},[U,K,E]);let w=en(c?.machines_url??null),v=Fn(()=>{if(!E)return null;let N=new qn({session:E,baseUrl:A,fetchImpl:fo(U,M??fetch.bind(globalThis))});return N.setMachinesUrl(w.current),N},[E,A,U,M]),Qe=en(c!==null);$e(()=>{if(!v||Qe.current)return;let N=!0;return Ae(!0),v.context().then(se=>{N&&(B(se),ce(null),Ae(!1))},se=>{N&&(ce(se),Ae(!1))}),()=>{N=!1}},[v]);let nn=Fe(async()=>{if(v)try{let N=await v.machines();Me(Array.isArray(N)?N:[]),ee(null)}catch(N){ee(N)}finally{q(!1)}},[v]),we=Fe(async()=>{if(v)try{let N=await v.plans();Nn(N.plans),X(N.current),ye(null)}catch(N){ye(N)}finally{z(!1)}},[v]),tn=en(!1),[wt,Ce]=le(!1),rn=en(u!==void 0),je=en(!1),sn=Fe(()=>{tn.current||(tn.current=!0,je.current&&queueMicrotask(()=>{je.current&&Ce(!0)}))},[]);$e(()=>(je.current=!0,tn.current&&Ce(!0),()=>{je.current=!1}),[]),$e(()=>{!v||!wt||rn.current||we()},[v,wt,we]);let Qn=Fe(async N=>{if(!v)throw new Error("No session yet.");await v.selectPlan(N),await we()},[v,we]),on=Fe(async(N,se)=>{if(!v)throw new Error("No session yet.");let ve=await v.checkoutPlan(N,se);if(!ve.url)throw new Error("Checkout could not be started.");return ve.url},[v]),an=Fe(async()=>{if(!v)throw new Error("No session yet.");await v.leavePlan(),await we()},[v,we]),Ft=en(i!==void 0);$e(()=>{if(!v)return;let N=Se(nn,g,{immediate:!Ft.current});return Ft.current=!1,N},[v,nn,g]);let xn=Fe((N="manual")=>{y&&(Q(!0),re(N))},[y]),Ct=Fe(()=>re(null),[]),Vn=en($);Vn.current=$;let vt=Fe(async N=>{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:se,...ve}=N,Pe=await(M??fetch.bind(globalThis))(a,{method:"POST",headers:{"content-type":"application/json",accept:"text/event-stream"},credentials:"same-origin",body:JSON.stringify(ve),...se?{signal:se}:{}});if(!Pe.ok){let Ve=await Pe.json().catch(()=>null),ue=new Error(Ve?.error?.message??`${a} answered ${Pe.status}.`);ue.status=Pe.status,Ve?.error?.code&&(ue.code=Ve.error.code),Ve?.error&&(ue.error=Ve.error);let ln=Vn.current.length>0&&!Vn.current.some(Je=>Je.state!=="offline");throw Pe.status===409&&ln&&xn("no_compute"),ue}let Vt=$r(Pe);return async function*(){try{yield*Vt}finally{tn.current&&we()}}()},[a,M,we,xn]),F=Fn(()=>Z?ne.find(N=>N.id===Z.plan_id)??null:null,[ne,Z]),me=Fn(()=>F?F.connected_reward==="included"&&$.length>0&&F.connected_included_units!==null?F.connected_included_units:F.included_units:null,[F,$]),Jn=Fn(()=>({plans:ne,current:Z,plan:F,used:Z?.units_used??null,included:me,remaining:me!==null&&Z?Math.max(0,me-Z.units_used):null,unlimited:F!==null&&me===null,loading:pe,error:be,select:Qn,checkout:on,leave:an,refresh:we}),[ne,Z,F,me,pe,be,Qn,on,an,we]),Qt=Fn(()=>({session:E,client:v,error:V,get plan(){return sn(),Jn},compute:{machines:$,connected:$.length>0,online:$.some(N=>N.state!=="offline"),loading:Te,error:Le,refresh:nn},connect:{app:S?.app??null,command:S?.command??null,connectUrl:S?.connect_url??null,publishableKey:S?.publishable_key??null,loading:_,error:C,open:xn,close:Ct,isOpen:te!==null,hasModal:y},run:vt}),[E,v,V,Jn,sn,te,xn,Ct,y,$,Te,Le,nn,S,_,C,vt]);return us(Hr.Provider,{value:v,children:us(Dr.Provider,{value:{context:S,machines:Te?void 0:$,theme:l??S?.theme??"light"},children:rl(Ur.Provider,{value:Qt,children:[n,y&&Be&&us(ht,{open:te!==null,onOpenChange:N=>re(N?te??"manual":null),onConnected:()=>{nn()},...te==="payment_required"||te==="no_compute"?{reason:te}:{},...te==="pair"?{showStatus:!1}:{}})]})})})}function sl(e){return e?ol[e]??e:null}var ol={"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 al(e,n,t){let r=n.local;if(!r?.session||n.after)return null;let s=/\/v1\/runs\/([^/]+)\/events/.exec(e.url)?.[1];if(!s)return null;let o=`http://127.0.0.1:${r.port??47321}/v1/runs/${s}/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(o,{headers:{authorization:`Bearer ${r.session}`,accept:"text/event-stream"},signal:a.signal});return c.ok?{url:o,bearer:r.session,open:c}:null}catch{return null}finally{clearTimeout(i),n.signal?.removeEventListener("abort",l)}}async function*il(e){let n=e.body;if(!n)return;let t=n.getReader(),r=new TextDecoder,s="",o=null,a=[];try{for(;;){let l=await t.read();if(l.done)return;s+=r.decode(l.value,{stream:!0});for(let i=s.indexOf(`
|
|
3900
|
-
`);
|
|
3901
|
-
`)){let
|
|
3902
|
-
`)}),
|
|
4014
|
+
`,document.head.appendChild(e)}import{jsx as Fe,jsxs as wt}from"react/jsx-runtime";function po(e){if(!e)return null;let n=xn(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 Wi(){return wt("svg",{viewBox:"0 0 16 16",fill:"none","aria-hidden":"true",children:[Fe("path",{d:"M8 5v4",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round"}),Fe("circle",{cx:"8",cy:"11.6",r:"0.9",fill:"currentColor"}),Fe("circle",{cx:"8",cy:"8",r:"6.4",stroke:"currentColor",strokeWidth:"1.3"})]})}function Hi({error:e,onRetry:n,onDismiss:t,title:r,className:s}){let a=po(e),i=H();return Gi(()=>yt(),[]),a?Fe("div",{className:s?`soba-connect ${s}`:"soba-connect","data-theme":i.theme,role:"alert",children:wt("div",{className:"sc-card sc-limit sc-run-error",children:[wt("div",{className:"sc-limit-head",children:[Fe("span",{className:"sc-limit-mark sc-run-error-mark","aria-hidden":"true",children:Fe(Wi,{})}),wt("div",{children:[Fe("h2",{className:"sc-limit-title",children:r??"That run did not finish"}),Fe("p",{className:"sc-limit-body sc-run-error-message",children:a})]})]}),(t||n)&&wt("div",{className:"sc-limit-actions",children:[t&&Fe("button",{type:"button",className:"sc-btn sc-btn-quiet",onClick:t,children:"Dismiss"}),n&&Fe("button",{type:"button",className:"sc-btn sc-btn-primary",onClick:n,children:"Try again"})]})]})}):null}import{useId as Di,useState as mo}from"react";import{jsx as oe,jsxs as Qt}from"react/jsx-runtime";function Ui({reason:e}){return oe("span",{className:"sc-limit-mark","aria-hidden":"true",children:e==="no_compute"?oe(Et,{}):oe(re,{})})}function Fi(e){let{error:n,variant:t="card",onDismiss:r,className:s}=e,a=rs(n,{predict:e.predict??!("error"in e)}),i=Di(),c=H();if(!a)return null;let o=oe(Qi,{offer:a,headingId:i,onDismiss:r});return t==="dialog"?oe(dt,{open:!0,onClose:()=>r?.(),labelledBy:i,theme:c.theme,children:o}):oe("div",{className:s?`soba-connect ${s}`:"soba-connect","data-theme":c.theme,children:o})}function Qi({offer:e,headingId:n,onDismiss:t}){let{compute:r}=F(),[s,a]=mo(!1),[i,c]=mo(null),o=e.reason==="no_compute"&&r.connected&&!r.online,l=o||e.connectOffer!==null||!r.connected,u=bt();async function m(){a(!0),c(null);try{await e.upgrade()}catch(f){c(f.message)}finally{a(!1)}}return Qt("div",{className:"sc-card sc-limit",children:[Qt("div",{className:"sc-limit-head",children:[oe(Ui,{reason:e.reason}),Qt("div",{children:[oe("h2",{className:"sc-limit-title",id:n,children:e.title}),oe("p",{className:"sc-limit-body",children:e.body})]})]}),i&&oe("p",{className:"sc-error",children:i}),o&&u.note&&oe("p",{className:"sc-limit-note",children:u.note}),Qt("div",{className:"sc-limit-actions",children:[t&&oe("button",{type:"button",className:"sc-btn sc-btn-quiet",onClick:t,disabled:s,children:"Not now"}),e.upgradeTo&&oe("button",{type:"button",className:l?"sc-btn":"sc-btn sc-btn-primary",onClick:()=>void m(),disabled:s,children:s?"Opening\u2026":e.upgradeTo.selectable?`Switch to ${e.upgradeTo.name}`:`${e.upgradeTo.name} for $${e.upgradeTo.price.toLocaleString()}/${e.upgradeTo.interval}`}),l&&oe("button",{type:"button",className:o?"sc-btn":"sc-btn sc-btn-primary",onClick:e.connect,disabled:s,children:o?"Connect another machine":"Connect compute"}),o&&oe("button",{type:"button",className:"sc-btn sc-btn-primary",onClick:u.open,disabled:s,children:"Open Soba App"})]})]})}import{useMemo as Vi}from"react";function Ct(){let{plan:e,compute:n,connect:t}=F();return Vi(()=>{let r=e.plan,s=e.current,a={plan:r,assignment:s,loading:e.loading,error:e.error,periodEnd:s?.period_end?new Date(s.period_end):null};if(!r)return{...a,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 i=zi(s?.trial_ends_at??null),c=r.connected_reward==="included"&&n.connected&&r.connected_included_units!==null,o=c?r.connected_included_units:r.included_units,l=r.connected_reward==="unlimited"&&n.connected,u=o===null,m=e.used??0,f=o===null?null:Math.max(0,o-m),g=o&&o>0?Math.min(100,Math.round(m/o*100)):null,h=o!==null&&m>=o,y=i!==null?"trial":u?"unlimited":h?r.overage==="meter"?"metered":"spent":"within";return{...a,state:y,trialDaysLeft:i,ceiling:o,raised:c,uncounted:l,used:m,remaining:f,percent:g,unlimited:u,reward:Ji(r,c||l,n.connected,()=>t.open("manual")),summary:Yi({plan:r,assignment:s,used:m,ceiling:o,trialDaysLeft:i,raised:c,uncounted:l,state:y})}},[e,n.connected,t])}function Ji(e,n,t,r){let s=ze({unit:e.unit,reward:e.connected_reward,includedUnits:e.connected_included_units,creditMicros:e.connected_credit*1e6});return s?{line:s,inForce:n,required:!1,connected:t,actionable:je(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 Yi(e){let{plan:n,assignment:t,used:r,ceiling:s,trialDaysLeft:a,raised:i,uncounted:c,state:o}=e,l=`${n.unit}${r===1?"":"s"}`,u=c?" Runs your own AI serves do not count toward it.":"";if(o==="trial"&&a!==null){let g=n.price===0?"it continues free":`it is $${n.price.toLocaleString()} a ${n.interval}`;return`${a} ${a===1?"day":"days"} left of your trial, then ${g}.`}if(o==="unlimited")return`${r.toLocaleString()} ${l} this period. No ceiling on this plan.`;if(o==="metered"){let g=r-(s??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(o==="spent")return t?.period_end?`Allowance spent. It comes back on ${ho(t.period_end)}.${u}`:`Allowance spent. It comes back at the start of the next period.${u}`;let m=Math.max(0,(s??0)-r),f=i?` Raised from ${(n.included_units??0).toLocaleString()} while your own AI is connected.`:t?.period_end?` Resets ${ho(t.period_end)}.`:"";return`${m.toLocaleString()} of ${(s??0).toLocaleString()} ${n.unit}s left.${f}${u}`}function zi(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 ho(e){let n=new Date(e);return Number.isNaN(n.getTime())?e:n.toLocaleDateString(void 0,{day:"numeric",month:"long"})}import{Fragment as qi,jsx as ae,jsxs as Te}from"react/jsx-runtime";function is({heading:e="Current plan",showUsage:n=!0,showName:t=!0,className:r}){let s=Ct(),{theme:a}=H(),i=f=>ae("section",{className:r?`soba-connect sc-fill ${r}`:"soba-connect sc-fill","data-theme":a,children:Te("div",{className:"sc-card sc-current",children:[e&&ae("h2",{className:"sc-section-title",children:e}),f]})});if(s.error)return i(ae("p",{className:"sc-error",children:s.error.message}));if(s.loading)return i(ae("p",{className:"sc-note",children:"Loading\u2026"}));if(!s.plan)return i(Te("div",{className:"sc-current-main",children:[ae("p",{className:"sc-current-name",children:"No plan"}),ae("p",{className:"sc-sub",children:s.summary})]}));let{plan:c,trialDaysLeft:o,percent:l,unlimited:u,reward:m}=s;return i(Te(qi,{children:[Te("div",{className:"sc-current-grid",children:[(t||o!==null)&&Te("div",{className:"sc-current-main",children:[t?Te("p",{className:"sc-current-name",children:[c.name,o!==null&&Te("span",{className:"sc-trial-badge",children:[o," ",o===1?"day":"days"," left"]})]}):o!==null&&ae("p",{className:"sc-current-trial",children:Te("span",{className:"sc-trial-badge",children:[o," ",o===1?"day":"days"," left"]})}),t&&c.description&&ae("p",{className:"sc-sub",children:c.description})]}),n&&Te("div",{className:"sc-usage",children:[Te("div",{className:"sc-row-between",children:[ae("span",{className:"sc-fact-key",children:"Usage"}),ae("span",{className:l!==null&&l>=100?"sc-usage-figure sc-usage-over":"sc-usage-figure",children:u?"Unlimited":l===null?"Metered":`${l}% used`})]}),l!==null&&ae("div",{className:"sc-meter",role:"presentation",children:l>0&&ae("span",{className:l>=100?"sc-meter-fill sc-meter-full":"sc-meter-fill",style:{width:`${l}%`}})}),ae("p",{className:"sc-usage-line",children:s.summary})]})]}),m&&Te("div",{className:"sc-current-foot",children:[ae("p",{className:m.required?"sc-plan-reward-line sc-plan-reward-need":m.inForce?"sc-plan-reward-line":"sc-plan-reward-line sc-plan-reward-open",children:m.required?m.line:m.inForce?`In force: ${ji(m.line)}.`:m.line}),(m.actionable||m.connected)&&ae(Nn,{})]})]}))}var ji=e=>e.charAt(0).toLowerCase()+e.slice(1);import{useCallback as Zi,useMemo as Xi,useState as go}from"react";var Ki={"user-hardware":"your own machine","user-subscription":"your own AI subscription","open-weights":"open models we host",frontier:"frontier models"},_i=new Set(["user-hardware","user-subscription"]);function ls(e={}){let{plan:n,compute:t,connect:r}=F(),[s,a]=go(null),[i,c]=go(null),{featured:o,onSelect:l,successUrl:u,cancelUrl:m}=e,f=Zi(async h=>{a(h.id),c(null);try{if(h.selectable)await n.select(h.id);else if(l)l(h);else{let y=await n.checkout(h.id,{...u?{successUrl:u}:{},...m?{cancelUrl:m}:{}});window.location.assign(y);return}}catch(y){throw c(y.message),y}finally{(h.selectable||l)&&a(null)}},[n,l,u,m]),g=Xi(()=>n.plans.map(h=>{let y=n.current?.plan_id===h.id;return{plan:h,current:y,featured:o===h.id&&!y,price:$i(h),allowance:h.included_units===null?`Unlimited ${h.unit}s`:`${h.included_units.toLocaleString()} ${h.unit}${h.included_units===1?"":"s"}`,allowanceNote:el(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:Ki[M]??M,owned:_i.has(M),runtimes:pr(M).map(E=>E.id)})),connect:nl(h,y,t.connected,()=>r.open("manual")),cta:{label:tl(h,y,s===h.id),disabled:y||s!==null,busy:s===h.id,take:()=>f(h)}}}),[n.plans,n.current,o,t.connected,r,s,f]);return{offers:g,current:g.find(h=>h.current)??null,loading:n.loading,error:n.error,failed:i}}function $i(e){return e.price===0?{amount:"Free",interval:null,free:!0}:{amount:`$${e.price.toLocaleString()}`,interval:e.interval,free:!1}}function el(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 nl(e,n,t,r){let s=ze({unit:e.unit,reward:e.connected_reward,includedUnits:e.connected_included_units,creditMicros:e.connected_credit*1e6}),a=Le(e.route_allow)&&!t;if(!s&&!a)return null;let i=je(e.connected_reward);return{key:s?"Connect your own":"To use this",line:s??(n?"Nothing connected yet, so nothing can run.":"Runs only on compute you connect."),reward:s!==null,actionable:n&&(i||a)&&!t,open:r}}function tl(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 Vt(e){return e?`soba-connect sc-fill ${e}`:"soba-connect sc-fill"}function cs({onSelect:e,successUrl:n,cancelUrl:t,showCompute:r=!0,showConnect:s=!1,variant:a="cards",featured:i,className:c}){let{offers:o,loading:l,error:u,failed:m}=ls({...i?{featured:i}:{},...e?{onSelect:e}:{},...n?{successUrl:n}:{},...t?{cancelUrl:t}:{}}),{theme:f}=H();if(u)return b("div",{className:Vt(c),"data-theme":f,children:b("div",{className:"sc-card",children:b("p",{className:"sc-error",children:u.message})})});if(l)return b("div",{className:Vt(c),"data-theme":f,children:b("div",{className:"sc-card",children:b("p",{className:"sc-note",children:"Loading plans\u2026"})})});if(o.length===0)return b("div",{className:Vt(c),"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:s};return D("div",{className:Vt(c),"data-theme":f,"data-variant":a,children:[a==="rows"?b(sl,{offers:o,shelf:g}):a==="table"?b(ol,{offers:o,shelf:g}):b(rl,{offers:o,shelf:g}),m&&b("p",{className:"sc-error",children:m})]})}function rl({offers:e,shelf:n}){return b("div",{className:"sc-plans",children:e.map(t=>D("div",{className:fo("sc-plan",t),children:[D("div",{className:"sc-row-between",children:[b("span",{className:"sc-title",children:t.plan.name}),b(us,{offer:t})]}),b("p",{className:"sc-sub",children:t.plan.description}),b(ds,{price:t.price,free:"forever"}),b(hs,{offer:t,shelf:n}),b(Ao,{offer:t}),b("div",{className:"sc-plan-band",children:n.showCompute&&b(ms,{offer:t})}),b("div",{className:"sc-plan-band",children:b(ps,{offer:t})})]},t.plan.id))})}function sl({offers:e,shelf:n}){return b("ul",{className:"sc-plan-rows",children:e.map(t=>D("li",{className:fo("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(us,{offer:t})]}),t.plan.description&&b("p",{className:"sc-sub",children:t.plan.description}),b(Ao,{offer:t}),n.showCompute&&b(ms,{offer:t,inline:!0}),b(ps,{offer:t,inline:!0})]}),D("div",{className:"sc-row-side",children:[b(ds,{price:t.price,free:"forever",small:!0}),b(hs,{offer:t,shelf:n})]})]},t.plan.id))})}function ol({offers:e,shelf:n}){let t=e.some(i=>i.plan.overage_per_unit>0),r=e.some(i=>i.plan.trial_days>0),s=e.some(i=>i.connect!==null),a=i=>[i.current?"sc-col-current":"",i.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(i=>D("th",{scope:"col",className:a(i),children:[D("span",{className:"sc-row-name",children:[b("span",{className:"sc-title",children:i.plan.name}),b(us,{offer:i})]}),b(ds,{price:i.price,small:!0})]},i.plan.id))]})}),D("tbody",{children:[D("tr",{children:[b("th",{scope:"row",children:"Included"}),e.map(i=>b("td",{className:a(i),children:i.allowance},i.plan.id))]}),t&&D("tr",{children:[b("th",{scope:"row",children:"Then"}),e.map(i=>b("td",{className:a(i),children:i.plan.overage_per_unit>0?`$${i.plan.overage_per_unit} / ${i.plan.unit}`:b("span",{className:"sc-muted-cell",children:"Stops"})},i.plan.id))]}),r&&D("tr",{children:[b("th",{scope:"row",children:"Trial"}),e.map(i=>b("td",{className:a(i),children:i.plan.trial_days>0?`${i.plan.trial_days} days`:b("span",{className:"sc-muted-cell",children:"None"})},i.plan.id))]}),n.showCompute&&D("tr",{children:[b("th",{scope:"row",children:"Runs on"}),e.map(i=>b("td",{className:a(i),children:b(ms,{offer:i,bare:!0})},i.plan.id))]}),s&&D("tr",{children:[b("th",{scope:"row",children:"Connect your own"}),e.map(i=>b("td",{className:a(i),children:b(ps,{offer:i,bare:!0})},i.plan.id))]}),D("tr",{className:"sc-table-buy",children:[b("td",{}),e.map(i=>b("td",{className:a(i),children:b(hs,{offer:i,shelf:n})},i.plan.id))]})]})]})})}function fo(e,n){return[e,n.current?"sc-plan-current":"",n.featured?"sc-plan-featured":""].filter(Boolean).join(" ")}function us({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 ds({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 Ao({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 ps({offer:e,inline:n,bare:t}){let r=e.connect;if(!r)return t?b("span",{className:"sc-muted-cell",children:"None"}):null;let s=r.reward?"sc-plan-reward-line":"sc-plan-reward-line sc-plan-reward-need",a=r.actionable?D("button",{type:"button",className:`${s} 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(re,{className:"sc-reward-mark"}),"Connect compute"]})]}):b("p",{className:s,children:r.line});return t?a:b("div",{className:n?"sc-plan-reward sc-plan-reward-inline":"sc-plan-reward",children:a})}function ms({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(s=>D("li",{className:s.owned?"sc-compute-own":void 0,children:[s.label,b(al,{runtimes:s.runtimes})]},s.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 hs({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(re,{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 al({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 gs,jsxs as bo}from"react/jsx-runtime";function il({heading:e,plansHeading:n,showUsage:t=!0,showName:r=!0,className:s,...a}){let{plan:i,loading:c}=Ct(),{theme:o}=H(),l=n??(c?"Plans":i?"Change plan":"Choose a plan");return bo("div",{className:s?`soba-connect sc-fill sc-billing ${s}`:"soba-connect sc-fill sc-billing","data-theme":o,children:[gs(is,{...e===void 0?{}:{heading:e},showUsage:t,showName:r}),bo("section",{className:"sc-billing-plans",children:[l&&gs("h2",{className:"sc-section-title",children:l}),gs(cs,{...a})]})]})}import{useCallback as yo,useState as wo}from"react";function fs({plan:e,successUrl:n,cancelUrl:t,label:r}){let{plan:s}=F(),[a,i]=wo(!1),[c,o]=wo(null),l=yo(()=>s.checkout(e.id,{...n?{successUrl:n}:{},...t?{cancelUrl:t}:{}}),[s,e.id,n,t]),u=yo(async()=>{i(!0),o(null);try{window.location.assign(await l())}catch(m){o(m.message),i(!1)}},[l]);return{label:a?"Opening\u2026":r??`Subscribe for $${e.price.toLocaleString()}/${e.interval}`,busy:a,error:c,buy:u,session:l}}import{jsx as Co,jsxs as cl}from"react/jsx-runtime";function ll({plan:e,successUrl:n,cancelUrl:t,label:r,className:s}){let{theme:a}=H(),i=fs({plan:e,...n?{successUrl:n}:{},...t?{cancelUrl:t}:{},...r?{label:r}:{}});return cl("div",{className:s?`soba-connect ${s}`:"soba-connect","data-theme":a,children:[Co("button",{type:"button",className:"sc-btn sc-btn-primary",disabled:i.busy,onClick:()=>void i.buy(),children:i.label}),i.error&&Co("p",{className:"sc-error",children:i.error})]})}import{useCallback as Qe,useEffect as nn,useMemo as Qn,useRef as tn,useState as ie}from"react";var ul="soba.session:";function vo(e){return!e.cacheKey||!e.endpoint?null:ul+JSON.stringify([e.endpoint,e.user??null,e.cacheKey])}function dl(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 pl(e,n){try{n?globalThis.localStorage?.setItem(e,JSON.stringify(n)):globalThis.localStorage?.removeItem(e)}catch{}}var ko=6e4,ml=1e4,Jt=class{#e;#n=null;#r=null;#t;#s=new Set;constructor(n){this.#t=n,this.#e=n.token??null;let t=vo(n),r=t&&!this.#e?dl(t):null;r&&r.expiresAt-ko>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()+ml,this.#n-ko)}subscribe(n){return this.#s.add(n),()=>this.#s.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 s=await r.json(),a=s.session??s.token;if(!a)throw new Error(`${n} answered without a \`session\`. See @soba-so/react's README.`);let i=s.expires_in??s.expiresIn;this.#e=a,this.#n=typeof i=="number"?Date.now()+i*1e3:null;let c=vo(this.#t);c&&pl(c,this.#n===null?null:{token:a,expiresAt:this.#n});for(let o of this.#s)o();return a})();try{return await this.#r}finally{this.#r=null}}},Fn=new Map,No=new WeakMap,hl=1;function gl(e){if(e.token||!e.endpoint)return null;let n=0;return e.fetchImpl&&(n=No.get(e.fetchImpl)??hl++,No.set(e.fetchImpl,n)),JSON.stringify([e.endpoint,e.user??null,n,e.cacheKey??null])}function xo(e){let n=gl(e);if(!n)return new Jt(e);let t=Fn.get(n)??{holder:new Jt(e),users:0};return Fn.set(n,t),t.holder}function Mo(e){for(let n of Fn.values())n.holder===e&&n.users++}function So(e){for(let[n,t]of Fn)if(t.holder===e){setTimeout(()=>{--t.users<=0&&Fn.get(n)===t&&Fn.delete(n)},0);return}}function Ro(e,n=fetch.bind(globalThis)){return async(t,r)=>{let s=await n(t,r);if(s.status!==401||!e.canRefresh)return s;let a;try{a=await e.refresh()}catch{return s}return n(t,fl(r,a))}}function fl(e,n){let t=new Headers(e?.headers);return t.set("authorization",`Bearer ${n}`),{...e,headers:t}}import{jsx as As,jsxs as wl}from"react/jsx-runtime";var Al="https://soba.so",bl=3e4;function yl(e){let{children:n,session:t,sessionEndpoint:r,user:s,sessionCacheKey:a,runEndpoint:i,theme:c,initialMachines:o,initialConnect:l=null,initialPlans:u,initialCurrentPlan:m=null,baseUrl:f=Al,pollMs:g=bl,injectStyles:h=!0,modal:y=!0,fetchImpl:M,onError:E}=e,[R,G]=ie(t??null),[Y,O]=ie(null),[L,T]=ie(l),[w,le]=ie(null),[$,be]=ie(l===null),[ee,Re]=ie(o??[]),[Be,me]=ie(null),[Pe,j]=ie(o===void 0),[ce,rn]=ie(u??[]),[Z,ye]=ie(m),[we,ne]=ie(null),[Ge,X]=ie(u===void 0),[K,_]=ie(null),[We,Ve]=ie(!1),He=tn(E);He.current=E;let B=Qe(k=>{O(k),He.current?.(k)},[]);nn(()=>{h&&yt()},[h]);let Q=Qn(()=>xo({...t?{token:t}:{},...r?{endpoint:r}:{},...s?{user:s}:{},...M?{fetchImpl:M}:{},...a?{cacheKey:a}:{}}),[t,r,s,M,a]);nn(()=>{let k=!0;Mo(Q);let te=Q.subscribe(()=>{k&&G(Q.token)});return!Q.token&&!Q.canRefresh?B(new Error("<SobaProvider> needs a `session` or a `sessionEndpoint`. A browser cannot mint one: that takes your secret key.")):Q.ensure().then(()=>k&&G(Q.token),ve=>k&&B(ve)),()=>{k=!1,te(),So(Q)}},[Q,B]),nn(()=>{Y&&(be(!1),j(!1),X(!1),le(k=>k??Y),me(k=>k??Y),ne(k=>k??Y))},[Y]),nn(()=>{let k=Q.refreshAt;if(k===null)return;let te=()=>{Q.refresh().catch(Ie=>B(Ie))},ve=()=>{document.hidden||(document.removeEventListener("visibilitychange",ve),te())},Sn=setTimeout(()=>{typeof document<"u"&&document.hidden?document.addEventListener("visibilitychange",ve):te()},Math.max(0,k-Date.now()));return()=>{clearTimeout(Sn),typeof document<"u"&&document.removeEventListener("visibilitychange",ve)}},[Q,B,R]);let P=tn(l?.machines_url??null),C=Qn(()=>{if(!R)return null;let k=new Zn({session:R,baseUrl:f,fetchImpl:Ro(Q,M??fetch.bind(globalThis))});return k.setMachinesUrl(P.current),k},[R,f,Q,M]),I=tn(l!==null);nn(()=>{if(!C||I.current)return;let k=!0;return be(!0),C.context().then(te=>{k&&(T(te),le(null),be(!1))},te=>{k&&(le(te),be(!1))}),()=>{k=!1}},[C]);let Ee=Qe(async()=>{if(C)try{let k=await C.machines();Re(Array.isArray(k)?k:[]),me(null)}catch(k){me(k)}finally{j(!1)}},[C]),ue=Qe(async()=>{if(C)try{let k=await C.plans();rn(k.plans),ye(k.current),ne(null)}catch(k){ne(k)}finally{X(!1)}},[C]),sn=tn(!1),[vt,Ce]=ie(!1),on=tn(u!==void 0),qe=tn(!1),an=Qe(()=>{sn.current||(sn.current=!0,qe.current&&queueMicrotask(()=>{qe.current&&Ce(!0)}))},[]);nn(()=>(qe.current=!0,sn.current&&Ce(!0),()=>{qe.current=!1}),[]),nn(()=>{!C||!vt||on.current||ue()},[C,vt,ue]);let Vn=Qe(async k=>{if(!C)throw new Error("No session yet.");await C.selectPlan(k),await ue()},[C,ue]),ln=Qe(async(k,te)=>{if(!C)throw new Error("No session yet.");let ve=await C.checkoutPlan(k,te);if(!ve.url)throw new Error("Checkout could not be started.");return ve.url},[C]),cn=Qe(async()=>{if(!C)throw new Error("No session yet.");await C.leavePlan(),await ue()},[C,ue]),Yt=tn(o!==void 0);nn(()=>{if(!C)return;let k=Se(Ee,g,{immediate:!Yt.current});return Yt.current=!1,k},[C,Ee,g]);let Mn=Qe((k="manual")=>{y&&(Ve(!0),_(k))},[y]),kt=Qe(()=>_(null),[]),Jn=tn(ee);Jn.current=ee;let Nt=Qe(async k=>{if(!i)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:te,...ve}=k,Ie=await(M??fetch.bind(globalThis))(i,{method:"POST",headers:{"content-type":"application/json",accept:"text/event-stream"},credentials:"same-origin",body:JSON.stringify(ve),...te?{signal:te}:{}});if(!Ie.ok){let Je=await Ie.json().catch(()=>null),de=new Error(Je?.error?.message??`${i} answered ${Ie.status}.`);de.status=Ie.status,Je?.error?.code&&(de.code=Je.error.code),Je?.error&&(de.error=Je.error);let un=Jn.current.length>0&&!Jn.current.some(xt=>xt.state!=="offline");throw Ie.status===409&&un&&Mn("no_compute"),de}let jt=as(Ie);return async function*(){try{yield*jt}finally{sn.current&&ue()}}()},[i,M,ue,Mn]),V=Qn(()=>Z?ce.find(k=>k.id===Z.plan_id)??null:null,[ce,Z]),he=Qn(()=>V?V.connected_reward==="included"&&ee.length>0&&V.connected_included_units!==null?V.connected_included_units:V.included_units:null,[V,ee]),Yn=Qn(()=>({plans:ce,current:Z,plan:V,used:Z?.units_used??null,included:he,remaining:he!==null&&Z?Math.max(0,he-Z.units_used):null,unlimited:V!==null&&he===null,loading:Ge,error:we,select:Vn,checkout:ln,leave:cn,refresh:ue}),[ce,Z,V,he,Ge,we,Vn,ln,cn,ue]),zt=Qn(()=>({session:R,client:C,error:Y,get plan(){return an(),Yn},compute:{machines:ee,connected:ee.length>0,online:ee.some(k=>k.state!=="offline"),loading:Pe,error:Be,refresh:Ee},connect:{app:L?.app??null,command:L?.command??null,connectUrl:L?.connect_url??null,publishableKey:L?.publishable_key??null,loading:$,error:w,open:Mn,close:kt,isOpen:K!==null,hasModal:y},run:Nt}),[R,C,Y,Yn,an,K,Mn,kt,y,ee,Pe,Be,Ee,L,$,w,Nt]);return As(Yr.Provider,{value:C,children:As(zr.Provider,{value:{context:L,machines:Pe?void 0:ee,theme:c??L?.theme??"light"},children:wl(jr.Provider,{value:zt,children:[n,y&&We&&As(ft,{open:K!==null,onOpenChange:k=>_(k?K??"manual":null),onConnected:()=>{Ee()},...K==="payment_required"||K==="no_compute"?{reason:K}:{},...K==="pair"?{showStatus:!1}:{}})]})})})}function Cl(e){return e?vl[e]??e:null}var vl={"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 kl(e,n,t){let r=n.local;if(!r?.session||n.after)return null;let s=/\/v1\/runs\/([^/]+)\/events/.exec(e.url)?.[1];if(!s)return null;let a=`http://127.0.0.1:${r.port??47321}/v1/runs/${s}/events`,i=new AbortController,c=()=>i.abort();n.signal?.addEventListener("abort",c);let o=setTimeout(()=>i.abort(),r.timeoutMs??3e3);try{let l=await t(a,{headers:{authorization:`Bearer ${r.session}`,accept:"text/event-stream"},signal:i.signal});return l.ok?{url:a,bearer:r.session,open:l}:null}catch{return null}finally{clearTimeout(o),n.signal?.removeEventListener("abort",c)}}async function*Nl(e){let n=e.body;if(!n)return;let t=n.getReader(),r=new TextDecoder,s="",a=null,i=[];try{for(;;){let c=await t.read();if(c.done)return;s+=r.decode(c.value,{stream:!0});for(let o=s.indexOf(`
|
|
4015
|
+
`);o!==-1;o=s.indexOf(`
|
|
4016
|
+
`)){let l=s.slice(0,o).replace(/\r$/,"");if(s=s.slice(o+1),l==="")i.length&&(yield{id:a,data:i.join(`
|
|
4017
|
+
`)}),a=null,i=[];else if(l.startsWith("id:")){let u=Number(l.slice(3).trim());a=Number.isFinite(u)?u:null}else if(l.startsWith("data:")){let u=l.slice(5);i.push(u.startsWith(" ")?u.slice(1):u)}}}}finally{t.cancel().catch(()=>{})}}var bs=(e,n)=>new Promise(t=>{let r=setTimeout(t,e);n?.addEventListener("abort",()=>{clearTimeout(r),t()})});async function*xl(e,n={}){let t=n.fetchImpl??fetch.bind(globalThis),r=await kl(e,n,t)??{url:e.url,bearer:e.token,open:null},s=n.maxRetries??6,a=n.after??0,i=0;for(;;){if(n.signal?.aborted)return;let c;try{c=r.open??await t(r.url,{headers:{authorization:`Bearer ${r.bearer}`,accept:"text/event-stream",...a?{"last-event-id":String(a)}:{}},...n.signal?{signal:n.signal}:{}}),r.open=null}catch(o){if(n.signal?.aborted)return;if(++i>s)throw o;await bs(1e3*i,n.signal);continue}if(c.status===503&&i<s){i++,await bs(Number(c.headers.get("retry-after")??3)*1e3,n.signal);continue}if(!c.ok){let o=`Could not read this run (${c.status}).`;try{let l=await c.json();l.error?.message&&(o=l.error.message)}catch{}throw new Error(o)}for await(let o of Nl(c)){o.id!==null&&(a=o.id),i=0;let l=Un(o.data);if(l&&(yield l,l.type==="done"||l.type==="error"))return}if(n.signal?.aborted)return;if(++i>s)throw new Error("Lost this run's stream and could not get it back.");await bs(1e3*i,n.signal)}}export{si as ComputeStatus,Nn as ConnectButton,hi as ConnectCompute,ft as ConnectModal,Pi as ConnectNudge,Kr as ConnectPill,Bi as ModelPicker,Hi as RunError,Fi as RunLimit,il as SobaBilling,ll as SobaCheckout,is as SobaCurrentPlan,cs as SobaPlans,yl as SobaProvider,Ti as collectText,_r as connectSays,yt as injectStyles,Un as parseEvent,as as readEvents,po as runErrorMessage,xn as sobaErrorCode,Cl as tierLabel,fs as useCheckout,ht as useCompute,ci as useConnectButton,os as useConnectNudge,Ct as useCurrentPlan,$r as useMachineRuns,kn as useModel,bt as useOpenSobaConnect,ls as usePlans,rs as useRunLimit,F as useSoba,xl as watchRun};
|
package/dist/styles.css
CHANGED
|
@@ -858,6 +858,119 @@ a.sc-btn {
|
|
|
858
858
|
text-align: center;
|
|
859
859
|
}
|
|
860
860
|
|
|
861
|
+
.sc-screen-head {
|
|
862
|
+
display: flex;
|
|
863
|
+
align-items: center;
|
|
864
|
+
gap: calc(12px * var(--sc-scale, 1));
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
.sc-back {
|
|
868
|
+
flex: none;
|
|
869
|
+
display: grid;
|
|
870
|
+
place-items: center;
|
|
871
|
+
width: calc(36px * var(--sc-scale, 1));
|
|
872
|
+
height: calc(36px * var(--sc-scale, 1));
|
|
873
|
+
padding: 0;
|
|
874
|
+
border: 0;
|
|
875
|
+
border-radius: 50%;
|
|
876
|
+
background: var(--sc-tray-card, #ffffff);
|
|
877
|
+
color: var(--sc-text, #1b1b1a);
|
|
878
|
+
font: inherit;
|
|
879
|
+
cursor: pointer;
|
|
880
|
+
box-shadow: var(--sc-shadow-1);
|
|
881
|
+
transition: background-color 120ms ease;
|
|
882
|
+
}
|
|
883
|
+
.sc-back:hover:not(:disabled) {
|
|
884
|
+
background: var(--sc-tray-sunk, #efefed);
|
|
885
|
+
}
|
|
886
|
+
.sc-back:disabled {
|
|
887
|
+
cursor: default;
|
|
888
|
+
opacity: 0.5;
|
|
889
|
+
}
|
|
890
|
+
.sc-back-glyph {
|
|
891
|
+
width: calc(15px * var(--sc-scale, 1));
|
|
892
|
+
height: calc(15px * var(--sc-scale, 1));
|
|
893
|
+
}
|
|
894
|
+
.sc-screen-title {
|
|
895
|
+
margin: 0;
|
|
896
|
+
font-size: calc(var(--sc-font-size, 15px) * 1.3333);
|
|
897
|
+
font-weight: 600;
|
|
898
|
+
color: var(--sc-text, #1b1b1a);
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
.sc-group-card.sc-mopts {
|
|
902
|
+
padding: 0 calc(16px * var(--sc-scale, 1));
|
|
903
|
+
}
|
|
904
|
+
.sc-mopt {
|
|
905
|
+
display: flex;
|
|
906
|
+
align-items: center;
|
|
907
|
+
gap: calc(14px * var(--sc-scale, 1));
|
|
908
|
+
width: 100%;
|
|
909
|
+
padding: calc(16px * var(--sc-scale, 1)) 0;
|
|
910
|
+
border: 0;
|
|
911
|
+
background: transparent;
|
|
912
|
+
font: inherit;
|
|
913
|
+
color: inherit;
|
|
914
|
+
text-align: left;
|
|
915
|
+
cursor: pointer;
|
|
916
|
+
}
|
|
917
|
+
.sc-mopt + .sc-mopt {
|
|
918
|
+
box-shadow: inset 0 1px 0 var(--sc-line, #e9e9e7);
|
|
919
|
+
}
|
|
920
|
+
.sc-mopt:disabled {
|
|
921
|
+
cursor: default;
|
|
922
|
+
opacity: 0.5;
|
|
923
|
+
}
|
|
924
|
+
.sc-mopt-say {
|
|
925
|
+
display: flex;
|
|
926
|
+
flex: 1;
|
|
927
|
+
min-width: 0;
|
|
928
|
+
flex-direction: column;
|
|
929
|
+
gap: calc(2px * var(--sc-scale, 1));
|
|
930
|
+
}
|
|
931
|
+
.sc-mopt-name {
|
|
932
|
+
|
|
933
|
+
overflow-wrap: anywhere;
|
|
934
|
+
font-size: calc(var(--sc-font-size, 15px) * 1.0667);
|
|
935
|
+
font-weight: 600;
|
|
936
|
+
}
|
|
937
|
+
.sc-mopt-desc {
|
|
938
|
+
font-size: calc(var(--sc-font-size, 15px) * 0.9333);
|
|
939
|
+
line-height: calc(20px * var(--sc-scale, 1));
|
|
940
|
+
color: var(--sc-muted, #6b6b69);
|
|
941
|
+
}
|
|
942
|
+
|
|
943
|
+
.sc-ring {
|
|
944
|
+
flex: none;
|
|
945
|
+
box-sizing: border-box;
|
|
946
|
+
display: grid;
|
|
947
|
+
place-items: center;
|
|
948
|
+
width: calc(22px * var(--sc-scale, 1));
|
|
949
|
+
height: calc(22px * var(--sc-scale, 1));
|
|
950
|
+
border: 2px solid var(--sc-line-2, #cfcfcb);
|
|
951
|
+
border-radius: 50%;
|
|
952
|
+
color: var(--sc-accent-fg, #ffffff);
|
|
953
|
+
transition:
|
|
954
|
+
background-color 120ms ease,
|
|
955
|
+
border-color 120ms ease;
|
|
956
|
+
}
|
|
957
|
+
.sc-ring-on {
|
|
958
|
+
border-color: var(--sc-accent, #1b1b1a);
|
|
959
|
+
background: var(--sc-accent, #1b1b1a);
|
|
960
|
+
}
|
|
961
|
+
.sc-ring-tick {
|
|
962
|
+
width: calc(13px * var(--sc-scale, 1));
|
|
963
|
+
height: calc(13px * var(--sc-scale, 1));
|
|
964
|
+
}
|
|
965
|
+
|
|
966
|
+
.sc-screen-foot {
|
|
967
|
+
margin: 0;
|
|
968
|
+
padding: 0 calc(4px * var(--sc-scale, 1));
|
|
969
|
+
font-size: max(12px, calc(var(--sc-font-size, 15px) * 0.8667));
|
|
970
|
+
line-height: 1.5;
|
|
971
|
+
color: var(--sc-muted, #6b6b69);
|
|
972
|
+
}
|
|
973
|
+
|
|
861
974
|
.sc-arow {
|
|
862
975
|
display: flex;
|
|
863
976
|
align-items: center;
|
|
@@ -1425,8 +1538,10 @@ a.sc-btn {
|
|
|
1425
1538
|
bottom: auto;
|
|
1426
1539
|
z-index: 2147483000;
|
|
1427
1540
|
|
|
1428
|
-
width: min(92vw,
|
|
1429
|
-
max-width: min(92vw,
|
|
1541
|
+
width: min(92vw, 320px);
|
|
1542
|
+
max-width: min(92vw, 320px);
|
|
1543
|
+
--sc-font-size: 12.5px;
|
|
1544
|
+
--sc-scale: 0.8;
|
|
1430
1545
|
|
|
1431
1546
|
max-height: calc(100vh - 24px);
|
|
1432
1547
|
overflow-y: auto;
|
|
@@ -1434,7 +1549,7 @@ a.sc-btn {
|
|
|
1434
1549
|
margin: 0;
|
|
1435
1550
|
padding: 0;
|
|
1436
1551
|
border: 0;
|
|
1437
|
-
border-radius:
|
|
1552
|
+
border-radius: 16px;
|
|
1438
1553
|
background: var(--sc-tray, #f6f6f7);
|
|
1439
1554
|
|
|
1440
1555
|
box-shadow:
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@soba-so/react",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.25",
|
|
4
4
|
"description": "Connect the AI your users already pay for, from your own React app.",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"homepage": "https://soba.so/docs/components",
|
|
@@ -19,13 +19,18 @@
|
|
|
19
19
|
"!dist/**/*.map",
|
|
20
20
|
"README.md"
|
|
21
21
|
],
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "node ../../scripts/build-react.mjs",
|
|
24
|
+
"typecheck": "tsc -p tsconfig.json",
|
|
25
|
+
"prepublishOnly": "node ../../scripts/build-react.mjs"
|
|
26
|
+
},
|
|
22
27
|
"peerDependencies": {
|
|
23
28
|
"react": ">=18"
|
|
24
29
|
},
|
|
25
30
|
"devDependencies": {
|
|
31
|
+
"@soba-so/connect-ui": "workspace:*",
|
|
26
32
|
"@types/react": "^19.0.0",
|
|
27
|
-
"typescript": "^7.0.2"
|
|
28
|
-
"@soba-so/connect-ui": "0.1.0"
|
|
33
|
+
"typescript": "^7.0.2"
|
|
29
34
|
},
|
|
30
35
|
"engines": {
|
|
31
36
|
"node": ">=22"
|
|
@@ -39,9 +44,5 @@
|
|
|
39
44
|
],
|
|
40
45
|
"publishConfig": {
|
|
41
46
|
"access": "public"
|
|
42
|
-
},
|
|
43
|
-
"scripts": {
|
|
44
|
-
"build": "node ../../scripts/build-react.mjs",
|
|
45
|
-
"typecheck": "tsc -p tsconfig.json"
|
|
46
47
|
}
|
|
47
|
-
}
|
|
48
|
+
}
|