@andrian.yablonskyy/thub-agent 1.1.21 → 1.1.23
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/RELEASE.md +35 -0
- package/package.json +2 -2
- package/src/cli.js +12 -1
package/RELEASE.md
CHANGED
|
@@ -2,8 +2,43 @@
|
|
|
2
2
|
|
|
3
3
|
What changed in each release, newest first. `## Unreleased` collects the changes since the version on npm; `bin/publish` turns that heading into the version and date it releases.
|
|
4
4
|
|
|
5
|
+
## 1.1.23 — 2026-10-15
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- Requires thub-common 2.2.4.
|
|
10
|
+
|
|
11
|
+
## 1.1.22 — 2026-10-15
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
|
|
15
|
+
- **`thub connect` shows the camera's state.** The Video line says whether the board's camera is streaming, and if not, why, for example `(not streaming — ffmpeg isn't installed on this Client host …)`. Each change is printed as it happens (`Video: streaming`, `Video: not streaming — …`), with no viewer needed. Needs Client 1.1.26.
|
|
16
|
+
|
|
17
|
+
## 1.1.21 — 2026-10-15
|
|
18
|
+
|
|
19
|
+
### Fixed
|
|
20
|
+
|
|
21
|
+
- **`thub connect` and `thub console` behind a proxy without WebSocket support** stop with the reason instead of retrying forever: *The Coordinator answered HTTP 302 → /login instead of opening a WebSocket: a reverse proxy in front of the Coordinator isn't passing WebSocket upgrades …* The same goes for `426` (Coordinator 1.1.41). Other refusals (`401`, `403`, `404`, `409`) were already final.
|
|
22
|
+
|
|
5
23
|
## 1.1.20 — 2026-10-15
|
|
6
24
|
|
|
25
|
+
### Added
|
|
26
|
+
|
|
27
|
+
- **`thub reserve <client> [--for <dur>]`** holds a runner for your own jobs (README §5.5).
|
|
28
|
+
- **Duration:** whole minutes (`30m`, `2h`; 1 h by default), up to the runner's maximum. Running it again extends the reservation from now.
|
|
29
|
+
- **Output:** the end time, how to use the runner, and the reservation's own remote access link.
|
|
30
|
+
- **Release:** **`thub release <client>`** ends it; maintainers and admins can end anyone's.
|
|
31
|
+
- **`thub resources`** has a RESERVED column (who, until when). With `--json`, each runner has its `reservation`, and for your own reservation its `id` and `link`.
|
|
32
|
+
- **`thub connect <client>`** keeps a live connection to your reserved board (README §5.6) and prints that reservation's link and a local port per device:
|
|
33
|
+
- **UARTs:** `127.0.0.1:5001` and up (`--uart-port`), for socat, picocom or pyserial's `socket://`.
|
|
34
|
+
- **ST-Links:** a GDB port each, `127.0.0.1:3333` and up (`--gdb-port`). Each connection starts its own OpenOCD on the Client; `--target <name>` gives the OpenOCD target.
|
|
35
|
+
- **Camera:** if the board has one (README §5.7), `http://127.0.0.1:8090/<reservation id>/video.ts` (`--video-port`) for VLC, ffplay or mpv. The URL is that reservation's own. `--video-udp <port>` also sends it as UDP.
|
|
36
|
+
- **Reconnecting:** it reconnects by itself (1 s, 2 s … 30 s). Serial terminals and video viewers stay connected through a reconnect; GDB has to connect again.
|
|
37
|
+
- **Exiting:** it exits with the reason when the reservation ends.
|
|
38
|
+
- **Options:** `--bind` and `--json`.
|
|
39
|
+
- **`thub console <client> [--uart <n>]`** puts one UART of your reserved board in the terminal. Ctrl-] quits.
|
|
40
|
+
- New dependency: `ws` 8.21.3.
|
|
41
|
+
|
|
7
42
|
### Changed
|
|
8
43
|
|
|
9
44
|
- Requires thub-common 2.2.3.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@andrian.yablonskyy/thub-agent",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.23",
|
|
4
4
|
"description": "TestHub Agent CLI — the single entry point CI/CD and developers use to submit and follow test jobs",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
6
6
|
"author": "Andrian Yablonskyy <andrian.yablonskyy@gmail.com>",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"lint:fix": "eslint . --fix"
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@andrian.yablonskyy/thub-common": "^2.2.
|
|
18
|
+
"@andrian.yablonskyy/thub-common": "^2.2.4",
|
|
19
19
|
"commander": "^13.1.0",
|
|
20
20
|
"ws": "8.21.3"
|
|
21
21
|
},
|
package/src/cli.js
CHANGED
|
@@ -514,10 +514,19 @@ program
|
|
|
514
514
|
session.on('status', (s) => {
|
|
515
515
|
until = s.until;
|
|
516
516
|
});
|
|
517
|
+
// The camera's state on the Client (README §5.7): said when it changes.
|
|
518
|
+
const cameraState = (c) => (c ? (c.streaming ? 'streaming' : c.error ? `not streaming — ${c.error}` : 'starting…') : null);
|
|
519
|
+
let lastCamera = null;
|
|
517
520
|
session.on('devices', (devices) => {
|
|
521
|
+
const camera = cameraState(devices.camera);
|
|
518
522
|
if (listening){
|
|
523
|
+
if (camera && camera !== lastCamera){
|
|
524
|
+
log(`Video: ${camera}`);
|
|
525
|
+
}
|
|
526
|
+
lastCamera = camera;
|
|
519
527
|
return;
|
|
520
528
|
}
|
|
529
|
+
lastCamera = camera;
|
|
521
530
|
listening = (async () => {
|
|
522
531
|
const local = await listenLocal(session, devices, {
|
|
523
532
|
host: opts.bind, uartBase: opts.uartPort, gdbBase: opts.gdbPort, target: opts.target, log
|
|
@@ -579,7 +588,9 @@ function printConnection(name, link, until, ports, devices, opts, video){
|
|
|
579
588
|
}
|
|
580
589
|
}
|
|
581
590
|
if (video){
|
|
582
|
-
|
|
591
|
+
const c = devices.camera,
|
|
592
|
+
state = c.streaming === false && c.error ? ` (not streaming — ${c.error})` : c.streaming === false ? ' (starting…)' : '';
|
|
593
|
+
lines.push(`Video ${c.name} H.264 (MPEG-TS) ${video.url}${state}`,
|
|
583
594
|
` vlc ${video.url} · ffplay -fflags nobuffer ${video.url}` +
|
|
584
595
|
(video.udp ? `\n UDP: ${video.udp} (ffplay -fflags nobuffer ${video.udp})` : ' · UDP too: --video-udp 5600'));
|
|
585
596
|
}
|