obsbot-mcp 0.7.0 → 0.9.0

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 (56) hide show
  1. package/README.md +111 -20
  2. package/dist/build-info.json +5 -0
  3. package/dist/device/manager.d.ts +8 -0
  4. package/dist/device/manager.js +37 -4
  5. package/dist/device/manager.js.map +1 -1
  6. package/dist/geometry/aim.d.ts +24 -13
  7. package/dist/geometry/aim.js +26 -13
  8. package/dist/geometry/aim.js.map +1 -1
  9. package/dist/ipc/build-id.d.ts +25 -0
  10. package/dist/ipc/build-id.js +60 -0
  11. package/dist/ipc/build-id.js.map +1 -0
  12. package/dist/ipc/client.d.ts +36 -0
  13. package/dist/ipc/client.js +106 -4
  14. package/dist/ipc/client.js.map +1 -1
  15. package/dist/ipc/coordinator.d.ts +91 -12
  16. package/dist/ipc/coordinator.js +293 -57
  17. package/dist/ipc/coordinator.js.map +1 -1
  18. package/dist/ipc/gate.d.ts +14 -0
  19. package/dist/ipc/gate.js +45 -0
  20. package/dist/ipc/gate.js.map +1 -0
  21. package/dist/ipc/owner.d.ts +27 -1
  22. package/dist/ipc/owner.js +67 -4
  23. package/dist/ipc/owner.js.map +1 -1
  24. package/dist/ipc/protocol.d.ts +30 -0
  25. package/dist/ipc/protocol.js +40 -0
  26. package/dist/ipc/protocol.js.map +1 -1
  27. package/dist/ipc/rendezvous.d.ts +37 -11
  28. package/dist/ipc/rendezvous.js +143 -30
  29. package/dist/ipc/rendezvous.js.map +1 -1
  30. package/dist/mcp/server.js +40 -12
  31. package/dist/mcp/server.js.map +1 -1
  32. package/dist/tail2/api.d.ts +381 -0
  33. package/dist/tail2/api.js +547 -0
  34. package/dist/tail2/api.js.map +1 -0
  35. package/dist/tail2/mdns.d.ts +48 -0
  36. package/dist/tail2/mdns.js +216 -0
  37. package/dist/tail2/mdns.js.map +1 -0
  38. package/dist/tail2/move.d.ts +41 -0
  39. package/dist/tail2/move.js +79 -0
  40. package/dist/tail2/move.js.map +1 -0
  41. package/dist/tail2/registry.d.ts +100 -0
  42. package/dist/tail2/registry.js +200 -0
  43. package/dist/tail2/registry.js.map +1 -0
  44. package/dist/tail2/snapshot.d.ts +54 -0
  45. package/dist/tail2/snapshot.js +157 -0
  46. package/dist/tail2/snapshot.js.map +1 -0
  47. package/dist/tail2/tools.d.ts +7 -0
  48. package/dist/tail2/tools.js +772 -0
  49. package/dist/tail2/tools.js.map +1 -0
  50. package/dist/version.d.ts +1 -1
  51. package/dist/version.js +1 -1
  52. package/native/prebuilt/darwin-arm64/obsbot-helper +0 -0
  53. package/native/prebuilt/darwin-x64/obsbot-helper +0 -0
  54. package/native/prebuilt/linux-x64/obsbot-helper +0 -0
  55. package/native/prebuilt/win32-x64/obsbot-helper.exe +0 -0
  56. package/package.json +4 -1
package/README.md CHANGED
@@ -3,7 +3,8 @@
3
3
  A cross-platform [Model Context Protocol](https://modelcontextprotocol.io) server that controls an
4
4
  **OBSBOT Tiny 2** camera over its standard UVC/USB interface — pan/tilt/roll the gimbal, zoom, AI
5
5
  subject tracking, focus/exposure/white-balance/image controls, HDR and field-of-view, plus snapshot,
6
- preview, and recording — without any vendor SDK.
6
+ preview, and recording — without any vendor SDK. It also controls the **OBSBOT Tail 2** network
7
+ camera over its HTTP/WS API (see [OBSBOT Tail 2](#obsbot-tail-2-network-cameras) below).
7
8
 
8
9
  ## Install
9
10
 
@@ -62,7 +63,9 @@ With the installed binary, use `"command": "obsbot-mcp"` and `"args": ["--debug"
62
63
 
63
64
  35 tools on Windows and macOS, 34 on Linux (`obsbot_gimbal_move_speed` is unavailable there — see
64
65
  [limitations](#linux-gimbal-position-feedback-is-not-live)). `--debug` adds `obsbot_debug_probe` for
65
- one more. All names below are current as of v0.4.0 — **every tool was renamed in this
66
+ one more. Every Tail 2 camera on the network adds the 32 `obsbot_tail2_*` tools in
67
+ [OBSBOT Tail 2](#obsbot-tail-2-network-cameras) below (all platforms — they are pure TypeScript).
68
+ All names below are current as of v0.4.0 — **every tool was renamed in this
66
69
  release and there is no backward-compatible alias**; see [CHANGELOG.md](./CHANGELOG.md) for the
67
70
  full old→new mapping if you're updating a caller.
68
71
 
@@ -249,6 +252,82 @@ name, independent of `camera`.
249
252
  on Windows, `brew install ffmpeg` on macOS, `apt install ffmpeg` on Linux). `snapshot` does **not**
250
253
  need ffmpeg — it grabs the frame through the native helper.
251
254
 
255
+ ## OBSBOT Tail 2 (network cameras)
256
+
257
+ The Tail 2 is a different animal: a network PTZ camera (NDI/RTSP/SRT/RTMP output, ethernet + WiFi,
258
+ and a USB-C port that is either MTP for footage offload or a UVC webcam). The tools below use its
259
+ **network control plane** — an HTTP REST API plus a WebSocket status push, documented in
260
+ [`TAIL2-PROTOCOL.md`](./TAIL2-PROTOCOL.md) from on-device reverse engineering. That makes the whole
261
+ module **pure TypeScript with zero platform-specific code**: no native helper, no helper build,
262
+ identical behavior on Windows/Linux/macOS.
263
+
264
+ In UVC mode the camera also answers the standard UVC controls over USB (pan, tilt, zoom, pan/tilt
265
+ speed, focus, exposure, white balance), and its vendor Extension Unit gives tracking on/off, human
266
+ tracking mode, tracking speed and Auto Zoom. This server has no Tail 2 USB transport yet, so none
267
+ of that is exposed as a tool; presets, portrait rotation and roll trim are network only. See
268
+ [TAIL2-PROTOCOL.md §11](./TAIL2-PROTOCOL.md#11-usb-c-uvc-mode-measured-2026-09-26-windows-directshow-2026-09-27-linux-uvcvideo)
269
+ for what was measured.
270
+
271
+ Getting started:
272
+
273
+ 1. Put the Tail 2 on your network (it defaults to DHCP on ethernet).
274
+ 2. Call `obsbot_tail2_scan` once — it listens ~5 s for the camera's own mDNS announcements (it
275
+ multicasts its MAC, name and IPs every few seconds, the same channel OBSBOT Center discovers
276
+ by) and falls back to an HTTP subnet sweep only on multicast-filtered networks. Or set
277
+ `OBSBOT_TAIL2_HOSTS` (comma-separated addresses) in the server's environment, or just pass any
278
+ Tail 2 tool a `camera` parameter holding the camera's IP.
279
+
280
+ The `camera` selector for these tools is the camera's **MAC** (its stable identity), or its
281
+ `device_name`, or its host address — case-insensitive. Omitted with one Tail 2 registered it
282
+ resolves to that one.
283
+
284
+ | Tool | Parameters | Description |
285
+ |------|------------|-------------|
286
+ | `obsbot_tail2_devices` | — | List registered Tail 2 cameras (mac, name, host(s)). Registration is not liveness. |
287
+ | `obsbot_tail2_scan` | — | Discover Tail 2 cameras: ~5 s mDNS listen (the camera's own announcements), HTTP subnet sweep fallback. Registers what it found. |
288
+ | `obsbot_tail2_status` | `camera`? | One WebSocket status push: the full live block — power, rec, portrait, AI mode + tracking settings, zoom ratio, roll bias, focus modes, NDI/RTSP/SRT/RTMP flags, SD card, presets with poses, and per-subsystem health. No live yaw/pitch — Tail 2 gimbal moves are open-loop. |
289
+ | `obsbot_tail2_info` | `camera`? | Identity + static config in one call: device_info, range (zoom **1.0–12.0**, focus 1–100, WB 2000–10000 K), networkconfig (NDI/stream settings). |
290
+ | `obsbot_tail2_zoom` | `ratio` (`1.0`–`12.0`), `speed` (`1`–`10`, default `5`), `camera`? | Absolute zoom on the camera's own ratio scale. `speed` is required by the firmware. Returns `settled` (readback-verified) — see below. |
291
+ | `obsbot_tail2_recenter` | `camera`? | Gimbal recenter (yaw/pitch/roll 0). Open-loop: returns on ack. Can drop AI tracking to `none`; re-enable with `obsbot_tail2_ai_track`. |
292
+ | `obsbot_tail2_gimbal_position` | `camera`? | Live gimbal pose in degrees (yaw/pitch/roll) + zoom ratio, via save-scratch-preset → read → delete (~2 s). Needs one empty preset slot (probe slots are self-cleaning). |
293
+ | `obsbot_tail2_gimbal_speed` | `yaw`? `pitch`? `roll`? (±150 speed), `durationMs`? (100–5000, default 500), `camera`? | Jog the gimbal (the joystick primitive) with automatic stop. Measured: command 20 ≈ 7.9°/s; positive yaw command DECREASES recorded yaw. Disable AI tracking first. |
294
+ | `obsbot_tail2_gimbal_move` | `yaw`? `pitch`? (±178°), `camera`? | Absolute move via closed loop (jog → pose read → correct, ≤5 rounds, ±1.5° tolerance). Slow by design (~1 s per small move, more for large). Refuses while AI tracking is active. Hardware-verified 2026-09-30: 4° move converged in one iteration. |
295
+ | `obsbot_tail2_gimbal_invert` | `enable`?, `camera`? | Read (bare call) or set (verified) control-direction inversion. |
296
+ | `obsbot_tail2_record` | `enable`?, `camera`? | Read/control the recording switch. Needs storage — check `obsbot_tail2_status`'s sdcard field. |
297
+ | `obsbot_tail2_capture_photo` | `camera`? | Trigger a still photo (to storage). |
298
+ | `obsbot_tail2_focus` | `mode`? (`afc`/`afs`/`mf`), `position`? (0–100), `camera`? | Read or set focus. Position only in `mf` (mode-gated; the tool refuses otherwise). |
299
+ | `obsbot_tail2_exposure` | `mode`?, `face`?, `evbias`?, `iso`?, `shutter`?, `camera`? | Read (mode-appropriate) or set exposure: auto (face-priority AE + EV bias) or manual (ISO 100–6400, shutter `1/N`). Note: the firmware rejects JSON-integer evbias — the client always sends `0.0`-style floats. |
300
+ | `obsbot_tail2_image_adjust` | `control`?, `value`? (0–100), `styleMode`?, `camera`? | Read or set image style (brightness/contrast/hue/saturation/sharpness). Control writes are gated to `styleMode: manual` — the tool applies a given styleMode first and refuses otherwise. |
301
+ | `obsbot_tail2_hdr` | `enabled`?, `camera`? | Read/set HDR. |
302
+ | `obsbot_tail2_wb` | `mode`?, `temperature`? (2000–10000 K), `camera`? | Read/set white balance (6 modes + Kelvin in manual). |
303
+ | `obsbot_tail2_stream` | `output`? (`ndi`/`rtsp`/`srt`/`off`), `camera`? | Read/set the ONE active network output. The programmatic way to arm SRT for `obsbot_tail2_snapshot` — no Center needed. |
304
+ | `obsbot_tail2_only_me` | `enabled`?, `camera`? | Read/set OnlyMe human-tracking (track one person, not everyone). |
305
+ | `obsbot_tail2_audio` | `volume`?, `mute`?, `camera`? | Read/set audio input. |
306
+ | `obsbot_tail2_track_target` | `x`, `y` (0.01–0.99), `camera`? | **Tap-to-track**: engage AI tracking on the subject at a normalized frame coordinate (snapshot pixel ÷ frame size). Undocumented endpoint, hardware-measured. |
307
+ | `obsbot_tail2_focus_point` | `x`?, `y`? (0.01–0.99), `camera`? | **Tap-to-focus**: move the focus window to a normalized frame coordinate and start a point focus (afc/afs only). Bare call reads the window. |
308
+ | `obsbot_tail2_portrait` | `enable`, `camera`? | Motorized 90° barrel rotation for portrait framing — no Tiny 2 equivalent. Verified on orientation feedback; retry if `settled:false` (writes can be silently dropped *while the motor is in motion* — measured). |
309
+ | `obsbot_tail2_roll_bias` | `angle` (±90), `camera`? | Roll trim in degrees (horizon correction / deliberate tilt). |
310
+ | `obsbot_tail2_ai_track` | `enabled`, `mode` (default `"humanTrackingSingleMode"`), `camera`? | Enable/disable AI tracking. Modes are the camera's own enum: human (single/group), animal (normal/close-up), object tracking (`objectTracking`/`objectTrackingNormal`/`objectTrackingCloseUp`). While active, tracking owns the gimbal. |
311
+ | `obsbot_tail2_track_speed` | `speed`: `"superLazy" \| "lazy" \| "slow" \| "fast" \| "crazy" \| "customized"`, `camera`? | Tracking follow speed — the Tail 2's own six-speed enum (NOT the Tiny 2's standard/sport pair). |
312
+ | `obsbot_tail2_preset_list` | `camera`? | The three preset slots: occupied/empty, decoded name, pose in degrees + zoom ratio. |
313
+ | `obsbot_tail2_preset_save` | `slot` (`1`–`3`), `name`? (default `P1`/`P2`/`P3`), `camera`? | Save the CURRENT live pose into a slot — aim first, then save. **Overwrites** an occupied slot (unlike the Tiny 2's create-once), and there is no pose-by-value write in this API at all. |
314
+ | `obsbot_tail2_preset_recall` | `slot`, `camera`? | Drive gimbal + zoom to a saved pose. Refuses an empty slot. Arrival verified via the zoom readback (gimbal axes are open-loop — the Tail 2 reports no live pose). Disable AI tracking first or it fights the move. |
315
+ | `obsbot_tail2_preset_delete` | `slot`, `camera`? | Free a slot. |
316
+ | `obsbot_tail2_preset_rename` | `slot`, `name`, `camera`? | Rename a slot (base64 handled transparently). |
317
+ | `obsbot_tail2_snapshot` | `resolution` (`256`–`1920`, default `640`), `quality` (`1`–`100`, default `80`), `camera`? | Grab one still frame and return it as an image. Pulls from the camera's **SRT output** (ffmpeg SRT caller, port 5000) — requires SRT listener mode enabled in OBSBOT Center first (it disables NDI while active and is cleared by a camera reboot; Center only allows changing streaming settings while the output is off, so a failure usually means SRT is off — re-enable and retry). Hardware-verified 2026-09-26. |
318
+
319
+ **Every write is verified by readback** (`settled` in the result): the Tail 2 acknowledges commands
320
+ it may drop while an actuator is mid-motion — `{"code":200}` means *acknowledged*, not *applied*
321
+ (measured 2026-09-26; see TAIL2-PROTOCOL.md §8). `settled:false` means the ladder ran out before
322
+ the readback agreed; the command was still sent — retry it.
323
+
324
+ Known Tail 2 gaps (details in TAIL2-PROTOCOL.md §9): image-control writes via REST
325
+ are unprobed, and snapshot depends on the camera's SRT output being enabled from
326
+ OBSBOT Center (exclusive with NDI, cleared by reboots — the tool explains this when
327
+ SRT is off; on this firmware the RTSP output never serves despite its enable flag).
328
+ The camera's control API is also **unauthenticated** — anyone on your LAN can drive
329
+ it, including poweroff.
330
+
252
331
  ## Supported platforms
253
332
 
254
333
  - **Windows x64** — supported today. The native helper is built from source in `native/windows/`
@@ -473,17 +552,34 @@ node scripts/e2e.mjs
473
552
  Two traps make it easy to test the wrong thing and believe the result. Both cost real time on
474
553
  2026-07-25.
475
554
 
476
- **Rebuilding and reloading is not enough — kill stale server processes first.** The MCP server runs
477
- from `dist/`, so a source change is invisible until `npm run build`. But reloading the server in your
478
- MCP client does *not* guarantee your new code executes: this project coordinates concurrent clients
479
- by electing a single owner process (see `IPC-DESIGN.md`), and a reload spawns a *new* client that
480
- **forwards its tool calls to whatever owner is already running**. An orphaned server from a previous
481
- session stays the owner, so the new process advertises its own up-to-date tool list while every call
482
- is executed by old code.
555
+ **Rebuild, then start one server from the new build.** The MCP server runs from `dist/`, so a
556
+ source change is invisible until `npm run build`. This project coordinates concurrent clients by
557
+ electing a single owner process (see `IPC-DESIGN.md`), and **the owner executes every tool call**,
558
+ whichever session made it. The owner is the newest build alive: when a server starts from a newer
559
+ build than the owner's, the owner finishes the call in flight, releases the camera, and hands the
560
+ endpoint over. Reloading the server in one MCP client is therefore enough. Other sessions stay open
561
+ and their calls are served by the new build.
562
+
563
+ Three things to know:
564
+
565
+ - **The tool list of other sessions does not refresh.** A session that started on an older build
566
+ keeps the list it had; its calls run the new code. Reload that session's server to get new tools.
567
+ - **A server that predates the handover cannot hand over** (0.7.0 and earlier). A newer server
568
+ will not run calls on it, and says so: `an older instance owns the camera endpoint and cannot
569
+ hand it over`. Stop the old process once; after that, rebuilds take over on their own.
570
+ - **Use `npm run build` and `npm run build:helper`.** They stamp the build with its identity
571
+ (`dist/build-info.json`). A bare `tsc`, or a helper copied into place by hand, is not stamped and
572
+ does not count as a newer build.
573
+
574
+ To see which build will run your next call, read the last `ipc role=` line in the server's log.
575
+ `role=owner` means this process; `role=client owner-pid=… owner-build=…` names the one that will.
576
+ Claude Code keeps the log under `~/Library/Caches/claude-cli-nodejs/<project>/mcp-logs-obsbot/` on
577
+ macOS.
483
578
 
484
- That failure is deceptive rather than loud: a newly added tool *appears* in the tool list and can be
485
- called, but behaves like the old build. Two reloads in a row will not fix it. Check for orphans
486
- before concluding anything:
579
+ ```bash
580
+ # Linux / macOS — every server process, with when it started
581
+ ps -o pid,lstart,command -p $(pgrep -f "obsbot.*dist/index.js" | paste -sd, -)
582
+ ```
487
583
 
488
584
  ```powershell
489
585
  # Windows
@@ -492,14 +588,9 @@ Get-CimInstance Win32_Process -Filter "Name='node.exe'" |
492
588
  Select-Object ProcessId, CreationDate
493
589
  ```
494
590
 
495
- ```bash
496
- # Linux / macOS
497
- pgrep -af "obsbot.*dist/index.js"
498
- ```
499
-
500
- Kill everything older than your build, then reload. The cheapest positive confirmation is to call a
501
- tool whose *output* changed — `obsbot_status` gaining a field, say — rather than one whose
502
- description changed, since descriptions come from the new process either way.
591
+ Set `OBSBOT_IPC_NAME` to give a server a rendezvous endpoint of its own (1–64 characters from
592
+ `A-Z a-z 0-9 . _ -`). Test harnesses do this so they leave a live session alone. Two owners on one
593
+ machine can contend for the camera, so it is not for everyday use.
503
594
 
504
595
  **Frame rate selects the field of view, so the preview shows less than snapshots.** At 1920×1080 this
505
596
  camera has two different windows onto the sensor and the *frame rate* picks between them — not the
@@ -0,0 +1,5 @@
1
+ {
2
+ "version": "0.9.0",
3
+ "builtAt": 1790798771447,
4
+ "digest": "8b65309d6969d6a37bb4b9c236d7f1e7b32d7970c5872881e31b48e83c238d51"
5
+ }
@@ -100,6 +100,14 @@ export declare class DeviceManager {
100
100
  */
101
101
  /** True while an arrival re-bind ladder is running (see handleCameraArrived). */
102
102
  private rebinding;
103
+ /**
104
+ * Bumped by shutdown(). shutdown() is no longer only a way out: an owner
105
+ * that steps down for a newer build calls it and stays alive. Work that was
106
+ * under way before it — a re-bind ladder waiting out its backoff — must not
107
+ * open the camera after it, or this instance takes back what it has just
108
+ * given up.
109
+ */
110
+ private epoch;
103
111
  /**
104
112
  * Delays before each arrival re-bind attempt, in order — so four attempts
105
113
  * spanning ~4.5s, the first immediate.
@@ -4,8 +4,20 @@ import { MacosTransport } from "../transport/macos.js";
4
4
  // USB vendor ID 0x3564 is registered to **Remo Inc.** — the manufacturer. OBSBOT
5
5
  // is a Remo product brand, and Remo ships non-OBSBOT (and non-camera) devices
6
6
  // under the same VID, so candidacy must gate on VID **and** a known model PID —
7
- // never VID alone. Add a PID here (and mirror it in native/macos/helper.m's
8
- // OBSBOT_MODEL_PIDS) when a new OBSBOT camera model is verified on hardware.
7
+ // never VID alone.
8
+ //
9
+ // This table is the list of models that speak the Tiny 2's framed V3 vendor
10
+ // protocol, because being a candidate here means being OPENED AND WRITTEN TO:
11
+ // bind() and listCameras() identify a camera by sending it UG_GET_SN as a V3
12
+ // frame on vendor selector 2. Add a PID only when that query has been verified
13
+ // on the model's hardware.
14
+ //
15
+ // The Tail 2 (0xfefc — one composite PID for both its MTP and UVC USB modes) is
16
+ // deliberately absent. It carries the Tiny 2's Extension Unit GUID but uses
17
+ // flat selectors, not V3 frames (TAIL2-PROTOCOL.md §11), so the serial query
18
+ // would be an untested vendor write. native/macos/helper.m's OBSBOT_MODEL_PIDS
19
+ // does list it: that table only decides what the helper can enumerate and
20
+ // open, which sends the camera nothing. The two tables no longer mirror.
9
21
  const REMO_VID = 0x3564;
10
22
  const OBSBOT_MODEL_PIDS = new Map([
11
23
  [REMO_VID, new Set([0xfef8 /* Tiny 2 */])],
@@ -17,6 +29,10 @@ const OBSBOT_MODEL_PIDS = new Map([
17
29
  // DirectShow filter, which matched this regex and poisoned multi-candidate
18
30
  // binding — are correctly excluded.
19
31
  const OBSBOT_NAME_RE = /obsbot/i;
32
+ // The name fallback's stand-in for the Tail 2's absence from the PID table.
33
+ // Matches both spellings the camera's own USB strings use ("OBSBOT Tail 2
34
+ // Camera", "OBSBOT Tail2 Audio").
35
+ const TAIL2_NAME_RE = /tail\s*2/i;
20
36
  /** Message text from an unknown thrown value, for diagnostics. */
21
37
  const errText = (e) => (e instanceof Error ? e.message : String(e));
22
38
  /**
@@ -25,10 +41,13 @@ const errText = (e) => (e instanceof Error ? e.message : String(e));
25
41
  * VID + known-model PID table (a software "OBSBOT Virtual Camera" has no vid/pid
26
42
  * and is rejected). On Linux the helper does not report vid/pid yet, so fall
27
43
  * back to the name match there until it does.
44
+ *
45
+ * A Tail 2 is never a candidate on any platform — see OBSBOT_MODEL_PIDS.
28
46
  */
29
47
  function isObsbotCamera(d) {
30
- if (process.platform === "linux")
31
- return OBSBOT_NAME_RE.test(d.name);
48
+ if (process.platform === "linux") {
49
+ return OBSBOT_NAME_RE.test(d.name) && !TAIL2_NAME_RE.test(d.name);
50
+ }
32
51
  if (d.vid === undefined || d.pid === undefined)
33
52
  return false;
34
53
  return OBSBOT_MODEL_PIDS.get(d.vid)?.has(d.pid) ?? false;
@@ -124,6 +143,14 @@ export class DeviceManager {
124
143
  */
125
144
  /** True while an arrival re-bind ladder is running (see handleCameraArrived). */
126
145
  rebinding = false;
146
+ /**
147
+ * Bumped by shutdown(). shutdown() is no longer only a way out: an owner
148
+ * that steps down for a newer build calls it and stays alive. Work that was
149
+ * under way before it — a re-bind ladder waiting out its backoff — must not
150
+ * open the camera after it, or this instance takes back what it has just
151
+ * given up.
152
+ */
153
+ epoch = 0;
127
154
  /**
128
155
  * Delays before each arrival re-bind attempt, in order — so four attempts
129
156
  * spanning ~4.5s, the first immediate.
@@ -607,12 +634,17 @@ export class DeviceManager {
607
634
  if (this.rebinding)
608
635
  return;
609
636
  this.rebinding = true;
637
+ const epoch = this.epoch;
610
638
  const total = this.arrivalBackoffMs.length;
611
639
  try {
612
640
  for (let i = 0; i < total; i++) {
613
641
  const delay = this.arrivalBackoffMs[i];
614
642
  if (delay > 0)
615
643
  await new Promise((r) => setTimeout(r, delay));
644
+ // The manager was shut down while we waited: the camera is no longer
645
+ // ours to restore. See `epoch`.
646
+ if (this.epoch !== epoch)
647
+ return;
616
648
  // A tool call may have bound it while we waited — it got there first.
617
649
  if (this.registry.size > 0)
618
650
  return;
@@ -651,6 +683,7 @@ export class DeviceManager {
651
683
  * itself throw is worse than one that leaves a process for the OS to reap.
652
684
  */
653
685
  async shutdown() {
686
+ this.epoch++;
654
687
  const close = async (h) => {
655
688
  if (!h)
656
689
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/device/manager.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,iFAAiF;AACjF,8EAA8E;AAC9E,gFAAgF;AAChF,4EAA4E;AAC5E,6EAA6E;AAC7E,MAAM,QAAQ,GAAG,MAAM,CAAC;AACxB,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAsB;IACrD,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAS,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;CACnD,CAAC,CAAC;AAEH,iFAAiF;AACjF,0EAA0E;AAC1E,4EAA4E;AAC5E,yEAAyE;AACzE,2EAA2E;AAC3E,oCAAoC;AACpC,MAAM,cAAc,GAAG,SAAS,CAAC;AAEjC,kEAAkE;AAClE,MAAM,OAAO,GAAG,CAAC,CAAU,EAAU,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAErF;;;;;;GAMG;AACH,SAAS,cAAc,CAAC,CAAa;IACnC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACrE,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC7D,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC;AAC3D,CAAC;AAED,8EAA8E;AAC9E,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IACpC,SAAS,CAAW;IAC7B,YAAY,SAAmB;QAC7B,KAAK,CAAC,8CAA8C,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5E,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACnC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AAED,+EAA+E;AAC/E,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,SAAS,CAAW;IAC7B,YAAY,MAAc,EAAE,SAAmB;QAC7C,KAAK,CACH,mBAAmB,MAAM,iBAAiB,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAC/F,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AAoCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,OAAO,aAAa;IAqEd;IApEF,QAAQ,GAAG,IAAI,GAAG,EAAyB,CAAC;IACpD,4EAA4E;IACpE,UAAU,CAAiB;IACnC;;;OAGG;IACK,OAAO,CAAiB;IAChC;;;;;;;;;OASG;IACK,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,kBAAkB,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/C;;;;;;;;;;;;;;;OAeG;IACH,iFAAiF;IACzE,SAAS,GAAG,KAAK,CAAC;IAE1B;;;;;;;;;;;;;OAaG;IACK,gBAAgB,CAAW;IAEnC;;;;;;;;OAQG;IACK,GAAG,CAAwB;IAEnC,YACU,UAAwC,EAChD,OAAqE,EAAE;QAD/D,eAAU,GAAV,UAAU,CAA8B;QAGhD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACtE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC;IAEO,eAAe,CAAC,MAAqB;QAC3C,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAClC,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,iBAAiB;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;QAC/B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,iEAAiE;QACnE,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6DG;IACK,KAAK,CAAC,aAAa;QACzB,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,CAAC,8BAA8B;QACrE,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;YACjF,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,6CAA6C;QAC/E,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,0EAA0E;YAC1E,wEAAwE;YACxE,0EAA0E;YAC1E,uEAAuE;YACvE,yEAAyE;YACzE,EAAE;YACF,iEAAiE;YACjE,uEAAuE;YACvE,qEAAqE;YACrE,kEAAkE;YAClE,IAAI,CAAC,GAAG,CACN,wCAAwC,OAAO,CAAC,CAAC,CAAC,KAAK;gBACrD,kDAAkD,CACrD,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,aAAa;QACzB,qEAAqE;QACrE,0EAA0E;QAC1E,oEAAoE;QACpE,2EAA2E;QAC3E,4EAA4E;QAC5E,IAAI,IAAI,CAAC,UAAU,EAAE,MAAM;YAAE,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QACzD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAC5C,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,IAAI;QACR,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC1C,OAAO,MAAM,CAAC,SAAS,EAAE,CAAC;IAC5B,CAAC;IAED;;;;;;;;;;;OAWG;IACK,KAAK,CAAC,IAAI,CAAC,UAAmB;QACpC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QACzC,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAElD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAiD,CAAC;QACvE,IAAI,OAA8B,CAAC;QACnC,yEAAyE;QACzE,wEAAwE;QACxE,2EAA2E;QAC3E,4EAA4E;QAC5E,uDAAuD;QACvD,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,IAAI,MAAc,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACrC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,+DAA+D;gBAC/D,4DAA4D;gBAC5D,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,kBAAkB,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACvD,SAAS;YACX,CAAC;YACD,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;gBACf,mEAAmE;gBACnE,qDAAqD;gBACrD,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,6BAA6B,CAAC,CAAC;gBACtD,SAAS;YACX,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;YAC/C,IAAI,MAAc,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,SAAS,CAAC,UAAU,EAAE,CAAC;YACxC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC1C,SAAS;YACX,CAAC;YAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;gBAAE,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACtF,OAAO,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACtF,IAAI,UAAU,IAAI,MAAM,KAAK,UAAU;gBAAE,MAAM;QACjD,CAAC;QAED,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBAC7C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBACtB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;gBAC3B,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;YAClE,CAAC;YACD,MAAM,IAAI,kBAAkB,CAAC,UAAU,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACrB,sEAAsE;YACtE,qDAAqD;YACrD,EAAE;YACF,oEAAoE;YACpE,wEAAwE;YACxE,yEAAyE;YACzE,yEAAyE;YACzE,uEAAuE;YACvE,wEAAwE;YACxE,sCAAsC;YACtC,EAAE;YACF,kEAAkE;YAClE,EAAE;YACF,yEAAyE;YACzE,uEAAuE;YACvE,yEAAyE;YACzE,oEAAoE;YACpE,yEAAyE;YACzE,mEAAmE;YACnE,kEAAkE;YAClE,uEAAuE;YACvE,wEAAwE;YACxE,sCAAsC;YACtC,EAAE;YACF,qEAAqE;YACrE,sDAAsD;YACtD,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC/B,wEAAwE;YACxE,wEAAwE;YACxE,uEAAuE;YACvE,wEAAwE;YACxE,wEAAwE;YACxE,6CAA6C;YAC7C,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;YAC3B,qEAAqE;YACrE,2BAA2B;YAC3B,MAAM,IAAI,KAAK,CACb,QAAQ,CAAC,MAAM,KAAK,CAAC;gBACnB,CAAC,CAAC,wBAAwB;gBAC1B,CAAC,CAAC,4BAA4B,QAAQ,CAAC,MAAM,2BAA2B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAChG,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACnB,MAAM,IAAI,oBAAoB,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACpD,CAAC;QACD,mEAAmE;QACnE,uDAAuD;QACvD,IAAI,CAAC,OAAO,CAAC,OAAQ,CAAC,CAAC;QACvB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC3B,OAAO,EAAE,SAAS,EAAE,OAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,OAAQ,CAAC,MAAM,EAAE,CAAC;IACpE,CAAC;IAED,0EAA0E;IAClE,OAAO,CAAC,CAAY;QAC1B,uEAAuE;QACvE,2EAA2E;QAC3E,qEAAqE;QACrE,2EAA2E;QAC3E,wEAAwE;QACxE,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;YAAE,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACxE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAE7B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE;YAC1B,MAAM,EAAE,IAAI,CAAC,UAAW;YACxB,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;SACb,CAAC,CAAC;QACH,qEAAqE;QACrE,wCAAwC;QACxC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAC9B,CAAC;IAED;;;;;;;OAOG;IACH,eAAe,CAAC,MAAe;QAC7B,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC9C,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACvC,OAAO,CAAC,CAAC;QACX,CAAC;QACD,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACrD,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,UAAU,CAAC,MAAe;QAC9B,MAAM,IAAI,GAAG,KAAK,EAAE,CAAS,EAAE,KAAoB,EAAiB,EAAE;YACpE,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAC7B,CAAC;YAAC,MAAM,CAAC;gBACP,sEAAsE;YACxE,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC1B,CAAC,CAAC;QAEF,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,KAAK;gBAAE,MAAM,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QACD,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACK,KAAK,CAAC,gBAAgB;QAC5B,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5C,yEAAyE;YACzE,gEAAgE;YAChE,uEAAuE;YACvE,oEAAoE;YACpE,qEAAqE;YACrE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU;gBAAE,SAAS;YAE/D,sEAAsE;YACtE,0EAA0E;YAC1E,0EAA0E;YAC1E,yEAAyE;YACzE,mEAAmE;YACnE,qEAAqE;YACrE,uEAAuE;YACvE,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAC7B,CAAC;YAAC,MAAM,CAAC;gBACP,iEAAiE;YACnE,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,GAAG,CAAC,MAAe;QACvB,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAE9B,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC3C,IAAI,QAAQ;gBAAE,OAAO,QAAQ,CAAC,SAAS,CAAC;YACxC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC9C,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,SAAS,CAAC;QACnD,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,oBAAoB,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC5D,CAAC;QACD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACxC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,KAAK,CAAC,oBAAoB,CAAC,CAAmB;QAC5C,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5C,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;gBAAE,SAAS;YACpC,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAC7B,CAAC;YAAC,MAAM,CAAC;gBACP,iEAAiE;YACnE,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;QACD,6EAA6E;QAC7E,6EAA6E;QAC7E,0EAA0E;QAC1E,2EAA2E;QAC3E,qBAAqB;QACrB,EAAE;QACF,uEAAuE;QACvE,0EAA0E;QAC1E,wEAAwE;QACxE,qDAAqD;QACrD,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,KAAK,CAAC,mBAAmB,CAAC,EAAoB;QAC5C,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,CAAC,8BAA8B;QACrE,8DAA8D;QAC9D,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC;YAAE,OAAO;QACnC,wEAAwE;QACxE,yEAAyE;QACzE,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAE3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;QAC3C,IAAI,CAAC;YACH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAE,CAAC;gBACxC,IAAI,KAAK,GAAG,CAAC;oBAAE,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC9D,sEAAsE;gBACtE,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC;oBAAE,OAAO;gBACnC,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;oBAClB,kEAAkE;oBAClE,mEAAmE;oBACnE,0CAA0C;oBAC1C,IAAI,CAAC,GAAG,CAAC;wBAAE,IAAI,CAAC,GAAG,CAAC,oDAAoD,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACjF,OAAO;gBACT,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,oEAAoE;oBACpE,qEAAqE;oBACrE,qCAAqC;oBACrC,IAAI,CAAC,GAAG,CACN,uCAAuC,CAAC,GAAG,CAAC,IAAI,KAAK,YAAY,OAAO,CAAC,CAAC,CAAC,EAAE,CAC9E,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,IAAI,CAAC,GAAG,CACN,6CAA6C,KAAK,aAAa;gBAC7D,uCAAuC,CAC1C,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACzB,CAAC;IACH,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,QAAQ;QACZ,MAAM,KAAK,GAAG,KAAK,EAAE,CAA4B,EAAiB,EAAE;YAClE,IAAI,CAAC,CAAC;gBAAE,OAAO;YACf,IAAI,CAAC;gBACH,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;YAClB,CAAC;YAAC,MAAM,CAAC;gBACP,iEAAiE;YACnE,CAAC;QACH,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QACzB,MAAM,OAAO,CAAC,GAAG,CAAC;YAChB,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAC1D,IAAI,CAAC,iBAAiB,EAAE;YACxB,KAAK,CAAC,OAAO,CAAC;SACf,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED,wDAAwD;IACxD,KAAK,CAAC,eAAe;QACnB,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC;IACpB,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,WAAW;QACf,yEAAyE;QACzE,oEAAoE;QACpE,2EAA2E;QAC3E,0EAA0E;QAC1E,sDAAsD;QACtD,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAiB,EAAE,CAAC;QACjC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;QACtC,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;QAC3C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QACrC,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YAC1F,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACxB,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS;gBAAE,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC3E,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QACzC,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAElD,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,mEAAmE;YACnE,mEAAmE;YACnE,kEAAkE;YAClE,oEAAoE;YACpE,gEAAgE;YAChE,kDAAkD;YAClD,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3B,SAAS,CAAC,kCAAkC;YAC9C,CAAC;YACD,IAAI,CAAC,CAAC,UAAU,KAAK,SAAS,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC;gBACrE,SAAS,CAAC,kCAAkC;YAC9C,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACzC,IAAI,MAAM,GAAG,CAAC;oBAAE,SAAS;gBACzB,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;gBAC/C,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,UAAU,EAAE,CAAC;gBAC5C,IAAI,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC;oBAAE,SAAS,CAAC,6CAA6C;gBACpF,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACxB,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;YACxF,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC;oBACX,UAAU,EAAE,CAAC,CAAC,UAAU;oBACxB,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,MAAM,EAAE,MAAM;oBACd,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;iBACnB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/device/manager.ts"],"names":[],"mappings":"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"}
@@ -186,26 +186,37 @@ export interface Offset {
186
186
  */
187
187
  export declare function pixelToOffset(x: number, y: number, frame: Frame, optics: Optics): Offset;
188
188
  /**
189
- * Mechanical limits of the Tiny 2's gimbal, in degrees. Hardware-verified.
189
+ * Limits of the Tiny 2's gimbal, in degrees: the pose the running platform can
190
+ * COMMAND. Hardware-verified.
190
191
  *
191
192
  * These live here rather than in the tool layer so there is exactly one
192
193
  * definition: `obsbot_gimbal_move` imports them for its own clamping. Two copies
193
194
  * of a bound that must agree is a defect waiting to happen.
194
195
  *
195
- * ±150 is the mechanical yaw range on EVERY platform, and these limits are not
196
- * platform-conditional. Measured 2026-07-25: commanded 145 reads back 145, and
197
- * 150 reads back 149. Position feedback comes from the camera's physical
198
- * encoder, which is a property of the hardware and does not vary by OS.
196
+ * ±150 is the mechanical yaw range on every platform. Measured 2026-07-25:
197
+ * commanded 145 reads back 145, and 150 reads back 149. Position feedback comes
198
+ * from the camera's physical encoder, which does not vary by OS.
199
199
  *
200
- * Do not "fix" this to 130. `transport/linux.ts` and `transport/macos.ts` record
201
- * a `CT_PANTILT_ABSOLUTE` range of ±468000 arcsec = ±130°, which reads like a
202
- * conflict and was raised as one during review. It is not: that is the range the
203
- * UVC control *advertises* — a descriptor value that under-reports the mechanism
204
- * it describes — not where the gimbal stops. Nothing clamps to it either;
205
- * `LinuxTransport.gimbalSet` writes `yawDeg * ARCSEC_PER_DEG` unclamped, so the
206
- * arcsec figure lives only in comments. See the spec's §8.
200
+ * The COMMANDABLE range does vary by OS, which is why the yaw limit is resolved
201
+ * per platform. `CT_PANTILT_ABSOLUTE` *advertises* ±468000 arcsec = ±130° — a
202
+ * descriptor value that under-reports the mechanism it describes — and on Linux
203
+ * uvcvideo silently clamps every write to the advertised range. Measured
204
+ * 2026-09-01: writes of 540000 and 504000 arcsec both return success and land
205
+ * at exactly 468000. A limit wider than the platform can command turns every
206
+ * aim past 130° into a guaranteed miss that also burns the closed-loop mover's
207
+ * one retry (`transport/linux.ts`), so on Linux the limit is the kernel's, not
208
+ * the mechanism's. macOS commands the control raw over USB and Windows goes
209
+ * through the vendor protocol; neither clamps, so both keep the mechanical
210
+ * bound. The mechanism still REACHES ±148–149° on every platform — speed moves,
211
+ * hand moves and AI tracking all park it past 130° and Linux live reads report
212
+ * it truthfully (measured -532800/+536400 arcsec at the stops) — so this bounds
213
+ * what may be commanded, never what a read may return. See the spec's §8.
214
+ *
215
+ * Pitch needs no per-platform split: the advertised ±324000 arcsec is exactly
216
+ * the mechanical ±90°.
207
217
  */
208
- export declare const GIMBAL_YAW_LIMIT_DEG = 150;
218
+ export declare function gimbalYawLimitDeg(platform?: string): number;
219
+ export declare const GIMBAL_YAW_LIMIT_DEG: number;
209
220
  export declare const GIMBAL_PITCH_LIMIT_DEG = 90;
210
221
  export interface Aim {
211
222
  target: Pose;
@@ -208,26 +208,39 @@ export function pixelToOffset(x, y, frame, optics) {
208
208
  };
209
209
  }
210
210
  /**
211
- * Mechanical limits of the Tiny 2's gimbal, in degrees. Hardware-verified.
211
+ * Limits of the Tiny 2's gimbal, in degrees: the pose the running platform can
212
+ * COMMAND. Hardware-verified.
212
213
  *
213
214
  * These live here rather than in the tool layer so there is exactly one
214
215
  * definition: `obsbot_gimbal_move` imports them for its own clamping. Two copies
215
216
  * of a bound that must agree is a defect waiting to happen.
216
217
  *
217
- * ±150 is the mechanical yaw range on EVERY platform, and these limits are not
218
- * platform-conditional. Measured 2026-07-25: commanded 145 reads back 145, and
219
- * 150 reads back 149. Position feedback comes from the camera's physical
220
- * encoder, which is a property of the hardware and does not vary by OS.
218
+ * ±150 is the mechanical yaw range on every platform. Measured 2026-07-25:
219
+ * commanded 145 reads back 145, and 150 reads back 149. Position feedback comes
220
+ * from the camera's physical encoder, which does not vary by OS.
221
221
  *
222
- * Do not "fix" this to 130. `transport/linux.ts` and `transport/macos.ts` record
223
- * a `CT_PANTILT_ABSOLUTE` range of ±468000 arcsec = ±130°, which reads like a
224
- * conflict and was raised as one during review. It is not: that is the range the
225
- * UVC control *advertises* — a descriptor value that under-reports the mechanism
226
- * it describes — not where the gimbal stops. Nothing clamps to it either;
227
- * `LinuxTransport.gimbalSet` writes `yawDeg * ARCSEC_PER_DEG` unclamped, so the
228
- * arcsec figure lives only in comments. See the spec's §8.
222
+ * The COMMANDABLE range does vary by OS, which is why the yaw limit is resolved
223
+ * per platform. `CT_PANTILT_ABSOLUTE` *advertises* ±468000 arcsec = ±130° — a
224
+ * descriptor value that under-reports the mechanism it describes — and on Linux
225
+ * uvcvideo silently clamps every write to the advertised range. Measured
226
+ * 2026-09-01: writes of 540000 and 504000 arcsec both return success and land
227
+ * at exactly 468000. A limit wider than the platform can command turns every
228
+ * aim past 130° into a guaranteed miss that also burns the closed-loop mover's
229
+ * one retry (`transport/linux.ts`), so on Linux the limit is the kernel's, not
230
+ * the mechanism's. macOS commands the control raw over USB and Windows goes
231
+ * through the vendor protocol; neither clamps, so both keep the mechanical
232
+ * bound. The mechanism still REACHES ±148–149° on every platform — speed moves,
233
+ * hand moves and AI tracking all park it past 130° and Linux live reads report
234
+ * it truthfully (measured -532800/+536400 arcsec at the stops) — so this bounds
235
+ * what may be commanded, never what a read may return. See the spec's §8.
236
+ *
237
+ * Pitch needs no per-platform split: the advertised ±324000 arcsec is exactly
238
+ * the mechanical ±90°.
229
239
  */
230
- export const GIMBAL_YAW_LIMIT_DEG = 150;
240
+ export function gimbalYawLimitDeg(platform = process.platform) {
241
+ return platform === "linux" ? 130 : 150;
242
+ }
243
+ export const GIMBAL_YAW_LIMIT_DEG = gimbalYawLimitDeg();
231
244
  export const GIMBAL_PITCH_LIMIT_DEG = 90;
232
245
  const clampTo = (value, limit) => Math.min(limit, Math.max(-limit, value));
233
246
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"aim.js","sourceRoot":"","sources":["../../src/geometry/aim.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,gFAAgF;AAChF,2DAA2D;AAC3D,EAAE;AACF,2EAA2E;AAC3E,yBAAyB;AAmCzB,MAAM,KAAK,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;AAC7D,MAAM,KAAK,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,CAAC;AAEhC;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAA4B;IACxD,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,OAAO;IACf,MAAM,EAAE,OAAO;CAChB,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAA4B;IACzD,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACvF,MAAM,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC3F,MAAM,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;CAC5F,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,KAAK,CAAC;AAEjD,gFAAgF;AAChF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AACnC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAEnC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;AAEnF,gFAAgF;AAChF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AAE7E,iFAAiF;AACjF,iFAAiF;AACjF,oEAAoE;AACpE,EAAE;AACF,kFAAkF;AAClF,gFAAgF;AAChF,gFAAgF;AAChF,6EAA6E;AAC7E,+EAA+E;AAC/E,4EAA4E;AAC5E,8EAA8E;AAC9E,kFAAkF;AAClF,4EAA4E;AAC5E,6EAA6E;AAC7E,2EAA2E;AAC3E,WAAW;AACX,MAAM,iBAAiB,GAAG,CAAC,MAAc,EAAE,KAAY,EAAkC,EAAE;IACzF,IACE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC;QACtC,MAAM,CAAC,aAAa,GAAG,iBAAiB;QACxC,MAAM,CAAC,aAAa,GAAG,iBAAiB,EACxC,CAAC;QACD,MAAM,IAAI,UAAU,CAClB,mDAAmD,iBAAiB,KAAK,iBAAiB,UAAU,MAAM,CAAC,aAAa,EAAE,CAC3H,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,aAAa,CAAC;IACvE,8EAA8E;IAC9E,4EAA4E;IAC5E,4EAA4E;IAC5E,2EAA2E;IAC3E,uBAAuB;IACvB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,2BAA2B,EAAE,CAAC;AAC3F,CAAC,CAAC;AAEF,qFAAqF;AACrF,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,KAAY;IACrD,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACxD,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;AAClE,CAAC;AAOD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,aAAa,CAAC,CAAS,EAAE,CAAS,EAAE,KAAY,EAAE,MAAc;IAC9E,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACxD,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;IACpC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,OAAO;QACL,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;QACpC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;KACnC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACxC,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAuBzC,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,KAAa,EAAU,EAAE,CACvD,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;AAE3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,UAAU,UAAU,CACxB,CAAS,EACT,CAAS,EACT,KAAY,EACZ,MAAc,EACd,OAAa;IAEb,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACxD,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;IACpC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtC,wEAAwE;IACxE,MAAM,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,GAAG,CAAC,CAAC;IACb,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAEjD,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IACxC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IACxC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1C,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAE1C,oEAAoE;IACpE,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAClB,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IACpC,iEAAiE;IACjE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAC7B,MAAM,EAAE,GAAG,EAAE,CAAC;IACd,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAE7B,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,4EAA4E;IAC5E,2EAA2E;IAC3E,2EAA2E;IAC3E,uDAAuD;IACvD,EAAE;IACF,yEAAyE;IACzE,2EAA2E;IAC3E,2EAA2E;IAC3E,yEAAyE;IACzE,0EAA0E;IAC1E,wEAAwE;IACxE,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,WAAW,GAAG,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;IAE3F,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC;IAExD,0EAA0E;IAC1E,6EAA6E;IAC7E,2EAA2E;IAC3E,4EAA4E;IAC5E,4EAA4E;IAC5E,6EAA6E;IAC7E,8DAA8D;IAC9D,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;IACf,MAAM,EAAE,GAAG,EAAE,CAAC;IACd,MAAM,UAAU,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAEzC,OAAO;QACL,MAAM,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE;QACtB,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,KAAK,EAAE;QACxE,OAAO,EAAE,GAAG,KAAK,MAAM,IAAI,KAAK,KAAK,QAAQ;QAC7C,UAAU;KACX,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"aim.js","sourceRoot":"","sources":["../../src/geometry/aim.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export interface BuildId {
2
+ /** package.json version. For log lines only — it takes no part in ordering. */
3
+ version: string;
4
+ /** Milliseconds since the epoch, taken when the stamp was written. */
5
+ builtAt: number;
6
+ /** SHA-256 (hex) of the code this build can run, or UNSTAMPED_DIGEST. */
7
+ digest: string;
8
+ }
9
+ export declare const UNSTAMPED_DIGEST = "unstamped";
10
+ /** A build with no stamp file: older than every stamped build, equal to every other unstamped one. */
11
+ export declare function unstampedBuild(): BuildId;
12
+ /** Is this a well-formed identity? Used on the stamp file and on what a peer sends. */
13
+ export declare function isBuildId(x: unknown): x is BuildId;
14
+ /** dist/ipc/build-id.js → dist/build-info.json */
15
+ export declare function defaultBuildInfoPath(): string;
16
+ /** Read the stamp. A missing or malformed file is an unstamped build, never an error. */
17
+ export declare function loadBuildId(path?: string): BuildId;
18
+ /**
19
+ * Order two builds. Positive: `a` is newer. Negative: `b` is newer. Zero: the
20
+ * same build. Both sides of a connection run this on the same two identities,
21
+ * so it must be a total order that cannot disagree with itself.
22
+ */
23
+ export declare function compareBuilds(a: BuildId, b: BuildId): number;
24
+ /** `<version>/<builtAt as ISO 8601>/<first 8 of digest>`, or `<version>/unstamped`. */
25
+ export declare function buildLabel(b: BuildId): string;
@@ -0,0 +1,60 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { fileURLToPath } from "node:url";
3
+ import { dirname, join } from "node:path";
4
+ import { VERSION } from "../version.js";
5
+ export const UNSTAMPED_DIGEST = "unstamped";
6
+ const DIGEST_RE = /^[0-9a-f]{64}$/;
7
+ /** A build with no stamp file: older than every stamped build, equal to every other unstamped one. */
8
+ export function unstampedBuild() {
9
+ return { version: VERSION, builtAt: 0, digest: UNSTAMPED_DIGEST };
10
+ }
11
+ /** Is this a well-formed identity? Used on the stamp file and on what a peer sends. */
12
+ export function isBuildId(x) {
13
+ if (typeof x !== "object" || x === null)
14
+ return false;
15
+ const b = x;
16
+ if (typeof b.version !== "string" || b.version.length === 0)
17
+ return false;
18
+ if (typeof b.builtAt !== "number" || !Number.isFinite(b.builtAt) || b.builtAt < 0)
19
+ return false;
20
+ if (typeof b.digest !== "string")
21
+ return false;
22
+ return b.digest === UNSTAMPED_DIGEST ? b.builtAt === 0 : DIGEST_RE.test(b.digest);
23
+ }
24
+ /** dist/ipc/build-id.js → dist/build-info.json */
25
+ export function defaultBuildInfoPath() {
26
+ return join(dirname(fileURLToPath(import.meta.url)), "..", "build-info.json");
27
+ }
28
+ /** Read the stamp. A missing or malformed file is an unstamped build, never an error. */
29
+ export function loadBuildId(path = defaultBuildInfoPath()) {
30
+ try {
31
+ const raw = JSON.parse(readFileSync(path, "utf8"));
32
+ if (isBuildId(raw) && raw.digest !== UNSTAMPED_DIGEST) {
33
+ return { version: raw.version, builtAt: raw.builtAt, digest: raw.digest };
34
+ }
35
+ }
36
+ catch {
37
+ // missing, unreadable, or not JSON
38
+ }
39
+ return unstampedBuild();
40
+ }
41
+ /**
42
+ * Order two builds. Positive: `a` is newer. Negative: `b` is newer. Zero: the
43
+ * same build. Both sides of a connection run this on the same two identities,
44
+ * so it must be a total order that cannot disagree with itself.
45
+ */
46
+ export function compareBuilds(a, b) {
47
+ if (a.digest === b.digest)
48
+ return 0;
49
+ if (a.builtAt !== b.builtAt)
50
+ return a.builtAt > b.builtAt ? 1 : -1;
51
+ return a.digest > b.digest ? 1 : -1;
52
+ }
53
+ /** `<version>/<builtAt as ISO 8601>/<first 8 of digest>`, or `<version>/unstamped`. */
54
+ export function buildLabel(b) {
55
+ if (b.digest === UNSTAMPED_DIGEST)
56
+ return `${b.version}/unstamped`;
57
+ const iso = new Date(b.builtAt).toISOString().replace(/\.\d{3}Z$/, "Z");
58
+ return `${b.version}/${iso}/${b.digest.slice(0, 8)}`;
59
+ }
60
+ //# sourceMappingURL=build-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-id.js","sourceRoot":"","sources":["../../src/ipc/build-id.ts"],"names":[],"mappings":"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"}