wurk 1.4.0 → 1.5.0

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 (71) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -1
  3. data/app/controllers/concerns/wurk/stream_concurrency_guard.rb +22 -5
  4. data/lib/wurk/capsule.rb +40 -12
  5. data/lib/wurk/client/buffered.rb +7 -0
  6. data/lib/wurk/client.rb +102 -32
  7. data/lib/wurk/component.rb +34 -2
  8. data/lib/wurk/configuration.rb +45 -6
  9. data/lib/wurk/context.rb +1 -1
  10. data/lib/wurk/engine.rb +41 -1
  11. data/lib/wurk/errors.rb +15 -0
  12. data/lib/wurk/fetcher/reaper.rb +12 -2
  13. data/lib/wurk/fetcher/reliable.rb +322 -60
  14. data/lib/wurk/fetcher.rb +6 -0
  15. data/lib/wurk/heartbeat.rb +2 -2
  16. data/lib/wurk/job_logger.rb +16 -7
  17. data/lib/wurk/job_set.rb +3 -2
  18. data/lib/wurk/job_util.rb +44 -24
  19. data/lib/wurk/launcher.rb +116 -72
  20. data/lib/wurk/leader.rb +36 -6
  21. data/lib/wurk/logger.rb +1 -1
  22. data/lib/wurk/lua/loader.rb +9 -3
  23. data/lib/wurk/metrics/accumulator.rb +95 -0
  24. data/lib/wurk/metrics/flusher.rb +70 -0
  25. data/lib/wurk/metrics/history.rb +98 -29
  26. data/lib/wurk/metrics/statsd.rb +32 -18
  27. data/lib/wurk/middleware/chain.rb +31 -14
  28. data/lib/wurk/middleware/poison_pill.rb +23 -2
  29. data/lib/wurk/pool_checkout.rb +10 -0
  30. data/lib/wurk/processor.rb +79 -11
  31. data/lib/wurk/profiler.rb +6 -2
  32. data/lib/wurk/queue.rb +8 -0
  33. data/lib/wurk/redis_client_adapter.rb +1 -1
  34. data/lib/wurk/redis_pool.rb +2 -1
  35. data/lib/wurk/shutdown_gate.rb +79 -0
  36. data/lib/wurk/stats.rb +5 -1
  37. data/lib/wurk/swarm/child_boot.rb +24 -4
  38. data/lib/wurk/swarm.rb +88 -14
  39. data/lib/wurk/version.rb +1 -1
  40. data/lib/wurk/web/config.rb +11 -7
  41. data/lib/wurk.rb +2 -8
  42. data/vendor/assets/dashboard/assets/{ArgsValue-D74zX0MI.js → ArgsValue-CcR2ya6e.js} +1 -1
  43. data/vendor/assets/dashboard/assets/{BatchDetail-OmC5NPgw.js → BatchDetail-CUXJUQ3Q.js} +1 -1
  44. data/vendor/assets/dashboard/assets/{Batches-CIpai7St.js → Batches-Cxan6Ngw.js} +1 -1
  45. data/vendor/assets/dashboard/assets/{Busy-A_kwSR6Q.js → Busy-DC5EGM0g.js} +1 -1
  46. data/vendor/assets/dashboard/assets/{Cron-BG7HTqlp.js → Cron-Dlt8tXJA.js} +1 -1
  47. data/vendor/assets/dashboard/assets/Dashboard-DNLu_WCg.js +1 -0
  48. data/vendor/assets/dashboard/assets/{Dead-8J21jMyK.js → Dead-dZ7VGlKS.js} +1 -1
  49. data/vendor/assets/dashboard/assets/{Extension-B4Q9FIQu.js → Extension-DaFpEIJf.js} +1 -1
  50. data/vendor/assets/dashboard/assets/{FilterBox-Fh_Ae7UW.js → FilterBox-CO3aYWIq.js} +1 -1
  51. data/vendor/assets/dashboard/assets/{JobDetailModal-Ceng0PMB.js → JobDetailModal-DSWbT6G0.js} +1 -1
  52. data/vendor/assets/dashboard/assets/{Limiters-CruDWvNZ.js → Limiters-Cb4PKXNR.js} +1 -1
  53. data/vendor/assets/dashboard/assets/Metrics-CCGzgCsT.js +1 -0
  54. data/vendor/assets/dashboard/assets/{Modal-CN3rdKA_.js → Modal-B86q6ruL.js} +1 -1
  55. data/vendor/assets/dashboard/assets/{PageHeader-C44KNMGm.js → PageHeader-fPrCcp_-.js} +1 -1
  56. data/vendor/assets/dashboard/assets/{Profiles-xEVTyS2N.js → Profiles-BnS82nR_.js} +1 -1
  57. data/vendor/assets/dashboard/assets/{Queues-D86FYohJ.js → Queues-CIyPevOy.js} +1 -1
  58. data/vendor/assets/dashboard/assets/{Retries-Bz1O1D-i.js → Retries-DopwXkXl.js} +1 -1
  59. data/vendor/assets/dashboard/assets/{Scheduled-B6h2akTu.js → Scheduled-1-Z7i1zE.js} +1 -1
  60. data/vendor/assets/dashboard/assets/{Search-OOu22e5s.js → Search-ByA6eTma.js} +1 -1
  61. data/vendor/assets/dashboard/assets/{Skeleton-DzR7XNxz.js → Skeleton-bC7HfQ9r.js} +1 -1
  62. data/vendor/assets/dashboard/assets/{charts-BVHHGof7.js → charts-CLLzJ7vK.js} +1 -1
  63. data/vendor/assets/dashboard/assets/index-B1N8hQUh.js +141 -0
  64. data/vendor/assets/dashboard/assets/{useResetPageOnEmpty-dVPGEWzn.js → useResetPageOnEmpty-DpBjkf6_.js} +1 -1
  65. data/vendor/assets/dashboard/assets/{useSort-BeYbztkN.js → useSort-DvpwuNQE.js} +1 -1
  66. data/vendor/assets/dashboard/index.html +2 -2
  67. data/vendor/assets/dashboard/wurk-manifest.json +2 -2
  68. metadata +30 -26
  69. data/vendor/assets/dashboard/assets/Dashboard-A_ToqHoo.js +0 -1
  70. data/vendor/assets/dashboard/assets/Metrics-CIT7VCoN.js +0 -1
  71. data/vendor/assets/dashboard/assets/index-D_lSDwKw.js +0 -141
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Wurk
4
+ # The two rules a process teardown obeys: it runs exactly once, and it never
5
+ # waits on a thread without a bound. Same reason TimerLoop exists — the
6
+ # mutex/clock dance was going to be hand-rolled in the caller, so it lives in
7
+ # one place with a name instead.
8
+ #
9
+ # A worker process can have several shutdown requests in flight at once — a
10
+ # dashboard-queued TERM, an embedded host calling `stop`, a Manager that can
11
+ # no longer hold its concurrency — and running the teardown twice double-fires
12
+ # the `:exit` hooks and tears the Redis pool down under the thread still using
13
+ # it.
14
+ #
15
+ # @gate = Wurk::ShutdownGate.new
16
+ # def stop = @gate.run { ...teardown... }
17
+ #
18
+ # The first caller runs the block; the rest block until it returns and then get
19
+ # nil. `Queue#close` releases every waiter at once and makes every later call
20
+ # return immediately, so a `stop` landing after the teardown finished is a
21
+ # no-op rather than a second one.
22
+ #
23
+ # The lock is only ever held for the bookkeeping, never across the teardown —
24
+ # a caller that must not block (a dying Processor thread, the heartbeat the
25
+ # teardown is about to join) has to be able to ask for a shutdown that is
26
+ # already under way without deadlocking against it.
27
+ class ShutdownGate
28
+ def initialize
29
+ @mutex = ::Mutex.new
30
+ @owner = nil
31
+ @runner = nil
32
+ @done = ::Queue.new
33
+ end
34
+
35
+ def run
36
+ return await unless claim
37
+
38
+ begin
39
+ yield
40
+ ensure
41
+ @done.close
42
+ end
43
+ end
44
+
45
+ # Memoizes the one background thread a caller uses to reach #run from
46
+ # somewhere it cannot block. Spawned once: a second request rides the first
47
+ # teardown instead of leaving another unreferenced one running behind it.
48
+ def runner
49
+ @mutex.synchronize { @runner ||= yield }
50
+ end
51
+
52
+ # Join every thread inside one shared monotonic `budget` (an absolute
53
+ # CLOCK_MONOTONIC instant), so N wedged threads cost the budget once rather
54
+ # than N times. A non-positive remainder polls without waiting, which is the
55
+ # right answer once the budget is spent: the straggler is left to the process
56
+ # exit rather than holding the whole teardown open behind it.
57
+ def join_within(threads, budget)
58
+ threads.each { |t| t.join([budget - ::Process.clock_gettime(::Process::CLOCK_MONOTONIC), 0].max) }
59
+ end
60
+
61
+ private
62
+
63
+ def claim
64
+ @mutex.synchronize do
65
+ return false if @owner
66
+
67
+ @owner = Thread.current
68
+ true
69
+ end
70
+ end
71
+
72
+ # The owner re-entering (a `:shutdown` hook that calls `stop`) cannot wait on
73
+ # a teardown it is inside of, so it returns instead of deadlocking.
74
+ def await
75
+ @done.pop unless @mutex.synchronize { @owner } == Thread.current
76
+ nil
77
+ end
78
+ end
79
+ end
data/lib/wurk/stats.rb CHANGED
@@ -172,7 +172,11 @@ module Wurk
172
172
  raise ArgumentError, "days_previous must be in 1..#{MAX_DAYS}" unless (1..MAX_DAYS).cover?(days_previous)
173
173
 
174
174
  @days_previous = days_previous
175
- @start_date = start_date || ::Date.today
175
+ # UTC, not `Date.today`: the writer (Launcher#write_stats) keys these
176
+ # buckets off `Time.now.utc`, so a local civil date reads a day the
177
+ # writer never wrote for whatever slice of each day the host's offset
178
+ # spans — the newest bucket comes back 0 and the window is shifted.
179
+ @start_date = start_date || ::Time.now.utc.to_date
176
180
  @pool = pool
177
181
  end
178
182
 
@@ -128,18 +128,38 @@ module Wurk
128
128
  # boot rides out instead of racing straight into a dead pool. A PING that
129
129
  # still fails past the wrapper's retries propagates and crashes the child
130
130
  # (the swarm respawns it) rather than booting a worker that can't reach
131
- # Redis. The same checkout eagerly primes every Lua script in one
132
- # pipelined round-trip so the first EVALSHA hits a warm cache.
131
+ # Redis.
132
+ #
133
+ # The PING rides in the same pipeline as the eager Lua upload, so the whole
134
+ # check is one round trip and the child's first EVALSHA hits a warm cache.
135
+ #
136
+ # #101 boot-audit: hoisting the upload into the parent (one server-global
137
+ # `SCRIPT LOAD` for the whole fleet, children PING only) was measured and
138
+ # REJECTED — see Swarm#boot. Children reconnect in parallel, so the upload
139
+ # they pay here overlaps; the parent's would have been serial, ahead of
140
+ # every fork.
133
141
  def validate_redis!
134
142
  @config.redis_pool.with do |conn|
135
- conn.call('PING')
136
- Wurk::Lua::Loader.script_load_all(conn)
143
+ conn.pipelined do |pipe|
144
+ pipe.call('PING')
145
+ Wurk::Lua::Loader.queue_script_loads(pipe)
146
+ end
137
147
  end
138
148
  end
139
149
 
140
150
  # AR reconnect is best-effort — a Redis-only worker with no database still
141
151
  # runs — but the silent `rescue nil` here hid a real misconfiguration
142
152
  # during the #101 audit, so warn loudly instead of swallowing.
153
+ #
154
+ # #101 boot-audit: measured, not assumed. `establish_connection` only
155
+ # records the connection spec on the pool manager (~0.3ms warm, on top
156
+ # of a one-time adapter-load cost already paid pre-fork in the parent);
157
+ # it does not itself open a socket. `ConnectionPool#stat[:connections]`
158
+ # stays 0 immediately after — AR opens the real handshake lazily, on
159
+ # the job thread's first `ActiveRecord::Base.connection` checkout, same
160
+ # as it always has. So `:startup` (fired right after this in `#run`)
161
+ # never waits on a DB round trip. Pinned by
162
+ # `test_reconnect_active_record_does_not_eagerly_open_a_connection`.
143
163
  def reconnect_active_record
144
164
  return unless defined?(::ActiveRecord::Base)
145
165
 
data/lib/wurk/swarm.rb CHANGED
@@ -54,6 +54,12 @@ module Wurk
54
54
  SUPERVISOR_POOL_SIZE = 1
55
55
  SUPERVISOR_POOL_NAME = 'swarm-supervisor'
56
56
 
57
+ # Poll budget for the post-SIGKILL reap sweep (250ms). Deliberately far
58
+ # shorter than any drain deadline — it runs after the fleet is already dead
59
+ # and races a kernel teardown measured in microseconds.
60
+ HARD_KILL_REAP_ATTEMPTS = 25
61
+ HARD_KILL_REAP_INTERVAL = 0.01
62
+
57
63
  # Children each hard_shutdown after their own drain deadline (bulk_requeue
58
64
  # + a 3s ensure window + heartbeat cleanup); the parent must not SIGKILL
59
65
  # them mid-tail, so its own wait always extends past theirs by this much.
@@ -101,6 +107,21 @@ module Wurk
101
107
  # its default disposition — it died instantly and orphaned live, fetching
102
108
  # children. Installed first, the trap queues the TERM and the supervise
103
109
  # loop drains it (relaying to children) even if it arrives mid-boot.
110
+ #
111
+ # `prepare_for_fork!` is the last thing before the fork and stays after
112
+ # `close_parent_sockets`: it materializes the slot-independent config so
113
+ # every child inherits it copy-on-write, and none of what it touches opens
114
+ # a socket — anything that did would land back on the wrong side of step 3.
115
+ #
116
+ # Nothing else belongs between steps 3 and 4. #101 boot-audit: a pre-fork
117
+ # `SCRIPT LOAD` was tried here (the cache is server-global, so one upload
118
+ # could serve the whole fleet and children would only PING) and MEASURED
119
+ # SLOWER — `bench:swarm_boot` 152 -> 95 i/s, a 36.7% regression. Step 3 has
120
+ # just closed every parent socket, so the upload has to open its own
121
+ # connection, and it lands serially ahead of the first fork: ~2ms of a
122
+ # ~10ms boot, on every child's path. The per-child upload it replaced cost
123
+ # far less — the children reconnect in parallel, and it rides in the
124
+ # pipeline of a PING each one already sends (ChildBoot#validate_redis!).
104
125
  def boot(install_signals: true)
105
126
  raise 'Wurk::Swarm already booted' unless @assignments.empty?
106
127
  raise ArgumentError, 'Topology has no slots' if @topology.empty?
@@ -109,6 +130,7 @@ module Wurk
109
130
  @owner_pid = ::Process.pid
110
131
  install_signal_handlers if install_signals
111
132
  close_parent_sockets
133
+ @config.prepare_for_fork!
112
134
  fork_children
113
135
  child_pids
114
136
  end
@@ -243,6 +265,16 @@ module Wurk
243
265
  end
244
266
 
245
267
  # Step 4.
268
+ #
269
+ # #101 boot-audit: measured, not assumed. Instrumented an 8-child boot
270
+ # against real Redis — `close_supervisor_pool` costs ~0.01-0.07ms per
271
+ # call (a nil-checked ivar write plus, at most, a disconnect on an
272
+ # already-torn-down pool); `Process.fork` itself is ~1-2ms/child and
273
+ # dominates the loop entirely. Hoisting the close out of the loop would
274
+ # save microseconds against a multi-millisecond fork syscall — not worth
275
+ # losing the "must run before the first fork" invariant's current
276
+ # per-fork enforcement. Left sequential; re-measure with
277
+ # `bin/rake bench:swarm_boot` before revisiting.
246
278
  def fork_children
247
279
  @assignments.each_index { |idx| spawn_child(@assignments[idx], idx) }
248
280
  end
@@ -349,18 +381,29 @@ module Wurk
349
381
  end
350
382
 
351
383
  # Reap every exited child this tick (not one), so a fleet-wide death
352
- # recovers in parallel rather than one child per SUPERVISE_TICK. ECHILD
353
- # (momentarily no children — all crashed and awaiting backoff) is not a stop
354
- # condition: the swarm only stops on an explicit TERM/INT.
384
+ # recovers in parallel rather than one child per SUPERVISE_TICK.
385
+ #
386
+ # Waits on the KNOWN pids, one by one — never `wait2(-1)`. Embedded
387
+ # (`RailsBoot.boot_swarm`) the supervisor shares a process with the host
388
+ # app, and a wildcard wait consumes the exit status of ANY child: a Puma
389
+ # worker, a `system`/`Open3`/`spawn` subprocess. The host's own
390
+ # `Process.wait` then fails with ECHILD and its subprocess bookkeeping
391
+ # breaks. A pid the swarm did not fork is never its business.
355
392
  def reap_children
356
- loop do
357
- pid, status = ::Process.wait2(-1, ::Process::WNOHANG)
358
- break unless pid
359
-
360
- on_child_exit(pid, status)
361
- end
393
+ child_pids.each { |pid| reap_child(pid) }
394
+ end
395
+
396
+ # ECHILD on a pid the swarm forked means someone else already reaped it —
397
+ # an embedded host with its own wildcard reaper is exactly the mirror of the
398
+ # bug above. Retire the slot with an unknown status rather than skip it: the
399
+ # child is gone either way, and leaving the entry in the table wedges the
400
+ # slot forever (never respawned because it still looks alive, never reaped
401
+ # because there is nothing left to reap).
402
+ def reap_child(pid)
403
+ reaped, status = ::Process.wait2(pid, ::Process::WNOHANG)
404
+ on_child_exit(pid, status) if reaped
362
405
  rescue Errno::ECHILD
363
- nil
406
+ on_child_exit(pid, nil)
364
407
  end
365
408
 
366
409
  def on_child_exit(pid, status)
@@ -370,7 +413,7 @@ module Wurk
370
413
  return if @restart.claim_exit(pid)
371
414
 
372
415
  if @stopping
373
- logger.info { "swarm: child #{pid} exited (status=#{status.exitstatus})" }
416
+ logger.info { "swarm: child #{pid} exited (status=#{status&.exitstatus})" }
374
417
  else
375
418
  schedule_respawn(pid, status, meta)
376
419
  end
@@ -385,7 +428,7 @@ module Wurk
385
428
  idx = meta[:index]
386
429
  delay = @respawn_backoff.fail(idx, lifetime: monotonic - meta[:spawned_at])
387
430
  logger.warn do
388
- "swarm: child #{pid} died (status=#{status.exitstatus}); respawning slot #{idx} in #{delay}s"
431
+ "swarm: child #{pid} died (status=#{status&.exitstatus}); respawning slot #{idx} in #{delay}s"
389
432
  end
390
433
  end
391
434
 
@@ -469,13 +512,44 @@ module Wurk
469
512
  # Kill and forget atomically: a child landing in the table between the walk
470
513
  # and the clear would be dropped from it without ever being signalled —
471
514
  # untracked and still alive.
515
+ #
516
+ # SIGKILL only schedules the teardown; the pid stays a zombie until someone
517
+ # waits on it, and this is the swarm's last reap — `shutdown` has already
518
+ # left the supervise loop behind. Standalone the exiting process hands its
519
+ # zombies to init, but embedded (`RailsBoot.boot_swarm`) the host lives on
520
+ # and carries one zombie per straggler for the rest of its life. The sweep
521
+ # runs on the pids taken under the lock but outside it: it sleeps, and the
522
+ # child table is never held across a sleep.
472
523
  def hard_kill_stragglers
473
- @lock.synchronize do
474
- @children.each_key { |pid| safe_kill(pid, 'KILL') }
524
+ killed = @lock.synchronize do
525
+ pids = @children.keys
526
+ pids.each { |pid| safe_kill(pid, 'KILL') }
475
527
  @children.clear
528
+ pids
529
+ end
530
+ reap_killed(killed)
531
+ end
532
+
533
+ # Bounded and best-effort: SIGKILL is asynchronous, so poll rather than
534
+ # block on a pid that may be wedged in uninterruptible sleep. A straggler
535
+ # still unreaped when the budget runs out is dropped exactly as before —
536
+ # the drain must not stall on it.
537
+ def reap_killed(pids)
538
+ pending = pids
539
+ HARD_KILL_REAP_ATTEMPTS.times do
540
+ pending = pending.reject { |pid| reaped?(pid) }
541
+ break if pending.empty?
542
+
543
+ sleep HARD_KILL_REAP_INTERVAL
476
544
  end
477
545
  end
478
546
 
547
+ def reaped?(pid)
548
+ !::Process.wait2(pid, ::Process::WNOHANG).nil?
549
+ rescue Errno::ECHILD
550
+ true
551
+ end
552
+
479
553
  # Has the child written its first heartbeat yet? One non-blocking SISMEMBER,
480
554
  # polled by the restart state machine each tick. Identity is
481
555
  # `<hostname>:<pid>:<nonce>`; PROCESS_NONCE is set when Component loads in
data/lib/wurk/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Wurk
4
- VERSION = "1.4.0"
4
+ VERSION = "1.5.0"
5
5
  end
@@ -196,15 +196,19 @@ module Wurk
196
196
  end
197
197
 
198
198
  # Builds the host-middleware chain wrapping `inner`, memoized against
199
- # the middleware list it was built from — `middlewares` is the live
200
- # array (upstream surface), so direct mutation after the first request
201
- # triggers a rebuild instead of silently serving the stale chain.
202
- # Production builds exactly once at boot; the per-request comparison is
203
- # an == over a handful of entries.
199
+ # `[inner, middlewares]` — `middlewares` is the live array (upstream
200
+ # surface), so direct mutation after the first request triggers a
201
+ # rebuild instead of silently serving the stale chain. Keying on
202
+ # `inner` too matters for the same reason: memoizing on the
203
+ # middleware list alone pins whichever `inner` app the *first* caller
204
+ # passed, forever — a second mount (e.g. per-test Rack app, or a
205
+ # second engine mount) would silently get served the first one's app.
206
+ # Production builds exactly once at boot; the per-request comparison
207
+ # is an == over a handful of entries plus one object identity check.
204
208
  def rack_app(inner)
205
- return @rack_app if @rack_app && @rack_app_stack == @middlewares
209
+ return @rack_app if @rack_app && @rack_app_key == [inner, @middlewares]
206
210
 
207
- @rack_app_stack = @middlewares.dup
211
+ @rack_app_key = [inner, @middlewares.dup]
208
212
  stack = @middlewares
209
213
  @rack_app = ::Rack::Builder.new do
210
214
  stack.each { |middleware, args, block| use(middleware, *args, &block) }
data/lib/wurk.rb CHANGED
@@ -5,6 +5,7 @@
5
5
  # end of this file when Rails is present (drop-in parity, #246), and stay
6
6
  # unloaded otherwise so a no-Rails boot pulls in zero Rails code.
7
7
 
8
+ require_relative 'wurk/errors'
8
9
  require_relative 'wurk/version'
9
10
  require_relative 'wurk/keys'
10
11
  require_relative 'wurk/redis_pool'
@@ -73,7 +74,7 @@ require_relative 'wurk/deploy'
73
74
 
74
75
  require 'json'
75
76
 
76
- # Wurk — a 100% API-compatible, free, faster drop-in for Sidekiq + Sidekiq Pro
77
+ # Wurk — a 100% API-compatible, free drop-in for Sidekiq + Sidekiq Pro
77
78
  # + Sidekiq Enterprise. Same Redis key schema, same job JSON, same Ruby DSL;
78
79
  # real parallelism via a fork-based swarm. Every public class is also exposed
79
80
  # under its `Sidekiq::*` name (see {Sidekiq}).
@@ -86,13 +87,6 @@ require 'json'
86
87
  #
87
88
  # @see https://github.com/developerz-ai/wurk/blob/main/docs/migrate-from-sidekiq.md Migration guide
88
89
  module Wurk
89
- class Error < StandardError; end
90
-
91
- # Raised inside a worker process to abort the run loop. User code must not
92
- # rescue this — the swarm uses it to signal teardown across thread boundaries.
93
- # Spec: docs/target/sidekiq-free.md §3.
94
- class Shutdown < Interrupt; end
95
-
96
90
  # Process-wide job option defaults. Per-class options from `sidekiq_options`
97
91
  # take precedence; this hash is the floor.
98
92
  DEFAULT_JOB_OPTIONS = { 'retry' => true, 'queue' => 'default' }.freeze
@@ -1 +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-DzR7XNxz.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};
1
+ import{A as e,F as t,_ as n,b as r,v as i,w as a,z as o}from"./Skeleton-bC7HfQ9r.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};
@@ -1 +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-DzR7XNxz.js";import{o as p,s as m}from"./index-D_lSDwKw.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};
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-bC7HfQ9r.js";import{o as p,s as m}from"./index-B1N8hQUh.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};
@@ -1 +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-DzR7XNxz.js";import{n as g,o as _}from"./index-D_lSDwKw.js";import{a as v,o as y}from"./utils-DDJC7tJV.js";import{n as b,r as x,t as S}from"./useResetPageOnEmpty-dVPGEWzn.js";import{n as C,t as w}from"./useSort-BeYbztkN.js";import{t as T}from"./PageHeader-C44KNMGm.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};
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-bC7HfQ9r.js";import{n as g,o as _}from"./index-B1N8hQUh.js";import{a as v,o as y}from"./utils-DDJC7tJV.js";import{n as b,r as x,t as S}from"./useResetPageOnEmpty-DpBjkf6_.js";import{n as C,t as w}from"./useSort-DvpwuNQE.js";import{t as T}from"./PageHeader-fPrCcp_-.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};
@@ -1 +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-DzR7XNxz.js";import{a as x,r as S,t as C}from"./index-D_lSDwKw.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-C44KNMGm.js";import{t as A}from"./Modal-CN3rdKA_.js";import{t as j}from"./ArgsValue-D74zX0MI.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};
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-bC7HfQ9r.js";import{a as x,r as S,t as C}from"./index-B1N8hQUh.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-fPrCcp_-.js";import{t as A}from"./Modal-B86q6ruL.js";import{t as j}from"./ArgsValue-CcR2ya6e.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};
@@ -1 +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-DzR7XNxz.js";import{a as b,r as x,t as S}from"./index-D_lSDwKw.js";import{a as C,i as w,o as T}from"./utils-DDJC7tJV.js";import{n as E,t as D}from"./useSort-BeYbztkN.js";import{t as O}from"./PageHeader-C44KNMGm.js";import{t as k}from"./Modal-CN3rdKA_.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};
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-bC7HfQ9r.js";import{a as b,r as x,t as S}from"./index-B1N8hQUh.js";import{a as C,i as w,o as T}from"./utils-DDJC7tJV.js";import{n as E,t as D}from"./useSort-DvpwuNQE.js";import{t as O}from"./PageHeader-fPrCcp_-.js";import{t as k}from"./Modal-B86q6ruL.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 g,q as _,r as v,s as y,v as b,w as x,z as S}from"./Skeleton-bC7HfQ9r.js";import{i as C,o as w}from"./index-B1N8hQUh.js";import{n as T}from"./utils-DDJC7tJV.js";import{t as E}from"./PageHeader-fPrCcp_-.js";import{r as ee}from"./charts-CLLzJ7vK.js";var D=e=>1-(1-e)**3,O=()=>typeof window<`u`&&window.matchMedia?.(`(prefers-reduced-motion: reduce)`).matches;function k(e,t=700){let[n,i]=s(0),a=0,o=null;return r(()=>{let n=e();if(O()||!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)*D(l);a=u,i(u),l<1&&(o=requestAnimationFrame(c))};o=requestAnimationFrame(c),_(()=>{o!==null&&cancelAnimationFrame(o)})}),n}function A(e){let t=k(()=>e.value);return b(()=>Math.round(t()).toLocaleString())}var j=x(`<span class=obs-metric__sub>`),M=x(`<span class=obs-metric__sub><span> <!>%</span> `),N=x(`<div class=obs>`),P=x(`<div class=obs><div class=empty-state style=color:var(--danger)>`),F=x(`<div class=obs><div class=empty-state>`),te=x(`<div class=obs-metric__head><span class=obs-mono></span><i class="fa-solid fa-circle-check obs-metric__icon"aria-hidden=true>`),I=x(`<span class=obs-metric__value>`),L=x(`<i class="fa-solid fa-arrow-right obs-card__go"aria-hidden=true>`),R=x(`<div class=obs-metric__head><span class=obs-mono></span><i class="fa-solid fa-triangle-exclamation obs-metric__icon"aria-hidden=true>`),z=x(`<div class=obs-metric__head><span class=obs-mono></span><i class="fa-solid fa-ban obs-metric__icon"aria-hidden=true>`),B=x(`<div class=obs-metric__head><span class=obs-mono></span><i class="fa-solid fa-spinner obs-metric__icon"aria-hidden=true>`),V=x(`<span class=obs-mono>`),H=x(`<span class=obs-stat__value>`),U=x(`<i class="fa-solid fa-arrow-right"aria-hidden=true>`),W=x(`<div class=obs-tablescroll><table><thead><tr><th>Name</th><th></th><th></th><th></th></tr></thead><tbody>`),G=x(`<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> `),ne=x(`<button role=tab>`),re=x(`<div class=empty-state style=height:320px;display:grid;place-items:center>`),ie=x(`<div class=empty-state>`),ae=x(`<span class="obs-chip obs-chip--paused">`),oe=x(`<tr><td style=font-weight:500;color:var(--obs-text)></td><td></td><td></td><td>`),se=x(`<span class="obs-chip obs-chip--active">`);function K(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 q=[{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`}],J=(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 Y(n){return t(e,{get when(){return n.pct!==null},get fallback(){return(()=>{var e=j();return c(e,()=>y(`dashboard.vs_last_hour`)),e})()},get children(){return(()=>{let e=()=>n.pct>=0,t=()=>e()===n.goodWhenUp;return(()=>{var r=M(),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,()=>y(`dashboard.vs_last_hour`),null),S(()=>p(i,t()?`up`:`down`)),r})()})()}})}function X(){let r=C(),[f,_]=s(0),x=()=>q[f()];n(()=>{document.title=`${y(`nav.dashboard`)} — Wurk`});let D=d(()=>({queryKey:[`stats`],queryFn:()=>fetch(`${u()}/api/stats`).then(e=>e.json()),enabled:!r.connected(),refetchInterval:!r.connected()&&5e3})),O=d(()=>({queryKey:[`history`,x().bucket,x().window],queryFn:()=>fetch(`${u()}/api/history/${x().bucket}?window=${x().window}`).then(e=>e.json()),refetchInterval:3e4})),k=()=>r.stats()??D.data??null,M=o(()=>(O.data?.series??[]).map(e=>({...e,label:J(e.at,x().bucket)}))),X=o(()=>{let e=x(),t=`slice`in e?e.slice:void 0;return t?M().slice(-t):M()}),ce=o(()=>X().some(e=>e.processed>0||e.failed>0)),Z=()=>t(E,{icon:`fa-gauge-high`,get title(){return y(`nav.dashboard`)},get summary(){return y(`summaries.dashboard`)}});return t(i,{get children(){return[t(h,{get when(){return b(()=>!!D.isLoading)()&&!k()},get children(){var e=N();return c(e,t(Z,{}),null),c(e,t(v,{count:4}),null),c(e,t(m,{rows:6,cols:4}),null),e}}),t(h,{get when(){return b(()=>!!D.isError)()&&!k()},get children(){var e=P(),n=e.firstChild;return c(e,t(Z,{}),n),c(n,()=>y(`common.error`)),e}}),t(h,{get when(){return!k()},get children(){var e=F(),n=e.firstChild;return c(e,t(Z,{}),n),c(n,()=>y(`common.empty`)),e}}),t(h,{get when(){return k()},children:n=>(()=>{var r=G(),i=r.firstChild,o=i.nextSibling,s=o.firstChild,u=s.firstChild,d=u.firstChild,m=d.nextSibling,h=u.nextSibling.firstChild,v=h.nextSibling.firstChild;v.firstChild.nextSibling;var C=v.nextSibling;C.firstChild.nextSibling;var E=s.nextSibling,D=o.nextSibling,k=D.nextSibling,N=k.firstChild,P=N.firstChild,F=k.nextSibling.firstChild.nextSibling,J=F.nextSibling,Q=J.nextSibling.firstChild;Q.firstChild.nextSibling;var $=Q.nextSibling;return $.firstChild.nextSibling,c(r,t(Z,{}),i),c(i,t(w,{class:`obs-card obs-metric obs-card--link`,href:`/metrics`,get children(){return[(()=>{var e=te(),t=e.firstChild;return c(t,()=>y(`dashboard.processed`)),e})(),(()=>{var e=I();return c(e,t(A,{get value(){return n().processed}})),e})(),t(Y,{get pct(){return K(M(),`processed`)},goodWhenUp:!0}),L()]}}),null),c(i,t(w,{class:`obs-card obs-metric obs-card--link`,href:`/retries`,get children(){return[(()=>{var e=R(),t=e.firstChild;return c(t,()=>y(`dashboard.failed`)),e})(),(()=>{var e=I();return c(e,t(A,{get value(){return n().failed}})),e})(),t(Y,{get pct(){return K(M(),`failed`)},goodWhenUp:!1}),L()]}}),null),c(i,t(w,{class:`obs-card obs-metric obs-card--link`,href:`/dead`,get children(){return[(()=>{var e=z(),t=e.firstChild;return c(t,()=>y(`dashboard.expired`)),e})(),(()=>{var e=I();return c(e,t(A,{get value(){return n().expired}})),e})(),(()=>{var e=j();return c(e,(()=>{var e=b(()=>n().expired===0);return()=>e()?y(`dashboard.stable_threshold`):y(`dashboard.above_threshold`)})()),e})(),L()]}}),null),c(i,t(w,{class:`obs-card obs-metric obs-card--link`,href:`/busy`,get children(){return[(()=>{var e=B(),t=e.firstChild;return c(t,()=>y(`dashboard.busy`)),e})(),(()=>{var e=I();return c(e,t(A,{get value(){return n().busy}})),e})(),(()=>{var e=j();return c(e,(()=>{var e=b(()=>n().busy===0);return()=>e()?y(`dashboard.system_idle`):y(`dashboard.processing`)})()),e})(),L()]}}),null),c(d,()=>y(`dashboard.performance_insight`)),c(m,()=>y(`dashboard.perf_subtitle`,{range:y(x().desc_key)})),c(h,t(a,{each:q,children:(e,t)=>(()=>{var n=ne();return n.$$click=()=>_(t()),c(n,()=>e.key),S(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,()=>y(`dashboard.processed`),null),c(C,()=>y(`dashboard.failed`),null),c(E,t(e,{get when(){return!O.isPending},get fallback(){return t(g,{height:320})},get children(){return t(e,{get when(){return ce()},get fallback(){return(()=>{var e=re();return c(e,()=>y(`dashboard.no_history`)),e})()},get children(){return t(ee,{get data(){return X()},height:320,xMinTickGap:64,get series(){return[{key:`processed`,name:y(`dashboard.processed`),stroke:`#fafafa`,strokeWidth:2,fill:`gradient`},{key:`failed`,name:y(`dashboard.failed`),stroke:`#a1a1aa`,strokeWidth:1.5,strokeDasharray:`5 4`,fill:`none`}]}})}})}})),c(D,t(w,{class:`obs-card obs-stat obs-card--link`,href:`/queues`,get children(){return[(()=>{var e=V();return c(e,()=>y(`dashboard.enqueued`)),e})(),(()=>{var e=H();return c(e,t(A,{get value(){return n().enqueued}})),e})(),L()]}}),null),c(D,t(w,{class:`obs-card obs-stat obs-card--link`,href:`/retries`,get children(){return[(()=>{var e=V();return c(e,()=>y(`dashboard.retries`)),e})(),(()=>{var e=H();return c(e,t(A,{get value(){return n().retries}})),e})(),L()]}}),null),c(D,t(w,{class:`obs-card obs-stat obs-card--link`,href:`/scheduled`,get children(){return[(()=>{var e=V();return c(e,()=>y(`dashboard.scheduled`)),e})(),(()=>{var e=H();return c(e,t(A,{get value(){return n().scheduled}})),e})(),L()]}}),null),c(D,t(w,{class:`obs-card obs-stat obs-card--link`,href:`/dead`,get children(){return[(()=>{var e=V();return c(e,()=>y(`dashboard.dead`)),e})(),(()=>{var e=H();return c(e,t(A,{get value(){return n().dead}})),e})(),L()]}}),null),c(P,()=>y(`table.queues`)),c(N,t(w,{class:`obs-table__link`,href:`/queues`,get children(){return[`View All `,U()]}}),null),c(k,t(e,{get when(){return n().queues.length>0},get fallback(){return(()=>{var e=ie();return c(e,()=>y(`common.empty`)),e})()},get children(){var r=W(),i=r.firstChild.firstChild,o=i.firstChild.firstChild.nextSibling,s=o.nextSibling,u=s.nextSibling,d=i.nextSibling;return c(o,()=>y(`table.size`)),c(s,()=>y(`table.latency`)),c(u,()=>y(`table.status`)),c(d,t(a,{get each(){return n().queues},children:n=>(()=>{var r=oe(),i=r.firstChild,a=i.nextSibling,o=a.nextSibling,s=o.nextSibling;return c(i,()=>n.name),c(a,t(A,{get value(){return n.size}})),c(o,()=>T(n.latency)),c(s,t(e,{get when(){return n.paused},get fallback(){return(()=>{var e=se();return c(e,()=>y(`dashboard.active`)),e})()},get children(){var e=ae();return c(e,()=>y(`dashboard.paused`)),e}})),S(()=>l(o,`title`,`${n.latency.toFixed(3)}s`)),r})()})),r}}),null),c(F,()=>y(`dashboard.strapline`)),c(J,()=>y(`dashboard.tagline`)),c(Q,()=>y(`dashboard.install`),null),c($,()=>y(`dashboard.docs`),null),r})()})]}})}f([`click`]);export{X as default};
@@ -1 +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-DzR7XNxz.js";import{a as ee,n as te}from"./index-D_lSDwKw.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-dVPGEWzn.js";import{n as x,t as S}from"./useSort-BeYbztkN.js";import{t as C}from"./PageHeader-C44KNMGm.js";import{t as w}from"./ArgsValue-D74zX0MI.js";import{t as T}from"./JobDetailModal-Ceng0PMB.js";import{a as E,i as D,n as O,r as ie,t as ae}from"./FilterBox-Fh_Ae7UW.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};
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-bC7HfQ9r.js";import{a as ee,n as te}from"./index-B1N8hQUh.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-DpBjkf6_.js";import{n as x,t as S}from"./useSort-DvpwuNQE.js";import{t as C}from"./PageHeader-fPrCcp_-.js";import{t as w}from"./ArgsValue-CcR2ya6e.js";import{t as T}from"./JobDetailModal-DSWbT6G0.js";import{a as E,i as D,n as O,r as ie,t as ae}from"./FilterBox-CO3aYWIq.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};
@@ -1 +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,q as u,s as d,v as f,w as p,z as m}from"./Skeleton-DzR7XNxz.js";import{a as h,s as g}from"./index-D_lSDwKw.js";import{t as _}from"./PageHeader-C44KNMGm.js";var v=p(`<div class=empty-state style=color:var(--danger)>`),y=p(`<div class=skeleton-stack>`),b=p(`<div class="card ext-view">`),x=p(`<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>`),S=p(`<iframe style="width:100%;height:calc(100vh - 11rem);border:1px solid var(--border);border-radius:var(--radius);background:var(--surface)">`);function C(){let n=g(),r=()=>n.tab??``,i=h(),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(T,{get tab(){return r()},get title(){return s()}})},children:e=>t(w,{extName:e,get indexPath(){return r()},get title(){return s()}})})}function w(a){let s=`${o()}/ext/${a.extName}/`,[p,h]=r(null),[g,x]=r(!1),S=0,C,w=async(e,t)=>{let n=++S;C=new AbortController;try{let r=await fetch(s+e,{...t,signal:C.signal}),i=await r.text();if(n!==S)return;x(!r.ok&&r.status!==404),h(i)}catch(e){if(e instanceof DOMException&&e.name===`AbortError`)return;n===S&&x(!0)}};u(()=>C?.abort()),n(()=>{w(a.indexPath.replace(/\/+$/,``))});let T=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(),w(n.pathname.slice(s.length)+n.search))},E=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();w(`${n.pathname.slice(s.length)}${e?`?${e}`:``}`)}else w(n.pathname.slice(s.length)+n.search,{method:`POST`,body:r})};return[t(_,{icon:`fa-puzzle-piece`,get title(){return a.title},get summary(){return d(`extension.summary`)}}),t(e,{get when(){return g()},get children(){var e=v();return i(e,()=>d(`common.error`)),e}}),t(e,{get when(){return f(()=>p()===null)()&&!g()},get children(){var e=y();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 f(()=>p()!==null)()&&!g()},get children(){var e=b();return e.addEventListener(`submit`,E),e.$$click=T,m(()=>e.innerHTML=p()),e}})]}function T(e){let n=()=>`${o()}/${e.tab}?wurk_ext_embed=1`;return[t(_,{icon:`fa-puzzle-piece`,get title(){return e.title},get summary(){return d(`extension.summary`)},get children(){var t=x();return t.firstChild,i(t,()=>d(`extension.open`),null),m(()=>a(t,`href`,`${o()}/${e.tab}`)),t}}),(()=>{var t=S();return m(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{C as default};
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,q as u,s as d,v as f,w as p,z as m}from"./Skeleton-bC7HfQ9r.js";import{a as h,s as g}from"./index-B1N8hQUh.js";import{t as _}from"./PageHeader-fPrCcp_-.js";var v=p(`<div class=empty-state style=color:var(--danger)>`),y=p(`<div class=skeleton-stack>`),b=p(`<div class="card ext-view">`),x=p(`<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>`),S=p(`<iframe style="width:100%;height:calc(100vh - 11rem);border:1px solid var(--border);border-radius:var(--radius);background:var(--surface)">`);function C(){let n=g(),r=()=>n.tab??``,i=h(),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(T,{get tab(){return r()},get title(){return s()}})},children:e=>t(w,{extName:e,get indexPath(){return r()},get title(){return s()}})})}function w(a){let s=`${o()}/ext/${a.extName}/`,[p,h]=r(null),[g,x]=r(!1),S=0,C,w=async(e,t)=>{let n=++S;C=new AbortController;try{let r=await fetch(s+e,{...t,signal:C.signal}),i=await r.text();if(n!==S)return;x(!r.ok&&r.status!==404),h(i)}catch(e){if(e instanceof DOMException&&e.name===`AbortError`)return;n===S&&x(!0)}};u(()=>C?.abort()),n(()=>{w(a.indexPath.replace(/\/+$/,``))});let T=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(),w(n.pathname.slice(s.length)+n.search))},E=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();w(`${n.pathname.slice(s.length)}${e?`?${e}`:``}`)}else w(n.pathname.slice(s.length)+n.search,{method:`POST`,body:r})};return[t(_,{icon:`fa-puzzle-piece`,get title(){return a.title},get summary(){return d(`extension.summary`)}}),t(e,{get when(){return g()},get children(){var e=v();return i(e,()=>d(`common.error`)),e}}),t(e,{get when(){return f(()=>p()===null)()&&!g()},get children(){var e=y();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 f(()=>p()!==null)()&&!g()},get children(){var e=b();return e.addEventListener(`submit`,E),e.$$click=T,m(()=>e.innerHTML=p()),e}})]}function T(e){let n=()=>`${o()}/${e.tab}?wurk_ext_embed=1`;return[t(_,{icon:`fa-puzzle-piece`,get title(){return e.title},get summary(){return d(`extension.summary`)},get children(){var t=x();return t.firstChild,i(t,()=>d(`extension.open`),null),m(()=>a(t,`href`,`${o()}/${e.tab}`)),t}}),(()=>{var t=S();return m(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{C as default};
@@ -1 +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-DzR7XNxz.js";import{r as g,t as _}from"./index-D_lSDwKw.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};
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-bC7HfQ9r.js";import{r as g,t as _}from"./index-B1N8hQUh.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};