@scp-dev/dashboard 0.4.6 → 0.4.9
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/public/index.html +1 -1
- package/dist/public/selfhost.js +6 -6
- package/dist/server.js +1 -1
- package/package.json +1 -1
package/dist/public/index.html
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>scp relay</title><link rel="stylesheet" href="/app.css?v=1oq5q70"><script src="/selfhost.js?v=
|
|
1
|
+
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>scp relay</title><link rel="stylesheet" href="/app.css?v=1oq5q70"><script src="/selfhost.js?v=w25too" defer></script></head><body></body></html>
|
package/dist/public/selfhost.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
(()=>{var
|
|
1
|
+
(()=>{var m=((e)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var U=86400000;var at=(e)=>{let t=2166136261;for(let n=0;n<e.length;n++)t=Math.imul(t^e.charCodeAt(n),16777619);return t>>>0};function dt(e){let t=e.split(/[^\p{L}\p{N}]+/u).filter(Boolean);return(t.length>1?t[0][0]+t[1][0]:(t[0]??e).slice(0,1)).toUpperCase()||"?"}function ee(e){let t=(d)=>d.split("@")[0]||d,n=new Map;for(let d of e)n.set(t(d.email),(n.get(t(d.email))??0)+1);let o=e.map((d)=>({id:d.user_id,name:n.get(t(d.email))>1?d.email:t(d.email)}));o.sort((d,l)=>d.name.localeCompare(l.name));let i=new Set,s=new Map;for(let{id:d,name:l}of o){let a=at(l)%8;for(let c=0;c<8&&i.has(a);c++)a=(a+1)%8;i.add(a),s.set(d,{name:l,initials:dt(l),tone:a})}return s}function B(e,t){return{...e,machines:e.machines.map(({actor:n,...o})=>({...o,identity:n!==null&&t.get(n)||null}))}}var lt=["inbox.wait","ask","scopes","groups"],mn=[...lt,"peek","judge","holds"],te={bodyBytes:65536,recipients:16,attachments:16,ttlDefaultS:604800,ttlMaxS:2592000,purgeAfterS:604800,inboxMax:1000,inboxPage:100,waitMaxS:50,causalWindowS:120,pairBurstWindowS:10,onlineWithinS:60,hookOnlineS:300,hookIdleS:1800,hookEndedGraceS:30,restartGraceS:60,injectMessages:5,injectBytes:7168,pushBytes:20480,pushes:20,pushGapS:30,pushQuietS:3,pushGraceS:6,stopBlocks:3,directiveHolds:5,injectHoldS:10,deferredShowS:600,deferredSettleMs:2000,listOfflineWithinS:86400,historicAfterS:3600,handleBoundS:2592000,endpointRetireS:86400,endpointRetireMax:1000,idempotencyS:86400,auditKeepS:2592000,noteChars:280,handbackBytes:16384,stderrBytes:1024,activityKeep:5000,activitySummaryChars:200,textField:512,lineageMax:16,depthMax:32,fanOutMax:32,fanOutTotal:64,grantTtlS:604800,groupIdleS:86400,policyLoadsKept:8,titleRefreshTurns:5,wakeDebounceS:60,wakeBackoffMaxS:900,wakeRefChars:512,wakeEtaMaxS:3600};var Re=["codex-queue"];var Se=new Set(["cli","hook","mcp","shell"]);var In=`harness IN (${[...Se].map((e)=>`'${e}'`).join(", ")})`;var ne="_gone_",ct=["scope_refused"],ut=86400;var Te="CAST(strftime('%s', 'now') AS INTEGER) * 1000",pt=ct.map((e)=>`'${e}'`).join(", "),Mn=`CREATE TRIGGER IF NOT EXISTS audit_no_delete BEFORE DELETE ON audit
|
|
2
2
|
WHEN OLD.at > ${Te} - ${te.auditKeepS*1000} AND NOT (OLD.event IN (${pt}) AND OLD.at <= ${Te} - ${ut*1000})
|
|
3
3
|
BEGIN SELECT RAISE(ABORT, 'audit is append-only'); END`;var $n=`stderr (last ${te.stderrBytes/1024} KB):`,ht=4,Cn=new RegExp(`^[0-9a-z]{${ht},}$`);var Un=`COALESCE(wake IN (${Re.map((e)=>`'${e}'`).join(", ")}), 0)`;class k{value;constructor(e){this.value=e}toString(){return this.value}}var Et={"&":"&","<":"<",">":">",'"':""","'":"'"};function Le(e){if(e instanceof k)return e.value;if(Array.isArray(e))return e.map(Le).join("");if(e===null||e===void 0||e===!1)return"";return String(e).replace(/[&<>"']/g,(t)=>Et[t])}function r(e,...t){let n=e[0];for(let o=0;o<t.length;o++)n+=Le(t[o])+e[o+1];return new k(n)}function R(e){let t=2166136261;for(let n=0;n<e.length;n++)t=Math.imul(t^e.charCodeAt(n),16777619);return(t>>>0).toString(36)}function re(e,t){let n=e.email?r`<nav class="nav" aria-label="Main">
|
|
4
4
|
<a href="/orgs" ${e.nav==="orgs"?r`aria-current="page"`:""}>Orgs</a>
|
|
@@ -341,9 +341,9 @@ if (tab) tab.scrollIntoView({ block: "nearest", inline: "nearest" });
|
|
|
341
341
|
${W("Idle, next turn",e.nextTurn,"read at their next turn")}
|
|
342
342
|
${W("Machines",e.machines,`${e.machinesOnline} online`)}
|
|
343
343
|
${W("Messages",e.messages??"-",`last ${e.minutes} min`)}
|
|
344
|
-
</div>`}function Bt(e,t){if(e.status)return{lead:r`<span class="role">${e.status.state}</span>`,text:e.status.note??""};let n=t.get(e.address);if(n?.summary)return{lead:r`<span class="mini">tl;dr</span>`,text:n.summary};if(e.title)return{lead:"",text:e.title};return null}var
|
|
344
|
+
</div>`}function Bt(e,t){if(e.status)return{lead:r`<span class="role">${e.status.state}</span>`,text:e.status.note??""};let n=t.get(e.address);if(n?.summary)return{lead:r`<span class="mini">tl;dr</span>`,text:n.summary};if(e.title)return{lead:"",text:e.title};return null}var fe=6,Pe={online:0,idle:1,hibernated:1,offline:2};function jt(e,t,n){let o=new Map,i=ce(e.activity);for(let a of i)if(a.kind==="stop"&&a.summary&&!o.has(a.endpoint))o.set(a.endpoint,a);let s=e.endpoints.filter((a)=>a.kind==="agent"&&a.presence!=="offline").map((a)=>({e:a,g:Bt(a,o)})).sort((a,c)=>(Pe[a.e.presence]??3)-(Pe[c.e.presence]??3)||Number(!a.g)-Number(!c.g)||(c.e.last_seen??"").localeCompare(a.e.last_seen??"")),d=s.slice(0,fe),l=i[0];return r`<section class="panel now"><div class="panel-head"><h2>Happening now</h2><a class="mini-link push" href="/orgs/${n}/sessions">All sessions</a></div>
|
|
345
345
|
${d.length?r`<ul class="now-list">${d.map(({e:a,g:c})=>{let u=x(a);return r`<li><div class="now-who">${q(a.harness)}<span class="mono">${S(a.address)}</span><span class="mini">${E(a.address).machine}</span><span class="push mini"><span class="dot ${a.presence}${u?" wake":""}" aria-hidden="true"></span>${a.presence}</span></div>
|
|
346
|
-
<p class="now-what small" title="${c?.text??""}">${c?r`${c.lead}${c.lead&&c.text?" ":""}${c.text}`:r`<span class="mini">no status yet</span>`}</p></li>`})}</ul>${s.length>
|
|
346
|
+
<p class="now-what small" title="${c?.text??""}">${c?r`${c.lead}${c.lead&&c.text?" ":""}${c.text}`:r`<span class="mini">no status yet</span>`}</p></li>`})}</ul>${s.length>fe?r`<p class="mini more-line">and ${s.length-fe} more on the <a class="mini-link" href="/orgs/${n}/sessions">Sessions</a> tab</p>`:""}`:r`<p class="empty">No agent is online or idle right now.</p>`}
|
|
347
347
|
${l?r`<p class="mini last-line"><span class="what" title="${z(l)}">Last activity ${O(l.at,t)}: ${S(l.endpoint)}, ${z(l)}</span><a class="mini-link" href="/orgs/${n}/activity">All activity</a></p>`:""}
|
|
348
348
|
</section>`}var F=(e,t,n=`${t}s`)=>`${e} ${e===1?t:n}`;function We(e,t,n,o,i){if(!e)return P();if(!e.machines.length&&!e.endpoints.length)return pe(o);let s=Wt(e,t),d=n.holds?r`<p class="notice held" role="status">${F(n.holds,"message")} held by the relay judge, waiting for review. <a href="/orgs/${o}/members#judge">Review</a></p>`:"";return r`<div class="block-head summary-head"><p class="mini">${F(s.online+s.wakeable+s.nextTurn,"agent")} live, ${s.offline} offline</p>${Y(i)}</div>
|
|
349
349
|
${d}
|
|
@@ -354,7 +354,7 @@ if (tab) tab.scrollIntoView({ block: "nearest", inline: "nearest" });
|
|
|
354
354
|
${$e(e,o)}
|
|
355
355
|
<p class="small fleet-line">${F(s.machines,"machine")}, ${s.machinesOnline} online. ${F(n.devices,"device")} and ${F(n.tokens,"API token")} signed in. <a class="mini-link" href="/orgs/${o}/tokens">Manage</a></p>
|
|
356
356
|
</section>
|
|
357
|
-
</div>`}var Gt=["claude","codex","opencode","gemini","agy","grok","muse","pi","t3code"],Xt='<g transform="scale(1.5)"><circle cx="8" cy="5.25" r="2.75" fill="none" stroke="currentColor" stroke-width="1.4"/><path d="M2.75 14c.5-3 2.6-4.75 5.25-4.75S12.75 11 13.25 14" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></g>',Vt='<path d="M3 3h10v4H7v6H3zM29 29H19v-4h6v-6h4z"/><rect x="11" y="11" width="10" height="10"/>';function Fe(e){let t=e.split("/");return t.length>=3?{machine:t[1],handle:t.slice(2).join("/")}:{machine:"",handle:""}}function Jt(e,t){if(!t||e.length<=t.length+1||!e.startsWith(t))return e;return"-_./:".includes(e[t.length])?e.slice(t.length+1):e}function Be(e){if(!e)return r``;let t=e.nodes.map((i)=>{let{machine:s,handle:d}=Fe(i.address),l=i.kind==="human"?"human":J(d),a=i.parent?Fe(i.parent):null;return{address:i.address,kind:i.kind,machine:s,name:l,label:l===d&&a&&a.machine===s?Jt(d,a.handle):l,icon:i.kind==="human"?"human":V(i.harness),harness:i.harness,title:i.title,presence:i.presence,status:i.status,wake:i.wake&&i.wake!=="none"?i.wake:null,how:i.waking?"its machine is waking":i.wake&&i.wake!=="none"?G(i.wake):null,parent:i.parent,historic:i.historic===!0}}),n=e.machines.filter((i)=>i.kind!=="revoked").map((i)=>({name:i.name,online:i.online,identity:i.identity??null})),o=JSON.stringify({minutes:e.minutes,machines:n,nodes:t,edges:e.edges}).replace(/</g,"\\u003c");return r`<script type="application/json" data-graph-data>${new k(o)}</script>`}var je=r`<div class="graph-canvas"><svg class="graph-svg" role="group" aria-label="Agents by machine"></svg><div class="graph-tip" role="tooltip" hidden></div></div>`,Ge=r`<span class="trails" role="group" aria-label="Message trail speed">trails <span class="seg">${["1","0.5","0.25"].map((e)=>r`<button type="button" data-trail="${e}" aria-pressed="${e==="1"?"true":"false"}">${e}x</button>`)}</span></span>`,Xe=(e)=>r`<label class="mini"><input type="checkbox" data-graph-nextturn> show next-turn idle</label><label class="mini"><input type="checkbox" data-graph-offline> show offline</label>${e?r`<label class="mini"><input type="checkbox" data-graph-historic> show historic</label>`:""}`,Ve=r`<p class="mini graph-legend"><span class="key spawn" aria-hidden="true"></span>spawned <span class="key msg" aria-hidden="true"></span>messages, last <span data-graph-minutes>15</span> min</p>`,
|
|
357
|
+
</div>`}var Gt=["claude","codex","opencode","gemini","agy","grok","muse","pi","t3code"],Xt='<g transform="scale(1.5)"><circle cx="8" cy="5.25" r="2.75" fill="none" stroke="currentColor" stroke-width="1.4"/><path d="M2.75 14c.5-3 2.6-4.75 5.25-4.75S12.75 11 13.25 14" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></g>',Vt='<path d="M3 3h10v4H7v6H3zM29 29H19v-4h6v-6h4z"/><rect x="11" y="11" width="10" height="10"/>';function Fe(e){let t=e.split("/");return t.length>=3?{machine:t[1],handle:t.slice(2).join("/")}:{machine:"",handle:""}}function Jt(e,t){if(!t||e.length<=t.length+1||!e.startsWith(t))return e;return"-_./:".includes(e[t.length])?e.slice(t.length+1):e}function Be(e){if(!e)return r``;let t=e.nodes.map((i)=>{let{machine:s,handle:d}=Fe(i.address),l=i.kind==="human"?"human":J(d),a=i.parent?Fe(i.parent):null;return{address:i.address,kind:i.kind,machine:s,name:l,label:l===d&&a&&a.machine===s?Jt(d,a.handle):l,icon:i.kind==="human"?"human":V(i.harness),harness:i.harness,title:i.title,presence:i.presence,status:i.status,wake:i.wake&&i.wake!=="none"?i.wake:null,how:i.waking?"its machine is waking":i.wake&&i.wake!=="none"?G(i.wake):null,parent:i.parent,historic:i.historic===!0}}),n=e.machines.filter((i)=>i.kind!=="revoked").map((i)=>({name:i.name,online:i.online,identity:i.identity??null})),o=JSON.stringify({minutes:e.minutes,machines:n,nodes:t,edges:e.edges}).replace(/</g,"\\u003c");return r`<script type="application/json" data-graph-data>${new k(o)}</script>`}var je=r`<div class="graph-canvas"><svg class="graph-svg" role="group" aria-label="Agents by machine"></svg><div class="graph-tip" role="tooltip" hidden></div></div>`,Ge=r`<span class="trails" role="group" aria-label="Message trail speed">trails <span class="seg">${["1","0.5","0.25"].map((e)=>r`<button type="button" data-trail="${e}" aria-pressed="${e==="1"?"true":"false"}">${e}x</button>`)}</span></span>`,Xe=(e)=>r`<label class="mini"><input type="checkbox" data-graph-nextturn> show next-turn idle</label><label class="mini"><input type="checkbox" data-graph-offline> show offline</label>${e?r`<label class="mini"><input type="checkbox" data-graph-historic> show historic</label>`:""}`,Ve=r`<p class="mini graph-legend"><span class="key spawn" aria-hidden="true"></span>spawned <span class="key msg" aria-hidden="true"></span>messages, last <span data-graph-minutes>15</span> min</p>`,me=()=>r`<script src="/app.js?v=${R(K)}" defer></script><script src="/graph.js?v=${R(tn())}" defer></script><link rel="stylesheet" href="/graph.css?v=${R(zt)}">`;function Je(e,t,n={}){return r`<div class="graph gfull" data-graph data-full data-events="/orgs/${e.handle}/events" aria-label="Live graph of agents and their links">
|
|
358
358
|
${je}
|
|
359
359
|
<header class="g-over g-left">
|
|
360
360
|
<a class="mini-link" href="/orgs/${e.handle}/graph">Back to the dashboard</a>
|
|
@@ -1210,7 +1210,7 @@ setStream(false);
|
|
|
1210
1210
|
update();
|
|
1211
1211
|
connect();
|
|
1212
1212
|
})();
|
|
1213
|
-
`;var Ye={overview:"",agents:"/sessions",devices:"/tokens",machines:"/tokens",settings:"/members",judge:"/members"};function Ke(e){if(!e?.startsWith("/")||/[\u0000-\u001f\u007f\\]/.test(e))return"/";let t="https://relay.invalid";try{let n=new URL(e,t);return n.origin===t&&n.pathname.replace(/\/+$/,"")!=="/sign-in"?n.pathname+n.search+n.hash:"/"}catch{return"/"}}function Ze(e,t){let n=e.replace(/\/+$/,"")||"/",o=`/orgs/${t.org.handle}`;if(n==="/"||n==="/orgs"||n==="/sign-in")return{redirect:o};if(n==="/device")return{page:"device"};if(n===o)return{tab:"overview"};if(!n.startsWith(`${o}/`))return{page:"not-found"};let i=n.slice(o.length+1);if(Object.hasOwn(Ye,i))return{redirect:o+Ye[i]};if(["activity","sessions","graph","graph/full","tokens","members"].includes(i))return{tab:i};return{page:"not-found"}}function T(e,t,n){return re({...t,email:e.signedIn?e.member.name:null,csrf:e.csrf},n)}function nn(e,t,n,o){let i=n.graph?B(n.graph,ee(e.members.map((s)=>({user_id:s.id,email:s.name})))):null;switch(t){case"overview":{let s={devices:e.devices,tokens:e.tokens,holds:null};return We(n.overview,i,s,e.org.handle,o)}case"activity":return n.overview?ue(n.overview.activity,o):P();case"sessions":return he(n.overview,e.org.handle,o);case"tokens":return r`${_("Tokens and devices are managed with the scp-relay token CLI.")}`;case"members":return r`${_("Members are managed with the scp-relay account CLI.")}`;case"graph":return ze({org:e.org,role:e.member.role},i,{historic:!0})}}function Qe(e,t,n,o){let i={org:e.org,role:e.member.role},s=t==="overview"?e.org.name:`${e.org.name} ${t==="graph/full"?"graph":t}`;if(t==="graph/full"){let u=n.graph?B(n.graph,ee(e.members.map((w)=>({user_id:w.id,email:w.name})))):null;return T(e,{title:s,bare:!0,head:
|
|
1213
|
+
`;var Ye={overview:"",agents:"/sessions",devices:"/tokens",machines:"/tokens",settings:"/members",judge:"/members"};function Ke(e){if(!e?.startsWith("/")||/[\u0000-\u001f\u007f\\]/.test(e))return"/";let t="https://relay.invalid";try{let n=new URL(e,t);return n.origin===t&&n.pathname.replace(/\/+$/,"")!=="/sign-in"?n.pathname+n.search+n.hash:"/"}catch{return"/"}}function Ze(e,t){let n=e.replace(/\/+$/,"")||"/",o=`/orgs/${t.org.handle}`;if(n==="/"||n==="/orgs"||n==="/sign-in")return{redirect:o};if(n==="/device")return{page:"device"};if(n===o)return{tab:"overview"};if(!n.startsWith(`${o}/`))return{page:"not-found"};let i=n.slice(o.length+1);if(Object.hasOwn(Ye,i))return{redirect:o+Ye[i]};if(["activity","sessions","graph","graph/full","tokens","members"].includes(i))return{tab:i};return{page:"not-found"}}function T(e,t,n){return re({...t,email:e.signedIn?e.member.name:null,csrf:e.csrf},n)}function nn(e,t,n,o){let i=n.graph?B(n.graph,ee(e.members.map((s)=>({user_id:s.id,email:s.name})))):null;switch(t){case"overview":{let s={devices:e.devices,tokens:e.tokens,holds:null};return We(n.overview,i,s,e.org.handle,o)}case"activity":return n.overview?ue(n.overview.activity,o):P();case"sessions":return he(n.overview,e.org.handle,o);case"tokens":return r`${_("Tokens and devices are managed with the scp-relay token CLI.")}`;case"members":return r`${_("Members are managed with the scp-relay account CLI.")}`;case"graph":return ze({org:e.org,role:e.member.role},i,{historic:!0})}}function Qe(e,t,n,o){let i={org:e.org,role:e.member.role},s=t==="overview"?e.org.name:`${e.org.name} ${t==="graph/full"?"graph":t}`;if(t==="graph/full"){let u=n.graph?B(n.graph,ee(e.members.map((w)=>({user_id:w.id,email:w.name})))):null;return T(e,{title:s,bare:!0,head:me()},Je(e.org,u,{historic:!0}))}let d=nn(e,t,n,o);if(t==="graph")return T(e,{title:s,nav:"orgs",head:me()},d);let l=t==="overview"||t==="activity"||t==="sessions",{body:a,...c}=He(i,t,d,{live:l});return T(e,{...c,title:s},a)}function N(e,t="",n){return T(e,{title:"Sign in",narrow:!0},r`<p class="label">Self-hosted relay</p><h1>Sign in</h1>
|
|
1214
1214
|
<p class="lead">Use a relay token or sign in with a device code.</p>
|
|
1215
1215
|
${_(t,!0)}
|
|
1216
1216
|
<form class="form" data-sign-in method="post" action="/v1/dashboard/sign-in">
|
|
@@ -1225,4 +1225,4 @@ connect();
|
|
|
1225
1225
|
${n?r`<section class="block"><h2>Approve this device</h2><p class="small">Run this command on the relay, replacing the account and member placeholders:</p><pre><code>scp-relay device approve ${n.user_code} --account <handle> --member <name></code></pre><p class="mini" role="status">Waiting for approval.</p></section>`:""}`)}var Ee=(e)=>`'${e.replace(/'/g,"'\\''")}'`;function et(e,t="<user_code>"){return T(e,{title:"Device",nav:"device",narrow:!0},r`<p class="label">Device sign-in</p><h1>Approve a device</h1>
|
|
1226
1226
|
<p class="lead">Approve the code shown on the device by running this command on the relay:</p>
|
|
1227
1227
|
<pre><code>scp-relay device approve ${Ee(t)} --account ${Ee(e.org.handle)} --member ${Ee(e.member.name)}</code></pre>
|
|
1228
|
-
<p class="small">Only approve a code for a device you recognize.</p>`)}function tt(e){return T(e,{title:"Not found",narrow:!0},r`<h1>Not found</h1><p class="lead">This page does not exist.</p><a href="/">Return home</a>`)}function we(e,t){return T(e,{title:"Dashboard unavailable",narrow:!0},r`<h1>Dashboard unavailable</h1>${_(t,!0)}<a href="">Reload</a>`)}var
|
|
1228
|
+
<p class="small">Only approve a code for a device you recognize.</p>`)}function tt(e){return T(e,{title:"Not found",narrow:!0},r`<h1>Not found</h1><p class="lead">This page does not exist.</p><a href="/">Return home</a>`)}function we(e,t){return T(e,{title:"Dashboard unavailable",narrow:!0},r`<h1>Dashboard unavailable</h1>${_(t,!0)}<a href="">Reload</a>`)}var f={signedIn:!1,csrf:""},D=0,be=!1;class M extends Error{}async function I(e,t){let n=await fetch(`/v1/dashboard/${e}`,{method:t?"POST":"GET",credentials:"same-origin",cache:"no-store",headers:t?{accept:"application/json","content-type":"application/json"}:{accept:"application/json"},...t?{body:JSON.stringify({...t,csrf:f.csrf})}:{}}),o=await n.json();if(!n.ok){let i=o&&typeof o==="object"?o:{};if(n.status===401&&i.error==="signed_out")throw new M;throw Error(typeof i.message==="string"?i.message:i.error==="invalid_token"?"The token is not valid.":"The relay could not complete the request.")}return o}function b(e){let t=new DOMParser().parseFromString(e,"text/html"),n=[...t.querySelectorAll("script[src]")];document.head.replaceWith(t.head),document.body.replaceWith(t.body);for(let o of n){let i=document.createElement("script");for(let s of o.attributes)i.setAttribute(s.name,s.value);i.async=!1,o.replaceWith(i)}}function ye(){location.replace(`/sign-in?next=${encodeURIComponent(location.pathname+location.search)}`)}async function nt(e){try{return await I(e)}catch(t){if(t instanceof M)throw t;return null}}function sn(){try{return localStorage.getItem("scp.graph.historic")==="1"}catch{return!1}}async function rn(e){let t=["overview","activity","sessions","graph","graph/full"].includes(e),n=["overview","graph","graph/full"].includes(e),[o,i]=await Promise.all([t?nt("overview"):null,n?nt(sn()?"graph?historic=1":"graph"):null]);return{overview:o,graph:i}}var Z=(e)=>e instanceof Error?e.message:"The relay could not complete the request.",st=()=>location.replace(Ke(new URLSearchParams(location.search).get("next")));async function on(e,t){let n=Date.now()+e.expires_in*1000,o=Math.max(1,e.interval)*1000;while(t===D){if(await new Promise((s)=>setTimeout(s,o)),t!==D)return;if(Date.now()>=n)break;let i=await I("device/poll",{device_code:e.device_code});if(t!==D)return;if(i.status==="ok"){st();return}if(i.status!=="pending"){b(N(f,i.status==="denied"?"Device sign-in was denied.":"The device code expired. Try again."));return}}if(t===D)b(N(f,"The device code expired. Try again."))}document.addEventListener("submit",(e)=>{let t=e.target;if(!(t instanceof HTMLFormElement))return;let n=t.getAttribute("action")==="/sign-out",o=t.hasAttribute("data-sign-in"),i=t.hasAttribute("data-device");if(!n&&!o&&!i)return;if(e.preventDefault(),be)return;be=!0;let s=++D;for(let d of t.querySelectorAll("button"))d.disabled=!0;(async()=>{try{if(n)await I("sign-out",{}),location.replace("/sign-in");else if(o){let d=new FormData(t).get("token");await I("sign-in",{token:typeof d==="string"?d:""}),st()}else{let d=await I("device",{});b(N(f,"",d)),on(d,s).catch((l)=>{if(s===D)b(N(f,Z(l)))})}}catch(d){if(d instanceof M)ye();else b(f.signedIn?we(f,Z(d)):N(f,Z(d)))}finally{be=!1}})()});async function an(){if(f=await I("session"),!f.signedIn){b(N(f));return}let e=f,t=Ze(location.pathname,e);if("redirect"in t){location.replace(t.redirect);return}if("page"in t){b(t.page==="device"?et(e,new URLSearchParams(location.search).get("user_code")??void 0):tt(e));return}let n=async()=>Qe(e,t.tab,await rn(t.tab),Date.now());window.scpRegion=async()=>{try{return new DOMParser().parseFromString(await n(),"text/html").querySelector("[data-live]")}catch(o){if(o instanceof M)ye();return null}},b(await n())}an().catch((e)=>{if(e instanceof M)ye();else b(we(f,Z(e)))});})();
|
package/dist/server.js
CHANGED