bullmq-dash 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/data/jobs.d.ts +2 -2
- package/dist/data/jobs.d.ts.map +1 -1
- package/dist/data/queues.d.ts +1 -0
- package/dist/data/queues.d.ts.map +1 -1
- package/dist/index.js +27 -22
- package/dist/index.js.map +12 -12
- package/dist/state.d.ts +3 -3
- package/dist/state.d.ts.map +1 -1
- package/dist/ui/colors.d.ts +1 -0
- package/dist/ui/colors.d.ts.map +1 -1
- package/dist/ui/config-prompt.d.ts.map +1 -1
- package/dist/ui/status-filter.d.ts +3 -3
- package/dist/ui/status-filter.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# bullmq-dash
|
|
2
2
|
|
|
3
|
-
Dashboard for monitoring [BullMQ](https://bullmq.io/)
|
|
3
|
+
Dashboard for monitoring [BullMQ](https://bullmq.io/)
|
|
4
4
|
|
|
5
5
|
<img width="1491" height="854" alt="SCR-20260127-gsqa" src="https://github.com/user-attachments/assets/739d7729-b6cd-4933-a9e8-96e8cf84d33a" />
|
|
6
6
|
|
package/dist/data/jobs.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type
|
|
1
|
+
export type JobListView = "latest" | "wait" | "active" | "completed" | "failed" | "delayed" | "schedulers";
|
|
2
2
|
export interface JobSummary {
|
|
3
3
|
id: string;
|
|
4
4
|
name: string;
|
|
@@ -28,7 +28,7 @@ export interface JobsResult {
|
|
|
28
28
|
/**
|
|
29
29
|
* Get jobs by status with pagination
|
|
30
30
|
*/
|
|
31
|
-
export declare function getJobs(queueName: string, status:
|
|
31
|
+
export declare function getJobs(queueName: string, status: JobListView, page?: number, pageSize?: number): Promise<JobsResult>;
|
|
32
32
|
/**
|
|
33
33
|
* Get detailed information for a single job
|
|
34
34
|
*/
|
package/dist/data/jobs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../src/data/jobs.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../src/data/jobs.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,YAAY,CAAC;AAE3G,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,SAAU,SAAQ,UAAU;IAC3C,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAID;;GAEG;AACH,wBAAsB,OAAO,CAC3B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,EACnB,IAAI,GAAE,MAAU,EAChB,QAAQ,GAAE,MAAkB,GAC3B,OAAO,CAAC,UAAU,CAAC,CAwGrB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CA2B9F;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAUlF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAc5D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAGrE"}
|
package/dist/data/queues.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queues.d.ts","sourceRoot":"","sources":["../../src/data/queues.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAkB/B,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"queues.d.ts","sourceRoot":"","sources":["../../src/data/queues.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAkB/B,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,CAcjD;AAED;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CA+C5D;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA8B1E;AAED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAM9D;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAKpD"}
|
package/dist/index.js
CHANGED
|
@@ -463,9 +463,10 @@ async function discoverQueueNames() {
|
|
|
463
463
|
}
|
|
464
464
|
async function getQueueStats(queueName) {
|
|
465
465
|
const queue = getQueue(queueName);
|
|
466
|
-
const [counts, isPaused] = await Promise.all([
|
|
466
|
+
const [counts, isPaused, schedulersCount] = await Promise.all([
|
|
467
467
|
queue.getJobCounts(),
|
|
468
|
-
queue.isPaused()
|
|
468
|
+
queue.isPaused(),
|
|
469
|
+
queue.getJobSchedulersCount()
|
|
469
470
|
]);
|
|
470
471
|
const waitCount = (counts.waiting || 0) + (counts.prioritized || 0);
|
|
471
472
|
return {
|
|
@@ -475,7 +476,8 @@ async function getQueueStats(queueName) {
|
|
|
475
476
|
active: counts.active || 0,
|
|
476
477
|
completed: counts.completed || 0,
|
|
477
478
|
failed: counts.failed || 0,
|
|
478
|
-
delayed: counts.delayed || 0
|
|
479
|
+
delayed: counts.delayed || 0,
|
|
480
|
+
schedulers: schedulersCount || 0
|
|
479
481
|
},
|
|
480
482
|
isPaused,
|
|
481
483
|
total: waitCount + (counts.active || 0) + (counts.completed || 0) + (counts.failed || 0) + (counts.delayed || 0)
|
|
@@ -547,6 +549,8 @@ async function getJobs(queueName, status, page = 1, pageSize = PAGE_SIZE) {
|
|
|
547
549
|
const delayedCounts = await queue.getJobCounts("delayed");
|
|
548
550
|
total = delayedCounts.delayed || 0;
|
|
549
551
|
break;
|
|
552
|
+
case "schedulers":
|
|
553
|
+
throw new Error("Cannot fetch schedulers via getJobs(). Use getJobSchedulers() instead.");
|
|
550
554
|
default:
|
|
551
555
|
jobs = [];
|
|
552
556
|
total = 0;
|
|
@@ -903,7 +907,7 @@ class PollingManager {
|
|
|
903
907
|
const updatedState = stateManager.getState();
|
|
904
908
|
const selectedQueue = queues[clampedIndex];
|
|
905
909
|
if (selectedQueue) {
|
|
906
|
-
if (updatedState.jobsStatus === "
|
|
910
|
+
if (updatedState.jobsStatus === "schedulers") {
|
|
907
911
|
const schedulersResult = await getJobSchedulers(selectedQueue.name, updatedState.schedulersPage);
|
|
908
912
|
stateManager.setState({
|
|
909
913
|
schedulers: schedulersResult.schedulers,
|
|
@@ -967,7 +971,7 @@ class PollingManager {
|
|
|
967
971
|
return;
|
|
968
972
|
}
|
|
969
973
|
try {
|
|
970
|
-
if (state.jobsStatus === "
|
|
974
|
+
if (state.jobsStatus === "schedulers") {
|
|
971
975
|
const schedulersResult = await getJobSchedulers(selectedQueue.name, state.schedulersPage);
|
|
972
976
|
stateManager.setState({
|
|
973
977
|
schedulers: schedulersResult.schedulers,
|
|
@@ -1033,7 +1037,8 @@ var colors = {
|
|
|
1033
1037
|
yellow: "#f9e2af",
|
|
1034
1038
|
peach: "#fab387",
|
|
1035
1039
|
red: "#f38ba8",
|
|
1036
|
-
mauve: "#cba6f7"
|
|
1040
|
+
mauve: "#cba6f7",
|
|
1041
|
+
maroon: "#eba0ac"
|
|
1037
1042
|
};
|
|
1038
1043
|
|
|
1039
1044
|
// src/ui/layout.ts
|
|
@@ -1285,7 +1290,7 @@ function updateQueueStats(elements, queue) {
|
|
|
1285
1290
|
const pausedIndicator = queue.isPaused ? " [PAUSED]" : "";
|
|
1286
1291
|
title.content = t2`${bold2(fg2(colors.text)(queue.name))}${fg2(colors.red)(pausedIndicator)}`;
|
|
1287
1292
|
const { counts } = queue;
|
|
1288
|
-
statsText.content = t2`${fg2(colors.yellow)(`wait: ${counts.wait}`)} ${fg2(colors.green)(`active: ${counts.active}`)} ${fg2(colors.blue)(`completed: ${counts.completed}`)} ${fg2(colors.red)(`failed: ${counts.failed}`)} ${fg2(colors.mauve)(`delayed: ${counts.delayed}`)}`;
|
|
1293
|
+
statsText.content = t2`${fg2(colors.yellow)(`wait: ${counts.wait}`)} ${fg2(colors.green)(`active: ${counts.active}`)} ${fg2(colors.blue)(`completed: ${counts.completed}`)} ${fg2(colors.red)(`failed: ${counts.failed}`)} ${fg2(colors.mauve)(`delayed: ${counts.delayed}`)} ${fg2(colors.maroon)(`schedulers: ${counts.schedulers}`)}`;
|
|
1289
1294
|
}
|
|
1290
1295
|
|
|
1291
1296
|
// src/ui/status-filter.ts
|
|
@@ -1319,7 +1324,7 @@ var STATUS_OPTIONS = [
|
|
|
1319
1324
|
{ key: "4", status: "completed", label: "completed" },
|
|
1320
1325
|
{ key: "5", status: "failed", label: "failed" },
|
|
1321
1326
|
{ key: "6", status: "delayed", label: "delayed" },
|
|
1322
|
-
{ key: "7", status: "
|
|
1327
|
+
{ key: "7", status: "schedulers", label: "schedulers" }
|
|
1323
1328
|
];
|
|
1324
1329
|
function createStatusFilter(renderer, parent) {
|
|
1325
1330
|
const container = new BoxRenderable4(renderer, {
|
|
@@ -1341,7 +1346,7 @@ function createStatusFilter(renderer, parent) {
|
|
|
1341
1346
|
}
|
|
1342
1347
|
function updateStatusFilter(elements, currentStatus) {
|
|
1343
1348
|
const { text } = elements;
|
|
1344
|
-
const parts = [
|
|
1349
|
+
const parts = [];
|
|
1345
1350
|
STATUS_OPTIONS.forEach(({ key, status, label }, index) => {
|
|
1346
1351
|
const isSelected = status === currentStatus;
|
|
1347
1352
|
if (isSelected) {
|
|
@@ -1692,7 +1697,7 @@ function createSchedulerList(renderer, parent) {
|
|
|
1692
1697
|
container.add(select);
|
|
1693
1698
|
const emptyText = new TextRenderable7(renderer, {
|
|
1694
1699
|
id: "scheduler-list-empty",
|
|
1695
|
-
content: "No
|
|
1700
|
+
content: "No job schedulers found",
|
|
1696
1701
|
fg: colors.overlay0,
|
|
1697
1702
|
position: "absolute",
|
|
1698
1703
|
left: 2,
|
|
@@ -2319,7 +2324,7 @@ class App {
|
|
|
2319
2324
|
case "return":
|
|
2320
2325
|
case "enter":
|
|
2321
2326
|
if (state.focusedPane === "jobs") {
|
|
2322
|
-
if (state.jobsStatus === "
|
|
2327
|
+
if (state.jobsStatus === "schedulers") {
|
|
2323
2328
|
await this.openSchedulerDetail();
|
|
2324
2329
|
} else {
|
|
2325
2330
|
await this.openJobDetail();
|
|
@@ -2330,7 +2335,7 @@ class App {
|
|
|
2330
2335
|
break;
|
|
2331
2336
|
case "left":
|
|
2332
2337
|
if (state.focusedPane === "jobs") {
|
|
2333
|
-
if (state.jobsStatus === "
|
|
2338
|
+
if (state.jobsStatus === "schedulers") {
|
|
2334
2339
|
stateManager.prevSchedulerPage();
|
|
2335
2340
|
await pollingManager.refreshSchedulers();
|
|
2336
2341
|
} else {
|
|
@@ -2341,7 +2346,7 @@ class App {
|
|
|
2341
2346
|
break;
|
|
2342
2347
|
case "right":
|
|
2343
2348
|
if (state.focusedPane === "jobs") {
|
|
2344
|
-
if (state.jobsStatus === "
|
|
2349
|
+
if (state.jobsStatus === "schedulers") {
|
|
2345
2350
|
stateManager.nextSchedulerPage();
|
|
2346
2351
|
await pollingManager.refreshSchedulers();
|
|
2347
2352
|
} else {
|
|
@@ -2351,7 +2356,7 @@ class App {
|
|
|
2351
2356
|
}
|
|
2352
2357
|
break;
|
|
2353
2358
|
case "d":
|
|
2354
|
-
if (state.focusedPane === "jobs" && state.jobsStatus !== "
|
|
2359
|
+
if (state.focusedPane === "jobs" && state.jobsStatus !== "schedulers" && state.jobs.length > 0) {
|
|
2355
2360
|
stateManager.showDeleteConfirm();
|
|
2356
2361
|
}
|
|
2357
2362
|
break;
|
|
@@ -2360,9 +2365,9 @@ class App {
|
|
|
2360
2365
|
break;
|
|
2361
2366
|
case "g":
|
|
2362
2367
|
if (state.focusedPane === "jobs") {
|
|
2363
|
-
if (state.jobsStatus === "
|
|
2368
|
+
if (state.jobsStatus === "schedulers" && state.schedulersTotalPages > 1) {
|
|
2364
2369
|
stateManager.showPageJumpModal();
|
|
2365
|
-
} else if (state.jobsStatus !== "
|
|
2370
|
+
} else if (state.jobsStatus !== "schedulers" && state.jobsTotalPages > 1) {
|
|
2366
2371
|
stateManager.showPageJumpModal();
|
|
2367
2372
|
}
|
|
2368
2373
|
}
|
|
@@ -2377,7 +2382,7 @@ class App {
|
|
|
2377
2382
|
const newStatus = getStatusFromKey(key.name);
|
|
2378
2383
|
if (newStatus) {
|
|
2379
2384
|
stateManager.setJobsStatus(newStatus);
|
|
2380
|
-
if (newStatus === "
|
|
2385
|
+
if (newStatus === "schedulers") {
|
|
2381
2386
|
stateManager.setState({
|
|
2382
2387
|
selectedSchedulerIndex: 0,
|
|
2383
2388
|
schedulersPage: 1
|
|
@@ -2455,7 +2460,7 @@ class App {
|
|
|
2455
2460
|
if (pageInput) {
|
|
2456
2461
|
const targetPage = parseInt(pageInput, 10);
|
|
2457
2462
|
if (!isNaN(targetPage) && targetPage >= 1) {
|
|
2458
|
-
if (state.jobsStatus === "
|
|
2463
|
+
if (state.jobsStatus === "schedulers") {
|
|
2459
2464
|
stateManager.goToSchedulerPage(targetPage);
|
|
2460
2465
|
await pollingManager.refreshSchedulers();
|
|
2461
2466
|
} else {
|
|
@@ -2490,8 +2495,8 @@ class App {
|
|
|
2490
2495
|
const selectedQueue = stateManager.getSelectedQueue();
|
|
2491
2496
|
updateQueueStats(queueStats, selectedQueue);
|
|
2492
2497
|
updateStatusFilter(statusFilter, state.jobsStatus);
|
|
2493
|
-
const
|
|
2494
|
-
if (
|
|
2498
|
+
const isSchedulersView = state.jobsStatus === "schedulers";
|
|
2499
|
+
if (isSchedulersView) {
|
|
2495
2500
|
jobList.container.visible = false;
|
|
2496
2501
|
showSchedulerList(schedulerList);
|
|
2497
2502
|
updateSchedulerList(schedulerList, state.schedulers, state.selectedSchedulerIndex, state.schedulersPage, state.schedulersTotalPages, state.schedulersTotal, state.focusedPane === "jobs");
|
|
@@ -2508,7 +2513,7 @@ class App {
|
|
|
2508
2513
|
} else {
|
|
2509
2514
|
hideConfirmDialog(confirmDialog);
|
|
2510
2515
|
}
|
|
2511
|
-
updatePageJump(pageJump, state.showPageJump, state.pageJumpInput,
|
|
2516
|
+
updatePageJump(pageJump, state.showPageJump, state.pageJumpInput, isSchedulersView ? state.schedulersPage : state.jobsPage, isSchedulersView ? state.schedulersTotalPages : state.jobsTotalPages);
|
|
2512
2517
|
}
|
|
2513
2518
|
async cleanup() {
|
|
2514
2519
|
pollingManager.stop();
|
|
@@ -2650,5 +2655,5 @@ async function main() {
|
|
|
2650
2655
|
}
|
|
2651
2656
|
main();
|
|
2652
2657
|
|
|
2653
|
-
//# debugId=
|
|
2658
|
+
//# debugId=BE423ECE3B11D4A564756E2164756E21
|
|
2654
2659
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -2,32 +2,32 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/app.ts", "../src/state.ts", "../src/config.ts", "../src/data/queues.ts", "../src/data/redis.ts", "../src/data/jobs.ts", "../src/data/schedulers.ts", "../src/data/metrics.ts", "../src/polling.ts", "../src/ui/layout.ts", "../src/ui/colors.ts", "../src/ui/queue-list.ts", "../src/ui/queue-stats.ts", "../src/ui/status-filter.ts", "../src/ui/utils.ts", "../src/ui/job-list.ts", "../src/ui/job-detail.ts", "../src/ui/scheduler-list.ts", "../src/ui/scheduler-detail.ts", "../src/ui/confirm-dialog.ts", "../src/ui/global-metrics.ts", "../src/ui/page-jump.ts", "../src/ui/config-prompt.ts", "../src/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import { createCliRenderer, type CliRenderer, type KeyEvent } from \"@opentui/core\";\nimport { stateManager } from \"./state.js\";\nimport { pollingManager } from \"./polling.js\";\nimport { getJobDetail, deleteJob } from \"./data/jobs.js\";\nimport { getJobSchedulerDetail } from \"./data/schedulers.js\";\nimport { disconnectRedis } from \"./data/redis.js\";\nimport { closeAllQueues } from \"./data/queues.js\";\nimport { getConfig } from \"./config.js\";\n\n// UI imports\nimport { createLayout, updateHeaderStatus, type LayoutElements } from \"./ui/layout.js\";\nimport { createQueueList, updateQueueList, type QueueListElements } from \"./ui/queue-list.js\";\nimport { createQueueStats, updateQueueStats, type QueueStatsElements } from \"./ui/queue-stats.js\";\nimport {\n createStatusFilter,\n updateStatusFilter,\n getStatusFromKey,\n type StatusFilterElements,\n} from \"./ui/status-filter.js\";\nimport { createJobList, updateJobList, type JobListElements } from \"./ui/job-list.js\";\nimport { createJobDetail, updateJobDetail, type JobDetailElements } from \"./ui/job-detail.js\";\nimport {\n createSchedulerList,\n updateSchedulerList,\n showSchedulerList,\n hideSchedulerList,\n type SchedulerListElements,\n} from \"./ui/scheduler-list.js\";\nimport {\n createSchedulerDetail,\n updateSchedulerDetail,\n type SchedulerDetailElements,\n} from \"./ui/scheduler-detail.js\";\nimport {\n createConfirmDialog,\n showConfirmDialog,\n hideConfirmDialog,\n type ConfirmDialogElements,\n} from \"./ui/confirm-dialog.js\";\nimport {\n createGlobalMetrics,\n updateGlobalMetrics,\n type GlobalMetricsElements,\n} from \"./ui/global-metrics.js\";\nimport {\n createPageJump,\n updatePageJump,\n type PageJumpElements,\n} from \"./ui/page-jump.js\";\n\ninterface AppElements {\n layout: LayoutElements;\n globalMetrics: GlobalMetricsElements;\n queueList: QueueListElements;\n queueStats: QueueStatsElements;\n statusFilter: StatusFilterElements;\n jobList: JobListElements;\n jobDetail: JobDetailElements;\n schedulerList: SchedulerListElements;\n schedulerDetail: SchedulerDetailElements;\n confirmDialog: ConfirmDialogElements;\n pageJump: PageJumpElements;\n}\n\nexport class App {\n private renderer: CliRenderer | null = null;\n private elements: AppElements | null = null;\n private unsubscribeState: (() => void) | null = null;\n\n async start(): Promise<void> {\n // Create renderer\n this.renderer = await createCliRenderer({\n exitOnCtrlC: false,\n targetFps: 30,\n });\n\n this.renderer.setBackgroundColor(\"#0f172a\");\n\n // Create UI elements\n this.elements = this.createElements();\n\n // Setup keyboard handling\n this.setupKeyboardHandling();\n\n // Subscribe to state changes (triggers render on any state update)\n this.unsubscribeState = stateManager.subscribe(() => {\n this.render();\n });\n\n // Start polling\n pollingManager.start();\n\n // Initial render\n this.render();\n }\n\n private createElements(): AppElements {\n if (!this.renderer) throw new Error(\"Renderer not initialized\");\n\n const layout = createLayout(this.renderer);\n const globalMetrics = createGlobalMetrics(this.renderer, layout.metricsBar);\n const queueList = createQueueList(this.renderer, layout.leftPane);\n const queueStats = createQueueStats(this.renderer, layout.rightPane);\n const statusFilter = createStatusFilter(this.renderer, layout.rightPane);\n const jobList = createJobList(this.renderer, layout.rightPane);\n const schedulerList = createSchedulerList(this.renderer, layout.rightPane);\n const jobDetail = createJobDetail(this.renderer);\n const schedulerDetail = createSchedulerDetail(this.renderer);\n const confirmDialog = createConfirmDialog(this.renderer);\n const pageJump = createPageJump(this.renderer);\n\n return {\n layout,\n globalMetrics,\n queueList,\n queueStats,\n statusFilter,\n jobList,\n jobDetail,\n schedulerList,\n schedulerDetail,\n confirmDialog,\n pageJump,\n };\n }\n\n private setupKeyboardHandling(): void {\n if (!this.renderer) return;\n\n this.renderer.keyInput.on(\"keypress\", async (key: KeyEvent) => {\n try {\n await this.handleKeyPress(key);\n } catch (error) {\n console.error(\"Key handler error:\", error instanceof Error ? error.message : error);\n }\n });\n }\n\n private async handleKeyPress(key: KeyEvent): Promise<void> {\n const state = stateManager.getState();\n\n // Global keys\n if (key.name === \"q\" || (key.ctrl && key.name === \"c\")) {\n await this.cleanup();\n return;\n }\n\n // Confirm dialog handling\n if (state.showConfirmDelete) {\n if (key.name === \"y\") {\n await this.confirmDelete();\n } else if (key.name === \"n\" || key.name === \"escape\") {\n stateManager.hideDeleteConfirm();\n }\n return;\n }\n\n // Page jump modal handling\n if (state.showPageJump) {\n if (key.name === \"escape\") {\n stateManager.hidePageJumpModal();\n } else if (key.name === \"return\" || key.name === \"enter\") {\n await this.confirmPageJump();\n } else if (key.name === \"backspace\") {\n stateManager.backspacePageJumpInput();\n } else if (key.sequence && /^\\d$/.test(key.sequence)) {\n stateManager.appendPageJumpInput(key.sequence);\n }\n return;\n }\n\n // Job detail view handling\n if (state.showJobDetail) {\n if (key.name === \"escape\") {\n stateManager.closeJobDetail();\n } else if (key.name === \"d\") {\n stateManager.showDeleteConfirm();\n }\n return;\n }\n\n // Scheduler detail view handling\n if (state.showSchedulerDetail) {\n if (key.name === \"escape\") {\n stateManager.closeSchedulerDetail();\n } else if (key.name === \"j\") {\n // Navigate to the next delayed job detail\n await this.openSchedulerNextJob();\n }\n return;\n }\n\n // Navigation keys\n switch (key.name) {\n case \"tab\":\n stateManager.toggleFocus();\n break;\n\n // j/k and up/down are handled by SelectRenderable when the pane is focused\n // The SELECTION_CHANGED event updates our state\n\n case \"return\":\n case \"enter\":\n if (state.focusedPane === \"jobs\") {\n // If viewing schedulers, open scheduler detail\n if (state.jobsStatus === \"scheduled\") {\n await this.openSchedulerDetail();\n } else {\n await this.openJobDetail();\n }\n } else {\n // Select queue and switch to jobs pane\n stateManager.setState({ focusedPane: \"jobs\" });\n }\n break;\n\n case \"left\":\n if (state.focusedPane === \"jobs\") {\n if (state.jobsStatus === \"scheduled\") {\n stateManager.prevSchedulerPage();\n await pollingManager.refreshSchedulers();\n } else {\n stateManager.prevPage();\n await pollingManager.refreshJobs();\n }\n }\n break;\n\n case \"right\":\n if (state.focusedPane === \"jobs\") {\n if (state.jobsStatus === \"scheduled\") {\n stateManager.nextSchedulerPage();\n await pollingManager.refreshSchedulers();\n } else {\n stateManager.nextPage();\n await pollingManager.refreshJobs();\n }\n }\n break;\n\n case \"d\":\n // Delete only works for regular jobs, not schedulers\n if (state.focusedPane === \"jobs\" && state.jobsStatus !== \"scheduled\" && state.jobs.length > 0) {\n stateManager.showDeleteConfirm();\n }\n break;\n\n case \"r\":\n await pollingManager.refresh();\n break;\n\n case \"g\":\n // Open page jump modal when in jobs pane\n if (state.focusedPane === \"jobs\") {\n if (state.jobsStatus === \"scheduled\" && state.schedulersTotalPages > 1) {\n stateManager.showPageJumpModal();\n } else if (state.jobsStatus !== \"scheduled\" && state.jobsTotalPages > 1) {\n stateManager.showPageJumpModal();\n }\n }\n break;\n\n // Status filter shortcuts (1-7)\n case \"1\":\n case \"2\":\n case \"3\":\n case \"4\":\n case \"5\":\n case \"6\":\n case \"7\":\n const newStatus = getStatusFromKey(key.name);\n if (newStatus) {\n stateManager.setJobsStatus(newStatus);\n // Reset scheduler state when switching to scheduled\n if (newStatus === \"scheduled\") {\n stateManager.setState({\n selectedSchedulerIndex: 0,\n schedulersPage: 1,\n });\n }\n await pollingManager.refreshJobs();\n }\n break;\n }\n }\n\n private async openJobDetail(): Promise<void> {\n const selectedJob = stateManager.getSelectedJob();\n const selectedQueue = stateManager.getSelectedQueue();\n\n if (!selectedJob || !selectedQueue) return;\n\n try {\n const detail = await getJobDetail(selectedQueue.name, selectedJob.id);\n if (detail) {\n stateManager.openJobDetail(detail);\n }\n } catch {\n // Handle error silently for now\n }\n }\n\n private async openSchedulerDetail(): Promise<void> {\n const selectedScheduler = stateManager.getSelectedScheduler();\n const selectedQueue = stateManager.getSelectedQueue();\n\n if (!selectedScheduler || !selectedQueue) return;\n\n try {\n const detail = await getJobSchedulerDetail(selectedQueue.name, selectedScheduler.key);\n if (detail) {\n stateManager.openSchedulerDetail(detail);\n }\n } catch {\n // Handle error silently for now\n }\n }\n\n private async openSchedulerNextJob(): Promise<void> {\n const state = stateManager.getState();\n const schedulerDetail = state.schedulerDetail;\n const selectedQueue = stateManager.getSelectedQueue();\n\n if (!schedulerDetail?.nextJob || !selectedQueue) return;\n\n try {\n const jobDetail = await getJobDetail(selectedQueue.name, schedulerDetail.nextJob.id);\n if (jobDetail) {\n // Close scheduler detail and open job detail\n stateManager.closeSchedulerDetail();\n stateManager.openJobDetail(jobDetail);\n }\n } catch {\n // Handle error silently for now\n }\n }\n\n private async confirmDelete(): Promise<void> {\n const state = stateManager.getState();\n const selectedQueue = stateManager.getSelectedQueue();\n\n let jobId: string | undefined;\n\n if (state.showJobDetail && state.jobDetail) {\n jobId = state.jobDetail.id;\n } else {\n const selectedJob = stateManager.getSelectedJob();\n jobId = selectedJob?.id;\n }\n\n if (!selectedQueue || !jobId) {\n stateManager.hideDeleteConfirm();\n return;\n }\n\n try {\n await deleteJob(selectedQueue.name, jobId);\n stateManager.hideDeleteConfirm();\n stateManager.closeJobDetail();\n await pollingManager.refresh();\n } catch {\n stateManager.hideDeleteConfirm();\n }\n }\n\n private async confirmPageJump(): Promise<void> {\n const state = stateManager.getState();\n const pageInput = state.pageJumpInput;\n\n if (pageInput) {\n const targetPage = parseInt(pageInput, 10);\n if (!isNaN(targetPage) && targetPage >= 1) {\n if (state.jobsStatus === \"scheduled\") {\n stateManager.goToSchedulerPage(targetPage);\n await pollingManager.refreshSchedulers();\n } else {\n stateManager.goToPage(targetPage);\n await pollingManager.refreshJobs();\n }\n }\n }\n\n stateManager.hidePageJumpModal();\n }\n\n private render(): void {\n if (!this.elements) return;\n\n const state = stateManager.getState();\n const {\n layout,\n globalMetrics,\n queueList,\n queueStats,\n statusFilter,\n jobList,\n jobDetail,\n schedulerList,\n schedulerDetail,\n confirmDialog,\n pageJump,\n } = this.elements;\n\n // Update header\n const config = getConfig();\n updateHeaderStatus(\n layout.headerStatus,\n state.connected,\n state.error,\n config.redis.host,\n config.redis.port,\n );\n\n // Update global metrics\n updateGlobalMetrics(globalMetrics, state.globalMetrics);\n\n // Update queue list\n updateQueueList(\n queueList,\n state.queues,\n state.selectedQueueIndex,\n state.focusedPane === \"queues\",\n );\n\n // Update queue stats\n const selectedQueue = stateManager.getSelectedQueue();\n updateQueueStats(queueStats, selectedQueue);\n\n // Update status filter\n updateStatusFilter(statusFilter, state.jobsStatus);\n\n // Toggle between job list and scheduler list based on status\n const isScheduledView = state.jobsStatus === \"scheduled\";\n\n if (isScheduledView) {\n // Hide job list, show scheduler list\n jobList.container.visible = false;\n showSchedulerList(schedulerList);\n updateSchedulerList(\n schedulerList,\n state.schedulers,\n state.selectedSchedulerIndex,\n state.schedulersPage,\n state.schedulersTotalPages,\n state.schedulersTotal,\n state.focusedPane === \"jobs\",\n );\n } else {\n // Hide scheduler list, show job list\n hideSchedulerList(schedulerList);\n jobList.container.visible = true;\n updateJobList(\n jobList,\n state.jobs,\n state.selectedJobIndex,\n state.jobsPage,\n state.jobsTotalPages,\n state.jobsTotal,\n state.focusedPane === \"jobs\",\n );\n }\n\n // Update job detail\n updateJobDetail(jobDetail, state.jobDetail, state.showJobDetail);\n\n // Update scheduler detail\n updateSchedulerDetail(schedulerDetail, state.schedulerDetail, state.showSchedulerDetail);\n\n // Update confirm dialog\n if (state.showConfirmDelete) {\n const jobId = state.jobDetail?.id || stateManager.getSelectedJob()?.id || \"unknown\";\n showConfirmDialog(confirmDialog, jobId);\n } else {\n hideConfirmDialog(confirmDialog);\n }\n\n // Update page jump modal (handle both jobs and schedulers)\n updatePageJump(\n pageJump,\n state.showPageJump,\n state.pageJumpInput,\n isScheduledView ? state.schedulersPage : state.jobsPage,\n isScheduledView ? state.schedulersTotalPages : state.jobsTotalPages,\n );\n }\n\n private async cleanup(): Promise<void> {\n // Stop polling\n pollingManager.stop();\n\n // Unsubscribe from state\n if (this.unsubscribeState) {\n this.unsubscribeState();\n }\n\n // Close connections\n await closeAllQueues();\n await disconnectRedis();\n\n // Destroy renderer\n if (this.renderer) {\n this.renderer.destroy();\n }\n\n process.exit(0);\n }\n}\n",
|
|
6
|
-
"import type { QueueStats } from \"./data/queues.js\";\nimport type { JobSummary, JobDetail,
|
|
5
|
+
"import { createCliRenderer, type CliRenderer, type KeyEvent } from \"@opentui/core\";\nimport { stateManager } from \"./state.js\";\nimport { pollingManager } from \"./polling.js\";\nimport { getJobDetail, deleteJob } from \"./data/jobs.js\";\nimport { getJobSchedulerDetail } from \"./data/schedulers.js\";\nimport { disconnectRedis } from \"./data/redis.js\";\nimport { closeAllQueues } from \"./data/queues.js\";\nimport { getConfig } from \"./config.js\";\n\n// UI imports\nimport { createLayout, updateHeaderStatus, type LayoutElements } from \"./ui/layout.js\";\nimport { createQueueList, updateQueueList, type QueueListElements } from \"./ui/queue-list.js\";\nimport { createQueueStats, updateQueueStats, type QueueStatsElements } from \"./ui/queue-stats.js\";\nimport {\n createStatusFilter,\n updateStatusFilter,\n getStatusFromKey,\n type StatusFilterElements,\n} from \"./ui/status-filter.js\";\nimport { createJobList, updateJobList, type JobListElements } from \"./ui/job-list.js\";\nimport { createJobDetail, updateJobDetail, type JobDetailElements } from \"./ui/job-detail.js\";\nimport {\n createSchedulerList,\n updateSchedulerList,\n showSchedulerList,\n hideSchedulerList,\n type SchedulerListElements,\n} from \"./ui/scheduler-list.js\";\nimport {\n createSchedulerDetail,\n updateSchedulerDetail,\n type SchedulerDetailElements,\n} from \"./ui/scheduler-detail.js\";\nimport {\n createConfirmDialog,\n showConfirmDialog,\n hideConfirmDialog,\n type ConfirmDialogElements,\n} from \"./ui/confirm-dialog.js\";\nimport {\n createGlobalMetrics,\n updateGlobalMetrics,\n type GlobalMetricsElements,\n} from \"./ui/global-metrics.js\";\nimport {\n createPageJump,\n updatePageJump,\n type PageJumpElements,\n} from \"./ui/page-jump.js\";\n\ninterface AppElements {\n layout: LayoutElements;\n globalMetrics: GlobalMetricsElements;\n queueList: QueueListElements;\n queueStats: QueueStatsElements;\n statusFilter: StatusFilterElements;\n jobList: JobListElements;\n jobDetail: JobDetailElements;\n schedulerList: SchedulerListElements;\n schedulerDetail: SchedulerDetailElements;\n confirmDialog: ConfirmDialogElements;\n pageJump: PageJumpElements;\n}\n\nexport class App {\n private renderer: CliRenderer | null = null;\n private elements: AppElements | null = null;\n private unsubscribeState: (() => void) | null = null;\n\n async start(): Promise<void> {\n // Create renderer\n this.renderer = await createCliRenderer({\n exitOnCtrlC: false,\n targetFps: 30,\n });\n\n this.renderer.setBackgroundColor(\"#0f172a\");\n\n // Create UI elements\n this.elements = this.createElements();\n\n // Setup keyboard handling\n this.setupKeyboardHandling();\n\n // Subscribe to state changes (triggers render on any state update)\n this.unsubscribeState = stateManager.subscribe(() => {\n this.render();\n });\n\n // Start polling\n pollingManager.start();\n\n // Initial render\n this.render();\n }\n\n private createElements(): AppElements {\n if (!this.renderer) throw new Error(\"Renderer not initialized\");\n\n const layout = createLayout(this.renderer);\n const globalMetrics = createGlobalMetrics(this.renderer, layout.metricsBar);\n const queueList = createQueueList(this.renderer, layout.leftPane);\n const queueStats = createQueueStats(this.renderer, layout.rightPane);\n const statusFilter = createStatusFilter(this.renderer, layout.rightPane);\n const jobList = createJobList(this.renderer, layout.rightPane);\n const schedulerList = createSchedulerList(this.renderer, layout.rightPane);\n const jobDetail = createJobDetail(this.renderer);\n const schedulerDetail = createSchedulerDetail(this.renderer);\n const confirmDialog = createConfirmDialog(this.renderer);\n const pageJump = createPageJump(this.renderer);\n\n return {\n layout,\n globalMetrics,\n queueList,\n queueStats,\n statusFilter,\n jobList,\n jobDetail,\n schedulerList,\n schedulerDetail,\n confirmDialog,\n pageJump,\n };\n }\n\n private setupKeyboardHandling(): void {\n if (!this.renderer) return;\n\n this.renderer.keyInput.on(\"keypress\", async (key: KeyEvent) => {\n try {\n await this.handleKeyPress(key);\n } catch (error) {\n console.error(\"Key handler error:\", error instanceof Error ? error.message : error);\n }\n });\n }\n\n private async handleKeyPress(key: KeyEvent): Promise<void> {\n const state = stateManager.getState();\n\n // Global keys\n if (key.name === \"q\" || (key.ctrl && key.name === \"c\")) {\n await this.cleanup();\n return;\n }\n\n // Confirm dialog handling\n if (state.showConfirmDelete) {\n if (key.name === \"y\") {\n await this.confirmDelete();\n } else if (key.name === \"n\" || key.name === \"escape\") {\n stateManager.hideDeleteConfirm();\n }\n return;\n }\n\n // Page jump modal handling\n if (state.showPageJump) {\n if (key.name === \"escape\") {\n stateManager.hidePageJumpModal();\n } else if (key.name === \"return\" || key.name === \"enter\") {\n await this.confirmPageJump();\n } else if (key.name === \"backspace\") {\n stateManager.backspacePageJumpInput();\n } else if (key.sequence && /^\\d$/.test(key.sequence)) {\n stateManager.appendPageJumpInput(key.sequence);\n }\n return;\n }\n\n // Job detail view handling\n if (state.showJobDetail) {\n if (key.name === \"escape\") {\n stateManager.closeJobDetail();\n } else if (key.name === \"d\") {\n stateManager.showDeleteConfirm();\n }\n return;\n }\n\n // Scheduler detail view handling\n if (state.showSchedulerDetail) {\n if (key.name === \"escape\") {\n stateManager.closeSchedulerDetail();\n } else if (key.name === \"j\") {\n // Navigate to the next delayed job detail\n await this.openSchedulerNextJob();\n }\n return;\n }\n\n // Navigation keys\n switch (key.name) {\n case \"tab\":\n stateManager.toggleFocus();\n break;\n\n // j/k and up/down are handled by SelectRenderable when the pane is focused\n // The SELECTION_CHANGED event updates our state\n\n case \"return\":\n case \"enter\":\n if (state.focusedPane === \"jobs\") {\n // If viewing schedulers, open scheduler detail\n if (state.jobsStatus === \"schedulers\") {\n await this.openSchedulerDetail();\n } else {\n await this.openJobDetail();\n }\n } else {\n // Select queue and switch to jobs pane\n stateManager.setState({ focusedPane: \"jobs\" });\n }\n break;\n\n case \"left\":\n if (state.focusedPane === \"jobs\") {\n if (state.jobsStatus === \"schedulers\") {\n stateManager.prevSchedulerPage();\n await pollingManager.refreshSchedulers();\n } else {\n stateManager.prevPage();\n await pollingManager.refreshJobs();\n }\n }\n break;\n\n case \"right\":\n if (state.focusedPane === \"jobs\") {\n if (state.jobsStatus === \"schedulers\") {\n stateManager.nextSchedulerPage();\n await pollingManager.refreshSchedulers();\n } else {\n stateManager.nextPage();\n await pollingManager.refreshJobs();\n }\n }\n break;\n\n case \"d\":\n // Delete only works for regular jobs, not schedulers\n if (state.focusedPane === \"jobs\" && state.jobsStatus !== \"schedulers\" && state.jobs.length > 0) {\n stateManager.showDeleteConfirm();\n }\n break;\n\n case \"r\":\n await pollingManager.refresh();\n break;\n\n case \"g\":\n // Open page jump modal when in jobs pane\n if (state.focusedPane === \"jobs\") {\n if (state.jobsStatus === \"schedulers\" && state.schedulersTotalPages > 1) {\n stateManager.showPageJumpModal();\n } else if (state.jobsStatus !== \"schedulers\" && state.jobsTotalPages > 1) {\n stateManager.showPageJumpModal();\n }\n }\n break;\n\n // Status filter shortcuts (1-7)\n case \"1\":\n case \"2\":\n case \"3\":\n case \"4\":\n case \"5\":\n case \"6\":\n case \"7\":\n const newStatus = getStatusFromKey(key.name);\n if (newStatus) {\n stateManager.setJobsStatus(newStatus);\n // Reset scheduler state when switching to schedulers\n if (newStatus === \"schedulers\") {\n stateManager.setState({\n selectedSchedulerIndex: 0,\n schedulersPage: 1,\n });\n }\n await pollingManager.refreshJobs();\n }\n break;\n }\n }\n\n private async openJobDetail(): Promise<void> {\n const selectedJob = stateManager.getSelectedJob();\n const selectedQueue = stateManager.getSelectedQueue();\n\n if (!selectedJob || !selectedQueue) return;\n\n try {\n const detail = await getJobDetail(selectedQueue.name, selectedJob.id);\n if (detail) {\n stateManager.openJobDetail(detail);\n }\n } catch {\n // Handle error silently for now\n }\n }\n\n private async openSchedulerDetail(): Promise<void> {\n const selectedScheduler = stateManager.getSelectedScheduler();\n const selectedQueue = stateManager.getSelectedQueue();\n\n if (!selectedScheduler || !selectedQueue) return;\n\n try {\n const detail = await getJobSchedulerDetail(selectedQueue.name, selectedScheduler.key);\n if (detail) {\n stateManager.openSchedulerDetail(detail);\n }\n } catch {\n // Handle error silently for now\n }\n }\n\n private async openSchedulerNextJob(): Promise<void> {\n const state = stateManager.getState();\n const schedulerDetail = state.schedulerDetail;\n const selectedQueue = stateManager.getSelectedQueue();\n\n if (!schedulerDetail?.nextJob || !selectedQueue) return;\n\n try {\n const jobDetail = await getJobDetail(selectedQueue.name, schedulerDetail.nextJob.id);\n if (jobDetail) {\n // Close scheduler detail and open job detail\n stateManager.closeSchedulerDetail();\n stateManager.openJobDetail(jobDetail);\n }\n } catch {\n // Handle error silently for now\n }\n }\n\n private async confirmDelete(): Promise<void> {\n const state = stateManager.getState();\n const selectedQueue = stateManager.getSelectedQueue();\n\n let jobId: string | undefined;\n\n if (state.showJobDetail && state.jobDetail) {\n jobId = state.jobDetail.id;\n } else {\n const selectedJob = stateManager.getSelectedJob();\n jobId = selectedJob?.id;\n }\n\n if (!selectedQueue || !jobId) {\n stateManager.hideDeleteConfirm();\n return;\n }\n\n try {\n await deleteJob(selectedQueue.name, jobId);\n stateManager.hideDeleteConfirm();\n stateManager.closeJobDetail();\n await pollingManager.refresh();\n } catch {\n stateManager.hideDeleteConfirm();\n }\n }\n\n private async confirmPageJump(): Promise<void> {\n const state = stateManager.getState();\n const pageInput = state.pageJumpInput;\n\n if (pageInput) {\n const targetPage = parseInt(pageInput, 10);\n if (!isNaN(targetPage) && targetPage >= 1) {\n if (state.jobsStatus === \"schedulers\") {\n stateManager.goToSchedulerPage(targetPage);\n await pollingManager.refreshSchedulers();\n } else {\n stateManager.goToPage(targetPage);\n await pollingManager.refreshJobs();\n }\n }\n }\n\n stateManager.hidePageJumpModal();\n }\n\n private render(): void {\n if (!this.elements) return;\n\n const state = stateManager.getState();\n const {\n layout,\n globalMetrics,\n queueList,\n queueStats,\n statusFilter,\n jobList,\n jobDetail,\n schedulerList,\n schedulerDetail,\n confirmDialog,\n pageJump,\n } = this.elements;\n\n // Update header\n const config = getConfig();\n updateHeaderStatus(\n layout.headerStatus,\n state.connected,\n state.error,\n config.redis.host,\n config.redis.port,\n );\n\n // Update global metrics\n updateGlobalMetrics(globalMetrics, state.globalMetrics);\n\n // Update queue list\n updateQueueList(\n queueList,\n state.queues,\n state.selectedQueueIndex,\n state.focusedPane === \"queues\",\n );\n\n // Update queue stats\n const selectedQueue = stateManager.getSelectedQueue();\n updateQueueStats(queueStats, selectedQueue);\n\n // Update status filter\n updateStatusFilter(statusFilter, state.jobsStatus);\n\n // Toggle between job list and scheduler list based on status\n const isSchedulersView = state.jobsStatus === \"schedulers\";\n\n if (isSchedulersView) {\n // Hide job list, show scheduler list\n jobList.container.visible = false;\n showSchedulerList(schedulerList);\n updateSchedulerList(\n schedulerList,\n state.schedulers,\n state.selectedSchedulerIndex,\n state.schedulersPage,\n state.schedulersTotalPages,\n state.schedulersTotal,\n state.focusedPane === \"jobs\",\n );\n } else {\n // Hide scheduler list, show job list\n hideSchedulerList(schedulerList);\n jobList.container.visible = true;\n updateJobList(\n jobList,\n state.jobs,\n state.selectedJobIndex,\n state.jobsPage,\n state.jobsTotalPages,\n state.jobsTotal,\n state.focusedPane === \"jobs\",\n );\n }\n\n // Update job detail\n updateJobDetail(jobDetail, state.jobDetail, state.showJobDetail);\n\n // Update scheduler detail\n updateSchedulerDetail(schedulerDetail, state.schedulerDetail, state.showSchedulerDetail);\n\n // Update confirm dialog\n if (state.showConfirmDelete) {\n const jobId = state.jobDetail?.id || stateManager.getSelectedJob()?.id || \"unknown\";\n showConfirmDialog(confirmDialog, jobId);\n } else {\n hideConfirmDialog(confirmDialog);\n }\n\n // Update page jump modal (handle both jobs and schedulers)\n updatePageJump(\n pageJump,\n state.showPageJump,\n state.pageJumpInput,\n isSchedulersView ? state.schedulersPage : state.jobsPage,\n isSchedulersView ? state.schedulersTotalPages : state.jobsTotalPages,\n );\n }\n\n private async cleanup(): Promise<void> {\n // Stop polling\n pollingManager.stop();\n\n // Unsubscribe from state\n if (this.unsubscribeState) {\n this.unsubscribeState();\n }\n\n // Close connections\n await closeAllQueues();\n await disconnectRedis();\n\n // Destroy renderer\n if (this.renderer) {\n this.renderer.destroy();\n }\n\n process.exit(0);\n }\n}\n",
|
|
6
|
+
"import type { QueueStats } from \"./data/queues.js\";\nimport type { JobSummary, JobDetail, JobListView } from \"./data/jobs.js\";\nimport type { GlobalMetrics } from \"./data/metrics.js\";\nimport type { JobSchedulerSummary, JobSchedulerDetail } from \"./data/schedulers.js\";\n\nexport type FocusedPane = \"queues\" | \"jobs\";\n\nexport interface AppState {\n // Connection\n connected: boolean;\n error: string | null;\n\n // Global metrics\n globalMetrics: GlobalMetrics | null;\n\n // Queues\n queues: QueueStats[];\n selectedQueueIndex: number;\n\n // Jobs\n jobs: JobSummary[];\n jobsTotal: number;\n jobsPage: number;\n jobsTotalPages: number;\n jobsStatus: JobListView;\n selectedJobIndex: number;\n\n // Detail view\n jobDetail: JobDetail | null;\n showJobDetail: boolean;\n\n // Schedulers (for repeatable jobs)\n schedulers: JobSchedulerSummary[];\n schedulersTotal: number;\n schedulersPage: number;\n schedulersTotalPages: number;\n selectedSchedulerIndex: number;\n schedulerDetail: JobSchedulerDetail | null;\n showSchedulerDetail: boolean;\n\n // UI state\n focusedPane: FocusedPane;\n showConfirmDelete: boolean;\n showPageJump: boolean;\n pageJumpInput: string;\n isLoading: boolean;\n}\n\nexport type StateListener = (state: AppState) => void;\n\nclass StateManager {\n private state: AppState;\n private listeners: Set<StateListener> = new Set();\n\n constructor() {\n this.state = {\n connected: false,\n error: null,\n globalMetrics: null,\n queues: [],\n selectedQueueIndex: 0,\n jobs: [],\n jobsTotal: 0,\n jobsPage: 1,\n jobsTotalPages: 0,\n jobsStatus: \"latest\",\n selectedJobIndex: 0,\n jobDetail: null,\n showJobDetail: false,\n schedulers: [],\n schedulersTotal: 0,\n schedulersPage: 1,\n schedulersTotalPages: 0,\n selectedSchedulerIndex: 0,\n schedulerDetail: null,\n showSchedulerDetail: false,\n focusedPane: \"queues\",\n showConfirmDelete: false,\n showPageJump: false,\n pageJumpInput: \"\",\n isLoading: false,\n };\n }\n\n getState(): AppState {\n // Return a shallow copy to prevent accidental mutation of internal state\n return { ...this.state };\n }\n\n setState(partial: Partial<AppState>): void {\n this.state = { ...this.state, ...partial };\n this.notifyListeners();\n }\n\n subscribe(listener: StateListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notifyListeners(): void {\n for (const listener of this.listeners) {\n try {\n listener(this.state);\n } catch (error) {\n // Log error but don't let one listener break others\n console.error(\"State listener error:\", error instanceof Error ? error.message : error);\n }\n }\n }\n\n // Computed getters\n getSelectedQueue(): QueueStats | null {\n const { queues, selectedQueueIndex } = this.state;\n return queues[selectedQueueIndex] ?? null;\n }\n\n getSelectedJob(): JobSummary | null {\n const { jobs, selectedJobIndex } = this.state;\n return jobs[selectedJobIndex] ?? null;\n }\n\n // Queue navigation\n selectNextQueue(): void {\n const { queues, selectedQueueIndex } = this.state;\n if (selectedQueueIndex < queues.length - 1) {\n this.setState({\n selectedQueueIndex: selectedQueueIndex + 1,\n // Reset job selection when queue changes\n selectedJobIndex: 0,\n jobsPage: 1,\n });\n }\n }\n\n selectPrevQueue(): void {\n const { selectedQueueIndex } = this.state;\n if (selectedQueueIndex > 0) {\n this.setState({\n selectedQueueIndex: selectedQueueIndex - 1,\n selectedJobIndex: 0,\n jobsPage: 1,\n });\n }\n }\n\n // Job navigation\n selectNextJob(): void {\n const { jobs, selectedJobIndex } = this.state;\n if (selectedJobIndex < jobs.length - 1) {\n this.setState({ selectedJobIndex: selectedJobIndex + 1 });\n }\n }\n\n selectPrevJob(): void {\n const { selectedJobIndex } = this.state;\n if (selectedJobIndex > 0) {\n this.setState({ selectedJobIndex: selectedJobIndex - 1 });\n }\n }\n\n // Pagination\n nextPage(): void {\n const { jobsPage, jobsTotalPages } = this.state;\n if (jobsPage < jobsTotalPages) {\n this.setState({\n jobsPage: jobsPage + 1,\n selectedJobIndex: 0,\n });\n }\n }\n\n prevPage(): void {\n const { jobsPage } = this.state;\n if (jobsPage > 1) {\n this.setState({\n jobsPage: jobsPage - 1,\n selectedJobIndex: 0,\n });\n }\n }\n\n goToPage(page: number): void {\n const { jobsTotalPages } = this.state;\n const targetPage = Math.max(1, Math.min(page, jobsTotalPages));\n this.setState({\n jobsPage: targetPage,\n selectedJobIndex: 0,\n });\n }\n\n // Status filter\n setJobsStatus(status: JobListView): void {\n this.setState({\n jobsStatus: status,\n jobsPage: 1,\n selectedJobIndex: 0,\n });\n }\n\n // Focus management\n toggleFocus(): void {\n const { focusedPane } = this.state;\n this.setState({\n focusedPane: focusedPane === \"queues\" ? \"jobs\" : \"queues\",\n });\n }\n\n // Detail view\n openJobDetail(detail: JobDetail): void {\n this.setState({\n jobDetail: detail,\n showJobDetail: true,\n });\n }\n\n closeJobDetail(): void {\n this.setState({\n jobDetail: null,\n showJobDetail: false,\n });\n }\n\n // Delete confirmation\n showDeleteConfirm(): void {\n this.setState({ showConfirmDelete: true });\n }\n\n hideDeleteConfirm(): void {\n this.setState({ showConfirmDelete: false });\n }\n\n // Page jump\n showPageJumpModal(): void {\n this.setState({ showPageJump: true, pageJumpInput: \"\" });\n }\n\n hidePageJumpModal(): void {\n this.setState({ showPageJump: false, pageJumpInput: \"\" });\n }\n\n updatePageJumpInput(input: string): void {\n // Only allow numeric input\n const numericInput = input.replace(/\\D/g, \"\");\n this.setState({ pageJumpInput: numericInput });\n }\n\n appendPageJumpInput(char: string): void {\n if (/^\\d$/.test(char)) {\n const { pageJumpInput } = this.state;\n this.setState({ pageJumpInput: pageJumpInput + char });\n }\n }\n\n backspacePageJumpInput(): void {\n const { pageJumpInput } = this.state;\n this.setState({ pageJumpInput: pageJumpInput.slice(0, -1) });\n }\n\n // Scheduler navigation\n selectNextScheduler(): void {\n const { schedulers, selectedSchedulerIndex } = this.state;\n if (selectedSchedulerIndex < schedulers.length - 1) {\n this.setState({ selectedSchedulerIndex: selectedSchedulerIndex + 1 });\n }\n }\n\n selectPrevScheduler(): void {\n const { selectedSchedulerIndex } = this.state;\n if (selectedSchedulerIndex > 0) {\n this.setState({ selectedSchedulerIndex: selectedSchedulerIndex - 1 });\n }\n }\n\n getSelectedScheduler(): JobSchedulerSummary | null {\n const { schedulers, selectedSchedulerIndex } = this.state;\n return schedulers[selectedSchedulerIndex] ?? null;\n }\n\n // Scheduler pagination\n nextSchedulerPage(): void {\n const { schedulersPage, schedulersTotalPages } = this.state;\n if (schedulersPage < schedulersTotalPages) {\n this.setState({\n schedulersPage: schedulersPage + 1,\n selectedSchedulerIndex: 0,\n });\n }\n }\n\n prevSchedulerPage(): void {\n const { schedulersPage } = this.state;\n if (schedulersPage > 1) {\n this.setState({\n schedulersPage: schedulersPage - 1,\n selectedSchedulerIndex: 0,\n });\n }\n }\n\n goToSchedulerPage(page: number): void {\n const { schedulersTotalPages } = this.state;\n const targetPage = Math.max(1, Math.min(page, schedulersTotalPages));\n this.setState({\n schedulersPage: targetPage,\n selectedSchedulerIndex: 0,\n });\n }\n\n // Scheduler detail view\n openSchedulerDetail(detail: JobSchedulerDetail): void {\n this.setState({\n schedulerDetail: detail,\n showSchedulerDetail: true,\n });\n }\n\n closeSchedulerDetail(): void {\n this.setState({\n schedulerDetail: null,\n showSchedulerDetail: false,\n });\n }\n}\n\n// Singleton state manager\nexport const stateManager = new StateManager();\n",
|
|
7
7
|
"import { config } from \"dotenv\";\nimport { z } from \"zod\";\nimport { parseArgs } from \"util\";\n\n// Load .env file\nconfig();\n\nconst configSchema = z.object({\n redis: z.object({\n host: z.string().default(\"localhost\"),\n port: z.coerce.number().int().positive().default(6379),\n password: z.string().optional(),\n db: z.coerce.number().int().min(0).default(0),\n }),\n pollInterval: z.coerce.number().int().positive().default(3000),\n queueNames: z.array(z.string()).optional(),\n});\n\nexport type Config = z.infer<typeof configSchema>;\n\nexport interface CliArgs {\n redisHost?: string;\n redisPort?: number;\n redisPassword?: string;\n redisDb?: number;\n pollInterval?: number;\n queues?: string[];\n help?: boolean;\n version?: boolean;\n}\n\nconst VERSION = \"0.1.0\";\n\nconst HELP_TEXT = `\nbullmq-dash - Terminal UI dashboard for BullMQ queue monitoring\n\nUsage: bullmq-dash [options]\n\nOptions:\n --redis-host <host> Redis host (default: localhost)\n --redis-port <port> Redis port (default: 6379)\n --redis-password <pass> Redis password\n --redis-db <db> Redis database number (default: 0)\n --poll-interval <ms> Polling interval in milliseconds (default: 3000)\n --queues <names> Comma-separated queue names to monitor\n -v, --version Show version\n -h, --help Show this help message\n\nEnvironment Variables:\n REDIS_HOST Redis host\n REDIS_PORT Redis port\n REDIS_PASSWORD Redis password\n REDIS_DB Redis database number\n POLL_INTERVAL Polling interval in milliseconds\n QUEUE_NAMES Comma-separated queue names\n\nExamples:\n bullmq-dash\n bullmq-dash --redis-host 192.168.1.100 --redis-port 6380\n bullmq-dash --queues email,notifications\n`;\n\nexport function parseCliArgs(): CliArgs {\n try {\n const { values } = parseArgs({\n args: process.argv.slice(2),\n options: {\n \"redis-host\": { type: \"string\" },\n \"redis-port\": { type: \"string\" },\n \"redis-password\": { type: \"string\" },\n \"redis-db\": { type: \"string\" },\n \"poll-interval\": { type: \"string\" },\n queues: { type: \"string\" },\n help: { type: \"boolean\", short: \"h\" },\n version: { type: \"boolean\", short: \"v\" },\n },\n strict: true,\n });\n\n return {\n redisHost: values[\"redis-host\"],\n redisPort: values[\"redis-port\"] ? parseInt(values[\"redis-port\"], 10) : undefined,\n redisPassword: values[\"redis-password\"],\n redisDb: values[\"redis-db\"] ? parseInt(values[\"redis-db\"], 10) : undefined,\n pollInterval: values[\"poll-interval\"] ? parseInt(values[\"poll-interval\"], 10) : undefined,\n queues: values.queues ? parseQueueNames(values.queues) : undefined,\n help: values.help,\n version: values.version,\n };\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"Unknown option\")) {\n console.error(`Error: ${error.message}`);\n console.error(\"Use --help to see available options.\");\n process.exit(1);\n }\n throw error;\n }\n}\n\nexport function showHelp(): void {\n console.log(HELP_TEXT);\n process.exit(0);\n}\n\nexport function showVersion(): void {\n console.log(`bullmq-dash v${VERSION}`);\n process.exit(0);\n}\n\nexport function parseQueueNames(value: string | undefined): string[] | undefined {\n if (!value || value.trim() === \"\") return undefined;\n return value\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\n/**\n * Check if Redis host is configured from any source\n */\nexport function hasRedisHostConfig(cliArgs: CliArgs): boolean {\n return !!(cliArgs.redisHost || process.env.REDIS_HOST);\n}\n\n/**\n * Load config with priority: CLI args > env vars > defaults\n */\nexport function loadConfig(cliArgs: CliArgs): Config {\n const raw = {\n redis: {\n host: cliArgs.redisHost ?? process.env.REDIS_HOST,\n port: cliArgs.redisPort ?? process.env.REDIS_PORT,\n password: cliArgs.redisPassword ?? process.env.REDIS_PASSWORD ?? undefined,\n db: cliArgs.redisDb ?? process.env.REDIS_DB,\n },\n pollInterval: cliArgs.pollInterval ?? process.env.POLL_INTERVAL,\n queueNames: cliArgs.queues ?? parseQueueNames(process.env.QUEUE_NAMES),\n };\n\n const result = configSchema.safeParse(raw);\n\n if (!result.success) {\n const errors = result.error.flatten();\n console.error(\"Configuration error:\");\n console.error(JSON.stringify(errors, null, 2));\n process.exit(1);\n }\n\n return result.data;\n}\n\n/**\n * Create config from interactive prompt answers\n */\nexport function createConfigFromPrompt(\n promptAnswers: { host: string; port: number; password?: string },\n cliArgs: CliArgs,\n): Config {\n const raw = {\n redis: {\n host: promptAnswers.host,\n port: promptAnswers.port,\n password: promptAnswers.password,\n db: cliArgs.redisDb ?? process.env.REDIS_DB,\n },\n pollInterval: cliArgs.pollInterval ?? process.env.POLL_INTERVAL,\n queueNames: cliArgs.queues ?? parseQueueNames(process.env.QUEUE_NAMES),\n };\n\n const result = configSchema.safeParse(raw);\n\n if (!result.success) {\n const errors = result.error.flatten();\n console.error(\"Configuration error:\");\n console.error(JSON.stringify(errors, null, 2));\n process.exit(1);\n }\n\n return result.data;\n}\n\n// Singleton config instance\nlet configInstance: Config | null = null;\n\nexport function setConfig(config: Config): void {\n configInstance = config;\n}\n\nexport function getConfig(): Config {\n if (!configInstance) {\n throw new Error(\"Config not initialized. Call setConfig() first.\");\n }\n return configInstance;\n}\n",
|
|
8
|
-
"import { Queue } from \"bullmq\";\nimport { getConfig } from \"../config.js\";\nimport { getRedisClient } from \"./redis.js\";\n\n// Queue cache to reuse connections\nconst queueCache = new Map<string, Queue>();\n\n// Queue names cache with TTL\nlet queueNamesCache: {\n names: string[];\n timestamp: number;\n} | null = null;\n\nconst QUEUE_NAMES_CACHE_TTL = 5000; // 5 seconds\nconst SCAN_COUNT = 1000;\nconst PREFIX = \"bull:\";\nconst SUFFIX = \":meta\";\n\nexport interface QueueStats {\n name: string;\n counts: {\n wait: number;\n active: number;\n completed: number;\n failed: number;\n delayed: number;\n };\n isPaused: boolean;\n total: number;\n}\n\n/**\n * Get or create a BullMQ Queue instance\n */\nexport function getQueue(queueName: string): Queue {\n if (!queueCache.has(queueName)) {\n const config = getConfig();\n const queue = new Queue(queueName, {\n connection: {\n host: config.redis.host,\n port: config.redis.port,\n password: config.redis.password,\n db: config.redis.db,\n },\n });\n queueCache.set(queueName, queue);\n }\n return queueCache.get(queueName)!;\n}\n\n/**\n * Discover all queue names from Redis\n */\nexport async function discoverQueueNames(): Promise<string[]> {\n const config = getConfig();\n\n // Use configured queue names if provided\n if (config.queueNames && config.queueNames.length > 0) {\n return config.queueNames;\n }\n\n const now = Date.now();\n\n // Return cached names if fresh\n if (queueNamesCache && now - queueNamesCache.timestamp < QUEUE_NAMES_CACHE_TTL) {\n return queueNamesCache.names;\n }\n\n const redis = getRedisClient();\n const queueNames = new Set<string>();\n\n let cursor = \"0\";\n do {\n const [nextCursor, keys] = await redis.scan(\n cursor,\n \"MATCH\",\n \"bull:*:meta\",\n \"COUNT\",\n SCAN_COUNT,\n );\n cursor = nextCursor;\n\n for (const key of keys) {\n if (key.startsWith(PREFIX) && key.endsWith(SUFFIX)) {\n const queueName = key.slice(PREFIX.length, key.length - SUFFIX.length);\n if (queueName && !queueName.includes(\":\")) {\n queueNames.add(queueName);\n }\n }\n }\n } while (cursor !== \"0\");\n\n const sortedNames = Array.from(queueNames).toSorted();\n\n queueNamesCache = {\n names: sortedNames,\n timestamp: now,\n };\n\n return sortedNames;\n}\n\n/**\n * Get stats for a single queue\n */\nexport async function getQueueStats(queueName: string): Promise<QueueStats> {\n const queue = getQueue(queueName);\n\n const [counts, isPaused] = await Promise.all([\n queue.getJobCounts(),\n queue.isPaused(),\n ]);\n\n // Use prioritized count from getJobCounts() instead of fetching all prioritized jobs\n const waitCount = (counts.waiting || 0) + (counts.prioritized || 0);\n\n return {\n name: queueName,\n counts: {\n wait: waitCount,\n active: counts.active || 0,\n completed: counts.completed || 0,\n failed: counts.failed || 0,\n delayed: counts.delayed || 0,\n },\n isPaused,\n total:\n waitCount +\n (counts.active || 0) +\n (counts.completed || 0) +\n (counts.failed || 0) +\n (counts.delayed || 0),\n };\n}\n\n/**\n * Get stats for all discovered queues\n */\nexport async function getAllQueueStats(): Promise<QueueStats[]> {\n const queueNames = await discoverQueueNames();\n\n const stats = await Promise.all(queueNames.map((name) => getQueueStats(name)));\n\n return stats;\n}\n\n/**\n * Close all queue connections\n */\nexport async function closeAllQueues(): Promise<void> {\n const closePromises = Array.from(queueCache.values()).map((queue) => queue.close());\n await Promise.all(closePromises);\n queueCache.clear();\n queueNamesCache = null;\n}\n",
|
|
8
|
+
"import { Queue } from \"bullmq\";\nimport { getConfig } from \"../config.js\";\nimport { getRedisClient } from \"./redis.js\";\n\n// Queue cache to reuse connections\nconst queueCache = new Map<string, Queue>();\n\n// Queue names cache with TTL\nlet queueNamesCache: {\n names: string[];\n timestamp: number;\n} | null = null;\n\nconst QUEUE_NAMES_CACHE_TTL = 5000; // 5 seconds\nconst SCAN_COUNT = 1000;\nconst PREFIX = \"bull:\";\nconst SUFFIX = \":meta\";\n\nexport interface QueueStats {\n name: string;\n counts: {\n wait: number;\n active: number;\n completed: number;\n failed: number;\n delayed: number;\n schedulers: number;\n };\n isPaused: boolean;\n total: number;\n}\n\n/**\n * Get or create a BullMQ Queue instance\n */\nexport function getQueue(queueName: string): Queue {\n if (!queueCache.has(queueName)) {\n const config = getConfig();\n const queue = new Queue(queueName, {\n connection: {\n host: config.redis.host,\n port: config.redis.port,\n password: config.redis.password,\n db: config.redis.db,\n },\n });\n queueCache.set(queueName, queue);\n }\n return queueCache.get(queueName)!;\n}\n\n/**\n * Discover all queue names from Redis\n */\nexport async function discoverQueueNames(): Promise<string[]> {\n const config = getConfig();\n\n // Use configured queue names if provided\n if (config.queueNames && config.queueNames.length > 0) {\n return config.queueNames;\n }\n\n const now = Date.now();\n\n // Return cached names if fresh\n if (queueNamesCache && now - queueNamesCache.timestamp < QUEUE_NAMES_CACHE_TTL) {\n return queueNamesCache.names;\n }\n\n const redis = getRedisClient();\n const queueNames = new Set<string>();\n\n let cursor = \"0\";\n do {\n const [nextCursor, keys] = await redis.scan(\n cursor,\n \"MATCH\",\n \"bull:*:meta\",\n \"COUNT\",\n SCAN_COUNT,\n );\n cursor = nextCursor;\n\n for (const key of keys) {\n if (key.startsWith(PREFIX) && key.endsWith(SUFFIX)) {\n const queueName = key.slice(PREFIX.length, key.length - SUFFIX.length);\n if (queueName && !queueName.includes(\":\")) {\n queueNames.add(queueName);\n }\n }\n }\n } while (cursor !== \"0\");\n\n const sortedNames = Array.from(queueNames).toSorted();\n\n queueNamesCache = {\n names: sortedNames,\n timestamp: now,\n };\n\n return sortedNames;\n}\n\n/**\n * Get stats for a single queue\n */\nexport async function getQueueStats(queueName: string): Promise<QueueStats> {\n const queue = getQueue(queueName);\n\n const [counts, isPaused, schedulersCount] = await Promise.all([\n queue.getJobCounts(),\n queue.isPaused(),\n queue.getJobSchedulersCount(),\n ]);\n\n // Use prioritized count from getJobCounts() instead of fetching all prioritized jobs\n const waitCount = (counts.waiting || 0) + (counts.prioritized || 0);\n\n return {\n name: queueName,\n counts: {\n wait: waitCount,\n active: counts.active || 0,\n completed: counts.completed || 0,\n failed: counts.failed || 0,\n delayed: counts.delayed || 0,\n schedulers: schedulersCount || 0,\n },\n isPaused,\n total:\n waitCount +\n (counts.active || 0) +\n (counts.completed || 0) +\n (counts.failed || 0) +\n (counts.delayed || 0),\n };\n}\n\n/**\n * Get stats for all discovered queues\n */\nexport async function getAllQueueStats(): Promise<QueueStats[]> {\n const queueNames = await discoverQueueNames();\n\n const stats = await Promise.all(queueNames.map((name) => getQueueStats(name)));\n\n return stats;\n}\n\n/**\n * Close all queue connections\n */\nexport async function closeAllQueues(): Promise<void> {\n const closePromises = Array.from(queueCache.values()).map((queue) => queue.close());\n await Promise.all(closePromises);\n queueCache.clear();\n queueNamesCache = null;\n}\n",
|
|
9
9
|
"import Redis from \"ioredis\";\nimport { getConfig } from \"../config.js\";\n\nlet redisClient: Redis | null = null;\n\nexport function getRedisClient(): Redis {\n if (!redisClient) {\n const config = getConfig();\n redisClient = new Redis({\n host: config.redis.host,\n port: config.redis.port,\n password: config.redis.password,\n db: config.redis.db,\n lazyConnect: true,\n retryStrategy: (times) => {\n if (times > 3) {\n return null; // Stop retrying after 3 attempts\n }\n return Math.min(times * 200, 2000);\n },\n });\n }\n return redisClient;\n}\n\nexport async function connectRedis(): Promise<void> {\n const client = getRedisClient();\n await client.connect();\n}\n\nexport async function disconnectRedis(): Promise<void> {\n if (redisClient) {\n await redisClient.quit();\n redisClient = null;\n }\n}\n\nexport async function pingRedis(): Promise<boolean> {\n try {\n const client = getRedisClient();\n const result = await client.ping();\n return result === \"PONG\";\n } catch {\n return false;\n }\n}\n",
|
|
10
|
-
"import type { Job } from \"bullmq\";\nimport { getQueue } from \"./queues.js\";\n\nexport type
|
|
10
|
+
"import type { Job } from \"bullmq\";\nimport { getQueue } from \"./queues.js\";\n\nexport type JobListView = \"latest\" | \"wait\" | \"active\" | \"completed\" | \"failed\" | \"delayed\" | \"schedulers\";\n\nexport interface JobSummary {\n id: string;\n name: string;\n state: string;\n timestamp: number;\n}\n\nexport interface JobDetail extends JobSummary {\n data: unknown;\n opts: unknown;\n attemptsMade: number;\n failedReason?: string;\n stacktrace?: string[];\n returnvalue?: unknown;\n processedOn?: number;\n finishedOn?: number;\n progress?: number | object;\n repeatJobKey?: string;\n delay?: number;\n}\n\nexport interface JobsResult {\n jobs: JobSummary[];\n total: number;\n page: number;\n pageSize: number;\n totalPages: number;\n}\n\nconst PAGE_SIZE = 25;\n\n/**\n * Get jobs by status with pagination\n */\nexport async function getJobs(\n queueName: string,\n status: JobListView,\n page: number = 1,\n pageSize: number = PAGE_SIZE,\n): Promise<JobsResult> {\n const queue = getQueue(queueName);\n const start = (page - 1) * pageSize;\n const end = start + pageSize - 1;\n\n let jobs: Job[];\n let total: number;\n\n if (status === \"latest\") {\n // For \"latest\" status, we fetch from all job statuses sorted by timestamp\n // Use proper pagination by fetching the required range from each category\n const counts = await queue.getJobCounts();\n\n total =\n (counts.waiting || 0) +\n (counts.active || 0) +\n (counts.completed || 0) +\n (counts.failed || 0) +\n (counts.delayed || 0) +\n (counts.prioritized || 0);\n\n // Fetch jobs from all categories with proper pagination\n // We need to fetch enough from each category to cover the requested page\n // Since jobs are sorted by timestamp across all categories, we fetch `end + 1` from each\n const [active, waiting, completed, failed, delayed, prioritized] = await Promise.all([\n queue.getActive(0, end),\n queue.getWaiting(0, end),\n queue.getCompleted(0, end),\n queue.getFailed(0, end),\n queue.getDelayed(0, end),\n queue.getPrioritized(0, end),\n ]);\n\n const allJobs = [...active, ...waiting, ...completed, ...failed, ...delayed, ...prioritized];\n allJobs.sort((a, b) => (b.timestamp || 0) - (a.timestamp || 0));\n\n jobs = allJobs.slice(start, end + 1);\n } else {\n // Fetch specific status\n switch (status) {\n case \"wait\":\n // For \"wait\" status, combine waiting and prioritized jobs with proper pagination\n const waitCounts = await queue.getJobCounts(\"waiting\", \"prioritized\");\n total = (waitCounts.waiting || 0) + (waitCounts.prioritized || 0);\n\n // Fetch enough from each category to cover the requested page\n const [waitingJobs, prioritizedJobs] = await Promise.all([\n queue.getWaiting(0, end),\n queue.getPrioritized(0, end),\n ]);\n\n // Combine and slice for correct pagination\n const combinedWait = [...waitingJobs, ...prioritizedJobs];\n jobs = combinedWait.slice(start, end + 1);\n break;\n case \"active\":\n jobs = await queue.getActive(start, end);\n const activeCounts = await queue.getJobCounts(\"active\");\n total = activeCounts.active || 0;\n break;\n case \"completed\":\n jobs = await queue.getCompleted(start, end);\n const completedCounts = await queue.getJobCounts(\"completed\");\n total = completedCounts.completed || 0;\n break;\n case \"failed\":\n jobs = await queue.getFailed(start, end);\n const failedCounts = await queue.getJobCounts(\"failed\");\n total = failedCounts.failed || 0;\n break;\n case \"delayed\":\n jobs = await queue.getDelayed(start, end);\n const delayedCounts = await queue.getJobCounts(\"delayed\");\n total = delayedCounts.delayed || 0;\n break;\n case \"schedulers\":\n // Schedulers are not jobs - use getJobSchedulers() from schedulers.ts instead\n throw new Error(\"Cannot fetch schedulers via getJobs(). Use getJobSchedulers() instead.\");\n default:\n jobs = [];\n total = 0;\n }\n }\n\n // Get state for each job and convert to summary\n const jobSummaries: JobSummary[] = await Promise.all(\n jobs.map(async (job) => {\n const state = await job.getState();\n return {\n id: job.id || \"unknown\",\n name: job.name,\n state,\n timestamp: job.timestamp || 0,\n };\n }),\n );\n\n return {\n jobs: jobSummaries,\n total,\n page,\n pageSize,\n totalPages: Math.ceil(total / pageSize),\n };\n}\n\n/**\n * Get detailed information for a single job\n */\nexport async function getJobDetail(queueName: string, jobId: string): Promise<JobDetail | null> {\n const queue = getQueue(queueName);\n const job = await queue.getJob(jobId);\n\n if (!job) {\n return null;\n }\n\n const state = await job.getState();\n\n return {\n id: job.id || \"unknown\",\n name: job.name,\n state,\n timestamp: job.timestamp || 0,\n data: job.data,\n opts: job.opts,\n attemptsMade: job.attemptsMade,\n failedReason: job.failedReason,\n stacktrace: job.stacktrace,\n returnvalue: job.returnvalue,\n processedOn: job.processedOn,\n finishedOn: job.finishedOn,\n progress: job.progress as number | object | undefined,\n repeatJobKey: job.repeatJobKey,\n delay: job.delay,\n };\n}\n\n/**\n * Delete a job from a queue\n */\nexport async function deleteJob(queueName: string, jobId: string): Promise<boolean> {\n const queue = getQueue(queueName);\n const job = await queue.getJob(jobId);\n\n if (!job) {\n return false;\n }\n\n await job.remove();\n return true;\n}\n\n/**\n * Format timestamp to relative time string\n */\nexport function formatRelativeTime(timestamp: number): string {\n const now = Date.now();\n const diff = now - timestamp;\n\n const seconds = Math.floor(diff / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) return `${days}d ago`;\n if (hours > 0) return `${hours}h ago`;\n if (minutes > 0) return `${minutes}m ago`;\n if (seconds > 0) return `${seconds}s ago`;\n return \"just now\";\n}\n\n/**\n * Format timestamp to ISO string\n */\nexport function formatTimestamp(timestamp: number | undefined): string {\n if (!timestamp) return \"N/A\";\n return new Date(timestamp).toISOString().replace(\"T\", \" \").slice(0, 19);\n}\n",
|
|
11
11
|
"import { getQueue } from \"./queues.js\";\nimport type { Job } from \"bullmq\";\n\n/**\n * Summary info for scheduler list view\n */\nexport interface JobSchedulerSummary {\n key: string;\n name: string;\n pattern?: string;\n every?: number;\n next?: number;\n iterationCount?: number;\n tz?: string;\n}\n\n/**\n * Info about the next delayed job waiting to be processed\n */\nexport interface NextDelayedJob {\n id: string;\n state: string;\n timestamp: number;\n delay?: number;\n data: unknown;\n opts: unknown;\n}\n\n/**\n * Info about a recent job from history\n */\nexport interface RecentJobInfo {\n id: string;\n state: string;\n timestamp: number;\n processedOn?: number;\n finishedOn?: number;\n failedReason?: string;\n}\n\n/**\n * Full scheduler details for detail view\n */\nexport interface JobSchedulerDetail extends JobSchedulerSummary {\n id?: string | null;\n limit?: number;\n startDate?: number;\n endDate?: number;\n template?: {\n data?: unknown;\n opts?: unknown;\n };\n // Next delayed job info (the job waiting to run)\n nextJob?: NextDelayedJob;\n // Recent job history (last N jobs from this scheduler)\n recentJobs?: RecentJobInfo[];\n}\n\nexport interface SchedulersResult {\n schedulers: JobSchedulerSummary[];\n total: number;\n page: number;\n pageSize: number;\n totalPages: number;\n}\n\nconst PAGE_SIZE = 25;\n\n/**\n * Get job schedulers with pagination\n */\nexport async function getJobSchedulers(\n queueName: string,\n page: number = 1,\n pageSize: number = PAGE_SIZE,\n): Promise<SchedulersResult> {\n const queue = getQueue(queueName);\n const start = (page - 1) * pageSize;\n const end = start + pageSize - 1;\n\n const [schedulers, total] = await Promise.all([\n queue.getJobSchedulers(start, end, false),\n queue.getJobSchedulersCount(),\n ]);\n\n const summaries: JobSchedulerSummary[] = schedulers.map((s) => ({\n key: s.key,\n name: s.name,\n pattern: s.pattern ?? undefined,\n every: s.every ?? undefined,\n next: s.next ?? undefined,\n iterationCount: s.iterationCount ?? undefined,\n tz: s.tz ?? undefined,\n }));\n\n return {\n schedulers: summaries,\n total,\n page,\n pageSize,\n totalPages: Math.ceil(total / pageSize),\n };\n}\n\n/**\n * Get detailed information for a single job scheduler\n */\nexport async function getJobSchedulerDetail(\n queueName: string,\n schedulerKey: string,\n): Promise<JobSchedulerDetail | null> {\n const queue = getQueue(queueName);\n\n // Fetch all schedulers and find the one with matching key\n // (BullMQ doesn't have a direct getJobScheduler(key) method)\n const schedulers = await queue.getJobSchedulers(0, -1, false);\n const scheduler = schedulers.find((s) => s.key === schedulerKey);\n\n if (!scheduler) {\n return null;\n }\n\n // Find the next delayed job for this scheduler\n // Delayed jobs created by schedulers have repeatJobKey set\n const delayedJobs = await queue.getDelayed(0, 100);\n const nextDelayedJob = delayedJobs.find((job) => job.repeatJobKey === schedulerKey);\n\n let nextJob: NextDelayedJob | undefined;\n if (nextDelayedJob) {\n const state = await nextDelayedJob.getState();\n nextJob = {\n id: nextDelayedJob.id || \"unknown\",\n state,\n timestamp: nextDelayedJob.timestamp || 0,\n delay: nextDelayedJob.delay,\n data: nextDelayedJob.data,\n opts: nextDelayedJob.opts,\n };\n }\n\n // Find recent job history for this scheduler\n // Check completed and failed jobs for ones with matching repeatJobKey\n const [completedJobs, failedJobs] = await Promise.all([\n queue.getCompleted(0, 50),\n queue.getFailed(0, 50),\n ]);\n\n // Filter jobs that belong to this scheduler and get their details\n const allHistoryJobs: Job[] = [...completedJobs, ...failedJobs].filter(\n (job) => job.repeatJobKey === schedulerKey,\n );\n\n // Sort by timestamp descending and take most recent 10\n allHistoryJobs.sort((a, b) => (b.timestamp || 0) - (a.timestamp || 0));\n const recentHistoryJobs = allHistoryJobs.slice(0, 10);\n\n const recentJobs: RecentJobInfo[] = await Promise.all(\n recentHistoryJobs.map(async (job) => {\n const state = await job.getState();\n return {\n id: job.id || \"unknown\",\n state,\n timestamp: job.timestamp || 0,\n processedOn: job.processedOn,\n finishedOn: job.finishedOn,\n failedReason: job.failedReason,\n };\n }),\n );\n\n return {\n key: scheduler.key,\n name: scheduler.name,\n id: scheduler.id,\n pattern: scheduler.pattern ?? undefined,\n every: scheduler.every ?? undefined,\n next: scheduler.next ?? undefined,\n iterationCount: scheduler.iterationCount ?? undefined,\n tz: scheduler.tz ?? undefined,\n limit: scheduler.limit ?? undefined,\n startDate: scheduler.startDate ?? undefined,\n endDate: scheduler.endDate ?? undefined,\n template: scheduler.template\n ? {\n data: scheduler.template.data,\n opts: scheduler.template.opts,\n }\n : undefined,\n nextJob,\n recentJobs: recentJobs.length > 0 ? recentJobs : undefined,\n };\n}\n\n/**\n * Format interval (every) to human-readable string\n */\nexport function formatInterval(ms: number | undefined): string {\n if (!ms) return \"N/A\";\n\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) return `${days}d ${hours % 24}h`;\n if (hours > 0) return `${hours}h ${minutes % 60}m`;\n if (minutes > 0) return `${minutes}m ${seconds % 60}s`;\n return `${seconds}s`;\n}\n\n/**\n * Format next run time to relative string\n */\nexport function formatNextRun(timestamp: number | undefined): string {\n if (!timestamp) return \"N/A\";\n\n const now = Date.now();\n const diff = timestamp - now;\n\n if (diff <= 0) return \"now\";\n\n const seconds = Math.floor(diff / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) return `in ${days}d ${hours % 24}h`;\n if (hours > 0) return `in ${hours}h ${minutes % 60}m`;\n if (minutes > 0) return `in ${minutes}m`;\n return `in ${seconds}s`;\n}\n\n/**\n * Format timestamp to ISO string\n */\nexport function formatSchedulerTimestamp(timestamp: number | undefined): string {\n if (!timestamp) return \"N/A\";\n return new Date(timestamp).toISOString().replace(\"T\", \" \").slice(0, 19);\n}\n\n/**\n * Get schedule description (pattern or interval)\n */\nexport function getScheduleDescription(scheduler: JobSchedulerSummary): string {\n if (scheduler.pattern) {\n return scheduler.pattern;\n }\n if (scheduler.every) {\n return `every ${formatInterval(scheduler.every)}`;\n }\n return \"N/A\";\n}\n",
|
|
12
12
|
"import { getQueue, discoverQueueNames } from \"./queues.js\";\n\nexport interface GlobalMetrics {\n queueCount: number;\n jobCounts: {\n wait: number;\n active: number;\n completed: number;\n failed: number;\n delayed: number;\n total: number;\n };\n rates: {\n enqueuedPerMin: number; // jobs added per minute\n enqueuedPerSec: number; // jobs added per second\n dequeuedPerMin: number; // jobs processed per minute\n dequeuedPerSec: number; // jobs processed per second\n };\n}\n\n/**\n * Tracks job counts between polls to calculate enqueue/dequeue rates\n */\nclass MetricsTracker {\n private lastPollTime: number | null = null;\n private lastTotalJobs: number = 0; // all jobs that entered the system\n private lastProcessedJobs: number = 0; // completed + failed\n\n // Smoothed rates (using exponential moving average)\n private smoothedEnqueuedPerMin: number = 0;\n private smoothedDequeuedPerMin: number = 0;\n private readonly smoothingFactor = 0.3; // Higher = more responsive, lower = smoother\n\n /**\n * Update tracker with current counts and return calculated rates\n */\n update(jobCounts: GlobalMetrics[\"jobCounts\"]): GlobalMetrics[\"rates\"] {\n const now = Date.now();\n\n // Total jobs = all jobs that have ever entered the system\n // (wait + active + delayed + completed + failed)\n const currentTotalJobs =\n jobCounts.wait +\n jobCounts.active +\n jobCounts.delayed +\n jobCounts.completed +\n jobCounts.failed;\n\n // Processed jobs = jobs that have been dequeued and finished\n const currentProcessedJobs = jobCounts.completed + jobCounts.failed;\n\n // First poll - no previous data to compare\n if (this.lastPollTime === null) {\n this.lastPollTime = now;\n this.lastTotalJobs = currentTotalJobs;\n this.lastProcessedJobs = currentProcessedJobs;\n\n return {\n enqueuedPerMin: 0,\n enqueuedPerSec: 0,\n dequeuedPerMin: 0,\n dequeuedPerSec: 0,\n };\n }\n\n // Calculate time elapsed in minutes\n const elapsedMs = now - this.lastPollTime;\n const elapsedMin = elapsedMs / 60000;\n\n // Avoid division by zero for very short intervals\n if (elapsedMin < 0.001) {\n return {\n enqueuedPerMin: this.smoothedEnqueuedPerMin,\n enqueuedPerSec: this.smoothedEnqueuedPerMin / 60,\n dequeuedPerMin: this.smoothedDequeuedPerMin,\n dequeuedPerSec: this.smoothedDequeuedPerMin / 60,\n };\n }\n\n // Calculate deltas (clamp to 0 if negative due to job deletions)\n const jobsEnqueued = Math.max(0, currentTotalJobs - this.lastTotalJobs);\n const jobsDequeued = Math.max(0, currentProcessedJobs - this.lastProcessedJobs);\n\n // Calculate instantaneous rates (per minute)\n const instantEnqueuedPerMin = jobsEnqueued / elapsedMin;\n const instantDequeuedPerMin = jobsDequeued / elapsedMin;\n\n // Apply exponential moving average for smoother display\n this.smoothedEnqueuedPerMin =\n this.smoothingFactor * instantEnqueuedPerMin +\n (1 - this.smoothingFactor) * this.smoothedEnqueuedPerMin;\n\n this.smoothedDequeuedPerMin =\n this.smoothingFactor * instantDequeuedPerMin +\n (1 - this.smoothingFactor) * this.smoothedDequeuedPerMin;\n\n // Update state for next poll\n this.lastPollTime = now;\n this.lastTotalJobs = currentTotalJobs;\n this.lastProcessedJobs = currentProcessedJobs;\n\n return {\n enqueuedPerMin: parseFloat(this.smoothedEnqueuedPerMin.toFixed(1)),\n enqueuedPerSec: parseFloat((this.smoothedEnqueuedPerMin / 60).toFixed(2)),\n dequeuedPerMin: parseFloat(this.smoothedDequeuedPerMin.toFixed(1)),\n dequeuedPerSec: parseFloat((this.smoothedDequeuedPerMin / 60).toFixed(2)),\n };\n }\n\n /**\n * Reset tracker state (useful for testing or manual reset)\n */\n reset(): void {\n this.lastPollTime = null;\n this.lastTotalJobs = 0;\n this.lastProcessedJobs = 0;\n this.smoothedEnqueuedPerMin = 0;\n this.smoothedDequeuedPerMin = 0;\n }\n}\n\n// Singleton tracker instance\nconst metricsTracker = new MetricsTracker();\n\n/**\n * Reset the metrics tracker (call when reconnecting or resetting state)\n */\nexport function resetMetricsTracker(): void {\n metricsTracker.reset();\n}\n\n/**\n * Get aggregated global metrics across all queues\n */\nexport async function getGlobalMetrics(): Promise<GlobalMetrics> {\n const queueNames = await discoverQueueNames();\n\n if (queueNames.length === 0) {\n return {\n queueCount: 0,\n jobCounts: { wait: 0, active: 0, completed: 0, failed: 0, delayed: 0, total: 0 },\n rates: { enqueuedPerMin: 0, enqueuedPerSec: 0, dequeuedPerMin: 0, dequeuedPerSec: 0 },\n };\n }\n\n // Get all queue stats in parallel\n const allQueuesData = await Promise.all(\n queueNames.map(async (name) => {\n const queue = getQueue(name);\n\n // Use getJobCounts() which includes prioritized count, avoiding the need to fetch all prioritized jobs\n const counts = await queue.getJobCounts();\n\n return {\n wait: (counts.waiting || 0) + (counts.prioritized || 0),\n active: counts.active || 0,\n completed: counts.completed || 0,\n failed: counts.failed || 0,\n delayed: counts.delayed || 0,\n };\n }),\n );\n\n // Aggregate counts\n const jobCounts = allQueuesData.reduce<GlobalMetrics[\"jobCounts\"]>(\n (acc, q) => {\n const queueTotal = q.wait + q.active + q.completed + q.failed + q.delayed;\n return {\n wait: acc.wait + q.wait,\n active: acc.active + q.active,\n completed: acc.completed + q.completed,\n failed: acc.failed + q.failed,\n delayed: acc.delayed + q.delayed,\n total: acc.total + queueTotal,\n };\n },\n { wait: 0, active: 0, completed: 0, failed: 0, delayed: 0, total: 0 },\n );\n\n // Calculate rates using the tracker\n const rates = metricsTracker.update(jobCounts);\n\n return {\n queueCount: queueNames.length,\n jobCounts,\n rates,\n };\n}\n",
|
|
13
|
-
"import { getConfig } from \"./config.js\";\nimport { getAllQueueStats } from \"./data/queues.js\";\nimport { getJobs } from \"./data/jobs.js\";\nimport { getJobSchedulers } from \"./data/schedulers.js\";\nimport { getGlobalMetrics, resetMetricsTracker } from \"./data/metrics.js\";\nimport { stateManager } from \"./state.js\";\n\nclass PollingManager {\n private intervalId: ReturnType<typeof setInterval> | null = null;\n private isRunning = false;\n private isPolling = false;\n\n start(): void {\n if (this.isRunning) return;\n\n const config = getConfig();\n this.isRunning = true;\n\n // Initial fetch\n this.poll();\n\n // Start polling interval\n this.intervalId = setInterval(() => {\n this.poll();\n }, config.pollInterval);\n }\n\n stop(): void {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n this.isRunning = false;\n }\n\n async poll(): Promise<void> {\n // Prevent concurrent polls\n if (this.isPolling) return;\n this.isPolling = true;\n\n const wasConnected = stateManager.getState().connected;\n\n try {\n stateManager.setState({ isLoading: true });\n\n // Fetch queue stats and global metrics in parallel\n const [queues, globalMetrics] = await Promise.all([getAllQueueStats(), getGlobalMetrics()]);\n\n // Clamp selectedQueueIndex to valid range if queues changed\n const currentState = stateManager.getState();\n const clampedIndex = queues.length > 0\n ? Math.min(currentState.selectedQueueIndex, queues.length - 1)\n : 0;\n\n stateManager.setState({\n queues,\n globalMetrics,\n connected: true,\n error: null,\n selectedQueueIndex: clampedIndex,\n });\n\n // Re-read state after update to get current jobsStatus and jobsPage\n const updatedState = stateManager.getState();\n const selectedQueue = queues[clampedIndex];\n if (selectedQueue) {\n // If status is \"
|
|
13
|
+
"import { getConfig } from \"./config.js\";\nimport { getAllQueueStats } from \"./data/queues.js\";\nimport { getJobs } from \"./data/jobs.js\";\nimport { getJobSchedulers } from \"./data/schedulers.js\";\nimport { getGlobalMetrics, resetMetricsTracker } from \"./data/metrics.js\";\nimport { stateManager } from \"./state.js\";\n\nclass PollingManager {\n private intervalId: ReturnType<typeof setInterval> | null = null;\n private isRunning = false;\n private isPolling = false;\n\n start(): void {\n if (this.isRunning) return;\n\n const config = getConfig();\n this.isRunning = true;\n\n // Initial fetch\n this.poll();\n\n // Start polling interval\n this.intervalId = setInterval(() => {\n this.poll();\n }, config.pollInterval);\n }\n\n stop(): void {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n this.isRunning = false;\n }\n\n async poll(): Promise<void> {\n // Prevent concurrent polls\n if (this.isPolling) return;\n this.isPolling = true;\n\n const wasConnected = stateManager.getState().connected;\n\n try {\n stateManager.setState({ isLoading: true });\n\n // Fetch queue stats and global metrics in parallel\n const [queues, globalMetrics] = await Promise.all([getAllQueueStats(), getGlobalMetrics()]);\n\n // Clamp selectedQueueIndex to valid range if queues changed\n const currentState = stateManager.getState();\n const clampedIndex = queues.length > 0\n ? Math.min(currentState.selectedQueueIndex, queues.length - 1)\n : 0;\n\n stateManager.setState({\n queues,\n globalMetrics,\n connected: true,\n error: null,\n selectedQueueIndex: clampedIndex,\n });\n\n // Re-read state after update to get current jobsStatus and jobsPage\n const updatedState = stateManager.getState();\n const selectedQueue = queues[clampedIndex];\n if (selectedQueue) {\n // If status is \"schedulers\", fetch schedulers instead of jobs\n if (updatedState.jobsStatus === \"schedulers\") {\n const schedulersResult = await getJobSchedulers(\n selectedQueue.name,\n updatedState.schedulersPage,\n );\n\n stateManager.setState({\n schedulers: schedulersResult.schedulers,\n schedulersTotal: schedulersResult.total,\n schedulersTotalPages: schedulersResult.totalPages,\n // Clear jobs when viewing schedulers\n jobs: [],\n jobsTotal: 0,\n jobsTotalPages: 0,\n });\n } else {\n const jobsResult = await getJobs(\n selectedQueue.name,\n updatedState.jobsStatus,\n updatedState.jobsPage,\n );\n\n stateManager.setState({\n jobs: jobsResult.jobs,\n jobsTotal: jobsResult.total,\n jobsTotalPages: jobsResult.totalPages,\n // Clear schedulers when viewing jobs\n schedulers: [],\n schedulersTotal: 0,\n schedulersTotalPages: 0,\n });\n }\n } else {\n stateManager.setState({\n jobs: [],\n jobsTotal: 0,\n jobsTotalPages: 0,\n schedulers: [],\n schedulersTotal: 0,\n schedulersTotalPages: 0,\n });\n }\n\n stateManager.setState({ isLoading: false });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : \"Unknown error\";\n\n // Reset metrics tracker when disconnecting to avoid stale rate data on reconnect\n if (wasConnected) {\n resetMetricsTracker();\n }\n\n stateManager.setState({\n connected: false,\n error: errorMessage,\n isLoading: false,\n });\n } finally {\n this.isPolling = false;\n }\n }\n\n // Manual refresh - full poll\n async refresh(): Promise<void> {\n await this.poll();\n }\n\n // Light refresh - only fetch jobs/schedulers for current queue (fast)\n async refreshJobs(): Promise<void> {\n const state = stateManager.getState();\n const selectedQueue = state.queues[state.selectedQueueIndex];\n\n if (!selectedQueue) {\n stateManager.setState({\n jobs: [],\n jobsTotal: 0,\n jobsTotalPages: 0,\n schedulers: [],\n schedulersTotal: 0,\n schedulersTotalPages: 0,\n });\n return;\n }\n\n try {\n // If status is \"schedulers\", fetch schedulers instead of jobs\n if (state.jobsStatus === \"schedulers\") {\n const schedulersResult = await getJobSchedulers(\n selectedQueue.name,\n state.schedulersPage,\n );\n\n stateManager.setState({\n schedulers: schedulersResult.schedulers,\n schedulersTotal: schedulersResult.total,\n schedulersTotalPages: schedulersResult.totalPages,\n });\n } else {\n const jobsResult = await getJobs(selectedQueue.name, state.jobsStatus, state.jobsPage);\n\n stateManager.setState({\n jobs: jobsResult.jobs,\n jobsTotal: jobsResult.total,\n jobsTotalPages: jobsResult.totalPages,\n });\n }\n } catch (error) {\n // Don't disconnect on job refresh failure, but log the error for debugging\n console.error(\"Failed to refresh jobs:\", error instanceof Error ? error.message : error);\n }\n }\n\n // Refresh schedulers specifically\n async refreshSchedulers(): Promise<void> {\n const state = stateManager.getState();\n const selectedQueue = state.queues[state.selectedQueueIndex];\n\n if (!selectedQueue) {\n stateManager.setState({\n schedulers: [],\n schedulersTotal: 0,\n schedulersTotalPages: 0,\n });\n return;\n }\n\n try {\n const schedulersResult = await getJobSchedulers(\n selectedQueue.name,\n state.schedulersPage,\n );\n\n stateManager.setState({\n schedulers: schedulersResult.schedulers,\n schedulersTotal: schedulersResult.total,\n schedulersTotalPages: schedulersResult.totalPages,\n });\n } catch (error) {\n console.error(\"Failed to refresh schedulers:\", error instanceof Error ? error.message : error);\n }\n }\n}\n\n// Singleton\nexport const pollingManager = new PollingManager();\n",
|
|
14
14
|
"import { type CliRenderer, BoxRenderable, TextRenderable, t, fg, bold } from \"@opentui/core\";\nimport { colors } from \"./colors.js\";\n\nexport interface LayoutElements {\n // Root containers\n root: BoxRenderable;\n header: BoxRenderable;\n headerTitle: TextRenderable;\n headerStatus: TextRenderable;\n\n // Metrics bar\n metricsBar: BoxRenderable;\n\n // Main content area\n mainContent: BoxRenderable;\n\n // Left pane (queues)\n leftPane: BoxRenderable;\n\n // Right pane (jobs)\n rightPane: BoxRenderable;\n\n // Footer\n footer: BoxRenderable;\n footerText: TextRenderable;\n}\n\nexport function createLayout(renderer: CliRenderer): LayoutElements {\n\n // Root container - fills entire terminal\n const root = new BoxRenderable(renderer, {\n id: \"root\",\n flexDirection: \"column\",\n width: \"100%\",\n height: \"100%\",\n });\n renderer.root.add(root);\n\n // Header\n const header = new BoxRenderable(renderer, {\n id: \"header\",\n flexDirection: \"row\",\n width: \"100%\",\n height: 3,\n backgroundColor: colors.surface0,\n borderStyle: \"single\",\n borderColor: colors.lavender,\n alignItems: \"center\",\n justifyContent: \"space-between\",\n paddingLeft: 1,\n paddingRight: 1,\n border: true,\n });\n root.add(header);\n\n const headerTitle = new TextRenderable(renderer, {\n id: \"header-title\",\n content: t`${bold(fg(colors.text)(\"bullmq-dash\"))}`,\n fg: colors.text,\n });\n header.add(headerTitle);\n\n const headerStatus = new TextRenderable(renderer, {\n id: \"header-status\",\n content: \"Connecting...\",\n fg: colors.yellow,\n });\n header.add(headerStatus);\n\n // Metrics bar - sits between header and main content\n const metricsBar = new BoxRenderable(renderer, {\n id: \"metrics-bar\",\n flexDirection: \"row\",\n width: \"100%\",\n height: 1,\n backgroundColor: colors.base,\n });\n root.add(metricsBar);\n\n // Main content area (horizontal split)\n const mainContent = new BoxRenderable(renderer, {\n id: \"main-content\",\n flexDirection: \"row\",\n width: \"100%\",\n flexGrow: 1,\n });\n root.add(mainContent);\n\n // Left pane (queues list) - fixed width\n const leftPane = new BoxRenderable(renderer, {\n id: \"left-pane\",\n flexDirection: \"column\",\n width: 30,\n minWidth: 20,\n height: \"100%\",\n backgroundColor: colors.mantle,\n borderStyle: \"single\",\n borderColor: colors.surface0,\n border: true,\n });\n mainContent.add(leftPane);\n\n // Right pane (jobs) - flexible width\n const rightPane = new BoxRenderable(renderer, {\n id: \"right-pane\",\n flexDirection: \"column\",\n flexGrow: 1,\n height: \"100%\",\n backgroundColor: colors.mantle,\n borderStyle: \"single\",\n borderColor: colors.surface0,\n border: true,\n });\n mainContent.add(rightPane);\n\n // Footer\n const footer = new BoxRenderable(renderer, {\n id: \"footer\",\n flexDirection: \"row\",\n width: \"100%\",\n height: 1,\n backgroundColor: colors.base,\n alignItems: \"center\",\n paddingLeft: 1,\n });\n root.add(footer);\n\n const footerText = new TextRenderable(renderer, {\n id: \"footer-text\",\n content: \"j/k: navigate | Tab: switch pane | Enter: select | d: delete | r: refresh | q: quit\",\n fg: colors.overlay0,\n });\n footer.add(footerText);\n\n return {\n root,\n header,\n headerTitle,\n headerStatus,\n metricsBar,\n mainContent,\n leftPane,\n rightPane,\n footer,\n footerText,\n };\n}\n\nexport function updateHeaderStatus(\n headerStatus: TextRenderable,\n connected: boolean,\n error: string | null,\n redisHost?: string,\n redisPort?: number,\n): void {\n if (error) {\n headerStatus.content = `Error: ${error}`;\n headerStatus.fg = colors.red;\n } else if (connected && redisHost && redisPort) {\n headerStatus.content = t`${fg(colors.green)(\"Connected\")} ${fg(colors.subtext0)(`${redisHost}:${redisPort}`)}`;\n headerStatus.fg = colors.green;\n } else if (connected) {\n headerStatus.content = \"Connected\";\n headerStatus.fg = colors.green;\n } else {\n headerStatus.content = \"Connecting...\";\n headerStatus.fg = colors.yellow;\n }\n}\n",
|
|
15
|
-
"/**\n * Catppuccin Mocha color palette\n * Shared across all UI components for consistency\n */\nexport const colors = {\n // Base colors\n base: \"#1e1e2e\",\n mantle: \"#181825\",\n crust: \"#11111b\",\n\n // Surface colors\n surface0: \"#313244\",\n surface1: \"#45475a\",\n\n // Overlay colors\n overlay0: \"#6c7086\",\n overlay1: \"#7f849c\",\n\n // Text colors\n subtext0: \"#a6adc8\",\n text: \"#cdd6f4\",\n\n // Accent colors\n lavender: \"#b4befe\",\n blue: \"#89b4fa\",\n sky: \"#89dceb\",\n teal: \"#94e2d5\",\n green: \"#a6e3a1\",\n yellow: \"#f9e2af\",\n peach: \"#fab387\",\n red: \"#f38ba8\",\n mauve: \"#cba6f7\",\n} as const;\n\nexport type ColorName = keyof typeof colors;\n",
|
|
15
|
+
"/**\n * Catppuccin Mocha color palette\n * Shared across all UI components for consistency\n */\nexport const colors = {\n // Base colors\n base: \"#1e1e2e\",\n mantle: \"#181825\",\n crust: \"#11111b\",\n\n // Surface colors\n surface0: \"#313244\",\n surface1: \"#45475a\",\n\n // Overlay colors\n overlay0: \"#6c7086\",\n overlay1: \"#7f849c\",\n\n // Text colors\n subtext0: \"#a6adc8\",\n text: \"#cdd6f4\",\n\n // Accent colors\n lavender: \"#b4befe\",\n blue: \"#89b4fa\",\n sky: \"#89dceb\",\n teal: \"#94e2d5\",\n green: \"#a6e3a1\",\n yellow: \"#f9e2af\",\n peach: \"#fab387\",\n red: \"#f38ba8\",\n mauve: \"#cba6f7\",\n maroon: \"#eba0ac\",\n} as const;\n\nexport type ColorName = keyof typeof colors;\n",
|
|
16
16
|
"import {\n type CliRenderer,\n BoxRenderable,\n TextRenderable,\n SelectRenderable,\n SelectRenderableEvents,\n type SelectOption,\n} from \"@opentui/core\";\nimport type { QueueStats } from \"../data/queues.js\";\nimport { stateManager } from \"../state.js\";\nimport { pollingManager } from \"../polling.js\";\nimport { colors } from \"./colors.js\";\n\nexport interface QueueListElements {\n container: BoxRenderable;\n title: TextRenderable;\n select: SelectRenderable;\n emptyText: TextRenderable;\n}\n\nexport function createQueueList(renderer: CliRenderer, parent: BoxRenderable): QueueListElements {\n // Container\n const container = new BoxRenderable(renderer, {\n id: \"queue-list-container\",\n flexDirection: \"column\",\n width: \"100%\",\n height: \"100%\",\n });\n parent.add(container);\n\n // Title\n const title = new TextRenderable(renderer, {\n id: \"queue-list-title\",\n content: \" QUEUES\",\n fg: colors.text,\n bg: colors.surface0,\n width: \"100%\",\n height: 1,\n });\n container.add(title);\n\n // Select element for queue list\n const select = new SelectRenderable(renderer, {\n id: \"queue-list-select\",\n height: \"100%\",\n flexGrow: 1,\n options: [],\n backgroundColor: \"transparent\",\n focusedBackgroundColor: \"transparent\",\n selectedBackgroundColor: colors.surface0,\n textColor: colors.text,\n selectedTextColor: colors.sky,\n descriptionColor: colors.overlay0,\n selectedDescriptionColor: colors.subtext0,\n showScrollIndicator: true,\n wrapSelection: false,\n showDescription: true,\n });\n container.add(select);\n\n // Empty state text\n const emptyText = new TextRenderable(renderer, {\n id: \"queue-list-empty\",\n content: \"No queues found\",\n fg: colors.overlay0,\n position: \"absolute\",\n left: 2,\n top: 2,\n });\n emptyText.visible = false;\n container.add(emptyText);\n\n // Handle selection change from SelectRenderable's internal navigation\n select.on(SelectRenderableEvents.SELECTION_CHANGED, (index: number) => {\n const state = stateManager.getState();\n if (state.selectedQueueIndex !== index) {\n stateManager.setState({\n selectedQueueIndex: index,\n selectedJobIndex: 0,\n jobsPage: 1,\n });\n // Only refresh jobs for the newly selected queue (fast)\n pollingManager.refreshJobs();\n }\n });\n\n return { container, title, select, emptyText };\n}\n\nexport function updateQueueList(\n elements: QueueListElements,\n queues: QueueStats[],\n selectedIndex: number,\n isFocused: boolean,\n): void {\n const { select, emptyText, title } = elements;\n\n // Update title to show focus state\n title.content = isFocused ? \" QUEUES [*]\" : \" QUEUES\";\n title.bg = isFocused ? colors.surface1 : colors.surface0;\n\n if (queues.length === 0) {\n select.visible = false;\n emptyText.visible = true;\n return;\n }\n\n select.visible = true;\n emptyText.visible = false;\n\n // Convert queues to select options\n const options: SelectOption[] = queues.map((queue) => ({\n name: queue.name,\n description: `${queue.total} jobs | ${queue.isPaused ? \"PAUSED\" : \"active\"}`,\n value: queue,\n }));\n\n select.options = options;\n\n // Update selection (without triggering event)\n if (select.getSelectedIndex() !== selectedIndex) {\n select.setSelectedIndex(selectedIndex);\n }\n\n // Focus state\n if (isFocused && !select.focused) {\n select.focus();\n } else if (!isFocused && select.focused) {\n select.blur();\n }\n}\n",
|
|
17
|
-
"import { type CliRenderer, BoxRenderable, TextRenderable, t, fg, bold } from \"@opentui/core\";\nimport type { QueueStats } from \"../data/queues.js\";\nimport { colors } from \"./colors.js\";\n\nexport interface QueueStatsElements {\n container: BoxRenderable;\n title: TextRenderable;\n statsText: TextRenderable;\n}\n\nexport function createQueueStats(renderer: CliRenderer, parent: BoxRenderable): QueueStatsElements {\n // Container\n const container = new BoxRenderable(renderer, {\n id: \"queue-stats-container\",\n flexDirection: \"column\",\n width: \"100%\",\n height: 4,\n paddingLeft: 1,\n paddingRight: 1,\n borderStyle: \"single\",\n borderColor: colors.surface0,\n border: true,\n });\n parent.add(container);\n\n // Queue name title\n const title = new TextRenderable(renderer, {\n id: \"queue-stats-title\",\n content: \"Select a queue\",\n fg: colors.text,\n });\n container.add(title);\n\n // Stats line\n const statsText = new TextRenderable(renderer, {\n id: \"queue-stats-text\",\n content: \"\",\n fg: colors.subtext0,\n });\n container.add(statsText);\n\n return { container, title, statsText };\n}\n\nexport function updateQueueStats(elements: QueueStatsElements, queue: QueueStats | null): void {\n const { title, statsText } = elements;\n\n if (!queue) {\n title.content = \"Select a queue\";\n statsText.content = \"\";\n return;\n }\n\n // Queue name with paused indicator\n const pausedIndicator = queue.isPaused ? \" [PAUSED]\" : \"\";\n title.content = t`${bold(fg(colors.text)(queue.name))}${fg(colors.red)(pausedIndicator)}`;\n\n // Stats line with colored counts\n const { counts } = queue;\n statsText.content = t`${fg(colors.yellow)(`wait: ${counts.wait}`)} ${fg(colors.green)(`active: ${counts.active}`)} ${fg(colors.blue)(`completed: ${counts.completed}`)} ${fg(colors.red)(`failed: ${counts.failed}`)} ${fg(colors.mauve)(`delayed: ${counts.delayed}`)}`;\n}\n",
|
|
18
|
-
"import {\n type CliRenderer,\n BoxRenderable,\n TextRenderable,\n t,\n fg,\n bold,\n StyledText,\n} from \"@opentui/core\";\nimport type {
|
|
17
|
+
"import { type CliRenderer, BoxRenderable, TextRenderable, t, fg, bold } from \"@opentui/core\";\nimport type { QueueStats } from \"../data/queues.js\";\nimport { colors } from \"./colors.js\";\n\nexport interface QueueStatsElements {\n container: BoxRenderable;\n title: TextRenderable;\n statsText: TextRenderable;\n}\n\nexport function createQueueStats(renderer: CliRenderer, parent: BoxRenderable): QueueStatsElements {\n // Container\n const container = new BoxRenderable(renderer, {\n id: \"queue-stats-container\",\n flexDirection: \"column\",\n width: \"100%\",\n height: 4,\n paddingLeft: 1,\n paddingRight: 1,\n borderStyle: \"single\",\n borderColor: colors.surface0,\n border: true,\n });\n parent.add(container);\n\n // Queue name title\n const title = new TextRenderable(renderer, {\n id: \"queue-stats-title\",\n content: \"Select a queue\",\n fg: colors.text,\n });\n container.add(title);\n\n // Stats line\n const statsText = new TextRenderable(renderer, {\n id: \"queue-stats-text\",\n content: \"\",\n fg: colors.subtext0,\n });\n container.add(statsText);\n\n return { container, title, statsText };\n}\n\nexport function updateQueueStats(elements: QueueStatsElements, queue: QueueStats | null): void {\n const { title, statsText } = elements;\n\n if (!queue) {\n title.content = \"Select a queue\";\n statsText.content = \"\";\n return;\n }\n\n // Queue name with paused indicator\n const pausedIndicator = queue.isPaused ? \" [PAUSED]\" : \"\";\n title.content = t`${bold(fg(colors.text)(queue.name))}${fg(colors.red)(pausedIndicator)}`;\n\n // Stats line with colored counts\n const { counts } = queue;\n statsText.content = t`${fg(colors.yellow)(`wait: ${counts.wait}`)} ${fg(colors.green)(`active: ${counts.active}`)} ${fg(colors.blue)(`completed: ${counts.completed}`)} ${fg(colors.red)(`failed: ${counts.failed}`)} ${fg(colors.mauve)(`delayed: ${counts.delayed}`)} ${fg(colors.maroon)(`schedulers: ${counts.schedulers}`)}`;\n}\n",
|
|
18
|
+
"import {\n type CliRenderer,\n BoxRenderable,\n TextRenderable,\n t,\n fg,\n bold,\n StyledText,\n} from \"@opentui/core\";\nimport type { JobListView } from \"../data/jobs.js\";\nimport { colors } from \"./colors.js\";\nimport { concatStyledText } from \"./utils.js\";\n\nexport interface StatusFilterElements {\n container: BoxRenderable;\n text: TextRenderable;\n}\n\nconst STATUS_OPTIONS: { key: string; status: JobListView; label: string }[] = [\n { key: \"1\", status: \"latest\", label: \"latest\" },\n { key: \"2\", status: \"wait\", label: \"wait\" },\n { key: \"3\", status: \"active\", label: \"active\" },\n { key: \"4\", status: \"completed\", label: \"completed\" },\n { key: \"5\", status: \"failed\", label: \"failed\" },\n { key: \"6\", status: \"delayed\", label: \"delayed\" },\n { key: \"7\", status: \"schedulers\", label: \"schedulers\" },\n];\n\nexport function createStatusFilter(\n renderer: CliRenderer,\n parent: BoxRenderable,\n): StatusFilterElements {\n // Container\n const container = new BoxRenderable(renderer, {\n id: \"status-filter-container\",\n flexDirection: \"row\",\n width: \"100%\",\n height: 1,\n paddingLeft: 1,\n backgroundColor: colors.base,\n });\n parent.add(container);\n\n // Status text\n const text = new TextRenderable(renderer, {\n id: \"status-filter-text\",\n content: \"\",\n fg: colors.overlay0,\n });\n container.add(text);\n\n return { container, text };\n}\n\nexport function updateStatusFilter(elements: StatusFilterElements, currentStatus: JobListView): void {\n const { text } = elements;\n\n // Build parts with separators between them\n const parts: (StyledText | string)[] = [];\n\n STATUS_OPTIONS.forEach(({ key, status, label }, index) => {\n const isSelected = status === currentStatus;\n if (isSelected) {\n parts.push(t`${bold(fg(colors.sky)(`[${key}:${label}]`))}`);\n } else {\n parts.push(t`${fg(colors.overlay0)(`${key}:${label}`)}`);\n }\n // Add separator between options (but not after the last one)\n if (index < STATUS_OPTIONS.length - 1) {\n parts.push(\" \");\n }\n });\n\n text.content = concatStyledText(...parts);\n}\n\nexport function getStatusFromKey(key: string): JobListView | null {\n const option = STATUS_OPTIONS.find((o) => o.key === key);\n return option?.status ?? null;\n}\n",
|
|
19
19
|
"import { StyledText } from \"@opentui/core\";\n\n/**\n * Helper to concatenate multiple StyledText objects or strings\n * Uses unknown cast to work around internal chunk type not being exported\n */\nexport function concatStyledText(...texts: (StyledText | string)[]): StyledText {\n const allChunks: unknown[] = [];\n for (const text of texts) {\n if (typeof text === \"string\") {\n allChunks.push({ text, fg: null, bg: null, attrs: 0 });\n } else if (text instanceof StyledText) {\n allChunks.push(...text.chunks);\n }\n }\n // StyledText constructor accepts an array of chunks\n return new StyledText(allChunks as ConstructorParameters<typeof StyledText>[0]);\n}\n",
|
|
20
20
|
"import {\n type CliRenderer,\n BoxRenderable,\n TextRenderable,\n SelectRenderable,\n SelectRenderableEvents,\n type SelectOption,\n} from \"@opentui/core\";\nimport type { JobSummary } from \"../data/jobs.js\";\nimport { formatRelativeTime } from \"../data/jobs.js\";\nimport { stateManager } from \"../state.js\";\nimport { colors } from \"./colors.js\";\n\nexport interface JobListElements {\n container: BoxRenderable;\n title: TextRenderable;\n select: SelectRenderable;\n emptyText: TextRenderable;\n pagination: TextRenderable;\n}\n\nexport function createJobList(renderer: CliRenderer, parent: BoxRenderable): JobListElements {\n // Container\n const container = new BoxRenderable(renderer, {\n id: \"job-list-container\",\n flexDirection: \"column\",\n width: \"100%\",\n flexGrow: 1,\n });\n parent.add(container);\n\n // Title / header\n const title = new TextRenderable(renderer, {\n id: \"job-list-title\",\n content: \" JOBS\",\n fg: colors.text,\n bg: colors.surface0,\n width: \"100%\",\n height: 1,\n });\n container.add(title);\n\n // Select element for job list\n const select = new SelectRenderable(renderer, {\n id: \"job-list-select\",\n height: \"100%\",\n flexGrow: 1,\n options: [],\n backgroundColor: \"transparent\",\n focusedBackgroundColor: \"transparent\",\n selectedBackgroundColor: colors.surface0,\n textColor: colors.text,\n selectedTextColor: colors.sky,\n descriptionColor: colors.overlay0,\n selectedDescriptionColor: colors.subtext0,\n showScrollIndicator: true,\n wrapSelection: false,\n showDescription: true,\n });\n container.add(select);\n\n // Empty state text\n const emptyText = new TextRenderable(renderer, {\n id: \"job-list-empty\",\n content: \"No jobs found\",\n fg: colors.overlay0,\n position: \"absolute\",\n left: 2,\n top: 2,\n });\n emptyText.visible = false;\n container.add(emptyText);\n\n // Pagination\n const pagination = new TextRenderable(renderer, {\n id: \"job-list-pagination\",\n content: \"\",\n fg: colors.overlay0,\n height: 1,\n alignSelf: \"center\",\n });\n container.add(pagination);\n\n // Handle selection change\n select.on(SelectRenderableEvents.SELECTION_CHANGED, (index: number) => {\n const state = stateManager.getState();\n if (state.selectedJobIndex !== index) {\n stateManager.setState({ selectedJobIndex: index });\n }\n });\n\n return { container, title, select, emptyText, pagination };\n}\n\nexport function updateJobList(\n elements: JobListElements,\n jobs: JobSummary[],\n selectedIndex: number,\n page: number,\n totalPages: number,\n total: number,\n isFocused: boolean,\n): void {\n const { title, select, emptyText, pagination } = elements;\n\n // Update title to show focus state\n title.content = isFocused ? \" JOBS [*]\" : \" JOBS\";\n title.bg = isFocused ? colors.surface1 : colors.surface0;\n\n if (jobs.length === 0) {\n select.visible = false;\n emptyText.visible = true;\n pagination.content = \"\";\n return;\n }\n\n select.visible = true;\n emptyText.visible = false;\n\n // Convert jobs to select options\n // Note: SelectOption.description must be a string, so we can't use styled text here\n // Colors are controlled by descriptionColor/selectedDescriptionColor props\n const options: SelectOption[] = jobs.map((job) => {\n const timeAgo = formatRelativeTime(job.timestamp);\n\n return {\n name: `${job.id} ${job.name}`,\n description: `${job.state} ${timeAgo}`,\n value: job,\n };\n });\n\n select.options = options;\n\n // Update selection\n if (select.getSelectedIndex() !== selectedIndex) {\n select.setSelectedIndex(selectedIndex);\n }\n\n // Focus state\n if (isFocused && !select.focused) {\n select.focus();\n } else if (!isFocused && select.focused) {\n select.blur();\n }\n\n // Pagination\n pagination.content = `Page ${page}/${totalPages} (${total} total) ← prev | next → | g jump`;\n}\n",
|
|
21
21
|
"import {\n type CliRenderer,\n BoxRenderable,\n TextRenderable,\n t,\n fg,\n bold,\n StyledText,\n} from \"@opentui/core\";\nimport type { JobDetail } from \"../data/jobs.js\";\nimport { formatTimestamp } from \"../data/jobs.js\";\nimport { formatInterval } from \"../data/schedulers.js\";\nimport { colors } from \"./colors.js\";\nimport { concatStyledText } from \"./utils.js\";\n\nexport interface JobDetailElements {\n overlay: BoxRenderable;\n container: BoxRenderable;\n title: TextRenderable;\n content: TextRenderable;\n footer: TextRenderable;\n}\n\nexport function createJobDetail(renderer: CliRenderer): JobDetailElements {\n // Semi-transparent overlay\n const overlay = new BoxRenderable(renderer, {\n id: \"job-detail-overlay\",\n position: \"absolute\",\n left: 0,\n top: 0,\n width: \"100%\",\n height: \"100%\",\n backgroundColor: colors.crust,\n zIndex: 100,\n });\n overlay.visible = false;\n renderer.root.add(overlay);\n\n // Modal container\n const container = new BoxRenderable(renderer, {\n id: \"job-detail-container\",\n position: \"absolute\",\n left: 5,\n top: 2,\n width: \"90%\",\n height: \"90%\",\n backgroundColor: colors.base,\n borderStyle: \"double\",\n borderColor: colors.blue,\n flexDirection: \"column\",\n zIndex: 101,\n border: true,\n });\n container.visible = false;\n renderer.root.add(container);\n\n // Title bar\n const title = new TextRenderable(renderer, {\n id: \"job-detail-title\",\n content: \"Job Detail\",\n fg: colors.text,\n bg: colors.surface0,\n width: \"100%\",\n height: 1,\n paddingLeft: 1,\n });\n container.add(title);\n\n // Content area\n const content = new TextRenderable(renderer, {\n id: \"job-detail-content\",\n content: \"\",\n fg: colors.text,\n flexGrow: 1,\n paddingLeft: 1,\n paddingTop: 1,\n });\n container.add(content);\n\n // Footer\n const footer = new TextRenderable(renderer, {\n id: \"job-detail-footer\",\n content: \"d: delete job | Esc: close\",\n fg: colors.overlay0,\n bg: colors.surface0,\n width: \"100%\",\n height: 1,\n paddingLeft: 1,\n });\n container.add(footer);\n\n return { overlay, container, title, content, footer };\n}\n\nfunction formatData(data: unknown): string {\n try {\n return JSON.stringify(data, null, 2);\n } catch {\n return String(data);\n }\n}\n\nfunction getStateColor(state: string): string {\n switch (state) {\n case \"active\":\n return colors.green;\n case \"waiting\":\n case \"wait\":\n return colors.yellow;\n case \"completed\":\n return colors.blue;\n case \"failed\":\n return colors.red;\n case \"delayed\":\n return colors.mauve;\n default:\n return colors.subtext0;\n }\n}\n\nexport function updateJobDetail(\n elements: JobDetailElements,\n job: JobDetail | null,\n visible: boolean,\n): void {\n const { overlay, container, title, content } = elements;\n\n overlay.visible = visible;\n container.visible = visible;\n\n if (!job || !visible) {\n return;\n }\n\n // Update title\n title.content = t` Job: ${bold(fg(colors.text)(job.id))}`;\n\n // Build content using StyledText concatenation\n const stateColor = getStateColor(job.state);\n const parts: (StyledText | string)[] = [];\n\n parts.push(t`${bold(\"ID:\")} ${job.id}`);\n parts.push(\"\\n\");\n parts.push(t`${bold(\"Name:\")} ${job.name}`);\n parts.push(\"\\n\");\n parts.push(t`${bold(\"State:\")} ${fg(stateColor)(job.state)}`);\n parts.push(\"\\n\");\n parts.push(t`${bold(\"Attempts:\")} ${String(job.attemptsMade)}`);\n parts.push(\"\\n\");\n parts.push(t`${bold(\"Created:\")} ${formatTimestamp(job.timestamp)}`);\n\n if (job.processedOn) {\n parts.push(\"\\n\");\n parts.push(t`${bold(\"Processed:\")} ${formatTimestamp(job.processedOn)}`);\n }\n\n if (job.finishedOn) {\n parts.push(\"\\n\");\n parts.push(t`${bold(\"Finished:\")} ${formatTimestamp(job.finishedOn)}`);\n }\n\n // Show scheduler info if this job was created by a scheduler (repeatable job)\n if (job.repeatJobKey) {\n parts.push(\"\\n\\n\");\n parts.push(t`${bold(fg(colors.peach)(\"Scheduler Info:\"))}`);\n parts.push(\"\\n\");\n parts.push(t`${bold(\"Scheduler:\")} ${fg(colors.peach)(job.repeatJobKey)}`);\n\n // Try to extract repeat info from opts\n const opts = job.opts as {\n repeat?: { pattern?: string; every?: number };\n delay?: number;\n } | null;\n if (opts?.repeat?.pattern) {\n parts.push(\"\\n\");\n parts.push(t`${bold(\"Pattern:\")} ${fg(colors.green)(opts.repeat.pattern)}`);\n }\n if (opts?.repeat?.every) {\n parts.push(\"\\n\");\n parts.push(t`${bold(\"Interval:\")} ${fg(colors.green)(formatInterval(opts.repeat.every))}`);\n }\n }\n\n // Show delay info if present\n if (job.delay && job.delay > 0) {\n parts.push(\"\\n\");\n parts.push(t`${bold(\"Delay:\")} ${formatInterval(job.delay)}`);\n }\n\n parts.push(\"\\n\\n\");\n parts.push(t`${bold(\"Data:\")}`);\n parts.push(\"\\n\");\n parts.push(formatData(job.data));\n\n if (job.returnvalue !== undefined) {\n parts.push(\"\\n\\n\");\n parts.push(t`${bold(\"Return Value:\")}`);\n parts.push(\"\\n\");\n parts.push(formatData(job.returnvalue));\n }\n\n if (job.failedReason) {\n parts.push(\"\\n\\n\");\n parts.push(t`${bold(fg(colors.red)(\"Error:\"))}`);\n parts.push(\"\\n\");\n parts.push(t`${fg(colors.red)(job.failedReason)}`);\n }\n\n if (job.stacktrace && job.stacktrace.length > 0) {\n parts.push(\"\\n\\n\");\n parts.push(t`${bold(fg(colors.red)(\"Stacktrace:\"))}`);\n for (const line of job.stacktrace) {\n parts.push(\"\\n\");\n parts.push(t`${fg(colors.overlay0)(line)}`);\n }\n }\n\n content.content = concatStyledText(...parts);\n}\n\nexport function showJobDetail(elements: JobDetailElements): void {\n elements.overlay.visible = true;\n elements.container.visible = true;\n}\n\nexport function hideJobDetail(elements: JobDetailElements): void {\n elements.overlay.visible = false;\n elements.container.visible = false;\n}\n",
|
|
22
|
-
"import {\n type CliRenderer,\n BoxRenderable,\n TextRenderable,\n SelectRenderable,\n SelectRenderableEvents,\n type SelectOption,\n} from \"@opentui/core\";\nimport type { JobSchedulerSummary } from \"../data/schedulers.js\";\nimport { formatNextRun, getScheduleDescription } from \"../data/schedulers.js\";\nimport { stateManager } from \"../state.js\";\nimport { colors } from \"./colors.js\";\n\nexport interface SchedulerListElements {\n container: BoxRenderable;\n title: TextRenderable;\n select: SelectRenderable;\n emptyText: TextRenderable;\n pagination: TextRenderable;\n}\n\nexport function createSchedulerList(\n renderer: CliRenderer,\n parent: BoxRenderable,\n): SchedulerListElements {\n // Container\n const container = new BoxRenderable(renderer, {\n id: \"scheduler-list-container\",\n flexDirection: \"column\",\n width: \"100%\",\n flexGrow: 1,\n });\n container.visible = false;\n parent.add(container);\n\n // Title / header\n const title = new TextRenderable(renderer, {\n id: \"scheduler-list-title\",\n content: \" SCHEDULERS\",\n fg: colors.text,\n bg: colors.surface0,\n width: \"100%\",\n height: 1,\n });\n container.add(title);\n\n // Select element for scheduler list\n const select = new SelectRenderable(renderer, {\n id: \"scheduler-list-select\",\n height: \"100%\",\n flexGrow: 1,\n options: [],\n backgroundColor: \"transparent\",\n focusedBackgroundColor: \"transparent\",\n selectedBackgroundColor: colors.surface0,\n textColor: colors.text,\n selectedTextColor: colors.peach,\n descriptionColor: colors.overlay0,\n selectedDescriptionColor: colors.subtext0,\n showScrollIndicator: true,\n wrapSelection: false,\n showDescription: true,\n });\n container.add(select);\n\n // Empty state text\n const emptyText = new TextRenderable(renderer, {\n id: \"scheduler-list-empty\",\n content: \"No
|
|
22
|
+
"import {\n type CliRenderer,\n BoxRenderable,\n TextRenderable,\n SelectRenderable,\n SelectRenderableEvents,\n type SelectOption,\n} from \"@opentui/core\";\nimport type { JobSchedulerSummary } from \"../data/schedulers.js\";\nimport { formatNextRun, getScheduleDescription } from \"../data/schedulers.js\";\nimport { stateManager } from \"../state.js\";\nimport { colors } from \"./colors.js\";\n\nexport interface SchedulerListElements {\n container: BoxRenderable;\n title: TextRenderable;\n select: SelectRenderable;\n emptyText: TextRenderable;\n pagination: TextRenderable;\n}\n\nexport function createSchedulerList(\n renderer: CliRenderer,\n parent: BoxRenderable,\n): SchedulerListElements {\n // Container\n const container = new BoxRenderable(renderer, {\n id: \"scheduler-list-container\",\n flexDirection: \"column\",\n width: \"100%\",\n flexGrow: 1,\n });\n container.visible = false;\n parent.add(container);\n\n // Title / header\n const title = new TextRenderable(renderer, {\n id: \"scheduler-list-title\",\n content: \" SCHEDULERS\",\n fg: colors.text,\n bg: colors.surface0,\n width: \"100%\",\n height: 1,\n });\n container.add(title);\n\n // Select element for scheduler list\n const select = new SelectRenderable(renderer, {\n id: \"scheduler-list-select\",\n height: \"100%\",\n flexGrow: 1,\n options: [],\n backgroundColor: \"transparent\",\n focusedBackgroundColor: \"transparent\",\n selectedBackgroundColor: colors.surface0,\n textColor: colors.text,\n selectedTextColor: colors.peach,\n descriptionColor: colors.overlay0,\n selectedDescriptionColor: colors.subtext0,\n showScrollIndicator: true,\n wrapSelection: false,\n showDescription: true,\n });\n container.add(select);\n\n // Empty state text\n const emptyText = new TextRenderable(renderer, {\n id: \"scheduler-list-empty\",\n content: \"No job schedulers found\",\n fg: colors.overlay0,\n position: \"absolute\",\n left: 2,\n top: 2,\n });\n emptyText.visible = false;\n container.add(emptyText);\n\n // Pagination\n const pagination = new TextRenderable(renderer, {\n id: \"scheduler-list-pagination\",\n content: \"\",\n fg: colors.overlay0,\n height: 1,\n alignSelf: \"center\",\n });\n container.add(pagination);\n\n // Handle selection change\n select.on(SelectRenderableEvents.SELECTION_CHANGED, (index: number) => {\n const state = stateManager.getState();\n if (state.selectedSchedulerIndex !== index) {\n stateManager.setState({ selectedSchedulerIndex: index });\n }\n });\n\n return { container, title, select, emptyText, pagination };\n}\n\nexport function updateSchedulerList(\n elements: SchedulerListElements,\n schedulers: JobSchedulerSummary[],\n selectedIndex: number,\n page: number,\n totalPages: number,\n total: number,\n isFocused: boolean,\n): void {\n const { title, select, emptyText, pagination } = elements;\n\n // Update title to show focus state\n title.content = isFocused ? \" SCHEDULERS [*]\" : \" SCHEDULERS\";\n title.bg = isFocused ? colors.surface1 : colors.surface0;\n\n if (schedulers.length === 0) {\n select.visible = false;\n emptyText.visible = true;\n pagination.content = \"\";\n return;\n }\n\n select.visible = true;\n emptyText.visible = false;\n\n // Convert schedulers to select options\n const options: SelectOption[] = schedulers.map((scheduler) => {\n const schedule = getScheduleDescription(scheduler);\n const nextRun = formatNextRun(scheduler.next);\n const iterations = scheduler.iterationCount ?? 0;\n\n return {\n name: `${scheduler.key} ${scheduler.name}`,\n description: `${schedule} ${nextRun} (${iterations} runs)`,\n value: scheduler,\n };\n });\n\n select.options = options;\n\n // Update selection\n if (select.getSelectedIndex() !== selectedIndex) {\n select.setSelectedIndex(selectedIndex);\n }\n\n // Focus state\n if (isFocused && !select.focused) {\n select.focus();\n } else if (!isFocused && select.focused) {\n select.blur();\n }\n\n // Pagination\n pagination.content = `Page ${page}/${totalPages} (${total} total) <- prev | next -> | g jump`;\n}\n\nexport function showSchedulerList(elements: SchedulerListElements): void {\n elements.container.visible = true;\n}\n\nexport function hideSchedulerList(elements: SchedulerListElements): void {\n elements.container.visible = false;\n}\n",
|
|
23
23
|
"import {\n type CliRenderer,\n BoxRenderable,\n TextRenderable,\n t,\n fg,\n bold,\n StyledText,\n} from \"@opentui/core\";\nimport type { JobSchedulerDetail, RecentJobInfo } from \"../data/schedulers.js\";\nimport { formatInterval, formatSchedulerTimestamp, formatNextRun } from \"../data/schedulers.js\";\nimport { colors } from \"./colors.js\";\nimport { concatStyledText } from \"./utils.js\";\n\nexport interface SchedulerDetailElements {\n overlay: BoxRenderable;\n container: BoxRenderable;\n title: TextRenderable;\n content: TextRenderable;\n footer: TextRenderable;\n}\n\nexport function createSchedulerDetail(renderer: CliRenderer): SchedulerDetailElements {\n // Semi-transparent overlay\n const overlay = new BoxRenderable(renderer, {\n id: \"scheduler-detail-overlay\",\n position: \"absolute\",\n left: 0,\n top: 0,\n width: \"100%\",\n height: \"100%\",\n backgroundColor: colors.crust,\n zIndex: 100,\n });\n overlay.visible = false;\n renderer.root.add(overlay);\n\n // Modal container\n const container = new BoxRenderable(renderer, {\n id: \"scheduler-detail-container\",\n position: \"absolute\",\n left: 5,\n top: 2,\n width: \"90%\",\n height: \"90%\",\n backgroundColor: colors.base,\n borderStyle: \"double\",\n borderColor: colors.peach,\n flexDirection: \"column\",\n zIndex: 101,\n border: true,\n });\n container.visible = false;\n renderer.root.add(container);\n\n // Title bar\n const title = new TextRenderable(renderer, {\n id: \"scheduler-detail-title\",\n content: \"Scheduler Detail\",\n fg: colors.text,\n bg: colors.surface0,\n width: \"100%\",\n height: 1,\n paddingLeft: 1,\n });\n container.add(title);\n\n // Content area\n const content = new TextRenderable(renderer, {\n id: \"scheduler-detail-content\",\n content: \"\",\n fg: colors.text,\n flexGrow: 1,\n paddingLeft: 1,\n paddingTop: 1,\n });\n container.add(content);\n\n // Footer\n const footer = new TextRenderable(renderer, {\n id: \"scheduler-detail-footer\",\n content: \"j: view next job | Esc: close\",\n fg: colors.overlay0,\n bg: colors.surface0,\n width: \"100%\",\n height: 1,\n paddingLeft: 1,\n });\n container.add(footer);\n\n return { overlay, container, title, content, footer };\n}\n\nfunction formatData(data: unknown, maxLength: number = 500): string {\n try {\n const json = JSON.stringify(data, null, 2);\n if (json.length > maxLength) {\n return json.slice(0, maxLength) + \"\\n ...\";\n }\n return json;\n } catch {\n return String(data);\n }\n}\n\nfunction getStateColor(state: string): string {\n switch (state) {\n case \"active\":\n return colors.green;\n case \"waiting\":\n case \"wait\":\n return colors.yellow;\n case \"completed\":\n return colors.blue;\n case \"failed\":\n return colors.red;\n case \"delayed\":\n return colors.mauve;\n default:\n return colors.subtext0;\n }\n}\n\nfunction formatDuration(startMs: number | undefined, endMs: number | undefined): string {\n if (!startMs || !endMs) return \"\";\n const durationMs = endMs - startMs;\n if (durationMs < 1000) return `${durationMs}ms`;\n if (durationMs < 60000) return `${(durationMs / 1000).toFixed(1)}s`;\n return `${(durationMs / 60000).toFixed(1)}m`;\n}\n\nfunction formatRecentJob(job: RecentJobInfo): StyledText {\n const stateColor = getStateColor(job.state);\n const duration = formatDuration(job.processedOn, job.finishedOn);\n const durationStr = duration ? ` (${duration})` : \"\";\n const timestamp = formatSchedulerTimestamp(job.finishedOn || job.timestamp);\n \n if (job.state === \"failed\" && job.failedReason) {\n const shortReason = job.failedReason.length > 30 \n ? job.failedReason.slice(0, 30) + \"...\" \n : job.failedReason;\n return t` ${fg(colors.overlay0)(`#${job.id}`)} ${fg(stateColor)(job.state)} ${timestamp} ${fg(colors.red)(shortReason)}`;\n }\n \n return t` ${fg(colors.overlay0)(`#${job.id}`)} ${fg(stateColor)(job.state)} ${timestamp}${durationStr}`;\n}\n\nexport function updateSchedulerDetail(\n elements: SchedulerDetailElements,\n scheduler: JobSchedulerDetail | null,\n visible: boolean,\n): void {\n const { overlay, container, title, content, footer } = elements;\n\n overlay.visible = visible;\n container.visible = visible;\n\n if (!scheduler || !visible) {\n return;\n }\n\n // Update title\n title.content = t` Scheduler: ${bold(fg(colors.text)(scheduler.key))}`;\n\n // Update footer based on whether there's a next job\n footer.content = scheduler.nextJob \n ? \"j: view next job | Esc: close\"\n : \"Esc: close\";\n\n // Build content using StyledText concatenation\n const parts: (StyledText | string)[] = [];\n\n parts.push(t`${bold(\"Key:\")} ${scheduler.key}`);\n parts.push(\"\\n\");\n parts.push(t`${bold(\"Name:\")} ${scheduler.name}`);\n\n if (scheduler.id) {\n parts.push(\"\\n\");\n parts.push(t`${bold(\"ID:\")} ${scheduler.id}`);\n }\n\n parts.push(\"\\n\\n\");\n parts.push(t`${bold(fg(colors.peach)(\"Schedule:\"))}`);\n parts.push(\"\\n\");\n\n if (scheduler.pattern) {\n parts.push(t`${bold(\"Pattern:\")} ${fg(colors.green)(scheduler.pattern)}`);\n parts.push(\"\\n\");\n }\n\n if (scheduler.every) {\n parts.push(t`${bold(\"Interval:\")} ${fg(colors.green)(formatInterval(scheduler.every))}`);\n parts.push(\"\\n\");\n }\n\n if (scheduler.tz) {\n parts.push(t`${bold(\"Timezone:\")} ${scheduler.tz}`);\n parts.push(\"\\n\");\n }\n\n if (scheduler.next) {\n parts.push(t`${bold(\"Next Run:\")} ${formatSchedulerTimestamp(scheduler.next)}`);\n parts.push(\"\\n\");\n }\n\n parts.push(\"\\n\");\n parts.push(t`${bold(fg(colors.sky)(\"Statistics:\"))}`);\n parts.push(\"\\n\");\n\n parts.push(t`${bold(\"Iterations:\")} ${String(scheduler.iterationCount ?? 0)}`);\n if (scheduler.limit) {\n parts.push(t` / ${String(scheduler.limit)}`);\n }\n parts.push(\"\\n\");\n\n if (scheduler.startDate) {\n parts.push(t`${bold(\"Start Date:\")} ${formatSchedulerTimestamp(scheduler.startDate)}`);\n parts.push(\"\\n\");\n }\n\n if (scheduler.endDate) {\n parts.push(t`${bold(\"End Date:\")} ${formatSchedulerTimestamp(scheduler.endDate)}`);\n parts.push(\"\\n\");\n }\n\n // Job Template Section\n if (scheduler.template) {\n parts.push(\"\\n\");\n parts.push(t`${bold(fg(colors.mauve)(\"Job Template:\"))}`);\n\n if (scheduler.template.data !== undefined) {\n parts.push(\"\\n\");\n parts.push(t`${bold(\"Data:\")}`);\n parts.push(\"\\n\");\n parts.push(formatData(scheduler.template.data));\n }\n\n if (scheduler.template.opts !== undefined) {\n parts.push(\"\\n\\n\");\n parts.push(t`${bold(\"Options:\")}`);\n parts.push(\"\\n\");\n parts.push(formatData(scheduler.template.opts));\n }\n }\n\n // Next Delayed Job Section\n parts.push(\"\\n\\n\");\n parts.push(t`${bold(fg(colors.yellow)(\"Next Delayed Job:\"))}`);\n parts.push(\"\\n\");\n\n if (scheduler.nextJob) {\n const stateColor = getStateColor(scheduler.nextJob.state);\n parts.push(t`${bold(\"ID:\")} ${scheduler.nextJob.id}`);\n parts.push(\"\\n\");\n parts.push(t`${bold(\"State:\")} ${fg(stateColor)(scheduler.nextJob.state)}`);\n parts.push(\"\\n\");\n \n if (scheduler.next) {\n parts.push(t`${bold(\"Runs:\")} ${fg(colors.green)(formatNextRun(scheduler.next))}`);\n parts.push(\"\\n\");\n }\n\n if (scheduler.nextJob.data !== undefined) {\n parts.push(t`${bold(\"Data:\")}`);\n parts.push(\"\\n\");\n parts.push(formatData(scheduler.nextJob.data, 300));\n }\n } else {\n parts.push(t`${fg(colors.overlay0)(\"No pending job\")}`);\n }\n\n // Recent History Section\n parts.push(\"\\n\\n\");\n parts.push(t`${bold(fg(colors.lavender)(\"Recent History:\"))}`);\n parts.push(\"\\n\");\n\n if (scheduler.recentJobs && scheduler.recentJobs.length > 0) {\n for (const job of scheduler.recentJobs.slice(0, 5)) {\n parts.push(formatRecentJob(job));\n parts.push(\"\\n\");\n }\n if (scheduler.recentJobs.length > 5) {\n parts.push(t` ${fg(colors.overlay0)(`... and ${scheduler.recentJobs.length - 5} more`)}`);\n }\n } else {\n parts.push(t`${fg(colors.overlay0)(\"No history yet\")}`);\n }\n\n content.content = concatStyledText(...parts);\n}\n\nexport function showSchedulerDetail(elements: SchedulerDetailElements): void {\n elements.overlay.visible = true;\n elements.container.visible = true;\n}\n\nexport function hideSchedulerDetail(elements: SchedulerDetailElements): void {\n elements.overlay.visible = false;\n elements.container.visible = false;\n}\n",
|
|
24
24
|
"import { type CliRenderer, BoxRenderable, TextRenderable, t, fg, bold } from \"@opentui/core\";\nimport { colors } from \"./colors.js\";\n\nexport interface ConfirmDialogElements {\n overlay: BoxRenderable;\n container: BoxRenderable;\n message: TextRenderable;\n buttons: TextRenderable;\n}\n\nexport function createConfirmDialog(renderer: CliRenderer): ConfirmDialogElements {\n // Semi-transparent overlay\n const overlay = new BoxRenderable(renderer, {\n id: \"confirm-dialog-overlay\",\n position: \"absolute\",\n left: 0,\n top: 0,\n width: \"100%\",\n height: \"100%\",\n backgroundColor: colors.crust,\n zIndex: 200,\n });\n overlay.visible = false;\n renderer.root.add(overlay);\n\n // Dialog container\n const container = new BoxRenderable(renderer, {\n id: \"confirm-dialog-container\",\n position: \"absolute\",\n left: \"30%\",\n top: \"40%\",\n width: 40,\n height: 7,\n backgroundColor: colors.base,\n borderStyle: \"double\",\n borderColor: colors.red,\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 201,\n border: true,\n });\n container.visible = false;\n renderer.root.add(container);\n\n // Message\n const message = new TextRenderable(renderer, {\n id: \"confirm-dialog-message\",\n content: t`${bold(fg(colors.text)(\"Delete this job?\"))}`,\n fg: colors.text,\n marginTop: 1,\n });\n container.add(message);\n\n // Buttons hint\n const buttons = new TextRenderable(renderer, {\n id: \"confirm-dialog-buttons\",\n content: t`${fg(colors.green)(\"[y] Yes\")} ${fg(colors.red)(\"[n] No\")}`,\n fg: colors.subtext0,\n marginTop: 1,\n });\n container.add(buttons);\n\n return { overlay, container, message, buttons };\n}\n\nexport function showConfirmDialog(elements: ConfirmDialogElements, jobId: string): void {\n const { overlay, container, message } = elements;\n\n message.content = t`${bold(fg(colors.text)(`Delete job ${jobId}?`))}`;\n\n overlay.visible = true;\n container.visible = true;\n}\n\nexport function hideConfirmDialog(elements: ConfirmDialogElements): void {\n elements.overlay.visible = false;\n elements.container.visible = false;\n}\n",
|
|
25
25
|
"import {\n type CliRenderer,\n BoxRenderable,\n TextRenderable,\n t,\n fg,\n bold,\n StyledText,\n} from \"@opentui/core\";\nimport type { GlobalMetrics } from \"../data/metrics.js\";\nimport { colors } from \"./colors.js\";\nimport { concatStyledText } from \"./utils.js\";\n\nexport interface GlobalMetricsElements {\n container: BoxRenderable;\n text: TextRenderable;\n}\n\nexport function formatNumber(n: number): string {\n if (n >= 1_000_000) {\n return `${(n / 1_000_000).toFixed(1)}M`;\n }\n if (n >= 1_000) {\n return `${(n / 1_000).toFixed(1)}K`;\n }\n return String(n);\n}\n\nexport function createGlobalMetrics(\n renderer: CliRenderer,\n parent: BoxRenderable,\n): GlobalMetricsElements {\n // Container for metrics bar\n const container = new BoxRenderable(renderer, {\n id: \"global-metrics-container\",\n flexDirection: \"row\",\n width: \"100%\",\n height: 1,\n backgroundColor: colors.base,\n paddingLeft: 1,\n paddingRight: 1,\n justifyContent: \"space-between\",\n });\n parent.add(container);\n\n // Metrics text\n const text = new TextRenderable(renderer, {\n id: \"global-metrics-text\",\n content: \"Loading metrics...\",\n fg: colors.overlay0,\n });\n container.add(text);\n\n return { container, text };\n}\n\nexport function updateGlobalMetrics(\n elements: GlobalMetricsElements,\n metrics: GlobalMetrics | null,\n): void {\n const { text } = elements;\n\n if (!metrics) {\n text.content = t`${fg(colors.overlay1)(\"Loading metrics...\")}`;\n return;\n }\n\n const parts: (StyledText | string)[] = [];\n\n // QUEUES\n parts.push(t`${fg(colors.overlay0)(\"QUEUES:\")}`);\n parts.push(t`${bold(fg(colors.text)(String(metrics.queueCount)))}`);\n parts.push(\" \");\n\n // WAITING - alert if > 100\n const waitColor = metrics.jobCounts.wait > 100 ? colors.red : colors.yellow;\n parts.push(t`${fg(colors.overlay0)(\"WAIT:\")}`);\n parts.push(t`${bold(fg(waitColor)(formatNumber(metrics.jobCounts.wait)))}`);\n parts.push(\" \");\n\n // ACTIVE\n parts.push(t`${fg(colors.overlay0)(\"ACTIVE:\")}`);\n parts.push(t`${bold(fg(colors.green)(formatNumber(metrics.jobCounts.active)))}`);\n parts.push(\" \");\n\n // COMPLETED\n parts.push(t`${fg(colors.overlay0)(\"DONE:\")}`);\n parts.push(t`${bold(fg(colors.blue)(formatNumber(metrics.jobCounts.completed)))}`);\n parts.push(\" \");\n\n // FAILED - alert if > 0 (always red since failures are important)\n const failedColor = metrics.jobCounts.failed > 0 ? colors.red : colors.subtext0;\n parts.push(t`${fg(colors.overlay0)(\"FAIL:\")}`);\n parts.push(t`${bold(fg(failedColor)(formatNumber(metrics.jobCounts.failed)))}`);\n parts.push(\" \");\n\n // DELAYED\n parts.push(t`${fg(colors.overlay0)(\"DELAY:\")}`);\n parts.push(t`${bold(fg(colors.mauve)(formatNumber(metrics.jobCounts.delayed)))}`);\n parts.push(\" \");\n\n // ENQUEUED (jobs added per min/sec) - teal\n parts.push(t`${fg(colors.overlay0)(\"ENQ:\")}`);\n parts.push(t`${bold(fg(colors.teal)(`${Math.round(metrics.rates.enqueuedPerMin)}/m`))}`);\n parts.push(t`${fg(colors.subtext0)(` (${metrics.rates.enqueuedPerSec}/s)`)}`);\n parts.push(\" \");\n\n // DEQUEUED (jobs processed per min/sec) - peach\n parts.push(t`${fg(colors.overlay0)(\"DEQ:\")}`);\n parts.push(t`${bold(fg(colors.peach)(`${Math.round(metrics.rates.dequeuedPerMin)}/m`))}`);\n parts.push(t`${fg(colors.subtext0)(` (${metrics.rates.dequeuedPerSec}/s)`)}`);\n\n text.content = concatStyledText(...parts);\n}\n",
|
|
26
26
|
"import { type CliRenderer, BoxRenderable, TextRenderable, t, fg, bold } from \"@opentui/core\";\nimport { colors } from \"./colors.js\";\n\nexport interface PageJumpElements {\n overlay: BoxRenderable;\n container: BoxRenderable;\n title: TextRenderable;\n input: TextRenderable;\n hint: TextRenderable;\n}\n\nexport function createPageJump(renderer: CliRenderer): PageJumpElements {\n // Semi-transparent overlay\n const overlay = new BoxRenderable(renderer, {\n id: \"page-jump-overlay\",\n position: \"absolute\",\n left: 0,\n top: 0,\n width: \"100%\",\n height: \"100%\",\n backgroundColor: colors.crust,\n zIndex: 200,\n });\n overlay.visible = false;\n renderer.root.add(overlay);\n\n // Dialog container\n const container = new BoxRenderable(renderer, {\n id: \"page-jump-container\",\n position: \"absolute\",\n left: \"30%\",\n top: \"40%\",\n width: 40,\n height: 9,\n backgroundColor: colors.base,\n borderStyle: \"rounded\",\n borderColor: colors.blue,\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 201,\n border: true,\n });\n container.visible = false;\n renderer.root.add(container);\n\n // Title\n const title = new TextRenderable(renderer, {\n id: \"page-jump-title\",\n content: t`${bold(fg(colors.text)(\"Go to Page\"))}`,\n fg: colors.text,\n marginTop: 1,\n });\n container.add(title);\n\n // Input display\n const input = new TextRenderable(renderer, {\n id: \"page-jump-input\",\n content: \"_\",\n fg: colors.sky,\n marginTop: 1,\n });\n container.add(input);\n\n // Hint\n const hint = new TextRenderable(renderer, {\n id: \"page-jump-hint\",\n content: t`${fg(colors.overlay0)(\"Enter page number, then press Enter\")}`,\n fg: colors.subtext0,\n marginTop: 1,\n });\n container.add(hint);\n\n return { overlay, container, title, input, hint };\n}\n\nexport function updatePageJump(\n elements: PageJumpElements,\n visible: boolean,\n inputValue: string,\n currentPage: number,\n totalPages: number,\n): void {\n const { overlay, container, input, hint } = elements;\n\n overlay.visible = visible;\n container.visible = visible;\n\n if (visible) {\n // Show input with cursor\n const displayValue = inputValue || \"\";\n input.content = t`${fg(colors.sky)(displayValue)}${fg(colors.overlay0)(\"_\")}`;\n\n // Update hint with page info\n hint.content = t`${fg(colors.overlay0)(`Current: ${currentPage}/${totalPages} | Esc to cancel`)}`;\n }\n}\n\nexport function showPageJump(elements: PageJumpElements): void {\n elements.overlay.visible = true;\n elements.container.visible = true;\n}\n\nexport function hidePageJump(elements: PageJumpElements): void {\n elements.overlay.visible = false;\n elements.container.visible = false;\n}\n",
|
|
27
|
-
"import * as readline from \"readline\";\
|
|
27
|
+
"import * as readline from \"readline\";\n\nexport interface ConfigPromptAnswers {\n host: string;\n port: number;\n password?: string;\n}\n\n// ANSI color codes for terminal output\nconst cyan = (text: string) => `\\x1b[36m${text}\\x1b[0m`;\nconst green = (text: string) => `\\x1b[32m${text}\\x1b[0m`;\nconst dim = (text: string) => `\\x1b[2m${text}\\x1b[0m`;\nconst bold = (text: string) => `\\x1b[1m${text}\\x1b[0m`;\n\nfunction createReadlineInterface(): readline.Interface {\n return readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n}\n\nfunction prompt(rl: readline.Interface, question: string): Promise<string> {\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n resolve(answer);\n });\n });\n}\n\nfunction promptPassword(rl: readline.Interface, question: string): Promise<string> {\n return new Promise((resolve) => {\n // For password, we'll use a simple approach\n // Note: This won't mask input in all terminals, but works for basic cases\n process.stdout.write(question);\n\n let password = \"\";\n const stdin = process.stdin;\n const wasRaw = stdin.isRaw;\n\n if (stdin.isTTY) {\n stdin.setRawMode(true);\n }\n stdin.resume();\n\n const onData = (char: Buffer) => {\n const c = char.toString(\"utf8\");\n\n switch (c) {\n case \"\\n\":\n case \"\\r\":\n case \"\\u0004\": // Ctrl+D\n stdin.removeListener(\"data\", onData);\n if (stdin.isTTY) {\n stdin.setRawMode(wasRaw ?? false);\n }\n console.log(); // New line after password\n resolve(password);\n break;\n case \"\\u0003\": // Ctrl+C\n process.exit(0);\n break;\n case \"\\u007F\": // Backspace\n if (password.length > 0) {\n password = password.slice(0, -1);\n process.stdout.write(\"\\b \\b\"); // Erase character\n }\n break;\n default:\n password += c;\n process.stdout.write(\"*\");\n break;\n }\n };\n\n stdin.on(\"data\", onData);\n });\n}\n\nexport async function runConfigPrompt(): Promise<ConfigPromptAnswers> {\n const rl = createReadlineInterface();\n\n console.log();\n console.log(bold(cyan(\"Redis Connection Setup\")));\n console.log();\n\n try {\n // Host\n const hostInput = await prompt(rl, `Redis Host ${dim(\"[localhost]\")}: `);\n const host = hostInput.trim() || \"localhost\";\n\n // Port\n const portInput = await prompt(rl, `Redis Port ${dim(\"[6379]\")}: `);\n const port = portInput.trim() ? parseInt(portInput.trim(), 10) : 6379;\n\n if (isNaN(port) || port <= 0 || port > 65535) {\n console.error(\"Invalid port number. Using default 6379.\");\n }\n\n // Close readline before password prompt (we use raw mode for password)\n rl.close();\n\n // Password (with masking)\n const password = await promptPassword(\n createReadlineInterface(),\n `Redis Password ${dim(\"(empty for none)\")}: `,\n );\n\n console.log();\n console.log(green(\"✓\") + ` Connecting to ${host}:${port}...`);\n console.log();\n\n return {\n host,\n port: isNaN(port) || port <= 0 ? 6379 : port,\n password: password || undefined,\n };\n } finally {\n rl.close();\n }\n}\n",
|
|
28
28
|
"import { App } from \"./app.js\";\nimport {\n parseCliArgs,\n showHelp,\n showVersion,\n hasRedisHostConfig,\n loadConfig,\n createConfigFromPrompt,\n setConfig,\n} from \"./config.js\";\nimport { runConfigPrompt } from \"./ui/config-prompt.js\";\n\nasync function main() {\n // Parse CLI arguments\n const cliArgs = parseCliArgs();\n\n // Handle --help and --version\n if (cliArgs.help) {\n showHelp();\n return;\n }\n\n if (cliArgs.version) {\n showVersion();\n return;\n }\n\n let config;\n\n // Check if Redis host is configured\n if (hasRedisHostConfig(cliArgs)) {\n // Load config from CLI args and env vars\n config = loadConfig(cliArgs);\n console.log(\"Hello!\");\n console.log(`Connecting to Redis at ${config.redis.host}:${config.redis.port}...`);\n console.log(\"\");\n } else {\n // Run interactive prompt\n const promptAnswers = await runConfigPrompt();\n config = createConfigFromPrompt(promptAnswers, cliArgs);\n }\n\n // Set the global config\n setConfig(config);\n\n try {\n const app = new App();\n await app.start();\n } catch (error) {\n console.error(\"Failed to start application:\");\n if (error instanceof Error) {\n console.error(error.message);\n } else {\n console.error(error);\n }\n process.exit(1);\n }\n}\n\nmain();\n"
|
|
29
29
|
],
|
|
30
|
-
"mappings": "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",
|
|
31
|
-
"debugId": "
|
|
30
|
+
"mappings": "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",
|
|
31
|
+
"debugId": "BE423ECE3B11D4A564756E2164756E21",
|
|
32
32
|
"names": []
|
|
33
33
|
}
|
package/dist/state.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { QueueStats } from "./data/queues.js";
|
|
2
|
-
import type { JobSummary, JobDetail,
|
|
2
|
+
import type { JobSummary, JobDetail, JobListView } from "./data/jobs.js";
|
|
3
3
|
import type { GlobalMetrics } from "./data/metrics.js";
|
|
4
4
|
import type { JobSchedulerSummary, JobSchedulerDetail } from "./data/schedulers.js";
|
|
5
5
|
export type FocusedPane = "queues" | "jobs";
|
|
@@ -13,7 +13,7 @@ export interface AppState {
|
|
|
13
13
|
jobsTotal: number;
|
|
14
14
|
jobsPage: number;
|
|
15
15
|
jobsTotalPages: number;
|
|
16
|
-
jobsStatus:
|
|
16
|
+
jobsStatus: JobListView;
|
|
17
17
|
selectedJobIndex: number;
|
|
18
18
|
jobDetail: JobDetail | null;
|
|
19
19
|
showJobDetail: boolean;
|
|
@@ -48,7 +48,7 @@ declare class StateManager {
|
|
|
48
48
|
nextPage(): void;
|
|
49
49
|
prevPage(): void;
|
|
50
50
|
goToPage(page: number): void;
|
|
51
|
-
setJobsStatus(status:
|
|
51
|
+
setJobsStatus(status: JobListView): void;
|
|
52
52
|
toggleFocus(): void;
|
|
53
53
|
openJobDetail(detail: JobDetail): void;
|
|
54
54
|
closeJobDetail(): void;
|
package/dist/state.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"}
|
package/dist/ui/colors.d.ts
CHANGED
package/dist/ui/colors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../src/ui/colors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,MAAM
|
|
1
|
+
{"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../src/ui/colors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;CA6BT,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,MAAM,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-prompt.d.ts","sourceRoot":"","sources":["../../src/ui/config-prompt.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config-prompt.d.ts","sourceRoot":"","sources":["../../src/ui/config-prompt.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAwED,wBAAsB,eAAe,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAyCpE"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { type CliRenderer, BoxRenderable, TextRenderable } from "@opentui/core";
|
|
2
|
-
import type {
|
|
2
|
+
import type { JobListView } from "../data/jobs.js";
|
|
3
3
|
export interface StatusFilterElements {
|
|
4
4
|
container: BoxRenderable;
|
|
5
5
|
text: TextRenderable;
|
|
6
6
|
}
|
|
7
7
|
export declare function createStatusFilter(renderer: CliRenderer, parent: BoxRenderable): StatusFilterElements;
|
|
8
|
-
export declare function updateStatusFilter(elements: StatusFilterElements, currentStatus:
|
|
9
|
-
export declare function getStatusFromKey(key: string):
|
|
8
|
+
export declare function updateStatusFilter(elements: StatusFilterElements, currentStatus: JobListView): void;
|
|
9
|
+
export declare function getStatusFromKey(key: string): JobListView | null;
|
|
10
10
|
//# sourceMappingURL=status-filter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status-filter.d.ts","sourceRoot":"","sources":["../../src/ui/status-filter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAChB,aAAa,EACb,cAAc,EAKf,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"status-filter.d.ts","sourceRoot":"","sources":["../../src/ui/status-filter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAChB,aAAa,EACb,cAAc,EAKf,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAInD,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,aAAa,CAAC;IACzB,IAAI,EAAE,cAAc,CAAC;CACtB;AAYD,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,aAAa,GACpB,oBAAoB,CAqBtB;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,oBAAoB,EAAE,aAAa,EAAE,WAAW,GAAG,IAAI,CAoBnG;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAGhE"}
|