4runr-os 2.10.39 → 2.10.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/apps/gateway/dist/apps/gateway/src/index.js +14 -4
  2. package/apps/gateway/dist/apps/gateway/src/index.js.map +1 -1
  3. package/apps/gateway/dist/apps/gateway/src/metrics/monitoring-detail.d.ts +18 -0
  4. package/apps/gateway/dist/apps/gateway/src/metrics/monitoring-detail.d.ts.map +1 -0
  5. package/apps/gateway/dist/apps/gateway/src/metrics/monitoring-detail.js +117 -0
  6. package/apps/gateway/dist/apps/gateway/src/metrics/monitoring-detail.js.map +1 -0
  7. package/apps/gateway/dist/apps/gateway/src/middleware/log-capture.d.ts +2 -0
  8. package/apps/gateway/dist/apps/gateway/src/middleware/log-capture.d.ts.map +1 -0
  9. package/apps/gateway/dist/apps/gateway/src/middleware/log-capture.js +54 -0
  10. package/apps/gateway/dist/apps/gateway/src/middleware/log-capture.js.map +1 -0
  11. package/apps/gateway/dist/apps/gateway/src/routes/monitoring.d.ts +15 -0
  12. package/apps/gateway/dist/apps/gateway/src/routes/monitoring.d.ts.map +1 -0
  13. package/apps/gateway/dist/apps/gateway/src/routes/monitoring.js +164 -0
  14. package/apps/gateway/dist/apps/gateway/src/routes/monitoring.js.map +1 -0
  15. package/apps/gateway/package-lock.json +204 -353
  16. package/apps/gateway/src/index.ts +27 -8
  17. package/apps/gateway/src/metrics/monitoring-detail.ts +162 -0
  18. package/apps/gateway/src/middleware/log-capture.ts +70 -0
  19. package/apps/gateway/src/routes/monitoring.ts +298 -0
  20. package/dist/gateway-client.d.ts +2 -0
  21. package/dist/gateway-client.d.ts.map +1 -1
  22. package/dist/gateway-client.js +22 -0
  23. package/dist/gateway-client.js.map +1 -1
  24. package/dist/tui-handlers.js +498 -0
  25. package/dist/tui-handlers.js.map +1 -1
  26. package/mk3-tui/src/app/render_scheduler.rs +111 -112
  27. package/mk3-tui/src/app.rs +1078 -295
  28. package/mk3-tui/src/debug_log.rs +131 -124
  29. package/mk3-tui/src/io/mod.rs +63 -66
  30. package/mk3-tui/src/io/protocol.rs +14 -15
  31. package/mk3-tui/src/io/stdio.rs +31 -32
  32. package/mk3-tui/src/io/ws.rs +25 -32
  33. package/mk3-tui/src/main.rs +774 -212
  34. package/mk3-tui/src/monitoring/mod.rs +428 -0
  35. package/mk3-tui/src/screens/mod.rs +53 -39
  36. package/mk3-tui/src/storage/cache.rs +221 -224
  37. package/mk3-tui/src/storage/mod.rs +5 -6
  38. package/mk3-tui/src/ui/agent_builder.rs +1148 -922
  39. package/mk3-tui/src/ui/agent_list.rs +344 -295
  40. package/mk3-tui/src/ui/boot.rs +145 -148
  41. package/mk3-tui/src/ui/connection_portal.rs +121 -98
  42. package/mk3-tui/src/ui/help.rs +340 -284
  43. package/mk3-tui/src/ui/layout.rs +966 -803
  44. package/mk3-tui/src/ui/mod.rs +1 -1
  45. package/mk3-tui/src/ui/portal_monitoring.rs +1027 -147
  46. package/mk3-tui/src/ui/run_manager.rs +784 -764
  47. package/mk3-tui/src/ui/safe_viewport.rs +236 -235
  48. package/mk3-tui/src/ui/settings.rs +414 -362
  49. package/mk3-tui/src/ui/setup_portal.rs +158 -101
  50. package/mk3-tui/src/websocket.rs +315 -308
  51. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"gateway-client.js","sourceRoot":"","sources":["../src/gateway-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gateway-client.js","sourceRoot":"","sources":["../src/gateway-client.ts"],"names":[],"mappings":"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"}
@@ -132,6 +132,9 @@ async function routeCommand(ctx) {
132
132
  case 'setup':
133
133
  await handleSetupCommand(ctx, action);
134
134
  break;
135
+ case 'monitoring':
136
+ await handleMonitoringCommand(ctx, action);
137
+ break;
135
138
  default:
136
139
  ctx.server.sendError(ctx.ws, ctx.id, `Unknown command category: ${category}`);
137
140
  }
@@ -400,10 +403,146 @@ async function handleSystemCommand(ctx, action) {
400
403
  case 'status':
401
404
  await handleSystemStatus(ctx);
402
405
  break;
406
+ case 'stats':
407
+ await handleSystemStats(ctx);
408
+ break;
403
409
  default:
404
410
  ctx.server.sendError(ctx.ws, ctx.id, `Unknown system action: ${action}`);
405
411
  }
406
412
  }
413
+ function formatBytes(n) {
414
+ if (!Number.isFinite(n) || n < 0)
415
+ return '?';
416
+ const units = ['B', 'KB', 'MB', 'GB', 'TB'];
417
+ let v = n;
418
+ let i = 0;
419
+ while (v >= 1024 && i < units.length - 1) {
420
+ v /= 1024;
421
+ i += 1;
422
+ }
423
+ return `${v.toFixed(i === 0 ? 0 : 1)} ${units[i]}`;
424
+ }
425
+ function formatDuration(seconds) {
426
+ const s = Math.max(0, Math.floor(seconds));
427
+ const d = Math.floor(s / 86400);
428
+ const h = Math.floor((s % 86400) / 3600);
429
+ const m = Math.floor((s % 3600) / 60);
430
+ const sec = s % 60;
431
+ const parts = [];
432
+ if (d)
433
+ parts.push(`${d}d`);
434
+ if (h)
435
+ parts.push(`${h}h`);
436
+ if (m)
437
+ parts.push(`${m}m`);
438
+ if (sec || parts.length === 0)
439
+ parts.push(`${sec}s`);
440
+ return parts.join(' ');
441
+ }
442
+ async function collectSystemStats(ctx, runDiagnostics = false) {
443
+ const mem = process.memoryUsage();
444
+ const cpu = process.cpuUsage();
445
+ const cpus = os.cpus();
446
+ const freeMem = os.freemem();
447
+ const totalMem = os.totalmem();
448
+ const gc = effectiveGatewayClient(ctx);
449
+ const raw = {
450
+ cli: {
451
+ pid: process.pid,
452
+ platform: process.platform,
453
+ node: process.version,
454
+ uptimeSeconds: Math.floor(process.uptime()),
455
+ memory: mem,
456
+ cpuSeconds: {
457
+ user: Number((cpu.user / 1_000_000).toFixed(2)),
458
+ system: Number((cpu.system / 1_000_000).toFixed(2)),
459
+ },
460
+ websocket: {
461
+ port: ctx.server.getListenPort(),
462
+ clients: ctx.server.getClientCount(),
463
+ },
464
+ },
465
+ host: {
466
+ type: os.type(),
467
+ release: os.release(),
468
+ arch: os.arch(),
469
+ cpuModel: cpus[0]?.model ?? 'unknown',
470
+ cpuCores: cpus.length,
471
+ loadAverage: os.loadavg(),
472
+ totalMemoryBytes: totalMem,
473
+ freeMemoryBytes: freeMem,
474
+ },
475
+ gateway: {
476
+ connected: gc !== null,
477
+ url: process.env.GATEWAY_URL || null,
478
+ },
479
+ };
480
+ const lines = [
481
+ '── System stats (CLI host + TUI bridge) ──',
482
+ `timestamp: ${new Date().toISOString()}`,
483
+ '',
484
+ 'OS CLI process',
485
+ ` pid=${process.pid} node=${process.version} uptime=${formatDuration(process.uptime())}`,
486
+ ` memory: rss=${formatBytes(mem.rss)} heap=${formatBytes(mem.heapUsed)}/${formatBytes(mem.heapTotal)} external=${formatBytes(mem.external)}`,
487
+ ` cpu time: user=${(cpu.user / 1_000_000).toFixed(2)}s system=${(cpu.system / 1_000_000).toFixed(2)}s`,
488
+ ` TUI WebSocket: port=${ctx.server.getListenPort()} clients=${ctx.server.getClientCount()}`,
489
+ '',
490
+ 'Host',
491
+ ` ${os.type()} ${os.release()} ${os.arch()} cores=${cpus.length}`,
492
+ ` cpu: ${cpus[0]?.model ?? 'unknown'}`,
493
+ ` memory: free=${formatBytes(freeMem)} / total=${formatBytes(totalMem)} (${(((totalMem - freeMem) / Math.max(totalMem, 1)) * 100).toFixed(1)}% used)`,
494
+ ` loadavg: ${os.loadavg().map((x) => x.toFixed(2)).join(', ')} (0.00 on Windows is expected)`,
495
+ ' disk: unavailable via Node stdlib (Phase 4 keeps this honest; add native probe later if needed)',
496
+ '',
497
+ 'Gateway link',
498
+ ` connected=${gc !== null ? 'yes' : 'no'} url=${process.env.GATEWAY_URL || '(none)'}`,
499
+ ];
500
+ if (runDiagnostics) {
501
+ lines.push('');
502
+ lines.push('Diagnostics');
503
+ if (!gc) {
504
+ lines.push(' Gateway verify: skipped (not connected)');
505
+ }
506
+ else {
507
+ try {
508
+ const v = await gc.verify({ readyTimeoutMs: 8000 });
509
+ raw.gateway = {
510
+ ...raw.gateway,
511
+ verifyOk: v.ok,
512
+ healthLatencyMs: v.healthLatencyMs,
513
+ readyLatencyMs: v.readyLatencyMs,
514
+ };
515
+ lines.push(` Gateway verify: ${v.ok ? 'ok' : 'degraded'} /health=${v.healthLatencyMs ?? '?'}ms /ready=${v.readyLatencyMs ?? '?'}ms`);
516
+ }
517
+ catch (e) {
518
+ raw.gateway = {
519
+ ...raw.gateway,
520
+ verifyError: errorMessage(e),
521
+ };
522
+ lines.push(` Gateway verify: failed — ${errorMessage(e)}`);
523
+ }
524
+ }
525
+ }
526
+ return {
527
+ systemStats: true,
528
+ timestamp: new Date().toISOString(),
529
+ lines,
530
+ raw,
531
+ };
532
+ }
533
+ async function handleSystemStats(ctx) {
534
+ try {
535
+ const diagnostics = ctx.data?.diagnostics === true;
536
+ const stats = await collectSystemStats(ctx, diagnostics);
537
+ ctx.server.sendResponse(ctx.ws, ctx.id, {
538
+ success: true,
539
+ data: stats,
540
+ });
541
+ }
542
+ catch (e) {
543
+ ctx.server.sendError(ctx.ws, ctx.id, errorMessage(e));
544
+ }
545
+ }
407
546
  async function handleSystemStatus(ctx) {
408
547
  // Determine actual mode based on gateway connection
409
548
  let mode;
@@ -668,6 +807,7 @@ async function handleGatewayCommand(ctx, action) {
668
807
  }
669
808
  }
670
809
  function observabilityHealthLines(v) {
810
+ // First line must stay substring-compatible with mk3-tui `SNAPSHOT_MARKER_LIVE` ("Live link check").
671
811
  const lines = ['Live link check (/health + /ready)'];
672
812
  if (!v.ok) {
673
813
  lines.push(`Verify failed: ${v.error ?? 'unknown'} (${v.healthLatencyMs} ms)`);
@@ -733,6 +873,364 @@ function observabilityHealthLines(v) {
733
873
  }
734
874
  return lines;
735
875
  }
876
+ /** Lines before `Dependency checks (from /ready):` — Portal Monitoring “Health” section. */
877
+ function sliceHealthMainLines(full) {
878
+ const i = full.findIndex((l) => l.includes('Dependency checks (from /ready)'));
879
+ if (i === -1)
880
+ return full;
881
+ return full.slice(0, i);
882
+ }
883
+ /** Dependency block only — Portal Monitoring “Dependencies” section. */
884
+ function sliceDependencyLines(full) {
885
+ const i = full.findIndex((l) => l.includes('Dependency checks (from /ready)'));
886
+ if (i === -1)
887
+ return [];
888
+ return full.slice(i);
889
+ }
890
+ function formatMetricsRefreshBlock(snap) {
891
+ const statsNoQueue = snap.statsLines.filter((l) => !l.includes('Queue jobs'));
892
+ const out = [
893
+ 'Prometheus /metrics (HTTP total includes this screen’s /health, /ready, and /metrics polls; add API/agent traffic for runs/queue/SSE).',
894
+ '',
895
+ ...statsNoQueue,
896
+ '',
897
+ 'Top HTTP routes (from http_requests_total labels)',
898
+ ];
899
+ if (snap.routeLines.length > 0) {
900
+ out.push(' (method route) count');
901
+ for (const r of snap.routeLines) {
902
+ out.push(` ${r}`);
903
+ }
904
+ }
905
+ else {
906
+ out.push(' (no labeled requests yet — exercise the Gateway to populate.)');
907
+ }
908
+ return out;
909
+ }
910
+ function formatQueueFromPrometheusSnap(snap) {
911
+ return snap.statsLines.filter((l) => l.includes('Queue jobs'));
912
+ }
913
+ function linesFromQueueMetricsApi(data) {
914
+ if (!data || typeof data !== 'object') {
915
+ return ['(invalid queue response)'];
916
+ }
917
+ const o = data;
918
+ if (o.available === false) {
919
+ return [String(o.message ?? o.error ?? 'Queue unavailable')];
920
+ }
921
+ const jobs = o.jobs;
922
+ if (!jobs) {
923
+ return [JSON.stringify(data)];
924
+ }
925
+ const qn = typeof o.queueName === 'string' ? o.queueName : 'run-execution';
926
+ return [
927
+ `queue: ${qn}`,
928
+ `Queue jobs waiting ${jobs['waiting'] ?? 0}`,
929
+ `Queue jobs active ${jobs['active'] ?? 0}`,
930
+ `Queue jobs completed ${jobs['completed'] ?? 0}`,
931
+ `Queue jobs failed ${jobs['failed'] ?? 0}`,
932
+ `delayed: ${jobs['delayed'] ?? 0}`,
933
+ `paused: ${jobs['paused'] ?? 0}`,
934
+ ];
935
+ }
936
+ /** Phase 3: format JSON from `GET /api/monitoring/dependencies/detail` for TUI lines. */
937
+ function linesFromDependenciesDetailApi(data) {
938
+ if (!data || typeof data !== 'object') {
939
+ return ['(invalid dependencies detail)'];
940
+ }
941
+ const o = data;
942
+ const details = o.details;
943
+ if (!details) {
944
+ return ['(no details object in response)'];
945
+ }
946
+ const lines = ['── Dependencies (detail) ──'];
947
+ const ts = typeof o.timestamp === 'string' ? o.timestamp : '';
948
+ if (ts) {
949
+ lines.push(`Fetched: ${ts}`);
950
+ }
951
+ const telemetry = o.telemetry;
952
+ if (telemetry?.bestEffort === true) {
953
+ lines.push(`Telemetry: best effort (${String(telemetry.source ?? 'unknown source')})`);
954
+ if (typeof telemetry.note === 'string') {
955
+ lines.push(` ${telemetry.note}`);
956
+ }
957
+ }
958
+ lines.push('');
959
+ const db = details.database;
960
+ if (db && typeof db === 'object') {
961
+ const pool = db.pool;
962
+ lines.push(`database: status=${db.status ?? '?'}${db.latency !== undefined ? ` latency=${db.latency}ms` : ''}`);
963
+ if (pool) {
964
+ const tel = db.telemetry;
965
+ lines.push(` pool (best-effort gauge): active=${pool.active ?? '?'} idle=${pool.idle ?? '?'}`);
966
+ if (tel?.bestEffort === true) {
967
+ lines.push(' note: zeros may mean gauge instrumentation is idle, not that Postgres is down.');
968
+ }
969
+ }
970
+ }
971
+ const redis = details.redis;
972
+ if (redis && typeof redis === 'object') {
973
+ const conn = redis.connections;
974
+ lines.push(`redis: status=${redis.status ?? '?'}${redis.latency !== undefined ? ` latency=${redis.latency}ms` : ''}`);
975
+ if (conn) {
976
+ lines.push(` connections.active (best-effort gauge): ${conn.active ?? '?'}`);
977
+ }
978
+ }
979
+ const queue = details.queue;
980
+ if (queue && typeof queue === 'object') {
981
+ lines.push(`queue: status=${queue.status ?? '?'}`);
982
+ const jobs = queue.jobs;
983
+ if (jobs) {
984
+ lines.push(` waiting=${jobs['waiting'] ?? 0} active=${jobs['active'] ?? 0} completed=${jobs['completed'] ?? 0} failed=${jobs['failed'] ?? 0} delayed=${jobs['delayed'] ?? 0}`);
985
+ }
986
+ }
987
+ return lines;
988
+ }
989
+ /** Phase 3: drill-down lines for `monitoring.drill` WebSocket command. */
990
+ function formatMonitoringDrillLines(target, data) {
991
+ if (!data || typeof data !== 'object') {
992
+ return ['(invalid drill response)'];
993
+ }
994
+ const o = data;
995
+ switch (target) {
996
+ case 'metrics_http': {
997
+ const lines = ['── HTTP metrics (Gateway prom-client) ──'];
998
+ const summary = o.summary;
999
+ if (summary) {
1000
+ lines.push(`Requests: ${String(summary.totalRequests ?? '?')} HTTP errors: ${String(summary.totalErrors ?? '?')} error rate: ${String(summary.errorRate ?? '?')}`);
1001
+ }
1002
+ lines.push('');
1003
+ lines.push('Top routes (method route status → count)');
1004
+ const top = o.topRoutes;
1005
+ if (top?.length) {
1006
+ for (const r of top.slice(0, 22)) {
1007
+ lines.push(` ${String(r.method ?? '')} ${String(r.route ?? '')} ${String(r.status_code ?? '')} → ${String(r.count ?? '')}`);
1008
+ }
1009
+ }
1010
+ else {
1011
+ lines.push(' (no labeled http_requests_total samples yet)');
1012
+ }
1013
+ const errs = o.errorsByRoute;
1014
+ if (errs?.some((e) => Number(e.count) > 0)) {
1015
+ lines.push('');
1016
+ lines.push('http_request_errors_total (by route)');
1017
+ for (const e of errs.slice(0, 14)) {
1018
+ if (Number(e.count) > 0) {
1019
+ lines.push(` ${String(e.method ?? '')} ${String(e.route ?? '')} [${String(e.error_type ?? '')}] → ${String(e.count ?? '')}`);
1020
+ }
1021
+ }
1022
+ }
1023
+ return lines;
1024
+ }
1025
+ case 'metrics_runs': {
1026
+ const lines = ['── Run metrics (prom-client) ──'];
1027
+ const summary = o.summary;
1028
+ if (summary) {
1029
+ lines.push(`created=${String(summary.created ?? '?')} started=${String(summary.started ?? '?')} completed=${String(summary.completed ?? '?')} failed=${String(summary.failed ?? '?')} active (gauge)=${String(summary.active ?? '?')}`);
1030
+ }
1031
+ const failedLabels = o.failedStatusLabels;
1032
+ if (failedLabels?.length) {
1033
+ lines.push(`failed label values: ${failedLabels.map((x) => String(x)).join(', ')}`);
1034
+ }
1035
+ else {
1036
+ lines.push('failed label values: none observed');
1037
+ }
1038
+ const byStatus = o.byStatus;
1039
+ if (byStatus?.length) {
1040
+ lines.push('');
1041
+ lines.push('runs_completed_total by status label');
1042
+ for (const row of byStatus) {
1043
+ lines.push(` ${String(row.status ?? '')} → ${String(row.count ?? '')}`);
1044
+ }
1045
+ }
1046
+ return lines;
1047
+ }
1048
+ case 'metrics_queue':
1049
+ return linesFromQueueMetricsApi(data);
1050
+ case 'metrics_sse': {
1051
+ const lines = ['── SSE metrics (prom-client) ──'];
1052
+ const summary = o.summary;
1053
+ if (summary) {
1054
+ lines.push(`opened=${String(summary.connectionsOpened ?? '?')} closed=${String(summary.connectionsClosed ?? '?')} active (gauge)=${String(summary.activeConnections ?? '?')} messages=${String(summary.messagesSent ?? '?')}`);
1055
+ }
1056
+ return lines;
1057
+ }
1058
+ case 'dependencies_detail':
1059
+ return linesFromDependenciesDetailApi(data);
1060
+ default:
1061
+ return [JSON.stringify(data)];
1062
+ }
1063
+ }
1064
+ /**
1065
+ * Phase 2 Portal Monitoring: targeted Gateway calls (`monitoring.refresh`, `monitoring.logs`).
1066
+ */
1067
+ async function handleMonitoringCommand(ctx, action) {
1068
+ const gc = effectiveGatewayClient(ctx);
1069
+ if (action === 'logs') {
1070
+ if (!gc) {
1071
+ ctx.server.sendError(ctx.ws, ctx.id, 'Not connected to a Gateway');
1072
+ return;
1073
+ }
1074
+ const limit = typeof ctx.data?.limit === 'number' ? Math.min(ctx.data.limit, 1000) : 100;
1075
+ const level = typeof ctx.data?.level === 'string' && ctx.data.level.length > 0 ? ctx.data.level : undefined;
1076
+ try {
1077
+ const params = new URLSearchParams();
1078
+ params.set('limit', String(limit));
1079
+ if (level)
1080
+ params.set('level', level);
1081
+ const data = (await gc.getJson(`/api/monitoring/logs?${params.toString()}`));
1082
+ ctx.server.sendResponse(ctx.ws, ctx.id, {
1083
+ success: true,
1084
+ data: {
1085
+ monitoringLogs: true,
1086
+ ...data,
1087
+ },
1088
+ });
1089
+ }
1090
+ catch (e) {
1091
+ ctx.server.sendError(ctx.ws, ctx.id, errorMessage(e));
1092
+ }
1093
+ return;
1094
+ }
1095
+ if (action === 'refresh') {
1096
+ const section = typeof ctx.data?.section === 'string' ? ctx.data.section.trim().toLowerCase() : '';
1097
+ const valid = new Set([
1098
+ 'overview',
1099
+ 'health',
1100
+ 'dependencies',
1101
+ 'metrics',
1102
+ 'queue',
1103
+ 'logs',
1104
+ 'system',
1105
+ ]);
1106
+ if (!valid.has(section)) {
1107
+ ctx.server.sendError(ctx.ws, ctx.id, `Invalid monitoring section: ${section}`);
1108
+ return;
1109
+ }
1110
+ if (section !== 'system' && !gc) {
1111
+ ctx.server.sendError(ctx.ws, ctx.id, 'Not connected to a Gateway');
1112
+ return;
1113
+ }
1114
+ try {
1115
+ // Portal Monitoring TUI sends `gateway.observability` for Overview; this branch exists for
1116
+ // API symmetry and other clients that call `monitoring.refresh` with section `overview`.
1117
+ if (section === 'overview') {
1118
+ if (!gc) {
1119
+ ctx.server.sendError(ctx.ws, ctx.id, 'Not connected to a Gateway');
1120
+ return;
1121
+ }
1122
+ await handleGatewayObservability(ctx);
1123
+ return;
1124
+ }
1125
+ let lines = [];
1126
+ if (section === 'health' || section === 'dependencies') {
1127
+ const v = await gc.verify({ readyTimeoutMs: 8000 });
1128
+ const full = observabilityHealthLines(v);
1129
+ lines = section === 'health' ? sliceHealthMainLines(full) : sliceDependencyLines(full);
1130
+ }
1131
+ else if (section === 'metrics') {
1132
+ const text = await gc.prometheusMetrics();
1133
+ const snap = summarizeGatewayPrometheusMetrics(text);
1134
+ lines = formatMetricsRefreshBlock(snap);
1135
+ }
1136
+ else if (section === 'queue') {
1137
+ try {
1138
+ const data = await gc.getJson('/api/monitoring/metrics/queue');
1139
+ lines = linesFromQueueMetricsApi(data);
1140
+ }
1141
+ catch {
1142
+ const text = await gc.prometheusMetrics();
1143
+ const snap = summarizeGatewayPrometheusMetrics(text);
1144
+ lines = formatQueueFromPrometheusSnap(snap);
1145
+ }
1146
+ }
1147
+ else if (section === 'logs') {
1148
+ const params = new URLSearchParams();
1149
+ params.set('limit', '100');
1150
+ const data = (await gc.getJson(`/api/monitoring/logs?${params.toString()}`));
1151
+ const logs = Array.isArray(data.logs) ? data.logs : [];
1152
+ lines = logs.map((entry) => {
1153
+ if (entry && typeof entry === 'object') {
1154
+ const e = entry;
1155
+ const ts = typeof e.timestamp === 'string' ? e.timestamp : '';
1156
+ const lvl = typeof e.level === 'string' ? e.level : '';
1157
+ const msg = typeof e.message === 'string' ? e.message : JSON.stringify(entry);
1158
+ return `${ts} [${lvl}] ${msg}`;
1159
+ }
1160
+ return String(entry);
1161
+ });
1162
+ }
1163
+ else if (section === 'system') {
1164
+ const stats = await collectSystemStats(ctx, false);
1165
+ lines = stats.lines;
1166
+ }
1167
+ ctx.server.sendResponse(ctx.ws, ctx.id, {
1168
+ success: true,
1169
+ data: {
1170
+ monitoringRefresh: true,
1171
+ section,
1172
+ lines,
1173
+ },
1174
+ });
1175
+ }
1176
+ catch (e) {
1177
+ ctx.server.sendError(ctx.ws, ctx.id, errorMessage(e));
1178
+ }
1179
+ return;
1180
+ }
1181
+ if (action === 'drill') {
1182
+ const target = typeof ctx.data?.target === 'string' ? ctx.data.target.trim() : '';
1183
+ const paths = {
1184
+ metrics_http: '/api/monitoring/metrics/http',
1185
+ metrics_runs: '/api/monitoring/metrics/runs',
1186
+ metrics_queue: '/api/monitoring/metrics/queue',
1187
+ metrics_sse: '/api/monitoring/metrics/sse',
1188
+ dependencies_detail: '/api/monitoring/dependencies/detail',
1189
+ };
1190
+ if (target === 'system_diagnostics') {
1191
+ try {
1192
+ const stats = await collectSystemStats(ctx, true);
1193
+ ctx.server.sendResponse(ctx.ws, ctx.id, {
1194
+ success: true,
1195
+ data: {
1196
+ monitoringDrill: true,
1197
+ target,
1198
+ lines: stats.lines,
1199
+ },
1200
+ });
1201
+ }
1202
+ catch (e) {
1203
+ ctx.server.sendError(ctx.ws, ctx.id, errorMessage(e));
1204
+ }
1205
+ return;
1206
+ }
1207
+ if (!gc) {
1208
+ ctx.server.sendError(ctx.ws, ctx.id, 'Not connected to a Gateway');
1209
+ return;
1210
+ }
1211
+ if (!paths[target]) {
1212
+ ctx.server.sendError(ctx.ws, ctx.id, `Unknown monitoring drill target: ${target}`);
1213
+ return;
1214
+ }
1215
+ try {
1216
+ const raw = await gc.getJson(paths[target]);
1217
+ const lines = formatMonitoringDrillLines(target, raw);
1218
+ ctx.server.sendResponse(ctx.ws, ctx.id, {
1219
+ success: true,
1220
+ data: {
1221
+ monitoringDrill: true,
1222
+ target,
1223
+ lines,
1224
+ },
1225
+ });
1226
+ }
1227
+ catch (e) {
1228
+ ctx.server.sendError(ctx.ws, ctx.id, errorMessage(e));
1229
+ }
1230
+ return;
1231
+ }
1232
+ ctx.server.sendError(ctx.ws, ctx.id, `Unknown monitoring action: ${action}`);
1233
+ }
736
1234
  async function handleGatewayObservability(ctx) {
737
1235
  const gc = effectiveGatewayClient(ctx);
738
1236
  if (!gc) {