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.
- package/README.md +111 -20
- package/dist/build-info.json +5 -0
- package/dist/device/manager.d.ts +8 -0
- package/dist/device/manager.js +37 -4
- package/dist/device/manager.js.map +1 -1
- package/dist/geometry/aim.d.ts +24 -13
- package/dist/geometry/aim.js +26 -13
- package/dist/geometry/aim.js.map +1 -1
- package/dist/ipc/build-id.d.ts +25 -0
- package/dist/ipc/build-id.js +60 -0
- package/dist/ipc/build-id.js.map +1 -0
- package/dist/ipc/client.d.ts +36 -0
- package/dist/ipc/client.js +106 -4
- package/dist/ipc/client.js.map +1 -1
- package/dist/ipc/coordinator.d.ts +91 -12
- package/dist/ipc/coordinator.js +293 -57
- package/dist/ipc/coordinator.js.map +1 -1
- package/dist/ipc/gate.d.ts +14 -0
- package/dist/ipc/gate.js +45 -0
- package/dist/ipc/gate.js.map +1 -0
- package/dist/ipc/owner.d.ts +27 -1
- package/dist/ipc/owner.js +67 -4
- package/dist/ipc/owner.js.map +1 -1
- package/dist/ipc/protocol.d.ts +30 -0
- package/dist/ipc/protocol.js +40 -0
- package/dist/ipc/protocol.js.map +1 -1
- package/dist/ipc/rendezvous.d.ts +37 -11
- package/dist/ipc/rendezvous.js +143 -30
- package/dist/ipc/rendezvous.js.map +1 -1
- package/dist/mcp/server.js +40 -12
- package/dist/mcp/server.js.map +1 -1
- package/dist/tail2/api.d.ts +381 -0
- package/dist/tail2/api.js +547 -0
- package/dist/tail2/api.js.map +1 -0
- package/dist/tail2/mdns.d.ts +48 -0
- package/dist/tail2/mdns.js +216 -0
- package/dist/tail2/mdns.js.map +1 -0
- package/dist/tail2/move.d.ts +41 -0
- package/dist/tail2/move.js +79 -0
- package/dist/tail2/move.js.map +1 -0
- package/dist/tail2/registry.d.ts +100 -0
- package/dist/tail2/registry.js +200 -0
- package/dist/tail2/registry.js.map +1 -0
- package/dist/tail2/snapshot.d.ts +54 -0
- package/dist/tail2/snapshot.js +157 -0
- package/dist/tail2/snapshot.js.map +1 -0
- package/dist/tail2/tools.d.ts +7 -0
- package/dist/tail2/tools.js +772 -0
- package/dist/tail2/tools.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/native/prebuilt/darwin-arm64/obsbot-helper +0 -0
- package/native/prebuilt/darwin-x64/obsbot-helper +0 -0
- package/native/prebuilt/linux-x64/obsbot-helper +0 -0
- package/native/prebuilt/win32-x64/obsbot-helper.exe +0 -0
- package/package.json +4 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tail2/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
/**
|
|
3
|
+
* Pull one still frame from a Tail 2's video output with ffmpeg.
|
|
4
|
+
*
|
|
5
|
+
* Primary source: the camera's SRT listener (the one streaming output this
|
|
6
|
+
* firmware actually serves; TAIL2-PROTOCOL.md §9) — requires Center's SRT
|
|
7
|
+
* toggle, exclusive with NDI. Because that toggle is a human-in-the-GUI step
|
|
8
|
+
* and this server is driven by AI agents that should stay autonomous, the
|
|
9
|
+
* fallback layer grabs from the NDI Tools "NDI Webcam" DirectShow device
|
|
10
|
+
* instead (Windows only): if the bridge is running and pointed at the
|
|
11
|
+
* camera's NDI feed, ffmpeg can read it directly and no Center trip is
|
|
12
|
+
* needed. When neither source is live, `snapshotOptions()` reports what it
|
|
13
|
+
* found and what each path costs, so the calling agent can pick.
|
|
14
|
+
*
|
|
15
|
+
* Note Center only allows changing streaming settings while the output is
|
|
16
|
+
* OFF, so probes landing in a configuration window see a dead port — not a
|
|
17
|
+
* startup delay (an earlier "minutes to bind" claim here was wrong and is
|
|
18
|
+
* retracted).
|
|
19
|
+
*/
|
|
20
|
+
export interface SrtSnapshotOpts {
|
|
21
|
+
maxDim?: number;
|
|
22
|
+
quality?: number;
|
|
23
|
+
port?: number;
|
|
24
|
+
streamId?: string;
|
|
25
|
+
/** Socket I/O budget for ffmpeg, ms. Generous: SRT handshake + first keyframe. */
|
|
26
|
+
timeoutMs?: number;
|
|
27
|
+
}
|
|
28
|
+
export interface SrtSnapshot {
|
|
29
|
+
mime: string;
|
|
30
|
+
width: number;
|
|
31
|
+
height: number;
|
|
32
|
+
base64: string;
|
|
33
|
+
}
|
|
34
|
+
export declare class SrtNotEnabledError extends Error {
|
|
35
|
+
constructor();
|
|
36
|
+
}
|
|
37
|
+
export declare function srtSnapshot(host: string, opts?: SrtSnapshotOpts, spawnImpl?: typeof spawn): Promise<SrtSnapshot>;
|
|
38
|
+
/**
|
|
39
|
+
* Grab a frame from the NDI Tools "NDI Webcam" DirectShow device (Windows
|
|
40
|
+
* only). NOT used by the snapshot tool automatically: on the reference
|
|
41
|
+
* machine (2026-09-26) the bridge's user-configured output slots delivered
|
|
42
|
+
* uniformly black frames to ffmpeg (YAVG=YMAX=16) while other slots hung,
|
|
43
|
+
* and probing the devices disrupts the app. Kept for manual/verified use —
|
|
44
|
+
* if a slot is confirmed live (e.g. previews correctly in OBS), this works.
|
|
45
|
+
* Never force-kill the Webcam app: that corrupts its output-slot config.
|
|
46
|
+
*/
|
|
47
|
+
export declare function ndiWebcamSnapshot(opts?: {
|
|
48
|
+
maxDim?: number;
|
|
49
|
+
quality?: number;
|
|
50
|
+
timeoutMs?: number;
|
|
51
|
+
}, spawnImpl?: typeof spawn): Promise<SrtSnapshot | null>;
|
|
52
|
+
/** Standard NDI Tools install location, for the options report. */
|
|
53
|
+
export declare const NDI_WEBCAM_EXE = "C:\\Program Files\\NDI\\NDI 6 Tools\\Webcam\\Webcam.exe";
|
|
54
|
+
export declare const ndiToolsInstalled: () => boolean;
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
export class SrtNotEnabledError extends Error {
|
|
4
|
+
constructor() {
|
|
5
|
+
super("the Tail 2's SRT output is not enabled. In OBSBOT Center switch the " +
|
|
6
|
+
"camera's streaming output to SRT (listener mode) first — note this " +
|
|
7
|
+
"disables NDI while active and does not survive a camera reboot. The " +
|
|
8
|
+
"listener serves immediately once enabled.");
|
|
9
|
+
this.name = "SrtNotEnabledError";
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
const JPEG_SOI = 0xffd8;
|
|
13
|
+
/** Parse width/height out of a JPEG's SOF0/SOF2 marker (avoids a second ffprobe). */
|
|
14
|
+
const jpegDims = (buf) => {
|
|
15
|
+
let i = 2;
|
|
16
|
+
while (i + 9 < buf.length) {
|
|
17
|
+
if (buf[i] !== 0xff) {
|
|
18
|
+
i++;
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
const marker = buf[i + 1];
|
|
22
|
+
if (marker === 0xd8 || (marker >= 0xd0 && marker <= 0xd9)) {
|
|
23
|
+
i += 2;
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
const len = buf.readUInt16BE(i + 2);
|
|
27
|
+
if (marker === 0xc0 || marker === 0xc2) {
|
|
28
|
+
return { height: buf.readUInt16BE(i + 5), width: buf.readUInt16BE(i + 7) };
|
|
29
|
+
}
|
|
30
|
+
i += 2 + len;
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
};
|
|
34
|
+
export async function srtSnapshot(host, opts = {}, spawnImpl = spawn) {
|
|
35
|
+
const maxDim = Math.round(opts.maxDim ?? 640);
|
|
36
|
+
const quality = Math.round(opts.quality ?? 80);
|
|
37
|
+
const port = opts.port ?? 5000;
|
|
38
|
+
const streamId = opts.streamId ?? "mainstream";
|
|
39
|
+
const timeoutMs = opts.timeoutMs ?? 20000;
|
|
40
|
+
const url = `srt://${host}:${port}?mode=caller&latency=120&streamid=${streamId}`;
|
|
41
|
+
const args = [
|
|
42
|
+
"-hide_banner", "-loglevel", "error",
|
|
43
|
+
"-rw_timeout", String(timeoutMs * 1000),
|
|
44
|
+
"-i", url,
|
|
45
|
+
"-frames:v", "1",
|
|
46
|
+
"-vf", `scale='min(${maxDim},iw)':-2`,
|
|
47
|
+
"-q:v", String(Math.max(2, Math.min(31, Math.round(31 - (quality * 29) / 100)))),
|
|
48
|
+
"-f", "image2", "-",
|
|
49
|
+
];
|
|
50
|
+
return new Promise((resolve, reject) => {
|
|
51
|
+
const child = spawnImpl("ffmpeg", args, { stdio: ["ignore", "pipe", "pipe"] });
|
|
52
|
+
const chunks = [];
|
|
53
|
+
let stderr = "";
|
|
54
|
+
const timer = setTimeout(() => {
|
|
55
|
+
child.kill();
|
|
56
|
+
reject(new Error(`SRT snapshot timed out after ${timeoutMs + 5000}ms — SRT is likely off or mid-configuration in Center (settings changes require the output to be off). Re-enable it and retry.`));
|
|
57
|
+
}, timeoutMs + 5000);
|
|
58
|
+
child.stdout?.on("data", (c) => chunks.push(c));
|
|
59
|
+
child.stderr?.on("data", (c) => (stderr += c.toString()));
|
|
60
|
+
child.on("error", (e) => {
|
|
61
|
+
clearTimeout(timer);
|
|
62
|
+
reject(new Error(`ffmpeg is required for Tail 2 snapshots and failed to run: ${e.message}. Install it (winget install Gyan.FFmpeg) and retry.`));
|
|
63
|
+
});
|
|
64
|
+
child.on("close", (code) => {
|
|
65
|
+
clearTimeout(timer);
|
|
66
|
+
const jpg = Buffer.concat(chunks);
|
|
67
|
+
if (code !== 0 || jpg.length < 4 || jpg.readUInt16BE(0) !== JPEG_SOI) {
|
|
68
|
+
reject(new Error(`SRT snapshot failed (ffmpeg exit ${code}): ${stderr.slice(0, 300) || "no frame"}`));
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const dims = jpegDims(jpg);
|
|
72
|
+
resolve({
|
|
73
|
+
mime: "image/jpeg",
|
|
74
|
+
width: dims?.width ?? 0,
|
|
75
|
+
height: dims?.height ?? 0,
|
|
76
|
+
base64: jpg.toString("base64"),
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Grab a frame from the NDI Tools "NDI Webcam" DirectShow device (Windows
|
|
83
|
+
* only). NOT used by the snapshot tool automatically: on the reference
|
|
84
|
+
* machine (2026-09-26) the bridge's user-configured output slots delivered
|
|
85
|
+
* uniformly black frames to ffmpeg (YAVG=YMAX=16) while other slots hung,
|
|
86
|
+
* and probing the devices disrupts the app. Kept for manual/verified use —
|
|
87
|
+
* if a slot is confirmed live (e.g. previews correctly in OBS), this works.
|
|
88
|
+
* Never force-kill the Webcam app: that corrupts its output-slot config.
|
|
89
|
+
*/
|
|
90
|
+
export async function ndiWebcamSnapshot(opts = {}, spawnImpl = spawn) {
|
|
91
|
+
if (process.platform !== "win32")
|
|
92
|
+
return null;
|
|
93
|
+
// The virtual devices stay registered even when the bridge app is closed
|
|
94
|
+
// (and list four slots whose signal-bearing one varies across restarts —
|
|
95
|
+
// measured 2026-09-26), so without the app running an attempt is just a
|
|
96
|
+
// guaranteed hang. Guard on the process first.
|
|
97
|
+
const running = await new Promise((resolve) => {
|
|
98
|
+
const child = spawnImpl("tasklist", ["/FI", "IMAGENAME eq Webcam.exe", "/NH"], { stdio: ["ignore", "pipe", "ignore"] });
|
|
99
|
+
let out = "";
|
|
100
|
+
const timer = setTimeout(() => { child.kill(); resolve(false); }, 5000);
|
|
101
|
+
child.stdout?.on("data", (c) => (out += c.toString()));
|
|
102
|
+
child.on("error", () => { clearTimeout(timer); resolve(false); });
|
|
103
|
+
child.on("close", () => { clearTimeout(timer); resolve(/webcam\.exe/i.test(out)); });
|
|
104
|
+
});
|
|
105
|
+
if (!running)
|
|
106
|
+
return null;
|
|
107
|
+
const maxDim = Math.round(opts.maxDim ?? 640);
|
|
108
|
+
const quality = Math.round(opts.quality ?? 80);
|
|
109
|
+
const timeoutMs = opts.timeoutMs ?? 15000;
|
|
110
|
+
// Enumerate DirectShow video devices; find the NDI Webcam bridge.
|
|
111
|
+
const listed = await new Promise((resolve) => {
|
|
112
|
+
let out = "";
|
|
113
|
+
const child = spawnImpl("ffmpeg", ["-hide_banner", "-list_devices", "true", "-f", "dshow", "-i", "dummy"], { stdio: ["ignore", "ignore", "pipe"] });
|
|
114
|
+
const timer = setTimeout(() => { child.kill(); resolve(""); }, 10000);
|
|
115
|
+
child.stderr?.on("data", (c) => (out += c.toString()));
|
|
116
|
+
child.on("error", () => { clearTimeout(timer); resolve(""); });
|
|
117
|
+
child.on("close", () => { clearTimeout(timer); resolve(out); });
|
|
118
|
+
});
|
|
119
|
+
const m = /"([^"]*NDI Webcam[^"]*)"/i.exec(listed);
|
|
120
|
+
if (!m)
|
|
121
|
+
return null;
|
|
122
|
+
const device = m[1];
|
|
123
|
+
return new Promise((resolve) => {
|
|
124
|
+
const child = spawnImpl("ffmpeg", [
|
|
125
|
+
"-hide_banner", "-loglevel", "error",
|
|
126
|
+
"-rtbufsize", "100M",
|
|
127
|
+
"-f", "dshow", "-i", `video=${device}`,
|
|
128
|
+
"-frames:v", "1",
|
|
129
|
+
"-vf", `scale='min(${maxDim},iw)':-2`,
|
|
130
|
+
"-q:v", String(Math.max(2, Math.min(31, Math.round(31 - (quality * 29) / 100)))),
|
|
131
|
+
"-f", "image2", "-",
|
|
132
|
+
], { stdio: ["ignore", "pipe", "pipe"] });
|
|
133
|
+
const chunks = [];
|
|
134
|
+
const timer = setTimeout(() => { child.kill(); resolve(null); }, timeoutMs);
|
|
135
|
+
child.stdout?.on("data", (c) => chunks.push(c));
|
|
136
|
+
child.on("error", () => { clearTimeout(timer); resolve(null); });
|
|
137
|
+
child.on("close", () => {
|
|
138
|
+
clearTimeout(timer);
|
|
139
|
+
const jpg = Buffer.concat(chunks);
|
|
140
|
+
if (jpg.length < 4 || jpg.readUInt16BE(0) !== JPEG_SOI) {
|
|
141
|
+
resolve(null);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const dims = jpegDims(jpg);
|
|
145
|
+
resolve({
|
|
146
|
+
mime: "image/jpeg",
|
|
147
|
+
width: dims?.width ?? 0,
|
|
148
|
+
height: dims?.height ?? 0,
|
|
149
|
+
base64: jpg.toString("base64"),
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
/** Standard NDI Tools install location, for the options report. */
|
|
155
|
+
export const NDI_WEBCAM_EXE = "C:\\Program Files\\NDI\\NDI 6 Tools\\Webcam\\Webcam.exe";
|
|
156
|
+
export const ndiToolsInstalled = () => existsSync(NDI_WEBCAM_EXE);
|
|
157
|
+
//# sourceMappingURL=snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/tail2/snapshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ToolDef } from "../mcp/tools.js";
|
|
2
|
+
import type { Tail2Registry } from "./registry.js";
|
|
3
|
+
import { type SrtSnapshot } from "./snapshot.js";
|
|
4
|
+
export declare function createTail2Tools(registry: Tail2Registry, grab?: (host: string, o: {
|
|
5
|
+
maxDim: number;
|
|
6
|
+
quality: number;
|
|
7
|
+
}) => Promise<SrtSnapshot>): ToolDef[];
|