wurk 1.1.0 → 1.1.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 (113) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +25 -0
  3. data/app/controllers/concerns/wurk/same_origin_guard.rb +40 -0
  4. data/app/controllers/concerns/wurk/sse_streaming.rb +48 -0
  5. data/app/controllers/concerns/wurk/stream_concurrency_guard.rb +53 -0
  6. data/app/controllers/wurk/api/pagination.rb +60 -11
  7. data/app/controllers/wurk/api/serializers.rb +5 -1
  8. data/app/controllers/wurk/api_controller.rb +51 -70
  9. data/app/controllers/wurk/application_controller.rb +26 -0
  10. data/app/controllers/wurk/dashboard_controller.rb +23 -1
  11. data/app/controllers/wurk/extensions_controller.rb +3 -12
  12. data/app/controllers/wurk/profiles_controller.rb +6 -1
  13. data/lib/wurk/batch/death_handler.rb +13 -0
  14. data/lib/wurk/batch/server_middleware.rb +9 -5
  15. data/lib/wurk/batch.rb +3 -0
  16. data/lib/wurk/capsule.rb +34 -21
  17. data/lib/wurk/cli.rb +16 -3
  18. data/lib/wurk/client/buffered.rb +30 -10
  19. data/lib/wurk/client.rb +45 -1
  20. data/lib/wurk/component.rb +23 -9
  21. data/lib/wurk/configuration.rb +83 -18
  22. data/lib/wurk/cron.rb +13 -1
  23. data/lib/wurk/dead_set.rb +16 -1
  24. data/lib/wurk/engine.rb +17 -1
  25. data/lib/wurk/fetcher/reliable.rb +46 -13
  26. data/lib/wurk/fetcher.rb +5 -0
  27. data/lib/wurk/health.rb +74 -22
  28. data/lib/wurk/history.rb +4 -21
  29. data/lib/wurk/job_retry.rb +3 -5
  30. data/lib/wurk/launcher.rb +26 -3
  31. data/lib/wurk/limiter/server_middleware.rb +16 -1
  32. data/lib/wurk/limiter.rb +6 -5
  33. data/lib/wurk/lua/loader.rb +11 -5
  34. data/lib/wurk/lua.rb +100 -9
  35. data/lib/wurk/manager.rb +59 -19
  36. data/lib/wurk/metrics/history.rb +24 -38
  37. data/lib/wurk/metrics/queue_rollup.rb +4 -21
  38. data/lib/wurk/metrics/rollup.rb +4 -21
  39. data/lib/wurk/processor.rb +8 -8
  40. data/lib/wurk/profile_set.rb +21 -6
  41. data/lib/wurk/profiler.rb +7 -5
  42. data/lib/wurk/rails_boot.rb +176 -0
  43. data/lib/wurk/railtie.rb +19 -47
  44. data/lib/wurk/redis_connection.rb +6 -9
  45. data/lib/wurk/redis_pool.rb +148 -28
  46. data/lib/wurk/scheduled.rb +35 -12
  47. data/lib/wurk/swarm/backoff.rb +70 -0
  48. data/lib/wurk/swarm/child_boot.rb +92 -13
  49. data/lib/wurk/swarm/orphan_guard.rb +105 -0
  50. data/lib/wurk/swarm/restart.rb +196 -0
  51. data/lib/wurk/swarm.rb +194 -78
  52. data/lib/wurk/timer_loop.rb +49 -0
  53. data/lib/wurk/version.rb +1 -1
  54. data/lib/wurk/web/extension.rb +4 -1
  55. data/lib/wurk/web/pool_scope.rb +46 -0
  56. data/lib/wurk/web/rack_app.rb +2 -1
  57. data/lib/wurk/web/search.rb +77 -18
  58. data/lib/wurk/web.rb +1 -0
  59. data/lib/wurk/worker/setter.rb +6 -1
  60. data/lib/wurk.rb +6 -2
  61. data/vendor/assets/dashboard/assets/ArgsValue-DYfBiXrJ.js +1 -0
  62. data/vendor/assets/dashboard/assets/BatchDetail-DTZ2HzcD.js +1 -0
  63. data/vendor/assets/dashboard/assets/Batches-BrnXA332.js +1 -0
  64. data/vendor/assets/dashboard/assets/Busy-C57G8Xb3.js +1 -0
  65. data/vendor/assets/dashboard/assets/Cron-DlyH88oo.js +1 -0
  66. data/vendor/assets/dashboard/assets/Dashboard-B887pxWf.js +1 -0
  67. data/vendor/assets/dashboard/assets/Dead-BPA7gs-X.js +1 -0
  68. data/vendor/assets/dashboard/assets/Extension-Bunf6XuU.js +1 -0
  69. data/vendor/assets/dashboard/assets/FilterBox-FCDi4ZCU.js +1 -0
  70. data/vendor/assets/dashboard/assets/JobDetailModal-DuMdKUMm.js +2 -0
  71. data/vendor/assets/dashboard/assets/Limiters-Br0aCPMK.js +1 -0
  72. data/vendor/assets/dashboard/assets/Metrics-DxBmuywH.js +1 -0
  73. data/vendor/assets/dashboard/assets/Modal-t4FI_LaY.js +1 -0
  74. data/vendor/assets/dashboard/assets/PageHeader-CsDvJSOA.js +1 -0
  75. data/vendor/assets/dashboard/assets/Profiles-Bkhoqjlq.js +1 -0
  76. data/vendor/assets/dashboard/assets/Queues-BvhA-vfI.js +1 -0
  77. data/vendor/assets/dashboard/assets/Retries-JEpB-1Yl.js +1 -0
  78. data/vendor/assets/dashboard/assets/Scheduled-DN_FbSwP.js +1 -0
  79. data/vendor/assets/dashboard/assets/Search-DJuK0YCJ.js +1 -0
  80. data/vendor/assets/dashboard/assets/Skeleton-DOYDkzg1.js +1 -0
  81. data/vendor/assets/dashboard/assets/charts-CVK0zAnC.js +1 -0
  82. data/vendor/assets/dashboard/assets/index-BnPX9Ptn.css +1 -0
  83. data/vendor/assets/dashboard/assets/index-CZTcs-pM.js +141 -0
  84. data/vendor/assets/dashboard/assets/useResetPageOnEmpty-CoZU4b3a.js +1 -0
  85. data/vendor/assets/dashboard/assets/useSort-wQcnbdsa.js +1 -0
  86. data/vendor/assets/dashboard/index.html +3 -3
  87. data/vendor/assets/dashboard/wurk-manifest.json +2 -2
  88. metadata +55 -26
  89. data/vendor/assets/dashboard/assets/ArgsValue-BUqJa-eG.js +0 -1
  90. data/vendor/assets/dashboard/assets/BatchDetail-C5dkqAzp.js +0 -1
  91. data/vendor/assets/dashboard/assets/Batches-bgkXn8tc.js +0 -1
  92. data/vendor/assets/dashboard/assets/Busy-QSHBFXhy.js +0 -1
  93. data/vendor/assets/dashboard/assets/Cron-CUHppvTA.js +0 -1
  94. data/vendor/assets/dashboard/assets/Dashboard-CzPudckV.js +0 -1
  95. data/vendor/assets/dashboard/assets/Dead-BIq4Nz_i.js +0 -1
  96. data/vendor/assets/dashboard/assets/Extension-CW36i9R1.js +0 -1
  97. data/vendor/assets/dashboard/assets/JobDetailModal-BhNdWSp7.js +0 -2
  98. data/vendor/assets/dashboard/assets/Limiters-CiI_DfUK.js +0 -1
  99. data/vendor/assets/dashboard/assets/Metrics-BzZ8ugms.js +0 -1
  100. data/vendor/assets/dashboard/assets/Modal-DzVfgsSF.js +0 -1
  101. data/vendor/assets/dashboard/assets/PageHeader-Dp3qhX3e.js +0 -1
  102. data/vendor/assets/dashboard/assets/Profiles-BTtIlTdR.js +0 -1
  103. data/vendor/assets/dashboard/assets/Queues-BuXoxQ4W.js +0 -1
  104. data/vendor/assets/dashboard/assets/Retries-D4HAPaOQ.js +0 -1
  105. data/vendor/assets/dashboard/assets/Scheduled-6NCZYVJh.js +0 -1
  106. data/vendor/assets/dashboard/assets/Search-JaB_-52c.js +0 -1
  107. data/vendor/assets/dashboard/assets/charts-6uvCyY0x.js +0 -1
  108. data/vendor/assets/dashboard/assets/i18n-gIeA5VLo.js +0 -1
  109. data/vendor/assets/dashboard/assets/index-BDG9tvBA.css +0 -1
  110. data/vendor/assets/dashboard/assets/index-DWfWAGBc.js +0 -141
  111. data/vendor/assets/dashboard/assets/useJobSetActions-DTDaAoWr.js +0 -1
  112. data/vendor/assets/dashboard/assets/usePageParam-BcAvRko-.js +0 -1
  113. data/vendor/assets/dashboard/assets/useSort-D5Am4bGq.js +0 -1
@@ -12,9 +12,12 @@ module Wurk
12
12
  # on Retry/Scheduled/Dead pages, substring across job payload via ZSCAN").
13
13
  # Wurk ships it free, extended to also cover the queue LIST.
14
14
  #
15
- # ZSET stores use `ZSCAN MATCH *needle*` (the substring is literal,
16
- # wrapped in glob stars — Redis matches the raw JSON payload). The queue
17
- # LIST falls back to a paged LRANGE filter since LIST has no SCAN.
15
+ # ZSET stores are ZSCAN-paged and filtered client-side against the literal
16
+ # substring — the same shape as the queue LIST's paged LRANGE filter —
17
+ # rather than `ZSCAN MATCH`: MATCH returns only matches, never the count of
18
+ # elements Redis walked, so a no-match keystroke couldn't be metered and
19
+ # could round-trip an enormous ZSET. Both paths charge the shared scan
20
+ # budget so a keystroke never full-walks a multi-million-entry store.
18
21
  #
19
22
  # Result shape mirrors `Wurk::Api::Serializers#sorted_entry` so the SPA
20
23
  # renders search hits with the same component as a sorted-set row.
@@ -24,6 +27,12 @@ module Wurk
24
27
  KINDS = %w[queues retry scheduled dead].freeze
25
28
  QUEUE_PAGE = 50
26
29
  ZSCAN_PAGE = 200
30
+ # A queue LIST has no SCAN, so a keystroke must never full-walk a
31
+ # multi-million-entry queue. Bound each queue's scan and the whole
32
+ # request's scan; `truncated?` flips when we stop early so the API can
33
+ # tell the UI it's showing partial results.
34
+ SCAN_LIMIT_PER_QUEUE = 5_000
35
+ SCAN_BUDGET = 20_000
27
36
 
28
37
  attr_reader :substring, :kinds, :limit
29
38
 
@@ -32,8 +41,16 @@ module Wurk
32
41
  @kinds = (Array(kinds).map(&:to_s) & KINDS)
33
42
  @kinds = KINDS.dup if @kinds.empty?
34
43
  @limit = limit.to_i.clamp(1, MAX_LIMIT)
44
+ @truncated = false
45
+ @scanned = 0
35
46
  end
36
47
 
48
+ # True when a scan stopped at a bound (a queue's per-queue cap, a sorted
49
+ # set's page loop, or the shared per-request budget) with elements left
50
+ # unexamined — the hit list may be incomplete. Meaningful only after
51
+ # `each`/`to_a` has driven the scan.
52
+ def truncated? = @truncated
53
+
37
54
  # Streams matching hits across every selected store. Stops at `limit`.
38
55
  # Yields Hashes shaped like sorted_entry payloads with an extra
39
56
  # `:kind` discriminator + `:name` (queue name or set name).
@@ -41,6 +58,8 @@ module Wurk
41
58
  return enum_for(:each) unless block_given?
42
59
  return if @substring.empty?
43
60
 
61
+ @scanned = 0
62
+ @truncated = false
44
63
  emitted = 0
45
64
  each_hit do |row|
46
65
  yield row
@@ -66,33 +85,73 @@ module Wurk
66
85
 
67
86
  def search_queues
68
87
  Queue.all.each do |queue|
69
- paged_lrange(queue.name) do |payload|
88
+ if @scanned >= SCAN_BUDGET
89
+ @truncated = true
90
+ break
91
+ end
92
+
93
+ scan_queue_list(queue.name) do |payload|
70
94
  next unless payload.include?(@substring)
71
95
 
72
- record = JobRecord.new(payload, queue.name)
73
- yield queue_row(queue.name, record)
96
+ yield queue_row(queue.name, JobRecord.new(payload, queue.name))
74
97
  end
75
98
  end
76
99
  end
77
100
 
78
- def paged_lrange(queue_name, &block)
101
+ # LRANGE-pages one queue LIST, yielding each raw payload to the substring
102
+ # filter. `LLEN` gives the exact size up front (see #queue_scan_stop), so
103
+ # we scan a bounded prefix and never full-walk the LIST from a keystroke.
104
+ def scan_queue_list(queue_name, &)
79
105
  key = Keys.queue(queue_name)
80
- page = 0
81
- loop do
82
- start = page * QUEUE_PAGE
83
- stop = start + QUEUE_PAGE - 1
84
- slice = Wurk.redis { |c| c.call('LRANGE', key, start, stop) }
85
- slice.each(&block)
86
- break if slice.size < QUEUE_PAGE
87
-
88
- page += 1
106
+ stop_at = queue_scan_stop(Wurk.redis { |c| c.call('LLEN', key) })
107
+ start = 0
108
+ while start < stop_at
109
+ slice = Wurk.redis { |c| c.call('LRANGE', key, start, [start + QUEUE_PAGE, stop_at].min - 1) }
110
+ break if slice.empty?
111
+
112
+ slice.each(&)
113
+ start += slice.size
89
114
  end
115
+ @scanned += start
116
+ end
117
+
118
+ # Elements to examine in a queue of `size`: the smaller of the per-queue
119
+ # cap and the request budget still unspent. Flags @truncated when the
120
+ # queue holds more than we'll scan, so the flag is set only for a genuine
121
+ # partial result.
122
+ def queue_scan_stop(size)
123
+ cap = [SCAN_LIMIT_PER_QUEUE, SCAN_BUDGET - @scanned].min
124
+ @truncated = true if size > cap
125
+ [size, cap].min
90
126
  end
91
127
 
128
+ # ZSCAN-pages a sorted set, filtering client-side and metering the
129
+ # elements Redis returns against the shared budget so a rare/no-match
130
+ # keystroke can't round-trip an arbitrarily large ZSET. Flags @truncated
131
+ # when the budget stops the scan with entries still unexamined (cursor not
132
+ # yet wrapped back to 0).
92
133
  def search_sorted_set(kind, &)
93
134
  set = sorted_set_for(kind)
94
- set.scan(@substring, ZSCAN_PAGE) do |value, score|
95
- yield sorted_row(kind, set.name, SortedEntry.new(set, score, value))
135
+ cursor = '0'
136
+ loop do
137
+ cursor, page = Wurk.redis { |c| c.call('ZSCAN', set.name, cursor, 'COUNT', ZSCAN_PAGE) }
138
+ emit_sorted_hits(kind, set, page, &)
139
+ @scanned += page.size / 2
140
+ break if cursor == '0'
141
+ next if @scanned < SCAN_BUDGET
142
+
143
+ @truncated = true
144
+ break
145
+ end
146
+ end
147
+
148
+ # Yields a sorted_row for each element on this ZSCAN page whose raw JSON
149
+ # contains the literal substring (client-side filter — see the class note).
150
+ def emit_sorted_hits(kind, set, page)
151
+ page.each_slice(2) do |value, score|
152
+ next unless value.include?(@substring)
153
+
154
+ yield sorted_row(kind, set.name, SortedEntry.new(set, score.to_f, value))
96
155
  end
97
156
  end
98
157
 
data/lib/wurk/web.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'web/config'
4
+ require_relative 'web/pool_scope'
4
5
  require_relative 'web/search'
5
6
  require_relative 'web/enterprise'
6
7
  require_relative 'web/batch_status'
@@ -78,7 +78,12 @@ module Wurk
78
78
  opts.each do |k, v|
79
79
  key = k.to_s
80
80
  case key
81
- when 'wait', 'wait_until' then result['at'] = wait_to_seconds(v)
81
+ when 'wait', 'wait_until'
82
+ # Sidekiq drops `at` when the target is not in the future, so
83
+ # set(wait: 0) / an elapsed wait_until enqueues immediately
84
+ # instead of parking in the schedule ZSET for up to a poll tick.
85
+ ts = wait_to_seconds(v)
86
+ result['at'] = ts if ts > now_seconds
82
87
  else result[key] = v
83
88
  end
84
89
  end
data/lib/wurk.rb CHANGED
@@ -263,8 +263,12 @@ require_relative 'wurk/middleware/interrupt_handler'
263
263
 
264
264
  # Limiter server middleware: catches OverLimit, reschedules onto the same
265
265
  # queue with `Time.now + backoff` until `overrated` hits the reschedule cap.
266
- # Registered AFTER Batch::ServerMiddleware so a rescheduled OverLimit
267
- # unwinds back through the batch onion without ack'ing success.
266
+ # Registered AFTER Batch::ServerMiddleware, so in the chain Batch is OUTER
267
+ # and Limiter is INNER (`add` appends; entry 0 is outermost). A reschedule
268
+ # therefore unwinds *outward through* the batch onion — which is why it
269
+ # raises `Limiter::Rescheduled` (a JobRetry::Skip) rather than returning: a
270
+ # normal return would make the outer Batch middleware ack success for a job
271
+ # that never ran. The Skip signal makes Batch skip both acks instead.
268
272
  # Spec: docs/target/sidekiq-ent.md §1.4.
269
273
  Wurk.configuration.server_middleware.add(Wurk::Limiter::ServerMiddleware)
270
274
 
@@ -0,0 +1 @@
1
+ import{A as e,F as t,_ as n,b as r,v as i,w as a,z as o}from"./Skeleton-DOYDkzg1.js";import{o as s}from"./utils-DDJC7tJV.js";var c=a(`<span>`),l=a(`<span style=color:var(--text-muted)>—`);function u(a){return t(e,{get when(){return i(()=>a.str!==`[]`)()&&a.str!==``},get fallback(){return l()},get children(){var e=c();return n(e,()=>s(a.str,a.max)),o(()=>r(e,`title`,a.str)),e}})}export{u as t};
@@ -0,0 +1 @@
1
+ import{A as e,F as t,J as n,M as r,O as i,_ as a,c as o,f as s,k as c,r as l,s as u,v as d,w as f}from"./Skeleton-DOYDkzg1.js";import{o as p,s as m}from"./index-CZTcs-pM.js";import{a as h}from"./utils-DDJC7tJV.js";var g=f(`<div style=display:flex;flex-direction:column;gap:2px><span style=font-size:11px;color:var(--text-muted);text-transform:uppercase;letter-spacing:0.04em></span><span style=font-variant-numeric:tabular-nums>`),_=f(`<div style=margin-top:1.5rem><h2 style="font-size:14px;margin:0 0 0.5rem"> <span class="badge badge-muted"></span></h2><div class=table-wrapper><table><tbody>`),v=f(`<tr><td style=font-family:monospace;font-size:12px>`),y=f(`<div><div class=section-header style=gap:0.75rem></div><div style=margin-top:1rem>`),b=f(`<div class=empty-state style=color:var(--danger)>`),x=f(`<span class="badge badge-success">`),S=f(`<span class="badge badge-danger">`),C=f(`<p style=color:var(--text-muted);margin-top:0>`),w=f(`<div><div class=section-header style=gap:0.75rem><h1 class=page-title style=margin:0;font-family:monospace;font-size:16px></h1></div><div style="display:grid;grid-template-columns:repeat(auto-fill, minmax(140px, 1fr));gap:1rem;margin-top:1rem">`),T=f(`<span class="badge badge-accent">%`);function E(e){return(()=>{var t=g(),n=t.firstChild,r=n.nextSibling;return a(n,()=>e.label),a(r,()=>e.children),t})()}function D(n){return t(e,{get when(){return n.jids.length>0},get children(){var e=_(),r=e.firstChild,o=r.firstChild,s=o.nextSibling,c=r.nextSibling.firstChild.firstChild;return a(r,()=>n.label,o),a(s,()=>n.jids.length),a(c,t(i,{get each(){return n.jids},children:e=>(()=>{var t=v(),n=t.firstChild;return a(n,e),t})()})),e}})}function O(){let i=m(),f=()=>i.bid??``;n(()=>{document.title=`${u(`nav.batches`)} — Wurk`});let g=s(()=>({queryKey:[`batch`,f()],queryFn:()=>fetch(`${o()}/api/batches/${encodeURIComponent(f())}`).then(e=>{if(!e.ok)throw Error(`HTTP ${e.status}`);return e.json()})}));return t(r,{get children(){return[t(c,{get when(){return g.isPending},get children(){var e=y(),n=e.firstChild,r=n.nextSibling;return a(n,t(p,{href:`/batches`,class:`btn btn-sm`,get children(){return[`← `,d(()=>u(`nav.batches`))]}})),a(r,t(l,{count:8})),e}}),t(c,{get when(){return g.isError||!g.data},get children(){var e=b();return a(e,()=>u(`common.error`)),e}}),t(c,{get when(){return g.data},children:n=>{let r=()=>n().total-n().pending,i=()=>n().total>0?Math.round(r()/n().total*100):0;return(()=>{var r=w(),o=r.firstChild,s=o.firstChild,c=o.nextSibling;return a(o,t(p,{href:`/batches`,class:`btn btn-sm`,get children(){return[`← `,d(()=>u(`nav.batches`))]}}),s),a(s,()=>n().bid),a(o,t(e,{get when(){return n().complete},get fallback(){return(()=>{var e=T(),t=e.firstChild;return a(e,i,t),e})()},get children(){var e=x();return a(e,()=>u(`batches.complete`)),e}}),null),a(o,t(e,{get when(){return n().invalidated},get children(){var e=S();return a(e,()=>u(`batches.invalidated`)),e}}),null),a(r,t(e,{get when(){return n().description},get children(){var e=C();return a(e,()=>n().description),e}}),c),a(c,t(E,{get label(){return u(`table.total`)},get children(){return n().total.toLocaleString()}}),null),a(c,t(E,{get label(){return u(`table.pending`)},get children(){return n().pending.toLocaleString()}}),null),a(c,t(E,{get label(){return u(`table.failures`)},get children(){return n().failures.toLocaleString()}}),null),a(c,t(E,{get label(){return u(`batches.children`)},get children(){return n().child_count.toLocaleString()}}),null),a(c,t(E,{get label(){return u(`table.created`)},get children(){return d(()=>!!n().created_at)()?h(n().created_at):`—`}}),null),a(c,t(E,{get label(){return u(`batches.completed`)},get children(){return d(()=>!!n().complete_at)()?h(n().complete_at):`—`}}),null),a(c,t(e,{get when(){return n().parent_bid},get children(){return t(E,{get label(){return u(`batches.parent`)},get children(){return n().parent_bid}})}}),null),a(c,t(e,{get when(){return n().tags.length>0},get children(){return t(E,{get label(){return u(`batches.tags`)},get children(){return n().tags.join(`, `)}})}}),null),a(r,t(D,{get label(){return u(`batches.failed_jobs`)},get jids(){return n().failed_jids}}),null),a(r,t(D,{get label(){return u(`batches.dead_jobs`)},get jids(){return n().dead_jids}}),null),r})()}})]}})}export{O as default};
@@ -0,0 +1 @@
1
+ import{A as e,F as t,J as n,M as r,O as i,_ as a,b as o,c as s,f as c,i as l,k as u,s as d,v as f,w as p,x as m,z as h}from"./Skeleton-DOYDkzg1.js";import{n as g,o as _}from"./index-CZTcs-pM.js";import{a as v,o as y}from"./utils-DDJC7tJV.js";import{n as b,r as x,t as S}from"./useResetPageOnEmpty-CoZU4b3a.js";import{n as C,t as w}from"./useSort-wQcnbdsa.js";import{t as T}from"./PageHeader-CsDvJSOA.js";var E=p(`<div>`),D=p(`<div class=empty-state style=color:var(--danger)>`),O=p(`<span class="badge badge-accent">`),k=p(`<div class=table-wrapper><table><thead><tr></tr></thead><tbody>`),A=p(`<div class=empty-state>`),j=p(`<tr><td style=font-family:monospace;font-size:12px></td><td></td><td></td><td></td><td></td><td style=width:100px><div style=display:flex;align-items:center;gap:0.5rem><div class=progress-bar-track style=flex:1><div class=progress-bar-fill></div></div><span style=font-size:11px;color:var(--text-muted);min-width:32px>%</span></div></td><td>`),M=25,N={bid:e=>e.bid,description:e=>e.description??``,total:e=>e.total,pending:e=>e.pending,failures:e=>e.failures,progress:e=>e.total>0?(e.total-e.pending)/e.total:0,created:e=>e.created_at??null};function P(){let[p,P]=b();n(()=>{document.title=`${d(`nav.batches`)} — Wurk`});let F=c(()=>({queryKey:[`batches`,p()],queryFn:()=>g(`${s()}/api/batches?page=${p()-1}&count=${M}`)}));S(p,P,()=>!F.isPending&&!!F.data,()=>(F.data?.batches.length??0)===0);let{sorted:I,sort:L,toggle:R}=w(()=>F.data?.batches??[],N);return t(r,{get children(){return[t(u,{get when(){return F.isPending},get children(){var e=E();return a(e,t(T,{icon:`fa-table-cells-large`,get title(){return d(`nav.batches`)},get summary(){return d(`summaries.batches`)}}),null),a(e,t(l,{rows:8,cols:7}),null),e}}),t(u,{get when(){return F.isError||!F.data},get children(){var e=D();return a(e,()=>d(`common.error`)),e}}),t(u,{get when(){return F.data},children:n=>(()=>{var r=E();return a(r,t(T,{icon:`fa-table-cells-large`,get title(){return d(`nav.batches`)},get summary(){return d(`summaries.batches`)},get children(){var e=O();return a(e,()=>n().total.toLocaleString()),e}}),null),a(r,t(e,{get when(){return I().length>0},get fallback(){return(()=>{var e=A();return a(e,()=>d(`common.empty`)),e})()},get children(){return[(()=>{var e=k(),n=e.firstChild.firstChild,r=n.firstChild,s=n.nextSibling;return a(r,t(C,{get label(){return d(`table.bid`)},sortKey:`bid`,get sort(){return L()},onSort:R}),null),a(r,t(C,{get label(){return d(`table.description`)},sortKey:`description`,get sort(){return L()},onSort:R}),null),a(r,t(C,{get label(){return d(`table.total`)},sortKey:`total`,get sort(){return L()},onSort:R}),null),a(r,t(C,{get label(){return d(`table.pending`)},sortKey:`pending`,get sort(){return L()},onSort:R}),null),a(r,t(C,{get label(){return d(`table.failures`)},sortKey:`failures`,get sort(){return L()},onSort:R}),null),a(r,t(C,{get label(){return d(`table.progress`)},sortKey:`progress`,get sort(){return L()},onSort:R}),null),a(r,t(C,{get label(){return d(`table.created`)},sortKey:`created`,get sort(){return L()},onSort:R}),null),a(s,t(i,{get each(){return I()},children:e=>{let n=e.total-e.pending,r=e.total>0?n/e.total*100:0;return(()=>{var n=j(),i=n.firstChild,s=i.nextSibling,c=s.nextSibling,l=c.nextSibling,u=l.nextSibling,d=u.nextSibling,p=d.firstChild.firstChild,g=p.firstChild,b=p.nextSibling,x=b.firstChild,S=d.nextSibling;return a(i,t(_,{get href(){return`/batches/${e.bid}`},get title(){return e.bid},get children(){return y(e.bid,14)}})),a(s,()=>y(e.description??`—`,40)),a(c,()=>e.total.toLocaleString()),a(l,()=>e.pending.toLocaleString()),a(u,()=>e.failures.toLocaleString()),m(g,`width`,`${r}%`),a(b,()=>Math.round(r),x),a(S,(()=>{var t=f(()=>!!e.created_at);return()=>t()?v(e.created_at):`—`})()),h(t=>{var n=e.description??``,r=e.pending>0?`var(--warning)`:`var(--success)`,i=e.failures>0?`var(--danger)`:void 0,a=e.failures>0?`var(--danger)`:`var(--success)`;return n!==t.e&&o(s,`title`,t.e=n),r!==t.t&&m(l,`color`,t.t=r),i!==t.a&&m(u,`color`,t.a=i),a!==t.o&&m(g,`background`,t.o=a),t},{e:void 0,t:void 0,a:void 0,o:void 0}),n})()}})),e})(),t(x,{get page(){return p()},get total(){return n().total},count:M,onChange:P})]}}),null),r})()})]}})}export{P as default};
@@ -0,0 +1 @@
1
+ import{A as e,C as t,F as n,J as r,M as i,O as a,V as o,_ as s,b as c,c as l,d as u,f as d,g as f,k as p,p as m,r as h,s as g,v as _,w as v,x as y,z as b}from"./Skeleton-DOYDkzg1.js";import{a as x,r as S,t as C}from"./index-CZTcs-pM.js";import{a as w,i as T,n as ee,o as E,r as D,t as O}from"./utils-DDJC7tJV.js";import{t as k}from"./PageHeader-CsDvJSOA.js";import{t as A}from"./Modal-t4FI_LaY.js";import{t as j}from"./ArgsValue-DYfBiXrJ.js";var M=v(`<code style=font-size:12px>`),N=v(`<span class="badge badge-accent">`),P=v(`<span>`),F=v(`<div class=table-wrapper><table><thead><tr><th></th><th></th><th></th><th></th><th></th></tr></thead><tbody>`),I=v(`<div><div style="display:grid;grid-template-columns:repeat(auto-fill, minmax(200px, 1fr));gap:0.75rem;margin-bottom:1rem"></div><div style=margin-bottom:0.25rem></div><div style=display:flex;flex-wrap:wrap;gap:0.25rem;margin-bottom:1rem></div><h3 class=section-title style=margin-bottom:0.5rem> <span class="badge badge-muted">`),L=v(`<div><div></div><div style=font-size:14px>`),R=v(`<span class="badge badge-muted">`),z=v(`<div class=empty-state style=padding:1rem>`),B=v(`<tr><td style=font-family:monospace;font-size:12px;color:var(--text-muted)></td><td style=font-weight:500></td><td><span class="badge badge-muted"></span></td><td></td><td>`),V=v(`<span class="badge badge-muted"><i class="fa-solid fa-microchip"style=margin-right:0.35rem>`),te=v(`<span class="badge badge-muted"><i class="fa-solid fa-memory"style=margin-right:0.35rem>`),H=v(`<div style=display:flex;flex-wrap:wrap;align-items:center;gap:0.75rem;margin-bottom:0.75rem><span style=font-weight:600;font-size:15px><i class="fa-solid fa-server"style=color:var(--text-muted);margin-right:0.5rem></i></span><span class="badge badge-muted"> </span><span class="badge badge-muted"style=font-variant-numeric:tabular-nums> <!> / `),U=v(`<div>`),W=v(`<div class=empty-state style=color:var(--danger)>`),G=v(`<button class="btn btn-sm btn-ghost">`),K=v(`<button class="btn btn-sm btn-ghost btn-danger">`),q=v(`<div style=display:flex;align-items:center;gap:0.6rem><span class="badge badge-muted"> `),J=v(`<div class=empty-state>`),Y=v(`<section style=margin-bottom:1.5rem><div style="display:grid;grid-template-columns:repeat(auto-fill, minmax(min(100%, 320px), 1fr));gap:1rem">`),X=v(`<span class=live-dot title="Heartbeat OK">`),Z=v(`<span class="badge badge-accent"><i class="fa-solid fa-crown"style=margin-right:0.3rem>`),ne=v(`<span class="badge badge-warning">Quiet`),Q=v(`<span class="badge badge-muted">embedded`),re=v(`<div style=display:flex;gap:0.4rem;margin-top:0.85rem><button class="btn btn-sm"></button><button class="btn btn-sm btn-danger">`),ie=v(`<div class="card row-clickable"><div style=display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:0.75rem><div><div style=font-weight:600;font-size:15px>PID </div><div style=color:var(--text-muted);font-size:12px></div></div><div style=display:flex;gap:0.375rem></div></div><div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:0.5rem;margin-bottom:0.75rem"><div><div> / </div><div style=font-weight:600;font-size:18px;font-variant-numeric:tabular-nums> / </div></div><div><div></div><div style=font-size:13px></div></div><div><div></div><div style=font-size:13px></div></div></div><div class=progress-bar-track style=margin-bottom:0.75rem><div class=progress-bar-fill></div></div><div><div style=margin-bottom:0.25rem></div><div style=display:flex;flex-wrap:wrap;gap:0.25rem>`);function ae(e){let t=new Map;for(let n of e){let e=t.get(n.hostname);e||(e={hostname:n.hostname,processes:[],busy:0,concurrency:0,rssKb:0},t.set(n.hostname,e)),e.processes.push(n),e.busy+=n.busy,e.concurrency+=n.concurrency,e.rssKb+=n.rss??0,e.cpuModel??=n.cpu_model??void 0,e.cores??=n.cores,e.memoryTotalKb??=n.memory_total_kb}return[...t.values()].sort((e,t)=>e.hostname.localeCompare(t.hostname))}function oe(e){return e>90?`var(--danger)`:e>70?`var(--warning)`:`var(--accent)`}var $={"font-size":`11px`,color:`var(--text-muted)`,"text-transform":`uppercase`,"letter-spacing":`0.04em`};function se(r){let i=d(()=>({queryKey:[`workers`],queryFn:()=>fetch(`${l()}/api/workers`).then(e=>e.json()),refetchInterval:5e3})),o=()=>(i.data??[]).filter(e=>e.process_id===r.proc.identity),u=()=>[[g(`busy.identity`),(()=>{var e=M();return s(e,()=>r.proc.identity),e})()],[g(`busy.leader`),r.proc.leader?(()=>{var e=N();return s(e,()=>g(`busy.leader`)),e})():`—`],[`PID`,r.proc.pid],[g(`busy.started`),r.proc.started_at?(()=>{var e=P();return s(e,()=>w(r.proc.started_at)),b(()=>c(e,`title`,T(r.proc.started_at))),e})():`—`],[g(`busy.heartbeat`),(()=>{var e=P();return s(e,()=>w(r.proc.beat)),b(()=>c(e,`title`,T(r.proc.beat))),e})()],[`${g(`table.busy`)} / ${g(`table.concurrency`)}`,`${r.proc.busy} / ${r.proc.concurrency}`],[g(`busy.rss`),D(r.proc.rss??0)],[g(`busy.rtt`),r.proc.rtt_us?`${(r.proc.rtt_us/1e3).toFixed(1)} ${g(`common.ms`)}`:`—`],[g(`busy.version`),r.proc.version??`—`],[g(`busy.tag`),r.proc.tag||`—`],[g(`busy.labels`),r.proc.labels?.length?r.proc.labels.join(`, `):`—`]];return(()=>{var i=I(),l=i.firstChild,d=l.nextSibling,f=d.nextSibling,p=f.nextSibling,m=p.firstChild,h=m.nextSibling;return s(l,n(a,{get each(){return u()},children:([e,n])=>(()=>{var r=L(),i=r.firstChild,a=i.nextSibling;return s(i,e),s(a,n),b(e=>t(i,$,e)),r})()})),s(d,()=>g(`table.queues`)),s(f,n(a,{get each(){return r.proc.queues},children:e=>(()=>{var t=R();return s(t,e),t})()})),s(p,()=>g(`busy.running_jobs`),m),s(h,()=>o().length),s(i,n(e,{get when(){return o().length>0},get fallback(){return(()=>{var e=z();return s(e,()=>g(`busy.no_running`)),e})()},get children(){var e=F(),t=e.firstChild.firstChild,r=t.firstChild.firstChild,i=r.nextSibling,l=i.nextSibling,u=l.nextSibling,d=u.nextSibling,f=t.nextSibling;return s(r,()=>g(`table.jid`)),s(i,()=>g(`table.class`)),s(l,()=>g(`table.queue`)),s(u,()=>g(`table.args`)),s(d,()=>g(`busy.running_since`)),s(f,n(a,{get each(){return o()},children:e=>(()=>{var t=B(),r=t.firstChild,i=r.nextSibling,a=i.nextSibling,o=a.firstChild,l=a.nextSibling,u=l.nextSibling;return s(r,()=>E(e.jid,12)),s(i,()=>e.klass),s(o,()=>e.queue),s(l,n(j,{get str(){return O(e.args)},max:40})),s(u,()=>w(e.run_at)),b(t=>{var n=e.jid,i=T(e.run_at);return n!==t.e&&c(r,`title`,t.e=n),i!==t.t&&c(u,`title`,t.t=i),t},{e:void 0,t:void 0}),t})()})),e}}),null),b(e=>t(d,{...$},e)),i})()}function ce(t){let r=()=>t.group.memoryTotalKb?Math.min(100,t.group.rssKb/t.group.memoryTotalKb*100):null;return(()=>{var i=H(),a=i.firstChild;a.firstChild;var o=a.nextSibling,l=o.firstChild,u=o.nextSibling,d=u.firstChild,f=d.nextSibling;return f.nextSibling,s(a,()=>t.group.hostname,null),s(o,()=>t.group.processes.length,l),s(o,()=>g(`dashboard.processes`).toLowerCase(),null),s(i,n(e,{get when(){return t.group.cpuModel},get children(){var e=V();return e.firstChild,s(e,()=>E(t.group.cpuModel,40),null),b(()=>c(e,`title`,t.group.cpuModel??void 0)),e}}),u),s(i,n(e,{get when(){return _(()=>t.group.cores!=null)()&&t.group.cores>0},get children(){var e=R();return s(e,()=>g(`busy.cores`,{n:t.group.cores})),e}}),u),s(i,n(e,{get when(){return t.group.rssKb>0},get children(){var e=te();return e.firstChild,s(e,()=>D(t.group.rssKb),null),s(e,(()=>{var e=_(()=>!!t.group.memoryTotalKb);return()=>e()?` / ${D(t.group.memoryTotalKb)}`:``})(),null),b(()=>c(e,`title`,r()==null?void 0:`${r().toFixed(1)}% ${g(`busy.of_total_ram`)}`)),e}}),u),s(u,()=>g(`table.busy`),d),s(u,()=>t.group.busy,f),s(u,()=>t.group.concurrency,null),i})()}function le(){let f=x(),v=()=>f.data?.read_only??!1,T=m(),[E,O]=o(null);r(()=>{document.title=`${g(`nav.busy`)} — Wurk`});let j=d(()=>({queryKey:[`processes`],queryFn:()=>fetch(`${l()}/api/processes`).then(e=>e.json()),refetchInterval:5e3})),M=u(()=>({mutationFn:e=>S(`${l()}/api/busy/${e.signal}`,{identity:e.scope===`all`?`all`:e.identity}),onSuccess:()=>T.invalidateQueries({queryKey:[`processes`]}),onError:C})),N=e=>window.confirm(g(`actions.confirm`,{action:g(`actions.stop`),scope:e})),P=()=>(j.data??[]).some(e=>!e.embedded),F=()=>ae(j.data??[]),I=()=>(j.data??[]).find(e=>e.identity===E())??null;return n(i,{get children(){return[n(p,{get when(){return j.isPending},get children(){var e=U();return s(e,n(k,{icon:`fa-gears`,get title(){return g(`nav.busy`)},get summary(){return g(`summaries.busy`)}}),null),s(e,n(h,{count:6}),null),e}}),n(p,{get when(){return j.isError||!j.data},get children(){var e=W();return s(e,()=>g(`common.error`)),e}}),n(p,{get when(){return j.data},children:r=>(()=>{var i=U();return s(i,n(k,{icon:`fa-gears`,get title(){return g(`nav.busy`)},get summary(){return g(`summaries.busy`)},get children(){var t=q(),i=t.firstChild,a=i.firstChild;return s(i,()=>r().length,a),s(i,()=>g(`dashboard.processes`).toLowerCase(),null),s(t,n(e,{get when(){return F().length>1},get children(){var e=R();return s(e,()=>g(`busy.hosts`,{n:F().length})),e}}),null),s(t,n(e,{get when(){return _(()=>!v())()&&P()},get children(){return[(()=>{var e=G();return e.$$click=()=>M.mutate({signal:`quiet`,scope:`all`}),s(e,()=>`${g(`actions.quiet`)} ${g(`actions.all_suffix`)}`),b(()=>e.disabled=M.isPending),e})(),(()=>{var e=K();return e.$$click=()=>N(g(`actions.scope_all_processes`))&&M.mutate({signal:`stop`,scope:`all`}),s(e,()=>`${g(`actions.stop`)} ${g(`actions.all_suffix`)}`),b(()=>e.disabled=M.isPending),e})()]}}),null),t}}),null),s(i,n(e,{get when(){return r().length>0},get fallback(){return(()=>{var e=J();return s(e,()=>g(`common.empty`)),e})()},get children(){return n(a,{get each(){return F()},children:r=>(()=>{var i=Y(),o=i.firstChild;return s(i,n(ce,{group:r}),o),s(o,n(a,{get each(){return r.processes},children:r=>{let i=r.concurrency>0?r.busy/r.concurrency*100:0,o=Date.now()/1e3-r.beat<30;return(()=>{var l=ie(),u=l.firstChild,d=u.firstChild,f=d.firstChild;f.firstChild;var p=f.nextSibling,m=d.nextSibling,h=u.nextSibling,x=h.firstChild,S=x.firstChild,C=S.firstChild,T=S.nextSibling,E=T.firstChild,k=x.nextSibling,A=k.firstChild,j=A.nextSibling,P=k.nextSibling.firstChild,F=P.nextSibling,I=h.nextSibling,L=I.firstChild,z=I.nextSibling.firstChild,B=z.nextSibling;return l.$$click=()=>r.identity&&O(r.identity),s(f,()=>r.pid,null),s(p,()=>r.tag||r.hostname,null),s(p,(()=>{var e=_(()=>!!r.started_at);return()=>e()?` · ${g(`busy.up_for`)} ${ee(Date.now()/1e3-r.started_at)}`:``})(),null),s(m,n(e,{when:o,get children(){return X()}}),null),s(m,n(e,{get when(){return r.leader},get children(){var e=Z();return e.firstChild,s(e,()=>g(`busy.leader`),null),b(()=>c(e,`title`,g(`busy.leader_title`))),e}}),null),s(m,n(e,{get when(){return r.quiet},get children(){return ne()}}),null),s(m,n(e,{get when(){return r.embedded},get children(){return Q()}}),null),s(S,()=>g(`table.busy`),C),s(S,()=>g(`table.concurrency`),null),s(T,()=>r.busy,E),s(T,()=>r.concurrency,null),s(A,()=>g(`busy.heartbeat`)),y(j,`color`,o?`var(--success)`:`var(--danger)`),s(j,()=>w(r.beat)),s(P,()=>g(`busy.rss`)),s(F,()=>D(r.rss??0)),y(L,`width`,`${i}%`),s(z,()=>g(`table.queues`)),s(B,n(a,{get each(){return r.queues},children:e=>(()=>{var t=R();return s(t,e),t})()})),s(l,n(e,{get when(){return _(()=>!v())()&&!r.embedded},get children(){var e=re(),t=e.firstChild,n=t.nextSibling;return e.$$click=e=>e.stopPropagation(),t.$$click=()=>M.mutate({signal:`quiet`,scope:`one`,identity:r.identity}),s(t,()=>g(`actions.quiet`)),n.$$click=()=>N(g(`actions.scope_this_process`))&&M.mutate({signal:`stop`,scope:`one`,identity:r.identity}),s(n,()=>g(`actions.stop`)),b(e=>{var r=M.isPending,i=M.isPending;return r!==e.e&&(t.disabled=e.e=r),i!==e.t&&(n.disabled=e.t=i),e},{e:void 0,t:void 0}),e}}),null),b(e=>{var n=$,r=$,a=$,o=oe(i),s={...$};return e.e=t(S,n,e.e),e.t=t(A,r,e.t),e.a=t(P,a,e.a),o!==e.o&&y(L,`background`,e.o=o),e.i=t(z,s,e.i),e},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0}),l})()}})),i})()})}}),null),s(i,n(A,{get open(){return I()!==null},onClose:()=>O(null),get title(){return _(()=>!!I())()?`${I().hostname} · PID ${I().pid}`:``},width:780,get children(){return n(e,{get when(){return I()},children:e=>n(se,{get proc(){return e()}})})}}),null),i})()})]}})}f([`click`]);export{le as default};
@@ -0,0 +1 @@
1
+ import{A as e,F as t,J as n,M as r,O as i,V as a,_ as o,b as s,c,d as l,f as u,g as d,i as f,k as p,p as m,s as h,v as g,w as _,x as v,z as y}from"./Skeleton-DOYDkzg1.js";import{a as b,r as x,t as S}from"./index-CZTcs-pM.js";import{a as C,i as w,o as T}from"./utils-DDJC7tJV.js";import{n as E,t as D}from"./useSort-wQcnbdsa.js";import{t as O}from"./PageHeader-CsDvJSOA.js";import{t as k}from"./Modal-t4FI_LaY.js";var A=_(`<div>`),j=_(`<div class=empty-state style=color:var(--danger)>`),M=_(`<span class="badge badge-muted">`),N=_(`<th>`),P=_(`<div class=table-wrapper><table><thead><tr></tr></thead><tbody>`),F=_(`<div class=empty-state>`),I=_(`<td><div style=display:flex;gap:0.4rem><button class="btn btn-sm"></button><button class="btn btn-sm">`),L=_(`<tr class=row-clickable><td style=font-family:monospace;font-size:12px></td><td></td><td></td><td style=color:var(--text-muted)></td><td></td><td>`),R=_(`<span class="badge badge-success">`),z=_(`<div class=table-wrapper><table><thead><tr><th></th><th></th></tr></thead><tbody>`),B=_(`<tr><td style=color:var(--text-muted)></td><td style=font-family:monospace;font-size:12px>`),V={schedule:e=>e.schedule,klass:e=>e.klass,queue:e=>e.queue,last_fire:e=>e.last_fire_at,next_fire:e=>e.next_fire_at,status:e=>e.paused?`paused`:`active`};function H(){let d=m(),_=b(),H=()=>_.data?.read_only??!1,[U,W]=a(null);n(()=>{document.title=`${h(`nav.cron`)} — Wurk`});let G=u(()=>({queryKey:[`cron`],queryFn:()=>fetch(`${c()}/api/cron`).then(e=>e.json()),refetchInterval:15e3})),K=(e,t)=>x(`${c()}/api/cron/${e}/${t}`),q=l(()=>({mutationFn:({lid:e,paused:t})=>K(e,t?`unpause`:`pause`),onSuccess:()=>d.invalidateQueries({queryKey:[`cron`]}),onError:S})),J=l(()=>({mutationFn:e=>K(e,`enqueue`),onSuccess:()=>d.invalidateQueries({queryKey:[`cron`]}),onError:S})),Y=u(()=>({queryKey:[`cron-history`,U()?.lid],queryFn:()=>fetch(`${c()}/api/cron/${U().lid}/history`).then(e=>e.json()).then(e=>e.history),enabled:U()!==null})),{sorted:X,sort:Z,toggle:Q}=D(()=>G.data??[],V);return t(r,{get children(){return[t(p,{get when(){return G.isPending},get children(){var e=A();return o(e,t(O,{icon:`fa-stopwatch`,get title(){return h(`nav.cron`)},get summary(){return h(`summaries.cron`)}}),null),o(e,t(f,{rows:8,get cols(){return H()?6:7}}),null),e}}),t(p,{get when(){return G.isError||!G.data},get children(){var e=j();return o(e,()=>h(`common.error`)),e}}),t(p,{get when(){return G.data},children:n=>(()=>{var a=A();return o(a,t(O,{icon:`fa-stopwatch`,get title(){return h(`nav.cron`)},get summary(){return h(`summaries.cron`)},get children(){var e=M();return o(e,()=>n().length),e}}),null),o(a,t(e,{get when(){return n().length>0},get fallback(){return(()=>{var e=F();return o(e,()=>h(`common.empty`)),e})()},get children(){var n=P(),r=n.firstChild.firstChild,a=r.firstChild,c=r.nextSibling;return o(a,t(E,{get label(){return h(`table.schedule`)},sortKey:`schedule`,get sort(){return Z()},onSort:Q}),null),o(a,t(E,{get label(){return h(`table.class`)},sortKey:`klass`,get sort(){return Z()},onSort:Q}),null),o(a,t(E,{get label(){return h(`table.queue`)},sortKey:`queue`,get sort(){return Z()},onSort:Q}),null),o(a,t(E,{get label(){return h(`cron.last_fire`)},sortKey:`last_fire`,get sort(){return Z()},onSort:Q}),null),o(a,t(E,{get label(){return h(`cron.next_fire`)},sortKey:`next_fire`,get sort(){return Z()},onSort:Q}),null),o(a,t(E,{get label(){return h(`table.status`)},sortKey:`status`,get sort(){return Z()},onSort:Q}),null),o(a,t(e,{get when(){return!H()},get children(){return N()}}),null),o(c,t(i,{get each(){return X()},children:n=>(()=>{var r=L(),i=r.firstChild,a=i.nextSibling,c=a.nextSibling,l=c.nextSibling,u=l.nextSibling,d=u.nextSibling;return r.$$click=()=>W(n),o(i,()=>n.schedule),o(a,()=>T(n.klass,32)),o(c,()=>n.queue),o(l,(()=>{var e=g(()=>!!n.last_fire_at);return()=>e()?C(n.last_fire_at):`—`})()),o(u,(()=>{var e=g(()=>!!n.paused);return()=>e()?`—`:g(()=>!!n.next_fire_at)()?C(n.next_fire_at):`—`})()),o(d,t(e,{get when(){return n.paused},get fallback(){return(()=>{var e=R();return o(e,()=>h(`dashboard.active`)),e})()},get children(){var e=M();return o(e,()=>h(`dashboard.paused`)),e}})),o(r,t(e,{get when(){return!H()},get children(){var e=I(),t=e.firstChild.firstChild,r=t.nextSibling;return e.$$click=e=>e.stopPropagation(),t.$$click=()=>q.mutate({lid:n.lid,paused:n.paused}),o(t,(()=>{var e=g(()=>!!n.paused);return()=>e()?h(`actions.unpause`):h(`actions.pause`)})()),r.$$click=()=>J.mutate(n.lid),o(r,()=>h(`actions.enqueue`)),y(e=>{var n=q.isPending,i=J.isPending;return n!==e.e&&(t.disabled=e.e=n),i!==e.t&&(r.disabled=e.t=i),e},{e:void 0,t:void 0}),e}}),null),y(e=>{var t=n.tz??void 0,r=n.klass,o=n.paused?`var(--text-muted)`:`var(--accent)`;return t!==e.e&&s(i,`title`,e.e=t),r!==e.t&&s(a,`title`,e.t=r),o!==e.a&&v(u,`color`,e.a=o),e},{e:void 0,t:void 0,a:void 0}),r})()})),n}}),null),o(a,t(k,{get open(){return U()!==null},onClose:()=>W(null),get title(){return g(()=>!!U())()?`${h(`cron.history_title`)} — ${T(U().klass,40)}`:h(`cron.history_title`)},get children(){return t(r,{get children(){return[t(p,{get when(){return Y.isPending},get children(){return t(f,{rows:6,cols:2})}}),t(p,{get when(){return Y.isError},get children(){var e=j();return o(e,()=>h(`common.error`)),e}}),t(p,{get when(){return!Y.data||Y.data.length===0},get children(){var e=F();return o(e,()=>h(`cron.no_history`)),e}}),t(p,{get when(){return Y.data},children:e=>(()=>{var n=z(),r=n.firstChild.firstChild,a=r.firstChild.firstChild,c=a.nextSibling,l=r.nextSibling;return o(a,()=>h(`cron.fired`)),o(c,()=>h(`table.jid`)),o(l,t(i,{get each(){return e()},children:([e,t])=>(()=>{var n=B(),r=n.firstChild,i=r.nextSibling;return o(r,()=>C(e)),o(i,t),y(()=>s(r,`title`,w(e))),n})()})),n})()})]}})}}),null),a})()})]}})}d([`click`]);export{H as default};
@@ -0,0 +1 @@
1
+ import{A as e,F as t,J as n,L as r,M as i,O as a,R as o,V as s,_ as c,b as l,c as u,f as d,g as f,h as p,i as m,k as h,n as ee,q as g,r as _,s as v,v as y,w as b,z as x}from"./Skeleton-DOYDkzg1.js";import{i as S,o as C}from"./index-CZTcs-pM.js";import{n as w}from"./utils-DDJC7tJV.js";import{r as T}from"./charts-CVK0zAnC.js";var E=e=>1-(1-e)**3,D=()=>typeof window<`u`&&window.matchMedia?.(`(prefers-reduced-motion: reduce)`).matches;function O(e,t=700){let[n,i]=s(0),a=0,o=null;return r(()=>{let n=e();if(D()||!Number.isFinite(n)){a=n,i(n);return}let r=a;if(r===n)return;let s=performance.now(),c=e=>{let l=Math.min((e-s)/t,1),u=r+(n-r)*E(l);a=u,i(u),l<1&&(o=requestAnimationFrame(c))};o=requestAnimationFrame(c),g(()=>{o!==null&&cancelAnimationFrame(o)})}),n}function k(e){let t=O(()=>e.value);return y(()=>Math.round(t()).toLocaleString())}var A=b(`<span class=obs-metric__sub>`),j=b(`<span class=obs-metric__sub><span> <!>%</span> `),M=b(`<div class=obs>`),N=b(`<div class=empty-state style=color:var(--danger)>`),P=b(`<div class=empty-state>`),te=b(`<div class=obs-metric__head><span class=obs-mono></span><i class="fa-solid fa-circle-check obs-metric__icon"aria-hidden=true>`),F=b(`<span class=obs-metric__value>`),I=b(`<i class="fa-solid fa-arrow-right obs-card__go"aria-hidden=true>`),ne=b(`<div class=obs-metric__head><span class=obs-mono></span><i class="fa-solid fa-triangle-exclamation obs-metric__icon"aria-hidden=true>`),re=b(`<div class=obs-metric__head><span class=obs-mono></span><i class="fa-solid fa-ban obs-metric__icon"aria-hidden=true>`),ie=b(`<div class=obs-metric__head><span class=obs-mono></span><i class="fa-solid fa-spinner obs-metric__icon"aria-hidden=true>`),L=b(`<span class=obs-mono>`),R=b(`<span class=obs-stat__value>`),ae=b(`<i class="fa-solid fa-arrow-right"aria-hidden=true>`),oe=b(`<div class=obs-tablescroll><table><thead><tr><th>Name</th><th></th><th></th><th></th></tr></thead><tbody>`),se=b(`<div class=obs><div class=obs-metrics></div><div class="obs-card obs-panel"><div class=obs-panel__head><div><h2 class=obs-panel__title></h2><p class=obs-panel__sub></p></div><div class=obs-panel__controls><div class=obs-seg role=tablist aria-label="Time range"></div><div class=obs-legend><span><i class="dot dot--processed"></i> </span><span><i class="dot dot--failed"></i> </span></div></div></div><div class=obs-chartbox></div></div><div class=obs-stats></div><div class="obs-card obs-table"><div class=obs-table__head><h2 class=obs-table__title></h2></div></div><div class="obs-card obs-cta"><span class=obs-cta__icon><i class="fa-solid fa-bolt"aria-hidden=true></i></span><h2 class=obs-cta__title></h2><p class=obs-cta__text></p><div class=obs-cta__actions><a class="obs-btn obs-btn--primary"href=https://developerz-ai.github.io/wurk/ target=_blank rel=noreferrer><i class="fa-solid fa-download"aria-hidden=true></i> </a><a class="obs-btn obs-btn--ghost"href=https://github.com/developerz-ai/wurk/wiki target=_blank rel=noreferrer><i class="fa-solid fa-book"aria-hidden=true></i> `),z=b(`<button role=tab>`),B=b(`<div class=empty-state style=height:320px;display:grid;place-items:center>`),V=b(`<span class="obs-chip obs-chip--paused">`),H=b(`<tr><td style=font-weight:500;color:var(--obs-text)></td><td></td><td></td><td>`),U=b(`<span class="obs-chip obs-chip--active">`);function W(e,t){if(e.length<2)return null;let n=e[e.length-1].at,r=0,i=0;for(let a of e)a.at>n-3600?r+=a[t]:a.at>n-7200&&(i+=a[t]);return i===0?r===0?null:100:Math.round((r-i)/i*100)}var G=[{key:`1h`,bucket:`1m`,window:`24h`,slice:60,desc_key:`dashboard.range_1h_desc`},{key:`24h`,bucket:`1m`,window:`24h`,desc_key:`dashboard.range_24h_desc`},{key:`7d`,bucket:`5m`,window:`7d`,desc_key:`dashboard.range_7d_desc`},{key:`30d`,bucket:`1h`,window:`30d`,desc_key:`dashboard.range_30d_desc`}],K=(e,t)=>{let n=new Date(e*1e3),r=String(n.getHours()).padStart(2,`0`);return t===`1h`?`${n.getMonth()+1}/${n.getDate()} ${r}:00`:`${r}:${String(n.getMinutes()).padStart(2,`0`)}`};function q(n){return t(e,{get when(){return n.pct!==null},get fallback(){return(()=>{var e=A();return c(e,()=>v(`dashboard.vs_last_hour`)),e})()},get children(){return(()=>{let e=()=>n.pct>=0,t=()=>e()===n.goodWhenUp;return(()=>{var r=j(),i=r.firstChild,a=i.firstChild,o=a.nextSibling;return o.nextSibling,i.nextSibling,c(i,()=>e()?`▲`:`▼`,a),c(i,()=>e()?`+`:``,o),c(i,()=>n.pct,o),c(r,()=>v(`dashboard.vs_last_hour`),null),x(()=>p(i,t()?`up`:`down`)),r})()})()}})}function J(){let r=S(),[f,g]=s(0),b=()=>G[f()];n(()=>{document.title=`${v(`nav.dashboard`)} — Wurk`});let E=d(()=>({queryKey:[`stats`],queryFn:()=>fetch(`${u()}/api/stats`).then(e=>e.json()),enabled:!r.connected(),refetchInterval:r.connected()?!1:5e3})),D=d(()=>({queryKey:[`history`,b().bucket,b().window],queryFn:()=>fetch(`${u()}/api/history/${b().bucket}?window=${b().window}`).then(e=>e.json()),refetchInterval:3e4})),O=()=>r.stats()??E.data??null,j=o(()=>(D.data?.series??[]).map(e=>({...e,label:K(e.at,b().bucket)}))),J=o(()=>{let e=b(),t=`slice`in e?e.slice:void 0;return t?j().slice(-t):j()}),Y=o(()=>J().some(e=>e.processed>0||e.failed>0));return t(i,{get children(){return[t(h,{get when(){return y(()=>!!E.isLoading)()&&!O()},get children(){var e=M();return c(e,t(_,{count:4}),null),c(e,t(m,{rows:6,cols:4}),null),e}}),t(h,{get when(){return y(()=>!!E.isError)()&&!O()},get children(){var e=N();return c(e,()=>v(`common.error`)),e}}),t(h,{get when(){return!O()},get children(){var e=P();return c(e,()=>v(`common.empty`)),e}}),t(h,{get when(){return O()},children:n=>(()=>{var r=se(),i=r.firstChild,o=i.nextSibling,s=o.firstChild,u=s.firstChild,d=u.firstChild,m=d.nextSibling,h=u.nextSibling.firstChild,_=h.nextSibling.firstChild;_.firstChild.nextSibling;var S=_.nextSibling;S.firstChild.nextSibling;var E=s.nextSibling,O=o.nextSibling,M=O.nextSibling,N=M.firstChild,K=N.firstChild,X=M.nextSibling.firstChild.nextSibling,Z=X.nextSibling,Q=Z.nextSibling.firstChild;Q.firstChild.nextSibling;var $=Q.nextSibling;return $.firstChild.nextSibling,c(i,t(C,{class:`obs-card obs-metric obs-card--link`,href:`/metrics`,get children(){return[(()=>{var e=te(),t=e.firstChild;return c(t,()=>v(`dashboard.processed`)),e})(),(()=>{var e=F();return c(e,t(k,{get value(){return n().processed}})),e})(),t(q,{get pct(){return W(j(),`processed`)},goodWhenUp:!0}),I()]}}),null),c(i,t(C,{class:`obs-card obs-metric obs-card--link`,href:`/retries`,get children(){return[(()=>{var e=ne(),t=e.firstChild;return c(t,()=>v(`dashboard.failed`)),e})(),(()=>{var e=F();return c(e,t(k,{get value(){return n().failed}})),e})(),t(q,{get pct(){return W(j(),`failed`)},goodWhenUp:!1}),I()]}}),null),c(i,t(C,{class:`obs-card obs-metric obs-card--link`,href:`/dead`,get children(){return[(()=>{var e=re(),t=e.firstChild;return c(t,()=>v(`dashboard.expired`)),e})(),(()=>{var e=F();return c(e,t(k,{get value(){return n().expired}})),e})(),(()=>{var e=A();return c(e,(()=>{var e=y(()=>n().expired===0);return()=>e()?v(`dashboard.stable_threshold`):v(`dashboard.above_threshold`)})()),e})(),I()]}}),null),c(i,t(C,{class:`obs-card obs-metric obs-card--link`,href:`/busy`,get children(){return[(()=>{var e=ie(),t=e.firstChild;return c(t,()=>v(`dashboard.busy`)),e})(),(()=>{var e=F();return c(e,t(k,{get value(){return n().busy}})),e})(),(()=>{var e=A();return c(e,(()=>{var e=y(()=>n().busy===0);return()=>e()?v(`dashboard.system_idle`):v(`dashboard.processing`)})()),e})(),I()]}}),null),c(d,()=>v(`dashboard.performance_insight`)),c(m,()=>v(`dashboard.perf_subtitle`,{range:v(b().desc_key)})),c(h,t(a,{each:G,children:(e,t)=>(()=>{var n=z();return n.$$click=()=>g(t()),c(n,()=>e.key),x(e=>{var r=t()===f(),i=t()===f()?`is-active`:``;return r!==e.e&&l(n,`aria-selected`,e.e=r),i!==e.t&&p(n,e.t=i),e},{e:void 0,t:void 0}),n})()})),c(_,()=>v(`dashboard.processed`),null),c(S,()=>v(`dashboard.failed`),null),c(E,t(e,{get when(){return!D.isPending},get fallback(){return t(ee,{height:320})},get children(){return t(e,{get when(){return Y()},get fallback(){return(()=>{var e=B();return c(e,()=>v(`dashboard.no_history`)),e})()},get children(){return t(T,{get data(){return J()},height:320,xMinTickGap:64,get series(){return[{key:`processed`,name:v(`dashboard.processed`),stroke:`#fafafa`,strokeWidth:2,fill:`gradient`},{key:`failed`,name:v(`dashboard.failed`),stroke:`#a1a1aa`,strokeWidth:1.5,strokeDasharray:`5 4`,fill:`none`}]}})}})}})),c(O,t(C,{class:`obs-card obs-stat obs-card--link`,href:`/queues`,get children(){return[(()=>{var e=L();return c(e,()=>v(`dashboard.enqueued`)),e})(),(()=>{var e=R();return c(e,t(k,{get value(){return n().enqueued}})),e})(),I()]}}),null),c(O,t(C,{class:`obs-card obs-stat obs-card--link`,href:`/retries`,get children(){return[(()=>{var e=L();return c(e,()=>v(`dashboard.retries`)),e})(),(()=>{var e=R();return c(e,t(k,{get value(){return n().retries}})),e})(),I()]}}),null),c(O,t(C,{class:`obs-card obs-stat obs-card--link`,href:`/scheduled`,get children(){return[(()=>{var e=L();return c(e,()=>v(`dashboard.scheduled`)),e})(),(()=>{var e=R();return c(e,t(k,{get value(){return n().scheduled}})),e})(),I()]}}),null),c(O,t(C,{class:`obs-card obs-stat obs-card--link`,href:`/dead`,get children(){return[(()=>{var e=L();return c(e,()=>v(`dashboard.dead`)),e})(),(()=>{var e=R();return c(e,t(k,{get value(){return n().dead}})),e})(),I()]}}),null),c(K,()=>v(`table.queues`)),c(N,t(C,{class:`obs-table__link`,href:`/queues`,get children(){return[`View All `,ae()]}}),null),c(M,t(e,{get when(){return n().queues.length>0},get fallback(){return(()=>{var e=P();return c(e,()=>v(`common.empty`)),e})()},get children(){var r=oe(),i=r.firstChild.firstChild,o=i.firstChild.firstChild.nextSibling,s=o.nextSibling,u=s.nextSibling,d=i.nextSibling;return c(o,()=>v(`table.size`)),c(s,()=>v(`table.latency`)),c(u,()=>v(`table.status`)),c(d,t(a,{get each(){return n().queues},children:n=>(()=>{var r=H(),i=r.firstChild,a=i.nextSibling,o=a.nextSibling,s=o.nextSibling;return c(i,()=>n.name),c(a,t(k,{get value(){return n.size}})),c(o,()=>w(n.latency)),c(s,t(e,{get when(){return n.paused},get fallback(){return(()=>{var e=U();return c(e,()=>v(`dashboard.active`)),e})()},get children(){var e=V();return c(e,()=>v(`dashboard.paused`)),e}})),x(()=>l(o,`title`,`${n.latency.toFixed(3)}s`)),r})()})),r}}),null),c(X,()=>v(`dashboard.strapline`)),c(Z,()=>v(`dashboard.tagline`)),c(Q,()=>v(`dashboard.install`),null),c($,()=>v(`dashboard.docs`),null),r})()})]}})}f([`click`]);export{J as default};
@@ -0,0 +1 @@
1
+ import{A as e,F as t,J as n,M as r,O as i,V as a,_ as o,b as s,c,f as l,g as u,i as d,k as f,s as p,w as m,z as h}from"./Skeleton-DOYDkzg1.js";import{a as ee,n as te}from"./index-CZTcs-pM.js";import{a as g,i as _,o as v,t as y}from"./utils-DDJC7tJV.js";import{n as ne,r as b,t as re}from"./useResetPageOnEmpty-CoZU4b3a.js";import{n as x,t as S}from"./useSort-wQcnbdsa.js";import{t as C}from"./PageHeader-CsDvJSOA.js";import{t as w}from"./ArgsValue-DYfBiXrJ.js";import{t as T}from"./JobDetailModal-DuMdKUMm.js";import{a as E,i as D,n as O,r as ie,t as ae}from"./FilterBox-FCDi4ZCU.js";var k=m(`<div>`),oe=m(`<div class=empty-state style=color:var(--danger)>`),se=m(`<span class="badge badge-danger">`),ce=m(`<th class=row-action><input type=checkbox>`),A=m(`<div class=table-wrapper><table><thead><tr></tr></thead><tbody>`),j=m(`<div class=empty-state>`),M=m(`<td class=row-action><input type=checkbox>`),N=m(`<tr class=row-clickable><td style=font-family:monospace;font-size:12px;color:var(--text-muted)></td><td style=font-weight:500></td><td></td><td style=color:var(--danger)></td><td></td><td>`),P=25,F={jid:e=>e.jid,klass:e=>e.klass,args:e=>y(e.args),error_class:e=>e.error_class,error_message:e=>e.error_message,failed_at:e=>e.at},I=[{cmd:`retry`,label:p(`actions.retry`)},{cmd:`delete`,label:p(`actions.delete`),danger:!0}];function L(){let[u,m]=ne(),[L,R]=a(``),[z,B]=a(null),[V,H]=a(null),U=ee(),W=()=>U.data?.read_only??!1,G=D(),{single:K,bulk:q,all:J}=ie(`dead`),le=()=>K.isPending||q.isPending||J.isPending;n(()=>{document.title=`${p(`nav.dead`)} — Wurk`});let ue=e=>{R(e),m(1)},Y=l(()=>({queryKey:[`dead`,u(),L()],queryFn:()=>te(`${c()}/api/dead?page=${u()-1}&count=${P}&substr=${encodeURIComponent(L())}`)}));re(u,m,()=>!Y.isPending&&!!Y.data,()=>(Y.data?.entries.length??0)===0);let{sorted:X,sort:Z,toggle:Q}=S(()=>Y.data?.entries??[],F),$=()=>X().map(O),de=()=>$().length>0&&$().every(e=>G.selected().has(e));return t(r,{get children(){return[t(f,{get when(){return Y.isPending},get children(){var e=k();return o(e,t(C,{icon:`fa-skull`,get title(){return p(`nav.dead`)},get summary(){return p(`summaries.dead`)}}),null),o(e,t(d,{rows:8,cols:7}),null),e}}),t(f,{get when(){return Y.isError||!Y.data},get children(){var e=oe();return o(e,()=>p(`common.error`)),e}}),t(f,{get when(){return Y.data},children:n=>(()=>{var r=k();return o(r,t(C,{icon:`fa-skull`,get title(){return p(`nav.dead`)},get summary(){return p(`summaries.dead`)},get children(){var e=se();return o(e,()=>n().total.toLocaleString()),e}}),null),o(r,t(ae,{get value(){return L()},onChange:ue,get placeholder(){return p(`common.filter_placeholder`)}}),null),o(r,t(e,{get when(){return X().length>0},get fallback(){return(()=>{var e=j();return o(e,()=>p(`common.empty`)),e})()},get children(){return[t(e,{get when(){return!W()},get children(){return t(E,{bulk:I,all:I,get selectedCount(){return G.count()},get total(){return n().total},get pending(){return le()},onBulk:e=>q.mutate({keys:[...G.selected()],cmd:e},{onSuccess:G.clear}),onAll:e=>J.mutate(e,{onSuccess:G.clear})})}}),(()=>{var n=A(),r=n.firstChild.firstChild,a=r.firstChild,c=r.nextSibling;return o(a,t(e,{get when(){return!W()},get children(){var e=ce(),t=e.firstChild;return t.addEventListener(`change`,()=>G.toggleAll($())),h(()=>s(t,`aria-label`,p(`table.select_all`))),h(()=>t.checked=de()),e}}),null),o(a,t(x,{get label(){return p(`table.jid`)},sortKey:`jid`,get sort(){return Z()},onSort:Q}),null),o(a,t(x,{get label(){return p(`table.class`)},sortKey:`klass`,get sort(){return Z()},onSort:Q}),null),o(a,t(x,{get label(){return p(`table.args`)},sortKey:`args`,get sort(){return Z()},onSort:Q}),null),o(a,t(x,{get label(){return p(`table.error`)},sortKey:`error_class`,get sort(){return Z()},onSort:Q}),null),o(a,t(x,{get label(){return p(`table.message`)},sortKey:`error_message`,get sort(){return Z()},onSort:Q}),null),o(a,t(x,{get label(){return p(`table.failed_at`)},sortKey:`failed_at`,get sort(){return Z()},onSort:Q}),null),o(c,t(i,{get each(){return X()},children:n=>{let r=y(n.args),i=O(n);return(()=>{var a=N(),c=a.firstChild,l=c.nextSibling,u=l.nextSibling,d=u.nextSibling,f=d.nextSibling,m=f.nextSibling;return a.$$click=()=>{B(n),H(i)},o(a,t(e,{get when(){return!W()},get children(){var e=M(),t=e.firstChild;return e.$$click=e=>e.stopPropagation(),t.addEventListener(`change`,()=>G.toggle(i)),h(()=>s(t,`aria-label`,p(`table.select_row`))),h(()=>t.checked=G.selected().has(i)),e}}),c),o(c,()=>v(n.jid,12)),o(l,()=>n.klass),o(u,t(w,{str:r,max:40})),o(d,()=>v(n.error_class,25)),o(f,()=>v(n.error_message,40)),o(m,()=>g(n.at)),h(e=>{var t=n.jid,r=n.error_class??``,i=n.error_message??``,a=_(n.at);return t!==e.e&&s(c,`title`,e.e=t),r!==e.t&&s(d,`title`,e.t=r),i!==e.a&&s(f,`title`,e.a=i),a!==e.o&&s(m,`title`,e.o=a),e},{e:void 0,t:void 0,a:void 0,o:void 0}),a})()}})),n})(),t(b,{get page(){return u()},get total(){return n().total},count:P,onChange:m})]}}),null),o(r,t(T,{get entry(){return z()},get atLabel(){return p(`table.failed_at`)},get actions(){return W()?void 0:I},get pending(){return K.isPending},onAction:e=>{let t=V();t&&K.mutate({key:t,cmd:e},{onSuccess:()=>{B(null),H(null)}})},onClose:()=>{B(null),H(null)}}),null),r})()})]}})}u([`click`]);export{L as default};
@@ -0,0 +1 @@
1
+ import{A as e,F as t,L as n,V as r,_ as i,b as a,c as o,g as s,i as c,n as l,s as u,v as d,w as f,z as p}from"./Skeleton-DOYDkzg1.js";import{a as m,s as h}from"./index-CZTcs-pM.js";import{t as g}from"./PageHeader-CsDvJSOA.js";var _=f(`<div class=empty-state style=color:var(--danger)>`),v=f(`<div class=skeleton-stack>`),y=f(`<div class="card ext-view">`),b=f(`<a class="btn btn-sm"target=_blank rel="noopener noreferrer"><i class="fa-solid fa-arrow-up-right-from-square"style=margin-inline-end:0.4rem>`),x=f(`<iframe style="width:100%;height:calc(100vh - 11rem);border:1px solid var(--border);border-radius:var(--radius);background:var(--surface)">`);function S(){let n=h(),r=()=>n.tab??``,i=m(),a=e=>e.replace(/\/+$/,``),o=()=>i.data?.custom_tabs?.find(e=>a(e.path)===a(r())),s=()=>o()?.name??r();return t(e,{get when(){return o()?.ext_name},keyed:!0,get fallback(){return t(w,{get tab(){return r()},get title(){return s()}})},children:e=>t(C,{extName:e,get indexPath(){return r()},get title(){return s()}})})}function C(a){let s=`${o()}/ext/${a.extName}/`,[f,m]=r(null),[h,b]=r(!1),x=0,S=async(e,t)=>{let n=++x;try{let r=await fetch(s+e,t),i=await r.text();if(n!==x)return;b(!r.ok&&r.status!==404),m(i)}catch{n===x&&b(!0)}};n(()=>{S(a.indexPath.replace(/\/+$/,``))});let C=e=>{let t=e.target.closest(`a`);if(!t?.getAttribute(`href`))return;let n=new URL(t.href,window.location.origin);n.origin!==window.location.origin||!n.pathname.startsWith(s)||(e.preventDefault(),S(n.pathname.slice(s.length)+n.search))},w=e=>{let t=e.target,n=new URL(t.getAttribute(`action`)||window.location.href,window.location.origin);if(n.origin!==window.location.origin||!n.pathname.startsWith(s))return;e.preventDefault();let r=new FormData(t);if((t.method||`get`).toUpperCase()===`GET`){let e=new URLSearchParams(Array.from(r.entries())).toString();S(`${n.pathname.slice(s.length)}${e?`?${e}`:``}`)}else S(n.pathname.slice(s.length)+n.search,{method:`POST`,body:r})};return[t(g,{icon:`fa-puzzle-piece`,get title(){return a.title},get summary(){return u(`extension.summary`)}}),t(e,{get when(){return h()},get children(){var e=_();return i(e,()=>u(`common.error`)),e}}),t(e,{get when(){return d(()=>f()===null)()&&!h()},get children(){var e=v();return i(e,t(l,{height:`1.5rem`,width:`40%`}),null),i(e,t(c,{rows:6,cols:4}),null),e}}),t(e,{get when(){return d(()=>f()!==null)()&&!h()},get children(){var e=y();return e.addEventListener(`submit`,w),e.$$click=C,p(()=>e.innerHTML=f()),e}})]}function w(e){let n=()=>`${o()}/${e.tab}?wurk_ext_embed=1`;return[t(g,{icon:`fa-puzzle-piece`,get title(){return e.title},get summary(){return u(`extension.summary`)},get children(){var t=b();return t.firstChild,i(t,()=>u(`extension.open`),null),p(()=>a(t,`href`,`${o()}/${e.tab}`)),t}}),(()=>{var t=x();return p(r=>{var i=e.title,o=n();return i!==r.e&&a(t,`title`,r.e=i),o!==r.t&&a(t,`src`,r.t=o),r},{e:void 0,t:void 0}),t})()]}s([`click`]);export{S as default};
@@ -0,0 +1 @@
1
+ import{F as e,L as t,O as n,V as r,_ as i,b as a,c as o,d as s,g as c,h as l,p as u,q as d,s as f,v as p,w as m,z as h}from"./Skeleton-DOYDkzg1.js";import{r as g,t as _}from"./index-CZTcs-pM.js";var v=m(`<div class=action-bar><div class=action-bar-group><span class=action-bar-count></span></div><div class=action-bar-group>`),y=m(`<button>`);function b(t){let r=(e,t)=>!e.danger||window.confirm(f(`actions.confirm`,{action:e.label,scope:t}));return(()=>{var a=v(),o=a.firstChild,s=o.firstChild,c=o.nextSibling;return i(s,(()=>{var e=p(()=>t.selectedCount>0);return()=>e()?f(`actions.selected`,{n:t.selectedCount}):f(`actions.select_hint`)})()),i(o,e(n,{get each(){return t.bulk},children:e=>(()=>{var n=y();return n.$$click=()=>r(e,f(`actions.scope_selected`,{n:t.selectedCount}))&&t.onBulk(e.cmd),i(n,()=>e.label),h(r=>{var i=`btn btn-sm${e.danger?` btn-danger`:``}`,a=t.pending||t.selectedCount===0;return i!==r.e&&l(n,r.e=i),a!==r.t&&(n.disabled=r.t=a),r},{e:void 0,t:void 0}),n})()}),null),i(c,e(n,{get each(){return t.all},children:e=>(()=>{var n=y();return n.$$click=()=>r(e,f(`actions.scope_all`))&&t.onAll(e.cmd),i(n,()=>`${e.label} ${f(`actions.all_suffix`)}`),h(r=>{var i=`btn btn-sm btn-ghost${e.danger?` btn-danger`:``}`,a=t.pending||t.total===0;return i!==r.e&&l(n,r.e=i),a!==r.t&&(n.disabled=r.t=a),r},{e:void 0,t:void 0}),n})()})),a})()}c([`click`]);function x(){let[e,t]=r(new Set);return{selected:e,toggle:e=>t(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n}),toggleAll:e=>t(t=>e.length>0&&e.every(e=>t.has(e))?new Set:new Set(e)),clear:()=>t(new Set),count:()=>e().size}}function S(e){return`${e.score}|${e.jid}`}function C(e){let t=u(),n=()=>{t.invalidateQueries({queryKey:[e]}),t.invalidateQueries({queryKey:[`stats`]})};return{single:s(()=>({mutationFn:({key:t,cmd:n})=>g(`${o()}/api/${e}/${encodeURIComponent(t)}`,{cmd:n}),onSuccess:n,onError:_})),bulk:s(()=>({mutationFn:({keys:t,cmd:n})=>g(`${o()}/api/${e}`,{keys:t,cmd:n}),onSuccess:n,onError:_})),all:s(()=>({mutationFn:t=>g(`${o()}/api/${e}/all/${t}`),onSuccess:n,onError:_}))}}var w=m(`<div class=filter-box style=margin-bottom:1rem;display:flex><input class=input type=search style=flex:1;max-width:360px>`),T=250;function E(e){let[n,i]=r(e.value);return t(()=>{let t=n(),r=setTimeout(()=>{t!==e.value&&e.onChange(t)},T);d(()=>clearTimeout(r))}),(()=>{var t=w(),r=t.firstChild;return r.$$input=e=>i(e.currentTarget.value),h(t=>{var n=e.placeholder??f(`common.filter_placeholder`),i=e.placeholder??f(`common.filter_placeholder`);return n!==t.e&&a(r,`placeholder`,t.e=n),i!==t.t&&a(r,`aria-label`,t.t=i),t},{e:void 0,t:void 0}),h(()=>r.value=n()),t})()}c([`input`]);export{b as a,x as i,S as n,C as r,E as t};
@@ -0,0 +1,2 @@
1
+ import{A as e,F as t,O as n,_ as r,g as i,h as a,s as o,v as s,w as c,x as l,z as u}from"./Skeleton-DOYDkzg1.js";import{a as d,i as f,t as p}from"./utils-DDJC7tJV.js";import{t as m}from"./Modal-t4FI_LaY.js";var h=c(`<div style=display:flex;flex-direction:column;gap:3px><span style=font-size:11px;color:var(--text-muted);text-transform:uppercase;letter-spacing:0.04em></span><span style=font-size:13px;word-break:break-word>`),g=c(`<div style=display:flex;gap:0.5rem;justify-content:flex-end;flex-wrap:wrap>`),_=c(`<button>`),v=c(`<span style=color:var(--text-muted)>—`),y=c(`<div style=display:flex;flex-direction:column;gap:3px><span style=font-size:11px;color:var(--text-muted);text-transform:uppercase;letter-spacing:0.04em></span><span style=font-size:13px;color:var(--danger);word-break:break-word>`),b=c(`<pre class=job-backtrace>`),x=c(`<div style="display:grid;grid-template-columns:repeat(auto-fit, minmax(160px, 1fr));gap:0.9rem">`),S=c(`<div style=display:flex;flex-direction:column;gap:1rem><div style="display:grid;grid-template-columns:repeat(auto-fit, minmax(160px, 1fr));gap:0.9rem">`),C=c(`<pre style=margin:0;white-space:pre-wrap;word-break:break-word>`);function w(e){return(()=>{var t=h(),n=t.firstChild,i=n.nextSibling;return r(n,()=>e.label),r(i,()=>e.children),u(t=>l(i,`font-family`,e.mono?`ui-monospace, monospace`:void 0)),t})()}function T(i){return t(m,{get open(){return i.entry!==null},get onClose(){return i.onClose},get title(){return i.entry?.klass??o(`job.detail`)},width:680,footer:i.actions&&i.actions.length>0&&i.onAction?(()=>{var e=g();return r(e,t(n,{get each(){return i.actions},children:e=>(()=>{var t=_();return t.$$click=()=>{i.pending||e.danger&&!window.confirm(o(`actions.confirm`,{action:e.label,scope:o(`job.detail`).toLowerCase()}))||i.onAction?.(e.cmd)},r(t,()=>e.label),u(n=>{var r=`btn btn-sm${e.danger?` btn-danger`:``}`,o=i.pending;return r!==n.e&&a(t,n.e=r),o!==n.t&&(t.disabled=n.t=o),n},{e:void 0,t:void 0}),t})()})),e})():void 0,get children(){return t(e,{get when(){return i.entry},children:a=>(()=>{var c=S(),l=c.firstChild;return r(l,t(w,{get label(){return o(`job.class`)},get children(){return a().klass}}),null),r(l,t(e,{get when(){return a().queue},get children(){return t(w,{get label(){return o(`job.queue`)},get children(){return a().queue}})}}),null),r(l,t(w,{get label(){return o(`job.jid`)},mono:!0,get children(){return a().jid}}),null),r(l,t(e,{get when(){return typeof a().retry_count==`number`},get children(){return t(w,{get label(){return o(`job.retries`)},get children(){return a().retry_count}})}}),null),r(l,t(e,{get when(){return a().enqueued_at!=null},get children(){return t(w,{get label(){return o(`job.enqueued`)},mono:!0,get children(){return[s(()=>f(a().enqueued_at)),` (`,s(()=>d(a().enqueued_at)),`)`]}})}}),null),r(l,t(e,{get when(){return a().at!=null},get children(){return t(w,{get label(){return i.atLabel??o(`job.at`)},mono:!0,get children(){return[s(()=>f(a().at)),` (`,s(()=>d(a().at)),`)`]}})}}),null),r(c,t(w,{get label(){return o(`job.args`)},mono:!0,get children(){return t(e,{get when(){return p(a().args)===`[]`||p(a().args)===``},get fallback(){return(()=>{var e=C();return r(e,()=>p(a().args)),e})()},get children(){return v()}})}}),null),r(c,t(e,{get when(){return a().error_class||a().error_message},get children(){var e=y(),t=e.firstChild,n=t.nextSibling;return r(t,()=>o(`job.error`)),r(n,()=>a().error_class,null),r(n,(()=>{var e=s(()=>!!a().error_message);return()=>e()?`: ${a().error_message}`:``})(),null),e}}),null),r(c,t(e,{get when(){return s(()=>!!a().error_backtrace)()&&a().error_backtrace.length>0},get children(){return t(w,{get label(){return o(`job.backtrace`)},get children(){var e=b();return r(e,()=>a().error_backtrace.join(`
2
+ `)),e}})}}),null),r(c,t(e,{get when(){return s(()=>!!a().custom_rows)()&&a().custom_rows.length>0},get children(){var e=x();return r(e,t(n,{get each(){return a().custom_rows},children:([e,n])=>t(w,{label:e,children:n})})),e}}),null),c})()})}})}i([`click`]);export{T as t};
@@ -0,0 +1 @@
1
+ import{A as e,F as t,J as n,M as r,O as i,_ as a,b as o,c as s,d as c,f as l,g as u,i as d,k as f,p,s as m,w as h,x as g,z as _}from"./Skeleton-DOYDkzg1.js";import{a as v,n as y,r as b,t as x}from"./index-CZTcs-pM.js";import{n as S,r as C,t as w}from"./useResetPageOnEmpty-CoZU4b3a.js";import{n as T,t as E}from"./useSort-wQcnbdsa.js";import{t as D}from"./PageHeader-CsDvJSOA.js";var O=h(`<div>`),k=h(`<div class=empty-state style=color:var(--danger)>`),A=h(`<span class="badge badge-muted">`),j=h(`<th>`),M=h(`<div class=table-wrapper><table><thead><tr></tr></thead><tbody>`),N=h(`<div class=empty-state>`),P=h(`<div style=display:flex;align-items:center;gap:0.5rem><div class=progress-bar-track style=flex:1><div class=progress-bar-fill></div></div><span style=font-size:12px;color:var(--text-muted);min-width:36px>%`),F=h(`<span class="badge badge-success">`),I=h(`<td><button class="btn btn-sm">`),L=h(`<tr><td style=font-weight:500></td><td><span class="badge badge-accent"></span></td><td style=font-variant-numeric:tabular-nums></td><td style=font-variant-numeric:tabular-nums></td><td style=width:160px></td><td>`),R=h(`<span style=color:var(--text-muted)>—`),z=h(`<span class="badge badge-danger">`),B=25,V={name:e=>e.name,type:e=>e.type,used:e=>e.status?.used??0,limit:e=>e.status?.limit??null,usage:e=>{let t=e.status?.used??0,n=e.status?.limit??null;return n&&n>0?t/n:0},status:e=>e.status?.[`available?`]??!0?`available`:`exhausted`};function H(){let u=p(),h=v(),H=()=>h.data?.read_only??!1,[U,W]=S();n(()=>{document.title=`${m(`nav.limiters`)} — Wurk`});let G=l(()=>({queryKey:[`limiters`,U()],queryFn:()=>y(`${s()}/api/limiters?page=${U()-1}&count=${B}`),refetchInterval:5e3})),K=c(()=>({mutationFn:e=>b(`${s()}/api/limiters/${encodeURIComponent(e)}/reset`),onSuccess:()=>u.invalidateQueries({queryKey:[`limiters`]}),onError:x}));w(U,W,()=>!G.isPending&&!!G.data,()=>(G.data?.limiters.length??0)===0);let{sorted:q,sort:J,toggle:Y}=E(()=>G.data?.limiters??[],V),X=e=>window.confirm(m(`actions.confirm`,{action:m(`actions.reset`),scope:e}))&&K.mutate(e);return t(r,{get children(){return[t(f,{get when(){return G.isPending},get children(){var e=O();return a(e,t(D,{icon:`fa-gauge`,get title(){return m(`nav.limiters`)},get summary(){return m(`summaries.limiters`)}}),null),a(e,t(d,{rows:8,get cols(){return H()?6:7}}),null),e}}),t(f,{get when(){return G.isError||!G.data},get children(){var e=k();return a(e,()=>m(`common.error`)),e}}),t(f,{get when(){return G.data},children:n=>(()=>{var r=O();return a(r,t(D,{icon:`fa-gauge`,get title(){return m(`nav.limiters`)},get summary(){return m(`summaries.limiters`)},get children(){var e=A();return a(e,()=>n().total.toLocaleString()),e}}),null),a(r,t(e,{get when(){return q().length>0},get fallback(){return(()=>{var e=N();return a(e,()=>m(`common.empty`)),e})()},get children(){return[(()=>{var n=M(),r=n.firstChild.firstChild,s=r.firstChild,c=r.nextSibling;return a(s,t(T,{get label(){return m(`table.name`)},sortKey:`name`,get sort(){return J()},onSort:Y}),null),a(s,t(T,{get label(){return m(`table.type`)},sortKey:`type`,get sort(){return J()},onSort:Y}),null),a(s,t(T,{get label(){return m(`table.used`)},sortKey:`used`,get sort(){return J()},onSort:Y}),null),a(s,t(T,{get label(){return m(`table.limit`)},sortKey:`limit`,get sort(){return J()},onSort:Y}),null),a(s,t(T,{get label(){return m(`table.usage`)},sortKey:`usage`,get sort(){return J()},onSort:Y}),null),a(s,t(T,{get label(){return m(`table.status`)},sortKey:`status`,get sort(){return J()},onSort:Y}),null),a(s,t(e,{get when(){return!H()},get children(){return j()}}),null),a(c,t(i,{get each(){return q()},children:n=>{let r=n.status,i=r?.used??0,s=r?.limit??null,c=s&&s>0?Math.min(i/s*100,100):0,l=c>90?`var(--danger)`:c>70?`var(--warning)`:`var(--success)`,u=r?.[`available?`]??!0,d=r?Object.entries(r).filter(([e])=>![`used`,`limit`,`reset_at`,`available?`].includes(e)).map(([e,t])=>`${e}=${t}`).join(` `):``;return(()=>{var r=L(),f=r.firstChild,p=f.nextSibling,h=p.firstChild,v=p.nextSibling,y=v.nextSibling,b=y.nextSibling,x=b.nextSibling;return a(f,()=>n.name),a(h,()=>n.type),o(v,`title`,d),a(v,()=>i.toLocaleString()),a(y,()=>s==null?`∞`:s.toLocaleString()),a(b,t(e,{when:s!=null,get fallback(){return R()},get children(){var e=P(),t=e.firstChild,n=t.firstChild,r=t.nextSibling,i=r.firstChild;return g(n,`width`,`${c}%`),g(n,`background`,l),a(r,()=>Math.round(c),i),e}})),a(x,t(e,{when:u,get fallback(){return(()=>{var e=z();return a(e,()=>m(`limiters.exhausted`)),e})()},get children(){var e=F();return a(e,()=>m(`limiters.available`)),e}})),a(r,t(e,{get when(){return!H()},get children(){var e=I(),t=e.firstChild;return t.$$click=()=>X(n.name),a(t,()=>m(`actions.reset`)),_(()=>t.disabled=K.isPending),e}}),null),_(()=>o(f,`title`,n.name)),r})()}})),n})(),t(C,{get page(){return U()},get total(){return n().total},count:B,onChange:W})]}}),null),r})()})]}})}u([`click`]);export{H as default};
@@ -0,0 +1 @@
1
+ import{A as e,F as t,J as n,O as r,R as i,V as a,_ as o,b as s,c,f as l,g as u,h as ee,n as d,s as f,v as p,w as m,x as h,z as g}from"./Skeleton-DOYDkzg1.js";import{n as te,o as ne}from"./utils-DDJC7tJV.js";import{t as _}from"./Modal-t4FI_LaY.js";import{n as v,r as re,t as ie}from"./charts-CVK0zAnC.js";var y=m(`<span style=font-size:12px;margin-inline-start:8px>%`),b=m(`<div role=status>`),ae=m(`<div class=obs-tablescroll><table><thead><tr><th></th><th style=text-align:end></th><th style=text-align:end></th></tr></thead><tbody>`),oe=m(`<div class=obs><div class=obs-toolbar><span class=obs-toolbar__label><i class="fa-regular fa-calendar"aria-hidden=true></i> </span><div class=obs-seg role=tablist></div></div><div class=obs-metrics><div class="obs-card obs-metric"><div class=obs-metric__head><span class=obs-mono></span><i class="fa-solid fa-circle-check obs-metric__icon"aria-hidden=true></i></div><span class=obs-metric__value></span><span class=obs-metric__sub></span></div><div class="obs-card obs-metric"><div class=obs-metric__head><span class=obs-mono></span><i class="fa-solid fa-triangle-exclamation obs-metric__icon"aria-hidden=true></i></div><span class=obs-metric__value></span><span class=obs-metric__sub></span></div><div class="obs-card obs-metric"><div class=obs-metric__head><span class=obs-mono></span><i class="fa-solid fa-stopwatch obs-metric__icon"aria-hidden=true></i></div><span class=obs-metric__value></span><span class=obs-metric__sub></span></div><div class="obs-card obs-metric"><div class=obs-metric__head><span class=obs-mono></span><i class="fa-solid fa-gears obs-metric__icon"aria-hidden=true></i></div><span class=obs-metric__value></span><span class=obs-metric__sub></span></div></div><div class="obs-card obs-panel"><div class=obs-panel__head><div><h2 class=obs-panel__title></h2><p class=obs-panel__sub></p></div><div class=obs-legend><span><i class="dot dot--processed"></i> </span><span><i class="dot dot--failed"></i> </span></div></div><div class=obs-chartbox></div></div><div class=obs-grid2><div class="obs-card obs-panel"><div class=obs-panel__head><h2 class=obs-panel__title style=font-size:18px></h2><span class=obs-mono></span></div><div class=obs-chartbox></div></div><div class="obs-card obs-table"><div class=obs-table__head><h2 class=obs-table__title style=font-size:18px>`),se=m(`<button role=tab>`),ce=m(`<div class=empty-state style=height:300px;display:grid;place-items:center>`),x=m(`<div class=empty-state style=height:240px;display:grid;place-items:center>`),le=m(`<div class=obs-empty>`),ue=m(`<tr><td style=color:var(--obs-text)><button type=button class=obs-jobbtn><span class=obs-jobdot></span></button></td><td style=text-align:end;font-variant-numeric:tabular-nums></td><td class=obs-pct style=text-align:end>%`),S=m(`<div style=display:flex;gap:1.5rem;margin-bottom:1rem><div><div class=obs-mono></div><div style=font-size:18px;font-weight:600></div></div><div><div class=obs-mono></div><div style=font-size:18px;font-weight:600;color:var(--danger)>`),C=m(`<div class="obs-card obs-panel"><div class=obs-panel__head><h2 class=obs-panel__title style=font-size:18px></h2></div><div class=obs-chartbox>`),w=[`var(--accent)`,`#e0b341`,`#46b3a8`,`#d4737e`,`#8a7fd1`,`#5fa8d3`,`#c08457`,`#7bb274`],T=e=>w[e%w.length],de=[`#fafafa`,`#d4d4d8`,`#a1a1aa`,`#71717a`,`#52525b`,`#3f3f46`],E=[{key:`1h`,bucket:`1m`,window:`24h`,slice:60,minutes:60},{key:`24h`,bucket:`1m`,window:`24h`,minutes:1440},{key:`7d`,bucket:`5m`,window:`7d`,minutes:10080},{key:`30d`,bucket:`1h`,window:`30d`,minutes:720*60}],D=(e,t)=>{let n=new Date(e*1e3),r=String(n.getHours()).padStart(2,`0`);return t===`1h`?`${n.getMonth()+1}/${n.getDate()} ${r}:00`:`${r}:${String(n.getMinutes()).padStart(2,`0`)}`};function O(e,t){if(e.length<2)return null;let n=e[e.length-1].at,r=0,i=0;for(let a of e)a.at>n-3600?r+=a[t]:a.at>n-7200&&(i+=a[t]);return i===0?r===0?null:100:Math.round((r-i)/i*100)}function k(n){return t(e,{get when(){return n.pct!==null},get children(){return(()=>{let e=()=>n.pct>=0,t=()=>e()===n.goodWhenUp;return(()=>{var r=y(),i=r.firstChild;return o(r,()=>e()?`↑`:`↓`,i),o(r,()=>Math.abs(n.pct),i),g(e=>h(r,`color`,t()?`var(--success)`:`var(--danger)`)),r})()})()}})}var A=(e,t)=>{if(t<=0)return[];if(e.length<=t)return e;if(t===1)return[e[e.length-1]];let n=(e.length-1)/(t-1);return Array.from({length:t},(t,r)=>e[Math.round(r*n)])};function j(e){return(()=>{var n=b();return o(n,t(d,{height:`100%`})),g(t=>{var r=`${e.height}px`,i=f(`common.loading`);return r!==t.e&&h(n,`height`,t.e=r),i!==t.t&&s(n,`aria-label`,t.t=i),t},{e:void 0,t:void 0}),n})()}function M(){let[u,d]=a(2),[m,_]=a(null),v=()=>E[u()];n(()=>{document.title=`${f(`nav.metrics`)} — Wurk`});let y=l(()=>({queryKey:[`stats`],queryFn:()=>fetch(`${c()}/api/stats`).then(e=>e.json()),refetchInterval:5e3})),b=l(()=>({queryKey:[`history`,v().bucket,v().window],queryFn:()=>fetch(`${c()}/api/history/${v().bucket}?window=${v().window}`).then(e=>e.json()),refetchInterval:3e4})),S=l(()=>({queryKey:[`metrics`,v().minutes],queryFn:()=>fetch(`${c()}/api/metrics?minutes=${v().minutes}`).then(e=>e.json()),refetchInterval:3e4})),C=l(()=>({queryKey:[`queue-history`,v().bucket,v().window],queryFn:async()=>{let e=await fetch(`${c()}/api/queue-history/${v().bucket}?window=${v().window}`);if(!e.ok)throw Error(`queue-history failed (${e.status})`);return e.json()},refetchInterval:3e4})),w=i(()=>(b.data?.series??[]).map(e=>({...e,label:D(e.at,v().bucket)}))),T=i(()=>{let e=v(),t=`slice`in e?e.slice:void 0;return t?w().slice(-t):w()}),M=i(()=>T().some(e=>e.processed>0||e.failed>0)),N=i(()=>C.data?.queues??[]),P=i(()=>N()[0]?.points.map(e=>e.at)??[]),F=i(()=>A(P().map((e,t)=>({label:D(e,v().bucket),depth:N().reduce((e,n)=>e+(n.points[t]?.size??0),0)})),16)),I=i(()=>Math.max(0,...F().map(e=>e.depth))),L=i(()=>(S.data?.top_jobs??[]).map(e=>({klass:e.klass,count:e.processed+e.failed})).sort((e,t)=>t.count-e.count)),R=i(()=>L().reduce((e,t)=>e+t.count,0)),z=i(()=>L().slice(0,6));return(()=>{var n=oe(),i=n.firstChild,a=i.firstChild;a.firstChild.nextSibling;var c=a.nextSibling,l=i.nextSibling,D=l.firstChild,A=D.firstChild,N=A.firstChild,P=A.nextSibling,L=P.nextSibling,B=D.nextSibling,V=B.firstChild,he=V.firstChild,H=V.nextSibling,ge=H.nextSibling,U=B.nextSibling,W=U.firstChild,_e=W.firstChild,G=W.nextSibling,ve=G.nextSibling,K=U.nextSibling.firstChild,ye=K.firstChild,q=K.nextSibling,be=q.nextSibling,J=l.nextSibling,Y=J.firstChild,X=Y.firstChild,Z=X.firstChild,xe=Z.nextSibling,Q=X.nextSibling.firstChild;Q.firstChild.nextSibling;var Se=Q.nextSibling;Se.firstChild.nextSibling;var Ce=Y.nextSibling,$=J.nextSibling.firstChild,we=$.firstChild,Te=we.firstChild,Ee=Te.nextSibling,De=we.nextSibling,Oe=$.nextSibling,ke=Oe.firstChild.firstChild;return o(a,()=>f(`metrics.time_range`),null),o(c,t(r,{each:E,children:(e,t)=>(()=>{var n=se();return n.$$click=()=>d(t()),o(n,()=>e.key),g(e=>{var r=t()===u(),i=t()===u()?`is-active`:``;return r!==e.e&&s(n,`aria-selected`,e.e=r),i!==e.t&&ee(n,e.t=i),e},{e:void 0,t:void 0}),n})()})),o(N,()=>f(`metrics.total_processed`)),o(P,()=>(y.data?.processed??0).toLocaleString(),null),o(P,t(k,{get pct(){return O(w(),`processed`)},goodWhenUp:!0}),null),o(L,()=>f(`metrics.across_all_queues`)),o(he,()=>f(`metrics.failed_jobs`)),o(H,()=>(y.data?.failed??0).toLocaleString(),null),o(H,t(k,{get pct(){return O(w(),`failed`)},goodWhenUp:!1}),null),o(ge,()=>f(`metrics.total_failures`)),o(_e,()=>f(`metrics.avg_latency`)),o(G,(()=>{var e=p(()=>!!y.data);return()=>e()?te(y.data.latency):`—`})()),o(ve,()=>f(`metrics.head_of_line`)),o(ye,()=>f(`metrics.active_workers`)),o(q,()=>(y.data?.processes??0).toLocaleString()),o(be,(()=>{var e=p(()=>(y.data?.processes??0)>0);return()=>e()?f(`metrics.stable`):f(`metrics.no_workers`)})()),o(Z,()=>f(`metrics.throughput_failures`)),o(xe,()=>f(`metrics.throughput_sub`,{range:v().key})),o(Q,()=>f(`dashboard.processed`),null),o(Se,()=>f(`dashboard.failed`),null),o(Ce,t(e,{get when(){return!b.isPending},get fallback(){return t(j,{height:300})},get children(){return t(e,{get when(){return M()},get fallback(){return(()=>{var e=ce();return o(e,()=>f(`dashboard.no_history`)),e})()},get children(){return t(re,{get data(){return T()},height:300,yAxisWidth:36,yDecimals:!1,xMinTickGap:56,get series(){return[{key:`processed`,name:f(`dashboard.processed`),stroke:`#fafafa`,strokeWidth:2,fill:`gradient`},{key:`failed`,name:f(`dashboard.failed`),stroke:`#a1a1aa`,strokeWidth:1.5,strokeDasharray:`5 4`,fill:`none`}]}})}})}})),o(Te,()=>f(`metrics.queue_depth`)),o(Ee,(()=>{var e=p(()=>I()>0);return()=>e()?f(`metrics.peak`,{n:I().toLocaleString()}):``})()),o(De,t(e,{get when(){return!C.isPending},get fallback(){return t(j,{height:240})},get children(){return t(e,{get when(){return F().length>0},get fallback(){return(()=>{var e=x();return o(e,()=>f(`metrics.no_queue_history`)),e})()},get children(){return t(ie,{get data(){return F().map(e=>({label:e.label,value:e.depth,color:e.depth===I()&&I()>0?`#fafafa`:`#3f3f46`}))},height:240,get name(){return f(`metrics.queue_depth`)},yAxisWidth:36,yDecimals:!1,xMinTickGap:40})}})}})),o(ke,()=>f(`metrics.top_job_types`)),o(Oe,t(e,{get when(){return!S.isPending},get fallback(){return t(j,{height:240})},get children(){return t(e,{get when(){return z().length>0},get fallback(){return(()=>{var e=le();return o(e,()=>f(`common.empty`)),e})()},get children(){var e=ae(),n=e.firstChild.firstChild,i=n.firstChild.firstChild,a=i.nextSibling,c=a.nextSibling,l=n.nextSibling;return o(i,()=>f(`metrics.job_class`)),o(a,()=>f(`table.count`)),o(c,()=>f(`metrics.pct_total`)),o(l,t(r,{get each(){return z()},children:(e,t)=>(()=>{var n=ue(),r=n.firstChild,i=r.firstChild,a=i.firstChild,c=r.nextSibling,l=c.nextSibling,u=l.firstChild;return i.$$click=()=>_(e.klass),o(i,()=>ne(e.klass.split(`::`).pop()??e.klass,36),null),o(c,()=>e.count.toLocaleString()),o(l,(()=>{var t=p(()=>R()>0);return()=>t()?Math.round(e.count/R()*100):0})(),u),g(n=>{var o=e.klass,c=f(`metrics.view_job_detail`),l=de[t()%de.length];return o!==n.e&&s(r,`title`,n.e=o),c!==n.t&&s(i,`title`,n.t=c),l!==n.a&&h(a,`background`,n.a=l),n},{e:void 0,t:void 0,a:void 0}),n})()})),e}})}}),null),o(n,t(pe,{get range(){return v()}}),null),o(n,t(me,{}),null),o(n,t(fe,{get klass(){return m()},get minutes(){return v().minutes},onClose:()=>_(null)}),null),g(()=>s(c,`aria-label`,f(`metrics.time_range`))),n})()}function fe(n){let r=l(()=>({queryKey:[`metrics-job`,n.klass,n.minutes],queryFn:async()=>{let e=await fetch(`${c()}/api/metrics/${encodeURIComponent(n.klass)}?minutes=${n.minutes}`);if(!e.ok)throw Error(`metrics-job failed (${e.status})`);return e.json()},enabled:n.klass!==null})),a=i(()=>(r.data?.series??[]).map(e=>({label:D(e.at,`1m`),processed:e.p,failed:e.f,runtime_ms:e.ms}))),s=i(()=>a().some(e=>e.processed>0||e.failed>0)),u=i(()=>a().reduce((e,t)=>({processed:e.processed+t.processed,failed:e.failed+t.failed}),{processed:0,failed:0}));return t(_,{get open(){return n.klass!==null},get onClose(){return n.onClose},get title(){return n.klass??``},width:720,get children(){return t(e,{get when(){return n.klass},get children(){return[(()=>{var e=S(),t=e.firstChild,n=t.firstChild,r=n.nextSibling,i=t.nextSibling.firstChild,a=i.nextSibling;return o(n,()=>f(`dashboard.processed`)),o(r,()=>u().processed.toLocaleString()),o(i,()=>f(`dashboard.failed`)),o(a,()=>u().failed.toLocaleString()),e})(),t(e,{get when(){return!r.isPending},get fallback(){return t(j,{height:240})},get children(){return t(e,{get when(){return!r.isError},get fallback(){return(()=>{var e=x();return o(e,()=>f(`common.error`)),e})()},get children(){return t(e,{get when(){return s()},get fallback(){return(()=>{var e=x();return o(e,()=>f(`dashboard.no_history`)),e})()},get children(){return t(v,{get data(){return a()},height:240,yAxisWidth:36,yDecimals:!1,xMinTickGap:48,legend:!0,get series(){return[{key:`processed`,name:f(`dashboard.processed`),stroke:`#fafafa`,strokeWidth:2},{key:`failed`,name:f(`dashboard.failed`),stroke:`#a1a1aa`,strokeWidth:1.5}]}})}})}})}})]}})}})}function pe(n){let r=l(()=>({queryKey:[`queue-history-lat`,n.range.bucket,n.range.window],queryFn:async()=>{let e=await fetch(`${c()}/api/queue-history/${n.range.bucket}?window=${n.range.window}`);if(!e.ok)throw Error(`queue-history failed (${e.status})`);return e.json()},refetchInterval:3e4})),a=i(()=>r.data?.queues??[]),s=i(()=>a().map((e,t)=>({key:`queue_${t}`,name:e.name}))),u=i(()=>a()[0]?.points.map(e=>e.at)??[]),ee=i(()=>u().map((e,t)=>{let r={label:D(e,n.range.bucket)};return a().forEach((e,n)=>{r[s()[n].key]=e.points[t]?.latency??0}),r})),d=i(()=>s().map((e,t)=>({key:e.key,name:e.name,stroke:T(t),strokeWidth:2}))),p=i(()=>a().some(e=>e.points.some(e=>e.latency>0)));return t(e,{get when(){return p()},get children(){var e=C(),n=e.firstChild,r=n.firstChild,i=n.nextSibling;return o(r,()=>f(`metrics.queue_latency_seconds`)),o(i,t(v,{get data(){return ee()},get series(){return d()},height:240,legend:!0,yAxisWidth:40,xMinTickGap:48})),e}})}var N=new Set([`processed`,`failures`]);function me(){let n=l(()=>({queryKey:[`history-snapshots`],queryFn:async()=>{let e=await fetch(`${c()}/api/history/snapshots?limit=1000`);if(!e.ok)throw Error(`history snapshots request failed (${e.status})`);return e.json()},refetchInterval:3e4})),r=i(()=>n.data?.snapshots??[]),a=i(()=>Array.from(new Set(r().flatMap(e=>Object.keys(e).filter(t=>t!==`at`&&!N.has(t)&&typeof e[t]==`number`))))),s=i(()=>r().map(e=>{let t=new Date(e.at*1e3),n={label:`${String(t.getHours()).padStart(2,`0`)}:${String(t.getMinutes()).padStart(2,`0`)}`};for(let t of Object.keys(e))n[t]=e[t];return n})),u=i(()=>a().map((e,t)=>({key:e,name:e,stroke:T(t),strokeWidth:2})));return t(e,{get when(){return p(()=>r().length>0)()&&a().length>0},get children(){var e=C(),n=e.firstChild,r=n.firstChild,i=n.nextSibling;return o(r,()=>f(`metrics.historical_snapshots`)),o(i,t(v,{get data(){return s()},get series(){return u()},height:240,legend:!0,yAxisWidth:40,yDecimals:!1,xMinTickGap:48})),e}})}u([`click`]);export{M as default};
@@ -0,0 +1 @@
1
+ import{A as e,F as t,J as n,L as r,T as i,V as a,_ as o,b as s,g as c,q as l,w as u,x as d,z as f}from"./Skeleton-DOYDkzg1.js";var p=u(`<div class=modal-footer>`),m=u(`<dialog class=modal><div class=modal-panel><div class=modal-header><h2 class=modal-title></h2><button class=modal-close aria-label=Close><i class="fa-solid fa-xmark"></i></button></div><div class=modal-body>`);function h(c){let u,h=`modal-title-${Math.random().toString(36).slice(2)}`,[g,_]=a({title:c.title,children:c.children});r(()=>{c.open&&_({title:c.title,children:c.children})});let v=()=>c.open?{title:c.title,children:c.children}:g();return r(()=>{c.open&&!u.open?u.showModal():!c.open&&u.open&&u.close()}),n(()=>{let e=e=>{e.preventDefault(),c.onClose()};u.addEventListener(`cancel`,e),l(()=>u.removeEventListener(`cancel`,e))}),(()=>{var n=m(),r=n.firstChild,a=r.firstChild,l=a.firstChild,g=l.nextSibling,_=a.nextSibling;n.$$click=e=>{e.target===u&&c.onClose()};var y=u;return typeof y==`function`?i(y,n):u=n,s(n,`aria-labelledby`,h),s(l,`id`,h),o(l,()=>v().title),g.$$click=()=>c.onClose(),o(_,()=>v().children),o(r,t(e,{get when(){return c.footer},get children(){var e=p();return o(e,()=>c.footer),e}}),null),f(e=>d(r,`max-width`,`${c.width??640}px`)),n})()}c([`click`]);export{h as t};
@@ -0,0 +1 @@
1
+ import{A as e,F as t,_ as n,h as r,w as i,z as a}from"./Skeleton-DOYDkzg1.js";var o=i(`<div class=page-header__aside>`),s=i(`<div class=page-header><span class=page-header__icon><i></i></span><div class=page-header__text><h1 class=page-header__title></h1><p class=page-header__summary>`);function c(i){return(()=>{var c=s(),l=c.firstChild,u=l.firstChild,d=l.nextSibling.firstChild,f=d.nextSibling;return n(d,()=>i.title),n(f,()=>i.summary),n(c,t(e,{get when(){return i.children!=null},get children(){var e=o();return n(e,()=>i.children),e}}),null),a(()=>r(u,`fa-solid ${i.icon}`)),c})()}export{c as t};
@@ -0,0 +1 @@
1
+ import{A as e,F as t,J as n,M as r,O as i,_ as a,b as o,c as s,f as c,i as l,k as u,s as d,v as f,w as p,z as m}from"./Skeleton-DOYDkzg1.js";var h=p(`<div class=obs>`),g=p(`<div class=obs><div class=empty-state style=color:var(--danger)>`),_=p(`<div class="obs-card obs-table"><div class=obs-tablescroll><table><thead><tr><th></th><th></th><th></th><th></th><th></th><th></th></tr></thead><tbody>`),v=p(`<div class=obs><div class=obs-pagehead><div><h1></h1><p class=obs-panel__sub></p></div><span class="obs-chip obs-chip--active">`),y=p(`<div class="obs-card obs-empty">`),b=p(`<tr><td style=font-weight:500;color:var(--obs-text)></td><td><span class=obs-mono-cell></span></td><td></td><td> </td><td></td><td style=text-align:end><a class="obs-btn obs-btn--ghost obs-btn--sm"target=_blank rel="noopener noreferrer"><i class="fa-solid fa-up-right-from-square"aria-hidden=true></i> `);function x(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}function S(e){return e?new Date(e*1e3).toLocaleString():`—`}function C(){n(()=>{document.title=`${d(`nav.profiles`)} — Wurk`});let p=c(()=>({queryKey:[`profiles`],queryFn:async()=>{let e=await fetch(`${s()}/api/profiles`);if(!e.ok)throw Error(`profiles request failed: ${e.status}`);return e.json()},refetchInterval:5e3}));return t(r,{get children(){return[t(u,{get when(){return p.isPending},get children(){var e=h();return a(e,t(l,{rows:8,cols:6})),e}}),t(u,{get when(){return!Array.isArray(p.data)},get children(){var e=g(),t=e.firstChild;return a(t,()=>d(`common.error`)),e}}),t(u,{get when(){return f(()=>!!Array.isArray(p.data))()&&p.data},children:n=>(()=>{var r=v(),c=r.firstChild.firstChild,l=c.firstChild,u=l.nextSibling,f=c.nextSibling;return a(l,()=>d(`nav.profiles`)),a(u,()=>d(`summaries.profiles`)),a(f,()=>n().length.toLocaleString()),a(r,t(e,{get when(){return n().length>0},get fallback(){return(()=>{var e=y();return a(e,()=>d(`common.empty`)),e})()},get children(){var e=_(),r=e.firstChild.firstChild.firstChild,c=r.firstChild.firstChild,l=c.nextSibling,u=l.nextSibling,f=u.nextSibling,p=f.nextSibling,h=r.nextSibling;return a(c,()=>d(`table.type`)),a(l,()=>d(`table.jid`)),a(u,()=>d(`busy.started`)),a(f,()=>d(`table.elapsed`)),a(p,()=>d(`table.size`)),a(h,t(i,{get each(){return n()},children:e=>(()=>{var t=b(),n=t.firstChild,r=n.nextSibling,i=r.firstChild,c=r.nextSibling,l=c.nextSibling,u=l.firstChild,f=l.nextSibling,p=f.nextSibling.firstChild;return p.firstChild.nextSibling,a(n,()=>e.type),a(i,()=>e.jid),a(c,()=>S(e.started_at)),a(l,()=>e.elapsed.toLocaleString(),u),a(l,()=>d(`common.ms`),null),a(f,()=>x(e.size)),a(p,()=>d(`extension.open`),null),m(()=>o(p,`href`,`${s()}/profiles/${encodeURIComponent(e.key)}`)),t})()})),e}}),null),r})()})]}})}export{C as default};
@@ -0,0 +1 @@
1
+ import{A as e,F as t,H as n,J as r,L as i,M as a,O as o,P as s,T as c,V as l,_ as u,b as d,c as f,d as p,f as m,g as h,i as g,k as _,m as v,p as y,s as b,v as x,w as S,x as C,z as w}from"./Skeleton-DOYDkzg1.js";import{a as T,n as E,r as D,t as O}from"./index-CZTcs-pM.js";import{a as k,n as A,o as j,t as M}from"./utils-DDJC7tJV.js";import{n as N,r as P,t as F}from"./useResetPageOnEmpty-CoZU4b3a.js";import{n as I,t as L}from"./useSort-wQcnbdsa.js";import{t as R}from"./PageHeader-CsDvJSOA.js";import{t as z}from"./Modal-t4FI_LaY.js";import{t as B}from"./ArgsValue-DYfBiXrJ.js";import{t as V}from"./JobDetailModal-DuMdKUMm.js";var H=S(`<span style=display:inline-flex>`),U=S(`<div role=tooltip style="position:fixed;transform:translate(-50%, -100%);max-width:260px;background:var(--surface-strong);color:var(--text);border:1px solid var(--border-strong);padding:0.4rem 0.6rem;border-radius:6px;font-size:12px;line-height:1.35;z-index:9999;pointer-events:none;box-shadow:0 4px 14px rgba(0, 0, 0, 0.45)">`);function W(r){let[a,o]=l(null),f,p=n(),m=()=>{let e=f?.getBoundingClientRect();e&&o({x:e.left+e.width/2,y:e.top})},h=s(()=>r.children);return i(()=>{let e=h();e instanceof HTMLElement&&e.setAttribute(`aria-describedby`,p)}),(()=>{var n=H();n.addEventListener(`mouseleave`,()=>o(null)),n.addEventListener(`mouseenter`,m);var i=f;return typeof i==`function`?c(i,n):f=n,u(n,h,null),u(n,t(e,{get when(){return a()},children:e=>t(v,{get children(){var t=U();return d(t,`id`,p),u(t,()=>r.tip),w(n=>{var r=`${e().x}px`,i=`${e().y-8}px`;return r!==n.e&&C(t,`left`,n.e=r),i!==n.t&&C(t,`top`,n.t=i),n},{e:void 0,t:void 0}),t}})}),null),n})()}var G=S(`<div class=empty-state style=color:var(--danger)>`),K=S(`<span class="badge badge-warning">`),q=S(`<th class=row-action>`),J=S(`<div class=table-wrapper><table><thead><tr></tr></thead><tbody>`),Y=S(`<div class=qjobs><div style=display:flex;align-items:center;gap:0.75rem;margin-bottom:1rem><span style=color:var(--text-muted);font-size:13px> · <span> `),X=S(`<div class=empty-state>`),Z=S(`<td class=row-action><button class="btn btn-sm btn-danger">`),ee=S(`<tr class=row-clickable><td style=font-family:monospace;font-size:12px;color:var(--text-muted)></td><td style=font-weight:500></td><td></td><td>`),Q=S(`<div>`),te=S(`<button class="btn btn-sm">`),ne=S(`<td class=row-action><div style=display:flex;gap:0.4rem;justify-content:flex-end><button class="btn btn-sm btn-danger">`),re=S(`<tr class=row-clickable><td style=font-weight:500></td><td></td><td></td><td>`),ie=S(`<span class="badge badge-success">`),$=25,ae={jid:e=>e.jid,class:e=>e.class,args:e=>M(e.args),enqueued:e=>e.enqueued_at};function oe(n){let[r,i]=N(),[s,c]=l(null),h=T(),v=()=>h.data?.read_only??!1,x=y(),S=m(()=>({queryKey:[`queue`,n.name,r()],queryFn:()=>E(`${f()}/api/queues/${encodeURIComponent(n.name)}?page=${r()-1}&count=${$}`)})),C=p(()=>({mutationFn:e=>D(`${f()}/api/queues/${encodeURIComponent(n.name)}/delete`,{jid:e}),onSuccess:()=>{x.invalidateQueries({queryKey:[`queue`,n.name]}),x.invalidateQueries({queryKey:[`queues`]}),x.invalidateQueries({queryKey:[`stats`]})},onError:O}));F(r,i,()=>!S.isPending&&!!S.data,()=>(S.data?.jobs.length??0)===0);let{sorted:R,sort:z,toggle:H}=L(()=>S.data?.jobs??[],ae);return t(a,{get children(){return[t(_,{get when(){return S.isPending},get children(){return t(g,{rows:6,cols:5})}}),t(_,{get when(){return S.isError||!S.data},get children(){var e=G();return u(e,()=>b(`common.error`)),e}}),t(_,{get when(){return S.data},children:a=>(()=>{var l=Y(),f=l.firstChild,p=f.firstChild,m=p.firstChild,h=m.nextSibling,g=h.firstChild;return u(p,()=>b(`queues.job_count`,{n:a().size.toLocaleString()}),m),u(h,()=>b(`queues.latency_label`),g),u(h,()=>A(a().latency),null),u(f,t(e,{get when(){return a().paused},get children(){var e=K();return u(e,()=>b(`dashboard.paused`)),e}}),null),u(l,t(e,{get when(){return R().length>0},get fallback(){return(()=>{var e=X();return u(e,()=>b(`common.empty`)),e})()},get children(){return[(()=>{var r=J(),i=r.firstChild.firstChild,a=i.firstChild,s=i.nextSibling;return u(a,t(I,{get label(){return b(`table.jid`)},sortKey:`jid`,get sort(){return z()},onSort:H}),null),u(a,t(I,{get label(){return b(`table.class`)},sortKey:`class`,get sort(){return z()},onSort:H}),null),u(a,t(I,{get label(){return b(`table.args`)},sortKey:`args`,get sort(){return z()},onSort:H}),null),u(a,t(I,{get label(){return b(`table.enqueued_at`)},sortKey:`enqueued`,get sort(){return z()},onSort:H}),null),u(a,t(e,{get when(){return!v()},get children(){return q()}}),null),u(s,t(o,{get each(){return R()},children:r=>{let i=M(r.args);return(()=>{var a=ee(),o=a.firstChild,s=o.nextSibling,l=s.nextSibling,f=l.nextSibling;return a.$$click=()=>c({jid:r.jid,klass:r.class,args:r.args,queue:n.name,enqueued_at:r.enqueued_at}),u(o,()=>j(r.jid,12)),u(s,()=>r.class),u(l,t(B,{str:i,max:60})),u(f,()=>k(r.enqueued_at)),u(a,t(e,{get when(){return!v()},get children(){var e=Z(),t=e.firstChild;return e.$$click=e=>e.stopPropagation(),t.$$click=()=>{window.confirm(b(`actions.confirm`,{action:b(`actions.delete`),scope:b(`actions.scope_this_job`)}))&&C.mutate(r.jid)},u(t,()=>b(`actions.delete`)),w(()=>t.disabled=C.isPending),e}}),null),w(()=>d(o,`title`,r.jid)),a})()}})),r})(),t(P,{get page(){return r()},get total(){return a().size},count:$,onChange:i})]}}),null),u(l,t(V,{get entry(){return s()},onClose:()=>c(null)}),null),w(()=>d(h,`title`,`${a().latency.toFixed(3)}s`)),l})()})]}})}var se={name:e=>e.name,size:e=>e.size,latency:e=>e.latency,status:e=>e.paused?`paused`:`active`};function ce(){let[n,i]=l(null),s=T(),c=()=>s.data?.read_only??!1,h=y();r(()=>{document.title=`${b(`nav.queues`)} — Wurk`});let v=m(()=>({queryKey:[`queues`],queryFn:()=>E(`${f()}/api/queues`),refetchInterval:5e3})),S=p(()=>({mutationFn:e=>D(`${f()}/api/queues/${encodeURIComponent(e)}/clear`),onSuccess:(e,t)=>{h.invalidateQueries({queryKey:[`queues`]}),h.invalidateQueries({queryKey:[`queue`,t]}),h.invalidateQueries({queryKey:[`stats`]})},onError:O})),C=p(()=>({mutationFn:({name:e,paused:t})=>D(`${f()}/api/queues/${encodeURIComponent(e)}/${t?`unpause`:`pause`}`),onSuccess:(e,{name:t})=>{h.invalidateQueries({queryKey:[`queues`]}),h.invalidateQueries({queryKey:[`queue`,t]}),h.invalidateQueries({queryKey:[`stats`]})},onError:O})),{sorted:k,sort:j,toggle:M}=L(()=>v.data??[],se);return t(a,{get children(){return[t(_,{get when(){return v.isPending},get children(){var e=Q();return u(e,t(R,{icon:`fa-layer-group`,get title(){return b(`nav.queues`)},get summary(){return b(`summaries.queues`)}}),null),u(e,t(g,{rows:8,cols:5}),null),e}}),t(_,{get when(){return v.isError||!v.data},get children(){var e=G();return u(e,()=>b(`common.error`)),e}}),t(_,{get when(){return v.data},children:r=>(()=>{var r=Q();return u(r,t(R,{icon:`fa-layer-group`,get title(){return b(`nav.queues`)},get summary(){return b(`summaries.queues`)}}),null),u(r,t(e,{get when(){return k().length>0},get fallback(){return(()=>{var e=X();return u(e,()=>b(`common.empty`)),e})()},get children(){var n=J(),r=n.firstChild.firstChild,a=r.firstChild,s=r.nextSibling;return u(a,t(I,{get label(){return b(`table.name`)},sortKey:`name`,get sort(){return j()},onSort:M}),null),u(a,t(I,{get label(){return b(`table.size`)},sortKey:`size`,get sort(){return j()},onSort:M}),null),u(a,t(I,{get label(){return b(`table.latency`)},sortKey:`latency`,get sort(){return j()},onSort:M}),null),u(a,t(I,{get label(){return b(`table.status`)},sortKey:`status`,get sort(){return j()},onSort:M}),null),u(a,t(e,{get when(){return!c()},get children(){return q()}}),null),u(s,t(o,{get each(){return k()},children:n=>(()=>{var r=re(),a=r.firstChild,o=a.nextSibling,s=o.nextSibling,l=s.nextSibling;return r.$$click=()=>i(n.name),u(a,()=>n.name),u(o,()=>n.size.toLocaleString()),u(s,()=>A(n.latency)),u(l,t(e,{get when(){return n.paused},get fallback(){return(()=>{var e=ie();return u(e,()=>b(`dashboard.active`)),e})()},get children(){var e=K();return u(e,()=>b(`dashboard.paused`)),e}})),u(r,t(e,{get when(){return!c()},get children(){var e=ne(),r=e.firstChild,i=r.firstChild;return e.$$click=e=>e.stopPropagation(),u(r,t(W,{get tip(){return x(()=>!!n.paused)()?b(`actions.unpause_hint`):b(`actions.pause_hint`)},get children(){var e=te();return e.$$click=()=>C.mutate({name:n.name,paused:n.paused}),u(e,(()=>{var e=x(()=>!!n.paused);return()=>e()?b(`actions.unpause`):b(`actions.pause`)})()),w(()=>e.disabled=C.isPending),e}}),i),i.$$click=()=>{window.confirm(b(`actions.confirm_clear_queue`,{name:n.name}))&&S.mutate(n.name)},u(i,()=>b(`actions.clear`)),w(()=>i.disabled=S.isPending),e}}),null),w(()=>d(s,`title`,`${n.latency.toFixed(3)}s`)),r})()})),n}}),null),u(r,t(z,{get open(){return n()!==null},onClose:()=>i(null),get title(){return n()??``},width:780,get children(){return t(e,{get when(){return n()},children:e=>t(oe,{get name(){return e()}})})}}),null),r})()})]}})}h([`click`]);export{ce as default};
@@ -0,0 +1 @@
1
+ import{A as e,F as t,J as n,M as r,O as i,V as a,_ as o,b as s,c,f as l,g as u,i as d,k as f,s as p,w as m,z as h}from"./Skeleton-DOYDkzg1.js";import{a as ee,n as g}from"./index-CZTcs-pM.js";import{a as te,i as ne,o as _,t as v}from"./utils-DDJC7tJV.js";import{n as y,r as re,t as b}from"./useResetPageOnEmpty-CoZU4b3a.js";import{n as x,t as ie}from"./useSort-wQcnbdsa.js";import{t as S}from"./PageHeader-CsDvJSOA.js";import{t as C}from"./ArgsValue-DYfBiXrJ.js";import{t as w}from"./JobDetailModal-DuMdKUMm.js";import{a as T,i as E,n as D,r as ae,t as oe}from"./FilterBox-FCDi4ZCU.js";var O=m(`<div>`),se=m(`<div class=empty-state style=color:var(--danger)>`),ce=m(`<span class="badge badge-warning">`),le=m(`<th class=row-action><input type=checkbox aria-label="Select all">`),k=m(`<div class=table-wrapper><table><thead><tr></tr></thead><tbody>`),A=m(`<div class=empty-state>`),j=m(`<td class=row-action><input type=checkbox aria-label="Select job">`),M=m(`<tr class=row-clickable><td style=font-weight:500></td><td></td><td style=color:var(--danger)></td><td></td><td style=color:var(--warning)></td><td>`),N=25,P={klass:e=>e.klass,args:e=>v(e.args),error_class:e=>e.error_class,error_message:e=>e.error_message,retry_count:e=>e.retry_count,at:e=>e.at},F=[{cmd:`retry`,label:p(`actions.retry`)},{cmd:`delete`,label:p(`actions.delete`),danger:!0},{cmd:`kill`,label:p(`actions.kill`),danger:!0}],I=[{cmd:`retry`,label:p(`actions.retry`)},{cmd:`kill`,label:p(`actions.kill`),danger:!0},{cmd:`delete`,label:p(`actions.delete`),danger:!0}];function L(){let[u,m]=y(),[L,R]=a(``),[z,B]=a(null),[V,H]=a(null),U=ee(),W=()=>U.data?.read_only??!1,G=E(),{single:K,bulk:q,all:J}=ae(`retries`),ue=()=>K.isPending||q.isPending||J.isPending;n(()=>{document.title=`${p(`nav.retries`)} — Wurk`});let de=e=>{R(e),m(1)},Y=l(()=>({queryKey:[`retries`,u(),L()],queryFn:()=>g(`${c()}/api/retries?page=${u()-1}&count=${N}&substr=${encodeURIComponent(L())}`)}));b(u,m,()=>!Y.isPending&&!!Y.data,()=>(Y.data?.entries.length??0)===0);let{sorted:X,sort:Z,toggle:Q}=ie(()=>Y.data?.entries??[],P),$=()=>X().map(D),fe=()=>$().length>0&&$().every(e=>G.selected().has(e));return t(r,{get children(){return[t(f,{get when(){return Y.isPending},get children(){var e=O();return o(e,t(S,{icon:`fa-rotate-right`,get title(){return p(`nav.retries`)},get summary(){return p(`summaries.retries`)}}),null),o(e,t(d,{rows:8,cols:7}),null),e}}),t(f,{get when(){return Y.isError||!Y.data},get children(){var e=se();return o(e,()=>p(`common.error`)),e}}),t(f,{get when(){return Y.data},children:n=>(()=>{var r=O();return o(r,t(S,{icon:`fa-rotate-right`,get title(){return p(`nav.retries`)},get summary(){return p(`summaries.retries`)},get children(){var e=ce();return o(e,()=>n().total.toLocaleString()),e}}),null),o(r,t(oe,{get value(){return L()},onChange:de,get placeholder(){return p(`common.filter_placeholder`)}}),null),o(r,t(e,{get when(){return X().length>0},get fallback(){return(()=>{var e=A();return o(e,()=>p(`common.empty`)),e})()},get children(){return[t(e,{get when(){return!W()},get children(){return t(T,{bulk:F,all:I,get selectedCount(){return G.count()},get total(){return n().total},get pending(){return ue()},onBulk:e=>q.mutate({keys:[...G.selected()],cmd:e},{onSuccess:G.clear}),onAll:e=>J.mutate(e,{onSuccess:G.clear})})}}),(()=>{var n=k(),r=n.firstChild.firstChild,a=r.firstChild,c=r.nextSibling;return o(a,t(e,{get when(){return!W()},get children(){var e=le(),t=e.firstChild;return t.addEventListener(`change`,()=>G.toggleAll($())),h(()=>t.checked=fe()),e}}),null),o(a,t(x,{get label(){return p(`table.class`)},sortKey:`klass`,get sort(){return Z()},onSort:Q}),null),o(a,t(x,{get label(){return p(`table.args`)},sortKey:`args`,get sort(){return Z()},onSort:Q}),null),o(a,t(x,{get label(){return p(`table.error`)},sortKey:`error_class`,get sort(){return Z()},onSort:Q}),null),o(a,t(x,{get label(){return p(`table.message`)},sortKey:`error_message`,get sort(){return Z()},onSort:Q}),null),o(a,t(x,{get label(){return p(`table.count`)},sortKey:`retry_count`,get sort(){return Z()},onSort:Q}),null),o(a,t(x,{get label(){return p(`table.retry_at`)},sortKey:`at`,get sort(){return Z()},onSort:Q}),null),o(c,t(i,{get each(){return X()},children:n=>{let r=v(n.args),i=D(n);return(()=>{var a=M(),c=a.firstChild,l=c.nextSibling,u=l.nextSibling,d=u.nextSibling,f=d.nextSibling,p=f.nextSibling;return a.$$click=()=>{B(n),H(i)},o(a,t(e,{get when(){return!W()},get children(){var e=j(),t=e.firstChild;return e.$$click=e=>e.stopPropagation(),t.addEventListener(`change`,()=>G.toggle(i)),h(()=>t.checked=G.selected().has(i)),e}}),c),o(c,()=>n.klass),o(l,t(C,{str:r,max:40})),o(u,()=>_(n.error_class,30)),o(d,()=>_(n.error_message,50)),o(f,()=>n.retry_count),o(p,()=>te(n.at)),h(e=>{var t=n.error_class??``,r=n.error_message??``,i=ne(n.at);return t!==e.e&&s(u,`title`,e.e=t),r!==e.t&&s(d,`title`,e.t=r),i!==e.a&&s(p,`title`,e.a=i),e},{e:void 0,t:void 0,a:void 0}),a})()}})),n})(),t(re,{get page(){return u()},get total(){return n().total},count:N,onChange:m})]}}),null),o(r,t(w,{get entry(){return z()},get atLabel(){return p(`table.retry_at`)},get actions(){return W()?void 0:F},get pending(){return K.isPending},onAction:e=>{let t=V();t&&K.mutate({key:t,cmd:e},{onSuccess:()=>{B(null),H(null)}})},onClose:()=>{B(null),H(null)}}),null),r})()})]}})}u([`click`]);export{L as default};
@@ -0,0 +1 @@
1
+ import{A as e,F as t,J as n,M as r,O as i,V as a,_ as o,b as s,c,f as l,g as u,i as d,k as f,s as p,w as m,z as h}from"./Skeleton-DOYDkzg1.js";import{a as g,n as _}from"./index-CZTcs-pM.js";import{a as ee,i as te,o as v,t as y}from"./utils-DDJC7tJV.js";import{n as b,r as x,t as S}from"./useResetPageOnEmpty-CoZU4b3a.js";import{n as C,t as ne}from"./useSort-wQcnbdsa.js";import{t as w}from"./PageHeader-CsDvJSOA.js";import{t as re}from"./ArgsValue-DYfBiXrJ.js";import{t as ie}from"./JobDetailModal-DuMdKUMm.js";import{a as T,i as ae,n as E,r as D,t as oe}from"./FilterBox-FCDi4ZCU.js";var O=m(`<div>`),se=m(`<div class=empty-state style=color:var(--danger)>`),ce=m(`<span class="badge badge-accent">`),k=m(`<th class=row-action><input type=checkbox aria-label="Select all">`),A=m(`<div class=table-wrapper><table><thead><tr></tr></thead><tbody>`),j=m(`<div class=empty-state>`),M=m(`<td class=row-action><input type=checkbox aria-label="Select job">`),N=m(`<tr class=row-clickable><td style=font-family:monospace;font-size:12px;color:var(--text-muted)></td><td style=font-weight:500></td><td></td><td>`),P=25,F={jid:e=>e.jid,klass:e=>e.klass,args:e=>y(e.args),at:e=>e.at},I=[{cmd:`add_to_queue`,label:p(`actions.add_to_queue`)},{cmd:`delete`,label:p(`actions.delete`),danger:!0}];function L(){let[u,m]=b(),[L,R]=a(``),[z,B]=a(null),[V,H]=a(null),U=g(),W=()=>U.data?.read_only??!1,G=ae(),{single:K,bulk:q,all:J}=D(`scheduled`),le=()=>K.isPending||q.isPending||J.isPending;n(()=>{document.title=`${p(`nav.scheduled`)} — Wurk`});let ue=e=>{R(e),m(1)},Y=l(()=>({queryKey:[`scheduled`,u(),L()],queryFn:()=>_(`${c()}/api/scheduled?page=${u()-1}&count=${P}&substr=${encodeURIComponent(L())}`)}));S(u,m,()=>!Y.isPending&&!!Y.data,()=>(Y.data?.entries.length??0)===0);let{sorted:X,sort:Z,toggle:Q}=ne(()=>Y.data?.entries??[],F),$=()=>X().map(E),de=()=>$().length>0&&$().every(e=>G.selected().has(e));return t(r,{get children(){return[t(f,{get when(){return Y.isPending},get children(){var e=O();return o(e,t(w,{icon:`fa-clock`,get title(){return p(`nav.scheduled`)},get summary(){return p(`summaries.scheduled`)}}),null),o(e,t(d,{rows:8,cols:5}),null),e}}),t(f,{get when(){return Y.isError||!Y.data},get children(){var e=se();return o(e,()=>p(`common.error`)),e}}),t(f,{get when(){return Y.data},children:n=>(()=>{var r=O();return o(r,t(w,{icon:`fa-clock`,get title(){return p(`nav.scheduled`)},get summary(){return p(`summaries.scheduled`)},get children(){var e=ce();return o(e,()=>n().total.toLocaleString()),e}}),null),o(r,t(oe,{get value(){return L()},onChange:ue,get placeholder(){return p(`common.filter_placeholder`)}}),null),o(r,t(e,{get when(){return X().length>0},get fallback(){return(()=>{var e=j();return o(e,()=>p(`common.empty`)),e})()},get children(){return[t(e,{get when(){return!W()},get children(){return t(T,{bulk:I,all:I,get selectedCount(){return G.count()},get total(){return n().total},get pending(){return le()},onBulk:e=>q.mutate({keys:[...G.selected()],cmd:e},{onSuccess:G.clear}),onAll:e=>J.mutate(e,{onSuccess:G.clear})})}}),(()=>{var n=A(),r=n.firstChild.firstChild,a=r.firstChild,c=r.nextSibling;return o(a,t(e,{get when(){return!W()},get children(){var e=k(),t=e.firstChild;return t.addEventListener(`change`,()=>G.toggleAll($())),h(()=>t.checked=de()),e}}),null),o(a,t(C,{get label(){return p(`table.jid`)},sortKey:`jid`,get sort(){return Z()},onSort:Q}),null),o(a,t(C,{get label(){return p(`table.class`)},sortKey:`klass`,get sort(){return Z()},onSort:Q}),null),o(a,t(C,{get label(){return p(`table.args`)},sortKey:`args`,get sort(){return Z()},onSort:Q}),null),o(a,t(C,{get label(){return p(`table.scheduled_at`)},sortKey:`at`,get sort(){return Z()},onSort:Q}),null),o(c,t(i,{get each(){return X()},children:n=>{let r=y(n.args),i=E(n);return(()=>{var a=N(),c=a.firstChild,l=c.nextSibling,u=l.nextSibling,d=u.nextSibling;return a.$$click=()=>{B(n),H(i)},o(a,t(e,{get when(){return!W()},get children(){var e=M(),t=e.firstChild;return e.$$click=e=>e.stopPropagation(),t.addEventListener(`change`,()=>G.toggle(i)),h(()=>t.checked=G.selected().has(i)),e}}),c),o(c,()=>v(n.jid,12)),o(l,()=>n.klass),o(u,t(re,{str:r,max:60})),o(d,()=>ee(n.at)),h(e=>{var t=n.jid,r=te(n.at);return t!==e.e&&s(c,`title`,e.e=t),r!==e.t&&s(d,`title`,e.t=r),e},{e:void 0,t:void 0}),a})()}})),n})(),t(x,{get page(){return u()},get total(){return n().total},count:P,onChange:m})]}}),null),o(r,t(ie,{get entry(){return z()},get atLabel(){return p(`table.scheduled_at`)},get actions(){return W()?void 0:I},get pending(){return K.isPending},onAction:e=>{let t=V();t&&K.mutate({key:t,cmd:e},{onSuccess:()=>{B(null),H(null)}})},onClose:()=>{B(null),H(null)}}),null),r})()})]}})}u([`click`]);export{L as default};
@@ -0,0 +1 @@
1
+ import{A as e,F as t,J as n,L as r,O as i,V as a,_ as o,b as s,c,et as l,f as u,g as d,h as f,i as p,q as m,s as h,v as g,w as _,z as v}from"./Skeleton-DOYDkzg1.js";import{c as y,n as b}from"./index-CZTcs-pM.js";import{a as x,i as S,o as C,t as w}from"./utils-DDJC7tJV.js";import{t as T}from"./PageHeader-CsDvJSOA.js";import{t as E}from"./ArgsValue-DYfBiXrJ.js";var D=_(`<div class=search-empty__chips><span class=search-empty__chips-label>`),O=_(`<div class=search-empty><div class=search-empty__icon><i class="fa-solid fa-magnifying-glass"></i></div><p class=search-empty__title></p><p class=search-empty__hint>`),k=_(`<button type=button class=chip>`),A=_(`<div><form style=display:flex;gap:0.75rem;margin-bottom:2rem><input class=input type=search style=flex:1;max-width:480px><button type=submit class="btn btn-accent">`),j=_(`<div class=empty-state style=color:var(--danger)>`),M=_(`<div class=search-truncated role=status><i class="fa-solid fa-triangle-exclamation"aria-hidden=true></i><span>`),N=_(`<div class=search-count>`),P=_(`<div class=table-wrapper><table><thead><tr><th></th><th></th><th></th><th></th><th></th><th></th></tr></thead><tbody>`),F=_(`<div class=empty-state>`),I=_(`<span>`),L=_(`<tr><td><span></span></td><td style=font-family:monospace;font-size:12px;color:var(--text-muted)></td><td style=font-weight:500></td><td></td><td style=color:var(--danger)></td><td>`),R=_(`<span style=color:var(--text-muted)>—`),z=2,B=300,V={queue:`badge-accent`,retry:`badge-warning`,scheduled:`badge-muted`,dead:`badge-danger`};function H(n){return(()=>{var r=O(),a=r.firstChild.nextSibling,s=a.nextSibling;return o(a,()=>h(`search.emptyTitle`)),o(s,()=>h(`search.emptyHint`)),o(r,t(e,{get when(){return n.suggestions().length>0},get children(){var e=D(),r=e.firstChild;return o(r,()=>h(`search.try`)),o(e,t(i,{get each(){return n.suggestions()},children:e=>(()=>{var t=k();return t.$$click=()=>n.onPick(e),o(t,e),t})()}),null),e}}),null),r})()}function U(){let[d,_]=y(),[D,O]=a(d.q??``),[k,U]=a(D().trim());n(()=>{document.title=`${h(`nav.search`)} — Wurk`}),r(()=>{let e=D().trim(),t=setTimeout(()=>{U(e),_({q:e||void 0})},B);m(()=>clearTimeout(t))}),r(()=>{let e=d.q??``;e!==l(()=>D().trim())&&(O(e),U(e.trim()))});let W=()=>k().length>=z,G=u(()=>({queryKey:[`search`,k()],queryFn:()=>b(`${c()}/api/search?substr=${encodeURIComponent(k())}`),enabled:W(),staleTime:1e4})),K=u(()=>({queryKey:[`search-suggest`],queryFn:()=>Promise.all([`${c()}/api/retries?page=0&count=10`,`${c()}/api/dead?page=0&count=10`].map(e=>b(e))),enabled:!W(),staleTime:3e4})),q=()=>Array.from(new Set((K.data??[]).flatMap(e=>(e.entries??[]).map(e=>e.klass)).filter(Boolean))).slice(0,5),J=e=>typeof e.at==`number`?e.at:e.enqueued_at??NaN,Y=()=>G.data?.hits.length??0;return(()=>{var n=A(),r=n.firstChild,a=r.firstChild,c=a.nextSibling;return o(n,t(T,{icon:`fa-magnifying-glass`,get title(){return h(`nav.search`)},get summary(){return h(`summaries.search`)}}),r),r.addEventListener(`submit`,e=>{e.preventDefault(),U(D().trim())}),a.$$input=e=>O(e.currentTarget.value),o(c,()=>h(`actions.search`)),o(n,t(e,{get when(){return W()},get fallback(){return t(H,{suggestions:q,onPick:O})},get children(){return t(e,{get when(){return!G.isLoading},get fallback(){return t(p,{rows:8,cols:6})},get children(){return t(e,{get when(){return g(()=>!G.isError)()&&G.data},get fallback(){return(()=>{var e=j();return o(e,()=>h(`common.error`)),e})()},children:n=>[t(e,{get when(){return n().truncated},get children(){var e=M(),t=e.firstChild.nextSibling;return o(t,()=>h(`search.truncated`)),e}}),(()=>{var e=N();return o(e,(()=>{var e=g(()=>Y()===1);return()=>e()?h(`search.result`,{n:Y(),term:k()}):h(`search.results`,{n:Y(),term:k()})})()),e})(),t(e,{get when(){return Y()>0},get fallback(){return(()=>{var e=F();return o(e,()=>h(`common.empty`)),e})()},get children(){var r=P(),a=r.firstChild.firstChild,c=a.firstChild.firstChild,l=c.nextSibling,u=l.nextSibling,d=u.nextSibling,p=d.nextSibling,m=p.nextSibling,g=a.nextSibling;return o(c,()=>h(`search.source`)),o(l,()=>h(`table.jid`)),o(u,()=>h(`table.class`)),o(d,()=>h(`table.args`)),o(p,()=>h(`table.error`)),o(m,()=>h(`search.when`)),o(g,t(i,{get each(){return n().hits},children:n=>(()=>{var r=L(),i=r.firstChild,a=i.firstChild,c=i.nextSibling,l=c.nextSibling,u=l.nextSibling,d=u.nextSibling,p=d.nextSibling;return o(a,()=>h(`search.kind.${n.kind}`)),o(c,()=>C(n.jid,12)),o(l,()=>n.klass),o(u,t(E,{get str(){return w(n.args)},max:40})),o(d,t(e,{get when(){return n.error_class},get fallback(){return R()},get children(){var e=I();return o(e,()=>C(n.error_class,28)),v(()=>s(e,`title`,n.error_message??``)),e}})),o(p,()=>x(J(n))),v(e=>{var t=`badge ${V[n.kind]}`,r=n.jid,i=S(J(n));return t!==e.e&&f(a,e.e=t),r!==e.t&&s(c,`title`,e.t=r),i!==e.a&&s(p,`title`,e.a=i),e},{e:void 0,t:void 0,a:void 0}),r})()})),r}})]})}})}}),null),v(e=>{var t=h(`search.placeholder`),n=h(`search.placeholder`);return t!==e.e&&s(a,`aria-label`,e.e=t),n!==e.t&&s(a,`placeholder`,e.t=n),e},{e:void 0,t:void 0}),v(()=>a.value=D()),n})()}d([`click`,`input`]);export{U as default};