@soba-so/react 0.0.22 → 0.0.24
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 +107 -12
- package/dist/styles.css +99 -4
- package/package.json +8 -9
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 Qn,jsx as R,jsxs as Ke}from"react/jsx-runtime";function Xe({kind:e,size:n=44,className:t}){let r=Yt[e];return Ke("svg",{className:`bx${t?` ${t}`:""}`,"data-expression":e,viewBox:zt,overflow:"visible",width:n,height:n,"aria-hidden":"true",children:[R("path",{d:jt,fill:"currentColor"}),R("path",{className:"bx-arc",d:un,fill:"none",stroke:"currentColor",strokeWidth:17,strokeLinecap:"round"}),r.slot==="stream"&&R(gs,{}),r.slot==="zzz"&&R(fs,{}),r.slot==="dots"&&R(As,{}),r.slot==="bang"&&R(bs,{}),r.slot==="orbit"&&R(ys,{}),r.slot==="cross"&&R(ws,{}),r.slot==="snap"&&R(Cs,{}),r.slot==="bars"&&R(vs,{}),r.slot==="ring"&&R(ks,{}),r.slot==="sparks"&&R(Ns,{})]})}function gs(){return R("path",{className:"bx-st",d:"M475.3 290.3 A150 150 0 0 1 475.3 509.7",fill:"none",stroke:"currentColor",strokeWidth:"15",strokeLinecap:"round",strokeDasharray:"0.1 31"})}function fs(){return Ke(Qn,{children:[R("g",{className:"bx-z1",children:R("path",{d:"M444 372 H496 L444 436 H496",fill:"none",stroke:"currentColor",strokeWidth:"20",strokeLinecap:"round",strokeLinejoin:"round"})}),R("g",{className:"bx-z2",children:R("path",{d:"M492 300 H522 L492 338 H522",fill:"none",stroke:"currentColor",strokeWidth:"15",strokeLinecap:"round",strokeLinejoin:"round"})})]})}function As(){return Ke(Qn,{children:[R("circle",{className:"bx-th",cx:"463.1",cy:"336.9",r:"21",fill:"currentColor"}),R("circle",{className:"bx-th bx-th2",cx:"483",cy:"400",r:"21",fill:"currentColor"}),R("circle",{className:"bx-th bx-th3",cx:"463.1",cy:"463.1",r:"21",fill:"currentColor"})]})}function bs(){return Ke("g",{className:"bx-at",children:[R("line",{x1:"490",y1:"312",x2:"490",y2:"414",stroke:"currentColor",strokeWidth:"46",strokeLinecap:"round"}),R("circle",{cx:"490",cy:"484",r:"28",fill:"currentColor"})]})}function ys(){return Ke("g",{className:"bx-ob",children:[R("path",{d:un,fill:"none",stroke:"var(--tile-bg, transparent)",strokeWidth:41,strokeLinecap:"round"}),R("path",{d:un,fill:"none",stroke:"currentColor",strokeWidth:17,strokeLinecap:"round"})]})}function ws(){return Ke(Qn,{children:[R("path",{className:"bx-xa",d:un,fill:"none",stroke:"currentColor",strokeWidth:17,strokeLinecap:"round"}),R("g",{className:"bx-xx",children:R("path",{d:"M442 364 L514 436 M514 364 L442 436",fill:"none",stroke:"currentColor",strokeWidth:"24",strokeLinecap:"round"})})]})}function Cs(){return R("path",{className:"bx-snap",d:un,fill:"none",stroke:"currentColor",strokeWidth:17,strokeLinecap:"round"})}function vs(){return Ke("g",{stroke:"currentColor",strokeWidth:"17",strokeLinecap:"round",children:[R("line",{className:"bx-vb",x1:"452",y1:"370",x2:"452",y2:"430"}),R("line",{className:"bx-vb bx-vb2",x1:"482",y1:"330",x2:"482",y2:"470"}),R("line",{className:"bx-vb bx-vb3",x1:"512",y1:"355",x2:"512",y2:"445"})]})}function ks(){return R(Qn,{children:[[450,366],[474,376],[484,400],[474,424],[450,434],[426,424],[416,400],[426,376]].map(([n,t],r)=>R("circle",{className:"bx-w",cx:n,cy:t,r:"11",fill:"currentColor",style:{animationDelay:`${-1.2+r*.15}s`}},r))})}function Ns(){return Ke(Qn,{children:[R("g",{className:"bx-sp",children:R("path",{d:"M460 300 Q465.4 324.6 490 330 Q465.4 335.4 460 360 Q454.6 335.4 430 330 Q454.6 324.6 460 300 Z",fill:"currentColor"})}),R("g",{className:"bx-sp bx-sp2",children:R("path",{d:"M486 356 Q493.92 392.08 530 400 Q493.92 407.92 486 444 Q478.08 407.92 442 400 Q478.08 392.08 486 356 Z",fill:"currentColor"})}),R("g",{className:"bx-sp bx-sp3",children:R("path",{d:"M460 440 Q465.4 464.6 490 470 Q465.4 475.4 460 500 Q454.6 475.4 430 470 Q454.6 464.6 460 440 Z",fill:"currentColor"})})]})}var xs={"claude-code":{small:"haiku",large:"opus"}};function kt(e){let n=xs[e];return!!(n?.small||n?.large)}import{useEffect as Qs,useRef as Vs,useState as Rt}from"react";var Sn=class extends Error{status;constructor(n,t){super(n),this.name="ConnectError",this.status=t}},Ms=5*6e4,Vn=class{session;baseUrl;doFetch;lastMachines=null;machinesUrl=null;gatewayBackUntil=0;constructor(n){this.session=n.session,this.baseUrl=(n.baseUrl??"").replace(/\/+$/,""),this.doFetch=n.fetchImpl??fetch.bind(globalThis)}async context(){let n=await this.request("GET","/v1/connect");return this.setMachinesUrl(n.machines_url),n}setMachinesUrl(n){typeof n=="string"&&/^https?:\/\//.test(n)&&(this.machinesUrl=n)}async machines(){let n=this.lastMachines,t=n?`?v=${encodeURIComponent(n.version)}`:"",r;if(this.machinesUrl&&Date.now()>=this.gatewayBackUntil)try{r=await this.request("GET",`${this.machinesUrl}${t}`)}catch(s){if(s instanceof Sn&&s.status===401)throw s;this.gatewayBackUntil=Date.now()+Ms}if(r??=await this.request("GET",`/v1/machines${t}`),r.unchanged&&n)return n.machines;let o=Array.isArray(r.machines)?r.machines:[];return this.lastMachines=typeof r.version=="string"?{version:r.version,machines:o}:null,o}async runs(){let n=await this.request("GET","/v1/machines/runs");return Array.isArray(n.runs)?n.runs:[]}async stopRun(n){let t=this.machinesUrl?.replace(/\/v1\/machines$/,"");if(!t)throw new Sn("This page can't stop runs yet: it hasn't been told where Soba's gateway is.",501);await this.request("POST",`${t}/v1/runs/${encodeURIComponent(n)}/stop`,{})}lookup(n){return this.request("GET",`/v1/device/lookup?code=${encodeURIComponent(n)}`)}approve(n){return this.request("POST","/v1/device/approve",{user_code:n})}claim(n){return this.request("POST","/v1/device/claim",{pairing_nonce:n})}deny(n){return this.request("POST","/v1/device/deny",{user_code:n})}plans(){return this.request("GET","/v1/plans")}selectPlan(n){return this.request("POST","/v1/plans/select",{plan:n})}checkoutPlan(n,t){return this.request("POST","/v1/plans/checkout",{plan:n,...t?.successUrl?{success_url:t.successUrl}:{},...t?.cancelUrl?{cancel_url:t.cancelUrl}:{}})}leavePlan(){return this.request("DELETE","/v1/plans/select")}hosted(){return this.request("GET","/v1/hosted")}startHosted(){return this.request("POST","/v1/hosted/start")}disconnectHosted(n){return this.request("DELETE",n?`/v1/hosted?provider=${encodeURIComponent(n)}`:"/v1/hosted")}approveRuntime(n,t){return this.request("POST","/v1/runtimes/approve",{machine_id:n,runtime_id:t})}preferRuntime(n,t){return this.request("POST","/v1/runtimes/prefer",{machine_id:n,runtime_id:t})}async request(n,t,r){let o=await this.doFetch(/^https?:\/\//.test(t)?t:`${this.baseUrl}${t}`,{method:n,headers:{authorization:`Bearer ${this.session}`,...r?{"content-type":"application/json"}:{}},...r?{body:JSON.stringify(r)}:{}}),s={};try{s=await o.json()}catch{}if(!o.ok){let a=typeof s.error=="string"?s.error:`Request failed (${o.status})`;throw new Sn(a,o.status)}return s}};function Jn(e){let n=/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(e.trim());if(!n?.[1])return"#ffffff";let t=n[1].length===3?[...n[1]].map(s=>s+s).join(""):n[1],r=s=>{let a=Number.parseInt(t.slice(s*2,s*2+2),16)/255;return a<=.04045?a/12.92:((a+.055)/1.055)**2.4};return .2126*r(0)+.7152*r(1)+.0722*r(2)>.45?"#101012":"#ffffff"}function qt(e){let n=/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(e.trim());if(!n?.[1])return null;let t=n[1].length===3?[...n[1]].map(r=>r+r).join(""):n[1];return[0,1,2].map(r=>Number.parseInt(t.slice(r*2,r*2+2),16))}function Mn(e,n,t){let r=qt(e),o=qt(n);return!r||!o?e:`#${r.map((a,l)=>Math.round(a+(o[l]-a)*t)).map(a=>a.toString(16).padStart(2,"0")).join("")}`}function dn(e,n){if(!qt(e))return{};let t=Jn(e),r=n?.trim();return{"--sc-ground":e,"--sc-shell":e,"--sc-sheet":Mn(e,t,.07),"--sc-raised":Mn(e,t,.13),"--sc-line":Mn(e,t,.18),"--sc-line-2":Mn(e,t,.28),"--sc-text":t,"--sc-text-2":Mn(t,e,.15),"--sc-muted":Mn(t,e,.38),...r?{"--sc-accent":r,"--sc-accent-fg":Jn(r)}:{"--sc-accent":t,"--sc-accent-fg":e}}}function _e(e){return e.authenticated===!0?{tone:"ok",text:"signed in"}:e.authenticated===!1?{tone:"warn",text:e.auth_hint??"signed out on that machine"}:{tone:"unknown",text:"could not tell"}}function Yn(e){let{platform:n,arch:t}=e;if(!n)return null;let r=n==="darwin"||n==="macos",o=r?"Mac":n==="win32"||n==="windows"?"Windows PC":"Linux machine";return r?`${t==="aarch64"||t==="arm64"?"Apple silicon ":""}${o}`:o}function pn(e){return e.find(n=>n.state==="offline")??null}function Zt(e){return e.state==="busy"?{tone:"busy",text:`serving ${e.active} of ${e.capacity}`}:e.state==="online"?{tone:"ok",text:"connected"}:{tone:"off",text:"asleep or offline"}}function j(e){let n=e.label?.trim(),t=e.name?.trim();return n&&(!t||n!==t)?n:(t??n??"").replace(/\.(local|lan|home|internal)$/i,"").replace(/[-_]+/g," ").trim()||n||"This machine"}function Nt(e,n){let t=o=>o.state==="busy"?0:o.state==="online"?1:2,r=o=>o.last_seen_at?Date.parse(o.last_seen_at):0;return t(e)-t(n)||r(n)-r(e)}function De(e){return[...e].sort(Nt)[0]??null}function mn(e){return e?e.state==="busy"?{tone:"busy",word:"Serving"}:e.state==="online"?{tone:"ok",word:"Connected"}:e.pairing_lost?{tone:"off",word:"Not connected"}:{tone:"off",word:"Asleep"}:{tone:"off",word:"No compute"}}function Pn(e){let n=mn(e);return{label:e?n.word:"Connect compute",ariaLabel:e?e.pairing_lost?`${j(e)} is not connected`:`${n.word} on ${j(e)}`:"Connect compute",connected:e!==null,state:n}}function hn(e){return e.state==="online"||e.state==="busy"}function zn(e){if(!e)return"never seen";let n=Date.parse(e);if(Number.isNaN(n))return"never seen";let t=Date.now()-n,r=6e4;return t<2*r?"just now":t<60*r?`${Math.floor(t/r)} min ago`:t<24*60*r?`${Math.floor(t/(60*r))} hr ago`:`${Math.floor(t/(24*60*r))} days ago`}function Xt(e){return e.runtimes.filter(n=>n.id!=="shell")}function Ne(e){return e.runtimes.filter(n=>n.id!=="shell"&&!n.quarantined&&!n.absent)}function Ie(e){let n=a=>a?e.runtimes.find(l=>l.id===a)??null:null;if(e.requested_runtime)return{by:"app",runtimeId:e.requested_runtime,runtime:n(e.requested_runtime)};let t=Ne(e),r=t.find(a=>a.id===e.preferred_runtime);if(r)return{by:"you",runtimeId:r.id,runtime:r};let o=a=>a.id==="claude-code"?0:a.id==="codex"?1:2,s=[...t].sort((a,l)=>o(a)-o(l))[0]??null;return{by:"default",runtimeId:s?.id??null,runtime:s}}var Kt="soba";function jn(){return`${Kt}://show`}function qn(e,n,t){let r=`${Kt}://connect?url=${encodeURIComponent(e)}`;return n&&(r+=`&nonce=${encodeURIComponent(n)}`),t&&(r+=`&want=${encodeURIComponent(t)}`),r}function Zn(){let e=globalThis.crypto;if(!e?.getRandomValues)return null;let n=e.getRandomValues(new Uint8Array(32)),t="";for(let r of n)t+=String.fromCharCode(r);return btoa(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}var Ss=1600;function _t(e={}){return er(e)}async function $t(e,n={}){if(typeof window>"u"||typeof document>"u")return"unknown";let t=er(n);try{window.location.href=qn(e,n.nonce,n.want)}catch{return"absent"}return t}async function Xn(e={}){if(typeof window>"u"||typeof document>"u")return"unknown";let n=er(e);try{window.location.href=jn()}catch{return"absent"}return n}async function er(e){if(typeof window>"u"||typeof document>"u")return"unknown";let n=e.graceMs??Ss,t=document.visibilityState==="visible"&&document.hasFocus(),r=!1,o=()=>{r=!0},s=()=>{document.visibilityState==="hidden"&&(r=!0)};return window.addEventListener("blur",o),window.addEventListener("pagehide",o),document.addEventListener("visibilitychange",s),await new Promise(a=>setTimeout(a,n)),window.removeEventListener("blur",o),window.removeEventListener("pagehide",o),document.removeEventListener("visibilitychange",s),t?r?"opened":"absent":"unknown"}var po={"claude-code":"data:image/png;base64,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",codex:"data:image/png;base64,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",ollama:"data:image/png;base64,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","cursor-agent":"data:image/png;base64,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",antigravity:"data:image/png;base64,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",opencode:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAQKADAAQAAAABAAAAQAAAAABGUUKwAAACRUlEQVR4Ae2bzWoCQQzHs1+K4kEsVbwIFuyxSH0goTehD1B8jYLHgg9k74JU8AGkFy/WXbsRFsTClkmMs+wkUFQ0k+SXv5nZbevdNZtHcNh8h2s/la4AVAGOE9CvgOMCAFWAKsBxAiG3/uPR7kHS8zxWCWwAvm93jHAbQAaAgZH++2wGD/0+qwtU56/1Gl4nE8hyoaxDBpAFex6N4HEwyF7e9LHZarHjsfX7s9+zk6AucI3YbADU5IvipwCK0glbeTivAPYukNc53J72zCFZqVRO221eHM57ogB2ux28jMew2WwgCM1CxYcD9Ho9+JjPodFocGrM9TXLKnepv2+iAlarFSyXSwgNARxSAKgeXEPSRAFg4lh4FEXGAPCUaQqNAsr5IagAKLIpk4/4DMAhlv2YgKP4mKyffVYcAA5A3MtNBxreZ0BfaRMFgJP8aTiEdqcDQRAY1RLHMXS7XdFDECYkCgADVKtVqNVqJADoK23iALLvMj6aWOZn4kP5rG6DFGpl8lEFlKmblFpUARRqZfJRBZSpm5RaVAEUamXycV4B4tcCSZIAXtmZGvqgr7SJAsDL4fb9PYTppbBveDmcpABa6W9/cQ1JEwVQr9fhbTpl5S99U0QUAHYP7wYV2ZwfggqgyPK8RW6qAC7lyOKQu0Zs9i7wuVjA93bL5Ujyxz+T45rH/Z8h6YPKfwWa3m2+XI+tgFscVy+TPn/NbQAbADeB82JsPNddwAb1IsVUBRSpGzZyUQXYoF6kmKqAInXDRi7OK+AXu4OD+Y9GPOkAAAAASUVORK5CYII=",grok:"data:image/png;base64,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",huggingface:"data:image/png;base64,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"};import{useEffect as mo,useRef as Ps}from"react";import{Fragment as Is,jsx as xe,jsxs as nr}from"react/jsx-runtime";function Kn({anchor:e,label:n,options:t,current:r,onClose:o,onPick:s}){let a=Ps(null);return mo(()=>{let i=a.current,c=e.current;if(!i||!c)return;try{typeof i.showPopover=="function"&&i.showPopover()}catch{}let u=c.getBoundingClientRect();u.width>i.offsetWidth&&(i.style.width=`${Math.round(u.width)}px`);let p=i.offsetWidth,A=i.offsetHeight,g=u.width>248?u.left:u.right-p,h=Math.max(8,Math.min(g,window.innerWidth-p-8)),y=u.bottom+6,M=y+A>window.innerHeight-8&&u.top-6-A>8?u.top-6-A:y;i.style.left=`${Math.round(h)}px`,i.style.top=`${Math.round(M)}px`,i.querySelector('[aria-checked="true"]')?.focus()},[e]),mo(()=>{let i=c=>{let u=c.target;!u||a.current?.contains(u)||e.current?.contains(u)||o()};return document.addEventListener("pointerdown",i,!0),()=>document.removeEventListener("pointerdown",i,!0)},[e,o]),xe("div",{ref:a,role:"menu","aria-label":n,className:"sc-menu",popover:"manual",onKeyDown:i=>{let c=[...a.current?.querySelectorAll("[role=menuitemradio]")??[]],u=c.indexOf(document.activeElement);if(i.key==="Escape")i.stopPropagation(),i.nativeEvent.stopImmediatePropagation(),o(),e.current?.focus();else if(i.key==="ArrowDown"||i.key==="ArrowUp"){i.preventDefault();let p=i.key==="ArrowDown"?1:-1;c[(u+p+c.length)%c.length]?.focus()}else i.key==="Tab"&&o()},children:t.map(i=>xe(Rs,{option:i,checked:r===i.id,onClose:o,onPick:s},i.id??""))})}function Rs({option:e,checked:n,onClose:t,onPick:r}){return nr(Is,{children:[e.heading?xe("div",{className:"sc-menu-head",role:"presentation",children:e.heading}):e.rule?xe("div",{className:"sc-menu-sep"}):null,nr("button",{type:"button",role:"menuitemradio","aria-checked":n,className:"sc-menu-item",onClick:()=>{e.onChoose?(e.onChoose(),t()):n?t():r(e.id)},children:[e.glyph,nr("span",{className:"sc-menu-text",children:[xe("span",{className:"sc-menu-label",children:e.label}),e.note&&xe("span",{className:"sc-menu-note",children:e.note})]}),e.trailing?xe("span",{className:"sc-menu-act",children:e.trailing}):n&&xe(Es,{})]})]})}function Es(){return xe("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:"sc-menu-check",children:xe("path",{d:"M5 12.5l4.5 4.5L19 7.5",fill:"none",stroke:"currentColor",strokeWidth:"2.2",strokeLinecap:"round",strokeLinejoin:"round"})})}function Rn({open:e}){return xe("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e?"sc-chev sc-chev-open":"sc-chev",children:xe("path",{d:"M9 6l6 6-6 6",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}import{useRef as Ls,useState as Ts}from"react";var Os={haiku:"Haiku",sonnet:"Sonnet",opus:"Opus",fable:"Fable"};function gn(e){return Os[e]??e}function _n(e){let n=[...e].sort(Nt),t=De([...e]),r=t?Ie(t):null,s=[{id:"auto",kind:"auto",label:"Automatic",model:"auto",...r?.runtime?{note:r.runtime.default_model?`Uses ${gn(r.runtime.default_model)}`:`Uses ${r.runtime.display_name}`}:{}}];n.some(u=>Ne(u).some(p=>kt(p.id)))&&s.push({id:"small",kind:"size",label:"Fast",note:"quick and cheap",model:"small"},{id:"large",kind:"size",label:"Best",note:"the most capable",model:"large"});let l=new Map;for(let u of n)for(let p of Ne(u))for(let A of p.models){if(!A)continue;let g=`${p.id}/${A}`,h=l.get(g);if(h){h.machines.add(j(u));continue}l.set(g,{option:{id:g,kind:"named",label:gn(A),model:A,runtime:p.id,runtimeName:p.display_name,costClass:p.cost_class},machines:new Set([j(u)])})}let i=new Set;for(let{machines:u}of l.values())for(let p of u)i.add(p);let c=i.size>1;for(let{option:u,machines:p}of l.values()){let A=c&&p.size===1?[...p][0]:void 0;s.push(A?{...u,machine:A}:u)}return s}function $n(e){let n=[],t=[];for(let r of e){if(r.kind!=="named"){n.push(r);continue}let o=r.runtimeName??r.runtime??"",s=t.find(a=>a.heading===o);s?s.options.push(r):t.push({heading:o,options:[r]})}return n.length?[{heading:null,options:n},...t]:t}function tr(e,n){let t=e.find(o=>o.kind==="auto")??{id:"auto",kind:"auto",label:"Automatic",model:"auto"};if(!n||n==="auto")return{selected:t,unavailable:null};let r=e.find(o=>o.id===n);return r?{selected:r,unavailable:null}:{selected:t,unavailable:n}}function rr(e){return e.runtime?{model:e.model,runtime:e.runtime}:{model:e.model}}function fn(e){return e.length>1}import{jsx as xt,jsxs as ho}from"react/jsx-runtime";function et({options:e,selected:n,onPick:t,caption:r,disabled:o,className:s}){let[a,l]=Ts(!1),i=Ls(null);if(!fn(e))return null;let c=s?`sc-mp ${s}`:"sc-mp";return ho("span",{className:c,children:[r&&xt("span",{className:"sc-mp-cap",children:r}),ho("button",{ref:i,type:"button",className:"sc-mp-btn","aria-haspopup":"menu","aria-expanded":a,"aria-label":`Model: ${n.label}. Change`,disabled:o,onClick:()=>l(u=>!u),children:[xt("span",{className:"sc-mp-label",children:n.label}),xt(Rn,{open:!0})]}),a&&xt(Kn,{anchor:i,label:"Which model answers",options:Bs(e),current:n.id,onClose:()=>l(!1),onPick:u=>{l(!1),u&&t(u)}})]})}function Bs(e){let n=[];for(let t of $n(e))t.options.forEach((r,o)=>{let s=Gs(r);n.push({id:r.id,label:r.label,...s?{note:s}:{},...t.heading&&o===0?{heading:t.heading}:{},...!t.heading&&r.kind==="size"&&o===1?{rule:!0}:{}})});return n}function Gs(e){return e.kind!=="named"?e.note:e.machine?`on ${e.machine}`:void 0}import{jsx as Me,jsxs as Hs}from"react/jsx-runtime";function te({className:e}){return Hs("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e,children:[Me("path",{d:"M18.125 7.039A8.6 8.6 0 1 0 18.125 16.961A6 6 0 0 1 18.125 7.039Z",fill:"currentColor"}),Me("path",{d:"M19.925 7.039A8.6 8.6 0 0 1 19.925 16.961A6 6 0 0 0 19.925 7.039Z",fill:"currentColor"})]})}function go({className:e}){return Me("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e,children:Me("path",{fill:"currentColor",d:"M17.3041 3.541h-3.6718l6.696 16.918H24Zm-10.6082 0L0 20.459h3.7442l1.3693-3.5527h7.0052l1.3693 3.5528h3.7442L10.5363 3.5409Zm-.3712 10.2232 2.2914-5.9456 2.2914 5.9456Z"})})}function An({className:e}){return Me("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e,children:Me("path",{fill:"currentColor",d:"M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z"})})}function Mt({className:e}){return Me("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e,children:Me("path",{d:"M4 5h16v11H4zM9 20h6M12 16v4",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function Ws({className:e}){return Me("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e,children:Me("path",{d:"M5 7l5 5-5 5M12 18h7",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function or({className:e}){return Me("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e,children:Me("path",{d:"M5 6h14v10H5zM2.5 19.5h19",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}var $e={claude:go,chatgpt:An,local:Mt},fo={shell:Ws};function bo(e,n){return n<2*6e4?e:n<10*6e4?Math.max(e,6e4):n<30*6e4?Math.max(e,3*6e4):Math.max(e,10*6e4)}var Ds=3e3,Us=2*6e4,St=Date.now(),Pt=new Set,Ao=!1;function Fs(){if(Ao||typeof window>"u")return;Ao=!0;let e=()=>{let t=St;if(St=Date.now(),St-t>Us)for(let r of Pt)r()};for(let t of["pointerdown","keydown","wheel","touchstart"])window.addEventListener(t,e,{capture:!0,passive:!0});let n=()=>{if(!document.hidden)for(let t of Pt)t()};window.addEventListener("focus",n),document.addEventListener("visibilitychange",n)}function Se(e,n,t={}){Fs();let r,o=t.immediate===!1?Date.now():0,s=!1,a=!1,l=()=>{a||(r=setTimeout(i,t.idle===!1?n:bo(n,Date.now()-St)))},i=async()=>{if(clearTimeout(r),!(a||s)){if(typeof document>"u"||!document.hidden){s=!0,o=Date.now();try{await e()}catch{}finally{s=!1}}l()}},c=()=>{Date.now()-o>Math.min(n,Ds)&&i()};return Pt.add(c),t.immediate===!1?l():i(),()=>{a=!0,clearTimeout(r),Pt.delete(c)}}var me=[{id:"claude",costClass:"user-subscription",short:"Claude Code",label:"Continue with Claude",title:"The Claude plan you already pay for",cost:"Nothing beyond the plan",prerequisite:"Claude Code installed and signed in",hint:"Install it from claude.ai/code, then run `claude` once and sign in.",install:"https://claude.com/product/claude-code",expects:["claude-code"]},{id:"chatgpt",costClass:"user-subscription",short:"Codex",label:"Continue with ChatGPT",title:"The ChatGPT plan you already pay for",cost:"Nothing beyond the plan",prerequisite:"Codex installed and signed in",hint:"Install Codex, then run `codex` once and sign in.",install:"https://learn.chatgpt.com/codex/cli",expects:["codex"]},{id:"local",costClass:"user-hardware",short:"Local models",label:"Use a model on this machine",title:"A model on your own machine",cost:"Free. You bought the hardware",prerequisite:"Ollama running, with a model pulled",hint:"Install Ollama, then `ollama pull` a model before pairing.",install:"https://ollama.com",expects:["ollama","openai-api"]}],yo=["claude","chatgpt"];function sr(){return me.filter(e=>yo.includes(e.id))}function ar(e){return me.filter(n=>n.costClass===e)}function ir(e){return me.find(n=>n.expects.includes(e))??null}import{Fragment as nt,jsx as d,jsxs as v}from"react/jsx-runtime";function bn({machines:e,hosted:n=[],onApproveRuntime:t,onPreferRuntime:r,onDisconnectHosted:o,onPair:s,onWake:a,onOpenApp:l,onRefresh:i,refreshing:c,busy:u,appName:p,model:A,onPickModel:g,error:h,runs:y,loadRuns:M,loading:E,machineMenu:I,machineNote:B,onReconnect:V,openApp:L=!0,children:x,onStopRun:G}){let w=De(e),ae=e.filter(C=>C.id!==w?.id),K=w?.state==="online",[ge,_]=Rt(()=>K?[]:null),[ne,Qe]=Rt("no"),z=y===void 0&&!!M,ue=z?ge:y??(K?[]:null),Be=y!==void 0||!!M,ie=!!(w&&hn(w));Qs(()=>{if(!z||!M||!ie)return;let C=!0,S=Se(async()=>{let Ve=await M();C&&_(Ve)},3e3);return()=>{C=!1,S()}},[z,M,ie]);let q=(w?Xt(w):[]).filter(C=>C.quarantined&&!C.absent),Ae=w?Ie(w).runtime:null,Pe=Ae?.cost_class==="user-hardware"?Ae:null,de=Pe?aa(Pe.default_model):null,be=!!w&&!hn(w),Q=(()=>{if(!w||be||!Ae||_e(Ae).tone!=="warn")return null;let S=j(w);return{title:`${Ae.display_name} is signed out`,detail:`Sign in on ${S} so Soba can start runs.`}})(),$=()=>{l?.(),Qe("going"),Xn().then(C=>Qe(C==="absent"?"absent":"no"))},Ge=()=>{$(),a?.()},je={label:ne==="going"?"Opening Soba\u2026":"Open Soba",onPress:$,spin:ne==="going"},W=w?je:s?{label:"Connect to Soba",onPress:s}:null,ye=!!w&&W===je,Z=ye&&!!i,O=i&&d("button",{type:"button",className:"sc-disc",onClick:i,disabled:c,"aria-label":"Refresh",title:"Refresh",children:d(ua,{spinning:!!c})});return!w&&n.length===0&&!s?d("p",{className:"sc-note",children:"Nothing connected yet."}):v("div",{className:"sc-tray",children:[w&&v(Oe,{title:"This machine",action:(i&&!Z||L||I)&&v("span",{className:"sc-cap-acts",children:[!Z&&O,L&&d($s,{}),I]}),children:[d(Js,{machine:w}),B]}),w&&be&&!w.pairing_lost&&d(Oe,{title:"Soba",children:v("div",{className:"sc-away",children:[d("span",{className:"sc-away-mark","aria-hidden":"true",children:d(Xe,{kind:"paused",size:30})}),v("span",{className:"sc-away-say",children:[d("span",{className:"sc-away-title",children:"Wake it up"}),v("span",{className:"sc-away-body",children:["Soba on ",j(w)," is not answering. Waking it opens the app there."]})]}),d("button",{type:"button",className:"sc-away-go",onClick:Ge,disabled:u||ne==="going",children:ne==="going"?"Waking\u2026":"Wake"})]})}),w?.pairing_lost&&!hn(w)&&d(Oe,{title:"Soba",children:v("div",{className:"sc-away",children:[d("span",{className:"sc-away-mark","aria-hidden":"true",children:d(Xe,{kind:"gone",size:30})}),v("span",{className:"sc-away-say",children:[d("span",{className:"sc-away-title",children:"Connect it again"}),d("span",{className:"sc-away-body",children:"Its pairing has ended, so it cannot take runs until it is connected again."})]}),V&&d("button",{type:"button",className:"sc-away-go",onClick:V,disabled:u,children:"Connect"})]})}),w&&!be&&d(Oe,{title:"Runs on",children:Ae?d(ra,{machine:w,appName:p,busy:u,...A?{model:A}:{},...g?{onPickModel:g}:{},...r?{onPick:C=>r(w.id,C)}:{},...t?{onApprove:C=>t(w.id,C)}:{}}):v("div",{className:"sc-blank",children:[d("span",{className:"sc-blank-mark","aria-hidden":"true",children:d(js,{})}),v("span",{className:"sc-blank-say",children:[d("span",{className:"sc-blank-title",children:E?"Looking\u2026":"No agent on this machine"}),d("span",{className:"sc-blank-body",children:E?"Reading what it can run.":"Install Claude Code, Codex or Ollama there and it will appear here."})]}),!E&&L&&v("a",{className:"sc-blank-act",href:jn(),children:[d("span",{children:"Add agents"}),d(lr,{})]})]})}),w&&(Q||de)&&v(Oe,{title:"Needs attention",children:[Q&&v("div",{className:"sc-alarm",children:[d("span",{className:"sc-alarm-mark","aria-hidden":"true",children:d(Co,{})}),v("span",{className:"sc-alarm-say",children:[d("span",{className:"sc-alarm-title",children:Q.title}),d("span",{className:"sc-alarm-body",children:Q.detail})]})]}),de&&v("div",{className:"sc-alarm sc-alarm-warn",children:[d("span",{className:"sc-alarm-mark","aria-hidden":"true",children:d(Co,{})}),v("span",{className:"sc-alarm-say",children:[d("span",{className:"sc-alarm-title",children:"A large model on this computer"}),v("span",{className:"sc-alarm-body",children:["Your ",de," model can take all this computer's memory while it answers."]})]})]})]}),w&&Be&&!be&&d(zs,{machine:w,runs:ue,...G?{onStop:G}:{}}),w&&d(nt,{children:q.length>0&&!be&&!(r&&t&&Ie(w).by!=="app")&&d(Oe,{title:"New on this machine",children:q.map(C=>d(na,{runtime:C,...t?{onApprove:()=>t(w.id,C.id)}:{}},C.id))})}),n.length>0&&d(Oe,{title:n.length>1?"Connected plans":"Connected plan",children:n.map(C=>d(la,{credential:C,appName:p,busy:u,...o?{onDisconnect:()=>o(C.provider)}:{}},C.provider))}),ae.length>0&&d(Oe,{title:"Your other machines",children:ae.map(C=>d(ea,{machine:C},C.id))}),!w&&s&&d(Oe,{title:"Your machines",children:v("button",{type:"button",className:"sc-pair",onClick:s,children:[d("span",{className:"sc-otile","aria-hidden":"true",children:d(ca,{})}),d("span",{className:"sc-oname",children:"Connect a machine"})]})}),W&&v("div",{className:"sc-acts",children:[ye&&W?v("div",{className:"sc-acts-row",children:[Z?O:d("span",{}),v("button",{type:"button",className:"sc-act-small",onClick:W.onPress,disabled:u||W.spin,"data-spin":W.spin?"true":void 0,children:[W.spin&&d(vo,{}),W.label,!W.spin&&d(lr,{})]})]}):W&&v("button",{type:"button",className:"sc-act-go",onClick:W.onPress,disabled:u||W.spin,"data-spin":W.spin?"true":void 0,children:[W.spin&&d(vo,{}),W.label]}),ne==="absent"&&v("p",{className:"sc-act-miss",children:["Nothing opened here. ",w?j(w):"That machine"," may be a different computer, or the Soba app is not installed on this one."]})]}),x,h&&d("p",{className:"sc-error sc-tray-error",children:h})]})}function Oe({title:e,action:n,children:t}){return v("section",{className:"sc-group",children:[v("div",{className:"sc-group-cap",children:[d("p",{className:"sc-group-title",children:e}),n]}),d("div",{className:"sc-group-card",children:t})]})}function Js({machine:e,onToggle:n,open:t}){let r=hn(e),o=[r?null:e.pairing_lost?"Not connected to Soba":"Soba is asleep",r?Yn(e):null,e.always_on?"always on":null].filter(Boolean),s=r&&e.capacity>0?e.active>0?`${e.active} of ${e.capacity} running`:null:zn(e.last_seen_at),a=v(nt,{children:[v("span",{className:"sc-mtile","aria-hidden":"true",children:[d(ko,{}),d("span",{className:`sc-mbadge sc-mbadge-${r?mn(e).tone:e.pairing_lost?"off":"away"}`})]}),v("span",{className:"sc-mid",children:[d("span",{className:"sc-mname",children:j(e)}),v("span",{className:"sc-mmeta",children:[d("span",{className:"sc-mmeta-is",children:o.map((l,i)=>v("span",{children:[i>0&&d("span",{className:"sc-mmeta-sep",children:"\xB7"}),l]},l))}),s&&d("span",{className:"sc-mmeta-now",children:s})]})]})]});return!n||!r?d("div",{className:"sc-mrow",children:a}):v("button",{type:"button",className:"sc-mrow sc-mrow-btn",onClick:n,"aria-expanded":!!t,title:t?"Hide what it is running":"See what it is running",children:[a,d(Rn,{open:!!t})]})}function Ys(e,n){return e.filter(t=>t.machine_id===n.id||t.machine_id===null)}function zs({machine:e,runs:n,onStop:t}){let r=n?Ys(n,e):[],[o,s]=Rt(new Set),a=async i=>{s(c=>new Set(c).add(i));try{await t?.(i)}catch{s(c=>{let u=new Set(c);return u.delete(i),u})}},l=()=>{for(let i of r)a(i.id)};return d(Oe,{title:"Active runs",...t&&r.length>1?{action:d("button",{type:"button",className:"sc-cap-link",onClick:l,children:"Stop all"})}:{},children:n===null?d("p",{className:"sc-row-note",children:"Looking\u2026"}):r.length===0?v("p",{className:"sc-nilrow",children:[d("span",{className:"sc-nilrow-mark","aria-hidden":"true",children:d(qs,{})}),"Nothing running"]}):r.map(i=>d(Zs,{run:i,stopping:o.has(i.id),...t?{onStop:()=>void a(i.id)}:{}},i.id))})}function js(){return v("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:"sc-blank-glyph",children:[d("rect",{x:"3",y:"4.5",width:"18",height:"15",rx:"2.5",fill:"none",stroke:"currentColor",strokeWidth:"1.8"}),d("path",{d:"M7.5 10l2.5 2.2-2.5 2.2M12.5 14.6h4",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round"})]})}function qs(){return v("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:"sc-blank-glyph",children:[d("circle",{cx:"12",cy:"12",r:"9",fill:"none",stroke:"currentColor",strokeWidth:"1.8"}),d("path",{d:"M9 12.5l2.2 2.2L15.5 9.8",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round"})]})}function Zs({run:e,stopping:n,onStop:t}){return v("div",{className:"sc-rrow",children:[d("span",{className:n?"sc-rdot":"sc-rdot sc-rdot-live","aria-hidden":"true"}),v("span",{className:"sc-mid",children:[d("span",{className:"sc-rtitle",children:wo(e)}),d("span",{className:"sc-rstep",children:n?"Stopping\u2026":`${Ks(e)} \xB7 ${_s(e.started_at)}`})]}),t&&d("button",{type:"button",className:"sc-rstop",onClick:t,disabled:n,"aria-label":`Stop ${wo(e)}`,children:d("span",{className:"sc-rstop-ring",children:d(da,{})})})]})}function Xs(e){let n=ir(e);return(n?$e[n.id]:null)??fo[e]??null}function wo(e){if(e.label)return e.label;if(e.task){let n=e.task.replace(/[_-]+/g," ").trim();return n.charAt(0).toUpperCase()+n.slice(1)}return"A run"}function Ks(e){if(e.status==="queued")return"Waiting for a free slot";if(e.step)return e.step;switch(e.phase?.kind){case"thinking":return"Thinking";case"writing":return"Writing";case"tool":return e.phase.tool?`Using ${e.phase.tool}`:"Using a tool";case"approval":return e.phase.tool?`Waiting for you to allow ${e.phase.tool}`:"Waiting for your approval";default:return e.first_output_at?"Working":"Starting"}}function _s(e){let n=Math.max(0,Math.round((Date.now()-new Date(e).getTime())/1e3));if(n<60)return`${n}s`;let t=Math.floor(n/60);return t<60?`${t}m ${String(n%60).padStart(2,"0")}s`:`${Math.floor(t/60)}h ${String(t%60).padStart(2,"0")}m`}function $s(){return d("a",{className:"sc-disc sc-open-app",href:jn(),"aria-label":"Open Soba App",title:"Open Soba App",children:d(lr,{})})}function lr(){return d("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:"sc-dglyph",children:d("path",{d:"M14 4h6v6M20 4l-8.5 8.5M18 14.5V19a1 1 0 01-1 1H5a1 1 0 01-1-1V7a1 1 0 011-1h4.5",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function ea({machine:e}){let n=mn(e);return v("div",{className:"sc-orow",children:[d("span",{className:"sc-otile","aria-hidden":"true",children:d(ko,{})}),d("span",{className:"sc-oname",children:j(e)}),d("span",{className:"sc-oword",children:n.word}),d("span",{className:`sc-dot sc-dot-${n.tone}`,"aria-hidden":"true"})]})}function na({runtime:e,onApprove:n}){return v("div",{className:"sc-mrow",children:[d("span",{className:"sc-mtile sc-atile","aria-hidden":"true",children:d(Et,{id:e.id,name:e.display_name})}),v("span",{className:"sc-mid",children:[d("span",{className:"sc-mname",children:e.display_name}),d("span",{className:"sc-mmeta",children:e.version??"waiting to be let in"})]}),n?d("button",{type:"button",className:"sc-row-act",onClick:n,children:"Let it serve"}):d("span",{className:"sc-averdict sc-tone-warn",children:"not serving yet"})]})}function ta({id:e,name:n}){return d("span",{className:"sc-runtime-tile","aria-hidden":"true",children:d(Et,{id:e,...n?{name:n}:{}})})}function Et({id:e,name:n}){if(!e)return null;let t=po[e];if(t)return d("img",{src:t,alt:"",className:"sc-runtime-logo"});let r=Xs(e);return r?d(r,{className:"sc-runtime-mark"}):n?d("span",{className:"sc-runtime-letter",children:n.slice(0,1).toUpperCase()}):null}function ra({machine:e,appName:n,busy:t,onPick:r,model:o,onPickModel:s,onApprove:a}){let l=Ie(e),i=Ne(e),c=a?e.runtimes.filter(x=>x.quarantined&&!x.absent):[],[u,p]=Rt(!1),A=Vs(null);if(l.by!=="app"&&i.length===0)return null;let g=x=>x?d(ta,{id:x.id,name:x.display_name}):null,h=l.runtime?.display_name??l.runtimeId??"\u2014",y=l.by!=="app"&&!!r&&(i.length>=2||c.length>0),M=l.runtime?.id??l.runtimeId,E=!hn(e),I=l.runtime&&_e(l.runtime).tone==="warn"?"Signed out":null,B=o?_n([e]).filter(x=>x.kind==="named"?x.runtime===M:x.kind==="size"?!!M&&kt(M):!0):[],V=(()=>{if(!o)return;if(o.kind!=="auto")return o;let x=l.runtime?.default_model;if(!x)return o;let G=gn(x);return{...o,label:G.length>16?G:`${o.label} \xB7 ${G}`}})(),L=l.by==="app"?`Set by ${n??"the app"}`:l.runtime?sa(l.runtime):null;return v(nt,{children:[y?v("button",{ref:A,type:"button",className:E?"sc-runs-agent sc-runs-dim":"sc-runs-agent","aria-haspopup":"menu","aria-expanded":u,"aria-label":`Runs go to ${h}. Change`,disabled:t,onClick:()=>p(x=>!x),children:[d("span",{className:"sc-runs-tile","aria-hidden":"true",children:d(Et,{id:M??null,name:h})}),v("span",{className:"sc-runs-said-name",children:[d("span",{className:"sc-runs-name",children:h}),I&&d("span",{className:"sc-runs-ill",children:I})]}),d(Rn,{open:!1})]}):v("span",{className:E?"sc-runs-agent sc-runs-fixed sc-runs-dim":"sc-runs-agent sc-runs-fixed",children:[d("span",{className:"sc-runs-tile","aria-hidden":"true",children:d(Et,{id:M??null,name:h})}),v("span",{className:"sc-runs-said-name",children:[d("span",{className:"sc-runs-name",children:h}),I&&d("span",{className:"sc-runs-ill",children:I})]}),l.by==="app"&&v("span",{className:"sc-runs-told",children:["set by ",n??"the app"]})]}),V&&s&&fn(B)?v(nt,{children:[d("span",{className:"sc-runs-rule","aria-hidden":"true"}),d(et,{options:B,selected:V,onPick:s,caption:"Model",className:E?"sc-runs-model sc-runs-dim":"sc-runs-model",...t?{disabled:t}:{}})]}):L&&v(nt,{children:[d("span",{className:"sc-runs-rule","aria-hidden":"true"}),v("span",{className:"sc-runs-said",children:[d("span",{className:"sc-runs-key",children:"Model"}),d("span",{className:"sc-runs-val",children:L})]})]}),u&&r&&d(oa,{anchor:A,machine:e,tile:g,waiting:c,...a?{onApprove:a}:{},onClose:()=>p(!1),onPick:x=>{p(!1),r(x)}})]})}function oa({anchor:e,machine:n,tile:t,waiting:r,onApprove:o,onClose:s,onPick:a}){let l=Ie(n),i=Ie({...n,preferred_runtime:null}).runtime,c=l.by==="you"?l.runtimeId:null,u=[{id:null,label:"Automatic",...i?{note:`Uses ${i.display_name}`}:{},glyph:t(i)},...Ne(n).map((p,A)=>{let g=ia(p);return{id:p.id,label:p.display_name,glyph:t(p),...g?{note:g}:{},...A===0?{rule:!0}:{}}}),...o?r.map((p,A)=>({id:`waiting:${p.id}`,label:p.display_name,glyph:t(p),...p.version?{note:p.version}:{},trailing:"Let it serve",onChoose:()=>o(p.id),...A===0?{heading:"New on this machine"}:{}})):[]];return d(Kn,{anchor:e,label:"Which agent runs go to",options:u,current:c,onClose:s,onPick:a})}function sa(e){let n=_e(e);return n.tone==="warn"?n.text:e.default_model?gn(e.default_model):"Automatic"}function aa(e){if(!e)return null;let n=/(\d+(?:\.\d+)?)\s*b\b/i.exec(e),t=n?.[1]?Number(n[1]):Number.NaN;return!Number.isFinite(t)||t<20?null:`${n?.[1]}B`}function ia(e){let n=_e(e);return n.tone==="warn"?n.text:e.default_model?gn(e.default_model):e.cost_class==="user-hardware"?"In this machine's memory":n.tone!=="ok"?n.text:e.version??void 0}function la({credential:e,appName:n,busy:t,onDisconnect:r}){return v("div",{className:"sc-hrow",children:[v("div",{className:"sc-orow",children:[d("span",{className:"sc-otile","aria-hidden":"true",children:d(An,{className:"sc-omark"})}),v("span",{className:"sc-mid",children:[d("span",{className:"sc-oname",children:e.provider==="openai-chatgpt"?"ChatGPT plan":e.provider}),d("span",{className:"sc-mmeta",children:e.account_label??"signed in"})]}),r&&d("button",{type:"button",className:"sc-row-act",onClick:r,disabled:t,children:"Disconnect"})]}),r&&v("p",{className:"sc-row-note",children:[n??"This app"," stops using it. To withdraw the grant entirely, remove it in your OpenAI settings."]})]})}function ko(){return v("svg",{viewBox:"0 0 32 24","aria-hidden":"true",focusable:"false",className:"sc-mglyph",children:[d("rect",{x:"4",y:"1.5",width:"24",height:"15",rx:"2.5",fill:"var(--sc-sheet, #ffffff)",stroke:"currentColor",strokeWidth:"2"}),d("rect",{x:"1",y:"19.5",width:"30",height:"2.5",rx:"1.25",fill:"currentColor"})]})}function ca(){return d("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:"sc-oglyph",children:d("path",{d:"M12 5v14M5 12h14",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"})})}function Co(){return v("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:"sc-hglyph",children:[d("circle",{cx:"12",cy:"12",r:"9",fill:"none",stroke:"currentColor",strokeWidth:"2"}),d("path",{d:"M12 7.5v5.5",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"}),d("circle",{cx:"12",cy:"16.5",r:"1.15",fill:"currentColor"})]})}function vo(){return v("svg",{className:"sc-act-glyph sc-spin",viewBox:"0 0 16 16","aria-hidden":"true",focusable:"false",children:[d("circle",{cx:"8",cy:"8",r:"6.2",fill:"none",stroke:"currentColor",strokeWidth:"2",opacity:"0.3"}),d("path",{d:"M8 1.8a6.2 6.2 0 0 1 6.2 6.2",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"})]})}function ua({spinning:e}){return d("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e?"sc-dglyph sc-spin":"sc-dglyph",children:d("path",{d:"M21 12a9 9 0 1 1-2.64-6.36M21 3v6h-6",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function da(){return d("svg",{className:"sc-dglyph",viewBox:"0 0 14 14","aria-hidden":"true",children:d("rect",{x:"2",y:"2",width:"10",height:"10",rx:"2",fill:"currentColor"})})}import{jsx as pa}from"react/jsx-runtime";function tt({machines:e,onApproveRuntime:n,model:t,onPickModel:r}){return pa(bn,{machines:e,...n?{onApproveRuntime:n}:{},...t?{model:t}:{},...r?{onPickModel:r}:{}})}import{useCallback as ce,useEffect as he,useId as fa,useMemo as en,useRef as En,useState as Y}from"react";var rt=[{slug:"mac-arm",label:"macOS, Apple silicon"},{slug:"mac-intel",label:"macOS, Intel"},{slug:"windows",label:"Windows"},{slug:"linux",label:"Linux"}];function ot(e){if(!e)return"";try{return new URL(e).origin}catch{return""}}var No="soba.connect.choice",ma=180*24*60*60*1e3;function cr(e){let n=2166136261;for(let t=0;t<e.length;t++)n^=e.charCodeAt(t),n=Math.imul(n,16777619);return(n>>>0).toString(36)}function ur(e,n){return e?n?`${No}.${e}.${cr(n)}`:`${No}.${e}`:null}function dr(e){if(!e||typeof localStorage>"u")return null;try{let n=localStorage.getItem(e);if(!n)return null;let t=JSON.parse(n);if(Date.now()-Date.parse(t.at)>ma)return null;let r=me.find(o=>o.id===t.choice);return r?r.id:null}catch{return null}}function pr(e,n){if(!(!e||typeof localStorage>"u"))try{localStorage.setItem(e,JSON.stringify({choice:n,at:new Date().toISOString()}))}catch{}}var xo="soba.connect.model",ha=180*24*60*60*1e3;function mr(e,n){return e?n?`${xo}.${e}.${cr(n)}`:`${xo}.${e}`:null}function It(e){if(!e||typeof localStorage>"u")return null;try{let n=localStorage.getItem(e);if(!n)return null;let t=JSON.parse(n);if(Date.now()-Date.parse(t.at)>ha)return null;let r=t.choice;return typeof r!="string"||!r||r.length>120?null:/^[\w.:@+-]+(\/[\w.:@+-]+)?$/.test(r)?r:null}catch{return null}}function hr(e,n){if(!(!e||typeof localStorage>"u"))try{localStorage.setItem(e,JSON.stringify({choice:n,at:new Date().toISOString()}))}catch{}}var Mo="soba.connect.dismissed",ga=30*24*60*60*1e3;function gr(e,n){return e?n?`${Mo}.${e}.${cr(n)}`:`${Mo}.${e}`:null}function fr(e){if(!e||typeof localStorage>"u")return!1;try{let n=localStorage.getItem(e);if(!n)return!1;let t=JSON.parse(n);return Date.now()-Date.parse(t.at)<ga}catch{return!1}}function Ar(e){if(!(!e||typeof localStorage>"u"))try{localStorage.setItem(e,JSON.stringify({at:new Date().toISOString()}))}catch{}}import{Fragment as Tt,jsx as m,jsxs as P}from"react/jsx-runtime";var br=2e3,Aa=1e4,ba=9e4,ya=6e4;function yr(e,n,t,r=[],o){return e?"code":n&&(t.length>0||r.length>0)?"manage":o?"launch":"choose"}function wa(e){let n=Math.max(0,Math.round(e/1e3));return`${Math.floor(n/60)}:${String(n%60).padStart(2,"0")}`}function vr({client:e,initialCode:n,initialChoice:t,onConnected:r,showStatus:o=!0,initialContext:s=null,initialMachines:a,onClose:l,headingId:i,theme:c,reason:u,active:p=!0}){let A=!!s&&a!==void 0,[g,h]=Y(A?yr(n,o,a??[],[],t):"loading"),[y,M]=Y(s),[E,I]=Y(a??[]),[B,V]=Y(n??""),[L,x]=Y(null),[G,w]=Y(null),[ae,K]=Y(!1),[ge,_]=Y(0),[ne,Qe]=Y(()=>Date.now()),[z,ue]=Y(null),[Be,ie]=Y(!1),[fe,q]=Y(!1),[Ae,Pe]=Y("browser"),[de,be]=Y(null),[Q,$]=Y([]),[Ge,je]=Y(0),[W,ye]=Y(null),Z=En(null),[O,C]=Y(t??null),[S,Ve]=Y(null),qe=en(()=>{let f=y?.accent?.trim(),N=y?.background?.trim();if(!(!f&&!N))return N?{...dn(N,f),background:N,borderRadius:"inherit"}:{"--sc-accent":f,"--sc-accent-fg":Jn(f)}},[y?.accent,y?.background]),we=fa(),le=i??we,Ze=En(null);he(()=>{if(!e||A)return;let f=!0;return Promise.all([e.context(),e.machines()]).then(([N,U])=>{f&&(M(N),I(U),h(yr(n,o,U)))}).catch(N=>{f&&(w(N.message),h("choose"))}),()=>{f=!1}},[e,n,o,A]),he(()=>{g!=="loading"||!A||h(yr(n,o,a??[]))},[g,A,n,o,a]),he(()=>{a&&I(a)},[a]),he(()=>{s&&M(s)},[s]);let kn=En(!1),Nn=En(g);Nn.current=g;let on=En(Q);on.current=Q;let sn=!!y?.hosted_available;he(()=>{!o&&Nn.current==="manage"&&h("choose")},[o]),he(()=>{if(!e||!p||g!=="manage")return;let f=!0,N=Se(async()=>{try{let U=await e.machines();if(!f)return;I(U);let J=!sn||kn.current;U.length===0&&on.current.length===0&&J&&Nn.current==="manage"&&h("choose")}catch{}},Aa,{immediate:!1});return()=>{f=!1,N()}},[g,e,sn,p]);let an=ur(y?.publishable_key??null);he(()=>{Ve(dr(an))},[an]),he(()=>{if(!e||!sn)return;let f=!0;return e.hosted().then(N=>{f&&($(N.credentials),!kn.current&&(kn.current=!0,N.credentials.length>0&&o&&Nn.current==="choose"&&h("manage")))}).catch(()=>{}),()=>{f=!1}},[e,sn,o]),he(()=>{if(!e||!p||g!=="hosted")return;let f=!0,N=async()=>{try{let He=await e.hosted();if(!f)return!1;if($(He.credentials),He.credentials.length>0)return h("hosted_connected"),ye(null),!0}catch{}return!1},U=async()=>{Z.current?.closed&&(Z.current=null,!await N()&&f&&h("choose"))},J=Se(N,br,{immediate:!1}),cn=setInterval(U,400),Ee=He=>{let Un=He.data;Un?.source==="soba"&&Un.type==="hosted_result"&&N()};return window.addEventListener("message",Ee),()=>{f=!1,J(),clearInterval(cn),window.removeEventListener("message",Ee),Z.current=null}},[e,g,p]);let Ft=ce(()=>{if(!e)return;let f=window.open("","soba-connect-plan","width=520,height=760,noopener=no");Z.current=f,h("hosted"),je(Date.now()),ye(null),w(null),e.startHosted().then(({url:N})=>{if(f&&!f.closed){f.location.href=N;return}ye(N)}).catch(N=>{f?.close(),Z.current=null,w(N.message),h("choose")})},[e]),At=ce(async f=>{if(e){K(!0);try{await e.disconnectHosted(f),$((await e.hosted()).credentials)}catch(N){w(N.message)}finally{K(!1)}}},[e]);he(()=>{if(!e||!p||g!=="waiting")return;let f=!0,N=Se(async()=>{try{let U=await e.machines();if(!f)return;I(U);let J=Ze.current;if(!J)return;let cn=U.filter(He=>!J.has(He.id)),Ee=cn.find(He=>He.state!=="offline")??cn[0];if(Ee){be(Ee.id),O&&pr(an,O);let He=me.find(Jt=>Jt.id===O)?.expects??[],Un=Ne(Ee).find(Jt=>He.includes(Jt.id));Un&&e.preferRuntime(Ee.id,Un.id).catch(()=>{}),h("connected"),r?.(U)}}catch{}},br,{immediate:!1});return()=>{f=!1,N()}},[g,e,r,O,an,p]);let bt=ce(async()=>{if(e){w(null),K(!0);try{let f=await e.lookup(B);x(f),h("confirm")}catch(f){w(f.message)}finally{K(!1)}}},[e,B]),xn=ce(async()=>{if(e){w(null),K(!0);try{try{Ze.current=new Set((await e.machines()).map(f=>f.id))}catch{Ze.current=new Set(E.map(f=>f.id))}await e.approve(B),h("waiting"),_(Date.now())}catch(f){w(f.message)}finally{K(!1)}}},[e,B,E]),yt=ce(async()=>{if(e){K(!0);try{await e.deny(B),Pe("browser"),h("denied")}catch(f){w(f.message)}finally{K(!1)}}},[e,B]),X=en(()=>y?.connect_url??null,[y]),[We,Ce]=Y(()=>Zn()),ln=en(()=>X?qn(X,We??void 0,O??void 0):null,[X,We,O]),wt=en(()=>ot(X),[X]),Qt=ce(f=>{if(E.length===0)return null;let N=me.find(J=>J.id===f);if(!N)return null;let U=E.flatMap(J=>J.runtimes??[]).filter(J=>N.expects.includes(J.id));return U.length===0?{tone:"dim",text:"not installed"}:U.some(J=>J.authenticated===!0)?{tone:"ok",text:"ready"}:U.every(J=>J.authenticated===!1)?{tone:"warn",text:"needs signing in"}:{tone:"dim",text:"installed"}},[E]),k=ce((f=null)=>{C(f),w(null),ue(null),ie(!1),q(!1),ee.current=!1,Ce(Zn()),h("launch")},[]),ee=En(!!t);he(()=>{g!=="launch"||!X||ee.current||(ee.current=!0,ie(!0),$t(X,{...We?{nonce:We}:{},...O?{want:O}:{}}).then(ue))},[g,X,We,O]);let pe=ce(()=>{ie(!0),_t().then(ue)},[]),Ct=ce(f=>{if(fe){let N=Zn();q(!1),Ce(N),X&&(f.preventDefault(),window.location.href=qn(X,N??void 0,O??void 0))}pe()},[fe,pe,X,O]),ve=en(()=>{let f=y?.runtimes;return f?me.filter(N=>f.includes(N.id)):sr()},[y?.runtimes]),Re=en(()=>{let f=me.find(N=>N.id===O);return f?{choice:f,Mark:$e[f.id]??null}:null},[O]),Je=en(()=>E.find(f=>f.id===de),[E,de]);he(()=>{let f=We;if(!e||!p||g!=="launch"||!f)return;let N=!1,U=Date.now()+15e4,J=()=>{};return J=Se(async()=>{if(Date.now()>U){J(),q(!0);return}try{let cn=await e.claim(f);if(N)return;if(cn.declined){J(),ue(null),Pe("machine"),h("denied");return}if(!cn.claimed)return;J();try{Ze.current=new Set((await e.machines()).map(Ee=>Ee.id))}catch{Ze.current=new Set(E.map(Ee=>Ee.id))}h("waiting"),_(Date.now())}catch{}},br,{immediate:!1,idle:!1}),()=>{N=!0,J()}},[e,g,E,We,p]);let ke=en(()=>{if(!L)return null;if(L.approved||L.denied)return"answered";let f=L.expires_at?Date.parse(L.expires_at):Number.NaN;return Number.isFinite(f)&&f<=ne?"expired":"live"},[L,ne]);he(()=>{if(!(g==="confirm"&&ke==="live"||g==="waiting"||g==="hosted"))return;let N=setInterval(()=>Qe(Date.now()),1e3);return()=>clearInterval(N)},[g,ke]);let vt=ce(async(f,N)=>{if(e)try{await e.approveRuntime(f,N),I(await e.machines())}catch(U){w(U.message)}},[e]),Vt=ce(async(f,N)=>{if(e)try{await e.preferRuntime(f,N),I(await e.machines())}catch(U){w(U.message)}},[e]);return g==="loading"?m("div",{className:"soba-connect",...c?{"data-theme":c}:{},style:qe,children:m("div",{className:"sc-card",children:m("p",{className:"sc-note",children:"Loading\u2026"})})}):P("div",{className:"soba-connect",...c?{"data-theme":c}:{},style:qe,children:[l&&m("button",{type:"button",className:"sc-modal-close",onClick:l,"aria-label":"Close",children:"\xD7"}),g==="manage"&&P("div",{className:"sc-card",children:[m("h2",{className:"sc-title",id:le,children:"Your compute"}),P("p",{className:"sc-sub",children:[m(Ot,{context:y})," ",E.length>0&&Q.length>0?"runs on your connected plan, and on these machines while they are awake.":Q.length>0?"runs on the plan you connected. Nothing here is charged to you.":"runs on these machines, while they are awake."]}),m(bn,{machines:E,hosted:Q,onApproveRuntime:vt,onPreferRuntime:(f,N)=>void Vt(f,N),onDisconnectHosted:f=>void At(f),onPair:()=>h("choose"),busy:ae,...y?.app.name?{appName:y.app.name}:{}}),G&&m("p",{className:"sc-error",children:G})]}),g==="choose"&&P("div",{className:"sc-card",children:[m(va,{context:y}),m("h2",{className:"sc-h",id:le,children:u==="payment_required"?"Carry on with your own AI":u==="no_compute"?"This run needs a machine":"Connect your AI"}),m("p",{className:"sc-p",children:"Use compute you already have."}),X&&ve.length>0&&P(Tt,{children:[m("div",{className:"sc-opts",children:ve.map(f=>{let N=$e[f.id];return P("button",{type:"button",className:"sc-opt",onClick:()=>k(f.id),children:[m("span",{className:"sc-opt-tile","aria-hidden":"true",children:N&&m(N,{className:"sc-opt-mark"})}),m("span",{className:"sc-opt-text",children:m("span",{className:"sc-opt-label",children:f.label})}),(()=>{let U=Qt(f.id);return U?m("span",{className:`sc-opt-has sc-opt-has-${U.tone}`,children:U.text}):S===f.id?m("span",{className:"sc-opt-last",children:"last used"}):m(wr,{className:"sc-opt-go"})})()]},f.id)})}),P("p",{className:"sc-opt-note",children:["Your accounts stay there. ",So(y)," never sees them."]})]}),(!X||ve.length===0)&&m("p",{className:"sc-error",style:{marginTop:16},children:"This app has no publishable key yet, so there is nothing to pair against."}),G&&m("p",{className:"sc-error",children:G}),X&&y?.show_code===!0&&m("div",{className:"sc-opt-alt",children:m("button",{type:"button",className:"sc-alt-link",onClick:()=>h("code"),children:"I have a code"})})]}),g==="launch"&&P("div",{className:"sc-card",children:[P("div",{className:"sc-head",children:[m(In,{onClick:()=>h("choose")}),m("p",{className:"sc-head-title",children:"Soba App"})]}),m(Lt,{mark:Re?.Mark??te,still:fe||!Be&&z===null}),m("h2",{className:"sc-h",id:le,children:fe?"No answer from this machine":z==="absent"?"Nothing opened":z===null?"Opening Soba App\u2026":"Approve it on this machine"}),fe?m("p",{className:"sc-p",children:"The Soba app did not answer. It may not be open, or nobody was there. Try again when you are ready."}):z==="absent"?m("p",{className:"sc-p",children:"Nothing opened on this machine. Open it yourself below, or install it if it is not here yet."}):m("p",{className:"sc-p",children:z===null?"Approve it there and this page does the rest.":"This page finishes on its own."}),Re&&P("p",{className:"sc-prereq",children:[Re.Mark&&m(Re.Mark,{className:"sc-rt-mark"}),"Needs ",Re.choice.prerequisite]}),P("div",{className:"sc-stack",style:{marginTop:18},children:[m("a",{className:z==="absent"||fe?"sc-btn sc-btn-primary":"sc-btn",href:ln??"#",onClick:Ct,children:fe?"Try again":z==="absent"?"Open Soba App":"Open it again"}),m("p",{className:"sc-note",children:z===null?"Your browser will ask permission first.":"Your browser asks permission the first time."}),Re&&z==="absent"&&m("p",{className:"sc-note",children:m(ka,{text:Re.choice.hint})}),P("div",{className:"sc-foot-strip",children:[m("span",{children:"Not installed on this machine?"}),P("button",{type:"button",className:"sc-foot-go",onClick:()=>h("get"),children:["Get it",m(wr,{})]})]})]})]}),g==="get"&&P("div",{className:"sc-card",children:[P("div",{className:"sc-head",children:[m(In,{onClick:()=>h("launch")}),m("p",{className:"sc-head-title",children:"Get Soba App"})]}),m("div",{className:"sc-opts",children:rt.map(f=>P("a",{className:"sc-opt",href:`${wt}/download/${f.slug}`,target:"_blank",rel:"noreferrer noopener",children:[m("span",{className:"sc-opt-tile","aria-hidden":"true",children:m(or,{className:"sc-opt-mark"})}),m("span",{className:"sc-opt-text",children:m("span",{className:"sc-opt-label",children:f.label})}),m(wr,{className:"sc-opt-go"})]},f.slug))}),m("p",{className:"sc-opt-note",children:"Install it, then come back here and press the row you started with."})]}),g==="code"&&P("div",{className:"sc-card",children:[P("div",{className:"sc-head",children:[m(In,{onClick:()=>h("choose")}),m("p",{className:"sc-head-title",children:"Soba App"})]}),m("h2",{className:"sc-h",id:le,children:"Enter the code from that machine"}),m("p",{className:"sc-p",children:"Eight characters, shown by the Soba app once you paste the link."}),P("form",{className:"sc-stack",style:{marginTop:16},onSubmit:f=>{f.preventDefault(),bt()},children:[m("input",{className:"sc-input",value:B,onChange:f=>V(f.target.value),placeholder:"ACDE-F234",autoComplete:"off",autoFocus:!0,"aria-label":"Pairing code"}),G&&m("p",{className:"sc-error",children:G}),m("button",{type:"submit",className:"sc-btn sc-btn-primary",disabled:ae||B.length<8,children:ae?"Checking\u2026":"Continue"})]})]}),g==="confirm"&&L&&P("div",{className:"sc-card",children:[P("div",{className:"sc-head",children:[m(In,{onClick:()=>h("code")}),m("p",{className:"sc-head-title",children:"Soba App"})]}),m("h2",{className:"sc-title",children:"Attach this machine to your account?"}),P("p",{className:"sc-sub",children:[m(Ot,{context:y})," may send your runs to it once you approve. It can never see the account or the keys on it."]}),P("ul",{className:"sc-facts",children:[m(st,{k:"Code",v:L.user_code}),m(st,{k:"Machine",v:L.hostname??"not stated"}),m(st,{k:"System",v:[L.platform,L.arch].filter(Boolean).join(" / ")||"not stated"}),m(st,{k:"Asked by",v:L.client??"not stated"}),L.labels.length>0&&m(st,{k:"Labels",v:L.labels.join(", ")})]}),m("p",{className:"sc-note",style:{marginTop:12},children:"Every line above is what that machine said about itself. If none of it looks like a computer of yours, say no."}),ke==="expired"&&m("p",{className:"sc-error",children:"That code has expired. Ask the machine for a new one. It prints a fresh code each time it starts."}),ke==="answered"&&m("p",{className:"sc-error",children:"That code has already been answered. If it was not you, deny the next one."}),G&&m("p",{className:"sc-error",children:G}),P("div",{className:"sc-row",style:{marginTop:16},children:[m("button",{type:"button",className:"sc-btn sc-btn-primary",onClick:()=>void xn(),disabled:ae||ke!=="live",children:"Approve"}),m("button",{type:"button",className:"sc-btn",onClick:()=>void yt(),disabled:ae||ke==="answered",children:"No, deny it"})]}),ke==="live"&&L.expires_at&&P("p",{className:"sc-note",style:{marginTop:10},children:["This code expires in ",wa(Date.parse(L.expires_at)-ne),"."]})]}),g==="waiting"&&P("div",{className:"sc-card",children:[P("div",{className:"sc-head",children:[m(In,{onClick:()=>h("choose")}),m("p",{className:"sc-head-title",children:Re?.choice.short??"Soba App"})]}),m(Lt,{mark:Re?.Mark??te}),m("h2",{className:"sc-h",id:le,children:"Approved. Waiting for it to connect"}),m("p",{className:"sc-p",children:"Nothing more to do here. This page changes when it arrives."}),ge>0&&ne-ge>ba&&m("p",{className:"sc-note sc-tone-warn",style:{marginTop:14,textAlign:"center"},children:"Still nothing. Look at the Soba app on that machine: it says what it is doing. This keeps watching either way."})]}),g==="connected"&&P("div",{className:"sc-card",children:[m(Cr,{tone:"ok"}),m("h2",{className:"sc-h",id:le,children:Je?.label?`${Je.label} is connected`:"Connected"}),P("p",{className:"sc-p",children:[m(Ot,{context:y})," will use ",Je?.label?"it":"this machine"," from now on, while it is awake."]}),o&&P(Tt,{children:[m("div",{style:{marginTop:16},children:m(tt,{machines:E,onApproveRuntime:vt})}),m("button",{type:"button",className:"sc-btn sc-btn-wide",style:{marginTop:14},onClick:()=>h("manage"),children:"Done"})]})]}),g==="hosted"&&P("div",{className:"sc-card",children:[P("div",{className:"sc-head",children:[m(In,{onClick:()=>h("choose")}),m("p",{className:"sc-head-title",children:"ChatGPT"})]}),W?m(Lt,{mark:An,still:!0}):m(Lt,{mark:An}),m("h2",{className:"sc-h",id:le,children:W?"Your browser blocked the window":"Finish signing in to ChatGPT"}),m("p",{className:"sc-p",children:W?"Nothing opened. Open the sign-in yourself below. A link you click is allowed where a window we open is not.":"Approve it in the window that opened."}),P("div",{className:"sc-stack",style:{marginTop:18},children:[W&&m("a",{className:"sc-btn sc-btn-primary",href:W,target:"soba-connect-plan",rel:"noreferrer",children:"Open the ChatGPT sign-in"}),G&&m("p",{className:"sc-error",children:G}),Ge>0&&ne-Ge>ya&&m("p",{className:"sc-note sc-tone-warn",children:"Still nothing. The window may have been closed before it finished, or the sign-in may have been declined. This keeps watching either way."})]})]}),g==="hosted_connected"&&P("div",{className:"sc-card",children:[m(Cr,{tone:"ok"}),m("h2",{className:"sc-h",id:le,children:"ChatGPT is connected"}),P("p",{className:"sc-p",children:[m(Ot,{context:y})," will run on your ChatGPT plan",Q[0]?.account_label?` (${Q[0].account_label})`:"",". Nothing more to pay, nothing to install."]}),m("p",{className:"sc-opt-note",style:{textAlign:"center"},children:"It runs on our side, so it has no access to your files or your terminal."}),o&&P(Tt,{children:[m("button",{type:"button",className:"sc-btn sc-btn-wide",style:{marginTop:16},onClick:()=>h("manage"),children:"Done"}),m("div",{className:"sc-opt-alt",children:m("button",{type:"button",className:"sc-alt-link",onClick:()=>h("choose"),children:"Connect a machine too"})})]})]}),g==="denied"&&P("div",{className:"sc-card",children:[m(Cr,{tone:"off"}),m("h2",{className:"sc-h",id:le,children:"Declined"}),m("p",{className:"sc-p",children:Ae==="machine"?"Nothing was connected. You can ask again whenever you like.":"That machine was not attached to your account, and the terminal has been told so."}),m("button",{type:"button",className:"sc-btn sc-btn-wide",style:{marginTop:16},onClick:()=>h("choose"),children:"Back to the start"})]})]})}function So(e){return e?.app.name??"this app"}function Ca(e){let n=e?.app.icon_urls;if(n?.length)return n;let t=e?.app.icon_url;return t?[t]:[]}function Po(e){let n=Ca(e),[t,r]=Y([]),o=ce(l=>{l&&r(i=>i.includes(l)?i:[...i,l])},[]),s=ce(l=>o(l.currentTarget.getAttribute("src")),[o]),a=ce(l=>{l?.complete&&l.naturalWidth===0&&o(l.getAttribute("src"))},[o]);return{icon:n.find(l=>!t.includes(l)),onError:s,ref:a}}function va({context:e}){let{icon:n,onError:t,ref:r}=Po(e);return e?.app.mark==="soba"?m(te,{className:"sc-app-mark"}):n?m("img",{className:"sc-app-mark",src:n,alt:"","aria-hidden":"true",ref:r,onError:t}):null}function Ot({context:e}){let{icon:n,onError:t,ref:r}=Po(e),o=e?.app.mark==="soba";return P("span",{className:"sc-app",children:[o&&m(te,{className:"sc-app-icon"}),!o&&n&&m("img",{className:"sc-app-icon",src:n,alt:"",ref:r,onError:t}),So(e)]})}function In({onClick:e}){return m("button",{type:"button",className:"sc-head-back",onClick:e,"aria-label":"Back",children:m("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",children:m("path",{d:"M15 5 8 12l7 7",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})})}function wr({className:e}){return m("svg",{className:e,viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",children:m("path",{d:"M9 5l7 7-7 7",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function Lt({mark:e,still:n}){return P("span",{className:"sc-waiting","aria-hidden":"true",children:[!n&&m("svg",{className:"sc-waiting-orbit",viewBox:"0 0 100 100","aria-hidden":"true",focusable:"false",children:m("circle",{className:"sc-waiting-arc",cx:"50",cy:"50",r:"46"})}),m(e,{className:"sc-waiting-mark"})]})}function Cr({tone:e}){return m("span",{className:`sc-result sc-result-${e}`,"aria-hidden":"true",children:m(Xe,{kind:e==="ok"?"snap":"gone",size:84})})}function ka({text:e}){return m(Tt,{children:e.split("`").map((n,t)=>t%2===1?m("code",{className:"sc-inline-code",children:n},t):n)})}function st({k:e,v:n}){return P("li",{className:"sc-fact",children:[m("span",{className:"sc-fact-key",children:e}),m("span",{children:n})]})}import{forwardRef as Na}from"react";import{jsx as kr,jsxs as Nr}from"react/jsx-runtime";var xr=Na(function({machine:n,className:t,...r},o){if(!n)return null;let{ariaLabel:s,state:a}=Pn(n);return Nr("button",{ref:o,type:"button","aria-label":s,className:["sc-btn","sc-btn-connected",t].filter(Boolean).join(" "),...r,children:[kr("span",{className:"sc-pill-tile","aria-hidden":"true",children:kr(Xe,{kind:a.tone==="busy"?"serving":a.tone==="ok"?"ready":n.pairing_lost?"gone":"paused",size:16,className:"sc-pill-mark"})}),Nr("span",{className:"sc-btn-connected-text",children:[a.word,!n.pairing_lost&&Nr("span",{className:"sc-btn-connected-where",children:[" on ",j(n)]})]}),kr("i",{className:`sc-dot sc-dot-${a.tone}`,"aria-hidden":"true"})]})});import{useEffect as xa,useRef as Sr}from"react";var Bt=0,Mr=null;function Ro(){if(typeof document>"u")return()=>{};Bt===0&&(Mr=document.body.style.overflow,document.body.style.overflow="hidden"),Bt+=1;let e=!1;return()=>{e||(e=!0,Bt-=1,Bt===0&&(document.body.style.overflow=Mr??"",Mr=null))}}import{jsx as Eo}from"react/jsx-runtime";function at({open:e,onClose:n,labelledBy:t,theme:r,style:o,children:s}){let a=Sr(null),l=Sr(null),i=Sr(null);return xa(()=>{let c=a.current;if(c){if(!e){c.open&&c.close();return}return c.open||c.showModal(),document.activeElement===c&&l.current?.focus(),Ro()}},[e]),Eo("dialog",{ref:a,className:"soba-connect sc-modal","aria-labelledby":t,...r?{"data-theme":r}:{},style:o,onCancel:c=>{c.preventDefault(),n()},onPointerDown:c=>{i.current=c.target},onClick:c=>{c.target===c.currentTarget&&i.current===c.currentTarget&&n()},children:Eo("div",{className:"sc-modal-sheet",ref:l,tabIndex:-1,children:s})})}import{useEffect as Pr,useRef as Ma}from"react";import{jsx as Sa}from"react/jsx-runtime";var yn=8;function Rr({open:e,onClose:n,anchor:t,label:r,theme:o,style:s,children:a}){let l=Ma(null);return Pr(()=>{let i=l.current;if(!(!i||!(typeof i.showPopover=="function")))try{e?i.showPopover():i.hidePopover()}catch{}},[e]),Pr(()=>{if(!e)return;let i=()=>{let u=l.current,p=t.current;if(!u||!p)return;let A=p.getBoundingClientRect(),g=u.offsetWidth,h=u.offsetHeight,y=window.innerWidth-g-yn,M=Math.max(yn,Math.min(A.right-g,Math.max(yn,y))),E=A.bottom+yn,I=A.top-yn-h,B=E+h>window.innerHeight-yn&&I>yn?I:E;u.style.left=`${Math.round(M)}px`,u.style.top=`${Math.round(B)}px`};i();let c=requestAnimationFrame(i);return window.addEventListener("scroll",i,!0),window.addEventListener("resize",i),()=>{cancelAnimationFrame(c),window.removeEventListener("scroll",i,!0),window.removeEventListener("resize",i)}},[e,t]),Pr(()=>{if(!e)return;let i=u=>{u.key==="Escape"&&n()},c=u=>{let p=u.target;p&&(l.current?.contains(p)||t.current?.contains(p)||n())};return document.addEventListener("keydown",i),document.addEventListener("pointerdown",c,!0),()=>{document.removeEventListener("keydown",i),document.removeEventListener("pointerdown",c,!0)}},[e,n,t]),Sa("div",{ref:l,role:"dialog","aria-label":r,className:"soba-connect sc-pop",...o?{"data-theme":o}:{},popover:"manual",hidden:!e,style:s,children:a})}var it=new Map,On=new Map,Io=!1;function Pa(){Io||typeof window>"u"||(Io=!0,window.addEventListener("storage",e=>{!e.key||!it.has(e.key)||(On.set(e.key,It(e.key)),Er(e.key))}))}function Er(e){for(let n of it.get(e)??[])n()}function lt(e){return e??""}function Ir(e,n){let t=lt(e);Pa();let r=it.get(t)??new Set;return r.add(n),it.set(t,r),()=>{r.delete(n),r.size===0&&it.delete(t)}}function Gt(e){let n=lt(e),t=On.get(n);if(t!==void 0)return t;let r=e?It(e):null;return On.set(n,r),r}function Or(){return null}function Lr(e,n){Gt(e)===null&&(On.set(lt(e),n),Er(lt(e)))}function Tr(e,n){let t=lt(e);On.get(t)!==n&&(On.set(t,n),hr(e,n),Er(t))}function Ye(e){let n=`${e.unit}s`;return e.reward==="unlimited"?`Unlimited ${n} on your own AI`:e.reward==="included"&&e.includedUnits!==null?`${Ea(e.includedUnits)} ${n} a month once you connect`:e.reward==="credit"&&e.creditMicros>0?`${Ra(e.creditMicros)} back each month you stay connected`:null}function ze(e){return e==="unlimited"||e==="included"}var Lo=new Set(["user-hardware","user-subscription"]),Oo=new Set(["open-weights","frontier"]);function Le(e){return e===null||e.length===0?!1:e.every(n=>Lo.has(n))}var Ra=e=>(e/1e6).toLocaleString("en-US",{style:"currency",currency:"USD",minimumFractionDigits:2,maximumFractionDigits:2}),Ea=e=>e.toLocaleString("en-US");function Br(e,n){if(!(n===null||n.some(s=>Oo.has(s))))return!1;let r=e.findIndex(s=>Lo.has(s));if(r===-1)return!1;let o=e.findIndex(s=>Oo.has(s));return o===-1||r<o}import{createContext as To,useContext as Bo}from"react";var Gr=To(null);function Ln(){return Bo(Gr)}var Wr=To({context:null,machines:void 0,theme:"light"});function H(){return Bo(Wr)}import{useMemo as La}from"react";import{createContext as Ia,useContext as Oa}from"react";var Hr=Ia(null);function F(){let e=Oa(Hr);if(!e)throw new Error("useSoba() must be used inside a <SobaProvider>.");return e}function ct(){let{compute:e}=F();return La(()=>{let n=e.machines,t=[...n].sort((s,a)=>De([s,a])===s?-1:1).map(Ta),r=De([...n]),o=pn(n);return{view:t.length?"machines":e.loading?"loading":e.error?"error":"empty",machines:t,primary:r?t.find(s=>s.machine.id===r.id)??null:null,connected:e.connected,online:e.online,stalled:e.connected&&!e.online&&o?t.find(s=>s.machine.id===o.id)??null:null,loading:e.loading,error:e.error,refresh:e.refresh}},[e])}function Ta(e){let n=Ie(e);return{machine:e,name:j(e),state:mn(e),status:Zt(e),hardware:Yn(e),lastSeen:e.state==="offline"?zn(e.last_seen_at):null,runtimes:Ne(e).map(t=>({runtime:t,name:t.display_name,auth:_e(t),quarantined:!!t.quarantined})),runsOn:{by:n.by,name:n.runtime?.display_name??null}}}import{useCallback as Dr,useEffect as Ba,useMemo as Ur,useSyncExternalStore as Ga}from"react";function wn(e={}){let{compute:n,connect:t}=F(),{value:r,onChange:o,defaultValue:s,remember:a=!0,user:l}=e,i=r!==void 0,c=a&&!i?mr(t.publishableKey,l):null,u=Dr(I=>Ir(c,I),[c]),p=Ga(u,Dr(()=>Gt(c),[c]),Or),A=Ur(()=>_n(n.machines),[n.machines]),g=Ur(()=>$n(A),[A]);Ba(()=>{i||!s||Lr(c,s)},[i,s,c]);let h=i?r:p??s??null,{selected:y,unavailable:M}=Ur(()=>tr(A,h??null),[A,h]),E=Dr(I=>{i||Tr(c,I),o?.(I)},[i,c,o]);return{options:A,groups:g,selected:y,select:E,run:rr(y),unavailable:M,pickable:fn(A),loading:n.loading&&!n.machines.length}}import{jsx as ut}from"react/jsx-runtime";function Wa({className:e}){let{theme:n}=H(),t=e?`soba-connect ${e}`:"soba-connect";return ut("div",{className:t,"data-theme":n,children:ut(Fr,{})})}function Fr(){let e=ct(),n=wn();return e.view==="loading"?ut("p",{className:"sc-note",children:"Loading\u2026"}):e.view==="error"?ut("p",{className:"sc-error",children:e.error?.message}):ut(tt,{machines:e.machines.map(t=>t.machine),model:n.selected,onPickModel:n.select})}import{useCallback as pt,useEffect as Yr,useMemo as Ya,useRef as zr,useState as Bn}from"react";import{useId as Ha}from"react";import{jsx as Tn,jsxs as Wt}from"react/jsx-runtime";function dt({open:e,onOpenChange:n,initialCode:t,onConnected:r,showStatus:o,reason:s}){let{error:a}=F(),l=Ln(),i=H(),c=()=>n(!1),u=Ha(),p=i.context?.background?.trim(),A=p?dn(p,i.context?.accent):void 0;return Wt(at,{open:e,onClose:c,labelledBy:u,theme:i.theme,style:A,children:[a?Wt("div",{className:"sc-card",children:[Tn("h2",{className:"sc-title",id:u,children:"Could not start"}),Tn("p",{className:"sc-error",children:a.message})]}):!l&&!i.context?Wt("div",{className:"sc-card",children:[Tn("h2",{className:"sc-title",id:u,children:"One moment"}),Tn("p",{className:"sc-note",children:"Getting your compute\u2026"})]}):Tn(vr,{client:l,active:e,onClose:c,headingId:u,theme:i.theme,initialContext:i.context,...i.machines!==void 0?{initialMachines:i.machines}:{},...t?{initialCode:t}:{},...r?{onConnected:r}:{},...o===void 0?{}:{showStatus:o},...s?{reason:s}:{}}),Wt("p",{className:"sc-modal-foot",children:[Tn(te,{className:"sc-foot-mark"}),"Secured by Soba"]})]})}import{forwardRef as Da}from"react";import{jsx as Ua}from"react/jsx-runtime";var Qr=Da(function(n,t){let{theme:r}=H();return Ua(xr,{ref:t,"data-theme":r,...n})});import{useCallback as Fa}from"react";function Qa(){let{connect:e}=F(),n=ct(),t=Fa(()=>e.open("manual"),[e]);return{...Pn(n.primary?.machine??null),machine:n.primary,open:t,canOpen:e.hasModal,loading:n.view==="loading"}}function Vr(e){return Pn(e)}import{useCallback as Go,useEffect as Va,useState as Ja}from"react";function Jr({enabled:e=!0,intervalMs:n=3e3}={}){let t=Ln(),[r,o]=Ja(null),s=Go(async()=>{t&&o(await t.runs())},[t]);Va(()=>{if(!e||!t)return;let l=!0,i=Se(async()=>{let c=await t.runs();l&&o(c)},n);return()=>{l=!1,i()}},[e,t,n]);let a=Go(async l=>{if(!t)throw new Error("Stopping a run needs <SobaProvider>.");await t.stopRun(l),await s().catch(()=>{})},[t,s]);return{runs:r,refresh:s,stop:a}}import{Fragment as Wo,jsx as Gn,jsxs as Ho}from"react/jsx-runtime";function Cn({children:e,variant:n,className:t,initialCode:r,onConnected:o,defaultOpen:s,open:a,onOpenChange:l,showConnected:i=!0}){let{compute:c,connect:u}=F(),p=H(),{theme:A}=p,g=Ln(),[h,y]=Bn(s??!!r),M=zr(null),E=a!==void 0,I=!E&&!s&&!r&&u.hasModal,B=E?a:I?u.isOpen:h,V=C=>{I?C?u.open("manual"):u.close():E||y(C),l?.(C)},L=zr(B);Yr(()=>{L.current&&!B&&M.current?.focus(),L.current=B},[B]);let[x,G]=Bn(!1),{runs:w,stop:ae}=Jr({enabled:x}),K=wn(),ge=Ya(()=>x&&w?za(c.machines,w):c.machines,[c.machines,x,w]),_=De(ge),ne=i&&Vr(_).connected,Qe=pt(()=>G(!1),[]),[z,ue]=Bn(!1),Be=pt(async()=>{ue(!0);try{await c.refresh()}finally{ue(!1)}},[c]),ie=zr(Be);ie.current=Be,Yr(()=>{x&&ie.current()},[x]);let[fe,q]=Bn(!1),[Ae,Pe]=Bn([]),de=!!p.context?.hosted_available;Yr(()=>{if(!x||!g||!de)return;let C=!0;return g.hosted().then(S=>{C&&Pe(S.credentials)}).catch(()=>{}),()=>{C=!1}},[x,g,de]);let[be,Q]=Bn(null),$=pt(async(C,S)=>{if(g){Q(null);try{await g.approveRuntime(C,S),await c.refresh()}catch(Ve){Q(Ve.message)}}},[g,c]),Ge=pt(async(C,S)=>{if(g){Q(null);try{await g.preferRuntime(C,S),await c.refresh()}catch(Ve){Q(Ve.message)}}},[g,c]),je=pt(async C=>{if(g){Q(null);try{await g.disconnectHosted(C),Pe((await g.hosted()).credentials)}catch(S){Q(S.message)}}},[g]),W=p.context?.background?.trim(),ye=W?dn(W,p.context?.accent):void 0,Z=ne&&!e,O=()=>{if(Z&&!E&&!s&&!r){G(C=>!C);return}V(!0)};return Ho(Wo,{children:[Z?Gn(Qr,{ref:M,machine:_,"aria-haspopup":"dialog","aria-expanded":x,onClick:O,...t?{className:t}:{}}):Gn("button",{ref:M,type:"button","data-theme":A,className:["sc-btn","sc-btn-icon",n==="primary"?"sc-btn-primary":"",t].filter(Boolean).join(" "),onClick:O,children:e??Ho(Wo,{children:[Gn(te,{className:"sc-btn-mark"}),"Connect compute"]})}),Gn(Rr,{open:x,onClose:Qe,anchor:M,label:"Your compute",theme:A,...ye?{style:ye}:{},children:Gn(bn,{machines:ge,hosted:Ae,onApproveRuntime:(C,S)=>void $(C,S),onPreferRuntime:(C,S)=>void Ge(C,S),onDisconnectHosted:C=>void je(C),onRefresh:()=>void Be(),refreshing:z,model:K.selected,onPickModel:K.select,error:be,runs:w,onStopRun:async C=>{Q(null);try{await ae(C)}catch(S){throw Q(S.message),S}},onPair:()=>{G(!1),I?u.open("pair"):(q(!0),V(!0))},...p.context?.app.name?{appName:p.context.app.name}:{}})}),!I&&Gn(dt,{open:B,onOpenChange:C=>{C||q(!1),V(C)},...fe?{showStatus:!1}:{},...r?{initialCode:r}:{},...o?{onConnected:o}:{}})]})}function za(e,n){return e.map(t=>{if(t.state==="offline")return t;let r=n.filter(o=>o.machine_id===t.id).length;return{...t,active:r,state:r>0?"busy":"online"}})}import{jsx as jr,jsxs as qa}from"react/jsx-runtime";function ja({initialCode:e,onConnected:n,className:t,showStatus:r=!0}){let{theme:o}=H();return qa("div",{className:t?`soba-connect ${t}`:"soba-connect","data-theme":o,children:[r&&jr(Fr,{}),jr("div",{className:"sc-compute-act",children:jr(Cn,{...e?{initialCode:e}:{},...n?{onConnected:n}:{}})})]})}import{useId as ai,useState as ii}from"react";import{useCallback as Zr,useEffect as Vo,useState as Jo}from"react";import{useCallback as Za,useState as Xa}from"react";function mt(){let[e,n]=Xa(null);return{open:Za(()=>{n(null),Xn().then(n)},[]),launch:e,note:e==="absent"?"Nothing opened here. That machine may be a different computer, or asleep.":null}}import{useCallback as Do,useMemo as Uo}from"react";function vn(e){if(!e)return null;if(typeof e=="string")return e;if(typeof Response<"u"&&e instanceof Response)return Fo(e.status);let n=e,t=n.error;return typeof t?.code=="string"?t.code:typeof t?.type=="string"?t.type:typeof n.code=="string"?n.code:typeof n.status=="number"?Fo(n.status):n.cause&&n.cause!==e?vn(n.cause):null}function Fo(e){return e===402?"payment_required":e===409?"no_compute":null}function qr(...e){let[n,t]=e,{plan:r,compute:o,connect:s}=F(),a=t?.predict??e.length===0,l=_a(Ka(n),o)??(a?$a(r,o):null),i=r.plan,c=r.plans,u=Uo(()=>{if(l!=="payment_required")return null;let h=i?.price??0,y=i?.included_units??0;return c.find(M=>M.id!==i?.id&&M.price>h&&(M.included_units===null||M.included_units>y))??null},[l,c,i]),p=Do(async()=>{if(!u)return;if(u.selectable){await r.select(u.id);return}let h=await r.checkout(u.id);window.location.assign(h)},[u,r]),A=s.open,g=Do(()=>{l&&A(l)},[A,l]);return Uo(()=>{if(!l)return null;let h=i?Ye({unit:i.unit,reward:i.connected_reward,includedUnits:i.connected_included_units,creditMicros:i.connected_credit*1e6}):null,y=i&&ze(i.connected_reward)?h:null;return{reason:l,...ei(l,{connectOffer:y,connected:o.connected,online:o.online,machine:pn(o.machines)?.label??null,unit:i?.unit??"message",interval:i?.interval??"month",upgrade:u!==null,resets:r.current?.period_end??null}),connectOffer:y,upgradeTo:u,connect:g,upgrade:p}},[l,i,o,u,g,p,r.current?.period_end])}function Ka(e){let n=vn(e);return n==="payment_required"||n==="no_compute"?n:null}function _a(e,n){return e==="no_compute"&&n.connected&&n.online?null:e}function $a(e,n){let t=e.plan;return!t||n.loading?null:Le(t.route_allow)&&!n.online?"no_compute":e.remaining===0&&t.overage==="stop"?"payment_required":null}function ei(e,n){if(e==="payment_required"){let t=`No ${n.unit}s left this ${n.interval}`;return n.connectOffer&&!n.connected?{title:t,body:`${n.connectOffer}. Connecting takes a minute and costs nothing.`}:n.connectOffer&&!n.online?{title:t,body:`${n.connectOffer}. Waking ${n.machine??"your machine"} is enough.`}:n.upgrade?{title:t,body:n.resets?`A larger plan carries on now. This one comes back on ${Qo(n.resets)}.`:"A larger plan carries on now, or wait for this one to renew."}:{title:t,body:n.resets?`Your allowance comes back on ${Qo(n.resets)}.`:"Your allowance comes back at the start of the next period."}}return n.connected&&!n.online?{title:`${n.machine??"Your machine"} can't be reached`,body:"This run needs it awake and connected. Open Soba App on that machine, or connect another one."}:{title:"Nothing connected yet",body:"This app runs on AI you already pay for, on a machine of your own. Connect one and this run has somewhere to go."}}function Qo(e){let n=new Date(e);return Number.isNaN(n.getTime())?e:n.toLocaleDateString(void 0,{day:"numeric",month:"long"})}function ni(e){let{plan:n,allowance:t,connected:r,online:o,quiet:s,error:a,predict:l,at:i,waved:c}=e;if(!n)return null;let u=e.allow!==void 0?e.allow:n.route_allow;if(r){if(o)return null;let y=Le(u);return{reason:"stalled",title:`${s??"Your machine"} can\u2019t be reached`,detail:y?"The Soba app there has stopped reporting in, so runs have nowhere to go until it is back.":"The Soba app there has stopped reporting in, so nothing will run on your own AI until it is back.",meter:null,dismissible:!1,atTheWall:!1,ownCompute:y}}let p=vn(a),A=p==="payment_required"||p==="no_compute",g=n.ask_to_connect!==!1&&Br(n.route_prefer,u);if(!l&&!A&&!g)return null;let h=Le(u)?ti(n.unit,Le(n.route_allow)):ze(n.connected_reward)?oi(t,n,i):g?ri(n.unit):null;return!h||h.dismissible&&c?null:{...h,dismissible:!!h.dismissible,ownCompute:!1,atTheWall:!h.dismissible&&(!l||h.meter!==null&&h.meter.left===0)}}function Xr(e={}){let{at:n=.25,error:t,allow:r}=e,o=e.predict??!(e.errorGiven??t!==void 0),{plan:s,compute:a,connect:l}=F(),i=gr(l.publishableKey),[c,u]=Jo(!1);Vo(()=>{u(fr(i))},[i]);let p=Zr(()=>{u(!0),Ar(i)},[i]),A=Zr(()=>l.open("manual"),[l]),g=Zr(()=>l.open("no_compute"),[l]),h=mt(),[y,M]=Jo(!1),{refresh:E}=a,{launch:I}=h;Vo(()=>{if(I===null||I==="absent")return;M(!1);let G=setInterval(()=>void E(),3e3),w=setTimeout(()=>{clearInterval(G),M(!0)},2e4);return()=>{clearInterval(G),clearTimeout(w)}},[I,E]);let B=si(l.app?.name,ot(l.connectUrl)),V=s.loading||a.loading,L=pn(a.machines),x=V?null:ni({plan:s.plan,allowance:{remaining:s.remaining,included:s.included},connected:a.connected,online:a.online,quiet:L?j(L):null,error:t,predict:o,...r!==void 0?{allow:r}:{},at:n,waved:c});return{reason:x?.reason??null,visible:x!==null,title:x?.title??null,detail:x?.detail??null,meter:x?.meter??null,dismissible:x?.dismissible??!1,dismissed:c,dismiss:p,open:A,atTheWall:x?.atTheWall??!1,steps:B,stalled:x?.reason==="stalled"?{machine:L?j(L):null,ownCompute:x.ownCompute,wake:h.open,launch:h.launch,note:h.note,stuck:y,connectAnother:g}:null,loading:V}}function ti(e,n){return{reason:"needed",title:n?"This plan runs on your own AI.":`These ${e}s run on your own AI.`,detail:`Connect a machine and your ${e}s run there, free, on access you already have.`,meter:null}}function ri(e){return{reason:"preferred",title:"This plan prefers your own AI.",detail:`Connect a machine and your ${e}s run there instead, on access you already have.`,meter:null,dismissible:!0}}function oi(e,n,t){let{remaining:r,included:o}=e;if(r===null||o===null||o===0||r>Math.ceil(o*t))return null;let s=Ye({unit:n.unit,reward:n.connected_reward,includedUnits:n.connected_included_units,creditMicros:n.connected_credit*1e6});return s?{reason:"running",title:r===0?`No ${n.unit}s left this month.`:`${r} ${n.unit}${r===1?"":"s"} left this month.`,detail:`${s}.`,meter:{left:r,of:o}}:null}function si(e,n){return[{lead:"Download Soba App",detail:"",...n?{linksLead:"Get it for"}:{},links:n?rt.map(t=>({label:t.label,href:`${n}/download/${t.slug}`})):[]},{lead:"Connect compute",detail:"Press this, then approve the pairing when the app asks.",opens:!0,links:[]},{lead:"Let your AIs serve",detail:`It finds what is installed on that machine. Allow one, and ${e??"this app"} sends every run there.`,linksLead:"Nothing on it yet?",links:me.map(t=>({label:t.short,href:t.install}))}]}import{Fragment as zo,jsx as T,jsxs as nn}from"react/jsx-runtime";function li(e){let{className:n,fallback:t=null}=e,r=Xr({...e.at===void 0?{}:{at:e.at},...e.predict===void 0?{}:{predict:e.predict},...e.allow===void 0?{}:{allow:e.allow},error:e.error,errorGiven:"error"in e}),{connect:o}=F(),{theme:s}=H(),[a,l]=ii(null),i=ai(),c=T(zo,{children:t});if(!r.visible)return c;if(r.stalled)return T(Yo,{className:n,theme:s,stalled:!0,children:T(ci,{title:r.title??"",detail:r.detail??"",stalled:r.stalled})});let u=a??r.atTheWall;return nn(Yo,{className:n,theme:s,children:[nn("div",{className:"sc-nudge-top",children:[nn("div",{className:"sc-nudge-say",children:[T("p",{className:"sc-nudge-title",children:r.title}),T("p",{className:"sc-nudge-detail",children:r.detail}),nn("button",{type:"button",className:"sc-btn sc-btn-quiet sc-nudge-more","aria-expanded":u,"aria-controls":i,onClick:()=>l(!u),children:[u?"Hide the details":"How it works",T(di,{})]})]}),r.dismissible?T("button",{type:"button",className:"sc-nudge-dismiss","aria-label":"Dismiss",title:"Dismiss",onClick:r.dismiss,children:T(ui,{})}):null]}),u?T("ol",{className:"sc-nudge-steps",id:i,children:r.steps.map(p=>nn("li",{children:[p.opens?T("button",{type:"button",className:"sc-step-lead",onClick:()=>o.open("manual"),children:p.lead}):T("strong",{children:p.lead}),p.detail?T("span",{children:p.detail}):null,p.links.length>0?nn("span",{className:"sc-step-links",children:[p.linksLead,p.links.map(A=>T("a",{href:A.href,target:"_blank",rel:"noreferrer noopener",children:A.label},A.href))]}):null]},p.lead))}):null,T(Cn,{variant:"primary"})]})}function Yo({className:e,theme:n,stalled:t,children:r}){return T("div",{className:e?`soba-connect sc-fill ${e}`:"soba-connect sc-fill","data-theme":n,children:T("div",{className:t?"sc-nudge sc-nudge-stalled":"sc-nudge",children:r})})}function ci({title:e,detail:n,stalled:t}){return nn(zo,{children:[T("div",{className:"sc-nudge-top",children:nn("div",{className:"sc-nudge-say",children:[T("p",{className:"sc-nudge-title",children:e}),T("p",{className:"sc-nudge-detail",children:n}),t.note&&T("p",{className:"sc-nudge-note",children:t.note}),t.stuck&&T("p",{className:"sc-nudge-note",children:"The Soba app is open, but this machine still isn\u2019t reporting in. It may no longer be connected to this app."}),(t.launch==="absent"||t.stuck)&&T("button",{type:"button",className:"sc-btn sc-btn-quiet sc-nudge-more",onClick:t.connectAnother,children:t.stuck?"Connect it again":"Connect another machine"})]})}),T("button",{type:"button",className:"sc-btn sc-btn-primary",onClick:t.wake,children:"Open Soba App"})]})}function ui(){return T("svg",{viewBox:"0 0 16 16","aria-hidden":"true",focusable:"false",className:"sc-nudge-x",children:T("path",{d:"m4.8 4.8 6.4 6.4M11.2 4.8l-6.4 6.4",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round"})})}function di(){return T("svg",{viewBox:"0 0 16 16","aria-hidden":"true",focusable:"false",className:"sc-nudge-chev",children:T("path",{d:"M4.5 6.5 8 10l3.5-3.5",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round"})})}var pi=new Set(["delta","thinking","status","done","error"]);function Wn(e){let n;try{n=JSON.parse(e)}catch{return null}if(!n||typeof n!="object")return null;let t=n,r=t.type==="event"?t.event:t;if(!r||typeof r!="object")return null;let o=r;if(typeof o.type!="string"||!pi.has(o.type))return null;let s={type:o.type};return typeof o.text=="string"&&(s.text=o.text),typeof o.message=="string"&&(s.message=o.message),typeof o.tool=="string"&&(s.tool=o.tool),typeof o.tier=="string"&&(s.tier=o.tier),o.usage&&typeof o.usage=="object"&&(s.usage=o.usage),typeof o.session=="string"&&(s.session=o.session),typeof o.toolInput=="string"&&(s.toolInput=o.toolInput),o.git&&typeof o.git=="object"&&(s.git=o.git),o.turn&&typeof o.turn=="object"&&typeof o.turn.text=="string"&&(s.turn={text:o.turn.text}),typeof o.reason=="string"&&(s.reason=o.reason),typeof o.retryable=="boolean"&&(s.retryable=o.retryable),(o.state==="interrupted"||o.state==="resumed")&&(s.state=o.state),s}async function*Kr(e){let n=e.body;if(!n)throw new Error("That run response had no body to stream.");let t=(e.headers.get("content-type")??"").includes("ndjson"),r=n.getReader(),o=new TextDecoder,s="",a=[];try{for(;;){let i=await r.read();if(i.done)break;for(s+=o.decode(i.value,{stream:!0});;){let c=s.indexOf(`
|
|
3
|
-
`);if(c===-1)break;let u=
|
|
4
|
-
`);if(a=[],
|
|
5
|
-
`);if(l&&l!=="[DONE]"){let i=
|
|
2
|
+
var jt={ready:{arc:!0},serving:{arc:!0,slot:"stream"},paused:{arc:!1,slot:"zzz"},thinking:{arc:!1,slot:"dots"},connecting:{arc:!1,slot:"orbit"},attention:{arc:!1,slot:"bang"},gone:{arc:!1,slot:"cross"},snap:{arc:!1,slot:"snap"},listening:{arc:!1,slot:"bars"},permission:{arc:!1,slot:"ring"},ai:{arc:!1,slot:"sparks"}};var qt="105 162 420 420",Zt="M407.1 308.9 A158 158 0 1 0 407.1 491.1 A116 116 0 0 1 407.1 308.9 Z",dn="M448.5 320 A110 110 0 0 1 448.5 480";import{Fragment as jn,jsx as R,jsxs as qe}from"react/jsx-runtime";function je({kind:e,size:n=44,className:t}){let r=jt[e];return qe("svg",{className:`bx${t?` ${t}`:""}`,"data-expression":e,viewBox:qt,overflow:"visible",width:n,height:n,"aria-hidden":"true",children:[R("path",{d:Zt,fill:"currentColor"}),R("path",{className:"bx-arc",d:dn,fill:"none",stroke:"currentColor",strokeWidth:17,strokeLinecap:"round"}),r.slot==="stream"&&R(vo,{}),r.slot==="zzz"&&R(ko,{}),r.slot==="dots"&&R(No,{}),r.slot==="bang"&&R(xo,{}),r.slot==="orbit"&&R(Mo,{}),r.slot==="cross"&&R(So,{}),r.slot==="snap"&&R(Po,{}),r.slot==="bars"&&R(Ro,{}),r.slot==="ring"&&R(Eo,{}),r.slot==="sparks"&&R(Io,{})]})}function vo(){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 ko(){return qe(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 No(){return qe(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 xo(){return qe("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 Mo(){return qe("g",{className:"bx-ob",children:[R("path",{d:dn,fill:"none",stroke:"var(--tile-bg, transparent)",strokeWidth:41,strokeLinecap:"round"}),R("path",{d:dn,fill:"none",stroke:"currentColor",strokeWidth:17,strokeLinecap:"round"})]})}function So(){return qe(jn,{children:[R("path",{className:"bx-xa",d:dn,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 Po(){return R("path",{className:"bx-snap",d:dn,fill:"none",stroke:"currentColor",strokeWidth:17,strokeLinecap:"round"})}function Ro(){return qe("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 Eo(){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 Io(){return qe(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 Oo={"claude-code":{small:"haiku",large:"opus"}};function Nt(e){let n=Oo[e];return!!(n?.small||n?.large)}import{useEffect as Zo,useRef as Xo,useState as Et}from"react";var Pn=class extends Error{status;constructor(n,t){super(n),this.name="ConnectError",this.status=t}},Lo=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()+Lo}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 Xt(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 Sn(e,n,t){let r=Xt(e),s=Xt(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 pn(e,n){if(!Xt(e))return{};let t=Zn(e),r=n?.trim();return{"--sc-ground":e,"--sc-shell":e,"--sc-sheet":Sn(e,t,.07),"--sc-raised":Sn(e,t,.13),"--sc-line":Sn(e,t,.18),"--sc-line-2":Sn(e,t,.28),"--sc-text":t,"--sc-text-2":Sn(t,e,.15),"--sc-muted":Sn(t,e,.38),...r?{"--sc-accent":r,"--sc-accent-fg":Zn(r)}:{"--sc-accent":t,"--sc-accent-fg":e}}}function We(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 mn(e){return e.find(n=>n.state==="offline")??null}function Kt(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 xt(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 He(e){return[...e].sort(xt)[0]??null}function hn(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=hn(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 Ve(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 _t(e){return e.runtimes.filter(n=>n.id!=="shell")}function Ne(e){return e.runtimes.filter(n=>n.id!=="shell"&&!n.quarantined&&!n.absent)}function 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=Ne(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 $t="soba";function _n(){return`${$t}://show`}function $n(e,n,t){let r=`${$t}://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 To=1600;function er(e={}){return tr(e)}async function nr(e,n={}){if(typeof window>"u"||typeof document>"u")return"unknown";let t=tr(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=tr(e);try{window.location.href=_n()}catch{return"absent"}return n}async function tr(e){if(typeof window>"u"||typeof document>"u")return"unknown";let n=e.graceMs??To,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 gs={"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 fs,useRef as Bo}from"react";import{Fragment as Ho,jsx as xe,jsxs as rr}from"react/jsx-runtime";function nt({anchor:e,label:n,options:t,current:r,onClose:s,onPick:o}){let a=Bo(null);return fs(()=>{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,S=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(S)}px`,i.querySelector('[aria-checked="true"]')?.focus()},[e]),fs(()=>{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]),xe("div",{ref:a,role:"menu","aria-label":n,className:"sc-menu",popover:"manual",onKeyDown:i=>{let c=[...a.current?.querySelectorAll("[role=menuitemradio]")??[]],u=c.indexOf(document.activeElement);if(i.key==="Escape")i.stopPropagation(),i.nativeEvent.stopImmediatePropagation(),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=>xe(Go,{option:i,checked:r===i.id,onClose:s,onPick:o},i.id??""))})}function Go({option:e,checked:n,onClose:t,onPick:r}){return rr(Ho,{children:[e.heading?xe("div",{className:"sc-menu-head",role:"presentation",children:e.heading}):e.rule?xe("div",{className:"sc-menu-sep"}):null,rr("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,rr("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(Wo,{})]})]})}function Wo(){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 En({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 Uo,useState as Fo}from"react";var Do={haiku:"Haiku",sonnet:"Sonnet",opus:"Opus",fable:"Fable"};function fn(e){return Do[e]??e}function tt(e){let n=[...e].sort(xt),t=He([...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=>Ne(u).some(m=>Nt(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 Ne(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 sr(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 or(e){return e.runtime?{model:e.model,runtime:e.runtime}:{model:e.model}}function An(e){return e.length>1}import{jsx as Mt,jsxs as As}from"react/jsx-runtime";function st({options:e,selected:n,onPick:t,caption:r,disabled:s,className:o}){let[a,l]=Fo(!1),i=Uo(null);if(!An(e))return null;let c=o?`sc-mp ${o}`:"sc-mp";return As("span",{className:c,children:[r&&Mt("span",{className:"sc-mp-cap",children:r}),As("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:[Mt("span",{className:"sc-mp-label",children:n.label}),Mt(En,{open:!0})]}),a&&Mt(nt,{anchor:i,label:"Which model answers",options:Qo(e),current:n.id,onClose:()=>l(!1),onPick:u=>{l(!1),u&&t(u)}})]})}function Qo(e){let n=[];for(let t of rt(e))t.options.forEach((r,s)=>{let o=Vo(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 Vo(e){return e.kind!=="named"?e.note:e.machine?`on ${e.machine}`:void 0}import{jsx as Me,jsxs as Yo}from"react/jsx-runtime";function oe({className:e}){return Yo("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 bs({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 bn({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 St({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 Jo({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 ar({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 Ze={claude:bs,chatgpt:bn,local:St},ys={shell:Jo};function Cs(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 zo=3e3,jo=2*6e4,Pt=Date.now(),Rt=new Set,ws=!1;function qo(){if(ws||typeof window>"u")return;ws=!0;let e=()=>{let t=Pt;if(Pt=Date.now(),Pt-t>jo)for(let r of Rt)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 Rt)t()};window.addEventListener("focus",n),document.addEventListener("visibilitychange",n)}function Se(e,n,t={}){qo();let r,s=t.immediate===!1?Date.now():0,o=!1,a=!1,l=()=>{a||(r=setTimeout(i,t.idle===!1?n:Cs(n,Date.now()-Pt)))},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,zo)&&i()};return Rt.add(c),t.immediate===!1?l():i(),()=>{a=!0,clearTimeout(r),Rt.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"]}],vs=["claude","chatgpt"];function ir(){return ge.filter(e=>vs.includes(e.id))}function lr(e){return ge.filter(n=>n.costClass===e)}function cr(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:S,loading:I,machineMenu:E,machineNote:T,onReconnect:J,openApp:O=!0,children:M,onStopRun:B}){let C=He(e),ue=e.filter(w=>w.id!==C?.id),_=C?.state==="online",[Ae,$]=Et(()=>_?[]:null),[Pe,Le]=Et("no"),ee=y===void 0&&!!S,Te=ee?Ae:y??(_?[]:null),q=y!==void 0||!!S,ne=!!(C&&Ve(C));Zo(()=>{if(!ee||!S||!ne)return;let w=!0,v=Se(async()=>{let Fe=await S();w&&$(Fe)},3e3);return()=>{w=!1,v()}},[ee,S,ne]);let Z=(C?_t(C):[]).filter(w=>w.quarantined&&!w.absent),X=C?he(C).runtime:null,be=X?.cost_class==="user-hardware"?X:null,ye=be?pa(be.default_model):null,pe=!!C&&!Ve(C),z=(()=>{if(!C||pe||!X||We(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:Pe==="going"?"Opening Soba\u2026":"Open Soba",onPress:te,spin:Pe==="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(fa,{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(aa,{}),E]}),children:[p(Ko,{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(je,{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||Pe==="going",children:Pe==="going"?"Waking\u2026":"Wake"})]})}),C?.pairing_lost&&!Ve(C)&&p(Ee,{title:"Soba",children:k("div",{className:"sc-away",children:[p("span",{className:"sc-away-mark","aria-hidden":"true",children:p(je,{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."})]}),J&&p("button",{type:"button",className:"sc-away-go",onClick:J,disabled:u,children:"Connect"})]})}),C&&!pe&&p(Ee,{title:"Runs on",children:X?p(ca,{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(ea,{})}),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(ur,{})]})]})}),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(Ns,{})}),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(Ns,{})}),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($o,{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(la,{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(ha,{credential:w,appName:m,busy:u,...s?{onDisconnect:()=>s(w.provider)}:{}},w.provider))}),ue.length>0&&p(Ee,{title:"Your other machines",children:ue.map(w=>p(ia,{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(ga,{})}),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(xs,{}),Q.label,!Q.spin&&p(ur,{})]})]}):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(xs,{}),Q.label]}),Pe==="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."]})]}),M,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 Ko({machine:e,onToggle:n,open:t}){let r=Ve(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(Ms,{}),p("span",{className:`sc-mbadge sc-mbadge-${r?hn(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 _o(e,n){return e.filter(t=>t.machine_id===n.id||t.machine_id===null)}function $o({machine:e,runs:n,onStop:t}){let r=n?_o(n,e):[],[s,o]=Et(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(na,{})}),"Nothing running"]}):r.map(i=>p(ta,{run:i,stopping:s.has(i.id),...t?{onStop:()=>void a(i.id)}:{}},i.id))})}function ea(){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 na(){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 ta({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:ks(e)}),p("span",{className:"sc-rstep",children:n?"Stopping\u2026":`${sa(e)} \xB7 ${oa(e.started_at)}`})]}),t&&p("button",{type:"button",className:"sc-rstop",onClick:t,disabled:n,"aria-label":`Stop ${ks(e)}`,children:p("span",{className:"sc-rstop-ring",children:p(Aa,{})})})]})}function ra(e){let n=cr(e);return(n?Ze[n.id]:null)??ys[e]??null}function ks(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 sa(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 oa(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 aa(){return p("a",{className:"sc-disc sc-open-app",href:_n(),"aria-label":"Open Soba App",title:"Open Soba App",children:p(ur,{})})}function ur(){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 ia({machine:e}){let n=hn(e);return k("div",{className:"sc-orow",children:[p("span",{className:"sc-otile","aria-hidden":"true",children:p(Ms,{})}),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 la({runtime:e,onApprove:n}){return k("div",{className:"sc-mrow",children:[p("span",{className:"sc-mtile sc-atile","aria-hidden":"true",children:p(It,{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 dr({id:e,name:n}){return p("span",{className:"sc-runtime-tile","aria-hidden":"true",children:p(It,{id:e,...n?{name:n}:{}})})}function It({id:e,name:n}){if(!e)return null;let t=gs[e];if(t)return p("img",{src:t,alt:"",className:"sc-runtime-logo"});let r=ra(e);return r?p(r,{className:"sc-runtime-mark"}):n?p("span",{className:"sc-runtime-letter",children:n.slice(0,1).toUpperCase()}):null}function ca({machine:e,appName:n,busy:t,onPick:r,model:s,onPickModel:o,onApprove:a}){let l=he(e),i=Ne(e),c=a?e.runtimes.filter(M=>M.quarantined&&!M.absent):[],[u,m]=Et(!1),A=Xo(null);if(l.by!=="app"&&i.length===0)return null;let g=M=>M?p(dr,{id:M.id,name:M.display_name}):null,h=l.runtime?.display_name??l.runtimeId??"\u2014",y=l.by!=="app"&&!!r&&(i.length>=2||c.length>0),S=l.runtime?.id??l.runtimeId,I=!Ve(e),E=l.runtime&&We(l.runtime).tone==="warn"?"Signed out":null,T=s?tt([e]).filter(M=>M.kind==="named"?M.runtime===S:M.kind==="size"?!!S&&Nt(S):!0):[],J=(()=>{if(!s)return;if(s.kind!=="auto")return s;let M=l.runtime?.default_model;if(!M)return s;let B=fn(M);return{...s,label:B.length>16?B:`${s.label} \xB7 ${B}`}})(),O=l.by==="app"?`Set by ${n??"the app"}`:l.runtime?da(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(M=>!M),children:[p("span",{className:"sc-runs-tile","aria-hidden":"true",children:p(It,{id:S??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(It,{id:S??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"]})]}),J&&o&&An(T)?k(ot,{children:[p("span",{className:"sc-runs-rule","aria-hidden":"true"}),p(st,{options:T,selected:J,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(ua,{anchor:A,machine:e,tile:g,waiting:c,...a?{onApprove:a}:{},onClose:()=>m(!1),onPick:M=>{m(!1),r(M)}})]})}function ua({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)},...Ne(n).map((m,A)=>{let g=ma(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 da(e){let n=We(e);return n.tone==="warn"?n.text:e.default_model?fn(e.default_model):"Automatic"}function pa(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 ma(e){let n=We(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 ha({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 Ms(){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 ga(){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 Ns(){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 xs(){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 fa({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 Aa(){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 ba}from"react/jsx-runtime";function pr({machines:e,onApproveRuntime:n,model:t,onPickModel:r}){return ba(yn,{machines:e,...n?{onApproveRuntime:n}:{},...t?{model:t}:{},...r?{onPickModel:r}:{}})}import{useCallback as ae,useEffect as fe,useId as va,useMemo as Xe,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 Ss="soba.connect.choice",ya=180*24*60*60*1e3;function mr(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 hr(e,n){return e?n?`${Ss}.${e}.${mr(n)}`:`${Ss}.${e}`:null}function gr(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)>ya)return null;let r=ge.find(s=>s.id===t.choice);return r?r.id: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 Ps="soba.connect.model",wa=180*24*60*60*1e3;function Ar(e,n){return e?n?`${Ps}.${e}.${mr(n)}`:`${Ps}.${e}`:null}function Ot(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)>wa)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 br(e,n){if(!(!e||typeof localStorage>"u"))try{localStorage.setItem(e,JSON.stringify({choice:n,at:new Date().toISOString()}))}catch{}}var Rs="soba.connect.dismissed",Ca=30*24*60*60*1e3;function yr(e,n){return e?n?`${Rs}.${e}.${mr(n)}`:`${Rs}.${e}`:null}function wr(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)<Ca}catch{return!1}}function Cr(e){if(!(!e||typeof localStorage>"u"))try{localStorage.setItem(e,JSON.stringify({at:new Date().toISOString()}))}catch{}}import{Fragment as Ln,jsx as d,jsxs as P}from"react/jsx-runtime";var vr=2e3,ka=1e4,Na=9e4,xa=6e4;function kr(e,n,t,r=[],s){return e?"code":n&&(t.length>0||r.length>0)?"manage":s?"launch":"choose"}function Es(e){return Ve(e)&&!e.pairing_lost}function Lt(e){return new Map(e.map(n=>[n.id,Es(n)]))}function Ma(e){let n=Math.max(0,Math.round(e/1e3));return`${Math.floor(n/60)}:${String(n%60).padStart(2,"0")}`}function Mr({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?kr(n,s,a??[],[],t):"loading"),[y,S]=Y(o),[I,E]=Y(a??[]),[T,J]=Y(n??""),[O,M]=Y(null),[B,C]=Y(null),[ue,_]=Y(!1),[Ae,$]=Y(0),[Pe,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,Fe]=Y(t??null),[en,we]=Y(null),nn=Xe(()=>{let f=y?.accent?.trim(),x=y?.background?.trim();if(!(!f&&!x))return x?{...pn(x,f),background:x,borderRadius:"inherit"}:{"--sc-accent":f,"--sc-accent-fg":Zn(f)}},[y?.accent,y?.background]),wt=va(),Ce=i??wt,tn=In(null);fe(()=>{if(!e||A)return;let f=!0;return Promise.all([e.context(),e.machines()]).then(([x,H])=>{f&&(S(x),E(H),h(kr(n,s,H)))}).catch(x=>{f&&(C(x.message),h("choose"))}),()=>{f=!1}},[e,n,s,A]),fe(()=>{g!=="loading"||!A||h(kr(n,s,a??[]))},[g,A,n,s,a]),fe(()=>{a&&E(a)},[a]),fe(()=>{o&&S(o)},[o]);let ze=In(!1),rn=In(g);rn.current=g;let Qn=In(re);Qn.current=re;let sn=!!y?.hosted_available;fe(()=>{!s&&rn.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 V=!sn||ze.current;H.length===0&&Qn.current.length===0&&V&&rn.current==="manage"&&h("choose")}catch{}},ka,{immediate:!1});return()=>{f=!1,x()}},[g,e,sn,m]);let on=hr(y?.publishable_key??null);fe(()=>{we(gr(on))},[on]),fe(()=>{if(!e||!sn)return;let f=!0;return e.hosted().then(x=>{f&&(Be(x.credentials),!ze.current&&(ze.current=!0,x.credentials.length>0&&s&&rn.current==="choose"&&h("manage")))}).catch(()=>{}),()=>{f=!1}},[e,sn,s]),fe(()=>{if(!e||!m||g!=="hosted")return;let f=!0,x=async()=>{try{let ke=await e.hosted();if(!f)return!1;if(Be(ke.credentials),ke.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"))},V=Se(x,vr,{immediate:!1}),cn=setInterval(H,400),un=ke=>{let Yn=ke.data;Yn?.source==="soba"&&Yn.type==="hosted_result"&&x()};return window.addEventListener("message",un),()=>{f=!1,V(),clearInterval(cn),window.removeEventListener("message",un),w.current=null}},[e,g,m]);let Vt=ae(()=>{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=ae(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 V=tn.current;if(!V)return;let cn=H.filter(ke=>!V.has(ke.id)||V.get(ke.id)===!1&&Es(ke)),un=cn.find(ke=>ke.state!=="offline")??cn[0];if(un){te(un.id),v&&fr(on,v);let ke=ge.find(zt=>zt.id===v)?.expects??[],Yn=Ne(un).find(zt=>ke.includes(zt.id));Yn&&e.preferRuntime(un.id,Yn.id).catch(()=>{}),h("connected"),r?.(H)}}catch{}},vr,{immediate:!1});return()=>{f=!1,x()}},[g,e,r,v,on,m]);let Ct=ae(async()=>{if(e){C(null),_(!0);try{let f=await e.lookup(T);M(f),h("confirm")}catch(f){C(f.message)}finally{_(!1)}}},[e,T]),Vn=ae(async()=>{if(e){C(null),_(!0);try{try{tn.current=Lt(await e.machines())}catch{tn.current=Lt(I)}await e.approve(T),Le("code"),h("waiting"),$(Date.now())}catch(f){C(f.message)}finally{_(!1)}}},[e,T,I]),vt=ae(async()=>{if(e){_(!0);try{await e.deny(T),pe("browser"),h("denied")}catch(f){C(f.message)}finally{_(!1)}}},[e,T]),F=Xe(()=>y?.connect_url??null,[y]),[me,Jn]=Y(()=>et()),Jt=Xe(()=>F?$n(F,me??void 0,v??void 0):null,[F,me,v]),N=Xe(()=>it(F),[F]),se=ae(f=>{if(I.length===0)return null;let x=ge.find(V=>V.id===f);if(!x)return null;let H=I.flatMap(V=>V.runtimes??[]).filter(V=>x.expects.includes(V.id));return H.length===0?{tone:"dim",text:"not installed"}:H.some(V=>V.authenticated===!0)?{tone:"ok",text:"ready"}:H.every(V=>V.authenticated===!1)?{tone:"warn",text:"needs signing in"}:{tone:"dim",text:"installed"}},[I]),ve=ae((f=null)=>{Fe(f),C(null),ne(null),Z(!1),be(!1),Mn.current=!1,Jn(et()),h("launch")},[]),Mn=In(!!t);fe(()=>{g!=="launch"||!F||Mn.current||(Mn.current=!0,Z(!0),nr(F,{...me?{nonce:me}:{},...v?{want:v}:{}}).then(ne))},[g,F,me,v]);let Re=ae(()=>{Z(!0),er().then(ne)},[]),Yt=ae(f=>{if(X){let x=et();be(!1),Jn(x),F&&(f.preventDefault(),window.location.href=$n(F,x??void 0,v??void 0))}Re()},[X,Re,F,v]),Qe=Xe(()=>{let f=y?.runtimes;return f?ge.filter(x=>f.includes(x.id)):ir()},[y?.runtimes]),de=Xe(()=>{let f=ge.find(x=>x.id===v);return f?{choice:f,Mark:Ze[f.id]??null}:null},[v]),an=Xe(()=>I.find(f=>f.id===z),[I,z]),kt=ae(()=>{h("manage"),l?.()},[l]);fe(()=>{let f=me;if(!e||!m||g!=="launch"||!f)return;let x=!1,H=Date.now()+15e4,V=()=>{};return V=Se(async()=>{if(Date.now()>H){V(),be(!0);return}try{let cn=await e.claim(f);if(x)return;if(cn.declined){V(),ne(null),pe("machine"),h("denied");return}if(!cn.claimed)return;V();try{tn.current=Lt(await e.machines())}catch{tn.current=Lt(I)}Le("app"),h("waiting"),$(Date.now())}catch{}},vr,{immediate:!1,idle:!1}),()=>{x=!0,V()}},[e,g,I,me,m]);let ln=Xe(()=>{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"&&ln==="live"||g==="waiting"||g==="hosted"))return;let x=setInterval(()=>Te(Date.now()),1e3);return()=>clearInterval(x)},[g,ln]);let wo=ae(async(f,x)=>{if(e)try{await e.approveRuntime(f,x),E(await e.machines())}catch(H){C(H.message)}},[e]),Co=ae(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:nn,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:nn,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(Tt,{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:wo,onPreferRuntime:(f,x)=>void Co(f,x),onDisconnectHosted:f=>void xn(f),onPair:()=>h("choose"),busy:ue,...y?.app.name?{appName:y.app.name}:{}}),B&&d("p",{className:"sc-error",children:B})]}),g==="choose"&&P("div",{className:"sc-card",children:[d(Pa,{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&&Qe.length>0&&P(Ln,{children:[d("div",{className:"sc-opts",children:Qe.map(f=>{let x=Ze[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}):en===f.id?d("span",{className:"sc-opt-last",children:"last used"}):d(Nr,{className:"sc-opt-go"})})()]},f.id)})}),P("p",{className:"sc-opt-note",children:["Your accounts stay there. ",Is(y)," never sees them."]})]}),(!F||Qe.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(Bt,{mark:de?.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."}),de&&P("p",{className:"sc-prereq",children:[de.Mark&&d(de.Mark,{className:"sc-rt-mark"}),"Needs ",de.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:Jt??"#",onClick:Yt,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."}),de&&q==="absent"&&d("p",{className:"sc-note",children:d(Ea,{text:de.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(Nr,{})]})]})]})]}),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(ar,{className:"sc-opt-mark"})}),d("span",{className:"sc-opt-text",children:d("span",{className:"sc-opt-label",children:f.label})}),d(Nr,{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=>J(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:ue||T.length<8,children:ue?"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(Tt,{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."}),ln==="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."}),ln==="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:ue||ln!=="live",children:"Approve"}),d("button",{type:"button",className:"sc-btn",onClick:()=>void vt(),disabled:ue||ln==="answered",children:"No, deny it"})]}),ln==="live"&&O.expires_at&&P("p",{className:"sc-note",style:{marginTop:10},children:["This code expires in ",Ma(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:de?.choice.short??"Soba App"})]}),d(Bt,{mark:de?.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>Na&&P("ol",{className:"sc-stall",children:[Pe==="app"?P(Ln,{children:[d(Gt,{done:!0,title:"Soba Connect opened",line:"On this machine"}),d(Gt,{done:!0,title:"You approved it",line:"In Soba Connect"})]}):d(Gt,{done:!0,title:"You approved the code",line:"On this page"}),d(Gt,{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(xr,{tone:"ok"}),d("h2",{className:"sc-h",id:Ce,children:an?.label?`${an.label} is connected`:"Connected"}),P("p",{className:"sc-p",children:[d(Tt,{context:y})," will use ",an?.label?"it":"this machine"," from now on, while it is awake."]}),s&&P(Ln,{children:[an&&d(Ra,{machine:an}),d("button",{type:"button",className:"sc-btn sc-btn-primary sc-btn-wide",style:{marginTop:14},onClick:kt,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(Bt,{mark:bn,still:!0}):d(Bt,{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>xa&&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(xr,{tone:"ok"}),d("h2",{className:"sc-h",id:Ce,children:"ChatGPT is connected"}),P("p",{className:"sc-p",children:[d(Tt,{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:kt,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(xr,{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 Is(e){return e?.app.name??"this app"}function Sa(e){let n=e?.app.icon_urls;if(n?.length)return n;let t=e?.app.icon_url;return t?[t]:[]}function Os(e){let n=Sa(e),[t,r]=Y([]),s=ae(l=>{l&&r(i=>i.includes(l)?i:[...i,l])},[]),o=ae(l=>s(l.currentTarget.getAttribute("src")),[s]),a=ae(l=>{l?.complete&&l.naturalWidth===0&&s(l.getAttribute("src"))},[s]);return{icon:n.find(l=>!t.includes(l)),onError:o,ref:a}}function Pa({context:e}){let{icon:n,onError:t,ref:r}=Os(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 Tt({context:e}){let{icon:n,onError:t,ref:r}=Os(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}),Is(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 Nr({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 Bt({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 xr({tone:e}){return d("span",{className:`sc-result sc-result-${e}`,"aria-hidden":"true",children:d(je,{kind:e==="ok"?"snap":"gone",size:84})})}function Ra({machine:e}){let{runtime:n}=he(e);if(!n)return null;let t=We(n);return P("div",{className:"sc-arrived",children:[d(dr,{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 Gt({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 Ea({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 Ia}from"react";import{jsx as Sr,jsxs as Pr}from"react/jsx-runtime";var Rr=Ia(function({machine:n,className:t,...r},s){if(!n)return null;let{ariaLabel:o,state:a}=Rn(n);return Pr("button",{ref:s,type:"button","aria-label":o,className:["sc-btn","sc-btn-connected",t].filter(Boolean).join(" "),...r,children:[Sr("span",{className:"sc-pill-tile","aria-hidden":"true",children:Sr(je,{kind:a.tone==="busy"?"serving":a.tone==="ok"?"ready":n.pairing_lost?"gone":"paused",size:16,className:"sc-pill-mark"})}),Pr("span",{className:"sc-btn-connected-text",children:[a.word,!n.pairing_lost&&Pr("span",{className:"sc-btn-connected-where",children:[" on ",j(n)]})]}),Sr("i",{className:`sc-dot sc-dot-${a.tone}`,"aria-hidden":"true"})]})});import{useEffect as Oa,useRef as Ir}from"react";var Wt=0,Er=null;function Ls(){if(typeof document>"u")return()=>{};Wt===0&&(Er=document.body.style.overflow,document.body.style.overflow="hidden"),Wt+=1;let e=!1;return()=>{e||(e=!0,Wt-=1,Wt===0&&(document.body.style.overflow=Er??"",Er=null))}}import{jsx as Ts}from"react/jsx-runtime";function ct({open:e,onClose:n,labelledBy:t,theme:r,style:s,children:o}){let a=Ir(null),l=Ir(null),i=Ir(null);return Oa(()=>{let c=a.current;if(c){if(!e){c.open&&c.close();return}return c.open||c.showModal(),document.activeElement===c&&l.current?.focus(),Ls()}},[e]),Ts("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:Ts("div",{className:"sc-modal-sheet",ref:l,tabIndex:-1,children:o})})}import{useEffect as Or,useRef as La}from"react";import{jsx as Ta}from"react/jsx-runtime";var wn=8;function Lr({open:e,onClose:n,anchor:t,label:r,theme:s,style:o,children:a}){let l=La(null);return Or(()=>{let i=l.current;if(!(!i||!(typeof i.showPopover=="function")))try{e?i.showPopover():i.hidePopover()}catch{}},[e]),Or(()=>{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,S=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(S)}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]),Or(()=>{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]),Ta("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,Bs=!1;function Ba(){Bs||typeof window>"u"||(Bs=!0,window.addEventListener("storage",e=>{!e.key||!ut.has(e.key)||(Tn.set(e.key,Ot(e.key)),Tr(e.key))}))}function Tr(e){for(let n of ut.get(e)??[])n()}function dt(e){return e??""}function Br(e,n){let t=dt(e);Ba();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 Ht(e){let n=dt(e),t=Tn.get(n);if(t!==void 0)return t;let r=e?Ot(e):null;return Tn.set(n,r),r}function Gr(){return null}function Wr(e,n){Ht(e)===null&&(Tn.set(dt(e),n),Tr(dt(e)))}function Hr(e,n){let t=dt(e);Tn.get(t)!==n&&(Tn.set(t,n),br(e,n),Tr(t))}function Je(e){let n=`${e.unit}s`;return e.reward==="unlimited"?`Unlimited ${n} on your own AI`:e.reward==="included"&&e.includedUnits!==null?`${Wa(e.includedUnits)} ${n} a month once you connect`:e.reward==="credit"&&e.creditMicros>0?`${Ga(e.creditMicros)} back each month you stay connected`:null}function Ye(e){return e==="unlimited"||e==="included"}var Ws=new Set(["user-hardware","user-subscription"]),Gs=new Set(["open-weights","frontier"]);function Ie(e){return e===null||e.length===0?!1:e.every(n=>Ws.has(n))}var Ga=e=>(e/1e6).toLocaleString("en-US",{style:"currency",currency:"USD",minimumFractionDigits:2,maximumFractionDigits:2}),Wa=e=>e.toLocaleString("en-US");function Dr(e,n){if(!(n===null||n.some(o=>Gs.has(o))))return!1;let r=e.findIndex(o=>Ws.has(o));if(r===-1)return!1;let s=e.findIndex(o=>Gs.has(o));return s===-1||r<s}import{createContext as Hs,useContext as Ds}from"react";var Ur=Hs(null);function Bn(){return Ds(Ur)}var Fr=Hs({context:null,machines:void 0,theme:"light"});function G(){return Ds(Fr)}import{useMemo as Ua}from"react";import{createContext as Ha,useContext as Da}from"react";var Qr=Ha(null);function D(){let e=Da(Qr);if(!e)throw new Error("useSoba() must be used inside a <SobaProvider>.");return e}function pt(){let{compute:e}=D();return Ua(()=>{let n=e.machines,t=[...n].sort((o,a)=>He([o,a])===o?-1:1).map(Fa),r=He([...n]),s=mn(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 Fa(e){let n=he(e);return{machine:e,name:j(e),state:hn(e),status:Kt(e),hardware:Xn(e),lastSeen:e.state==="offline"?Kn(e.last_seen_at):null,runtimes:Ne(e).map(t=>({runtime:t,name:t.display_name,auth:We(t),quarantined:!!t.quarantined})),runsOn:{by:n.by,name:n.runtime?.display_name??null}}}import{useCallback as Vr,useEffect as Qa,useMemo as Jr,useSyncExternalStore as Va}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?Ar(t.publishableKey,l):null,u=Vr(E=>Br(c,E),[c]),m=Va(u,Vr(()=>Ht(c),[c]),Gr),A=Jr(()=>tt(n.machines),[n.machines]),g=Jr(()=>rt(A),[A]);Qa(()=>{i||!o||Wr(c,o)},[i,o,c]);let h=i?r:m??o??null,{selected:y,unavailable:S}=Jr(()=>sr(A,h??null),[A,h]),I=Vr(E=>{i||Hr(c,E),s?.(E)},[i,c,s]);return{options:A,groups:g,selected:y,select:I,run:or(y),unavailable:S,pickable:An(A),loading:n.loading&&!n.machines.length}}import{jsx as mt}from"react/jsx-runtime";function Ja({className:e}){let{theme:n}=G(),t=e?`soba-connect ${e}`:"soba-connect";return mt("div",{className:t,"data-theme":n,children:mt(Yr,{})})}function Yr(){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(pr,{machines:e.machines.map(t=>t.machine),model:n.selected,onPickModel:n.select})}import{useCallback as gt,useEffect as Zr,useMemo as _a,useRef as Xr,useState as Wn}from"react";import{useId as Ya}from"react";import{jsx as Gn,jsxs as Dt}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=Ya(),m=i.context?.background?.trim(),A=m?pn(m,i.context?.accent):void 0;return Dt(ct,{open:e,onClose:c,labelledBy:u,theme:i.theme,style:A,children:[a?Dt("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?Dt("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(Mr,{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}:{}}),Dt("p",{className:"sc-modal-foot",children:[Gn(oe,{className:"sc-foot-mark"}),"Secured by Soba"]})]})}import{forwardRef as za}from"react";import{jsx as ja}from"react/jsx-runtime";var zr=za(function(n,t){let{theme:r}=G();return ja(Rr,{ref:t,"data-theme":r,...n})});import{useCallback as qa}from"react";function Za(){let{connect:e}=D(),n=pt(),t=qa(()=>e.open("manual"),[e]);return{...Rn(n.primary?.machine??null),machine:n.primary,open:t,canOpen:e.hasModal,loading:n.view==="loading"}}function jr(e){return Rn(e)}import{useCallback as Us,useEffect as Xa,useState as Ka}from"react";function qr({enabled:e=!0,intervalMs:n=3e3}={}){let t=Bn(),[r,s]=Ka(null),o=Us(async()=>{t&&s(await t.runs())},[t]);Xa(()=>{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=Us(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 Fs,jsx as Hn,jsxs as Qs}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),S=Xr(null),I=a!==void 0,E=!I&&!o&&!r&&u.hasModal,T=I?a:E?u.isOpen:h,J=w=>{E?w?u.open("manual"):u.close():I||y(w),l?.(w)},O=Xr(T);Zr(()=>{O.current&&!T&&S.current?.focus(),O.current=T},[T]);let[M,B]=Wn(!1),{runs:C,stop:ue}=qr({enabled:M}),_=Cn(),Ae=_a(()=>M&&C?$a(c.machines,C):c.machines,[c.machines,M,C]),$=He(Ae),Pe=i&&jr($).connected,Le=gt(()=>B(!1),[]),[ee,Te]=Wn(!1),q=gt(async()=>{Te(!0);try{await c.refresh()}finally{Te(!1)}},[c]),ne=Xr(q);ne.current=q,Zr(()=>{M&&ne.current()},[M]);let[Nn,Z]=Wn(!1),[X,be]=Wn([]),ye=!!m.context?.hosted_available;Zr(()=>{if(!M||!g||!ye)return;let w=!0;return g.hosted().then(v=>{w&&be(v.credentials)}).catch(()=>{}),()=>{w=!1}},[M,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(Fe){z(Fe.message)}}},[g,c]),re=gt(async(w,v)=>{if(g){z(null);try{await g.preferRuntime(w,v),await c.refresh()}catch(Fe){z(Fe.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?pn(Q,m.context?.accent):void 0,K=Pe&&!e,U=()=>{if(K&&!I&&!o&&!r){B(w=>!w);return}J(!0)};return Qs(Fs,{children:[K?Hn(zr,{ref:S,machine:$,"aria-haspopup":"dialog","aria-expanded":M,onClick:U,...t?{className:t}:{}}):Hn("button",{ref:S,type:"button","data-theme":A,className:["sc-btn","sc-btn-icon",n==="primary"?"sc-btn-primary":"",t].filter(Boolean).join(" "),onClick:U,children:e??Qs(Fs,{children:[Hn(oe,{className:"sc-btn-mark"}),"Connect compute"]})}),Hn(Lr,{open:M,onClose:Le,anchor:S,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 ue(w)}catch(v){throw z(v.message),v}},onPair:()=>{B(!1),E?u.open("pair"):(Z(!0),J(!0))},...m.context?.app.name?{appName:m.context.app.name}:{}})}),!E&&Hn(ht,{open:T,onOpenChange:w=>{w||Z(!1),J(w)},...Nn?{showStatus:!1}:{},...r?{initialCode:r}:{},...s?{onConnected:s}:{}})]})}function $a(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 Kr,jsxs as ni}from"react/jsx-runtime";function ei({initialCode:e,onConnected:n,className:t,showStatus:r=!0}){let{theme:s}=G();return ni("div",{className:t?`soba-connect ${t}`:"soba-connect","data-theme":s,children:[r&&Kr(Yr,{}),Kr("div",{className:"sc-compute-act",children:Kr(vn,{...e?{initialCode:e}:{},...n?{onConnected:n}:{}})})]})}import{useId as mi,useState as hi}from"react";import{useCallback as $r,useEffect as js,useState as qs}from"react";import{useCallback as ti,useState as ri}from"react";function ft(){let[e,n]=ri(null);return{open:ti(()=>{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 Vs,useMemo as Js}from"react";function kn(e){if(!e)return null;if(typeof e=="string")return e;if(typeof Response<"u"&&e instanceof Response)return Ys(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"?Ys(n.status):n.cause&&n.cause!==e?kn(n.cause):null}function Ys(e){return e===402?"payment_required":e===409?"no_compute":null}function _r(...e){let[n,t]=e,{plan:r,compute:s,connect:o}=D(),a=t?.predict??e.length===0,l=oi(si(n),s)??(a?ai(r,s):null),i=r.plan,c=r.plans,u=Js(()=>{if(l!=="payment_required")return null;let h=i?.price??0,y=i?.included_units??0;return c.find(S=>S.id!==i?.id&&S.price>h&&(S.included_units===null||S.included_units>y))??null},[l,c,i]),m=Vs(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=Vs(()=>{l&&A(l)},[A,l]);return Js(()=>{if(!l)return null;let h=i?Je({unit:i.unit,reward:i.connected_reward,includedUnits:i.connected_included_units,creditMicros:i.connected_credit*1e6}):null,y=i&&Ye(i.connected_reward)?h:null;return{reason:l,...ii(l,{connectOffer:y,connected:s.connected,online:s.online,machine:mn(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 si(e){let n=kn(e);return n==="payment_required"||n==="no_compute"?n:null}function oi(e,n){return e==="no_compute"&&n.connected&&n.online?null:e}function ai(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 ii(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 ${zs(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 ${zs(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 zs(e){let n=new Date(e);return Number.isNaN(n.getTime())?e:n.toLocaleDateString(void 0,{day:"numeric",month:"long"})}function li(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&&Dr(n.route_prefer,u);if(!l&&!A&&!g)return null;let h=Ie(u)?ci(n.unit,Ie(n.route_allow)):Ye(n.connected_reward)?di(t,n,i):g?ui(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 es(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=yr(l.publishableKey),[c,u]=qs(!1);js(()=>{u(wr(i))},[i]);let m=$r(()=>{u(!0),Cr(i)},[i]),A=$r(()=>l.open("manual"),[l]),g=$r(()=>l.open("no_compute"),[l]),h=ft(),[y,S]=qs(!1),{refresh:I}=a,{launch:E}=h;js(()=>{if(E===null||E==="absent")return;S(!1);let B=setInterval(()=>void I(),3e3),C=setTimeout(()=>{clearInterval(B),S(!0)},2e4);return()=>{clearInterval(B),clearTimeout(C)}},[E,I]);let T=pi(l.app?.name,it(l.connectUrl)),J=o.loading||a.loading,O=mn(a.machines),M=J?null:li({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:M?.reason??null,visible:M!==null,title:M?.title??null,detail:M?.detail??null,meter:M?.meter??null,dismissible:M?.dismissible??!1,dismissed:c,dismiss:m,open:A,atTheWall:M?.atTheWall??!1,steps:T,stalled:M?.reason==="stalled"?{machine:O?j(O):null,ownCompute:M.ownCompute,wake:h.open,launch:h.launch,note:h.note,stuck:y,connectAnother:g}:null,loading:J}}function ci(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 ui(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 di(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=Je({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 pi(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 Xs,jsx as L,jsxs as Ke}from"react/jsx-runtime";function gi(e){let{className:n,fallback:t=null}=e,r=es({...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]=hi(null),i=mi(),c=L(Xs,{children:t});if(!r.visible)return c;if(r.stalled)return L(Zs,{className:n,theme:o,stalled:!0,children:L(fi,{title:r.title??"",detail:r.detail??"",stalled:r.stalled})});let u=a??r.atTheWall;return Ke(Zs,{className:n,theme:o,children:[Ke("div",{className:"sc-nudge-top",children:[Ke("div",{className:"sc-nudge-say",children:[L("p",{className:"sc-nudge-title",children:r.title}),L("p",{className:"sc-nudge-detail",children:r.detail}),Ke("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(bi,{})]})]}),r.dismissible?L("button",{type:"button",className:"sc-nudge-dismiss","aria-label":"Dismiss",title:"Dismiss",onClick:r.dismiss,children:L(Ai,{})}):null]}),u?L("ol",{className:"sc-nudge-steps",id:i,children:r.steps.map(m=>Ke("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?Ke("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 fi({title:e,detail:n,stalled:t}){return Ke(Xs,{children:[L("div",{className:"sc-nudge-top",children:Ke("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 Ai(){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 bi(){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 yi=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"||!yi.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*ns(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(c===-1)break;let u=_s(o.slice(0,c));if(o=o.slice(c+1),t){let m=u.trim()?Dn(u):null;m&&(yield m);continue}if(u===""){let m=a.join(`
|
|
4
|
+
`);if(a=[],m==="[DONE]")return;let A=m?Dn(m):null;A&&(yield A);continue}Ks(u,a)}}!t&&o&&Ks(_s(o),a);let l=t?o.trim():a.join(`
|
|
5
|
+
`);if(l&&l!=="[DONE]"){let i=Dn(l);i&&(yield i)}}finally{r.cancel().catch(()=>{})}}function Ks(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 _s(e){return e.endsWith("\r")?e.slice(0,-1):e}async function wi(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 $s}from"react/jsx-runtime";function Ci({caption:e,disabled:n,className:t,...r}){let{theme:s}=G(),{options:o,selected:a,select:l,pickable:i}=Cn(r);return i?$s("span",{className:"soba-connect sc-inline","data-theme":s,children:$s(st,{options:o,selected:a,onPick:l,...e?{caption:e}:{},...n?{disabled:n}:{},...t?{className:t}:{}})}):null}import{useEffect as vi}from"react";var eo="data-soba-react",no=!1;function At(){if(no||typeof document>"u"||(no=!0,document.querySelector(`style[${eo}]`)))return;let e=document.createElement("style");e.setAttribute(eo,""),e.textContent=`.soba-connect {
|
|
6
6
|
--sc-ground: #ffffff;
|
|
7
7
|
--sc-sheet: #ffffff;
|
|
8
8
|
--sc-raised: #f6f6f7;
|
|
@@ -1429,8 +1429,10 @@ a.sc-btn {
|
|
|
1429
1429
|
bottom: auto;
|
|
1430
1430
|
z-index: 2147483000;
|
|
1431
1431
|
|
|
1432
|
-
width: min(92vw,
|
|
1433
|
-
max-width: min(92vw,
|
|
1432
|
+
width: min(92vw, 320px);
|
|
1433
|
+
max-width: min(92vw, 320px);
|
|
1434
|
+
--sc-font-size: 12.5px;
|
|
1435
|
+
--sc-scale: 0.8;
|
|
1434
1436
|
|
|
1435
1437
|
max-height: calc(100vh - 24px);
|
|
1436
1438
|
overflow-y: auto;
|
|
@@ -1438,7 +1440,7 @@ a.sc-btn {
|
|
|
1438
1440
|
margin: 0;
|
|
1439
1441
|
padding: 0;
|
|
1440
1442
|
border: 0;
|
|
1441
|
-
border-radius:
|
|
1443
|
+
border-radius: 16px;
|
|
1442
1444
|
background: var(--sc-tray, #f6f6f7);
|
|
1443
1445
|
|
|
1444
1446
|
box-shadow:
|
|
@@ -2270,7 +2272,100 @@ a.sc-btn {
|
|
|
2270
2272
|
}
|
|
2271
2273
|
|
|
2272
2274
|
.sc-result-ok {
|
|
2273
|
-
color: var(--sc-
|
|
2275
|
+
color: var(--sc-text, #1a1a1c);
|
|
2276
|
+
}
|
|
2277
|
+
|
|
2278
|
+
.sc-arrived {
|
|
2279
|
+
display: flex;
|
|
2280
|
+
align-items: center;
|
|
2281
|
+
gap: 10px;
|
|
2282
|
+
margin-top: 18px;
|
|
2283
|
+
padding: 10px 12px;
|
|
2284
|
+
border: 1px solid var(--sc-line, #e9e9eb);
|
|
2285
|
+
border-radius: 12px;
|
|
2286
|
+
background: var(--sc-raised, #f6f6f7);
|
|
2287
|
+
text-align: left;
|
|
2288
|
+
}
|
|
2289
|
+
.sc-arrived .sc-runtime-tile {
|
|
2290
|
+
border-radius: 50%;
|
|
2291
|
+
background: var(--sc-sheet, #ffffff);
|
|
2292
|
+
}
|
|
2293
|
+
.sc-arrived-name {
|
|
2294
|
+
flex: 1;
|
|
2295
|
+
min-width: 0;
|
|
2296
|
+
font-size: 14px;
|
|
2297
|
+
font-weight: 500;
|
|
2298
|
+
}
|
|
2299
|
+
.sc-arrived-auth {
|
|
2300
|
+
display: inline-flex;
|
|
2301
|
+
align-items: center;
|
|
2302
|
+
gap: 6px;
|
|
2303
|
+
font-size: 12.5px;
|
|
2304
|
+
color: var(--sc-muted, #6b6b73);
|
|
2305
|
+
}
|
|
2306
|
+
.sc-arrived-dot {
|
|
2307
|
+
width: 6px;
|
|
2308
|
+
height: 6px;
|
|
2309
|
+
flex: none;
|
|
2310
|
+
border-radius: 50%;
|
|
2311
|
+
background: var(--sc-ok, #22a06b);
|
|
2312
|
+
}
|
|
2313
|
+
|
|
2314
|
+
.sc-stall {
|
|
2315
|
+
display: flex;
|
|
2316
|
+
flex-direction: column;
|
|
2317
|
+
gap: 14px;
|
|
2318
|
+
margin: 16px 0 0;
|
|
2319
|
+
padding: 14px;
|
|
2320
|
+
list-style: none;
|
|
2321
|
+
border: 1px solid var(--sc-line, #e9e9eb);
|
|
2322
|
+
border-radius: 12px;
|
|
2323
|
+
text-align: left;
|
|
2324
|
+
}
|
|
2325
|
+
.sc-stall-step {
|
|
2326
|
+
display: grid;
|
|
2327
|
+
grid-template-columns: 20px 1fr;
|
|
2328
|
+
column-gap: 12px;
|
|
2329
|
+
row-gap: 2px;
|
|
2330
|
+
align-items: start;
|
|
2331
|
+
}
|
|
2332
|
+
.sc-stall-step > svg {
|
|
2333
|
+
grid-row: span 3;
|
|
2334
|
+
width: 20px;
|
|
2335
|
+
height: 20px;
|
|
2336
|
+
}
|
|
2337
|
+
.sc-stall-ok > circle:first-child {
|
|
2338
|
+
fill: var(--sc-ok, #22a06b);
|
|
2339
|
+
}
|
|
2340
|
+
.sc-stall-open > circle:first-child {
|
|
2341
|
+
fill: var(--sc-text, #1a1a1c);
|
|
2342
|
+
}
|
|
2343
|
+
.sc-stall-step path {
|
|
2344
|
+
fill: none;
|
|
2345
|
+
stroke: var(--sc-sheet, #ffffff);
|
|
2346
|
+
stroke-width: 2;
|
|
2347
|
+
stroke-linecap: round;
|
|
2348
|
+
stroke-linejoin: round;
|
|
2349
|
+
}
|
|
2350
|
+
.sc-stall-pt {
|
|
2351
|
+
fill: var(--sc-sheet, #ffffff);
|
|
2352
|
+
}
|
|
2353
|
+
.sc-stall-title {
|
|
2354
|
+
font-size: 14.5px;
|
|
2355
|
+
font-weight: 500;
|
|
2356
|
+
line-height: 20px;
|
|
2357
|
+
}
|
|
2358
|
+
.sc-stall-line {
|
|
2359
|
+
font-size: 13px;
|
|
2360
|
+
line-height: 1.45;
|
|
2361
|
+
color: var(--sc-muted, #6b6b73);
|
|
2362
|
+
}
|
|
2363
|
+
.sc-stall-more {
|
|
2364
|
+
margin-top: 8px;
|
|
2365
|
+
}
|
|
2366
|
+
.sc-stall-act {
|
|
2367
|
+
height: 36px;
|
|
2368
|
+
padding: 0 16px;
|
|
2274
2369
|
}
|
|
2275
2370
|
|
|
2276
2371
|
.sc-result-off {
|
|
@@ -3803,7 +3898,7 @@ li.sc-plan-row.sc-plan-current {
|
|
|
3803
3898
|
transform: none;
|
|
3804
3899
|
}
|
|
3805
3900
|
}
|
|
3806
|
-
`,document.head.appendChild(e)}import{jsx as Ue,jsxs as gt}from"react/jsx-runtime";function _o(e){if(!e)return null;let n=vn(e);if(n==="payment_required"||n==="no_compute")return null;if(typeof e=="string")return e||null;let t=e,r=t.error?.message;return typeof r=="string"&&r?r:typeof t.message=="string"&&t.message?t.message:"The run ended with an error."}function fi(){return gt("svg",{viewBox:"0 0 16 16",fill:"none","aria-hidden":"true",children:[Ue("path",{d:"M8 5v4",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round"}),Ue("circle",{cx:"8",cy:"11.6",r:"0.9",fill:"currentColor"}),Ue("circle",{cx:"8",cy:"8",r:"6.4",stroke:"currentColor",strokeWidth:"1.3"})]})}function Ai({error:e,onRetry:n,onDismiss:t,title:r,className:o}){let s=_o(e),a=H();return gi(()=>ht(),[]),s?Ue("div",{className:o?`soba-connect ${o}`:"soba-connect","data-theme":a.theme,role:"alert",children:gt("div",{className:"sc-card sc-limit sc-run-error",children:[gt("div",{className:"sc-limit-head",children:[Ue("span",{className:"sc-limit-mark sc-run-error-mark","aria-hidden":"true",children:Ue(fi,{})}),gt("div",{children:[Ue("h2",{className:"sc-limit-title",children:r??"That run did not finish"}),Ue("p",{className:"sc-limit-body sc-run-error-message",children:s})]})]}),(t||n)&>("div",{className:"sc-limit-actions",children:[t&&Ue("button",{type:"button",className:"sc-btn sc-btn-quiet",onClick:t,children:"Dismiss"}),n&&Ue("button",{type:"button",className:"sc-btn sc-btn-primary",onClick:n,children:"Try again"})]})]})}):null}import{useId as bi,useState as $o}from"react";import{jsx as re,jsxs as Ht}from"react/jsx-runtime";function yi({reason:e}){return re("span",{className:"sc-limit-mark","aria-hidden":"true",children:e==="no_compute"?re(Mt,{}):re(te,{})})}function wi(e){let{error:n,variant:t="card",onDismiss:r,className:o}=e,s=qr(n,{predict:e.predict??!("error"in e)}),a=bi(),l=H();if(!s)return null;let i=re(Ci,{offer:s,headingId:a,onDismiss:r});return t==="dialog"?re(at,{open:!0,onClose:()=>r?.(),labelledBy:a,theme:l.theme,children:i}):re("div",{className:o?`soba-connect ${o}`:"soba-connect","data-theme":l.theme,children:i})}function Ci({offer:e,headingId:n,onDismiss:t}){let{compute:r}=F(),[o,s]=$o(!1),[a,l]=$o(null),i=e.reason==="no_compute"&&r.connected&&!r.online,c=i||e.connectOffer!==null||!r.connected,u=mt();async function p(){s(!0),l(null);try{await e.upgrade()}catch(A){l(A.message)}finally{s(!1)}}return Ht("div",{className:"sc-card sc-limit",children:[Ht("div",{className:"sc-limit-head",children:[re(yi,{reason:e.reason}),Ht("div",{children:[re("h2",{className:"sc-limit-title",id:n,children:e.title}),re("p",{className:"sc-limit-body",children:e.body})]})]}),a&&re("p",{className:"sc-error",children:a}),i&&u.note&&re("p",{className:"sc-limit-note",children:u.note}),Ht("div",{className:"sc-limit-actions",children:[t&&re("button",{type:"button",className:"sc-btn sc-btn-quiet",onClick:t,disabled:o,children:"Not now"}),e.upgradeTo&&re("button",{type:"button",className:c?"sc-btn":"sc-btn sc-btn-primary",onClick:()=>void p(),disabled:o,children:o?"Opening\u2026":e.upgradeTo.selectable?`Switch to ${e.upgradeTo.name}`:`${e.upgradeTo.name} for $${e.upgradeTo.price.toLocaleString()}/${e.upgradeTo.interval}`}),c&&re("button",{type:"button",className:i?"sc-btn":"sc-btn sc-btn-primary",onClick:e.connect,disabled:o,children:i?"Connect another machine":"Connect compute"}),i&&re("button",{type:"button",className:"sc-btn sc-btn-primary",onClick:u.open,disabled:o,children:"Open Soba App"})]})]})}import{useMemo as vi}from"react";function ft(){let{plan:e,compute:n,connect:t}=F();return vi(()=>{let r=e.plan,o=e.current,s={plan:r,assignment:o,loading:e.loading,error:e.error,periodEnd:o?.period_end?new Date(o.period_end):null};if(!r)return{...s,state:"none",trialDaysLeft:null,ceiling:null,raised:!1,uncounted:!1,used:0,remaining:null,percent:null,unlimited:!1,reward:null,summary:"Nothing is assigned to this account, so runs are bounded by whatever the app allows."};let a=xi(o?.trial_ends_at??null),l=r.connected_reward==="included"&&n.connected&&r.connected_included_units!==null,i=l?r.connected_included_units:r.included_units,c=r.connected_reward==="unlimited"&&n.connected,u=i===null,p=e.used??0,A=i===null?null:Math.max(0,i-p),g=i&&i>0?Math.min(100,Math.round(p/i*100)):null,h=i!==null&&p>=i,y=a!==null?"trial":u?"unlimited":h?r.overage==="meter"?"metered":"spent":"within";return{...s,state:y,trialDaysLeft:a,ceiling:i,raised:l,uncounted:c,used:p,remaining:A,percent:g,unlimited:u,reward:ki(r,l||c,n.connected,()=>t.open("manual")),summary:Ni({plan:r,assignment:o,used:p,ceiling:i,trialDaysLeft:a,raised:l,uncounted:c,state:y})}},[e,n.connected,t])}function ki(e,n,t,r){let o=Ye({unit:e.unit,reward:e.connected_reward,includedUnits:e.connected_included_units,creditMicros:e.connected_credit*1e6});return o?{line:o,inForce:n,required:!1,connected:t,actionable:ze(e.connected_reward)&&!t,open:r}:Le(e.route_allow)&&!t?{line:"Nothing connected yet, so nothing can run.",inForce:!1,required:!0,connected:t,actionable:!0,open:r}:null}function Ni(e){let{plan:n,assignment:t,used:r,ceiling:o,trialDaysLeft:s,raised:a,uncounted:l,state:i}=e,c=`${n.unit}${r===1?"":"s"}`,u=l?" Runs your own AI serves do not count toward it.":"";if(i==="trial"&&s!==null){let g=n.price===0?"it continues free":`it is $${n.price.toLocaleString()} a ${n.interval}`;return`${s} ${s===1?"day":"days"} left of your trial, then ${g}.`}if(i==="unlimited")return`${r.toLocaleString()} ${c} this period. No ceiling on this plan.`;if(i==="metered"){let g=r-(o??0);return n.overage_per_unit>0?`${g.toLocaleString()} past the allowance, billed at $${n.overage_per_unit} a ${n.unit}.${u}`:`${g.toLocaleString()} past the allowance.${u}`}if(i==="spent")return t?.period_end?`Allowance spent. It comes back on ${es(t.period_end)}.${u}`:`Allowance spent. It comes back at the start of the next period.${u}`;let p=Math.max(0,(o??0)-r),A=a?` Raised from ${(n.included_units??0).toLocaleString()} while your own AI is connected.`:t?.period_end?` Resets ${es(t.period_end)}.`:"";return`${p.toLocaleString()} of ${(o??0).toLocaleString()} ${n.unit}s left.${A}${u}`}function xi(e){if(!e)return null;let n=new Date(e).getTime()-Date.now();return Number.isNaN(n)||n<=0?null:Math.max(1,Math.ceil(n/864e5))}function es(e){let n=new Date(e);return Number.isNaN(n.getTime())?e:n.toLocaleDateString(void 0,{day:"numeric",month:"long"})}import{Fragment as Si,jsx as oe,jsxs as Te}from"react/jsx-runtime";function _r({heading:e="Current plan",showUsage:n=!0,showName:t=!0,className:r}){let o=ft(),{theme:s}=H(),a=A=>oe("section",{className:r?`soba-connect sc-fill ${r}`:"soba-connect sc-fill","data-theme":s,children:Te("div",{className:"sc-card sc-current",children:[e&&oe("h2",{className:"sc-section-title",children:e}),A]})});if(o.error)return a(oe("p",{className:"sc-error",children:o.error.message}));if(o.loading)return a(oe("p",{className:"sc-note",children:"Loading\u2026"}));if(!o.plan)return a(Te("div",{className:"sc-current-main",children:[oe("p",{className:"sc-current-name",children:"No plan"}),oe("p",{className:"sc-sub",children:o.summary})]}));let{plan:l,trialDaysLeft:i,percent:c,unlimited:u,reward:p}=o;return a(Te(Si,{children:[Te("div",{className:"sc-current-grid",children:[(t||i!==null)&&Te("div",{className:"sc-current-main",children:[t?Te("p",{className:"sc-current-name",children:[l.name,i!==null&&Te("span",{className:"sc-trial-badge",children:[i," ",i===1?"day":"days"," left"]})]}):i!==null&&oe("p",{className:"sc-current-trial",children:Te("span",{className:"sc-trial-badge",children:[i," ",i===1?"day":"days"," left"]})}),t&&l.description&&oe("p",{className:"sc-sub",children:l.description})]}),n&&Te("div",{className:"sc-usage",children:[Te("div",{className:"sc-row-between",children:[oe("span",{className:"sc-fact-key",children:"Usage"}),oe("span",{className:c!==null&&c>=100?"sc-usage-figure sc-usage-over":"sc-usage-figure",children:u?"Unlimited":c===null?"Metered":`${c}% used`})]}),c!==null&&oe("div",{className:"sc-meter",role:"presentation",children:c>0&&oe("span",{className:c>=100?"sc-meter-fill sc-meter-full":"sc-meter-fill",style:{width:`${c}%`}})}),oe("p",{className:"sc-usage-line",children:o.summary})]})]}),p&&Te("div",{className:"sc-current-foot",children:[oe("p",{className:p.required?"sc-plan-reward-line sc-plan-reward-need":p.inForce?"sc-plan-reward-line":"sc-plan-reward-line sc-plan-reward-open",children:p.required?p.line:p.inForce?`In force: ${Mi(p.line)}.`:p.line}),(p.actionable||p.connected)&&oe(Cn,{})]})]}))}var Mi=e=>e.charAt(0).toLowerCase()+e.slice(1);import{useCallback as Pi,useMemo as Ri,useState as ns}from"react";var Ei={"user-hardware":"your own machine","user-subscription":"your own AI subscription","open-weights":"open models we host",frontier:"frontier models"},Ii=new Set(["user-hardware","user-subscription"]);function $r(e={}){let{plan:n,compute:t,connect:r}=F(),[o,s]=ns(null),[a,l]=ns(null),{featured:i,onSelect:c,successUrl:u,cancelUrl:p}=e,A=Pi(async h=>{s(h.id),l(null);try{if(h.selectable)await n.select(h.id);else if(c)c(h);else{let y=await n.checkout(h.id,{...u?{successUrl:u}:{},...p?{cancelUrl:p}:{}});window.location.assign(y);return}}catch(y){throw l(y.message),y}finally{(h.selectable||c)&&s(null)}},[n,c,u,p]),g=Ri(()=>n.plans.map(h=>{let y=n.current?.plan_id===h.id;return{plan:h,current:y,featured:i===h.id&&!y,price:Oi(h),allowance:h.included_units===null?`Unlimited ${h.unit}s`:`${h.included_units.toLocaleString()} ${h.unit}${h.included_units===1?"":"s"}`,allowanceNote:Li(h),computeLabel:h.route_allow===null?"any compute":h.route_allow.length===0?"no compute":null,compute:(h.route_allow??[]).map(M=>({costClass:M,label:Ei[M]??M,owned:Ii.has(M),runtimes:ar(M).map(E=>E.id)})),connect:Ti(h,y,t.connected,()=>r.open("manual")),cta:{label:Bi(h,y,o===h.id),disabled:y||o!==null,busy:o===h.id,take:()=>A(h)}}}),[n.plans,n.current,i,t.connected,r,o,A]);return{offers:g,current:g.find(h=>h.current)??null,loading:n.loading,error:n.error,failed:a}}function Oi(e){return e.price===0?{amount:"Free",interval:null,free:!0}:{amount:`$${e.price.toLocaleString()}`,interval:e.interval,free:!1}}function Li(e){let n=[];return e.included_units===null?n.push("No ceiling on this plan"):(n.push(`Included each ${e.interval}`),e.overage==="meter"&&e.overage_per_unit>0?n.push(`then $${e.overage_per_unit} a ${e.unit}`):e.included_units>0&&n.push(`then ${e.unit}s stop`)),e.trial_days>0&&n.push(`${e.trial_days}-day trial`),n.join(" \xB7 ")}function Ti(e,n,t,r){let o=Ye({unit:e.unit,reward:e.connected_reward,includedUnits:e.connected_included_units,creditMicros:e.connected_credit*1e6}),s=Le(e.route_allow)&&!t;if(!o&&!s)return null;let a=ze(e.connected_reward);return{key:o?"Connect your own":"To use this",line:o??(n?"Nothing connected yet, so nothing can run.":"Runs only on compute you connect."),reward:o!==null,actionable:n&&(a||s)&&!t,open:r}}function Bi(e,n,t){return n?"Your plan":t?e.selectable?"Switching\u2026":"Opening\u2026":e.selectable?"Choose":`Subscribe for $${e.price.toLocaleString()}/${e.interval}`}import{jsx as b,jsxs as D}from"react/jsx-runtime";function Dt(e){return e?`soba-connect sc-fill ${e}`:"soba-connect sc-fill"}function eo({onSelect:e,successUrl:n,cancelUrl:t,showCompute:r=!0,showConnect:o=!1,variant:s="cards",featured:a,className:l}){let{offers:i,loading:c,error:u,failed:p}=$r({...a?{featured:a}:{},...e?{onSelect:e}:{},...n?{successUrl:n}:{},...t?{cancelUrl:t}:{}}),{theme:A}=H();if(u)return b("div",{className:Dt(l),"data-theme":A,children:b("div",{className:"sc-card",children:b("p",{className:"sc-error",children:u.message})})});if(c)return b("div",{className:Dt(l),"data-theme":A,children:b("div",{className:"sc-card",children:b("p",{className:"sc-note",children:"Loading plans\u2026"})})});if(i.length===0)return b("div",{className:Dt(l),"data-theme":A,children:b("div",{className:"sc-card",children:b("p",{className:"sc-note",children:"This app has no plans yet."})})});let g={showCompute:r,showConnect:o};return D("div",{className:Dt(l),"data-theme":A,"data-variant":s,children:[s==="rows"?b(Wi,{offers:i,shelf:g}):s==="table"?b(Hi,{offers:i,shelf:g}):b(Gi,{offers:i,shelf:g}),p&&b("p",{className:"sc-error",children:p})]})}function Gi({offers:e,shelf:n}){return b("div",{className:"sc-plans",children:e.map(t=>D("div",{className:ts("sc-plan",t),children:[D("div",{className:"sc-row-between",children:[b("span",{className:"sc-title",children:t.plan.name}),b(no,{offer:t})]}),b("p",{className:"sc-sub",children:t.plan.description}),b(to,{price:t.price,free:"forever"}),b(so,{offer:t,shelf:n}),b(rs,{offer:t}),b("div",{className:"sc-plan-band",children:n.showCompute&&b(oo,{offer:t})}),b("div",{className:"sc-plan-band",children:b(ro,{offer:t})})]},t.plan.id))})}function Wi({offers:e,shelf:n}){return b("ul",{className:"sc-plan-rows",children:e.map(t=>D("li",{className:ts("sc-plan-row",t),children:[D("div",{className:"sc-row-main",children:[D("span",{className:"sc-row-name",children:[b("span",{className:"sc-title",children:t.plan.name}),b(no,{offer:t})]}),t.plan.description&&b("p",{className:"sc-sub",children:t.plan.description}),b(rs,{offer:t}),n.showCompute&&b(oo,{offer:t,inline:!0}),b(ro,{offer:t,inline:!0})]}),D("div",{className:"sc-row-side",children:[b(to,{price:t.price,free:"forever",small:!0}),b(so,{offer:t,shelf:n})]})]},t.plan.id))})}function Hi({offers:e,shelf:n}){let t=e.some(a=>a.plan.overage_per_unit>0),r=e.some(a=>a.plan.trial_days>0),o=e.some(a=>a.connect!==null),s=a=>[a.current?"sc-col-current":"",a.featured?"sc-col-featured":""].filter(Boolean).join(" ")||void 0;return b("div",{className:"sc-table-scroll",children:D("table",{className:"sc-plan-table",children:[b("thead",{children:D("tr",{children:[b("td",{}),e.map(a=>D("th",{scope:"col",className:s(a),children:[D("span",{className:"sc-row-name",children:[b("span",{className:"sc-title",children:a.plan.name}),b(no,{offer:a})]}),b(to,{price:a.price,small:!0})]},a.plan.id))]})}),D("tbody",{children:[D("tr",{children:[b("th",{scope:"row",children:"Included"}),e.map(a=>b("td",{className:s(a),children:a.allowance},a.plan.id))]}),t&&D("tr",{children:[b("th",{scope:"row",children:"Then"}),e.map(a=>b("td",{className:s(a),children:a.plan.overage_per_unit>0?`$${a.plan.overage_per_unit} / ${a.plan.unit}`:b("span",{className:"sc-muted-cell",children:"Stops"})},a.plan.id))]}),r&&D("tr",{children:[b("th",{scope:"row",children:"Trial"}),e.map(a=>b("td",{className:s(a),children:a.plan.trial_days>0?`${a.plan.trial_days} days`:b("span",{className:"sc-muted-cell",children:"None"})},a.plan.id))]}),n.showCompute&&D("tr",{children:[b("th",{scope:"row",children:"Runs on"}),e.map(a=>b("td",{className:s(a),children:b(oo,{offer:a,bare:!0})},a.plan.id))]}),o&&D("tr",{children:[b("th",{scope:"row",children:"Connect your own"}),e.map(a=>b("td",{className:s(a),children:b(ro,{offer:a,bare:!0})},a.plan.id))]}),D("tr",{className:"sc-table-buy",children:[b("td",{}),e.map(a=>b("td",{className:s(a),children:b(so,{offer:a,shelf:n})},a.plan.id))]})]})]})})}function ts(e,n){return[e,n.current?"sc-plan-current":"",n.featured?"sc-plan-featured":""].filter(Boolean).join(" ")}function no({offer:e}){return e.current?b("span",{className:"sc-plan-badge",children:"Current"}):e.featured?b("span",{className:"sc-plan-badge-soft",children:"Recommended"}):null}function to({price:e,small:n,free:t}){return D("p",{className:n?"sc-plan-price sc-plan-price-sm":"sc-plan-price",children:[b("span",{className:"sc-plan-amount",children:e.amount}),e.interval?D("span",{className:"sc-plan-interval",children:["/",e.interval]}):t&&b("span",{className:"sc-plan-interval sc-plan-after",children:t})]})}function rs({offer:e}){return D("p",{className:"sc-plan-allowance",children:[b("span",{className:"sc-plan-figure",children:e.allowance}),b("span",{className:"sc-plan-qualifier",children:e.allowanceNote})]})}function ro({offer:e,inline:n,bare:t}){let r=e.connect;if(!r)return t?b("span",{className:"sc-muted-cell",children:"None"}):null;let o=r.reward?"sc-plan-reward-line":"sc-plan-reward-line sc-plan-reward-need",s=r.actionable?D("button",{type:"button",className:`${o} sc-plan-reward-act`,"aria-label":"Connect compute",onClick:r.open,children:[b("span",{className:"sc-reward-said",children:r.line}),D("span",{className:"sc-reward-do","aria-hidden":!0,children:[b(te,{className:"sc-reward-mark"}),"Connect compute"]})]}):b("p",{className:o,children:r.line});return t?s:b("div",{className:n?"sc-plan-reward sc-plan-reward-inline":"sc-plan-reward",children:s})}function oo({offer:e,inline:n,bare:t}){let r=e.computeLabel?b("ul",{className:n?"sc-compute sc-compute-inline":"sc-compute",children:b("li",{children:e.computeLabel})}):b("ul",{className:n?"sc-compute sc-compute-inline":"sc-compute",children:e.compute.map(o=>D("li",{className:o.owned?"sc-compute-own":void 0,children:[o.label,b(Di,{runtimes:o.runtimes})]},o.costClass))});return t?r:D("div",{className:n?"sc-plan-compute sc-plan-compute-inline":"sc-plan-compute",children:[b("span",{className:"sc-fact-key",children:"Runs on"}),r]})}function so({offer:e,shelf:n}){let t=e.connect;return n.showConnect&&t?.actionable?D("button",{type:"button",className:"sc-btn sc-btn-primary sc-btn-icon",onClick:t.open,children:[b(te,{className:"sc-btn-mark"}),"Connect compute"]}):b("button",{type:"button",className:e.current?"sc-btn":"sc-btn sc-btn-primary",disabled:e.cta.disabled,onClick:()=>void e.cta.take().catch(()=>{}),children:e.cta.label})}function Di({runtimes:e}){return e.length===0?null:b("span",{className:"sc-compute-marks",children:e.map(n=>{let t=$e[n];return t?b(t,{className:"sc-rt-mark"},n):null})})}import{jsx as ao,jsxs as os}from"react/jsx-runtime";function Ui({heading:e,plansHeading:n,showUsage:t=!0,showName:r=!0,className:o,...s}){let{plan:a,loading:l}=ft(),{theme:i}=H(),c=n??(l?"Plans":a?"Change plan":"Choose a plan");return os("div",{className:o?`soba-connect sc-fill sc-billing ${o}`:"soba-connect sc-fill sc-billing","data-theme":i,children:[ao(_r,{...e===void 0?{}:{heading:e},showUsage:t,showName:r}),os("section",{className:"sc-billing-plans",children:[c&&ao("h2",{className:"sc-section-title",children:c}),ao(eo,{...s})]})]})}import{useCallback as ss,useState as as}from"react";function io({plan:e,successUrl:n,cancelUrl:t,label:r}){let{plan:o}=F(),[s,a]=as(!1),[l,i]=as(null),c=ss(()=>o.checkout(e.id,{...n?{successUrl:n}:{},...t?{cancelUrl:t}:{}}),[o,e.id,n,t]),u=ss(async()=>{a(!0),i(null);try{window.location.assign(await c())}catch(p){i(p.message),a(!1)}},[c]);return{label:s?"Opening\u2026":r??`Subscribe for $${e.price.toLocaleString()}/${e.interval}`,busy:s,error:l,buy:u,session:c}}import{jsx as is,jsxs as Qi}from"react/jsx-runtime";function Fi({plan:e,successUrl:n,cancelUrl:t,label:r,className:o}){let{theme:s}=H(),a=io({plan:e,...n?{successUrl:n}:{},...t?{cancelUrl:t}:{},...r?{label:r}:{}});return Qi("div",{className:o?`soba-connect ${o}`:"soba-connect","data-theme":s,children:[is("button",{type:"button",className:"sc-btn sc-btn-primary",disabled:a.busy,onClick:()=>void a.buy(),children:a.label}),a.error&&is("p",{className:"sc-error",children:a.error})]})}import{useCallback as Fe,useEffect as tn,useMemo as Dn,useRef as rn,useState as se}from"react";var Vi="soba.session:";function ls(e){return!e.cacheKey||!e.endpoint?null:Vi+JSON.stringify([e.endpoint,e.user??null,e.cacheKey])}function Ji(e){try{let n=globalThis.localStorage?.getItem(e);if(!n)return null;let t=JSON.parse(n);return typeof t.token!="string"||typeof t.expiresAt!="number"?null:{token:t.token,expiresAt:t.expiresAt}}catch{return null}}function Yi(e,n){try{n?globalThis.localStorage?.setItem(e,JSON.stringify(n)):globalThis.localStorage?.removeItem(e)}catch{}}var cs=6e4,zi=1e4,Ut=class{#e;#n=null;#r=null;#t;#o=new Set;constructor(n){this.#t=n,this.#e=n.token??null;let t=ls(n),r=t&&!this.#e?Ji(t):null;r&&r.expiresAt-cs>Date.now()&&(this.#e=r.token,this.#n=r.expiresAt)}get token(){return this.#e}get expiresAt(){return this.#n}get canRefresh(){return!!this.#t.endpoint}get refreshAt(){return!this.canRefresh||this.#n===null?null:Math.max(Date.now()+zi,this.#n-cs)}subscribe(n){return this.#o.add(n),()=>this.#o.delete(n)}async ensure(){return this.#e?this.#e:this.refresh()}async refresh(){if(this.#r)return this.#r;let n=this.#t.endpoint;if(!n)throw new Error("This Soba session cannot be refreshed. Pass `sessionEndpoint` so the provider can mint a new one.");let t=this.#t.fetchImpl??fetch.bind(globalThis);this.#r=(async()=>{let r=await t(n,{method:"POST",headers:{"content-type":"application/json"},credentials:"same-origin",body:JSON.stringify(this.#t.user?{user:this.#t.user}:{})});if(!r.ok)throw new Error(`Could not start a Soba session (${r.status} from ${n}).`);let o=await r.json(),s=o.session??o.token;if(!s)throw new Error(`${n} answered without a \`session\`. See @soba-so/react's README.`);let a=o.expires_in??o.expiresIn;this.#e=s,this.#n=typeof a=="number"?Date.now()+a*1e3:null;let l=ls(this.#t);l&&Yi(l,this.#n===null?null:{token:s,expiresAt:this.#n});for(let i of this.#o)i();return s})();try{return await this.#r}finally{this.#r=null}}},Hn=new Map,us=new WeakMap,ji=1;function qi(e){if(e.token||!e.endpoint)return null;let n=0;return e.fetchImpl&&(n=us.get(e.fetchImpl)??ji++,us.set(e.fetchImpl,n)),JSON.stringify([e.endpoint,e.user??null,n,e.cacheKey??null])}function ds(e){let n=qi(e);if(!n)return new Ut(e);let t=Hn.get(n)??{holder:new Ut(e),users:0};return Hn.set(n,t),t.holder}function ps(e){for(let n of Hn.values())n.holder===e&&n.users++}function ms(e){for(let[n,t]of Hn)if(t.holder===e){setTimeout(()=>{--t.users<=0&&Hn.get(n)===t&&Hn.delete(n)},0);return}}function hs(e,n=fetch.bind(globalThis)){return async(t,r)=>{let o=await n(t,r);if(o.status!==401||!e.canRefresh)return o;let s;try{s=await e.refresh()}catch{return o}return n(t,Zi(r,s))}}function Zi(e,n){let t=new Headers(e?.headers);return t.set("authorization",`Bearer ${n}`),{...e,headers:t}}import{jsx as lo,jsxs as $i}from"react/jsx-runtime";var Xi="https://soba.so",Ki=3e4;function _i(e){let{children:n,session:t,sessionEndpoint:r,user:o,sessionCacheKey:s,runEndpoint:a,theme:l,initialMachines:i,initialConnect:c=null,initialPlans:u,initialCurrentPlan:p=null,baseUrl:A=Xi,pollMs:g=Ki,injectStyles:h=!0,modal:y=!0,fetchImpl:M,onError:E}=e,[I,B]=se(t??null),[V,L]=se(null),[x,G]=se(c),[w,ae]=se(null),[K,ge]=se(c===null),[_,ne]=se(i??[]),[Qe,z]=se(null),[ue,Be]=se(i===void 0),[ie,fe]=se(u??[]),[q,Ae]=se(p),[Pe,de]=se(null),[be,Q]=se(u===void 0),[$,Ge]=se(null),[je,W]=se(!1),ye=rn(E);ye.current=E;let Z=Fe(k=>{L(k),ye.current?.(k)},[]);tn(()=>{h&&ht()},[h]);let O=Dn(()=>ds({...t?{token:t}:{},...r?{endpoint:r}:{},...o?{user:o}:{},...M?{fetchImpl:M}:{},...s?{cacheKey:s}:{}}),[t,r,o,M,s]);tn(()=>{let k=!0;ps(O);let ee=O.subscribe(()=>{k&&B(O.token)});return!O.token&&!O.canRefresh?Z(new Error("<SobaProvider> needs a `session` or a `sessionEndpoint`. A browser cannot mint one: that takes your secret key.")):O.ensure().then(()=>k&&B(O.token),pe=>k&&Z(pe)),()=>{k=!1,ee(),ms(O)}},[O,Z]),tn(()=>{V&&(ge(!1),Be(!1),Q(!1),ae(k=>k??V),z(k=>k??V),de(k=>k??V))},[V]),tn(()=>{let k=O.refreshAt;if(k===null)return;let ee=()=>{O.refresh().catch(ve=>Z(ve))},pe=()=>{document.hidden||(document.removeEventListener("visibilitychange",pe),ee())},Ct=setTimeout(()=>{typeof document<"u"&&document.hidden?document.addEventListener("visibilitychange",pe):ee()},Math.max(0,k-Date.now()));return()=>{clearTimeout(Ct),typeof document<"u"&&document.removeEventListener("visibilitychange",pe)}},[O,Z,I]);let C=rn(c?.machines_url??null),S=Dn(()=>{if(!I)return null;let k=new Vn({session:I,baseUrl:A,fetchImpl:hs(O,M??fetch.bind(globalThis))});return k.setMachinesUrl(C.current),k},[I,A,O,M]),Ve=rn(c!==null);tn(()=>{if(!S||Ve.current)return;let k=!0;return ge(!0),S.context().then(ee=>{k&&(G(ee),ae(null),ge(!1))},ee=>{k&&(ae(ee),ge(!1))}),()=>{k=!1}},[S]);let qe=Fe(async()=>{if(S)try{let k=await S.machines();ne(Array.isArray(k)?k:[]),z(null)}catch(k){z(k)}finally{Be(!1)}},[S]),we=Fe(async()=>{if(S)try{let k=await S.plans();fe(k.plans),Ae(k.current),de(null)}catch(k){de(k)}finally{Q(!1)}},[S]),le=rn(!1),[Ze,kn]=se(!1),Nn=rn(u!==void 0),on=rn(!1),sn=Fe(()=>{le.current||(le.current=!0,on.current&&queueMicrotask(()=>{on.current&&kn(!0)}))},[]);tn(()=>(on.current=!0,le.current&&kn(!0),()=>{on.current=!1}),[]),tn(()=>{!S||!Ze||Nn.current||we()},[S,Ze,we]);let an=Fe(async k=>{if(!S)throw new Error("No session yet.");await S.selectPlan(k),await we()},[S,we]),Ft=Fe(async(k,ee)=>{if(!S)throw new Error("No session yet.");let pe=await S.checkoutPlan(k,ee);if(!pe.url)throw new Error("Checkout could not be started.");return pe.url},[S]),At=Fe(async()=>{if(!S)throw new Error("No session yet.");await S.leavePlan(),await we()},[S,we]),bt=rn(i!==void 0);tn(()=>{if(!S)return;let k=Se(qe,g,{immediate:!bt.current});return bt.current=!1,k},[S,qe,g]);let xn=Fe((k="manual")=>{y&&(W(!0),Ge(k))},[y]),yt=Fe(()=>Ge(null),[]),X=rn(_);X.current=_;let We=Fe(async k=>{if(!a)throw new Error("Pass `runEndpoint` to <SobaProvider> to start runs from the browser. It is your own route: it holds your secret key, calls soba.run(), and forwards the stream.");let{signal:ee,...pe}=k,ve=await(M??fetch.bind(globalThis))(a,{method:"POST",headers:{"content-type":"application/json",accept:"text/event-stream"},credentials:"same-origin",body:JSON.stringify(pe),...ee?{signal:ee}:{}});if(!ve.ok){let Je=await ve.json().catch(()=>null),ke=new Error(Je?.error?.message??`${a} answered ${ve.status}.`);ke.status=ve.status,Je?.error?.code&&(ke.code=Je.error.code),Je?.error&&(ke.error=Je.error);let vt=X.current.length>0&&!X.current.some(Vt=>Vt.state!=="offline");throw ve.status===409&&vt&&xn("no_compute"),ke}let Re=Kr(ve);return async function*(){try{yield*Re}finally{le.current&&we()}}()},[a,M,we,xn]),Ce=Dn(()=>q?ie.find(k=>k.id===q.plan_id)??null:null,[ie,q]),ln=Dn(()=>Ce?Ce.connected_reward==="included"&&_.length>0&&Ce.connected_included_units!==null?Ce.connected_included_units:Ce.included_units:null,[Ce,_]),wt=Dn(()=>({plans:ie,current:q,plan:Ce,used:q?.units_used??null,included:ln,remaining:ln!==null&&q?Math.max(0,ln-q.units_used):null,unlimited:Ce!==null&&ln===null,loading:be,error:Pe,select:an,checkout:Ft,leave:At,refresh:we}),[ie,q,Ce,ln,be,Pe,an,Ft,At,we]),Qt=Dn(()=>({session:I,client:S,error:V,get plan(){return sn(),wt},compute:{machines:_,connected:_.length>0,online:_.some(k=>k.state!=="offline"),loading:ue,error:Qe,refresh:qe},connect:{app:x?.app??null,command:x?.command??null,connectUrl:x?.connect_url??null,publishableKey:x?.publishable_key??null,loading:K,error:w,open:xn,close:yt,isOpen:$!==null,hasModal:y},run:We}),[I,S,V,wt,sn,$,xn,yt,y,_,ue,Qe,qe,x,K,w,We]);return lo(Gr.Provider,{value:S,children:lo(Wr.Provider,{value:{context:x,machines:ue?void 0:_,theme:l??x?.theme??"light"},children:$i(Hr.Provider,{value:Qt,children:[n,y&&je&&lo(dt,{open:$!==null,onOpenChange:k=>Ge(k?$??"manual":null),onConnected:()=>{qe()},...$==="payment_required"||$==="no_compute"?{reason:$}:{},...$==="pair"?{showStatus:!1}:{}})]})})})}function el(e){return e?nl[e]??e:null}var nl={"user-hardware":"your own computer","user-subscription":"your own AI plan","user-api-key":"your own API key","open-weights":"open models we host",frontier:"a frontier model we pay for"};async function tl(e,n,t){let r=n.local;if(!r?.session||n.after)return null;let o=/\/v1\/runs\/([^/]+)\/events/.exec(e.url)?.[1];if(!o)return null;let s=`http://127.0.0.1:${r.port??47321}/v1/runs/${o}/events`,a=new AbortController,l=()=>a.abort();n.signal?.addEventListener("abort",l);let i=setTimeout(()=>a.abort(),r.timeoutMs??3e3);try{let c=await t(s,{headers:{authorization:`Bearer ${r.session}`,accept:"text/event-stream"},signal:a.signal});return c.ok?{url:s,bearer:r.session,open:c}:null}catch{return null}finally{clearTimeout(i),n.signal?.removeEventListener("abort",l)}}async function*rl(e){let n=e.body;if(!n)return;let t=n.getReader(),r=new TextDecoder,o="",s=null,a=[];try{for(;;){let l=await t.read();if(l.done)return;o+=r.decode(l.value,{stream:!0});for(let i=o.indexOf(`
|
|
3807
|
-
`);i!==-1;i=
|
|
3808
|
-
`)){let c=
|
|
3809
|
-
`)}),
|
|
3901
|
+
`,document.head.appendChild(e)}import{jsx as De,jsxs as bt}from"react/jsx-runtime";function to(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 ki(){return bt("svg",{viewBox:"0 0 16 16",fill:"none","aria-hidden":"true",children:[De("path",{d:"M8 5v4",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round"}),De("circle",{cx:"8",cy:"11.6",r:"0.9",fill:"currentColor"}),De("circle",{cx:"8",cy:"8",r:"6.4",stroke:"currentColor",strokeWidth:"1.3"})]})}function Ni({error:e,onRetry:n,onDismiss:t,title:r,className:s}){let o=to(e),a=G();return vi(()=>At(),[]),o?De("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:[De("span",{className:"sc-limit-mark sc-run-error-mark","aria-hidden":"true",children:De(ki,{})}),bt("div",{children:[De("h2",{className:"sc-limit-title",children:r??"That run did not finish"}),De("p",{className:"sc-limit-body sc-run-error-message",children:o})]})]}),(t||n)&&bt("div",{className:"sc-limit-actions",children:[t&&De("button",{type:"button",className:"sc-btn sc-btn-quiet",onClick:t,children:"Dismiss"}),n&&De("button",{type:"button",className:"sc-btn sc-btn-primary",onClick:n,children:"Try again"})]})]})}):null}import{useId as xi,useState as ro}from"react";import{jsx as ie,jsxs as Ut}from"react/jsx-runtime";function Mi({reason:e}){return ie("span",{className:"sc-limit-mark","aria-hidden":"true",children:e==="no_compute"?ie(St,{}):ie(oe,{})})}function Si(e){let{error:n,variant:t="card",onDismiss:r,className:s}=e,o=_r(n,{predict:e.predict??!("error"in e)}),a=xi(),l=G();if(!o)return null;let i=ie(Pi,{offer:o,headingId:a,onDismiss:r});return t==="dialog"?ie(ct,{open:!0,onClose:()=>r?.(),labelledBy:a,theme:l.theme,children:i}):ie("div",{className:s?`soba-connect ${s}`:"soba-connect","data-theme":l.theme,children:i})}function Pi({offer:e,headingId:n,onDismiss:t}){let{compute:r}=D(),[s,o]=ro(!1),[a,l]=ro(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 Ut("div",{className:"sc-card sc-limit",children:[Ut("div",{className:"sc-limit-head",children:[ie(Mi,{reason:e.reason}),Ut("div",{children:[ie("h2",{className:"sc-limit-title",id:n,children:e.title}),ie("p",{className:"sc-limit-body",children:e.body})]})]}),a&&ie("p",{className:"sc-error",children:a}),i&&u.note&&ie("p",{className:"sc-limit-note",children:u.note}),Ut("div",{className:"sc-limit-actions",children:[t&&ie("button",{type:"button",className:"sc-btn sc-btn-quiet",onClick:t,disabled:s,children:"Not now"}),e.upgradeTo&&ie("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&&ie("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&&ie("button",{type:"button",className:"sc-btn sc-btn-primary",onClick:u.open,disabled:s,children:"Open Soba App"})]})]})}import{useMemo as Ri}from"react";function yt(){let{plan:e,compute:n,connect:t}=D();return Ri(()=>{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=Oi(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:Ei(r,l||c,n.connected,()=>t.open("manual")),summary:Ii({plan:r,assignment:s,used:m,ceiling:i,trialDaysLeft:a,raised:l,uncounted:c,state:y})}},[e,n.connected,t])}function Ei(e,n,t,r){let s=Je({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:Ye(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 Ii(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 ${so(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 ${so(t.period_end)}.`:"";return`${m.toLocaleString()} of ${(s??0).toLocaleString()} ${n.unit}s left.${A}${u}`}function Oi(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 so(e){let n=new Date(e);return Number.isNaN(n.getTime())?e:n.toLocaleDateString(void 0,{day:"numeric",month:"long"})}import{Fragment as Ti,jsx as le,jsxs as Oe}from"react/jsx-runtime";function ts({heading:e="Current plan",showUsage:n=!0,showName:t=!0,className:r}){let s=yt(),{theme:o}=G(),a=A=>le("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&&le("h2",{className:"sc-section-title",children:e}),A]})});if(s.error)return a(le("p",{className:"sc-error",children:s.error.message}));if(s.loading)return a(le("p",{className:"sc-note",children:"Loading\u2026"}));if(!s.plan)return a(Oe("div",{className:"sc-current-main",children:[le("p",{className:"sc-current-name",children:"No plan"}),le("p",{className:"sc-sub",children:s.summary})]}));let{plan:l,trialDaysLeft:i,percent:c,unlimited:u,reward:m}=s;return a(Oe(Ti,{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&&le("p",{className:"sc-current-trial",children:Oe("span",{className:"sc-trial-badge",children:[i," ",i===1?"day":"days"," left"]})}),t&&l.description&&le("p",{className:"sc-sub",children:l.description})]}),n&&Oe("div",{className:"sc-usage",children:[Oe("div",{className:"sc-row-between",children:[le("span",{className:"sc-fact-key",children:"Usage"}),le("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&&le("div",{className:"sc-meter",role:"presentation",children:c>0&&le("span",{className:c>=100?"sc-meter-fill sc-meter-full":"sc-meter-fill",style:{width:`${c}%`}})}),le("p",{className:"sc-usage-line",children:s.summary})]})]}),m&&Oe("div",{className:"sc-current-foot",children:[le("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: ${Li(m.line)}.`:m.line}),(m.actionable||m.connected)&&le(vn,{})]})]}))}var Li=e=>e.charAt(0).toLowerCase()+e.slice(1);import{useCallback as Bi,useMemo as Gi,useState as oo}from"react";var Wi={"user-hardware":"your own machine","user-subscription":"your own AI subscription","open-weights":"open models we host",frontier:"frontier models"},Hi=new Set(["user-hardware","user-subscription"]);function rs(e={}){let{plan:n,compute:t,connect:r}=D(),[s,o]=oo(null),[a,l]=oo(null),{featured:i,onSelect:c,successUrl:u,cancelUrl:m}=e,A=Bi(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=Gi(()=>n.plans.map(h=>{let y=n.current?.plan_id===h.id;return{plan:h,current:y,featured:i===h.id&&!y,price:Di(h),allowance:h.included_units===null?`Unlimited ${h.unit}s`:`${h.included_units.toLocaleString()} ${h.unit}${h.included_units===1?"":"s"}`,allowanceNote:Ui(h),computeLabel:h.route_allow===null?"any compute":h.route_allow.length===0?"no compute":null,compute:(h.route_allow??[]).map(S=>({costClass:S,label:Wi[S]??S,owned:Hi.has(S),runtimes:lr(S).map(I=>I.id)})),connect:Fi(h,y,t.connected,()=>r.open("manual")),cta:{label:Qi(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 Di(e){return e.price===0?{amount:"Free",interval:null,free:!0}:{amount:`$${e.price.toLocaleString()}`,interval:e.interval,free:!1}}function Ui(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 Fi(e,n,t,r){let s=Je({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=Ye(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 Qi(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 Ft(e){return e?`soba-connect sc-fill ${e}`:"soba-connect sc-fill"}function ss({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}=rs({...a?{featured:a}:{},...e?{onSelect:e}:{},...n?{successUrl:n}:{},...t?{cancelUrl:t}:{}}),{theme:A}=G();if(u)return b("div",{className:Ft(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:Ft(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:Ft(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:Ft(l),"data-theme":A,"data-variant":o,children:[o==="rows"?b(Ji,{offers:i,shelf:g}):o==="table"?b(Yi,{offers:i,shelf:g}):b(Vi,{offers:i,shelf:g}),m&&b("p",{className:"sc-error",children:m})]})}function Vi({offers:e,shelf:n}){return b("div",{className:"sc-plans",children:e.map(t=>W("div",{className:ao("sc-plan",t),children:[W("div",{className:"sc-row-between",children:[b("span",{className:"sc-title",children:t.plan.name}),b(os,{offer:t})]}),b("p",{className:"sc-sub",children:t.plan.description}),b(as,{price:t.price,free:"forever"}),b(cs,{offer:t,shelf:n}),b(io,{offer:t}),b("div",{className:"sc-plan-band",children:n.showCompute&&b(ls,{offer:t})}),b("div",{className:"sc-plan-band",children:b(is,{offer:t})})]},t.plan.id))})}function Ji({offers:e,shelf:n}){return b("ul",{className:"sc-plan-rows",children:e.map(t=>W("li",{className:ao("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(os,{offer:t})]}),t.plan.description&&b("p",{className:"sc-sub",children:t.plan.description}),b(io,{offer:t}),n.showCompute&&b(ls,{offer:t,inline:!0}),b(is,{offer:t,inline:!0})]}),W("div",{className:"sc-row-side",children:[b(as,{price:t.price,free:"forever",small:!0}),b(cs,{offer:t,shelf:n})]})]},t.plan.id))})}function Yi({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(os,{offer:a})]}),b(as,{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(ls,{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(is,{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(cs,{offer:a,shelf:n})},a.plan.id))]})]})]})})}function ao(e,n){return[e,n.current?"sc-plan-current":"",n.featured?"sc-plan-featured":""].filter(Boolean).join(" ")}function os({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 as({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 io({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 is({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 ls({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(zi,{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 cs({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 zi({runtimes:e}){return e.length===0?null:b("span",{className:"sc-compute-marks",children:e.map(n=>{let t=Ze[n];return t?b(t,{className:"sc-rt-mark"},n):null})})}import{jsx as us,jsxs as lo}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 lo("div",{className:s?`soba-connect sc-fill sc-billing ${s}`:"soba-connect sc-fill sc-billing","data-theme":i,children:[us(ts,{...e===void 0?{}:{heading:e},showUsage:t,showName:r}),lo("section",{className:"sc-billing-plans",children:[c&&us("h2",{className:"sc-section-title",children:c}),us(ss,{...o})]})]})}import{useCallback as co,useState as uo}from"react";function ds({plan:e,successUrl:n,cancelUrl:t,label:r}){let{plan:s}=D(),[o,a]=uo(!1),[l,i]=uo(null),c=co(()=>s.checkout(e.id,{...n?{successUrl:n}:{},...t?{cancelUrl:t}:{}}),[s,e.id,n,t]),u=co(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 po,jsxs as Zi}from"react/jsx-runtime";function qi({plan:e,successUrl:n,cancelUrl:t,label:r,className:s}){let{theme:o}=G(),a=ds({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:[po("button",{type:"button",className:"sc-btn sc-btn-primary",disabled:a.busy,onClick:()=>void a.buy(),children:a.label}),a.error&&po("p",{className:"sc-error",children:a.error})]})}import{useCallback as Ue,useEffect as _e,useMemo as Fn,useRef as $e,useState as ce}from"react";var Xi="soba.session:";function mo(e){return!e.cacheKey||!e.endpoint?null:Xi+JSON.stringify([e.endpoint,e.user??null,e.cacheKey])}function Ki(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 _i(e,n){try{n?globalThis.localStorage?.setItem(e,JSON.stringify(n)):globalThis.localStorage?.removeItem(e)}catch{}}var ho=6e4,$i=1e4,Qt=class{#e;#n=null;#r=null;#t;#s=new Set;constructor(n){this.#t=n,this.#e=n.token??null;let t=mo(n),r=t&&!this.#e?Ki(t):null;r&&r.expiresAt-ho>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()+$i,this.#n-ho)}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=mo(this.#t);l&&_i(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,go=new WeakMap,el=1;function nl(e){if(e.token||!e.endpoint)return null;let n=0;return e.fetchImpl&&(n=go.get(e.fetchImpl)??el++,go.set(e.fetchImpl,n)),JSON.stringify([e.endpoint,e.user??null,n,e.cacheKey??null])}function fo(e){let n=nl(e);if(!n)return new Qt(e);let t=Un.get(n)??{holder:new Qt(e),users:0};return Un.set(n,t),t.holder}function Ao(e){for(let n of Un.values())n.holder===e&&n.users++}function bo(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 yo(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,tl(r,o))}}function tl(e,n){let t=new Headers(e?.headers);return t.set("authorization",`Bearer ${n}`),{...e,headers:t}}import{jsx as ps,jsxs as al}from"react/jsx-runtime";var rl="https://soba.so",sl=3e4;function ol(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=rl,pollMs:g=sl,injectStyles:h=!0,modal:y=!0,fetchImpl:S,onError:I}=e,[E,T]=ce(t??null),[J,O]=ce(null),[M,B]=ce(c),[C,ue]=ce(null),[_,Ae]=ce(c===null),[$,Pe]=ce(i??[]),[Le,ee]=ce(null),[Te,q]=ce(i===void 0),[ne,Nn]=ce(u??[]),[Z,X]=ce(m),[be,ye]=ce(null),[pe,z]=ce(u===void 0),[te,re]=ce(null),[Be,Q]=ce(!1),Ge=$e(I);Ge.current=I;let K=Ue(N=>{O(N),Ge.current?.(N)},[]);_e(()=>{h&&At()},[h]);let U=Fn(()=>fo({...t?{token:t}:{},...r?{endpoint:r}:{},...s?{user:s}:{},...S?{fetchImpl:S}:{},...o?{cacheKey:o}:{}}),[t,r,s,S,o]);_e(()=>{let N=!0;Ao(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(),bo(U)}},[U,K]),_e(()=>{J&&(Ae(!1),q(!1),z(!1),ue(N=>N??J),ee(N=>N??J),ye(N=>N??J))},[J]),_e(()=>{let N=U.refreshAt;if(N===null)return;let se=()=>{U.refresh().catch(Re=>K(Re))},ve=()=>{document.hidden||(document.removeEventListener("visibilitychange",ve),se())},Mn=setTimeout(()=>{typeof document<"u"&&document.hidden?document.addEventListener("visibilitychange",ve):se()},Math.max(0,N-Date.now()));return()=>{clearTimeout(Mn),typeof document<"u"&&document.removeEventListener("visibilitychange",ve)}},[U,K,E]);let w=$e(c?.machines_url??null),v=Fn(()=>{if(!E)return null;let N=new qn({session:E,baseUrl:A,fetchImpl:yo(U,S??fetch.bind(globalThis))});return N.setMachinesUrl(w.current),N},[E,A,U,S]),Fe=$e(c!==null);_e(()=>{if(!v||Fe.current)return;let N=!0;return Ae(!0),v.context().then(se=>{N&&(B(se),ue(null),Ae(!1))},se=>{N&&(ue(se),Ae(!1))}),()=>{N=!1}},[v]);let en=Ue(async()=>{if(v)try{let N=await v.machines();Pe(Array.isArray(N)?N:[]),ee(null)}catch(N){ee(N)}finally{q(!1)}},[v]),we=Ue(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]),nn=$e(!1),[wt,Ce]=ce(!1),tn=$e(u!==void 0),ze=$e(!1),rn=Ue(()=>{nn.current||(nn.current=!0,ze.current&&queueMicrotask(()=>{ze.current&&Ce(!0)}))},[]);_e(()=>(ze.current=!0,nn.current&&Ce(!0),()=>{ze.current=!1}),[]),_e(()=>{!v||!wt||tn.current||we()},[v,wt,we]);let Qn=Ue(async N=>{if(!v)throw new Error("No session yet.");await v.selectPlan(N),await we()},[v,we]),sn=Ue(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]),on=Ue(async()=>{if(!v)throw new Error("No session yet.");await v.leavePlan(),await we()},[v,we]),Vt=$e(i!==void 0);_e(()=>{if(!v)return;let N=Se(en,g,{immediate:!Vt.current});return Vt.current=!1,N},[v,en,g]);let xn=Ue((N="manual")=>{y&&(Q(!0),re(N))},[y]),Ct=Ue(()=>re(null),[]),Vn=$e($);Vn.current=$;let vt=Ue(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,Re=await(S??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(!Re.ok){let Qe=await Re.json().catch(()=>null),de=new Error(Qe?.error?.message??`${a} answered ${Re.status}.`);de.status=Re.status,Qe?.error?.code&&(de.code=Qe.error.code),Qe?.error&&(de.error=Qe.error);let an=Vn.current.length>0&&!Vn.current.some(kt=>kt.state!=="offline");throw Re.status===409&&an&&xn("no_compute"),de}let Yt=ns(Re);return async function*(){try{yield*Yt}finally{nn.current&&we()}}()},[a,S,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:sn,leave:on,refresh:we}),[ne,Z,F,me,pe,be,Qn,sn,on,we]),Jt=Fn(()=>({session:E,client:v,error:J,get plan(){return rn(),Jn},compute:{machines:$,connected:$.length>0,online:$.some(N=>N.state!=="offline"),loading:Te,error:Le,refresh:en},connect:{app:M?.app??null,command:M?.command??null,connectUrl:M?.connect_url??null,publishableKey:M?.publishable_key??null,loading:_,error:C,open:xn,close:Ct,isOpen:te!==null,hasModal:y},run:vt}),[E,v,J,Jn,rn,te,xn,Ct,y,$,Te,Le,en,M,_,C,vt]);return ps(Ur.Provider,{value:v,children:ps(Fr.Provider,{value:{context:M,machines:Te?void 0:$,theme:l??M?.theme??"light"},children:al(Qr.Provider,{value:Jt,children:[n,y&&Be&&ps(ht,{open:te!==null,onOpenChange:N=>re(N?te??"manual":null),onConnected:()=>{en()},...te==="payment_required"||te==="no_compute"?{reason:te}:{},...te==="pair"?{showStatus:!1}:{}})]})})})}function il(e){return e?ll[e]??e:null}var ll={"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 cl(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*ul(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(`
|
|
3902
|
+
`);i!==-1;i=s.indexOf(`
|
|
3903
|
+
`)){let c=s.slice(0,i).replace(/\r$/,"");if(s=s.slice(i+1),c==="")a.length&&(yield{id:o,data:a.join(`
|
|
3904
|
+
`)}),o=null,a=[];else if(c.startsWith("id:")){let u=Number(c.slice(3).trim());o=Number.isFinite(u)?u:null}else if(c.startsWith("data:")){let u=c.slice(5);a.push(u.startsWith(" ")?u.slice(1):u)}}}}finally{t.cancel().catch(()=>{})}}var ms=(e,n)=>new Promise(t=>{let r=setTimeout(t,e);n?.addEventListener("abort",()=>{clearTimeout(r),t()})});async function*dl(e,n={}){let t=n.fetchImpl??fetch.bind(globalThis),r=await cl(e,n,t)??{url:e.url,bearer:e.token,open:null},s=n.maxRetries??6,o=n.after??0,a=0;for(;;){if(n.signal?.aborted)return;let l;try{l=r.open??await t(r.url,{headers:{authorization:`Bearer ${r.bearer}`,accept:"text/event-stream",...o?{"last-event-id":String(o)}:{}},...n.signal?{signal:n.signal}:{}}),r.open=null}catch(i){if(n.signal?.aborted)return;if(++a>s)throw i;await ms(1e3*a,n.signal);continue}if(l.status===503&&a<s){a++,await ms(Number(l.headers.get("retry-after")??3)*1e3,n.signal);continue}if(!l.ok){let i=`Could not read this run (${l.status}).`;try{let c=await l.json();c.error?.message&&(i=c.error.message)}catch{}throw new Error(i)}for await(let i of ul(l)){i.id!==null&&(o=i.id),a=0;let c=Dn(i.data);if(c&&(yield c,c.type==="done"||c.type==="error"))return}if(n.signal?.aborted)return;if(++a>s)throw new Error("Lost this run's stream and could not get it back.");await ms(1e3*a,n.signal)}}export{Ja as ComputeStatus,vn as ConnectButton,ei as ConnectCompute,ht as ConnectModal,gi as ConnectNudge,zr as ConnectPill,Ci as ModelPicker,Ni as RunError,Si as RunLimit,ji as SobaBilling,qi as SobaCheckout,ts as SobaCurrentPlan,ss as SobaPlans,ol as SobaProvider,wi as collectText,jr as connectSays,At as injectStyles,Dn as parseEvent,ns as readEvents,to as runErrorMessage,kn as sobaErrorCode,il as tierLabel,ds as useCheckout,pt as useCompute,Za as useConnectButton,es as useConnectNudge,yt as useCurrentPlan,qr as useMachineRuns,Cn as useModel,ft as useOpenSobaConnect,rs as usePlans,_r as useRunLimit,D as useSoba,dl as watchRun};
|
package/dist/styles.css
CHANGED
|
@@ -1425,8 +1425,10 @@ a.sc-btn {
|
|
|
1425
1425
|
bottom: auto;
|
|
1426
1426
|
z-index: 2147483000;
|
|
1427
1427
|
|
|
1428
|
-
width: min(92vw,
|
|
1429
|
-
max-width: min(92vw,
|
|
1428
|
+
width: min(92vw, 320px);
|
|
1429
|
+
max-width: min(92vw, 320px);
|
|
1430
|
+
--sc-font-size: 12.5px;
|
|
1431
|
+
--sc-scale: 0.8;
|
|
1430
1432
|
|
|
1431
1433
|
max-height: calc(100vh - 24px);
|
|
1432
1434
|
overflow-y: auto;
|
|
@@ -1434,7 +1436,7 @@ a.sc-btn {
|
|
|
1434
1436
|
margin: 0;
|
|
1435
1437
|
padding: 0;
|
|
1436
1438
|
border: 0;
|
|
1437
|
-
border-radius:
|
|
1439
|
+
border-radius: 16px;
|
|
1438
1440
|
background: var(--sc-tray, #f6f6f7);
|
|
1439
1441
|
|
|
1440
1442
|
box-shadow:
|
|
@@ -2266,7 +2268,100 @@ a.sc-btn {
|
|
|
2266
2268
|
}
|
|
2267
2269
|
|
|
2268
2270
|
.sc-result-ok {
|
|
2269
|
-
color: var(--sc-
|
|
2271
|
+
color: var(--sc-text, #1a1a1c);
|
|
2272
|
+
}
|
|
2273
|
+
|
|
2274
|
+
.sc-arrived {
|
|
2275
|
+
display: flex;
|
|
2276
|
+
align-items: center;
|
|
2277
|
+
gap: 10px;
|
|
2278
|
+
margin-top: 18px;
|
|
2279
|
+
padding: 10px 12px;
|
|
2280
|
+
border: 1px solid var(--sc-line, #e9e9eb);
|
|
2281
|
+
border-radius: 12px;
|
|
2282
|
+
background: var(--sc-raised, #f6f6f7);
|
|
2283
|
+
text-align: left;
|
|
2284
|
+
}
|
|
2285
|
+
.sc-arrived .sc-runtime-tile {
|
|
2286
|
+
border-radius: 50%;
|
|
2287
|
+
background: var(--sc-sheet, #ffffff);
|
|
2288
|
+
}
|
|
2289
|
+
.sc-arrived-name {
|
|
2290
|
+
flex: 1;
|
|
2291
|
+
min-width: 0;
|
|
2292
|
+
font-size: 14px;
|
|
2293
|
+
font-weight: 500;
|
|
2294
|
+
}
|
|
2295
|
+
.sc-arrived-auth {
|
|
2296
|
+
display: inline-flex;
|
|
2297
|
+
align-items: center;
|
|
2298
|
+
gap: 6px;
|
|
2299
|
+
font-size: 12.5px;
|
|
2300
|
+
color: var(--sc-muted, #6b6b73);
|
|
2301
|
+
}
|
|
2302
|
+
.sc-arrived-dot {
|
|
2303
|
+
width: 6px;
|
|
2304
|
+
height: 6px;
|
|
2305
|
+
flex: none;
|
|
2306
|
+
border-radius: 50%;
|
|
2307
|
+
background: var(--sc-ok, #22a06b);
|
|
2308
|
+
}
|
|
2309
|
+
|
|
2310
|
+
.sc-stall {
|
|
2311
|
+
display: flex;
|
|
2312
|
+
flex-direction: column;
|
|
2313
|
+
gap: 14px;
|
|
2314
|
+
margin: 16px 0 0;
|
|
2315
|
+
padding: 14px;
|
|
2316
|
+
list-style: none;
|
|
2317
|
+
border: 1px solid var(--sc-line, #e9e9eb);
|
|
2318
|
+
border-radius: 12px;
|
|
2319
|
+
text-align: left;
|
|
2320
|
+
}
|
|
2321
|
+
.sc-stall-step {
|
|
2322
|
+
display: grid;
|
|
2323
|
+
grid-template-columns: 20px 1fr;
|
|
2324
|
+
column-gap: 12px;
|
|
2325
|
+
row-gap: 2px;
|
|
2326
|
+
align-items: start;
|
|
2327
|
+
}
|
|
2328
|
+
.sc-stall-step > svg {
|
|
2329
|
+
grid-row: span 3;
|
|
2330
|
+
width: 20px;
|
|
2331
|
+
height: 20px;
|
|
2332
|
+
}
|
|
2333
|
+
.sc-stall-ok > circle:first-child {
|
|
2334
|
+
fill: var(--sc-ok, #22a06b);
|
|
2335
|
+
}
|
|
2336
|
+
.sc-stall-open > circle:first-child {
|
|
2337
|
+
fill: var(--sc-text, #1a1a1c);
|
|
2338
|
+
}
|
|
2339
|
+
.sc-stall-step path {
|
|
2340
|
+
fill: none;
|
|
2341
|
+
stroke: var(--sc-sheet, #ffffff);
|
|
2342
|
+
stroke-width: 2;
|
|
2343
|
+
stroke-linecap: round;
|
|
2344
|
+
stroke-linejoin: round;
|
|
2345
|
+
}
|
|
2346
|
+
.sc-stall-pt {
|
|
2347
|
+
fill: var(--sc-sheet, #ffffff);
|
|
2348
|
+
}
|
|
2349
|
+
.sc-stall-title {
|
|
2350
|
+
font-size: 14.5px;
|
|
2351
|
+
font-weight: 500;
|
|
2352
|
+
line-height: 20px;
|
|
2353
|
+
}
|
|
2354
|
+
.sc-stall-line {
|
|
2355
|
+
font-size: 13px;
|
|
2356
|
+
line-height: 1.45;
|
|
2357
|
+
color: var(--sc-muted, #6b6b73);
|
|
2358
|
+
}
|
|
2359
|
+
.sc-stall-more {
|
|
2360
|
+
margin-top: 8px;
|
|
2361
|
+
}
|
|
2362
|
+
.sc-stall-act {
|
|
2363
|
+
height: 36px;
|
|
2364
|
+
padding: 0 16px;
|
|
2270
2365
|
}
|
|
2271
2366
|
|
|
2272
2367
|
.sc-result-off {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@soba-so/react",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.24",
|
|
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,18 +19,13 @@
|
|
|
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
|
-
},
|
|
27
22
|
"peerDependencies": {
|
|
28
23
|
"react": ">=18"
|
|
29
24
|
},
|
|
30
25
|
"devDependencies": {
|
|
31
|
-
"@soba-so/connect-ui": "workspace:*",
|
|
32
26
|
"@types/react": "^19.0.0",
|
|
33
|
-
"typescript": "^7.0.2"
|
|
27
|
+
"typescript": "^7.0.2",
|
|
28
|
+
"@soba-so/connect-ui": "0.1.0"
|
|
34
29
|
},
|
|
35
30
|
"engines": {
|
|
36
31
|
"node": ">=22"
|
|
@@ -44,5 +39,9 @@
|
|
|
44
39
|
],
|
|
45
40
|
"publishConfig": {
|
|
46
41
|
"access": "public"
|
|
42
|
+
},
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build": "node ../../scripts/build-react.mjs",
|
|
45
|
+
"typecheck": "tsc -p tsconfig.json"
|
|
47
46
|
}
|
|
48
|
-
}
|
|
47
|
+
}
|