@kingsleyweb/bun-ui 3.0.0-rc.1 → 3.0.0-rc.2
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/docs/assets/main-0rchxtv5.js +18 -0
- package/dist/docs/assets/{main-pgxtmtja.js.map → main-0rchxtv5.js.map} +1 -1
- package/dist/docs/manifest.json +5 -5
- package/dist/jobs/assets/AddFlowDialog-h6xkgx9b.js +6 -0
- package/dist/jobs/assets/{AddFlowDialog-0ec5ff4r.js.map → AddFlowDialog-h6xkgx9b.js.map} +1 -1
- package/dist/jobs/assets/added-cbwsxv3e.js +4 -0
- package/dist/jobs/assets/{added-ma7xb2dx.js.map → added-cbwsxv3e.js.map} +1 -1
- package/dist/jobs/assets/{channel-a5chwqet.js → channel-tgkvqm8y.js} +3 -3
- package/dist/jobs/assets/{channel-a5chwqet.js.map → channel-tgkvqm8y.js.map} +1 -1
- package/dist/jobs/assets/{channelChecks-1epbhv9a.js → channelChecks-s4yz4yhw.js} +3 -3
- package/dist/jobs/assets/{channelChecks-1epbhv9a.js.map → channelChecks-s4yz4yhw.js.map} +1 -1
- package/dist/jobs/assets/index-09z2cjft.js +4 -0
- package/dist/jobs/assets/{index-m7zk18cj.js.map → index-09z2cjft.js.map} +1 -1
- package/dist/jobs/assets/index-47pxmyxn.js +4 -0
- package/dist/jobs/assets/{index-c7qk888t.js.map → index-47pxmyxn.js.map} +1 -1
- package/dist/jobs/assets/index-4e55z986.js +4 -0
- package/dist/jobs/assets/{index-7kbae3pm.js.map → index-4e55z986.js.map} +1 -1
- package/dist/jobs/assets/index-5c933424.js +4 -0
- package/dist/jobs/assets/{index-xfq292gs.js.map → index-5c933424.js.map} +1 -1
- package/dist/jobs/assets/index-d5r5n0mm.js +4 -0
- package/dist/jobs/assets/{index-j3h4v03g.js.map → index-d5r5n0mm.js.map} +3 -3
- package/dist/jobs/assets/index-hs60b25v.js +10 -0
- package/dist/jobs/assets/{index-y5zw06cs.js.map → index-hs60b25v.js.map} +1 -1
- package/dist/jobs/assets/index-k2smrr70.js +4 -0
- package/dist/jobs/assets/{index-de1fgbgf.js.map → index-k2smrr70.js.map} +1 -1
- package/dist/jobs/assets/index-q24jw3w9.js +4 -0
- package/dist/jobs/assets/{index-pjtmzrcd.js.map → index-q24jw3w9.js.map} +1 -1
- package/dist/jobs/assets/index-rtynx6wj.js +4 -0
- package/dist/jobs/assets/{index-mykmd5cv.js.map → index-rtynx6wj.js.map} +1 -1
- package/dist/jobs/assets/{live-erz9pvnm.js → live-6k7s6358.js} +3 -3
- package/dist/jobs/assets/{live-erz9pvnm.js.map → live-6k7s6358.js.map} +1 -1
- package/dist/jobs/assets/{main-smabxbn4.js → main-0jmeh6mq.js} +4 -4
- package/dist/jobs/assets/{main-smabxbn4.js.map → main-0jmeh6mq.js.map} +1 -1
- package/dist/jobs/assets/main-3yj6bv90.js +5 -0
- package/dist/jobs/assets/{main-yg6scp84.js.map → main-3yj6bv90.js.map} +1 -1
- package/dist/jobs/assets/main-4g69fn3x.js +5 -0
- package/dist/jobs/assets/{main-v2f8a4g3.js.map → main-4g69fn3x.js.map} +1 -1
- package/dist/jobs/assets/{main-e8zsqez2.js → main-4gte3eqq.js} +4 -4
- package/dist/jobs/assets/{main-e8zsqez2.js.map → main-4gte3eqq.js.map} +1 -1
- package/dist/jobs/assets/{main-zk3n47nq.js → main-4j1fcevh.js} +3 -3
- package/dist/jobs/assets/{main-zk3n47nq.js.map → main-4j1fcevh.js.map} +1 -1
- package/dist/jobs/assets/main-5grjvsy7.js +5 -0
- package/dist/jobs/assets/{main-3xxhy5jh.js.map → main-5grjvsy7.js.map} +1 -1
- package/dist/jobs/assets/{main-gzppw8ng.js → main-5zbx60gq.js} +3 -3
- package/dist/jobs/assets/{main-gzppw8ng.js.map → main-5zbx60gq.js.map} +1 -1
- package/dist/jobs/assets/{main-zx20z2e9.js → main-9prgjhg4.js} +4 -4
- package/dist/jobs/assets/{main-zx20z2e9.js.map → main-9prgjhg4.js.map} +1 -1
- package/dist/jobs/assets/main-a250ffk7.js +17 -0
- package/dist/jobs/assets/{main-xf44bv26.js.map → main-a250ffk7.js.map} +4 -4
- package/dist/jobs/assets/{main-qahvywvw.js → main-d6ge7w08.js} +4 -4
- package/dist/jobs/assets/{main-qahvywvw.js.map → main-d6ge7w08.js.map} +1 -1
- package/dist/jobs/assets/{main-kjywj2zd.js → main-gngzht43.js} +3 -3
- package/dist/jobs/assets/{main-kjywj2zd.js.map → main-gngzht43.js.map} +1 -1
- package/dist/jobs/assets/main-hg0hrg8j.js +5 -0
- package/dist/jobs/assets/{main-yjykmsvp.js.map → main-hg0hrg8j.js.map} +1 -1
- package/dist/jobs/assets/main-hm1ng3yg.js +5 -0
- package/dist/jobs/assets/{main-9qd3nqs5.js.map → main-hm1ng3yg.js.map} +1 -1
- package/dist/jobs/assets/main-jkvd92z9.js +5 -0
- package/dist/jobs/assets/{main-fcq7hfk0.js.map → main-jkvd92z9.js.map} +1 -1
- package/dist/jobs/assets/main-jv5xqd13.js +5 -0
- package/dist/jobs/assets/{main-grcj8v1z.js.map → main-jv5xqd13.js.map} +7 -7
- package/dist/jobs/assets/main-jxre7w93.js +5 -0
- package/dist/jobs/assets/{main-47391fgm.js.map → main-jxre7w93.js.map} +4 -4
- package/dist/jobs/assets/{main-b35rfpdf.js → main-kwmqkjfx.js} +4 -4
- package/dist/jobs/assets/{main-b35rfpdf.js.map → main-kwmqkjfx.js.map} +1 -1
- package/dist/jobs/assets/main-n9cf6bxm.js +5 -0
- package/dist/jobs/assets/{main-vargz49c.js.map → main-n9cf6bxm.js.map} +1 -1
- package/dist/jobs/assets/{main-6xdkyzv1.js → main-pegp0ygb.js} +2 -2
- package/dist/jobs/assets/{main-2n5wnj51.js → main-qr573853.js} +3 -3
- package/dist/jobs/assets/{main-2n5wnj51.js.map → main-qr573853.js.map} +1 -1
- package/dist/jobs/assets/main-rq97rdr4.js +4 -0
- package/dist/jobs/assets/{main-7jzem39c.js.map → main-rq97rdr4.js.map} +1 -1
- package/dist/jobs/assets/main-szjdmydc.js +5 -0
- package/dist/jobs/assets/{main-pqke97qp.js.map → main-szjdmydc.js.map} +1 -1
- package/dist/jobs/assets/{main-jex4pqaa.js → main-tnbhrm9n.js} +5 -5
- package/dist/jobs/assets/{main-jex4pqaa.js.map → main-tnbhrm9n.js.map} +1 -1
- package/dist/jobs/assets/main-ts19j4n0.js +5 -0
- package/dist/jobs/assets/{main-eekxtm5w.js.map → main-ts19j4n0.js.map} +1 -1
- package/dist/jobs/assets/{main-fn8r2zyb.js → main-w93x1dzs.js} +4 -4
- package/dist/jobs/assets/{main-fn8r2zyb.js.map → main-w93x1dzs.js.map} +1 -1
- package/dist/jobs/assets/sections-0y7w4fb4.js +4 -0
- package/dist/jobs/assets/{sections-b570mm22.js.map → sections-0y7w4fb4.js.map} +1 -1
- package/dist/jobs/assets/{sse-42e8mhar.js → sse-mn0t0fh7.js} +4 -4
- package/dist/jobs/assets/{sse-42e8mhar.js.map → sse-mn0t0fh7.js.map} +1 -1
- package/dist/jobs/assets/{sseChecks-0jskzcs1.js → sseChecks-t7tcm7ra.js} +3 -3
- package/dist/jobs/assets/{sseChecks-0jskzcs1.js.map → sseChecks-t7tcm7ra.js.map} +1 -1
- package/dist/jobs/assets/validation-ysjfy072.js +4 -0
- package/dist/jobs/assets/{validation-199pberh.js.map → validation-ysjfy072.js.map} +1 -1
- package/dist/jobs/manifest.json +213 -213
- package/package.json +10 -6
- package/dist/docs/assets/main-pgxtmtja.js +0 -18
- package/dist/jobs/assets/AddFlowDialog-0ec5ff4r.js +0 -6
- package/dist/jobs/assets/added-ma7xb2dx.js +0 -4
- package/dist/jobs/assets/index-7kbae3pm.js +0 -4
- package/dist/jobs/assets/index-c7qk888t.js +0 -4
- package/dist/jobs/assets/index-de1fgbgf.js +0 -4
- package/dist/jobs/assets/index-j3h4v03g.js +0 -4
- package/dist/jobs/assets/index-m7zk18cj.js +0 -4
- package/dist/jobs/assets/index-mykmd5cv.js +0 -4
- package/dist/jobs/assets/index-pjtmzrcd.js +0 -4
- package/dist/jobs/assets/index-xfq292gs.js +0 -4
- package/dist/jobs/assets/index-y5zw06cs.js +0 -10
- package/dist/jobs/assets/main-3xxhy5jh.js +0 -5
- package/dist/jobs/assets/main-47391fgm.js +0 -5
- package/dist/jobs/assets/main-7jzem39c.js +0 -4
- package/dist/jobs/assets/main-9qd3nqs5.js +0 -5
- package/dist/jobs/assets/main-eekxtm5w.js +0 -5
- package/dist/jobs/assets/main-fcq7hfk0.js +0 -5
- package/dist/jobs/assets/main-grcj8v1z.js +0 -5
- package/dist/jobs/assets/main-pqke97qp.js +0 -5
- package/dist/jobs/assets/main-v2f8a4g3.js +0 -5
- package/dist/jobs/assets/main-vargz49c.js +0 -5
- package/dist/jobs/assets/main-xf44bv26.js +0 -17
- package/dist/jobs/assets/main-yg6scp84.js +0 -5
- package/dist/jobs/assets/main-yjykmsvp.js +0 -5
- package/dist/jobs/assets/sections-b570mm22.js +0 -4
- package/dist/jobs/assets/validation-199pberh.js +0 -4
- /package/dist/jobs/assets/{main-6xdkyzv1.js.map → main-pegp0ygb.js.map} +0 -0
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{An,C,Me,c,g,r,St,vn,qr,Zn,$t,Jr,Hr,K,b,P,N,n,e,t,f,i,gt,m,y,ie,J,Y,a,s,de,E,oe,ve,ue,rt,ye,H,d,p,R,L,o,h,u,te,Ce,l,M,V,S,w,Le,I,ne,Kr}from"./main-a250ffk7.js";import{dt,dn}from"./main-qr573853.js";import{Ue,ct}from"./main-tnbhrm9n.js";import{he,Ne,mt,cn,ho,go,yo}from"./main-gngzht43.js";import{U}from"./main-hg0hrg8j.js";import{k}from"./main-4g69fn3x.js";import{Ir,O}from"./main-4j1fcevh.js";import{W,me,we}from"./main-3yj6bv90.js";import{Ie,A}from"./main-0jmeh6mq.js";import{ae}from"./main-d6ge7w08.js";import{re}from"./main-jkvd92z9.js";import{D}from"./main-hm1ng3yg.js";import{ge}from"./main-5grjvsy7.js";import{F}from"./main-pegp0ygb.js";function De(v,x){return`/runners/${P(v)}${x}`}function Sn(v,x,T={}){let _=T.force!==void 0||T.args!==void 0;return v.request("POST",De(x,"/trigger"),{body:_?T:void 0})}function Nn(v,x){return v.request("POST",De(x,"/pause"))}function Ln(v,x,T=!1){return v.request("POST",De(x,"/resume"),{body:T?{triggerNow:!0}:void 0})}function wn(v,x,T){return v.request("PUT",De(x,"/schedule"),{body:{schedule:T}})}function Tn(v,x,T={}){return v.request("POST",De(x,"/kill"),{body:Object.keys(T).length>0?T:void 0})}function Dn(v,x,T){return v.request("PUT",De(x,"/config"),{body:T})}function En(v,x){return v.request("DELETE",De(x,"/config"))}function On(v,x){return v.request("POST",De(x,"/stats/reset"))}function kn(v,x){return v.request("DELETE",De(x,"/history"))}var Pn={"child-process":"child-process — a child process per run","worker-thread":"worker-thread — a Worker thread per run","in-process":"in-process — in the runner's own process"},In=[{value:"parallel",label:"parallel — runs may overlap"},{value:"single",label:"single — one run at a time, cluster-wide"}],Ee=qr.maxConcurrency,er=["runMode","maxConcurrency"],Mn={executionMode:"Execution mode",runMode:"Run mode",maxConcurrency:"Max concurrency"};function nr(v){return er.some((x)=>v.overridden.includes(x))}function sn(v){return{executionModeOverridden:v.overridden.includes("executionMode"),executionMode:v.effective.executionMode,concurrencyOverridden:nr(v),runMode:v.effective.runMode,maxConcurrency:v.effective.maxConcurrency??void 0}}function tr(v,x){let T=x.code??x.effective;return{executionMode:v.executionModeOverridden?v.executionMode:T.executionMode,runMode:v.concurrencyOverridden?v.runMode:T.runMode,maxConcurrency:v.concurrencyOverridden?v.maxConcurrency??null:T.maxConcurrency}}function ke(v,x){if(v.code===void 0)return null;if(x==="maxConcurrency")return on(v.code.maxConcurrency);return v.code[x]}function on(v){return v===null||v===void 0?"unlimited":o(v)}function _n(v){if(!v.concurrencyOverridden||v.runMode!=="parallel")return{};let x=v.maxConcurrency;if(x===void 0)return{};if(!Number.isInteger(x))return{maxConcurrency:"A whole number of runs, or empty for unlimited."};if(x<Ee.min||x>Ee.max)return{maxConcurrency:`Between ${Ee.min} and ${o(Ee.max)}, or empty for unlimited.`};return{}}function an(v,x){let T=sn(x),_={};if(v.executionModeOverridden!==T.executionModeOverridden||v.executionModeOverridden&&v.executionMode!==T.executionMode)_.executionMode=v.executionModeOverridden?v.executionMode:null;let B=v.runMode==="parallel"&&v.maxConcurrency!==T.maxConcurrency;if(v.concurrencyOverridden!==T.concurrencyOverridden||v.concurrencyOverridden&&(v.runMode!==T.runMode||B))_.concurrency=!v.concurrencyOverridden?null:v.runMode==="single"?{runMode:"single"}:{runMode:"parallel",maxConcurrency:v.maxConcurrency??null};return _}function Fn(v,x){return Object.keys(an(v,x)).length>0}function Bn(v,x){let T=tr(v,x),_=x.effective,B=[];if(T.executionMode!==_.executionMode)B.push({id:"execution-mode",message:`A run already in flight keeps the mode it started with, so ${T.executionMode} applies from the next run.`});if(_.runMode==="parallel"&&T.runMode==="single")B.push({id:"to-single",message:"Switching from parallel to single is not immediate across processes: a parallel run holds no lock, so overlap can persist for as long as the longest run in flight, plus however long an owner takes to adopt the change. Pause the runner first if exclusivity matters."});let q=_.maxConcurrency??1/0,Q=T.maxConcurrency??1/0;if(T.runMode==="parallel"&&Q<q)B.push({id:"lower-concurrency",message:`Lowering the cap from ${on(_.maxConcurrency)} to ${on(T.maxConcurrency)} only gates new runs: runs already in flight keep going.`});return B}function He(v){let x=v.appliedSeq??0;return v.seq>0&&x<v.seq?{applied:x,seq:v.seq}:null}function $n(v){let x=v.allowed;return x===void 0?[]:vn.filter((T)=>!x.includes(T))}function Un(v){let x=v.allowed;return x===void 0?[...vn]:vn.filter((T)=>x.includes(T))}function Hn(v){if(v.overridden.length===0)return"None: as the runner's code asks";return v.overridden.map((x)=>Mn[x]??x).join(", ")}function qn(v){let x=v.error?.keys;return x===void 0||x.length===0?null:x}function rr(v,x){if(v.error===void 0)return!1;let T=qn(v);if(T!==null)return T.includes(x);return v.code!==void 0&&v.effective[x]===v.code[x]}function un(v){let x=qn(v);if(x===null)return null;let T=x.map((_)=>Mn[_]??_);return T.length===1?T[0]:`${T.slice(0,-1).join(", ")} and ${T.at(-1)}`}function qe(v,x){if(v===void 0||!v.overridden.includes(x))return;let T=ke(v,x);if(rr(v,x))return T===null?"Override refused by the owner; it runs what its code asks for":`Override refused by the owner; it runs what its code asks for, ${T}`;return T===null?"Overridden here":`Overridden here; its code asks for ${T}`}function Kn(v){if(v.error!==void 0){let T=un(v);return T===null?`The owner refused these settings: ${v.error.message}`:`The owner refused ${T}: ${v.error.message}`}let x=He(v);return x===null?null:`Version ${x.seq} has not been adopted yet (the owner is on ${x.applied}); it takes effect at its next sync`}var Gn={paused:"The runner is paused. Tick “Run even while paused” to run it anyway, or resume it.",busy:"A run is already in progress, and this runner does not queue triggers.","lock-held":"Another process holds the runner's lock (a run is in progress there), and this runner does not queue triggers.","max-concurrency":"The runner is at its concurrency limit, and it does not queue triggers.","queue-full":"The runner's trigger queue is full (maxQueuedRuns). Try again once some queued runs have started.",stopped:"The runner has stopped, so nothing runs."},or={kill:"Only the process executing a run can kill it",resetStats:"Only the process that registered the runner can reset its stats"};function ln(v,x){switch(v.code){case"RUNNER_NOT_LOCAL":return`${or[x]??"This action needs the runner registered in the API's process"}, and this runner is registered only in another process. Use the management API of the process that runs it.`;case"RUN_NOT_FOUND":return"That run is no longer active in this process: it finished, or was killed already. Refresh to see the runs in flight now.";case"RUNNER_STOPPED":return"The runner has stopped (its process is shutting down, or it was stopped), so it cannot be triggered.";case"ARGS_NOT_ALLOWED":return"This API does not accept run arguments (it was created without runnerTriggerArgs). Trigger without arguments.";case"RUNNER_NOT_CONFIGURABLE":return"This runner cannot be configured from the API yet: no process running it has started since remote configuration shipped, so a setting would be stored and never adopted. Restart the runner on the current version, or change its settings where the runner is defined.";case"CONFIG_NOT_ALLOWED":return"The runner's own code does not permit that setting — usually an execution mode outside its `allowedOverrides.executionModes`. Choose one of the modes offered, or widen the list where the runner is defined.";case"RUNNER_NOT_FOUND":return x==="clearHistory"?"The runner no longer exists in this namespace (it was unregistered, or its state was removed), so it has no history left to clear.":"The runner no longer exists in this namespace: it was unregistered, or its state was removed.";default:return null}}function Se(v,x){if(!b(v))return v;let T=ln(v,x);if(T===null)return v;return new K({kind:v.kind,status:v.status,code:v.code,title:v.title,detail:T,type:v.type,issues:v.issues,context:v.context,instance:v.instance,cause:v})}function zn(v,x){let T=x.length>0?`, kept ${o(x.length)} in progress`:"";return`Cleared ${h(v,"run")}${T}`}function Vn({runner:v,config:x,onClose:T}){let _=i(),B=c(),[q,Q]=r(()=>sn(x)),X=(be)=>Q((jt)=>({...jt,...be})),G=O({mutationFn:(be)=>Dn(_,v.id,be),successMessage:(be)=>He(be)===null?`Saved the settings of ${v.id}`:`Saved the settings of ${v.id}; its owner adopts them at its next sync`,invalidate:Ne(v.id),toastErrors:!1,onSuccess:()=>T()}),ee=O({mutationFn:()=>En(_,v.id),successMessage:`Reset ${v.id} to its code defaults`,invalidate:Ne(v.id),toastErrors:!1,onSuccess:()=>T()}),Z=G.isPending||ee.isPending,Re=_n(q),se=Bn(q,x),le=an(q,x),z=Fn(q,x),ce=He(x),fe=Un(x),xe=$n(x),pe=ke(x,"executionMode"),Te=ke(x,"runMode"),Oe=ke(x,"maxConcurrency"),Be=G.error??ee.error,$e=(fe.includes(q.executionMode)?fe:[q.executionMode,...fe]).map((be)=>({value:be,label:Pn[be]})),rn=(be)=>{if(be.preventDefault(),Object.keys(Re).length>0||!z)return;G.mutate(le)},j=()=>{if(!Z)T()};return e(oe,{open:!0,onClose:j,title:t(n,{children:["Settings of ",e("code",{children:v.id})]}),description:"Where runs execute and whether they may overlap, for every process running this runner. A setting left to the runner's code follows the code.",size:"md",closeOnEscape:!Z,closeOnBackdrop:!Z,footer:t(n,{children:[x.overridden.length>0&&e(s,{variant:"danger",onClick:()=>ee.mutate(),disabled:Z,"aria-busy":ee.isPending||void 0,children:ee.isPending?"Resetting…":"Reset to code defaults"}),e(s,{onClick:j,disabled:Z,children:"Cancel"}),e(s,{variant:"primary",type:"submit",form:B,disabled:Z||!z,"aria-busy":G.isPending||void 0,children:G.isPending?"Saving…":"Save settings"})]}),children:t("form",{id:B,className:"runner-form",onSubmit:rn,noValidate:!0,children:[ce!==null&&t("p",{className:"runner-note runner-note-pending",role:"status","data-testid":"config-pending",children:["The stored settings (version ",ce.seq,") have not been adopted yet: the owner is on version ",ce.applied,". They take effect at its next sync."]}),x.error!==void 0&&t("p",{className:"runner-note runner-note-refused",role:"note","data-testid":"config-refused",children:["The owner refused ",un(x)??"the stored settings"," ",e(A,{value:x.error.at}),": ",x.error.message]}),e(l,{label:"Execution mode",hint:pe===null?"Where each run executes. It applies from the next run.":`Where each run executes. This runner's code asks for ${pe}.`,error:G.fieldErrors.executionMode,children:e(S,{options:$e,value:q.executionMode,onChange:(be)=>X({executionMode:be,executionModeOverridden:!0}),disabled:Z})}),e(Wn,{testId:"execution-mode",overridden:q.executionModeOverridden,label:"Execution mode",canReset:x.code!==void 0,disabled:Z,onReset:()=>X({executionModeOverridden:!1,executionMode:x.code?.executionMode??q.executionMode})}),xe.length>0&&t("p",{className:"runner-note",role:"note","data-testid":"config-modes-limited",children:[xe.join(", ")," ",xe.length===1?"is":"are"," ","not offered: this runner's code permits only ",fe.join(", ")," (its"," ",e("code",{children:"allowedOverrides.executionModes"}),"). The API refuses any other with 409 ",e("code",{children:"CONFIG_NOT_ALLOWED"}),"."]}),e(l,{label:"Run mode",hint:Te===null?"Whether runs may overlap.":`Whether runs may overlap. This runner's code asks for ${Te}.`,error:G.fieldErrors["concurrency.runMode"],children:e(S,{options:In,value:q.runMode,onChange:(be)=>X({runMode:be,concurrencyOverridden:!0}),disabled:Z})}),e(l,{label:"Max concurrency",hint:q.runMode==="single"?"Only applies in parallel: single already allows one run at a time.":`Most concurrent runs, ${Ee.min} to ${Ee.max} from here. Empty means unlimited.${Oe===null?"":` This runner's code asks for ${Oe}.`}`,error:Re.maxConcurrency??G.fieldErrors["concurrency.maxConcurrency"],children:e(V,{value:q.maxConcurrency,onChange:(be)=>X({maxConcurrency:be,concurrencyOverridden:!0}),min:Ee.min,max:Ee.max,placeholder:"Unlimited",disabled:Z||q.runMode==="single"})}),e(Wn,{testId:"concurrency",overridden:q.concurrencyOverridden,label:"Run mode and max concurrency",canReset:x.code!==void 0,disabled:Z,onReset:()=>X({concurrencyOverridden:!1,runMode:x.code?.runMode??q.runMode,maxConcurrency:x.code?.maxConcurrency??q.maxConcurrency})}),se.map((be)=>e("p",{className:"runner-note runner-note-pending",role:"note","data-testid":`config-warning-${be.id}`,children:be.message},be.id)),Be!==null&&e(D,{error:Se(Be,"configure")})]})})}function Wn({testId:v,overridden:x,label:T,canReset:_,disabled:B,onReset:q}){return t("p",{className:"config-source","data-testid":`config-source-${v}`,children:[e("span",{children:x?`${T}: overridden here.`:`${T}: as the runner's code asks.`}),x&&_&&e(s,{size:"sm",onClick:q,disabled:B,children:"Use the code default"})]})}function sr(v){return v.isLocal&&(v.local?.activeRuns.length??0)>0}function Ke(v,x){let T=x("runners.kill"),_=x("runners.resetStats");return{trigger:x("runners.trigger"),pause:!v.isPaused&&x("runners.pause"),resume:v.isPaused&&x("runners.resume"),reschedule:x("runners.reschedule"),configure:v.config!==void 0&&x("runners.configure"),kill:T&&sr(v),resetStats:_&&v.isLocal,clearHistory:x("runners.clearHistory"),nonLocalOnly:!v.isLocal&&(T||_)}}function Qn(v){if(v.isLocal)return!1;return(v.config?.effective.runMode??v.runMode)!=="single"}var Ge=200;function Yn({runner:v,onClose:x}){let T=i(),[_,B]=r(!1),q=O({mutationFn:(Q)=>Ln(T,v.id,Q),successMessage:(Q,X)=>`Resumed ${v.id}${X?" and asked for a run":""}${v.isLocal?"":"; its owner picks it up at its next sync"}`,invalidate:Ne(v.id),toastErrors:!1});return e(k,{open:!0,onClose:x,title:`Resume ${v.id}?`,description:"Scheduled and manual runs start again, everywhere the runner is registered.",confirmLabel:"Resume",pendingLabel:"Resuming…",onConfirm:async()=>{try{await q.mutateAsync(_)}catch(Q){throw Se(Q,"resume")}},children:e(w,{checked:_,onChange:B,label:"Also trigger a run now"})})}function Xn({runner:v,onClose:x}){let T=i(),_=te(),B=v.local?.activeRuns??[],[q,Q]=r(""),[X,G]=r(!1),[ee,Z]=r(""),[Re,se]=r(!1),le=O({mutationFn:(fe)=>Tn(T,v.id,fe),onSuccess:(fe,xe)=>{let pe=fe.runIds.length;if(pe===0){_.info(`No run was active on ${v.id}`);return}_.success(xe.wait?`Killed ${h(pe,"run")} on ${v.id}`:`Kill requested for ${h(pe,"run")} on ${v.id}`,{description:fe.runIds.join(", ")})},invalidate:Ne(v.id),toastErrors:!1}),z=ee.trim(),ce=le.isPending&&le.variables?.wait===!0;return t(k,{open:!0,onClose:x,title:`Kill runs of ${v.id}?`,description:"Stops the chosen run (or every active run) in this process: it is asked to close, then killed once its timeouts pass. The runs are recorded as killed.",variant:"danger",confirmLabel:"Kill",pendingLabel:Re?"Waiting for the runs to settle…":"Killing…",confirmText:v.id,confirmDisabled:z.length>Ge,onConfirm:async()=>{try{await le.mutateAsync({...q?{runId:q}:{},...X?{force:!0}:{},...z?{reason:z}:{},...Re?{wait:!0}:{}})}catch(fe){throw Se(fe,"kill")}},children:[e(l,{label:"Run",children:e(S,{options:[{value:"",label:`Every active run (${B.length})`},...B.map((fe)=>({value:fe.runId,label:`${fe.runId} (${fe.source}, attempt ${fe.attempt})`}))],value:q,onChange:Q,disabled:le.isPending})}),e(w,{checked:X,onChange:G,label:"Force",hint:"Skip straight to the end of the kill escalation instead of asking the run to close first.",disabled:le.isPending}),e(l,{label:"Reason",hint:`Optional, recorded on the run. At most ${Ge} characters.`,error:le.fieldErrors.reason??(z.length>Ge?`At most ${Ge} characters.`:void 0),children:e(M,{value:ee,onChange:Z,disabled:le.isPending})}),e(w,{checked:Re,onChange:se,label:"Wait until the runs have settled",hint:"Answer only once they have stopped. This can take the runner's closeTimeout plus killTimeout.",disabled:le.isPending}),ce&&e("p",{className:"runner-note runner-note-pending",role:"status","data-testid":"kill-waiting",children:"Waiting for the runs to settle. This can take the runner's closeTimeout plus killTimeout."})]})}function Jn({runner:v,onClose:x}){let T=i(),_=O({mutationFn:()=>On(T,v.id),successMessage:`Reset the stats of ${v.id}`,invalidate:Ne(v.id),toastErrors:!1});return e(k,{open:!0,onClose:x,title:`Reset the stats of ${v.id}?`,description:"Sets every lifetime counter (success, failed, timeout, killed, skipped, queued, total) back to zero, for every process. History is kept. This cannot be undone.",variant:"danger",confirmLabel:"Reset stats",pendingLabel:"Resetting…",onConfirm:async()=>{try{await _.mutateAsync()}catch(B){throw Se(B,"resetStats")}}})}function jn({runner:v,onClose:x}){let T=i(),_=te(),B=O({mutationFn:()=>kn(T,v.id),onSuccess:(q)=>{_.success(zn(q.removed,q.kept),q.kept.length>0?{description:`Kept: ${q.kept.join(", ")}`}:void 0)},invalidate:Ne(v.id),toastErrors:!1});return t(k,{open:!0,onClose:x,title:`Clear the run history of ${v.id}?`,description:"Removes every finished run and its log, for every process. Runs still in progress are kept, record and log whole. The lifetime counters and the charts are untouched: Reset stats… is separate. This cannot be undone.",variant:"danger",confirmLabel:"Clear history",pendingLabel:"Clearing…",onConfirm:async()=>{try{await B.mutateAsync()}catch(q){throw Se(q,"clearHistory")}},children:[e("p",{className:"runner-note muted",children:"A run whose record still says running but whose process has gone (no lock names it, and it started over a day ago) counts as finished, and is removed."}),Qn(v)&&e("p",{className:"runner-note muted","data-testid":"clear-history-parallel-note",children:"This runner is registered in another process and its runs may overlap, so the API cannot ask the process running them: a parallel run still going after a day is taken for crashed and removed too."})]})}var ze={seconds:1000,minutes:60000,hours:3600000},We=200,Ve=100;function ir(v="none"){return{mode:v,cron:"",tz:"",everyAmount:void 0,everyUnit:"minutes",anchor:void 0,at:void 0}}function ar(v){for(let x of["hours","minutes","seconds"])if(v%ze[x]===0)return{amount:v/ze[x],unit:x};return{amount:v/ze.seconds,unit:"seconds"}}function et(v){let x=ir();if(v===null)return x;if("cron"in v)return{...x,mode:"cron",cron:v.cron,tz:v.tz??""};if("every"in v){let{amount:T,unit:_}=ar(v.every);return{...x,mode:"every",everyAmount:T,everyUnit:_,anchor:v.anchor}}return{...x,mode:"at",at:v.at}}function nt(v,x){if(v===void 0||!Number.isFinite(v)||v<=0)return;let T=Math.round(v*ze[x]);return T>=1?T:void 0}function Qe(){let v=Intl;if(typeof v.supportedValuesOf!=="function")return null;try{return v.supportedValuesOf("timeZone")}catch{return null}}function ur(v,x=Qe()){let T=v.trim();if(T===""||/^[+-]\d/.test(T))return!1;let _=T.toLowerCase();if(x?.some((B)=>B.toLowerCase()===_))return!0;try{return Intl.DateTimeFormat("en",{timeZone:T}).resolvedOptions().timeZone!==""}catch{return!1}}function lr(v){let x=v.trim();if(x==="")return"Enter a cron expression.";if(x.length>We)return`At most ${We} characters.`;let T=x.split(/\s+/);if(T.length===1&&x.startsWith("@"))return null;if(T.length!==5&&T.length!==6)return`${T.length} field${T.length===1?"":"s"}: expected 5, 6 with seconds first, or a nickname such as @daily.`;return null}function mn(v,x=Qe()){let T={};switch(v.mode){case"cron":{let _=lr(v.cron);if(_)T.cron=_;let B=v.tz.trim();if(B.length>Ve)T.tz=`At most ${Ve} characters.`;else if(B!==""&&!ur(B,x))T.tz=`“${B}” is not a known time zone. Use an IANA name such as Europe/London or UTC.`;break}case"every":if(nt(v.everyAmount,v.everyUnit)===void 0)T.every="Enter an interval greater than zero.";break;case"at":if(v.at===void 0)T.at="Pick a date and time.";break;case"none":break}return T}function tt(v){switch(v.mode){case"cron":{let x=v.tz.trim();return{cron:v.cron.trim(),...x?{tz:x}:{}}}case"every":return{every:nt(v.everyAmount,v.everyUnit)??0,...v.anchor===void 0?{}:{anchor:v.anchor}};case"at":return{at:v.at??0};case"none":return null}}function dr(v){switch(v){case"cron":return"cron";case"every":return"every";case"at":return"at";case"none":return null}}function ot(v){return b(v)&&v.code==="INVALID_SCHEDULE"?Ir(v.issues):{}}function st(v,x){let T={},_;for(let[B,q]of Object.entries(v)){let X=/^schedule\.(cron|tz|every|anchor|at)\b/.exec(B)?.[1]??dr(x);if(X)T[X]??=q;else _??=q}return{fields:T,other:_}}var cr=[{value:"cron",label:"Cron"},{value:"every",label:"Every"},{value:"at",label:"Once"},{value:"none",label:"None"}],mr=[{value:"seconds",label:"seconds"},{value:"minutes",label:"minutes"},{value:"hours",label:"hours"}];function it({runner:v,onClose:x}){let T=i(),_=te(),B=c(),q=c(),Q=g(()=>Qe(),[]),X=Ie(),[G,ee]=r(()=>et(v.schedule)),[Z,Re]=r(!1),se=Ce(),le=(j)=>ee((be)=>({...be,...j})),z=O({mutationFn:(j)=>wn(T,v.id,j),onSuccess:(j)=>{_.success(j.schedule===null?`${v.id} is unscheduled`:`Rescheduled ${v.id}`,{description:j.nextRunAt===null?"No run is scheduled; it runs only when triggered.":t("span",{"data-testid":"schedule-next-run",children:["Next run ",e(A,{value:j.nextRunAt})]})}),x()},invalidate:Ne(v.id),toastErrors:!1}),ce=Z?mn(G,Q):{},fe=st({...z.fieldErrors,...ot(z.error)},G.mode),xe=(j)=>(j==="anchor"||j==="at"?se.problems[j]:void 0)??ce[j]??fe.fields[j],pe=Object.keys(fe.fields).length>0,Te=z.unplacedIssues.length>0,Oe=z.error&&(!pe||Te)?(Te?void 0:fe.other)??Se(z.error,"reschedule"):null,Be=(j)=>{if(j.preventDefault(),Re(!0),se.blocked||Object.keys(mn(G,Q)).length>0)return;z.mutate(tt(G))},$e=()=>{if(!z.isPending)x()},rn=G.at!==void 0&&G.at<=X;return e(oe,{open:!0,onClose:$e,title:t(n,{children:["Reschedule ",e("code",{children:v.id})]}),description:"Replaces the stored schedule for every process running this runner.",size:"md",closeOnEscape:!z.isPending,closeOnBackdrop:!z.isPending,footer:t(n,{children:[e(s,{onClick:$e,disabled:z.isPending,children:"Cancel"}),e(s,{variant:"primary",type:"submit",form:B,disabled:z.isPending||se.blocked,"aria-busy":z.isPending||void 0,children:z.isPending?"Saving…":"Save schedule"})]}),children:t("form",{id:B,className:"runner-form",onSubmit:Be,noValidate:!0,children:[t("fieldset",{className:"schedule-modes",children:[e("legend",{children:"Schedule"}),cr.map((j)=>t("label",{className:"schedule-mode",children:[e("input",{type:"radio",name:`${B}-mode`,value:j.value,checked:G.mode===j.value,onChange:()=>le({mode:j.value})}),j.label]},j.value))]}),G.mode==="cron"&&t(n,{children:[e(l,{label:"Cron expression",required:!0,hint:"5 fields (minute hour day month weekday), 6 with seconds first, or a nickname such as @daily.",error:xe("cron"),children:e(M,{value:G.cron,onChange:(j)=>le({cron:j}),maxLength:We,autoComplete:"off",spellCheck:!1,placeholder:"0 9 * * MON-FRI"})}),e(l,{label:"Time zone",hint:"Optional IANA name, e.g. Europe/London. Empty: the owner's local time (the zone of the process that runs it).",error:xe("tz"),children:e(M,{value:G.tz,onChange:(j)=>le({tz:j}),maxLength:Ve,autoComplete:"off",spellCheck:!1,list:Q?q:void 0})}),Q&&e("datalist",{id:q,children:Q.map((j)=>e("option",{value:j},j))})]}),G.mode==="every"&&t(n,{children:[t("div",{className:"runner-form-row",children:[e(l,{label:"Interval",required:!0,error:xe("every"),children:e(V,{value:G.everyAmount,onChange:(j)=>le({everyAmount:j}),min:0,step:"any"})}),e(l,{label:"Unit",children:e(S,{options:mr,value:G.everyUnit,onChange:(j)=>le({everyUnit:j})})})]}),e(l,{label:"Anchor",hint:"Optional: runs stay on this time's grid. Without one, each interval counts from when the schedule is applied.",error:xe("anchor"),children:e(Le,{value:G.anchor,onChange:(j)=>le({anchor:j}),onProblem:(j)=>se.report("anchor",j),withSeconds:!0})})]}),G.mode==="at"&&e(l,{label:"Run at",required:!0,hint:rn?"This time has passed: the runner will not fire.":"One run at this time, then none.",error:xe("at"),children:e(Le,{value:G.at,onChange:(j)=>le({at:j}),onProblem:(j)=>se.report("at",j),withSeconds:!0})}),G.mode==="none"&&e("p",{className:"runner-note",role:"note",children:"No schedule: the runner runs only when triggered."}),Oe!==null&&e(D,{error:Oe})]})})}function at(v,x,T){switch(T.outcome){case"started":v.success(`Run started on ${x.id}`,{description:t("span",{className:"run-id",children:[t("span",{children:["Run ",e("code",{children:T.runId})]}),e(ge,{text:T.runId,ariaLabel:"Copy run id"})]})});return;case"queued":v.success(`Run queued on ${x.id}`,{description:`Position ${T.position} in the trigger queue.${x.isLocal?" It starts when the runner is free.":" The process that owns the runner starts it at its next sync."}`});return;case"skipped":v.info(`Run skipped on ${x.id}`,{description:Gn[T.reason]??T.reason})}}function ut({runner:v,onClose:x}){let T=i(),_=m(),B=te(),q=_.limits.maxJobDataBytes,[Q,X]=r(!1),[G,ee]=r(()=>Ue("",{maxBytes:q,allowEmpty:!0})),Z=O({mutationFn:(z)=>Sn(T,v.id,z),onSuccess:(z)=>at(B,v,z),invalidate:Ne(v.id),toastErrors:!1}),Re=_.runnerTriggerArgs,se=Re&&(!G.valid||G.overLimit),le=async()=>{let z={...Q?{force:!0}:{},...Re&&G.value!==void 0?{args:G.value}:{}};try{await Z.mutateAsync(z)}catch(ce){throw Se(ce,"trigger")}};return t(k,{open:!0,onClose:x,title:`Trigger ${v.id}?`,description:"Asks for a run now. It starts at once, waits in the trigger queue, or is skipped, depending on the runner's state and options.",confirmLabel:"Trigger",pendingLabel:"Triggering…",confirmDisabled:se,onConfirm:le,children:[e(w,{checked:Q,onChange:X,label:"Run even while paused",hint:"Force skips only the pause check. A busy runner, a lock held elsewhere, the concurrency cap and a full trigger queue still apply."}),Re&&e(l,{label:"Arguments",hint:"Optional JSON handed to this run; leave empty for the runner's own args.",children:e(ct,{value:G.text,onChange:ee,maxBytes:q,allowEmpty:!0,rows:6})}),!v.isLocal&&e("p",{className:"runner-note",role:"note","data-testid":"trigger-non-local-note",children:"This runner is registered in another process, so the run is queued for it: its owner starts it at its next sync."})]})}function lt({runner:v}){let x=i(),T=te(),_=re(),[B,q]=r(null),Q=()=>q(null),X=Ke(v,_),G=O({mutationFn:()=>Nn(x,v.id),successMessage:v.isLocal?`Paused ${v.id}`:`Paused ${v.id}; its owner stops at its next sync`,invalidate:Ne(v.id),toastErrors:!1,onError:(Z)=>{T.error(`Could not pause ${v.id}`,{description:b(Z)?ln(Z,"pause")??Z.detail??Z.title:Z.message})}});if(!(X.trigger||X.pause||X.resume||X.reschedule||X.configure||X.kill||X.resetStats)&&!X.nonLocalOnly)return null;return t("div",{className:"runner-actions",role:"group","aria-label":"Runner actions",children:[X.trigger&&e(s,{variant:"primary",onClick:()=>q("trigger"),children:"Trigger…"}),X.pause&&e(s,{onClick:()=>G.mutate(),disabled:G.isPending,"aria-busy":G.isPending||void 0,children:"Pause"}),X.resume&&e(s,{onClick:()=>q("resume"),children:"Resume…"}),X.reschedule&&e(s,{onClick:()=>q("schedule"),children:"Reschedule…"}),X.configure&&e(s,{onClick:()=>q("config"),children:"Settings…"}),X.resetStats&&e(s,{variant:"danger",onClick:()=>q("reset"),children:"Reset stats…"}),X.kill&&e(s,{variant:"danger",onClick:()=>q("kill"),children:"Kill…"}),X.nonLocalOnly&&e("p",{className:"runner-actions-hint","data-testid":"runner-non-local-hint",children:"Registered in another process: kill and reset stats are only available from the API of the process that runs it, and other changes reach it at its next sync."}),B==="trigger"&&e(ut,{runner:v,onClose:Q}),B==="resume"&&e(Yn,{runner:v,onClose:Q}),B==="schedule"&&e(it,{runner:v,onClose:Q}),B==="config"&&v.config!==void 0&&e(Vn,{runner:v,config:v.config,onClose:Q}),B==="kill"&&e(Xn,{runner:v,onClose:Q}),B==="reset"&&e(Jn,{runner:v,onClose:Q})]})}var Ye=2000,pr=100,pn=2000;function pt(v){return Math.max(1,Math.min(100,v))}var fn={run:(v,x)=>[...he.runner(v),"run",x],logs:(v,x,T)=>[...fn.run(v,x),"logs",{stream:T??null}]};function fr(v,x){return`/runners/${P(v)}/runs/${P(x)}/logs`}function ft(v,x,T,_={},B){return v.request("GET",fr(x,T),{query:{since:_.since,offset:_.offset,limit:_.limit,order:_.order,stream:_.stream},signal:B})}function ht(v,x){let T=new Set(v?.lines.map((ee)=>ee.seq)??[]),_=x.items.filter((ee)=>!T.has(ee.seq)),B=[...v?.lines??[],..._].sort((ee,Z)=>ee.seq-Z.seq),q=Math.max(0,B.length-pn),Q=x.items.at(-1)?.seq??0,X=x.page.hasMore,G=X?Q:Math.max(x.lastSeq,Q,v?.cursor??0);return{lines:q>0?B.slice(q):B,cursor:Math.max(v?.cursor??0,G),dropped:x.dropped,capped:x.capped,live:x.live,lastSeq:x.lastSeq,hasMore:X,trimmed:(v?.trimmed??0)+q}}function Rt(v,x=Ye){if(!v)return!1;if(v.hasMore)return pr;return v.live?x:!1}function yt(v,x,T){if(v.kind!=="runner"||v.type!=="logs"||v.target!==x||v.payload.runId!==T)return;return v.payload.lastSeq}function vt(v,x){return v===void 0||v.cursor<x}function Xe(v){return v.logLines===void 0||v.logLines>0||v.status==="running"}function gn(v){return b(v)&&v.code==="LOGS_NOT_RETAINED"}function hn(v){return b(v)&&v.code==="RUN_NOT_FOUND"}var Ze={list:1e4,busy:5000,idle:15000,history:15000};function gr(v){if(!v)return!1;return v.isRunning===!0||(v.local?.activeRuns.length??0)>0}function hr(){return Ze.list}function Rr(){return Ze.history}function bt(){let v=H(Ze.busy),x=H(Ze.idle);return C((T)=>gr(T)?v:x,[v,x])}function xt(){return H(hr())}function Ct(){return H(Rr())}var Nt=St.filter((v)=>v!=="logs");function Lt(v){ye([ue.runners],[he.all],{events:Nt,enabled:v})}function wt(v,x){ye([ue.runner(v)],[he.runner(v)],{events:Nt,enabled:x})}function Tt(v,x,T,_){rt({channels:[ue.runner(v)],events:["logs"],enabled:T,onEvent:(B)=>{let q=yt(B,v,x);if(q!==void 0)_.onHint(q)},onGap:()=>_.onGap()})}var Je={idle:{label:"Idle",tone:"neutral",hint:"Registered but not started in its process: nothing is scheduled there."},running:{label:"Running",tone:"success",hint:"Started: its schedule is armed and triggers are accepted."},paused:{label:"Paused",tone:"warning",hint:"Paused everywhere: scheduled and manual runs do not start."},stopped:{label:"Stopped",tone:"danger",hint:"Stopped in its process: it takes no more triggers."}},yr={label:"Run in flight",tone:"info",hint:"A run is executing somewhere right now (the runner's lock or active runs say so)."},vr={label:"Active",tone:"neutral",hint:"Not paused. Its owner's own status shows only on the owner's API."},Et={running:{label:"Running",tone:"info"},success:{label:"Success",tone:"success"},failed:{label:"Failed",tone:"danger"},timeout:{label:"Timed out",tone:"warning"},killed:{label:"Killed",tone:"danger"}},je={schedule:"Schedule",manual:"Manual",queued:"Queued trigger",resume:"Resume"};function Dt(v){return`${new Date(v).toISOString().slice(0,19).replace("T"," ")} UTC`}function At(v){if(v===null)return"None: runs only when triggered";if("cron"in v)return`Cron ${v.cron} in ${v.tz??"the owner's local time"}`;if("every"in v){let x=v.anchor===void 0?"from when it started":`aligned to ${Dt(v.anchor)}`;return`Every ${U(v.every)}, ${x}`}return`Once, at ${Dt(v.at)}`}function Ot(v){return v===void 0?"unlimited":o(v)}function kt(v){if(v.queueRuns===void 0)return v.maxQueuedRuns===void 0?null:`up to ${o(v.maxQueuedRuns)}`;if(!v.queueRuns)return"No";return v.maxQueuedRuns===void 0?"Yes":`Yes, up to ${o(v.maxQueuedRuns)}`}function Pt(v){let x=[v.local?Je[v.local.status]:v.isPaused?Je.paused:vr];if(v.isRunning||(v.local?.activeRuns.length??0)>0)x.push(yr);return x}var br=[10,25,50,100,200];function Rn(v){return Math.max(1,Math.min(50,v))}function It(v){let x=Math.max(1,v);return[...new Set([...br.filter((T)=>T<=x),Rn(x),x])].sort((T,_)=>T-_)}function Pe(v){return b(v)&&v.code==="RUNNER_NOT_FOUND"}function _e(v){return b(v)&&v.isAuth}function en(v){let x=v.durationMs??(v.finishedAt===void 0?void 0:v.finishedAt-v.startedAt);return x===void 0?null:U(Math.max(0,x))}var Mt="This runner is registered by another process; changes are adopted at its owner's next sync.";function _t(v){return[...v.filter((x)=>x.isLocal),...v.filter((x)=>!x.isLocal)]}function Ft(v,x){let T=x.trim().toLowerCase();if(!T)return[...v];return v.filter((_)=>_.id.toLowerCase().includes(T)||(_.name?.toLowerCase().includes(T)??!1))}function Bt(v){return[...v].sort((x,T)=>T.startedAt-x.startedAt)}function Ut({runner:v,maxHistory:x,enabled:T,openRunId:_}){let B=i(),[q,Q]=W(),X=Rn(x),G=we(me(q,"history",X),x),ee=me(q,"offset",0),Z={offset:ee,limit:G,order:"desc"},Re=Ct(),se=a({queryKey:he.history(v,Z),queryFn:({signal:ce})=>go(B,v,Z,ce),refetchInterval:Re,enabled:T,placeholderData:Y}),le=se.data?Bt(se.data.items):[],z=se.data?.page.total??0;return{query:se,rows:le,offset:ee,limit:G,total:z,paged:z>G,turning:se.isFetching&&se.isPlaceholderData,openRunOffPage:_!==null&&le.length>0&&!le.some((ce)=>ce.runId===_),onChange:(ce)=>{let fe=ce.limit===G?ce.offset:0;Q({offset:fe>0?String(fe):null,history:ce.limit===X?null:String(ce.limit)})}}}var Ht="A run's console output is captured whichever way it runs: console.log, info and debug as stdout, warn and error as stderr, beside its ctx.log() lines. Output written by native code, by a program the run launched with its own output, or, in a worker or in-process run, straight to process.stdout or process.stderr is not captured here.",qt=`Values that look like secrets are replaced with ${Hr} before a line is stored, by default, so some lines may not read exactly as the run printed them.`;function Kt(v,x){if(v===!1||v<=x)return`Following this run: re-read every ${x/1000} s. Live updates are not reaching this view, so this is a poll. While the run is going, its history row shows no line count yet: the lines here are the count.`;return`Following this run: each time its log grows the live socket says so (at most every ${Jr/1000} s), and the new lines are read at once. A re-read every ${v/1000} s is the fallback, in case a notice goes missing. While the run is going, its history row shows no line count yet: the lines here are the count.`}var yn="logStream",Ae="logs",xr={stdout:"stdout",stderr:"stderr",log:"logger"};function bn(v){return xr[v]??v}function Gt(){return[{value:"",label:"Every stream"},...Zn.map((v)=>({value:v,label:bn(v)}))]}function zt(v){return v!==null&&v!==void 0&&Zn.includes(v)}function Wt(v){let x=$t.indexOf(v);if(x<0)return"neutral";if(x>=$t.indexOf("error"))return"danger";if(x>=$t.indexOf("warn"))return"warning";return x>=$t.indexOf("info")?"info":"neutral"}function nn(v,x=2){return String(v).padStart(x,"0")}function Vt(v){let x=new Date(v);if(Number.isNaN(x.getTime()))return"--:--:--.---";return`${nn(x.getHours())}:${nn(x.getMinutes())}:${nn(x.getSeconds())}.${nn(x.getMilliseconds(),3)}`}function xn(v){let x=new Date(v);return Number.isNaN(x.getTime())?void 0:x.toISOString()}function tn(){let v=ie("runnerLogs"),x=y("runners.logs");return v&&x}var Cr="Capture cut this line at its 8 KiB limit, so it is shorter than what the run printed.";function Qt({runner:v,runId:x,enabled:T=!0}){let _=i(),{limits:B}=m(),q=J(),[Q,X]=W(),G=c(),ee=Q.get(yn),Z=zt(ee)?ee:void 0,Re=pt(B.maxLogPage),se=fn.logs(v,x,Z),le=H(Ye),z=a({queryKey:se,enabled:T,queryFn:async({signal:pe})=>{let Te=q.getQueryData(se),Oe=await ft(_,v,x,{since:Te?.cursor===0?void 0:Te?.cursor,limit:Re,order:"asc",stream:Z},pe);return ht(Te,Oe)},refetchInterval:(pe)=>gn(pe.state.error)||hn(pe.state.error)?!1:Rt(pe.state.data,le)}),ce=z.data,fe=()=>void q.refetchQueries({queryKey:se,exact:!0,type:"active"});Tt(v,x,T&&ce?.live!==!1,{onHint:(pe)=>{if(vt(q.getQueryData(se),pe))fe()},onGap:fe});let xe=t("span",{className:"run-log-filter",children:[e("label",{htmlFor:G,children:"Stream"}),e(S,{id:G,options:Gt(),value:Z??"",onChange:(pe)=>X({[yn]:pe||null})})]});return t("section",{className:"run-logs","aria-label":`Log of run ${x}`,"data-testid":`run-logs-${x}`,children:[e("div",{className:"run-log-header",children:xe}),gn(z.error)?e(d,{title:"Run logs are not retained",description:z.error.detail??"This API keeps no run logs at all, so there is none for this run to read. That is not the same as a run that logged nothing."}):hn(z.error)?e(d,{title:"No log for this run",description:"This runner has no record of the run: either it never ran here, or it has aged out of the runs this runner keeps, and its log went with it."}):!ce?z.isError?e(D,{error:z.error,title:"Could not load the run log",onRetry:()=>void z.refetch()}):e(p,{label:"Loading the run log",showLabel:!0}):t(n,{children:[z.isError&&e(D,{error:z.error,title:"Could not refresh the run log",onRetry:()=>void z.refetch()}),e(Nr,{tail:ce,poll:le}),ce.lines.length===0?e("p",{className:"muted","data-testid":"run-logs-empty",children:Sr(ce,Z!==void 0)}):e(dn,{label:`Log lines of run ${x}`,items:ce.lines.map((pe)=>({id:pe.seq,number:pe.seq,text:pe.message,className:N("run-log-line",`run-log-line-${pe.stream}`),prefix:t(n,{children:[e("time",{className:"run-log-time",dateTime:xn(pe.at),title:xn(pe.at),children:Vt(pe.at)}),e("span",{className:"run-log-stream",children:bn(pe.stream)}),pe.level!==void 0&&e(f,{className:"run-log-level",tone:Wt(pe.level),children:pe.level})]}),suffix:pe.truncated?e(f,{className:"run-log-cut",tone:"warning",title:Cr,children:"cut at 8 KiB"}):void 0}))}),e("p",{className:"muted run-log-gap",children:Ht}),e("p",{className:"muted run-log-redaction",children:qt})]})]})}function Sr(v,x){if(x)return v.live?"Nothing on this stream yet.":"This run logged nothing on this stream.";return v.live?"Nothing logged yet.":"This run logged nothing. A 200 with no lines means the log is kept and empty, not that it is missing."}function Nr({tail:v,poll:x}){let T=[];if(v.dropped>0)T.push(`${h(v.dropped,"earlier line")} dropped: this run's log keeps its most recent lines only (1,000 lines and 1 MiB per run by default). The count is the run's own, whatever this filter shows.`);if(v.capped)T.push("A cap is trimming this log now: its oldest lines go as new ones arrive.");if(v.trimmed>0)T.push(`${h(v.trimmed,"earlier line")} left this view, which keeps the last ${o(pn)}. Reopen the log to read from the start of what is kept.`);if(v.live)T.push(Kt(x,Ye));if(T.length===0)return null;return e("div",{className:"run-log-notes","data-testid":"run-log-notes",children:T.map((_)=>e("p",{className:"muted",children:_},_))})}function Yt({run:v}){let x=tn(),[T,_]=W(),B=T.get(Ae)===v.runId;if(!x)return null;if(!Xe(v))return e("p",{className:"muted run-log-section","data-testid":`run-no-logs-${v.runId}`,children:"This run logged nothing."});return t("div",{className:"run-log-section",children:[e(s,{size:"sm","aria-expanded":B,onClick:()=>_({[Ae]:B?null:v.runId}),children:B?"Hide log":"Show log"}),B&&e(Qt,{runner:v.runnerId,runId:v.runId})]})}function Cn({status:v}){let{label:x,tone:T}=Et[v];return e(f,{tone:T,children:x})}function Fe({run:v}){let x=v.host===void 0&&v.pid===void 0?null:[v.host,v.pid===void 0?void 0:`pid ${v.pid}`].filter(Boolean).join(", ");return t("div",{className:"run-record","data-testid":`run-${v.runId}`,children:[e(F,{className:"run-summary",items:[{label:"Run id",value:t("span",{className:"run-id-line",children:[e("code",{children:v.runId}),e(ge,{text:v.runId,ariaLabel:`Copy run id ${v.runId}`})]})},{label:"Status",value:e(Cn,{status:v.status})},{label:"Attempt",value:o(v.attempt)},{label:"Source",value:je[v.source]},{label:"Execution",value:v.mode},x!==null&&{label:"Where",value:x},{label:"Started",value:e(A,{value:v.startedAt})},{label:"Finished",value:v.finishedAt===void 0?null:e(A,{value:v.finishedAt})},{label:"Duration",value:en(v)},v.exitCode!==void 0&&{label:"Exit code",value:v.exitCode===null?null:String(v.exitCode)},v.signal!==void 0&&{label:"Signal",value:v.signal},v.detached!==void 0&&{label:"Detached",value:v.detached?"Yes: it outlived its owner":"No"}]}),v.error&&e(dt,{error:v.error,label:`Error of run ${v.runId}`}),v.result!==void 0&&e(ae,{value:v.result,label:`Result of run ${v.runId}`,expandDepth:1})]})}function Lr({run:v,showLogs:x}){let[T,_]=W(),[B,q]=r(!1),Q=c(),X=x&&T.get(Ae)===v.runId,G=B||X,ee=()=>{if(G){if(q(!1),X)_({[Ae]:null});return}q(!0)},Z=v.logsDropped??0;return t(An,{children:[t("tr",{"data-testid":`history-row-${v.runId}`,children:[e("td",{children:e("button",{type:"button",className:"run-toggle","aria-expanded":G,"aria-controls":G?Q:void 0,"aria-label":`${G?"Hide":"Show"} run ${v.runId}`,onClick:ee,children:e("span",{"aria-hidden":"true",children:G?"▾":"▸"})})}),e("td",{children:e(A,{value:v.startedAt})}),e("td",{children:e(Cn,{status:v.status})}),e("td",{children:je[v.source]}),e("td",{className:"numeric",children:o(v.attempt)}),e("td",{className:"numeric",children:en(v)??"—"}),e("td",{children:e("code",{className:"run-id",children:v.runId})}),x&&t("td",{className:"run-logs-cell",children:[Xe(v)&&e(s,{size:"sm",variant:"ghost","aria-expanded":X,onClick:()=>_({[Ae]:X?null:v.runId}),children:X?"Hide log":"Log"}),Z>0&&t(f,{tone:"warning",title:`${h(Z,"line")} of this run's log went to the log's cap, oldest first.`,children:[h(Z,"line")," dropped"]})]})]}),G&&e("tr",{id:Q,className:"run-details-row",children:t("td",{colSpan:x?8:7,children:[e(Fe,{run:v}),e(Yt,{run:v})]})})]})}function Xt({runner:v,enabled:x=!0,info:T}){let _=re(),B=T!==void 0&&Ke(T,_).clearHistory,[q,Q]=r(!1),{limits:X}=m(),[G,ee]=W(),Z=c(),Re=tn(),se=It(X.maxHistory),le=Re?G.get(Ae):null,z=Ut({runner:v,maxHistory:X.maxHistory,enabled:x,openRunId:le}),ce=z.query,fe=ce.data!==void 0&&z.total===0;return t(R,{title:"History",actions:t("div",{className:"history-actions",children:[B&&e(s,{size:"sm",variant:"danger",disabled:fe,title:fe?"No runs to clear.":void 0,onClick:()=>Q(!0),children:"Clear history…"}),t("div",{className:"history-limit",children:[e("label",{htmlFor:Z,children:"Runs shown"}),e(S,{id:Z,options:se.map((xe)=>({value:String(xe)})),value:String(z.limit),onChange:(xe)=>z.onChange({offset:z.offset,limit:Number(xe)})})]})]}),children:[q&&T&&e(jn,{runner:T,onClose:()=>Q(!1)}),ce.isPending?e(p,{label:"Loading the history",showLabel:!0}):ce.isError?e(D,{error:ce.error,title:"Could not load the history",onRetry:()=>void ce.refetch()}):fe?e(d,{title:"No runs yet",description:"Runs show here, newest first, once this runner has run."}):z.rows.length===0?e(d,{title:"No runs on this page",description:"This page starts past the end of the history. Go back for the runs it holds."}):t(I,{label:"Run history",className:"history-table",children:[e("thead",{children:t("tr",{children:[e("th",{scope:"col",children:e("span",{className:"visually-hidden",children:"Details"})}),e("th",{scope:"col",children:"Started"}),e("th",{scope:"col",children:"Status"}),e("th",{scope:"col",children:"Source"}),e("th",{scope:"col",className:"numeric",children:"Attempt"}),e("th",{scope:"col",className:"numeric",children:"Duration"}),e("th",{scope:"col",children:"Run id"}),Re&&e("th",{scope:"col",children:"Log"})]})}),e("tbody",{children:z.rows.map((xe)=>e(Lr,{run:xe,showLogs:Re},xe.runId))})]}),z.openRunOffPage&&t("p",{className:"muted history-open-log-note","data-testid":"history-open-log-note",children:[`The log this link opens belongs to run ${le}, which is not on this page — it is further back in the history, or gone. `,e(s,{size:"sm",variant:"ghost",onClick:()=>ee({[Ae]:null}),children:"Close log"})]}),z.paged&&e(ne,{label:"History pages",offset:z.offset,limit:z.limit,total:z.total,itemCount:z.rows.length,pageSizes:se,maxPageSize:X.maxHistory,disabled:z.turning,onChange:z.onChange})]})}var wr=[{key:"success",label:"Success",state:"completed"},{key:"failed",label:"Failed",state:"failed"},{key:"timeout",label:"Timed out",state:"delayed"},{key:"killed",label:"Killed",state:"dead"},{key:"skipped",label:"Skipped"},{key:"queued",label:"Queued",state:"waiting"},{key:"total",label:"Total"}];function Zt({detail:v}){return e("div",{className:"screen","data-testid":"runner-hidden",children:e(d,{headingLevel:1,title:"Runner hidden",description:v??"You may not read this runner.",action:e(E,{to:"/runners",children:"Back to runners"})})})}function Tr({id:v}){return e("div",{className:"screen","data-testid":"runner-not-found",children:e(d,{headingLevel:1,title:"Runner not found",description:t(n,{children:["There is no runner ",e("code",{children:v})," in this namespace. It may have been unregistered, or its process has not started yet."]}),action:e(E,{to:"/runners",children:"Back to runners"})})})}function Dr({runner:v}){return e(F,{className:"runner-summary",items:[{label:"Namespace",value:e("code",{children:v.namespace})},{label:"Registered here",value:v.isLocal?"Yes (local)":"No (another process)",key:"isLocal"},v.file!==void 0&&{label:"File",value:e("code",{children:v.file})},{label:"Schedule",value:e("span",{"data-testid":"runner-schedule",children:At(v.schedule)})},{label:"Next run",value:v.nextRunAt===null?"Not scheduled":e(A,{value:v.nextRunAt}),hint:v.local&&v.local.nextRunAt!==null&&v.local.nextRunAt!==v.nextRunAt?t(n,{children:["This process's ticker:"," ",e(A,{value:v.local.nextRunAt})]}):void 0},{label:"Execution mode",value:v.executionMode,hint:qe(v.config,"executionMode")},{label:"Run mode",value:v.runMode,hint:qe(v.config,"runMode")},{label:"Queues triggers",value:kt(v)},{label:"Max concurrency",value:e("span",{"data-testid":"runner-concurrency",children:Ot(v.maxConcurrency)}),hint:qe(v.config,"maxConcurrency")},v.config!==void 0&&{label:"Settings override",key:"configOverride",value:e("span",{"data-testid":"runner-config-override",children:Hn(v.config)}),hint:Kn(v.config)},{label:"Queued triggers",value:o(v.queuedTriggers)},{label:"Running on",value:v.runningOn?t(n,{children:[e("code",{children:v.runningOn.runId}),v.runningOn.host!==void 0&&` on ${v.runningOn.host}`,v.runningOn.pid!==void 0&&` (pid ${v.runningOn.pid})`,", since ",e(A,{value:v.runningOn.since})]}):null},{label:"Updated",value:e(A,{value:v.updatedAt})},{label:"Last error",value:v.lastError?t("span",{className:"runner-last-error",children:[e("strong",{children:v.lastError.name}),":"," ",v.lastError.message]}):null}]})}function Er({stats:v}){return e("dl",{className:"stat-grid","aria-label":"Runs by outcome","data-testid":"runner-stats",children:wr.map(({key:x,label:T,state:_})=>t("div",{className:_?`stat stat-state state-${_}`:"stat",children:[e("dt",{className:"stat-label",children:T}),e("dd",{className:"stat-value",children:o(v[x])})]},x))})}function Ar({runner:v,stats:x,historyEnabled:T}){let _=v.local?.activeRuns??[];return t(n,{children:[t("header",{className:"runner-header",children:[t("div",{className:"runner-heading",children:[e("h1",{className:"screen-title runner-title",children:u(v.name)}),t("span",{className:"runner-badges","data-testid":"runner-status",children:[Pt(v).map((B)=>e(f,{tone:B.tone,title:B.hint,children:B.label},B.label)),!v.isLocal&&e(f,{tone:"neutral",children:"Other process"})]}),v.name!==v.id&&e("code",{className:"runner-id muted","data-testid":"runner-id",children:v.id})]}),e(lt,{runner:v})]}),!v.isLocal&&e("p",{className:"notice",role:"note","data-testid":"non-local-note",children:Mt}),e(R,{title:"Summary",children:e(Dr,{runner:v})}),e(R,{title:"Stats",children:e(Er,{stats:x})}),v.local&&e(R,{title:"Active runs",children:_.length===0?e("p",{className:"muted","data-testid":"no-active-runs",children:"Nothing is running in this process."}):e("ul",{className:"run-list","aria-label":"Active runs",children:_.map((B)=>e("li",{children:e(Fe,{run:B})},B.runId))})}),e(R,{title:"Last run",children:v.lastRun?e(Fe,{run:v.lastRun}):e("p",{className:"muted",children:"This runner has not run yet."})}),e(Xt,{runner:v.id,enabled:T,info:v})]})}function Or(){let{runner:v=""}=de(),x=i(),T=y("runners.read"),_=gt(),B=T&&_,q=bt(),Q=a({queryKey:he.detail(v),queryFn:({signal:G})=>ho(x,v,G),enabled:B,refetchInterval:(G)=>Pe(G.state.error)||_e(G.state.error)?!1:q(G.state.data)}),X=a({queryKey:he.stats(v),queryFn:({signal:G})=>yo(x,v,G),enabled:B&&Q.isSuccess,refetchInterval:(G)=>Pe(G.state.error)||_e(G.state.error)?!1:q(Q.data)});if(wt(v,B&&!_e(Q.error)&&!Pe(Q.error)),_&&!T)return e(Zt,{});if(_e(Q.error))return e(Zt,{detail:Q.error.detail});if(Pe(Q.error))return e(Tr,{id:v});return t("div",{className:"screen runner-screen","data-testid":"runner-screen",children:[e("nav",{className:"breadcrumb","aria-label":"Breadcrumb",children:t("ol",{children:[e("li",{children:e(E,{to:"/runners",children:"Runners"})}),e("li",{"aria-current":"page",children:v})]})}),Q.data?t(n,{children:[Q.isError&&e(D,{error:Q.error,title:"Could not refresh this runner",onRetry:()=>void Q.refetch()}),e(Ar,{runner:Q.data,stats:X.data??Q.data.stats,historyEnabled:B})]}):Q.isError?e(L,{headingLevel:1,error:Q.error,title:"Could not load the runner",onRetry:()=>void Q.refetch()}):e(p,{label:"Loading the runner",showLabel:!0})]})}var Jt=25;function kr({item:v}){let x=v.status?Je[v.status]:null;return t("tr",{"data-testid":`runner-row-${v.id}`,children:[t("td",{children:[e(E,{to:mt(v.id),className:"runner-link",children:v.isLocal&&v.name&&v.name!==v.id?v.name:v.id}),v.isLocal&&v.name&&v.name!==v.id&&e("code",{className:"runner-id muted",children:v.id})]}),e("td",{className:"runners-where",children:v.isLocal?e(f,{tone:"accent",children:"Local"}):e(f,{tone:"neutral",title:"Registered by another process: its name shows on its own screen.",children:"Other process"})}),t("td",{className:"runners-status",children:[x?e(f,{tone:x.tone,title:x.hint,children:x.label}):v.isPaused?e(f,{tone:"warning",title:"Paused through the shared state: its owner skips scheduled runs.",children:"Paused"}):e(f,{tone:"neutral",title:"Not paused. Its lifecycle status shows only in its own process.",children:"Active"})," ",v.isRunning&&e(f,{tone:"accent",title:"A run holds this runner's lock right now, in whichever process.",children:"Run in flight"})]})]})}function Pr(){let v=i(),x=y("runners.list"),[T,_]=W(),B=c(),q=T.get("search")??"",Q=Me(q),X=xt();Lt(x);let G=a({queryKey:he.list(),queryFn:({signal:z})=>cn(v,z),refetchInterval:X,enabled:x});if(!x)return t("div",{className:"screen",children:[e("h1",{className:"screen-title",children:"Runners"}),e(d,{title:"Nothing to show",description:"You may not list runners on this API."})]});let ee=G.data?_t(G.data.items):[],Z=Ft(ee,Q),Re=ee.filter((z)=>z.isLocal).length,se=Kr(Z.length,{offset:me(T,"offset",0),limit:me(T,"limit",Jt)}),le=Z.slice(se.offset,se.offset+se.limit);return t("div",{className:"screen","data-testid":"runners-list",children:[e("h1",{className:"screen-title",children:"Runners"}),e(R,{title:"Runners",actions:t("div",{className:"search",children:[e("label",{htmlFor:B,className:"visually-hidden",children:"Filter runners by id or name"}),e("input",{id:B,type:"search",className:"input",placeholder:"Filter runners",...ve,value:q,maxLength:200,onChange:(z)=>_({search:z.target.value,offset:null})})]}),children:G.isPending?e(p,{label:"Loading runners",showLabel:!0}):G.isError?e(L,{error:G.error,title:"Could not load runners",onRetry:()=>void G.refetch()}):ee.length===0?e(d,{title:"No runners yet",description:"Runners appear here once a process registers one in this namespace."}):Z.length===0?e(d,{title:"No runners match",description:`No runner id or name contains “${Q.trim()}”.`}):t(n,{children:[t(I,{label:"Runners",children:[e("thead",{children:t("tr",{children:[e("th",{scope:"col",children:"Runner"}),e("th",{scope:"col",className:"runners-where",children:"Where"}),e("th",{scope:"col",className:"runners-status",children:"Status"})]})}),e("tbody",{children:le.map((z)=>e(kr,{item:z},z.id))})]}),se.paged&&e(ne,{label:"Runner pages",offset:se.offset,limit:se.limit,total:Z.length,itemCount:le.length,onChange:(z)=>_({offset:z.offset>0?String(z.offset):null,limit:z.limit===Jt?null:String(z.limit)})}),t("p",{className:"muted runners-count","data-testid":"runners-count",children:[h(Re,"local runner"),","," ",h(ee.length-Re,"runner")," in other processes",Z.length<ee.length&&` (${Z.length} shown)`]})]})})]})}export{Or as RunnerScreen,Pr as RunnersListScreen};
|
|
2
|
+
|
|
3
|
+
//# debugId=A4F2192C724764E064756E2164756E21
|
|
4
|
+
//# sourceMappingURL=index-q24jw3w9.js.map
|
|
@@ -27,6 +27,6 @@
|
|
|
27
27
|
"import type { RunnerListItemDto } from \"../../api/types\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useDeferredValue, useId } from \"react\";\nimport { listRunners, runnerKeys, runnerPath } from \"../../api/runners\";\nimport { Badge } from \"../../components/Badge\";\nimport { Card } from \"../../components/Card\";\nimport { EmptyState } from \"../../components/EmptyState\";\nimport { ErrorView } from \"../../components/ErrorView\";\nimport { Pager } from \"../../components/Pager\";\nimport { Spinner } from \"../../components/Spinner\";\nimport { Table } from \"../../components/Table\";\nimport { clientWindow } from \"../../components/useClientPage\";\nimport { useApiClient } from \"../../context\";\nimport { plural } from \"../../format\";\nimport { SEARCH_SHORTCUT } from \"../../layout/shortcuts\";\nimport { useCan } from \"../../meta/hooks\";\nimport { Link } from \"../../router\";\nimport { intParam, useUrlParams } from \"../queues/urlState\";\nimport { useListRefetchInterval, useRunnerListLive } from \"./live\";\nimport { filterRunners, orderRunners, RUNNER_STATUS } from \"./runnerFormat\";\nimport \"./runners.css\";\n\n/**\n * Runners per page.\n *\n * Twenty-five: a runner row is three short cells, so a page holds more than a\n * queue's, and a namespace registering one runner per report or sweep reaches\n * a few dozen. The window lives in the URL, like `/queues`, since the whole\n * screen is this one list and a link should reproduce the page being read.\n */\nconst RUNNER_PAGE_SIZE = 25;\n\n/**\n * One row: a local runner with its name and lifecycle status, or the id of one\n * registered in another process, with its shared paused flag; either one's\n * run in flight is marked.\n */\nfunction RunnerRow({ item }: { item: RunnerListItemDto }) {\n const status = item.status ? RUNNER_STATUS[item.status] : null;\n return (\n <tr data-testid={`runner-row-${item.id}`}>\n <td>\n <Link\n to={runnerPath(item.id)}\n className=\"runner-link\"\n >\n {item.isLocal && item.name && item.name !== item.id\n ? item.name\n : item.id}\n </Link>\n {item.isLocal && item.name && item.name !== item.id && (\n <code className=\"runner-id muted\">{item.id}</code>\n )}\n </td>\n <td className=\"runners-where\">\n {item.isLocal ? (\n <Badge tone=\"accent\">Local</Badge>\n ) : (\n <Badge\n tone=\"neutral\"\n title=\"Registered by another process: its name shows on its own screen.\"\n >\n Other process\n </Badge>\n )}\n </td>\n <td className=\"runners-status\">\n {status ? (\n <Badge\n tone={status.tone}\n title={status.hint}\n >\n {status.label}\n </Badge>\n ) : item.isPaused ? (\n <Badge\n tone=\"warning\"\n title=\"Paused through the shared state: its owner skips scheduled runs.\"\n >\n Paused\n </Badge>\n ) : (\n <Badge\n tone=\"neutral\"\n title=\"Not paused. Its lifecycle status shows only in its own process.\"\n >\n Active\n </Badge>\n )}{\" \"}\n {item.isRunning && (\n <Badge\n tone=\"accent\"\n title=\"A run holds this runner's lock right now, in whichever process.\"\n >\n Run in flight\n </Badge>\n )}\n </td>\n </tr>\n );\n}\n\n/** `/runners`: every runner in the namespace, local first; filtered in the browser. */\nexport function RunnersListScreen() {\n const api = useApiClient();\n const canList = useCan(\"runners.list\");\n const [params, update] = useUrlParams();\n const filterId = useId();\n const filter = params.get(\"search\") ?? \"\";\n const deferredFilter = useDeferredValue(filter);\n\n const refetchInterval = useListRefetchInterval();\n useRunnerListLive(canList);\n const runners = useQuery({\n queryKey: runnerKeys.list(),\n queryFn: ({ signal }) => listRunners(api, signal),\n refetchInterval,\n enabled: canList,\n });\n\n if (!canList) {\n return (\n <div className=\"screen\">\n <h1 className=\"screen-title\">Runners</h1>\n <EmptyState\n title=\"Nothing to show\"\n description=\"You may not list runners on this API.\"\n />\n </div>\n );\n }\n\n const all = runners.data ? orderRunners(runners.data.items) : [];\n const shown = filterRunners(all, deferredFilter);\n const localCount = all.filter((item) => item.isLocal).length;\n // The list is read whole and filtered in the browser, so the page is cut\n // here too; the window is in the URL, as on `/queues`.\n const page = clientWindow(shown.length, {\n offset: intParam(params, \"offset\", 0),\n limit: intParam(params, \"limit\", RUNNER_PAGE_SIZE),\n });\n const rows = shown.slice(page.offset, page.offset + page.limit);\n\n return (\n <div\n className=\"screen\"\n data-testid=\"runners-list\"\n >\n <h1 className=\"screen-title\">Runners</h1>\n <Card\n title=\"Runners\"\n actions={\n <div className=\"search\">\n <label\n htmlFor={filterId}\n className=\"visually-hidden\"\n >\n Filter runners by id or name\n </label>\n <input\n id={filterId}\n type=\"search\"\n className=\"input\"\n placeholder=\"Filter runners\"\n {...SEARCH_SHORTCUT}\n value={filter}\n maxLength={200}\n onChange={(event) =>\n update({ search: event.target.value, offset: null })\n }\n />\n </div>\n }\n >\n {runners.isPending ? (\n <Spinner\n label=\"Loading runners\"\n showLabel\n />\n ) : runners.isError ? (\n <ErrorView\n error={runners.error}\n title=\"Could not load runners\"\n onRetry={() => void runners.refetch()}\n />\n ) : all.length === 0 ? (\n <EmptyState\n title=\"No runners yet\"\n description=\"Runners appear here once a process registers one in this namespace.\"\n />\n ) : shown.length === 0 ? (\n <EmptyState\n title=\"No runners match\"\n description={`No runner id or name contains “${deferredFilter.trim()}”.`}\n />\n ) : (\n <>\n <Table label=\"Runners\">\n <thead>\n <tr>\n <th scope=\"col\">Runner</th>\n <th\n scope=\"col\"\n className=\"runners-where\"\n >\n Where\n </th>\n <th\n scope=\"col\"\n className=\"runners-status\"\n >\n Status\n </th>\n </tr>\n </thead>\n <tbody>\n {rows.map((item) => (\n <RunnerRow\n key={item.id}\n item={item}\n />\n ))}\n </tbody>\n </Table>\n {page.paged && (\n <Pager\n label=\"Runner pages\"\n offset={page.offset}\n limit={page.limit}\n total={shown.length}\n itemCount={rows.length}\n onChange={(next) =>\n update({\n offset: next.offset > 0 ? String(next.offset) : null,\n limit:\n next.limit === RUNNER_PAGE_SIZE\n ? null\n : String(next.limit),\n })\n }\n />\n )}\n <p\n className=\"muted runners-count\"\n data-testid=\"runners-count\"\n >\n {plural(localCount, \"local runner\")},{\" \"}\n {plural(all.length - localCount, \"runner\")} in other processes\n {shown.length < all.length && ` (${shown.length} shown)`}\n </p>\n </>\n )}\n </Card>\n </div>\n );\n}\n"
|
|
28
28
|
],
|
|
29
29
|
"mappings": "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",
|
|
30
|
-
"debugId": "
|
|
30
|
+
"debugId": "A4F2192C724764E064756E2164756E21",
|
|
31
31
|
"names": []
|
|
32
32
|
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{r,n,e,t,f,i,y,a,Q,s,H,d,p,R,L,u}from"./main-a250ffk7.js";import{Kt,bn,es,Nn}from"./main-n9cf6bxm.js";import{ae}from"./main-d6ge7w08.js";import{re}from"./main-jkvd92z9.js";import{D}from"./main-hm1ng3yg.js";import"./main-5grjvsy7.js";import{pt}from"./main-9prgjhg4.js";import{F}from"./main-pegp0ygb.js";var P=Q*2;function b(){let o=i(),v=y("providers.read"),h=re()("providers.validate"),l=H(P),m=a({queryKey:Kt.list,queryFn:({signal:g})=>bn(o,g),refetchInterval:l,enabled:v});return t("div",{className:"screen","data-testid":"providers-screen",children:[e("h1",{className:"screen-title",children:"Providers"}),!v?e(d,{title:"Nothing to show",description:"You may not read providers on this API."}):m.isPending?e(p,{label:"Loading providers",showLabel:!0}):m.isError?e(L,{error:m.error,title:"Could not load providers",onRetry:()=>void m.refetch()}):m.data.providers.length===0?e(d,{title:"No providers configured",description:"Compute providers appear here once the API's process configures one, e.g. for a queue's summoning."}):t(n,{children:[t("p",{className:"muted","data-testid":"providers-api",children:["Provider API ",u(m.data.api.core),", summon facet"," ",u(m.data.api.summon),". Ids are stable for this process's life only."]}),e("div",{className:"providers-list",children:m.data.providers.map((g)=>e(C,{provider:g,canValidate:h},g.id))})]})]})}function C({provider:o,canValidate:v}){let c=pt(o.readiness),h=u(o.provider.displayName??o.provider.kind),l=Object.entries(o.facts);return e(R,{title:h,children:t("div",{"data-testid":`provider-${o.id}`,children:[e(F,{items:[{key:"readiness",label:"Readiness",value:e(f,{tone:c.tone,title:c.hint,testId:"provider-readiness",children:c.label}),hint:c.hint},{key:"id",label:"Id",value:e("code",{children:u(o.id)})},{key:"package",label:"Package",value:t("span",{children:[e("code",{children:u(o.provider.name)})," ",u(o.provider.version)]})},...l.map(([m,g])=>({key:`fact-${m}`,label:u(m),value:e("code",{children:u(g)})}))]}),v&&o.preflight&&e(Nn,{providerId:o.id,label:h}),o.configSchema&&e(I,{providerId:o.id})]})})}function I({providerId:o}){let v=i(),[c,h]=r(!1),l=a({queryKey:Kt.schema(o),queryFn:({signal:m})=>es(v,o,m),enabled:c,staleTime:Number.POSITIVE_INFINITY});return t("div",{className:"provider-schema",children:[e(s,{size:"sm",variant:"ghost","aria-expanded":c,onClick:()=>h((m)=>!m),children:c?"Hide config schema":"Config schema"}),c&&(l.isPending?e(p,{label:"Loading the config schema"}):l.isError?e(D,{error:l.error,title:"Could not load the config schema"}):e("div",{"data-testid":"provider-schema",children:e(ae,{value:l.data.schema,label:`Config schema of ${o}`,expandDepth:4})}))]})}export{b as ProvidersScreen};
|
|
2
|
+
|
|
3
|
+
//# debugId=BD60E8DFB128DEA264756E2164756E21
|
|
4
|
+
//# sourceMappingURL=index-rtynx6wj.js.map
|
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
"import type { ProviderDto } from \"../../api/types\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useState } from \"react\";\nimport {\n getProviderSchema,\n listProviders,\n providerKeys,\n} from \"../../api/providers\";\nimport { Badge } from \"../../components/Badge\";\nimport { Button } from \"../../components/Button\";\nimport { Card } from \"../../components/Card\";\nimport { EmptyState } from \"../../components/EmptyState\";\nimport { ErrorView } from \"../../components/ErrorView\";\nimport { JsonView } from \"../../components/JsonView\";\nimport { KeyValue } from \"../../components/KeyValue\";\nimport { ProblemBanner } from \"../../components/ProblemBanner\";\nimport { Spinner } from \"../../components/Spinner\";\nimport { useApiClient } from \"../../context\";\nimport { displayText } from \"../../format\";\nimport { usePollInterval } from \"../../live\";\nimport { useCan } from \"../../meta/hooks\";\nimport { POLL_INTERVAL_MS } from \"../../queryClient\";\nimport { useCanMutate } from \"../queues/gating\";\nimport { providerReadiness } from \"./providerText\";\nimport { TestConnection } from \"./TestConnection\";\nimport \"./providers.css\";\n\n/** How often the list is re-read: a provider's readiness changes as its config validates. */\nconst REFRESH_MS = POLL_INTERVAL_MS * 2;\n\n/**\n * `/providers`: the compute providers configured in the API's process\n * (`GET /providers`), each with its readiness, its secret-free facts, \"Test\n * connection\" where it has a preflight, and its config schema where it\n * publishes one.\n *\n * Routed only where the caller may read providers (`providers.read`, opt-in)\n * and the API serves them (`features.providers`, off in `runner` mode); the\n * nav entry follows the same rule.\n */\nexport function ProvidersScreen() {\n const api = useApiClient();\n const canRead = useCan(\"providers.read\");\n const canMutate = useCanMutate();\n const canValidate = canMutate(\"providers.validate\");\n const refetchInterval = usePollInterval(REFRESH_MS);\n const list = useQuery({\n queryKey: providerKeys.list,\n queryFn: ({ signal }) => listProviders(api, signal),\n refetchInterval,\n enabled: canRead,\n });\n return (\n <div\n className=\"screen\"\n data-testid=\"providers-screen\"\n >\n <h1 className=\"screen-title\">Providers</h1>\n {!canRead ? (\n <EmptyState\n title=\"Nothing to show\"\n description=\"You may not read providers on this API.\"\n />\n ) : list.isPending ? (\n <Spinner\n label=\"Loading providers\"\n showLabel\n />\n ) : list.isError ? (\n <ErrorView\n error={list.error}\n title=\"Could not load providers\"\n onRetry={() => void list.refetch()}\n />\n ) : list.data.providers.length === 0 ? (\n <EmptyState\n title=\"No providers configured\"\n description=\"Compute providers appear here once the API's process configures one, e.g. for a queue's summoning.\"\n />\n ) : (\n <>\n <p\n className=\"muted\"\n data-testid=\"providers-api\"\n >\n Provider API {displayText(list.data.api.core)}, summon facet{\" \"}\n {displayText(list.data.api.summon)}. Ids are stable for this\n process's life only.\n </p>\n <div className=\"providers-list\">\n {list.data.providers.map((provider) => (\n <ProviderCard\n key={provider.id}\n provider={provider}\n canValidate={canValidate}\n />\n ))}\n </div>\n </>\n )}\n </div>\n );\n}\n\n/** Props of {@link ProviderCard}. */\ninterface ProviderCardProps {\n /** The provider. */\n provider: ProviderDto;\n /** Whether the caller may run \"Test connection\" (`providers.validate`, not read-only). */\n canValidate: boolean;\n}\n\n/** One provider: who it is, its readiness and facts, and what can be done with it. */\nfunction ProviderCard({ provider, canValidate }: ProviderCardProps) {\n const readiness = providerReadiness(provider.readiness);\n const name = displayText(\n provider.provider.displayName ?? provider.provider.kind,\n );\n const facts = Object.entries(provider.facts);\n return (\n <Card title={name}>\n <div data-testid={`provider-${provider.id}`}>\n <KeyValue\n items={[\n {\n key: \"readiness\",\n label: \"Readiness\",\n value: (\n <Badge\n tone={readiness.tone}\n title={readiness.hint}\n testId=\"provider-readiness\"\n >\n {readiness.label}\n </Badge>\n ),\n hint: readiness.hint,\n },\n {\n key: \"id\",\n label: \"Id\",\n value: <code>{displayText(provider.id)}</code>,\n },\n {\n key: \"package\",\n label: \"Package\",\n value: (\n <span>\n <code>{displayText(provider.provider.name)}</code>{\" \"}\n {displayText(provider.provider.version)}\n </span>\n ),\n },\n ...facts.map(([key, value]) => ({\n key: `fact-${key}`,\n label: displayText(key),\n value: <code>{displayText(value)}</code>,\n })),\n ]}\n />\n {canValidate && provider.preflight && (\n <TestConnection\n providerId={provider.id}\n label={name}\n />\n )}\n {provider.configSchema && <ConfigSchema providerId={provider.id} />}\n </div>\n </Card>\n );\n}\n\n/**\n * A provider's config schema, read only when asked for: secret-free JSON\n * Schema, shown as it is (there is no route that sets a provider's config).\n */\nfunction ConfigSchema({ providerId }: { providerId: string }) {\n const api = useApiClient();\n const [open, setOpen] = useState(false);\n const schema = useQuery({\n queryKey: providerKeys.schema(providerId),\n queryFn: ({ signal }) => getProviderSchema(api, providerId, signal),\n enabled: open,\n staleTime: Number.POSITIVE_INFINITY,\n });\n return (\n <div className=\"provider-schema\">\n <Button\n size=\"sm\"\n variant=\"ghost\"\n aria-expanded={open}\n onClick={() => setOpen((was) => !was)}\n >\n {open ? \"Hide config schema\" : \"Config schema\"}\n </Button>\n {open &&\n (schema.isPending ? (\n <Spinner label=\"Loading the config schema\" />\n ) : schema.isError ? (\n <ProblemBanner\n error={schema.error}\n title=\"Could not load the config schema\"\n />\n ) : (\n <div data-testid=\"provider-schema\">\n <JsonView\n value={schema.data.schema}\n label={`Config schema of ${providerId}`}\n // Opened to read it: show properties and their constraints.\n expandDepth={4}\n />\n </div>\n ))}\n </div>\n );\n}\n"
|
|
6
6
|
],
|
|
7
7
|
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
8
|
+
"debugId": "BD60E8DFB128DEA264756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{G}from"./main-a250ffk7.js";var x={path:"/__live",replies:{subscribe:"hello",resume:"hello"}},X="GET /__live/sse";var K=Symbol.for("@kingsleyweb/bun-client");function E(g){let c=[];for(let d=0;d<g.length;d+=256)c.push(g.slice(d,d+256));return c}function C(g){let c=g;return typeof c?.epoch==="string"&&typeof c.seq==="number"&&Number.isSafeInteger(c.seq)?{epoch:c.epoch,seq:c.seq}:void 0}function j(g,c,d,A){let v=g[K]?.logger??console,m=new Map,f=new Map,y=new Set,w=new Set,S=!1,p=!1,l,_=new WeakMap,b,q=new Set,T=(e)=>{if(!Array.isArray(e))return;let n=e.filter((o)=>typeof o==="string");if(n.length===0||p)return;if(d.onDenied){d.onDenied(n);return}let t=n.filter((o)=>!q.has(o));for(let o of t)q.add(o);if(t.length>0)v.warn(`live(): the server refused the tags ${t.join(", ")}; their queries are not kept fresh`)},L=()=>{c.invalidateQueries()},D=(e,n)=>{if(l!==void 0&&l.epoch!==e.epoch){l=e,L();return}l=n||l===void 0?e:{epoch:e.epoch,seq:Math.max(l.seq,e.seq)}},h={hello(e){let n=C(e);if(n!==void 0)D(n,!1);T(e?.denied)},gap(e){let n=C(e);if(n===void 0)return;l=n,L()},invalidate(e){let n=C(e),t=e?.tags;if(n===void 0||!Array.isArray(t))return;let o=l!==void 0&&l.epoch!==n.epoch;if(D(n,!1),o)return;let i=`${n.epoch}:${n.seq}`,a=new Set(t.filter((r)=>typeof r==="string")),s=c.getQueryCache().findAll({predicate:(r)=>_.get(r)!==i&&A(c,r).some((k)=>a.has(k))});if(s.length===0)return;for(let r of s)_.set(r,i);let u=new Set(s);c.invalidateQueries({predicate:(r)=>u.has(r)})}},N=()=>{if(S)return;S=!0,queueMicrotask(()=>{if(S=!1,p||y.size===0&&w.size===0)return;let e=[...y],n=[...w];y.clear(),w.clear(),b?.changed(e,n)})},P=(e)=>{let n=(f.get(e)??0)+1;if(f.set(e,n),n===1&&!w.delete(e))y.add(e)},O=(e)=>{let n=(f.get(e)??0)-1;if(n>0){f.set(e,n);return}if(f.delete(e),!y.delete(e))w.add(e)},I=(e,n=!1)=>{let t=e.queryHash,o=m.get(t),i=!n&&e.getObserversCount()>0?new Set(A(c,e)):new Set;if(o===void 0&&i.size===0)return;for(let a of i)if(!o?.has(a))P(a);for(let a of o??[])if(!i.has(a))O(a);if(i.size===0)m.delete(t);else m.set(t,i);N()},M=c.getQueryCache();for(let e of M.getAll())I(e);let z=M.subscribe((e)=>{if(e.type==="observerResultsUpdated")return;I(e.query,e.type==="removed")}),Q=async()=>{let{sse:e}=await (G("mn0t0fh7"),import("./sse-mn0t0fh7.js")),n,t=()=>{let o=n;if(n=void 0,o?.close(),p||f.size===0)return;let i=o?.lastEventId||(l===void 0?void 0:`${l.epoch}:${l.seq}`),a=e(g,"GET /__live/sse",{query:{tag:[...f.keys()]},...i?{lastEventId:i}:{}});n=a,a.on("invalidate",(s)=>h.invalidate(s)),a.on("gap",(s)=>h.gap(s)),a.on("hello",(s)=>h.hello(s)),a.closed.catch((s)=>{if(n!==a)return;let u=s,r=u.error;if(u.status===403&&r?.code==="LIVE_TAGS_DENIED"){T(r.denied);return}v.error("live(): the live stream ended",s)})};return t(),{changed(o,i){if(o.length>0||i.length>0&&f.size===0)t()},close:()=>{let o=n;n=void 0,o?.close()}}},R=async()=>{let{channel:e}=await (G("tgkvqm8y"),import("./channel-tgkvqm8y.js")),n=!1,t=e(g,x,{async resubscribe(s){let u=l;for(let r of E([...f.keys()]))h.hello(await s.request("subscribe",{tags:r}));if(u!==void 0&&l?.epoch===u.epoch)h.hello(await s.request("resume",u))}});t.on("invalidate",(s)=>h.invalidate(s)),t.on("gap",(s)=>h.gap(s)),t.on("hello",(s)=>h.hello(s));let o={changed(s,u){if(t.state!=="open")return;if(u.length>0)for(let r of E(u))t.send("unsubscribe",{tags:r});for(let r of E(s))t.request("subscribe",{tags:r}).then((k)=>h.hello(k),(k)=>v.warn("live(): a subscribe failed",k))},close:()=>t.close()},i=setTimeout(()=>{if(n||p||b!==o)return;t.close(),v.warn("live(): the live channel did not open within 3000 ms; using its SSE fallback"),Q().then((s)=>{if(p)s.close();else b=s})},3000);t.on("$state",(s)=>{if(s!=="open")return;n=!0,clearTimeout(i)});let a=o.close;return o.close=()=>{clearTimeout(i),a()},o};return(d.transport==="sse"||d.transport===void 0&&typeof globalThis.WebSocket!=="function"?Q():R()).then((e)=>{if(p)e.close();else b??=e},(e)=>v.error("live(): could not start",e)),()=>{if(p)return;p=!0,z(),b?.close()}}export{x as LIVE_CHANNEL,X as LIVE_SSE_KEY,j as startLive};
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
4
|
-
//# sourceMappingURL=live-
|
|
3
|
+
//# debugId=619DEAB63211C7CA64756E2164756E21
|
|
4
|
+
//# sourceMappingURL=live-6k7s6358.js.map
|
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
"/**\n * The live layer's implementation (typed-client plan `websocket.md` §9, TC\n * D15, PR-W4), loaded by `./query`'s `live()` with `import()` on its first\n * call, so a query-only bundle carries none of it. It in turn loads\n * `./channel` (or `./sse`) the same way.\n *\n * - **Tags**: every query with an observer is held under its tags\n * (`tagsOfQuery`: the route's declared ones and its responses'\n * `Cache-Tag`/`Surrogate-Key`), refcounted, so a tag is subscribed once\n * whatever the number of queries under it, and dropped with its last\n * query; the changes of one task go out together.\n * - **Invalidation**: an `invalidate` frame invalidates the queries holding\n * its tags (query-core refetches the active ones). One invalidation may\n * arrive as several frames with the same `seq` (one per tag on the\n * server's pub/sub), so a query is invalidated once per `seq`.\n * - **Resume**: the client keeps the server's cursor (`{ epoch, seq }`, from\n * every `hello` and `invalidate`); after a reconnect it sends `subscribe`\n * with every tag it holds, then `resume` with the cursor it had, and the\n * server replays what it missed. A `gap`, or a `hello` or `invalidate` of another\n * epoch (a restarted server), invalidates every query.\n * - **Denials**: a `hello` may list tags the server refused (`denied`,\n * per-tag authorization), and the SSE fallback answers `403`\n * problem+json (`LIVE_TAGS_DENIED`, `denied`) when it refuses every tag:\n * either is reported to `onDenied`, else logged once per tag as a\n * warning. The `403` ends the stream (no reconnect); the tags stay held,\n * so a later subscription (a new tag, a reconnect, another login) asks\n * for them again.\n * - **Transports**: bun-common's live channel (`./channel`, at `/__live`\n * under the client's `baseUrl`), or its SSE fallback (`./sse`, at\n * `/__live/sse`, the tags in the query, the cursor as `Last-Event-ID`):\n * SSE when asked, when the platform has no `WebSocket`, or when the\n * socket has not opened 3 s after the start (a proxy that refuses\n * upgrades).\n */\nimport type { Query, QueryClient } from \"@tanstack/query-core\";\nimport type { ChannelClient, ChannelDescriptor } from \"./channel\";\nimport type { EventStream } from \"./sse\";\n\n/** A position in the server's invalidations. */\ninterface Cursor {\n /** The server process's epoch. */\n epoch: string;\n /** The last invalidation's number in it. */\n seq: number;\n}\n\n/** The live channel's types, as bun-common's `liveContract` declares them (§9). */\ninterface LiveEntry {\n /** The client sends. */\n receives: {\n /** Tags to add. */\n subscribe: { tags: string[] };\n /** Tags to drop. */\n unsubscribe: { tags: string[] };\n /** The cursor kept, after a reconnect. */\n resume: Cursor;\n };\n /** The server sends. */\n sends: {\n /** Tags one invalidation hit. */\n invalidate: Cursor & { tags: string[] };\n /** The server cannot replay what was missed. */\n gap: Cursor;\n /** Where the server is; `denied` lists the tags it refused, if any. */\n hello: Cursor & { denied?: string[] };\n };\n /** The replied types. */\n replies: { subscribe: \"hello\"; resume: \"hello\" };\n}\n\n/** The live channel, as a descriptor (bun-common's `liveContract`, which this package cannot import). */\nexport const LIVE_CHANNEL: ChannelDescriptor<LiveEntry> = {\n path: \"/__live\",\n replies: { subscribe: \"hello\", resume: \"hello\" },\n};\n\n/** The SSE fallback's route key. */\nexport const LIVE_SSE_KEY = \"GET /__live/sse\";\n\n/** How long the channel may take to open before the SSE fallback replaces it, ms. */\nconst OPEN_DEADLINE_MS = 3_000;\n\n/** The most tags one `subscribe` carries (the server's limit). */\nconst MAX_TAGS = 256;\n\n/** The symbol the client keeps its configuration under (`client.ts`). */\nconst CONFIG = Symbol.for(\"@kingsleyweb/bun-client\");\n\n/** What `live()` takes of the client. */\nexport interface LiveApi {\n /** Builds a URL (the channel's). */\n readonly url: (...args: never[]) => string;\n /** Calls a route (the SSE fallback's). */\n readonly request: (...args: never[]) => Promise<unknown>;\n}\n\n/** `live()`'s options, as `./query` declares them. */\nexport interface StartOptions {\n /** `\"websocket\"` or `\"sse\"`; `undefined` picks. */\n readonly transport?: \"websocket\" | \"sse\";\n /** Called with the tags a `hello` says were refused; `undefined` logs them. */\n readonly onDenied?: (tags: string[]) => void;\n}\n\n/** A transport: what the layer tells the server. */\ninterface Transport {\n /** The held tags changed. */\n readonly changed: (\n added: readonly string[],\n removed: readonly string[],\n ) => void;\n /** Stops it. */\n readonly close: () => void;\n}\n\n/** `tags` in frames of at most {@link MAX_TAGS}. */\nfunction chunked(tags: readonly string[]): string[][] {\n const out: string[][] = [];\n for (let at = 0; at < tags.length; at += MAX_TAGS)\n out.push(tags.slice(at, at + MAX_TAGS));\n return out;\n}\n\n/** `value` as a cursor, if it is one. */\nfunction asCursor(value: unknown): Cursor | undefined {\n const v = value as Partial<Cursor> | null | undefined;\n return typeof v?.epoch === \"string\" &&\n typeof v.seq === \"number\" &&\n Number.isSafeInteger(v.seq)\n ? { epoch: v.epoch, seq: v.seq }\n : undefined;\n}\n\n/**\n * Starts the live layer over `client`'s cache; answers the function that\n * stops it.\n *\n * @param api The client: its `baseUrl` and configuration.\n * @param client The `QueryClient` whose queries are kept fresh.\n * @param options The transport.\n * @param tagsOf `./query`'s `tagsOfQuery`.\n */\nexport function startLive(\n api: LiveApi,\n client: QueryClient,\n options: StartOptions,\n tagsOf: (client: QueryClient, query: Query) => string[],\n): () => void {\n const config = (api as unknown as Record<symbol, unknown>)[CONFIG] as\n { logger?: Pick<Console, \"warn\" | \"error\"> } | undefined;\n const logger = config?.logger ?? console;\n /** Each observed query's held tags, by hash. */\n const holders = new Map<string, ReadonlySet<string>>();\n /** Each held tag's number of queries. */\n const refs = new Map<string, number>();\n const added = new Set<string>();\n const removed = new Set<string>();\n let flushing = false;\n let stopped = false;\n let cursor: Cursor | undefined;\n /** The invalidation (`epoch:seq`) each query last took. */\n const taken = new WeakMap<Query, string>();\n let transport: Transport | undefined;\n /** Denied tags already logged (without an `onDenied`). */\n const logged = new Set<string>();\n\n /** Reports refused tags (`denied`): to `onDenied`, else a warning once per tag. */\n const refused = (denied: unknown): void => {\n if (!Array.isArray(denied)) return;\n const tags = denied.filter((tag): tag is string => typeof tag === \"string\");\n if (tags.length === 0 || stopped) return;\n if (options.onDenied) {\n options.onDenied(tags);\n return;\n }\n const fresh = tags.filter((tag) => !logged.has(tag));\n for (const tag of fresh) logged.add(tag);\n if (fresh.length > 0)\n logger.warn(\n `live(): the server refused the tags ${fresh.join(\", \")}; their queries are not kept fresh`,\n );\n };\n\n /** Every query invalid; the active ones refetch. */\n const invalidateAll = (): void => {\n void client.invalidateQueries();\n };\n\n /** Takes a cursor the server sent: another epoch than the one kept invalidates everything. */\n const moveTo = (next: Cursor, replace: boolean): void => {\n if (cursor !== undefined && cursor.epoch !== next.epoch) {\n cursor = next;\n invalidateAll();\n return;\n }\n cursor =\n replace || cursor === undefined\n ? next\n : { epoch: next.epoch, seq: Math.max(cursor.seq, next.seq) };\n };\n\n const handlers = {\n hello(data: unknown): void {\n const next = asCursor(data);\n if (next !== undefined) moveTo(next, false);\n refused((data as { denied?: unknown } | null)?.denied);\n },\n gap(data: unknown): void {\n const next = asCursor(data);\n if (next === undefined) return;\n cursor = next;\n invalidateAll();\n },\n invalidate(data: unknown): void {\n const next = asCursor(data);\n const tags = (data as { tags?: unknown } | null)?.tags;\n if (next === undefined || !Array.isArray(tags)) return;\n const epochMoved = cursor !== undefined && cursor.epoch !== next.epoch;\n moveTo(next, false);\n if (epochMoved) return;\n const key = `${next.epoch}:${next.seq}`;\n const wanted = new Set(tags.filter((tag) => typeof tag === \"string\"));\n // Chosen first, then invalidated: `invalidateQueries` runs its\n // predicate twice (to mark, then to refetch).\n const hits = client.getQueryCache().findAll({\n predicate: (query) =>\n taken.get(query) !== key &&\n tagsOf(client, query).some((tag) => wanted.has(tag)),\n });\n if (hits.length === 0) return;\n for (const query of hits) taken.set(query, key);\n const set = new Set(hits);\n void client.invalidateQueries({ predicate: (query) => set.has(query) });\n },\n };\n\n /** Sends the changes of this task, once it ends. */\n const schedule = (): void => {\n if (flushing) return;\n flushing = true;\n queueMicrotask(() => {\n flushing = false;\n if (stopped || (added.size === 0 && removed.size === 0)) return;\n const plus = [...added];\n const minus = [...removed];\n added.clear();\n removed.clear();\n transport?.changed(plus, minus);\n });\n };\n\n const hold = (tag: string): void => {\n const count = (refs.get(tag) ?? 0) + 1;\n refs.set(tag, count);\n if (count === 1 && !removed.delete(tag)) added.add(tag);\n };\n const release = (tag: string): void => {\n const count = (refs.get(tag) ?? 0) - 1;\n if (count > 0) {\n refs.set(tag, count);\n return;\n }\n refs.delete(tag);\n if (!added.delete(tag)) removed.add(tag);\n };\n\n /** Brings `query`'s held tags up to date: its tags while it has an observer, none otherwise. */\n const sync = (query: Query, gone = false): void => {\n const hash = query.queryHash;\n const before = holders.get(hash);\n const now: ReadonlySet<string> =\n !gone && query.getObserversCount() > 0\n ? new Set(tagsOf(client, query))\n : new Set();\n if (before === undefined && now.size === 0) return;\n for (const tag of now) if (!before?.has(tag)) hold(tag);\n for (const tag of before ?? []) if (!now.has(tag)) release(tag);\n if (now.size === 0) holders.delete(hash);\n else holders.set(hash, now);\n schedule();\n };\n\n const cache = client.getQueryCache();\n for (const query of cache.getAll()) sync(query);\n const unsubscribe = cache.subscribe((event) => {\n if (event.type === \"observerResultsUpdated\") return;\n sync(event.query as Query, event.type === \"removed\");\n });\n\n /** The SSE transport: one stream over the held tags, reopened when one is added. */\n const viaSse = async (): Promise<Transport> => {\n const { sse } = await import(\"./sse\");\n let stream: EventStream<Record<string, unknown>> | undefined;\n const open = (): void => {\n const previous = stream;\n stream = undefined;\n previous?.close();\n if (stopped || refs.size === 0) return;\n const lastEventId =\n previous?.lastEventId ||\n (cursor === undefined ? undefined : `${cursor.epoch}:${cursor.seq}`);\n const opened = (\n sse as unknown as (\n api: LiveApi,\n key: string,\n options: object,\n ) => EventStream<Record<string, unknown>>\n )(api, LIVE_SSE_KEY, {\n query: { tag: [...refs.keys()] },\n ...(lastEventId ? { lastEventId } : {}),\n });\n stream = opened;\n opened.on(\"invalidate\", (data: unknown) => handlers.invalidate(data));\n opened.on(\"gap\", (data: unknown) => handlers.gap(data));\n opened.on(\"hello\", (data: unknown) => handlers.hello(data));\n opened.closed.catch((error: unknown) => {\n if (stream !== opened) return;\n // Every tag refused: the fallback answers `403` problem+json\n // (`LIVE_TAGS_DENIED`, the tags in `denied`) and opens no stream.\n // A fatal status, so the stream does not reconnect; a new tag\n // reopens it, and the server decides again. The client has read\n // the body (an `HttpError`'s `error`).\n const failed = error as { status?: unknown; error?: unknown };\n const problem = failed.error as\n { code?: unknown; denied?: unknown } | null | undefined;\n if (failed.status === 403 && problem?.code === \"LIVE_TAGS_DENIED\") {\n refused(problem.denied);\n return;\n }\n logger.error(\"live(): the live stream ended\", error);\n });\n };\n open();\n return {\n changed(plus, minus) {\n // A dropped tag can wait for the next reopen; an added one cannot.\n if (plus.length > 0 || (minus.length > 0 && refs.size === 0)) open();\n },\n close: () => {\n const last = stream;\n stream = undefined;\n last?.close();\n },\n };\n };\n\n /** The WebSocket transport; falls back to SSE when the socket never opens. */\n const viaChannel = async (): Promise<Transport> => {\n const { channel } = await import(\"./channel\");\n let everOpened = false;\n const room: ChannelClient<LiveEntry> = channel(api, LIVE_CHANNEL, {\n async resubscribe(r) {\n // Subscribe first, then resume from the cursor kept before the\n // drop: the server replays what was missed for every tag held (an\n // invalidation also heard live meanwhile is taken once, by its seq).\n const from = cursor;\n for (const part of chunked([...refs.keys()]))\n handlers.hello(await r.request(\"subscribe\", { tags: part }));\n // A hello of another epoch has already invalidated everything.\n if (from !== undefined && cursor?.epoch === from.epoch)\n handlers.hello(await r.request(\"resume\", from));\n },\n });\n room.on(\"invalidate\", (data) => handlers.invalidate(data));\n room.on(\"gap\", (data) => handlers.gap(data));\n room.on(\"hello\", (data) => handlers.hello(data));\n const own: { -readonly [K in keyof Transport]: Transport[K] } = {\n changed(plus, minus) {\n if (room.state !== \"open\") return; // the next open subscribes them all\n if (minus.length > 0)\n for (const part of chunked(minus))\n room.send(\"unsubscribe\", { tags: part });\n for (const part of chunked(plus))\n room.request(\"subscribe\", { tags: part }).then(\n (data) => handlers.hello(data),\n (error: unknown) =>\n logger.warn(\"live(): a subscribe failed\", error),\n );\n },\n close: () => room.close(),\n };\n // The channel says \"connecting\" until its first open, however many\n // attempts fail; one that has not opened by the deadline (a proxy that\n // refuses upgrades, a platform whose sockets cannot reach the server)\n // gives way to the SSE fallback.\n const deadline = setTimeout(() => {\n if (everOpened || stopped || transport !== own) return;\n room.close();\n logger.warn(\n `live(): the live channel did not open within ${OPEN_DEADLINE_MS} ms; using its SSE fallback`,\n );\n void viaSse().then((next) => {\n if (stopped) next.close();\n else transport = next;\n });\n }, OPEN_DEADLINE_MS);\n room.on(\"$state\", (state) => {\n if (state !== \"open\") return;\n everOpened = true;\n clearTimeout(deadline);\n });\n const close = own.close;\n own.close = () => {\n clearTimeout(deadline);\n close();\n };\n return own;\n };\n\n const useSse =\n options.transport === \"sse\" ||\n (options.transport === undefined &&\n typeof (globalThis as { WebSocket?: unknown }).WebSocket !== \"function\");\n void (useSse ? viaSse() : viaChannel()).then(\n (started) => {\n if (stopped) started.close();\n else transport ??= started;\n },\n (error: unknown) => logger.error(\"live(): could not start\", error),\n );\n\n return () => {\n if (stopped) return;\n stopped = true;\n unsubscribe();\n transport?.close();\n };\n}\n"
|
|
6
6
|
],
|
|
7
7
|
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
8
|
+
"debugId": "619DEAB63211C7CA64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{Ae,N,e}from"./main-a250ffk7.js";var u=1e4,s=new Set,l=Date.now(),a=null;function w(){l=Date.now();for(let n of s)n()}function v(n){if(s.size===0)l=Date.now(),a=setInterval(w,u);return s.add(n),()=>{if(s.delete(n),s.size===0&&a!==null)clearInterval(a),a=null}}function p(){return l}function Ie(){return Ae(v,p,p)}var T=[["second",1],["minute",60],["hour",3600],["day",86400],["week",604800],["month",2629800],["year",31557600]],S={second:45,minute:45,hour:22,day:6,week:4,month:11},b=new Map;function g(n){let r=n??"",t=b.get(r);if(!t)t=new Intl.RelativeTimeFormat(n,{numeric:"auto",style:"narrow"}),b.set(r,t);return t}var y=u/1000;function _(n,r,t){let o=(n-r)/1000,i=o>0&&o<=y?0:o,h=Math.abs(i);for(let m=0;m<T.length;m++){let[c,f]=T[m],d=S[c];if(d===void 0||h/f<d)return g(t).format(Math.round(i/f),c)}return g(t).format(Math.round(i/31557600),"year")}function R(n){if(n===null||n===void 0||n==="")return null;let r=n instanceof Date?n.getTime():typeof n==="number"?n:Date.parse(n);return Number.isFinite(r)?r:null}function A({value:n,fallback:r="—",className:t,hint:o}){let i=R(n);if(i===null)return e("span",{className:N("relative-time",t),children:r});return e(I,{ms:i,className:t,hint:o})}function I({ms:n,className:r,hint:t}){let o=Ie(),i=new Date(n).toISOString();return e("time",{className:N("relative-time",r),dateTime:i,title:t===void 0?i:`${i}
|
|
2
2
|
${t}`,children:_(n,o)})}
|
|
3
|
-
export{Ie,
|
|
3
|
+
export{Ie,A};
|
|
4
4
|
|
|
5
|
-
//# debugId=
|
|
6
|
-
//# sourceMappingURL=main-
|
|
5
|
+
//# debugId=55346C2FCAC6EF3664756E2164756E21
|
|
6
|
+
//# sourceMappingURL=main-0jmeh6mq.js.map
|
|
@@ -7,6 +7,6 @@
|
|
|
7
7
|
"import { useNow } from \"../hooks/useNow\";\nimport { cx } from \"./classNames\";\nimport { formatRelativeTime, toEpochMs } from \"./formatRelative\";\n\n/** Props of {@link RelativeTime}. */\nexport interface RelativeTimeProps {\n /** The instant: epoch ms, an ISO string or a `Date`. `null`/`undefined` (or invalid) renders \"—\". */\n value: number | string | Date | null | undefined;\n /** What to render for a missing value. Defaults to `\"—\"`. */\n fallback?: string;\n /** Extra class names. */\n className?: string;\n /**\n * A note appended to the `<time>`'s tooltip, on its own line under the\n * absolute instant — so a caller can explain the instant without taking\n * the tooltip away from it. Absent leaves the tooltip the instant alone,\n * and it is ignored for a missing value (there is no `<time>` then).\n */\n hint?: string;\n}\n\n/**\n * \"3m ago\" / \"in 2h\", kept current by the one shared clock (`useNow`),\n * inside a `<time>` whose `dateTime` and `title` carry the absolute ISO\n * instant, so hovering shows exactly when.\n */\nexport function RelativeTime({\n value,\n fallback = \"—\",\n className,\n hint,\n}: RelativeTimeProps) {\n const ms = toEpochMs(value);\n if (ms === null) {\n return <span className={cx(\"relative-time\", className)}>{fallback}</span>;\n }\n return (\n <TickingTime\n ms={ms}\n className={className}\n hint={hint}\n />\n );\n}\n\n/** Props of {@link TickingTime}. */\ninterface TickingTimeProps {\n /** The instant, epoch ms. */\n ms: number;\n /** Extra class names. */\n className?: string;\n /** A note under the instant in the tooltip. See {@link RelativeTimeProps.hint}. */\n hint?: string;\n}\n\n/** The subscribed part, so a missing value never joins the clock. */\nfunction TickingTime({ ms, className, hint }: TickingTimeProps) {\n const now = useNow();\n const iso = new Date(ms).toISOString();\n return (\n <time\n className={cx(\"relative-time\", className)}\n dateTime={iso}\n title={hint === undefined ? iso : `${iso}\\n${hint}`}\n >\n {formatRelativeTime(ms, now)}\n </time>\n );\n}\n"
|
|
8
8
|
],
|
|
9
9
|
"mappings": "uCAUO,IAAM,EAAc,IAGrB,EAAY,IAAI,IAElB,EAAM,KAAK,IAAI,EAEf,EAA+C,KAGnD,SAAS,CAAI,EAAS,CACpB,EAAM,KAAK,IAAI,EACf,QAAW,KAAY,EACrB,EAAS,EAKb,SAAS,CAAS,CAAC,EAAkC,CACnD,GAAI,EAAU,OAAS,EAErB,EAAM,KAAK,IAAI,EACf,EAAQ,YAAY,EAAM,CAAW,EAGvC,OADA,EAAU,IAAI,CAAQ,EACf,IAAM,CAEX,GADA,EAAU,OAAO,CAAQ,EACrB,EAAU,OAAS,GAAK,IAAU,KACpC,cAAc,CAAK,EACnB,EAAQ,MAMd,SAAS,CAAW,EAAW,CAC7B,OAAO,EAIF,SAAS,EAAM,EAAW,CAC/B,OAAO,GAAqB,EAAW,EAAa,CAAW,EChDjE,IAAM,EAA0D,CAC9D,CAAC,SAAU,CAAC,EACZ,CAAC,SAAU,EAAE,EACb,CAAC,OAAQ,IAAK,EACd,CAAC,MAAO,KAAM,EACd,CAAC,OAAQ,MAAO,EAChB,CAAC,QAAS,OAAS,EACnB,CAAC,OAAQ,QAAU,CACrB,EAGM,EAEF,CACF,OAAQ,GACR,OAAQ,GACR,KAAM,GACN,IAAK,EACL,KAAM,EACN,MAAO,EACT,EAGM,EAAa,IAAI,IAGvB,SAAS,CAAS,CAAC,EAAqD,CACtE,IAAM,EAAM,GAAU,GAClB,EAAQ,EAAW,IAAI,CAAG,EAC9B,GAAI,CAAC,EACH,EAAQ,IAAI,KAAK,mBAAmB,EAAQ,CAC1C,QAAS,OACT,MAAO,QACT,CAAC,EACD,EAAW,IAAI,EAAK,CAAK,EAE3B,OAAO,EAWT,IAAM,EAAqB,EAAc,KAOlC,SAAS,CAAkB,CAChC,EACA,EACA,EACQ,CACR,IAAM,GAAS,EAAK,GAAO,KACrB,EAAU,EAAQ,GAAK,GAAS,EAAqB,EAAI,EACzD,EAAM,KAAK,IAAI,CAAO,EAC5B,QAAS,EAAI,EAAG,EAAI,EAAM,OAAQ,IAAK,CACrC,IAAO,EAAM,GAAQ,EAAM,GACrB,EAAQ,EAAW,GACzB,GAAI,IAAU,QAAa,EAAM,EAAO,EACtC,OAAO,EAAU,CAAM,EAAE,OAAO,KAAK,MAAM,EAAU,CAAI,EAAG,CAAI,EAGpE,OAAO,EAAU,CAAM,EAAE,OAAO,KAAK,MAAM,EAAU,QAAU,EAAG,MAAM,EAInE,SAAS,CAAS,CACvB,EACe,CACf,GAAI,IAAU,MAAQ,IAAU,QAAa,IAAU,GACrD,OAAO,KAET,IAAM,EACJ,aAAiB,KACb,EAAM,QAAQ,EACd,OAAO,IAAU,SACf,EACA,KAAK,MAAM,CAAK,EACxB,OAAO,OAAO,SAAS,CAAE,EAAI,EAAK,KC9D7B,SAAS,CAAY,EAC1B,QACA,WAAW,IACX,YACA,QACoB,CACpB,IAAM,EAAK,EAAU,CAAK,EAC1B,GAAI,IAAO,KACT,OAAO,EAAC,OAAD,CAAM,UAAW,EAAG,gBAAiB,CAAS,EAA9C,SAAkD,EAAW,EAEtE,OACE,EAAC,EAAD,CACE,GAAI,EACJ,UAAW,EACX,KAAM,EACR,EAeJ,SAAS,CAAW,EAAG,KAAI,YAAW,QAA0B,CAC9D,IAAM,EAAM,GAAO,EACb,EAAM,IAAI,KAAK,CAAE,EAAE,YAAY,EACrC,OACE,EAAC,OAAD,CACE,UAAW,EAAG,gBAAiB,CAAS,EACxC,SAAU,EACV,MAAO,IAAS,OAAY,EAAM,GAAG;AAAA,EAAQ,IAH/C,SAKG,EAAmB,EAAI,CAAG,EAC3B",
|
|
10
|
-
"debugId": "
|
|
10
|
+
"debugId": "55346C2FCAC6EF3664756E2164756E21",
|
|
11
11
|
"names": []
|
|
12
12
|
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import{C,g,be}from"./main-a250ffk7.js";function W(){let{location:t,navigate:r}=be(),a=g(()=>new URLSearchParams(t.search),[t.search]),e=C((i)=>{let n=new URLSearchParams(window.location.search);for(let[c,o]of Object.entries(i))if(o===null||o==="")n.delete(c);else n.set(c,o);let s=n.toString();r(`${t.path??"/"}${s?`?${s}`:""}`,{replace:!0})},[t.path,r]);return[a,e]}function me(t,r,a){let e=t.get(r);if(e===null||!/^\d+$/.test(e))return a;return Number(e)}function Tt(t){return[...new Set(t.split(",").map((r)=>r.trim()).filter(Boolean))]}function we(t,r){return Math.min(Math.max(1,t),Math.max(1,r))}
|
|
2
|
+
export{W,me,Tt,we};
|
|
3
|
+
|
|
4
|
+
//# debugId=62BE333E99E6E35164756E2164756E21
|
|
5
|
+
//# sourceMappingURL=main-3yj6bv90.js.map
|
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
"import { useCallback, useMemo } from \"react\";\nimport { useRouter } from \"../../routing\";\n\n/** A patch of query parameters: a string sets one, `null` removes it. */\nexport type ParamPatch = Readonly<Record<string, string | null>>;\n\n/**\n * The query string as state, several keys at a time: `update()` applies a\n * patch in one navigation (replacing the history entry), so changing a\n * filter and resetting `offset` is one URL change, not two.\n */\nexport function useUrlParams(): [URLSearchParams, (patch: ParamPatch) => void] {\n const { location, navigate } = useRouter();\n const params = useMemo(\n () => new URLSearchParams(location.search),\n [location.search],\n );\n const update = useCallback(\n (patch: ParamPatch) => {\n const next = new URLSearchParams(window.location.search);\n for (const [key, value] of Object.entries(patch)) {\n if (value === null || value === \"\") {\n next.delete(key);\n } else {\n next.set(key, value);\n }\n }\n const query = next.toString();\n navigate(`${location.path ?? \"/\"}${query ? `?${query}` : \"\"}`, {\n replace: true,\n });\n },\n [location.path, navigate],\n );\n return [params, update];\n}\n\n/** A non-negative integer query parameter, or `fallback`. */\nexport function intParam(\n params: URLSearchParams,\n key: string,\n fallback: number,\n): number {\n const raw = params.get(key);\n if (raw === null || !/^\\d+$/.test(raw)) {\n return fallback;\n }\n return Number(raw);\n}\n\n/** Splits a comma-separated list, trimming and dropping empties and duplicates. */\nexport function splitList(text: string): string[] {\n return [\n ...new Set(\n text\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean),\n ),\n ];\n}\n\n/** Clamps a page size to `1..max`. */\nexport function clampLimit(value: number, max: number): number {\n return Math.min(Math.max(1, value), Math.max(1, max));\n}\n"
|
|
6
6
|
],
|
|
7
7
|
"mappings": "uCAWO,SAAS,CAAY,EAAmD,CAC7E,IAAQ,WAAU,YAAa,GAAU,EACnC,EAAS,EACb,IAAM,IAAI,gBAAgB,EAAS,MAAM,EACzC,CAAC,EAAS,MAAM,CAClB,EACM,EAAS,EACb,CAAC,IAAsB,CACrB,IAAM,EAAO,IAAI,gBAAgB,OAAO,SAAS,MAAM,EACvD,QAAY,EAAK,KAAU,OAAO,QAAQ,CAAK,EAC7C,GAAI,IAAU,MAAQ,IAAU,GAC9B,EAAK,OAAO,CAAG,EACf,KACA,EAAK,IAAI,EAAK,CAAK,EAGvB,IAAM,EAAQ,EAAK,SAAS,EAC5B,EAAS,GAAG,EAAS,MAAQ,MAAM,EAAQ,IAAI,IAAU,KAAM,CAC7D,QAAS,EACX,CAAC,GAEH,CAAC,EAAS,KAAM,CAAQ,CAC1B,EACA,MAAO,CAAC,EAAQ,CAAM,EAIjB,SAAS,EAAQ,CACtB,EACA,EACA,EACQ,CACR,IAAM,EAAM,EAAO,IAAI,CAAG,EAC1B,GAAI,IAAQ,MAAQ,CAAC,QAAQ,KAAK,CAAG,EACnC,OAAO,EAET,OAAO,OAAO,CAAG,EAIZ,SAAS,EAAS,CAAC,EAAwB,CAChD,MAAO,CACL,GAAG,IAAI,IACL,EACG,MAAM,GAAG,EACT,IAAI,CAAC,IAAS,EAAK,KAAK,CAAC,EACzB,OAAO,OAAO,CACnB,CACF,EAIK,SAAS,EAAU,CAAC,EAAe,EAAqB,CAC7D,OAAO,KAAK,IAAI,KAAK,IAAI,EAAG,CAAK,EAAG,KAAK,IAAI,EAAG,CAAG,CAAC",
|
|
8
|
-
"debugId": "
|
|
8
|
+
"debugId": "62BE333E99E6E35164756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import{T,r,n,e,t,s,oe,l,M}from"./main-a250ffk7.js";import{D}from"./main-hm1ng3yg.js";function k(i){return i.open?e(q,{...i}):null}function q({onClose:i,title:h,description:B,children:L,onConfirm:F,confirmLabel:m="Confirm",pendingLabel:N,cancelLabel:P="Cancel",variant:H="default",confirmText:a,confirmTextLabel:O,closeOnSuccess:S=!0,confirmDisabled:w=!1}){let[u,I]=r(""),[o,c]=r(!1),[p,g]=r(null),b=T(null),C=T(null),R=T(null),v=(a===void 0||u===a)&&!o&&!w,f=H==="danger",y=async()=>{if(!v)return;c(!0),g(null);try{if(await F(),c(!1),S)i()}catch(d){c(!1),g(d)}},z=(d)=>{d.preventDefault(),y()},E=()=>{if(!o)i()};return e(oe,{open:!0,onClose:E,title:h,description:B,role:f?"alertdialog":"dialog",size:"sm",closeOnEscape:!o,closeOnBackdrop:!o,initialFocusRef:a!==void 0?R:f?b:C,footer:t(n,{children:[e(s,{ref:b,onClick:E,disabled:o,children:P}),e(s,{ref:C,variant:f?"danger":"primary",disabled:!v,"aria-busy":o||void 0,onClick:()=>void y(),children:o?N??`${m}…`:m})]}),children:t("form",{className:"confirm-dialog-body",onSubmit:z,children:[L,a!==void 0&&e(l,{label:O??t(n,{children:["Type ",e("code",{children:a})," to confirm"]}),children:e(M,{ref:R,value:u,onChange:I,autoComplete:"off",spellCheck:!1,disabled:o})}),p!==null&&e(D,{error:p})]})})}
|
|
2
|
+
export{k};
|
|
3
|
+
|
|
4
|
+
//# debugId=0283959BD22E5C1264756E2164756E21
|
|
5
|
+
//# sourceMappingURL=main-4g69fn3x.js.map
|
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
"import type { FormEvent, ReactNode } from \"react\";\nimport { useRef, useState } from \"react\";\nimport { Button } from \"./Button\";\nimport { Dialog } from \"./Dialog\";\nimport { Field } from \"./Field\";\nimport { TextInput } from \"./inputs\";\nimport { ProblemBanner } from \"./ProblemBanner\";\n\n/** Props of {@link ConfirmDialog}. */\nexport interface ConfirmDialogProps {\n /** Whether it is showing. State (typed text, error) resets on each opening. */\n open: boolean;\n /** Asks to close (Cancel, Escape, backdrop, or after a successful confirm). Ignored while pending. */\n onClose: () => void;\n /** The question, e.g. \"Drain queue emails?\". */\n title: ReactNode;\n /** What will happen, in a sentence. */\n description?: ReactNode;\n /** Extra body content, e.g. options such as a \"include delayed\" checkbox. */\n children?: ReactNode;\n /**\n * The action. May be async: the dialog shows a pending state until it\n * settles, closes on success, and on a throw stays open with the error\n * shown inline (an `ApiError` as a {@link ProblemBanner}).\n */\n onConfirm: () => unknown;\n /** The confirm button's text. Defaults to `\"Confirm\"`. */\n confirmLabel?: string;\n /** The confirm button's text while pending. Defaults to `confirmLabel` + \"…\". */\n pendingLabel?: string;\n /** The cancel button's text. Defaults to `\"Cancel\"`. */\n cancelLabel?: string;\n /** `\"danger\"` for destructive actions: a red button, `alertdialog`, and Cancel focused first. Defaults to `\"default\"`. */\n variant?: \"default\" | \"danger\";\n /** When set, the user must type exactly this (e.g. the queue name) before Confirm enables. */\n confirmText?: string;\n /** The typed-confirmation label. Defaults to \"Type <confirmText> to confirm\". */\n confirmTextLabel?: ReactNode;\n /** Close after a successful `onConfirm`. Defaults to `true`. */\n closeOnSuccess?: boolean;\n /** Keeps Confirm disabled, e.g. while the body's options are invalid. */\n confirmDisabled?: boolean;\n}\n\n/**\n * A yes/no dialog for an action, built on {@link Dialog}: an optional typed\n * confirmation for destructive ones, an async `onConfirm` with a pending\n * state, and the failure shown in place so the user can retry or cancel.\n */\nexport function ConfirmDialog(props: ConfirmDialogProps) {\n return props.open ? <OpenConfirmDialog {...props} /> : null;\n}\n\n/** The mounted dialog; its state lives exactly as long as one opening. */\nfunction OpenConfirmDialog({\n onClose,\n title,\n description,\n children,\n onConfirm,\n confirmLabel = \"Confirm\",\n pendingLabel,\n cancelLabel = \"Cancel\",\n variant = \"default\",\n confirmText,\n confirmTextLabel,\n closeOnSuccess = true,\n confirmDisabled = false,\n}: ConfirmDialogProps) {\n const [typed, setTyped] = useState(\"\");\n const [pending, setPending] = useState(false);\n const [error, setError] = useState<unknown>(null);\n const cancelRef = useRef<HTMLButtonElement>(null);\n const confirmRef = useRef<HTMLButtonElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const matches = confirmText === undefined || typed === confirmText;\n const canConfirm = matches && !pending && !confirmDisabled;\n const danger = variant === \"danger\";\n\n const confirm = async () => {\n if (!canConfirm) {\n return;\n }\n setPending(true);\n setError(null);\n try {\n await onConfirm();\n setPending(false);\n if (closeOnSuccess) {\n onClose();\n }\n } catch (caught) {\n setPending(false);\n setError(caught);\n }\n };\n\n const onSubmit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n void confirm();\n };\n\n const close = () => {\n if (!pending) {\n onClose();\n }\n };\n\n return (\n <Dialog\n open\n onClose={close}\n title={title}\n description={description}\n role={danger ? \"alertdialog\" : \"dialog\"}\n size=\"sm\"\n closeOnEscape={!pending}\n closeOnBackdrop={!pending}\n initialFocusRef={\n confirmText !== undefined ? inputRef : danger ? cancelRef : confirmRef\n }\n footer={\n <>\n <Button\n ref={cancelRef}\n onClick={close}\n disabled={pending}\n >\n {cancelLabel}\n </Button>\n <Button\n ref={confirmRef}\n variant={danger ? \"danger\" : \"primary\"}\n disabled={!canConfirm}\n aria-busy={pending || undefined}\n onClick={() => void confirm()}\n >\n {pending ? (pendingLabel ?? `${confirmLabel}…`) : confirmLabel}\n </Button>\n </>\n }\n >\n <form\n className=\"confirm-dialog-body\"\n onSubmit={onSubmit}\n >\n {children}\n {confirmText !== undefined && (\n <Field\n label={\n confirmTextLabel ?? (\n <>\n Type <code>{confirmText}</code> to confirm\n </>\n )\n }\n >\n <TextInput\n ref={inputRef}\n value={typed}\n onChange={setTyped}\n autoComplete=\"off\"\n spellCheck={false}\n disabled={pending}\n />\n </Field>\n )}\n {error !== null && <ProblemBanner error={error} />}\n </form>\n </Dialog>\n );\n}\n"
|
|
6
6
|
],
|
|
7
7
|
"mappings": "qFAiDO,SAAS,CAAa,CAAC,EAA2B,CACvD,OAAO,EAAM,KAAO,EAAC,EAAD,IAAuB,EAAO,EAAK,KAIzD,SAAS,CAAiB,EACxB,UACA,QACA,cACA,WACA,YACA,eAAe,UACf,eACA,cAAc,SACd,UAAU,UACV,cACA,mBACA,iBAAiB,GACjB,kBAAkB,IACG,CACrB,IAAO,EAAO,GAAY,EAAS,EAAE,GAC9B,EAAS,GAAc,EAAS,EAAK,GACrC,EAAO,GAAY,EAAkB,IAAI,EAC1C,EAAY,EAA0B,IAAI,EAC1C,EAAa,EAA0B,IAAI,EAC3C,EAAW,EAAyB,IAAI,EAGxC,GADU,IAAgB,QAAa,IAAU,IACzB,CAAC,GAAW,CAAC,EACrC,EAAS,IAAY,SAErB,EAAU,SAAY,CAC1B,GAAI,CAAC,EACH,OAEF,EAAW,EAAI,EACf,EAAS,IAAI,EACb,GAAI,CAGF,GAFA,MAAM,EAAU,EAChB,EAAW,EAAK,EACZ,EACF,EAAQ,EAEV,MAAO,EAAQ,CACf,EAAW,EAAK,EAChB,EAAS,CAAM,IAIb,EAAW,CAAC,IAAsC,CACtD,EAAM,eAAe,EAChB,EAAQ,GAGT,EAAQ,IAAM,CAClB,GAAI,CAAC,EACH,EAAQ,GAIZ,OACE,EAAC,GAAD,CACE,KAAI,GACJ,QAAS,EACT,MAAO,EACP,YAAa,EACb,KAAM,EAAS,cAAgB,SAC/B,KAAK,KACL,cAAe,CAAC,EAChB,gBAAiB,CAAC,EAClB,gBACE,IAAgB,OAAY,EAAW,EAAS,EAAY,EAE9D,OACE,cAiBE,CAhBA,EAAC,EAAD,CACE,IAAK,EACL,QAAS,EACT,SAAU,EAHZ,SAKG,EACD,EACF,EAAC,EAAD,CACE,IAAK,EACL,QAAS,EAAS,SAAW,UAC7B,SAAU,CAAC,EACX,YAAW,GAAW,OACtB,QAAS,IAAM,KAAK,EAAQ,EAL9B,SAOG,EAAW,GAAgB,GAAG,KAAmB,EAClD,GACF,EA9BN,SAiCE,EAAC,OAAD,CACE,UAAU,sBACV,SAAU,EAFZ,SA0BE,CAtBC,EACA,IAAgB,QACf,EAAC,EAAD,CACE,MACE,GACE,cAEE,CAFF,QACO,EAAC,OAAD,UAAO,EAAc,EAD5B,eAEE,EALR,SASE,EAAC,EAAD,CACE,IAAK,EACL,MAAO,EACP,SAAU,EACV,aAAa,MACb,WAAY,GACZ,SAAU,EACZ,EACA,EAEH,IAAU,MAAQ,EAAC,EAAD,CAAe,MAAO,EAAO,GAChD,EACF",
|
|
8
|
-
"debugId": "
|
|
8
|
+
"debugId": "0283959BD22E5C1264756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{Xe,St,Mr,Br,
|
|
2
|
-
export{Mn,Or,
|
|
1
|
+
import{Xe,St,Mr,Br,ss,ue}from"./main-a250ffk7.js";var Mn=500,Or=500;function Ar(e,n,r=Mn){let o=[...n].reverse().concat(e);return o.length>r?o.slice(0,r):o}var y=Mn+Or;function co(e,n,r=y){if(n.kind!=="queue"||n.type!=="summon")return{duplicate:!1,seen:e};let o=n.payload,t=typeof o==="object"&&o!==null?o.eventId:void 0;if(typeof t!=="string"||t==="")return{duplicate:!1,seen:e};if(e.includes(t))return{duplicate:!0,seen:e};let s=[...e,t];return{duplicate:!1,seen:s.length>r?s.slice(s.length-r):s}}function Rr(e){let n=e!=="runner",r=e!=="jobs";return[...n&&r?["all"]:[],...n?["queues","queue","job","workers","queueWorkers"]:[],...r?["runners","runner"]:[]]}function mo(e){if(e==="both")return{scope:"all"};return{scope:e==="jobs"?"queues":"runners"}}function Dr(e){switch(e.scope){case"all":case"queues":case"runners":case"workers":return ue[e.scope];case"queueWorkers":return ue.queueWorkers(e.queue);case"queue":return ue.queue(e.queue);case"runner":return ue.runner(e.runner);case"job":return ue.job(e.queue,e.id)}}function At(e,n){if(e===null||e==="")return null;let r=q(e);return r&&Rr(n).includes(r.scope)?r:null}function q(e){if(e==="all"||e==="queues"||e==="runners"||e==="workers")return{scope:e};let n=/^queue\/([^/]+)\/workers$/.exec(e);if(n)return{scope:"queueWorkers",queue:n[1]};let r=/^queue\/([^/]+)\/job\/(.+)$/.exec(e);if(r)try{return{scope:"job",queue:r[1],id:ss(r[2])}}catch{return null}let o=/^queue\/([^/]+)$/.exec(e);if(o)return{scope:"queue",queue:o[1]};let t=/^runner\/([^/]+)$/.exec(e);if(t)return{scope:"runner",runner:t[1]};return null}function Vt(e){switch(e.scope){case"all":return Mr;case"queues":case"queue":case"job":return Xe;case"workers":case"queueWorkers":return Br;case"runners":case"runner":return St}}var g={queue:Xe,runner:St,worker:Br};function fo(e,n){let r=new Set(n),o=new Set(Mr),t=new Set,s=[],d=[...new Set((e??"").split(",").map((u)=>u.trim()).filter(Boolean))];for(let u of d){let a=/^(queue|runner)\.(.+)$/.exec(u);if(a){let i=g[a[1]],p=a[2];if(!i.includes(p))s.push({name:u,reason:"unknown"});else if(i.every((f)=>r.has(f)))t.add(p);else s.push({name:u,reason:"channel"})}else if(!o.has(u))s.push({name:u,reason:"unknown"});else if(r.has(u))t.add(u);else s.push({name:u,reason:"channel"})}let c=n.filter((u)=>t.has(u)),l=[...c,...s.map((u)=>u.name)];return{types:c,ignored:s,normalized:l.length>0?l.join(","):null}}function po(e,n){return n.length===0||n.includes(e.type)}
|
|
2
|
+
export{Mn,Or,Ar,co,Rr,mo,Dr,At,Vt,fo,po};
|
|
3
3
|
|
|
4
|
-
//# debugId=
|
|
5
|
-
//# sourceMappingURL=main-
|
|
4
|
+
//# debugId=B2DB5554BB9DB2CD64756E2164756E21
|
|
5
|
+
//# sourceMappingURL=main-4gte3eqq.js.map
|
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
"import type {\n EventName,\n EventWire,\n JobsApiGapMessage,\n JobsApiMode,\n} from \"../../api/types\";\nimport {\n decodeJobId,\n EVENT_TYPES,\n QUEUE_EVENT_TYPES,\n RUNNER_EVENT_TYPES,\n WORKER_EVENT_TYPES,\n} from \"@kingsleyweb/bun-jobs/api/contract\";\nimport { liveChannels } from \"../../live\";\n\n/**\n * The Events console's pure half: which channel is chosen (and how it reads\n * from and writes to the URL), which event types it may filter on, and the\n * bounded log of what arrived.\n */\n\n/** Most rows the console keeps; older ones drop off the end. */\nexport const MAX_ROWS = 500;\n\n/** Most events held while the display is paused; later ones are counted as dropped. */\nexport const MAX_PAUSED = 500;\n\n/** One line of the console. */\nexport type LogRow =\n | {\n /** A stable React key, increasing with arrival. */\n key: number;\n /** An event frame. */\n kind: \"event\";\n /** When the browser received it, epoch ms. */\n receivedAt: number;\n /** The event. */\n event: EventWire;\n }\n | {\n /** A stable React key, increasing with arrival. */\n key: number;\n /** The server reported that events were lost. */\n kind: \"gap\";\n /** When the browser received it, epoch ms. */\n receivedAt: number;\n /** The gap frame. */\n gap: JobsApiGapMessage;\n };\n\n/**\n * `incoming` (oldest first) added ahead of `rows` (newest first), keeping at\n * most `cap` rows: the newest.\n */\nexport function prependRows(\n rows: readonly LogRow[],\n incoming: readonly LogRow[],\n cap: number = MAX_ROWS,\n): LogRow[] {\n const next = [...incoming].reverse().concat(rows);\n return next.length > cap ? next.slice(0, cap) : next;\n}\n\n/**\n * Most summon event ids {@link dedupeSummon} remembers. At least\n * {@link MAX_ROWS} + {@link MAX_PAUSED}, so every summon row still in the log\n * or held by a pause is remembered: a copy of one is never added again,\n * however far the log's cap has moved on.\n */\nexport const MAX_SEEN_EVENT_IDS = MAX_ROWS + MAX_PAUSED;\n\n/** What {@link dedupeSummon} decided about one event. */\nexport interface DedupeResult {\n /** Whether the event is a copy of a summon event already heard: drop it. */\n duplicate: boolean;\n /** The ids remembered afterwards, oldest first; the same array when nothing changed. */\n seen: readonly string[];\n}\n\n/**\n * Whether `event` repeats a summon event already heard, and the memory with\n * its id remembered. A shared summon unit's event is published once on each\n * of its queues, so a channel spanning several of them (`all`, `queues`)\n * hears it once per queue, every copy with the same `eventId`; the console\n * shows it once.\n *\n * Only a `summon` frame with an `eventId` is ever a duplicate: one from a\n * server older than `eventId` (none) is always kept, and so is every other\n * event. `seen` keeps the newest `cap` ids, oldest first.\n */\nexport function dedupeSummon(\n seen: readonly string[],\n event: EventWire,\n cap: number = MAX_SEEN_EVENT_IDS,\n): DedupeResult {\n if (event.kind !== \"queue\" || event.type !== \"summon\") {\n return { duplicate: false, seen };\n }\n const payload: unknown = event.payload;\n const eventId =\n typeof payload === \"object\" && payload !== null\n ? (payload as { eventId?: unknown }).eventId\n : undefined;\n if (typeof eventId !== \"string\" || eventId === \"\") {\n return { duplicate: false, seen };\n }\n if (seen.includes(eventId)) {\n return { duplicate: true, seen };\n }\n const next = [...seen, eventId];\n return {\n duplicate: false,\n seen: next.length > cap ? next.slice(next.length - cap) : next,\n };\n}\n\n/** What the channel picker chose. */\nexport type ChannelChoice =\n | {\n /** `all`, `queues`, `runners` or `workers`. */\n scope: \"all\" | \"queues\" | \"runners\" | \"workers\";\n }\n | {\n /** One queue's events. */\n scope: \"queue\";\n /** The queue. */\n queue: string;\n }\n | {\n /** One runner's events. */\n scope: \"runner\";\n /** The runner id. */\n runner: string;\n }\n | {\n /** One queue's worker events. */\n scope: \"queueWorkers\";\n /** The queue. */\n queue: string;\n }\n | {\n /** One job's events. */\n scope: \"job\";\n /** The job's queue. */\n queue: string;\n /** The job id, decoded. */\n id: string;\n };\n\n/** The picker's scopes. */\nexport type ChannelScope = ChannelChoice[\"scope\"];\n\n/**\n * The scopes a mode offers: `all` only in `both`, queue and worker scopes\n * with jobs, runner scopes with runners. Worker events travel on their own\n * channels — never on `all` or `queues` — so watching them is a scope of its\n * own rather than a filter over a queue channel.\n */\nexport function scopesFor(mode: JobsApiMode): ChannelScope[] {\n const queues = mode !== \"runner\";\n const runners = mode !== \"jobs\";\n return [\n ...(queues && runners ? ([\"all\"] as const) : []),\n ...(queues\n ? ([\"queues\", \"queue\", \"job\", \"workers\", \"queueWorkers\"] as const)\n : []),\n ...(runners ? ([\"runners\", \"runner\"] as const) : []),\n ];\n}\n\n/** The channel the console opens on: `all` in `both`, else the mode's broad channel. */\nexport function defaultChoice(mode: JobsApiMode): ChannelChoice {\n if (mode === \"both\") {\n return { scope: \"all\" };\n }\n return { scope: mode === \"jobs\" ? \"queues\" : \"runners\" };\n}\n\n/** The channel name of a choice (see `liveChannels`). */\nexport function channelName(choice: ChannelChoice): string {\n switch (choice.scope) {\n case \"all\":\n case \"queues\":\n case \"runners\":\n case \"workers\":\n return liveChannels[choice.scope];\n case \"queueWorkers\":\n return liveChannels.queueWorkers(choice.queue);\n case \"queue\":\n return liveChannels.queue(choice.queue);\n case \"runner\":\n return liveChannels.runner(choice.runner);\n case \"job\":\n return liveChannels.job(choice.queue, choice.id);\n }\n}\n\n/**\n * A channel name read back into a choice: `null` when it is malformed, or\n * not a channel `mode` has (a runner channel in `jobs` mode, `all` outside\n * `both`).\n */\nexport function parseChannel(\n raw: string | null,\n mode: JobsApiMode,\n): ChannelChoice | null {\n if (raw === null || raw === \"\") {\n return null;\n }\n const choice = readChannel(raw);\n return choice && scopesFor(mode).includes(choice.scope) ? choice : null;\n}\n\n/** {@link parseChannel} without the mode check. */\nfunction readChannel(raw: string): ChannelChoice | null {\n if (\n raw === \"all\" ||\n raw === \"queues\" ||\n raw === \"runners\" ||\n raw === \"workers\"\n ) {\n return { scope: raw };\n }\n // Before the one-queue pattern: `queue/<queue>/workers` is its own channel.\n const queueWorkers = /^queue\\/([^/]+)\\/workers$/.exec(raw);\n if (queueWorkers) {\n return { scope: \"queueWorkers\", queue: queueWorkers[1] };\n }\n const job = /^queue\\/([^/]+)\\/job\\/(.+)$/.exec(raw);\n if (job) {\n try {\n return { scope: \"job\", queue: job[1], id: decodeJobId(job[2]) };\n } catch {\n return null;\n }\n }\n const queue = /^queue\\/([^/]+)$/.exec(raw);\n if (queue) {\n return { scope: \"queue\", queue: queue[1] };\n }\n const runner = /^runner\\/([^/]+)$/.exec(raw);\n if (runner) {\n return { scope: \"runner\", runner: runner[1] };\n }\n return null;\n}\n\n/** The event types a choice can carry: queue events on queue channels, runner events on runner channels, every type on `all`. */\nexport function typesFor(choice: ChannelChoice): readonly EventName[] {\n switch (choice.scope) {\n case \"all\":\n return EVENT_TYPES;\n case \"queues\":\n case \"queue\":\n case \"job\":\n return QUEUE_EVENT_TYPES;\n case \"workers\":\n case \"queueWorkers\":\n return WORKER_EVENT_TYPES;\n case \"runners\":\n case \"runner\":\n return RUNNER_EVENT_TYPES;\n }\n}\n\n/** A name in the `types` URL parameter that the filter ignores, and why. */\nexport interface IgnoredType {\n /** The name as written in the URL. */\n name: string;\n /** `unknown`: no such event type; `channel`: a type the channel does not carry. */\n reason: \"unknown\" | \"channel\";\n}\n\n/** The `types` URL parameter, read (see {@link readTypes}). */\nexport interface TypesParam {\n /** The filter: the listed types the channel carries, in `allowed`'s order. Empty means every type. */\n types: EventName[];\n /** Listed names left out of the filter, in the order written. */\n ignored: IgnoredType[];\n /**\n * The parameter with every name the filter uses written bare\n * (`queue.completed` → `completed`, de-duplicated, in `allowed`'s order),\n * then the ignored names as written, so the note about them survives a\n * reload; `null` for no names.\n */\n normalized: string | null;\n}\n\n/** The event names of each family, for `queue.` / `runner.` / `worker.` prefixes. */\nconst FAMILY_TYPES: Readonly<\n Record<\"queue\" | \"runner\" | \"worker\", readonly string[]>\n> = {\n queue: QUEUE_EVENT_TYPES,\n runner: RUNNER_EVENT_TYPES,\n worker: WORKER_EVENT_TYPES,\n};\n\n/**\n * Reads the `types` URL parameter against the types a channel carries\n * (`allowed`, from {@link typesFor}). A name is bare (`completed`) or\n * prefixed with its family (`queue.completed`, `runner.failed`); a prefixed\n * one counts only on a channel that carries that family. Unknown names and\n * names the channel does not carry are reported in `ignored`, not dropped\n * silently: the console shows them, rather than quietly showing every type.\n */\nexport function readTypes(\n raw: string | null,\n allowed: readonly EventName[],\n): TypesParam {\n const allowedSet: ReadonlySet<string> = new Set(allowed);\n const known: ReadonlySet<string> = new Set(EVENT_TYPES);\n const listed = new Set<string>();\n const ignored: IgnoredType[] = [];\n const names = [\n ...new Set(\n (raw ?? \"\")\n .split(\",\")\n .map((name) => name.trim())\n .filter(Boolean),\n ),\n ];\n for (const name of names) {\n const prefixed = /^(queue|runner)\\.(.+)$/.exec(name);\n if (prefixed) {\n const family = FAMILY_TYPES[prefixed[1] as \"queue\" | \"runner\"];\n const bare = prefixed[2];\n if (!family.includes(bare)) {\n ignored.push({ name, reason: \"unknown\" });\n } else if (family.every((type) => allowedSet.has(type))) {\n listed.add(bare);\n } else {\n ignored.push({ name, reason: \"channel\" });\n }\n } else if (!known.has(name)) {\n ignored.push({ name, reason: \"unknown\" });\n } else if (allowedSet.has(name)) {\n listed.add(name);\n } else {\n ignored.push({ name, reason: \"channel\" });\n }\n }\n const types = allowed.filter((type) => listed.has(type));\n const written = [...types, ...ignored.map((entry) => entry.name)];\n return {\n types,\n ignored,\n normalized: written.length > 0 ? written.join(\",\") : null,\n };\n}\n\n/** The `types` URL parameter read as a filter: {@link readTypes}'s `types`. Empty means every type. */\nexport function parseTypes(\n raw: string | null,\n allowed: readonly EventName[],\n): EventName[] {\n return readTypes(raw, allowed).types;\n}\n\n/** Whether an event passes the type filter (empty: every type). */\nexport function matchesTypes(\n event: EventWire,\n types: readonly EventName[],\n): boolean {\n return types.length === 0 || types.includes(event.type);\n}\n"
|
|
6
6
|
],
|
|
7
7
|
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
8
|
+
"debugId": "B2DB5554BB9DB2CD64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|