rigscope 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +4 -4
  3. package/.next/build-manifest.json +2 -2
  4. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  5. package/.next/server/app/_global-error.html +1 -1
  6. package/.next/server/app/_global-error.rsc +1 -1
  7. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  10. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  11. package/.next/server/app/_not-found.html +1 -1
  12. package/.next/server/app/_not-found.rsc +1 -1
  13. package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  14. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  15. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  16. package/.next/server/app/administration/page_client-reference-manifest.js +1 -1
  17. package/.next/server/app/administration.html +1 -1
  18. package/.next/server/app/administration.rsc +1 -1
  19. package/.next/server/app/administration.segments/_full.segment.rsc +1 -1
  20. package/.next/server/app/administration.segments/_tree.segment.rsc +1 -1
  21. package/.next/server/app/administration.segments/administration/__PAGE__.segment.rsc +1 -1
  22. package/.next/server/app/alerts/page_client-reference-manifest.js +1 -1
  23. package/.next/server/app/alerts.html +1 -1
  24. package/.next/server/app/alerts.rsc +1 -1
  25. package/.next/server/app/alerts.segments/_full.segment.rsc +1 -1
  26. package/.next/server/app/alerts.segments/_tree.segment.rsc +1 -1
  27. package/.next/server/app/alerts.segments/alerts/__PAGE__.segment.rsc +1 -1
  28. package/.next/server/app/connections/page_client-reference-manifest.js +1 -1
  29. package/.next/server/app/connections.html +1 -1
  30. package/.next/server/app/connections.rsc +1 -1
  31. package/.next/server/app/connections.segments/_full.segment.rsc +1 -1
  32. package/.next/server/app/connections.segments/_tree.segment.rsc +1 -1
  33. package/.next/server/app/connections.segments/connections/__PAGE__.segment.rsc +1 -1
  34. package/.next/server/app/history/page_client-reference-manifest.js +1 -1
  35. package/.next/server/app/history.html +1 -1
  36. package/.next/server/app/history.rsc +2 -2
  37. package/.next/server/app/history.segments/_full.segment.rsc +2 -2
  38. package/.next/server/app/history.segments/_tree.segment.rsc +1 -1
  39. package/.next/server/app/history.segments/history/__PAGE__.segment.rsc +2 -2
  40. package/.next/server/app/index.html +1 -1
  41. package/.next/server/app/index.rsc +1 -1
  42. package/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  43. package/.next/server/app/index.segments/_full.segment.rsc +1 -1
  44. package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  45. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  46. package/.next/server/app/login.html +1 -1
  47. package/.next/server/app/login.rsc +1 -1
  48. package/.next/server/app/login.segments/_full.segment.rsc +1 -1
  49. package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
  50. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +1 -1
  51. package/.next/server/app/machines/[machineId]/page.js +1 -1
  52. package/.next/server/app/machines/[machineId]/page_client-reference-manifest.js +1 -1
  53. package/.next/server/app/page_client-reference-manifest.js +1 -1
  54. package/.next/server/app/processes/page_client-reference-manifest.js +1 -1
  55. package/.next/server/app/processes.html +1 -1
  56. package/.next/server/app/processes.rsc +1 -1
  57. package/.next/server/app/processes.segments/_full.segment.rsc +1 -1
  58. package/.next/server/app/processes.segments/_tree.segment.rsc +1 -1
  59. package/.next/server/app/processes.segments/processes/__PAGE__.segment.rsc +1 -1
  60. package/.next/server/app-paths-manifest.json +4 -4
  61. package/.next/server/chunks/168.js +1 -1
  62. package/.next/server/middleware-build-manifest.js +1 -1
  63. package/.next/server/pages/404.html +1 -1
  64. package/.next/server/pages/500.html +1 -1
  65. package/.next/static/chunks/408-29f55984738967db.js +1 -0
  66. package/.next/static/chunks/app/machines/[machineId]/page-1a25a267563c18c0.js +1 -0
  67. package/CHANGELOG.md +21 -0
  68. package/README.md +2 -0
  69. package/dist/cli.cjs +2365 -1930
  70. package/dist/collector.cjs +18 -7
  71. package/dist/hub.cjs +1 -1
  72. package/docs/installation.md +74 -25
  73. package/docs/operations.md +13 -7
  74. package/docs/releasing.md +12 -12
  75. package/package.json +1 -1
  76. package/.next/server/route-cache/APP_PAGE/16d1ab46157a868f438fa01e04bf53e805c71cddec593ea1535905c59625cd42/$/login.html +0 -1
  77. package/.next/server/route-cache/APP_PAGE/16d1ab46157a868f438fa01e04bf53e805c71cddec593ea1535905c59625cd42/$/login.meta +0 -1
  78. package/.next/server/route-cache/APP_PAGE/16d1ab46157a868f438fa01e04bf53e805c71cddec593ea1535905c59625cd42/$/login.rsc +0 -26
  79. package/.next/server/route-cache/APP_PAGE/16d1ab46157a868f438fa01e04bf53e805c71cddec593ea1535905c59625cd42/$/login.segments/_full.segment.rsc +0 -26
  80. package/.next/server/route-cache/APP_PAGE/16d1ab46157a868f438fa01e04bf53e805c71cddec593ea1535905c59625cd42/$/login.segments/_tree.segment.rsc +0 -4
  81. package/.next/server/route-cache/APP_PAGE/16d1ab46157a868f438fa01e04bf53e805c71cddec593ea1535905c59625cd42/$/login.segments/login/__PAGE__.segment.rsc +0 -32
  82. package/.next/server/route-cache/APP_PAGE/41da0ef926a63354a29f601d8e8d0a5951196c45ebcd28b7d4708fb7f56f3bf1/$/_not-found.html +0 -1
  83. package/.next/server/route-cache/APP_PAGE/41da0ef926a63354a29f601d8e8d0a5951196c45ebcd28b7d4708fb7f56f3bf1/$/_not-found.meta +0 -1
  84. package/.next/server/route-cache/APP_PAGE/41da0ef926a63354a29f601d8e8d0a5951196c45ebcd28b7d4708fb7f56f3bf1/$/_not-found.rsc +0 -24
  85. package/.next/server/route-cache/APP_PAGE/41da0ef926a63354a29f601d8e8d0a5951196c45ebcd28b7d4708fb7f56f3bf1/$/_not-found.segments/_full.segment.rsc +0 -24
  86. package/.next/server/route-cache/APP_PAGE/41da0ef926a63354a29f601d8e8d0a5951196c45ebcd28b7d4708fb7f56f3bf1/$/_not-found.segments/_not-found/__PAGE__.segment.rsc +0 -30
  87. package/.next/server/route-cache/APP_PAGE/41da0ef926a63354a29f601d8e8d0a5951196c45ebcd28b7d4708fb7f56f3bf1/$/_not-found.segments/_tree.segment.rsc +0 -4
  88. package/.next/server/route-cache/APP_PAGE/c6377dd9ce6a1c2cd100eb4344e843eb4639b9ed26f84643f77680e9eb454c4b/$/index.html +0 -1
  89. package/.next/server/route-cache/APP_PAGE/c6377dd9ce6a1c2cd100eb4344e843eb4639b9ed26f84643f77680e9eb454c4b/$/index.meta +0 -1
  90. package/.next/server/route-cache/APP_PAGE/c6377dd9ce6a1c2cd100eb4344e843eb4639b9ed26f84643f77680e9eb454c4b/$/index.rsc +0 -26
  91. package/.next/server/route-cache/APP_PAGE/c6377dd9ce6a1c2cd100eb4344e843eb4639b9ed26f84643f77680e9eb454c4b/$/index.segments/__PAGE__.segment.rsc +0 -31
  92. package/.next/server/route-cache/APP_PAGE/c6377dd9ce6a1c2cd100eb4344e843eb4639b9ed26f84643f77680e9eb454c4b/$/index.segments/_full.segment.rsc +0 -26
  93. package/.next/server/route-cache/APP_PAGE/c6377dd9ce6a1c2cd100eb4344e843eb4639b9ed26f84643f77680e9eb454c4b/$/index.segments/_tree.segment.rsc +0 -3
  94. package/.next/static/chunks/408-4fe7147e38981ee1.js +0 -1
  95. package/.next/static/chunks/app/machines/[machineId]/page-916ee73de5eb067d.js +0 -1
  96. /package/.next/static/{xjSDCOO8Gpm5iPO9tyRG5 → -mNveXe-cHv8irQe97wI_}/_buildManifest.js +0 -0
  97. /package/.next/static/{xjSDCOO8Gpm5iPO9tyRG5 → -mNveXe-cHv8irQe97wI_}/_ssgManifest.js +0 -0
@@ -2934,7 +2934,7 @@ function readSysfsGpu(readers, address) {
2934
2934
  if (power !== null && values.powerWatts === null) values.powerWatts = power / 1e6;
2935
2935
  }
2936
2936
  if ([values.utilizationPercent, values.memoryTotalBytes, values.temperatureC, values.powerWatts].every((value) => value === null)) {
2937
- return { id: id2, status: "unavailable", reason: "driver exposes no readable GPU counters; check DRM driver and permissions" };
2937
+ return { id: id2, status: "unavailable", reason: "GPU detected, but no readable DRM/sysfs counters; driver support or permissions may limit telemetry" };
2938
2938
  }
2939
2939
  return values;
2940
2940
  }
@@ -3200,9 +3200,8 @@ function capReason(value) {
3200
3200
  }
3201
3201
  function normalizePciBusId(value) {
3202
3202
  const lower = value.trim().toLowerCase();
3203
- const parts = lower.split(":");
3204
- if (parts.length >= 3) return `${parts[parts.length - 2]}:${parts[parts.length - 1]}`;
3205
- return lower;
3203
+ const match = /^(?:([0-9a-f]{4,8}):)?([0-9a-f]{2}:[0-9a-f]{2}\.[0-7])$/.exec(lower);
3204
+ return match ? `${(match[1] ?? "0").replace(/^0+/, "").padStart(4, "0")}:${match[2]}` : lower;
3206
3205
  }
3207
3206
  function vendorFor(raw) {
3208
3207
  switch (raw.trim().toLowerCase()) {
@@ -3246,7 +3245,18 @@ function fallbackGpuName(vendor, address) {
3246
3245
  intel: "Intel",
3247
3246
  other: "Display"
3248
3247
  };
3249
- return `${labels[vendor]} display adapter at ${address}`;
3248
+ return `${labels[vendor]} display adapter`;
3249
+ }
3250
+ function pciDeviceName(database, vendorId, deviceId) {
3251
+ let vendor = false;
3252
+ for (const line of database.split("\n")) {
3253
+ const heading = /^([0-9a-f]{4})\s+/i.exec(line);
3254
+ if (heading) vendor = heading[1].toLowerCase() === vendorId.replace(/^0x/, "").toLowerCase();
3255
+ if (!vendor) continue;
3256
+ const device = /^\t([0-9a-f]{4})\s+(.+)$/i.exec(line);
3257
+ if (device && device[1].toLowerCase() === deviceId.replace(/^0x/, "").toLowerCase()) return capText(device[2]);
3258
+ }
3259
+ return null;
3250
3260
  }
3251
3261
  function unsupportedGpuReason(vendor, gpu) {
3252
3262
  if (vendor === "aspeed") return "management adapter; no telemetry";
@@ -3265,6 +3275,7 @@ function buildGpus(read, readdir, gpu) {
3265
3275
  }
3266
3276
  }
3267
3277
  }
3278
+ const pciNames = readTextOrNull(read, "/usr/share/hwdata/pci.ids") ?? readTextOrNull(read, "/usr/share/misc/pci.ids") ?? "";
3268
3279
  const result = [];
3269
3280
  const seenIds = /* @__PURE__ */ new Set();
3270
3281
  for (const device of pciDevices) {
@@ -3284,7 +3295,7 @@ function buildGpus(read, readdir, gpu) {
3284
3295
  const product = readTextOrNull(read, `/sys/bus/pci/devices/${device.address}/product_name`)?.trim();
3285
3296
  entry = {
3286
3297
  id: `pci:${device.address}`,
3287
- name: capText(product || fallbackGpuName(device.vendor, device.address)),
3298
+ name: capText(product || pciDeviceName(pciNames, device.vendorId, readTextOrNull(read, `/sys/bus/pci/devices/${device.address}/device`)?.trim() ?? "") || fallbackGpuName(device.vendor, device.address)),
3288
3299
  vendor: device.vendor,
3289
3300
  pciBusId: device.address,
3290
3301
  telemetry: reading.status === "ok" ? "supported" : "unsupported",
@@ -5206,7 +5217,7 @@ function budget(value, fallback) {
5206
5217
  // package.json
5207
5218
  var package_default = {
5208
5219
  name: "rigscope",
5209
- version: "0.1.3",
5220
+ version: "0.1.4",
5210
5221
  private: false,
5211
5222
  engines: {
5212
5223
  node: ">=26.0.0"
package/dist/hub.cjs CHANGED
@@ -1741,7 +1741,7 @@ function describeError(error) {
1741
1741
  // package.json
1742
1742
  var package_default = {
1743
1743
  name: "rigscope",
1744
- version: "0.1.3",
1744
+ version: "0.1.4",
1745
1745
  private: false,
1746
1746
  engines: {
1747
1747
  node: ">=26.0.0"
@@ -27,7 +27,7 @@ install or source checkout is needed. The launcher and services use the installe
27
27
  runtime, so removing the npx cache does not break them.
28
28
 
29
29
  Releases are on [npm](https://www.npmjs.com/package/rigscope). `@latest` selects
30
- the current stable release; replace it with `@0.1.3` to select that exact version.
30
+ the current stable release; replace it with `@0.1.4` to select that exact version.
31
31
 
32
32
  ### Installation options
33
33
 
@@ -53,7 +53,7 @@ For a downloaded package or one built from source, run from the directory
53
53
  containing the archive, or give its absolute path:
54
54
 
55
55
  ```sh
56
- npx --yes --package ./rigscope-0.1.3.tgz rigscope install --boot
56
+ npx --yes --package ./rigscope-0.1.4.tgz rigscope install --boot
57
57
  ```
58
58
 
59
59
  The same installation options apply. npm still needs registry access or cached
@@ -71,17 +71,61 @@ Run only the command for the task you want:
71
71
  | Stop local collection | `rigscope stop collector` |
72
72
  | Follow logs | `rigscope logs --follow` |
73
73
  | Check configuration, services and sensor access | `rigscope doctor` |
74
- | Remove services and the managed runtime | `rigscope uninstall` |
74
+ | Remove the installation and all its data | `rigscope uninstall` |
75
+ | Remove services and runtime, keeping saved data | `rigscope uninstall --keep-data` |
75
76
 
76
77
  `start` is safe to repeat. `logs` shows the last 100 journal lines by default.
77
78
  `enable` and `disable` control the hub and collector independently; the initial
78
79
  role is a preset. Use `rigscope enable collector` to add local collection to a
79
80
  hub-only installation.
80
81
 
81
- `uninstall` keeps accounts, history, identity, pending samples and backups.
82
- Reinstalling reuses that data, including the existing password. This retention
83
- applies to canonical installations. Upgrading from a pre-canonical format resets
84
- configuration and history; back up the state directory first.
82
+ `uninstall` permanently deletes the selected user installation, including
83
+ accounts, history, collector credentials, pending samples and backups. It stops
84
+ owned services and foreground runtimes and never restarts them. `--purge` remains
85
+ an explicit alias for this default.
86
+
87
+ To keep saved data for a later reinstall, opt in:
88
+
89
+ ```sh
90
+ rigscope uninstall --keep-data
91
+ ```
92
+
93
+ If the launcher is already gone, use the package entry point:
94
+
95
+ ```sh
96
+ npx --yes rigscope@latest uninstall
97
+ npx --yes rigscope@latest install --role collector --boot
98
+ ```
99
+
100
+ Pass `--state-dir PATH` to select a separate installation. Reinstalling after
101
+ `uninstall --keep-data` reuses saved settings and the existing password. This
102
+ retention applies to canonical installations; upgrading a pre-canonical format
103
+ resets configuration and history, so back up the state directory first.
104
+
105
+ ### Changes while running
106
+
107
+ Commands that need exclusive access detect the selected installation's running
108
+ services and foreground runtimes and ask before stopping them. After a successful
109
+ change, previously running components resume automatically. Uninstall never
110
+ restarts anything.
111
+
112
+ Use `--yes` to approve stopping without a prompt, and `--no-restart` to leave the
113
+ installation stopped after a change. In scripts, pass these flags to Rigscope:
114
+
115
+ ```sh
116
+ npx --yes rigscope@latest configure --port 8086 --yes --no-restart
117
+ ```
118
+
119
+ The first `--yes` belongs to npm; the second approves Rigscope's stop prompt.
120
+ `--no-start` also prevents startup on commands that support it. Components that
121
+ were already stopped stay stopped when restoring a running installation. Foreign
122
+ or unidentifiable processes are never stopped automatically. Foreground trials
123
+ resume as background processes when there is no installed service; their logs
124
+ are written under the selected state directory in `run/hub.log` and
125
+ `run/collector.log`.
126
+
127
+ Terminal output uses color for headings, status and errors. Piped output and
128
+ JSON remain plain; set `NO_COLOR=1` to disable color in a terminal.
85
129
 
86
130
  ## Access from another computer
87
131
 
@@ -103,16 +147,14 @@ tailscale serve --bg --tls-terminated-tcp=8081 \
103
147
  If you already installed for localhost, change access without reinstalling:
104
148
 
105
149
  ```sh
106
- rigscope stop
107
150
  rigscope configure --origin https://machine.example.ts.net:8081
108
151
  tailscale serve --bg --tls-terminated-tcp=8081 \
109
152
  "unix:$HOME/.local/state/rigscope/run/hub.sock"
110
- rigscope start
111
153
  ```
112
154
 
113
155
  This keeps accounts, history and collector credentials. It updates the local
114
- collector's destination and moves its pending samples. Both services must be
115
- stopped during conversion. See [Access changes](operations.md#access-changes)
156
+ collector's destination and moves its pending samples. Rigscope asks to stop
157
+ running components during conversion and resumes them afterward. See [Access changes](operations.md#access-changes)
116
158
  for backup and queue checks.
117
159
 
118
160
  ### Open and check the dashboard
@@ -138,13 +180,11 @@ collectors connect through HTTPS with certificate validation.
138
180
  ### Return to localhost
139
181
 
140
182
  ```sh
141
- rigscope stop
142
183
  rigscope configure --local
143
184
  tailscale serve --bg --tls-terminated-tcp=8081 off
144
- rigscope start
145
185
  ```
146
186
 
147
- If you already uninstalled, change retained settings through the package entry
187
+ If you used `uninstall --keep-data`, change retained settings through the package entry
148
188
  point, then reinstall:
149
189
 
150
190
  ```sh
@@ -175,7 +215,7 @@ Collectors connect outbound and need no incoming port or root access. Each can
175
215
  send to up to eight hubs. Sharing is separate for each hub; network addresses
176
216
  and full process arguments start disabled. See [Collection and sharing](monitoring.md#collection-and-sharing).
177
217
 
178
- Stop a running collector before changing its destinations. To replace an
218
+ Changing destinations asks to stop a running collector and resumes it afterward. To replace an
179
219
  existing machine credential, create a grant bound to that machine and use
180
220
  `connect --replace`. For unattended enrollment, use `--token-file` with an owned
181
221
  private file and delete it afterward; do not put the grant on the command line.
@@ -252,7 +292,7 @@ settings and collector identities.
252
292
 
253
293
  | Alternative | Command |
254
294
  | --- | --- |
255
- | Select an exact published version | `rigscope upgrade --from rigscope@0.1.3` |
295
+ | Select an exact published version | `rigscope upgrade --from rigscope@0.1.4` |
256
296
  | Install a local archive | `rigscope upgrade --from ./rigscope-VERSION.tgz` |
257
297
  | Return to the retained previous runtime | `rigscope rollback` |
258
298
 
@@ -267,13 +307,11 @@ Keep separate backups outside the machine.
267
307
  ### No password was printed
268
308
 
269
309
  The `owner` password appears only when the account is created. Reinstalling with
270
- saved settings keeps the old password. If you lost it, stop the installation
271
- and reset it at a private prompt:
310
+ saved settings keeps the old password. If you lost it, reset it at a private
311
+ prompt; Rigscope coordinates stopping and resuming the running installation:
272
312
 
273
313
  ```sh
274
- rigscope stop
275
314
  rigscope recover-password --user owner
276
- rigscope start
277
315
  ```
278
316
 
279
317
  Recovery keeps history and collector credentials. Sign in again afterward.
@@ -291,8 +329,8 @@ npx --yes rigscope@latest status
291
329
  npx --yes rigscope@latest uninstall
292
330
  ```
293
331
 
294
- Choose the operation you need; `uninstall` removes this installation and retains
295
- its data. Use `ls -l ~/.local/bin/rigscope` to check for a link to an older
332
+ Choose the operation you need; `uninstall` deletes this installation and its
333
+ data. Use `uninstall --keep-data` to preserve saved data. Use `ls -l ~/.local/bin/rigscope` to check for a link to an older
296
334
  checkout. Back up a confirmed old launcher before removing it, then repeat
297
335
  `install` to create the new launcher. Older services with other names may need
298
336
  separate cleanup; do not stop unrelated services.
@@ -302,12 +340,23 @@ separate cleanup; do not stop unrelated services.
302
340
  Check `rigscope logs hub` and `rigscope doctor`. If port 8081 is already in use,
303
341
  identify the listener before stopping anything. For a fresh install, choose an
304
342
  unused port with `install --port 8086 --boot`, or use HTTPS mode with a private
305
- socket. To change a retained installation's local port, stop the hub and any
306
- collector whose destination moves, run `rigscope configure --port 8086`, then
307
- start them again. `--origin` and `--port` cannot be combined.
343
+ socket. To change a retained installation's local port, run
344
+ `rigscope configure --port 8086` and approve the stop prompt. Previously running
345
+ components resume after the change. `--origin` and `--port` cannot be combined.
308
346
 
309
347
  ## Hardware
310
348
 
349
+ GPU names use NVIDIA's reported model or the system's PCI name database when
350
+ available. Otherwise a vendor label is shown, with the PCI address separately.
351
+ A detected adapter can remain visible without telemetry: driver support and
352
+ permissions determine which counters can be read. Intel integrated adapters do
353
+ not necessarily expose utilization or dedicated VRAM through sysfs; shared
354
+ system RAM is not reported as dedicated VRAM.
355
+
356
+ History only adds historical GPU cards when stored series contain readings.
357
+ Empty PCI placeholder series do not create an extra card while NVIDIA's UUID
358
+ and model become available. Historical cards with readings remain accessible.
359
+
311
360
  Collection supports Linux. CPU, memory and process readings come from procfs.
312
361
  ARM and RISC-V CPU names are recognized; utilization uses per-core counters.
313
362
 
@@ -37,6 +37,10 @@ structured output.
37
37
  rigscope upgrade
38
38
  ```
39
39
 
40
+ Approve the stop prompt if components are running; `--yes` approves it in
41
+ scripts. `--no-restart` leaves the upgraded installation stopped and skips live
42
+ health checks. Uninstall always stays stopped.
43
+
40
44
  Use `--from PACKAGE` for an exact npm version or local archive. The command
41
45
  stages the package, stops running components, takes a consistent hub database
42
46
  backup and activates the new runtime. It restarts only the components that were
@@ -82,16 +86,17 @@ that format.
82
86
 
83
87
  ## Password recovery
84
88
 
85
- Stop the installation, enter a new password at the private prompt, then restart:
89
+ Enter a new password at the private prompt; approve stopping the running hub
90
+ when asked. Rigscope resumes previously running components after success:
86
91
 
87
92
  ```sh
88
- rigscope stop
89
93
  rigscope recover-password --user owner
90
- rigscope start
91
94
  ```
92
95
 
93
- Recovery requires the hub to be stopped and refuses a live or uncertain database
94
- lock. For unattended recovery, use `--password-file` with an owned `0600` file.
96
+ Recovery coordinates stopping the hub and refuses foreign or uncertain database
97
+ locks. Use `--yes` to approve stopping without a prompt and `--no-restart` to
98
+ leave it stopped. For unattended recovery, also use `--password-file` with an
99
+ owned `0600` file.
95
100
  It updates the existing user's stored hash. `--enable` also clears that user's
96
101
  disabled flag; recovery never creates a user or grants administrator access.
97
102
 
@@ -103,8 +108,9 @@ managed account.
103
108
  ## Access changes
104
109
 
105
110
  Follow the commands in [Remote access](installation.md#access-from-another-computer).
106
- `configure` requires a stopped hub and, when changing its local collector's
107
- destination, a stopped collector. `--origin` changes HTTPS access, `--local`
111
+ `configure` asks to stop a running hub and, when changing its local collector's
112
+ destination, its collector. Previously running components resume after success;
113
+ `--yes` approves the stop prompt and `--no-restart` leaves them stopped. `--origin` changes HTTPS access, `--local`
108
114
  returns to loopback, and `--port PORT` changes the local hub port (combine it
109
115
  with `--local` when leaving HTTPS). `--origin` and `--port` cannot be combined
110
116
  because HTTPS mode uses a private Unix socket instead of the port; `--local
package/docs/releasing.md CHANGED
@@ -5,7 +5,7 @@ The first public version, `0.1.0`, is published on
5
5
  [GitHub](https://github.com/Triet1402/rigscope). The package includes MIT licensing,
6
6
  dependency notices, the security policy and [release notes](../CHANGELOG.md).
7
7
 
8
- The commands below use `0.1.3` as an example. For a new release, substitute its
8
+ The commands below use `0.1.4` as an example. For a new release, substitute its
9
9
  new version everywhere; do not attempt to republish an already published version.
10
10
  Documentation edits can be committed and pushed to GitHub independently. The published archive and
11
11
  its bundled documentation stay unchanged; ship updated package documentation
@@ -21,7 +21,7 @@ with the next version. Keep each release tag on the revision used to build it.
21
21
  4. Run the publish dry run, check the npm account, and publish the verified archive.
22
22
  5. Verify the registry version and install it into a disposable test installation.
23
23
  Check sign-in, fresh telemetry and the installed command.
24
- 6. Tag the exact source revision as `v0.1.3`, push the tag, and create a GitHub
24
+ 6. Tag the exact source revision as `v0.1.4`, push the tag, and create a GitHub
25
25
  Release with the release notes, verified archive and checksum. Announce it
26
26
  after the registry installation works.
27
27
 
@@ -45,14 +45,14 @@ npm pack --pack-destination out/release
45
45
  `npm pack` runs `prepack`, which regenerates dependency notices, builds fresh
46
46
  runtime/UI artifacts and verifies them. If notice generation changes a tracked
47
47
  file, include that change in the release commit before producing the final
48
- archive. Reuse the archive for every check below. Replace `0.1.3` in these
48
+ archive. Reuse the archive for every check below. Replace `0.1.4` in these
49
49
  commands when releasing another version.
50
50
 
51
51
  ## Verify the exact archive
52
52
 
53
53
  ```sh
54
- node scripts/verify-package.cjs ./out/release/rigscope-0.1.3.tgz
55
- npm run verify:installed -- --archive ./out/release/rigscope-0.1.3.tgz
54
+ node scripts/verify-package.cjs ./out/release/rigscope-0.1.4.tgz
55
+ npm run verify:installed -- --archive ./out/release/rigscope-0.1.4.tgz
56
56
  npm test
57
57
  node scripts/test-runtime.cjs
58
58
  node scripts/test.cjs --suite development
@@ -69,9 +69,9 @@ create disposable installations with separate state, launchers, ports and unit
69
69
  names, then remove their services. They do not select an existing installation.
70
70
 
71
71
  ```sh
72
- RIGSCOPE_TEST_ARCHIVE="$PWD/out/release/rigscope-0.1.3.tgz" \
72
+ RIGSCOPE_TEST_ARCHIVE="$PWD/out/release/rigscope-0.1.4.tgz" \
73
73
  node --import tsx --test tests/cli-install.integration.ts tests/cli-reset.integration.ts
74
- node scripts/verify-operations.cjs ./out/release/rigscope-0.1.3.tgz
74
+ node scripts/verify-operations.cjs ./out/release/rigscope-0.1.4.tgz
75
75
  ```
76
76
 
77
77
  These cover installation, pairing, independent component controls, bootstrap
@@ -93,7 +93,7 @@ Record the final checksum after verification:
93
93
 
94
94
  ```sh
95
95
  cd out/release
96
- sha256sum rigscope-0.1.3.tgz > SHA256SUMS
96
+ sha256sum rigscope-0.1.4.tgz > SHA256SUMS
97
97
  sha256sum --check SHA256SUMS
98
98
  ```
99
99
 
@@ -110,7 +110,7 @@ then verify the account and preview the exact archive:
110
110
  ```sh
111
111
  npm login --registry=https://registry.npmjs.org
112
112
  npm whoami --registry=https://registry.npmjs.org
113
- npm publish ./out/release/rigscope-0.1.3.tgz --access public --tag latest \
113
+ npm publish ./out/release/rigscope-0.1.4.tgz --access public --tag latest \
114
114
  --registry=https://registry.npmjs.org --dry-run
115
115
  ```
116
116
 
@@ -120,12 +120,12 @@ to publish or complete two-factor authentication.
120
120
  When releasing, this command actually publishes the verified archive publicly:
121
121
 
122
122
  ```sh
123
- npm publish ./out/release/rigscope-0.1.3.tgz --access public --tag latest \
123
+ npm publish ./out/release/rigscope-0.1.4.tgz --access public --tag latest \
124
124
  --registry=https://registry.npmjs.org
125
- npm view rigscope@0.1.3 version dist.integrity --registry=https://registry.npmjs.org
125
+ npm view rigscope@0.1.4 version dist.integrity --registry=https://registry.npmjs.org
126
126
  ```
127
127
 
128
- Then use `npx --yes rigscope@0.1.3 install` with a disposable `--state-dir`, an
128
+ Then use `npx --yes rigscope@0.1.4 install` with a disposable `--state-dir`, an
129
129
  unused `--port` and an isolated `XDG_BIN_HOME` for the registry installation
130
130
  check. Uninstall that test installation afterward. Use the same isolation
131
131
  settings for all test commands so the check does not select a real installation.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rigscope",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "private": false,
5
5
  "engines": {
6
6
  "node": ">=26.0.0"
@@ -1 +0,0 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/3fbf75e4c471c6a8.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-9ca43f4ce1bb8938.js"/><script src="/_next/static/chunks/4bd1b696-c7408084347438ae.js" async=""></script><script src="/_next/static/chunks/794-ceeb732a1a81bc27.js" async=""></script><script src="/_next/static/chunks/main-app-f92328c8950d2e53.js" async=""></script><script src="/_next/static/chunks/939-514e554087419c71.js" async=""></script><script src="/_next/static/chunks/app/layout-4feff677c4071745.js" async=""></script><script src="/_next/static/chunks/app/login/page-c57e12dbe5146737.js" async=""></script><title>Sign in — Rigscope</title><meta name="description" content="Self-hosted remote system monitor — a live fleet of collectors behind one authenticated hub."/><link rel="icon" href="/icon.svg?3b3fa3229e2d0d7a" type="image/svg+xml" sizes="any"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><script>((a,b,c,d,e,f,g,h)=>{let i=document.documentElement,j=["light","dark"];function k(b){var c;(Array.isArray(a)?a:[a]).forEach(a=>{let c="class"===a,d=c&&f?e.map(a=>f[a]||a):e;c?(i.classList.remove(...d),i.classList.add(f&&f[b]?f[b]:b)):i.setAttribute(a,b)}),c=b,h&&j.includes(c)&&(i.style.colorScheme=c)}if(d)k(d);else try{let a=localStorage.getItem(b)||c,d=g&&"system"===a?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":a;k(d)}catch(a){}})("class","theme","dark",null,["light","dark"],null,true,true)</script><main class="flex min-h-dvh items-center justify-center bg-background p-6"><div class="w-full max-w-sm"><div class="mb-6 flex items-center gap-2.5"><span class="flex h-7 w-7 shrink-0 items-center justify-center rounded-md border border-border text-accent"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false" class="h-4 w-4"><path d="M8 3H4v18h4M16 3h4v18h-4"></path><path d="m8 15 4-6 4 3M8 8h.01M16 17h.01"></path></svg></span><span class="text-sm font-semibold tracking-tight">Rigscope</span></div><div class="rounded-xl border border-border bg-card p-6"><h1 class="text-lg font-semibold tracking-tight">Sign in</h1><form class="mt-5 flex flex-col gap-4"><div class="flex flex-col gap-1.5"><label for="login-username" class="text-xs font-medium">Username</label><input id="login-username" type="text" autoComplete="username" required="" class="rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground/70" name="username" value=""/></div><div class="flex flex-col gap-1.5"><label for="login-password" class="text-xs font-medium">Password</label><input id="login-password" type="password" autoComplete="current-password" required="" class="rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground/70" name="password" value=""/></div><button type="submit" class="mt-1 inline-flex items-center justify-center rounded-md bg-accent px-3 py-2 text-sm font-medium text-accent-foreground transition-colors hover:bg-accent/90 disabled:cursor-not-allowed disabled:opacity-60">Sign in</button></form></div></div></main><!--$--><!--/$--><script src="/_next/static/chunks/webpack-9ca43f4ce1bb8938.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:\"static/chunks/939-514e554087419c71.js\"\n3:\"static/chunks/app/layout-4feff677c4071745.js\"\n4:I[2737,[\"939\",\"$2\",\"177\",\"$3\"],\"ThemeProvider\"]\n5:I[9939,[\"939\",\"$2\",\"177\",\"$3\"],\"LiveProvider\"]\n6:I[7121,[],\"\"]\n7:I[4581,[],\"\"]\nb:\"static/chunks/app/login/page-c57e12dbe5146737.js\"\nc:I[5000,[\"939\",\"$2\",\"520\",\"$b\"],\"LoginView\"]\nd:I[484,[],\"OutletBoundary\"]\ne:\"$Sreact.suspense\"\n10:\"ViewportBoundary\"\n11:I[484,[],\"$10\"]\n13:\"MetadataBoundary\"\n14:I[484,[],\"$13\"]\n16:I[7123,[],\"default\",1]\n:HL[\"/_next/static/css/3fbf75e4c471c6a8.css\",\"style\"]\n9:X\na:[[\"children\",{\"s\":\"__PAGE__\",\"h\":512,\"d\":{\"r\":[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$Lc\",null,{}],null,[\"$\",\"$Ld\",null,{\"children\":[\"$\",\"$e\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@f\"}]}]]}],\"p\":false,\"v\":null}}]]\n8:[[\"children\",{\"s\":\"login\",\"h\":512,\"d\":{\"r\":[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L6\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],\"p\":false,\"v\":\"$9\"},\"c\":\"$Qa\"}]]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"login\"],\"q\":\"\",\"i\":false,\"t\":{\"t\":{\"s\":\"\",\"h\":528,\"d\":{\"r\":[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/3fbf75e4c471c6a8.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[\"$\",\"body\",null,{\"children\":[\"$\",\"$L4\",null,{\"attribute\":\"class\",\"defaultTheme\":\"dark\",\"enableSystem\":true,\"children\":[\"$\",\"$L5\",null,{\"children\":[\"$\",\"$L6\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]}]}]]}],\"p\":false,\"v\":null},\"c\":\"$Q8\"},\"h\":{\"r\":[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L11\",null,{\"children\":\"$L12\"}],[\"$\",\"$L14\",null,{\"children\":[[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$e\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L15\"}]}],null]}],null]}],\"p\":false,\"v\":null}},\"m\":\"$undefined\",\"G\":[\"$16\",[]],\"S\":true,\"r\":\"$undefined\",\"s\":\"$undefined\",\"a\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"xjSDCOO8Gpm5iPO9tyRG5\"}\n"])</script><script>self.__next_f.push([1,"9:C\n12:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"17:I[6869,[],\"IconMark\"]\nf:null\n15:[[\"$\",\"title\",\"0\",{\"children\":\"Sign in — Rigscope\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Self-hosted remote system monitor — a live fleet of collectors behind one authenticated hub.\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/icon.svg?3b3fa3229e2d0d7a\",\"type\":\"image/svg+xml\",\"sizes\":\"any\"}],[\"$\",\"$L17\",\"3\",{}]]\n"])</script></body></html>
@@ -1 +0,0 @@
1
- {"headers":{"x-nextjs-stale-time":"300","x-nextjs-prerender":"1","x-next-cache-tags":"_N_T_/layout,_N_T_/login/layout,_N_T_/login/page,_N_T_/login"},"segmentPaths":["/_tree","/_full","/login/__PAGE__"],"prefetchHints":{"hints":64,"slots":{"children":{"hints":96,"slots":{"children":{"hints":160,"slots":null}}}}},"routeCache":{"key":"/route-cache/APP_PAGE/16d1ab46157a868f438fa01e04bf53e805c71cddec593ea1535905c59625cd42/$/login","owner":{"kind":"APP_PAGE","sourceRoute":"/login/page"},"isFallback":false},"routeCacheLastModified":1793851815565}
@@ -1,26 +0,0 @@
1
- 1:"$Sreact.fragment"
2
- 2:"static/chunks/939-514e554087419c71.js"
3
- 3:"static/chunks/app/layout-4feff677c4071745.js"
4
- 4:I[2737,["939","$2","177","$3"],"ThemeProvider"]
5
- 5:I[9939,["939","$2","177","$3"],"LiveProvider"]
6
- 6:I[7121,[],""]
7
- 7:I[4581,[],""]
8
- b:"static/chunks/app/login/page-c57e12dbe5146737.js"
9
- c:I[5000,["939","$2","520","$b"],"LoginView"]
10
- d:I[484,[],"OutletBoundary"]
11
- e:"$Sreact.suspense"
12
- 10:"ViewportBoundary"
13
- 11:I[484,[],"$10"]
14
- 13:"MetadataBoundary"
15
- 14:I[484,[],"$13"]
16
- 16:I[7123,[],"default",1]
17
- :HL["/_next/static/css/3fbf75e4c471c6a8.css","style"]
18
- 9:X
19
- a:[["children",{"s":"__PAGE__","h":512,"d":{"r":["$","$1","c",{"children":[["$","$Lc",null,{}],null,["$","$Ld",null,{"children":["$","$e",null,{"name":"Next.MetadataOutlet","children":"$@f"}]}]]}],"p":false,"v":null}}]]
20
- 8:[["children",{"s":"login","h":512,"d":{"r":["$","$1","c",{"children":[null,["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],"p":false,"v":"$9"},"c":"$Qa"}]]
21
- 0:{"P":null,"c":["","login"],"q":"","i":false,"t":{"t":{"s":"","h":528,"d":{"r":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/3fbf75e4c471c6a8.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"children":["$","$L4",null,{"attribute":"class","defaultTheme":"dark","enableSystem":true,"children":["$","$L5",null,{"children":["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]}]}]]}],"p":false,"v":null},"c":"$Q8"},"h":{"r":["$","$1","h",{"children":[null,["$","$L11",null,{"children":"$L12"}],["$","$L14",null,{"children":[["$","div",null,{"hidden":true,"children":["$","$e",null,{"name":"Next.Metadata","children":"$L15"}]}],null]}],null]}],"p":false,"v":null}},"m":"$undefined","G":["$16",[]],"S":true,"r":"$undefined","s":"$undefined","a":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"xjSDCOO8Gpm5iPO9tyRG5"}
22
- 9:C
23
- 12:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
24
- 17:I[6869,[],"IconMark"]
25
- f:null
26
- 15:[["$","title","0",{"children":"Sign in — Rigscope"}],["$","meta","1",{"name":"description","content":"Self-hosted remote system monitor — a live fleet of collectors behind one authenticated hub."}],["$","link","2",{"rel":"icon","href":"/icon.svg?3b3fa3229e2d0d7a","type":"image/svg+xml","sizes":"any"}],["$","$L17","3",{}]]
@@ -1,26 +0,0 @@
1
- 1:"$Sreact.fragment"
2
- 2:"static/chunks/939-514e554087419c71.js"
3
- 3:"static/chunks/app/layout-4feff677c4071745.js"
4
- 4:I[2737,["939","$2","177","$3"],"ThemeProvider"]
5
- 5:I[9939,["939","$2","177","$3"],"LiveProvider"]
6
- 6:I[7121,[],""]
7
- 7:I[4581,[],""]
8
- b:"static/chunks/app/login/page-c57e12dbe5146737.js"
9
- c:I[5000,["939","$2","520","$b"],"LoginView"]
10
- d:I[484,[],"OutletBoundary"]
11
- e:"$Sreact.suspense"
12
- 10:"ViewportBoundary"
13
- 11:I[484,[],"$10"]
14
- 13:"MetadataBoundary"
15
- 14:I[484,[],"$13"]
16
- 16:I[7123,[],"default",1]
17
- :HL["/_next/static/css/3fbf75e4c471c6a8.css","style"]
18
- 9:X
19
- a:[["children",{"s":"__PAGE__","h":512,"d":{"r":["$","$1","c",{"children":[["$","$Lc",null,{}],null,["$","$Ld",null,{"children":["$","$e",null,{"name":"Next.MetadataOutlet","children":"$@f"}]}]]}],"p":false,"v":null}}]]
20
- 8:[["children",{"s":"login","h":512,"d":{"r":["$","$1","c",{"children":[null,["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],"p":false,"v":"$9"},"c":"$Qa"}]]
21
- 0:{"P":null,"c":["","login"],"q":"","i":false,"t":{"t":{"s":"","h":528,"d":{"r":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/3fbf75e4c471c6a8.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"children":["$","$L4",null,{"attribute":"class","defaultTheme":"dark","enableSystem":true,"children":["$","$L5",null,{"children":["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]}]}]]}],"p":false,"v":null},"c":"$Q8"},"h":{"r":["$","$1","h",{"children":[null,["$","$L11",null,{"children":"$L12"}],["$","$L14",null,{"children":[["$","div",null,{"hidden":true,"children":["$","$e",null,{"name":"Next.Metadata","children":"$L15"}]}],null]}],null]}],"p":false,"v":null}},"m":"$undefined","G":["$16",[]],"S":true,"r":"$undefined","s":"$undefined","a":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"xjSDCOO8Gpm5iPO9tyRG5"}
22
- 9:C
23
- 12:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
24
- 17:I[6869,[],"IconMark"]
25
- f:null
26
- 15:[["$","title","0",{"children":"Sign in — Rigscope"}],["$","meta","1",{"name":"description","content":"Self-hosted remote system monitor — a live fleet of collectors behind one authenticated hub."}],["$","link","2",{"rel":"icon","href":"/icon.svg?3b3fa3229e2d0d7a","type":"image/svg+xml","sizes":"any"}],["$","$L17","3",{}]]
@@ -1,4 +0,0 @@
1
- :HL["/_next/static/css/3fbf75e4c471c6a8.css","style"]
2
- 2:[["children",{"s":"__PAGE__","h":160}]]
3
- 1:[["children",{"s":"login","h":96,"c":"$Q2"}]]
4
- 0:{"b":"xjSDCOO8Gpm5iPO9tyRG5","t":{"t":{"s":"","h":80,"c":"$Q1"}}}
@@ -1,32 +0,0 @@
1
- 1:"$Sreact.fragment"
2
- 2:"static/chunks/939-514e554087419c71.js"
3
- 3:"static/chunks/app/layout-4feff677c4071745.js"
4
- 4:I[2737,["939","$2","177","$3"],"ThemeProvider"]
5
- 5:I[9939,["939","$2","177","$3"],"LiveProvider"]
6
- 6:I[7121,[],""]
7
- 7:I[4581,[],""]
8
- e:"static/chunks/app/login/page-c57e12dbe5146737.js"
9
- f:I[5000,["939","$2","520","$e"],"LoginView"]
10
- 10:I[484,[],"OutletBoundary"]
11
- 11:"$Sreact.suspense"
12
- 14:"ViewportBoundary"
13
- 15:I[484,[],"$14"]
14
- 16:"MetadataBoundary"
15
- 17:I[484,[],"$16"]
16
- 18:I[6869,[],"IconMark"]
17
- :HL["/_next/static/css/3fbf75e4c471c6a8.css","style"]
18
- 9:X
19
- c:X
20
- c:C
21
- d:[["children",{"s":"__PAGE__","h":160,"d":{"r":["$","$1","c",{"children":[["$","$Lf",null,{}],null,["$","$L10",null,{"children":["$","$11",null,{"name":"Next.MetadataOutlet","children":"$@12"}]}]]}],"p":"$@13","v":null,"s":"$9"}}]]
22
- a:[["children",{"s":"login","h":96,"d":{"r":["$","$1","c",{"children":[null,["$","$L6",null,{"parallelRouterKey":"children","template":["$","$L7",null,{}]}]]}],"p":"$@b","v":"$c","s":"$9"},"c":"$Qd"}]]
23
- 0:{"t":{"t":{"s":"","h":80,"d":{"r":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/3fbf75e4c471c6a8.css","precedence":"next"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"children":["$","$L4",null,{"attribute":"class","defaultTheme":"dark","enableSystem":true,"children":["$","$L5",null,{"children":["$","$L6",null,{"parallelRouterKey":"children","template":["$","$L7",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}]}]}]}]]}],"p":"$@8","v":null,"s":"$9"},"c":"$Qa"},"h":{"r":["$","$1","h",{"children":[null,["$","$L15",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","$L17",null,{"children":[["$","div",null,{"hidden":true,"children":["$","$11",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"Sign in — Rigscope"}],["$","meta","1",{"name":"description","content":"Self-hosted remote system monitor — a live fleet of collectors behind one authenticated hub."}],["$","link","2",{"rel":"icon","href":"/icon.svg?3b3fa3229e2d0d7a","type":"image/svg+xml","sizes":"any"}],["$","$L18","3",{}]]}]}],null]}],null]}],"p":"$@19","v":null,"s":"$9"}},"a":"$@1a","u":"$@1b","b":"xjSDCOO8Gpm5iPO9tyRG5"}
24
- 12:null
25
- 9:300
26
- 1b:true
27
- 9:C
28
- 1a:0
29
- b:"$undefined"
30
- 8:"$undefined"
31
- 19:"$undefined"
32
- 13:"$undefined"
@@ -1 +0,0 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/3fbf75e4c471c6a8.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-9ca43f4ce1bb8938.js"/><script src="/_next/static/chunks/4bd1b696-c7408084347438ae.js" async=""></script><script src="/_next/static/chunks/794-ceeb732a1a81bc27.js" async=""></script><script src="/_next/static/chunks/main-app-f92328c8950d2e53.js" async=""></script><script src="/_next/static/chunks/939-514e554087419c71.js" async=""></script><script src="/_next/static/chunks/app/layout-4feff677c4071745.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>Rigscope</title><meta name="description" content="Self-hosted remote system monitor — a live fleet of collectors behind one authenticated hub."/><link rel="icon" href="/icon.svg?3b3fa3229e2d0d7a" type="image/svg+xml" sizes="any"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><script>((a,b,c,d,e,f,g,h)=>{let i=document.documentElement,j=["light","dark"];function k(b){var c;(Array.isArray(a)?a:[a]).forEach(a=>{let c="class"===a,d=c&&f?e.map(a=>f[a]||a):e;c?(i.classList.remove(...d),i.classList.add(f&&f[b]?f[b]:b)):i.setAttribute(a,b)}),c=b,h&&j.includes(c)&&(i.style.colorScheme=c)}if(d)k(d);else try{let a=localStorage.getItem(b)||c,d=g&&"system"===a?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":a;k(d)}catch(a){}})("class","theme","dark",null,["light","dark"],null,true,true)</script><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-9ca43f4ce1bb8938.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:\"static/chunks/939-514e554087419c71.js\"\n3:\"static/chunks/app/layout-4feff677c4071745.js\"\n4:I[2737,[\"939\",\"$2\",\"177\",\"$3\"],\"ThemeProvider\"]\n5:I[9939,[\"939\",\"$2\",\"177\",\"$3\"],\"LiveProvider\"]\n6:I[7121,[],\"\"]\n7:I[4581,[],\"\"]\nb:I[484,[],\"OutletBoundary\"]\nc:\"$Sreact.suspense\"\ne:\"ViewportBoundary\"\nf:I[484,[],\"$e\"]\n11:\"MetadataBoundary\"\n12:I[484,[],\"$11\"]\n14:I[7123,[],\"default\",1]\n:HL[\"/_next/static/css/3fbf75e4c471c6a8.css\",\"style\"]\n9:X\na:[[\"children\",{\"s\":\"__PAGE__\",\"h\":512,\"d\":{\"r\":[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$Lb\",null,{\"children\":[\"$\",\"$c\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@d\"}]}]]}],\"p\":false,\"v\":null}}]]\n8:[[\"children\",{\"s\":\"_not-found\",\"h\":512,\"d\":{\"r\":[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L6\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],\"p\":false,\"v\":\"$9\"},\"c\":\"$Qa\"}]]\n0:{\"P\":null,\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"t\":{\"t\":{\"s\":\"\",\"h\":528,\"d\":{\"r\":[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/3fbf75e4c471c6a8.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[\"$\",\"body\",null,{\"children\":[\"$\",\"$L4\",null,{\"attribute\":\"class\",\"defaultTheme\":\"dark\",\"enableSystem\":true,\"children\":[\"$\",\"$L5\",null,{\"children\":[\"$\",\"$L6\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]}]}]]}],\"p\":false,\"v\":null},\"c\":\"$Q8\"},\"h\":{\"r\":[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$Lf\",null,{\"children\":\"$L10\"}],[\"$\",\"$L12\",null,{\"children\":[[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$c\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L13\"}]}],null]}],null]}],\"p\":false,\"v\":null}},\"m\":\"$undefined\",\"G\":[\"$14\",[]],\"S\":true,\"r\":\"$undefined\",\"s\":\"$undefined\",\"a\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"xjSDCOO8Gpm5iPO9tyRG5\"}\n"])</script><script>self.__next_f.push([1,"9:C\n10:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"15:I[6869,[],\"IconMark\"]\nd:null\n13:[[\"$\",\"title\",\"0\",{\"children\":\"Rigscope\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Self-hosted remote system monitor — a live fleet of collectors behind one authenticated hub.\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/icon.svg?3b3fa3229e2d0d7a\",\"type\":\"image/svg+xml\",\"sizes\":\"any\"}],[\"$\",\"$L15\",\"3\",{}]]\n"])</script></body></html>
@@ -1 +0,0 @@
1
- {"status":404,"headers":{"x-nextjs-stale-time":"300","x-nextjs-prerender":"1","x-next-cache-tags":"_N_T_/layout,_N_T_/_not-found/layout,_N_T_/_not-found/page,_N_T_/_not-found"},"segmentPaths":["/_tree","/_full","/_not-found/__PAGE__"],"prefetchHints":{"hints":64,"slots":{"children":{"hints":96,"slots":{"children":{"hints":160,"slots":null}}}}},"routeCache":{"key":"/route-cache/APP_PAGE/41da0ef926a63354a29f601d8e8d0a5951196c45ebcd28b7d4708fb7f56f3bf1/$/_not-found","owner":{"kind":"APP_PAGE","sourceRoute":"/_not-found/page"},"isFallback":false},"routeCacheLastModified":1793851815561}