robopark 3.3.35 → 3.3.37

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 (46) hide show
  1. package/dist/robopark/add-robot.js +2 -2
  2. package/dist/robopark/add-robot.js.map +1 -1
  3. package/dist/robopark/kiosk-browser.js +145 -0
  4. package/dist/robopark/kiosk-browser.js.map +1 -0
  5. package/dist/robopark/start.js +295 -0
  6. package/dist/robopark/start.js.map +1 -0
  7. package/dist/robopark/voice-list.js +23 -12
  8. package/dist/robopark/voice-list.js.map +1 -1
  9. package/dist/robopark-cli.js +21 -0
  10. package/dist/robopark-cli.js.map +1 -1
  11. package/package.json +7 -3
  12. package/scheduler/main.py +150 -30
  13. package/scheduler/static/voice-join.html +1 -1
  14. package/ui/standalone/.next/BUILD_ID +1 -1
  15. package/ui/standalone/.next/app-build-manifest.json +63 -63
  16. package/ui/standalone/.next/app-path-routes-manifest.json +18 -18
  17. package/ui/standalone/.next/build-manifest.json +2 -2
  18. package/ui/standalone/.next/server/app/api/robovoice/robots/[robotId]/media-health/route.js +1 -1
  19. package/ui/standalone/.next/server/app/fed/[...path]/route.js +2 -2
  20. package/ui/standalone/.next/server/app/fed/media/robots/[robotId]/video_feed/route.js +1 -1
  21. package/ui/standalone/.next/server/app/robopark/[...path]/route.js +1 -1
  22. package/ui/standalone/.next/server/app/robopark/api/[...path]/route.js +1 -1
  23. package/ui/standalone/.next/server/app/robopark/api/robots/[robotId]/stream/route.js +1 -1
  24. package/ui/standalone/.next/server/app-paths-manifest.json +18 -18
  25. package/ui/standalone/.next/server/functions-config-manifest.json +1 -1
  26. package/ui/standalone/.next/server/pages/500.html +1 -1
  27. package/ui/standalone/.next/server/pages-manifest.json +1 -1
  28. package/ui/standalone/public/tailnet/index.html +31 -1
  29. package/scheduler/__pycache__/main.cpython-312.pyc +0 -0
  30. package/ui/standalone/.next/server/chunks/5123.js +0 -11
  31. package/ui/standalone/.next/server/chunks/7661.js +0 -11
  32. package/ui/standalone/.next/static/Xg-e8h70WpdFcsZ2vcfOG/_buildManifest.js +0 -1
  33. package/ui/standalone/.next/static/Xg-e8h70WpdFcsZ2vcfOG/_ssgManifest.js +0 -1
  34. package/ui/standalone/.next/static/chunks/app/(app)/voice/page-d98593eea4888404.js +0 -1
  35. package/ui/standalone/.next/static/chunks/app/_not-found/page-9f0acae7481c60bb.js +0 -1
  36. package/ui/standalone/.next/static/chunks/app/layout-4829e027e68fded4.js +0 -1
  37. package/ui/standalone/.next/static/chunks/app/voice-tester/page-f5ad3acef9248b78.js +0 -1
  38. package/ui/standalone/.next/static/chunks/main-app-f2b2a716b0f3924b.js +0 -1
  39. package/ui/standalone/.next/static/gGysrZrp8HXGK_0MbZa9v/_buildManifest.js +0 -1
  40. package/ui/standalone/.next/static/gGysrZrp8HXGK_0MbZa9v/_ssgManifest.js +0 -1
  41. package/ui/standalone/.next/static/tDI_bBJ7vZjqqxcXg1GZn/_buildManifest.js +0 -1
  42. package/ui/standalone/.next/static/tDI_bBJ7vZjqqxcXg1GZn/_ssgManifest.js +0 -1
  43. package/ui/standalone/.next/static/zAWQgn-m46BFpT3z33lh-/_buildManifest.js +0 -1
  44. package/ui/standalone/.next/static/zAWQgn-m46BFpT3z33lh-/_ssgManifest.js +0 -1
  45. /package/ui/standalone/.next/static/{KwY1YC79lI9nQqOVYXOmY → 8E9-VDckMmTbkbuwnaatU}/_buildManifest.js +0 -0
  46. /package/ui/standalone/.next/static/{KwY1YC79lI9nQqOVYXOmY → 8E9-VDckMmTbkbuwnaatU}/_ssgManifest.js +0 -0
@@ -24,7 +24,7 @@
24
24
  import chalk from 'chalk';
25
25
  import { resolveContext } from './profile.js';
26
26
  import { roboparkSetup } from './setup.js';
27
- function robotReachableSchedulerUrl(schedulerUrl, hubUrl) {
27
+ export function robotReachableSchedulerUrl(schedulerUrl, hubUrl) {
28
28
  if (!hubUrl)
29
29
  return schedulerUrl;
30
30
  try {
@@ -41,7 +41,7 @@ function robotReachableSchedulerUrl(schedulerUrl, hubUrl) {
41
41
  }
42
42
  return schedulerUrl;
43
43
  }
44
- function schedulerApiUrl(schedulerUrl, path, token) {
44
+ export function schedulerApiUrl(schedulerUrl, path, token) {
45
45
  const url = new URL(`${schedulerUrl.replace(/\/+$/, '')}${path}`);
46
46
  if (token && url.pathname.startsWith('/robopark/')) {
47
47
  url.searchParams.set('token', token);
@@ -1 +1 @@
1
- {"version":3,"file":"add-robot.js","sourceRoot":"","sources":["../../src/robopark/add-robot.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"add-robot.js","sourceRoot":"","sources":["../../src/robopark/add-robot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * RoboPark — kiosk browser launch.
3
+ *
4
+ * `robopark start <robot>` has to end with the live call page actually open on
5
+ * the kiosk, with the camera and microphone already granted: there is nobody
6
+ * standing at the machine to click "Allow".
7
+ *
8
+ * The POSIX installers (scripts/install-firefox-robot-kiosk.sh,
9
+ * ui/standalone/public/install-robot-kiosk.sh) do this with a root-installed
10
+ * Firefox policies.json that pre-grants Camera/Microphone for one origin and
11
+ * unblocks autoplay. That needs sudo and a writable install directory, neither
12
+ * of which exists on the Windows kiosks, so the same grants are expressed here
13
+ * per-browser-family and per-launch instead:
14
+ * - Chromium family: --use-fake-ui-for-media-stream (auto-accept getUserMedia
15
+ * against the REAL devices; the "fake" is the picker UI, not the camera)
16
+ * plus --autoplay-policy=no-user-gesture-required.
17
+ * - Firefox: a dedicated profile whose user.js sets
18
+ * permissions.default.camera/microphone=1 and the same autoplay prefs the
19
+ * policy file locks.
20
+ */
21
+ import { spawn } from 'node:child_process';
22
+ import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
23
+ import { homedir } from 'node:os';
24
+ import { join } from 'node:path';
25
+ const WINDOWS_CANDIDATES = [
26
+ 'C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe',
27
+ 'C:\\Program Files\\Microsoft\\Edge\\Application\\msedge.exe',
28
+ 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe',
29
+ 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe',
30
+ 'C:\\Program Files\\BraveSoftware\\Brave-Browser\\Application\\brave.exe',
31
+ 'C:\\Program Files\\Chromium\\Application\\chrome.exe',
32
+ 'C:\\Program Files\\Mozilla Firefox\\firefox.exe',
33
+ 'C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe',
34
+ ];
35
+ const POSIX_CANDIDATES = [
36
+ '/usr/bin/chromium-browser',
37
+ '/usr/bin/chromium',
38
+ '/usr/bin/google-chrome',
39
+ '/usr/bin/microsoft-edge',
40
+ '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
41
+ '/usr/bin/firefox',
42
+ '/usr/bin/firefox-esr',
43
+ '/Applications/Firefox.app/Contents/MacOS/firefox',
44
+ ];
45
+ export function browserFamily(exe) {
46
+ return /firefox/i.test(exe) ? 'firefox' : 'chromium';
47
+ }
48
+ /** First installed kiosk-capable browser, or null. Chromium family wins: its
49
+ * permission grants are per-launch flags and need no elevation. */
50
+ export function findBrowser(override) {
51
+ if (override)
52
+ return existsSync(override) ? override : null;
53
+ const fromEnv = process.env.ROBOPARK_BROWSER;
54
+ if (fromEnv && existsSync(fromEnv))
55
+ return fromEnv;
56
+ const candidates = process.platform === 'win32' ? WINDOWS_CANDIDATES : POSIX_CANDIDATES;
57
+ return candidates.find(existsSync) ?? null;
58
+ }
59
+ function originOf(url) {
60
+ try {
61
+ return new URL(url).origin;
62
+ }
63
+ catch {
64
+ return '';
65
+ }
66
+ }
67
+ /**
68
+ * getUserMedia is unavailable on a plain-http origin that is not loopback, so a
69
+ * hub reached as http://HUB:8080 can never grant the camera no matter how the
70
+ * permission is pre-set. Chromium's origin allowlist is the only way to make
71
+ * that origin a secure context without a certificate.
72
+ */
73
+ function needsInsecureOriginOverride(url) {
74
+ try {
75
+ const parsed = new URL(url);
76
+ if (parsed.protocol !== 'http:')
77
+ return false;
78
+ return !['localhost', '127.0.0.1', '::1', ''].includes(parsed.hostname);
79
+ }
80
+ catch {
81
+ return false;
82
+ }
83
+ }
84
+ function firefoxProfile(dir, url) {
85
+ mkdirSync(dir, { recursive: true });
86
+ const prefs = [
87
+ ['permissions.default.camera', '1'],
88
+ ['permissions.default.microphone', '1'],
89
+ ['media.autoplay.default', '0'],
90
+ ['media.autoplay.blocking_policy', '0'],
91
+ ['media.navigator.permission.disabled', 'true'],
92
+ // Same reason as the Chromium allowlist above: without these a plain-http
93
+ // hub origin has no navigator.mediaDevices at all.
94
+ ['media.devices.insecure.enabled', needsInsecureOriginOverride(url) ? 'true' : 'false'],
95
+ ['media.getusermedia.insecure.enabled', needsInsecureOriginOverride(url) ? 'true' : 'false'],
96
+ ['browser.shell.checkDefaultBrowser', 'false'],
97
+ ['datareporting.policy.firstRunURL', '""'],
98
+ ];
99
+ writeFileSync(join(dir, 'user.js'), prefs.map(([k, v]) => `user_pref("${k}", ${v});`).join('\n') + '\n', 'utf8');
100
+ }
101
+ /**
102
+ * The exact executable + argv for a kiosk call page, without spawning.
103
+ *
104
+ * Split out so the command line can be printed and reviewed; `launchKiosk`
105
+ * only adds the spawn.
106
+ */
107
+ export function kioskLaunch(exe, url, robot) {
108
+ const family = browserFamily(exe);
109
+ const profileDir = join(homedir(), '.robopark', `kiosk-${robot.replace(/[^a-zA-Z0-9_-]/g, '_')}-${family}`);
110
+ if (family === 'firefox') {
111
+ return { exe, args: ['-profile', profileDir, '--kiosk', url], family, profileDir };
112
+ }
113
+ const args = [
114
+ // A dedicated profile is load-bearing, not hygiene: launching Chromium
115
+ // while the operator's normal browser is running otherwise just hands the
116
+ // URL to that process and every permission flag below is silently dropped.
117
+ `--user-data-dir=${profileDir}`,
118
+ '--use-fake-ui-for-media-stream',
119
+ '--autoplay-policy=no-user-gesture-required',
120
+ '--no-first-run',
121
+ '--no-default-browser-check',
122
+ '--disable-session-crashed-bubble',
123
+ '--kiosk',
124
+ ];
125
+ if (needsInsecureOriginOverride(url)) {
126
+ args.push(`--unsafely-treat-insecure-origin-as-secure=${originOf(url)}`);
127
+ }
128
+ args.push(url);
129
+ return { exe, args, family, profileDir };
130
+ }
131
+ /** Shell-ish rendering of a launch, for logging. */
132
+ export function launchCommandLine(launch) {
133
+ return [launch.exe, ...launch.args]
134
+ .map(a => (/[\s"]/.test(a) ? `"${a.replace(/"/g, '\\"')}"` : a))
135
+ .join(' ');
136
+ }
137
+ export function launchKiosk(launch, url) {
138
+ if (launch.family === 'firefox')
139
+ firefoxProfile(launch.profileDir, url);
140
+ else
141
+ mkdirSync(launch.profileDir, { recursive: true });
142
+ const proc = spawn(launch.exe, launch.args, { stdio: 'ignore', detached: true });
143
+ proc.unref();
144
+ }
145
+ //# sourceMappingURL=kiosk-browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kiosk-browser.js","sourceRoot":"","sources":["../../src/robopark/kiosk-browser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,295 @@
1
+ /**
2
+ * RoboPark — `robopark start <robot>`.
3
+ *
4
+ * One command on a kiosk: bring the local camera up and make it visible in the
5
+ * control center.
6
+ *
7
+ * This deliberately targets the MJPEG relay
8
+ * (`/fed/media/robots/<id>/video_feed` → `http://<host>:<visionPort>/video_feed`)
9
+ * rather than the LiveKit publisher path. MJPEG is one plain HTTP stream with
10
+ * no token, no room name, and no WebSocket for a publisher and a subscriber to
11
+ * agree on — which is where the publisher path kept failing. The camera grid
12
+ * already renders that URL in an <img>, so nothing downstream has to change.
13
+ *
14
+ * Hub/scheduler context comes from the profile `robopark hub-use` already
15
+ * saves; this command introduces no configuration of its own.
16
+ */
17
+ import { hostname } from 'node:os';
18
+ import chalk from 'chalk';
19
+ import { robotReachableSchedulerUrl, schedulerApiUrl } from './add-robot.js';
20
+ import { findBrowser, kioskLaunch, launchCommandLine, launchKiosk } from './kiosk-browser.js';
21
+ import { loadHubProfile } from './profile.js';
22
+ import { resolveTailnet } from './tailscale.js';
23
+ import { roboparkVisionAgent } from './vision-agent-launcher.js';
24
+ import { roboparkVisionUp } from './vision-control.js';
25
+ import { characterCallUrl } from './voice-list.js';
26
+ const DEFAULT_VISION_PORT = 5000;
27
+ const DEFAULT_MESH_PORT = 47913;
28
+ const READY_TIMEOUT_MS = 30_000;
29
+ const READY_POLL_MS = 1_000;
30
+ const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
31
+ /**
32
+ * True once the local vision server actually answers on /video_feed.
33
+ *
34
+ * The body is an endless multipart stream, so it must be cancelled rather than
35
+ * read: awaiting it would never resolve and the probe would look like a hang
36
+ * instead of a success.
37
+ */
38
+ async function feedReady(port) {
39
+ const controller = new AbortController();
40
+ const timer = setTimeout(() => controller.abort(), 4_000);
41
+ try {
42
+ const res = await fetch(`http://127.0.0.1:${port}/video_feed`, { signal: controller.signal });
43
+ await res.body?.cancel();
44
+ return res.ok;
45
+ }
46
+ catch {
47
+ return false;
48
+ }
49
+ finally {
50
+ clearTimeout(timer);
51
+ }
52
+ }
53
+ async function waitForFeed(port) {
54
+ const deadline = Date.now() + READY_TIMEOUT_MS;
55
+ while (Date.now() < deadline) {
56
+ if (await feedReady(port))
57
+ return true;
58
+ await sleep(READY_POLL_MS);
59
+ }
60
+ return false;
61
+ }
62
+ /**
63
+ * This machine's mesh identity, or null when no node is listening.
64
+ *
65
+ * The relay resolves a robot to a peer by nodeId or displayName
66
+ * (kernel/federation/transport-http.js), so this is the only thing that decides
67
+ * whether the mesh RELAY branch of /fed/media/robots/<name>/video_feed reaches
68
+ * this kiosk (the direct scheduler path does not go through here at all).
69
+ *
70
+ * KNOWN FALSE NEGATIVE: relay-role nodes dial the hub outbound and never listen
71
+ * on 47913 locally, so an already-enrolled machine (this laptop is on the mesh
72
+ * as `jaguar`, with nothing bound to 47913) reports "not enrolled" here and
73
+ * would be re-enrolled. Left as-is rather than guessed at: distinguishing the
74
+ * two needs a hub-side membership query this command does not have. It is no
75
+ * longer reachable by default now that enrollment is opt-in behind --mesh.
76
+ */
77
+ async function meshIdentity(token) {
78
+ try {
79
+ const res = await fetch(`http://127.0.0.1:${DEFAULT_MESH_PORT}/fed/manifest`, {
80
+ headers: token ? { authorization: `Bearer ${token}` } : {},
81
+ signal: AbortSignal.timeout(4_000),
82
+ });
83
+ if (!res.ok)
84
+ return null;
85
+ const manifest = (await res.json());
86
+ if (!manifest?.nodeId)
87
+ return null;
88
+ return { nodeId: String(manifest.nodeId), displayName: String(manifest.displayName ?? '') };
89
+ }
90
+ catch {
91
+ return null;
92
+ }
93
+ }
94
+ /**
95
+ * Ensure this machine is on the mesh as `name`, enrolling only if it is not.
96
+ *
97
+ * Enrolling reconfigures and restarts the local node, which is far heavier than
98
+ * anything else this command does — so it is announced, and it is skipped
99
+ * outright when a node is already answering under the right name. A node
100
+ * running under a DIFFERENT name is left strictly alone: renaming it would
101
+ * silently move an already-working robot, so this stops and says so instead.
102
+ */
103
+ async function ensureMesh(config, name, token) {
104
+ const identity = await meshIdentity(token);
105
+ if (identity) {
106
+ const wanted = name.toLowerCase();
107
+ if (identity.nodeId.toLowerCase() === wanted || identity.displayName.toLowerCase() === wanted) {
108
+ console.log(chalk.dim(` mesh: already enrolled as '${identity.displayName || identity.nodeId}' — skipping`));
109
+ return;
110
+ }
111
+ throw new Error(`a mesh node is already running on this machine as '${identity.displayName || identity.nodeId}', not '${name}'. ` +
112
+ `The camera relay resolves robots by that name, so rerun as \`robopark start ${identity.displayName || identity.nodeId}\`, ` +
113
+ 'or drop --mesh: video no longer needs mesh enrollment');
114
+ }
115
+ console.log(chalk.yellow(` mesh: no node on this machine — enrolling as '${name}' (this configures and starts the robot runtime)`));
116
+ await roboparkVisionUp(config, name, {});
117
+ if (!(await meshIdentity(token))) {
118
+ throw new Error(`enrollment finished but no mesh node answered on 127.0.0.1:${DEFAULT_MESH_PORT}`);
119
+ }
120
+ console.log(chalk.green(` ✓ enrolled on the mesh as '${name}'`));
121
+ }
122
+ /** This machine's address as another host on the fleet can reach it. */
123
+ function localHost() {
124
+ const { identity } = resolveTailnet();
125
+ return identity?.host ?? hostname().split('.')[0];
126
+ }
127
+ /**
128
+ * Ensure the scheduler knows this machine as `name`, with an address the
129
+ * control center can proxy to. Creates the device when it does not exist yet
130
+ * so a freshly imaged kiosk needs no separate enrollment step first.
131
+ */
132
+ async function registerDevice(schedulerUrl, name, host, token) {
133
+ const listed = await fetch(schedulerApiUrl(schedulerUrl, '/api/devices', token));
134
+ if (!listed.ok)
135
+ throw new Error(`scheduler returned ${listed.status} listing devices`);
136
+ const devices = (await listed.json());
137
+ const match = devices.find(d => String(d.name).toLowerCase() === name.toLowerCase() || String(d.id) === name);
138
+ let device = match;
139
+ let deviceId = match?.id;
140
+ if (!deviceId) {
141
+ const created = await fetch(schedulerApiUrl(schedulerUrl, '/api/devices', token), {
142
+ method: 'POST',
143
+ headers: { 'content-type': 'application/json' },
144
+ body: JSON.stringify({ name, device_role: 'voice_vision', lan_ip: host }),
145
+ });
146
+ if (!created.ok) {
147
+ const detail = await created.text().catch(() => '');
148
+ throw new Error(`could not register '${name}': ${created.status} ${detail}`.trim());
149
+ }
150
+ device = (await created.json());
151
+ deviceId = device.id;
152
+ }
153
+ const patched = await fetch(schedulerApiUrl(schedulerUrl, `/api/devices/${encodeURIComponent(deviceId)}`, token), {
154
+ method: 'PATCH',
155
+ headers: { 'content-type': 'application/json' },
156
+ body: JSON.stringify({ lan_ip: host, device_role: 'voice_vision', status: 'online' }),
157
+ });
158
+ if (!patched.ok) {
159
+ const detail = await patched.text().catch(() => '');
160
+ throw new Error(`could not update '${name}': ${patched.status} ${detail}`.trim());
161
+ }
162
+ return { ...(device ?? { name }), id: deviceId };
163
+ }
164
+ /**
165
+ * The character this kiosk should answer as.
166
+ *
167
+ * The device's own `character_id` binding (set by `robopark add-robot`) wins;
168
+ * only when nothing is bound does this fall back to matching the robot name,
169
+ * the same way add-robot picks a pad in the first place.
170
+ */
171
+ async function resolveCharacter(schedulerUrl, name, boundId, token) {
172
+ try {
173
+ const res = await fetch(schedulerApiUrl(schedulerUrl, '/api/character-presets', token));
174
+ if (!res.ok)
175
+ return null;
176
+ const presets = (await res.json());
177
+ if (boundId) {
178
+ const bound = presets.find(p => p.id === boundId);
179
+ if (bound)
180
+ return bound;
181
+ }
182
+ const lower = name.toLowerCase();
183
+ return (presets.find(p => p.id.toLowerCase() === lower || (p.name ?? '').toLowerCase() === lower) ??
184
+ presets.find(p => lower.includes(p.id.toLowerCase()) || (p.name ?? '').toLowerCase().includes(lower)) ??
185
+ null);
186
+ }
187
+ catch {
188
+ return null;
189
+ }
190
+ }
191
+ /**
192
+ * Open the live call page on this kiosk with camera/mic already granted.
193
+ *
194
+ * Nothing here is fatal: the camera relay this command's earlier steps set up
195
+ * works whether or not a browser comes up, so a missing character binding or a
196
+ * headless box degrades to a printed URL instead of failing the whole start.
197
+ */
198
+ async function openKiosk(schedulerUrl, browserBase, name, device, opts, token) {
199
+ const preset = await resolveCharacter(schedulerUrl, name, device.character_id, token);
200
+ if (!preset?.elevenlabs_agent_id) {
201
+ console.log(chalk.yellow(` ⚠ no character with a bound ElevenLabs agent matched '${name}' — not opening a call page`));
202
+ console.log(chalk.dim(` bind one with \`robopark add-robot --name ${name} --character <id>\`, or see ${browserBase}/calls`));
203
+ return;
204
+ }
205
+ // mode=production ties the call to this device so the scheduler attaches the
206
+ // robot's video ref; kiosk=1 arms the page's motion trigger, which is what
207
+ // starts a conversation with nobody available to press "Join".
208
+ const url = characterCallUrl(browserBase, preset, 'production', { robot: device.id, kiosk: '1' });
209
+ console.log(` call page: ${chalk.cyan(url)}`);
210
+ if (opts.browser === false) {
211
+ console.log(chalk.dim(' browser: --no-browser given — open the link above on the kiosk yourself'));
212
+ return;
213
+ }
214
+ const override = typeof opts.browser === 'string' ? opts.browser : undefined;
215
+ const exe = findBrowser(override);
216
+ if (!exe) {
217
+ console.log(chalk.yellow(` ⚠ no browser found${override ? ` at ${override}` : ''} — pass --browser <path> to the kiosk browser executable`));
218
+ return;
219
+ }
220
+ const launch = kioskLaunch(exe, url, name);
221
+ console.log(chalk.dim(` browser: ${launchCommandLine(launch)}`));
222
+ if (process.env.ROBOPARK_KIOSK_DRY_RUN) {
223
+ console.log(chalk.dim(' browser: ROBOPARK_KIOSK_DRY_RUN set — not spawning'));
224
+ return;
225
+ }
226
+ launchKiosk(launch, url);
227
+ // Rerunning start does not stack windows: both families hand the URL to the
228
+ // instance already owning this profile directory instead of opening a second.
229
+ console.log(chalk.green(` ✓ kiosk call page open (${launch.family}, camera+mic pre-granted)`));
230
+ }
231
+ export async function roboparkStart(config, name, opts) {
232
+ const profile = loadHubProfile();
233
+ if (!profile?.schedulerUrl) {
234
+ throw new Error('no saved hub profile; run `robopark hub-use --scheduler-url http://HUB:8080 --hub-url http://HUB:47913 --token TOKEN` once on this machine');
235
+ }
236
+ const port = Number(opts.port ?? DEFAULT_VISION_PORT);
237
+ if (!Number.isInteger(port) || port <= 0 || port > 65535) {
238
+ throw new Error(`invalid --port ${opts.port}`);
239
+ }
240
+ const host = localHost();
241
+ const schedulerUrl = robotReachableSchedulerUrl(profile.schedulerUrl, profile.hubUrl);
242
+ if (schedulerUrl.endsWith('/robopark') && !profile.token) {
243
+ throw new Error('the saved hub profile has no mesh token; rerun `robopark hub-use --token TOKEN`');
244
+ }
245
+ console.log(chalk.bold(`\n robopark start ${name}`));
246
+ console.log(chalk.dim(' ' + '─'.repeat(52)));
247
+ console.log(` host: ${chalk.cyan(host)}`);
248
+ console.log(` vision: ${chalk.cyan(String(port))}`);
249
+ console.log(` scheduler: ${chalk.cyan(schedulerUrl)}`);
250
+ console.log();
251
+ // The mesh relay and the scheduler both hardcode 5000 for a robot's vision
252
+ // server, so a different port serves locally but is unreachable from the
253
+ // control center. Say so instead of reporting a feed nobody can watch.
254
+ if (port !== DEFAULT_VISION_PORT) {
255
+ console.log(chalk.yellow(` ⚠ the control-center relay only proxies port ${DEFAULT_VISION_PORT}; --port ${port} is local-only`));
256
+ }
257
+ // Mesh enrollment is opt-in. The control center now resolves this kiosk from
258
+ // its own scheduler device record and streams to <address>:5000 directly, so
259
+ // the mesh peer table is no longer on the video path and a dev-tooling outage
260
+ // can no longer take the cameras down.
261
+ if (opts.mesh === true)
262
+ await ensureMesh(config, name, profile.token);
263
+ else
264
+ console.log(chalk.dim(' mesh: skipped (video does not need it) — pass --mesh to enroll'));
265
+ let running = null;
266
+ // A prior run (or --mesh enrollment, which starts the robot runtime) often
267
+ // left the feed already live, so there may be nothing left to launch.
268
+ if (await feedReady(port)) {
269
+ console.log(chalk.dim(' vision server already answering — reusing it'));
270
+ }
271
+ else {
272
+ const launch = roboparkVisionAgent({ port: String(port), foreground: opts.foreground });
273
+ // In --foreground the launcher only resolves when the camera exits, so it
274
+ // must not be awaited before the readiness probe or nothing is ever polled.
275
+ if (opts.foreground)
276
+ running = launch;
277
+ else
278
+ await launch;
279
+ }
280
+ if (!(await waitForFeed(port))) {
281
+ throw new Error(`the vision server never answered http://127.0.0.1:${port}/video_feed within ${READY_TIMEOUT_MS / 1000}s — check the camera device and rerun with --foreground to see its output`);
282
+ }
283
+ console.log(chalk.green(` ✓ local feed ready at http://127.0.0.1:${port}/video_feed`));
284
+ const device = await registerDevice(schedulerUrl, name, host, profile.token);
285
+ console.log(chalk.green(` ✓ registered '${name}' at the scheduler (device ${device.id})`));
286
+ const base = profile.schedulerUrl.replace(/\/+$/, '');
287
+ console.log();
288
+ console.log(` control center: ${chalk.cyan(base)}`);
289
+ console.log(` feed: ${chalk.cyan(`${base}/fed/media/robots/${encodeURIComponent(name)}/video_feed`)}`);
290
+ await openKiosk(schedulerUrl, base, name, device, opts, profile.token);
291
+ console.log();
292
+ if (running)
293
+ await running;
294
+ }
295
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/robopark/start.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,28 @@
8
8
  */
9
9
  import chalk from 'chalk';
10
10
  import { resolveTailnet } from './tailscale.js';
11
+ /**
12
+ * The one place a /voice-join.html link is assembled.
13
+ *
14
+ * Mirrors the scheduler's own `_call_link()` (scheduler/main.py) so a link the
15
+ * CLI hands to a kiosk is byte-for-byte the same shape as one copied off the
16
+ * /calls page — `extra` only adds the kiosk-specific params that page has no
17
+ * reason to carry.
18
+ */
19
+ export function characterCallUrl(host, preset, mode, extra) {
20
+ const params = new URLSearchParams({ character: preset.id });
21
+ if (preset.elevenlabs_agent_id)
22
+ params.set('agent_id', preset.elevenlabs_agent_id);
23
+ params.set('mode', mode);
24
+ // The branch pins the conversation to a specific agent variant. Dropping it
25
+ // would silently fall back to the agent's default, which is the wrong
26
+ // language when the branch is what selects it.
27
+ if (preset.elevenlabs_branch_id)
28
+ params.set('branch_id', preset.elevenlabs_branch_id);
29
+ for (const [key, value] of Object.entries(extra ?? {}))
30
+ params.set(key, value);
31
+ return `${host.replace(/\/+$/, '')}/voice-join.html?${params.toString()}`;
32
+ }
11
33
  export async function roboparkVoiceList(opts) {
12
34
  const configured = (opts.schedulerUrl || process.env.ROBOPARK_SCHEDULER_URL || 'http://127.0.0.1:8080').replace(/\/+$/, '');
13
35
  // Always talk to the scheduler over whatever address was given; only the
@@ -46,18 +68,7 @@ export async function roboparkVoiceList(opts) {
46
68
  }
47
69
  const wanted = (opts.mode || '').trim().toLowerCase();
48
70
  const modes = wanted === 'production' || wanted === 'test' ? [wanted] : ['production', 'test'];
49
- const link = (preset, mode) => {
50
- const params = new URLSearchParams({ character: preset.id });
51
- if (preset.elevenlabs_agent_id)
52
- params.set('agent_id', preset.elevenlabs_agent_id);
53
- params.set('mode', mode);
54
- // The branch pins the conversation to a specific agent variant. Dropping it
55
- // would silently fall back to the agent's default, which is the wrong
56
- // language when the branch is what selects it.
57
- if (preset.elevenlabs_branch_id)
58
- params.set('branch_id', preset.elevenlabs_branch_id);
59
- return `${linkHost}/voice-join.html?${params.toString()}`;
60
- };
71
+ const link = (preset, mode) => characterCallUrl(linkHost, preset, mode);
61
72
  if (opts.plain) {
62
73
  for (const preset of presets)
63
74
  for (const mode of modes)
@@ -1 +1 @@
1
- {"version":3,"file":"voice-list.js","sourceRoot":"","sources":["../../src/robopark/voice-list.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"voice-list.js","sourceRoot":"","sources":["../../src/robopark/voice-list.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAkBhD;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAY,EACZ,MAAuB,EACvB,IAAY,EACZ,KAA8B;IAE9B,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7D,IAAI,MAAM,CAAC,mBAAmB;QAAE,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACnF,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzB,4EAA4E;IAC5E,sEAAsE;IACtE,+CAA+C;IAC/C,IAAI,MAAM,CAAC,oBAAoB;QAAE,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,oBAAoB,CAAC,CAAC;IACtF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;QAAE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC/E,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,oBAAoB,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;AAC5E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAsB;IAC5D,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,uBAAuB,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAE5H,yEAAyE;IACzE,6EAA6E;IAC7E,0DAA0D;IAC1D,IAAI,QAAQ,GAAG,UAAU,CAAC;IAC1B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,cAAc,EAAE,CAAC;QAC7C,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;gBAAC,OAAO,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,OAAO,MAAM,CAAC;YAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACvG,QAAQ,GAAG,UAAU,QAAQ,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,KAAK,EAAE,CAAC,CAAC,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,IAAI,OAA0B,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,UAAU,wBAAwB,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxG,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACjE,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,EAAuB,CAAC;IAClD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wCAAwC,UAAU,EAAE,CAAC,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAClF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC,CAAC;QAC3D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACtD,MAAM,KAAK,GAAG,MAAM,KAAK,YAAY,IAAI,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAE/F,MAAM,IAAI,GAAG,CAAC,MAAuB,EAAE,IAAY,EAAE,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAEjG,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,KAAK,MAAM,MAAM,IAAI,OAAO;YAAE,KAAK,MAAM,IAAI,IAAI,KAAK;gBAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;QACxF,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACtD,IAAI,QAAQ,KAAK,UAAU;QAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACjF,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mDAAmD,CAAC,CAAC,CAAC;QAC/E,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO;IACT,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;YAChC,uEAAuE;YACvE,8DAA8D;YAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,8CAA8C,CAAC,EAAE,CAAC,CAAC;YACnG,OAAO,EAAE,CAAC;YACV,SAAS;QACX,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChI,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/G,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,MAAM,gBAAgB,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,mBAAmB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC5G,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
@@ -701,6 +701,27 @@ program
701
701
  .action(async (name, opts) => {
702
702
  await roboparkAddRobot(config, { name, ...opts });
703
703
  });
704
+ program
705
+ .command('start <robot>')
706
+ .description('Bring this kiosk\'s camera up and publish it to the control center using the saved `robopark hub-use` profile')
707
+ .option('--port <port>', 'local vision server port', '5000')
708
+ .option('--foreground', 'stay in foreground; do not detach the vision server')
709
+ // Declaring --mesh before --no-mesh keeps commander's default at undefined
710
+ // (opt-out), so --no-mesh survives as a harmless no-op alias for scripts.
711
+ .option('--mesh', 'also enroll this machine on the infinicode mesh (not needed for video)')
712
+ .option('--no-mesh', 'accepted for compatibility; mesh enrollment is already off by default')
713
+ .option('--browser <path>', 'kiosk browser executable (default: first installed Edge/Chrome/Chromium/Firefox)')
714
+ .option('--no-browser', 'do not open the live call page; just print its URL')
715
+ .action(async (robot, opts) => {
716
+ const { roboparkStart } = await import('./robopark/start.js');
717
+ try {
718
+ await roboparkStart(config, robot, opts);
719
+ }
720
+ catch (err) {
721
+ console.error(chalk.red(` ✗ start failed: ${err?.message ?? err}`));
722
+ process.exitCode = 1;
723
+ }
724
+ });
704
725
  program
705
726
  .command('agent-up')
706
727
  .description('Start the ROBOVOICE docker stack and register its LiveKit server with the scheduler')