bunqueue-dashboard 0.0.18 → 0.0.20

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 (70) hide show
  1. package/dist/.vite/manifest.json +137 -60
  2. package/dist/assets/AddJob-CaPckiUk.js +3 -0
  3. package/dist/assets/Alerts-B2c0ARdJ.js +1 -0
  4. package/dist/assets/Benchmark-BUCKbeuC.js +1 -0
  5. package/dist/assets/BulkAddJobs-BIUVhw79.js +5 -0
  6. package/dist/assets/{CopilotPanel-C9ojQ_8d.js → CopilotPanel-krCimuWQ.js} +1 -1
  7. package/dist/assets/{CopyButton-BC6QECSJ.js → CopyButton-DvGgfSEm.js} +1 -1
  8. package/dist/assets/{Cron-Bbf7mRaK.js → Cron-DtuiCy5T.js} +1 -1
  9. package/dist/assets/CronManager-CorgubVA.js +1 -0
  10. package/dist/assets/Database-D2Kg4jZ5.js +3 -0
  11. package/dist/assets/Diagnostics-B9eXpr9p.js +1 -0
  12. package/dist/assets/{Dlq-Bs1pupY2.js → Dlq-DYBGJHQ7.js} +1 -1
  13. package/dist/assets/DlqControl-VeRgk2sV.js +1 -0
  14. package/dist/assets/DlqPro-D40bX5wt.js +1 -0
  15. package/dist/assets/Flows-H8j_vUf9.js +1 -0
  16. package/dist/assets/JobInspector-CXzDoEVg.js +2 -0
  17. package/dist/assets/Jobs-CTYa9Wq9.js +1 -0
  18. package/dist/assets/JobsPro-9JG9oKsi.js +1 -0
  19. package/dist/assets/{Logs-yn92V_T8.js → Logs-D4_bxWwW.js} +1 -1
  20. package/dist/assets/LogsPro-DjhlPDzs.js +1 -0
  21. package/dist/assets/{McpServer-CNt7kssG.js → McpServer-BcNGlbb8.js} +1 -1
  22. package/dist/assets/{Metrics-CbscCpvx.js → Metrics-DDxWBIBZ.js} +1 -1
  23. package/dist/assets/MetricsPro-DM__uhdn.js +1 -0
  24. package/dist/assets/{Overview-BOuOPWsb.js → Overview-bPieBOHN.js} +1 -1
  25. package/dist/assets/{Pagination-Bj1z6OlD.js → Pagination-B-6mVPUC.js} +1 -1
  26. package/dist/assets/QueueActions-DPqmozNf.js +1 -0
  27. package/dist/assets/QueueControl-Cxl_GKCw.js +1 -0
  28. package/dist/assets/{QueueDetail-BSUH0Nl6.js → QueueDetail-BaehsuiZ.js} +1 -1
  29. package/dist/assets/QueueDetailPro-CDntEb4E.js +1 -0
  30. package/dist/assets/{Queues-BEQlaWVc.js → Queues-BXwcVq8b.js} +1 -1
  31. package/dist/assets/QueuesOverview-CggwfR_n.js +1 -0
  32. package/dist/assets/{S3Backup-BmRt-Z8V.js → S3Backup-DKegjDS2.js} +1 -1
  33. package/dist/assets/S3BackupPro-BPop6lt3.js +1 -0
  34. package/dist/assets/ServerControl-ELjdOfy0.js +3 -0
  35. package/dist/assets/{Settings-46jsrfhd.js → Settings-CeRzvpaS.js} +1 -1
  36. package/dist/assets/{Usage-BFLZC7pV.js → Usage-nsrrx66q.js} +1 -1
  37. package/dist/assets/UsagePro-DTCHLKue.js +1 -0
  38. package/dist/assets/Webhooks-BSxGyZBk.js +1 -0
  39. package/dist/assets/{Workers-DBXrLvfS.js → Workers-4FvLmhA2.js} +1 -1
  40. package/dist/assets/WorkersPro-EbCgSBaw.js +1 -0
  41. package/dist/assets/exportFile-tdUeW5m5.js +2 -0
  42. package/dist/assets/index-C2XEM9ex.css +1 -0
  43. package/dist/assets/index-DTo6fJH9.js +8 -0
  44. package/dist/assets/promisePool-Daxkc1OB.js +1 -0
  45. package/dist/assets/useThroughputSeries-D8wylrhf.js +1 -0
  46. package/dist/index.html +2 -2
  47. package/package.json +1 -1
  48. package/scripts/embedded.gen.ts +110 -96
  49. package/dist/assets/AddJob-vk3jh1Zk.js +0 -3
  50. package/dist/assets/Benchmark-CpViF2ZC.js +0 -1
  51. package/dist/assets/CronManager-CeNUeoOc.js +0 -1
  52. package/dist/assets/Database--bK9pYZF.js +0 -3
  53. package/dist/assets/Diagnostics-CGJPsWZQ.js +0 -1
  54. package/dist/assets/DlqControl-BLKVzYQC.js +0 -1
  55. package/dist/assets/DlqPro-D8SmIQUs.js +0 -1
  56. package/dist/assets/Flows-BOogljnP.js +0 -1
  57. package/dist/assets/JobInspector-Cp4ZuQGI.js +0 -2
  58. package/dist/assets/Jobs-C2HYkZXi.js +0 -1
  59. package/dist/assets/JobsPro-D0uclU0B.js +0 -1
  60. package/dist/assets/LogsPro-DSiV8Ajj.js +0 -1
  61. package/dist/assets/MetricsPro-CBiFDVne.js +0 -1
  62. package/dist/assets/QueueControl-Bl4l9dT6.js +0 -1
  63. package/dist/assets/QueuesOverview-BBjcyzz2.js +0 -1
  64. package/dist/assets/S3BackupPro-Dsq0erDm.js +0 -1
  65. package/dist/assets/ServerControl-Bhr9FEXF.js +0 -3
  66. package/dist/assets/UsagePro-D0k-82eG.js +0 -1
  67. package/dist/assets/Webhooks-DChTcBSv.js +0 -1
  68. package/dist/assets/WorkersPro-B6I9Ilbq.js +0 -1
  69. package/dist/assets/index-BFjeS9FG.js +0 -8
  70. package/dist/assets/index-BWY8Yofc.css +0 -1
@@ -7,8 +7,8 @@
7
7
  "_react-vendor-CHIHtdAC.js"
8
8
  ]
9
9
  },
10
- "_CopyButton-BC6QECSJ.js": {
11
- "file": "assets/CopyButton-BC6QECSJ.js",
10
+ "_CopyButton-DvGgfSEm.js": {
11
+ "file": "assets/CopyButton-DvGgfSEm.js",
12
12
  "name": "CopyButton",
13
13
  "imports": [
14
14
  "_cn-CMFYpumL.js",
@@ -16,8 +16,8 @@
16
16
  "index.html"
17
17
  ]
18
18
  },
19
- "_Pagination-Bj1z6OlD.js": {
20
- "file": "assets/Pagination-Bj1z6OlD.js",
19
+ "_Pagination-B-6mVPUC.js": {
20
+ "file": "assets/Pagination-B-6mVPUC.js",
21
21
  "name": "Pagination",
22
22
  "imports": [
23
23
  "_cn-CMFYpumL.js",
@@ -25,6 +25,16 @@
25
25
  "index.html"
26
26
  ]
27
27
  },
28
+ "_QueueActions-DPqmozNf.js": {
29
+ "file": "assets/QueueActions-DPqmozNf.js",
30
+ "name": "QueueActions",
31
+ "imports": [
32
+ "_cn-CMFYpumL.js",
33
+ "_react-vendor-CHIHtdAC.js",
34
+ "index.html",
35
+ "_form-PtDLk33Z.js"
36
+ ]
37
+ },
28
38
  "_cn-CMFYpumL.js": {
29
39
  "file": "assets/cn-CMFYpumL.js",
30
40
  "name": "cn"
@@ -37,6 +47,10 @@
37
47
  "_react-vendor-CHIHtdAC.js"
38
48
  ]
39
49
  },
50
+ "_exportFile-tdUeW5m5.js": {
51
+ "file": "assets/exportFile-tdUeW5m5.js",
52
+ "name": "exportFile"
53
+ },
40
54
  "_form-PtDLk33Z.js": {
41
55
  "file": "assets/form-PtDLk33Z.js",
42
56
  "name": "form",
@@ -49,6 +63,10 @@
49
63
  "file": "assets/jobActions-CuOdMglt.js",
50
64
  "name": "jobActions"
51
65
  },
66
+ "_promisePool-Daxkc1OB.js": {
67
+ "file": "assets/promisePool-Daxkc1OB.js",
68
+ "name": "promisePool"
69
+ },
52
70
  "_react-vendor-CHIHtdAC.js": {
53
71
  "file": "assets/react-vendor-CHIHtdAC.js",
54
72
  "name": "react-vendor",
@@ -56,8 +74,17 @@
56
74
  "_cn-CMFYpumL.js"
57
75
  ]
58
76
  },
77
+ "_useThroughputSeries-D8wylrhf.js": {
78
+ "file": "assets/useThroughputSeries-D8wylrhf.js",
79
+ "name": "useThroughputSeries",
80
+ "imports": [
81
+ "_cn-CMFYpumL.js",
82
+ "_react-vendor-CHIHtdAC.js",
83
+ "index.html"
84
+ ]
85
+ },
59
86
  "index.html": {
60
- "file": "assets/index-BFjeS9FG.js",
87
+ "file": "assets/index-DTo6fJH9.js",
61
88
  "name": "index",
62
89
  "src": "index.html",
63
90
  "isEntry": true,
@@ -70,6 +97,7 @@
70
97
  "src/components/copilot/CopilotPanel.tsx",
71
98
  "src/pages/control/AddJob.tsx",
72
99
  "src/pages/control/Benchmark.tsx",
100
+ "src/pages/control/BulkAddJobs.tsx",
73
101
  "src/pages/control/CronManager.tsx",
74
102
  "src/pages/control/Database.tsx",
75
103
  "src/pages/control/Diagnostics.tsx",
@@ -82,12 +110,14 @@
82
110
  "src/pages/control/McpServer.tsx",
83
111
  "src/pages/control/MetricsPro.tsx",
84
112
  "src/pages/control/QueueControl.tsx",
113
+ "src/pages/control/QueueDetailPro.tsx",
85
114
  "src/pages/control/QueuesOverview.tsx",
86
115
  "src/pages/control/S3BackupPro.tsx",
87
116
  "src/pages/control/ServerControl.tsx",
88
117
  "src/pages/control/UsagePro.tsx",
89
118
  "src/pages/control/Webhooks.tsx",
90
119
  "src/pages/control/WorkersPro.tsx",
120
+ "src/pages/Alerts.tsx",
91
121
  "src/pages/Cron.tsx",
92
122
  "src/pages/Dlq.tsx",
93
123
  "src/pages/Jobs.tsx",
@@ -103,7 +133,7 @@
103
133
  "src/lib/demo/install.ts"
104
134
  ],
105
135
  "css": [
106
- "assets/index-BWY8Yofc.css"
136
+ "assets/index-C2XEM9ex.css"
107
137
  ],
108
138
  "assets": [
109
139
  "assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2",
@@ -129,7 +159,7 @@
129
159
  "src": "node_modules/@fontsource-variable/jetbrains-mono/files/jetbrains-mono-latin-wght-normal.woff2"
130
160
  },
131
161
  "src/components/copilot/CopilotPanel.tsx": {
132
- "file": "assets/CopilotPanel-C9ojQ_8d.js",
162
+ "file": "assets/CopilotPanel-krCimuWQ.js",
133
163
  "name": "CopilotPanel",
134
164
  "src": "src/components/copilot/CopilotPanel.tsx",
135
165
  "isDynamicEntry": true,
@@ -146,8 +176,20 @@
146
176
  "src": "src/lib/demo/install.ts",
147
177
  "isDynamicEntry": true
148
178
  },
179
+ "src/pages/Alerts.tsx": {
180
+ "file": "assets/Alerts-B2c0ARdJ.js",
181
+ "name": "Alerts",
182
+ "src": "src/pages/Alerts.tsx",
183
+ "isDynamicEntry": true,
184
+ "imports": [
185
+ "_cn-CMFYpumL.js",
186
+ "_react-vendor-CHIHtdAC.js",
187
+ "index.html",
188
+ "_form-PtDLk33Z.js"
189
+ ]
190
+ },
149
191
  "src/pages/Cron.tsx": {
150
- "file": "assets/Cron-Bbf7mRaK.js",
192
+ "file": "assets/Cron-DtuiCy5T.js",
151
193
  "name": "Cron",
152
194
  "src": "src/pages/Cron.tsx",
153
195
  "isDynamicEntry": true,
@@ -155,11 +197,11 @@
155
197
  "_cn-CMFYpumL.js",
156
198
  "_react-vendor-CHIHtdAC.js",
157
199
  "index.html",
158
- "_Pagination-Bj1z6OlD.js"
200
+ "_Pagination-B-6mVPUC.js"
159
201
  ]
160
202
  },
161
203
  "src/pages/Dlq.tsx": {
162
- "file": "assets/Dlq-Bs1pupY2.js",
204
+ "file": "assets/Dlq-DYBGJHQ7.js",
163
205
  "name": "Dlq",
164
206
  "src": "src/pages/Dlq.tsx",
165
207
  "isDynamicEntry": true,
@@ -168,11 +210,11 @@
168
210
  "_react-vendor-CHIHtdAC.js",
169
211
  "index.html",
170
212
  "_form-PtDLk33Z.js",
171
- "_Pagination-Bj1z6OlD.js"
213
+ "_Pagination-B-6mVPUC.js"
172
214
  ]
173
215
  },
174
216
  "src/pages/Jobs.tsx": {
175
- "file": "assets/Jobs-C2HYkZXi.js",
217
+ "file": "assets/Jobs-CTYa9Wq9.js",
176
218
  "name": "Jobs",
177
219
  "src": "src/pages/Jobs.tsx",
178
220
  "isDynamicEntry": true,
@@ -184,7 +226,7 @@
184
226
  ]
185
227
  },
186
228
  "src/pages/Logs.tsx": {
187
- "file": "assets/Logs-yn92V_T8.js",
229
+ "file": "assets/Logs-D4_bxWwW.js",
188
230
  "name": "Logs",
189
231
  "src": "src/pages/Logs.tsx",
190
232
  "isDynamicEntry": true,
@@ -193,11 +235,11 @@
193
235
  "_react-vendor-CHIHtdAC.js",
194
236
  "index.html",
195
237
  "_form-PtDLk33Z.js",
196
- "_Pagination-Bj1z6OlD.js"
238
+ "_Pagination-B-6mVPUC.js"
197
239
  ]
198
240
  },
199
241
  "src/pages/Metrics.tsx": {
200
- "file": "assets/Metrics-CbscCpvx.js",
242
+ "file": "assets/Metrics-DDxWBIBZ.js",
201
243
  "name": "Metrics",
202
244
  "src": "src/pages/Metrics.tsx",
203
245
  "isDynamicEntry": true,
@@ -207,7 +249,7 @@
207
249
  ]
208
250
  },
209
251
  "src/pages/Overview.tsx": {
210
- "file": "assets/Overview-BOuOPWsb.js",
252
+ "file": "assets/Overview-bPieBOHN.js",
211
253
  "name": "Overview",
212
254
  "src": "src/pages/Overview.tsx",
213
255
  "isDynamicEntry": true,
@@ -217,7 +259,7 @@
217
259
  ]
218
260
  },
219
261
  "src/pages/QueueDetail.tsx": {
220
- "file": "assets/QueueDetail-BSUH0Nl6.js",
262
+ "file": "assets/QueueDetail-BaehsuiZ.js",
221
263
  "name": "QueueDetail",
222
264
  "src": "src/pages/QueueDetail.tsx",
223
265
  "isDynamicEntry": true,
@@ -229,7 +271,7 @@
229
271
  ]
230
272
  },
231
273
  "src/pages/Queues.tsx": {
232
- "file": "assets/Queues-BEQlaWVc.js",
274
+ "file": "assets/Queues-BXwcVq8b.js",
233
275
  "name": "Queues",
234
276
  "src": "src/pages/Queues.tsx",
235
277
  "isDynamicEntry": true,
@@ -237,11 +279,11 @@
237
279
  "_cn-CMFYpumL.js",
238
280
  "_react-vendor-CHIHtdAC.js",
239
281
  "index.html",
240
- "_Pagination-Bj1z6OlD.js"
282
+ "_Pagination-B-6mVPUC.js"
241
283
  ]
242
284
  },
243
285
  "src/pages/S3Backup.tsx": {
244
- "file": "assets/S3Backup-BmRt-Z8V.js",
286
+ "file": "assets/S3Backup-DKegjDS2.js",
245
287
  "name": "S3Backup",
246
288
  "src": "src/pages/S3Backup.tsx",
247
289
  "isDynamicEntry": true,
@@ -251,7 +293,7 @@
251
293
  ]
252
294
  },
253
295
  "src/pages/Settings.tsx": {
254
- "file": "assets/Settings-46jsrfhd.js",
296
+ "file": "assets/Settings-CeRzvpaS.js",
255
297
  "name": "Settings",
256
298
  "src": "src/pages/Settings.tsx",
257
299
  "isDynamicEntry": true,
@@ -264,7 +306,7 @@
264
306
  ]
265
307
  },
266
308
  "src/pages/Usage.tsx": {
267
- "file": "assets/Usage-BFLZC7pV.js",
309
+ "file": "assets/Usage-nsrrx66q.js",
268
310
  "name": "Usage",
269
311
  "src": "src/pages/Usage.tsx",
270
312
  "isDynamicEntry": true,
@@ -274,7 +316,7 @@
274
316
  ]
275
317
  },
276
318
  "src/pages/Workers.tsx": {
277
- "file": "assets/Workers-DBXrLvfS.js",
319
+ "file": "assets/Workers-4FvLmhA2.js",
278
320
  "name": "Workers",
279
321
  "src": "src/pages/Workers.tsx",
280
322
  "isDynamicEntry": true,
@@ -282,11 +324,11 @@
282
324
  "_cn-CMFYpumL.js",
283
325
  "_react-vendor-CHIHtdAC.js",
284
326
  "index.html",
285
- "_Pagination-Bj1z6OlD.js"
327
+ "_Pagination-B-6mVPUC.js"
286
328
  ]
287
329
  },
288
330
  "src/pages/control/AddJob.tsx": {
289
- "file": "assets/AddJob-vk3jh1Zk.js",
331
+ "file": "assets/AddJob-CaPckiUk.js",
290
332
  "name": "AddJob",
291
333
  "src": "src/pages/control/AddJob.tsx",
292
334
  "isDynamicEntry": true,
@@ -298,7 +340,7 @@
298
340
  ]
299
341
  },
300
342
  "src/pages/control/Benchmark.tsx": {
301
- "file": "assets/Benchmark-CpViF2ZC.js",
343
+ "file": "assets/Benchmark-BUCKbeuC.js",
302
344
  "name": "Benchmark",
303
345
  "src": "src/pages/control/Benchmark.tsx",
304
346
  "isDynamicEntry": true,
@@ -308,11 +350,23 @@
308
350
  "index.html",
309
351
  "_form-PtDLk33Z.js",
310
352
  "_AreaChart-DzUXW8u3.js",
311
- "_CopyButton-BC6QECSJ.js"
353
+ "_CopyButton-DvGgfSEm.js"
354
+ ]
355
+ },
356
+ "src/pages/control/BulkAddJobs.tsx": {
357
+ "file": "assets/BulkAddJobs-BIUVhw79.js",
358
+ "name": "BulkAddJobs",
359
+ "src": "src/pages/control/BulkAddJobs.tsx",
360
+ "isDynamicEntry": true,
361
+ "imports": [
362
+ "_cn-CMFYpumL.js",
363
+ "_react-vendor-CHIHtdAC.js",
364
+ "index.html",
365
+ "_form-PtDLk33Z.js"
312
366
  ]
313
367
  },
314
368
  "src/pages/control/CronManager.tsx": {
315
- "file": "assets/CronManager-CeNUeoOc.js",
369
+ "file": "assets/CronManager-CorgubVA.js",
316
370
  "name": "CronManager",
317
371
  "src": "src/pages/control/CronManager.tsx",
318
372
  "isDynamicEntry": true,
@@ -321,11 +375,11 @@
321
375
  "_react-vendor-CHIHtdAC.js",
322
376
  "index.html",
323
377
  "_form-PtDLk33Z.js",
324
- "_Pagination-Bj1z6OlD.js"
378
+ "_Pagination-B-6mVPUC.js"
325
379
  ]
326
380
  },
327
381
  "src/pages/control/Database.tsx": {
328
- "file": "assets/Database--bK9pYZF.js",
382
+ "file": "assets/Database-D2Kg4jZ5.js",
329
383
  "name": "Database",
330
384
  "src": "src/pages/control/Database.tsx",
331
385
  "isDynamicEntry": true,
@@ -334,12 +388,12 @@
334
388
  "_react-vendor-CHIHtdAC.js",
335
389
  "index.html",
336
390
  "_form-PtDLk33Z.js",
337
- "_Pagination-Bj1z6OlD.js",
338
- "_CopyButton-BC6QECSJ.js"
391
+ "_Pagination-B-6mVPUC.js",
392
+ "_CopyButton-DvGgfSEm.js"
339
393
  ]
340
394
  },
341
395
  "src/pages/control/Diagnostics.tsx": {
342
- "file": "assets/Diagnostics-CGJPsWZQ.js",
396
+ "file": "assets/Diagnostics-B9eXpr9p.js",
343
397
  "name": "Diagnostics",
344
398
  "src": "src/pages/control/Diagnostics.tsx",
345
399
  "isDynamicEntry": true,
@@ -350,7 +404,7 @@
350
404
  ]
351
405
  },
352
406
  "src/pages/control/DlqControl.tsx": {
353
- "file": "assets/DlqControl-BLKVzYQC.js",
407
+ "file": "assets/DlqControl-VeRgk2sV.js",
354
408
  "name": "DlqControl",
355
409
  "src": "src/pages/control/DlqControl.tsx",
356
410
  "isDynamicEntry": true,
@@ -359,11 +413,13 @@
359
413
  "_react-vendor-CHIHtdAC.js",
360
414
  "index.html",
361
415
  "_form-PtDLk33Z.js",
362
- "_Pagination-Bj1z6OlD.js"
416
+ "_Pagination-B-6mVPUC.js",
417
+ "_CopyButton-DvGgfSEm.js",
418
+ "_exportFile-tdUeW5m5.js"
363
419
  ]
364
420
  },
365
421
  "src/pages/control/DlqPro.tsx": {
366
- "file": "assets/DlqPro-D8SmIQUs.js",
422
+ "file": "assets/DlqPro-D40bX5wt.js",
367
423
  "name": "DlqPro",
368
424
  "src": "src/pages/control/DlqPro.tsx",
369
425
  "isDynamicEntry": true,
@@ -372,11 +428,13 @@
372
428
  "_react-vendor-CHIHtdAC.js",
373
429
  "index.html",
374
430
  "_form-PtDLk33Z.js",
375
- "_Pagination-Bj1z6OlD.js"
431
+ "_Pagination-B-6mVPUC.js",
432
+ "_exportFile-tdUeW5m5.js",
433
+ "_promisePool-Daxkc1OB.js"
376
434
  ]
377
435
  },
378
436
  "src/pages/control/Flows.tsx": {
379
- "file": "assets/Flows-BOogljnP.js",
437
+ "file": "assets/Flows-H8j_vUf9.js",
380
438
  "name": "Flows",
381
439
  "src": "src/pages/control/Flows.tsx",
382
440
  "isDynamicEntry": true,
@@ -387,7 +445,7 @@
387
445
  ]
388
446
  },
389
447
  "src/pages/control/JobInspector.tsx": {
390
- "file": "assets/JobInspector-Cp4ZuQGI.js",
448
+ "file": "assets/JobInspector-CXzDoEVg.js",
391
449
  "name": "JobInspector",
392
450
  "src": "src/pages/control/JobInspector.tsx",
393
451
  "isDynamicEntry": true,
@@ -396,12 +454,13 @@
396
454
  "_react-vendor-CHIHtdAC.js",
397
455
  "index.html",
398
456
  "_form-PtDLk33Z.js",
399
- "_CopyButton-BC6QECSJ.js",
457
+ "_CopyButton-DvGgfSEm.js",
458
+ "_exportFile-tdUeW5m5.js",
400
459
  "_jobActions-CuOdMglt.js"
401
460
  ]
402
461
  },
403
462
  "src/pages/control/JobsPro.tsx": {
404
- "file": "assets/JobsPro-D0uclU0B.js",
463
+ "file": "assets/JobsPro-9JG9oKsi.js",
405
464
  "name": "JobsPro",
406
465
  "src": "src/pages/control/JobsPro.tsx",
407
466
  "isDynamicEntry": true,
@@ -410,12 +469,13 @@
410
469
  "_react-vendor-CHIHtdAC.js",
411
470
  "index.html",
412
471
  "_form-PtDLk33Z.js",
413
- "_Pagination-Bj1z6OlD.js",
472
+ "_Pagination-B-6mVPUC.js",
473
+ "_exportFile-tdUeW5m5.js",
414
474
  "_jobActions-CuOdMglt.js"
415
475
  ]
416
476
  },
417
477
  "src/pages/control/LogsPro.tsx": {
418
- "file": "assets/LogsPro-DSiV8Ajj.js",
478
+ "file": "assets/LogsPro-DjhlPDzs.js",
419
479
  "name": "LogsPro",
420
480
  "src": "src/pages/control/LogsPro.tsx",
421
481
  "isDynamicEntry": true,
@@ -424,22 +484,22 @@
424
484
  "_react-vendor-CHIHtdAC.js",
425
485
  "index.html",
426
486
  "_form-PtDLk33Z.js",
427
- "_Pagination-Bj1z6OlD.js"
487
+ "_Pagination-B-6mVPUC.js"
428
488
  ]
429
489
  },
430
490
  "src/pages/control/McpServer.tsx": {
431
- "file": "assets/McpServer-CNt7kssG.js",
491
+ "file": "assets/McpServer-BcNGlbb8.js",
432
492
  "name": "McpServer",
433
493
  "src": "src/pages/control/McpServer.tsx",
434
494
  "isDynamicEntry": true,
435
495
  "imports": [
436
496
  "_react-vendor-CHIHtdAC.js",
437
497
  "index.html",
438
- "_CopyButton-BC6QECSJ.js"
498
+ "_CopyButton-DvGgfSEm.js"
439
499
  ]
440
500
  },
441
501
  "src/pages/control/MetricsPro.tsx": {
442
- "file": "assets/MetricsPro-CBiFDVne.js",
502
+ "file": "assets/MetricsPro-DM__uhdn.js",
443
503
  "name": "MetricsPro",
444
504
  "src": "src/pages/control/MetricsPro.tsx",
445
505
  "isDynamicEntry": true,
@@ -447,12 +507,13 @@
447
507
  "_cn-CMFYpumL.js",
448
508
  "_react-vendor-CHIHtdAC.js",
449
509
  "index.html",
450
- "_Pagination-Bj1z6OlD.js",
451
- "_AreaChart-DzUXW8u3.js"
510
+ "_Pagination-B-6mVPUC.js",
511
+ "_AreaChart-DzUXW8u3.js",
512
+ "_useThroughputSeries-D8wylrhf.js"
452
513
  ]
453
514
  },
454
515
  "src/pages/control/QueueControl.tsx": {
455
- "file": "assets/QueueControl-Bl4l9dT6.js",
516
+ "file": "assets/QueueControl-Cxl_GKCw.js",
456
517
  "name": "QueueControl",
457
518
  "src": "src/pages/control/QueueControl.tsx",
458
519
  "isDynamicEntry": true,
@@ -460,11 +521,26 @@
460
521
  "_cn-CMFYpumL.js",
461
522
  "_react-vendor-CHIHtdAC.js",
462
523
  "index.html",
463
- "_form-PtDLk33Z.js"
524
+ "_form-PtDLk33Z.js",
525
+ "_QueueActions-DPqmozNf.js"
526
+ ]
527
+ },
528
+ "src/pages/control/QueueDetailPro.tsx": {
529
+ "file": "assets/QueueDetailPro-CDntEb4E.js",
530
+ "name": "QueueDetailPro",
531
+ "src": "src/pages/control/QueueDetailPro.tsx",
532
+ "isDynamicEntry": true,
533
+ "imports": [
534
+ "_cn-CMFYpumL.js",
535
+ "_react-vendor-CHIHtdAC.js",
536
+ "index.html",
537
+ "_AreaChart-DzUXW8u3.js",
538
+ "_useThroughputSeries-D8wylrhf.js",
539
+ "_QueueActions-DPqmozNf.js"
464
540
  ]
465
541
  },
466
542
  "src/pages/control/QueuesOverview.tsx": {
467
- "file": "assets/QueuesOverview-BBjcyzz2.js",
543
+ "file": "assets/QueuesOverview-CggwfR_n.js",
468
544
  "name": "QueuesOverview",
469
545
  "src": "src/pages/control/QueuesOverview.tsx",
470
546
  "isDynamicEntry": true,
@@ -472,11 +548,12 @@
472
548
  "_cn-CMFYpumL.js",
473
549
  "_react-vendor-CHIHtdAC.js",
474
550
  "index.html",
475
- "_Pagination-Bj1z6OlD.js"
551
+ "_Pagination-B-6mVPUC.js",
552
+ "_promisePool-Daxkc1OB.js"
476
553
  ]
477
554
  },
478
555
  "src/pages/control/S3BackupPro.tsx": {
479
- "file": "assets/S3BackupPro-Dsq0erDm.js",
556
+ "file": "assets/S3BackupPro-BPop6lt3.js",
480
557
  "name": "S3BackupPro",
481
558
  "src": "src/pages/control/S3BackupPro.tsx",
482
559
  "isDynamicEntry": true,
@@ -489,7 +566,7 @@
489
566
  ]
490
567
  },
491
568
  "src/pages/control/ServerControl.tsx": {
492
- "file": "assets/ServerControl-Bhr9FEXF.js",
569
+ "file": "assets/ServerControl-ELjdOfy0.js",
493
570
  "name": "ServerControl",
494
571
  "src": "src/pages/control/ServerControl.tsx",
495
572
  "isDynamicEntry": true,
@@ -498,11 +575,11 @@
498
575
  "_react-vendor-CHIHtdAC.js",
499
576
  "index.html",
500
577
  "_form-PtDLk33Z.js",
501
- "_CopyButton-BC6QECSJ.js"
578
+ "_CopyButton-DvGgfSEm.js"
502
579
  ]
503
580
  },
504
581
  "src/pages/control/UsagePro.tsx": {
505
- "file": "assets/UsagePro-D0k-82eG.js",
582
+ "file": "assets/UsagePro-DTCHLKue.js",
506
583
  "name": "UsagePro",
507
584
  "src": "src/pages/control/UsagePro.tsx",
508
585
  "isDynamicEntry": true,
@@ -512,7 +589,7 @@
512
589
  ]
513
590
  },
514
591
  "src/pages/control/Webhooks.tsx": {
515
- "file": "assets/Webhooks-DChTcBSv.js",
592
+ "file": "assets/Webhooks-BSxGyZBk.js",
516
593
  "name": "Webhooks",
517
594
  "src": "src/pages/control/Webhooks.tsx",
518
595
  "isDynamicEntry": true,
@@ -521,11 +598,11 @@
521
598
  "_react-vendor-CHIHtdAC.js",
522
599
  "index.html",
523
600
  "_form-PtDLk33Z.js",
524
- "_Pagination-Bj1z6OlD.js"
601
+ "_Pagination-B-6mVPUC.js"
525
602
  ]
526
603
  },
527
604
  "src/pages/control/WorkersPro.tsx": {
528
- "file": "assets/WorkersPro-B6I9Ilbq.js",
605
+ "file": "assets/WorkersPro-EbCgSBaw.js",
529
606
  "name": "WorkersPro",
530
607
  "src": "src/pages/control/WorkersPro.tsx",
531
608
  "isDynamicEntry": true,
@@ -0,0 +1,3 @@
1
+ import{r as e}from"./cn-CMFYpumL.js";import{c as t,m as n,r,t as i}from"./react-vendor-CHIHtdAC.js";import{C as a,O as o,S as s,h as c,nt as l,tt as u,w as d}from"./index-DTo6fJH9.js";import{n as f,o as p,t as m}from"./form-PtDLk33Z.js";var h=e(n(),1),g=i(),_=e=>e==null?``:String(e);function v(){let{data:e}=o(()=>u.queues(),[],{intervalMs:3e4}),n=t().state?.clone,i=n?.options??{},[p,v]=(0,h.useState)(n?.queue??``),[b,x]=(0,h.useState)(n?.dataText??`{
2
+ "hello": "world"
3
+ }`),[S,C]=(0,h.useState)(`1`),[w,T]=(0,h.useState)(_(i.priority)),[E,D]=(0,h.useState)(``),[O,k]=(0,h.useState)(``),[A,j]=(0,h.useState)(_(i.maxAttempts)),[M,N]=(0,h.useState)(_(i.backoff)),[P,F]=(0,h.useState)(_(i.timeout)),[I,L]=(0,h.useState)(``),[R,z]=(0,h.useState)(i.removeOnComplete??!1),[B,V]=(0,h.useState)(i.removeOnFail??!1),[H,U]=(0,h.useState)(!1),[W,G]=(0,h.useState)(!1),[K,q]=(0,h.useState)(!1),[J,Y]=(0,h.useState)(null),[X,Z]=(0,h.useState)(null),Q=e=>{let t=Number(e);return e.trim()!==``&&Number.isFinite(t)?t:void 0},$=async()=>{if(Y(null),Z(null),!p.trim()){Y({ok:!1,msg:`Choose a queue`});return}let e;try{e=JSON.parse(b)}catch(e){Z(`Invalid JSON: ${e.message}`);return}let t=Q(E);if(O.trim()){let e=new Date(O).getTime();if(!Number.isFinite(e)){Y({ok:!1,msg:`Run at is not a valid date/time`});return}t=Math.max(0,e-Date.now())}let n={data:e,priority:Q(w),delay:t,maxAttempts:Q(A),backoff:Q(M),timeout:Q(P),jobId:I.trim()||void 0,removeOnComplete:R||void 0,removeOnFail:B||void 0,durable:H||void 0,lifo:W||void 0},r=Q(S)??1;if(!Number.isInteger(r)||r<1){Y({ok:!1,msg:`Count must be an integer of at least 1`});return}if(r>1e4){Y({ok:!1,msg:`Count must be 10000 or fewer`});return}q(!0);try{if(r===1){let e=await u.addJob(p,n);Y({ok:!0,msg:`Created job ${e.id}`}),l.success(`Job created`,`${p} · ${e.id}`)}else{let e=await u.addJobsBulk(p,Array.from({length:r},()=>n)),t=new Set(e.ids).size;Y({ok:!0,msg:`Created ${t} job${t===1?``:`s`}`}),l.success(`Created ${t} job${t===1?``:`s`}`,`in ${p}`)}}catch(e){Y({ok:!1,msg:e.message}),l.error(`Add job failed`,e.message)}finally{q(!1)}};return(0,g.jsxs)(`div`,{children:[(0,g.jsx)(c,{title:`Add Job`,description:`Enqueue a job with full options.`,actions:(0,g.jsx)(r,{to:`/jobs/bulk-add`,className:`rounded-lg border border-line px-3 py-1.5 text-sm text-muted hover:bg-surface-2 hover:text-fg`,children:`Bulk import`})}),n&&(0,g.jsx)(`div`,{className:`mb-4 flex items-center gap-2 rounded-lg border border-accent/30 bg-accent/[0.06] px-4 py-2 text-sm text-accent`,children:`Pre-filled from an existing job. Review the data and options, then enqueue a fresh job.`}),(0,g.jsxs)(`form`,{className:`grid grid-cols-1 gap-6 lg:grid-cols-2`,onSubmit:e=>{e.preventDefault(),$()},children:[(0,g.jsxs)(s,{children:[(0,g.jsx)(a,{title:`Job`}),(0,g.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,g.jsxs)(m,{label:`Queue`,children:[(0,g.jsx)(f,{list:`queue-options`,value:p,onChange:e=>v(e.target.value),placeholder:`queue name (existing or new)`}),(0,g.jsx)(`datalist`,{id:`queue-options`,children:(e?.queues??[]).map(e=>(0,g.jsx)(`option`,{value:e.name},e.name))})]}),(0,g.jsxs)(`div`,{children:[(0,g.jsx)(m,{label:`Data (JSON)`,children:(0,g.jsx)(`textarea`,{value:b,onChange:e=>x(e.target.value),spellCheck:!1,rows:7,className:`w-full rounded-lg border border-line bg-surface-2 p-3 font-mono text-sm text-fg focus:border-accent/60 focus:outline-none focus:ring-2 focus:ring-accent/30`})}),X&&(0,g.jsx)(`p`,{className:`mt-2 text-xs text-danger`,children:X})]})]})]}),(0,g.jsxs)(s,{children:[(0,g.jsx)(a,{title:`Options`}),(0,g.jsxs)(`div`,{className:`grid grid-cols-2 gap-4 md:grid-cols-3`,children:[(0,g.jsx)(m,{label:`Priority`,children:(0,g.jsx)(f,{type:`number`,value:w,onChange:e=>T(e.target.value),placeholder:`0`})}),(0,g.jsx)(m,{label:`Delay (ms)`,children:(0,g.jsx)(f,{type:`number`,min:0,value:E,onChange:e=>D(e.target.value),placeholder:`0`,disabled:O.trim()!==``})}),(0,g.jsx)(m,{label:`Run at`,hint:O.trim()?`Overrides Delay — derived from this time.`:void 0,children:(0,g.jsx)(f,{type:`datetime-local`,value:O,onChange:e=>k(e.target.value)})}),(0,g.jsx)(m,{label:`Max attempts`,children:(0,g.jsx)(f,{type:`number`,min:1,value:A,onChange:e=>j(e.target.value),placeholder:`3`})}),(0,g.jsx)(m,{label:`Backoff (ms)`,children:(0,g.jsx)(f,{type:`number`,min:0,value:M,onChange:e=>N(e.target.value),placeholder:`1000`})}),(0,g.jsx)(m,{label:`Timeout (ms)`,children:(0,g.jsx)(f,{type:`number`,min:0,value:P,onChange:e=>F(e.target.value),placeholder:`—`})}),(0,g.jsx)(m,{label:`Custom job ID`,children:(0,g.jsx)(f,{value:I,onChange:e=>L(e.target.value),placeholder:`idempotency key`})})]}),(0,g.jsxs)(`div`,{className:`mt-4 flex flex-wrap gap-6`,children:[(0,g.jsx)(y,{label:`removeOnComplete`,checked:R,onChange:z}),(0,g.jsx)(y,{label:`removeOnFail`,checked:B,onChange:V}),(0,g.jsx)(y,{label:`durable`,checked:H,onChange:U}),(0,g.jsx)(y,{label:`lifo`,checked:W,onChange:G})]})]}),(0,g.jsxs)(`div`,{className:`flex flex-wrap items-end gap-3 lg:col-span-2`,children:[(0,g.jsx)(`div`,{className:`w-28`,children:(0,g.jsx)(m,{label:`Count`,children:(0,g.jsx)(f,{type:`number`,min:1,value:S,onChange:e=>C(e.target.value)})})}),(0,g.jsx)(d,{type:`submit`,variant:`accent`,disabled:K,children:K?`Adding…`:`Add job`}),J&&(0,g.jsx)(`span`,{className:J.ok?`text-sm text-success`:`text-sm text-danger`,children:J.msg})]})]})]})}function y({label:e,checked:t,onChange:n}){return(0,g.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,g.jsx)(p,{checked:t,onChange:n,label:e}),(0,g.jsx)(`span`,{className:`font-mono text-xs text-muted`,children:e})]})}export{v as AddJob};
@@ -0,0 +1 @@
1
+ import{r as e}from"./cn-CMFYpumL.js";import{m as t,t as n}from"./react-vendor-CHIHtdAC.js";import{J as r,Q as i,S as a,T as o,Z as s,h as c,it as l,j as u,rt as d,u as f,w as p,y as m}from"./index-DTo6fJH9.js";import{a as h,n as g,o as _,t as v}from"./form-PtDLk33Z.js";var y=e(t(),1),b=n(),x=[`email`,`webhook`,`slack`],S=Object.keys(d),C=[`>=`,`>`,`<=`,`<`];function w(){return typeof Notification>`u`?`unsupported`:Notification.permission}function T(){let{channels:e,rules:t,addChannel:n,removeChannel:h,addRule:g,removeRule:v,toggleRule:x}=l(),S=i(e=>e.breaching),[C,T]=(0,y.useState)(!1),[O,k]=(0,y.useState)(w);return(0,b.jsxs)(`div`,{children:[(0,b.jsx)(c,{title:`Alerts`,description:`Threshold rules evaluated live in your browser.`,live:!0,actions:(0,b.jsxs)(b.Fragment,{children:[O===`granted`?(0,b.jsxs)(`span`,{className:`flex items-center gap-1.5 text-sm text-success`,children:[(0,b.jsx)(u,{className:`size-4`}),` Desktop alerts on`]}):O===`unsupported`?(0,b.jsx)(`span`,{className:`text-sm text-faint`,children:`Notifications unsupported`}):(0,b.jsx)(p,{size:`sm`,onClick:async()=>{k(await s())},children:`Enable desktop notifications`}),(0,b.jsx)(p,{variant:`accent`,size:`sm`,onClick:()=>T(e=>!e),children:`+ Create Alert Rule`})]})}),(0,b.jsx)(`div`,{className:`mb-6 rounded-lg border border-amber-500/20 bg-amber-500/5 px-4 py-3 text-sm text-amber-400/90`,children:`Rules are evaluated in this browser while a tab is open (even backgrounded), raising an in-app toast and — if enabled — a desktop notification. bunqueue OSS has no alerting backend, so email/webhook/slack delivery still needs your own monitoring or hosted bunqueue Cloud.`}),(0,b.jsxs)(`section`,{className:`mb-8`,children:[(0,b.jsx)(`h2`,{className:`mb-3 text-lg font-semibold text-fg`,children:`Triggered Alerts`}),S.length===0?(0,b.jsx)(m,{icon:(0,b.jsx)(u,{}),title:`No triggered alerts`,hint:t.some(e=>e.enabled)?`All enabled rules are within their thresholds.`:`No enabled rules yet. Create one below.`}):(0,b.jsx)(`div`,{className:`overflow-x-auto rounded-xl border border-danger/30 bg-red-500/5`,children:(0,b.jsxs)(`table`,{className:`w-full text-sm`,children:[(0,b.jsx)(`thead`,{children:(0,b.jsxs)(`tr`,{className:`border-b border-line text-left text-[11px] uppercase tracking-wider text-faint`,children:[(0,b.jsx)(`th`,{className:`px-5 py-3 font-medium`,children:`Rule`}),(0,b.jsx)(`th`,{className:`px-5 py-3 font-medium`,children:`Condition`}),(0,b.jsx)(`th`,{className:`px-5 py-3 font-medium`,children:`Queue`}),(0,b.jsx)(`th`,{className:`px-5 py-3 text-right font-medium`,children:`Current`}),(0,b.jsx)(`th`,{className:`px-5 py-3 text-right font-medium`,children:`Since`})]})}),(0,b.jsx)(`tbody`,{children:S.map(e=>(0,b.jsxs)(`tr`,{className:`border-b border-line last:border-0`,children:[(0,b.jsx)(`td`,{className:`px-5 py-3 font-medium text-danger`,children:e.ruleName}),(0,b.jsxs)(`td`,{className:`px-5 py-3 text-muted`,children:[e.metricLabel,` `,e.operator,` `,(0,b.jsx)(`span`,{className:`font-semibold text-fg`,children:e.threshold})]}),(0,b.jsx)(`td`,{className:`px-5 py-3 text-muted`,children:e.queue||`All queues`}),(0,b.jsx)(`td`,{className:`px-5 py-3 text-right tnum font-semibold text-danger`,children:Math.round(e.value*100)/100}),(0,b.jsx)(`td`,{className:`px-5 py-3 text-right text-faint`,children:f(e.at)})]},e.ruleId))})]})})]}),(0,b.jsxs)(`section`,{className:`mb-8`,children:[(0,b.jsx)(`h2`,{className:`mb-3 text-lg font-semibold text-fg`,children:`Notification Channels`}),(0,b.jsxs)(a,{children:[e.length===0?(0,b.jsx)(`p`,{className:`mb-4 text-sm text-faint`,children:`No channels yet. Add one below.`}):(0,b.jsx)(`ul`,{className:`mb-4 divide-y divide-line`,children:e.map(e=>(0,b.jsxs)(`li`,{className:`flex items-center justify-between py-2.5`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`div`,{className:`text-sm font-medium capitalize text-fg`,children:e.type}),(0,b.jsx)(`div`,{className:`font-mono text-xs text-faint`,children:e.target})]}),(0,b.jsx)(o,{"aria-label":`Remove channel`,onClick:()=>h(e.id),children:(0,b.jsx)(r,{className:`size-3.5`})})]},e.id))}),(0,b.jsx)(E,{onAdd:n})]})]}),(0,b.jsxs)(`section`,{children:[(0,b.jsx)(`h2`,{className:`mb-3 text-lg font-semibold text-fg`,children:`Alert Rules`}),C&&(0,b.jsx)(a,{className:`mb-4`,children:(0,b.jsx)(D,{onAdd:e=>{g(e),T(!1)}})}),t.length===0?(0,b.jsx)(m,{title:`No alert rules`,hint:`Create a rule to be notified when a threshold is crossed.`}):(0,b.jsx)(`div`,{className:`overflow-x-auto rounded-xl border border-line bg-surface`,children:(0,b.jsxs)(`table`,{className:`w-full text-sm`,children:[(0,b.jsx)(`thead`,{children:(0,b.jsxs)(`tr`,{className:`border-b border-line text-left text-[11px] uppercase tracking-wider text-faint`,children:[(0,b.jsx)(`th`,{className:`px-5 py-3 font-medium`,children:`Rule`}),(0,b.jsx)(`th`,{className:`px-5 py-3 font-medium`,children:`Condition`}),(0,b.jsx)(`th`,{className:`px-5 py-3 font-medium`,children:`Queue`}),(0,b.jsx)(`th`,{className:`px-5 py-3 font-medium`,children:`Channel`}),(0,b.jsx)(`th`,{className:`px-5 py-3 font-medium`,children:`Status`}),(0,b.jsx)(`th`,{className:`w-12 px-5 py-3`})]})}),(0,b.jsx)(`tbody`,{children:t.map(e=>(0,b.jsxs)(`tr`,{className:`border-b border-line last:border-0`,children:[(0,b.jsx)(`td`,{className:`px-5 py-3 font-medium text-fg`,children:e.name}),(0,b.jsxs)(`td`,{className:`px-5 py-3 text-muted`,children:[d[e.metric],` `,e.operator,` `,(0,b.jsx)(`span`,{className:`font-semibold text-accent`,children:e.threshold})]}),(0,b.jsx)(`td`,{className:`px-5 py-3 text-muted`,children:e.queue||`All queues`}),(0,b.jsx)(`td`,{className:`px-5 py-3`,children:(0,b.jsx)(`span`,{className:`rounded-md bg-surface-2 px-2 py-0.5 text-xs capitalize text-muted`,children:e.channel})}),(0,b.jsx)(`td`,{className:`px-5 py-3`,children:(0,b.jsx)(_,{checked:e.enabled,onChange:()=>x(e.id),label:`Enabled`})}),(0,b.jsx)(`td`,{className:`px-5 py-3 text-right`,children:(0,b.jsx)(o,{"aria-label":`Delete rule`,onClick:()=>v(e.id),children:(0,b.jsx)(r,{className:`size-3.5`})})})]},e.id))})]})})]})]})}function E({onAdd:e}){let[t,n]=(0,y.useState)(`email`),[r,i]=(0,y.useState)(``);return(0,b.jsxs)(`div`,{className:`flex flex-wrap items-end gap-3`,children:[(0,b.jsx)(`div`,{className:`w-36`,children:(0,b.jsx)(v,{label:`Type`,children:(0,b.jsx)(h,{value:t,onChange:e=>n(e.target.value),children:x.map(e=>(0,b.jsx)(`option`,{value:e,children:e},e))})})}),(0,b.jsx)(`div`,{className:`min-w-56 flex-1`,children:(0,b.jsx)(v,{label:t===`email`?`Email address`:`URL`,children:(0,b.jsx)(g,{value:r,onChange:e=>i(e.target.value),placeholder:t===`email`?`ops@example.com`:`https://hooks…`})})}),(0,b.jsx)(p,{variant:`accent`,disabled:!r,onClick:()=>{e(t,r),i(``)},children:`Add channel`})]})}function D({onAdd:e}){let[t,n]=(0,y.useState)(``),[r,i]=(0,y.useState)(`error_rate`),[a,o]=(0,y.useState)(`>=`),[s,c]=(0,y.useState)(``),[l,u]=(0,y.useState)(``),[f,m]=(0,y.useState)(`email`);return(0,b.jsxs)(`div`,{className:`grid grid-cols-2 gap-3 md:grid-cols-3 lg:grid-cols-6`,children:[(0,b.jsx)(v,{label:`Name`,children:(0,b.jsx)(g,{value:t,onChange:e=>n(e.target.value),placeholder:`High error rate`})}),(0,b.jsx)(v,{label:`Metric`,children:(0,b.jsx)(h,{value:r,onChange:e=>i(e.target.value),children:S.map(e=>(0,b.jsx)(`option`,{value:e,children:d[e]},e))})}),(0,b.jsx)(v,{label:`Operator`,children:(0,b.jsx)(h,{value:a,onChange:e=>o(e.target.value),children:C.map(e=>(0,b.jsx)(`option`,{value:e,children:e},e))})}),(0,b.jsx)(v,{label:`Threshold`,children:(0,b.jsx)(g,{type:`number`,value:s,onChange:e=>c(e.target.value),placeholder:`55`})}),(0,b.jsx)(v,{label:`Queue (optional)`,children:(0,b.jsx)(g,{value:l,onChange:e=>u(e.target.value),placeholder:`All queues`})}),(0,b.jsx)(v,{label:`Channel`,children:(0,b.jsx)(h,{value:f,onChange:e=>m(e.target.value),children:x.map(e=>(0,b.jsx)(`option`,{value:e,children:e},e))})}),(0,b.jsx)(`div`,{className:`col-span-full`,children:(0,b.jsx)(p,{variant:`accent`,disabled:!t||!s,onClick:()=>e({name:t,metric:r,operator:a,threshold:Number(s),queue:l,channel:f,enabled:!0}),children:`Save rule`})})]})}export{T as Alerts};
@@ -0,0 +1 @@
1
+ import{r as e,t}from"./cn-CMFYpumL.js";import{m as n,t as r}from"./react-vendor-CHIHtdAC.js";import{C as i,H as a,O as o,S as s,U as c,c as l,h as u,m as d,r as f,s as p,tt as m,w as h}from"./index-DTo6fJH9.js";import{i as g,n as _,o as v,t as y}from"./form-PtDLk33Z.js";import{t as b}from"./AreaChart-DzUXW8u3.js";import{t as x}from"./CopyButton-DvGgfSEm.js";var S=e(n(),1),C={total:1e6,batch:5e3,producers:64,payload:65536,workers:64,workerBatch:1e3,processMs:6e4,durationS:600},w={queue:`benchmark`,mode:`count`,total:5e3,durationS:30,batch:100,producers:4,payload:128,workers:4,workerBatch:100,processMs:5,durable:!1,removeOnComplete:!0},T={Smoke:{mode:`count`,total:200,batch:50,producers:2,workers:1,workerBatch:50,processMs:0},Standard:{mode:`count`,total:5e3,batch:100,producers:4,workers:4,workerBatch:100,processMs:5},Stress:{mode:`count`,total:5e4,batch:500,producers:16,workers:16,workerBatch:200,processMs:0},Soak:{mode:`duration`,durationS:30,batch:100,producers:4,workers:8,workerBatch:100,processMs:10}},E=(e,t,n)=>Number.isFinite(e)?Math.max(t,Math.min(n,Math.floor(e))):t,D=(e,t)=>e.length?e[Math.min(e.length-1,Math.floor(t/100*e.length))]:0,O=(e,t,n,r,i)=>Array.from({length:t},(t,a)=>({data:{i:e+a,blob:n},durable:r,removeOnComplete:i})),k=e=>new Promise(t=>setTimeout(t,e)),A=async(e,t)=>{let n=performance.now()+e;for(;t()&&performance.now()<n;)await k(Math.min(100,Math.max(0,n-performance.now())))},j=e=>e instanceof Error?e.message:String(e),M=e=>e>=1e6?`${(e/1e6).toFixed(2)}M`:e>=1e3?`${(e/1e3).toFixed(1)}K`:`${Math.round(e)}`,N=r();function P({history:e,onClear:t}){if(!e.length)return null;let n=JSON.stringify(e,null,2);return(0,N.jsxs)(s,{padded:!1,className:`mt-6 overflow-hidden`,children:[(0,N.jsxs)(`div`,{className:`flex items-center justify-between border-b border-line px-5 py-3`,children:[(0,N.jsx)(`h3`,{className:`text-base font-semibold text-fg`,children:`Run history`}),(0,N.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,N.jsx)(x,{value:n}),(0,N.jsx)(h,{size:`sm`,variant:`ghost`,onClick:()=>{let e=new Blob([n],{type:`application/json`}),t=URL.createObjectURL(e),r=document.createElement(`a`);r.href=t,r.download=`benchmark-history-${Date.now()}.json`,r.click(),URL.revokeObjectURL(t)},children:`Export JSON`}),(0,N.jsx)(h,{size:`sm`,variant:`ghost`,onClick:t,children:`Clear`})]})]}),(0,N.jsx)(`div`,{className:`overflow-x-auto`,children:(0,N.jsxs)(`table`,{className:`w-full text-sm`,children:[(0,N.jsx)(`thead`,{children:(0,N.jsxs)(`tr`,{className:`border-b border-line text-left text-[11px] uppercase tracking-wider text-faint`,children:[(0,N.jsx)(`th`,{className:`px-5 py-2 font-medium`,children:`Mode`}),(0,N.jsx)(`th`,{className:`px-5 py-2 text-right font-medium`,children:`Prod`}),(0,N.jsx)(`th`,{className:`px-5 py-2 text-right font-medium`,children:`Wkr`}),(0,N.jsx)(`th`,{className:`px-5 py-2 text-right font-medium`,children:`Pushed`}),(0,N.jsx)(`th`,{className:`px-5 py-2 text-right font-medium`,children:`Done`}),(0,N.jsx)(`th`,{className:`px-5 py-2 text-right font-medium`,children:`Push/s`}),(0,N.jsx)(`th`,{className:`px-5 py-2 text-right font-medium`,children:`Done/s`}),(0,N.jsx)(`th`,{className:`px-5 py-2 text-right font-medium`,children:`p95`}),(0,N.jsx)(`th`,{className:`px-5 py-2 text-right font-medium`,children:`Dur`})]})}),(0,N.jsx)(`tbody`,{children:e.map(e=>(0,N.jsxs)(`tr`,{className:`border-b border-line last:border-0 hover:bg-surface-2/40`,children:[(0,N.jsx)(`td`,{className:`px-5 py-2 capitalize text-muted`,children:e.mode}),(0,N.jsx)(`td`,{className:`px-5 py-2 text-right tnum text-muted`,children:e.producers}),(0,N.jsx)(`td`,{className:`px-5 py-2 text-right tnum text-muted`,children:e.workers}),(0,N.jsx)(`td`,{className:`px-5 py-2 text-right tnum text-fg`,children:l(e.pushed)}),(0,N.jsx)(`td`,{className:`px-5 py-2 text-right tnum text-success`,children:l(e.completed)}),(0,N.jsxs)(`td`,{className:`px-5 py-2 text-right tnum text-accent`,children:[M(e.pushPerSec),`/s`]}),(0,N.jsxs)(`td`,{className:`px-5 py-2 text-right tnum text-success`,children:[M(e.donePerSec),`/s`]}),(0,N.jsx)(`td`,{className:`px-5 py-2 text-right tnum text-muted`,children:p(e.p95)}),(0,N.jsx)(`td`,{className:`px-5 py-2 text-right tnum text-muted`,children:p(e.durationMs)})]},e.id))})]})})]})}var F={pushed:0,completed:0,pushFailed:0,ackFailed:0,bytes:0,elapsedMs:0,pushPerSec:0,donePerSec:0,activeWorkers:0,pushSeries:[],doneSeries:[],etaMs:null,error:null},I=()=>({pushed:0,completed:0,pushFailed:0,ackFailed:0,bytes:0,assigned:0,startedAt:0,pushLat:[],activeWorkers:0,error:null,lastAt:0,lastPushed:0,lastDone:0,pushSeries:[],doneSeries:[]}),L=0;function R(){let[e,t]=(0,S.useState)(`idle`),[n,r]=(0,S.useState)(F),[i,a]=(0,S.useState)(null),[o,s]=(0,S.useState)([]),[c,l]=(0,S.useState)(null),u=(0,S.useRef)(!1),d=(0,S.useRef)(!1),f=(0,S.useRef)(!1),p=(0,S.useRef)(null),h=(0,S.useRef)(`idle`);h.current=e;let g=(0,S.useRef)(I());return(0,S.useEffect)(()=>()=>{u.current=!0},[]),(0,S.useEffect)(()=>{if(e!==`running`&&e!==`draining`)return;let t=setInterval(()=>{let e=g.current,t=performance.now(),n=t-e.startedAt,i=(t-e.lastAt)/1e3,a=i>0?Math.max(0,(e.pushed-e.lastPushed)/i):0,o=i>0?Math.max(0,(e.completed-e.lastDone)/i):0;e.lastAt=t,e.lastPushed=e.pushed,e.lastDone=e.completed,e.pushSeries=[...e.pushSeries,a].slice(-60),e.doneSeries=[...e.doneSeries,o].slice(-60);let s=null,c=p.current;if(c&&c.mode===`count`){let t=E(c.total,1,C.total);if(h.current===`draining`){let r=e.doneSeries.slice(-10),i=r.length?r.reduce((e,t)=>e+t,0)/r.length:0;i<=0&&n>0&&(i=e.completed/(n/1e3)),i>0&&(s=Math.max(0,t-e.completed)/i*1e3)}else a>0&&(s=Math.max(0,t-e.pushed)/a*1e3)}else c&&c.mode===`duration`&&(s=Math.max(0,E(c.durationS,1,C.durationS)*1e3-n));r({pushed:e.pushed,completed:e.completed,pushFailed:e.pushFailed,ackFailed:e.ackFailed,bytes:e.bytes,elapsedMs:n,pushPerSec:a,donePerSec:o,activeWorkers:e.activeWorkers,pushSeries:e.pushSeries,doneSeries:e.doneSeries,etaMs:s,error:e.error})},200);return()=>clearInterval(t)},[e]),{phase:e,live:n,summary:i,history:o,runCfg:c,run:async e=>{if(!d.current){d.current=!0;try{a(null);let n=e.queue.trim();if(!n){r({...F,error:`Queue name is required.`}),t(`error`);return}try{await m.overview()}catch(e){r({...F,error:`Server unreachable — start it on the Server page first. (${j(e)})`}),t(`error`);return}let i=E(e.total,1,C.total),o=E(e.durationS,1,C.durationS)*1e3,c=E(e.batch,1,C.batch),d=E(e.producers,e.mode===`duration`?0:1,C.producers),_=E(e.payload,0,C.payload),v=E(e.workers,0,C.workers),y=E(e.workerBatch,1,C.workerBatch),b=E(e.processMs,0,C.processMs);u.current=!1,f.current=!1,p.current=e,l(e),g.current=I(),g.current.startedAt=performance.now(),g.current.lastAt=performance.now(),r({...F}),t(`running`);let x=`x`.repeat(_),S=performance.now()+o,w=async()=>{for(;!u.current;){let t;if(e.mode===`count`){if(g.current.assigned>=i)break;t=Math.min(c,i-g.current.assigned)}else{if(performance.now()>=S)break;t=c}let r=g.current.assigned;g.current.assigned+=t;let a=O(r,t,x,e.durable,e.removeOnComplete),o=performance.now();try{await m.addJobsBulk(n,a),g.current.pushed+=t,g.current.bytes+=t*_}catch(e){g.current.pushFailed+=t,g.current.error??=j(e)}g.current.pushLat.push(performance.now()-o)}},T=async()=>{for(;!u.current&&!(e.mode===`duration`&&performance.now()>=S||e.mode===`count`&&g.current.completed>=i);){g.current.activeWorkers++;let t=[];try{try{t=(await m.pullBatch(n,y)).jobs??[]}catch(e){g.current.error??=j(e)}if(t.length>0){b>0&&await A(b,()=>!u.current);try{await m.ackBatch(t.map(e=>e.id)),g.current.completed+=t.length}catch(e){g.current.ackFailed+=t.length,g.current.error??=j(e)}}}finally{g.current.activeWorkers--}if(t.length===0){if(e.mode===`count`&&f.current)break;await k(50)}}},M=Array.from({length:d},w),N=Array.from({length:v},T),P=Promise.all(M).then(()=>{f.current=!0,!u.current&&e.mode===`count`&&v>0&&h.current===`running`&&t(`draining`)});await Promise.all([P,...N]);let R=g.current,z=performance.now()-R.startedAt,B=z/1e3||1,V=[...R.pushLat].sort((e,t)=>e-t),H={pushed:R.pushed,completed:R.completed,pushFailed:R.pushFailed,ackFailed:R.ackFailed,bytes:R.bytes,durationMs:z,pushPerSec:R.pushed/B,donePerSec:R.completed/B,mbPerSec:R.bytes/B,avg:V.length?V.reduce((e,t)=>e+t,0)/V.length:0,p50:D(V,50),p95:D(V,95),p99:D(V,99),max:V.length?V[V.length-1]:0,error:R.error};a(H),r(e=>({...e,pushed:R.pushed,completed:R.completed,elapsedMs:z,pushPerSec:0,donePerSec:0,activeWorkers:0,etaMs:0})),s(t=>[{...H,id:++L,at:Date.now(),mode:e.mode,producers:d,workers:v},...t].slice(0,12)),t(u.current?`stopped`:`done`)}finally{d.current=!1}}},stop:()=>{u.current=!0,(h.current===`running`||h.current===`draining`)&&t(`stopping`)},reset:()=>{u.current=!0,a(null),r(F),t(`idle`)},clearHistory:()=>s([])}}var z=[`count`,`duration`],B=[`total`,`durationS`,`batch`,`producers`,`payload`,`workers`,`workerBatch`,`processMs`],V=e=>({...e,total:String(e.total),durationS:String(e.durationS),batch:String(e.batch),producers:String(e.producers),payload:String(e.payload),workers:String(e.workers),workerBatch:String(e.workerBatch),processMs:String(e.processMs)}),H=e=>({...e,total:Number(e.total),durationS:Number(e.durationS),batch:Number(e.batch),producers:Number(e.producers),payload:Number(e.payload),workers:Number(e.workers),workerBatch:Number(e.workerBatch),processMs:Number(e.processMs)});function U(){let[e,n]=(0,S.useState)(()=>V(w)),r=R(),{phase:x,live:D,summary:O,history:k}=r,A=x===`running`||x===`draining`||x===`stopping`,j=(e,t)=>n(n=>({...n,[e]:t})),F=e=>t=>j(e,t.target.value),I=e=>n(t=>{let n={...t};for(let[t,r]of Object.entries(e))n[t]=B.includes(t)?String(r):r;return n}),[L,U]=(0,S.useState)(w.queue);(0,S.useEffect)(()=>{let t=setTimeout(()=>U(e.queue.trim()||w.queue),400);return()=>clearTimeout(t)},[e.queue]);let{data:ee,error:te}=o(()=>m.counts(L),[L],{intervalMs:1e3}),K=ee?.counts??null,[q,J]=(0,S.useState)(!1),[Y,X]=(0,S.useState)(null),ne=async()=>{let t=e.queue.trim();if(!(q||!t||!window.confirm(`Remove benchmark jobs from "${t}"?`))){J(!0),X(null);try{let e=null;for(let n of[`waiting`,`completed`,`failed`,`delayed`])try{await m.clean(t,{state:n,limit:C.total})}catch(t){e=t.message}let n=await m.counts(t).catch(t=>(e=t.message,null));X(n==null?{error:e??`server unreachable — could not verify`}:{remaining:n.counts?.active??0})}finally{J(!1)}}},Z=r.runCfg??H(e),Q=E(Z.total,1,C.total),$=E(Z.workers,0,C.workers),re=Z.mode===`count`&&(A||O)?Math.min(100,D.pushed/Q*100):0,ie=Z.mode===`count`&&(A||O)?Math.min(100,D.completed/Q*100):0,ae=Z.mode===`duration`?Math.min(100,D.elapsedMs/(E(Z.durationS,1,C.durationS)*1e3)*100):0,oe=x===`running`?Z.mode===`duration`?`Running…`:`Producing…`:x===`draining`?`Draining…`:x===`stopping`?`Stopping…`:x===`error`?`Error`:O?`Result`:`Ready`,se=(x===`running`||x===`draining`)&&D.etaMs!=null?D.etaMs>0?`ETA ${p(D.etaMs)}`:`finishing…`:x===`stopped`?`stopped early`:x===`done`?`complete`:``;return(0,N.jsxs)(`div`,{children:[(0,N.jsx)(u,{title:`Benchmark`,description:`Drive real load against the server — producers bulk-enqueue jobs while simulated workers pull, process and ack them. Throughput is measured client-side; the queue genuinely fills and drains.`,actions:x===`stopping`?(0,N.jsxs)(h,{variant:`warning`,size:`sm`,disabled:!0,children:[(0,N.jsx)(a,{className:`size-3.5`}),` Stopping…`]}):A?(0,N.jsxs)(h,{variant:`warning`,size:`sm`,onClick:r.stop,children:[(0,N.jsx)(a,{className:`size-3.5`}),` Stop`]}):(0,N.jsxs)(h,{variant:`success`,size:`sm`,onClick:()=>r.run(H(e)),children:[(0,N.jsx)(c,{className:`size-3.5`}),` Run benchmark`]})}),D.error&&(0,N.jsx)(`div`,{className:`mb-4 rounded-lg border border-red-500/20 bg-red-500/5 px-4 py-2 text-sm text-danger`,children:D.error}),(0,N.jsxs)(`div`,{className:`mb-4 flex flex-wrap items-center gap-2`,children:[(0,N.jsx)(`span`,{className:`text-xs font-medium uppercase tracking-wider text-faint`,children:`Presets`}),Object.keys(T).map(e=>(0,N.jsx)(`button`,{type:`button`,disabled:A,onClick:()=>I(T[e]),className:`rounded-md border border-line bg-surface-2 px-2.5 py-1 text-xs text-muted transition-colors hover:border-line-strong hover:text-fg disabled:opacity-40`,children:e},e))]}),(0,N.jsxs)(`div`,{className:`grid grid-cols-1 gap-6 lg:grid-cols-3`,children:[(0,N.jsxs)(s,{className:`lg:col-span-1`,children:[(0,N.jsx)(i,{title:`Configuration`}),(0,N.jsxs)(`div`,{className:`flex flex-col gap-3`,children:[(0,N.jsx)(y,{label:`Queue`,hint:`Jobs are enqueued here (created on first push).`,children:(0,N.jsx)(_,{value:e.queue,disabled:A,onChange:e=>j(`queue`,e.target.value)})}),(0,N.jsx)(y,{label:`Mode`,hint:e.mode===`count`?`Push a fixed number of jobs.`:`Run producers + workers for a fixed time.`,children:(0,N.jsx)(g,{options:z,value:e.mode,onChange:e=>j(`mode`,e),disabled:A})}),e.mode===`count`?(0,N.jsx)(y,{label:`Total jobs`,hint:`max ${l(C.total)}`,children:(0,N.jsx)(_,{type:`number`,min:1,max:C.total,value:e.total,disabled:A,onChange:F(`total`)})}):(0,N.jsx)(y,{label:`Duration (s)`,hint:`max ${C.durationS}s`,children:(0,N.jsx)(_,{type:`number`,min:1,max:C.durationS,value:e.durationS,disabled:A,onChange:F(`durationS`)})}),(0,N.jsx)(`div`,{className:`mt-1 text-[11px] font-semibold uppercase tracking-wider text-faint`,children:`Producers`}),(0,N.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,N.jsx)(y,{label:`Producers`,hint:`parallel, max ${C.producers}`,children:(0,N.jsx)(_,{type:`number`,min:e.mode===`duration`?0:1,max:C.producers,value:e.producers,disabled:A,onChange:F(`producers`)})}),(0,N.jsx)(y,{label:`Push batch`,hint:`jobs/req, max ${C.batch}`,children:(0,N.jsx)(_,{type:`number`,min:1,max:C.batch,value:e.batch,disabled:A,onChange:F(`batch`)})}),(0,N.jsx)(y,{label:`Payload`,hint:`bytes/job, max ${l(C.payload)}`,children:(0,N.jsx)(_,{type:`number`,min:0,max:C.payload,value:e.payload,disabled:A,onChange:F(`payload`)})})]}),(0,N.jsx)(`div`,{className:`mt-1 text-[11px] font-semibold uppercase tracking-wider text-faint`,children:`Workers (simulated)`}),(0,N.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,N.jsx)(y,{label:`Workers`,hint:`0 = produce only, max ${C.workers}`,children:(0,N.jsx)(_,{type:`number`,min:0,max:C.workers,value:e.workers,disabled:A,onChange:F(`workers`)})}),(0,N.jsx)(y,{label:`Pull batch`,hint:`jobs/pull, max ${C.workerBatch}`,children:(0,N.jsx)(_,{type:`number`,min:1,max:C.workerBatch,value:e.workerBatch,disabled:A,onChange:F(`workerBatch`)})}),(0,N.jsx)(y,{label:`Process (ms)`,hint:`simulated work per pull`,children:(0,N.jsx)(_,{type:`number`,min:0,max:C.processMs,value:e.processMs,disabled:A,onChange:F(`processMs`)})})]}),(0,N.jsxs)(`label`,{className:`flex cursor-pointer items-center gap-2`,children:[(0,N.jsx)(v,{checked:e.durable,onChange:e=>j(`durable`,e),disabled:A}),(0,N.jsx)(`span`,{className:`text-sm text-muted`,children:`Durable (fsync each job)`})]}),(0,N.jsxs)(`label`,{className:`flex cursor-pointer items-center gap-2`,children:[(0,N.jsx)(v,{checked:e.removeOnComplete,onChange:e=>j(`removeOnComplete`,e),disabled:A}),(0,N.jsx)(`span`,{className:`text-sm text-muted`,children:`Remove on complete`})]}),(0,N.jsxs)(`div`,{className:`flex items-center gap-3 pt-1`,children:[(0,N.jsx)(h,{variant:`ghost`,size:`sm`,disabled:A||q,onClick:ne,children:q?`Cleaning…`:`Clean queue`}),Y&&(`error`in Y?(0,N.jsxs)(`span`,{className:`text-xs text-danger`,children:[`Clean unverified — `,Y.error]}):(0,N.jsx)(`span`,{className:t(`text-xs`,Y.remaining>0?`text-warning`:`text-success`),children:Y.remaining>0?`Cleaned — ${l(Y.remaining)} active job(s) remain (requeued after the stall timeout)`:`Cleaned — 0 jobs remain`}))]})]})]}),(0,N.jsxs)(`div`,{className:`flex flex-col gap-6 lg:col-span-2`,children:[(0,N.jsxs)(s,{children:[(0,N.jsxs)(`div`,{className:`mb-3 flex items-center justify-between`,children:[(0,N.jsx)(`h3`,{className:`text-base font-semibold text-fg`,children:oe}),(0,N.jsx)(`span`,{className:`text-xs text-faint`,children:se})]}),(0,N.jsx)(W,{label:Z.mode===`duration`?`Elapsed`:`Produced`,pct:Z.mode===`duration`?ae:re,tone:`accent`}),$>0&&Z.mode===`count`&&(0,N.jsx)(W,{label:`Completed`,pct:ie,tone:`emerald`}),(0,N.jsxs)(`div`,{className:`mt-4 grid grid-cols-2 gap-4 md:grid-cols-4`,children:[(0,N.jsx)(d,{label:`Pushed`,value:l(D.pushed),tone:`accent`,compact:!0}),(0,N.jsx)(d,{label:`Completed`,value:l(D.completed),tone:`green`,compact:!0}),(0,N.jsx)(d,{label:`Push/sec`,value:M(D.pushPerSec),compact:!0}),(0,N.jsx)(d,{label:`Done/sec`,value:M(D.donePerSec),tone:`green`,compact:!0}),(0,N.jsx)(d,{label:`Elapsed`,value:p(D.elapsedMs),compact:!0}),(0,N.jsx)(d,{label:`Active workers`,value:`${D.activeWorkers}/${$}`,tone:`blue`,compact:!0}),(0,N.jsx)(d,{label:`Data`,value:f(O?.bytes??D.bytes),compact:!0}),(0,N.jsx)(d,{label:`Errors`,value:l((O?.pushFailed??D.pushFailed)+(O?.ackFailed??D.ackFailed)),tone:D.pushFailed+D.ackFailed?`red`:`default`,compact:!0})]})]}),(0,N.jsxs)(s,{children:[(0,N.jsx)(i,{title:`Throughput`}),(0,N.jsx)(`p`,{className:`-mt-3 mb-4 text-xs text-faint`,children:`Enqueue (client → server) vs completion (workers) per second`}),(0,N.jsx)(b,{series:[{label:`Push/sec`,color:`#38bdf8`,points:D.pushSeries,area:!0},{label:`Done/sec`,color:`#34d399`,points:D.doneSeries,area:!0}]}),(0,N.jsxs)(`div`,{className:`mt-2 flex items-center gap-4 font-mono text-[11px] text-faint`,children:[(0,N.jsx)(G,{color:`#38bdf8`,label:`Push/sec`,value:D.pushPerSec}),(0,N.jsx)(G,{color:`#34d399`,label:`Done/sec`,value:D.donePerSec})]})]})]})]}),O&&(0,N.jsxs)(s,{className:`mt-6`,children:[(0,N.jsx)(i,{title:`Summary`}),(0,N.jsxs)(`div`,{className:`grid grid-cols-2 gap-4 md:grid-cols-4 xl:grid-cols-8`,children:[(0,N.jsx)(d,{label:`Pushed`,value:l(O.pushed),tone:`accent`,compact:!0}),(0,N.jsx)(d,{label:`Completed`,value:l(O.completed),tone:`green`,compact:!0}),(0,N.jsx)(d,{label:`Duration`,value:p(O.durationMs),compact:!0}),(0,N.jsx)(d,{label:`Avg push/s`,value:M(O.pushPerSec),tone:`accent`,compact:!0}),(0,N.jsx)(d,{label:`Avg done/s`,value:M(O.donePerSec),tone:`green`,compact:!0}),(0,N.jsx)(d,{label:`Data rate`,value:`${f(O.mbPerSec)}/s`,compact:!0}),(0,N.jsx)(d,{label:`Push p95`,value:p(O.p95),compact:!0}),(0,N.jsx)(d,{label:`Push p99`,value:p(O.p99),compact:!0})]}),(0,N.jsxs)(`p`,{className:`mt-3 text-xs text-faint`,children:[`Push-batch latency avg `,p(O.avg),` · p50 `,p(O.p50),` · p95`,` `,p(O.p95),` · p99 `,p(O.p99),` · max `,p(O.max),`.`,O.error?` First error: ${O.error}`:``]})]}),(0,N.jsxs)(s,{className:`mt-6`,children:[(0,N.jsx)(i,{title:`Server queue: ${L}`,action:te?(0,N.jsx)(`span`,{className:`text-xs font-medium text-warning`,children:`stale — server unreachable`}):void 0}),(0,N.jsx)(`p`,{className:`-mt-3 mb-4 text-xs text-faint`,children:`Live counts from the server (poll 1s).`}),K?(0,N.jsxs)(`div`,{className:`grid grid-cols-2 gap-4 md:grid-cols-5`,children:[(0,N.jsx)(d,{label:`Waiting`,value:l(K.waiting??0),tone:`amber`,compact:!0}),(0,N.jsx)(d,{label:`Active`,value:l(K.active??0),tone:`blue`,compact:!0}),(0,N.jsx)(d,{label:`Completed`,value:l(K.completed??0),tone:`green`,compact:!0}),(0,N.jsx)(d,{label:`Failed`,value:l(K.failed??0),tone:K.failed?`red`:`default`,compact:!0}),(0,N.jsx)(d,{label:`Delayed`,value:l(K.delayed??0),compact:!0})]}):(0,N.jsx)(`p`,{className:`text-sm text-faint`,children:`No counts yet — waiting for the server to answer for this queue.`})]}),(0,N.jsx)(P,{history:k,onClear:r.clearHistory})]})}function W({label:e,pct:n,tone:r}){return(0,N.jsxs)(`div`,{className:`mb-2`,children:[(0,N.jsxs)(`div`,{className:`mb-1 flex items-center justify-between text-[11px] text-faint`,children:[(0,N.jsx)(`span`,{children:e}),(0,N.jsxs)(`span`,{className:`tnum`,children:[n.toFixed(0),`%`]})]}),(0,N.jsx)(`div`,{className:`h-1.5 overflow-hidden rounded-full bg-surface-2`,children:(0,N.jsx)(`div`,{className:t(`h-full rounded-full transition-all`,r===`accent`?`bg-accent`:`bg-emerald-500`),style:{width:`${n}%`}})})]})}function G({color:e,label:t,value:n}){return(0,N.jsxs)(`span`,{className:`flex items-center gap-1.5`,children:[(0,N.jsx)(`span`,{className:`size-2 rounded-full`,style:{background:e}}),t,` `,(0,N.jsxs)(`span`,{className:`text-fg`,children:[M(n),`/s`]})]})}export{U as Benchmark};
@@ -0,0 +1,5 @@
1
+ import{r as e}from"./cn-CMFYpumL.js";import{m as t,t as n}from"./react-vendor-CHIHtdAC.js";import{C as r,O as i,S as a,h as o,nt as s,tt as c,w as l}from"./index-DTo6fJH9.js";import{i as u,n as d,t as f}from"./form-PtDLk33Z.js";var p=e(t(),1),m=n(),h=1e4,g=`[
2
+ { "data": { "to": "a@example.com", "template": "welcome" }, "priority": 1 },
3
+ { "data": { "to": "b@example.com", "template": "welcome" } }
4
+ ]`,_=e=>{let t=Number(e);return e.trim()!==``&&Number.isFinite(t)?t:void 0},v=e=>typeof e==`number`&&Number.isFinite(e)?e:void 0,y=e=>typeof e==`boolean`?e:void 0,b=e=>typeof e==`string`&&e!==``?e:void 0;function x(e,t,n){if(n===`spec`&&e&&typeof e==`object`&&!Array.isArray(e)&&`data`in e){let n=e;return{data:n.data,priority:v(n.priority)??t.priority,delay:v(n.delay),maxAttempts:v(n.maxAttempts)??t.maxAttempts,backoff:v(n.backoff)??t.backoff,timeout:v(n.timeout)??t.timeout,jobId:b(n.jobId),removeOnComplete:y(n.removeOnComplete),removeOnFail:y(n.removeOnFail),durable:y(n.durable),lifo:y(n.lifo),ttl:v(n.ttl),uniqueKey:b(n.uniqueKey)}}return{data:e,...t}}var S=new Set([`data`,`priority`,`delay`,`maxAttempts`,`backoff`,`timeout`,`jobId`,`removeOnComplete`,`removeOnFail`,`durable`,`lifo`,`ttl`,`uniqueKey`]);function C(e){return e.some(e=>typeof e==`object`&&!!e&&!Array.isArray(e)&&`data`in e&&Object.keys(e).some(e=>!S.has(e)))}function w(e){let t=e.trim();if(!t)return{items:[],error:null};try{let e=JSON.parse(t);return Array.isArray(e)?{items:e,error:null}:{items:[e],error:null}}catch{}let n=[],r=t.split(`
5
+ `);for(let e=0;e<r.length;e++){let t=r[e].trim();if(t)try{n.push(JSON.parse(t))}catch(t){return{items:[],error:`Line ${e+1}: ${t.message}`}}}return{items:n,error:null}}function T(){let{data:e}=i(()=>c.queues(),[],{intervalMs:3e4}),[t,n]=(0,p.useState)(``),[v,y]=(0,p.useState)(``),[b,S]=(0,p.useState)(`spec`),[T,E]=(0,p.useState)(``),[D,O]=(0,p.useState)(``),[k,A]=(0,p.useState)(``),[j,M]=(0,p.useState)(``),[N,P]=(0,p.useState)(!1),[F,I]=(0,p.useState)(null),{items:L,error:R}=(0,p.useMemo)(()=>w(v),[v]),z=b===`spec`&&!R&&C(L);return(0,m.jsxs)(`div`,{children:[(0,m.jsx)(o,{title:`Bulk Add Jobs`,description:`Import many distinct jobs at once from a JSON array, NDJSON, or a file.`}),(0,m.jsxs)(`div`,{className:`grid grid-cols-1 gap-6 lg:grid-cols-3`,children:[(0,m.jsxs)(a,{className:`lg:col-span-2`,children:[(0,m.jsx)(r,{title:`Jobs`,action:(0,m.jsxs)(`label`,{className:`cursor-pointer rounded-lg border border-line px-3 py-1.5 text-xs text-muted hover:bg-surface-2 hover:text-fg`,children:[`Upload file`,(0,m.jsx)(`input`,{type:`file`,accept:`.json,.ndjson,.txt,application/json`,onChange:e=>{let t=e.target.files?.[0];if(!t)return;let n=new FileReader;n.onload=()=>y(String(n.result??``)),n.onerror=()=>I({ok:!1,msg:`Could not read file`}),n.readAsText(t),e.target.value=``},className:`hidden`})]})}),(0,m.jsx)(`textarea`,{value:v,onChange:e=>y(e.target.value),spellCheck:!1,rows:16,placeholder:g,"aria-label":`Jobs JSON`,className:`w-full rounded-lg border border-line bg-surface-2 p-3 font-mono text-xs text-fg placeholder:text-faint focus:border-accent/60 focus:outline-none focus:ring-2 focus:ring-accent/30`}),(0,m.jsxs)(`div`,{className:`mt-3 flex flex-wrap items-center gap-3`,children:[(0,m.jsx)(`span`,{className:`text-xs font-medium text-faint`,children:`Interpret each item as`}),(0,m.jsx)(u,{options:[`spec`,`raw`],value:b,onChange:S}),(0,m.jsx)(`span`,{className:`text-xs text-faint`,children:b===`spec`?`job spec: an object with a "data" key sets options from its sibling fields.`:`raw data: the whole item becomes the job payload, untouched.`})]}),(0,m.jsx)(`p`,{className:`mt-2 text-xs text-faint`,children:`Accepts a JSON array, a single object, or newline-delimited JSON.`}),(0,m.jsx)(`div`,{className:`mt-2 text-sm`,children:R?(0,m.jsx)(`span`,{className:`text-danger`,children:R}):L.length>0?(0,m.jsxs)(`span`,{className:`text-success`,children:[L.length,` job(s) parsed ✓`]}):(0,m.jsx)(`span`,{className:`text-faint`,children:`Nothing parsed yet.`})}),z&&(0,m.jsx)(`p`,{className:`mt-2 text-xs text-warning`,children:`Some items carry keys beyond the known job options — in “spec” mode those keys are dropped. Switch to “raw” to keep every field as the job's data.`})]}),(0,m.jsxs)(a,{children:[(0,m.jsx)(r,{title:`Target & defaults`}),(0,m.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,m.jsxs)(f,{label:`Queue`,children:[(0,m.jsx)(d,{list:`bulk-queue-options`,value:t,onChange:e=>n(e.target.value),placeholder:`queue name (existing or new)`}),(0,m.jsx)(`datalist`,{id:`bulk-queue-options`,children:(e?.queues??[]).map(e=>(0,m.jsx)(`option`,{value:e.name},e.name))})]}),(0,m.jsx)(`p`,{className:`-mt-2 text-xs text-faint`,children:`Defaults below fill any field an item omits.`}),(0,m.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,m.jsx)(f,{label:`Priority`,children:(0,m.jsx)(d,{type:`number`,value:T,onChange:e=>E(e.target.value),placeholder:`0`})}),(0,m.jsx)(f,{label:`Max attempts`,children:(0,m.jsx)(d,{type:`number`,value:D,onChange:e=>O(e.target.value),placeholder:`3`})}),(0,m.jsx)(f,{label:`Backoff (ms)`,children:(0,m.jsx)(d,{type:`number`,value:k,onChange:e=>A(e.target.value),placeholder:`1000`})}),(0,m.jsx)(f,{label:`Timeout (ms)`,children:(0,m.jsx)(d,{type:`number`,value:j,onChange:e=>M(e.target.value),placeholder:`—`})})]}),(0,m.jsx)(`div`,{className:`flex items-center gap-3`,children:(0,m.jsx)(l,{variant:`accent`,disabled:N||L.length===0||R!=null,onClick:async()=>{if(I(null),!t.trim()){I({ok:!1,msg:`Choose a queue`});return}if(R){I({ok:!1,msg:R});return}if(L.length===0){I({ok:!1,msg:`Nothing to enqueue — paste a JSON array or NDJSON.`});return}if(L.length>h){I({ok:!1,msg:`Too many jobs (${L.length}). Limit is ${h}.`});return}let e={priority:_(T),maxAttempts:_(D),backoff:_(k),timeout:_(j)},n=L.map(t=>x(t,e,b));P(!0);try{let e=await c.addJobsBulk(t,n),r=new Set(e.ids).size,i=`Created ${r} job${r===1?``:`s`} in ${t}`;I({ok:!0,msg:i}),s.success(i)}catch(e){let t=e.message;I({ok:!1,msg:t}),s.error(`Bulk import failed`,t)}finally{P(!1)}},children:N?`Importing…`:`Import ${L.length||``}`})}),F&&(0,m.jsx)(`span`,{className:F.ok?`text-sm text-success`:`text-sm text-danger`,children:F.msg})]})]})]})]})}export{T as BulkAddJobs};