@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.
Files changed (118) hide show
  1. package/dist/docs/assets/main-0rchxtv5.js +18 -0
  2. package/dist/docs/assets/{main-pgxtmtja.js.map → main-0rchxtv5.js.map} +1 -1
  3. package/dist/docs/manifest.json +5 -5
  4. package/dist/jobs/assets/AddFlowDialog-h6xkgx9b.js +6 -0
  5. package/dist/jobs/assets/{AddFlowDialog-0ec5ff4r.js.map → AddFlowDialog-h6xkgx9b.js.map} +1 -1
  6. package/dist/jobs/assets/added-cbwsxv3e.js +4 -0
  7. package/dist/jobs/assets/{added-ma7xb2dx.js.map → added-cbwsxv3e.js.map} +1 -1
  8. package/dist/jobs/assets/{channel-a5chwqet.js → channel-tgkvqm8y.js} +3 -3
  9. package/dist/jobs/assets/{channel-a5chwqet.js.map → channel-tgkvqm8y.js.map} +1 -1
  10. package/dist/jobs/assets/{channelChecks-1epbhv9a.js → channelChecks-s4yz4yhw.js} +3 -3
  11. package/dist/jobs/assets/{channelChecks-1epbhv9a.js.map → channelChecks-s4yz4yhw.js.map} +1 -1
  12. package/dist/jobs/assets/index-09z2cjft.js +4 -0
  13. package/dist/jobs/assets/{index-m7zk18cj.js.map → index-09z2cjft.js.map} +1 -1
  14. package/dist/jobs/assets/index-47pxmyxn.js +4 -0
  15. package/dist/jobs/assets/{index-c7qk888t.js.map → index-47pxmyxn.js.map} +1 -1
  16. package/dist/jobs/assets/index-4e55z986.js +4 -0
  17. package/dist/jobs/assets/{index-7kbae3pm.js.map → index-4e55z986.js.map} +1 -1
  18. package/dist/jobs/assets/index-5c933424.js +4 -0
  19. package/dist/jobs/assets/{index-xfq292gs.js.map → index-5c933424.js.map} +1 -1
  20. package/dist/jobs/assets/index-d5r5n0mm.js +4 -0
  21. package/dist/jobs/assets/{index-j3h4v03g.js.map → index-d5r5n0mm.js.map} +3 -3
  22. package/dist/jobs/assets/index-hs60b25v.js +10 -0
  23. package/dist/jobs/assets/{index-y5zw06cs.js.map → index-hs60b25v.js.map} +1 -1
  24. package/dist/jobs/assets/index-k2smrr70.js +4 -0
  25. package/dist/jobs/assets/{index-de1fgbgf.js.map → index-k2smrr70.js.map} +1 -1
  26. package/dist/jobs/assets/index-q24jw3w9.js +4 -0
  27. package/dist/jobs/assets/{index-pjtmzrcd.js.map → index-q24jw3w9.js.map} +1 -1
  28. package/dist/jobs/assets/index-rtynx6wj.js +4 -0
  29. package/dist/jobs/assets/{index-mykmd5cv.js.map → index-rtynx6wj.js.map} +1 -1
  30. package/dist/jobs/assets/{live-erz9pvnm.js → live-6k7s6358.js} +3 -3
  31. package/dist/jobs/assets/{live-erz9pvnm.js.map → live-6k7s6358.js.map} +1 -1
  32. package/dist/jobs/assets/{main-smabxbn4.js → main-0jmeh6mq.js} +4 -4
  33. package/dist/jobs/assets/{main-smabxbn4.js.map → main-0jmeh6mq.js.map} +1 -1
  34. package/dist/jobs/assets/main-3yj6bv90.js +5 -0
  35. package/dist/jobs/assets/{main-yg6scp84.js.map → main-3yj6bv90.js.map} +1 -1
  36. package/dist/jobs/assets/main-4g69fn3x.js +5 -0
  37. package/dist/jobs/assets/{main-v2f8a4g3.js.map → main-4g69fn3x.js.map} +1 -1
  38. package/dist/jobs/assets/{main-e8zsqez2.js → main-4gte3eqq.js} +4 -4
  39. package/dist/jobs/assets/{main-e8zsqez2.js.map → main-4gte3eqq.js.map} +1 -1
  40. package/dist/jobs/assets/{main-zk3n47nq.js → main-4j1fcevh.js} +3 -3
  41. package/dist/jobs/assets/{main-zk3n47nq.js.map → main-4j1fcevh.js.map} +1 -1
  42. package/dist/jobs/assets/main-5grjvsy7.js +5 -0
  43. package/dist/jobs/assets/{main-3xxhy5jh.js.map → main-5grjvsy7.js.map} +1 -1
  44. package/dist/jobs/assets/{main-gzppw8ng.js → main-5zbx60gq.js} +3 -3
  45. package/dist/jobs/assets/{main-gzppw8ng.js.map → main-5zbx60gq.js.map} +1 -1
  46. package/dist/jobs/assets/{main-zx20z2e9.js → main-9prgjhg4.js} +4 -4
  47. package/dist/jobs/assets/{main-zx20z2e9.js.map → main-9prgjhg4.js.map} +1 -1
  48. package/dist/jobs/assets/main-a250ffk7.js +17 -0
  49. package/dist/jobs/assets/{main-xf44bv26.js.map → main-a250ffk7.js.map} +4 -4
  50. package/dist/jobs/assets/{main-qahvywvw.js → main-d6ge7w08.js} +4 -4
  51. package/dist/jobs/assets/{main-qahvywvw.js.map → main-d6ge7w08.js.map} +1 -1
  52. package/dist/jobs/assets/{main-kjywj2zd.js → main-gngzht43.js} +3 -3
  53. package/dist/jobs/assets/{main-kjywj2zd.js.map → main-gngzht43.js.map} +1 -1
  54. package/dist/jobs/assets/main-hg0hrg8j.js +5 -0
  55. package/dist/jobs/assets/{main-yjykmsvp.js.map → main-hg0hrg8j.js.map} +1 -1
  56. package/dist/jobs/assets/main-hm1ng3yg.js +5 -0
  57. package/dist/jobs/assets/{main-9qd3nqs5.js.map → main-hm1ng3yg.js.map} +1 -1
  58. package/dist/jobs/assets/main-jkvd92z9.js +5 -0
  59. package/dist/jobs/assets/{main-fcq7hfk0.js.map → main-jkvd92z9.js.map} +1 -1
  60. package/dist/jobs/assets/main-jv5xqd13.js +5 -0
  61. package/dist/jobs/assets/{main-grcj8v1z.js.map → main-jv5xqd13.js.map} +7 -7
  62. package/dist/jobs/assets/main-jxre7w93.js +5 -0
  63. package/dist/jobs/assets/{main-47391fgm.js.map → main-jxre7w93.js.map} +4 -4
  64. package/dist/jobs/assets/{main-b35rfpdf.js → main-kwmqkjfx.js} +4 -4
  65. package/dist/jobs/assets/{main-b35rfpdf.js.map → main-kwmqkjfx.js.map} +1 -1
  66. package/dist/jobs/assets/main-n9cf6bxm.js +5 -0
  67. package/dist/jobs/assets/{main-vargz49c.js.map → main-n9cf6bxm.js.map} +1 -1
  68. package/dist/jobs/assets/{main-6xdkyzv1.js → main-pegp0ygb.js} +2 -2
  69. package/dist/jobs/assets/{main-2n5wnj51.js → main-qr573853.js} +3 -3
  70. package/dist/jobs/assets/{main-2n5wnj51.js.map → main-qr573853.js.map} +1 -1
  71. package/dist/jobs/assets/main-rq97rdr4.js +4 -0
  72. package/dist/jobs/assets/{main-7jzem39c.js.map → main-rq97rdr4.js.map} +1 -1
  73. package/dist/jobs/assets/main-szjdmydc.js +5 -0
  74. package/dist/jobs/assets/{main-pqke97qp.js.map → main-szjdmydc.js.map} +1 -1
  75. package/dist/jobs/assets/{main-jex4pqaa.js → main-tnbhrm9n.js} +5 -5
  76. package/dist/jobs/assets/{main-jex4pqaa.js.map → main-tnbhrm9n.js.map} +1 -1
  77. package/dist/jobs/assets/main-ts19j4n0.js +5 -0
  78. package/dist/jobs/assets/{main-eekxtm5w.js.map → main-ts19j4n0.js.map} +1 -1
  79. package/dist/jobs/assets/{main-fn8r2zyb.js → main-w93x1dzs.js} +4 -4
  80. package/dist/jobs/assets/{main-fn8r2zyb.js.map → main-w93x1dzs.js.map} +1 -1
  81. package/dist/jobs/assets/sections-0y7w4fb4.js +4 -0
  82. package/dist/jobs/assets/{sections-b570mm22.js.map → sections-0y7w4fb4.js.map} +1 -1
  83. package/dist/jobs/assets/{sse-42e8mhar.js → sse-mn0t0fh7.js} +4 -4
  84. package/dist/jobs/assets/{sse-42e8mhar.js.map → sse-mn0t0fh7.js.map} +1 -1
  85. package/dist/jobs/assets/{sseChecks-0jskzcs1.js → sseChecks-t7tcm7ra.js} +3 -3
  86. package/dist/jobs/assets/{sseChecks-0jskzcs1.js.map → sseChecks-t7tcm7ra.js.map} +1 -1
  87. package/dist/jobs/assets/validation-ysjfy072.js +4 -0
  88. package/dist/jobs/assets/{validation-199pberh.js.map → validation-ysjfy072.js.map} +1 -1
  89. package/dist/jobs/manifest.json +213 -213
  90. package/package.json +10 -6
  91. package/dist/docs/assets/main-pgxtmtja.js +0 -18
  92. package/dist/jobs/assets/AddFlowDialog-0ec5ff4r.js +0 -6
  93. package/dist/jobs/assets/added-ma7xb2dx.js +0 -4
  94. package/dist/jobs/assets/index-7kbae3pm.js +0 -4
  95. package/dist/jobs/assets/index-c7qk888t.js +0 -4
  96. package/dist/jobs/assets/index-de1fgbgf.js +0 -4
  97. package/dist/jobs/assets/index-j3h4v03g.js +0 -4
  98. package/dist/jobs/assets/index-m7zk18cj.js +0 -4
  99. package/dist/jobs/assets/index-mykmd5cv.js +0 -4
  100. package/dist/jobs/assets/index-pjtmzrcd.js +0 -4
  101. package/dist/jobs/assets/index-xfq292gs.js +0 -4
  102. package/dist/jobs/assets/index-y5zw06cs.js +0 -10
  103. package/dist/jobs/assets/main-3xxhy5jh.js +0 -5
  104. package/dist/jobs/assets/main-47391fgm.js +0 -5
  105. package/dist/jobs/assets/main-7jzem39c.js +0 -4
  106. package/dist/jobs/assets/main-9qd3nqs5.js +0 -5
  107. package/dist/jobs/assets/main-eekxtm5w.js +0 -5
  108. package/dist/jobs/assets/main-fcq7hfk0.js +0 -5
  109. package/dist/jobs/assets/main-grcj8v1z.js +0 -5
  110. package/dist/jobs/assets/main-pqke97qp.js +0 -5
  111. package/dist/jobs/assets/main-v2f8a4g3.js +0 -5
  112. package/dist/jobs/assets/main-vargz49c.js +0 -5
  113. package/dist/jobs/assets/main-xf44bv26.js +0 -17
  114. package/dist/jobs/assets/main-yg6scp84.js +0 -5
  115. package/dist/jobs/assets/main-yjykmsvp.js +0 -5
  116. package/dist/jobs/assets/sections-b570mm22.js +0 -4
  117. package/dist/jobs/assets/validation-199pberh.js +0 -4
  118. /package/dist/jobs/assets/{main-6xdkyzv1.js.map → main-pegp0ygb.js.map} +0 -0
@@ -0,0 +1,4 @@
1
+ import{v,c,T,r,_t,Dn,Re,It,b,P,n,e,t,f,i,m,J,a,_,s,oe,p,pe,Ke,ce,o,z,h,l,V,S,w,I,le}from"./main-a250ffk7.js";import{U}from"./main-hg0hrg8j.js";import{O}from"./main-4j1fcevh.js";import{A}from"./main-0jmeh6mq.js";import{D}from"./main-hm1ng3yg.js";import{F}from"./main-pegp0ygb.js";var He=1000;function Te(d){return Math.max(1,Math.min(He,d))}function fe(d){return[..._.queue(d),"job-defaults"]}function ve(d,u=""){return`/queues/${P(d)}/job-defaults${u}`}function Ve(d){return Ke(d,"queue")&&typeof d.seq==="number"&&Array.isArray(d.overridden)&&typeof d.effective==="object"&&d.effective!==null&&typeof d.code==="object"&&d.code!==null&&typeof d.pending==="object"&&d.pending!==null}async function me(d,u,y){let x=ve(u),j=await d.request("GET",x,{signal:y});return pe(j,Ve,"job defaults",x)}function Be(d,u,y){return d.request("PUT",ve(u),{body:y})}function Oe(d,u,y){return d.request("DELETE",ve(u),{query:{expectedSeq:y}})}function Ce(d,u,y){return d.request("POST",ve(u,"/apply"),{body:y})}function Ae(){return{examined:0,rewritten:0,unchanged:0,skippedExplicit:0,skippedUnmarked:0,moved:0,exhausted:0,batches:0}}function We(d,u){return{examined:d.examined+u.examined,rewritten:d.rewritten+u.rewritten,unchanged:d.unchanged+u.unchanged,skippedExplicit:d.skippedExplicit+u.skippedExplicit,skippedUnmarked:d.skippedUnmarked+u.skippedUnmarked,moved:d.moved+u.moved,exhausted:d.exhausted+u.exhausted,batches:d.batches+1}}async function Ne(d){let u=d.cursor,y=d.totals??Ae(),x=!0;for(;;){if(!x&&u!==void 0&&d.shouldStop())return{status:"cancelled",totals:y,cursor:u};x=!1;let j;try{j=await d.request(u)}catch(R){return{status:"failed",totals:y,cursor:u,error:R}}if(y=We(y,j),d.onBatch?.(y,j),j.done||j.next===null)return{status:"done",totals:y};if(j.next===u)return{status:"failed",totals:y,cursor:u,error:Error("The API answered the same cursor it was sent, so the walk would never end.")};u=j.next}}var be={attempts:"number",backoff:"backoff",timeout:"number",priority:"number",removeOnComplete:"retention",removeOnFail:"retention",keepLogs:"number",keepStacktraces:"number"},W={attempts:{label:"Attempts",hint:"How many times a job runs before it is dead, the first run included."},backoff:{label:"Backoff",hint:"How long a failed job waits before its next attempt."},timeout:{label:"Timeout (ms)",hint:"How long one attempt may run before it fails; 0 means no timeout."},priority:{label:"Priority",hint:"Lower runs first."},removeOnComplete:{label:"Completed jobs",hint:"How long a completed job is kept."},removeOnFail:{label:"Dead jobs",hint:"How long a job that ran out of attempts is kept."},keepLogs:{label:"Log lines kept",hint:"The newest log lines each job keeps."},keepStacktraces:{label:"Stack traces kept",hint:"The failure stack traces each job keeps."}};function je(d){return Re[d]}var De="code";function Qe(d){return Dn.includes(d)}function Xe(d){if(typeof d==="number")return{type:"fixed",delay:d,max:void 0,jitter:void 0};return{type:Qe(d.type)?d.type:"fixed",delay:d.delay,max:d.max,jitter:typeof d.jitter==="number"?d.jitter:void 0}}function ze(d){if(d===!0)return{mode:"remove",count:void 0,ttl:void 0};if(d===!1)return{mode:"keep",count:void 0,ttl:void 0};if(typeof d==="number")return{mode:"limit",count:d,ttl:void 0};return{mode:"limit",count:d.count,ttl:d.ttl}}function Pe(d,u){let y=be[d];if(y==="backoff")return Xe(u);if(y==="retention")return ze(u);return u}function ge(d,u,y){if(d===void 0)return`Enter ${y}.`;if(!Number.isInteger(d)||d<u.min||d>u.max)return`${Ge(y)} must be a whole number from ${o(u.min)} to ${o(u.max)}.`;return}function Ge(d){return d.charAt(0).toUpperCase()+d.slice(1)}function Ze(d){let u=ge(d.delay,Re.backoffDelay,"a delay");if(u)return{error:u};let y=d.delay;if(d.max!==void 0){let j=ge(d.max,Re.backoffMax,"the longest delay");if(j)return{error:j};if(d.max<y)return{error:"The longest delay must be at least the delay."}}let x=Re.backoffJitter;if(d.jitter!==void 0&&!(d.jitter>=x.min&&d.jitter<=x.max))return{error:`Jitter must be from ${x.min} to ${x.max}.`};return{value:{type:d.type,delay:y,...d.max===void 0?{}:{max:d.max},...d.jitter===void 0?{}:{jitter:d.jitter}}}}function et(d){if(d.mode==="keep")return{value:!1};if(d.mode==="remove")return{value:!0};if(d.count===void 0&&d.ttl===void 0)return{error:"Enter a count, an age, or both."};if(d.count!==void 0){let u=ge(d.count,Re.retentionCount,"the count");if(u)return{error:u}}if(d.ttl!==void 0){let u=ge(d.ttl,Re.retentionTtl,"the age");if(u)return{error:u}}return{value:{...d.count===void 0?{}:{count:d.count},...d.ttl===void 0?{}:{ttl:d.ttl}}}}function tt(d,u){let y=be[d];if(y==="backoff")return Ze(u);if(y==="retention")return et(u);let x=ge(u,je(d),"a value");return x?{error:x}:{value:u}}function Se(d,u){let y=u;if(be[d]==="backoff"&&typeof u==="number")y={type:"fixed",delay:u};else if(be[d]==="retention"&&typeof u==="number")y={count:u};if(typeof y==="object"&&y!==null){let x=y;return JSON.stringify(Object.fromEntries(Object.keys(x).filter((j)=>x[j]!==void 0).sort().map((j)=>[j,x[j]])))}return JSON.stringify(y)}function _e(d,u){let y={},x=y,j=[],R={};for(let k of _t){if(!(k in u))continue;let B=u[k];if(B===De){if(d.overridden.includes(k))x[k]=null,j.push(k);continue}let L=tt(k,B);if("error"in L){R[k]=L.error;continue}if(Se(k,L.value)!==Se(k,d.effective[k]))x[k]=L.value,j.push(k)}return y.expectedSeq=d.seq,{body:y,changed:j,errors:R}}function ot(d){if(d===!0)return"removed at once";if(d===!1)return"kept forever";if(typeof d==="number")return`the newest ${o(d)} kept`;let u=[d.count!==void 0&&`the newest ${o(d.count)}`,d.ttl!==void 0&&`for ${U(d.ttl)}`].filter(Boolean);return u.length>0?`kept: ${u.join(", ")}`:"kept forever"}function nt(d){if(typeof d==="number")return d===0?"none":`fixed, ${U(d)}`;return[`${d.type??"fixed"}, ${U(d.delay??0)}`,d.max!==void 0&&`at most ${U(d.max)}`,d.jitter===!0&&"jitter",typeof d.jitter==="number"&&d.jitter>0&&`${Math.round(d.jitter*100)}% jitter`].filter(Boolean).join(", ")}function re(d,u){if(u===void 0||u===null)return"—";switch(d){case"backoff":return nt(u);case"removeOnComplete":case"removeOnFail":return ot(u);case"timeout":return u===0?"none":U(u);case"keepLogs":return u===0?"every line":o(u);default:return o(u)}}var ke="“Code” is what this API's own service is configured with. A producer in another service may be configured differently; a stored value replaces them all alike.",$e="Resetting changes jobs added from now on. It cannot restore jobs already rewritten by Apply to pending jobs: they keep the values written to them.",Le="This rewrites the jobs in place and cannot be undone: their previous values are not kept, so a later reset does not restore them.",Fe="Jobs added before this version of bun-jobs did not record which options their add() passed explicitly. Left unticked, they are skipped and counted. Ticked, every option of theirs is treated as a default, so a value their add() did pass may be replaced.",Ue="Attempts is being lowered. A job that has already made at least the new number of attempts is not dropped: it gets ONE final attempt, and dies if that fails.";function rt(d){return d.overridden.includes("attempts")&&d.effective.attempts<d.code.attempts}function Ie({queue:d,defaults:u,onClose:y}){let x=i(),j=m(),R=J(),[k,B]=r(u),[L,C]=r(It),[N,Q]=r(!1),[g,H]=r({kind:"confirm"}),[te,xe]=r(!1),[G,ae]=r(null),M=T(!1);v(()=>()=>{M.current=!0},[]);let he=g.kind==="running",ie=It.filter((K)=>L.includes(K)),ne=ie.reduce((K,q)=>K+k.pending[q],0),X=g.kind==="confirm"?g.preview:void 0,Ee=rt(k)||X!==void 0&&X.outcome.totals.exhausted>0,E=async(K,q)=>{M.current=!1;let ye=q?.totals??Ae();H({kind:"running",dryRun:K,totals:ye,stopping:!1});let ee=await Ne({cursor:q?.cursor,totals:ye,request:(de)=>{let ue={seq:k.seq,states:[...ie],limit:Te(j.limits.maxApplyDefaults),dryRun:K,includeUnmarked:N};if(de!==void 0)ue.cursor=de;return Ce(x,d,ue)},onBatch:(de)=>H((ue)=>ue.kind==="running"?{...ue,totals:de}:ue),shouldStop:()=>M.current});if(!K&&ee.totals.batches>0)for(let de of ce(d))R.invalidateQueries({queryKey:de});if(ee.status==="failed"&&b(ee.error)&&ee.error.code==="DEFAULTS_CHANGED"){H({kind:"conflict",dryRun:K,totals:ee.totals});return}let Je={kind:"finished",dryRun:K,outcome:ee};H(K&&ee.status==="done"?{kind:"confirm",preview:Je}:Je)},Y=async()=>{xe(!0),ae(null);try{let K=await me(x,d);R.setQueryData(fe(d),K),B(K),H({kind:"confirm"})}catch(K){ae(K)}finally{xe(!1)}},Z=(K,q)=>C((ye)=>q?[...ye,K]:ye.filter((ee)=>ee!==K)),se=k.overridden.length===0,we=`Apply to ${o(ne)} pending ${ne===1?"job":"jobs"}`;return t(oe,{open:!0,onClose:y,closeOnEscape:!he,closeOnBackdrop:!he,showCloseButton:!he,size:"lg",role:"alertdialog",title:`Apply the job defaults of ${d} to pending jobs?`,description:Le,footer:g.kind==="confirm"?t(n,{children:[e(s,{onClick:y,children:"Cancel"}),e(s,{onClick:()=>void E(!0),disabled:ie.length===0||se,children:X?"Preview again":"Preview (dry run)"}),e(s,{variant:"danger",onClick:()=>void E(!1),disabled:ie.length===0||se,children:we})]}):g.kind==="running"?e(s,{onClick:()=>{M.current=!0,H({...g,stopping:!0})},disabled:g.stopping,children:g.stopping?"Stopping after this batch…":"Cancel"}):t(n,{children:[g.kind==="finished"&&g.outcome.status!=="done"&&e(s,{onClick:()=>{let{outcome:K}=g;if(K.status!=="done")E(g.dryRun,{cursor:K.cursor,totals:K.totals})},children:"Continue from where it stopped"}),e(s,{variant:"primary",onClick:y,children:"Close"})]}),children:[g.kind==="confirm"&&t(n,{children:[t("p",{children:["Writes, into each pending job whose own ",e("code",{children:"add()"})," did not pass it:"]}),e("ul",{className:"job-defaults-apply-keys","aria-label":"Values written",children:k.overridden.map((K)=>t("li",{children:[W[K].label,":"," ",re(K,k.effective[K])]},K))}),se&&e("p",{role:"alert",children:"Nothing is overridden, so there is nothing to apply."}),t("fieldset",{className:"job-defaults-apply-states",children:[e("legend",{children:"States"}),It.map((K)=>e(w,{label:`${z[K]} (${o(k.pending[K])})`,checked:L.includes(K),onChange:(q)=>Z(K,q)},K)),ie.length===0&&e("p",{className:"field-error",children:"Tick at least one state."})]}),e(w,{label:"Include jobs added before this version",hint:Fe,checked:N,onChange:Q}),t("p",{className:"muted",children:[h(ne,"pending job")," is an upper bound: jobs that passed these options explicitly, or were added before this version, are counted in it and left alone. Run a preview for the exact figure. Active, completed and dead jobs are never touched."]}),k.overridden.includes("priority")&&e("p",{className:"muted",children:"Changing priority re-sorts the backlog: until the walk ends, some jobs are re-sorted and others not yet."}),Ee&&t("p",{className:"job-defaults-warning","data-testid":"exhausted-warning",children:[Ue,X!==void 0&&X.outcome.totals.exhausted>0&&t(n,{children:[" ","The preview found"," ",h(X.outcome.totals.exhausted,"such job"),"."]})]}),X&&t("section",{"aria-label":"Preview",className:"job-defaults-preview",children:[e("h3",{children:"Preview: nothing was written"}),e(Me,{totals:X.outcome.totals,dryRun:!0})]})]}),g.kind==="running"&&t("div",{role:"status","aria-live":"polite","data-testid":"apply-progress",children:[t("p",{children:[g.dryRun?"Previewing":"Applying","… examined"," ",o(g.totals.examined)," of about"," ",o(ne),";"," ",g.dryRun?"would rewrite":"rewritten"," ",o(g.totals.rewritten)," so far (",h(g.totals.batches,"batch","batches"),")."]}),e("progress",{max:Math.max(ne,g.totals.examined,1),value:g.totals.examined,"aria-label":"Jobs examined"})]}),g.kind==="finished"&&e(at,{dryRun:g.dryRun,outcome:g.outcome}),g.kind==="conflict"&&t("div",{role:"alert",children:[t("p",{children:["The job defaults changed since you confirmed them — someone saved or reset them. Nothing more was"," ",g.dryRun?"previewed":"applied",".",!g.dryRun&&g.totals.rewritten>0&&` ${h(g.totals.rewritten,"job")} had already been rewritten with the values you confirmed.`," ","Re-read them, check them, and apply again."]}),G!==null&&e(D,{error:G}),e(s,{onClick:()=>void Y(),disabled:te,"aria-busy":te||void 0,children:te?"Re-reading…":"Re-read the defaults"})]})]})}function at({dryRun:d,outcome:u}){let y=d?"Previewed":"Applied";return t("div",{"data-testid":"apply-result",children:[u.status==="done"&&t("p",{role:"status",children:[y," to every pending job in the chosen states."]}),u.status==="cancelled"&&t("p",{role:"status",children:["Stopped after ",h(u.totals.batches,"batch","batches"),". The jobs not reached yet keep their values; apply again to continue."]}),u.status==="failed"&&e(D,{error:u.error,title:`Stopped: a batch failed after ${h(u.totals.batches,"batch","batches")}`}),e(Me,{totals:u.totals,dryRun:d})]})}function Me({totals:d,dryRun:u}){return t(n,{children:[e(F,{className:"job-defaults-result",items:[{label:"Examined",value:o(d.examined)},{label:u?"Would be rewritten":"Rewritten",value:o(d.rewritten)},{label:"Unchanged",value:o(d.unchanged)},{label:"Skipped as explicit",value:o(d.skippedExplicit),hint:"their own add() passed every value that would change"},{label:"Skipped, added before this version",value:o(d.skippedUnmarked)},{label:"Moved",value:o(d.moved),hint:"left the chosen states before their write; at least this many"},{label:"Exhausted",value:o(d.exhausted),hint:"part of rewritten: already at the new attempts, so one final attempt each"}]}),d.exhausted>0&&t("p",{className:"job-defaults-warning",children:[h(d.exhausted,"job")," ",u?"would get":"got"," one final attempt: each has already made at least the new number of attempts, and dies if that attempt fails."]})]})}var it=new Set(["CONTROL_CONTENDED","DEFAULTS_CHANGED"]);function Ye(d){return`Producers pick this up within about ${U(d.propagationMs)}.`}function qe({queue:d,defaults:u,onClose:y}){let x=i(),j=J(),[R,k]=r(u),[B,L]=r({}),[C,N]=r(null),[Q,g]=r(!1),H=c(),te=_e(R,B),xe=Object.keys(te.errors).length>0,G=O({mutationFn:()=>Be(x,d,te.body),invalidate:ce(d),successMessage:(E)=>`Saved the job defaults of ${d}. ${Ye(E)}`,toastErrors:!1,onSuccess:y,onError:N}),ae=O({mutationFn:()=>Oe(x,d,R.seq),invalidate:ce(d),successMessage:(E)=>`Reset the job defaults of ${d} to the code values. ${Ye(E)}`,toastErrors:!1,onSuccess:y,onError:N}),M=G.isPending||ae.isPending||Q,he=b(C)&&it.has(C.code),ie=async()=>{g(!0);try{let E=await me(x,d);j.setQueryData(fe(d),E),k(E),L({}),N(null)}catch(E){N(E)}finally{g(!1)}},ne=(E,Y)=>L((Z)=>({...Z,[E]:Y})),X=(E)=>L((Y)=>{let Z={...Y};return delete Z[E],Z}),Ee=(E)=>{let Y=B[E];return Y!==void 0&&Y!==De?Y:Pe(E,R.effective[E])};return t(oe,{open:!0,onClose:y,closeOnEscape:!M,closeOnBackdrop:!M,size:"lg",title:`Job defaults of ${d}`,description:t(n,{children:["What a job added to ",e("code",{children:d})," gets for an option its"," ",e("code",{children:"add()"})," does not pass. A stored value here beats the code’s defaults, ",e("code",{children:"define()"})," defaults included; only an option passed explicitly on ",e("code",{children:"add()"})," wins. Saving changes jobs added from now on; jobs already waiting keep their values unless you apply the defaults to them."]}),footer:t(n,{children:[e(s,{onClick:y,disabled:M,children:"Cancel"}),e(s,{variant:"primary",onClick:()=>{N(null),G.mutate()},disabled:M||xe||te.changed.length===0,"aria-busy":G.isPending||void 0,children:G.isPending?"Saving…":"Save defaults"})]}),children:[C!==null&&(he?t("div",{className:"job-defaults-conflict",role:"alert",children:[e("p",{children:"The job defaults changed since you opened them — someone else saved or reset them. Nothing was saved. Re-read them, then make your change again."}),e(s,{size:"sm",onClick:()=>void ie(),disabled:Q,"aria-busy":Q||void 0,children:Q?"Re-reading…":"Re-read the defaults"})]}):e(D,{error:C,title:"Could not save the job defaults"})),e("p",{className:"job-defaults-note muted",children:ke}),e("div",{className:"job-defaults-form",children:_t.map((E)=>{let Y=R.overridden.includes(E),Z=B[E]===De,se=re(E,R.code[E]),we=G.fieldErrors[E]??Object.entries(G.fieldErrors).find(([q])=>q.startsWith(`${E}.`))?.[1],K=te.errors[E]??we;return t("fieldset",{className:"job-defaults-row","data-testid":`job-default-${E}`,children:[t("legend",{children:[W[E].label," ",Y&&e(f,{tone:"accent",children:"Overridden"})]}),t("p",{className:"job-defaults-values muted",children:["Now: ",re(E,R.effective[E])," · Code:"," ",se]}),Z?t("p",{className:"job-defaults-uses-code",children:["Will use the code value (",se,") once saved."," ",e(s,{size:"sm",variant:"ghost",onClick:()=>X(E),disabled:M,children:"Keep the stored value"})]}):e(st,{keyName:E,value:Ee(E),onChange:(q)=>ne(E,q),error:K}),Y&&!Z&&e(s,{size:"sm",onClick:()=>ne(E,De),disabled:M,children:"Use code value"})]},E)})}),R.overridden.length>0&&t("div",{className:"job-defaults-reset",children:[e(s,{variant:"danger",onClick:()=>{N(null),ae.mutate()},disabled:M,"aria-busy":ae.isPending||void 0,"aria-describedby":H,children:ae.isPending?"Resetting…":"Reset to code values"}),e("p",{id:H,className:"job-defaults-reset-note",children:$e})]})]})}function st({keyName:d,value:u,onChange:y,error:x}){let j=be[d];if(j==="backoff")return e(lt,{value:u,onChange:y,error:x});if(j==="retention")return e(ut,{label:W[d].label,hint:W[d].hint,value:u,onChange:y,error:x});let R=je(d);return e(l,{label:W[d].label,hint:`${W[d].hint} ${R.min}–${R.max}.`,error:x,children:e(V,{value:u,min:R.min,max:R.max,onChange:y})})}function lt({value:d,onChange:u,error:y}){let x=Re.backoffDelay,j=Re.backoffMax,R=Re.backoffJitter;return t("div",{className:"field-row job-defaults-backoff",children:[e(l,{label:"Backoff strategy",hint:"Fixed waits the delay every time; exponential doubles it after each attempt. Other strategies can be set only in code.",children:e(S,{options:Dn.map((k)=>({value:k})),value:d.type,onChange:(k)=>u({...d,type:k})})}),e(l,{label:"Backoff delay (ms)",hint:`${x.min}–${x.max}.`,error:y,children:e(V,{value:d.delay,min:x.min,max:x.max,onChange:(k)=>u({...d,delay:k})})}),e(l,{label:"Backoff longest delay (ms)",hint:`Optional, at least the delay; empty means uncapped. Up to ${j.max}.`,children:e(V,{value:d.max,min:j.min,max:j.max,onChange:(k)=>u({...d,max:k})})}),e(l,{label:"Backoff jitter",hint:`Optional fraction of each delay randomised, ${R.min}–${R.max}.`,children:e(V,{value:d.jitter,min:R.min,max:R.max,step:"any",onChange:(k)=>u({...d,jitter:k})})})]})}var dt=[{value:"keep",label:"Keep forever"},{value:"limit",label:"Keep the newest, or for a while"},{value:"remove",label:"Remove at once"}];function ut({label:d,hint:u,value:y,onChange:x,error:j}){let R=Re.retentionCount,k=Re.retentionTtl;return t("div",{className:"field-row job-defaults-retention",children:[e(l,{label:d,hint:y.mode==="remove"?`${u} Removing at once discards every result (or failure) as the job settles.`:u,error:y.mode==="limit"?void 0:j,children:e(S,{options:dt,value:y.mode,onChange:(B)=>x({...y,mode:B})})}),y.mode==="limit"&&t(n,{children:[e(l,{label:`${d}: most kept`,hint:`Optional, ${R.min}–${R.max}.`,error:j,children:e(V,{value:y.count,min:R.min,max:R.max,onChange:(B)=>x({...y,count:B})})}),e(l,{label:`${d}: kept for (ms)`,hint:`Optional, up to ${k.max} (a year).`,children:e(V,{value:y.ttl,min:k.min,max:k.max,onChange:(B)=>x({...y,ttl:B})})})]})]})}function ft({queue:d,canEdit:u,canApply:y}){let x=i(),j=le("counts"),[R,k]=r(null),B=a({queryKey:fe(d),queryFn:({signal:g})=>me(x,d,g),refetchInterval:R===null?j:!1}),L=()=>k(null);if(B.data===void 0)return B.isError?e(D,{error:B.error,title:"Could not load the job defaults",onRetry:()=>void B.refetch()}):e(p,{label:"Loading the job defaults",showLabel:!0});let C=B.data,{total:N}=C.pending,Q=C.overridden.length===0;return t("div",{className:"job-defaults","data-testid":"job-defaults-panel",children:[t("p",{children:["What a job added to this queue gets for an option its ",e("code",{children:"add()"})," ","does not pass. A stored override beats the code’s defaults and"," ",e("code",{children:"define()"})," defaults; only an option passed explicitly on"," ",e("code",{children:"add()"})," wins. A change reaches producers within about"," ",U(C.propagationMs),"."]}),t(I,{label:"Job defaults",children:[e("thead",{children:t("tr",{children:[e("th",{scope:"col",children:"Option"}),e("th",{scope:"col",children:"A job gets"}),e("th",{scope:"col",children:"Code"}),e("th",{scope:"col",children:"Override"})]})}),e("tbody",{children:_t.map((g)=>{let H=C.overridden.includes(g);return t("tr",{"data-testid":`job-default-row-${g}`,children:[e("th",{scope:"row",title:W[g].hint,children:W[g].label}),e("td",{children:re(g,C.effective[g])}),e("td",{children:re(g,C.code[g])}),e("td",{children:H?e(f,{tone:"accent",children:"Overridden"}):e("span",{className:"muted",children:"code value"})})]},g)})})]}),t("p",{className:"muted job-defaults-note",children:[ke,C.updatedAt!==void 0&&t(n,{children:[" ","Last changed ",e(A,{value:C.updatedAt}),"."]})]}),e("h3",{className:"job-defaults-heading",children:"Pending jobs"}),e(F,{className:"job-defaults-pending",items:[...It.map((g)=>({key:g,label:z[g],value:o(C.pending[g])})),{key:"total",label:"Total",value:o(N)}]}),e("p",{className:"muted",children:"Pending jobs keep the values they were added with: saving changes only jobs added afterwards. Applying the defaults to them is a separate action."}),t("div",{className:"form-actions",children:[u&&e(s,{onClick:()=>k("settings"),children:"Settings…"}),y&&!Q&&N>0&&t(s,{variant:"danger",onClick:()=>k("apply"),children:["Apply to ",o(N)," pending"," ",N===1?"job":"jobs","…"]})]}),y&&(Q||N===0)&&e("p",{className:"muted","data-testid":"apply-unavailable",children:Q?"Nothing is overridden, so there is nothing to apply to pending jobs.":"No jobs are pending in the states the defaults can be applied to."}),R==="settings"&&e(qe,{queue:d,defaults:C,onClose:L}),R==="apply"&&e(Ie,{queue:d,defaults:C,onClose:L})]})}export{ft as JobDefaultsPanel};
2
+
3
+ //# debugId=BA9076DA5653324964756E2164756E21
4
+ //# sourceMappingURL=index-09z2cjft.js.map
@@ -11,6 +11,6 @@
11
11
  "import { useQuery } from \"@tanstack/react-query\";\nimport { useState } from \"react\";\nimport {\n JOB_DEFAULT_KEYS,\n JOB_DEFAULTS_APPLY_STATES,\n} from \"../../../../api/contract\";\nimport { getJobDefaults, jobDefaultsKey } from \"../../../../api/jobDefaults\";\nimport { Badge } from \"../../../../components/Badge\";\nimport { Button } from \"../../../../components/Button\";\nimport { KeyValue } from \"../../../../components/KeyValue\";\nimport { ProblemBanner } from \"../../../../components/ProblemBanner\";\nimport { RelativeTime } from \"../../../../components/RelativeTime\";\nimport { Spinner } from \"../../../../components/Spinner\";\nimport { Table } from \"../../../../components/Table\";\nimport { useApiClient } from \"../../../../context\";\nimport { formatNumber, STATE_LABELS } from \"../../../../format\";\nimport { formatMs } from \"../../duration\";\nimport { useRefreshInterval } from \"../../live\";\nimport { ApplyDefaultsDialog } from \"./ApplyDefaultsDialog\";\nimport { describeValue, KEY_TEXT } from \"./draft\";\nimport { JobDefaultsDialog } from \"./JobDefaultsDialog\";\nimport { CODE_SOURCE_HINT } from \"./text\";\nimport \"./jobDefaults.css\";\n\n/** Props of {@link JobDefaultsPanel}. */\nexport interface JobDefaultsPanelProps {\n /** The queue. */\n queue: string;\n /** Whether Settings… is offered: mutation `queues.defaults`. */\n canEdit: boolean;\n /** Whether Apply to pending jobs… is offered: mutation `queues.applyDefaults`. Independent of `canEdit`. */\n canApply: boolean;\n}\n\n/** Which dialog is open. */\ntype OpenDialog = \"settings\" | \"apply\" | null;\n\n/**\n * A queue's job defaults: a read-only table of every option — what a job\n * added now gets, what the code asks for, and the stored override — with the\n * jobs pending in the states the apply action rewrites, and, when permitted,\n * Settings… (edit) and Apply to N pending jobs… (a separate action).\n */\nexport function JobDefaultsPanel({\n queue,\n canEdit,\n canApply,\n}: JobDefaultsPanelProps) {\n const api = useApiClient();\n const interval = useRefreshInterval(\"counts\");\n const [open, setOpen] = useState<OpenDialog>(null);\n const read = useQuery({\n queryKey: jobDefaultsKey(queue),\n queryFn: ({ signal }) => getJobDefaults(api, queue, signal),\n // The pending counts move with the queue; the defaults themselves change\n // only by a save, after which the key is invalidated.\n refetchInterval: open === null ? interval : false,\n });\n // The dialog returns focus to the button that opened it.\n const close = () => setOpen(null);\n\n if (read.data === undefined) {\n return read.isError ? (\n <ProblemBanner\n error={read.error}\n title=\"Could not load the job defaults\"\n onRetry={() => void read.refetch()}\n />\n ) : (\n <Spinner\n label=\"Loading the job defaults\"\n showLabel\n />\n );\n }\n const defaults = read.data;\n const { total } = defaults.pending;\n const nothingOverridden = defaults.overridden.length === 0;\n\n return (\n <div\n className=\"job-defaults\"\n data-testid=\"job-defaults-panel\"\n >\n <p>\n What a job added to this queue gets for an option its <code>add()</code>{\" \"}\n does not pass. A stored override beats the code&rsquo;s defaults and{\" \"}\n <code>define()</code> defaults; only an option passed explicitly on{\" \"}\n <code>add()</code> wins. A change reaches producers within about{\" \"}\n {formatMs(defaults.propagationMs)}.\n </p>\n <Table label=\"Job defaults\">\n <thead>\n <tr>\n <th scope=\"col\">Option</th>\n <th scope=\"col\">A job gets</th>\n <th scope=\"col\">Code</th>\n <th scope=\"col\">Override</th>\n </tr>\n </thead>\n <tbody>\n {JOB_DEFAULT_KEYS.map((key) => {\n const overridden = defaults.overridden.includes(key);\n return (\n <tr\n key={key}\n data-testid={`job-default-row-${key}`}\n >\n <th\n scope=\"row\"\n title={KEY_TEXT[key].hint}\n >\n {KEY_TEXT[key].label}\n </th>\n <td>{describeValue(key, defaults.effective[key])}</td>\n <td>{describeValue(key, defaults.code[key])}</td>\n <td>\n {overridden ? (\n <Badge tone=\"accent\">Overridden</Badge>\n ) : (\n <span className=\"muted\">code value</span>\n )}\n </td>\n </tr>\n );\n })}\n </tbody>\n </Table>\n <p className=\"muted job-defaults-note\">\n {CODE_SOURCE_HINT}\n {defaults.updatedAt !== undefined && (\n <>\n {\" \"}\n Last changed <RelativeTime value={defaults.updatedAt} />.\n </>\n )}\n </p>\n <h3 className=\"job-defaults-heading\">Pending jobs</h3>\n <KeyValue\n className=\"job-defaults-pending\"\n items={[\n ...JOB_DEFAULTS_APPLY_STATES.map((state) => ({\n key: state,\n label: STATE_LABELS[state],\n value: formatNumber(defaults.pending[state]),\n })),\n { key: \"total\", label: \"Total\", value: formatNumber(total) },\n ]}\n />\n <p className=\"muted\">\n Pending jobs keep the values they were added with: saving changes only\n jobs added afterwards. Applying the defaults to them is a separate\n action.\n </p>\n <div className=\"form-actions\">\n {canEdit && (\n <Button onClick={() => setOpen(\"settings\")}>Settings…</Button>\n )}\n {canApply && !nothingOverridden && total > 0 && (\n <Button\n variant=\"danger\"\n onClick={() => setOpen(\"apply\")}\n >\n Apply to {formatNumber(total)} pending{\" \"}\n {total === 1 ? \"job\" : \"jobs\"}…\n </Button>\n )}\n </div>\n {canApply && (nothingOverridden || total === 0) && (\n <p\n className=\"muted\"\n data-testid=\"apply-unavailable\"\n >\n {nothingOverridden\n ? \"Nothing is overridden, so there is nothing to apply to pending jobs.\"\n : \"No jobs are pending in the states the defaults can be applied to.\"}\n </p>\n )}\n {open === \"settings\" && (\n <JobDefaultsDialog\n queue={queue}\n defaults={defaults}\n onClose={close}\n />\n )}\n {open === \"apply\" && (\n <ApplyDefaultsDialog\n queue={queue}\n defaults={defaults}\n onClose={close}\n />\n )}\n </div>\n );\n}\n"
12
12
  ],
13
13
  "mappings": "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",
14
- "debugId": "8AF8D5D01E21347864756E2164756E21",
14
+ "debugId": "BA9076DA5653324964756E2164756E21",
15
15
  "names": []
16
16
  }
@@ -0,0 +1,4 @@
1
+ import{C,v,T,r,n,e,t,f,i,m,y,a,_,s,E,dr,rt,d,Cn,Ve,R,o,h,l,M,S,w,I}from"./main-a250ffk7.js";import{Mn,Or,Ar,co,Rr,mo,Dr,At,Vt,fo,po}from"./main-4gte3eqq.js";import{he,mt,cn}from"./main-gngzht43.js";import{W}from"./main-3yj6bv90.js";import{Jo,Yo}from"./main-w93x1dzs.js";import{ae}from"./main-d6ge7w08.js";import"./main-5grjvsy7.js";var le={all:"Everything (all)",queues:"Every queue (queues)",queue:"One queue",job:"One job",runners:"Every runner (runners)",runner:"One runner",workers:"Every worker (workers)",queueWorkers:"One queue's workers"},U=new Set(["all","queues","runners","workers"]);function ie(u){return{scope:u.scope,queue:u.scope==="queue"||u.scope==="job"||u.scope==="queueWorkers"?u.queue:"",runner:u.scope==="runner"?u.runner:"",id:u.scope==="job"?u.id:""}}function X(u){switch(u.scope){case"all":case"queues":case"runners":case"workers":return{scope:u.scope};case"queueWorkers":return u.queue?{scope:"queueWorkers",queue:u.queue}:null;case"queue":return u.queue?{scope:"queue",queue:u.queue}:null;case"runner":return u.runner?{scope:"runner",runner:u.runner}:null;case"job":return u.queue&&u.id?{scope:"job",queue:u.queue,id:u.id}:null}}function V({label:u,value:c,names:g,onChange:N}){return e(l,{label:u,children:g&&g.length>0?e(S,{options:[{value:"",label:"Choose…"},...g.map((q)=>({value:q}))],value:g.includes(c)?c:"",onChange:N}):e(M,{value:c,onChange:N,maxLength:200,autoComplete:"off",spellCheck:!1})})}function ue({choice:u,onApply:c}){let g=i(),N=m(),q=y("queues.list"),A=y("runners.list"),[k,L]=r(()=>ie(u)),B=k.scope==="queue"||k.scope==="job"||k.scope==="queueWorkers",j=a({queryKey:_.queues(""),queryFn:({signal:p})=>g.listQueues("",p),enabled:B&&q}),O=a({queryKey:he.list(),queryFn:({signal:p})=>cn(g,p),enabled:k.scope==="runner"&&A}),F=X(k);return t("form",{className:"events-picker",onSubmit:(p)=>{if(p.preventDefault(),F)c(F)},"aria-label":"Channel",children:[e(l,{label:"Channel",children:e(S,{options:Rr(N.mode).map((p)=>({value:p,label:le[p]})),value:k.scope,onChange:(p)=>{let D={...k,scope:p};L(D);let x=U.has(p)?X(D):null;if(x)c(x)}})}),B&&e(V,{label:"Queue",value:k.queue,names:j.data?.items.map((p)=>p.name),onChange:(p)=>L({...k,queue:p})}),k.scope==="job"&&e(l,{label:"Job id",children:e(M,{value:k.id,onChange:(p)=>L({...k,id:p}),autoComplete:"off",spellCheck:!1})}),k.scope==="runner"&&e(V,{label:"Runner",value:k.runner,names:O.data?.items.map((p)=>p.id),onChange:(p)=>L({...k,runner:p})}),!U.has(k.scope)&&e(s,{type:"submit",variant:"primary",disabled:F===null,children:"Watch"})]})}function de({allowed:u,selected:c,onChange:g}){let N=(q,A)=>g(u.filter((k)=>k===q?A:c.includes(k)));return t("details",{className:"events-types",children:[t("summary",{"data-testid":"events-types-summary",children:["Types: ",c.length===0?"all":c.join(", ")]}),t("fieldset",{children:[e("legend",{className:"visually-hidden",children:"Event types"}),e("div",{className:"events-type-grid",children:u.map((q)=>e(w,{label:q,checked:c.includes(q),onChange:(A)=>N(q,A)},q))}),e(s,{size:"sm",variant:"ghost",onClick:()=>g([]),disabled:c.length===0,children:"All types"})]})]})}function ce({ignored:u,channel:c,showingAll:g}){if(u.length===0)return null;return t("p",{className:"events-types-ignored",role:"note","data-testid":"events-types-ignored",children:["Ignored in the link's types:"," ",u.map((N,q)=>t("span",{children:[q>0?"; ":"",e("code",{children:N.name})," ",N.reason==="unknown"?"(not an event type)":`(${c} does not carry it)`]},N.name)),g?". Showing every type.":"."]})}function Y(u){let c=new Date(u),g=(N,q=2)=>String(N).padStart(q,"0");return`${g(c.getHours())}:${g(c.getMinutes())}:${g(c.getSeconds())}.${g(c.getMilliseconds(),3)}`}function pe(u){switch(u.type){case"failed":case"dead":case"timeout":case"killed":return"danger";case"retrying":case"stalled":case"skipped":return"warning";case"completed":case"succeeded":return"success";default:return"neutral"}}function me({event:u}){if(u.id===void 0)return e("span",{className:"muted",children:"—"});if(u.kind==="queue")return e(E,{to:Cn(u.target,u.id),children:u.id});return e("code",{children:u.id})}var ge={queue:"info",runner:"accent",worker:"neutral"};function ye({row:u,event:c}){let g=new Date(c.at).toISOString();return t("tr",{"data-testid":"event-row","data-type":c.type,children:[e("td",{className:"events-time",children:e("time",{dateTime:g,title:g,children:Y(c.at)})}),t("td",{className:"events-kind",children:[e(f,{tone:ge[c.kind],children:c.kind})," ",e(f,{tone:pe(c),children:c.type})]}),e("td",{className:"events-target",children:e(E,{to:c.kind==="runner"?mt(c.target):Ve(c.target),children:c.target})}),e("td",{className:"events-id",children:e(me,{event:c})}),t("td",{className:"events-payload",children:[c.kind==="queue"&&c.type==="summon"&&Yo(c.payload)&&e("p",{className:"events-summary","data-testid":"event-summon-summary",children:Jo(c.payload)}),e(ae,{value:c.payload,label:`Payload of ${c.type} #${u.key}`,expandDepth:0,copyable:!1})]})]})}function fe({row:u,gap:c}){return t("tr",{"data-testid":"event-row","data-type":"gap",className:"events-gap",children:[e("td",{className:"events-time",children:Y(u.receivedAt)}),t("td",{colSpan:4,children:[t("strong",{children:["gap: ",c.reason]})," ",t("span",{className:"muted",children:[c.toSeq>0?`events ${c.fromSeq}–${c.toSeq} `:"events ","may be missing",c.channels?` on ${c.channels.join(", ")}`:""]})]})]})}function ve({status:u,channel:c}){if(u.publishing===!1)return e(d,{title:"Producers are not publishing events",description:"This API reports publishing: false. The queues and runners it manages emit no events, so nothing will arrive here; the screens refresh by polling instead."});if(u.events==="local")return e(d,{title:"Only this API process's own events",description:"This API reports events: local. It sees only the events of work done in its own process; jobs and runs handled by other processes will not appear here."});if(u.state==="off"||u.state==="refused")return e(d,{title:"Live updates are off",description:u.detail??"There is no socket to the API."});return e(d,{title:"Waiting for events",description:t(n,{children:["Nothing has arrived on ",e("code",{children:c})," yet."]})})}function be({rejected:u}){if(u.length===0)return null;return e("div",{className:"events-rejected",role:"alert","data-testid":"events-rejected",children:u.map((c)=>t("p",{children:["The server refused ",e("code",{children:c.channel}),":"," ",e("strong",{children:c.code}),c.detail?` (${c.detail})`:""]},`${c.channel}:${c.code}`))})}function xe(){let u=m(),c=dr(),[g,N]=W(),q=At(g.get("channel"),u.mode)??mo(u.mode),A=Dr(q),k=Vt(q),L=g.get("types"),B=fo(L,k),{types:j}=B;v(()=>{if(L!==null&&B.normalized!==L)N({types:B.normalized})},[L,B.normalized,N]);let[O,F]=r([]),[J,p]=r(!1),[D,x]=r({rows:[],dropped:0}),G=T(0),z=T(J);z.current=J;let H=T(j);H.current=j;let Q=T([]),K=C((b)=>{if(z.current)x((P)=>P.rows.length>=Or?{rows:P.rows,dropped:P.dropped+1}:{rows:[...P.rows,b],dropped:P.dropped});else F((P)=>Ar(P,[b]))},[]),Z=C((b)=>{if(!po(b,H.current))return;let P=co(Q.current,b);if(Q.current=P.seen,P.duplicate)return;K({key:G.current++,kind:"event",receivedAt:Date.now(),event:b})},[K]),ee=C((b)=>K({key:G.current++,kind:"gap",receivedAt:Date.now(),gap:b}),[K]),{rejected:ne}=rt({channels:[A],events:j.length===0?void 0:j,onEvent:Z,onGap:ee}),te=()=>{z.current=!0,p(!0)},se=()=>{z.current=!1,F((b)=>Ar(b,D.rows)),x({rows:[],dropped:0}),p(!1)},oe=()=>{F([]),x({rows:[],dropped:0})};return t("div",{className:"screen events-screen","data-testid":"events-screen",children:[e("h1",{className:"screen-title",children:"Events"}),t(R,{title:"Subscription",className:"events-controls",children:[e(ue,{choice:q,onApply:(b)=>{let P=Vt(b);N({channel:Dr(b),types:j.filter((re)=>P.includes(re)).join(",")||null})}},A),e(de,{allowed:k,selected:j,onChange:(b)=>N({types:b.join(",")||null})}),e(ce,{ignored:B.ignored,channel:A,showingAll:j.length===0}),t("p",{className:"muted events-channel",children:["Watching ",e("code",{"data-testid":"events-channel",children:A})]}),e(be,{rejected:ne})]}),e(R,{title:"Log",actions:t("div",{className:"events-actions",children:[t("span",{className:"muted","data-testid":"events-count",children:[h(O.length,"row")," (the latest ",o(Mn)," ","are kept)"]}),J&&t("span",{className:"events-held","data-testid":"events-held",children:[o(D.rows.length)," held",D.dropped>0?`, ${o(D.dropped)} dropped`:""]}),e(s,{size:"sm",onClick:J?se:te,children:J?"Resume":"Pause"}),e(s,{size:"sm",onClick:oe,disabled:O.length===0&&D.rows.length===0,children:"Clear"})]}),children:O.length===0?e(ve,{status:c,channel:A}):t(I,{label:"Events, newest first",className:"events-table",children:[e("thead",{children:t("tr",{children:[e("th",{scope:"col",children:"Time"}),e("th",{scope:"col",children:"Event"}),e("th",{scope:"col",children:"Target"}),e("th",{scope:"col",children:"Id"}),e("th",{scope:"col",children:"Payload"})]})}),e("tbody",{children:O.map((b)=>b.kind==="event"?e(ye,{row:b,event:b.event},b.key):e(fe,{row:b,gap:b.gap},b.key))})]})})]})}export{xe as EventsScreen};
2
+
3
+ //# debugId=E837A263E86CCE7764756E2164756E21
4
+ //# sourceMappingURL=index-47pxmyxn.js.map
@@ -5,6 +5,6 @@
5
5
  "/**\n * The Events console: a live tail of the API's socket. Routed from\n * `routes.tsx` at `/events` (lazily, see `../lazy.tsx`).\n */\nimport type { FormEvent } from \"react\";\nimport type {\n EventName,\n EventWire,\n JobsApiAckRejection,\n JobsApiGapMessage,\n} from \"../../api/types\";\nimport type { BadgeTone } from \"../../components/Badge\";\nimport type { LiveStatus } from \"../../live\";\nimport type {\n ChannelChoice,\n ChannelScope,\n IgnoredType,\n LogRow,\n} from \"./eventLog\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { queryKeys } from \"../../api/queryKeys\";\nimport { jobPath, queuePath } from \"../../api/queues\";\nimport { listRunners, runnerKeys, runnerPath } from \"../../api/runners\";\nimport { Badge } from \"../../components/Badge\";\nimport { Button } from \"../../components/Button\";\nimport { Card } from \"../../components/Card\";\nimport { EmptyState } from \"../../components/EmptyState\";\nimport { Field } from \"../../components/Field\";\nimport { Checkbox, Select, TextInput } from \"../../components/inputs\";\nimport { JsonView } from \"../../components/JsonView\";\nimport { Table } from \"../../components/Table\";\nimport { useApiClient } from \"../../context\";\nimport { formatNumber, plural } from \"../../format\";\nimport { useLiveStatus, useLiveSubscription } from \"../../live\";\nimport { useCan, useMeta } from \"../../meta/hooks\";\nimport { Link } from \"../../router\";\nimport { isSummonEvent, summonEventSummary } from \"../queues/panels/summonText\";\nimport { useUrlParams } from \"../queues/urlState\";\nimport {\n channelName,\n dedupeSummon,\n defaultChoice,\n matchesTypes,\n MAX_PAUSED,\n MAX_ROWS,\n parseChannel,\n prependRows,\n readTypes,\n scopesFor,\n typesFor,\n} from \"./eventLog\";\nimport \"./events.css\";\n\n/** How the scope select names each scope. */\nconst SCOPE_LABELS: Readonly<Record<ChannelScope, string>> = {\n all: \"Everything (all)\",\n queues: \"Every queue (queues)\",\n queue: \"One queue\",\n job: \"One job\",\n runners: \"Every runner (runners)\",\n runner: \"One runner\",\n workers: \"Every worker (workers)\",\n queueWorkers: \"One queue's workers\",\n};\n\n/** Scopes that name no target, applied as soon as they are picked. */\nconst BROAD_SCOPES: ReadonlySet<ChannelScope> = new Set<ChannelScope>([\n \"all\",\n \"queues\",\n \"runners\",\n \"workers\",\n]);\n\n/** What the picker is editing before it is applied. */\ninterface Draft {\n /** The scope. */\n scope: ChannelScope;\n /** The queue, for `queue` and `job`. */\n queue: string;\n /** The runner, for `runner`. */\n runner: string;\n /** The job id, for `job`. */\n id: string;\n}\n\n/** A draft from an applied choice. */\nfunction draftOf(choice: ChannelChoice): Draft {\n return {\n scope: choice.scope,\n queue:\n choice.scope === \"queue\" ||\n choice.scope === \"job\" ||\n choice.scope === \"queueWorkers\"\n ? choice.queue\n : \"\",\n runner: choice.scope === \"runner\" ? choice.runner : \"\",\n id: choice.scope === \"job\" ? choice.id : \"\",\n };\n}\n\n/** The choice a draft names, or `null` while a target is missing. */\nfunction choiceOf(draft: Draft): ChannelChoice | null {\n switch (draft.scope) {\n case \"all\":\n case \"queues\":\n case \"runners\":\n case \"workers\":\n return { scope: draft.scope };\n case \"queueWorkers\":\n return draft.queue ? { scope: \"queueWorkers\", queue: draft.queue } : null;\n case \"queue\":\n return draft.queue ? { scope: \"queue\", queue: draft.queue } : null;\n case \"runner\":\n return draft.runner ? { scope: \"runner\", runner: draft.runner } : null;\n case \"job\":\n return draft.queue && draft.id\n ? { scope: \"job\", queue: draft.queue, id: draft.id }\n : null;\n }\n}\n\n/** Props of {@link TargetInput}. */\ninterface TargetInputProps {\n /** The field's label. */\n label: string;\n /** The chosen name. */\n value: string;\n /** Names to choose from; `undefined` (not listable) or empty gives a text box. */\n names: readonly string[] | undefined;\n /** Sets the name. */\n onChange: (value: string) => void;\n}\n\n/** A target picker: a select over the listed names when there are some, else a text box. */\nfunction TargetInput({ label, value, names, onChange }: TargetInputProps) {\n return (\n <Field label={label}>\n {names && names.length > 0 ? (\n <Select\n options={[\n { value: \"\", label: \"Choose…\" },\n ...names.map((name) => ({ value: name })),\n ]}\n value={names.includes(value) ? value : \"\"}\n onChange={onChange}\n />\n ) : (\n <TextInput\n value={value}\n onChange={onChange}\n maxLength={200}\n autoComplete=\"off\"\n spellCheck={false}\n />\n )}\n </Field>\n );\n}\n\n/** Props of {@link ChannelPicker}. */\ninterface ChannelPickerProps {\n /** The applied choice. */\n choice: ChannelChoice;\n /** Applies a new choice. */\n onApply: (choice: ChannelChoice) => void;\n}\n\n/**\n * Picks the channel: a scope, then its queue (from the queue list), runner\n * (from the runner list) or job (a queue and an id). A broad scope applies\n * at once; a targeted one on \"Watch\".\n */\nfunction ChannelPicker({ choice, onApply }: ChannelPickerProps) {\n const api = useApiClient();\n const meta = useMeta();\n const canQueues = useCan(\"queues.list\");\n const canRunners = useCan(\"runners.list\");\n const [draft, setDraft] = useState<Draft>(() => draftOf(choice));\n const needsQueue =\n draft.scope === \"queue\" ||\n draft.scope === \"job\" ||\n draft.scope === \"queueWorkers\";\n const queues = useQuery({\n queryKey: queryKeys.queues(\"\"),\n queryFn: ({ signal }) => api.listQueues(\"\", signal),\n enabled: needsQueue && canQueues,\n });\n const runners = useQuery({\n queryKey: runnerKeys.list(),\n queryFn: ({ signal }) => listRunners(api, signal),\n enabled: draft.scope === \"runner\" && canRunners,\n });\n const next = choiceOf(draft);\n\n const onSubmit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n if (next) {\n onApply(next);\n }\n };\n\n return (\n <form\n className=\"events-picker\"\n onSubmit={onSubmit}\n aria-label=\"Channel\"\n >\n <Field label=\"Channel\">\n <Select\n options={scopesFor(meta.mode).map((scope) => ({\n value: scope,\n label: SCOPE_LABELS[scope],\n }))}\n value={draft.scope}\n onChange={(scope) => {\n const updated = { ...draft, scope };\n setDraft(updated);\n const applied = BROAD_SCOPES.has(scope) ? choiceOf(updated) : null;\n if (applied) {\n onApply(applied);\n }\n }}\n />\n </Field>\n {needsQueue && (\n <TargetInput\n label=\"Queue\"\n value={draft.queue}\n names={queues.data?.items.map((queue) => queue.name)}\n onChange={(queue) => setDraft({ ...draft, queue })}\n />\n )}\n {draft.scope === \"job\" && (\n <Field label=\"Job id\">\n <TextInput\n value={draft.id}\n onChange={(id) => setDraft({ ...draft, id })}\n autoComplete=\"off\"\n spellCheck={false}\n />\n </Field>\n )}\n {draft.scope === \"runner\" && (\n <TargetInput\n label=\"Runner\"\n value={draft.runner}\n names={runners.data?.items.map((runner) => runner.id)}\n onChange={(runner) => setDraft({ ...draft, runner })}\n />\n )}\n {!BROAD_SCOPES.has(draft.scope) && (\n <Button\n type=\"submit\"\n variant=\"primary\"\n disabled={next === null}\n >\n Watch\n </Button>\n )}\n </form>\n );\n}\n\n/** Props of {@link TypeFilter}. */\ninterface TypeFilterProps {\n /** The types the channel can carry. */\n allowed: readonly EventName[];\n /** The chosen ones; empty means every type. */\n selected: readonly EventName[];\n /** Sets the filter. */\n onChange: (types: EventName[]) => void;\n}\n\n/** The event-type filter: a checkbox per type, under a summary of the choice. */\nfunction TypeFilter({ allowed, selected, onChange }: TypeFilterProps) {\n const toggle = (type: EventName, on: boolean) =>\n onChange(\n allowed.filter((candidate) =>\n candidate === type ? on : selected.includes(candidate),\n ),\n );\n return (\n <details className=\"events-types\">\n <summary data-testid=\"events-types-summary\">\n Types: {selected.length === 0 ? \"all\" : selected.join(\", \")}\n </summary>\n <fieldset>\n <legend className=\"visually-hidden\">Event types</legend>\n <div className=\"events-type-grid\">\n {allowed.map((type) => (\n <Checkbox\n key={type}\n label={type}\n checked={selected.includes(type)}\n onChange={(on) => toggle(type, on)}\n />\n ))}\n </div>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => onChange([])}\n disabled={selected.length === 0}\n >\n All types\n </Button>\n </fieldset>\n </details>\n );\n}\n\n/** Props of {@link IgnoredTypesNote}. */\ninterface IgnoredTypesNoteProps {\n /** The names the filter left out. */\n ignored: readonly IgnoredType[];\n /** The channel, for the reason. */\n channel: string;\n /** Whether nothing was left to filter on, so every type shows. */\n showingAll: boolean;\n}\n\n/** Says which names in the URL's `types` the filter ignores, so none is dropped silently. */\nfunction IgnoredTypesNote({\n ignored,\n channel,\n showingAll,\n}: IgnoredTypesNoteProps) {\n if (ignored.length === 0) {\n return null;\n }\n return (\n <p\n className=\"events-types-ignored\"\n role=\"note\"\n data-testid=\"events-types-ignored\"\n >\n Ignored in the link's types:{\" \"}\n {ignored.map((entry, index) => (\n <span key={entry.name}>\n {index > 0 ? \"; \" : \"\"}\n <code>{entry.name}</code>{\" \"}\n {entry.reason === \"unknown\"\n ? \"(not an event type)\"\n : `(${channel} does not carry it)`}\n </span>\n ))}\n {showingAll ? \". Showing every type.\" : \".\"}\n </p>\n );\n}\n\n/** `hh:mm:ss.mmm`, local time. */\nfunction clock(ms: number): string {\n const date = new Date(ms);\n const pad = (value: number, width = 2) => String(value).padStart(width, \"0\");\n return `${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}.${pad(date.getMilliseconds(), 3)}`;\n}\n\n/** A colour per outcome: failures red, trouble amber, successes green. */\nfunction toneOf(event: EventWire): BadgeTone {\n switch (event.type) {\n case \"failed\":\n case \"dead\":\n case \"timeout\":\n case \"killed\":\n return \"danger\";\n case \"retrying\":\n case \"stalled\":\n case \"skipped\":\n return \"warning\";\n case \"completed\":\n case \"succeeded\":\n return \"success\";\n default:\n return \"neutral\";\n }\n}\n\n/** An event's id: a queue event's job, linked to its screen; a runner event's run or a worker event's worker incarnation, as text. */\nfunction EventId({ event }: { event: EventWire }) {\n if (event.id === undefined) {\n return <span className=\"muted\">—</span>;\n }\n if (event.kind === \"queue\") {\n return <Link to={jobPath(event.target, event.id)}>{event.id}</Link>;\n }\n return <code>{event.id}</code>;\n}\n\n/**\n * The kind badge's tone: one per kind, so a worker event does not pass for a\n * runner's. `neutral` for workers, because the type badge beside it gives\n * success, warning and danger their meaning.\n */\nconst KIND_TONE: Readonly<Record<EventWire[\"kind\"], BadgeTone>> = {\n queue: \"info\",\n runner: \"accent\",\n worker: \"neutral\",\n};\n\n/** One event row. */\nfunction EventRow({ row, event }: { row: LogRow; event: EventWire }) {\n const at = new Date(event.at).toISOString();\n return (\n <tr\n data-testid=\"event-row\"\n data-type={event.type}\n >\n <td className=\"events-time\">\n <time\n dateTime={at}\n title={at}\n >\n {clock(event.at)}\n </time>\n </td>\n <td className=\"events-kind\">\n <Badge tone={KIND_TONE[event.kind]}>{event.kind}</Badge>{\" \"}\n <Badge tone={toneOf(event)}>{event.type}</Badge>\n </td>\n <td className=\"events-target\">\n <Link\n to={\n // A worker event's target is the QUEUE the worker consumes.\n event.kind === \"runner\"\n ? runnerPath(event.target)\n : queuePath(event.target)\n }\n >\n {event.target}\n </Link>\n </td>\n <td className=\"events-id\">\n <EventId event={event} />\n </td>\n <td className=\"events-payload\">\n {event.kind === \"queue\" &&\n event.type === \"summon\" &&\n isSummonEvent(event.payload) && (\n // A summon attempt in words above its payload: the outcome, how\n // many workers, the summoner and why the check ran.\n <p\n className=\"events-summary\"\n data-testid=\"event-summon-summary\"\n >\n {summonEventSummary(event.payload)}\n </p>\n )}\n <JsonView\n value={event.payload}\n label={`Payload of ${event.type} #${row.key}`}\n expandDepth={0}\n copyable={false}\n />\n </td>\n </tr>\n );\n}\n\n/** A gap row: events in a range may have been lost. */\nfunction GapRow({ row, gap }: { row: LogRow; gap: JobsApiGapMessage }) {\n return (\n <tr\n data-testid=\"event-row\"\n data-type=\"gap\"\n className=\"events-gap\"\n >\n <td className=\"events-time\">{clock(row.receivedAt)}</td>\n <td colSpan={4}>\n <strong>gap: {gap.reason}</strong>{\" \"}\n <span className=\"muted\">\n {/*\n A gap on a connection that has carried no sequenced event yet\n (`queue-discovered` right after subscribing) is 0–0, which reads\n as a range of nothing; there the range is left out.\n */}\n {gap.toSeq > 0 ? `events ${gap.fromSeq}–${gap.toSeq} ` : \"events \"}\n may be missing\n {gap.channels ? ` on ${gap.channels.join(\", \")}` : \"\"}\n </span>\n </td>\n </tr>\n );\n}\n\n/** Why the log may stay empty, from the live status. */\nfunction EmptyLog({\n status,\n channel,\n}: {\n status: LiveStatus;\n channel: string;\n}) {\n if (status.publishing === false) {\n return (\n <EmptyState\n title=\"Producers are not publishing events\"\n description=\"This API reports publishing: false. The queues and runners it manages emit no events, so nothing will arrive here; the screens refresh by polling instead.\"\n />\n );\n }\n if (status.events === \"local\") {\n return (\n <EmptyState\n title=\"Only this API process's own events\"\n description=\"This API reports events: local. It sees only the events of work done in its own process; jobs and runs handled by other processes will not appear here.\"\n />\n );\n }\n if (status.state === \"off\" || status.state === \"refused\") {\n return (\n <EmptyState\n title=\"Live updates are off\"\n description={status.detail ?? \"There is no socket to the API.\"}\n />\n );\n }\n return (\n <EmptyState\n title=\"Waiting for events\"\n description={\n <>\n Nothing has arrived on <code>{channel}</code> yet.\n </>\n }\n />\n );\n}\n\n/** The channels the server refused, each with why. */\nfunction Rejections({\n rejected,\n}: {\n rejected: readonly JobsApiAckRejection[];\n}) {\n if (rejected.length === 0) {\n return null;\n }\n return (\n <div\n className=\"events-rejected\"\n role=\"alert\"\n data-testid=\"events-rejected\"\n >\n {rejected.map((rejection) => (\n <p key={`${rejection.channel}:${rejection.code}`}>\n The server refused <code>{rejection.channel}</code>:{\" \"}\n <strong>{rejection.code}</strong>\n {rejection.detail ? ` (${rejection.detail})` : \"\"}\n </p>\n ))}\n </div>\n );\n}\n\n/** What the paused display holds back. */\ninterface Held {\n /** Rows waiting, oldest first (at most {@link MAX_PAUSED}). */\n rows: LogRow[];\n /** Rows that arrived after the cap, dropped. */\n dropped: number;\n}\n\n/**\n * `/events`: the live event tail. The channel and type filter live in the\n * URL (`channel`, `types`); the log keeps the latest {@link MAX_ROWS} rows,\n * newest first, and pausing holds up to {@link MAX_PAUSED} more.\n */\nexport function EventsScreen() {\n const meta = useMeta();\n const status = useLiveStatus();\n const [params, update] = useUrlParams();\n const choice =\n parseChannel(params.get(\"channel\"), meta.mode) ?? defaultChoice(meta.mode);\n const channel = channelName(choice);\n const allowed = typesFor(choice);\n const rawTypes = params.get(\"types\");\n const typesParam = readTypes(rawTypes, allowed);\n const { types } = typesParam;\n\n // Prefixed names (`queue.completed`) are written back bare.\n useEffect(() => {\n if (rawTypes !== null && typesParam.normalized !== rawTypes) {\n update({ types: typesParam.normalized });\n }\n }, [rawTypes, typesParam.normalized, update]);\n\n const [rows, setRows] = useState<LogRow[]>([]);\n const [paused, setPaused] = useState(false);\n const [held, setHeld] = useState<Held>({ rows: [], dropped: 0 });\n const nextKeyRef = useRef(0);\n const pausedRef = useRef(paused);\n pausedRef.current = paused;\n const typesRef = useRef(types);\n typesRef.current = types;\n // The summon event ids heard, for `dedupeSummon`: kept across Clear and a\n // channel change, since a shared unit's copies may still be arriving.\n const seenRef = useRef<readonly string[]>([]);\n\n const add = useCallback((row: LogRow) => {\n if (pausedRef.current) {\n setHeld((current) =>\n current.rows.length >= MAX_PAUSED\n ? { rows: current.rows, dropped: current.dropped + 1 }\n : { rows: [...current.rows, row], dropped: current.dropped },\n );\n } else {\n setRows((current) => prependRows(current, [row]));\n }\n }, []);\n\n const onEvent = useCallback(\n (event: EventWire) => {\n // Another screen may hold this channel with a wider filter, and the\n // client merges filters per channel, so filter here too.\n if (!matchesTypes(event, typesRef.current)) {\n return;\n }\n // A shared summon unit's event arrives once per queue it serves: one\n // row. Checked after the filter, so only an id that was shown counts.\n const dedupe = dedupeSummon(seenRef.current, event);\n seenRef.current = dedupe.seen;\n if (dedupe.duplicate) {\n return;\n }\n add({\n key: nextKeyRef.current++,\n kind: \"event\",\n receivedAt: Date.now(),\n event,\n });\n },\n [add],\n );\n const onGap = useCallback(\n (gap: JobsApiGapMessage) =>\n add({\n key: nextKeyRef.current++,\n kind: \"gap\",\n receivedAt: Date.now(),\n gap,\n }),\n [add],\n );\n\n const { rejected } = useLiveSubscription({\n channels: [channel],\n events: types.length === 0 ? undefined : types,\n onEvent,\n onGap,\n });\n\n const pause = () => {\n pausedRef.current = true;\n setPaused(true);\n };\n const resume = () => {\n pausedRef.current = false;\n setRows((current) => prependRows(current, held.rows));\n setHeld({ rows: [], dropped: 0 });\n setPaused(false);\n };\n const clear = () => {\n setRows([]);\n setHeld({ rows: [], dropped: 0 });\n };\n\n const apply = (next: ChannelChoice) => {\n const nextAllowed = typesFor(next);\n update({\n channel: channelName(next),\n types:\n types.filter((type) => nextAllowed.includes(type)).join(\",\") || null,\n });\n };\n\n return (\n <div\n className=\"screen events-screen\"\n data-testid=\"events-screen\"\n >\n <h1 className=\"screen-title\">Events</h1>\n <Card\n title=\"Subscription\"\n className=\"events-controls\"\n >\n <ChannelPicker\n key={channel}\n choice={choice}\n onApply={apply}\n />\n <TypeFilter\n allowed={allowed}\n selected={types}\n onChange={(next) => update({ types: next.join(\",\") || null })}\n />\n <IgnoredTypesNote\n ignored={typesParam.ignored}\n channel={channel}\n showingAll={types.length === 0}\n />\n <p className=\"muted events-channel\">\n Watching <code data-testid=\"events-channel\">{channel}</code>\n </p>\n <Rejections rejected={rejected} />\n </Card>\n <Card\n title=\"Log\"\n actions={\n <div className=\"events-actions\">\n <span\n className=\"muted\"\n data-testid=\"events-count\"\n >\n {plural(rows.length, \"row\")} (the latest {formatNumber(MAX_ROWS)}{\" \"}\n are kept)\n </span>\n {paused && (\n <span\n className=\"events-held\"\n data-testid=\"events-held\"\n >\n {formatNumber(held.rows.length)} held\n {held.dropped > 0\n ? `, ${formatNumber(held.dropped)} dropped`\n : \"\"}\n </span>\n )}\n {/* The label says what a press does; an aria-pressed on top would\n contradict it (\"Resume, pressed\"). */}\n <Button\n size=\"sm\"\n onClick={paused ? resume : pause}\n >\n {paused ? \"Resume\" : \"Pause\"}\n </Button>\n <Button\n size=\"sm\"\n onClick={clear}\n disabled={rows.length === 0 && held.rows.length === 0}\n >\n Clear\n </Button>\n </div>\n }\n >\n {rows.length === 0 ? (\n <EmptyLog\n status={status}\n channel={channel}\n />\n ) : (\n <Table\n label=\"Events, newest first\"\n className=\"events-table\"\n >\n <thead>\n <tr>\n <th scope=\"col\">Time</th>\n <th scope=\"col\">Event</th>\n <th scope=\"col\">Target</th>\n <th scope=\"col\">Id</th>\n <th scope=\"col\">Payload</th>\n </tr>\n </thead>\n <tbody>\n {rows.map((row) =>\n row.kind === \"event\" ? (\n <EventRow\n key={row.key}\n row={row}\n event={row.event}\n />\n ) : (\n <GapRow\n key={row.key}\n row={row}\n gap={row.gap}\n />\n ),\n )}\n </tbody>\n </Table>\n )}\n </Card>\n </div>\n );\n}\n"
6
6
  ],
7
7
  "mappings": "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",
8
- "debugId": "A8ABD232A99371F464756E2164756E21",
8
+ "debugId": "E837A263E86CCE7764756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -0,0 +1,4 @@
1
+ import{v,T,N,n,e,t,f,i,m,y,a,Q,is,E,d,p,L,o,u,I}from"./main-a250ffk7.js";import{ke,wo,ko,xe,ft,Ze,Wn,Yn,jt,zn,Pr,Mo,Fo,Vo,Ur}from"./main-jxre7w93.js";import{vt,En}from"./main-w93x1dzs.js";import{Ie,A}from"./main-0jmeh6mq.js";import{pt}from"./main-9prgjhg4.js";import"./main-pegp0ygb.js";function R({refetchInterval:r}){let c=i(),l=is().get("group"),s=a({queryKey:ke.groups(c),queryFn:({signal:S})=>ko(c,S),refetchInterval:r}),h=T(null),b=T(null),g=s.data!==void 0;return v(()=>{if(!g||l===null||b.current===l)return;let S=h.current;if(S===null)return;if(b.current=l,typeof S.scrollIntoView==="function")S.scrollIntoView({block:"center"})},[g,l]),t("section",{className:"summon-groups","data-testid":"summon-groups","aria-labelledby":"summon-groups-heading",children:[e("h2",{id:"summon-groups-heading",className:"summon-groups-title",children:"Summon groups"}),s.isPending?e(p,{label:"Loading the summon groups",showLabel:!0}):s.isError?e(L,{error:s.error,title:"Could not load the summon groups",onRetry:()=>void s.refetch()}):s.data.groups.length===0?e("p",{className:"muted","data-testid":"summon-groups-empty",children:"No summon groups in this namespace."}):t(I,{label:"Summon groups",children:[e("thead",{children:t("tr",{children:[e("th",{scope:"col",children:"Group"}),e("th",{scope:"col",children:"Unit"}),e("th",{scope:"col",children:"Budget left"}),e("th",{scope:"col",children:"Shared circuit"}),e("th",{scope:"col",title:Fo,children:Mo})]})}),e("tbody",{children:s.data.groups.map((S)=>e(q,{group:S,current:S.name===l,rowRef:S.name===l?h:void 0},S.name))})]})]})}function q({group:r,current:c,rowRef:l}){let s=Wn(r),h=Yn(r,void 0),b=jt(r);return t("tr",{ref:l,id:`summon-group-${r.name}`,"data-testid":`summon-group-row-${r.name}`,"aria-current":c?"true":void 0,className:N(c&&"is-current"),children:[e("th",{scope:"row",children:r.name}),e("td",{children:b?e(f,{tone:"neutral",title:zn,testId:`summon-groups-unit-${r.name}`,children:Pr(r)}):e("span",{"data-testid":`summon-groups-unit-${r.name}`,children:Pr(r)})}),e("td",{children:e(Ze,{budget:r.budget,testId:`summon-groups-budget-${r.name}`})}),e("td",{children:h.length===0?e("span",{className:"muted",title:"The group shares no circuit, or none has counted a failure",children:"—"}):e("ul",{className:"summon-group-list",children:h.map((g)=>e("li",{children:e(Ur,{circuit:g,compact:!0,testId:`summon-groups-circuit-${r.name}-${g.kind??"this-summoner"}`})},g.kind??""))})}),t("td",{children:[s.length===0?e("span",{className:"muted",children:"None today"}):e("ul",{className:"summon-group-list",children:s.map((g)=>t("li",{"data-testid":`summon-groups-share-${r.name}-${g.queue}`,children:[e(E,{to:xe(g.queue),title:`The Summon tab of ${g.queue}`,children:g.queue})," ",e("span",{className:"summon-group-count",children:o(g.day)})]},g.queue))}),b&&s.length>0&&e("span",{className:"muted summon-group-note","data-testid":`summon-groups-note-${r.name}`,children:Vo})]})]})}var w=Q;function P(){let r=i(),c=y("queues.list"),l=m().features.summonStoredStatus===!0,s=a({queryKey:ke.list(r),queryFn:({signal:h})=>wo(r,h),refetchInterval:w,enabled:c});return t("div",{className:"screen","data-testid":"summoning-screen",children:[e("h1",{className:"screen-title",children:"Summoning"}),!c?e(d,{title:"Nothing to show",description:"You may not list queues on this API."}):s.isPending?e(p,{label:"Loading the summon controllers",showLabel:!0}):s.isError?e(L,{error:s.error,title:"Could not load the summon controllers",onRetry:()=>void s.refetch()}):s.data.controllers.length===0?e(d,{title:"No summon controllers here",description:l?"No queue summons here: none has a controller in the API's own process, or summon state in the store that you may read.":"Summon controllers run in the API's own process, from its BunJobs context's summon option or jobs.summonController(). None runs in this one, so there is nothing to list. A controller running in another process is not listed."}):t(I,{label:"Summon controllers",children:[e("thead",{children:t("tr",{children:[e("th",{scope:"col",children:"Queue"}),e("th",{scope:"col",children:"Summoner"}),e("th",{scope:"col",children:"Readiness"}),e("th",{scope:"col",children:"Last outcome"}),e("th",{scope:"col",children:"Budget left"})]})}),e("tbody",{children:s.data.controllers.map((h)=>e(C,{item:h},`${h.namespace}/${h.queue}`))})]}),c&&l&&e(R,{refetchInterval:w})]})}function k({queue:r,group:c,queues:l}){return t("span",{className:"muted summoning-unit","data-testid":`summoning-unit-${r}`,children:["Shared unit of ",u(c),":"," ",l.map((s,h)=>t("span",{children:[h>0&&", ",e(E,{to:xe(s),title:`The Summon tab of ${s}`,children:u(s)})]},s))]})}function C({item:r}){let c=Ie(),l=r.readiness===void 0?void 0:pt(r.readiness),s=r.last===void 0?void 0:vt(r.last.outcome);return t("tr",{"data-testid":`summoning-row-${r.queue}`,children:[t("th",{scope:"row",children:[e(E,{to:xe(r.queue),title:`The Summon tab of ${r.queue}`,children:r.queue}),r.group!==void 0&&e(k,{queue:r.queue,group:r.group,queues:r.queues??[r.queue]})]}),e("td",{children:r.kind===""?e("span",{className:"muted",title:"Not recorded yet: its controller runs in another process","data-testid":"summoning-kind-unknown",children:"—"}):e("code",{children:u(r.kind)})}),t("td",{children:[l===void 0?e("span",{className:"muted",title:"Its controller runs in another process",children:"Elsewhere"}):e(f,{tone:l.tone,title:l.hint,testId:"summoning-readiness",children:l.label}),r.inert&&t(n,{children:[" ",e(f,{tone:"neutral",title:En(r.inertReason),testId:"summoning-inert",children:"Inert"})]}),r.circuitOpenUntil!==void 0&&t(n,{children:[" ",e(f,{tone:"warning",title:`Circuit open until ${ft(r.circuitOpenUntil,c)}: after repeated failures nothing is summoned until then, apart from one trial attempt.`,testId:"summoning-circuit",children:"Circuit open"})]})]}),e("td",{"data-testid":"summoning-last",children:r.last===void 0||s===void 0?e("span",{className:"muted",children:"None yet"}):t(n,{children:[e(f,{tone:s.tone,title:s.hint,children:s.label})," ",e(A,{value:r.last.at}),r.last.detail!==void 0&&t("span",{className:"muted",children:[" — ",u(r.last.detail)]})]})}),e("td",{children:r.budget===void 0?e("span",{className:"muted","data-testid":`summoning-budget-${r.queue}`,children:"—"}):e(Ze,{budget:r.budget,testId:`summoning-budget-${r.queue}`})})]})}export{P as SummoningScreen};
2
+
3
+ //# debugId=74F8CB744D249C1D64756E2164756E21
4
+ //# sourceMappingURL=index-4e55z986.js.map
@@ -6,6 +6,6 @@
6
6
  "import type { SummonListItemDto } from \"../../api/types\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { listSummonControllers, summonKeys } from \"../../api/summon\";\nimport { Badge } from \"../../components/Badge\";\nimport { EmptyState } from \"../../components/EmptyState\";\nimport { ErrorView } from \"../../components/ErrorView\";\nimport { RelativeTime } from \"../../components/RelativeTime\";\nimport { Spinner } from \"../../components/Spinner\";\nimport { Table } from \"../../components/Table\";\nimport { useApiClient } from \"../../context\";\nimport { displayText } from \"../../format\";\nimport { useNow } from \"../../hooks/useNow\";\nimport { useCan, useMeta } from \"../../meta/hooks\";\nimport { POLL_INTERVAL_MS } from \"../../queryClient\";\nimport { Link } from \"../../router\";\nimport { providerReadiness } from \"../providers/providerText\";\nimport { utcResetLabel } from \"../queues/panels/budgetText\";\nimport { SummonBudget } from \"../queues/panels/SummonBudget\";\nimport { summonInert, summonOutcome } from \"../queues/panels/summonText\";\nimport { summonTabPath } from \"./paths\";\nimport { SummonGroupsSection } from \"./SummonGroupsSection\";\n// The group styles live with the Summon tab's; this chunk may load first.\nimport \"../queues/queues.css\";\n\n/**\n * How often the list is re-read: attempts and budgets move with the clock\n * and with summon checks, which no event this screen follows announces — so,\n * like the Summon panel, it polls at the base interval, live or not.\n */\nconst SUMMONING_REFRESH_MS = POLL_INTERVAL_MS;\n\n/**\n * `/summon`: every summon controller in the API's process (`GET /summon`),\n * and, where the API reads summon state from storage\n * (`features.summonStoredStatus`), every queue whose controller runs\n * elsewhere (`local: false`: \"Elsewhere\", no actions), one row each — its queue (linked to the queue's Summon tab), the\n * summoner's kind and readiness, the last outcome and when, and the budget\n * left in each UTC window with when it resets, and an open circuit.\n *\n * Under the controllers, where the API reads summon state from storage, the\n * summon groups of the namespace ({@link SummonGroupsSection}).\n *\n * Routed only where the API serves the list (`features.summonList`) and the\n * caller may list queues (`queues.list`, the route's action); the nav entry\n * follows the same rule. The API then lists a controller only where the\n * caller may read its queue (`queues.read` on that queue).\n */\nexport function SummoningScreen() {\n const api = useApiClient();\n // `queues.list` is also what routes the queue screen, so every row links.\n const canList = useCan(\"queues.list\");\n // Whether the API reads summon state from storage, and so also lists the\n // queues whose controller runs in another process.\n const stored = useMeta().features.summonStoredStatus === true;\n const list = useQuery({\n queryKey: summonKeys.list(api),\n queryFn: ({ signal }) => listSummonControllers(api, signal),\n refetchInterval: SUMMONING_REFRESH_MS,\n enabled: canList,\n });\n return (\n <div\n className=\"screen\"\n data-testid=\"summoning-screen\"\n >\n <h1 className=\"screen-title\">Summoning</h1>\n {!canList ? (\n <EmptyState\n title=\"Nothing to show\"\n description=\"You may not list queues on this API.\"\n />\n ) : list.isPending ? (\n <Spinner\n label=\"Loading the summon controllers\"\n showLabel\n />\n ) : list.isError ? (\n <ErrorView\n error={list.error}\n title=\"Could not load the summon controllers\"\n onRetry={() => void list.refetch()}\n />\n ) : list.data.controllers.length === 0 ? (\n <EmptyState\n title=\"No summon controllers here\"\n description={\n stored\n ? \"No queue summons here: none has a controller in the API's own process, or summon state in the store that you may read.\"\n : \"Summon controllers run in the API's own process, from its BunJobs context's summon option or jobs.summonController(). None runs in this one, so there is nothing to list. A controller running in another process is not listed.\"\n }\n />\n ) : (\n <Table label=\"Summon controllers\">\n <thead>\n <tr>\n <th scope=\"col\">Queue</th>\n <th scope=\"col\">Summoner</th>\n <th scope=\"col\">Readiness</th>\n <th scope=\"col\">Last outcome</th>\n <th scope=\"col\">Budget left</th>\n </tr>\n </thead>\n <tbody>\n {list.data.controllers.map((item) => (\n <ControllerRow\n key={`${item.namespace}/${item.queue}`}\n item={item}\n />\n ))}\n </tbody>\n </Table>\n )}\n {canList && stored && (\n <SummonGroupsSection refetchInterval={SUMMONING_REFRESH_MS} />\n )}\n </div>\n );\n}\n\n/** Props of {@link ControllerRow}. */\ninterface ControllerRowProps {\n /** The controller, as `GET /summon` lists it. */\n item: SummonListItemDto;\n}\n\n/** Props of {@link SharedUnitLine}. */\ninterface SharedUnitLineProps {\n /** The row's queue (`item.queue`), naming the line's test id. */\n queue: string;\n /** The summon group the unit is the unit of (`item.group`). */\n group: string;\n /** The unit's queues the caller may read (`item.queues`), the row's own first. */\n queues: readonly string[];\n}\n\n/**\n * Under a shared unit's queue: the group it is the unit of, and each of its\n * queues the caller may read, linked to its Summon tab. The row's own queue\n * is listed too, so the line reads as the whole visible unit; queues hidden\n * from the caller are not counted.\n */\nfunction SharedUnitLine({ queue, group, queues }: SharedUnitLineProps) {\n return (\n <span\n className=\"muted summoning-unit\"\n data-testid={`summoning-unit-${queue}`}\n >\n Shared unit of {displayText(group)}:{\" \"}\n {queues.map((member, index) => (\n <span key={member}>\n {index > 0 && \", \"}\n <Link\n to={summonTabPath(member)}\n title={`The Summon tab of ${member}`}\n >\n {displayText(member)}\n </Link>\n </span>\n ))}\n </span>\n );\n}\n\n/** One controller. */\nfunction ControllerRow({ item }: ControllerRowProps) {\n const now = useNow();\n // Absent for a queue read from storage (`local: false`): its controller,\n // and so its summoner, runs in another process.\n const readiness =\n item.readiness === undefined\n ? undefined\n : providerReadiness(item.readiness);\n const last =\n item.last === undefined ? undefined : summonOutcome(item.last.outcome);\n return (\n <tr data-testid={`summoning-row-${item.queue}`}>\n <th scope=\"row\">\n <Link\n to={summonTabPath(item.queue)}\n title={`The Summon tab of ${item.queue}`}\n >\n {item.queue}\n </Link>\n {item.group !== undefined && (\n <SharedUnitLine\n queue={item.queue}\n group={item.group}\n queues={item.queues ?? [item.queue]}\n />\n )}\n </th>\n <td>\n {item.kind === \"\" ? (\n // Read from storage before any claim recorded the summoner's kind.\n <span\n className=\"muted\"\n title=\"Not recorded yet: its controller runs in another process\"\n data-testid=\"summoning-kind-unknown\"\n >\n —\n </span>\n ) : (\n <code>{displayText(item.kind)}</code>\n )}\n </td>\n <td>\n {readiness === undefined ? (\n <span\n className=\"muted\"\n title=\"Its controller runs in another process\"\n >\n Elsewhere\n </span>\n ) : (\n <Badge\n tone={readiness.tone}\n title={readiness.hint}\n testId=\"summoning-readiness\"\n >\n {readiness.label}\n </Badge>\n )}\n {item.inert && (\n <>\n {\" \"}\n <Badge\n tone=\"neutral\"\n title={summonInert(item.inertReason)}\n testId=\"summoning-inert\"\n >\n Inert\n </Badge>\n </>\n )}\n {item.circuitOpenUntil !== undefined && (\n <>\n {\" \"}\n <Badge\n tone=\"warning\"\n title={`Circuit open until ${utcResetLabel(item.circuitOpenUntil, now)}: after repeated failures nothing is summoned until then, apart from one trial attempt.`}\n testId=\"summoning-circuit\"\n >\n Circuit open\n </Badge>\n </>\n )}\n </td>\n <td data-testid=\"summoning-last\">\n {item.last === undefined || last === undefined ? (\n <span className=\"muted\">None yet</span>\n ) : (\n <>\n <Badge\n tone={last.tone}\n title={last.hint}\n >\n {last.label}\n </Badge>{\" \"}\n <RelativeTime value={item.last.at} />\n {item.last.detail !== undefined && (\n <span className=\"muted\"> — {displayText(item.last.detail)}</span>\n )}\n </>\n )}\n </td>\n <td>\n {item.budget === undefined ? (\n // None for summon state a newer bun-jobs wrote: it is not read here.\n <span\n className=\"muted\"\n data-testid={`summoning-budget-${item.queue}`}\n >\n —\n </span>\n ) : (\n <SummonBudget\n budget={item.budget}\n testId={`summoning-budget-${item.queue}`}\n />\n )}\n </td>\n </tr>\n );\n}\n"
7
7
  ],
8
8
  "mappings": "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",
9
- "debugId": "18FEDCB2AD6431A464756E2164756E21",
9
+ "debugId": "74F8CB744D249C1D64756E2164756E21",
10
10
  "names": []
11
11
  }
@@ -0,0 +1,4 @@
1
+ import{Me,c,r,Z,Tn,je,n,e,t,f,i,m,y,Fe,ie,Y,a,Q,s,de,E,ve,H,d,p,us,ee,Ve,Ln,R,L,o,z,Ut,h,u,l,S,I,ne,Is,gr,$r,qe,ws,$e,bt,st,xt,it,Nt,Se,at}from"./main-a250ffk7.js";import{Ye,Rt,De,Tr,vr,No,fn,Fn,Bt,qt,Vn,Bn,Oo,pn,Ao,qn,Jn,Sr,Hn,Ro,Do,Dt}from"./main-ts19j4n0.js";import{_e,ze,hn,To,Gn,vo,So,gn,Oe}from"./main-kwmqkjfx.js";import{k}from"./main-4g69fn3x.js";import{O}from"./main-4j1fcevh.js";import{W,me,Tt,we}from"./main-3yj6bv90.js";import{A}from"./main-0jmeh6mq.js";import"./main-jkvd92z9.js";import"./main-hm1ng3yg.js";import"./main-5grjvsy7.js";import{F}from"./main-pegp0ygb.js";function ce({queue:g,workerKey:b}){let v=i(),C=at("workers"),[T,x]=Nt("range"),{analytics:K,key:P,request:q}=it(T),_=H(Q),w=a({queryKey:qe.worker(g,b,P),queryFn:({signal:N})=>ws(v,g,b,q(),N),enabled:C,refetchInterval:_});if(!C)return null;return e(R,{title:"Throughput and busyness",className:"analytics-section",actions:e(xt,{range:T,onChange:x,label:"Range for this worker's numbers",maxSpan:K?.maxSpanMs}),children:e("div",{className:"worker-analytics","data-testid":"worker-analytics",children:w.isPending?e(p,{label:"Loading this worker's numbers",showLabel:!0}):w.isError?e(bt,{error:w.error,title:"Could not load this worker's numbers",onRetry:()=>void w.refetch(),testId:"worker-range-not-retained"}):t(n,{children:[t("section",{"aria-label":"Throughput",children:[e("h3",{className:"worker-analytics-title",children:"Throughput"}),e(st,{range:w.data.jobs.range,always:!0,testId:"worker-jobs-range-caption"}),t("div",{className:"analytics-headline",children:[t("dl",{className:"stat-grid","aria-label":"Throughput totals",children:[t("div",{className:"stat",children:[e("dt",{className:"stat-label",children:"Completed"}),e("dd",{className:"stat-value",children:o(w.data.jobs.totals.completed)})]}),t("div",{className:"stat",children:[e("dt",{className:"stat-label",children:"Failed"}),e("dd",{className:"stat-value",children:o(w.data.jobs.totals.failed)}),e("dd",{className:"stat-hint",children:"Attempts that failed."})]})]}),e("div",{className:"analytics-charts",children:e(Se,{values:w.data.jobs.buckets.map((N)=>N.completed),secondary:w.data.jobs.buckets.map((N)=>N.failed),label:`${b}: ${o(w.data.jobs.totals.completed)} completed, ${o(w.data.jobs.totals.failed)} failed, ${$e(w.data.jobs.range)}`,width:240})})]})]}),w.data.busyness?t("section",{"aria-label":"Busyness",children:[e("h3",{className:"worker-analytics-title",children:"Busyness"}),e(st,{range:w.data.busyness.range,always:!0,testId:"worker-busyness-range-caption"}),w.data.busyness.totals.samples===0?e("p",{className:"muted","data-testid":"worker-busyness-no-samples",children:"No heartbeat landed in this range, so nothing was sampled — the worker was not reporting, which is not the same as idle."}):t("div",{className:"analytics-headline",children:[t("dl",{className:"stat-grid","aria-label":"Busyness totals",children:[t("div",{className:"stat",children:[e("dt",{className:"stat-label",children:"Mean in flight"}),t("dd",{className:"stat-value",children:[w.data.busyness.totals.activeMean.toFixed(1)," /"," ",o(w.data.busyness.totals.concurrency)]}),e("dd",{className:"stat-hint",children:"Against the concurrency of the last sample."})]}),t("div",{className:"stat",children:[e("dt",{className:"stat-label",children:"Most in flight"}),e("dd",{className:"stat-value",children:o(w.data.busyness.totals.activeMax)})]}),t("div",{className:"stat",children:[e("dt",{className:"stat-label",children:"Samples"}),e("dd",{className:"stat-value",children:o(w.data.busyness.totals.samples)}),e("dd",{className:"stat-hint",children:"Heartbeats in the range."})]})]}),e("div",{className:"analytics-charts",children:e(Se,{values:w.data.busyness.buckets.map((N)=>N.activeMean),secondary:w.data.busyness.buckets.map((N)=>N.concurrency),label:`${b}: mean jobs in flight against its concurrency, ${$e(w.data.busyness.range)}`,width:240})})]})]}):e("p",{className:"muted","data-testid":"worker-busyness-absent",children:"This backend records no busyness for workers."})]})})})}var Ke=new Set(["concurrency","maxStalledCount"]);function ue(g,b){return Ke.has(g)?o(b):`${o(b)} ms`}function xe(g,b){return je.every((v)=>g.config?.effective[v]===b.config?.effective[v])}function Ne({queue:g,workerKey:b,instances:v,stored:C}){let T=qt(),[x,K]=r(!1),P=v.find((j)=>j.config!==void 0);if(v.length===0)return e(R,{title:"Configuration",children:e(Je,{queue:g,workerKey:b,stored:C,canReset:T("workers.configure")})});let q=P?.config,_=v.some((j)=>j.control?.pending===!0),w=P!==void 0&&Bt(P,T).configure,N=P!==void 0&&v.some((j)=>j.config!==void 0&&!xe(j,P));return t(R,{title:"Configuration",actions:t(n,{children:[_&&e(f,{tone:"accent",title:"A change was recorded and an instance has not taken it up yet. It applies within seconds.",children:"Change pending"}),w&&e(s,{size:"sm",onClick:()=>K(!0),children:"Edit settings…"})]}),children:[e("div",{"data-testid":"worker-config",children:q===void 0?e("p",{className:"muted",children:"No instance of this key reports its settings (it predates remote configuration, or the backend keeps no config), so there is nothing to show."}):t(n,{children:[e("p",{className:"muted worker-config-summary","data-testid":"worker-config-summary",children:q.overridden.length===0?"No override is stored: every value is what the code asks for.":t(n,{children:["An override (version ",q.seq,q.updatedAt!==void 0&&t(n,{children:[", written ",e(A,{value:q.updatedAt})]}),") replaces ",q.overridden.length," of the"," ",je.length," settings, for every instance of this key."]})}),N&&t("p",{className:"notice",role:"note","data-testid":"worker-config-differs",children:["Not every instance runs with these values (they are"," ",e("code",{children:P.id}),"’s): a change is still being taken up, or the instances’ code differs. Each instance’s Settings… shows its own."]}),t(I,{label:`Settings of ${b}`,children:[e("thead",{children:t("tr",{children:[e("th",{scope:"col",children:"Setting"}),e("th",{scope:"col",className:"num",children:"Running with"}),e("th",{scope:"col",className:"num",children:"Code asks for"}),e("th",{scope:"col",children:"Source"})]})}),e("tbody",{children:je.map((j)=>{let B=q.overridden.includes(j),J=q.derived?.includes(j)===!0;return t("tr",{"data-testid":`worker-setting-${j}`,children:[e("th",{scope:"row",title:Vn[j],children:e("code",{children:j})}),e("td",{className:"num",children:ue(j,q.effective[j])}),t("td",{className:"num",children:[ue(j,q.code[j]),J&&t("span",{className:"muted",title:"Derived rather than given: a third of lockDuration.",children:[" ","(derived)"]})]}),e("td",{children:B?e(f,{tone:"accent",title:"Replaced by the override stored for this key.",children:"Overridden"}):e("span",{className:"muted",children:"Code"})})]},j)})})]})]})}),x&&P!==void 0&&e(Bn,{worker:P,onClose:()=>K(!1)})]})}function Je({queue:g,workerKey:b,stored:v,canReset:C}){let T=i(),[x,K]=r(!1),P=O({mutationFn:()=>gn(T,g,b),invalidate:ze(g),successMessage:`Reset ${b} to the values in its code`,toastErrors:!1}),q=v?je.flatMap((w)=>{let N=v.values[w];return N===void 0?[]:[{setting:w,value:N}]}):[],_=C&&v!==null;return t("div",{"data-testid":"worker-config-offline",children:[e("p",{className:"muted",children:"No instance of this key is live, so its configuration cannot be shown until one reports: the values a worker runs with and the ones its code asks for come from the running worker."}),v===null?e("p",{"data-testid":"worker-config-none-stored",children:"No override is stored for this key."}):v!==void 0?t(n,{children:[t("p",{"data-testid":"worker-config-stored",children:["An override is stored for this key (version ",v.seq,", written"," ",e(A,{value:v.updatedAt}),"). The next instance to start takes it up."]}),q.length>0&&e(F,{items:q.map(({setting:w,value:N})=>({key:w,label:e("code",{children:w}),value:ue(w,N)}))})]}):null,_&&e(s,{size:"sm",variant:"danger",onClick:()=>K(!0),children:"Reset to code values…"}),e(k,{open:x,onClose:()=>K(!1),title:`Reset ${b}?`,description:"Drops the override stored for this key, so every instance started from now on runs with what its code asks for.",confirmLabel:"Reset",pendingLabel:"Resetting…",variant:"danger",onConfirm:()=>P.mutateAsync()})]})}var D={state:"jobState",name:"jobName",search:"jobSearch",order:"jobOrder",offset:"jobOffset",limit:"jobLimit",finished:"finished"},G={kind:"preset",seconds:86400},Be=new Set(["completed","dead"]);function pe(g){return g===De||Be.has(g)}function Ce(g){if(g.kind==="preset")return g.seconds===G.seconds?null:`${g.seconds}s`;return`${g.from}-${g.to}`}function fe(g){if(g===null||g==="")return G;let b=/^(\d+)-(\d+)$/.exec(g);if(b){let v=Number(b[1]),C=Number(b[2]);return Number.isSafeInteger(v)&&Number.isSafeInteger(C)&&C>v?{kind:"custom",from:v,to:C}:G}if(/^\d+s$/.test(g)){let v=gr(g);return v.kind==="preset"&&g===`${v.seconds}s`?v:G}return G}function Qe(g){return g.kind==="preset"?{kind:"last",ms:g.seconds*1000}:{kind:"between",from:g.from,to:g.to}}function We(g,b,v,C){let T=fe(g.get(D.finished));return{state:b===De?null:b,offset:me(g,D.offset,0),limit:we(me(g,D.limit,C.defaultPageSize),C.maxPageSize),order:g.get(D.order)==="asc"?"asc":"desc",names:Tt(g.get(D.name)??""),search:g.get(D.search)??"",total:!1,attribution:{workerKeys:[v],workerIds:[],finished:pe(b)?Qe(T):null}}}var Ge="Jobs whose last attempt this key ran",He=[D.offset],Te=[{value:De,label:"All"},...Z.map((g)=>({value:g,label:z[g],title:Ut[g]}))];function he({queue:g,workerKey:b}){let v=ie("jobAttribution"),C=y("jobs.list");return e(R,{title:Ge,children:e("div",{"data-testid":"worker-jobs",children:!v?e("div",{"data-testid":"worker-jobs-unrecorded",children:e(d,{title:"Not recorded by this backend",description:"This backend does not record which worker ran a job, so a worker's jobs cannot be listed."})}):!C?e("div",{"data-testid":"worker-jobs-hidden",children:e(d,{title:"Jobs hidden",description:"You may not list this queue's jobs."})}):!us(b)?e("div",{"data-testid":"worker-jobs-unfilterable",children:e(d,{title:"Cannot be filtered to this key",description:"The API splits every filter value at commas, and this key contains one, so the job list cannot be filtered to it."})}):e(Ue,{queue:g,workerKey:b})})})}function Ue({queue:g,workerKey:b}){let v=i(),C=m(),T=Fe()("queues.list"),[x,K]=W(),P=Ye(D.state,Te,De),q=We(x,P,b,C.limits),_=fe(x.get(D.finished)),w=pe(P),N=a({queryKey:ee.jobs(g,q),queryFn:({signal:J})=>Ln(v,g,q,J,{attribution:C.features.jobAttribution,createdOrder:C.features.addedByState}),refetchInterval:Is("jobs"),placeholderData:Y}),j=(J)=>K({[D.finished]:Ce(J),[D.offset]:null}),B=JSON.stringify([q.state,q.order,q.names,q.search,w?x.get(D.finished):null]);return t("section",{className:"jobs-section","aria-label":"Jobs this key ran",children:[e("p",{className:"muted","data-testid":"worker-jobs-last-attempt",children:"Only a job's last attempt is recorded: a job that failed on another worker and then ran here is listed on this page alone."}),e(Rt,{tabs:Te,param:D.state,defaultValue:De,resetParams:He,label:"Job states"}),w?t("div",{"data-testid":"worker-jobs-range",children:[e(xt,{range:_,onChange:j,label:"Range these jobs finished in",maxSpan:null}),e("p",{className:"muted",children:P===De?`Finished in: ${$r(_)}. Only a completed or dead job has a finish time, so a range lists those alone; choose Active for the jobs this key is running now.`:`Finished in: ${$r(_)}.`})]}):t("p",{className:"muted","data-testid":"worker-jobs-no-range",children:[q.state===null?"These":z[q.state]," jobs have not finished, so no date range applies to them: this lists every one whose last attempt this key ran, whenever that was."]}),e(Tr,{filters:q,searchIndexed:C.features.search,onApply:(J)=>K({[D.name]:J.name,[D.search]:J.search,[D.offset]:null}),onOrder:(J)=>K({[D.order]:J==="asc"?"asc":null,[D.offset]:null})},`${x.get(D.name)??""}|${q.search}`),N.isPending?e(p,{label:"Loading this key's jobs",showLabel:!0}):N.isError?e(L,{error:N.error,title:"Could not load this key's jobs",onRetry:()=>void N.refetch()}):t(n,{children:[e(vr,{queue:g,items:N.data.items,label:`Jobs whose last attempt ${b} ran`,linkJobs:T,processedBy:!1,empty:e("div",{"data-testid":"worker-jobs-empty",children:e(d,{title:"No jobs",description:"No job whose last attempt this key ran matches the state, range and filters. Which worker ran a job is kept only as long as the job itself: jobs removed on completion are not listed."})})},B),e(ne,{label:"Pages of this key's jobs",offset:q.offset,limit:q.limit,itemCount:N.data.items.length,hasMore:N.data.page.hasMore,maxPageSize:C.limits.maxPageSize,disabled:N.isFetching&&N.isPlaceholderData,onChange:(J)=>K({[D.offset]:J.offset>0?String(J.offset):null,[D.limit]:String(J.limit)})})]})]})}function Re({workerKey:g,instances:b}){let v=[];for(let w of b)if(w.summon!==void 0)v.push({id:w.id,summon:w.summon});if(v.length===0)return null;let C=b.length-v.length,T=v.some(({summon:w})=>w.kind!==void 0),x=v.some(({summon:w})=>w.group!==void 0),K=v.some(({summon:w})=>w.resolvedMode!==void 0),P=v.some(({summon:w})=>w.mode!==void 0),q=v.some(({summon:w})=>w.deadlineAt!==void 0),_=v.some(({summon:w})=>w.handle!==void 0);return e(R,{title:"Summoned",children:t("div",{"data-testid":"worker-summon",children:[e("p",{className:"muted worker-target-note",children:Oo}),t(I,{label:`Summoned instances of ${g}`,children:[e("thead",{children:t("tr",{children:[e("th",{scope:"col",children:"Instance"}),e("th",{scope:"col",children:"Summon"}),T&&e("th",{scope:"col",children:"Summoner"}),x&&e("th",{scope:"col",children:"Unit of"}),K&&e("th",{scope:"col",children:"Runs as"}),P&&e("th",{scope:"col",children:"Requested mode"}),q&&e("th",{scope:"col",children:"Requested deadline"}),_&&e("th",{scope:"col",children:"Handle"})]})}),e("tbody",{children:v.map(({id:w,summon:N})=>t("tr",{"data-testid":`worker-summon-row-${w}`,children:[e("th",{scope:"row",children:e("code",{children:w})}),e("td",{children:e("code",{children:u(N.id)})}),T&&e("td",{children:N.kind!==void 0&&u(N.kind)}),x&&e("td",{title:N.group===void 0?void 0:qn(N.group),children:N.group===void 0?"—":u(N.group)}),K&&e("td",{title:N.resolvedMode===void 0?void 0:"The mode it actually runs in: its own option, else the requested mode, else exit when idle.",children:N.resolvedMode!==void 0&&pn(N.resolvedMode)}),P&&e("td",{title:N.mode===void 0?void 0:Ao(N.mode),children:N.mode!==void 0&&pn(N.mode)}),q&&e("td",{children:N.deadlineAt!==void 0&&e(A,{value:N.deadlineAt,hint:"As requested by the summoner."})}),_&&e("td",{children:N.handle!==void 0&&e("code",{className:"worker-target-file",children:u(N.handle)})})]},w))})]}),C>0&&t("p",{className:"muted","data-testid":"worker-summon-others",children:[h(C,"other instance")," of this key"," ",C===1?"reports":"report"," no summon."]})]})})}var Ze=5,Xe="This worker predates target reporting, so it does not say where its attempts run.";function ke({testId:g}){return e("span",{className:"muted",title:"Not reported: this worker predates target reporting.","data-testid":g,children:"—"})}function et({target:g}){if(g===void 0)return e(F,{items:[{label:"Runs in",value:e(ke,{testId:"worker-target-kind"}),hint:e("span",{"data-testid":"worker-target-predates",children:Xe})}]});return e(F,{items:[{label:"Runs in",value:e("span",{"data-testid":"worker-target-kind",children:Jn(g.kind)}),hint:Hn(g.kind)},{label:"Processor",value:e("span",{"data-testid":"worker-target-processor",children:Sr(g.processor)})},g.name!==void 0&&{label:"Name",value:e("code",{"data-testid":"worker-target-name",children:u(g.name)})},g.file!==void 0&&{label:"File",value:e("code",{className:"worker-target-file","data-testid":"worker-target-file",children:u(g.file)})}]})}function tt({ids:g}){let b=g.slice(0,Ze),v=g.length-b.length;return t(n,{children:[h(g.length,"instance"),":"," ",b.map((C,T)=>t("span",{children:[T>0&&", ",e("code",{children:C})]},C)),v>0&&` and ${h(v,"more","more")}`]})}function rt({workerKey:g,groups:b}){let v=b.some((T)=>T.target?.name!==void 0),C=b.some((T)=>T.target?.file!==void 0);return t(n,{children:[e("p",{className:"notice",role:"note","data-testid":"worker-target-differs",children:"Not every instance of this key runs the same way: a redeploy is still rolling out, or the instances were built from different code. Each row is one way, with the instances that report it."}),t(I,{label:`Targets of ${g}`,children:[e("thead",{children:t("tr",{children:[e("th",{scope:"col",children:"Runs in"}),e("th",{scope:"col",children:"Processor"}),v&&e("th",{scope:"col",children:"Name"}),C&&e("th",{scope:"col",children:"File"}),e("th",{scope:"col",children:"Instances"})]})}),e("tbody",{children:b.map(({target:T,ids:x})=>t("tr",{"data-testid":"worker-target-group",children:[e("th",{scope:"row",title:T===void 0?void 0:Hn(T.kind),children:T===void 0?e(ke,{}):Jn(T.kind)}),e("td",{children:T===void 0?e(ke,{}):Sr(T.processor)}),v&&e("td",{children:T?.name!==void 0&&e("code",{children:u(T.name)})}),C&&e("td",{children:T?.file!==void 0&&e("code",{className:"worker-target-file",children:u(T.file)})}),e("td",{children:e(tt,{ids:x})})]},x[0]))})]})]})}function Ae({workerKey:g,instances:b}){let v=Do(b);return e(R,{title:"Target",children:e("div",{"data-testid":"worker-target",children:v.length===0?e("p",{className:"muted",children:"Where this key's attempts run is known once an instance reports."}):t(n,{children:[e("p",{className:"muted worker-target-note",children:Ro}),v.length===1?e(et,{target:v[0].target}):e(rt,{workerKey:g,groups:v})]})})})}var ot=10;function nt(g){return g!==void 0&&Object.values(g.values).some((b)=>b!==void 0)?g:null}function dt(){let{queue:g="",key:b=""}=de(),v=i(),C=y("workers.list"),T=Fe()("queues.list"),x=Fn();fn(g,y("queues.read")&&C);let K=a({queryKey:_e.ofKey(g,b),queryFn:({signal:j})=>hn(v,{queue:[g],key:[b],includeOffline:!0},j),refetchInterval:x,enabled:C});if(!C)return t("div",{className:"screen",children:[e("h1",{className:"screen-title",children:b}),e(d,{title:"Instances hidden",description:"You may not list workers on this queue, so its instances and configuration are not shown."}),e(ce,{queue:g,workerKey:b}),e(he,{queue:g,workerKey:b})]});let P=K.data?.items??[],q=K.data?.offline,_=q===void 0?void 0:nt(q.find((j)=>j.queue===g&&j.key===b)),w=P.find((j)=>j.service!==void 0)?.service,N=P.some((j)=>j.host!==void 0||j.pid!==void 0);return t("div",{className:"screen","data-testid":"worker-screen",children:[t("div",{className:"worker-header",children:[t("h1",{className:"screen-title",children:[e("span",{className:"visually-hidden",children:"Worker "}),b]}),e(F,{className:"worker-header-facts",items:[{label:"Queue",value:T?e(E,{to:Ve(g),children:g}):g},{label:"Service",value:P.length===0?null:w??e("span",{className:"muted",children:"None named"}),hint:P.length===0?"Known once an instance reports.":void 0}]})]}),K.isPending?e(p,{label:"Loading this worker",showLabel:!0}):K.isError?e(L,{error:K.error,title:"Could not load this worker",onRetry:()=>void K.refetch()}):t(n,{children:[e(R,{title:"Instances",actions:e("span",{className:"muted",children:h(P.length,"live instance")}),children:e("div",{"data-testid":"worker-instances",children:P.length===0?e(d,{title:"No live instance",description:"No worker carrying this key is reporting now. One appears here when a process starts it; a stopped worker that lapsed is not listed."}):e(Dt,{workers:P,label:`Instances of ${b}`,showQueue:!1,showHost:N,showMemory:!0,pageSize:ot})})}),e(Ae,{workerKey:b,instances:P}),e(Re,{workerKey:b,instances:P}),e(Ne,{queue:g,workerKey:b,instances:P,stored:_})]}),e(ce,{queue:g,workerKey:b}),e(he,{queue:g,workerKey:b})]})}var ge=["queue","service","host","state"];function lt(g){return Tn.includes(g)}function Ee(g){let b=g.get("state")?.trim()??"";return{queue:g.get("queue")?.trim()??"",service:g.get("service")?.trim()??"",host:g.get("host")?.trim()??"",state:lt(b)?b:""}}function Pe(g){return ge.some((b)=>g[b]!=="")}function Ie(g,b){let v={};if(g.queue)v.queue=[g.queue];if(g.service)v.service=[g.service];if(g.host&&b)v.host=[g.host];if(g.state)v.state=[g.state];return v}var ct=25;function mt(g){if(g.host===null&&g.pid===null)return"Hosts hidden by the API";return`${g.host??"unknown host"} · pid ${g.pid??"?"}`}function ut({server:g,linkQueues:b,linkKeys:v}){let C=mt(g);return t("section",{className:"worker-server","data-testid":`worker-server-${g.key}`,children:[t("h3",{className:"worker-server-title",children:[C," ",e("span",{className:"muted",children:h(g.workers.length,"worker")})]}),e(Dt,{workers:g.workers,label:`Workers on ${C}`,linkQueues:b,linkKeys:v,showMemory:!0,pageSize:ct})]})}function pt({group:g,linkQueues:b,linkKeys:v}){return e(R,{title:g.service??"No service named",actions:e("span",{className:"muted",children:h(g.count,"worker")}),children:t("div",{"data-testid":`worker-service-${g.service??"none"}`,children:[g.service===null&&t("p",{className:"muted worker-service-note",children:["These processes set no ",e("code",{children:"service"})," on their BunJobs context, so they are grouped by host and pid alone."]}),g.servers.map((C)=>e(ut,{server:C,linkQueues:b,linkKeys:v},C.key))]})})}var ft={running:"Running",paused:"Paused",stopping:"Stopping",stopped:"Stopped",restarting:"Restarting"};function re({label:g,any:b,value:v,choices:C,onChange:T,labelOf:x}){let K=v!==""&&!C.includes(v)?[v,...C]:C;return e(l,{label:g,children:e(S,{options:[{value:"",label:b},...K.map((P)=>({value:P,label:x?x(P):P}))],value:v,onChange:T})})}function ht(){let g=i(),b=y("workers.list"),v=y("queues.list"),C=Oe(),[T,x]=W(),K=c(),P=T.get("search")??"",q=Me(P),_=Ee(T),w=Fn();No(b);let N=a({queryKey:_e.list(),queryFn:({signal:M})=>hn(g,{},M),refetchInterval:w,enabled:b}),j=N.isSuccess?To(N.data.items)??!1:N.isError,B=N.isSuccess||N.isError,J=Ie(_,j),V=a({queryKey:_e.list(J),queryFn:({signal:M})=>hn(g,J,M),refetchInterval:w,enabled:b&&(_.host===""||B)});if(!b)return t("div",{className:"screen",children:[e("h1",{className:"screen-title",children:"Workers"}),e(d,{title:"Nothing to show",description:"You may not list workers on this API."})]});let U=N.data?.items??[],ye=Pe(_),X=V.data?.items??[],oe=X.filter((M)=>So(M,q)),se=vo(oe),Le=se.reduce((M,le)=>M+le.servers.length,0),ae=N.data?U.length:X.length,te=(M)=>(le)=>x({[M]:le}),be=()=>x(Object.fromEntries(ge.map((M)=>[M,null])));return t("div",{className:"screen","data-testid":"workers-list",children:[e("h1",{className:"screen-title",children:"Workers"}),t("div",{className:"worker-filters",role:"search","aria-label":"Filter workers","data-testid":"worker-filters",children:[t("div",{className:"search",children:[e("label",{htmlFor:K,className:"visually-hidden",children:"Filter workers by id, queue or host"}),e("input",{id:K,type:"search",className:"input",placeholder:"Filter workers",...ve,value:P,maxLength:200,onChange:(M)=>x({search:M.target.value})})]}),e(re,{label:"Queue",any:"Any queue",value:_.queue,choices:Gn(U,"queue"),onChange:te("queue")}),e(re,{label:"Service",any:"Any service",value:_.service,choices:Gn(U,"service"),onChange:te("service")}),j&&e(re,{label:"Host",any:"Any host",value:_.host,choices:Gn(U,"host"),onChange:te("host")}),e(re,{label:"State",any:"Any state",value:_.state,choices:Tn,onChange:te("state"),labelOf:(M)=>ft[M]}),ye&&e(s,{size:"sm",onClick:be,children:"Clear filters"})]}),_.host!==""&&B&&!j&&t("p",{className:"notice",role:"note","data-testid":"workers-host-ignored",children:["This API hides worker hosts, so the host filter in this link (",e("code",{children:_.host}),") is ignored."]}),V.isPending?e(p,{label:"Loading workers",showLabel:!0}):V.isError?e(L,{error:V.error,title:"Could not load workers",onRetry:()=>void V.refetch()}):X.length===0&&(!ye||ae===0)?e(d,{title:"No live workers",description:"Workers appear here once a process runs one and it reports."}):X.length===0?e(d,{title:"No workers match these filters",description:"No live worker has every value chosen above.",action:e(s,{size:"sm",onClick:be,children:"Clear filters"})}):se.length===0?e(d,{title:"No workers match",description:`No worker id, queue or host contains “${q.trim()}”.`}):t(n,{children:[t("p",{className:"muted","data-testid":"workers-count",children:[h(oe.length,"worker")," on ",h(Le,"server"),oe.length<ae&&` (of ${ae})`]}),se.map((M)=>e(pt,{group:M,linkQueues:v,linkKeys:C},M.service??""))]})]})}export{dt as WorkerScreen,ht as WorkersListScreen};
2
+
3
+ //# debugId=AC0C8BC200BBDE9064756E2164756E21
4
+ //# sourceMappingURL=index-5c933424.js.map
@@ -13,6 +13,6 @@
13
13
  "import type { WorkerState } from \"../../api/contract\";\nimport type { WorkerServer, WorkerServiceGroup } from \"../../api/workers\";\nimport type { WorkerFilterValues } from \"./filters\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useDeferredValue, useId } from \"react\";\nimport { WORKER_STATES } from \"../../api/contract\";\nimport {\n distinctValues,\n groupByService,\n hostsExposed,\n listWorkers,\n matchesWorker,\n workerKeys,\n} from \"../../api/workers\";\nimport { Button } from \"../../components/Button\";\nimport { Card } from \"../../components/Card\";\nimport { EmptyState } from \"../../components/EmptyState\";\nimport { ErrorView } from \"../../components/ErrorView\";\nimport { Field } from \"../../components/Field\";\nimport { Select } from \"../../components/inputs\";\nimport { Spinner } from \"../../components/Spinner\";\nimport { useApiClient } from \"../../context\";\nimport { plural } from \"../../format\";\nimport { SEARCH_SHORTCUT } from \"../../layout/shortcuts\";\nimport { useCan } from \"../../meta/hooks\";\nimport { useUrlParams } from \"../queues/urlState\";\nimport {\n hasWorkerFilters,\n readWorkerFilters,\n WORKER_FILTER_PARAMS,\n workerListQuery,\n} from \"./filters\";\nimport { useWorkerListLive, useWorkerRefetchInterval } from \"./live\";\nimport { useWorkerPagesRouted } from \"./routed\";\nimport { WorkerTable } from \"./WorkerTable\";\nimport \"./workers.css\";\n\n/**\n * Workers per page in a server's section.\n *\n * Twenty-five: a server usually runs a handful, so the common section is one\n * page with no pager at all, while a host running a worker per queue — dozens\n * of rows carrying state, counts, memory and controls — is cut down to a\n * readable block without hiding which server it belongs to. The pager is per\n * **server section**, the table it pages: a pager per service card, or one\n * over the whole page, would have to page across the host headings that say\n * where a worker runs.\n */\nconst SERVER_PAGE_SIZE = 25;\n\n/** A server's heading: `host · pid N`, or a note when the API hides hosts. */\nfunction serverTitle(server: WorkerServer): string {\n if (server.host === null && server.pid === null) {\n return \"Hosts hidden by the API\";\n }\n return `${server.host ?? \"unknown host\"} · pid ${server.pid ?? \"?\"}`;\n}\n\n/** One server's workers, as a section inside its service's card. */\nfunction ServerSection({\n server,\n linkQueues,\n linkKeys,\n}: {\n /** The server and its workers. */\n server: WorkerServer;\n /** Whether queue names link to the queue screen (`queues.list`). */\n linkQueues: boolean;\n /** Whether stable keys link to their worker page. */\n linkKeys: boolean;\n}) {\n const title = serverTitle(server);\n return (\n <section\n className=\"worker-server\"\n data-testid={`worker-server-${server.key}`}\n >\n <h3 className=\"worker-server-title\">\n {title}{\" \"}\n <span className=\"muted\">{plural(server.workers.length, \"worker\")}</span>\n </h3>\n <WorkerTable\n workers={server.workers}\n label={`Workers on ${title}`}\n linkQueues={linkQueues}\n linkKeys={linkKeys}\n showMemory\n pageSize={SERVER_PAGE_SIZE}\n />\n </section>\n );\n}\n\n/** One service's servers: a card per service, a section per server inside it. */\nfunction ServiceCard({\n group,\n linkQueues,\n linkKeys,\n}: {\n /** The service, its servers and its worker count. */\n group: WorkerServiceGroup;\n /** Whether queue names link to the queue screen (`queues.list`). */\n linkQueues: boolean;\n /** Whether stable keys link to their worker page. */\n linkKeys: boolean;\n}) {\n return (\n <Card\n title={group.service ?? \"No service named\"}\n actions={<span className=\"muted\">{plural(group.count, \"worker\")}</span>}\n >\n <div data-testid={`worker-service-${group.service ?? \"none\"}`}>\n {group.service === null && (\n <p className=\"muted worker-service-note\">\n These processes set no <code>service</code> on their BunJobs\n context, so they are grouped by host and pid alone.\n </p>\n )}\n {group.servers.map((server) => (\n <ServerSection\n key={server.key}\n server={server}\n linkQueues={linkQueues}\n linkKeys={linkKeys}\n />\n ))}\n </div>\n </Card>\n );\n}\n\n/** How each worker state reads in the State filter. */\nconst STATE_LABELS: Readonly<Record<WorkerState, string>> = {\n running: \"Running\",\n paused: \"Paused\",\n stopping: \"Stopping\",\n stopped: \"Stopped\",\n restarting: \"Restarting\",\n};\n\n/** Props of {@link FilterSelect}. */\ninterface FilterSelectProps {\n /** The visible label, e.g. \"Queue\". */\n label: string;\n /** What \"no filter\" reads as, e.g. \"Any queue\". */\n any: string;\n /** The value in force; `\"\"` for any. */\n value: string;\n /** The values to offer, from the unfiltered list. The value in force is offered too, even when no live worker has it any more. */\n choices: readonly string[];\n /** Sets the filter; `\"\"` clears it. */\n onChange: (value: string) => void;\n /** How a value reads, when not as itself. */\n labelOf?: (value: string) => string;\n}\n\n/** One server-side filter: a select over the values the live workers have. */\nfunction FilterSelect({\n label,\n any,\n value,\n choices,\n onChange,\n labelOf,\n}: FilterSelectProps) {\n const values =\n value !== \"\" && !choices.includes(value) ? [value, ...choices] : choices;\n return (\n <Field label={label}>\n <Select\n options={[\n { value: \"\", label: any },\n ...values.map((choice) => ({\n value: choice,\n label: labelOf ? labelOf(choice) : choice,\n })),\n ]}\n value={value}\n onChange={onChange}\n />\n </Field>\n );\n}\n\n/**\n * `/workers`: every live worker in the namespace, grouped by service, then by\n * the server hosting it.\n *\n * Queue, service, host and state are **server-side** filters, sent to\n * `GET /workers` and kept in the URL; the search box narrows what came back,\n * in the browser. The choices each filter offers come from the unfiltered\n * list, which is the same read (and cache entry) the page shows when nothing\n * is filtered, so an unfiltered page costs one request.\n */\nexport function WorkersListScreen() {\n const api = useApiClient();\n const canList = useCan(\"workers.list\");\n const canQueues = useCan(\"queues.list\");\n const linkKeys = useWorkerPagesRouted();\n const [params, update] = useUrlParams();\n const filterId = useId();\n const filter = params.get(\"search\") ?? \"\";\n const deferredFilter = useDeferredValue(filter);\n const filters = readWorkerFilters(params);\n\n const refetchInterval = useWorkerRefetchInterval();\n useWorkerListLive(canList);\n // The unfiltered list: what each filter offers, and whether hosts show.\n const everything = useQuery({\n queryKey: workerKeys.list(),\n queryFn: ({ signal }) => listWorkers(api, {}, signal),\n refetchInterval,\n enabled: canList,\n });\n // Hosts are hidden when the workers carry none. Until the list answers the\n // page cannot tell, so a `?host=` waits for it; if it failed, the API\n // decides (and says so).\n const hostsShown = everything.isSuccess\n ? (hostsExposed(everything.data.items) ?? false)\n : everything.isError;\n const hostKnown = everything.isSuccess || everything.isError;\n const query = workerListQuery(filters, hostsShown);\n const workers = useQuery({\n queryKey: workerKeys.list(query),\n queryFn: ({ signal }) => listWorkers(api, query, signal),\n refetchInterval,\n enabled: canList && (filters.host === \"\" || hostKnown),\n });\n\n if (!canList) {\n return (\n <div className=\"screen\">\n <h1 className=\"screen-title\">Workers</h1>\n <EmptyState\n title=\"Nothing to show\"\n description=\"You may not list workers on this API.\"\n />\n </div>\n );\n }\n\n const live = everything.data?.items ?? [];\n const filtered = hasWorkerFilters(filters);\n const all = workers.data?.items ?? [];\n const shown = all.filter((worker) => matchesWorker(worker, deferredFilter));\n const services = groupByService(shown);\n const serverCount = services.reduce(\n (total, group) => total + group.servers.length,\n 0,\n );\n const total = everything.data ? live.length : all.length;\n const setFilter = (name: keyof WorkerFilterValues) => (value: string) =>\n update({ [name]: value });\n const clearFilters = () =>\n update(\n Object.fromEntries(WORKER_FILTER_PARAMS.map((name) => [name, null])),\n );\n\n return (\n <div\n className=\"screen\"\n data-testid=\"workers-list\"\n >\n <h1 className=\"screen-title\">Workers</h1>\n {/*\n * A ROW, never a bare child of the column-flex `.screen`: there a\n * `.search`'s `flex: 0 1 260px` is a height, and the box grew 260px\n * tall. `__tests__/app/workers/filters.test.tsx` pins both.\n */}\n <div\n className=\"worker-filters\"\n role=\"search\"\n aria-label=\"Filter workers\"\n data-testid=\"worker-filters\"\n >\n <div className=\"search\">\n <label\n htmlFor={filterId}\n className=\"visually-hidden\"\n >\n Filter workers by id, queue or host\n </label>\n <input\n id={filterId}\n type=\"search\"\n className=\"input\"\n placeholder=\"Filter workers\"\n {...SEARCH_SHORTCUT}\n value={filter}\n maxLength={200}\n onChange={(event) => update({ search: event.target.value })}\n />\n </div>\n <FilterSelect\n label=\"Queue\"\n any=\"Any queue\"\n value={filters.queue}\n choices={distinctValues(live, \"queue\")}\n onChange={setFilter(\"queue\")}\n />\n <FilterSelect\n label=\"Service\"\n any=\"Any service\"\n value={filters.service}\n choices={distinctValues(live, \"service\")}\n onChange={setFilter(\"service\")}\n />\n {hostsShown && (\n <FilterSelect\n label=\"Host\"\n any=\"Any host\"\n value={filters.host}\n choices={distinctValues(live, \"host\")}\n onChange={setFilter(\"host\")}\n />\n )}\n <FilterSelect\n label=\"State\"\n any=\"Any state\"\n value={filters.state}\n choices={WORKER_STATES}\n onChange={setFilter(\"state\")}\n labelOf={(state) => STATE_LABELS[state as WorkerState]}\n />\n {filtered && (\n <Button\n size=\"sm\"\n onClick={clearFilters}\n >\n Clear filters\n </Button>\n )}\n </div>\n {filters.host !== \"\" && hostKnown && !hostsShown && (\n <p\n className=\"notice\"\n role=\"note\"\n data-testid=\"workers-host-ignored\"\n >\n This API hides worker hosts, so the host filter in this link (\n <code>{filters.host}</code>) is ignored.\n </p>\n )}\n {workers.isPending ? (\n <Spinner\n label=\"Loading workers\"\n showLabel\n />\n ) : workers.isError ? (\n <ErrorView\n error={workers.error}\n title=\"Could not load workers\"\n onRetry={() => void workers.refetch()}\n />\n ) : all.length === 0 && (!filtered || total === 0) ? (\n <EmptyState\n title=\"No live workers\"\n description=\"Workers appear here once a process runs one and it reports.\"\n />\n ) : all.length === 0 ? (\n <EmptyState\n title=\"No workers match these filters\"\n description=\"No live worker has every value chosen above.\"\n action={\n <Button\n size=\"sm\"\n onClick={clearFilters}\n >\n Clear filters\n </Button>\n }\n />\n ) : services.length === 0 ? (\n <EmptyState\n title=\"No workers match\"\n description={`No worker id, queue or host contains “${deferredFilter.trim()}”.`}\n />\n ) : (\n <>\n <p\n className=\"muted\"\n data-testid=\"workers-count\"\n >\n {plural(shown.length, \"worker\")} on {plural(serverCount, \"server\")}\n {shown.length < total && ` (of ${total})`}\n </p>\n {services.map((group) => (\n <ServiceCard\n key={group.service ?? \"\"}\n group={group}\n linkQueues={canQueues}\n linkKeys={linkKeys}\n />\n ))}\n </>\n )}\n </div>\n );\n}\n"
14
14
  ],
15
15
  "mappings": "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",
16
- "debugId": "75DB8E84E0A41F2264756E2164756E21",
16
+ "debugId": "AC0C8BC200BBDE9064756E2164756E21",
17
17
  "names": []
18
18
  }