@soba-so/react 0.0.21 → 0.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.mjs +612 -222
- package/dist/styles.css +605 -215
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use client"
|
|
2
|
-
var fs={"claude-code":{small:"haiku",large:"opus"}};function vt(e){let n=fs[e];return!!(n?.small||n?.large)}import{useEffect as Os,useRef as Ls,useState as Pt}from"react";var xn=class extends Error{status;constructor(n,t){super(n),this.name="ConnectError",this.status=t}},gs=5*6e4,Dn=class{session;baseUrl;doFetch;lastMachines=null;machinesUrl=null;gatewayBackUntil=0;constructor(n){this.session=n.session,this.baseUrl=(n.baseUrl??"").replace(/\/+$/,""),this.doFetch=n.fetchImpl??fetch.bind(globalThis)}async context(){let n=await this.request("GET","/v1/connect");return this.setMachinesUrl(n.machines_url),n}setMachinesUrl(n){typeof n=="string"&&/^https?:\/\//.test(n)&&(this.machinesUrl=n)}async machines(){let n=this.lastMachines,t=n?`?v=${encodeURIComponent(n.version)}`:"",r;if(this.machinesUrl&&Date.now()>=this.gatewayBackUntil)try{r=await this.request("GET",`${this.machinesUrl}${t}`)}catch(a){if(a instanceof xn&&a.status===401)throw a;this.gatewayBackUntil=Date.now()+gs}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 xn("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)}:{}}),a={};try{a=await o.json()}catch{}if(!o.ok){let s=typeof a.error=="string"?a.error:`Request failed (${o.status})`;throw new xn(s,o.status)}return a}};function Un(e){let n=/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(e.trim());if(!n?.[1])return"#ffffff";let t=n[1].length===3?[...n[1]].map(a=>a+a).join(""):n[1],r=a=>{let s=Number.parseInt(t.slice(a*2,a*2+2),16)/255;return s<=.04045?s/12.92:((s+.055)/1.055)**2.4};return .2126*r(0)+.7152*r(1)+.0722*r(2)>.45?"#101012":"#ffffff"}function Jt(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 Nn(e,n,t){let r=Jt(e),o=Jt(n);return!r||!o?e:`#${r.map((s,c)=>Math.round(s+(o[c]-s)*t)).map(s=>s.toString(16).padStart(2,"0")).join("")}`}function cn(e,n){if(!Jt(e))return{};let t=Un(e),r=n?.trim();return{"--sc-ground":e,"--sc-shell":e,"--sc-sheet":Nn(e,t,.07),"--sc-raised":Nn(e,t,.13),"--sc-line":Nn(e,t,.18),"--sc-line-2":Nn(e,t,.28),"--sc-text":t,"--sc-text-2":Nn(t,e,.15),"--sc-muted":Nn(t,e,.38),...r?{"--sc-accent":r,"--sc-accent-fg":Un(r)}:{"--sc-accent":t,"--sc-accent-fg":e}}}function qe(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 Fn(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 un(e){return e.find(n=>n.state==="offline")??null}function Yt(e){return e.state==="busy"?{tone:"busy",text:`serving ${e.active} of ${e.capacity}`}:e.state==="online"?{tone:"ok",text:"connected"}:{tone:"off",text:"asleep or offline"}}function _(e){let n=e.label?.trim(),t=e.name?.trim();return n&&(!t||n!==t)?n:(t??n??"").replace(/\.(local|lan|home|internal)$/i,"").replace(/[-_]+/g," ").trim()||n||"This machine"}function kt(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 We(e){return[...e].sort(kt)[0]??null}function dn(e){return e?e.state==="busy"?{tone:"busy",word:"Serving"}:e.state==="online"?{tone:"ok",word:"Connected"}:{tone:"off",word:"Asleep"}:{tone:"off",word:"No compute"}}function Mn(e){let n=dn(e);return{label:e?n.word:"Connect compute",ariaLabel:e?`${n.word} on ${_(e)}`:"Connect compute",connected:e!==null,state:n}}function Qn(e){return e.state==="online"||e.state==="busy"}function Vn(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 jt(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=s=>s?e.runtimes.find(c=>c.id===s)??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(s=>s.id===e.preferred_runtime);if(r)return{by:"you",runtimeId:r.id,runtime:r};let o=s=>s.id==="claude-code"?0:s.id==="codex"?1:2,a=[...t].sort((s,c)=>o(s)-o(c))[0]??null;return{by:"default",runtimeId:a?.id??null,runtime:a}}var zt="soba";function Jn(){return`${zt}://show`}function Yn(e,n,t){let r=`${zt}://connect?url=${encodeURIComponent(e)}`;return n&&(r+=`&nonce=${encodeURIComponent(n)}`),t&&(r+=`&want=${encodeURIComponent(t)}`),r}function jn(){let e=globalThis.crypto;if(!e?.getRandomValues)return null;let n=e.getRandomValues(new Uint8Array(32)),t="";for(let r of n)t+=String.fromCharCode(r);return btoa(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}var As=1600;function qt(e={}){return Xt(e)}async function Zt(e,n={}){if(typeof window>"u"||typeof document>"u")return"unknown";let t=Xt(n);try{window.location.href=Yn(e,n.nonce,n.want)}catch{return"absent"}return t}async function zn(e={}){if(typeof window>"u"||typeof document>"u")return"unknown";let n=Xt(e);try{window.location.href=Jn()}catch{return"absent"}return n}async function Xt(e){if(typeof window>"u"||typeof document>"u")return"unknown";let n=e.graceMs??As,t=document.visibilityState==="visible"&&document.hasFocus(),r=!1,o=()=>{r=!0},a=()=>{document.visibilityState==="hidden"&&(r=!0)};return window.addEventListener("blur",o),window.addEventListener("pagehide",o),document.addEventListener("visibilitychange",a),await new Promise(s=>setTimeout(s,n)),window.removeEventListener("blur",o),window.removeEventListener("pagehide",o),document.removeEventListener("visibilitychange",a),t?r?"opened":"absent":"unknown"}var co={"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,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAARGVYSWZNTQAqAAAACAABh2kABAAAAAEAAAAaAAAAAAADoAEAAwAAAAEAAQAAoAIABAAAAAEAAABAoAMABAAAAAEAAABAAAAAAEZRQrAAAAHLaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT4xPC9leGlmOkNvbG9yU3BhY2U+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4yNTY8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MjU2PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CuYattQAAAr3SURBVHgB7VtrjFVXFf7O8z7mwWCnLYRYUh4NtWBLiq9agk+soZoW29S2f7RJI5r+8PWHHyY1tf6wmhgTjUqiP5o00tg2tY3agtpESiU1HQrCAMLADDMMMMM87517z3P7rTszMmXOOXMfZ3joLLJyz+xz9uP79tprr7XPAViQBQYWGFhg4P+YAW2+sCulDLYt7U9rPV0pVqqopmlBPQ3MVachAghyETtYS/0gdRV1KfU6ap5qU03qTCJ0/l2NhHxoGrwA96kudYJ6gdpPPU49SD1Acsb4W5fURQCBr2Rv26j3U+X6SsoJdv4i9VckQq7nT8Ssqd+knqdebSJj+hZVrC59YcNt1OepV7vIGNuqZaCqJTDV4E42urnahq/wc6+z/4e4JEbmGsecTongxaR2UK8V8IJZxrpjauzyd6zMSQBrPkF9ILaFq/eGjFnGniiJS4AM3szab1Nla0tfXO5qgcfNMgtYmfTbBwbZ6Ee4FLriGp/LY36DFVMGr+D2vgbv8IvQerqgDwfQ/cXQl9wO4+6t0FavixtrPeXtrCQYvhtXOdYCOPutrLSfKlaQioTeKIYOfg/u8VdgjWkwC1kYYxaMUQPGcAg9aIax5aswHnyM8WPs0Gody0lWuCMuWEqyAJmK5bX2Fvd8GJTQfXg7Sv27kTHb4Gd0WK4JyzZg8lo1azAKDP9+92vAC2E8+nhcU7WWCwaJVPdEVUxyglIp6X5Ue7Flp3p/i96hfShaN2LcaEHBbEHRbELJzsOxc3DtLEnJIGhqgvfCswj/8ffYtmq8IRgES6QkWcDqyBp1FI4UjuBo/yuksx0O0wNL15ERNTV4HEHWVshQQzekLwxgMur3nt2BzNo7gOaWOnqcVWXVrJKpgiQClsRVqq1c4cCZFzDo09RVC+Eb4KqvEJA1NOQtZjpWSPUR2AFC34fKWVB9vTB2/xnmfQ/W1l3005KkRUoSAal4/8HiSRwZOsxlvRhaaMMILRJgIqMZyOkaXOaKrhWgqUKARwLcitp5OsG/7ELz5i3MLSW5bEhisUQSwB1AXHDDvcqQD5zfgwFXJ/hWqCBTIcEiERkeF+Q1HQ4JcIwAnuXSClwElkNLKCPM2gjPDsDe3wH7ro83hJ6Vc4KJIin2eySSAD4hjkPy+Yak7Bfx7mAnCsFiBEETlJ+FRhLMMANbWSixmzJ7qBBgevBtB75fgs8dI5BfS8Hcuy8NAgSLYJp1qJJEQNy9qknpGj2B04USvGARfC9P06ZRBTkYPgkIbJRDg06RS0AL4RkutUxLIHABnyki10RfcLwXLYMXYLTHWnE14xEsNREgS4DG2Zh0DBzBqEvgQStBNXFWm2gBeUZ+WVi+DSc04XK10fDhaR4JcLgrELxdpM/ITur4MNo6T2DRxoYIECyRkVXSLEdWqJaSsl/GwcGzKPvvI/hpAponCQgYAdIC3MAkSG6FiruA5sPTuQQMEsDcwGNc4KksHHrJgUPdJODD1XYd9Vwslnkj4OTYOXSPEZTfBs9rqViAogUosQAhgI7Q5xLwAx2+Ujz04z9aQWDkuPapKlchwG2yofcWsJxLyWrORYGrpqwuAmTN1C37B85grJyveH+fBIj5TxKQg64yJMFGwJ3ApwUEoeJ1gIBWEOiMBo0MSaDSD3taFm5pHCO9Q7h+zbJ6xxOLJckC6u0MIWf0nbNDcL02mnwrwTfTAcrscwapIWdf4y4gBBj0AWGFgJCegIGQRmJ0WodBFQJISNk3cbprpBECYrHMCwHnJgo4doGujeYf+i1TM5+HCoUA5v2BRQJMeiWdJJAA7s4BSZukwKQlWAgNEsTfgIS4eRtdvS7W80GNwVOaMi8E/GtgBIMFuxL6hpx9cPuT2Vf07AJe0ftDMTiiBQgceQkw+SLA4K8BpZmV39Dgr27Bp0X0jLgYGXaw+Dq2kaLMCwH7+kZp/i0ESPASAAl4zrziuq+Ap/MLSUAYcmly9pkSMEESEljGEFnxJZCSX5IhfwsJrlvGqb5rgIAJP0BHfxl6SNMPGfj4XPP/Bc/ZlK3P19Ca1dHOIxeb6MvM/gaLwLinkDcVjYOMMEyeVCGCGaRhoLMnwPrYxLY+s0jdAo4SSe+IxP5NBD655iszL5GfZ2Bpq45HNujYtFrDDcx0ZfZdBqg9Q8CfDmn4w36FUsC1zlSZZlAhQawhYxk40h+iVFbIZVmekqROwFu9Rc5oDvJPzB70+IoeX8Df+X4DT92rY9klry1sjuIDTFhFhZjvv6phuMC1MYME8Pygrxig61yA25anN+zY/bEegn166b3dDre29655ieZuXaLjJ1tng7+0nw3LgR/ex/Qto8EJJExmxkgt0x8U6DzfOUliUpRUCTh2wcG/eRBtMoSV3B/c6oLAQAvP/J78vIHFVSbY6xjvPPFJZokSJlNdOktHgibdQEcPfQZP0tOSJAJkZ6pJ/tZVQtmxGOkRvGx19PYuTf+xjxlYU+P50hfo7DauAoqe5Ar0EyTCpyWcGtLQ2VezFcRiSSKgpl5KPMl9o8vlSQ8PPbjmwRnzfB1rl+r48p21Oy3ZCLZtApq47Qv4Cgl0iiUuizeO1DQ0mcTYCqkR8NZpBz0XuJ8zetM480KARHrbNmrgEV9dsvJ64Evr+VUEt0nJGcgxNwYN+7qAs6M1NVkzAVJh1ulJXJcSyr58iHs/Z16XEJfgHU/Hp27RsXFl7bM/s59HmQXfxKMAh6PxaAE++zpf1LDrUCymmdWnrwVLZIU4C5A1I5+lVCVvM05/ty/kSa/E+AazOx1tOQ1f38h4oDH8aKPjfPzuyrsS5gscVCU2AP54kN/K8EVKlSJYIv1AEgE0vLnF5aie6+DJHk97ZfYlxnc5+1/5qI4V8mYuBbnnNuATt9Ah8vxMLECQMNrG8/+MnNSoHgVL9QRMnZ7KB0lzyqudDg73K9hMYAR8mSfAd63Q8PCGBqd+Rs/iEL/9GeBGfpLlcC7FH0ik/DLfXB7om/Fg/OVE1ImwPB5nAXKPLi1ZOs/72NnhEfyk6bt8+bFskY7tm3XG+Ml1a70r0eP2eybTA9kRQrrYAuOBn+5WGJ57qmKxJBFwNmmQfaMhfr6nXDmz42tNuNzyWhm9PblFmxXqJrVTy71Nq4HvfJoWIA6RqtPBHDsP/Og1hWLygo3FkkTA8bjBDZcUfvFmGQPjfN1F0xeP38bs7ql7Ddy+LD3Tj+r/oQ0kgctBFrQkUSazqTdPaPjZX2VpRNWolMViSSLgAKtGNrn7qI9uRmQ6Pf6Eo2N1u4Fn7meyc1PsAFK98Qi3xqe/CLQy2ZSZZ56EXZ3A4TOR3QgGwRIp9FyxIpW6qTdf+oTk8osy3O9tHZ9bo+GB9Tqa5+ULl0t7vvj3Z2/lp6k3AL/ZOwm8nWcvsmVGiGCIJSDi+YtFfJ/2Y2qkjEwoNeFE3rrsheNlpRwvtttnLiKafZW4YNnkClbZR01pR589gHkuEe//IW6BJ+P6SfIBjOK0LlZ8Oq7yNVD+gyTwMv5EC5AHaAXiJ56jpvKlgrR5meT37OdhEiBhcKzMSYDUJAlyiLWTuln+vgbkdY6xqk9lq8YiJFD/5z6WrpoAeVCWA1U+SZdP0682kTHJp/w1BeFVLYFLWWInK1n2NepWqlxfSTnBzl+i/pLrXa5rkroImO6BRLTymqd3WEddReXB9mX/LzMHCby28yEOcloaImC6kajfKVOU9qc16rG5yiThryhBMvJfkAUGFhhYYGCBgVQZ+A9z7IHEloWjOAAAAABJRU5ErkJggg==",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 uo,useRef as bs}from"react";import{Fragment as Cs,jsx as Oe,jsxs as Kt}from"react/jsx-runtime";function qn({anchor:e,label:n,options:t,current:r,onClose:o,onPick:a}){let s=bs(null);return uo(()=>{let i=s.current,l=e.current;if(!i||!l)return;try{typeof i.showPopover=="function"&&i.showPopover()}catch{}let u=l.getBoundingClientRect();u.width>i.offsetWidth&&(i.style.width=`${Math.round(u.width)}px`);let m=i.offsetWidth,b=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,N=y+b>window.innerHeight-8&&u.top-6-b>8?u.top-6-b:y;i.style.left=`${Math.round(h)}px`,i.style.top=`${Math.round(N)}px`,i.querySelector('[aria-checked="true"]')?.focus()},[e]),uo(()=>{let i=l=>{let u=l.target;!u||s.current?.contains(u)||e.current?.contains(u)||o()};return document.addEventListener("pointerdown",i,!0),()=>document.removeEventListener("pointerdown",i,!0)},[e,o]),Oe("div",{ref:s,role:"menu","aria-label":n,className:"sc-menu",popover:"manual",onKeyDown:i=>{let l=[...s.current?.querySelectorAll("[role=menuitemradio]")??[]],u=l.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 m=i.key==="ArrowDown"?1:-1;l[(u+m+l.length)%l.length]?.focus()}else i.key==="Tab"&&o()},children:t.map(i=>Oe(ys,{option:i,checked:r===i.id,onClose:o,onPick:a},i.id??""))})}function ys({option:e,checked:n,onClose:t,onPick:r}){return Kt(Cs,{children:[e.heading?Oe("div",{className:"sc-menu-head",role:"presentation",children:e.heading}):e.rule?Oe("div",{className:"sc-menu-sep"}):null,Kt("button",{type:"button",role:"menuitemradio","aria-checked":n,className:"sc-menu-item",onClick:()=>n?t():r(e.id),children:[e.glyph,Kt("span",{className:"sc-menu-text",children:[Oe("span",{className:"sc-menu-label",children:e.label}),e.note&&Oe("span",{className:"sc-menu-note",children:e.note})]}),n&&Oe(ws,{})]})]})}function ws(){return Oe("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:"sc-menu-check",children:Oe("path",{d:"M5 12.5l4.5 4.5L19 7.5",fill:"none",stroke:"currentColor",strokeWidth:"2.2",strokeLinecap:"round",strokeLinejoin:"round"})})}function Sn({open:e}){return Oe("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e?"sc-chev sc-chev-open":"sc-chev",children:Oe("path",{d:"M9 6l6 6-6 6",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}import{useRef as ks,useState as Ns}from"react";var vs={haiku:"Haiku",sonnet:"Sonnet",opus:"Opus",fable:"Fable"};function pn(e){return vs[e]??e}function Zn(e){let n=[...e].sort(kt),t=We([...e]),r=t?He(t):null,a=[{id:"auto",kind:"auto",label:"Automatic",model:"auto",...r?.runtime?{note:r.runtime.default_model?`Uses ${pn(r.runtime.default_model)}`:`Uses ${r.runtime.display_name}`}:{}}];n.some(u=>Ne(u).some(m=>vt(m.id)))&&a.push({id:"small",kind:"size",label:"Fast",note:"quick and cheap",model:"small"},{id:"large",kind:"size",label:"Best",note:"the most capable",model:"large"});let c=new Map;for(let u of n)for(let m of Ne(u))for(let b of m.models){if(!b)continue;let g=`${m.id}/${b}`,h=c.get(g);if(h){h.machines.add(_(u));continue}c.set(g,{option:{id:g,kind:"named",label:pn(b),model:b,runtime:m.id,runtimeName:m.display_name,costClass:m.cost_class},machines:new Set([_(u)])})}let i=new Set;for(let{machines:u}of c.values())for(let m of u)i.add(m);let l=i.size>1;for(let{option:u,machines:m}of c.values()){let b=l&&m.size===1?[...m][0]:void 0;a.push(b?{...u,machine:b}:u)}return a}function Xn(e){let n=[],t=[];for(let r of e){if(r.kind!=="named"){n.push(r);continue}let o=r.runtimeName??r.runtime??"",a=t.find(s=>s.heading===o);a?a.options.push(r):t.push({heading:o,options:[r]})}return n.length?[{heading:null,options:n},...t]:t}function _t(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 $t(e){return e.runtime?{model:e.model,runtime:e.runtime}:{model:e.model}}function mn(e){return e.length>1}import{jsx as Nt,jsxs as po}from"react/jsx-runtime";function Kn({options:e,selected:n,onPick:t,caption:r,disabled:o,className:a}){let[s,c]=Ns(!1),i=ks(null);if(!mn(e))return null;let l=a?`sc-mp ${a}`:"sc-mp";return po("span",{className:l,children:[r&&Nt("span",{className:"sc-mp-cap",children:r}),po("button",{ref:i,type:"button",className:"sc-mp-btn","aria-haspopup":"menu","aria-expanded":s,"aria-label":`Model: ${n.label}. Change`,disabled:o,onClick:()=>c(u=>!u),children:[Nt("span",{className:"sc-mp-label",children:n.label}),Nt(Sn,{open:!0})]}),s&&Nt(qn,{anchor:i,label:"Which model answers",options:xs(e),current:n.id,onClose:()=>c(!1),onPick:u=>{c(!1),u&&t(u)}})]})}function xs(e){let n=[];for(let t of Xn(e))t.options.forEach((r,o)=>{let a=Ms(r);n.push({id:r.id,label:r.label,...a?{note:a}:{},...t.heading&&o===0?{heading:t.heading}:{},...!t.heading&&r.kind==="size"&&o===1?{rule:!0}:{}})});return n}function Ms(e){return e.kind!=="named"?e.note:e.machine?`on ${e.machine}`:void 0}import{jsx as xe,jsxs as Ps}from"react/jsx-runtime";function q({className:e}){return Ps("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e,children:[xe("path",{d:"M18.125 7.039A8.6 8.6 0 1 0 18.125 16.961A6 6 0 0 1 18.125 7.039Z",fill:"currentColor"}),xe("path",{d:"M19.925 7.039A8.6 8.6 0 0 1 19.925 16.961A6 6 0 0 0 19.925 7.039Z",fill:"currentColor"})]})}function mo({className:e}){return xe("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e,children:xe("path",{fill:"currentColor",d:"M17.3041 3.541h-3.6718l6.696 16.918H24Zm-10.6082 0L0 20.459h3.7442l1.3693-3.5527h7.0052l1.3693 3.5528h3.7442L10.5363 3.5409Zm-.3712 10.2232 2.2914-5.9456 2.2914 5.9456Z"})})}function hn({className:e}){return xe("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e,children:xe("path",{fill:"currentColor",d:"M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z"})})}function xt({className:e}){return xe("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e,children:xe("path",{d:"M4 5h16v11H4zM9 20h6M12 16v4",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function Ss({className:e}){return xe("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e,children:xe("path",{d:"M5 7l5 5-5 5M12 18h7",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function er({className:e}){return xe("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e,children:xe("path",{d:"M5 6h14v10H5zM2.5 19.5h19",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}var Ze={claude:mo,chatgpt:hn,local:xt},ho={shell:Ss};function go(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 Rs=3e3,Es=2*6e4,Mt=Date.now(),St=new Set,fo=!1;function Is(){if(fo||typeof window>"u")return;fo=!0;let e=()=>{let t=Mt;if(Mt=Date.now(),Mt-t>Es)for(let r of St)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 St)t()};window.addEventListener("focus",n),document.addEventListener("visibilitychange",n)}function Me(e,n,t={}){Is();let r,o=t.immediate===!1?Date.now():0,a=!1,s=!1,c=()=>{s||(r=setTimeout(i,t.idle===!1?n:go(n,Date.now()-Mt)))},i=async()=>{if(clearTimeout(r),!(s||a)){if(typeof document>"u"||!document.hidden){a=!0,o=Date.now();try{await e()}catch{}finally{a=!1}}c()}},l=()=>{Date.now()-o>Math.min(n,Rs)&&i()};return St.add(l),t.immediate===!1?c():i(),()=>{s=!0,clearTimeout(r),St.delete(l)}}var Ae=[{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"]}],Ao=["claude","chatgpt"];function nr(){return Ae.filter(e=>Ao.includes(e.id))}function tr(e){return Ae.filter(n=>n.costClass===e)}function rr(e){return Ae.find(n=>n.expects.includes(e))??null}import{Fragment as _n,jsx as d,jsxs as C}from"react/jsx-runtime";function fn({machines:e,hosted:n=[],onApproveRuntime:t,onPreferRuntime:r,onDisconnectHosted:o,onPair:a,onWake:s,onOpenApp:c,onRefresh:i,refreshing:l,busy:u,appName:m,model:b,onPickModel:g,error:h,runs:y,loadRuns:N,loading:P,machineMenu:R,machineNote:W,openApp:E=!0,children:I,onStopRun:O}){let k=We(e),U=e.filter(T=>T.id!==k?.id),[pe,ne]=Pt(null),[ae,Z]=Pt("no"),me=y===void 0&&!!N,Ye=me?pe:y??null,$=y!==void 0||!!N;Os(()=>{if(!me||!N)return;let T=!0,le=Me(async()=>{let Re=await N();T&&ne(Re)},3e3);return()=>{T=!1,le()}},[me,N]);let Se=(k?jt(k):[]).filter(T=>T.quarantined&&!T.absent),X=k?He(k).runtime:null,ie=X?.cost_class==="user-hardware"?X:null,z=ie?Xs(ie.default_model):null,Pe=!!k&&!Qn(k),he=(()=>{if(!k||Pe||!X||qe(X).tone!=="warn")return null;let le=_(k);return{title:`${X.display_name} is signed out`,detail:`Sign in on ${le} so Soba can start runs.`}})(),fe=!k||!Pe?null:k.pairing_lost?{title:"Not connected to Soba",detail:`Connect ${_(k)} to start receiving runs from your apps.`}:{title:"Soba is asleep",detail:"It is not taking new runs. Wake it to start receiving runs from your apps again."},V={label:ae==="going"?"Opening Soba\u2026":"Open Soba",onPress:()=>{c?.(),Z("going"),zn().then(T=>Z(T==="absent"?"absent":"no"))},spin:ae==="going"},J=k?Pe&&s?{label:"Wake Soba",onPress:s}:V:a?{label:"Connect to Soba",onPress:a}:null,te=k&&Pe&&s?V:null;return!k&&n.length===0&&!a?d("p",{className:"sc-note",children:"Nothing connected yet."}):C("div",{className:"sc-tray",children:[k&&C(De,{title:"This machine",action:(i||E||R)&&C("span",{className:"sc-cap-acts",children:[i&&d("button",{type:"button",className:"sc-disc",onClick:i,disabled:l,"aria-label":"Refresh",title:"Refresh",children:d(ea,{spinning:!!l})}),E&&d(Vs,{}),R]}),children:[d(Ts,{machine:k}),W]}),k&&d(De,{title:"Runs on",children:X?d(zs,{machine:k,appName:m,busy:u,...b?{model:b}:{},...g?{onPickModel:g}:{},...r?{onPick:T=>r(k.id,T)}:{}}):C("div",{className:"sc-blank",children:[d("span",{className:"sc-blank-mark","aria-hidden":"true",children:d(Ws,{})}),C("span",{className:"sc-blank-say",children:[d("span",{className:"sc-blank-title",children:P?"Looking\u2026":"No agent on this machine"}),d("span",{className:"sc-blank-body",children:P?"Reading what it can run.":"Install Claude Code, Codex or Ollama there and it will appear here."})]}),!P&&E&&C("a",{className:"sc-blank-act",href:Jn(),children:[d("span",{children:"Add agents"}),d(Co,{})]})]})}),k&&(he||z)&&C(De,{title:"Needs attention",children:[he&&C("div",{className:"sc-alarm",children:[d("span",{className:"sc-alarm-mark","aria-hidden":"true",children:d(yo,{})}),C("span",{className:"sc-alarm-say",children:[d("span",{className:"sc-alarm-title",children:he.title}),d("span",{className:"sc-alarm-body",children:he.detail})]})]}),z&&C("div",{className:"sc-alarm sc-alarm-warn",children:[d("span",{className:"sc-alarm-mark","aria-hidden":"true",children:d(yo,{})}),C("span",{className:"sc-alarm-say",children:[d("span",{className:"sc-alarm-title",children:"A large model on this computer"}),C("span",{className:"sc-alarm-body",children:["Your ",z," model can take all this computer's memory while it answers."]})]})]})]}),k&&fe&&d(De,{title:"Soba",children:C("div",{className:"sc-blank",children:[d("span",{className:"sc-blank-soba","aria-hidden":"true",children:d(q,{className:"sc-blank-soba-mark"})}),C("span",{className:"sc-blank-say",children:[d("span",{className:"sc-blank-title",children:fe.title}),d("span",{className:"sc-blank-body",children:fe.detail})]})]})}),k&&$&&!Pe&&d(Gs,{machine:k,runs:Ye,...O?{onStop:O}:{}}),k&&d(_n,{children:Se.length>0&&d(De,{title:"New on this machine",children:Se.map(T=>d(Ys,{runtime:T,...t?{onApprove:()=>t(k.id,T.id)}:{}},T.id))})}),n.length>0&&d(De,{title:n.length>1?"Connected plans":"Connected plan",children:n.map(T=>d(_s,{credential:T,appName:m,busy:u,...o?{onDisconnect:()=>o(T.provider)}:{}},T.provider))}),U.length>0&&d(De,{title:"Your other machines",children:U.map(T=>d(Js,{machine:T},T.id))}),!k&&a&&d(De,{title:"Your machines",children:C("button",{type:"button",className:"sc-pair",onClick:a,children:[d("span",{className:"sc-otile","aria-hidden":"true",children:d($s,{})}),d("span",{className:"sc-oname",children:"Connect a machine"})]})}),(J||te)&&C("div",{className:"sc-acts",children:[J&&C("button",{type:"button",className:"sc-act-go",onClick:J.onPress,disabled:u||J.spin,"data-spin":J.spin?"true":void 0,children:[J.spin&&d(wo,{}),J.label]}),te&&C("button",{type:"button",className:"sc-act-quiet",onClick:te.onPress,disabled:u||te.spin,"data-spin":te.spin?"true":void 0,children:[te.spin&&d(wo,{}),te.label]}),ae==="absent"&&C("p",{className:"sc-act-miss",children:["Nothing opened here. ",k?_(k):"That machine"," may be a different computer, or the Soba app is not installed on this one."]})]}),I,h&&d("p",{className:"sc-error sc-tray-error",children:h})]})}function De({title:e,action:n,children:t}){return C("section",{className:"sc-group",children:[C("div",{className:"sc-group-cap",children:[d("p",{className:"sc-group-title",children:e}),n]}),d("div",{className:"sc-group-card",children:t})]})}function Ts({machine:e,onToggle:n,open:t}){let r=Qn(e),o=[r?null:e.pairing_lost?"Not connected to Soba":"Soba is asleep",r?Fn(e):null,e.always_on?"always on":null].filter(Boolean),a=r&&e.capacity>0?e.active>0?`${e.active} of ${e.capacity} running`:null:Vn(e.last_seen_at),s=C(_n,{children:[C("span",{className:"sc-mtile","aria-hidden":"true",children:[d(vo,{}),d("span",{className:`sc-mbadge sc-mbadge-${r?dn(e).tone:e.pairing_lost?"off":"away"}`})]}),C("span",{className:"sc-mid",children:[d("span",{className:"sc-mname",children:_(e)}),C("span",{className:"sc-mmeta",children:[d("span",{className:"sc-mmeta-is",children:o.map((c,i)=>C("span",{children:[i>0&&d("span",{className:"sc-mmeta-sep",children:"\xB7"}),c]},c))}),a&&d("span",{className:"sc-mmeta-now",children:a})]})]})]});return!n||!r?d("div",{className:"sc-mrow",children:s}):C("button",{type:"button",className:"sc-mrow sc-mrow-btn",onClick:n,"aria-expanded":!!t,title:t?"Hide what it is running":"See what it is running",children:[s,d(Sn,{open:!!t})]})}function Bs(e,n){return e.filter(t=>t.machine_id===n.id||t.machine_id===null)}function Gs({machine:e,runs:n,onStop:t}){let r=n?Bs(n,e):[],[o,a]=Pt(new Set),s=async i=>{a(l=>new Set(l).add(i));try{await t?.(i)}catch{a(l=>{let u=new Set(l);return u.delete(i),u})}},c=()=>{for(let i of r)s(i.id)};return d(De,{title:"Active runs",...t&&r.length>1?{action:d("button",{type:"button",className:"sc-cap-link",onClick:c,children:"Stop all"})}:{},children:n===null?d("p",{className:"sc-row-note",children:"Looking\u2026"}):r.length===0?C("p",{className:"sc-nilrow",children:[d("span",{className:"sc-nilrow-mark","aria-hidden":"true",children:d(Hs,{})}),"Nothing running"]}):r.map(i=>d(Ds,{run:i,stopping:o.has(i.id),...t?{onStop:()=>void s(i.id)}:{}},i.id))})}function Ws(){return C("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 Hs(){return C("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 Ds({run:e,stopping:n,onStop:t}){return C("div",{className:"sc-rrow",children:[d("span",{className:n?"sc-rdot":"sc-rdot sc-rdot-live","aria-hidden":"true"}),C("span",{className:"sc-mid",children:[d("span",{className:"sc-rtitle",children:bo(e)}),d("span",{className:"sc-rstep",children:n?"Stopping\u2026":`${Fs(e)} \xB7 ${Qs(e.started_at)}`})]}),t&&d("button",{type:"button",className:"sc-rstop",onClick:t,disabled:n,"aria-label":`Stop ${bo(e)}`,children:d("span",{className:"sc-rstop-ring",children:d(na,{})})})]})}function Us(e){let n=rr(e);return(n?Ze[n.id]:null)??ho[e]??null}function bo(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 Fs(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 Qs(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 Vs(){return d("a",{className:"sc-disc sc-open-app",href:Jn(),"aria-label":"Open Soba App",title:"Open Soba App",children:d(Co,{})})}function Co(){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 Js({machine:e}){let n=dn(e);return C("div",{className:"sc-orow",children:[d("span",{className:"sc-otile","aria-hidden":"true",children:d(vo,{})}),d("span",{className:"sc-oname",children:_(e)}),d("span",{className:"sc-oword",children:n.word}),d("span",{className:`sc-dot sc-dot-${n.tone}`,"aria-hidden":"true"})]})}function Ys({runtime:e,onApprove:n}){return C("div",{className:"sc-mrow",children:[d("span",{className:"sc-mtile sc-atile","aria-hidden":"true",children:d(Rt,{id:e.id,name:e.display_name})}),C("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 js({id:e,name:n}){return d("span",{className:"sc-runtime-tile","aria-hidden":"true",children:d(Rt,{id:e,...n?{name:n}:{}})})}function Rt({id:e,name:n}){if(!e)return null;let t=co[e];if(t)return d("img",{src:t,alt:"",className:"sc-runtime-logo"});let r=Us(e);return r?d(r,{className:"sc-runtime-mark"}):n?d("span",{className:"sc-runtime-letter",children:n.slice(0,1).toUpperCase()}):null}function zs({machine:e,appName:n,busy:t,onPick:r,model:o,onPickModel:a}){let s=He(e),c=Ne(e),[i,l]=Pt(!1),u=Ls(null);if(s.by!=="app"&&c.length===0)return null;let m=E=>E?d(js,{id:E.id,name:E.display_name}):null,b=s.runtime?.display_name??s.runtimeId??"\u2014",g=s.by!=="app"&&!!r&&c.length>=2,h=s.runtime?.id??s.runtimeId,y=!Qn(e),N=s.runtime&&qe(s.runtime).tone==="warn"?"Signed out":null,P=o?Zn([e]).filter(E=>E.kind==="named"?E.runtime===h:E.kind==="size"?!!h&&vt(h):!0):[],R=(()=>{if(!o)return;if(o.kind!=="auto")return o;let E=s.runtime?.default_model;if(!E)return o;let I=pn(E);return{...o,label:I.length>16?I:`${o.label} \xB7 ${I}`}})(),W=s.by==="app"?`Set by ${n??"the app"}`:s.runtime?Zs(s.runtime):null;return C(_n,{children:[g?C("button",{ref:u,type:"button",className:y?"sc-runs-agent sc-runs-dim":"sc-runs-agent","aria-haspopup":"menu","aria-expanded":i,"aria-label":`Runs go to ${b}. Change`,disabled:t,onClick:()=>l(E=>!E),children:[d("span",{className:"sc-runs-tile","aria-hidden":"true",children:d(Rt,{id:h??null,name:b})}),C("span",{className:"sc-runs-said-name",children:[d("span",{className:"sc-runs-name",children:b}),N&&d("span",{className:"sc-runs-ill",children:N})]}),d(Sn,{open:!1})]}):C("span",{className:y?"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(Rt,{id:h??null,name:b})}),C("span",{className:"sc-runs-said-name",children:[d("span",{className:"sc-runs-name",children:b}),N&&d("span",{className:"sc-runs-ill",children:N})]}),s.by==="app"&&C("span",{className:"sc-runs-told",children:["set by ",n??"the app"]})]}),R&&a&&mn(P)?C(_n,{children:[d("span",{className:"sc-runs-rule","aria-hidden":"true"}),d(Kn,{options:P,selected:R,onPick:a,caption:"Model",className:y?"sc-runs-model sc-runs-dim":"sc-runs-model",...t?{disabled:t}:{}})]}):W&&C(_n,{children:[d("span",{className:"sc-runs-rule","aria-hidden":"true"}),C("span",{className:"sc-runs-said",children:[d("span",{className:"sc-runs-key",children:"Model"}),d("span",{className:"sc-runs-val",children:W})]})]}),i&&r&&d(qs,{anchor:u,machine:e,tile:m,onClose:()=>l(!1),onPick:E=>{l(!1),r(E)}})]})}function qs({anchor:e,machine:n,tile:t,onClose:r,onPick:o}){let a=He(n),s=He({...n,preferred_runtime:null}).runtime,c=a.by==="you"?a.runtimeId:null,i=[{id:null,label:"Automatic",...s?{note:`Uses ${s.display_name}`}:{},glyph:t(s)},...Ne(n).map((l,u)=>{let m=Ks(l);return{id:l.id,label:l.display_name,glyph:t(l),...m?{note:m}:{},...u===0?{rule:!0}:{}}})];return d(qn,{anchor:e,label:"Which agent runs go to",options:i,current:c,onClose:r,onPick:o})}function Zs(e){let n=qe(e);return n.tone==="warn"?n.text:e.default_model?pn(e.default_model):e.version??void 0}function Xs(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 Ks(e){let n=qe(e);return n.tone==="warn"?n.text:e.default_model?pn(e.default_model):e.cost_class==="user-hardware"?"In this machine's memory":n.tone!=="ok"?n.text:e.version??void 0}function _s({credential:e,appName:n,busy:t,onDisconnect:r}){return C("div",{className:"sc-hrow",children:[C("div",{className:"sc-orow",children:[d("span",{className:"sc-otile","aria-hidden":"true",children:d(hn,{className:"sc-omark"})}),C("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&&C("p",{className:"sc-row-note",children:[n??"This app"," stops using it. To withdraw the grant entirely, remove it in your OpenAI settings."]})]})}function vo(){return C("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 $s(){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 yo(){return C("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 wo(){return C("svg",{className:"sc-act-glyph sc-spin",viewBox:"0 0 16 16","aria-hidden":"true",focusable:"false",children:[d("circle",{cx:"8",cy:"8",r:"6.2",fill:"none",stroke:"currentColor",strokeWidth:"2",opacity:"0.3"}),d("path",{d:"M8 1.8a6.2 6.2 0 0 1 6.2 6.2",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"})]})}function ea({spinning:e}){return d("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",className:e?"sc-dglyph sc-spin":"sc-dglyph",children:d("path",{d:"M21 12a9 9 0 1 1-2.64-6.36M21 3v6h-6",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function na(){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 ta}from"react/jsx-runtime";function $n({machines:e,onApproveRuntime:n,model:t,onPickModel:r}){return ta(fn,{machines:e,...n?{onApproveRuntime:n}:{},...t?{model:t}:{},...r?{onPickModel:r}:{}})}var or={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 sr="105 162 420 420",ar="M407.1 308.9 A158 158 0 1 0 407.1 491.1 A116 116 0 0 1 407.1 308.9 Z",gn="M448.5 320 A110 110 0 0 1 448.5 480";import{Fragment as nt,jsx as S,jsxs as Xe}from"react/jsx-runtime";function ir({kind:e,size:n=44,className:t}){let r=or[e];return Xe("svg",{className:`bx${t?` ${t}`:""}`,"data-expression":e,viewBox:sr,overflow:"visible",width:n,height:n,"aria-hidden":"true",children:[S("path",{d:ar,fill:"currentColor"}),S("path",{className:"bx-arc",d:gn,fill:"none",stroke:"currentColor",strokeWidth:17,strokeLinecap:"round"}),r.slot==="stream"&&S(ra,{}),r.slot==="zzz"&&S(oa,{}),r.slot==="dots"&&S(sa,{}),r.slot==="bang"&&S(aa,{}),r.slot==="orbit"&&S(ia,{}),r.slot==="cross"&&S(la,{}),r.slot==="snap"&&S(ca,{}),r.slot==="bars"&&S(ua,{}),r.slot==="ring"&&S(da,{}),r.slot==="sparks"&&S(pa,{})]})}function ra(){return S("path",{className:"bx-st",d:"M475.3 290.3 A150 150 0 0 1 475.3 509.7",fill:"none",stroke:"currentColor",strokeWidth:"15",strokeLinecap:"round",strokeDasharray:"0.1 31"})}function oa(){return Xe(nt,{children:[S("g",{className:"bx-z1",children:S("path",{d:"M444 372 H496 L444 436 H496",fill:"none",stroke:"currentColor",strokeWidth:"20",strokeLinecap:"round",strokeLinejoin:"round"})}),S("g",{className:"bx-z2",children:S("path",{d:"M492 300 H522 L492 338 H522",fill:"none",stroke:"currentColor",strokeWidth:"15",strokeLinecap:"round",strokeLinejoin:"round"})})]})}function sa(){return Xe(nt,{children:[S("circle",{className:"bx-th",cx:"463.1",cy:"336.9",r:"21",fill:"currentColor"}),S("circle",{className:"bx-th bx-th2",cx:"483",cy:"400",r:"21",fill:"currentColor"}),S("circle",{className:"bx-th bx-th3",cx:"463.1",cy:"463.1",r:"21",fill:"currentColor"})]})}function aa(){return Xe("g",{className:"bx-at",children:[S("line",{x1:"490",y1:"312",x2:"490",y2:"414",stroke:"currentColor",strokeWidth:"46",strokeLinecap:"round"}),S("circle",{cx:"490",cy:"484",r:"28",fill:"currentColor"})]})}function ia(){return Xe("g",{className:"bx-ob",children:[S("path",{d:gn,fill:"none",stroke:"var(--tile-bg, transparent)",strokeWidth:41,strokeLinecap:"round"}),S("path",{d:gn,fill:"none",stroke:"currentColor",strokeWidth:17,strokeLinecap:"round"})]})}function la(){return Xe(nt,{children:[S("path",{className:"bx-xa",d:gn,fill:"none",stroke:"currentColor",strokeWidth:17,strokeLinecap:"round"}),S("g",{className:"bx-xx",children:S("path",{d:"M442 364 L514 436 M514 364 L442 436",fill:"none",stroke:"currentColor",strokeWidth:"24",strokeLinecap:"round"})})]})}function ca(){return S("path",{className:"bx-snap",d:gn,fill:"none",stroke:"currentColor",strokeWidth:17,strokeLinecap:"round"})}function ua(){return Xe("g",{stroke:"currentColor",strokeWidth:"17",strokeLinecap:"round",children:[S("line",{className:"bx-vb",x1:"452",y1:"370",x2:"452",y2:"430"}),S("line",{className:"bx-vb bx-vb2",x1:"482",y1:"330",x2:"482",y2:"470"}),S("line",{className:"bx-vb bx-vb3",x1:"512",y1:"355",x2:"512",y2:"445"})]})}function da(){return S(nt,{children:[[450,366],[474,376],[484,400],[474,424],[450,434],[426,424],[416,400],[426,376]].map(([n,t],r)=>S("circle",{className:"bx-w",cx:n,cy:t,r:"11",fill:"currentColor",style:{animationDelay:`${-1.2+r*.15}s`}},r))})}function pa(){return Xe(nt,{children:[S("g",{className:"bx-sp",children:S("path",{d:"M460 300 Q465.4 324.6 490 330 Q465.4 335.4 460 360 Q454.6 335.4 430 330 Q454.6 324.6 460 300 Z",fill:"currentColor"})}),S("g",{className:"bx-sp bx-sp2",children:S("path",{d:"M486 356 Q493.92 392.08 530 400 Q493.92 407.92 486 444 Q478.08 407.92 442 400 Q478.08 392.08 486 356 Z",fill:"currentColor"})}),S("g",{className:"bx-sp bx-sp3",children:S("path",{d:"M460 440 Q465.4 464.6 490 470 Q465.4 475.4 460 500 Q454.6 475.4 430 470 Q454.6 464.6 460 440 Z",fill:"currentColor"})})]})}import{useCallback as de,useEffect as be,useId as ga,useMemo as Ke,useRef as Pn,useState as j}from"react";var tt=[{slug:"mac-arm",label:"macOS, Apple silicon"},{slug:"mac-intel",label:"macOS, Intel"},{slug:"windows",label:"Windows"},{slug:"linux",label:"Linux"}];function rt(e){if(!e)return"";try{return new URL(e).origin}catch{return""}}var No="soba.connect.choice",ma=180*24*60*60*1e3;function lr(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 cr(e,n){return e?n?`${No}.${e}.${lr(n)}`:`${No}.${e}`:null}function ur(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=Ae.find(o=>o.id===t.choice);return r?r.id:null}catch{return null}}function dr(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 pr(e,n){return e?n?`${xo}.${e}.${lr(n)}`:`${xo}.${e}`:null}function Et(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 mr(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",fa=30*24*60*60*1e3;function hr(e,n){return e?n?`${Mo}.${e}.${lr(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)<fa}catch{return!1}}function gr(e){if(!(!e||typeof localStorage>"u"))try{localStorage.setItem(e,JSON.stringify({at:new Date().toISOString()}))}catch{}}import{Fragment as Lt,jsx as p,jsxs as M}from"react/jsx-runtime";var Ar=2e3,Aa=1e4,ba=9e4,ya=6e4;function br(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 Cr({client:e,initialCode:n,initialChoice:t,onConnected:r,showStatus:o=!0,initialContext:a=null,initialMachines:s,onClose:c,headingId:i,theme:l,reason:u,active:m=!0}){let b=!!a&&s!==void 0,[g,h]=j(b?br(n,o,s??[],[],t):"loading"),[y,N]=j(a),[P,R]=j(s??[]),[W,E]=j(n??""),[I,O]=j(null),[k,U]=j(null),[pe,ne]=j(!1),[ae,Z]=j(0),[me,Ye]=j(()=>Date.now()),[$,ye]=j(null),[Se,X]=j(!1),[ie,z]=j(!1),[Pe,he]=j("browser"),[fe,nn]=j(null),[V,J]=j([]),[te,T]=j(0),[le,Re]=j(null),ce=Pn(null),[L,B]=j(t??null),[x,tn]=j(null),je=Ke(()=>{let f=y?.accent?.trim(),v=y?.background?.trim();if(!(!f&&!v))return v?{...cn(v,f),background:v,borderRadius:"inherit"}:{"--sc-accent":f,"--sc-accent-fg":Un(f)}},[y?.accent,y?.background]),we=ga(),ue=i??we,ze=Pn(null);be(()=>{if(!e||b)return;let f=!0;return Promise.all([e.context(),e.machines()]).then(([v,F])=>{f&&(N(v),R(F),h(br(n,o,F)))}).catch(v=>{f&&(U(v.message),h("choose"))}),()=>{f=!1}},[e,n,o,b]),be(()=>{g!=="loading"||!b||h(br(n,o,s??[]))},[g,b,n,o,s]),be(()=>{s&&R(s)},[s]),be(()=>{a&&N(a)},[a]);let Cn=Pn(!1),vn=Pn(g);vn.current=g;let rn=Pn(V);rn.current=V;let on=!!y?.hosted_available;be(()=>{!o&&vn.current==="manage"&&h("choose")},[o]),be(()=>{if(!e||!m||g!=="manage")return;let f=!0,v=Me(async()=>{try{let F=await e.machines();if(!f)return;R(F);let Y=!on||Cn.current;F.length===0&&rn.current.length===0&&Y&&vn.current==="manage"&&h("choose")}catch{}},Aa,{immediate:!1});return()=>{f=!1,v()}},[g,e,on,m]);let sn=cr(y?.publishable_key??null);be(()=>{tn(ur(sn))},[sn]),be(()=>{if(!e||!on)return;let f=!0;return e.hosted().then(v=>{f&&(J(v.credentials),!Cn.current&&(Cn.current=!0,v.credentials.length>0&&o&&vn.current==="choose"&&h("manage")))}).catch(()=>{}),()=>{f=!1}},[e,on,o]),be(()=>{if(!e||!m||g!=="hosted")return;let f=!0,v=async()=>{try{let Ge=await e.hosted();if(!f)return!1;if(J(Ge.credentials),Ge.credentials.length>0)return h("hosted_connected"),Re(null),!0}catch{}return!1},F=async()=>{ce.current?.closed&&(ce.current=null,!await v()&&f&&h("choose"))},Y=Me(v,Ar,{immediate:!1}),ln=setInterval(F,400),Ie=Ge=>{let Hn=Ge.data;Hn?.source==="soba"&&Hn.type==="hosted_result"&&v()};return window.addEventListener("message",Ie),()=>{f=!1,Y(),clearInterval(ln),window.removeEventListener("message",Ie),ce.current=null}},[e,g,m]);let Ut=de(()=>{if(!e)return;let f=window.open("","soba-connect-plan","width=520,height=760,noopener=no");ce.current=f,h("hosted"),T(Date.now()),Re(null),U(null),e.startHosted().then(({url:v})=>{if(f&&!f.closed){f.location.href=v;return}Re(v)}).catch(v=>{f?.close(),ce.current=null,U(v.message),h("choose")})},[e]),gt=de(async f=>{if(e){ne(!0);try{await e.disconnectHosted(f),J((await e.hosted()).credentials)}catch(v){U(v.message)}finally{ne(!1)}}},[e]);be(()=>{if(!e||!m||g!=="waiting")return;let f=!0,v=Me(async()=>{try{let F=await e.machines();if(!f)return;R(F);let Y=ze.current;if(!Y)return;let ln=F.filter(Ge=>!Y.has(Ge.id)),Ie=ln.find(Ge=>Ge.state!=="offline")??ln[0];if(Ie){nn(Ie.id),L&&dr(sn,L);let Ge=Ae.find(Vt=>Vt.id===L)?.expects??[],Hn=Ne(Ie).find(Vt=>Ge.includes(Vt.id));Hn&&e.preferRuntime(Ie.id,Hn.id).catch(()=>{}),h("connected"),r?.(F)}}catch{}},Ar,{immediate:!1});return()=>{f=!1,v()}},[g,e,r,L,sn,m]);let At=de(async()=>{if(e){U(null),ne(!0);try{let f=await e.lookup(W);O(f),h("confirm")}catch(f){U(f.message)}finally{ne(!1)}}},[e,W]),kn=de(async()=>{if(e){U(null),ne(!0);try{try{ze.current=new Set((await e.machines()).map(f=>f.id))}catch{ze.current=new Set(P.map(f=>f.id))}await e.approve(W),h("waiting"),Z(Date.now())}catch(f){U(f.message)}finally{ne(!1)}}},[e,W,P]),bt=de(async()=>{if(e){ne(!0);try{await e.deny(W),he("browser"),h("denied")}catch(f){U(f.message)}finally{ne(!1)}}},[e,W]),K=Ke(()=>y?.connect_url??null,[y]),[Be,Ce]=j(()=>jn()),an=Ke(()=>K?Yn(K,Be??void 0,L??void 0):null,[K,Be,L]),yt=Ke(()=>rt(K),[K]),Ft=de(f=>{if(P.length===0)return null;let v=Ae.find(Y=>Y.id===f);if(!v)return null;let F=P.flatMap(Y=>Y.runtimes??[]).filter(Y=>v.expects.includes(Y.id));return F.length===0?{tone:"dim",text:"not installed"}:F.some(Y=>Y.authenticated===!0)?{tone:"ok",text:"ready"}:F.every(Y=>Y.authenticated===!1)?{tone:"warn",text:"needs signing in"}:{tone:"dim",text:"installed"}},[P]),w=de((f=null)=>{B(f),U(null),ye(null),X(!1),z(!1),ee.current=!1,Ce(jn()),h("launch")},[]),ee=Pn(!!t);be(()=>{g!=="launch"||!K||ee.current||(ee.current=!0,X(!0),Zt(K,{...Be?{nonce:Be}:{},...L?{want:L}:{}}).then(ye))},[g,K,Be,L]);let ge=de(()=>{X(!0),qt().then(ye)},[]),wt=de(f=>{if(ie){let v=jn();z(!1),Ce(v),K&&(f.preventDefault(),window.location.href=Yn(K,v??void 0,L??void 0))}ge()},[ie,ge,K,L]),ve=Ke(()=>{let f=y?.runtimes;return f?Ae.filter(v=>f.includes(v.id)):nr()},[y?.runtimes]),Ee=Ke(()=>{let f=Ae.find(v=>v.id===L);return f?{choice:f,Mark:Ze[f.id]??null}:null},[L]),Qe=Ke(()=>P.find(f=>f.id===fe),[P,fe]);be(()=>{let f=Be;if(!e||!m||g!=="launch"||!f)return;let v=!1,F=Date.now()+15e4,Y=()=>{};return Y=Me(async()=>{if(Date.now()>F){Y(),z(!0);return}try{let ln=await e.claim(f);if(v)return;if(ln.declined){Y(),ye(null),he("machine"),h("denied");return}if(!ln.claimed)return;Y();try{ze.current=new Set((await e.machines()).map(Ie=>Ie.id))}catch{ze.current=new Set(P.map(Ie=>Ie.id))}h("waiting"),Z(Date.now())}catch{}},Ar,{immediate:!1,idle:!1}),()=>{v=!0,Y()}},[e,g,P,Be,m]);let ke=Ke(()=>{if(!I)return null;if(I.approved||I.denied)return"answered";let f=I.expires_at?Date.parse(I.expires_at):Number.NaN;return Number.isFinite(f)&&f<=me?"expired":"live"},[I,me]);be(()=>{if(!(g==="confirm"&&ke==="live"||g==="waiting"||g==="hosted"))return;let v=setInterval(()=>Ye(Date.now()),1e3);return()=>clearInterval(v)},[g,ke]);let Ct=de(async(f,v)=>{if(e)try{await e.approveRuntime(f,v),R(await e.machines())}catch(F){U(F.message)}},[e]),Qt=de(async(f,v)=>{if(e)try{await e.preferRuntime(f,v),R(await e.machines())}catch(F){U(F.message)}},[e]);return g==="loading"?p("div",{className:"soba-connect",...l?{"data-theme":l}:{},style:je,children:p("div",{className:"sc-card",children:p("p",{className:"sc-note",children:"Loading\u2026"})})}):M("div",{className:"soba-connect",...l?{"data-theme":l}:{},style:je,children:[c&&p("button",{type:"button",className:"sc-modal-close",onClick:c,"aria-label":"Close",children:"\xD7"}),g==="manage"&&M("div",{className:"sc-card",children:[p("h2",{className:"sc-title",id:ue,children:"Your compute"}),M("p",{className:"sc-sub",children:[p(It,{context:y})," ",P.length>0&&V.length>0?"runs on your connected plan, and on these machines while they are awake.":V.length>0?"runs on the plan you connected. Nothing here is charged to you.":"runs on these machines, while they are awake."]}),p(fn,{machines:P,hosted:V,onApproveRuntime:Ct,onPreferRuntime:(f,v)=>void Qt(f,v),onDisconnectHosted:f=>void gt(f),onPair:()=>h("choose"),busy:pe,...y?.app.name?{appName:y.app.name}:{}}),k&&p("p",{className:"sc-error",children:k})]}),g==="choose"&&M("div",{className:"sc-card",children:[p(va,{context:y}),p("h2",{className:"sc-h",id:ue,children:u==="payment_required"?"Carry on with your own AI":u==="no_compute"?"This run needs a machine":"Connect your AI"}),p("p",{className:"sc-p",children:"Use compute you already have."}),K&&ve.length>0&&M(Lt,{children:[p("div",{className:"sc-opts",children:ve.map(f=>{let v=Ze[f.id];return M("button",{type:"button",className:"sc-opt",onClick:()=>w(f.id),children:[p("span",{className:"sc-opt-tile","aria-hidden":"true",children:v&&p(v,{className:"sc-opt-mark"})}),p("span",{className:"sc-opt-text",children:p("span",{className:"sc-opt-label",children:f.label})}),(()=>{let F=Ft(f.id);return F?p("span",{className:`sc-opt-has sc-opt-has-${F.tone}`,children:F.text}):x===f.id?p("span",{className:"sc-opt-last",children:"last used"}):p(yr,{className:"sc-opt-go"})})()]},f.id)})}),M("p",{className:"sc-opt-note",children:["Your accounts stay there. ",So(y)," never sees them."]})]}),(!K||ve.length===0)&&p("p",{className:"sc-error",style:{marginTop:16},children:"This app has no publishable key yet, so there is nothing to pair against."}),k&&p("p",{className:"sc-error",children:k}),K&&y?.show_code===!0&&p("div",{className:"sc-opt-alt",children:p("button",{type:"button",className:"sc-alt-link",onClick:()=>h("code"),children:"I have a code"})})]}),g==="launch"&&M("div",{className:"sc-card",children:[M("div",{className:"sc-head",children:[p(Rn,{onClick:()=>h("choose")}),p("p",{className:"sc-head-title",children:"Soba App"})]}),p(Ot,{mark:Ee?.Mark??q,still:ie||!Se&&$===null}),p("h2",{className:"sc-h",id:ue,children:ie?"No answer from this machine":$==="absent"?"Nothing opened":$===null?"Opening Soba App\u2026":"Approve it on this machine"}),ie?p("p",{className:"sc-p",children:"The Soba app did not answer. It may not be open, or nobody was there. Try again when you are ready."}):$==="absent"?p("p",{className:"sc-p",children:"Nothing opened on this machine. Open it yourself below, or install it if it is not here yet."}):p("p",{className:"sc-p",children:$===null?"Approve it there and this page does the rest.":"This page finishes on its own."}),Ee&&M("p",{className:"sc-prereq",children:[Ee.Mark&&p(Ee.Mark,{className:"sc-rt-mark"}),"Needs ",Ee.choice.prerequisite]}),M("div",{className:"sc-stack",style:{marginTop:18},children:[p("a",{className:$==="absent"||ie?"sc-btn sc-btn-primary":"sc-btn",href:an??"#",onClick:wt,children:ie?"Try again":$==="absent"?"Open Soba App":"Open it again"}),p("p",{className:"sc-note",children:$===null?"Your browser will ask permission first.":"Your browser asks permission the first time."}),Ee&&$==="absent"&&p("p",{className:"sc-note",children:p(ka,{text:Ee.choice.hint})}),M("div",{className:"sc-foot-strip",children:[p("span",{children:"Not installed on this machine?"}),M("button",{type:"button",className:"sc-foot-go",onClick:()=>h("get"),children:["Get it",p(yr,{})]})]})]})]}),g==="get"&&M("div",{className:"sc-card",children:[M("div",{className:"sc-head",children:[p(Rn,{onClick:()=>h("launch")}),p("p",{className:"sc-head-title",children:"Get Soba App"})]}),p("div",{className:"sc-opts",children:tt.map(f=>M("a",{className:"sc-opt",href:`${yt}/download/${f.slug}`,target:"_blank",rel:"noreferrer noopener",children:[p("span",{className:"sc-opt-tile","aria-hidden":"true",children:p(er,{className:"sc-opt-mark"})}),p("span",{className:"sc-opt-text",children:p("span",{className:"sc-opt-label",children:f.label})}),p(yr,{className:"sc-opt-go"})]},f.slug))}),p("p",{className:"sc-opt-note",children:"Install it, then come back here and press the row you started with."})]}),g==="code"&&M("div",{className:"sc-card",children:[M("div",{className:"sc-head",children:[p(Rn,{onClick:()=>h("choose")}),p("p",{className:"sc-head-title",children:"Soba App"})]}),p("h2",{className:"sc-h",id:ue,children:"Enter the code from that machine"}),p("p",{className:"sc-p",children:"Eight characters, shown by the Soba app once you paste the link."}),M("form",{className:"sc-stack",style:{marginTop:16},onSubmit:f=>{f.preventDefault(),At()},children:[p("input",{className:"sc-input",value:W,onChange:f=>E(f.target.value),placeholder:"ACDE-F234",autoComplete:"off",autoFocus:!0,"aria-label":"Pairing code"}),k&&p("p",{className:"sc-error",children:k}),p("button",{type:"submit",className:"sc-btn sc-btn-primary",disabled:pe||W.length<8,children:pe?"Checking\u2026":"Continue"})]})]}),g==="confirm"&&I&&M("div",{className:"sc-card",children:[M("div",{className:"sc-head",children:[p(Rn,{onClick:()=>h("code")}),p("p",{className:"sc-head-title",children:"Soba App"})]}),p("h2",{className:"sc-title",children:"Attach this machine to your account?"}),M("p",{className:"sc-sub",children:[p(It,{context:y})," may send your runs to it once you approve. It can never see the account or the keys on it."]}),M("ul",{className:"sc-facts",children:[p(ot,{k:"Code",v:I.user_code}),p(ot,{k:"Machine",v:I.hostname??"not stated"}),p(ot,{k:"System",v:[I.platform,I.arch].filter(Boolean).join(" / ")||"not stated"}),p(ot,{k:"Asked by",v:I.client??"not stated"}),I.labels.length>0&&p(ot,{k:"Labels",v:I.labels.join(", ")})]}),p("p",{className:"sc-note",style:{marginTop:12},children:"Every line above is what that machine said about itself. If none of it looks like a computer of yours, say no."}),ke==="expired"&&p("p",{className:"sc-error",children:"That code has expired. Ask the machine for a new one. It prints a fresh code each time it starts."}),ke==="answered"&&p("p",{className:"sc-error",children:"That code has already been answered. If it was not you, deny the next one."}),k&&p("p",{className:"sc-error",children:k}),M("div",{className:"sc-row",style:{marginTop:16},children:[p("button",{type:"button",className:"sc-btn sc-btn-primary",onClick:()=>void kn(),disabled:pe||ke!=="live",children:"Approve"}),p("button",{type:"button",className:"sc-btn",onClick:()=>void bt(),disabled:pe||ke==="answered",children:"No, deny it"})]}),ke==="live"&&I.expires_at&&M("p",{className:"sc-note",style:{marginTop:10},children:["This code expires in ",wa(Date.parse(I.expires_at)-me),"."]})]}),g==="waiting"&&M("div",{className:"sc-card",children:[M("div",{className:"sc-head",children:[p(Rn,{onClick:()=>h("choose")}),p("p",{className:"sc-head-title",children:Ee?.choice.short??"Soba App"})]}),p(Ot,{mark:Ee?.Mark??q}),p("h2",{className:"sc-h",id:ue,children:"Approved. Waiting for it to connect"}),p("p",{className:"sc-p",children:"Nothing more to do here. This page changes when it arrives."}),ae>0&&me-ae>ba&&p("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"&&M("div",{className:"sc-card",children:[p(wr,{tone:"ok"}),p("h2",{className:"sc-h",id:ue,children:Qe?.label?`${Qe.label} is connected`:"Connected"}),M("p",{className:"sc-p",children:[p(It,{context:y})," will use ",Qe?.label?"it":"this machine"," from now on, while it is awake."]}),o&&M(Lt,{children:[p("div",{style:{marginTop:16},children:p($n,{machines:P,onApproveRuntime:Ct})}),p("button",{type:"button",className:"sc-btn sc-btn-wide",style:{marginTop:14},onClick:()=>h("manage"),children:"Done"})]})]}),g==="hosted"&&M("div",{className:"sc-card",children:[M("div",{className:"sc-head",children:[p(Rn,{onClick:()=>h("choose")}),p("p",{className:"sc-head-title",children:"ChatGPT"})]}),le?p(Ot,{mark:hn,still:!0}):p(Ot,{mark:hn}),p("h2",{className:"sc-h",id:ue,children:le?"Your browser blocked the window":"Finish signing in to ChatGPT"}),p("p",{className:"sc-p",children:le?"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."}),M("div",{className:"sc-stack",style:{marginTop:18},children:[le&&p("a",{className:"sc-btn sc-btn-primary",href:le,target:"soba-connect-plan",rel:"noreferrer",children:"Open the ChatGPT sign-in"}),k&&p("p",{className:"sc-error",children:k}),te>0&&me-te>ya&&p("p",{className:"sc-note sc-tone-warn",children:"Still nothing. The window may have been closed before it finished, or the sign-in may have been declined. This keeps watching either way."})]})]}),g==="hosted_connected"&&M("div",{className:"sc-card",children:[p(wr,{tone:"ok"}),p("h2",{className:"sc-h",id:ue,children:"ChatGPT is connected"}),M("p",{className:"sc-p",children:[p(It,{context:y})," will run on your ChatGPT plan",V[0]?.account_label?` (${V[0].account_label})`:"",". Nothing more to pay, nothing to install."]}),p("p",{className:"sc-opt-note",style:{textAlign:"center"},children:"It runs on our side, so it has no access to your files or your terminal."}),o&&M(Lt,{children:[p("button",{type:"button",className:"sc-btn sc-btn-wide",style:{marginTop:16},onClick:()=>h("manage"),children:"Done"}),p("div",{className:"sc-opt-alt",children:p("button",{type:"button",className:"sc-alt-link",onClick:()=>h("choose"),children:"Connect a machine too"})})]})]}),g==="denied"&&M("div",{className:"sc-card",children:[p(wr,{tone:"off"}),p("h2",{className:"sc-h",id:ue,children:"Declined"}),p("p",{className:"sc-p",children:Pe==="machine"?"Nothing was connected. You can ask again whenever you like.":"That machine was not attached to your account, and the terminal has been told so."}),p("button",{type:"button",className:"sc-btn sc-btn-wide",style:{marginTop:16},onClick:()=>h("choose"),children:"Back to the start"})]})]})}function 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]=j([]),o=de(c=>{c&&r(i=>i.includes(c)?i:[...i,c])},[]),a=de(c=>o(c.currentTarget.getAttribute("src")),[o]),s=de(c=>{c?.complete&&c.naturalWidth===0&&o(c.getAttribute("src"))},[o]);return{icon:n.find(c=>!t.includes(c)),onError:a,ref:s}}function va({context:e}){let{icon:n,onError:t,ref:r}=Po(e);return e?.app.mark==="soba"?p(q,{className:"sc-app-mark"}):n?p("img",{className:"sc-app-mark",src:n,alt:"","aria-hidden":"true",ref:r,onError:t}):null}function It({context:e}){let{icon:n,onError:t,ref:r}=Po(e),o=e?.app.mark==="soba";return M("span",{className:"sc-app",children:[o&&p(q,{className:"sc-app-icon"}),!o&&n&&p("img",{className:"sc-app-icon",src:n,alt:"",ref:r,onError:t}),So(e)]})}function Rn({onClick:e}){return p("button",{type:"button",className:"sc-head-back",onClick:e,"aria-label":"Back",children:p("svg",{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",children:p("path",{d:"M15 5 8 12l7 7",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})})}function yr({className:e}){return p("svg",{className:e,viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",children:p("path",{d:"M9 5l7 7-7 7",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function Ot({mark:e,still:n}){return M("span",{className:"sc-waiting","aria-hidden":"true",children:[!n&&p("svg",{className:"sc-waiting-orbit",viewBox:"0 0 100 100","aria-hidden":"true",focusable:"false",children:p("circle",{className:"sc-waiting-arc",cx:"50",cy:"50",r:"46"})}),p(e,{className:"sc-waiting-mark"})]})}function wr({tone:e}){return p("span",{className:`sc-result sc-result-${e}`,"aria-hidden":"true",children:p(ir,{kind:e==="ok"?"snap":"gone",size:84})})}function ka({text:e}){return p(Lt,{children:e.split("`").map((n,t)=>t%2===1?p("code",{className:"sc-inline-code",children:n},t):n)})}function ot({k:e,v:n}){return M("li",{className:"sc-fact",children:[p("span",{className:"sc-fact-key",children:e}),p("span",{children:n})]})}import{forwardRef as Na}from"react";import{jsx as vr,jsxs as kr}from"react/jsx-runtime";var Nr=Na(function({machine:n,className:t,...r},o){if(!n)return null;let{ariaLabel:a,state:s}=Mn(n);return kr("button",{ref:o,type:"button","aria-label":a,className:["sc-btn","sc-btn-connected",t].filter(Boolean).join(" "),...r,children:[vr("span",{className:"sc-pill-tile","aria-hidden":"true",children:vr(q,{className:s.tone==="busy"?"sc-pill-mark sc-pill-mark-busy":"sc-pill-mark"})}),kr("span",{className:"sc-btn-connected-text",children:[s.word,kr("span",{className:"sc-btn-connected-where",children:[" on ",_(n)]})]}),vr("i",{className:`sc-dot sc-dot-${s.tone}`,"aria-hidden":"true"})]})});import{useEffect as xa,useRef as Mr}from"react";var Tt=0,xr=null;function Ro(){if(typeof document>"u")return()=>{};Tt===0&&(xr=document.body.style.overflow,document.body.style.overflow="hidden"),Tt+=1;let e=!1;return()=>{e||(e=!0,Tt-=1,Tt===0&&(document.body.style.overflow=xr??"",xr=null))}}import{jsx as Eo}from"react/jsx-runtime";function st({open:e,onClose:n,labelledBy:t,theme:r,style:o,children:a}){let s=Mr(null),c=Mr(null),i=Mr(null);return xa(()=>{let l=s.current;if(l){if(!e){l.open&&l.close();return}return l.open||l.showModal(),document.activeElement===l&&c.current?.focus(),Ro()}},[e]),Eo("dialog",{ref:s,className:"soba-connect sc-modal","aria-labelledby":t,...r?{"data-theme":r}:{},style:o,onCancel:l=>{l.preventDefault(),n()},onPointerDown:l=>{i.current=l.target},onClick:l=>{l.target===l.currentTarget&&i.current===l.currentTarget&&n()},children:Eo("div",{className:"sc-modal-sheet",ref:c,tabIndex:-1,children:a})})}import{useEffect as Sr,useRef as Ma}from"react";import{jsx as Sa}from"react/jsx-runtime";var An=8;function Pr({open:e,onClose:n,anchor:t,label:r,theme:o,style:a,children:s}){let c=Ma(null);return Sr(()=>{let i=c.current;if(!(!i||!(typeof i.showPopover=="function")))try{e?i.showPopover():i.hidePopover()}catch{}},[e]),Sr(()=>{if(!e)return;let i=()=>{let u=c.current,m=t.current;if(!u||!m)return;let b=m.getBoundingClientRect(),g=u.offsetWidth,h=u.offsetHeight,y=window.innerWidth-g-An,N=Math.max(An,Math.min(b.right-g,Math.max(An,y))),P=b.bottom+An,R=b.top-An-h,W=P+h>window.innerHeight-An&&R>An?R:P;u.style.left=`${Math.round(N)}px`,u.style.top=`${Math.round(W)}px`};i();let l=requestAnimationFrame(i);return window.addEventListener("scroll",i,!0),window.addEventListener("resize",i),()=>{cancelAnimationFrame(l),window.removeEventListener("scroll",i,!0),window.removeEventListener("resize",i)}},[e,t]),Sr(()=>{if(!e)return;let i=u=>{u.key==="Escape"&&n()},l=u=>{let m=u.target;m&&(c.current?.contains(m)||t.current?.contains(m)||n())};return document.addEventListener("keydown",i),document.addEventListener("pointerdown",l,!0),()=>{document.removeEventListener("keydown",i),document.removeEventListener("pointerdown",l,!0)}},[e,n,t]),Sa("div",{ref:c,role:"dialog","aria-label":r,className:"soba-connect sc-pop",...o?{"data-theme":o}:{},popover:"manual",hidden:!e,style:a,children:s})}var at=new Map,En=new Map,Io=!1;function Pa(){Io||typeof window>"u"||(Io=!0,window.addEventListener("storage",e=>{!e.key||!at.has(e.key)||(En.set(e.key,Et(e.key)),Rr(e.key))}))}function Rr(e){for(let n of at.get(e)??[])n()}function it(e){return e??""}function Er(e,n){let t=it(e);Pa();let r=at.get(t)??new Set;return r.add(n),at.set(t,r),()=>{r.delete(n),r.size===0&&at.delete(t)}}function Bt(e){let n=it(e),t=En.get(n);if(t!==void 0)return t;let r=e?Et(e):null;return En.set(n,r),r}function Ir(){return null}function Or(e,n){Bt(e)===null&&(En.set(it(e),n),Rr(it(e)))}function Lr(e,n){let t=it(e);En.get(t)!==n&&(En.set(t,n),mr(e,n),Rr(t))}function Ve(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 Je(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 Tr(e,n){if(!(n===null||n.some(a=>Oo.has(a))))return!1;let r=e.findIndex(a=>Lo.has(a));if(r===-1)return!1;let o=e.findIndex(a=>Oo.has(a));return o===-1||r<o}import{createContext as To,useContext as Bo}from"react";var Br=To(null);function In(){return Bo(Br)}var Gr=To({context:null,machines:void 0,theme:"light"});function H(){return Bo(Gr)}import{useMemo as La}from"react";import{createContext as Ia,useContext as Oa}from"react";var Wr=Ia(null);function Q(){let e=Oa(Wr);if(!e)throw new Error("useSoba() must be used inside a <SobaProvider>.");return e}function lt(){let{compute:e}=Q();return La(()=>{let n=e.machines,t=[...n].sort((a,s)=>We([a,s])===a?-1:1).map(Ta),r=We([...n]),o=un(n);return{view:t.length?"machines":e.loading?"loading":e.error?"error":"empty",machines:t,primary:r?t.find(a=>a.machine.id===r.id)??null:null,connected:e.connected,online:e.online,stalled:e.connected&&!e.online&&o?t.find(a=>a.machine.id===o.id)??null:null,loading:e.loading,error:e.error,refresh:e.refresh}},[e])}function Ta(e){let n=He(e);return{machine:e,name:_(e),state:dn(e),status:Yt(e),hardware:Fn(e),lastSeen:e.state==="offline"?Vn(e.last_seen_at):null,runtimes:Ne(e).map(t=>({runtime:t,name:t.display_name,auth:qe(t),quarantined:!!t.quarantined})),runsOn:{by:n.by,name:n.runtime?.display_name??null}}}import{useCallback as Hr,useEffect as Ba,useMemo as Dr,useSyncExternalStore as Ga}from"react";function bn(e={}){let{compute:n,connect:t}=Q(),{value:r,onChange:o,defaultValue:a,remember:s=!0,user:c}=e,i=r!==void 0,l=s&&!i?pr(t.publishableKey,c):null,u=Hr(R=>Er(l,R),[l]),m=Ga(u,Hr(()=>Bt(l),[l]),Ir),b=Dr(()=>Zn(n.machines),[n.machines]),g=Dr(()=>Xn(b),[b]);Ba(()=>{i||!a||Or(l,a)},[i,a,l]);let h=i?r:m??a??null,{selected:y,unavailable:N}=Dr(()=>_t(b,h??null),[b,h]),P=Hr(R=>{i||Lr(l,R),o?.(R)},[i,l,o]);return{options:b,groups:g,selected:y,select:P,run:$t(y),unavailable:N,pickable:mn(b),loading:n.loading&&!n.machines.length}}import{jsx as ct}from"react/jsx-runtime";function Wa({className:e}){let{theme:n}=H(),t=e?`soba-connect ${e}`:"soba-connect";return ct("div",{className:t,"data-theme":n,children:ct(Ur,{})})}function Ur(){let e=lt(),n=bn();return e.view==="loading"?ct("p",{className:"sc-note",children:"Loading\u2026"}):e.view==="error"?ct("p",{className:"sc-error",children:e.error?.message}):ct($n,{machines:e.machines.map(t=>t.machine),model:n.selected,onPickModel:n.select})}import{useCallback as dt,useEffect as Jr,useMemo as Ya,useRef as Yr,useState as Ln}from"react";import{useId as Ha}from"react";import{jsx as On,jsxs as Gt}from"react/jsx-runtime";function ut({open:e,onOpenChange:n,initialCode:t,onConnected:r,showStatus:o,reason:a}){let{error:s}=Q(),c=In(),i=H(),l=()=>n(!1),u=Ha(),m=i.context?.background?.trim(),b=m?cn(m,i.context?.accent):void 0;return Gt(st,{open:e,onClose:l,labelledBy:u,theme:i.theme,style:b,children:[s?Gt("div",{className:"sc-card",children:[On("h2",{className:"sc-title",id:u,children:"Could not start"}),On("p",{className:"sc-error",children:s.message})]}):!c&&!i.context?Gt("div",{className:"sc-card",children:[On("h2",{className:"sc-title",id:u,children:"One moment"}),On("p",{className:"sc-note",children:"Getting your compute\u2026"})]}):On(Cr,{client:c,active:e,onClose:l,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},...a?{reason:a}:{}}),Gt("p",{className:"sc-modal-foot",children:[On(q,{className:"sc-foot-mark"}),"Secured by Soba"]})]})}import{forwardRef as Da}from"react";import{jsx as Ua}from"react/jsx-runtime";var Fr=Da(function(n,t){let{theme:r}=H();return Ua(Nr,{ref:t,"data-theme":r,...n})});import{useCallback as Fa}from"react";function Qa(){let{connect:e}=Q(),n=lt(),t=Fa(()=>e.open("manual"),[e]);return{...Mn(n.primary?.machine??null),machine:n.primary,open:t,canOpen:e.hasModal,loading:n.view==="loading"}}function Qr(e){return Mn(e)}import{useCallback as Go,useEffect as Va,useState as Ja}from"react";function Vr({enabled:e=!0,intervalMs:n=3e3}={}){let t=In(),[r,o]=Ja(null),a=Go(async()=>{t&&o(await t.runs())},[t]);Va(()=>{if(!e||!t)return;let c=!0,i=Me(async()=>{let l=await t.runs();c&&o(l)},n);return()=>{c=!1,i()}},[e,t,n]);let s=Go(async c=>{if(!t)throw new Error("Stopping a run needs <SobaProvider>.");await t.stopRun(c),await a().catch(()=>{})},[t,a]);return{runs:r,refresh:a,stop:s}}import{Fragment as Wo,jsx as Tn,jsxs as Ho}from"react/jsx-runtime";function yn({children:e,variant:n,className:t,initialCode:r,onConnected:o,defaultOpen:a,open:s,onOpenChange:c,showConnected:i=!0}){let{compute:l,connect:u}=Q(),m=H(),{theme:b}=m,g=In(),[h,y]=Ln(a??!!r),N=Yr(null),P=s!==void 0,R=!P&&!a&&!r&&u.hasModal,W=P?s:R?u.isOpen:h,E=B=>{R?B?u.open("manual"):u.close():P||y(B),c?.(B)},I=Yr(W);Jr(()=>{I.current&&!W&&N.current?.focus(),I.current=W},[W]);let[O,k]=Ln(!1),{runs:U,stop:pe}=Vr({enabled:O}),ne=bn(),ae=Ya(()=>O&&U?ja(l.machines,U):l.machines,[l.machines,O,U]),Z=We(ae),me=i&&Qr(Z).connected,Ye=dt(()=>k(!1),[]),[$,ye]=Ln(!1),Se=dt(async()=>{ye(!0);try{await l.refresh()}finally{ye(!1)}},[l]),X=Yr(Se);X.current=Se,Jr(()=>{O&&X.current()},[O]);let[ie,z]=Ln(!1),[Pe,he]=Ln([]),fe=!!m.context?.hosted_available;Jr(()=>{if(!O||!g||!fe)return;let B=!0;return g.hosted().then(x=>{B&&he(x.credentials)}).catch(()=>{}),()=>{B=!1}},[O,g,fe]);let[nn,V]=Ln(null),J=dt(async(B,x)=>{if(g){V(null);try{await g.approveRuntime(B,x),await l.refresh()}catch(tn){V(tn.message)}}},[g,l]),te=dt(async(B,x)=>{if(g){V(null);try{await g.preferRuntime(B,x),await l.refresh()}catch(tn){V(tn.message)}}},[g,l]),T=dt(async B=>{if(g){V(null);try{await g.disconnectHosted(B),he((await g.hosted()).credentials)}catch(x){V(x.message)}}},[g]),le=m.context?.background?.trim(),Re=le?cn(le,m.context?.accent):void 0,ce=me&&!e,L=()=>{if(ce&&!P&&!a&&!r){k(B=>!B);return}E(!0)};return Ho(Wo,{children:[ce?Tn(Fr,{ref:N,machine:Z,"aria-haspopup":"dialog","aria-expanded":O,onClick:L,...t?{className:t}:{}}):Tn("button",{ref:N,type:"button","data-theme":b,className:["sc-btn","sc-btn-icon",n==="primary"?"sc-btn-primary":"",t].filter(Boolean).join(" "),onClick:L,children:e??Ho(Wo,{children:[Tn(q,{className:"sc-btn-mark"}),"Connect compute"]})}),Tn(Pr,{open:O,onClose:Ye,anchor:N,label:"Your compute",theme:b,...Re?{style:Re}:{},children:Tn(fn,{machines:ae,hosted:Pe,onApproveRuntime:(B,x)=>void J(B,x),onPreferRuntime:(B,x)=>void te(B,x),onDisconnectHosted:B=>void T(B),onRefresh:()=>void Se(),refreshing:$,model:ne.selected,onPickModel:ne.select,error:nn,runs:U,onStopRun:async B=>{V(null);try{await pe(B)}catch(x){throw V(x.message),x}},onPair:()=>{k(!1),R?u.open("pair"):(z(!0),E(!0))},...m.context?.app.name?{appName:m.context.app.name}:{}})}),!R&&Tn(ut,{open:W,onOpenChange:B=>{B||z(!1),E(B)},...ie?{showStatus:!1}:{},...r?{initialCode:r}:{},...o?{onConnected:o}:{}})]})}function ja(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 za({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(Ur,{}),jr("div",{className:"sc-compute-act",children:jr(yn,{...e?{initialCode:e}:{},...n?{onConnected:n}:{}})})]})}import{useId as ai,useState as ii}from"react";import{useCallback as qr,useEffect as Vo,useState as Jo}from"react";import{useCallback as Za,useState as Xa}from"react";function pt(){let[e,n]=Xa(null);return{open:Za(()=>{n(null),zn().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 wn(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?wn(n.cause):null}function Fo(e){return e===402?"payment_required":e===409?"no_compute":null}function zr(...e){let[n,t]=e,{plan:r,compute:o,connect:a}=Q(),s=t?.predict??e.length===0,c=_a(Ka(n),o)??(s?$a(r,o):null),i=r.plan,l=r.plans,u=Uo(()=>{if(c!=="payment_required")return null;let h=i?.price??0,y=i?.included_units??0;return l.find(N=>N.id!==i?.id&&N.price>h&&(N.included_units===null||N.included_units>y))??null},[c,l,i]),m=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]),b=a.open,g=Do(()=>{c&&b(c)},[b,c]);return Uo(()=>{if(!c)return null;let h=i?Ve({unit:i.unit,reward:i.connected_reward,includedUnits:i.connected_included_units,creditMicros:i.connected_credit*1e6}):null,y=i&&Je(i.connected_reward)?h:null;return{reason:c,...ei(c,{connectOffer:y,connected:o.connected,online:o.online,machine:un(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:m}},[c,i,o,u,g,m,r.current?.period_end])}function Ka(e){let n=wn(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:a,error:s,predict:c,at:i,waved:l}=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:`${a??"Your machine"} can\u2019t be reached`,detail:y?"The Soba app there has stopped reporting in, so runs have nowhere to go until it is back.":"The Soba app there has stopped reporting in, so nothing will run on your own AI until it is back.",meter:null,dismissible:!1,atTheWall:!1,ownCompute:y}}let m=wn(s),b=m==="payment_required"||m==="no_compute",g=n.ask_to_connect!==!1&&Tr(n.route_prefer,u);if(!c&&!b&&!g)return null;let h=Le(u)?ti(n.unit,Le(n.route_allow)):Je(n.connected_reward)?oi(t,n,i):g?ri(n.unit):null;return!h||h.dismissible&&l?null:{...h,dismissible:!!h.dismissible,ownCompute:!1,atTheWall:!h.dismissible&&(!c||h.meter!==null&&h.meter.left===0)}}function Zr(e={}){let{at:n=.25,error:t,allow:r}=e,o=e.predict??!(e.errorGiven??t!==void 0),{plan:a,compute:s,connect:c}=Q(),i=hr(c.publishableKey),[l,u]=Jo(!1);Vo(()=>{u(fr(i))},[i]);let m=qr(()=>{u(!0),gr(i)},[i]),b=qr(()=>c.open("manual"),[c]),g=qr(()=>c.open("no_compute"),[c]),h=pt(),[y,N]=Jo(!1),{refresh:P}=s,{launch:R}=h;Vo(()=>{if(R===null||R==="absent")return;N(!1);let k=setInterval(()=>void P(),3e3),U=setTimeout(()=>{clearInterval(k),N(!0)},2e4);return()=>{clearInterval(k),clearTimeout(U)}},[R,P]);let W=si(c.app?.name,rt(c.connectUrl)),E=a.loading||s.loading,I=un(s.machines),O=E?null:ni({plan:a.plan,allowance:{remaining:a.remaining,included:a.included},connected:s.connected,online:s.online,quiet:I?_(I):null,error:t,predict:o,...r!==void 0?{allow:r}:{},at:n,waved:l});return{reason:O?.reason??null,visible:O!==null,title:O?.title??null,detail:O?.detail??null,meter:O?.meter??null,dismissible:O?.dismissible??!1,dismissed:l,dismiss:m,open:b,atTheWall:O?.atTheWall??!1,steps:W,stalled:O?.reason==="stalled"?{machine:I?_(I):null,ownCompute:O.ownCompute,wake:h.open,launch:h.launch,note:h.note,stuck:y,connectAnother:g}:null,loading:E}}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 a=Ve({unit:n.unit,reward:n.connected_reward,includedUnits:n.connected_included_units,creditMicros:n.connected_credit*1e6});return a?{reason:"running",title:r===0?`No ${n.unit}s left this month.`:`${r} ${n.unit}${r===1?"":"s"} left this month.`,detail:`${a}.`,meter:{left:r,of:o}}:null}function si(e,n){return[{lead:"Download Soba App",detail:"",...n?{linksLead:"Get it for"}:{},links:n?tt.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:Ae.map(t=>({label:t.short,href:t.install}))}]}import{Fragment as jo,jsx as G,jsxs as _e}from"react/jsx-runtime";function li(e){let{className:n,fallback:t=null}=e,r=Zr({...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}=Q(),{theme:a}=H(),[s,c]=ii(null),i=ai(),l=G(jo,{children:t});if(!r.visible)return l;if(r.stalled)return G(Yo,{className:n,theme:a,stalled:!0,children:G(ci,{title:r.title??"",detail:r.detail??"",stalled:r.stalled})});let u=s??r.atTheWall;return _e(Yo,{className:n,theme:a,children:[_e("div",{className:"sc-nudge-top",children:[_e("div",{className:"sc-nudge-say",children:[G("p",{className:"sc-nudge-title",children:r.title}),G("p",{className:"sc-nudge-detail",children:r.detail}),_e("button",{type:"button",className:"sc-btn sc-btn-quiet sc-nudge-more","aria-expanded":u,"aria-controls":i,onClick:()=>c(!u),children:[u?"Hide the details":"How it works",G(di,{})]})]}),r.dismissible?G("button",{type:"button",className:"sc-nudge-dismiss","aria-label":"Dismiss",title:"Dismiss",onClick:r.dismiss,children:G(ui,{})}):null]}),u?G("ol",{className:"sc-nudge-steps",id:i,children:r.steps.map(m=>_e("li",{children:[m.opens?G("button",{type:"button",className:"sc-step-lead",onClick:()=>o.open("manual"),children:m.lead}):G("strong",{children:m.lead}),m.detail?G("span",{children:m.detail}):null,m.links.length>0?_e("span",{className:"sc-step-links",children:[m.linksLead,m.links.map(b=>G("a",{href:b.href,target:"_blank",rel:"noreferrer noopener",children:b.label},b.href))]}):null]},m.lead))}):null,G(yn,{variant:"primary"})]})}function Yo({className:e,theme:n,stalled:t,children:r}){return G("div",{className:e?`soba-connect sc-fill ${e}`:"soba-connect sc-fill","data-theme":n,children:G("div",{className:t?"sc-nudge sc-nudge-stalled":"sc-nudge",children:r})})}function ci({title:e,detail:n,stalled:t}){return _e(jo,{children:[G("div",{className:"sc-nudge-top",children:_e("div",{className:"sc-nudge-say",children:[G("p",{className:"sc-nudge-title",children:e}),G("p",{className:"sc-nudge-detail",children:n}),t.note&&G("p",{className:"sc-nudge-note",children:t.note}),t.stuck&&G("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)&&G("button",{type:"button",className:"sc-btn sc-btn-quiet sc-nudge-more",onClick:t.connectAnother,children:t.stuck?"Connect it again":"Connect another machine"})]})}),G("button",{type:"button",className:"sc-btn sc-btn-primary",onClick:t.wake,children:"Open Soba App"})]})}function ui(){return G("svg",{viewBox:"0 0 16 16","aria-hidden":"true",focusable:"false",className:"sc-nudge-x",children:G("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 G("svg",{viewBox:"0 0 16 16","aria-hidden":"true",focusable:"false",className:"sc-nudge-chev",children:G("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 Bn(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 a={type:o.type};return typeof o.text=="string"&&(a.text=o.text),typeof o.message=="string"&&(a.message=o.message),typeof o.tool=="string"&&(a.tool=o.tool),typeof o.tier=="string"&&(a.tier=o.tier),o.usage&&typeof o.usage=="object"&&(a.usage=o.usage),typeof o.session=="string"&&(a.session=o.session),typeof o.toolInput=="string"&&(a.toolInput=o.toolInput),o.git&&typeof o.git=="object"&&(a.git=o.git),o.turn&&typeof o.turn=="object"&&typeof o.turn.text=="string"&&(a.turn={text:o.turn.text}),typeof o.reason=="string"&&(a.reason=o.reason),typeof o.retryable=="boolean"&&(a.retryable=o.retryable),(o.state==="interrupted"||o.state==="resumed")&&(a.state=o.state),a}async function*Xr(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,a="",s=[];try{for(;;){let i=await r.read();if(i.done)break;for(a+=o.decode(i.value,{stream:!0});;){let l=a.indexOf(`
|
|
3
|
-
`);if(
|
|
4
|
-
`);if(
|
|
5
|
-
`);if(
|
|
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,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAARGVYSWZNTQAqAAAACAABh2kABAAAAAEAAAAaAAAAAAADoAEAAwAAAAEAAQAAoAIABAAAAAEAAABAoAMABAAAAAEAAABAAAAAAEZRQrAAAAHLaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT4xPC9leGlmOkNvbG9yU3BhY2U+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4yNTY8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MjU2PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CuYattQAABdYSURBVHgB7VpplF1Vld73vqmqXs1VqaQqEwFCiAjYytiCpqFBBVwiTSCsBmVpQ69mob3Qpl3dy9Wy+oc03T/8IYqNA4LaC8OgMgQJCDIKSBjDFAkhqaQqqXl69epN9/b3fefeStGpW0GX/zoneXc4wz57f3s4+5xbZofKIQQOIXAIgUMI/P9FwPtTRf/Dlz6Vq+voWD41U13WkE51VmtBUyUI6iz0MmHKS/uheYHVzAL891OWjiYKfB8VFb0Foe+lvSCs4u57qdCsYqzzPQ/PZj7GYzhKyiwEZT+spsyv+Klwxqt6UyULBhvr0rtnhod7V3/7gZK6/pGXPxqAN79+6ZpMrfYFzPOpwLNVFoaNac8333ekdE2B4SBAk+RwLHmeefixzovr8W74z1eNw0MIgNgHMEFi1IIOiANNBwUpqk8tsKqjMwUMdwDJTeVa+kdrr79tm5vw/V017/vp+vyVV2ZaFxWuAXtfS3vWXqmFVgspJJUD4ahZCoA6iOnqcKVoYlpP7o39gYaAYBspsIXMqC1+RwXpgbhrcwIDEFoE6jGM1NMAP5POWKVWGwF4N4wNb/vWCTdvcWZG8guU9wXAa1etb8w1+d/PplMbSkC+Jm04wQCINCJCBICskjneI+o0aLZIaLRQDjVFF42idUR02U/SsaOEBVVWoT2gtakZo/BMgPxoXlphLp22SqV2e2myesUx371jCqMWLLS0BcvG9euzFD6XSW8oQvggoIj4BybECB/A56zJi1O2O426xkgA9gOz8RDBQCFVzzf+QzuEoptQTjWyT1TYJrfQOALNHm5cgLpiuWK5jL8h3Zz5wcbr1mejYYm3gwJwzGH2lWwmtaEA4S1AUENYCqFS+beEJW0ngXuNBAxrUR9oiRhJBukaFpMSQM680SAM0SZEOQP645m+TmEZEzUfp8Jc/McxBMgJoBq1sn26UrX6tHfxcTOpa6LKxBtpJJbf/+P6Na113jPgoJWaV5H6nO9Tlc4R2AJSZJq8oT4slxyrqPAzUIT8mIyiDUHSB6AhQHI0KWhN4/iu4Cfx+OK0TFegVRAI3clHNP8sOFGsIA0Cg5Hjk4XqKSfceNebrJuvOADna0FdYya4MpdOtdZq0Kb+oVJW4CaXNoQLhKLQZBpABaUZa/zgSdZ1/t9Z++nnmZ+tNyMN9qUAFcYnIoXpYR5hpWypurze2UeLIOMBfxF9PWMUZog4EZRz+rCBYGEAeGSArk/7LXU5uxKViQXhdP7ynfXrGg9va/xPEFzEuM6p3TLGR2qeN1zJMJ85ObhnIKtfcaSEr1+6yhpWH6sVYnrby1ALtIi+cdFyWK1Yfs3x1n3Jlyy7eLlNb98KGrAMzhHN4/rv1zyhFnhqQD37CSjyQZY4liTIn9e6dumiWze9/m45nnfuPdEC1rbmVqYsXFmT74MqXQBalBqpJvxcQMQzJ6JorK9VLb/2BPPrG5DvIFWhNXzgBMu0dUpb6IFCFnkDtNmcta873zKtHdZ03KlWt3KNhdWqaydJuBUyI0zB9QaiY4xGRzzgJapHLerkIuwLfVTBL1hbSVk43XwlEQDPTy3H6AYyTAYU+NxUZMMxjzvbKbieBLtZeWCPm0sawDrd3GaNx54CwWD65IwUoGVaS6p1kWU6uy2A0Ib2sFhwwpMC2pHkCPigPIO4MoNnBkXCx5nxQzyR9ZEDVgtZ9mGrLKFBsqBpvpIIQHNdtjMdJTdkWmamiUFGUpMcgfEUtTGJ6Ht+2qbf3mrVsSHzyBwZgrBNx/+l+Q2NGEsNcijGQcB0Q4P5SGL4XisVrToxomdqUiISKHRv/ovTrf2vL7RsVw8sy1kzNS43QgdaiMjqShZRibFMwSlLVH3ALREAEGj25VgghInIuO4i7ZjjNJSPiYi0RaBgLZXxQRt9YhOeCQq1HVh2UY81Hv0hBDyXoLnIjRWiHqAQKIBdK0xYdXoSewdf7sVxoGydn7zEFl9whXWc+Te26JxLzc/VaT5Jgz5iwi2ecgHxopFamOC5tWb1neeSCEC1UkXoZoEZEWk3i3un4NCYXAFmG1Sx5MHfWWTgqYxNvPyUFd99yzwsgS4YhdZywl/p3bj8gSb9OZVvFlC0nMrooIWIGQRVdoV40gmtt558llaKYKaAALva6noOw3hnGbNsASnqi2NpTdSJHsErLC2SxdXNvSYCEIReVkKDEGnJGEDYFbS4mazlpDOs6zNftPwxJ8LiELygEbbR34d/+yv5tSpQT+bzR39YViAA4d+pRgKAXB9WwNihFYDgYHzbaeda2+nnuthBHmBR1akxKw/14yVawCgprWAWCT6RP9AkI/hVw1RiRpgIALIv7GhZeKXJ4043YMGkAVLO+sPWwizXWzP8e/Fnr7DOT2wwD7l4wOgLvy7ueMMmX0UehUgvEMBU2+nnwAoy0j55Tueb1EaXKO3d5chXy9Z07KnWAe1zRRAPEMSDZU0+/6jVECckm1gBX1QG22Ne6YpBVfHJ2S520QklEQCYZ4qNbiJHnPOIGU3ETA7MwecVlKCFtlPOwnr+Zcu0L3YRG4NHnrgXWhuXn1O7DVjmGo85WWPAplYIaoouVBrai9U2sNySFbbo05+XVbj5MH8mZ1OvPWsjj98PWmlwQHHpitQHQABtscXnCBAuyXQljE6UM7HByUohHUHeZ39shMnO9G63wrZXpGEuQQECHK1i2eX/rLWfQWxm3x4be+YhpcMySQxt/xiyw1w9tvk+XKANDCMATk4oBqQbW2zxhf9gmaY2BU+20ZpoHQP33iYZI6ndCiBGAQZBjJ5d7CbfGEv+FygHAQCDKTh81QFBv4qHINlAvj9w9802+vi9Dn2AQt9Ng/klF19tnWetNw+Cjj39oJUH+yUIraBu+ZEw8ZNlXummFvDpW3lknwVTE7b405dbA2JFWKtgLqDKFaFctIFf/hCWNCHZ5fNsY4ncMj4wUZWUBl4x10HkjzZTovR/L8y8WGLzxx0a1Q6O4LIFmqG/j/zmLuv/+Y1WGRvUEsU+DFiM4Ms/dy32AjkbRh+XFzh67R89V0DREijkTO/b1goXavnIOhf0KCDA9mHugw9uxIryJuZzpi+2Isl0w0U7RzVgGOaXtUbvLkjGL++9x+p8b2305owKxKN33d2MqMMkkZb8dBbJz6vW96PrbfyFx8F3GsICQCQs+TUfspVXf1PmPL2DQmQxDn6+bJXljzpOoIQAsX7lUdZ17qXoB19mAQAEjvTGn9nslk9yIuHQHgkpkyBWigEAPq4X15GViOD8l2QAuLRQ4iiZIRiyusj0qEdM63wMk/qI7BWY6MCd37O9G78Nf0YmmMUZKSJ6pqXdutfDr9u73JJFhrGMcX33M+gD5gmUkiLySeER8Wfg94P3/YQ1rsC96GJhBWkx8gWO0x4hygxdJ6cu5/vuOVq7YirvuceHte+p1AvMUoWTCHmh4Z55jUyQmtDREACTz8ItJl/5HUx2m3WefbHyBNKh+TI26JkgYlzDqqNlDUKaGowL2ulGg5t+pthAS2DQ5fhMm9s7ZBd1W7azR+BOv/Ma4tB92HgVqaaIx4gYlZOs5tnT6njq2TsOv0DMLTaSH0xR56rB8gIOXV8yi2Nrmp6mxju1V50ctf47b7LCWy9ZF5Y0psLUnoigDx+4SuidF5HDhfPA6rgtrk6MIm84z7itzi1Zbum2Lkthl+khLrBQCQQ907HExp992IKZaa0sclrSIf2DlEQLIGgSiIKSL7yTR5pcbukR8l2mpgFWAi5/IUCRgNAkn9Ubq8cYEpcC4kPXeZ+3lhPXSThHjRTjIsqYI4IcMaEOQq+86t8RB+AiAJdxQtaGIRwZYJ7adMGqWD0Kr/3equPDqEXcoSXiSe4B1VOGhYJgIgCg4RDmPXpmxM/1rLTuy74CpLHkUWgKjGwtQEBk0NOPoOBXA0C1yXHFg4mXn7ZUQx67utMwjpoHY+I0msDl2pGQ0CxiAzdWcWGyVYOQ5cE+K/e/azN9O5Eb7ITg2D0iziCYgCToQmE8LSZ98RZSlck+kAxAlREVoju1iw+u1xUwUHj9ecuvPg55LKI9Njt+fd7SNEuYvo86H6sAfVa/WALeCRBTW+USTuuzIHAiVrFgXu4My8N7bWb3Ozaz6y3ducUmsAysDKKcP4V5ubJwa81xAtYxDf4dLdFMuCQDoMghCo4xBhMwTq0P3XerjeZbtOZrt4c0lTkBzdXLYveHd+7xWed+mAZjG7Ds5Y/4oMwUaiJ3jvZ+ydWvWhizqa3PQejtOFcYhtAzSpkzze1W48EIgh1Pm8IyAC1OYbsLZXG1ovwkCcuR/8uAKENyLEgGwLG3HzeaFN9oukBaBxf0TVeJtkgD0QhmjwyMdA1qiydCTcedEre6u8byEQ+OEHit4YC0wdpPOwcWhMQHgTNg8EQ9fVnLYFRHdyvv67XhhzZaZd9uCE4QQAtzx/ScE/0pLoDdlGdIWsRqRDBSGquUEmNCNwGDF2ICJwdACp4w0xCfz/Krj7cOpMR5nAvSKnhGSGFoJa6QdvSE8VoB3nnFRp/aZPWr1moLncaRWRqnScwkVTAHM0RDFtnQ0qEjtb5b/gMHMQiEsFzlsFQUftwjYEI3bp7rwhYAs1VkJsM0fxGIuMUzg40yMDw7IHBFoGSw5Drdvu4z1vyRj5sPjXL8zJ4dNvnSU9jnn2NpnOpoGYw0L/DwzADJU+LSwG7bd9d/y4WYSGWXrLC6FUdpdeCSmsKmiSCQGy6LmoMBERVaHvlA/kg/Wf7kPICDZDgkAELSLJ9JT+A6YVUhlPEEvyRjbad+wlpOOVtJCttpqqO/26xdYfeGqy0NgRjFw9I0hFotErBz3EEchcuevifguGwAIFRGBvAbRPDdIkBSsIZs11KrX3YE3MS3yReftBq23E4JGE9+RIv0+EtGYGELgCZjsyYZZXogzJMSvZM8JuPJbQgBGnEq1H7WRdDWcscABCnBNwfv/6kV3thiSy//GnL+NRYUp23o/p/ANS4COFVtdGjuIIJJDMvbbmR53ThC+zgSn7zt2/gdLKdjiPoIqpi5hnPD4vbXrIj8ggO0yYJ78B7nAXRDKW5h+RdYICkcyUNgRlRtLRmEILCERhvn0Bk+srPO8y6zxRddZdmOxfo2wGA1+tg9tuumb9gkzgc7z16vIEgGuTOcxmkR01ouaYP3/thK/Tvkv2S63L/Lhh68XdE/v/bD1o0dZYZ0o3NHuhP3HvzkxruO1KhxLrHkNeJdLkY+F7CA5PCIQSTEoBKvWAIDWvJ4IMmoTF+HED2XftWaTzxT6FOA0p53rO/HN0iwAMdXPDJrX/dZWUXhrRdsGMIRKJ7ucl2niQ8/fCdng0VUrBGrRRV1e3/6LZj2GA5ZjlLyRcuiO3F1kYnT1Bn5qZQ5Jh9bLS1qPwgif8BlAQDQlxomCpyI9qCJuPTBKliDnCAHpuroi2imNYw++kvb88PrnXkCDDLddf4XYb4pnfjsu/NmaZYmzuBVm54SnamXnrbJrc/Cx5lh1qwDx99FnBH0A8gKDkFzOAnuueyfLIfDlICZH2g763TLI9hxFsscgEpiTEFN9Nc2bJ63JAJAzyYCSiiIJIeTsMjQEwE+dmnFnW/ZENbhUZj13tv+y0Ye3iizVmRGe9f5X7AUvgzR12nqXLeZHOV6VglI+jPTXC6kQ9j9VcZHMQ0+aGDMovM+p48sfbfcAJ9/Xctd999eYw1HHOvOHMEPeZLojjGw7CyCAOlHGSSLGD/gkggAFyTl0vQpmVdsZiAXvZMaA9rYo7+Av//KSrv+YMYcnjAhMPKUuP6wo8Xk+NMP2NRLT8pvmT3mliyToEx5PQDAHKGC/f/oIzg5otsh2+M3xWacGZRw9kiXGntyE7bErbYYx220LH6bdLa4nyftTzi/40J3ykJe5yuJAIBrpF+uOPcCEHQBVoFBnrZqh4a5FIywD2DmRvPjcthy4hnWhA8hDErFd96w4c0b0RGLDtrTyAvS+CbIU9sats3K8lBPq5l47hHjl2QegdOl2s+8wLLdKyzExmr4nlu0LNaQ/vo55BbSPvgBgwTCnQBDdDIMmen/ilWA2Ely4DURgFTKR9JNcd2PmDqTIm0SRz0r2Rz1UayAUFzS2sA4q/mxY+Du70uj6g7zZkTnd0LSqeEUieu+iKED3WHo3lt1nsB6HoIwcdLciPiTLzxmfd/7Nyv37ZClyN85Gn0Zmxw7dA1AIv497smQfs5fEgGAgie4wyLTDlGQRl5PjbKwnrPJKjgRf+wPU24780JsfRsVyffdfqNVh/q0c9MACJ3BSQ61zf6yANJiYWBDYlPa22sjm38u2qSb6VqGJvg2ZtXOjztCjNW2VwPdhXzGvMYrgcCFLHO6vecxEYCBwswo/w5PgiqgYHolImSDSDuh3URz0mT05dJVwveAfTgRKsOveUIUF67hjOgUjObJ8wIHJsCL5ktR04gXE888DEsYt9LutwEWo/1cV8b8KI5D0MJYWYlWLPLoWiuoHi5V4Gfzl8RMcKxU3QOaRQhb76bCZDBvaRHU6XGalE/UBgFhjGBi84sfSMMBfJXbY/ImiNDO9xwCmKwJY7kKMOixyIwJNt9Bc/jXP7MRBNcQfeRe6C8Q2I5+7iRYM3O0QBUhPuM/t+9BLSgOF0p7XP2BVzfzgfV2z46h3kro9dLwJAFuoOmKkgP3Lh/kRzQKJy2gF7erOJ+T2UIQ9iENuhRBdJ/KEORoAVgFZs/0RQMbL/THIwqQk/Akjwr3Hzf+Y7NTjdpkC3jnXACIlpFCTgCb6b1nx7u97D5fSQTgjhffHp4sB49kYI6chz4nAUgFFfFpSxwD+DcCsz5IQaLZWEc2yZDTtG+jyPqmsTcY/c3d2sfTLdwknAj/GWA5DkC7cW7bHQsuzQNkNweunFtzcFI8AVhaJTbfNlWqPnLHi3t5YDhvkYLnbQHZtZ31o4e35C9Ke6HbvDu1OEGoJQzUzotbikhrEp1aiISi8HrmLepTK0zaFL4al3biQwmJcDzuMVjs74TlaHUAENiEcekVQV04UJkqYRIN3jEH3/jXLeVaMPngzqFrH3obUTWhJFoA+39189bneyeK383RxKPCw1CZOhgT7ojqHk991A7TA/Jk2pms4JDgkjQ65KQl6JErAUucp6CebRIookNj9qFRn++Sk2CRH84I+pSZLkmr40qBd7bk0GX3+PRN1/76xS14TSwLWQAHhVv6h1494/AlH2ivy66uMgqDEfIhc9dsTnS5At4lMtVKM55b8M4+Ak8adu1yJfJPWqyKxmnHSdJUOenxmZZCOnEdatx4NSKwOsvLp33rny5t+vtNb/zL4PR04hJIigcFYHC6UuydKDxz0tLWI1sBAsWX5qEpoU7mWONskzTFrHqxD4tMX9BIyHiNFtv7L5Ix3mpzpLOxCKgIPE7nakRZAY8DaXn8q/H6TMr6pooPfOOx7V9+enc/EhD4zQLlYABwaLh9dHrikZ0Dj53c0x621WWPqc+kcxQqkgY4aJGT4KoDQ5JLmgI4MVgcIRPnw5wYQuFQJW2zXWA6zVNYtbkO7CVLklUACgIlwfE3/OUgnNg+PHnjxfdv+fqLe4Z3o2lu4sChBxSRPaB23op1cNjf5v/1o6tP+uQRSy6BS3ws54c9OJfD3yXjkDKiJA053l2mBs0436QP034iYaVH6DiyErfrjHQrYiBIYBnRY34iK2MGSMn4J7ygWCxVg76hQumJze+O/M83n3rjObN1BfDKpOWgZZb2QXuiw3XXXefjx8jVcFRPx5ILDmtb0d2UX7qoIdeW9b1GpJ11KQ+faHhAjb8xIk18TXBmCiAYxenHAVsiw1RwwwcOxhZVARDV7e/inkJ3JgUMkI97JWR4k4OTxdFdhWLfg9v27to6PNWPjtP4UfCIOp4OUv4oAObQ4jiKMffHuphefJ8z5M/2SDOJfxSUP77TKCITwtOhcgiBQwgcQuAQAgdH4H8B6KgZTSy4OGUAAAAASUVORK5CYII=",codex:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAARGVYSWZNTQAqAAAACAABh2kABAAAAAEAAAAaAAAAAAADoAEAAwAAAAEAAQAAoAIABAAAAAEAAABAoAMABAAAAAEAAABAAAAAAEZRQrAAAAHLaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT4xPC9leGlmOkNvbG9yU3BhY2U+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4yNTY8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MjU2PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CuYattQAAA5sSURBVHgB7Zrbj1xHtYfX7u4Zj+/jOLHBiYnJAXKBgIkCJAGBELcX4MADEejonIfzghD/yPkHeOEFCSEkbkJCXIO4mEASASEEbEJsbGznZsf3u2emu/f5vtW7Om1DPN32JH4Yl1WzqmrXrr1+v1q1alW1q5oUyzi1ljH2hH6DgBsWsMwZuLEElrkBxLK3gM7rZQF9oo1urw6lqVVFdNpKCtcxveYEnL5Qx5nzERcvVtFbqKLfH6BtYXtT03XMzNSxZmXEmpkqrgcXrxkB5+bqOHg44vwpgENAdyGi14Cvm0lvtytIiJheFbF6fR1v3Dgg4vU0iOq1CIVfPF7HP/ZFtE9X0Z2L6AO4hbkHMmcZ6UowCC8WMb2CJTEbsfW2OjYju5DlM7nSWjrktutmidOSE3DgcD92/rkV6+YbcCgu6AqZaBoMWsGQBAq93gDoqs0RGzbWsXChigWsRqNpY6fTMxGrVtcxuyZiFouplmi9LCkBR0734ze/aMWmLlqPAE7w4hd8QwClAQFIQaaTtECSmDnAawVmuMnxXCprboq46ZY63npbxPpVI4PZ5yrSkhHQBcGPfx6x8nAVqzDn4Ww3oAv40YlLX+AyoLvmniRY1yJo02ewcUSXPE/DRfIC5SmIWL8p4r576tiGvIRVqxOkJXOCew/WcXZfKzau5+somuAAn3PEH+uFBPWz7DPwRMs/JmSHLAGWqybrK2yf4gWJOXs24vS5iGPHq/jwA3W8ZQsPR02L2rhJQ12CVMczf61iFgUXMP8uWvaQo7lPvS5ZgiyLpskVslUyM98mt0ZyRTkzWNto7dI4fjzikUerOHxSAq4uXTMBZy/WsfslZv9MFW08vQQUErpNubRlO22FGElJYhoSJKQG2JAUy6WO9FnJWpC7y7ETEb98gt3GtXIV6aqXwIV5Zv25iMPPVzH3UhWrMUu2/jTnS0wdpYq5u4uZrRepzlSHSRgugdwiKYsrM+AbnlIKPvtORezeW8Weu/px9zaHGR3N+pXTVRHgPv+rp6o4+0/W5WkydmRYq2km2Ea5AlwVEnyRPC/10kdZkuDT+dGgA9TxwXewMUSXfpkpS4hE+OypXVXceftgXJrHThMSUMeBI3V8m61u4SAen1mZZgZUsIM2rlknIMEoGzWsu9bMBH+DsrIpI7LcdB/MLGNKgqAFSFgxyHReYKAhEfYDxcHndYzGCY42fpqIgONnIr7x81ac3EdQwndq1zzAOwBPYCiWM+ozsqpk5k8hYChp4/UErrfPJaHevkDKrZB23MSQAILKmGcACe8qqeey4PunOGscwxnOruFhGYTSYmlsAvpo9IPHIw7sJW5nVAK1NE/BdwRopj2BWCCJJQlBp7KlZR/aL5f2tS2tB+kyEHwuASTnqLSABO8zvqsVpJVQr2HjHFvjpGlsAvbi6R97GhX52BxC5lXQAdq0FQKKJayCpTUELOc9CV7gNRSWBN93qSQ5VJMI2ygnWUhTOkHaJUCgEmC2ngGSZfoVAtxC6wwgeDBBGosAfzr47c4qzgFkJW+okCYOjughBa8DNHvo2XxLxCcejLiVKO2FlyN+8UTE0aMDs84FroIAudwqsq1RvhCQJk5bzjbf8Xs9vpOyIWMBReA6ZjhZ0jTBAhhMYPPJVxdnONPv2s8+D/iarOctybKzXqOUPsE+d7014u43D3qsQ56CuEcew4SxhtzimpcFmSRYt4xIK0EaGgvGGU6iLdvOd0o9Jc/nMQXPCbMcqSdlAHUXT0dPEXUZ6Bjjo0ChWAVVWqU88FQNAdmH9tSUDvdCwq4DEXv2D0AIJAMepYOYSYLPIsiSKCpKc4KnT5+CwO2X5FDw1HiYb794oorNN/NggiScRVIdJ85wPOXDLegyt9n6zBU5MLtQjuQ9XIS4YyQRKLiaG5/33IWJ4hf6vN9H2R6522S3NbMe3u1Ob5+Zdw2uzB6GSkQ5D2CzwOd5wcjy2MmIr/2sHYdP0HmCNAYBg4/ltiYBADULvuTSJjkV+Qje+KmDzeyqDDrdeWvEHVspSxR9XC6S4ZLKZWUdbSTlkn2e7jq7EhC53t0BnBBNP8NtyobUz+6J+PYOr93GJ2EsAlagZHp5JQoWoGkR1i9rk6ydL0YcYlaKFazAUt53JzsDFxoSUMgbWk5DhMQYICRBSK1F/6LF6G80f00/7wmoeJGSy8IHWMOOJ6vY/cISEuAa3bCWy0sUdMGXmx3X+yUZJSVkEN1EnMTxPfncYIZoBQUWwK6wdTPv0U+rKUspLQqCJGW0PCSJ/n5LUtLZokfxQ+IWbjpU5MljEY/upJCtyisnVV4kVXnG37yujhfmq+iMvOGHh4ELSllXMaVe/CgHJM20o/OkcQoAq7jakqTEkC8Amr72d5b1dsOjL20ek62Xo3QZv3k1x7GcDpRCxfd2cjg6xyl1NTfNi6UROP++qwBXMtC73tyPA39pR9+1T1tuX0jNUpPXNm0XiNVpRr7njQBuwNt4km3wEDvK6BVZAuEdgymBpslTdkYdS/PWzNPa9BEuWjNAc2vwYyTHycw7Lx+r4vjZPgTY0nSw079JixLgOxVffM/dvfjds3WcJBwz9M1tz2dNOU0z+6IIM3kbd3f3bvHtV9If9rNdQYA6+Z63vZYzfG66lW1R1SXAy5V5tgSv1ZM43jEQSkIgQQvJ2IByxie8OIcvOAXZW5sxryTGIsDr6M0bq/jo9l5854lOzANQpQsQI8DhzKH0Omb9gTuwHGefujP2PLc3v98LGIBk4v0Znm+/HUUhK8drHhUhCRKw5xC7yr4m1pcwvq/3d1xDYAmQlJS+RB+tZpw0FgHOVhuUD72jGy8c68evn2kNnI7KNAoZAbofK7dti3gbzi7BI1Rmx9+ZfUgwOZPeAwr+s++mTP1K6X76uf39cffAzDX/tEBBN2X1MDx2GU3jUA2Lx0ljEeBAHb6weqYVH3pnL3Y81YrzzKSKm70KcwfI3/rwERtwdJbL7O88yI7wj4EpJ3je6aDgFn4ASfBayRXSFGNv2UBfv0PfXCb0V3nNXuBlCJ3leo7Es6tq+i3+cxuqjJe0gmmufk6facXLL7LOCHbm8PIXyRcoF3mB+tN7me0mBjAW+OEfiAy5u3MtG7kZwc1dxFs/h1kb8qmFmW/8S6b9BOvZZVCA20d90gqQkpjEUtYh3/6GOtaN+ZvB2BaAaplOcAUmyBkoL2aoQ3J2rLu3//WZiP8jFL6dXeD5I4MTocrnDNLPZWL5yWfZGRhr683M5giIJKH5ngHPfk6S/s6ouZfAx7OEO0Rxmm4Blo0x7n9bn12olSQ1w7yqmJiAPI87iwzpLDhzlxMhuL9B1N9Y9y6PXCLIJIAvZhtynmDpaYjaCWmlnzLHdGxSHooasGVbVJbb4SxLBOR4Vrjj1jq2/4dMNAMMhnnVvxMT4MFGR9NF+WKKQ4ULGYBIEy2grZcyX5SIISlaTdOmH7E9CVX/BsMQLLgK+JzxhggdgNaxgl3l0+/vcS3Wwjm/RgTcgjNy+zrH2nbtodMg+T0JKHKEDAELqlhAIWPYNkJOEtO8OyTAj5CTiKZcTF4pKVPo9JkP9GL7W2r0ao9rAOlIGwSLC9fYG/jl9tYt/CbwMkhRXH1SifI6zUmCRFgWvAALIc1sJ3jbCvhG5jmhEOAQjkMSvMVc89lgBZ+A2EAc8ZkP9uJj9/ViBbG6O9a4CXUmSVV61wfu78euP7czfE3wxRkxVCFEb1yISJMG1JCQBmBaxuUENGRl3zKGKjJwgeUvSG5/K9cRbd5Zxycf7BKqUyf+nkpv6gvjpYkIEJC/y3/0wV786JF2HNlPXWCidj2imDOSpBRtqQ6JyPepAzLH4t2yPIolXGItjuU7SpJSC1hPkLV9ex3vJTy/d1s/buK3gBWctASf38re4/2ZiACH9FywbXM/Hv5sL77yFZCU0FZH1BDheX1oqryT5QZFAV5kWRopJaZYh3LwwUsI8CLkwQ/048v/uRAz/Fw8TcQl8DT7wpTvjZkmJkBF2/z5FGtu33NV/PB7rVwKYs/THAq6XtMzIwTvs8GfBpTgUPYSsLQ5dhKBNLZ3KRcSHCLHZMt87z39mF3NEsR8PKdMOus5VvNnYgJ8z3PBGsLdL36ui5Kd+NH3W9Fj388zueAlAaF3zqWBzF9+k4lXgBcCPElazguPxgdIRJ7uRmbVCPLd99fx/u2G2gPwfOGa0lURIONTkLBxbTu+9PlubHtTK77z3U4c3EV8YGjL85x5iTB6I7tP54wKVJXp45bnTuJJ0lhAwtKK6CMBbqtpAvR1jLWs/f/5XC82sObH3ecZ4Yrpmv6LjAovEKvOsTD3H61jx+/b8fjvWvHP3VWc4WpqnnjfmTc8XstWdZofSeaJ/HR8JonMwEdJH6/APFpnm+DtxzND3vZaLO7LvfjCx7mew+F1/DFiCdI1EeD3nWn/c4JEzBOoexHxEv915dBRSCDOF+Q6LkJv3tiPn/6yHd/6ajsuEtvnfSAAy7rPKFACbMMa3A0E78yv3hTx3//bi4c/0mfpAV5vvwTgHeKaCSh6aA09toH877BU+jDjv/wI6krUeX7n/snjrfjm1zux90+Qx5nCo25H4I00ENL0Xf9twu677qvjvx7uxkNvr3OfH/eQU/RaTC4ZAcMPAVTYg6v5AQE5lbR2OUnNccVzkOXya5bLY4+24gDL5RwXJRIoCdP8eDJ7S8Qdd+PsiDceemc/Nq17Zbu7Fo8/1HGksPQEjAx+ebEsl67LhYV9mgPVIe4JjrBkzp0fbGfruYLfRLi9iShvzQruH3EKznrrGre7y3Up9deVgPJRiSjLpcfU++uzbSYjTT28+7v/l/ha9/nBqK/+97oQMKqOwDMXfwF4HdxSm/roN0fL152AUWWuR9nddlmnGwQs6+kH/A0LuGEBy5yBZb8E/h81Y99qUvR12AAAAABJRU5ErkJggg==",ollama:"data:image/png;base64,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","cursor-agent":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAARGVYSWZNTQAqAAAACAABh2kABAAAAAEAAAAaAAAAAAADoAEAAwAAAAEAAQAAoAIABAAAAAEAAABAoAMABAAAAAEAAABAAAAAAEZRQrAAAAHLaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT4xPC9leGlmOkNvbG9yU3BhY2U+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4yNTY8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MjU2PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CuYattQAAAl9SURBVHgB7VtLbBvXFb0zpEXREvWjLEuKJVGyY9ix7MRJ0KToqg4cN0AR1w7swF6kXXRVoJtuumiXBdplW8BAgaApsmsXbpHEheufXLe1FUuy5F/sVH8pMvXhR7Q+pESRM73nyU9h6RmKwxkpTssHUDPz5r377jn33vcdERVTkYEiA0UGigz8/zKgFAq9sdFXm0ymm3VdqWYZBcsptP3VeoqmqnrUs+wan5ibixYiy6riam3t1u8qGv2AFOV1Xac6btRVSMMO1kmxrCkGcoOvfwhFF/9mRXbeBNTW+naTpv1aUegtNMDgn6nEerFS/FP0v6yktZ/EYkuj+SiYFwF11d5vaYr6R25kx7MGPBukIIL0IUrTiVAs3pf9Pvt5XQL8ft8ehbQOLtjwrIOX4Fa9QRle0VKH2BPGZL7RVTXKzMgrYfBnvk7gobswlKK3uV3qb/gxJ8acL7fVlB9l8Ie+LpbPMJwgQSHl7bqassOZ+dn3uQhg7PoPsys49axpGrlcLlJVlftWzSmx2XIUfR0MDNI4+f3e5xRdvcdvMc47lgAWoBsaG6mpqYXm5+ZocjJIsdgsW03j0TWXTQpSI5hMufbPmcwT3GYiVc3dpiuaY+B1jiP8amr81LZzp7imUilaSSYpEGil+Xm/IGJhYYFJYOcVPZmZdpbyt3vUVAvXMJwomRLAhvCjGbvxD9Cwenl5OQVa26i+vkF4QDqdFoRIYioqKrmMjyKRME1PT9Hy8rIoZwmqcWGX5lJNDWlKAMsyDQ/jdp7OBciSkhJ29WZqam4hj8dDyDOKeZm3bVsdVVVVMQnTFA6HRHmEjL2kmwrIRUDBbQIMXLix8TlhdZ/PJ0AD/HoJdd3uLbRjR5MIk6kp9A8xUc3BsFhTw1ECpLtXV1dznO8iv79WhFA+wNc04hsZFl6vl1pbd9Ljx48JRCwuLjrdP5AjBEjgW7duFRZvaGgUQ5x060xwVu4hFwkhAS+KREIiNJLccdoPi1VNbBOw6rJuam4OUEsgQKWlpaZxvtqk9b8ypOrq6qmysppmZqaYjIgIK7thYYsAWMjv99OuXbvJy9aHoolEIm+EKI/eXlo6n4oADCIqKtBRTpIcNvOpa1TGFgFQpiXQRq9+4zV68/AR4fYY21cd16i5rDwmMJlc4cy8azzpA1S6dq2D/nruY0FAllRLj7YIQEtut5sGB/rJx2P4yXdPUUtLwJICVgun0ymajUapo+OiqPqVhoBUHq58/fo/qbe3hw69cZiOHXuHamu3ydeOXJPJZQqHQhSPL9C9u3fp085O2rJli23Ztj1AaoAJD9z/3CcfUdfNTjp69DgdfvM7YvIjyxRy1bQ0RaMRivIMUYQXh825c5+IjtaBuVrutbJVheGOmO1F2UXff/939POf/ZS6u29aFbNW/vFcjEaGh2h6alKAh+zOG9dpgEMOoedEckZKliZY5uI3ODhAv/rlL+i1179JJ0+eokCgNauk8WMiEadQaJoW5udFAYz5+CH2z58/7xh4CN8QAiQsGaM3uH+4c/s2HTnyFr199JiY2MgymdeVlRWKhGdodhZL4zT3+F9O4WHxi5cu8Bxg2nZYZba5oQTIhkpKPDzcLdPZs3+izs5/0fHjJ+jbh94Qc36UQScam41SmGd6WB7D2tngR0dH6B/XronFlZTrxHVTCICiq/1DKVtwhs6c+S1dvXqZTp9+j9radvKEJsi9e1yUMZviouNDGXS2TqYvfcxJqTlkoW9AaPT399OHH35AQ0P9tLS09MTqT6/AAfh2X5/4OQ0eam6aB6AxTHlBgM9XITZIsNqD+8M7jKbDyI/HEzzsfWz4HjLtpk0hAOAABrtC2PmBBwC4EehMQLB4x5UrNDIy4rjry3Y2lAAJECvEysoqsVJEwzJfKmF0RV8wPTVFFy44O+xlt7VhBAAkLA2Ll5WVmbp5tkLyGaHS1d0lNkFk3kZcHe8EARzuDotv314v3B6K52N1CRDgg8EgTUxM0L72/bS9vp5lbsz5gWMeIIHD2gAP6yPPCnBJAPqHnp5unjskhZy1/cHJSXF+gHIg2YnkCAE40MA8HcDRsyMVAhz1MOPDEDk+Pi7uJYlif7CtbXV/kA9SMCfgVlDFVrJFAJSDwlj6lpZ6Lcd5tuawKuYEt271PGVhSajcH4zxdBlrDeTb8QZbfQAa/2J8jJemq1vZ2YCsPiP279+/Jw5HzGaEaBPh5eYflsmSGKttyfK2PABKjjMBWKDs27efXnihnUq9pWLpKhvI9wpZWATd5c0Ol8tYLXgbXP+z+3fp4cMHYj8RpNlJxi1ZkAgF0Fn19HTR8PAgvfjSy2J+D0BWzgPgxr29twRAAM1MaAOyPv/8Ia8q+7gfiIkZpV3waOO/W8ps1cI9lIfSOMH5+9UrYo/w4MuviHNA9Oj45UoAgiFvYGBAyJFlQSJkB4OPqI/JwSmybEuWsXt1hACpBBRGmpj4gk9yJun553fTgRdfEpMhWNAoXgEI77q7u8UVZCAPVxyZw+JDQ4Nr72RbTl0dJUAqBeVh9QcPPqOxsTFq33+A9u7dy/N5z1P9AzwHw14wOCFiH88YCe7c6eNYv8/nDHHhFZC5ESkXAbYGWemqS0sJuvnpDbbiAB08+IrYNsc7bHDCY3Deh9jHgSjS4GC/WPqihwfo7P6gQBJMsZgSoCn6LOUO3bx0kURgV/fK5Yt8hNZC6B8wd8C72+zi87z3Fw6HOc57RPjIOnk1sH6htAIsJsl0PllT423irUh8IlNpUregbFgey9w9e/byPP8Ax3ZKjP0D/f9mr1gRYVCQYLNKCk2XeNT2YHA+bFTElAAurNbWlF1iIzn+lRg6Q3R8WDfgHmM73B2WdzJBnK4pH4VnF75nJjfXTJB3LOgDs4p28qWLo7PD4Sji3Gnwa/q5tN+v3Rvc5CKAyisXz7KJbjhsmDU1AHqjgAuddboQDsfPrzVocJOTgNFRWlI05UfsCRFnndNAEwezhOvr9IhSrh+zWHxNbppyEoBaM7HFO/xlzyn+ZCq0UZ5gql0BLwR4okeqrr0bmpsbWE9EXrOLRGJluMxTcok/RW9nl21+FomATk/AX+YF8ulwNN67Hni8t+TZu4g8s/6yE1zp+xwWr3L9qq+aDB5EkKKsUxfD4X+YWPgzP+d0e1HjyR9LBGRWrK72Nrt0V6vuUqpdhO/w+LPcTU26wqeHaVWjqKamhiORxKNNbb7YWJGBIgNFBooM/A8w8B+DHe0yiJJe+gAAAABJRU5ErkJggg==",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=qo(s.slice(0,c));if(s=s.slice(c+1),t){let p=u.trim()?Wn(u):null;p&&(yield p);continue}if(u===""){let p=a.join(`
|
|
4
|
+
`);if(a=[],p==="[DONE]")return;let A=p?Wn(p):null;A&&(yield A);continue}jo(u,a)}}!t&&s&&jo(qo(s),a);let l=t?s.trim():a.join(`
|
|
5
|
+
`);if(l&&l!=="[DONE]"){let i=Wn(l);i&&(yield i)}}finally{r.cancel().catch(()=>{})}}function jo(e,n){if(!e||e.startsWith(":"))return;let t=e.indexOf(":");if(t===-1||e.slice(0,t)!=="data")return;let r=e.slice(t+1);n.push(r.startsWith(" ")?r.slice(1):r)}function qo(e){return e.endsWith("\r")?e.slice(0,-1):e}async function mi(e){let n="";for await(let t of e)if(t.type==="delta"&&t.text&&(n+=t.text),t.type==="error")throw new Error(t.message??"The run ended with an error.");return n}import{jsx as Zo}from"react/jsx-runtime";function hi({caption:e,disabled:n,className:t,...r}){let{theme:o}=H(),{options:s,selected:a,select:l,pickable:i}=wn(r);return i?Zo("span",{className:"soba-connect sc-inline","data-theme":o,children:Zo(et,{options:s,selected:a,onPick:l,...e?{caption:e}:{},...n?{disabled:n}:{},...t?{className:t}:{}})}):null}import{useEffect as gi}from"react";var Xo="data-soba-react",Ko=!1;function ht(){if(Ko||typeof document>"u"||(Ko=!0,document.querySelector(`style[${Xo}]`)))return;let e=document.createElement("style");e.setAttribute(Xo,""),e.textContent=`.soba-connect {
|
|
6
6
|
--sc-ground: #ffffff;
|
|
7
7
|
--sc-sheet: #ffffff;
|
|
8
8
|
--sc-raised: #f6f6f7;
|
|
@@ -26,6 +26,8 @@ var fs={"claude-code":{small:"haiku",large:"opus"}};function vt(e){let n=fs[e];r
|
|
|
26
26
|
--sc-tray-sunk: #efefed;
|
|
27
27
|
|
|
28
28
|
--sc-font-size: 15px;
|
|
29
|
+
|
|
30
|
+
--sc-scale: 1;
|
|
29
31
|
--sc-fs-label: max(11px, calc(var(--sc-font-size) * 0.77));
|
|
30
32
|
|
|
31
33
|
--sc-fs-small: max(12px, calc(var(--sc-font-size) * 0.87));
|
|
@@ -258,9 +260,9 @@ a.sc-btn {
|
|
|
258
260
|
.sc-tray {
|
|
259
261
|
display: grid;
|
|
260
262
|
|
|
261
|
-
gap:
|
|
262
|
-
padding:
|
|
263
|
-
border-radius:
|
|
263
|
+
gap: calc(16px * var(--sc-scale, 1));
|
|
264
|
+
padding: calc(16px * var(--sc-scale, 1));
|
|
265
|
+
border-radius: calc(18px * var(--sc-scale, 1));
|
|
264
266
|
background: var(--sc-tray, #f3f3f2);
|
|
265
267
|
}
|
|
266
268
|
|
|
@@ -271,17 +273,17 @@ a.sc-btn {
|
|
|
271
273
|
.sc-group-cap {
|
|
272
274
|
display: flex;
|
|
273
275
|
align-items: center;
|
|
274
|
-
gap: 4px;
|
|
275
|
-
min-height: 22px;
|
|
276
|
+
gap: calc(4px * var(--sc-scale, 1));
|
|
277
|
+
min-height: calc(22px * var(--sc-scale, 1));
|
|
276
278
|
|
|
277
|
-
padding: 0 0 8px 4px;
|
|
279
|
+
padding: 0 0 calc(8px * var(--sc-scale, 1)) calc(4px * var(--sc-scale, 1));
|
|
278
280
|
}
|
|
279
281
|
|
|
280
282
|
.sc-cap-acts {
|
|
281
283
|
flex: none;
|
|
282
284
|
display: flex;
|
|
283
285
|
align-items: center;
|
|
284
|
-
gap: 4px;
|
|
286
|
+
gap: calc(4px * var(--sc-scale, 1));
|
|
285
287
|
}
|
|
286
288
|
|
|
287
289
|
.sc-group-title {
|
|
@@ -291,14 +293,15 @@ a.sc-btn {
|
|
|
291
293
|
overflow: hidden;
|
|
292
294
|
text-overflow: ellipsis;
|
|
293
295
|
white-space: nowrap;
|
|
294
|
-
font-size:
|
|
296
|
+
font-size: calc(var(--sc-font-size, 15px) * 0.9333);
|
|
295
297
|
letter-spacing: 0;
|
|
296
298
|
color: var(--sc-muted, #6b6b73);
|
|
297
299
|
}
|
|
298
300
|
|
|
299
301
|
.sc-group-card {
|
|
300
|
-
padding: 7px 0 7px
|
|
301
|
-
|
|
302
|
+
padding: calc(7px * var(--sc-scale, 1)) 0 calc(7px * var(--sc-scale, 1))
|
|
303
|
+
calc(12px * var(--sc-scale, 1));
|
|
304
|
+
border-radius: calc(12px * var(--sc-scale, 1));
|
|
302
305
|
background: var(--sc-tray-card, #ffffff);
|
|
303
306
|
box-shadow:
|
|
304
307
|
var(--sc-shadow-1),
|
|
@@ -310,8 +313,8 @@ a.sc-btn {
|
|
|
310
313
|
display: grid;
|
|
311
314
|
place-items: center;
|
|
312
315
|
|
|
313
|
-
width: 36px;
|
|
314
|
-
height: 36px;
|
|
316
|
+
width: calc(36px * var(--sc-scale, 1));
|
|
317
|
+
height: calc(36px * var(--sc-scale, 1));
|
|
315
318
|
padding: 0;
|
|
316
319
|
border: 0;
|
|
317
320
|
border-radius: 50%;
|
|
@@ -332,8 +335,8 @@ a.sc-btn {
|
|
|
332
335
|
}
|
|
333
336
|
|
|
334
337
|
.sc-dglyph {
|
|
335
|
-
width: 13px;
|
|
336
|
-
height: 13px;
|
|
338
|
+
width: calc(13px * var(--sc-scale, 1));
|
|
339
|
+
height: calc(13px * var(--sc-scale, 1));
|
|
337
340
|
}
|
|
338
341
|
|
|
339
342
|
@keyframes sc-spin {
|
|
@@ -349,9 +352,10 @@ a.sc-btn {
|
|
|
349
352
|
.sc-mrow {
|
|
350
353
|
display: flex;
|
|
351
354
|
align-items: center;
|
|
352
|
-
gap: 14px;
|
|
353
|
-
min-height: 52px;
|
|
354
|
-
padding: 7px 16px
|
|
355
|
+
gap: calc(14px * var(--sc-scale, 1));
|
|
356
|
+
min-height: calc(52px * var(--sc-scale, 1));
|
|
357
|
+
padding: calc(7px * var(--sc-scale, 1)) calc(16px * var(--sc-scale, 1))
|
|
358
|
+
calc(7px * var(--sc-scale, 1)) calc(4px * var(--sc-scale, 1));
|
|
355
359
|
}
|
|
356
360
|
|
|
357
361
|
.sc-mtile {
|
|
@@ -359,27 +363,27 @@ a.sc-btn {
|
|
|
359
363
|
flex: none;
|
|
360
364
|
display: grid;
|
|
361
365
|
place-items: center;
|
|
362
|
-
width:
|
|
363
|
-
height:
|
|
366
|
+
width: calc(36px * var(--sc-scale, 1));
|
|
367
|
+
height: calc(36px * var(--sc-scale, 1));
|
|
364
368
|
|
|
365
|
-
border-radius:
|
|
369
|
+
border-radius: calc(9px * var(--sc-scale, 1));
|
|
366
370
|
|
|
367
371
|
background: var(--sc-tray-sunk, #efefed);
|
|
368
372
|
color: var(--sc-text, #1b1b1a);
|
|
369
373
|
}
|
|
370
374
|
|
|
371
375
|
.sc-mglyph {
|
|
372
|
-
width: 24px;
|
|
373
|
-
height: 19px;
|
|
376
|
+
width: calc(24px * var(--sc-scale, 1));
|
|
377
|
+
height: calc(19px * var(--sc-scale, 1));
|
|
374
378
|
}
|
|
375
379
|
|
|
376
380
|
.sc-mbadge {
|
|
377
381
|
position: absolute;
|
|
378
382
|
left: auto;
|
|
379
|
-
bottom: -3px;
|
|
380
|
-
right: -3px;
|
|
381
|
-
width: 14px;
|
|
382
|
-
height: 14px;
|
|
383
|
+
bottom: calc(-3px * var(--sc-scale, 1));
|
|
384
|
+
right: calc(-3px * var(--sc-scale, 1));
|
|
385
|
+
width: calc(14px * var(--sc-scale, 1));
|
|
386
|
+
height: calc(14px * var(--sc-scale, 1));
|
|
383
387
|
border-radius: 50%;
|
|
384
388
|
transform: none;
|
|
385
389
|
box-shadow: 0 0 0 2.5px var(--sc-tray-card, #ffffff);
|
|
@@ -413,15 +417,15 @@ a.sc-btn {
|
|
|
413
417
|
overflow: hidden;
|
|
414
418
|
text-overflow: ellipsis;
|
|
415
419
|
white-space: nowrap;
|
|
416
|
-
font-size:
|
|
420
|
+
font-size: calc(var(--sc-font-size, 15px) * 1.0667);
|
|
417
421
|
font-weight: 600;
|
|
418
422
|
}
|
|
419
423
|
|
|
420
424
|
.sc-mmeta {
|
|
421
425
|
display: flex;
|
|
422
426
|
align-items: baseline;
|
|
423
|
-
gap: 10px;
|
|
424
|
-
font-size:
|
|
427
|
+
gap: calc(10px * var(--sc-scale, 1));
|
|
428
|
+
font-size: calc(var(--sc-font-size, 15px) * 0.9333);
|
|
425
429
|
line-height: 1.35;
|
|
426
430
|
color: var(--sc-muted, #6b6b73);
|
|
427
431
|
}
|
|
@@ -441,16 +445,16 @@ a.sc-btn {
|
|
|
441
445
|
}
|
|
442
446
|
|
|
443
447
|
.sc-mmeta-sep {
|
|
444
|
-
padding: 0 6px;
|
|
448
|
+
padding: 0 calc(6px * var(--sc-scale, 1));
|
|
445
449
|
color: var(--sc-line-2, #dcdce0);
|
|
446
450
|
}
|
|
447
451
|
|
|
448
452
|
.sc-mrow-btn {
|
|
449
|
-
width: calc(100% + 4px);
|
|
450
|
-
margin-left: -4px;
|
|
451
|
-
padding-left: 4px;
|
|
453
|
+
width: calc(100% + calc(4px * var(--sc-scale, 1)));
|
|
454
|
+
margin-left: calc(-4px * var(--sc-scale, 1));
|
|
455
|
+
padding-left: calc(4px * var(--sc-scale, 1));
|
|
452
456
|
border: 0;
|
|
453
|
-
border-radius: 10px;
|
|
457
|
+
border-radius: calc(10px * var(--sc-scale, 1));
|
|
454
458
|
background: transparent;
|
|
455
459
|
color: inherit;
|
|
456
460
|
font: inherit;
|
|
@@ -469,8 +473,8 @@ a.sc-btn {
|
|
|
469
473
|
|
|
470
474
|
.sc-chev {
|
|
471
475
|
flex: none;
|
|
472
|
-
width: 14px;
|
|
473
|
-
height: 14px;
|
|
476
|
+
width: calc(14px * var(--sc-scale, 1));
|
|
477
|
+
height: calc(14px * var(--sc-scale, 1));
|
|
474
478
|
color: var(--sc-muted, #6b6b73);
|
|
475
479
|
transition: transform 120ms ease;
|
|
476
480
|
}
|
|
@@ -480,21 +484,21 @@ a.sc-btn {
|
|
|
480
484
|
}
|
|
481
485
|
|
|
482
486
|
.sc-group-card:has(> .sc-rrow) {
|
|
483
|
-
padding: 0 16px;
|
|
487
|
+
padding: 0 calc(16px * var(--sc-scale, 1));
|
|
484
488
|
}
|
|
485
489
|
.sc-rrow {
|
|
486
490
|
display: flex;
|
|
487
491
|
align-items: center;
|
|
488
|
-
gap: 14px;
|
|
489
|
-
padding: 14px 0;
|
|
492
|
+
gap: calc(14px * var(--sc-scale, 1));
|
|
493
|
+
padding: calc(14px * var(--sc-scale, 1)) 0;
|
|
490
494
|
}
|
|
491
495
|
.sc-rrow + .sc-rrow {
|
|
492
496
|
box-shadow: inset 0 1px 0 var(--sc-line, #e9e9e7);
|
|
493
497
|
}
|
|
494
498
|
.sc-rdot {
|
|
495
499
|
flex: none;
|
|
496
|
-
width: 10px;
|
|
497
|
-
height: 10px;
|
|
500
|
+
width: calc(10px * var(--sc-scale, 1));
|
|
501
|
+
height: calc(10px * var(--sc-scale, 1));
|
|
498
502
|
border-radius: 50%;
|
|
499
503
|
background: var(--sc-line-2, #dcdce0);
|
|
500
504
|
}
|
|
@@ -519,7 +523,7 @@ a.sc-btn {
|
|
|
519
523
|
overflow: hidden;
|
|
520
524
|
text-overflow: ellipsis;
|
|
521
525
|
white-space: nowrap;
|
|
522
|
-
font-size: 15px;
|
|
526
|
+
font-size: calc(var(--sc-font-size, 15px) * 1);
|
|
523
527
|
font-weight: 500;
|
|
524
528
|
}
|
|
525
529
|
|
|
@@ -527,9 +531,10 @@ a.sc-btn {
|
|
|
527
531
|
flex: none;
|
|
528
532
|
display: grid;
|
|
529
533
|
place-items: center;
|
|
530
|
-
width: 44px;
|
|
531
|
-
height: 44px;
|
|
532
|
-
margin: -8px -10px -
|
|
534
|
+
width: calc(44px * var(--sc-scale, 1));
|
|
535
|
+
height: calc(44px * var(--sc-scale, 1));
|
|
536
|
+
margin: calc(-8px * var(--sc-scale, 1)) calc(-10px * var(--sc-scale, 1))
|
|
537
|
+
calc(-8px * var(--sc-scale, 1)) 0;
|
|
533
538
|
padding: 0;
|
|
534
539
|
border: 0;
|
|
535
540
|
border-radius: 50%;
|
|
@@ -541,8 +546,8 @@ a.sc-btn {
|
|
|
541
546
|
.sc-rstop-ring {
|
|
542
547
|
display: grid;
|
|
543
548
|
place-items: center;
|
|
544
|
-
width: 28px;
|
|
545
|
-
height: 28px;
|
|
549
|
+
width: calc(28px * var(--sc-scale, 1));
|
|
550
|
+
height: calc(28px * var(--sc-scale, 1));
|
|
546
551
|
border-radius: 50%;
|
|
547
552
|
box-shadow: inset 0 0 0 1px var(--sc-line, #e9e9e7);
|
|
548
553
|
transition:
|
|
@@ -558,8 +563,8 @@ a.sc-btn {
|
|
|
558
563
|
box-shadow: inset 0 0 0 1px transparent;
|
|
559
564
|
}
|
|
560
565
|
.sc-rstop .sc-dglyph {
|
|
561
|
-
width: 10px;
|
|
562
|
-
height: 10px;
|
|
566
|
+
width: calc(10px * var(--sc-scale, 1));
|
|
567
|
+
height: calc(10px * var(--sc-scale, 1));
|
|
563
568
|
}
|
|
564
569
|
.sc-rstop:disabled {
|
|
565
570
|
cursor: default;
|
|
@@ -571,7 +576,7 @@ a.sc-btn {
|
|
|
571
576
|
-webkit-box-orient: vertical;
|
|
572
577
|
-webkit-line-clamp: 2;
|
|
573
578
|
line-clamp: 2;
|
|
574
|
-
font-size:
|
|
579
|
+
font-size: max(12px, calc(var(--sc-font-size, 15px) * 0.8667));
|
|
575
580
|
line-height: 1.4;
|
|
576
581
|
color: var(--sc-muted, #6b6b69);
|
|
577
582
|
font-variant-numeric: tabular-nums;
|
|
@@ -581,48 +586,49 @@ a.sc-btn {
|
|
|
581
586
|
display: flex;
|
|
582
587
|
flex-direction: column;
|
|
583
588
|
align-items: center;
|
|
584
|
-
gap: 12px;
|
|
585
|
-
padding: 24px 24px
|
|
589
|
+
gap: calc(12px * var(--sc-scale, 1));
|
|
590
|
+
padding: calc(24px * var(--sc-scale, 1)) calc(24px * var(--sc-scale, 1))
|
|
591
|
+
calc(26px * var(--sc-scale, 1));
|
|
586
592
|
text-align: center;
|
|
587
593
|
}
|
|
588
594
|
.sc-blank-mark {
|
|
589
595
|
display: grid;
|
|
590
596
|
place-items: center;
|
|
591
|
-
width:
|
|
592
|
-
height:
|
|
597
|
+
width: calc(36px * var(--sc-scale, 1));
|
|
598
|
+
height: calc(36px * var(--sc-scale, 1));
|
|
593
599
|
border-radius: 50%;
|
|
594
600
|
background: var(--sc-tray-sunk, #efefed);
|
|
595
601
|
color: var(--sc-faint, #8c8c89);
|
|
596
602
|
}
|
|
597
603
|
.sc-blank-glyph {
|
|
598
|
-
width: 20px;
|
|
599
|
-
height: 20px;
|
|
604
|
+
width: calc(20px * var(--sc-scale, 1));
|
|
605
|
+
height: calc(20px * var(--sc-scale, 1));
|
|
600
606
|
}
|
|
601
607
|
.sc-blank-say {
|
|
602
608
|
display: flex;
|
|
603
609
|
flex-direction: column;
|
|
604
|
-
gap: 4px;
|
|
610
|
+
gap: calc(4px * var(--sc-scale, 1));
|
|
605
611
|
}
|
|
606
612
|
.sc-blank-title {
|
|
607
|
-
font-size:
|
|
613
|
+
font-size: calc(var(--sc-font-size, 15px) * 1.0667);
|
|
608
614
|
font-weight: 600;
|
|
609
615
|
}
|
|
610
616
|
.sc-blank-body {
|
|
611
|
-
font-size:
|
|
612
|
-
line-height: 20px;
|
|
617
|
+
font-size: calc(var(--sc-font-size, 15px) * 0.9333);
|
|
618
|
+
line-height: calc(20px * var(--sc-scale, 1));
|
|
613
619
|
color: var(--sc-muted, #6b6b69);
|
|
614
620
|
}
|
|
615
621
|
|
|
616
622
|
.sc-blank-act {
|
|
617
623
|
display: inline-flex;
|
|
618
624
|
align-items: center;
|
|
619
|
-
gap: 7px;
|
|
620
|
-
height: 36px;
|
|
621
|
-
padding: 0 14px;
|
|
625
|
+
gap: calc(7px * var(--sc-scale, 1));
|
|
626
|
+
height: calc(36px * var(--sc-scale, 1));
|
|
627
|
+
padding: 0 calc(14px * var(--sc-scale, 1));
|
|
622
628
|
border: 1px solid var(--sc-line, #e6e6e3);
|
|
623
|
-
border-radius: 11px;
|
|
629
|
+
border-radius: calc(11px * var(--sc-scale, 1));
|
|
624
630
|
color: var(--sc-text, #1b1b1a);
|
|
625
|
-
font-size:
|
|
631
|
+
font-size: calc(var(--sc-font-size, 15px) * 0.9333);
|
|
626
632
|
font-weight: 600;
|
|
627
633
|
text-decoration: none;
|
|
628
634
|
transition: background 120ms ease;
|
|
@@ -634,10 +640,11 @@ a.sc-btn {
|
|
|
634
640
|
.sc-alarm {
|
|
635
641
|
display: flex;
|
|
636
642
|
align-items: flex-start;
|
|
637
|
-
gap: 14px;
|
|
638
|
-
margin: -7px -0 -7px -
|
|
639
|
-
|
|
640
|
-
|
|
643
|
+
gap: calc(14px * var(--sc-scale, 1));
|
|
644
|
+
margin: calc(-7px * var(--sc-scale, 1)) -0 calc(-7px * var(--sc-scale, 1))
|
|
645
|
+
calc(-12px * var(--sc-scale, 1));
|
|
646
|
+
padding: calc(16px * var(--sc-scale, 1));
|
|
647
|
+
border-radius: calc(12px * var(--sc-scale, 1));
|
|
641
648
|
background: color-mix(in srgb, var(--sc-danger, #c2452d) 9%, var(--sc-tray-card, #ffffff));
|
|
642
649
|
}
|
|
643
650
|
|
|
@@ -645,13 +652,13 @@ a.sc-btn {
|
|
|
645
652
|
flex: none;
|
|
646
653
|
display: grid;
|
|
647
654
|
place-items: center;
|
|
648
|
-
width: 30px;
|
|
655
|
+
width: calc(30px * var(--sc-scale, 1));
|
|
649
656
|
margin-top: 1px;
|
|
650
657
|
color: var(--sc-danger, #c2452d);
|
|
651
658
|
}
|
|
652
659
|
.sc-alarm-mark .sc-hglyph {
|
|
653
|
-
width: 22px;
|
|
654
|
-
height: 22px;
|
|
660
|
+
width: calc(22px * var(--sc-scale, 1));
|
|
661
|
+
height: calc(22px * var(--sc-scale, 1));
|
|
655
662
|
}
|
|
656
663
|
|
|
657
664
|
.sc-alarm-warn {
|
|
@@ -661,42 +668,93 @@ a.sc-btn {
|
|
|
661
668
|
color: var(--sc-warn, #b06f14);
|
|
662
669
|
}
|
|
663
670
|
.sc-alarm + .sc-alarm {
|
|
664
|
-
margin-top: 8px;
|
|
671
|
+
margin-top: calc(8px * var(--sc-scale, 1));
|
|
665
672
|
}
|
|
666
673
|
.sc-alarm-say {
|
|
667
674
|
display: flex;
|
|
668
675
|
flex-direction: column;
|
|
669
|
-
gap: 4px;
|
|
676
|
+
gap: calc(4px * var(--sc-scale, 1));
|
|
670
677
|
min-width: 0;
|
|
671
678
|
}
|
|
672
679
|
.sc-alarm-title {
|
|
673
|
-
font-size:
|
|
680
|
+
font-size: calc(var(--sc-font-size, 15px) * 1.0667);
|
|
674
681
|
font-weight: 600;
|
|
675
682
|
}
|
|
676
683
|
.sc-alarm-body {
|
|
677
|
-
font-size:
|
|
678
|
-
line-height: 20px;
|
|
684
|
+
font-size: calc(var(--sc-font-size, 15px) * 0.9333);
|
|
685
|
+
line-height: calc(20px * var(--sc-scale, 1));
|
|
679
686
|
color: var(--sc-text-2, #5a4a46);
|
|
680
687
|
}
|
|
681
688
|
|
|
682
|
-
.sc-
|
|
689
|
+
.sc-away {
|
|
690
|
+
display: flex;
|
|
691
|
+
align-items: center;
|
|
692
|
+
gap: calc(12px * var(--sc-scale, 1));
|
|
693
|
+
padding: calc(6px * var(--sc-scale, 1)) calc(12px * var(--sc-scale, 1))
|
|
694
|
+
calc(6px * var(--sc-scale, 1)) 0;
|
|
695
|
+
}
|
|
696
|
+
.sc-away-mark {
|
|
697
|
+
flex: none;
|
|
683
698
|
display: grid;
|
|
684
699
|
place-items: center;
|
|
700
|
+
width: calc(36px * var(--sc-scale, 1));
|
|
701
|
+
height: calc(36px * var(--sc-scale, 1));
|
|
702
|
+
border-radius: calc(9px * var(--sc-scale, 1));
|
|
703
|
+
background: var(--sc-tray-sunk, #efefed);
|
|
685
704
|
color: var(--sc-text, #1b1b1a);
|
|
686
705
|
}
|
|
687
|
-
.sc-
|
|
688
|
-
width:
|
|
689
|
-
height:
|
|
706
|
+
.sc-away-mark .bx {
|
|
707
|
+
width: calc(26px * var(--sc-scale, 1));
|
|
708
|
+
height: calc(26px * var(--sc-scale, 1));
|
|
709
|
+
--bx-w: 24;
|
|
710
|
+
}
|
|
711
|
+
.sc-away-say {
|
|
712
|
+
flex: 1;
|
|
713
|
+
display: flex;
|
|
714
|
+
flex-direction: column;
|
|
715
|
+
gap: 2px;
|
|
716
|
+
min-width: 0;
|
|
717
|
+
}
|
|
718
|
+
.sc-away-title {
|
|
719
|
+
font-size: calc(var(--sc-font-size, 15px) * 1);
|
|
720
|
+
font-weight: 600;
|
|
721
|
+
}
|
|
722
|
+
.sc-away-body {
|
|
723
|
+
font-size: calc(var(--sc-font-size, 15px) * 0.8667);
|
|
724
|
+
line-height: 1.35;
|
|
725
|
+
color: var(--sc-muted, #6b6b73);
|
|
726
|
+
}
|
|
727
|
+
.sc-away-go {
|
|
728
|
+
flex: none;
|
|
729
|
+
height: calc(32px * var(--sc-scale, 1));
|
|
730
|
+
padding: 0 calc(14px * var(--sc-scale, 1));
|
|
731
|
+
border: 0;
|
|
732
|
+
border-radius: 999px;
|
|
733
|
+
background: var(--sc-accent, #1b1b1a);
|
|
734
|
+
color: var(--sc-accent-fg, #ffffff);
|
|
735
|
+
font: inherit;
|
|
736
|
+
font-size: calc(var(--sc-font-size, 15px) * 0.9333);
|
|
737
|
+
font-weight: 600;
|
|
738
|
+
cursor: pointer;
|
|
739
|
+
transition: opacity 120ms ease;
|
|
740
|
+
}
|
|
741
|
+
.sc-away-go:hover:not(:disabled) {
|
|
742
|
+
opacity: 0.88;
|
|
743
|
+
}
|
|
744
|
+
.sc-away-go:disabled {
|
|
745
|
+
opacity: 0.5;
|
|
746
|
+
cursor: default;
|
|
690
747
|
}
|
|
691
748
|
|
|
692
749
|
.sc-cap-link {
|
|
693
750
|
flex: none;
|
|
694
|
-
margin: -8px -4px -
|
|
695
|
-
|
|
751
|
+
margin: calc(-8px * var(--sc-scale, 1)) calc(-4px * var(--sc-scale, 1))
|
|
752
|
+
calc(-8px * var(--sc-scale, 1)) 0;
|
|
753
|
+
padding: calc(8px * var(--sc-scale, 1)) calc(4px * var(--sc-scale, 1));
|
|
696
754
|
border: 0;
|
|
697
755
|
background: transparent;
|
|
698
756
|
font: inherit;
|
|
699
|
-
font-size:
|
|
757
|
+
font-size: max(12px, calc(var(--sc-font-size, 15px) * 0.8667));
|
|
700
758
|
color: var(--sc-text-2, #3f3f46);
|
|
701
759
|
text-decoration: underline;
|
|
702
760
|
text-underline-offset: 2px;
|
|
@@ -709,20 +767,20 @@ a.sc-btn {
|
|
|
709
767
|
.sc-acts {
|
|
710
768
|
display: flex;
|
|
711
769
|
flex-direction: column;
|
|
712
|
-
gap: 4px;
|
|
770
|
+
gap: calc(4px * var(--sc-scale, 1));
|
|
713
771
|
}
|
|
714
772
|
.sc-act-go {
|
|
715
773
|
display: flex;
|
|
716
774
|
align-items: center;
|
|
717
775
|
justify-content: center;
|
|
718
|
-
gap: 9px;
|
|
719
|
-
height: 48px;
|
|
776
|
+
gap: calc(9px * var(--sc-scale, 1));
|
|
777
|
+
height: calc(48px * var(--sc-scale, 1));
|
|
720
778
|
border: 0;
|
|
721
|
-
border-radius:
|
|
779
|
+
border-radius: calc(10px * var(--sc-scale, 1));
|
|
722
780
|
background: var(--sc-accent, #1b1b1a);
|
|
723
781
|
color: var(--sc-accent-fg, #ffffff);
|
|
724
782
|
font: inherit;
|
|
725
|
-
font-size: 15px;
|
|
783
|
+
font-size: calc(var(--sc-font-size, 15px) * 1);
|
|
726
784
|
font-weight: 600;
|
|
727
785
|
cursor: pointer;
|
|
728
786
|
transition: opacity 120ms ease;
|
|
@@ -730,41 +788,75 @@ a.sc-btn {
|
|
|
730
788
|
.sc-act-go:hover:not(:disabled) {
|
|
731
789
|
opacity: 0.88;
|
|
732
790
|
}
|
|
733
|
-
|
|
791
|
+
|
|
792
|
+
.sc-acts-row {
|
|
734
793
|
display: flex;
|
|
735
794
|
align-items: center;
|
|
736
|
-
justify-content:
|
|
737
|
-
|
|
738
|
-
|
|
795
|
+
justify-content: space-between;
|
|
796
|
+
}
|
|
797
|
+
.sc-act-small {
|
|
798
|
+
display: inline-flex;
|
|
799
|
+
align-items: center;
|
|
800
|
+
gap: calc(7px * var(--sc-scale, 1));
|
|
801
|
+
height: calc(36px * var(--sc-scale, 1));
|
|
802
|
+
padding: 0 calc(12px * var(--sc-scale, 1)) 0 calc(15px * var(--sc-scale, 1));
|
|
739
803
|
border: 0;
|
|
740
|
-
border-radius:
|
|
741
|
-
background:
|
|
804
|
+
border-radius: 999px;
|
|
805
|
+
background: var(--sc-tray-card, #ffffff);
|
|
806
|
+
box-shadow:
|
|
807
|
+
var(--sc-shadow-1),
|
|
808
|
+
inset 0 0 0 1px color-mix(in srgb, var(--sc-line, #e9e9eb) 70%, transparent);
|
|
809
|
+
color: var(--sc-text, #1a1a1c);
|
|
742
810
|
font: inherit;
|
|
743
|
-
font-size:
|
|
744
|
-
|
|
811
|
+
font-size: calc(var(--sc-font-size, 15px) * 0.9333);
|
|
812
|
+
font-weight: 550;
|
|
813
|
+
letter-spacing: -0.005em;
|
|
745
814
|
cursor: pointer;
|
|
815
|
+
transition:
|
|
816
|
+
box-shadow 140ms ease,
|
|
817
|
+
transform 140ms ease;
|
|
746
818
|
}
|
|
747
|
-
.sc-act-
|
|
748
|
-
|
|
819
|
+
.sc-act-small .sc-dglyph {
|
|
820
|
+
width: calc(12px * var(--sc-scale, 1));
|
|
821
|
+
height: calc(12px * var(--sc-scale, 1));
|
|
822
|
+
color: var(--sc-muted, #6b6b73);
|
|
823
|
+
transition:
|
|
824
|
+
color 140ms ease,
|
|
825
|
+
transform 140ms ease;
|
|
749
826
|
}
|
|
750
|
-
.sc-act-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
827
|
+
.sc-act-small:hover:not(:disabled) {
|
|
828
|
+
box-shadow:
|
|
829
|
+
var(--sc-shadow-1),
|
|
830
|
+
inset 0 0 0 1px var(--sc-line, #e9e9eb);
|
|
754
831
|
}
|
|
755
|
-
.sc-act-
|
|
756
|
-
|
|
757
|
-
|
|
832
|
+
.sc-act-small:hover:not(:disabled) .sc-dglyph {
|
|
833
|
+
color: var(--sc-text, #1a1a1c);
|
|
834
|
+
transform: translate(1px, -1px);
|
|
835
|
+
}
|
|
836
|
+
.sc-act-small:active:not(:disabled) {
|
|
837
|
+
transform: scale(0.98);
|
|
758
838
|
}
|
|
839
|
+
@media (prefers-reduced-motion: reduce) {
|
|
840
|
+
.sc-act-small,
|
|
841
|
+
.sc-act-small .sc-dglyph {
|
|
842
|
+
transition: none;
|
|
843
|
+
}
|
|
844
|
+
.sc-act-small:active:not(:disabled),
|
|
845
|
+
.sc-act-small:hover:not(:disabled) .sc-dglyph {
|
|
846
|
+
transform: none;
|
|
847
|
+
}
|
|
848
|
+
}
|
|
849
|
+
.sc-act-go:disabled,
|
|
850
|
+
.sc-act-go[data-spin],
|
|
759
851
|
.sc-act-glyph {
|
|
760
852
|
flex: none;
|
|
761
|
-
width: 15px;
|
|
762
|
-
height: 15px;
|
|
853
|
+
width: calc(15px * var(--sc-scale, 1));
|
|
854
|
+
height: calc(15px * var(--sc-scale, 1));
|
|
763
855
|
}
|
|
764
856
|
|
|
765
857
|
.sc-act-miss {
|
|
766
|
-
margin: 4px 2px 0;
|
|
767
|
-
font-size:
|
|
858
|
+
margin: calc(4px * var(--sc-scale, 1)) 2px 0;
|
|
859
|
+
font-size: max(12px, calc(var(--sc-font-size, 15px) * 0.8667));
|
|
768
860
|
line-height: 1.5;
|
|
769
861
|
color: var(--sc-muted, #6b6b69);
|
|
770
862
|
text-align: center;
|
|
@@ -773,26 +865,26 @@ a.sc-btn {
|
|
|
773
865
|
.sc-arow {
|
|
774
866
|
display: flex;
|
|
775
867
|
align-items: center;
|
|
776
|
-
gap: 10px;
|
|
777
|
-
min-height: 30px;
|
|
778
|
-
padding-right: 12px;
|
|
868
|
+
gap: calc(10px * var(--sc-scale, 1));
|
|
869
|
+
min-height: calc(30px * var(--sc-scale, 1));
|
|
870
|
+
padding-right: calc(12px * var(--sc-scale, 1));
|
|
779
871
|
}
|
|
780
872
|
|
|
781
873
|
.sc-runtime-tile {
|
|
782
874
|
flex: none;
|
|
783
875
|
display: grid;
|
|
784
876
|
place-items: center;
|
|
785
|
-
width: 30px;
|
|
786
|
-
height: 30px;
|
|
787
|
-
border-radius: var(--sc-r-sm, 6px);
|
|
877
|
+
width: calc(30px * var(--sc-scale, 1));
|
|
878
|
+
height: calc(30px * var(--sc-scale, 1));
|
|
879
|
+
border-radius: var(--sc-r-sm, calc(6px * var(--sc-scale, 1)));
|
|
788
880
|
border: 1px solid var(--sc-line, #e9e9eb);
|
|
789
881
|
background: var(--sc-tray-sunk, #f6f6f7);
|
|
790
882
|
}
|
|
791
883
|
|
|
792
884
|
.sc-runtime-logo {
|
|
793
|
-
width: 15px;
|
|
794
|
-
height: 15px;
|
|
795
|
-
border-radius: 3px;
|
|
885
|
+
width: calc(15px * var(--sc-scale, 1));
|
|
886
|
+
height: calc(15px * var(--sc-scale, 1));
|
|
887
|
+
border-radius: calc(3px * var(--sc-scale, 1));
|
|
796
888
|
object-fit: contain;
|
|
797
889
|
}
|
|
798
890
|
|
|
@@ -804,8 +896,8 @@ a.sc-btn {
|
|
|
804
896
|
}
|
|
805
897
|
|
|
806
898
|
.sc-runtime-mark {
|
|
807
|
-
width: 13px;
|
|
808
|
-
height: 13px;
|
|
899
|
+
width: calc(13px * var(--sc-scale, 1));
|
|
900
|
+
height: calc(13px * var(--sc-scale, 1));
|
|
809
901
|
color: var(--sc-text-2, #3f3f46);
|
|
810
902
|
}
|
|
811
903
|
|
|
@@ -834,31 +926,31 @@ a.sc-btn {
|
|
|
834
926
|
.sc-orow {
|
|
835
927
|
display: flex;
|
|
836
928
|
align-items: center;
|
|
837
|
-
gap: 18px;
|
|
838
|
-
min-height: 34px;
|
|
839
|
-
padding-right: 12px;
|
|
929
|
+
gap: calc(18px * var(--sc-scale, 1));
|
|
930
|
+
min-height: calc(34px * var(--sc-scale, 1));
|
|
931
|
+
padding-right: calc(12px * var(--sc-scale, 1));
|
|
840
932
|
}
|
|
841
933
|
|
|
842
934
|
.sc-otile {
|
|
843
935
|
flex: none;
|
|
844
936
|
display: grid;
|
|
845
937
|
place-items: center;
|
|
846
|
-
width: 22px;
|
|
847
|
-
height: 22px;
|
|
848
|
-
border-radius: var(--sc-r-sm, 6px);
|
|
938
|
+
width: calc(22px * var(--sc-scale, 1));
|
|
939
|
+
height: calc(22px * var(--sc-scale, 1));
|
|
940
|
+
border-radius: var(--sc-r-sm, calc(6px * var(--sc-scale, 1)));
|
|
849
941
|
background: var(--sc-tray-sunk, #f6f6f7);
|
|
850
942
|
color: var(--sc-muted, #6b6b73);
|
|
851
943
|
}
|
|
852
944
|
|
|
853
945
|
.sc-otile .sc-mglyph {
|
|
854
|
-
width: 15px;
|
|
855
|
-
height: 11px;
|
|
946
|
+
width: calc(15px * var(--sc-scale, 1));
|
|
947
|
+
height: calc(11px * var(--sc-scale, 1));
|
|
856
948
|
}
|
|
857
949
|
|
|
858
950
|
.sc-oglyph,
|
|
859
951
|
.sc-omark {
|
|
860
|
-
width: 13px;
|
|
861
|
-
height: 13px;
|
|
952
|
+
width: calc(13px * var(--sc-scale, 1));
|
|
953
|
+
height: calc(13px * var(--sc-scale, 1));
|
|
862
954
|
}
|
|
863
955
|
|
|
864
956
|
.sc-oname {
|
|
@@ -880,13 +972,13 @@ a.sc-btn {
|
|
|
880
972
|
.sc-pair {
|
|
881
973
|
display: flex;
|
|
882
974
|
align-items: center;
|
|
883
|
-
gap: 18px;
|
|
884
|
-
width: calc(100% + 4px);
|
|
885
|
-
min-height: 34px;
|
|
886
|
-
margin-left: -4px;
|
|
887
|
-
padding: 0 12px 0 4px;
|
|
975
|
+
gap: calc(18px * var(--sc-scale, 1));
|
|
976
|
+
width: calc(100% + calc(4px * var(--sc-scale, 1)));
|
|
977
|
+
min-height: calc(34px * var(--sc-scale, 1));
|
|
978
|
+
margin-left: calc(-4px * var(--sc-scale, 1));
|
|
979
|
+
padding: 0 calc(12px * var(--sc-scale, 1)) 0 calc(4px * var(--sc-scale, 1));
|
|
888
980
|
border: 0;
|
|
889
|
-
border-radius: 8px;
|
|
981
|
+
border-radius: calc(8px * var(--sc-scale, 1));
|
|
890
982
|
background: transparent;
|
|
891
983
|
font: inherit;
|
|
892
984
|
font-size: var(--sc-fs-small);
|
|
@@ -911,7 +1003,7 @@ a.sc-btn {
|
|
|
911
1003
|
|
|
912
1004
|
.sc-row-note {
|
|
913
1005
|
margin: 0;
|
|
914
|
-
padding: 2px 12px 4px 0;
|
|
1006
|
+
padding: 2px calc(12px * var(--sc-scale, 1)) calc(4px * var(--sc-scale, 1)) 0;
|
|
915
1007
|
font-size: var(--sc-fs-label);
|
|
916
1008
|
line-height: 1.45;
|
|
917
1009
|
color: var(--sc-muted, #6b6b73);
|
|
@@ -920,38 +1012,38 @@ a.sc-btn {
|
|
|
920
1012
|
.sc-nilrow {
|
|
921
1013
|
display: flex;
|
|
922
1014
|
align-items: center;
|
|
923
|
-
gap: 10px;
|
|
1015
|
+
gap: calc(10px * var(--sc-scale, 1));
|
|
924
1016
|
margin: 0;
|
|
925
|
-
padding: 9px 0;
|
|
926
|
-
font-size:
|
|
1017
|
+
padding: calc(9px * var(--sc-scale, 1)) 0;
|
|
1018
|
+
font-size: calc(var(--sc-font-size, 15px) * 0.9333);
|
|
927
1019
|
color: var(--sc-muted, #6b6b69);
|
|
928
1020
|
}
|
|
929
1021
|
|
|
930
1022
|
.sc-group-card:has(> .sc-nilrow) {
|
|
931
|
-
padding: 7px 16px;
|
|
1023
|
+
padding: calc(7px * var(--sc-scale, 1)) calc(16px * var(--sc-scale, 1));
|
|
932
1024
|
}
|
|
933
1025
|
.sc-nilrow-mark {
|
|
934
1026
|
display: grid;
|
|
935
1027
|
place-items: center;
|
|
936
1028
|
flex: none;
|
|
937
|
-
width: 28px;
|
|
938
|
-
height: 28px;
|
|
1029
|
+
width: calc(28px * var(--sc-scale, 1));
|
|
1030
|
+
height: calc(28px * var(--sc-scale, 1));
|
|
939
1031
|
border-radius: 50%;
|
|
940
1032
|
background: var(--sc-tray-sunk, #efefed);
|
|
941
1033
|
color: var(--sc-faint, #8c8c89);
|
|
942
1034
|
}
|
|
943
1035
|
.sc-nilrow-mark .sc-blank-glyph {
|
|
944
|
-
width: 15px;
|
|
945
|
-
height: 15px;
|
|
1036
|
+
width: calc(15px * var(--sc-scale, 1));
|
|
1037
|
+
height: calc(15px * var(--sc-scale, 1));
|
|
946
1038
|
}
|
|
947
1039
|
|
|
948
1040
|
.sc-heads {
|
|
949
1041
|
display: flex;
|
|
950
1042
|
align-items: flex-start;
|
|
951
|
-
gap: 8px;
|
|
952
|
-
margin: 2px 12px 3px 0;
|
|
953
|
-
padding: 8px 10px;
|
|
954
|
-
border-radius: var(--sc-r, 10px);
|
|
1043
|
+
gap: calc(8px * var(--sc-scale, 1));
|
|
1044
|
+
margin: 2px calc(12px * var(--sc-scale, 1)) calc(3px * var(--sc-scale, 1)) 0;
|
|
1045
|
+
padding: calc(8px * var(--sc-scale, 1)) calc(10px * var(--sc-scale, 1));
|
|
1046
|
+
border-radius: var(--sc-r, calc(10px * var(--sc-scale, 1)));
|
|
955
1047
|
background: color-mix(in srgb, var(--sc-warn, #b06f14) 9%, var(--sc-tray-card, #ffffff));
|
|
956
1048
|
}
|
|
957
1049
|
.sc-heads-mark {
|
|
@@ -963,8 +1055,8 @@ a.sc-btn {
|
|
|
963
1055
|
color: var(--sc-warn, #b06f14);
|
|
964
1056
|
}
|
|
965
1057
|
.sc-hglyph {
|
|
966
|
-
width: 13px;
|
|
967
|
-
height: 13px;
|
|
1058
|
+
width: calc(13px * var(--sc-scale, 1));
|
|
1059
|
+
height: calc(13px * var(--sc-scale, 1));
|
|
968
1060
|
}
|
|
969
1061
|
.sc-heads-say {
|
|
970
1062
|
margin: 0;
|
|
@@ -978,11 +1070,11 @@ a.sc-btn {
|
|
|
978
1070
|
inset: auto;
|
|
979
1071
|
z-index: 2147483647;
|
|
980
1072
|
|
|
981
|
-
width: 320px;
|
|
1073
|
+
width: calc(320px * var(--sc-scale, 1));
|
|
982
1074
|
margin: 0;
|
|
983
|
-
padding: 4px;
|
|
1075
|
+
padding: calc(4px * var(--sc-scale, 1));
|
|
984
1076
|
border: 1px solid var(--sc-line, #e9e9eb);
|
|
985
|
-
border-radius:
|
|
1077
|
+
border-radius: calc(10px * var(--sc-scale, 1));
|
|
986
1078
|
background: var(--sc-tray-card, #ffffff);
|
|
987
1079
|
box-shadow:
|
|
988
1080
|
0 10px 30px rgba(0, 0, 0, 0.12),
|
|
@@ -997,16 +1089,16 @@ a.sc-btn {
|
|
|
997
1089
|
.sc-menu-item {
|
|
998
1090
|
display: flex;
|
|
999
1091
|
align-items: center;
|
|
1000
|
-
gap: 14px;
|
|
1092
|
+
gap: calc(14px * var(--sc-scale, 1));
|
|
1001
1093
|
width: 100%;
|
|
1002
1094
|
|
|
1003
|
-
min-height: 44px;
|
|
1004
|
-
padding: 7px 12px;
|
|
1095
|
+
min-height: calc(44px * var(--sc-scale, 1));
|
|
1096
|
+
padding: calc(7px * var(--sc-scale, 1)) calc(12px * var(--sc-scale, 1));
|
|
1005
1097
|
border: 0;
|
|
1006
|
-
border-radius:
|
|
1098
|
+
border-radius: calc(7px * var(--sc-scale, 1));
|
|
1007
1099
|
background: transparent;
|
|
1008
1100
|
font: inherit;
|
|
1009
|
-
font-size: 15px;
|
|
1101
|
+
font-size: calc(var(--sc-font-size, 15px) * 1);
|
|
1010
1102
|
color: inherit;
|
|
1011
1103
|
text-align: left;
|
|
1012
1104
|
cursor: pointer;
|
|
@@ -1032,27 +1124,52 @@ a.sc-btn {
|
|
|
1032
1124
|
}
|
|
1033
1125
|
|
|
1034
1126
|
.sc-menu-note {
|
|
1035
|
-
font-size:
|
|
1127
|
+
font-size: max(12px, calc(var(--sc-font-size, 15px) * 0.9));
|
|
1036
1128
|
line-height: 1.4;
|
|
1037
1129
|
color: var(--sc-muted, #6b6b69);
|
|
1038
1130
|
}
|
|
1039
1131
|
|
|
1132
|
+
.sc-row-act {
|
|
1133
|
+
flex: none;
|
|
1134
|
+
padding: calc(6px * var(--sc-scale, 1)) calc(8px * var(--sc-scale, 1));
|
|
1135
|
+
margin-right: calc(-8px * var(--sc-scale, 1));
|
|
1136
|
+
border: 0;
|
|
1137
|
+
border-radius: calc(7px * var(--sc-scale, 1));
|
|
1138
|
+
background: transparent;
|
|
1139
|
+
color: var(--sc-text, #1a1a1c);
|
|
1140
|
+
font: inherit;
|
|
1141
|
+
font-size: calc(var(--sc-font-size, 15px) * 0.9333);
|
|
1142
|
+
font-weight: 600;
|
|
1143
|
+
cursor: pointer;
|
|
1144
|
+
}
|
|
1145
|
+
.sc-row-act:hover {
|
|
1146
|
+
background: var(--sc-tray-sunk, #efefed);
|
|
1147
|
+
}
|
|
1148
|
+
|
|
1149
|
+
.sc-menu-act {
|
|
1150
|
+
flex: none;
|
|
1151
|
+
margin-left: auto;
|
|
1152
|
+
padding-left: calc(10px * var(--sc-scale, 1));
|
|
1153
|
+
font-size: calc(var(--sc-font-size, 15px) * 0.8667);
|
|
1154
|
+
font-weight: 600;
|
|
1155
|
+
color: var(--sc-text, #1a1a1c);
|
|
1156
|
+
}
|
|
1040
1157
|
.sc-menu-check {
|
|
1041
1158
|
flex: none;
|
|
1042
|
-
width: 15px;
|
|
1043
|
-
height: 15px;
|
|
1159
|
+
width: calc(15px * var(--sc-scale, 1));
|
|
1160
|
+
height: calc(15px * var(--sc-scale, 1));
|
|
1044
1161
|
color: var(--sc-text-2, #3f3f46);
|
|
1045
1162
|
}
|
|
1046
1163
|
|
|
1047
1164
|
.sc-menu-sep {
|
|
1048
1165
|
height: 1px;
|
|
1049
|
-
margin: 4px 6px;
|
|
1166
|
+
margin: calc(4px * var(--sc-scale, 1)) calc(6px * var(--sc-scale, 1));
|
|
1050
1167
|
background: var(--sc-line, #e9e9eb);
|
|
1051
1168
|
}
|
|
1052
1169
|
|
|
1053
1170
|
.sc-menu-head {
|
|
1054
|
-
margin: 6px 6px 2px;
|
|
1055
|
-
padding-top: 7px;
|
|
1171
|
+
margin: calc(6px * var(--sc-scale, 1)) calc(6px * var(--sc-scale, 1)) 2px;
|
|
1172
|
+
padding-top: calc(7px * var(--sc-scale, 1));
|
|
1056
1173
|
border-top: 1px solid var(--sc-line, #e9e9eb);
|
|
1057
1174
|
font-size: var(--sc-fs-label);
|
|
1058
1175
|
font-weight: 500;
|
|
@@ -1067,7 +1184,7 @@ a.sc-btn {
|
|
|
1067
1184
|
|
|
1068
1185
|
.sc-tray-error {
|
|
1069
1186
|
margin: 0;
|
|
1070
|
-
padding: 0 12px 2px;
|
|
1187
|
+
padding: 0 calc(12px * var(--sc-scale, 1)) 2px;
|
|
1071
1188
|
}
|
|
1072
1189
|
|
|
1073
1190
|
.sc-mp {
|
|
@@ -1088,12 +1205,12 @@ a.sc-btn {
|
|
|
1088
1205
|
.sc-mp-btn {
|
|
1089
1206
|
display: inline-flex;
|
|
1090
1207
|
align-items: center;
|
|
1091
|
-
gap: 5px;
|
|
1208
|
+
gap: calc(5px * var(--sc-scale, 1));
|
|
1092
1209
|
min-width: 0;
|
|
1093
|
-
height: 26px;
|
|
1094
|
-
padding: 0 5px 0 7px;
|
|
1210
|
+
height: calc(26px * var(--sc-scale, 1));
|
|
1211
|
+
padding: 0 calc(5px * var(--sc-scale, 1)) 0 calc(7px * var(--sc-scale, 1));
|
|
1095
1212
|
border: 0;
|
|
1096
|
-
border-radius: var(--sc-r-pill, 999px);
|
|
1213
|
+
border-radius: var(--sc-r-pill, calc(999px * var(--sc-scale, 1)));
|
|
1097
1214
|
background: transparent;
|
|
1098
1215
|
font: inherit;
|
|
1099
1216
|
font-size: var(--sc-fs-label);
|
|
@@ -1120,13 +1237,13 @@ a.sc-btn {
|
|
|
1120
1237
|
display: inline-grid;
|
|
1121
1238
|
flex: none;
|
|
1122
1239
|
place-items: center;
|
|
1123
|
-
width: 13px;
|
|
1124
|
-
height: 13px;
|
|
1240
|
+
width: calc(13px * var(--sc-scale, 1));
|
|
1241
|
+
height: calc(13px * var(--sc-scale, 1));
|
|
1125
1242
|
}
|
|
1126
1243
|
|
|
1127
1244
|
.sc-mp-glyph {
|
|
1128
|
-
max-width: 13px;
|
|
1129
|
-
max-height: 13px;
|
|
1245
|
+
max-width: calc(13px * var(--sc-scale, 1));
|
|
1246
|
+
max-height: calc(13px * var(--sc-scale, 1));
|
|
1130
1247
|
}
|
|
1131
1248
|
|
|
1132
1249
|
.sc-mp-label {
|
|
@@ -1137,35 +1254,35 @@ a.sc-btn {
|
|
|
1137
1254
|
}
|
|
1138
1255
|
|
|
1139
1256
|
.sc-mp-btn .sc-chev {
|
|
1140
|
-
width: 11px;
|
|
1141
|
-
height: 11px;
|
|
1257
|
+
width: calc(11px * var(--sc-scale, 1));
|
|
1258
|
+
height: calc(11px * var(--sc-scale, 1));
|
|
1142
1259
|
color: var(--sc-faint, #a1a1aa);
|
|
1143
1260
|
}
|
|
1144
1261
|
|
|
1145
1262
|
.sc-atile .sc-runtime-logo {
|
|
1146
|
-
width: 25px;
|
|
1147
|
-
height: 25px;
|
|
1148
|
-
border-radius: 7px;
|
|
1263
|
+
width: calc(25px * var(--sc-scale, 1));
|
|
1264
|
+
height: calc(25px * var(--sc-scale, 1));
|
|
1265
|
+
border-radius: calc(7px * var(--sc-scale, 1));
|
|
1149
1266
|
}
|
|
1150
1267
|
.sc-atile .sc-runtime-mark {
|
|
1151
|
-
width: 22px;
|
|
1152
|
-
height: 22px;
|
|
1268
|
+
width: calc(22px * var(--sc-scale, 1));
|
|
1269
|
+
height: calc(22px * var(--sc-scale, 1));
|
|
1153
1270
|
}
|
|
1154
1271
|
.sc-atile .sc-runtime-letter {
|
|
1155
|
-
font-size: 15px;
|
|
1272
|
+
font-size: calc(var(--sc-font-size, 15px) * 1);
|
|
1156
1273
|
}
|
|
1157
1274
|
|
|
1158
1275
|
.sc-group-card:has(> .sc-runs-agent) {
|
|
1159
|
-
padding: 0 16px;
|
|
1276
|
+
padding: 0 calc(16px * var(--sc-scale, 1));
|
|
1160
1277
|
}
|
|
1161
1278
|
.sc-runs-agent {
|
|
1162
1279
|
display: flex;
|
|
1163
1280
|
align-items: center;
|
|
1164
|
-
gap: 14px;
|
|
1281
|
+
gap: calc(14px * var(--sc-scale, 1));
|
|
1165
1282
|
width: 100%;
|
|
1166
1283
|
min-width: 0;
|
|
1167
1284
|
margin: 0;
|
|
1168
|
-
padding: 14px 0;
|
|
1285
|
+
padding: calc(14px * var(--sc-scale, 1)) 0;
|
|
1169
1286
|
border: 0;
|
|
1170
1287
|
background: transparent;
|
|
1171
1288
|
font: inherit;
|
|
@@ -1184,30 +1301,30 @@ a.sc-btn {
|
|
|
1184
1301
|
.sc-runs-agent:focus-visible {
|
|
1185
1302
|
outline: 2px solid var(--sc-accent, #18181b);
|
|
1186
1303
|
outline-offset: -2px;
|
|
1187
|
-
border-radius: var(--sc-r-sm, 6px);
|
|
1304
|
+
border-radius: var(--sc-r-sm, calc(6px * var(--sc-scale, 1)));
|
|
1188
1305
|
}
|
|
1189
1306
|
|
|
1190
1307
|
.sc-runs-tile {
|
|
1191
1308
|
flex: none;
|
|
1192
1309
|
display: grid;
|
|
1193
1310
|
place-items: center;
|
|
1194
|
-
width:
|
|
1195
|
-
height:
|
|
1196
|
-
border-radius:
|
|
1311
|
+
width: calc(36px * var(--sc-scale, 1));
|
|
1312
|
+
height: calc(36px * var(--sc-scale, 1));
|
|
1313
|
+
border-radius: calc(9px * var(--sc-scale, 1));
|
|
1197
1314
|
background: var(--sc-tray-sunk, #efefed);
|
|
1198
1315
|
}
|
|
1199
1316
|
|
|
1200
1317
|
.sc-runs-tile .sc-runtime-logo {
|
|
1201
|
-
width: 34px;
|
|
1202
|
-
height: 34px;
|
|
1203
|
-
border-radius:
|
|
1318
|
+
width: calc(34px * var(--sc-scale, 1));
|
|
1319
|
+
height: calc(34px * var(--sc-scale, 1));
|
|
1320
|
+
border-radius: calc(7px * var(--sc-scale, 1));
|
|
1204
1321
|
}
|
|
1205
1322
|
.sc-runs-tile .sc-runtime-mark {
|
|
1206
|
-
width: 30px;
|
|
1207
|
-
height: 30px;
|
|
1323
|
+
width: calc(30px * var(--sc-scale, 1));
|
|
1324
|
+
height: calc(30px * var(--sc-scale, 1));
|
|
1208
1325
|
}
|
|
1209
1326
|
.sc-runs-tile .sc-runtime-letter {
|
|
1210
|
-
font-size:
|
|
1327
|
+
font-size: calc(var(--sc-font-size, 15px) * 1.2667);
|
|
1211
1328
|
}
|
|
1212
1329
|
.sc-runs-name {
|
|
1213
1330
|
flex: 1;
|
|
@@ -1215,19 +1332,19 @@ a.sc-btn {
|
|
|
1215
1332
|
overflow: hidden;
|
|
1216
1333
|
text-overflow: ellipsis;
|
|
1217
1334
|
white-space: nowrap;
|
|
1218
|
-
font-size:
|
|
1335
|
+
font-size: calc(var(--sc-font-size, 15px) * 1.0667);
|
|
1219
1336
|
font-weight: 600;
|
|
1220
1337
|
}
|
|
1221
1338
|
.sc-runs-agent .sc-chev {
|
|
1222
1339
|
flex: none;
|
|
1223
|
-
width: 16px;
|
|
1224
|
-
height: 16px;
|
|
1340
|
+
width: calc(16px * var(--sc-scale, 1));
|
|
1341
|
+
height: calc(16px * var(--sc-scale, 1));
|
|
1225
1342
|
color: var(--sc-faint, #a1a1aa);
|
|
1226
1343
|
}
|
|
1227
1344
|
|
|
1228
1345
|
.sc-runs-told {
|
|
1229
1346
|
flex: none;
|
|
1230
|
-
font-size:
|
|
1347
|
+
font-size: calc(var(--sc-font-size, 15px) * 0.9333);
|
|
1231
1348
|
color: var(--sc-muted, #6b6b69);
|
|
1232
1349
|
}
|
|
1233
1350
|
|
|
@@ -1248,21 +1365,21 @@ a.sc-btn {
|
|
|
1248
1365
|
.sc-runs-model .sc-mp-cap,
|
|
1249
1366
|
.sc-runs-key {
|
|
1250
1367
|
flex: none;
|
|
1251
|
-
width: 58px;
|
|
1252
|
-
font-size: 15px;
|
|
1368
|
+
width: calc(58px * var(--sc-scale, 1));
|
|
1369
|
+
font-size: calc(var(--sc-font-size, 15px) * 1);
|
|
1253
1370
|
color: var(--sc-muted, #6b6b69);
|
|
1254
1371
|
}
|
|
1255
1372
|
.sc-runs-model .sc-mp-btn {
|
|
1256
1373
|
flex: 1;
|
|
1257
1374
|
justify-content: flex-start;
|
|
1258
|
-
gap: 14px;
|
|
1375
|
+
gap: calc(14px * var(--sc-scale, 1));
|
|
1259
1376
|
min-width: 0;
|
|
1260
1377
|
height: auto;
|
|
1261
|
-
min-height: 44px;
|
|
1378
|
+
min-height: calc(44px * var(--sc-scale, 1));
|
|
1262
1379
|
padding: 0;
|
|
1263
1380
|
border-radius: 0;
|
|
1264
1381
|
background: transparent;
|
|
1265
|
-
font-size: 15px;
|
|
1382
|
+
font-size: calc(var(--sc-font-size, 15px) * 1);
|
|
1266
1383
|
font-weight: 400;
|
|
1267
1384
|
color: var(--sc-text, #1b1b1a);
|
|
1268
1385
|
}
|
|
@@ -1281,8 +1398,8 @@ a.sc-btn {
|
|
|
1281
1398
|
}
|
|
1282
1399
|
.sc-runs-model .sc-mp-btn .sc-chev {
|
|
1283
1400
|
flex: none;
|
|
1284
|
-
width: 16px;
|
|
1285
|
-
height: 16px;
|
|
1401
|
+
width: calc(16px * var(--sc-scale, 1));
|
|
1402
|
+
height: calc(16px * var(--sc-scale, 1));
|
|
1286
1403
|
color: var(--sc-faint, #a1a1aa);
|
|
1287
1404
|
}
|
|
1288
1405
|
.sc-runs-model .sc-mp-btn .sc-chev-open {
|
|
@@ -1293,8 +1410,8 @@ a.sc-btn {
|
|
|
1293
1410
|
display: flex;
|
|
1294
1411
|
align-items: center;
|
|
1295
1412
|
gap: 0;
|
|
1296
|
-
min-height: 44px;
|
|
1297
|
-
font-size: 15px;
|
|
1413
|
+
min-height: calc(44px * var(--sc-scale, 1));
|
|
1414
|
+
font-size: calc(var(--sc-font-size, 15px) * 1);
|
|
1298
1415
|
}
|
|
1299
1416
|
.sc-runs-val {
|
|
1300
1417
|
flex: 1;
|
|
@@ -2281,6 +2398,8 @@ a.sc-btn {
|
|
|
2281
2398
|
.sc-mp-btn:focus-visible,
|
|
2282
2399
|
.sc-row-act:focus-visible,
|
|
2283
2400
|
.sc-disc:focus-visible,
|
|
2401
|
+
.sc-act-small:focus-visible,
|
|
2402
|
+
.sc-away-go:focus-visible,
|
|
2284
2403
|
.sc-pair:focus-visible,
|
|
2285
2404
|
.sc-mrow-btn:focus-visible,
|
|
2286
2405
|
.sc-input:focus-visible,
|
|
@@ -2377,12 +2496,7 @@ a.sc-btn {
|
|
|
2377
2496
|
.sc-pill-mark {
|
|
2378
2497
|
width: 16px;
|
|
2379
2498
|
height: 16px;
|
|
2380
|
-
|
|
2381
|
-
|
|
2382
|
-
@media (prefers-reduced-motion: no-preference) {
|
|
2383
|
-
.sc-pill-mark-busy {
|
|
2384
|
-
animation: sc-spin 2400ms linear infinite;
|
|
2385
|
-
}
|
|
2499
|
+
--bx-w: 34;
|
|
2386
2500
|
}
|
|
2387
2501
|
|
|
2388
2502
|
.sc-btn-connected .sc-dot {
|
|
@@ -3413,7 +3527,283 @@ li.sc-plan-row.sc-plan-current {
|
|
|
3413
3527
|
.sc-opt-has-warn {
|
|
3414
3528
|
color: var(--sc-warn, #b06f14);
|
|
3415
3529
|
}
|
|
3416
|
-
`,document.head.appendChild(e)}import{jsx as Ue,jsxs as ht}from"react/jsx-runtime";function _o(e){if(!e)return null;let n=wn(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 gi(){return ht("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 a=_o(e),s=H();return fi(()=>mt(),[]),a?Ue("div",{className:o?`soba-connect ${o}`:"soba-connect","data-theme":s.theme,role:"alert",children:ht("div",{className:"sc-card sc-limit sc-run-error",children:[ht("div",{className:"sc-limit-head",children:[Ue("span",{className:"sc-limit-mark sc-run-error-mark","aria-hidden":"true",children:Ue(gi,{})}),ht("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:a})]})]}),(t||n)&&ht("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 Wt}from"react/jsx-runtime";function yi({reason:e}){return re("span",{className:"sc-limit-mark","aria-hidden":"true",children:e==="no_compute"?re(xt,{}):re(q,{})})}function wi(e){let{error:n,variant:t="card",onDismiss:r,className:o}=e,a=zr(n,{predict:e.predict??!("error"in e)}),s=bi(),c=H();if(!a)return null;let i=re(Ci,{offer:a,headingId:s,onDismiss:r});return t==="dialog"?re(st,{open:!0,onClose:()=>r?.(),labelledBy:s,theme:c.theme,children:i}):re("div",{className:o?`soba-connect ${o}`:"soba-connect","data-theme":c.theme,children:i})}function Ci({offer:e,headingId:n,onDismiss:t}){let{compute:r}=Q(),[o,a]=$o(!1),[s,c]=$o(null),i=e.reason==="no_compute"&&r.connected&&!r.online,l=i||e.connectOffer!==null||!r.connected,u=pt();async function m(){a(!0),c(null);try{await e.upgrade()}catch(b){c(b.message)}finally{a(!1)}}return Wt("div",{className:"sc-card sc-limit",children:[Wt("div",{className:"sc-limit-head",children:[re(yi,{reason:e.reason}),Wt("div",{children:[re("h2",{className:"sc-limit-title",id:n,children:e.title}),re("p",{className:"sc-limit-body",children:e.body})]})]}),s&&re("p",{className:"sc-error",children:s}),i&&u.note&&re("p",{className:"sc-limit-note",children:u.note}),Wt("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:l?"sc-btn":"sc-btn sc-btn-primary",onClick:()=>void m(),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}`}),l&&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}=Q();return vi(()=>{let r=e.plan,o=e.current,a={plan:r,assignment:o,loading:e.loading,error:e.error,periodEnd:o?.period_end?new Date(o.period_end):null};if(!r)return{...a,state:"none",trialDaysLeft:null,ceiling:null,raised:!1,uncounted:!1,used:0,remaining:null,percent:null,unlimited:!1,reward:null,summary:"Nothing is assigned to this account, so runs are bounded by whatever the app allows."};let s=xi(o?.trial_ends_at??null),c=r.connected_reward==="included"&&n.connected&&r.connected_included_units!==null,i=c?r.connected_included_units:r.included_units,l=r.connected_reward==="unlimited"&&n.connected,u=i===null,m=e.used??0,b=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=s!==null?"trial":u?"unlimited":h?r.overage==="meter"?"metered":"spent":"within";return{...a,state:y,trialDaysLeft:s,ceiling:i,raised:c,uncounted:l,used:m,remaining:b,percent:g,unlimited:u,reward:ki(r,c||l,n.connected,()=>t.open("manual")),summary:Ni({plan:r,assignment:o,used:m,ceiling:i,trialDaysLeft:s,raised:c,uncounted:l,state:y})}},[e,n.connected,t])}function ki(e,n,t,r){let o=Ve({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:Je(e.connected_reward)&&!t,open:r}:Le(e.route_allow)&&!t?{line:"Nothing connected yet, so nothing can run.",inForce:!1,required:!0,connected:t,actionable:!0,open:r}:null}function Ni(e){let{plan:n,assignment:t,used:r,ceiling:o,trialDaysLeft:a,raised:s,uncounted:c,state:i}=e,l=`${n.unit}${r===1?"":"s"}`,u=c?" Runs your own AI serves do not count toward it.":"";if(i==="trial"&&a!==null){let g=n.price===0?"it continues free":`it is $${n.price.toLocaleString()} a ${n.interval}`;return`${a} ${a===1?"day":"days"} left of your trial, then ${g}.`}if(i==="unlimited")return`${r.toLocaleString()} ${l} 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 m=Math.max(0,(o??0)-r),b=s?` Raised from ${(n.included_units??0).toLocaleString()} while your own AI is connected.`:t?.period_end?` Resets ${es(t.period_end)}.`:"";return`${m.toLocaleString()} of ${(o??0).toLocaleString()} ${n.unit}s left.${b}${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 Kr({heading:e="Current plan",showUsage:n=!0,showName:t=!0,className:r}){let o=ft(),{theme:a}=H(),s=b=>oe("section",{className:r?`soba-connect sc-fill ${r}`:"soba-connect sc-fill","data-theme":a,children:Te("div",{className:"sc-card sc-current",children:[e&&oe("h2",{className:"sc-section-title",children:e}),b]})});if(o.error)return s(oe("p",{className:"sc-error",children:o.error.message}));if(o.loading)return s(oe("p",{className:"sc-note",children:"Loading\u2026"}));if(!o.plan)return s(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:c,trialDaysLeft:i,percent:l,unlimited:u,reward:m}=o;return s(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:[c.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&&c.description&&oe("p",{className:"sc-sub",children:c.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:l!==null&&l>=100?"sc-usage-figure sc-usage-over":"sc-usage-figure",children:u?"Unlimited":l===null?"Metered":`${l}% used`})]}),l!==null&&oe("div",{className:"sc-meter",role:"presentation",children:l>0&&oe("span",{className:l>=100?"sc-meter-fill sc-meter-full":"sc-meter-fill",style:{width:`${l}%`}})}),oe("p",{className:"sc-usage-line",children:o.summary})]})]}),m&&Te("div",{className:"sc-current-foot",children:[oe("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: ${Mi(m.line)}.`:m.line}),(m.actionable||m.connected)&&oe(yn,{})]})]}))}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}=Q(),[o,a]=ns(null),[s,c]=ns(null),{featured:i,onSelect:l,successUrl:u,cancelUrl:m}=e,b=Pi(async h=>{a(h.id),c(null);try{if(h.selectable)await n.select(h.id);else if(l)l(h);else{let y=await n.checkout(h.id,{...u?{successUrl:u}:{},...m?{cancelUrl:m}:{}});window.location.assign(y);return}}catch(y){throw c(y.message),y}finally{(h.selectable||l)&&a(null)}},[n,l,u,m]),g=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(N=>({costClass:N,label:Ei[N]??N,owned:Ii.has(N),runtimes:tr(N).map(P=>P.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:()=>b(h)}}}),[n.plans,n.current,i,t.connected,r,o,b]);return{offers:g,current:g.find(h=>h.current)??null,loading:n.loading,error:n.error,failed:s}}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=Ve({unit:e.unit,reward:e.connected_reward,includedUnits:e.connected_included_units,creditMicros:e.connected_credit*1e6}),a=Le(e.route_allow)&&!t;if(!o&&!a)return null;let s=Je(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&&(s||a)&&!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 A,jsxs as D}from"react/jsx-runtime";function Ht(e){return e?`soba-connect sc-fill ${e}`:"soba-connect sc-fill"}function $r({onSelect:e,successUrl:n,cancelUrl:t,showCompute:r=!0,showConnect:o=!1,variant:a="cards",featured:s,className:c}){let{offers:i,loading:l,error:u,failed:m}=_r({...s?{featured:s}:{},...e?{onSelect:e}:{},...n?{successUrl:n}:{},...t?{cancelUrl:t}:{}}),{theme:b}=H();if(u)return A("div",{className:Ht(c),"data-theme":b,children:A("div",{className:"sc-card",children:A("p",{className:"sc-error",children:u.message})})});if(l)return A("div",{className:Ht(c),"data-theme":b,children:A("div",{className:"sc-card",children:A("p",{className:"sc-note",children:"Loading plans\u2026"})})});if(i.length===0)return A("div",{className:Ht(c),"data-theme":b,children:A("div",{className:"sc-card",children:A("p",{className:"sc-note",children:"This app has no plans yet."})})});let g={showCompute:r,showConnect:o};return D("div",{className:Ht(c),"data-theme":b,"data-variant":a,children:[a==="rows"?A(Wi,{offers:i,shelf:g}):a==="table"?A(Hi,{offers:i,shelf:g}):A(Gi,{offers:i,shelf:g}),m&&A("p",{className:"sc-error",children:m})]})}function Gi({offers:e,shelf:n}){return A("div",{className:"sc-plans",children:e.map(t=>D("div",{className:ts("sc-plan",t),children:[D("div",{className:"sc-row-between",children:[A("span",{className:"sc-title",children:t.plan.name}),A(eo,{offer:t})]}),A("p",{className:"sc-sub",children:t.plan.description}),A(no,{price:t.price,free:"forever"}),A(oo,{offer:t,shelf:n}),A(rs,{offer:t}),A("div",{className:"sc-plan-band",children:n.showCompute&&A(ro,{offer:t})}),A("div",{className:"sc-plan-band",children:A(to,{offer:t})})]},t.plan.id))})}function Wi({offers:e,shelf:n}){return A("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:[A("span",{className:"sc-title",children:t.plan.name}),A(eo,{offer:t})]}),t.plan.description&&A("p",{className:"sc-sub",children:t.plan.description}),A(rs,{offer:t}),n.showCompute&&A(ro,{offer:t,inline:!0}),A(to,{offer:t,inline:!0})]}),D("div",{className:"sc-row-side",children:[A(no,{price:t.price,free:"forever",small:!0}),A(oo,{offer:t,shelf:n})]})]},t.plan.id))})}function Hi({offers:e,shelf:n}){let t=e.some(s=>s.plan.overage_per_unit>0),r=e.some(s=>s.plan.trial_days>0),o=e.some(s=>s.connect!==null),a=s=>[s.current?"sc-col-current":"",s.featured?"sc-col-featured":""].filter(Boolean).join(" ")||void 0;return A("div",{className:"sc-table-scroll",children:D("table",{className:"sc-plan-table",children:[A("thead",{children:D("tr",{children:[A("td",{}),e.map(s=>D("th",{scope:"col",className:a(s),children:[D("span",{className:"sc-row-name",children:[A("span",{className:"sc-title",children:s.plan.name}),A(eo,{offer:s})]}),A(no,{price:s.price,small:!0})]},s.plan.id))]})}),D("tbody",{children:[D("tr",{children:[A("th",{scope:"row",children:"Included"}),e.map(s=>A("td",{className:a(s),children:s.allowance},s.plan.id))]}),t&&D("tr",{children:[A("th",{scope:"row",children:"Then"}),e.map(s=>A("td",{className:a(s),children:s.plan.overage_per_unit>0?`$${s.plan.overage_per_unit} / ${s.plan.unit}`:A("span",{className:"sc-muted-cell",children:"Stops"})},s.plan.id))]}),r&&D("tr",{children:[A("th",{scope:"row",children:"Trial"}),e.map(s=>A("td",{className:a(s),children:s.plan.trial_days>0?`${s.plan.trial_days} days`:A("span",{className:"sc-muted-cell",children:"None"})},s.plan.id))]}),n.showCompute&&D("tr",{children:[A("th",{scope:"row",children:"Runs on"}),e.map(s=>A("td",{className:a(s),children:A(ro,{offer:s,bare:!0})},s.plan.id))]}),o&&D("tr",{children:[A("th",{scope:"row",children:"Connect your own"}),e.map(s=>A("td",{className:a(s),children:A(to,{offer:s,bare:!0})},s.plan.id))]}),D("tr",{className:"sc-table-buy",children:[A("td",{}),e.map(s=>A("td",{className:a(s),children:A(oo,{offer:s,shelf:n})},s.plan.id))]})]})]})})}function ts(e,n){return[e,n.current?"sc-plan-current":"",n.featured?"sc-plan-featured":""].filter(Boolean).join(" ")}function eo({offer:e}){return e.current?A("span",{className:"sc-plan-badge",children:"Current"}):e.featured?A("span",{className:"sc-plan-badge-soft",children:"Recommended"}):null}function no({price:e,small:n,free:t}){return D("p",{className:n?"sc-plan-price sc-plan-price-sm":"sc-plan-price",children:[A("span",{className:"sc-plan-amount",children:e.amount}),e.interval?D("span",{className:"sc-plan-interval",children:["/",e.interval]}):t&&A("span",{className:"sc-plan-interval sc-plan-after",children:t})]})}function rs({offer:e}){return D("p",{className:"sc-plan-allowance",children:[A("span",{className:"sc-plan-figure",children:e.allowance}),A("span",{className:"sc-plan-qualifier",children:e.allowanceNote})]})}function to({offer:e,inline:n,bare:t}){let r=e.connect;if(!r)return t?A("span",{className:"sc-muted-cell",children:"None"}):null;let o=r.reward?"sc-plan-reward-line":"sc-plan-reward-line sc-plan-reward-need",a=r.actionable?D("button",{type:"button",className:`${o} sc-plan-reward-act`,"aria-label":"Connect compute",onClick:r.open,children:[A("span",{className:"sc-reward-said",children:r.line}),D("span",{className:"sc-reward-do","aria-hidden":!0,children:[A(q,{className:"sc-reward-mark"}),"Connect compute"]})]}):A("p",{className:o,children:r.line});return t?a:A("div",{className:n?"sc-plan-reward sc-plan-reward-inline":"sc-plan-reward",children:a})}function ro({offer:e,inline:n,bare:t}){let r=e.computeLabel?A("ul",{className:n?"sc-compute sc-compute-inline":"sc-compute",children:A("li",{children:e.computeLabel})}):A("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,A(Di,{runtimes:o.runtimes})]},o.costClass))});return t?r:D("div",{className:n?"sc-plan-compute sc-plan-compute-inline":"sc-plan-compute",children:[A("span",{className:"sc-fact-key",children:"Runs on"}),r]})}function oo({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:[A(q,{className:"sc-btn-mark"}),"Connect compute"]}):A("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:A("span",{className:"sc-compute-marks",children:e.map(n=>{let t=Ze[n];return t?A(t,{className:"sc-rt-mark"},n):null})})}import{jsx as so,jsxs as os}from"react/jsx-runtime";function Ui({heading:e,plansHeading:n,showUsage:t=!0,showName:r=!0,className:o,...a}){let{plan:s,loading:c}=ft(),{theme:i}=H(),l=n??(c?"Plans":s?"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:[so(Kr,{...e===void 0?{}:{heading:e},showUsage:t,showName:r}),os("section",{className:"sc-billing-plans",children:[l&&so("h2",{className:"sc-section-title",children:l}),so($r,{...a})]})]})}import{useCallback as ss,useState as as}from"react";function ao({plan:e,successUrl:n,cancelUrl:t,label:r}){let{plan:o}=Q(),[a,s]=as(!1),[c,i]=as(null),l=ss(()=>o.checkout(e.id,{...n?{successUrl:n}:{},...t?{cancelUrl:t}:{}}),[o,e.id,n,t]),u=ss(async()=>{s(!0),i(null);try{window.location.assign(await l())}catch(m){i(m.message),s(!1)}},[l]);return{label:a?"Opening\u2026":r??`Subscribe for $${e.price.toLocaleString()}/${e.interval}`,busy:a,error:c,buy:u,session:l}}import{jsx as is,jsxs as Qi}from"react/jsx-runtime";function Fi({plan:e,successUrl:n,cancelUrl:t,label:r,className:o}){let{theme:a}=H(),s=ao({plan:e,...n?{successUrl:n}:{},...t?{cancelUrl:t}:{},...r?{label:r}:{}});return Qi("div",{className:o?`soba-connect ${o}`:"soba-connect","data-theme":a,children:[is("button",{type:"button",className:"sc-btn sc-btn-primary",disabled:s.busy,onClick:()=>void s.buy(),children:s.label}),s.error&&is("p",{className:"sc-error",children:s.error})]})}import{useCallback as Fe,useEffect as $e,useMemo as Wn,useRef as en,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,ji=1e4,Dt=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()+ji,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(),a=o.session??o.token;if(!a)throw new Error(`${n} answered without a \`session\`. See @soba-so/react's README.`);let s=o.expires_in??o.expiresIn;this.#e=a,this.#n=typeof s=="number"?Date.now()+s*1e3:null;let c=ls(this.#t);c&&Yi(c,this.#n===null?null:{token:a,expiresAt:this.#n});for(let i of this.#o)i();return a})();try{return await this.#r}finally{this.#r=null}}},Gn=new Map,us=new WeakMap,zi=1;function qi(e){if(e.token||!e.endpoint)return null;let n=0;return e.fetchImpl&&(n=us.get(e.fetchImpl)??zi++,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 Dt(e);let t=Gn.get(n)??{holder:new Dt(e),users:0};return Gn.set(n,t),t.holder}function ps(e){for(let n of Gn.values())n.holder===e&&n.users++}function ms(e){for(let[n,t]of Gn)if(t.holder===e){setTimeout(()=>{--t.users<=0&&Gn.get(n)===t&&Gn.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 a;try{a=await e.refresh()}catch{return o}return n(t,Zi(r,a))}}function Zi(e,n){let t=new Headers(e?.headers);return t.set("authorization",`Bearer ${n}`),{...e,headers:t}}import{jsx as io,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:a,runEndpoint:s,theme:c,initialMachines:i,initialConnect:l=null,initialPlans:u,initialCurrentPlan:m=null,baseUrl:b=Xi,pollMs:g=Ki,injectStyles:h=!0,modal:y=!0,fetchImpl:N,onError:P}=e,[R,W]=se(t??null),[E,I]=se(null),[O,k]=se(l),[U,pe]=se(null),[ne,ae]=se(l===null),[Z,me]=se(i??[]),[Ye,$]=se(null),[ye,Se]=se(i===void 0),[X,ie]=se(u??[]),[z,Pe]=se(m),[he,fe]=se(null),[nn,V]=se(u===void 0),[J,te]=se(null),[T,le]=se(!1),Re=en(P);Re.current=P;let ce=Fe(w=>{I(w),Re.current?.(w)},[]);$e(()=>{h&&mt()},[h]);let L=Wn(()=>ds({...t?{token:t}:{},...r?{endpoint:r}:{},...o?{user:o}:{},...N?{fetchImpl:N}:{},...a?{cacheKey:a}:{}}),[t,r,o,N,a]);$e(()=>{let w=!0;ps(L);let ee=L.subscribe(()=>{w&&W(L.token)});return!L.token&&!L.canRefresh?ce(new Error("<SobaProvider> needs a `session` or a `sessionEndpoint`. A browser cannot mint one: that takes your secret key.")):L.ensure().then(()=>w&&W(L.token),ge=>w&&ce(ge)),()=>{w=!1,ee(),ms(L)}},[L,ce]),$e(()=>{E&&(ae(!1),Se(!1),V(!1),pe(w=>w??E),$(w=>w??E),fe(w=>w??E))},[E]),$e(()=>{let w=L.refreshAt;if(w===null)return;let ee=()=>{L.refresh().catch(ve=>ce(ve))},ge=()=>{document.hidden||(document.removeEventListener("visibilitychange",ge),ee())},wt=setTimeout(()=>{typeof document<"u"&&document.hidden?document.addEventListener("visibilitychange",ge):ee()},Math.max(0,w-Date.now()));return()=>{clearTimeout(wt),typeof document<"u"&&document.removeEventListener("visibilitychange",ge)}},[L,ce,R]);let B=en(l?.machines_url??null),x=Wn(()=>{if(!R)return null;let w=new Dn({session:R,baseUrl:b,fetchImpl:hs(L,N??fetch.bind(globalThis))});return w.setMachinesUrl(B.current),w},[R,b,L,N]),tn=en(l!==null);$e(()=>{if(!x||tn.current)return;let w=!0;return ae(!0),x.context().then(ee=>{w&&(k(ee),pe(null),ae(!1))},ee=>{w&&(pe(ee),ae(!1))}),()=>{w=!1}},[x]);let je=Fe(async()=>{if(x)try{let w=await x.machines();me(Array.isArray(w)?w:[]),$(null)}catch(w){$(w)}finally{Se(!1)}},[x]),we=Fe(async()=>{if(x)try{let w=await x.plans();ie(w.plans),Pe(w.current),fe(null)}catch(w){fe(w)}finally{V(!1)}},[x]),ue=en(!1),[ze,Cn]=se(!1),vn=en(u!==void 0),rn=en(!1),on=Fe(()=>{ue.current||(ue.current=!0,rn.current&&queueMicrotask(()=>{rn.current&&Cn(!0)}))},[]);$e(()=>(rn.current=!0,ue.current&&Cn(!0),()=>{rn.current=!1}),[]),$e(()=>{!x||!ze||vn.current||we()},[x,ze,we]);let sn=Fe(async w=>{if(!x)throw new Error("No session yet.");await x.selectPlan(w),await we()},[x,we]),Ut=Fe(async(w,ee)=>{if(!x)throw new Error("No session yet.");let ge=await x.checkoutPlan(w,ee);if(!ge.url)throw new Error("Checkout could not be started.");return ge.url},[x]),gt=Fe(async()=>{if(!x)throw new Error("No session yet.");await x.leavePlan(),await we()},[x,we]),At=en(i!==void 0);$e(()=>{if(!x)return;let w=Me(je,g,{immediate:!At.current});return At.current=!1,w},[x,je,g]);let kn=Fe((w="manual")=>{y&&(le(!0),te(w))},[y]),bt=Fe(()=>te(null),[]),K=en(Z);K.current=Z;let Be=Fe(async w=>{if(!s)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,...ge}=w,ve=await(N??fetch.bind(globalThis))(s,{method:"POST",headers:{"content-type":"application/json",accept:"text/event-stream"},credentials:"same-origin",body:JSON.stringify(ge),...ee?{signal:ee}:{}});if(!ve.ok){let Qe=await ve.json().catch(()=>null),ke=new Error(Qe?.error?.message??`${s} answered ${ve.status}.`);ke.status=ve.status,Qe?.error?.code&&(ke.code=Qe.error.code),Qe?.error&&(ke.error=Qe.error);let Ct=K.current.length>0&&!K.current.some(Qt=>Qt.state!=="offline");throw ve.status===409&&Ct&&kn("no_compute"),ke}let Ee=Xr(ve);return async function*(){try{yield*Ee}finally{ue.current&&we()}}()},[s,N,we,kn]),Ce=Wn(()=>z?X.find(w=>w.id===z.plan_id)??null:null,[X,z]),an=Wn(()=>Ce?Ce.connected_reward==="included"&&Z.length>0&&Ce.connected_included_units!==null?Ce.connected_included_units:Ce.included_units:null,[Ce,Z]),yt=Wn(()=>({plans:X,current:z,plan:Ce,used:z?.units_used??null,included:an,remaining:an!==null&&z?Math.max(0,an-z.units_used):null,unlimited:Ce!==null&&an===null,loading:nn,error:he,select:sn,checkout:Ut,leave:gt,refresh:we}),[X,z,Ce,an,nn,he,sn,Ut,gt,we]),Ft=Wn(()=>({session:R,client:x,error:E,get plan(){return on(),yt},compute:{machines:Z,connected:Z.length>0,online:Z.some(w=>w.state!=="offline"),loading:ye,error:Ye,refresh:je},connect:{app:O?.app??null,command:O?.command??null,connectUrl:O?.connect_url??null,publishableKey:O?.publishable_key??null,loading:ne,error:U,open:kn,close:bt,isOpen:J!==null,hasModal:y},run:Be}),[R,x,E,yt,on,J,kn,bt,y,Z,ye,Ye,je,O,ne,U,Be]);return io(Br.Provider,{value:x,children:io(Gr.Provider,{value:{context:O,machines:ye?void 0:Z,theme:c??O?.theme??"light"},children:$i(Wr.Provider,{value:Ft,children:[n,y&&T&&io(ut,{open:J!==null,onOpenChange:w=>te(w?J??"manual":null),onConnected:()=>{je()},...J==="payment_required"||J==="no_compute"?{reason:J}:{},...J==="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 a=`http://127.0.0.1:${r.port??47321}/v1/runs/${o}/events`,s=new AbortController,c=()=>s.abort();n.signal?.addEventListener("abort",c);let i=setTimeout(()=>s.abort(),r.timeoutMs??3e3);try{let l=await t(a,{headers:{authorization:`Bearer ${r.session}`,accept:"text/event-stream"},signal:s.signal});return l.ok?{url:a,bearer:r.session,open:l}:null}catch{return null}finally{clearTimeout(i),n.signal?.removeEventListener("abort",c)}}async function*rl(e){let n=e.body;if(!n)return;let t=n.getReader(),r=new TextDecoder,o="",a=null,s=[];try{for(;;){let c=await t.read();if(c.done)return;o+=r.decode(c.value,{stream:!0});for(let i=o.indexOf(`
|
|
3530
|
+
|
|
3531
|
+
.bx * {
|
|
3532
|
+
transform-box: view-box;
|
|
3533
|
+
}
|
|
3534
|
+
|
|
3535
|
+
.bx-arc,
|
|
3536
|
+
.bx-st,
|
|
3537
|
+
.bx-z1 path,
|
|
3538
|
+
.bx-z2 path,
|
|
3539
|
+
.bx-ob path {
|
|
3540
|
+
stroke-width: var(--bx-w, 17);
|
|
3541
|
+
}
|
|
3542
|
+
|
|
3543
|
+
.bx[data-expression="thinking"] .bx-arc,
|
|
3544
|
+
.bx[data-expression="paused"] .bx-arc,
|
|
3545
|
+
.bx[data-expression="attention"] .bx-arc,
|
|
3546
|
+
.bx[data-expression="connecting"] .bx-arc,
|
|
3547
|
+
.bx[data-expression="gone"] .bx-arc,
|
|
3548
|
+
.bx[data-expression="snap"] .bx-arc,
|
|
3549
|
+
.bx[data-expression="listening"] .bx-arc,
|
|
3550
|
+
.bx[data-expression="permission"] .bx-arc,
|
|
3551
|
+
.bx[data-expression="ai"] .bx-arc {
|
|
3552
|
+
display: none;
|
|
3553
|
+
}
|
|
3554
|
+
|
|
3555
|
+
@keyframes bx-stream {
|
|
3556
|
+
to {
|
|
3557
|
+
stroke-dashoffset: -62;
|
|
3558
|
+
}
|
|
3559
|
+
}
|
|
3560
|
+
|
|
3561
|
+
.bx-st {
|
|
3562
|
+
animation: bx-stream 0.9s linear infinite;
|
|
3563
|
+
}
|
|
3564
|
+
|
|
3565
|
+
@keyframes bx-think {
|
|
3566
|
+
0%,
|
|
3567
|
+
100% {
|
|
3568
|
+
opacity: 0.26;
|
|
3569
|
+
}
|
|
3570
|
+
33% {
|
|
3571
|
+
opacity: 1;
|
|
3572
|
+
}
|
|
3573
|
+
}
|
|
3574
|
+
|
|
3575
|
+
.bx-th {
|
|
3576
|
+
opacity: 0.26;
|
|
3577
|
+
animation: bx-think 1.2s ease-in-out infinite;
|
|
3578
|
+
}
|
|
3579
|
+
|
|
3580
|
+
.bx-th2 {
|
|
3581
|
+
animation-delay: 0.4s;
|
|
3582
|
+
}
|
|
3583
|
+
|
|
3584
|
+
.bx-th3 {
|
|
3585
|
+
animation-delay: 0.8s;
|
|
3586
|
+
}
|
|
3587
|
+
|
|
3588
|
+
@keyframes bx-att {
|
|
3589
|
+
0%,
|
|
3590
|
+
80%,
|
|
3591
|
+
100% {
|
|
3592
|
+
transform: rotate(0);
|
|
3593
|
+
}
|
|
3594
|
+
85% {
|
|
3595
|
+
transform: rotate(-8deg);
|
|
3596
|
+
}
|
|
3597
|
+
95% {
|
|
3598
|
+
transform: rotate(8deg);
|
|
3599
|
+
}
|
|
3600
|
+
}
|
|
3601
|
+
|
|
3602
|
+
.bx-at {
|
|
3603
|
+
|
|
3604
|
+
transform-box: fill-box;
|
|
3605
|
+
transform-origin: 50% 100%;
|
|
3606
|
+
animation: bx-att 2s ease-in-out infinite;
|
|
3607
|
+
}
|
|
3608
|
+
|
|
3609
|
+
@keyframes bx-z {
|
|
3610
|
+
0% {
|
|
3611
|
+
opacity: 0;
|
|
3612
|
+
transform: translate(0, 12px);
|
|
3613
|
+
}
|
|
3614
|
+
25%,
|
|
3615
|
+
70% {
|
|
3616
|
+
opacity: 1;
|
|
3617
|
+
transform: translate(0, 0);
|
|
3618
|
+
}
|
|
3619
|
+
100% {
|
|
3620
|
+
opacity: 0;
|
|
3621
|
+
transform: translate(8px, -16px);
|
|
3622
|
+
}
|
|
3623
|
+
}
|
|
3624
|
+
|
|
3625
|
+
.bx-z1 {
|
|
3626
|
+
animation: bx-z 3s ease-in-out infinite;
|
|
3627
|
+
}
|
|
3628
|
+
|
|
3629
|
+
.bx-z2 {
|
|
3630
|
+
animation: bx-z 3s ease-in-out 0.75s infinite;
|
|
3631
|
+
}
|
|
3632
|
+
|
|
3633
|
+
@keyframes bx-orb {
|
|
3634
|
+
to {
|
|
3635
|
+
transform: rotate(360deg);
|
|
3636
|
+
}
|
|
3637
|
+
}
|
|
3638
|
+
|
|
3639
|
+
.bx-ob {
|
|
3640
|
+
transform-origin: 278px 400px;
|
|
3641
|
+
animation: bx-orb 1.15s cubic-bezier(0.45, 0, 0.55, 1) infinite;
|
|
3642
|
+
}
|
|
3643
|
+
|
|
3644
|
+
@keyframes bx-xa {
|
|
3645
|
+
0% {
|
|
3646
|
+
opacity: 0;
|
|
3647
|
+
transform: translateX(0);
|
|
3648
|
+
}
|
|
3649
|
+
8%,
|
|
3650
|
+
22% {
|
|
3651
|
+
opacity: 1;
|
|
3652
|
+
transform: translateX(0);
|
|
3653
|
+
}
|
|
3654
|
+
45%,
|
|
3655
|
+
100% {
|
|
3656
|
+
opacity: 0;
|
|
3657
|
+
transform: translateX(40px);
|
|
3658
|
+
}
|
|
3659
|
+
}
|
|
3660
|
+
|
|
3661
|
+
.bx-xa {
|
|
3662
|
+
opacity: 0;
|
|
3663
|
+
animation: bx-xa 3.2s cubic-bezier(0.45, 0, 0.55, 1) infinite;
|
|
3664
|
+
}
|
|
3665
|
+
|
|
3666
|
+
@keyframes bx-xx {
|
|
3667
|
+
0%,
|
|
3668
|
+
40% {
|
|
3669
|
+
opacity: 0;
|
|
3670
|
+
transform: scale(0.4);
|
|
3671
|
+
}
|
|
3672
|
+
54% {
|
|
3673
|
+
opacity: 1;
|
|
3674
|
+
transform: scale(1.08);
|
|
3675
|
+
}
|
|
3676
|
+
60%,
|
|
3677
|
+
90% {
|
|
3678
|
+
opacity: 1;
|
|
3679
|
+
transform: scale(1);
|
|
3680
|
+
}
|
|
3681
|
+
100% {
|
|
3682
|
+
opacity: 0;
|
|
3683
|
+
transform: scale(1);
|
|
3684
|
+
}
|
|
3685
|
+
}
|
|
3686
|
+
|
|
3687
|
+
.bx-xx {
|
|
3688
|
+
transform-box: fill-box;
|
|
3689
|
+
transform-origin: center;
|
|
3690
|
+
animation: bx-xx 3.2s ease-out infinite;
|
|
3691
|
+
}
|
|
3692
|
+
|
|
3693
|
+
@keyframes bx-voice {
|
|
3694
|
+
0%,
|
|
3695
|
+
100% {
|
|
3696
|
+
transform: scaleY(0.45);
|
|
3697
|
+
}
|
|
3698
|
+
50% {
|
|
3699
|
+
transform: scaleY(1);
|
|
3700
|
+
}
|
|
3701
|
+
}
|
|
3702
|
+
|
|
3703
|
+
.bx-vb {
|
|
3704
|
+
transform-box: fill-box;
|
|
3705
|
+
transform-origin: center;
|
|
3706
|
+
animation: bx-voice 0.9s ease-in-out infinite;
|
|
3707
|
+
}
|
|
3708
|
+
|
|
3709
|
+
.bx-vb2 {
|
|
3710
|
+
animation-delay: 0.15s;
|
|
3711
|
+
}
|
|
3712
|
+
|
|
3713
|
+
.bx-vb3 {
|
|
3714
|
+
animation-delay: 0.3s;
|
|
3715
|
+
}
|
|
3716
|
+
|
|
3717
|
+
@keyframes bx-wait {
|
|
3718
|
+
0% {
|
|
3719
|
+
opacity: 1;
|
|
3720
|
+
}
|
|
3721
|
+
100% {
|
|
3722
|
+
opacity: 0.15;
|
|
3723
|
+
}
|
|
3724
|
+
}
|
|
3725
|
+
|
|
3726
|
+
.bx-w {
|
|
3727
|
+
opacity: 0.15;
|
|
3728
|
+
animation: bx-wait 1.2s linear infinite;
|
|
3729
|
+
}
|
|
3730
|
+
|
|
3731
|
+
@keyframes bx-spark {
|
|
3732
|
+
0%,
|
|
3733
|
+
100% {
|
|
3734
|
+
transform: scale(1) rotate(0);
|
|
3735
|
+
}
|
|
3736
|
+
50% {
|
|
3737
|
+
transform: scale(0.7) rotate(22deg);
|
|
3738
|
+
}
|
|
3739
|
+
}
|
|
3740
|
+
|
|
3741
|
+
.bx-sp {
|
|
3742
|
+
transform-box: fill-box;
|
|
3743
|
+
transform-origin: center;
|
|
3744
|
+
animation: bx-spark 2.6s ease-in-out infinite;
|
|
3745
|
+
}
|
|
3746
|
+
|
|
3747
|
+
.bx-sp2 {
|
|
3748
|
+
animation-delay: -0.87s;
|
|
3749
|
+
}
|
|
3750
|
+
|
|
3751
|
+
.bx-sp3 {
|
|
3752
|
+
animation-delay: -1.73s;
|
|
3753
|
+
}
|
|
3754
|
+
|
|
3755
|
+
@keyframes bx-snap {
|
|
3756
|
+
0%,
|
|
3757
|
+
6% {
|
|
3758
|
+
transform: translateX(90px);
|
|
3759
|
+
opacity: 0;
|
|
3760
|
+
}
|
|
3761
|
+
24% {
|
|
3762
|
+
transform: translateX(-10px);
|
|
3763
|
+
opacity: 1;
|
|
3764
|
+
}
|
|
3765
|
+
30% {
|
|
3766
|
+
transform: translateX(4px);
|
|
3767
|
+
}
|
|
3768
|
+
35%,
|
|
3769
|
+
100% {
|
|
3770
|
+
transform: translateX(0);
|
|
3771
|
+
opacity: 1;
|
|
3772
|
+
}
|
|
3773
|
+
}
|
|
3774
|
+
|
|
3775
|
+
.bx-snap {
|
|
3776
|
+
animation: bx-snap 3.6s cubic-bezier(0.3, 0, 0.2, 1) infinite;
|
|
3777
|
+
}
|
|
3778
|
+
|
|
3779
|
+
@media (prefers-reduced-motion: reduce) {
|
|
3780
|
+
.bx .bx-st,
|
|
3781
|
+
.bx .bx-th,
|
|
3782
|
+
.bx .bx-at,
|
|
3783
|
+
.bx .bx-z1,
|
|
3784
|
+
.bx .bx-z2,
|
|
3785
|
+
.bx .bx-ob,
|
|
3786
|
+
.bx .bx-xa,
|
|
3787
|
+
.bx .bx-xx,
|
|
3788
|
+
.bx .bx-snap,
|
|
3789
|
+
.bx .bx-vb,
|
|
3790
|
+
.bx .bx-w,
|
|
3791
|
+
.bx .bx-sp {
|
|
3792
|
+
animation: none;
|
|
3793
|
+
}
|
|
3794
|
+
|
|
3795
|
+
|
|
3796
|
+
.bx .bx-th,
|
|
3797
|
+
.bx .bx-z1,
|
|
3798
|
+
.bx .bx-z2,
|
|
3799
|
+
.bx .bx-xx,
|
|
3800
|
+
.bx .bx-snap,
|
|
3801
|
+
.bx .bx-w {
|
|
3802
|
+
opacity: 1;
|
|
3803
|
+
transform: none;
|
|
3804
|
+
}
|
|
3805
|
+
}
|
|
3806
|
+
`,document.head.appendChild(e)}import{jsx as Ue,jsxs as gt}from"react/jsx-runtime";function _o(e){if(!e)return null;let n=vn(e);if(n==="payment_required"||n==="no_compute")return null;if(typeof e=="string")return e||null;let t=e,r=t.error?.message;return typeof r=="string"&&r?r:typeof t.message=="string"&&t.message?t.message:"The run ended with an error."}function fi(){return gt("svg",{viewBox:"0 0 16 16",fill:"none","aria-hidden":"true",children:[Ue("path",{d:"M8 5v4",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round"}),Ue("circle",{cx:"8",cy:"11.6",r:"0.9",fill:"currentColor"}),Ue("circle",{cx:"8",cy:"8",r:"6.4",stroke:"currentColor",strokeWidth:"1.3"})]})}function Ai({error:e,onRetry:n,onDismiss:t,title:r,className:o}){let s=_o(e),a=H();return gi(()=>ht(),[]),s?Ue("div",{className:o?`soba-connect ${o}`:"soba-connect","data-theme":a.theme,role:"alert",children:gt("div",{className:"sc-card sc-limit sc-run-error",children:[gt("div",{className:"sc-limit-head",children:[Ue("span",{className:"sc-limit-mark sc-run-error-mark","aria-hidden":"true",children:Ue(fi,{})}),gt("div",{children:[Ue("h2",{className:"sc-limit-title",children:r??"That run did not finish"}),Ue("p",{className:"sc-limit-body sc-run-error-message",children:s})]})]}),(t||n)&>("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(`
|
|
3417
3807
|
`);i!==-1;i=o.indexOf(`
|
|
3418
|
-
`)){let
|
|
3419
|
-
`)}),
|
|
3808
|
+
`)){let c=o.slice(0,i).replace(/\r$/,"");if(o=o.slice(i+1),c==="")a.length&&(yield{id:s,data:a.join(`
|
|
3809
|
+
`)}),s=null,a=[];else if(c.startsWith("id:")){let u=Number(c.slice(3).trim());s=Number.isFinite(u)?u:null}else if(c.startsWith("data:")){let u=c.slice(5);a.push(u.startsWith(" ")?u.slice(1):u)}}}}finally{t.cancel().catch(()=>{})}}var co=(e,n)=>new Promise(t=>{let r=setTimeout(t,e);n?.addEventListener("abort",()=>{clearTimeout(r),t()})});async function*ol(e,n={}){let t=n.fetchImpl??fetch.bind(globalThis),r=await tl(e,n,t)??{url:e.url,bearer:e.token,open:null},o=n.maxRetries??6,s=n.after??0,a=0;for(;;){if(n.signal?.aborted)return;let l;try{l=r.open??await t(r.url,{headers:{authorization:`Bearer ${r.bearer}`,accept:"text/event-stream",...s?{"last-event-id":String(s)}:{}},...n.signal?{signal:n.signal}:{}}),r.open=null}catch(i){if(n.signal?.aborted)return;if(++a>o)throw i;await co(1e3*a,n.signal);continue}if(l.status===503&&a<o){a++,await co(Number(l.headers.get("retry-after")??3)*1e3,n.signal);continue}if(!l.ok){let i=`Could not read this run (${l.status}).`;try{let c=await l.json();c.error?.message&&(i=c.error.message)}catch{}throw new Error(i)}for await(let i of rl(l)){i.id!==null&&(s=i.id),a=0;let c=Wn(i.data);if(c&&(yield c,c.type==="done"||c.type==="error"))return}if(n.signal?.aborted)return;if(++a>o)throw new Error("Lost this run's stream and could not get it back.");await co(1e3*a,n.signal)}}export{Wa as ComputeStatus,Cn as ConnectButton,ja as ConnectCompute,dt as ConnectModal,li as ConnectNudge,Qr as ConnectPill,hi as ModelPicker,Ai as RunError,wi as RunLimit,Ui as SobaBilling,Fi as SobaCheckout,_r as SobaCurrentPlan,eo as SobaPlans,_i as SobaProvider,mi as collectText,Vr as connectSays,ht as injectStyles,Wn as parseEvent,Kr as readEvents,_o as runErrorMessage,vn as sobaErrorCode,el as tierLabel,io as useCheckout,ct as useCompute,Qa as useConnectButton,Xr as useConnectNudge,ft as useCurrentPlan,Jr as useMachineRuns,wn as useModel,mt as useOpenSobaConnect,$r as usePlans,qr as useRunLimit,F as useSoba,ol as watchRun};
|