rigscope 0.1.0 → 0.1.1
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/.next/BUILD_ID +1 -1
- package/.next/app-path-routes-manifest.json +3 -3
- package/.next/build-manifest.json +2 -2
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +2 -2
- package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/administration/page_client-reference-manifest.js +1 -1
- package/.next/server/app/administration.html +1 -1
- package/.next/server/app/administration.rsc +2 -2
- package/.next/server/app/administration.segments/_full.segment.rsc +2 -2
- package/.next/server/app/administration.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/administration.segments/administration/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/alerts/page_client-reference-manifest.js +1 -1
- package/.next/server/app/alerts.html +1 -1
- package/.next/server/app/alerts.rsc +2 -2
- package/.next/server/app/alerts.segments/_full.segment.rsc +2 -2
- package/.next/server/app/alerts.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/alerts.segments/alerts/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/connections/page_client-reference-manifest.js +1 -1
- package/.next/server/app/connections.html +1 -1
- package/.next/server/app/connections.rsc +2 -2
- package/.next/server/app/connections.segments/_full.segment.rsc +2 -2
- package/.next/server/app/connections.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/connections.segments/connections/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/history/page.js +2 -2
- package/.next/server/app/history/page_client-reference-manifest.js +1 -1
- package/.next/server/app/history.html +1 -1
- package/.next/server/app/history.rsc +4 -4
- package/.next/server/app/history.segments/_full.segment.rsc +4 -4
- package/.next/server/app/history.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/history.segments/history/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +2 -2
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/login.html +1 -1
- package/.next/server/app/login.rsc +2 -2
- package/.next/server/app/login.segments/_full.segment.rsc +2 -2
- package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/machines/[machineId]/page.js +1 -1
- package/.next/server/app/machines/[machineId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/processes/page_client-reference-manifest.js +1 -1
- package/.next/server/app/processes.html +1 -1
- package/.next/server/app/processes.rsc +2 -2
- package/.next/server/app/processes.segments/_full.segment.rsc +2 -2
- package/.next/server/app/processes.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/processes.segments/processes/__PAGE__.segment.rsc +2 -2
- package/.next/server/app-paths-manifest.json +3 -3
- package/.next/server/chunks/168.js +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/static/chunks/408-dc6158e0bb450ef6.js +1 -0
- package/.next/static/chunks/app/history/{page-3fa5846eca26b7f7.js → page-1475454737279ee0.js} +2 -2
- package/.next/static/chunks/app/machines/[machineId]/page-916ee73de5eb067d.js +1 -0
- package/.next/static/css/e45c0c7ef5ba0336.css +1 -0
- package/CHANGELOG.md +12 -0
- package/README.md +53 -136
- package/dist/collector.cjs +9 -1
- package/dist/hub.cjs +12 -3
- package/dist/ops.cjs +6 -2
- package/docs/bottlenecks.md +1 -1
- package/docs/configuration.md +85 -0
- package/docs/development.md +1 -1
- package/docs/installation.md +205 -376
- package/docs/monitoring.md +112 -0
- package/docs/operations.md +103 -68
- package/docs/releasing.md +16 -14
- package/docs/scale-validation.md +34 -3
- package/docs/stress-2026-11-04/180301-probe-m100-u1-s1-20000ms.json +412 -0
- package/docs/stress-2026-11-04/180335-probe-m200-u1-s1-20000ms.json +412 -0
- package/docs/stress-2026-11-04/180409-probe-m400-u1-s1-20000ms.json +412 -0
- package/docs/stress-2026-11-04/180443-probe-m800-u1-s1-20000ms.json +412 -0
- package/docs/stress-2026-11-04/180518-probe-m600-u1-s1-20000ms.json +412 -0
- package/docs/stress-2026-11-04/180553-probe-m500-u1-s1-20000ms.json +412 -0
- package/docs/stress-2026-11-04/180628-probe-m550-u1-s1-20000ms.json +412 -0
- package/docs/stress-2026-11-04/180716-probe-m800-u1-s0-20000ms.json +415 -0
- package/docs/stress-2026-11-04/180751-probe-m1600-u1-s0-20000ms.json +415 -0
- package/docs/stress-2026-11-04/180828-probe-m3200-u1-s0-20000ms.json +416 -0
- package/docs/stress-2026-11-04/180941-probe-m2400-u1-s0-20000ms.json +416 -0
- package/docs/stress-2026-11-04/181031-probe-m2000-u1-s0-20000ms.json +416 -0
- package/docs/stress-2026-11-04/181114-probe-m1800-u1-s0-20000ms.json +416 -0
- package/docs/stress-2026-11-04/181203-probe-m100-u64-s64-20000ms.json +418 -0
- package/docs/stress-2026-11-04/181304-probe-m200-u64-s64-20000ms.json +418 -0
- package/docs/stress-2026-11-04/181405-probe-m400-u64-s64-20000ms.json +418 -0
- package/docs/stress-2026-11-04/181507-probe-m500-u64-s64-20000ms.json +418 -0
- package/docs/stress-2026-11-04/181609-probe-m450-u64-s64-20000ms.json +418 -0
- package/docs/stress-2026-11-04/181845-probe-m2-u2-s2-3000ms.json +419 -0
- package/docs/stress-2026-11-04/181931-probe-m500-u64-s64-30000ms.json +420 -0
- package/docs/stress-2026-11-04/182108-probe-m1800-u1-s0-120000ms.json +418 -0
- package/docs/stress-2026-11-04/182354-probe-m1200-u1-s0-120000ms.json +418 -0
- package/docs/stress-2026-11-04/182625-probe-m900-u1-s0-120000ms.json +418 -0
- package/docs/stress-2026-11-04/182847-probe-m1050-u1-s0-120000ms.json +418 -0
- package/docs/stress-2026-11-04/183112-probe-m1125-u1-s0-120000ms.json +418 -0
- package/docs/stress-2026-11-04/193608-probe-m500-u64-s64-120000ms.json +420 -0
- package/docs/stress-2026-11-04/193909-probe-m529-u1-s1-15000ms.json +420 -0
- package/docs/stress-2026-11-04/193940-probe-m530-u1-s1-15000ms.json +420 -0
- package/docs/stress-2026-11-04/194011-probe-m100-u1-s65-10000ms.json +421 -0
- package/docs/stress-2026-11-04/README.md +205 -0
- package/docs/stress-2026-11-04/index.jsonl +29 -0
- package/docs/stress-2026-11-04/manifest.json +13 -0
- package/docs/stress-2026-11-04/results.html +22 -0
- package/docs/system-installation.md +195 -0
- package/package.json +9 -1
- package/packaging/system/README.md +1 -1
- package/.next/static/chunks/408-18819c6490a5f8d3.js +0 -1
- package/.next/static/chunks/app/machines/[machineId]/page-a5aa1d8676272f38.js +0 -1
- package/.next/static/css/e41ccbccc3afaae5.css +0 -1
- /package/.next/static/{DZKWF9ur7H5wI0c7RAhdq → NE6PGEiJxUnKRceuzUWPc}/_buildManifest.js +0 -0
- /package/.next/static/{DZKWF9ur7H5wI0c7RAhdq → NE6PGEiJxUnKRceuzUWPc}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{"pass": true, "reasons": [], "machines": 100, "users": 1, "sseClients": 1, "durationMs": 20000, "committedPerSecond": 100.0, "sampleCadenceRatio": 0.9998, "historyCadenceRatio": 0.9998, "ackP95Ms": 61.13, "historyP95Ms": 11.29, "eventLoopP99Ms": 34.28, "sseNewestSampleP95Ms": 405, "hubCpuPercentOneCore": 12.69, "hubRssPeakMiB": 131.3, "sseMegabytes": 4.5, "report": "docs/stress-2026-11-04/180301-probe-m100-u1-s1-20000ms.json", "resources": "docs/stress-2026-11-04/180301-probe-m100-u1-s1-20000ms.resources.json", "wallSeconds": 34.1, "minimumAvailableMemoryGiB": 109.4, "peakHostCpuPercent": 6.15, "peakTestRssMiB": 274.1, "swapOutDeltaBytes": 0}
|
|
2
|
+
{"pass": true, "reasons": [], "machines": 200, "users": 1, "sseClients": 1, "durationMs": 20000, "committedPerSecond": 199.9, "sampleCadenceRatio": 0.9997, "historyCadenceRatio": 0.9997, "ackP95Ms": 63.33, "historyP95Ms": 13.55, "eventLoopP99Ms": 44.73, "sseNewestSampleP95Ms": 266, "hubCpuPercentOneCore": 20.42, "hubRssPeakMiB": 153.5, "sseMegabytes": 9.1, "report": "docs/stress-2026-11-04/180335-probe-m200-u1-s1-20000ms.json", "resources": "docs/stress-2026-11-04/180335-probe-m200-u1-s1-20000ms.resources.json", "wallSeconds": 34.1, "minimumAvailableMemoryGiB": 109.8, "peakHostCpuPercent": 3.94, "peakTestRssMiB": 272.3, "swapOutDeltaBytes": 0}
|
|
3
|
+
{"pass": true, "reasons": [], "machines": 400, "users": 1, "sseClients": 1, "durationMs": 20000, "committedPerSecond": 399.1, "sampleCadenceRatio": 0.9978, "historyCadenceRatio": 1.0498, "ackP95Ms": 56.62, "historyP95Ms": 30.29, "eventLoopP99Ms": 45.38, "sseNewestSampleP95Ms": 79, "hubCpuPercentOneCore": 34.98, "hubRssPeakMiB": 192.4, "sseMegabytes": 18.2, "report": "docs/stress-2026-11-04/180409-probe-m400-u1-s1-20000ms.json", "resources": "docs/stress-2026-11-04/180409-probe-m400-u1-s1-20000ms.resources.json", "wallSeconds": 34.1, "minimumAvailableMemoryGiB": 109.7, "peakHostCpuPercent": 4.98, "peakTestRssMiB": 366.0, "swapOutDeltaBytes": 0}
|
|
4
|
+
{"pass": false, "reasons": ["SSE admission/delivery incomplete (0/1)"], "machines": 800, "users": 1, "sseClients": 1, "durationMs": 20000, "committedPerSecond": 799.8, "sampleCadenceRatio": 0.9998, "historyCadenceRatio": 1.0498, "ackP95Ms": 53.04, "historyP95Ms": 5.26, "eventLoopP99Ms": 48.37, "sseNewestSampleP95Ms": 133, "hubCpuPercentOneCore": 60.76, "hubRssPeakMiB": 237.6, "sseMegabytes": 1.6, "report": "docs/stress-2026-11-04/180443-probe-m800-u1-s1-20000ms.json", "resources": "docs/stress-2026-11-04/180443-probe-m800-u1-s1-20000ms.resources.json", "wallSeconds": 35.1, "minimumAvailableMemoryGiB": 109.5, "peakHostCpuPercent": 4.76, "peakTestRssMiB": 382.2, "swapOutDeltaBytes": 0}
|
|
5
|
+
{"pass": false, "reasons": ["SSE admission/delivery incomplete (0/1)"], "machines": 600, "users": 1, "sseClients": 1, "durationMs": 20000, "committedPerSecond": 599.8, "sampleCadenceRatio": 0.9996, "historyCadenceRatio": 1.0498, "ackP95Ms": 54.43, "historyP95Ms": 14.49, "eventLoopP99Ms": 46.2, "sseNewestSampleP95Ms": 71, "hubCpuPercentOneCore": 49.28, "hubRssPeakMiB": 214.1, "sseMegabytes": 1.2, "report": "docs/stress-2026-11-04/180518-probe-m600-u1-s1-20000ms.json", "resources": "docs/stress-2026-11-04/180518-probe-m600-u1-s1-20000ms.resources.json", "wallSeconds": 35.1, "minimumAvailableMemoryGiB": 109.6, "peakHostCpuPercent": 4.08, "peakTestRssMiB": 351.9, "swapOutDeltaBytes": 0}
|
|
6
|
+
{"pass": true, "reasons": [], "machines": 500, "users": 1, "sseClients": 1, "durationMs": 20000, "committedPerSecond": 499.9, "sampleCadenceRatio": 0.9997, "historyCadenceRatio": 1.0497, "ackP95Ms": 55.22, "historyP95Ms": 22.71, "eventLoopP99Ms": 56.03, "sseNewestSampleP95Ms": 149, "hubCpuPercentOneCore": 43.76, "hubRssPeakMiB": 212.6, "sseMegabytes": 37.6, "report": "docs/stress-2026-11-04/180553-probe-m500-u1-s1-20000ms.json", "resources": "docs/stress-2026-11-04/180553-probe-m500-u1-s1-20000ms.resources.json", "wallSeconds": 35.1, "minimumAvailableMemoryGiB": 109.6, "peakHostCpuPercent": 4.1, "peakTestRssMiB": 384.7, "swapOutDeltaBytes": 0}
|
|
7
|
+
{"pass": false, "reasons": ["SSE admission/delivery incomplete (0/1)"], "machines": 550, "users": 1, "sseClients": 1, "durationMs": 20000, "committedPerSecond": 549.8, "sampleCadenceRatio": 0.9997, "historyCadenceRatio": 1.0498, "ackP95Ms": 57.6, "historyP95Ms": 6.43, "eventLoopP99Ms": 50.23, "sseNewestSampleP95Ms": 69, "hubCpuPercentOneCore": 46.03, "hubRssPeakMiB": 184.0, "sseMegabytes": 1.1, "report": "docs/stress-2026-11-04/180628-probe-m550-u1-s1-20000ms.json", "resources": "docs/stress-2026-11-04/180628-probe-m550-u1-s1-20000ms.resources.json", "wallSeconds": 35.1, "minimumAvailableMemoryGiB": 109.7, "peakHostCpuPercent": 4.14, "peakTestRssMiB": 322.7, "swapOutDeltaBytes": 0}
|
|
8
|
+
{"pass": true, "reasons": [], "machines": 800, "users": 1, "sseClients": 0, "durationMs": 20000, "committedPerSecond": 799.9, "sampleCadenceRatio": 0.9999, "historyCadenceRatio": 1.0499, "ackP95Ms": 53.46, "historyP95Ms": 10.13, "eventLoopP99Ms": 46.33, "sseNewestSampleP95Ms": 0, "hubCpuPercentOneCore": 61.88, "hubRssPeakMiB": 217.0, "sseMegabytes": 0.0, "report": "docs/stress-2026-11-04/180716-probe-m800-u1-s0-20000ms.json", "resources": "docs/stress-2026-11-04/180716-probe-m800-u1-s0-20000ms.resources.json", "wallSeconds": 35.1, "minimumAvailableMemoryGiB": 109.6, "peakHostCpuPercent": 4.45, "peakTestRssMiB": 383.4, "swapOutDeltaBytes": 0}
|
|
9
|
+
{"pass": true, "reasons": [], "machines": 1600, "users": 1, "sseClients": 0, "durationMs": 20000, "committedPerSecond": 1605.4, "sampleCadenceRatio": 1.0034, "historyCadenceRatio": 1.0499, "ackP95Ms": 59.54, "historyP95Ms": 19.92, "eventLoopP99Ms": 40.99, "sseNewestSampleP95Ms": 0, "hubCpuPercentOneCore": 95.33, "hubRssPeakMiB": 279.9, "sseMegabytes": 0.0, "report": "docs/stress-2026-11-04/180751-probe-m1600-u1-s0-20000ms.json", "resources": "docs/stress-2026-11-04/180751-probe-m1600-u1-s0-20000ms.resources.json", "wallSeconds": 37.1, "minimumAvailableMemoryGiB": 109.5, "peakHostCpuPercent": 4.41, "peakTestRssMiB": 445.5, "swapOutDeltaBytes": 0}
|
|
10
|
+
{"pass": false, "reasons": ["ack p95 3464.84 > 500 ms", "durable sample cadence 37.1% < 95%", "collector rejection, retry, loss, backpressure or send error", "storage queue, write failure or physical pressure"], "machines": 3200, "users": 1, "sseClients": 0, "durationMs": 20000, "committedPerSecond": 1188.7, "sampleCadenceRatio": 0.3715, "historyCadenceRatio": 1.0499, "ackP95Ms": 3464.84, "historyP95Ms": 33.87, "eventLoopP99Ms": 37.98, "sseNewestSampleP95Ms": 0, "hubCpuPercentOneCore": 110.71, "hubRssPeakMiB": 401.6, "sseMegabytes": 0.0, "report": "docs/stress-2026-11-04/180828-probe-m3200-u1-s0-20000ms.json", "resources": "docs/stress-2026-11-04/180828-probe-m3200-u1-s0-20000ms.resources.json", "wallSeconds": 72.3, "minimumAvailableMemoryGiB": 109.2, "peakHostCpuPercent": 5.59, "peakTestRssMiB": 653.5, "swapOutDeltaBytes": 0}
|
|
11
|
+
{"pass": false, "reasons": ["ack p95 2897.57 > 500 ms", "durable sample cadence 61.6% < 95%", "collector rejection, retry, loss, backpressure or send error", "storage queue, write failure or physical pressure"], "machines": 2400, "users": 1, "sseClients": 0, "durationMs": 20000, "committedPerSecond": 1478.3, "sampleCadenceRatio": 0.616, "historyCadenceRatio": 1.0499, "ackP95Ms": 2897.57, "historyP95Ms": 27.21, "eventLoopP99Ms": 31.46, "sseNewestSampleP95Ms": 0, "hubCpuPercentOneCore": 110.85, "hubRssPeakMiB": 339.8, "sseMegabytes": 0.0, "report": "docs/stress-2026-11-04/180941-probe-m2400-u1-s0-20000ms.json", "resources": "docs/stress-2026-11-04/180941-probe-m2400-u1-s0-20000ms.resources.json", "wallSeconds": 50.6, "minimumAvailableMemoryGiB": 109.3, "peakHostCpuPercent": 4.9, "peakTestRssMiB": 543.2, "swapOutDeltaBytes": 0}
|
|
12
|
+
{"pass": false, "reasons": ["ack p95 2524.02 > 500 ms", "durable sample cadence 87.4% < 95%", "collector rejection, retry, loss, backpressure or send error", "storage queue, write failure or physical pressure"], "machines": 2000, "users": 1, "sseClients": 0, "durationMs": 20000, "committedPerSecond": 1747.1, "sampleCadenceRatio": 0.8736, "historyCadenceRatio": 1.05, "ackP95Ms": 2524.02, "historyP95Ms": 20.9, "eventLoopP99Ms": 24.85, "sseNewestSampleP95Ms": 0, "hubCpuPercentOneCore": 111.43, "hubRssPeakMiB": 328.9, "sseMegabytes": 0.0, "report": "docs/stress-2026-11-04/181031-probe-m2000-u1-s0-20000ms.json", "resources": "docs/stress-2026-11-04/181031-probe-m2000-u1-s0-20000ms.resources.json", "wallSeconds": 42.3, "minimumAvailableMemoryGiB": 109.4, "peakHostCpuPercent": 5.37, "peakTestRssMiB": 548.2, "swapOutDeltaBytes": 0}
|
|
13
|
+
{"pass": true, "reasons": [], "machines": 1800, "users": 1, "sseClients": 0, "durationMs": 20000, "committedPerSecond": 1802.1, "sampleCadenceRatio": 1.0012, "historyCadenceRatio": 1.0499, "ackP95Ms": 88.45, "historyP95Ms": 23.84, "eventLoopP99Ms": 31.03, "sseNewestSampleP95Ms": 0, "hubCpuPercentOneCore": 103.43, "hubRssPeakMiB": 291.2, "sseMegabytes": 0.0, "report": "docs/stress-2026-11-04/181114-probe-m1800-u1-s0-20000ms.json", "resources": "docs/stress-2026-11-04/181114-probe-m1800-u1-s0-20000ms.resources.json", "wallSeconds": 38.2, "minimumAvailableMemoryGiB": 109.4, "peakHostCpuPercent": 4.04, "peakTestRssMiB": 469.2, "swapOutDeltaBytes": 0}
|
|
14
|
+
{"pass": true, "reasons": [], "machines": 100, "users": 64, "sseClients": 64, "durationMs": 20000, "committedPerSecond": 99.8, "sampleCadenceRatio": 0.998, "historyCadenceRatio": 1.0472, "ackP95Ms": 60.85, "historyP95Ms": 78.43, "eventLoopP99Ms": 44.89, "sseNewestSampleP95Ms": 544, "hubCpuPercentOneCore": 23.82, "hubRssPeakMiB": 288.0, "sseMegabytes": 290.5, "report": "docs/stress-2026-11-04/181203-probe-m100-u64-s64-20000ms.json", "resources": "docs/stress-2026-11-04/181203-probe-m100-u64-s64-20000ms.resources.json", "wallSeconds": 60.9, "minimumAvailableMemoryGiB": 109.4, "peakHostCpuPercent": 3.36, "peakTestRssMiB": 525.8, "swapOutDeltaBytes": 0}
|
|
15
|
+
{"pass": true, "reasons": [], "machines": 200, "users": 64, "sseClients": 64, "durationMs": 20000, "committedPerSecond": 199.6, "sampleCadenceRatio": 0.9982, "historyCadenceRatio": 1.0091, "ackP95Ms": 69.06, "historyP95Ms": 211.65, "eventLoopP99Ms": 61.31, "sseNewestSampleP95Ms": 764, "hubCpuPercentOneCore": 33.47, "hubRssPeakMiB": 298.1, "sseMegabytes": 582.1, "report": "docs/stress-2026-11-04/181304-probe-m200-u64-s64-20000ms.json", "resources": "docs/stress-2026-11-04/181304-probe-m200-u64-s64-20000ms.resources.json", "wallSeconds": 61.0, "minimumAvailableMemoryGiB": 109.4, "peakHostCpuPercent": 3.31, "peakTestRssMiB": 588.6, "swapOutDeltaBytes": 0}
|
|
16
|
+
{"pass": true, "reasons": [], "machines": 400, "users": 64, "sseClients": 64, "durationMs": 20000, "committedPerSecond": 381.0, "sampleCadenceRatio": 0.9526, "historyCadenceRatio": 0.9425, "ackP95Ms": 407.39, "historyP95Ms": 493.21, "eventLoopP99Ms": 96.4, "sseNewestSampleP95Ms": 963, "hubCpuPercentOneCore": 48.46, "hubRssPeakMiB": 363.2, "sseMegabytes": 1266.4, "report": "docs/stress-2026-11-04/181405-probe-m400-u64-s64-20000ms.json", "resources": "docs/stress-2026-11-04/181405-probe-m400-u64-s64-20000ms.resources.json", "wallSeconds": 62.0, "minimumAvailableMemoryGiB": 109.2, "peakHostCpuPercent": 4.64, "peakTestRssMiB": 840.1, "swapOutDeltaBytes": 0}
|
|
17
|
+
{"pass": false, "reasons": ["ack p95 533.47 > 500 ms", "durable sample cadence 88.7% < 95%", "History cadence 89.9% < 90%"], "machines": 500, "users": 64, "sseClients": 64, "durationMs": 20000, "committedPerSecond": 443.6, "sampleCadenceRatio": 0.8872, "historyCadenceRatio": 0.8987, "ackP95Ms": 533.47, "historyP95Ms": 585.44, "eventLoopP99Ms": 94.24, "sseNewestSampleP95Ms": 1174, "hubCpuPercentOneCore": 49.77, "hubRssPeakMiB": 452.7, "sseMegabytes": 1393.3, "report": "docs/stress-2026-11-04/181507-probe-m500-u64-s64-20000ms.json", "resources": "docs/stress-2026-11-04/181507-probe-m500-u64-s64-20000ms.resources.json", "wallSeconds": 62.0, "minimumAvailableMemoryGiB": 108.8, "peakHostCpuPercent": 4.8, "peakTestRssMiB": 966.3, "swapOutDeltaBytes": 0}
|
|
18
|
+
{"pass": false, "reasons": ["ack p95 560.42 > 500 ms", "durable sample cadence 87.7% < 95%", "History cadence 88.9% < 90%"], "machines": 450, "users": 64, "sseClients": 64, "durationMs": 20000, "committedPerSecond": 394.8, "sampleCadenceRatio": 0.8774, "historyCadenceRatio": 0.8888, "ackP95Ms": 560.42, "historyP95Ms": 541.9, "eventLoopP99Ms": 91.95, "sseNewestSampleP95Ms": 1060, "hubCpuPercentOneCore": 49.71, "hubRssPeakMiB": 369.7, "sseMegabytes": 1310.9, "report": "docs/stress-2026-11-04/181609-probe-m450-u64-s64-20000ms.json", "resources": "docs/stress-2026-11-04/181609-probe-m450-u64-s64-20000ms.resources.json", "wallSeconds": 62.0, "minimumAvailableMemoryGiB": 109.0, "peakHostCpuPercent": 4.33, "peakTestRssMiB": 742.5, "swapOutDeltaBytes": 0}
|
|
19
|
+
{"pass": false, "reasons": ["durable sample cadence 92.8% < 95%"], "machines": 2, "users": 2, "sseClients": 2, "durationMs": 3000, "committedPerSecond": 1.9, "sampleCadenceRatio": 0.9281, "historyCadenceRatio": 1.2375, "ackP95Ms": 31.04, "historyP95Ms": 5.89, "eventLoopP99Ms": 11.32, "sseNewestSampleP95Ms": 848, "hubCpuPercentOneCore": 2.73, "hubRssPeakMiB": 115.9, "sseMegabytes": 0.0, "report": "docs/stress-2026-11-04/181845-probe-m2-u2-s2-3000ms.json", "resources": "docs/stress-2026-11-04/181845-probe-m2-u2-s2-3000ms.resources.json", "wallSeconds": 17.5, "minimumAvailableMemoryGiB": 109.7, "peakHostCpuPercent": 3.33, "peakTestRssMiB": 403.5, "swapOutDeltaBytes": 0}
|
|
20
|
+
{"pass": true, "reasons": [], "machines": 500, "users": 64, "sseClients": 64, "durationMs": 30000, "committedPerSecond": 500.2, "sampleCadenceRatio": 1.0003, "historyCadenceRatio": 1.0325, "ackP95Ms": 172.35, "historyP95Ms": 154.04, "eventLoopP99Ms": 92.6, "sseNewestSampleP95Ms": 384, "hubCpuPercentOneCore": 66.11, "hubRssPeakMiB": 430.0, "sseMegabytes": 3187.7, "report": "docs/stress-2026-11-04/181931-probe-m500-u64-s64-30000ms.json", "resources": "docs/stress-2026-11-04/181931-probe-m500-u64-s64-30000ms.resources.json", "wallSeconds": 73.3, "minimumAvailableMemoryGiB": 108.4, "peakHostCpuPercent": 9.69, "peakTestRssMiB": 1349.9, "swapOutDeltaBytes": 0}
|
|
21
|
+
{"pass": false, "reasons": ["ack p95 3872.03 > 500 ms", "durable sample cadence 74.4% < 95%", "collector rejection, retry, loss, backpressure or send error", "storage queue, write failure or physical pressure"], "machines": 1800, "users": 1, "sseClients": 0, "durationMs": 120000, "committedPerSecond": 1338.8, "sampleCadenceRatio": 0.7438, "historyCadenceRatio": 1.0083, "ackP95Ms": 3872.03, "historyP95Ms": 34.32, "eventLoopP99Ms": 37.75, "sseNewestSampleP95Ms": 0, "hubCpuPercentOneCore": 108.35, "hubRssPeakMiB": 311.0, "sseMegabytes": 0.0, "report": "docs/stress-2026-11-04/182108-probe-m1800-u1-s0-120000ms.json", "resources": "docs/stress-2026-11-04/182108-probe-m1800-u1-s0-120000ms.resources.json", "wallSeconds": 138.4, "minimumAvailableMemoryGiB": 109.2, "peakHostCpuPercent": 5.16, "peakTestRssMiB": 508.7, "swapOutDeltaBytes": 0}
|
|
22
|
+
{"pass": false, "reasons": ["ack p95 2154.32 > 500 ms", "collector rejection, retry, loss, backpressure or send error", "storage queue, write failure or physical pressure"], "machines": 1200, "users": 1, "sseClients": 0, "durationMs": 120000, "committedPerSecond": 1167.0, "sampleCadenceRatio": 0.9725, "historyCadenceRatio": 1.0083, "ackP95Ms": 2154.32, "historyP95Ms": 29.82, "eventLoopP99Ms": 49.51, "sseNewestSampleP95Ms": 0, "hubCpuPercentOneCore": 92.41, "hubRssPeakMiB": 262.4, "sseMegabytes": 0.0, "report": "docs/stress-2026-11-04/182354-probe-m1200-u1-s0-120000ms.json", "resources": "docs/stress-2026-11-04/182354-probe-m1200-u1-s0-120000ms.resources.json", "wallSeconds": 136.4, "minimumAvailableMemoryGiB": 109.3, "peakHostCpuPercent": 4.22, "peakTestRssMiB": 440.1, "swapOutDeltaBytes": 0}
|
|
23
|
+
{"pass": true, "reasons": [], "machines": 900, "users": 1, "sseClients": 0, "durationMs": 120000, "committedPerSecond": 900.0, "sampleCadenceRatio": 0.9999, "historyCadenceRatio": 1.0083, "ackP95Ms": 71.98, "historyP95Ms": 27.25, "eventLoopP99Ms": 60.85, "sseNewestSampleP95Ms": 0, "hubCpuPercentOneCore": 75.13, "hubRssPeakMiB": 225.0, "sseMegabytes": 0.0, "report": "docs/stress-2026-11-04/182625-probe-m900-u1-s0-120000ms.json", "resources": "docs/stress-2026-11-04/182625-probe-m900-u1-s0-120000ms.resources.json", "wallSeconds": 135.3, "minimumAvailableMemoryGiB": 109.4, "peakHostCpuPercent": 6.34, "peakTestRssMiB": 371.3, "swapOutDeltaBytes": 0}
|
|
24
|
+
{"pass": true, "reasons": [], "machines": 1050, "users": 1, "sseClients": 0, "durationMs": 120000, "committedPerSecond": 1046.0, "sseWorkers": 4, "clientWarmupMs": 0, "historyMetricSet": "standard", "historyIntervalMs": 1000, "sampleCadenceRatio": 0.9962, "historyCadenceRatio": 1.0083, "ackP95Ms": 140.06, "historyP95Ms": 27.62, "eventLoopP99Ms": 54.85, "sseNewestSampleP95Ms": 0, "hubCpuPercentOneCore": 82.24, "hubRssPeakMiB": 260.2, "sseMegabytes": 0.0, "report": "docs/stress-2026-11-04/182847-probe-m1050-u1-s0-120000ms.json", "resources": "docs/stress-2026-11-04/182847-probe-m1050-u1-s0-120000ms.resources.json", "wallSeconds": 135.3, "minimumAvailableMemoryGiB": 109.2, "peakHostCpuPercent": 5.34, "peakTestRssMiB": 432.1, "swapOutDeltaBytes": 0}
|
|
25
|
+
{"pass": false, "reasons": ["ack p95 538.2 > 500 ms"], "machines": 1125, "users": 1, "sseClients": 0, "durationMs": 120000, "committedPerSecond": 1113.5, "sseWorkers": 4, "clientWarmupMs": 0, "historyMetricSet": "standard", "historyIntervalMs": 1000, "sampleCadenceRatio": 0.9898, "historyCadenceRatio": 1.0083, "ackP95Ms": 538.2, "historyP95Ms": 30.91, "eventLoopP99Ms": 51.9, "sseNewestSampleP95Ms": 0, "hubCpuPercentOneCore": 86.73, "hubRssPeakMiB": 258.7, "sseMegabytes": 0.0, "report": "docs/stress-2026-11-04/183112-probe-m1125-u1-s0-120000ms.json", "resources": "docs/stress-2026-11-04/183112-probe-m1125-u1-s0-120000ms.resources.json", "wallSeconds": 135.3, "minimumAvailableMemoryGiB": 108.9, "peakHostCpuPercent": 8.98, "peakTestRssMiB": 439.3, "swapOutDeltaBytes": 0}
|
|
26
|
+
{"pass": true, "reasons": [], "machines": 500, "users": 64, "sseClients": 64, "durationMs": 120000, "committedPerSecond": 499.8, "sseWorkers": 4, "clientWarmupMs": 1000, "historyMetricSet": "standard", "historyIntervalMs": 1000, "sampleCadenceRatio": 0.9996, "historyCadenceRatio": 1.0081, "ackP95Ms": 222.83, "historyP95Ms": 180.56, "eventLoopP99Ms": 123.34, "sseNewestSampleP95Ms": 407, "hubCpuPercentOneCore": 74.68, "hubRssPeakMiB": 559.5, "sseMegabytes": 11733.6, "report": "docs/stress-2026-11-04/193608-probe-m500-u64-s64-120000ms.json", "resources": "docs/stress-2026-11-04/193608-probe-m500-u64-s64-120000ms.resources.json", "wallSeconds": 163.0, "minimumAvailableMemoryGiB": 108.2, "peakHostCpuPercent": 8.27, "peakTestRssMiB": 1474.6, "swapOutDeltaBytes": 0}
|
|
27
|
+
{"pass": true, "reasons": [], "machines": 529, "users": 1, "sseClients": 1, "durationMs": 15000, "committedPerSecond": 529.0, "sseWorkers": 1, "clientWarmupMs": 1000, "historyMetricSet": "standard", "historyIntervalMs": 1000, "sampleCadenceRatio": 1.0, "historyCadenceRatio": 1.0665, "ackP95Ms": 57.98, "historyP95Ms": 8.92, "eventLoopP99Ms": 52, "sseNewestSampleP95Ms": 79, "hubCpuPercentOneCore": 45.72, "hubRssPeakMiB": 200.4, "sseMegabytes": 32.5, "report": "docs/stress-2026-11-04/193909-probe-m529-u1-s1-15000ms.json", "resources": "docs/stress-2026-11-04/193909-probe-m529-u1-s1-15000ms.resources.json", "wallSeconds": 31.0, "minimumAvailableMemoryGiB": 109.5, "peakHostCpuPercent": 4.52, "peakTestRssMiB": 465.4, "swapOutDeltaBytes": 0}
|
|
28
|
+
{"pass": false, "reasons": ["SSE admission/delivery incomplete (0/1)", "live update rate below one update per two seconds per viewer"], "machines": 530, "users": 1, "sseClients": 1, "durationMs": 15000, "committedPerSecond": 531.9, "sseWorkers": 1, "clientWarmupMs": 1000, "historyMetricSet": "standard", "historyIntervalMs": 1000, "sampleCadenceRatio": 1.0037, "historyCadenceRatio": 1.0666, "ackP95Ms": 57.67, "historyP95Ms": 18.22, "eventLoopP99Ms": 51.41, "sseNewestSampleP95Ms": 64, "hubCpuPercentOneCore": 45.05, "hubRssPeakMiB": 189.2, "sseMegabytes": 1.0, "report": "docs/stress-2026-11-04/193940-probe-m530-u1-s1-15000ms.json", "resources": "docs/stress-2026-11-04/193940-probe-m530-u1-s1-15000ms.resources.json", "wallSeconds": 31.0, "minimumAvailableMemoryGiB": 109.5, "peakHostCpuPercent": 5.69, "peakTestRssMiB": 418.2, "swapOutDeltaBytes": 0}
|
|
29
|
+
{"pass": false, "reasons": ["SSE admission/delivery incomplete (64/65)"], "machines": 100, "users": 1, "sseClients": 65, "durationMs": 10000, "committedPerSecond": 100.0, "sseWorkers": 4, "clientWarmupMs": 1000, "historyMetricSet": "standard", "historyIntervalMs": 1000, "sampleCadenceRatio": 0.9999, "historyCadenceRatio": 0.9999, "ackP95Ms": 63.78, "historyP95Ms": 5.28, "eventLoopP99Ms": 37.03, "sseNewestSampleP95Ms": 481, "hubCpuPercentOneCore": 15.65, "hubRssPeakMiB": 162.4, "sseMegabytes": 176.8, "report": "docs/stress-2026-11-04/194011-probe-m100-u1-s65-10000ms.json", "resources": "docs/stress-2026-11-04/194011-probe-m100-u1-s65-10000ms.resources.json", "wallSeconds": 24.8, "minimumAvailableMemoryGiB": 109.3, "peakHostCpuPercent": 5.14, "peakTestRssMiB": 772.3, "swapOutDeltaBytes": 0}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"baseRevision": "3b77feaed4afc9ebd9af156008c78bd0278f9015",
|
|
3
|
+
"attemptCount": 29,
|
|
4
|
+
"resourceAborts": [],
|
|
5
|
+
"remainingTemporaryDirectories": [],
|
|
6
|
+
"totalWriteFailuresAcrossCases": 0,
|
|
7
|
+
"largestFinalDatabaseMiB": 320.3,
|
|
8
|
+
"sourceSha256": {
|
|
9
|
+
"scripts/scale-harness.ts": "8d67637bee926bfea6458536828939b95be4919edfec78f1c8b562f05b3c2f30",
|
|
10
|
+
"scripts/stress-hub.py": "1519a5868c0654eec76eab66df0c38f486c7aa4e88b235bcba83017b9f1ad7e6",
|
|
11
|
+
"tests/scale-harness.test.ts": "f87279588b95f02a78bf12861d27086131033ad5eca8191900004635d645584e"
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<!doctype html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Rigscope hub stress results</title><style>
|
|
2
|
+
#stress-results {font-family:var(--font-sans, system-ui);color:var(--foreground, CanvasText);font-size:14px;line-height:1.45}
|
|
3
|
+
#stress-results h2 {font-size:16px;font-weight:500;margin:0 0 4px}
|
|
4
|
+
#stress-results p {margin:0 0 18px;color:var(--muted-foreground, GrayText);font-size:12px}
|
|
5
|
+
#stress-results .axis,#stress-results .row {display:grid;grid-template-columns:70px minmax(60px,1fr) 118px;gap:12px;align-items:center}
|
|
6
|
+
#stress-results .axis {font-size:11px;color:var(--muted-foreground, GrayText);margin-bottom:8px}
|
|
7
|
+
#stress-results .axis-scale {position:relative;display:flex;justify-content:space-between}
|
|
8
|
+
#stress-results .axis-scale b {position:absolute;left:20%;transform:translateX(-50%);font-weight:400;white-space:nowrap;color:var(--foreground, CanvasText)}
|
|
9
|
+
#stress-results .row {height:44px;font-variant-numeric:tabular-nums}
|
|
10
|
+
#stress-results .track {position:relative;height:20px;background:color-mix(in srgb,var(--foreground, CanvasText) 6%,transparent);border-radius:3px}
|
|
11
|
+
#stress-results .bar {height:20px;border-radius:3px;min-width:3px}
|
|
12
|
+
#stress-results .pass {background:var(--chart-1, Highlight)}
|
|
13
|
+
#stress-results .fail {background:var(--chart-2, GrayText)}
|
|
14
|
+
#stress-results .limit {position:absolute;top:-7px;bottom:-7px;left:20%;border-left:1px dashed var(--foreground, CanvasText);opacity:.6}
|
|
15
|
+
#stress-results .value {text-align:right}
|
|
16
|
+
#stress-results small {display:block;font-size:11px;color:var(--muted-foreground, GrayText)}
|
|
17
|
+
#stress-results .mixed {margin-top:22px;padding-top:14px;border-top:1px solid var(--border, GrayText)}
|
|
18
|
+
#stress-results .metrics {display:flex;flex-wrap:wrap;gap:14px 32px;margin-top:10px}
|
|
19
|
+
#stress-results .metric {font-variant-numeric:tabular-nums}
|
|
20
|
+
#stress-results .metric strong {font-size:18px;font-weight:500}
|
|
21
|
+
@media(max-width:440px){#stress-results .axis,#stress-results .row{grid-template-columns:55px minmax(55px,1fr) 94px;gap:8px}#stress-results .axis-scale b{top:-16px}#stress-results .axis{margin-top:28px}}
|
|
22
|
+
</style></head><body><div id="stress-results"><h2>Ingestion gets slower near 1,100 collectors</h2><p>Two-minute runs · one sample per collector per second · no live viewers</p><div class="axis"><span>Collectors</span><span class="axis-scale"><span>0</span><b>500 ms limit</b><span>2,500 ms</span></span><span style="text-align:right">Ack p95</span></div><div class="row" aria-label="900 collectors, acknowledgment p95 72 milliseconds, Pass"><span>900</span><div class="track"><div class="bar pass" style="width:2.88%"></div><span class="limit"></span></div><span class="value">72 ms <small>Pass</small></span></div><div class="row" aria-label="1050 collectors, acknowledgment p95 140 milliseconds, Pass"><span>1,050</span><div class="track"><div class="bar pass" style="width:5.60%"></div><span class="limit"></span></div><span class="value">140 ms <small>Pass</small></span></div><div class="row" aria-label="1125 collectors, acknowledgment p95 538 milliseconds, Over threshold"><span>1,125</span><div class="track"><div class="bar fail" style="width:21.53%"></div><span class="limit"></span></div><span class="value">538 ms <small>Over threshold</small></span></div><div class="row" aria-label="1200 collectors, acknowledgment p95 2154 milliseconds, Over threshold"><span>1,200</span><div class="track"><div class="bar fail" style="width:86.17%"></div><span class="limit"></span></div><span class="value">2,154 ms <small>Over threshold</small></span></div><div class="mixed"><h2>500 collectors + 64 live sessions passed for two minutes</h2><div class="metrics"><div class="metric"><strong>223 ms</strong><small>Acknowledgment p95</small></div><div class="metric"><strong>181 ms</strong><small>History p95 · 64 polls/s</small></div><div class="metric"><strong>560 MiB</strong><small>Hub memory peak</small></div></div></div></div></body></html>
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
# System installation
|
|
2
|
+
|
|
3
|
+
System installation runs Rigscope under dedicated service accounts and starts
|
|
4
|
+
at boot without user lingering. For the default per-user npm setup, use the
|
|
5
|
+
[installation guide](installation.md).
|
|
6
|
+
|
|
7
|
+
Review the plan before applying changes. Commands that change the installation
|
|
8
|
+
require root and `--apply`; otherwise they only print the proposed changes.
|
|
9
|
+
The installed `rigscope system` command and `dist/system.cjs` use the same code.
|
|
10
|
+
|
|
11
|
+
| Task | Section |
|
|
12
|
+
| --- | --- |
|
|
13
|
+
| Review paths and permissions | [Generated layout](#scope-and-generated-layout) |
|
|
14
|
+
| Install or control services | [Component lifecycle](#system-component-lifecycle) |
|
|
15
|
+
| Enroll with another hub | [Connect to a hub](#connecting-to-an-independent-hub) |
|
|
16
|
+
| Grant package-energy access | [CPU package power](#cpu-package-power) |
|
|
17
|
+
|
|
18
|
+
### Scope and generated layout
|
|
19
|
+
|
|
20
|
+
```text
|
|
21
|
+
/opt/rigscope/ root:root 0755
|
|
22
|
+
releases/<version>/ immutable root-owned release
|
|
23
|
+
current -> releases/<version>
|
|
24
|
+
previous -> releases/<previous> retained for rollback
|
|
25
|
+
node/node root-owned Node 26 when the selected binary was not root-owned
|
|
26
|
+
/etc/rigscope/
|
|
27
|
+
hub.env root:root 0600 (credentials, never printed)
|
|
28
|
+
collector.env root:root 0600
|
|
29
|
+
/var/lib/rigscope/
|
|
30
|
+
hub/telemetry.sqlite rigscope-hub 0600, private 0700 directory
|
|
31
|
+
hub/enrollment.json rigscope-hub 0600
|
|
32
|
+
hub/run/hub.sock private Unix socket (remote mode)
|
|
33
|
+
collector/state.json rigscope-collector 0600
|
|
34
|
+
collector/outbox/ durable collector outboxes
|
|
35
|
+
backups/ root:root 0700, pre-upgrade/pre-rollback SQLite copies
|
|
36
|
+
system-install.json root:root 0600, version 2 component state/versions/backups/adoption
|
|
37
|
+
power-access.json root:root 0600, original counter modes for reversal
|
|
38
|
+
/etc/systemd/system/rigscope-hub.service root:root 0644, hub boot unit
|
|
39
|
+
/etc/systemd/system/rigscope-collector.service root:root 0644, collector boot unit
|
|
40
|
+
/etc/sysusers.d/rigscope.conf root:root 0644, both nologin accounts
|
|
41
|
+
/etc/sysusers.d/rigscope-rapl.conf root:root 0644, collector-only power membership
|
|
42
|
+
/etc/udev/rules.d/90-rigscope-rapl.rules root:root 0644
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Build the checkout before using `dist/system.cjs`; an installed package exposes the same commands through `rigscope system`. Reference copies are in `packaging/system/`. They are for review only; the
|
|
46
|
+
renderer in `src/cli/system.ts` is authoritative.
|
|
47
|
+
|
|
48
|
+
`systemd-sysusers` creates `rigscope-hub` and `rigscope-collector` as nologin
|
|
49
|
+
system accounts even when one component is disabled, so the other can be
|
|
50
|
+
enabled later without reinstalling. The hub and collector never run as root.
|
|
51
|
+
The units set `NoNewPrivileges=yes`, `ProtectSystem=strict`,
|
|
52
|
+
`ProtectHome=yes`, an empty `CapabilityBoundingSet=`/`AmbientCapabilities=`,
|
|
53
|
+
`UMask=0077`, explicit writable state paths and a read-only release tree. The
|
|
54
|
+
collector uses `--await-connection` to exit cleanly when no destinations are
|
|
55
|
+
configured, including after an interrupted enrollment. The
|
|
56
|
+
collector does **not** use `PrivateDevices=yes` because GPU telemetry still
|
|
57
|
+
needs real device nodes. The hub does.
|
|
58
|
+
|
|
59
|
+
### System component lifecycle
|
|
60
|
+
|
|
61
|
+
All mutating commands require `--apply` and root. Without `--apply`, the exact
|
|
62
|
+
files and command sequence are printed and nothing is written. Every component
|
|
63
|
+
operation touches only its own unit; enabling or starting one component never
|
|
64
|
+
stops or restarts the other.
|
|
65
|
+
|
|
66
|
+
```sh
|
|
67
|
+
# Package first (from a built checkout).
|
|
68
|
+
node scripts/package-release.cjs --output /var/tmp/rigscope-<version>.tar.gz
|
|
69
|
+
|
|
70
|
+
# Review a release before granting sudo.
|
|
71
|
+
node dist/system.cjs plan \
|
|
72
|
+
--source /var/tmp/rigscope-<version>.tar.gz --role local --node /usr/bin/node
|
|
73
|
+
|
|
74
|
+
# Install one complete package. --role selects the initial enabled preset.
|
|
75
|
+
sudo node dist/system.cjs install \
|
|
76
|
+
--source /var/tmp/rigscope-<version>.tar.gz --role hub \
|
|
77
|
+
--node /usr/bin/node --install-deps --enable --apply
|
|
78
|
+
|
|
79
|
+
# Add the other component later; no reinstall and no new package are needed.
|
|
80
|
+
sudo node dist/system.cjs enable collector --apply
|
|
81
|
+
sudo node dist/system.cjs enable hub --apply
|
|
82
|
+
|
|
83
|
+
# Component-specific lifecycle when both exist.
|
|
84
|
+
sudo node dist/system.cjs disable collector --apply
|
|
85
|
+
sudo node dist/system.cjs restart hub --apply
|
|
86
|
+
sudo node dist/system.cjs restart collector --apply
|
|
87
|
+
sudo node dist/system.cjs restart --apply # enabled components only
|
|
88
|
+
|
|
89
|
+
# Component-specific status and logs.
|
|
90
|
+
node dist/system.cjs status
|
|
91
|
+
node dist/system.cjs status collector --json
|
|
92
|
+
node dist/system.cjs logs hub --follow
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
`install` stages a complete release, verifies both runtimes and UI artifacts,
|
|
96
|
+
copies a non-root-owned Node executable into the root-owned prefix, installs
|
|
97
|
+
production dependencies when `--install-deps` is given, writes private
|
|
98
|
+
configuration and both units, creates both accounts, then switches `current`.
|
|
99
|
+
Staging happens before any service is stopped.
|
|
100
|
+
|
|
101
|
+
- With `--enable`, `--role local` initially enables both components.
|
|
102
|
+
- With `--enable`, `--role hub` initially enables only the hub.
|
|
103
|
+
- With `--enable`, `--role collector` initially enables only the collector.
|
|
104
|
+
- Without `--enable`, both components are installed but disabled.
|
|
105
|
+
- `--start` starts only the requested preset and verifies those components.
|
|
106
|
+
- `--without-power` skips the collector RAPL grant at that mutation.
|
|
107
|
+
|
|
108
|
+
`enable hub` creates the owner account once when `HUB_BROWSER_USERS` is empty
|
|
109
|
+
and prints the password only in that mutation. It is never stored in plaintext
|
|
110
|
+
or printed again. `enable collector` completes the collector account, unit,
|
|
111
|
+
identity and RAPL grant. With no destination it tries the colocated hub:
|
|
112
|
+
|
|
113
|
+
- A live configured hub gets a short-lived, single-use grant in its
|
|
114
|
+
authoritative SQLite registry. The collector then enrolls through the normal
|
|
115
|
+
hub API, which updates the live registry without stopping or restarting the
|
|
116
|
+
hub.
|
|
117
|
+
- A stopped hub gets the identity written to the authoritative registry (or a
|
|
118
|
+
static `HUB_COLLECTORS` bootstrap when the registry is not initialized yet);
|
|
119
|
+
enabling the collector never starts the hub.
|
|
120
|
+
- If there is no configured hub, the collector is enabled but stays dormant and
|
|
121
|
+
reports `Awaiting connection`. Its unit uses `--await-connection` to exit
|
|
122
|
+
cleanly before collection until a destination is saved.
|
|
123
|
+
|
|
124
|
+
Configured remote destinations and credentials are never overwritten. Re-running
|
|
125
|
+
`enable collector` leaves its destination, token, identity and outboxes intact.
|
|
126
|
+
|
|
127
|
+
### Connecting to an independent hub
|
|
128
|
+
|
|
129
|
+
For a hub-first test where the hub and collector are separate installations,
|
|
130
|
+
create a connection grant in the hub's admin Collectors panel. Save the grant to
|
|
131
|
+
a private file and connect the system collector:
|
|
132
|
+
|
|
133
|
+
```sh
|
|
134
|
+
# On the collector host; the grant file must be root-owned and 0600.
|
|
135
|
+
sudo install -m 0600 /dev/null /root/collector-grant
|
|
136
|
+
sudoedit /root/collector-grant # paste the single-use grant, save, quit
|
|
137
|
+
sudo node dist/system.cjs connect https://<hub-host> \
|
|
138
|
+
--token-file /root/collector-grant --apply
|
|
139
|
+
sudo rm /root/collector-grant
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
`connect` stops only the collector while it enrolls, calls the hub's normal
|
|
143
|
+
enrollment API, persists the issued credential under
|
|
144
|
+
`/var/lib/rigscope/collector/state.json`, and starts the collector if it is
|
|
145
|
+
enabled. The grant is never printed. Re-running `connect` on a configured
|
|
146
|
+
collector is refused rather than replacing a remote destination.
|
|
147
|
+
|
|
148
|
+
Status reports each component independently:
|
|
149
|
+
|
|
150
|
+
```text
|
|
151
|
+
Components:
|
|
152
|
+
hub: installed, enabled, active, ready
|
|
153
|
+
collector: installed, enabled, active, ready, 1 destination(s)
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
`readiness` is `ready`, `stopped`, `unconfigured`, `awaiting-connection`,
|
|
157
|
+
`invalid-config`, `invalid-state` or `missing`.
|
|
158
|
+
|
|
159
|
+
### CPU package power
|
|
160
|
+
|
|
161
|
+
`collector/sampling/hwmon.ts` already reads top-level RAPL package counters,
|
|
162
|
+
sums multiple sockets, handles wrap/reset and returns unavailable rather than
|
|
163
|
+
zero. On hosts where `energy_uj` is root-only, system scope grants a narrow
|
|
164
|
+
read path instead of elevating Node.
|
|
165
|
+
|
|
166
|
+
```sh
|
|
167
|
+
node dist/system.cjs power status
|
|
168
|
+
sudo node dist/system.cjs power grant --apply
|
|
169
|
+
sudo node dist/system.cjs power revoke --apply
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Mechanism:
|
|
173
|
+
|
|
174
|
+
- `/etc/sysusers.d/rigscope-rapl.conf` creates `rigscope-rapl` and adds only
|
|
175
|
+
`rigscope-collector`; the hub is not a member.
|
|
176
|
+
- A `powercap` udev rule matches only top-level `intel-rapl:N` devices named
|
|
177
|
+
`package*` and changes only `energy_uj` and `max_energy_range_uj` to
|
|
178
|
+
`0440 root:rigscope-rapl`. Subdomains, constraint files and power-limit
|
|
179
|
+
writes are untouched.
|
|
180
|
+
- `udevadm trigger --subsystem-match=powercap --action=change` applies the rule
|
|
181
|
+
immediately. Because the rule lives in `/etc/udev/rules.d`, device
|
|
182
|
+
recreation and boot reapply it.
|
|
183
|
+
- The collector unit adds `SupplementaryGroups=rigscope-rapl`; it does not use
|
|
184
|
+
file capabilities, ambient capabilities or a privileged Node helper.
|
|
185
|
+
- Grant records each existing counter's original mode/uid/gid in
|
|
186
|
+
`/var/lib/rigscope/power-access.json`. Revoke removes the rule and group
|
|
187
|
+
membership and restores those recorded values (defaults `0400` for
|
|
188
|
+
`energy_uj` and `0444` for `max_energy_range_uj` when no record exists).
|
|
189
|
+
- `power status` reports driver modules, package domains, collector
|
|
190
|
+
readability, persistence, world readability and every problem. A missing
|
|
191
|
+
counter is reported unavailable, never as zero watts.
|
|
192
|
+
|
|
193
|
+
Verify real watts in History after granting access and restarting the collector;
|
|
194
|
+
do not treat a mocked value or a one-time manual `chmod` as installation
|
|
195
|
+
evidence. Unsupported hardware remains unavailable.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rigscope",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"rigscopeConfigVersion": 2,
|
|
5
5
|
"private": false,
|
|
6
6
|
"engines": {
|
|
@@ -68,6 +68,9 @@
|
|
|
68
68
|
"README.md",
|
|
69
69
|
"CHANGELOG.md",
|
|
70
70
|
"docs/installation.md",
|
|
71
|
+
"docs/system-installation.md",
|
|
72
|
+
"docs/configuration.md",
|
|
73
|
+
"docs/monitoring.md",
|
|
71
74
|
"docs/operations.md",
|
|
72
75
|
"docs/bottlenecks.md",
|
|
73
76
|
"docs/exports.md",
|
|
@@ -76,6 +79,11 @@
|
|
|
76
79
|
"docs/scale-validation.md",
|
|
77
80
|
"docs/scale-validation.json",
|
|
78
81
|
"docs/scale-acceptance.json",
|
|
82
|
+
"docs/stress-2026-11-04/README.md",
|
|
83
|
+
"docs/stress-2026-11-04/index.jsonl",
|
|
84
|
+
"docs/stress-2026-11-04/manifest.json",
|
|
85
|
+
"docs/stress-2026-11-04/results.html",
|
|
86
|
+
"docs/stress-2026-11-04/*ms.json",
|
|
79
87
|
"ARCHITECTURE.md",
|
|
80
88
|
"DESIGN.md",
|
|
81
89
|
"LICENSE",
|
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
|
|
3
3
|
These files illustrate dedicated `rigscope-hub` and `rigscope-collector` accounts, systemd units and read-only package-energy access. The renderer in `src/cli/system.ts` is authoritative; do not install examples blindly.
|
|
4
4
|
|
|
5
|
-
See [
|
|
5
|
+
See [System installation](../../docs/system-installation.md) for planning, `--apply`, component controls and CPU package-power permissions. The collector needs GPU device access and does not use `PrivateDevices=yes`; the hub does. Both run without root privileges.
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[408],{4567:(e,t,r)=>{r.d(t,{Cv:()=>s,H9:()=>i,Lf:()=>u,P$:()=>n,RL:()=>g,bP:()=>h,er:()=>m,oB:()=>a,ue:()=>f,yv:()=>d});let i=[{metric:"cpu.usage",label:"CPU usage",shortLabel:"CPU",unit:"percent",family:"cpu",colorSlot:0,description:"Total processor utilization"},{metric:"cpu.core",label:"Per-core CPU",shortLabel:"Per-core",unit:"percent",family:"cpu",colorSlot:0,description:"Logical-core utilization; heatmap for large selections"},{metric:"cpu.temperature",label:"CPU temperature",shortLabel:"Temperature",unit:"celsius",family:"cpu",colorSlot:3,description:"Identifiable CPU hwmon sensor temperature"},{metric:"cpu.power",label:"CPU package power",shortLabel:"Power",unit:"watts",family:"cpu",colorSlot:4,description:"Top-level RAPL package power draw"},{metric:"cpu.iowait",label:"CPU I/O wait",shortLabel:"I/O wait",unit:"percent",family:"cpu",colorSlot:2,description:"Processor time waiting on I/O"},{metric:"cpu.pressure",label:"CPU pressure",shortLabel:"Pressure",unit:"percent",family:"cpu",colorSlot:4,description:"Linux PSI CPU stall pressure (avg10)"},{metric:"memory.used",label:"Memory used",shortLabel:"Memory",unit:"bytes",family:"memory",colorSlot:1,description:"Physical memory in use"},{metric:"memory.usage",label:"Memory usage",shortLabel:"Memory %",unit:"percent",family:"memory",colorSlot:1,description:"Physical memory used as a share of total"},{metric:"memory.pressure.some",label:"Memory pressure (some)",shortLabel:"Pressure some",unit:"percent",family:"memory",colorSlot:2,description:"Linux PSI memory stall pressure, some tasks (avg10)"},{metric:"memory.pressure.full",label:"Memory pressure (full)",shortLabel:"Pressure full",unit:"percent",family:"memory",colorSlot:4,description:"Linux PSI memory stall pressure, all tasks (avg10)"},{metric:"swap.used",label:"Swap used",shortLabel:"Swap",unit:"bytes",family:"swap",colorSlot:2,description:"Swap space in use"},{metric:"gpu.utilization",label:"GPU utilization",shortLabel:"Utilization",unit:"percent",family:"gpus",colorSlot:0,description:"Per-card graphics processor utilization"},{metric:"gpu.memory.used",label:"GPU memory used",shortLabel:"VRAM",unit:"bytes",family:"gpus",colorSlot:1,description:"Per-card video memory in use"},{metric:"gpu.temperature",label:"GPU temperature",shortLabel:"Temperature",unit:"celsius",family:"gpus",colorSlot:3,description:"Per-card temperature"},{metric:"gpu.power",label:"GPU power",shortLabel:"Power",unit:"watts",family:"gpus",colorSlot:4,description:"Per-card power draw"},{metric:"fs.used",label:"Filesystem used",shortLabel:"Filesystem",unit:"bytes",family:"disks",colorSlot:1,description:"Used space per mounted filesystem"},{metric:"fs.usage",label:"Filesystem usage",shortLabel:"Filesystem %",unit:"percent",family:"disks",colorSlot:1,description:"Used capacity per mounted filesystem, derived from a positive total"},{metric:"fs.inodes.usage",label:"Inode usage",shortLabel:"Inodes %",unit:"percent",family:"disks",colorSlot:2,description:"Used inodes per filesystem where the collector can read them"},{metric:"disk.read",label:"Disk read",shortLabel:"Read",unit:"bytes_per_second",family:"disks",colorSlot:0,description:"Device read throughput"},{metric:"disk.write",label:"Disk write",shortLabel:"Write",unit:"bytes_per_second",family:"disks",colorSlot:2,description:"Device write throughput"},{metric:"disk.read.latency",label:"Disk read latency",shortLabel:"Read latency",unit:"milliseconds",family:"disks",colorSlot:0,description:"Average device read latency"},{metric:"disk.write.latency",label:"Disk write latency",shortLabel:"Write latency",unit:"milliseconds",family:"disks",colorSlot:2,description:"Average device write latency"},{metric:"disk.utilization",label:"Disk utilization",shortLabel:"Utilization",unit:"percent",family:"disks",colorSlot:3,description:"Share of time the device had I/O in flight"},{metric:"io.pressure.some",label:"I/O pressure (some)",shortLabel:"I/O some",unit:"percent",family:"disks",colorSlot:3,description:"Linux PSI I/O stall pressure, some tasks (avg10)"},{metric:"io.pressure.full",label:"I/O pressure (full)",shortLabel:"I/O full",unit:"percent",family:"disks",colorSlot:4,description:"Linux PSI I/O stall pressure, all tasks (avg10)"},{metric:"net.rx",label:"Network received",shortLabel:"Received",unit:"bytes_per_second",family:"network",colorSlot:0,description:"Interface receive rate"},{metric:"net.tx",label:"Network sent",shortLabel:"Sent",unit:"bytes_per_second",family:"network",colorSlot:2,description:"Interface transmit rate"}];function s(e,t){return e.filter(r=>{for(let[i,s,n]of[["memory","memory.used","memory.usage"],["filesystem","fs.used","fs.usage"]])if(e.includes(s)&&e.includes(n)&&(r===s||r===n))return r===("percent"===t[i]?n:s);return!0})}let n=[{id:"cpu",label:"CPU",metrics:["cpu.usage","cpu.core","cpu.iowait","cpu.pressure","cpu.temperature","cpu.power"]},{id:"memory",label:"Memory",metrics:["memory.used","memory.usage","swap.used","memory.pressure.some","memory.pressure.full"]},{id:"gpu",label:"GPU",metrics:["gpu.utilization","gpu.memory.used","gpu.temperature","gpu.power"]},{id:"disk",label:"Storage",metrics:["fs.used","fs.usage","fs.inodes.usage","disk.read","disk.write","disk.read.latency","disk.write.latency","disk.utilization","io.pressure.some","io.pressure.full"]},{id:"network",label:"Network",metrics:["net.rx","net.tx"]}],l=["var(--cpu)","var(--mem)","color-mix(in oklab, var(--swap) 75%, var(--foreground))","var(--warn)","var(--crit)","var(--accent)"],o=[void 0,"7 4","2 3","10 3 2 3","4 4","1 3"];function a(e){return i.find(t=>t.metric===e)??null}function u(e,t){let r=Math.max(0,t),i=e.colorSlot+r,s=(r+Math.floor(i/l.length))%o.length;return{color:l[i%l.length],dash:o[s]}}let c={cpu:"CPU",memory:"Memory",swap:"Swap",gpus:"GPU metrics",disks:"Disk metrics",network:"Network metrics"};function d(e,t){let r=a(t);if(null===r||void 0===e)return{available:!0,reason:null};let i=e.inventory?.capabilities?.[r.family];if(!i||"supported"===i.status)return{available:!0,reason:null};let s=i.reason?.trim();return{available:!1,reason:s?`${c[r.family]}: ${i.status} — ${s}`:`${c[r.family]} are ${i.status} on this machine.`}}function m(e){if(void 0===e)return[];let t=[],r=r=>{!(t.length>=16)&&d(e,r).available&&t.push(r)};r("cpu.usage"),r("memory.used");let i=function(e){let t=e.inventory?.memory.swapTotalBytes;if("number"==typeof t)return t;let r=e.metrics?.payload.swap;return r?.status==="ok"?r.totalBytes:null}(e);return null!==i&&i>0&&r("swap.used"),f(e,[]).length>0&&(r("gpu.utilization"),r("gpu.memory.used")),t}function p(e){let t=e.includes(":")?e.slice(e.indexOf(":")+1):e;return t.length<=18?t:`${t.slice(0,10)}…${t.slice(-4)}`}function f(e,t){let r=new Set(t.filter(e=>e.metric.startsWith("gpu.")&&""!==e.resourceId).map(e=>e.resourceId)),i=[],s=new Set;(e?.inventory?.gpus??[]).forEach(e=>{let t="supported"===e.telemetry;(t||r.has(e.id))&&(s.add(e.id),i.push({id:e.id,label:e.name.trim()||p(e.id),index:i.length,totalBytes:e.memoryTotalBytes,supported:t,hasHistory:r.has(e.id)}))});let n=e?.metrics?.payload.gpus;if(n?.status==="ok")for(let e of n.devices)s.has(e.id)||"ok"!==e.status||(s.add(e.id),i.push({id:e.id,label:p(e.id),index:i.length,totalBytes:e.memoryTotalBytes,supported:!0,hasHistory:r.has(e.id)}));for(let e of[...r].sort())s.has(e)||i.push({id:e,label:p(e),index:i.length,totalBytes:null,supported:!0,hasHistory:!0});return i}function h(e,t,r){if(""===r)return a(t)?.shortLabel??"Total";let i=a(t);if(null===i)return p(r);switch(i.family){case"gpus":{let t=e?.inventory?.gpus.find(e=>e.id===r);return t?.name.trim()||p(r)}case"disks":{if(t.startsWith("fs.")){let t=e?.inventory?.filesystems.find(e=>e.id===r);return t?.mountPoint||p(r)}let i=e?.inventory?.disks.find(e=>e.id===r);return i?.name||p(r)}case"network":{let t=e?.inventory?.network.find(e=>e.id===r);return t?.name||p(r)}case"cpu":{let e=/^core:(\d+)$/.exec(r);return e?`Core ${e[1]}`:p(r)}default:return p(r)}}function g(e){switch(e){case"percent":return"%";case"bytes":return"bytes";case"bytes_per_second":return"bytes/s";case"celsius":return"\xb0C";case"watts":return"W";case"milliseconds":return"ms";default:return e}}},5078:(e,t,r)=>{r.d(t,{Ah:()=>d,I_:()=>h,O5:()=>f,Vw:()=>k,bf:()=>v,dd:()=>c,ei:()=>m,fH:()=>g,ly:()=>s,pI:()=>i,r6:()=>p,zp:()=>n});let i=[{id:"10m",shortLabel:"10m",label:"Last 10 minutes",ms:6e5,refreshMs:1e3},{id:"1h",shortLabel:"1h",label:"Last hour",ms:36e5,refreshMs:1e3},{id:"6h",shortLabel:"6h",label:"Last 6 hours",ms:216e5,refreshMs:1e3},{id:"24h",shortLabel:"24h",label:"Last 24 hours",ms:864e5,refreshMs:1e3},{id:"7d",shortLabel:"7d",label:"Last 7 days",ms:6048e5,refreshMs:1e3}];function s(e){return i.find(t=>t.id===e)??i[0]}function n(e){return s(e).refreshMs}let l=["B","KiB","MiB","GiB","TiB","PiB"];function o(e){let t=Math.abs(e),r=0;for(;t>=1024&&r<l.length-1;)t/=1024,r+=1;return{value:e<0?-t:t,unit:l[r]}}function a(e,t){return String(Number(e.toFixed(t)))}function u(e,t=""){let{value:r,unit:i}=o(e),s=Math.abs(r)>=100?0:1;return`${a(r,s)} ${i}${t}`}function c(e,t){if(null==e||!Number.isFinite(e))return"—";switch(t){case"percent":return`${a(e,1)}%`;case"bytes":return u(e);case"bytes_per_second":return u(e,"/s");case"celsius":return`${a(e,1)}\xb0C`;case"watts":return`${a(e,1)} W`;case"milliseconds":return`${a(e,10>Math.abs(e)?2:1)} ms`;default:return a(e,2)}}function d(e,t){if(!Number.isFinite(e))return"—";switch(t){case"percent":return`${a(e,0)}%`;case"bytes":case"bytes_per_second":{let{value:r,unit:i}=o(e),s=Math.abs(r)>=10||0===r?0:1;return`${a(r,s)} ${i}${"bytes_per_second"===t?"/s":""}`}case"celsius":return`${a(e,0)}\xb0C`;case"watts":return`${a(e,0)} W`;case"milliseconds":return`${a(e,+(10>Math.abs(e)))} ms`;default:return a(e,1)}}function m(e){return new Date(e).toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}function p(e){return new Date(e).toLocaleString(void 0,{dateStyle:"medium",timeStyle:"medium"})}function f(e,t){let r=new Date(e);return t>=1728e5?r.toLocaleDateString(void 0,{month:"short",day:"numeric"}):t>=864e5?r.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",hour12:!1}):r.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",hour12:!1})}function h(e){let t=Math.max(0,e);return t>=36e5?`${a(t/36e5,1)} h`:t>=6e4?`${a(t/6e4,1)} min`:`${a(t/1e3,1)} s`}function g(e,t,r){let i=e.filter(e=>e.toMs>=t&&e.fromMs<=r);if(0===i.length)return"No recorded gaps in this range.";let s=i.filter(e=>"dropped"===e.kind).length,n=i.length-s,l=[];n>0&&l.push(`${n} missed interval${1===n?"":"s"}`),s>0&&l.push(`${s} dropped report${1===s?"":"s"}`);let o=[...new Set(i.map(e=>e.reason).filter(e=>"string"==typeof e&&e.length>0))],a=o.length>0?` (${o.slice(0,3).join("; ")})`:"";return`${l.join(" and ")}${a}.`}function y(e){return null!==e&&"object"==typeof e&&!Array.isArray(e)}function b(e){return"number"==typeof e&&Number.isFinite(e)}function x(e){return null===e||b(e)}function v(e){if(!y(e)||"string"!=typeof e.machineId||0===e.machineId.length||!b(e.fromMs)||!b(e.toMs)||e.toMs<=e.fromMs||!b(e.stepMs)||e.stepMs<=0||"raw"!==e.tier&&"1m"!==e.tier&&"1h"!==e.tier||"boolean"!=typeof e.truncated||!b(e.elapsedMs)||!Array.isArray(e.series)||!Array.isArray(e.gaps))return null;let t=[];for(let r of e.series){if(!y(r)||"string"!=typeof r.metric||"string"!=typeof r.resourceId||"string"!=typeof r.unit||!Array.isArray(r.points))return null;let e=[];for(let t of r.points){if(!y(t)||!b(t.t)||!x(t.min)||!x(t.max)||!x(t.avg))return null;e.push({t:t.t,min:t.min,max:t.max,avg:t.avg})}t.push({metric:r.metric,resourceId:r.resourceId,unit:r.unit,points:e})}let r=[];for(let t of e.gaps){if(!y(t)||!b(t.fromMs)||!b(t.toMs)||"missing"!==t.kind&&"dropped"!==t.kind)return null;let e={fromMs:t.fromMs,toMs:t.toMs,kind:t.kind};"string"==typeof t.reason&&(e.reason=t.reason),b(t.droppedRecords)&&(e.droppedRecords=t.droppedRecords),r.push(e)}return{machineId:e.machineId,fromMs:e.fromMs,toMs:e.toMs,stepMs:e.stepMs,tier:e.tier,series:t,gaps:r,truncated:e.truncated,elapsedMs:e.elapsedMs}}function k(e,t,r,i,n=600,l){let{fromMs:o,toMs:a}={fromMs:i-s(r).ms,toMs:i},u=new URLSearchParams({machineId:e,metrics:t.join(","),from:String(Math.floor(o)),to:String(Math.floor(a)),maxPoints:String(n)});return void 0!==l&&u.set("coreIds",l.join(",")),`/api/history?${u.toString()}`}},7284:(e,t,r)=>{r.d(t,{t:()=>o});var i=r(5155),s=r(7726),n=r(5078),l=r(4567);function o(e){let{title:t,unit:r,series:o,fromMs:a,toMs:u,stepMs:c,gaps:d,hiddenKeys:m,onToggleSeries:p,emptyMessage:f,note:h}=e,g=o.filter(e=>!m.has(e.key)),y=g.flatMap(e=>e.points),b=y.some(e=>null!==e.avg||null!==e.min||null!==e.max),x=Math.max(1,u-a),v=(0,s.$z)(d,a,u),k=(0,s.kk)(r,y.flatMap(e=>[e.min,e.max,e.avg]).filter(e=>null!==e)),w=Math.max(1e-9,k.max-k.min),M=e=>6+(Math.min(u,Math.max(a,e))-a)/x*788,$=e=>6+(1-(e-k.min)/w)*148,S=g.map(t=>{let r=(0,s.SG)(t.points,e.maxDrawPoints??600,c),i=(0,s.o)(r,{stepMs:c,gaps:d,fromMs:a,toMs:u});return{...t,segments:i}}),L=function(e,t,r,i,l,o){if(0===r.length)return`${e} chart: no series selected.`;let a=r.map(e=>{let r=(0,s.T6)(e.points);return`${e.label}: ${function(e,t){let r=[];if(null!==e.latest){let i=null!==e.latestT?(0,n.ei)(e.latestT):null;r.push(`latest ${(0,n.dd)(e.latest,t)}${i?` at ${i}`:""}`)}return r.push(`average ${(0,n.dd)(e.avg,t)}`),null!==e.min&&null!==e.max&&r.push(`recorded range ${(0,n.dd)(e.min,t)} to ${(0,n.dd)(e.max,t)}`),r.join(", ")}(r,t)}`}),u=o>0?`${o} shaded interval${1===o?"":"s"} without stored data.`:"";return`${e} time-series chart. ${a.join(". ")}. ${u} Time range ${(0,n.ei)(i)} to ${(0,n.ei)(l)}.`}(t,r,g,a,u,v.length);return(0,i.jsxs)("figure",{className:`flex min-w-0 flex-col gap-2 ${e.className??""}`,children:[(0,i.jsxs)("div",{className:"flex min-h-8 flex-wrap items-center justify-between gap-2",children:[(0,i.jsx)("h3",{className:"text-xs font-medium tracking-tight text-foreground",children:t}),(0,i.jsxs)("div",{className:"flex items-center gap-3",children:[(0,i.jsx)("span",{className:"tnum shrink-0 text-xs text-muted-foreground",children:h??(0,l.RL)(r)}),e.action]})]}),b?(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)("div",{className:"flex min-w-0 gap-2",children:[(0,i.jsx)("div",{"aria-hidden":!0,className:"flex h-40 w-14 shrink-0 flex-col justify-between py-0.5 text-right text-xs leading-none tnum text-muted-foreground",children:[...k.ticks].reverse().map(e=>(0,i.jsx)("span",{children:(0,n.Ah)(e,r)},e))}),(0,i.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,i.jsxs)("svg",{viewBox:"0 0 800 160",preserveAspectRatio:"none",role:"img","aria-label":L,className:"block h-40 w-full",children:[(0,i.jsx)("title",{children:t}),k.ticks.map(e=>(0,i.jsx)("line",{x1:6,x2:794,y1:$(e),y2:$(e),stroke:"var(--border)",strokeWidth:"1",vectorEffect:"non-scaling-stroke"},`grid-${e}`)),v.map(e=>(0,i.jsx)("rect",{x:M(e.fromMs),y:6,width:Math.max(1,M(e.toMs)-M(e.fromMs)),height:148,fill:"var(--muted-foreground)",opacity:"0.09"},`gap-${e.fromMs}-${e.toMs}-${e.kind}`)),S.map(e=>{var t;let r=(t=e.segments,t.filter(e=>e.length>1).map(e=>{let t=e.map(e=>`${M(e.t).toFixed(2)},${$(e.max??e.avg).toFixed(2)}`),r=[...e].reverse().map(e=>`${M(e.t).toFixed(2)},${$(e.min??e.avg).toFixed(2)}`);return`M${t.join("L")}L${r.join("L")}Z`}).join(" "));return""===r?null:(0,i.jsx)("path",{d:r,fill:e.color,opacity:"0.14",stroke:"none"},`band-${e.key}`)}),S.map(e=>{var t;let r=(t=e.segments,t.filter(e=>e.length>1).map(e=>e.map((e,t)=>`${0===t?"M":"L"}${M(e.t).toFixed(2)},${$(e.avg).toFixed(2)}`).join(" ")).join(" "));return""===r?null:(0,i.jsx)("path",{d:r,fill:"none",stroke:e.color,strokeWidth:"2",strokeDasharray:e.dash,strokeLinecap:"round",strokeLinejoin:"round",vectorEffect:"non-scaling-stroke"},`line-${e.key}`)}),S.flatMap(e=>e.segments.filter(e=>1===e.length).map(t=>{let r=t[0],s=M(r.t),n=$(r.avg);return(0,i.jsx)("line",{x1:s-2.5,x2:s+2.5,y1:n,y2:n,stroke:e.color,strokeWidth:"2.5",strokeLinecap:"round",vectorEffect:"non-scaling-stroke"},`dot-${e.key}-${r.t}`)}))]}),(0,i.jsx)("div",{"aria-hidden":!0,className:"mt-1 flex justify-between gap-2 text-xs leading-tight tnum text-muted-foreground",children:(0,s.Cf)(a,u).map((e,t,r)=>(0,i.jsx)("span",{className:`${0===t?"text-left":t===r.length-1?"text-right":"hidden text-center sm:inline"}`,children:(0,n.O5)(e,x)},e))})]})]}),(0,i.jsx)("div",{className:"flex flex-wrap items-center gap-x-4 gap-y-1.5 text-xs",children:o.map(e=>{let t=!m.has(e.key),l=(0,s.T6)(e.points);return(0,i.jsxs)("label",{className:"inline-flex min-h-7 cursor-pointer items-center gap-1.5",title:t?`Hide ${e.label}`:`Show ${e.label}`,children:[(0,i.jsx)("input",{type:"checkbox",checked:t,onChange:()=>p(e.key),className:"peer sr-only"}),(0,i.jsx)("span",{"aria-hidden":!0,className:"flex h-4 w-5 shrink-0 items-center justify-center rounded-sm peer-focus-visible:outline peer-focus-visible:outline-2 peer-focus-visible:outline-offset-2 peer-focus-visible:[outline-color:var(--focus)]",children:(0,i.jsx)("svg",{viewBox:"0 0 20 8",className:"h-2 w-5","aria-hidden":!0,children:(0,i.jsx)("line",{x1:"1",y1:"4",x2:"19",y2:"4",stroke:e.color,strokeWidth:"2.5",strokeDasharray:e.dash,strokeLinecap:"round"})})}),(0,i.jsx)("span",{className:t?"text-foreground":"text-muted-foreground line-through",children:e.label}),(0,i.jsx)("span",{className:"tnum text-muted-foreground",children:(0,n.dd)(l.latest,r)})]},`legend-${e.key}`)})})]}):(0,i.jsx)("div",{className:"flex min-h-32 items-center justify-center rounded-lg border border-dashed border-border px-4 py-6 text-center text-xs text-muted-foreground",children:0===o.length?f:0===g.length?"All series are hidden. Re-enable one in the legend below.":f}),!b&&o.length>0?(0,i.jsx)("div",{className:"flex flex-wrap items-center gap-x-4 gap-y-1.5 text-xs",children:o.map(e=>{let t=!m.has(e.key);return(0,i.jsxs)("label",{className:"inline-flex min-h-7 cursor-pointer items-center gap-1.5",children:[(0,i.jsx)("input",{type:"checkbox",checked:t,onChange:()=>p(e.key),className:"peer sr-only"}),(0,i.jsx)("span",{"aria-hidden":!0,className:"flex h-4 w-5 shrink-0 items-center justify-center peer-focus-visible:outline peer-focus-visible:outline-2 peer-focus-visible:outline-offset-2 peer-focus-visible:[outline-color:var(--focus)]",children:(0,i.jsx)("svg",{viewBox:"0 0 20 8",className:"h-2 w-5","aria-hidden":!0,children:(0,i.jsx)("line",{x1:"1",y1:"4",x2:"19",y2:"4",stroke:e.color,strokeWidth:"2.5",strokeDasharray:e.dash,strokeLinecap:"round"})})}),(0,i.jsx)("span",{className:t?"text-foreground":"text-muted-foreground line-through",children:e.label})]},`legend-empty-${e.key}`)})}):null]})}},7726:(e,t,r)=>{function i(e){return null!==e.avg&&Number.isFinite(e.avg)}function s(e){return null!==e&&Number.isFinite(e)?e:null}function n(e,t,r){let i=e.map(e=>({...e,fromMs:Math.max(t,e.fromMs),toMs:Math.min(r,e.toMs)})).filter(e=>e.toMs>e.fromMs).sort((e,t)=>e.fromMs-t.fromMs||e.toMs-t.toMs),s=[];for(let e of i){let t=s.at(-1);if(void 0!==t&&e.fromMs<=t.toMs){t.toMs=Math.max(t.toMs,e.toMs),"missing"===t.kind&&"dropped"===e.kind&&(t.kind="dropped"),void 0===t.reason&&void 0!==e.reason&&(t.reason=e.reason),void 0===t.droppedRecords&&void 0!==e.droppedRecords&&(t.droppedRecords=e.droppedRecords);continue}s.push({...e})}return s}function l(e,t,r){return Math.max(e,"1h"===t?36e5:"1m"===t?6e4:100,r??0)}function o(e,t){let r=[...e].sort((e,t)=>e.t-t.t),s=n(t.gaps,t.fromMs,t.toMs),l=Math.max(1,t.stepMs),o=[],a=[],u=()=>{a.length>0&&o.push(a),a=[]};for(let e of r){if(!i(e)){u();continue}let t=a.at(-1);if(void 0!==t){let r=!e.merged&&!t.merged&&(e.t<t.t||e.t-t.t>1.5*l),i=!0===e.gapBefore||function(e,t,r){return r.some(r=>r.toMs>e&&r.fromMs<t)}(t.t,e.t,s);(r||i)&&u()}a.push(e)}return u(),o}function a(e,t,r){if(t<=0)return[];let n=[...e].sort((e,t)=>e.t-t.t);if(n.length<=t)return n.map(e=>({...e}));let l=Math.max(2,Math.ceil(n.length/t)),o=Math.max(1,r),a=[],u=[],c=!1,d=null,m=()=>{if(0===u.length)return;let e=null,t=null,r=0,i=0;for(let n of u){let l=s(n.min),o=s(n.max);null!==l&&(null===e||l<e)&&(e=l),null!==o&&(null===t||o>t)&&(t=o);let a=s(n.avg);null!==a&&(r+=a,i+=1)}a.push({t:u[0].t,min:e,max:t,avg:i>0?r/i:null,...u.length>1?{merged:!0}:{},...c?{gapBefore:!0}:{}}),u=[],c=!1};for(let e of n){if(!i(e)){m(),a.push({...e}),d=null;continue}let t=null!==d&&e.t>=d.t&&e.t-d.t<=1.5*o;u.length>0&&(!t||u.length>=l)&&m(),0===u.length&&(c=null!==d&&!t),u.push(e),d=e}return m(),a}function u(e){let t=null,r=null,i=0,n=0,l=null,o=null,a=null,u=null;for(let c of e){if(null===c.avg)continue;(null===a||c.t<a)&&(a=c.t),(null===u||c.t>u)&&(u=c.t);let e=s(c.min),d=s(c.max);null!==e&&(null===t||e<t)&&(t=e),null!==d&&(null===r||d>r)&&(r=d),null!==c.avg&&Number.isFinite(c.avg)&&(i+=c.avg,n+=1,l=c.avg,o=c.t)}return{count:n,min:t,max:r,avg:n>0?i/n:null,latest:l,latestT:o,firstT:a,lastT:u}}function c(e){if(!Number.isFinite(e)||e<=0)return 1;let t=Math.pow(10,Math.floor(Math.log10(e))),r=e/t;return(r<=1?1:r<=2?2:r<=5?5:10)*t}function d(e,t){if("percent"===e)return{min:0,max:100,ticks:[0,25,50,75,100]};let r=t.filter(e=>null!==e&&Number.isFinite(e));if(0===r.length)return{min:0,max:1,ticks:[0,1]};let i=Math.min(...r),s=Math.max(...r);if("celsius"===e){let e=Math.max(1,(s-i)*.1);i=5*Math.floor((i-e)/5),s=5*Math.ceil((s+e)/5)}else i=0,s=s>0?s:1;s<=i&&(s=i+1);let n=c((s-i)/4),l=Math.floor(i/n)*n,o=Math.ceil(s/n)*n,a=function(e,t,r=4){if(!Number.isFinite(e)||!Number.isFinite(t))return[0,1];if(t<=e)return[e];let i=c((t-e)/Math.max(1,r)),s=Math.ceil(e/i)*i,n=[];for(let e=s;e<=t+.001*i&&n.length<20;e+=i)n.push(Number(e.toPrecision(12)));return n.length>0?n:[e,t]}(l,o,4);return{min:l,max:o,ticks:a}}function m(e,t,r=4){let i=Math.max(2,Math.floor(r)),s=Math.max(0,t-e);return Array.from({length:i},(t,r)=>e+s*r/(i-1))}r.d(t,{$z:()=>n,Cf:()=>m,SG:()=>a,T6:()=>u,jl:()=>l,kk:()=>d,o:()=>o})},9429:(e,t,r)=>{r.d(t,{n:()=>l});var i=r(2115),s=r(5078);async function n(e){let t=null;try{let r=await e.json();if(null!==r&&"object"==typeof r&&"error"in r){let e=r.error;"string"==typeof e&&(t=e)}}catch{}switch(e.status){case 401:return{kind:"unauthorized",message:"Your session is no longer accepted."};case 403:return{kind:"denied",message:t??"You do not have access to this machine's history."};case 404:return{kind:"missing",message:t??"This machine is not available to the hub."};case 429:return{kind:"rate-limited",message:t??"The hub is limiting history requests."};case 503:return{kind:"unavailable",message:t??"History is temporarily unavailable."};default:return{kind:"invalid",message:t??`The hub could not answer this history query (${e.status}).`}}}function l({machineId:e,metricsKey:t,coreIdsKey:r,range:o,enabled:a=!0,autoRefresh:u=!0,refreshNonce:c=0}){let[d,m]=(0,i.useState)({machineId:e,metricsKey:t,coreIdsKey:r,range:o}),p=d.machineId===e&&d.range===o;(0,i.useEffect)(()=>{if(!p)return void m({machineId:e,metricsKey:t,coreIdsKey:r,range:o});let i=window.setTimeout(()=>m({machineId:e,metricsKey:t,coreIdsKey:r,range:o}),300);return()=>window.clearTimeout(i)},[e,t,r,o,p]);let f=p?d:{machineId:e,metricsKey:t,coreIdsKey:r,range:o},h=f.metricsKey,g=f.coreIdsKey,y=`${e}|${h}|${o}|${g??"all"}`,[b,x]=(0,i.useState)(null),[v,k]=(0,i.useState)(null),[w,M]=(0,i.useState)(null),$=(0,i.useRef)(c);return(0,i.useEffect)(()=>{let t=$.current!==c;if($.current=c,!a||!e||!h)return;let r=!0,i=!1,l=!1,d=-1/0,m=new AbortController,p=(0,s.zp)(o),f=async(t=!1)=>{if(r&&!i&&!l){i=!0,d=Date.now(),M({key:y,manual:t});try{let t=await fetch((0,s.Vw)(e,h.split(","),o,Date.now(),600,void 0===g?void 0:g.split(",").filter(Boolean)),{signal:"function"!=typeof AbortSignal.any||"function"!=typeof AbortSignal.timeout?m.signal:AbortSignal.any([m.signal,AbortSignal.timeout(2e4)]),cache:"no-store",headers:{Accept:"application/json"}});if(!t.ok)throw await n(t);let i=(0,s.bf)(await t.json());if(null===i||i.machineId!==e)throw{kind:"invalid",message:"Unexpected history response."};if(!r)return;x({key:y,range:o,result:i,loadedAt:Date.now()}),k(null)}catch(t){if(!r||m.signal.aborted)return;let e=null!==t&&"object"==typeof t&&"kind"in t&&"message"in t&&"string"==typeof t.message?t:{kind:"network",message:"Could not reach the hub. Try again."};l="rate-limited"===e.kind,["unauthorized","denied","missing"].includes(e.kind)&&x(null),k({key:y,error:e})}finally{i=!1,r&&M(null)}}},b=()=>{"visible"!==document.visibilityState||Date.now()-d<p||f()};f(t);let v=u?window.setInterval(b,p):null;return u&&document.addEventListener("visibilitychange",b),()=>{r=!1,m.abort(),null!==v&&window.clearInterval(v),document.removeEventListener("visibilitychange",b)}},[a,e,h,g,o,y,u,c]),{data:a&&b?.result.machineId===e&&b.range===o?b:null,error:a&&v?.key===y?v.error:null,loading:a&&w?.key===y,manualRefreshing:a&&w?.key===y&&w.manual}}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[900],{4546:(e,s,t)=>{Promise.resolve().then(t.bind(t,8887))},8528:(e,s,t)=>{"use strict";t.d(s,{A:()=>l});let l=(0,t(8698).A)("ChevronRight",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]])},8887:(e,s,t)=>{"use strict";t.d(s,{MachineView:()=>X});var l=t(5155),a=t(8500),n=t.n(a),r=t(8698);let i=(0,r.A)("Timer",[["line",{x1:"10",x2:"14",y1:"2",y2:"2",key:"14vaq8"}],["line",{x1:"12",x2:"15",y1:"14",y2:"11",key:"17fdiu"}],["circle",{cx:"12",cy:"14",r:"8",key:"1e1u0o"}]]),d=(0,r.A)("HardDrive",[["line",{x1:"22",x2:"2",y1:"12",y2:"12",key:"1y58io"}],["path",{d:"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z",key:"oot6mr"}],["line",{x1:"6",x2:"6.01",y1:"16",y2:"16",key:"sgf278"}],["line",{x1:"10",x2:"10.01",y1:"16",y2:"16",key:"1l4acy"}]]),o=(0,r.A)("ArrowLeft",[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]]);var c=t(4173),x=t(3440),m=t(940),u=t(802),h=t(2115),p=t(8528),j=t(4567),g=t(7726),f=t(9429),v=t(7284);let N=new Set,y=new Set(["cpu.usage","memory.used","gpu.utilization","gpu.memory.used"]);function b({machine:e}){let[s,t]=(0,h.useState)(N),a=(0,j.er)(e).filter(e=>y.has(e)).join(","),{data:r,error:i}=(0,f.n)({machineId:e.machineId,metricsKey:a,range:"10m"}),d=e=>t(s=>{let t=new Set(s);return t.has(e)?t.delete(e):t.add(e),t}),o=(0,j.ue)(e,r?.result.series??[]),c=(r?.result.series??[]).map(e=>{let s=(0,j.oB)(e.metric),t=e.metric.startsWith("gpu.")?Math.max(1,o.findIndex(s=>s.id===e.resourceId)+1):0,l=(0,j.Lf)(s,t);return{key:`${e.metric}\0${e.resourceId}`,metric:e.metric,resourceId:e.resourceId,label:"cpu.usage"===e.metric?"CPU":"memory.used"===e.metric?"RAM":`GPU ${t}`,color:l.color,dash:l.dash,points:e.points}});return(0,l.jsxs)(x.Z,{title:"Recent usage \xb7 10m",action:(0,l.jsxs)(n(),{href:`/history?machineId=${encodeURIComponent(e.machineId)}`,className:"inline-flex min-h-8 items-center gap-1 text-xs text-accent hover:underline",children:["History",(0,l.jsx)(p.A,{className:"h-3.5 w-3.5","aria-hidden":!0})]}),children:[i?(0,l.jsx)("p",{role:"status",className:"mb-2 text-xs text-warn",children:r?"Refresh failed \xb7 showing saved readings":i.message}):null,r?.result.truncated?(0,l.jsx)("p",{className:"mb-2 text-xs text-warn",children:"Partial history"}):null,r?(0,l.jsx)("div",{className:"grid gap-5 lg:grid-cols-2",children:[{title:"CPU & GPU",unit:"percent"},{title:"RAM & VRAM",unit:"bytes"}].map(({title:t,unit:a})=>(0,l.jsx)(v.t,{title:t,unit:a,series:c.filter(e=>(0,j.oB)(e.metric)?.unit===a),fromMs:r.result.fromMs,toMs:r.result.toMs,stepMs:(0,g.jl)(r.result.stepMs,r.result.tier,e.expectedIntervalMs),gaps:r.result.gaps,hiddenKeys:s,onToggleSeries:d,emptyMessage:"No readings"},a))}):(0,l.jsx)("div",{className:"flex min-h-48 items-center justify-center text-xs text-muted-foreground",role:"status",children:i?"History unavailable":"Loading history…"})]})}var w=t(8664),k=t(6582),B=t(6576),$=t(7586),M=t(2241);function P({label:e,valueLabel:s,percent:t,tone:a,ariaLabel:n,note:r}){let i=null===t?null:Math.min(100,Math.max(0,t));return(0,l.jsxs)("div",{className:"min-w-0",children:[(0,l.jsxs)("div",{className:"flex flex-wrap items-baseline justify-between gap-x-2 gap-y-0.5",children:[(0,l.jsx)("span",{className:"text-xs text-muted-foreground",children:e}),(0,l.jsx)("span",{className:"tnum text-xs text-foreground",children:s})]}),(0,l.jsx)("div",{role:"img","aria-label":n,className:"mt-1.5 h-1.5 w-full overflow-hidden rounded-full bg-card-strong",children:null===i?(0,l.jsx)("div",{className:"h-full w-full rounded-full border border-dashed border-border"}):(0,l.jsx)("div",{className:"h-full rounded-full",style:{width:`${i}%`,backgroundColor:"cpu"===a?"var(--cpu)":"mem"===a?"var(--mem)":"swap"===a?"var(--swap)":"gpu"===a?"var(--accent)":"var(--mem)"}})}),r?(0,l.jsx)("p",{className:"mt-1.5 text-xs text-muted-foreground",children:r}):null]})}function z({label:e,value:s}){return(0,l.jsxs)("div",{className:"flex items-baseline justify-between gap-3",children:[(0,l.jsx)("dt",{className:"text-xs text-muted-foreground",children:e}),(0,l.jsx)("dd",{className:"tnum min-w-0 truncate text-right text-xs text-foreground",children:s})]})}function C({children:e}){return(0,l.jsx)("p",{className:"text-xs text-muted-foreground",children:e})}function L({reason:e}){return(0,l.jsxs)("p",{className:"text-xs text-warn",children:["Unavailable — ",e]})}function U({children:e}){return(0,l.jsx)("h3",{className:"text-xs font-medium text-muted-foreground",children:e})}function I({stale:e}){return e?(0,l.jsx)(B.vw,{text:"last known",title:"Retained from the last accepted sample"}):null}function S(e,s){return Number.isFinite(e)&&Number.isFinite(s)&&!(s<=0)?e/s*100:null}function T(e,s){return"available"===e.state?s:e.reason}function A({readings:e,className:s=""}){let t=new Map;for(let s of e){if("value"===s.reading.state)continue;let e=t.get(s.reading.reason)??[];e.push(s.label),t.set(s.reading.reason,e)}return(0,l.jsxs)("div",{className:s,children:[(0,l.jsx)("dl",{className:"grid grid-cols-2 gap-x-4 gap-y-2 sm:grid-cols-4",children:e.map(({label:e,reading:s,format:t})=>{let a="value"===s.state;return(0,l.jsxs)("div",{className:"min-w-0",children:[(0,l.jsx)("dt",{className:"text-xs text-muted-foreground",children:e}),(0,l.jsxs)("dd",{className:"tnum text-xs text-foreground",title:a?void 0:s.reason,children:[a?t(s.value):"—",a&&s.stale?(0,l.jsx)("span",{className:"ml-1 text-muted-foreground",children:"last known"}):null]})]},e)})}),t.size>0?(0,l.jsx)("p",{className:"mt-1.5 text-xs leading-relaxed text-muted-foreground",children:[...t].map(([e,s])=>`${s.join(", ")} — ${e}`).join(" \xb7 ")}):null]})}function R({view:e,ageLabel:s,held:t,className:a}){var n;let r=e.cpu.perCore;return(0,l.jsxs)(x.Z,{title:"CPU",className:a,action:(0,l.jsx)(I,{stale:e.stale}),children:[(0,l.jsxs)("div",{className:"grid gap-6 lg:grid-cols-[minmax(0,13rem)_minmax(0,1fr)] lg:items-start",children:[(0,l.jsx)("div",{className:"flex flex-col items-center",children:(0,l.jsx)(B.iL,{metricName:"CPU",field:"value"===(n=e.cpu.total).state?n.stale?{out:"stale",value:n.value}:{out:"value",value:n.value}:"unavailable"===n.state?{out:"unavailable",reason:n.reason}:{out:"absent"},ageLabel:s,isHeld:t,thresholdMs:e.thresholdMs})}),(0,l.jsxs)("div",{className:"min-w-0",children:[(0,l.jsxs)("div",{className:"flex items-baseline justify-between gap-3",children:[(0,l.jsx)(U,{children:"Per logical core"}),"value"===r.state?(0,l.jsxs)("span",{className:"tnum text-xs text-muted-foreground",children:[(0,M.B4)(r.value.length)," cores"]}):null]}),"value"===r.state?(0,l.jsx)(l.Fragment,{children:(0,l.jsx)("ul",{className:"mt-2 grid grid-cols-[repeat(auto-fit,minmax(3.5rem,1fr))] gap-1.5",children:r.value.map((e,s)=>{let t=null!==e,a=t?Math.min(100,Math.max(0,e)):0;return(0,l.jsxs)("li",{className:"rounded-md border border-border bg-card-strong/40 px-1.5 py-1",title:t?`Core ${s}: ${(0,$.l9)(e)}`:`Core ${s}: counter regressed or was missing for this interval`,children:[(0,l.jsxs)("div",{className:"flex flex-col items-start gap-0.5",children:[(0,l.jsxs)("span",{className:"tnum text-xs text-muted-foreground",children:["C",s]}),(0,l.jsx)("span",{className:"tnum text-xs text-foreground",children:t?(0,$.l9)(e):"—"})]}),(0,l.jsx)("div",{"aria-hidden":!0,className:"mt-1 h-0.5 w-full overflow-hidden rounded-full bg-border",children:t?(0,l.jsx)("div",{className:"h-full rounded-full",style:{width:`${a}%`,backgroundColor:"var(--cpu)"}}):null}),(0,l.jsx)("span",{className:"sr-only",children:t?`Core ${s} at ${(0,$.l9)(e)}`:`Core ${s} unavailable this interval`})]},s)})})}):"unavailable"===r.state?(0,l.jsx)("div",{className:"mt-2",children:(0,l.jsx)(L,{reason:r.reason})}):(0,l.jsx)("div",{className:"mt-2",children:(0,l.jsx)(C,{children:r.reason})})]})]}),(0,l.jsxs)("div",{className:"mt-4 border-t border-border pt-3",children:[(0,l.jsx)(U,{children:"Heat, power and stalls"}),(0,l.jsx)(A,{className:"mt-1",readings:[{label:"Temperature",reading:e.bottlenecks.cpuTemperature,format:M.cH},{label:"Package power",reading:e.bottlenecks.cpuPower,format:M.d5},{label:"I/O wait",reading:e.bottlenecks.cpuIowait,format:$.l9},{label:"Pressure",reading:e.bottlenecks.cpuPressure,format:$.l9}]})]})]})}function F({view:e,ageLabel:s,held:t,className:a}){var n;let r=e.swap;return(0,l.jsx)(x.Z,{title:"Memory and swap",className:a,action:(0,l.jsx)(I,{stale:e.stale}),children:(0,l.jsxs)("div",{className:"flex flex-col gap-5",children:[(0,l.jsxs)("div",{children:[(0,l.jsx)(U,{children:"Memory"}),(0,l.jsx)("div",{className:"mt-2",children:(0,l.jsx)(B.jB,{field:"value"===(n=e.memory).state?n.stale?{out:"stale",usedBytes:n.value.usedBytes,totalBytes:n.value.totalBytes}:{out:"value",usedBytes:n.value.usedBytes,totalBytes:n.value.totalBytes}:"unavailable"===n.state?{out:"unavailable",reason:n.reason}:{out:"absent"},ageLabel:s,isHeld:t,thresholdMs:e.thresholdMs})})]}),(0,l.jsxs)("div",{className:"border-t border-border pt-4",children:[(0,l.jsx)(U,{children:"Pressure"}),(0,l.jsx)(A,{className:"mt-1",readings:[{label:"Some tasks",reading:e.bottlenecks.memoryPressureSome,format:$.l9},{label:"Full",reading:e.bottlenecks.memoryPressureFull,format:$.l9}]})]}),(0,l.jsxs)("div",{className:"border-t border-border pt-4",children:[(0,l.jsx)(U,{children:"Swap"}),"value"===r.state?0===r.value.totalBytes?(0,l.jsxs)("div",{className:"mt-2 flex flex-col gap-1",children:[(0,l.jsx)("p",{className:"text-sm",children:"No swap configured."}),(0,l.jsx)(C,{children:"SwapTotal is zero; this is a valid configuration, not a missing reading."})]}):(0,l.jsxs)("div",{className:"mt-2 flex flex-col gap-2",children:[(0,l.jsx)(P,{label:"Used",valueLabel:`${(0,$.z3)(r.value.usedBytes)} / ${(0,$.z3)(r.value.totalBytes)}`,percent:S(r.value.usedBytes,r.value.totalBytes),tone:"swap",ariaLabel:`Swap ${(0,$.z3)(r.value.usedBytes)} of ${(0,$.z3)(r.value.totalBytes)}`}),(0,l.jsxs)("p",{className:"tnum text-xs text-muted-foreground",children:[(0,$.l9)(S(r.value.usedBytes,r.value.totalBytes))," used",r.stale?" \xb7 last known":""]})]}):"unavailable"===r.state?(0,l.jsx)("div",{className:"mt-2",children:(0,l.jsx)(L,{reason:r.reason})}):(0,l.jsx)("div",{className:"mt-2",children:(0,l.jsx)(C,{children:r.reason})})]})]})})}function Z({card:e}){let s="supported"===e.telemetry;return(0,l.jsxs)("article",{className:"flex min-w-0 flex-col gap-3 rounded-lg border border-border bg-card-strong/25 p-3",children:[(0,l.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-2",children:[(0,l.jsxs)("div",{className:"min-w-0",children:[(0,l.jsx)("h3",{className:"truncate text-sm font-medium",children:e.name}),(0,l.jsxs)("p",{className:"tnum truncate text-xs text-muted-foreground",children:[e.vendor,e.pciBusId?` \xb7 ${e.pciBusId}`:""]})]}),(0,l.jsxs)("div",{className:"flex shrink-0 flex-wrap items-center gap-1.5",children:[s?null:(0,l.jsx)(B.vw,{text:"no telemetry",title:e.reason??"Management adapter"}),e.stale?(0,l.jsx)(B.vw,{text:"last known",title:"Retained from the last accepted sample"}):null]})]}),"ok"===e.state?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(P,{label:"GPU utilization",valueLabel:null===e.utilizationPercent?"Not reported":(0,$.l9)(e.utilizationPercent),percent:e.utilizationPercent,tone:"gpu",ariaLabel:null===e.utilizationPercent?`${e.name} utilization not reported`:`${e.name} utilization ${(0,$.l9)(e.utilizationPercent)}`}),(0,l.jsx)(P,{label:"VRAM",valueLabel:null===e.memoryUsedBytes||null===e.memoryTotalBytes?"Not reported":`${(0,$.z3)(e.memoryUsedBytes)} / ${(0,$.z3)(e.memoryTotalBytes)}`,percent:null!==e.memoryUsedBytes&&null!==e.memoryTotalBytes?S(e.memoryUsedBytes,e.memoryTotalBytes):null,tone:"gpu",ariaLabel:null===e.memoryUsedBytes||null===e.memoryTotalBytes?`${e.name} VRAM not reported`:`${e.name} VRAM ${(0,$.z3)(e.memoryUsedBytes)} of ${(0,$.z3)(e.memoryTotalBytes)}`}),(0,l.jsxs)("dl",{className:"grid grid-cols-2 gap-x-4 gap-y-1",children:[(0,l.jsx)(z,{label:"Temperature",value:null===e.temperatureC?"Not reported":(0,M.cH)(e.temperatureC)}),(0,l.jsx)(z,{label:"Power",value:null===e.powerWatts?"Not reported":(0,M.d5)(e.powerWatts)})]})]}):(0,l.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,l.jsx)("p",{className:"text-xs text-muted-foreground",children:"unsupported"===e.state?"No telemetry.":"No readings for this device."}),e.reason?(0,l.jsx)("p",{className:"text-xs text-warn",children:e.reason}):null,null!==e.memoryTotalBytes?(0,l.jsx)("dl",{className:"mt-1",children:(0,l.jsx)(z,{label:"VRAM total",value:(0,$.z3)(e.memoryTotalBytes)})}):null]})]})}function H({view:e,className:s}){let t=e.gpus.cards;return(0,l.jsx)(x.Z,{title:"GPUs",className:s,action:(0,l.jsxs)("span",{className:"flex items-center gap-2",children:[(0,l.jsx)("span",{className:"tnum",children:0===t.length?"0 devices":`${t.length} device${1===t.length?"":"s"}`}),(0,l.jsx)(I,{stale:e.stale})]}),children:0===t.length?"unavailable"===e.gpus.family.state?(0,l.jsx)(L,{reason:e.gpus.family.reason}):(0,l.jsx)(C,{children:T(e.gpus.family,"No GPU devices were reported.")}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("div",{className:"grid gap-3 md:grid-cols-2 xl:grid-cols-3",children:t.map(e=>(0,l.jsx)(Z,{card:e},e.id))}),"unavailable"===e.gpus.family.state?(0,l.jsxs)("p",{className:"mt-3 text-xs text-warn",children:["GPU unavailable \xb7 ",e.gpus.family.reason]}):e.gpus.partial?(0,l.jsx)("p",{className:"mt-3 text-xs text-warn",children:"Some GPUs are not reporting."}):null]})})}function V({filesystem:e}){let s="ok"===e.state&&null!==e.usedBytes&&null!==e.totalBytes?S(e.usedBytes,e.totalBytes):null,t="ok"===e.state&&null!==e.usedBytes&&null!==e.totalBytes?`${(0,$.z3)(e.usedBytes)} / ${(0,$.z3)(e.totalBytes)}`:null!==e.totalBytes?`${(0,$.z3)(e.totalBytes)} total`:"Unavailable",a="ok"===e.state&&null!==e.inodesUsed&&null!==e.inodesTotal&&e.inodesTotal>0?S(e.inodesUsed,e.inodesTotal):null;return(0,l.jsxs)("li",{className:"py-2.5",children:[(0,l.jsxs)("div",{className:"flex flex-wrap items-baseline justify-between gap-x-3 gap-y-1",children:[(0,l.jsx)("span",{className:"break-all font-mono text-xs text-foreground",children:e.mountPoint}),(0,l.jsxs)("span",{className:"tnum break-all text-xs text-muted-foreground",children:[e.fsType,e.device?` \xb7 ${e.device}`:""]})]}),(0,l.jsx)("div",{className:"mt-2",children:(0,l.jsx)(P,{label:"Capacity",valueLabel:t,percent:s,tone:"disk",ariaLabel:`${e.mountPoint} ${t}`})}),"ok"===e.state?(0,l.jsx)("p",{className:"tnum mt-1 text-xs text-muted-foreground",title:null===a?"Inode usage was not reported for this filesystem.":void 0,children:null===a?"Inodes not reported":`Inodes ${(0,$.l9)(a)} used \xb7 ${(0,M.B4)(e.inodesUsed)} / ${(0,M.B4)(e.inodesTotal)}`}):null,"unavailable"===e.state&&e.reason?(0,l.jsx)("p",{className:"mt-1.5 text-xs text-warn",children:e.reason}):"inventory"===e.state&&e.reason?(0,l.jsx)("p",{className:"mt-1.5 text-xs text-muted-foreground",children:e.reason}):e.stale?(0,l.jsx)("p",{className:"mt-1.5 text-xs text-muted-foreground",children:"Last known usage."}):null]})}function E({disk:e}){let s=null===e.rotational?"Unknown media":e.rotational?"Rotational":"Solid state",t=[null===e.readLatencyMs?"read latency":null,null===e.writeLatencyMs?"write latency":null,null===e.ioUtilizationPercent?"utilization":null].filter(e=>null!==e);return(0,l.jsxs)("li",{className:"py-2.5",children:[(0,l.jsxs)("div",{className:"flex flex-wrap items-baseline justify-between gap-x-3 gap-y-1",children:[(0,l.jsx)("span",{className:"font-mono text-xs text-foreground",children:e.name}),(0,l.jsxs)("span",{className:"tnum text-xs text-muted-foreground",children:[s,null!==e.sizeBytes?` \xb7 ${(0,$.z3)(e.sizeBytes)}`:""]})]}),e.model?(0,l.jsx)("p",{className:"mt-0.5 truncate text-xs text-muted-foreground",children:e.model}):null,"ok"===e.state?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)("dl",{className:"mt-1.5 grid grid-cols-2 gap-x-4 gap-y-1 sm:grid-cols-4",children:[(0,l.jsx)(z,{label:"Read",value:(0,M.CE)(e.readBytesPerSec)}),(0,l.jsx)(z,{label:"Write",value:(0,M.CE)(e.writeBytesPerSec)}),(0,l.jsx)(z,{label:"Read latency",value:(0,M.YL)(e.readLatencyMs)}),(0,l.jsx)(z,{label:"Write latency",value:(0,M.YL)(e.writeLatencyMs)}),(0,l.jsx)(z,{label:"Utilization",value:null===e.ioUtilizationPercent?"—":(0,$.l9)(e.ioUtilizationPercent)})]}),t.length>0?(0,l.jsxs)("p",{className:"mt-1 text-xs text-muted-foreground",children:["Not reported: ",t.join(", "),"."]}):null]}):(0,l.jsx)("p",{className:`mt-1.5 text-xs ${"unavailable"===e.state?"text-warn":"text-muted-foreground"}`,children:e.reason??"No current I/O reading."}),"ok"===e.state&&e.stale?(0,l.jsx)("p",{className:"mt-1 text-xs text-muted-foreground",children:"Last known rates."}):null]})}function G({view:e,className:s}){let t=e.filesystems.items,a=e.disks.items;return(0,l.jsxs)(x.Z,{title:"Disks",className:s,action:(0,l.jsx)(I,{stale:e.stale}),children:[0===t.length&&0===a.length?"unavailable"===e.disks.family.state?(0,l.jsx)(L,{reason:e.disks.family.reason}):(0,l.jsx)(C,{children:T(e.disks.family,"No disks or filesystems were reported.")}):null,(0,l.jsxs)("div",{className:"mt-5 flex flex-col gap-5",children:[t.length>0?(0,l.jsxs)("div",{children:[(0,l.jsx)(U,{children:"Filesystems"}),(0,l.jsx)("ul",{className:"mt-1 divide-y divide-border",children:t.map(e=>(0,l.jsx)(V,{filesystem:e},e.id))})]}):null,a.length>0?(0,l.jsxs)("div",{className:t.length>0?"border-t border-border pt-4":"",children:[(0,l.jsx)(U,{children:"Devices"}),(0,l.jsx)("ul",{className:"mt-1 divide-y divide-border",children:a.map(e=>(0,l.jsx)(E,{disk:e},e.id))})]}):null,"unavailable"!==e.disks.family.state?(0,l.jsxs)("div",{className:t.length>0||a.length>0?"border-t border-border pt-4":"",children:[(0,l.jsx)(U,{children:"I/O pressure"}),(0,l.jsx)(A,{className:"mt-1",readings:[{label:"Some tasks",reading:e.bottlenecks.ioPressureSome,format:$.l9},{label:"Full",reading:e.bottlenecks.ioPressureFull,format:$.l9}]})]}):null]})]})}function _({iface:e}){let s="up"===e.linkState?"Link up":"down"===e.linkState?"Link down":"Link state unknown";return(0,l.jsxs)("li",{className:"py-3",children:[(0,l.jsxs)("div",{className:"flex flex-wrap items-baseline justify-between gap-x-3 gap-y-1",children:[(0,l.jsx)("span",{className:"font-mono text-xs text-foreground",children:e.name}),(0,l.jsxs)("span",{className:"flex flex-wrap items-center gap-1.5",children:[e.virtual?(0,l.jsx)(B.vw,{text:"virtual",title:"Virtual interface, not physical hardware"}):null,(0,l.jsx)("span",{className:"tnum text-xs text-muted-foreground",children:s}),null!==e.speedMbps?(0,l.jsx)("span",{className:"tnum text-xs text-muted-foreground",children:(0,M.Zf)(e.speedMbps)}):null]})]}),e.addresses.length>0?(0,l.jsx)("ul",{className:"mt-1 flex flex-wrap gap-x-3 gap-y-1",children:e.addresses.map((e,s)=>(0,l.jsxs)("li",{className:"tnum break-all font-mono text-xs text-muted-foreground",children:[e.address,"/",e.prefix,(0,l.jsx)("span",{className:"ml-1 font-sans text-xs uppercase tracking-wide",children:"ipv4"===e.family?"v4":"v6"})]},`${e.family}:${e.address}/${e.prefix}:${s}`))}):(0,l.jsx)("p",{className:"mt-1 text-xs text-muted-foreground",children:"No addresses reported."}),"ok"===e.state?(0,l.jsxs)("dl",{className:"mt-1.5 grid grid-cols-2 gap-x-4 gap-y-1",children:[(0,l.jsx)(z,{label:"Receive",value:(0,M.CE)(e.rxBytesPerSec)}),(0,l.jsx)(z,{label:"Transmit",value:(0,M.CE)(e.txBytesPerSec)})]}):(0,l.jsx)("p",{className:`mt-1.5 text-xs ${"unavailable"===e.state?"text-warn":"text-muted-foreground"}`,children:e.reason??"No current rate reading."}),"ok"===e.state&&e.stale?(0,l.jsx)("p",{className:"mt-1 text-xs text-muted-foreground",children:"Last known rates."}):null]})}function D({view:e,className:s}){let t=e.network.items;return(0,l.jsx)(x.Z,{title:"Network",className:s,action:(0,l.jsx)(I,{stale:e.stale}),children:0===t.length?"unavailable"===e.network.family.state?(0,l.jsx)(L,{reason:e.network.family.reason}):(0,l.jsx)(C,{children:T(e.network.family,"No network interfaces were reported.")}):(0,l.jsx)("ul",{className:"divide-y divide-border",children:t.map(e=>(0,l.jsx)(_,{iface:e},e.id))})})}var O=t(9939),W=t(7348);function q(e){let s,t,{iso:a}=e;return null===a?(0,l.jsx)("span",{className:"text-xs text-muted-foreground",children:"—"}):(0,l.jsxs)("span",{className:"tnum text-sm",children:[Number.isFinite((s=new Date(a)).getTime())?s.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1}):a,(0,l.jsx)("span",{className:"ml-2 text-xs text-muted-foreground",children:Number.isFinite((t=new Date(a)).getTime())?t.toLocaleDateString(void 0,{dateStyle:"medium"}):""})]})}function Y({state:e}){var s;let t=(0,$.L_)(e);return"ahead"!==t.kind&&"behind"!==t.kind?null:(0,l.jsxs)("p",{role:"status",className:"tnum flex items-start gap-2 rounded-lg bg-warn-soft px-3 py-2 text-xs text-foreground",children:[(0,l.jsx)(i,{className:"mt-0.5 h-3.5 w-3.5 shrink-0 text-warn","aria-hidden":!0}),(0,l.jsxs)("span",{children:["Collector clock:"," ",(0,l.jsx)("strong",{className:"font-medium",children:Math.abs(s=t.skewMs)>=6e4?`${Math.abs(Math.round(s/6e4))} min`:`${Math.abs(Math.round(s/1e3))} s`})," ","ahead"===t.kind?"ahead of":"behind"," hub time."]})]})}function J({state:e}){return(0,l.jsx)(x.Z,{title:"Collector",children:(0,l.jsxs)("div",{className:"flex flex-col gap-3 py-1",children:[(0,l.jsxs)("p",{className:"flex items-center gap-2 text-sm",children:[(0,l.jsx)("span",{"aria-hidden":!0,className:`inline-block h-2 w-2 shrink-0 rounded-full ${e.connected?"bg-ok":"bg-crit"}`}),e.connected?"Connected to the hub":"Not connected to the hub"]}),(0,l.jsxs)("dl",{className:"flex flex-col gap-1 text-xs",children:[(0,l.jsxs)("div",{className:"flex gap-2",children:[(0,l.jsx)("dt",{className:"shrink-0 text-muted-foreground",children:"Collector"}),(0,l.jsx)("dd",{className:"tnum truncate",children:e.collectorId})]}),(0,l.jsxs)("div",{className:"flex gap-2",children:[(0,l.jsx)("dt",{className:"shrink-0 text-muted-foreground",children:"Machine"}),(0,l.jsx)("dd",{className:"tnum truncate",children:e.machineId})]})]}),(0,l.jsx)(n(),{href:"/connections",className:"w-fit rounded-md text-xs text-accent transition-colors hover:underline",children:"Connections"})]})})}function K({state:e,now:s}){let t=e.metrics,a=t?.capturedAt??null,n=t?.receivedAt??e.lastReceivedAt,r=null!=e.expectedIntervalMs,i=r?e.expectedIntervalMs:null,d=(0,$.Cj)(e.expectedIntervalMs);return(0,l.jsx)(x.Z,{title:"Sample times",children:(0,l.jsxs)("div",{className:"flex flex-col gap-3",children:[(0,l.jsxs)("dl",{className:"grid gap-x-8 gap-y-3 sm:grid-cols-2",children:[(0,l.jsx)("dt",{className:"text-xs text-muted-foreground",children:"Captured"}),(0,l.jsx)("dd",{children:(0,l.jsx)(q,{iso:a})}),(0,l.jsx)("dt",{className:"text-xs text-muted-foreground",children:"Received"}),(0,l.jsx)("dd",{children:(0,l.jsxs)("span",{className:"flex flex-wrap items-baseline gap-2",children:[(0,l.jsx)(q,{iso:n}),null!==n?(0,l.jsxs)("span",{className:"tnum text-xs text-muted-foreground",children:["\xb7 updated ",(0,$.nV)((0,$.A4)(n,s))]}):null]})}),(0,l.jsx)("dt",{className:"text-xs text-muted-foreground",children:"Sample interval"}),(0,l.jsx)("dd",{children:r?(0,l.jsx)("span",{className:"tnum text-sm",children:(0,$.$)(i)}):(0,l.jsx)("span",{className:"text-sm text-muted-foreground",children:"Unknown"})}),(0,l.jsx)("dt",{className:"text-xs text-muted-foreground",children:"Stale after"}),(0,l.jsx)("dd",{children:(0,l.jsxs)("span",{className:"tnum text-sm",children:[(0,$.$)(d),r?null:(0,l.jsx)("span",{className:"text-muted-foreground",children:" (fallback)"})]})})]}),(0,l.jsx)(Y,{state:e})]})})}function Q({machineId:e,machineCount:s}){return 0===s?(0,l.jsx)(x.Z,{title:"No machines",className:"mt-8",children:(0,l.jsx)(x.p,{icon:d,note:"No machines are available in your authorized fleet."})}):(0,l.jsxs)(x.Z,{title:"Machine not found",className:"mt-8",children:[(0,l.jsx)(x.p,{icon:d,note:"This machine is unavailable or outside your access."}),(0,l.jsxs)("p",{className:"tnum mt-2 text-center text-xs text-muted-foreground",children:["Requested identifier: ",e]}),(0,l.jsx)("div",{className:"flex justify-center",children:(0,l.jsxs)(n(),{href:"/",className:"mt-2 inline-flex items-center gap-1.5 rounded-md border border-border px-3 py-1.5 text-xs text-foreground transition-colors hover:bg-card-strong",children:[(0,l.jsx)(o,{className:"h-3.5 w-3.5","aria-hidden":!0}),"Back to fleet"]})})]})}function X({machineId:e}){let{phase:s,machines:t}=(0,O.M)(),{machine:a}=(0,w.JG)("overview",e),n=(0,k.x)(),r=(0,W.c)(),i="live"===s||"reconnecting"===s||"disconnected"===s,d=i?a:void 0,o="reconnecting"===s||"disconnected"===s,x=d?(0,M.hL)(d,r):null,h=d?d.metrics?.receivedAt??d.lastReceivedAt:null,p=h?(0,$.nV)((0,$.A4)(h,r)):null;return(0,l.jsx)(c.G,{title:"Overview",machineId:e,machineView:"overview",headerRight:(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(m.$E,{}),(0,l.jsx)(u.B,{})]}),children:n||(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(k.E,{}),d&&x?(0,l.jsxs)(l.Fragment,{children:[x.tags.length>0?(0,l.jsx)("ul",{className:"mb-4 flex flex-wrap gap-1.5","aria-label":"Machine tags",children:x.tags.map(e=>(0,l.jsx)("li",{className:"rounded-full border border-border px-2 py-0.5 text-xs text-muted-foreground",children:e},e))}):null,(0,l.jsxs)("section",{"aria-label":`${x.displayName} live overview`,className:"grid grid-cols-1 gap-5 xl:grid-cols-3",children:[(0,l.jsx)(R,{view:x,ageLabel:p,held:o,className:"xl:col-span-2"}),(0,l.jsx)(F,{view:x,ageLabel:p,held:o}),(0,l.jsx)("div",{className:"min-w-0 xl:col-span-3",children:(0,l.jsx)(b,{machine:d},e)}),(0,l.jsx)(H,{view:x,className:"xl:col-span-3"}),(0,l.jsx)(G,{view:x,className:"xl:col-span-2"}),(0,l.jsx)(D,{view:x})]}),(0,l.jsxs)("details",{className:"mt-5 max-w-4xl text-xs text-muted-foreground",children:[(0,l.jsx)("summary",{className:"inline-flex min-h-9 cursor-pointer items-center rounded-md hover:text-foreground",children:"Collector details"}),(0,l.jsxs)("div",{className:"mt-3 grid gap-4 lg:grid-cols-2",children:[(0,l.jsx)(J,{state:d}),(0,l.jsx)(K,{state:d,now:r})]})]})]}):i?(0,l.jsx)(Q,{machineId:e,machineCount:t.length}):null]})})}}},e=>{e.O(0,[157,939,103,227,408,441,794,358],()=>e(e.s=4546)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-outline-style:solid}}}@layer theme{:host,:root{--font-sans:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--tracking-wide:.025em;--leading-tight:1.25;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-background:var(--background);--color-foreground:var(--foreground)}}@layer base{*,::backdrop,:after,:before{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}:host,html{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}menu,ol,ul{list-style:none}audio,canvas,embed,iframe,img,object,svg,video{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden}.absolute,.sr-only{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-y-0{inset-block:0}.top-0{top:0}.top-1\/2{top:50%}.right-0{right:0}.right-0\.5{right:calc(var(--spacing) * .5)}.left-2\.5{left:calc(var(--spacing) * 2.5)}.isolate{isolation:isolate}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.order-first{order:-9999}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.m-1{margin:var(--spacing)}.m-2{margin:calc(var(--spacing) * 2)}.m-3{margin:calc(var(--spacing) * 3)}.m-74{margin:calc(var(--spacing) * 74)}.mx-auto{margin-inline:auto}.my-2{margin-block:calc(var(--spacing) * 2)}.my-12{margin-block:calc(var(--spacing) * 12)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mb-1{margin-bottom:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.ml-1{margin-left:var(--spacing)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-0\.5{height:calc(var(--spacing) * .5)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-4\.5{height:calc(var(--spacing) * 4.5)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-14{height:calc(var(--spacing) * 14)}.h-40{height:calc(var(--spacing) * 40)}.h-dvh{height:100dvh}.h-full{height:100%}.h-px{height:1px}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-56{max-height:calc(var(--spacing) * 56)}.max-h-96{max-height:calc(var(--spacing) * 96)}.min-h-0{min-height:0}.min-h-5{min-height:calc(var(--spacing) * 5)}.min-h-6{min-height:calc(var(--spacing) * 6)}.min-h-7{min-height:calc(var(--spacing) * 7)}.min-h-8{min-height:calc(var(--spacing) * 8)}.min-h-9{min-height:calc(var(--spacing) * 9)}.min-h-14{min-height:calc(var(--spacing) * 14)}.min-h-32{min-height:calc(var(--spacing) * 32)}.min-h-48{min-height:calc(var(--spacing) * 48)}.min-h-64{min-height:calc(var(--spacing) * 64)}.min-h-dvh{min-height:100dvh}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-4\.5{width:calc(var(--spacing) * 4.5)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-9{width:calc(var(--spacing) * 9)}.w-14{width:calc(var(--spacing) * 14)}.w-32{width:calc(var(--spacing) * 32)}.w-40{width:calc(var(--spacing) * 40)}.w-64{width:calc(var(--spacing) * 64)}.w-fit{width:fit-content}.w-full{width:100%}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-32{max-width:calc(var(--spacing) * 32)}.max-w-48{max-width:calc(var(--spacing) * 48)}.max-w-64{max-width:calc(var(--spacing) * 64)}.max-w-\[12rem\]{max-width:12rem}.max-w-\[16rem\]{max-width:16rem}.max-w-\[18rem\]{max-width:18rem}.max-w-\[1500px\]{max-width:1500px}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:0}.flex-1{flex:1}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.basis-52{flex-basis:calc(var(--spacing) * 52)}.table-fixed{table-layout:fixed}.border-separate{border-collapse:separate}.border-spacing-0{--tw-border-spacing-x:0px;--tw-border-spacing-y:0px;border-spacing:var(--tw-border-spacing-x) var(--tw-border-spacing-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-col-resize{cursor:col-resize}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize{resize:both}.scroll-mt-6{scroll-margin-top:calc(var(--spacing) * 6)}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-\[3rem_minmax\(0\,1fr\)_2\.5rem\]{grid-template-columns:3rem minmax(0,1fr) 2.5rem}.grid-cols-\[repeat\(auto-fit\,minmax\(3\.5rem\,1fr\)\)\]{grid-template-columns:repeat(auto-fit,minmax(3.5rem,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-x-5{column-gap:calc(var(--spacing) * 5)}.gap-x-6{column-gap:calc(var(--spacing) * 6)}.gap-x-8{column-gap:calc(var(--spacing) * 8)}.gap-y-0\.5{row-gap:calc(var(--spacing) * .5)}.gap-y-1{row-gap:var(--spacing)}.gap-y-1\.5{row-gap:calc(var(--spacing) * 1.5)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.gap-y-3{row-gap:calc(var(--spacing) * 3)}.gap-y-4{row-gap:calc(var(--spacing) * 4)}.gap-y-5{row-gap:calc(var(--spacing) * 5)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border>:not(:last-child)){border-color:var(--border)}.self-center{align-self:center}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.overscroll-contain{overscroll-behavior:contain}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e+38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-\[5px\]{border-style:var(--tw-border-style);border-width:5px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-accent\/40{border-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.border-accent\/40{border-color:color-mix(in oklab,var(--accent) 40%,transparent)}}.border-border,.border-border\/40{border-color:var(--border)}@supports (color:color-mix(in lab,red,red)){.border-border\/40{border-color:color-mix(in oklab,var(--border) 40%,transparent)}}.border-crit{border-color:var(--crit)}.border-current{border-color:currentColor}.border-transparent{border-color:#0000}.bg-accent{background-color:var(--accent)}.bg-background{background-color:var(--background)}.bg-border{background-color:var(--border)}.bg-card{background-color:var(--card)}.bg-card-strong,.bg-card-strong\/25{background-color:var(--card-strong)}@supports (color:color-mix(in lab,red,red)){.bg-card-strong\/25{background-color:color-mix(in oklab,var(--card-strong) 25%,transparent)}}.bg-card-strong\/30{background-color:var(--card-strong)}@supports (color:color-mix(in lab,red,red)){.bg-card-strong\/30{background-color:color-mix(in oklab,var(--card-strong) 30%,transparent)}}.bg-card-strong\/40{background-color:var(--card-strong)}@supports (color:color-mix(in lab,red,red)){.bg-card-strong\/40{background-color:color-mix(in oklab,var(--card-strong) 40%,transparent)}}.bg-cpu{background-color:var(--cpu)}.bg-crit{background-color:var(--crit)}.bg-crit-soft{background-color:var(--crit-soft)}.bg-current{background-color:currentColor}.bg-mem{background-color:var(--mem)}.bg-muted-foreground\/50{background-color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.bg-muted-foreground\/50{background-color:color-mix(in oklab,var(--muted-foreground) 50%,transparent)}}.bg-ok{background-color:var(--ok)}.bg-ok-soft{background-color:var(--ok-soft)}.bg-selected{background-color:var(--selected)}.bg-warn{background-color:var(--warn)}.bg-warn-soft{background-color:var(--warn-soft)}.fill-foreground{fill:var(--foreground)}.fill-muted-foreground{fill:var(--muted-foreground)}.fill-warn{fill:var(--warn)}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pr-1{padding-right:var(--spacing)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pl-5{padding-left:calc(var(--spacing) * 5)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-accent{color:var(--accent)}.text-accent-foreground{color:var(--accent-foreground)}.text-crit{color:var(--crit)}.text-foreground{color:var(--foreground)}.text-muted-foreground{color:var(--muted-foreground)}.text-ok{color:var(--ok)}.text-warn{color:var(--warn)}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.accent-\[var\(--accent\)\]{accent-color:var(--accent)}.accent-foreground{accent-color:var(--foreground)}.opacity-20{opacity:.2}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline-offset-\[-2px\]{outline-offset:-2px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.group-hover\/handle\:bg-accent:is(:where(.group\/handle):hover *){background-color:var(--accent)}}.group-focus-visible\/handle\:bg-accent:is(:where(.group\/handle):focus-visible *){background-color:var(--accent)}.peer-focus-visible\:outline:is(:where(.peer):focus-visible~*){outline-style:var(--tw-outline-style);outline-width:1px}.peer-focus-visible\:outline-2:is(:where(.peer):focus-visible~*){outline-style:var(--tw-outline-style);outline-width:2px}.peer-focus-visible\:outline-offset-2:is(:where(.peer):focus-visible~*){outline-offset:2px}.peer-focus-visible\:\[outline-color\:var\(--focus\)\]:is(:where(.peer):focus-visible~*){outline-color:var(--focus)}.peer-focus-visible\:outline-accent:is(:where(.peer):focus-visible~*){outline-color:var(--accent)}.placeholder\:text-muted-foreground::placeholder,.placeholder\:text-muted-foreground\/70::placeholder{color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.placeholder\:text-muted-foreground\/70::placeholder{color:color-mix(in oklab,var(--muted-foreground) 70%,transparent)}}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media (hover:hover){.hover\:border-muted-foreground\/40:hover{border-color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.hover\:border-muted-foreground\/40:hover{border-color:color-mix(in oklab,var(--muted-foreground) 40%,transparent)}}.hover\:bg-accent\/90:hover{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent\/90:hover{background-color:color-mix(in oklab,var(--accent) 90%,transparent)}}.hover\:bg-card:hover{background-color:var(--card)}.hover\:bg-card-strong:hover,.hover\:bg-card-strong\/60:hover{background-color:var(--card-strong)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-card-strong\/60:hover{background-color:color-mix(in oklab,var(--card-strong) 60%,transparent)}}.hover\:bg-card-strong\/70:hover{background-color:var(--card-strong)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-card-strong\/70:hover{background-color:color-mix(in oklab,var(--card-strong) 70%,transparent)}}.hover\:bg-crit-soft:hover{background-color:var(--crit-soft)}.hover\:bg-selected:hover{background-color:var(--selected)}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:underline:hover{text-decoration-line:underline}}.focus\:not-sr-only:focus{clip-path:none;white-space:normal;width:auto;height:auto;margin:0;padding:0;position:static;overflow:visible}.focus\:absolute:focus{position:absolute}.focus\:start-2:focus{inset-inline-start:calc(var(--spacing) * 2)}.focus\:top-2:focus{top:calc(var(--spacing) * 2)}.focus\:outline-2:focus{outline-style:var(--tw-outline-style);outline-width:2px}.focus\:outline-accent:focus{outline-color:var(--accent)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.aria-\[invalid\=true\]\:border-crit[aria-invalid=true]{border-color:var(--crit)}@media (min-width:40rem){.sm\:order-none{order:0}.sm\:col-span-2{grid-column:span 2/span 2}.sm\:ml-auto{margin-left:auto}.sm\:block{display:block}.sm\:hidden{display:none}.sm\:inline{display:inline}.sm\:w-auto{width:auto}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-\[3\.5rem_minmax\(0\,1fr\)_3rem_3rem\]{grid-template-columns:3.5rem minmax(0,1fr) 3rem 3rem}.sm\:flex-row{flex-direction:row}.sm\:items-end{align-items:flex-end}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@media (min-width:48rem){.md\:col-span-2{grid-column:span 2/span 2}.md\:ms-3{margin-inline-start:calc(var(--spacing) * 3)}.md\:block{display:block}.md\:hidden{display:none}.md\:inline{display:inline}.md\:w-56{width:calc(var(--spacing) * 56)}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:border-s{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.md\:border-border{border-color:var(--border)}.md\:p-3{padding:calc(var(--spacing) * 3)}.md\:p-5{padding:calc(var(--spacing) * 5)}.md\:p-6{padding:calc(var(--spacing) * 6)}.md\:px-3{padding-inline:calc(var(--spacing) * 3)}.md\:px-5{padding-inline:calc(var(--spacing) * 5)}.md\:px-6{padding-inline:calc(var(--spacing) * 6)}.md\:ps-3{padding-inline-start:calc(var(--spacing) * 3)}}@media (min-width:64rem){.lg\:col-span-full{grid-column:1/-1}.lg\:inline{display:inline}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-\[minmax\(0\,13rem\)_minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,13rem) minmax(0,1fr)}.lg\:items-start{align-items:flex-start}.lg\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.lg\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.lg\:pt-0{padding-top:0}.lg\:pl-6{padding-left:calc(var(--spacing) * 6)}}@media (min-width:80rem){.xl\:col-span-2{grid-column:span 2/span 2}.xl\:col-span-3{grid-column:span 3/span 3}.xl\:col-span-5{grid-column:span 5/span 5}.xl\:col-span-7{grid-column:span 7/span 7}.xl\:col-span-12{grid-column:span 12/span 12}.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.xl\:grid-cols-\[minmax\(0\,1fr\)_24rem\]{grid-template-columns:minmax(0,1fr) 24rem}.xl\:grid-cols-\[repeat\(auto-fit\,minmax\(30rem\,1fr\)\)\]{grid-template-columns:repeat(auto-fit,minmax(30rem,1fr))}}.dark\:block:is(.dark *){display:block}.dark\:hidden:is(.dark *){display:none}.\[\&\:\:-webkit-search-cancel-button\]\:hidden::-webkit-search-cancel-button{display:none}.\[\&\:\:-webkit-search-cancel-button\]\:\[-webkit-appearance\:none\]::-webkit-search-cancel-button{-webkit-appearance:none}}:root{color-scheme:light;--background:#f4f5f7;--card:#fff;--card-strong:#f9fafb;--border:#e2e4e9;--foreground:#1a1b1e;--muted-foreground:#5d5f64;--accent:#1c71d8;--accent-foreground:#fff;--selected:#e8f0fb;--component-selected:#1c71d8;--ok:#2a9134;--ok-soft:#2a913421;--warn:#c67b00;--warn-soft:#c67b0024;--crit:#c33c3c;--crit-soft:#c33c3c24;--cpu:#3584e4;--mem:#33a06f;--swap:#d8a23a;--scrollbar:#c7cad0;--focus:oklab(55.8192% -.0413209 -.171246/.6)}.dark{color-scheme:dark;--background:#1a1b1e;--card:#26272b;--card-strong:#2d2e33;--border:#3a3b3f;--foreground:#e4e5e8;--muted-foreground:#a2a4a9;--accent:#3584e4;--accent-foreground:#fff;--selected:#1e3a5c;--component-selected:#3584e4;--ok:#3db84a;--ok-soft:#3db84a26;--warn:#e5a83b;--warn-soft:#e5a83b26;--crit:#e05e5e;--crit-soft:#e05e5e26;--cpu:#3584e4;--mem:#4ec289;--swap:#d8a23a;--scrollbar:#3a3b3f;--focus:oklab(61.3675% -.0415831 -.158993/.65)}body,html{overscroll-behavior:none}body{background-color:var(--color-background);color:var(--color-foreground);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;font-family:ui-sans-serif,system-ui,Noto Sans,Inter,sans-serif}.tnum{font-variant-numeric:tabular-nums}::selection{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){::selection{background-color:color-mix(in oklab,var(--accent) 28%,transparent)}}::selection{color:var(--foreground)}:focus-visible{outline:2px solid var(--focus);outline-offset:2px}*{scrollbar-width:thin;scrollbar-color:var(--scrollbar) transparent}@media (prefers-reduced-motion:reduce){*,:after,:before{transition-duration:.01ms!important;animation-duration:.01ms!important}}@property --tw-border-spacing-x{syntax:"<length>";inherits:false;initial-value:0}@property --tw-border-spacing-y{syntax:"<length>";inherits:false;initial-value:0}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@keyframes spin{to{transform:rotate(1turn)}}@keyframes pulse{50%{opacity:.5}}
|
|
File without changes
|
|
File without changes
|