robopark 3.3.30 → 3.3.32

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "robopark",
3
- "version": "3.3.30",
3
+ "version": "3.3.32",
4
4
  "description": "RoboPark fleet control CLI — scheduler, control UI, and character voice calls. Standalone: no infinicode runtime.",
5
5
  "type": "module",
6
6
  "bin": {
package/scheduler/main.py CHANGED
@@ -1910,7 +1910,20 @@ async def _claim_character_device(
1910
1910
 
1911
1911
  Returns (robot_id, robot_video_ref).
1912
1912
  """
1913
- claim_key = (join_link_id or f"character:{character_id}").strip()[:120]
1913
+ # Key the claim on the CHARACTER, not the join link.
1914
+ #
1915
+ # Keying on join_link_id minted a brand new claim device every time a share
1916
+ # link was regenerated, so one character accumulated several claim_* rows --
1917
+ # each with its own robopark-<device> room. The park map showed duplicate
1918
+ # cards for one robot, and the publisher could land in a different room than
1919
+ # the camera grid was watching, which is the "waiting for camera track" that
1920
+ # survived every transport fix. One character is one robot, so one character
1921
+ # is one device id, stable across link regeneration.
1922
+ #
1923
+ # Only fall back to the link when there is no character at all, which is the
1924
+ # sole case where the character cannot name the device.
1925
+ character_key = (character_id or "").strip().lower()
1926
+ claim_key = (f"character:{character_key}" if character_key else (join_link_id or "").strip())[:120]
1914
1927
  device_id = "claim_" + hashlib.sha256(claim_key.encode("utf-8")).hexdigest()[:16]
1915
1928
  # Name the claim after the character, not after client_name. Every public
1916
1929
  # link sends the same client_name ("Public character link"), so each claimed
@@ -1 +1 @@
1
- KwY1YC79lI9nQqOVYXOmY
1
+ Xg-e8h70WpdFcsZ2vcfOG
@@ -7,6 +7,17 @@
7
7
  "static/chunks/main-app-a1f59168303c7f84.js",
8
8
  "static/chunks/app/_not-found/page-cfd7daa82d71540c.js"
9
9
  ],
10
+ "/layout": [
11
+ "static/chunks/webpack-5252e5254da079b5.js",
12
+ "static/chunks/4bd1b696-f785427dddbba9fb.js",
13
+ "static/chunks/1255-404bb8de49c90395.js",
14
+ "static/chunks/main-app-a1f59168303c7f84.js",
15
+ "static/css/3f478a573f9be82e.css",
16
+ "static/css/51560c4af1d5a21f.css",
17
+ "static/chunks/144d3bae-bd5d150c0cab972e.js",
18
+ "static/chunks/9880-53262785284464cc.js",
19
+ "static/chunks/app/layout-fcce963da1d8220f.js"
20
+ ],
10
21
  "/api/device-character/route": [
11
22
  "static/chunks/webpack-5252e5254da079b5.js",
12
23
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
@@ -28,33 +39,33 @@
28
39
  "static/chunks/main-app-a1f59168303c7f84.js",
29
40
  "static/chunks/app/api/models/route-0952b44bda5bfb6d.js"
30
41
  ],
31
- "/api/prewarm/route": [
42
+ "/api/reload-tools/route": [
32
43
  "static/chunks/webpack-5252e5254da079b5.js",
33
44
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
34
45
  "static/chunks/1255-404bb8de49c90395.js",
35
46
  "static/chunks/main-app-a1f59168303c7f84.js",
36
- "static/chunks/app/api/prewarm/route-0952b44bda5bfb6d.js"
47
+ "static/chunks/app/api/reload-tools/route-0952b44bda5bfb6d.js"
37
48
  ],
38
- "/api/prompt/route": [
49
+ "/api/prewarm/route": [
39
50
  "static/chunks/webpack-5252e5254da079b5.js",
40
51
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
41
52
  "static/chunks/1255-404bb8de49c90395.js",
42
53
  "static/chunks/main-app-a1f59168303c7f84.js",
43
- "static/chunks/app/api/prompt/route-0952b44bda5bfb6d.js"
54
+ "static/chunks/app/api/prewarm/route-0952b44bda5bfb6d.js"
44
55
  ],
45
- "/api/reload-tools/route": [
56
+ "/api/robopark/devices/[deviceId]/control/route": [
46
57
  "static/chunks/webpack-5252e5254da079b5.js",
47
58
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
48
59
  "static/chunks/1255-404bb8de49c90395.js",
49
60
  "static/chunks/main-app-a1f59168303c7f84.js",
50
- "static/chunks/app/api/reload-tools/route-0952b44bda5bfb6d.js"
61
+ "static/chunks/app/api/robopark/devices/[deviceId]/control/route-0952b44bda5bfb6d.js"
51
62
  ],
52
- "/api/robopark/devices/[deviceId]/control/route": [
63
+ "/api/prompt/route": [
53
64
  "static/chunks/webpack-5252e5254da079b5.js",
54
65
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
55
66
  "static/chunks/1255-404bb8de49c90395.js",
56
67
  "static/chunks/main-app-a1f59168303c7f84.js",
57
- "static/chunks/app/api/robopark/devices/[deviceId]/control/route-0952b44bda5bfb6d.js"
68
+ "static/chunks/app/api/prompt/route-0952b44bda5bfb6d.js"
58
69
  ],
59
70
  "/api/robopark/robots/[robotId]/operations/route": [
60
71
  "static/chunks/webpack-5252e5254da079b5.js",
@@ -77,13 +88,6 @@
77
88
  "static/chunks/main-app-a1f59168303c7f84.js",
78
89
  "static/chunks/app/api/robopark/transcripts/[sessionId]/route-0952b44bda5bfb6d.js"
79
90
  ],
80
- "/api/setup/complete/route": [
81
- "static/chunks/webpack-5252e5254da079b5.js",
82
- "static/chunks/4bd1b696-f785427dddbba9fb.js",
83
- "static/chunks/1255-404bb8de49c90395.js",
84
- "static/chunks/main-app-a1f59168303c7f84.js",
85
- "static/chunks/app/api/setup/complete/route-0952b44bda5bfb6d.js"
86
- ],
87
91
  "/api/setup/status/route": [
88
92
  "static/chunks/webpack-5252e5254da079b5.js",
89
93
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
@@ -105,6 +109,13 @@
105
109
  "static/chunks/main-app-a1f59168303c7f84.js",
106
110
  "static/chunks/app/api/setup/test-hass/route-0952b44bda5bfb6d.js"
107
111
  ],
112
+ "/api/setup/complete/route": [
113
+ "static/chunks/webpack-5252e5254da079b5.js",
114
+ "static/chunks/4bd1b696-f785427dddbba9fb.js",
115
+ "static/chunks/1255-404bb8de49c90395.js",
116
+ "static/chunks/main-app-a1f59168303c7f84.js",
117
+ "static/chunks/app/api/setup/complete/route-0952b44bda5bfb6d.js"
118
+ ],
108
119
  "/api/setup/test-ollama/route": [
109
120
  "static/chunks/webpack-5252e5254da079b5.js",
110
121
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
@@ -154,16 +165,12 @@
154
165
  "static/chunks/main-app-a1f59168303c7f84.js",
155
166
  "static/chunks/app/api/wake-word/upload/route-0952b44bda5bfb6d.js"
156
167
  ],
157
- "/layout": [
168
+ "/api/connection-details/route": [
158
169
  "static/chunks/webpack-5252e5254da079b5.js",
159
170
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
160
171
  "static/chunks/1255-404bb8de49c90395.js",
161
172
  "static/chunks/main-app-a1f59168303c7f84.js",
162
- "static/css/3f478a573f9be82e.css",
163
- "static/css/51560c4af1d5a21f.css",
164
- "static/chunks/144d3bae-bd5d150c0cab972e.js",
165
- "static/chunks/9880-53262785284464cc.js",
166
- "static/chunks/app/layout-fcce963da1d8220f.js"
173
+ "static/chunks/app/api/connection-details/route-0952b44bda5bfb6d.js"
167
174
  ],
168
175
  "/api/kiosk-hardware/route": [
169
176
  "static/chunks/webpack-5252e5254da079b5.js",
@@ -179,12 +186,12 @@
179
186
  "static/chunks/main-app-a1f59168303c7f84.js",
180
187
  "static/chunks/app/api/model-status/route-0952b44bda5bfb6d.js"
181
188
  ],
182
- "/api/connection-details/route": [
189
+ "/api/robopark/character-ai/route": [
183
190
  "static/chunks/webpack-5252e5254da079b5.js",
184
191
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
185
192
  "static/chunks/1255-404bb8de49c90395.js",
186
193
  "static/chunks/main-app-a1f59168303c7f84.js",
187
- "static/chunks/app/api/connection-details/route-0952b44bda5bfb6d.js"
194
+ "static/chunks/app/api/robopark/character-ai/route-0952b44bda5bfb6d.js"
188
195
  ],
189
196
  "/api/robopark/device-access/route": [
190
197
  "static/chunks/webpack-5252e5254da079b5.js",
@@ -193,33 +200,26 @@
193
200
  "static/chunks/main-app-a1f59168303c7f84.js",
194
201
  "static/chunks/app/api/robopark/device-access/route-0952b44bda5bfb6d.js"
195
202
  ],
196
- "/api/robopark/character-ai/route": [
197
- "static/chunks/webpack-5252e5254da079b5.js",
198
- "static/chunks/4bd1b696-f785427dddbba9fb.js",
199
- "static/chunks/1255-404bb8de49c90395.js",
200
- "static/chunks/main-app-a1f59168303c7f84.js",
201
- "static/chunks/app/api/robopark/character-ai/route-0952b44bda5bfb6d.js"
202
- ],
203
- "/api/robopark/camera-token/route": [
203
+ "/api/robopark/live-rooms/route": [
204
204
  "static/chunks/webpack-5252e5254da079b5.js",
205
205
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
206
206
  "static/chunks/1255-404bb8de49c90395.js",
207
207
  "static/chunks/main-app-a1f59168303c7f84.js",
208
- "static/chunks/app/api/robopark/camera-token/route-0952b44bda5bfb6d.js"
208
+ "static/chunks/app/api/robopark/live-rooms/route-0952b44bda5bfb6d.js"
209
209
  ],
210
- "/api/robopark/live-rooms/route": [
210
+ "/api/robopark/monitor-token/route": [
211
211
  "static/chunks/webpack-5252e5254da079b5.js",
212
212
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
213
213
  "static/chunks/1255-404bb8de49c90395.js",
214
214
  "static/chunks/main-app-a1f59168303c7f84.js",
215
- "static/chunks/app/api/robopark/live-rooms/route-0952b44bda5bfb6d.js"
215
+ "static/chunks/app/api/robopark/monitor-token/route-0952b44bda5bfb6d.js"
216
216
  ],
217
- "/api/robopark/monitor-token/route": [
217
+ "/api/robopark/servers/[serverId]/metrics/route": [
218
218
  "static/chunks/webpack-5252e5254da079b5.js",
219
219
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
220
220
  "static/chunks/1255-404bb8de49c90395.js",
221
221
  "static/chunks/main-app-a1f59168303c7f84.js",
222
- "static/chunks/app/api/robopark/monitor-token/route-0952b44bda5bfb6d.js"
222
+ "static/chunks/app/api/robopark/servers/[serverId]/metrics/route-0952b44bda5bfb6d.js"
223
223
  ],
224
224
  "/api/robopark/robots/route": [
225
225
  "static/chunks/webpack-5252e5254da079b5.js",
@@ -228,19 +228,19 @@
228
228
  "static/chunks/main-app-a1f59168303c7f84.js",
229
229
  "static/chunks/app/api/robopark/robots/route-0952b44bda5bfb6d.js"
230
230
  ],
231
- "/api/robopark/servers/[serverId]/metrics/route": [
231
+ "/api/robopark/servers/[serverId]/route": [
232
232
  "static/chunks/webpack-5252e5254da079b5.js",
233
233
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
234
234
  "static/chunks/1255-404bb8de49c90395.js",
235
235
  "static/chunks/main-app-a1f59168303c7f84.js",
236
- "static/chunks/app/api/robopark/servers/[serverId]/metrics/route-0952b44bda5bfb6d.js"
236
+ "static/chunks/app/api/robopark/servers/[serverId]/route-0952b44bda5bfb6d.js"
237
237
  ],
238
- "/api/robopark/servers/[serverId]/route": [
238
+ "/api/robopark/sessions/route": [
239
239
  "static/chunks/webpack-5252e5254da079b5.js",
240
240
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
241
241
  "static/chunks/1255-404bb8de49c90395.js",
242
242
  "static/chunks/main-app-a1f59168303c7f84.js",
243
- "static/chunks/app/api/robopark/servers/[serverId]/route-0952b44bda5bfb6d.js"
243
+ "static/chunks/app/api/robopark/sessions/route-0952b44bda5bfb6d.js"
244
244
  ],
245
245
  "/api/robopark/servers/route": [
246
246
  "static/chunks/webpack-5252e5254da079b5.js",
@@ -249,19 +249,19 @@
249
249
  "static/chunks/main-app-a1f59168303c7f84.js",
250
250
  "static/chunks/app/api/robopark/servers/route-0952b44bda5bfb6d.js"
251
251
  ],
252
- "/api/robopark/sessions/route": [
252
+ "/api/robopark/vision-caption/route": [
253
253
  "static/chunks/webpack-5252e5254da079b5.js",
254
254
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
255
255
  "static/chunks/1255-404bb8de49c90395.js",
256
256
  "static/chunks/main-app-a1f59168303c7f84.js",
257
- "static/chunks/app/api/robopark/sessions/route-0952b44bda5bfb6d.js"
257
+ "static/chunks/app/api/robopark/vision-caption/route-0952b44bda5bfb6d.js"
258
258
  ],
259
- "/api/robopark/vision-caption/route": [
259
+ "/api/robopark/robots/[robotId]/voice-engine/route": [
260
260
  "static/chunks/webpack-5252e5254da079b5.js",
261
261
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
262
262
  "static/chunks/1255-404bb8de49c90395.js",
263
263
  "static/chunks/main-app-a1f59168303c7f84.js",
264
- "static/chunks/app/api/robopark/vision-caption/route-0952b44bda5bfb6d.js"
264
+ "static/chunks/app/api/robopark/robots/[robotId]/voice-engine/route-0952b44bda5bfb6d.js"
265
265
  ],
266
266
  "/api/robovoice/robots/[robotId]/media-health/route": [
267
267
  "static/chunks/webpack-5252e5254da079b5.js",
@@ -270,33 +270,33 @@
270
270
  "static/chunks/main-app-a1f59168303c7f84.js",
271
271
  "static/chunks/app/api/robovoice/robots/[robotId]/media-health/route-0952b44bda5bfb6d.js"
272
272
  ],
273
- "/api/robopark/robots/[robotId]/voice-engine/route": [
273
+ "/api/robopark/transcripts/route": [
274
274
  "static/chunks/webpack-5252e5254da079b5.js",
275
275
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
276
276
  "static/chunks/1255-404bb8de49c90395.js",
277
277
  "static/chunks/main-app-a1f59168303c7f84.js",
278
- "static/chunks/app/api/robopark/robots/[robotId]/voice-engine/route-0952b44bda5bfb6d.js"
278
+ "static/chunks/app/api/robopark/transcripts/route-0952b44bda5bfb6d.js"
279
279
  ],
280
- "/api/settings/route": [
280
+ "/api/turn-credentials/route": [
281
281
  "static/chunks/webpack-5252e5254da079b5.js",
282
282
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
283
283
  "static/chunks/1255-404bb8de49c90395.js",
284
284
  "static/chunks/main-app-a1f59168303c7f84.js",
285
- "static/chunks/app/api/settings/route-0952b44bda5bfb6d.js"
285
+ "static/chunks/app/api/turn-credentials/route-0952b44bda5bfb6d.js"
286
286
  ],
287
- "/api/turn-credentials/route": [
287
+ "/api/robopark/camera-token/route": [
288
288
  "static/chunks/webpack-5252e5254da079b5.js",
289
289
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
290
290
  "static/chunks/1255-404bb8de49c90395.js",
291
291
  "static/chunks/main-app-a1f59168303c7f84.js",
292
- "static/chunks/app/api/turn-credentials/route-0952b44bda5bfb6d.js"
292
+ "static/chunks/app/api/robopark/camera-token/route-0952b44bda5bfb6d.js"
293
293
  ],
294
- "/api/robopark/transcripts/route": [
294
+ "/api/settings/route": [
295
295
  "static/chunks/webpack-5252e5254da079b5.js",
296
296
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
297
297
  "static/chunks/1255-404bb8de49c90395.js",
298
298
  "static/chunks/main-app-a1f59168303c7f84.js",
299
- "static/chunks/app/api/robopark/transcripts/route-0952b44bda5bfb6d.js"
299
+ "static/chunks/app/api/settings/route-0952b44bda5bfb6d.js"
300
300
  ],
301
301
  "/api/wake/route": [
302
302
  "static/chunks/webpack-5252e5254da079b5.js",
@@ -305,19 +305,19 @@
305
305
  "static/chunks/main-app-a1f59168303c7f84.js",
306
306
  "static/chunks/app/api/wake/route-0952b44bda5bfb6d.js"
307
307
  ],
308
- "/camera-grid/route": [
308
+ "/robopark/[...path]/route": [
309
309
  "static/chunks/webpack-5252e5254da079b5.js",
310
310
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
311
311
  "static/chunks/1255-404bb8de49c90395.js",
312
312
  "static/chunks/main-app-a1f59168303c7f84.js",
313
- "static/chunks/app/camera-grid/route-0952b44bda5bfb6d.js"
313
+ "static/chunks/app/robopark/[...path]/route-0952b44bda5bfb6d.js"
314
314
  ],
315
- "/robopark/[...path]/route": [
315
+ "/camera-grid/route": [
316
316
  "static/chunks/webpack-5252e5254da079b5.js",
317
317
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
318
318
  "static/chunks/1255-404bb8de49c90395.js",
319
319
  "static/chunks/main-app-a1f59168303c7f84.js",
320
- "static/chunks/app/robopark/[...path]/route-0952b44bda5bfb6d.js"
320
+ "static/chunks/app/camera-grid/route-0952b44bda5bfb6d.js"
321
321
  ],
322
322
  "/fed/media/robots/[robotId]/video_feed/route": [
323
323
  "static/chunks/webpack-5252e5254da079b5.js",
@@ -326,33 +326,33 @@
326
326
  "static/chunks/main-app-a1f59168303c7f84.js",
327
327
  "static/chunks/app/fed/media/robots/[robotId]/video_feed/route-0952b44bda5bfb6d.js"
328
328
  ],
329
- "/fed/[...path]/route": [
329
+ "/tailnet/route": [
330
330
  "static/chunks/webpack-5252e5254da079b5.js",
331
331
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
332
332
  "static/chunks/1255-404bb8de49c90395.js",
333
333
  "static/chunks/main-app-a1f59168303c7f84.js",
334
- "static/chunks/app/fed/[...path]/route-0952b44bda5bfb6d.js"
334
+ "static/chunks/app/tailnet/route-0952b44bda5bfb6d.js"
335
335
  ],
336
- "/robopark/api/robots/[robotId]/stream/route": [
336
+ "/vendor/livekit-client.umd.js/route": [
337
337
  "static/chunks/webpack-5252e5254da079b5.js",
338
338
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
339
339
  "static/chunks/1255-404bb8de49c90395.js",
340
340
  "static/chunks/main-app-a1f59168303c7f84.js",
341
- "static/chunks/app/robopark/api/robots/[robotId]/stream/route-0952b44bda5bfb6d.js"
341
+ "static/chunks/app/vendor/livekit-client.umd.js/route-0952b44bda5bfb6d.js"
342
342
  ],
343
- "/tailnet/route": [
343
+ "/fed/[...path]/route": [
344
344
  "static/chunks/webpack-5252e5254da079b5.js",
345
345
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
346
346
  "static/chunks/1255-404bb8de49c90395.js",
347
347
  "static/chunks/main-app-a1f59168303c7f84.js",
348
- "static/chunks/app/tailnet/route-0952b44bda5bfb6d.js"
348
+ "static/chunks/app/fed/[...path]/route-0952b44bda5bfb6d.js"
349
349
  ],
350
- "/vendor/livekit-client.umd.js/route": [
350
+ "/robopark/api/robots/[robotId]/stream/route": [
351
351
  "static/chunks/webpack-5252e5254da079b5.js",
352
352
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
353
353
  "static/chunks/1255-404bb8de49c90395.js",
354
354
  "static/chunks/main-app-a1f59168303c7f84.js",
355
- "static/chunks/app/vendor/livekit-client.umd.js/route-0952b44bda5bfb6d.js"
355
+ "static/chunks/app/robopark/api/robots/[robotId]/stream/route-0952b44bda5bfb6d.js"
356
356
  ],
357
357
  "/(app)/opengraph-image-xg4ifa/route": [
358
358
  "static/chunks/webpack-5252e5254da079b5.js",
@@ -368,19 +368,19 @@
368
368
  "static/chunks/main-app-a1f59168303c7f84.js",
369
369
  "static/chunks/app/robopark/api/[...path]/route-0952b44bda5bfb6d.js"
370
370
  ],
371
- "/robopark/page": [
371
+ "/voice-tester/page": [
372
372
  "static/chunks/webpack-5252e5254da079b5.js",
373
373
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
374
374
  "static/chunks/1255-404bb8de49c90395.js",
375
375
  "static/chunks/main-app-a1f59168303c7f84.js",
376
- "static/chunks/app/robopark/page-0952b44bda5bfb6d.js"
376
+ "static/chunks/app/voice-tester/page-ae699e048e0eb834.js"
377
377
  ],
378
- "/voice-tester/page": [
378
+ "/robopark/page": [
379
379
  "static/chunks/webpack-5252e5254da079b5.js",
380
380
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
381
381
  "static/chunks/1255-404bb8de49c90395.js",
382
382
  "static/chunks/main-app-a1f59168303c7f84.js",
383
- "static/chunks/app/voice-tester/page-ae699e048e0eb834.js"
383
+ "static/chunks/app/robopark/page-0952b44bda5bfb6d.js"
384
384
  ],
385
385
  "/(app)/layout": [
386
386
  "static/chunks/webpack-5252e5254da079b5.js",
@@ -389,6 +389,13 @@
389
389
  "static/chunks/main-app-a1f59168303c7f84.js",
390
390
  "static/chunks/app/(app)/layout-0952b44bda5bfb6d.js"
391
391
  ],
392
+ "/(app)/page": [
393
+ "static/chunks/webpack-5252e5254da079b5.js",
394
+ "static/chunks/4bd1b696-f785427dddbba9fb.js",
395
+ "static/chunks/1255-404bb8de49c90395.js",
396
+ "static/chunks/main-app-a1f59168303c7f84.js",
397
+ "static/chunks/app/(app)/page-0952b44bda5bfb6d.js"
398
+ ],
392
399
  "/(app)/voice/page": [
393
400
  "static/chunks/webpack-5252e5254da079b5.js",
394
401
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
@@ -400,13 +407,6 @@
400
407
  "static/chunks/9880-53262785284464cc.js",
401
408
  "static/chunks/2333-43c39acb531f7d4e.js",
402
409
  "static/chunks/app/(app)/voice/page-72d72d9a70d9c1d4.js"
403
- ],
404
- "/(app)/page": [
405
- "static/chunks/webpack-5252e5254da079b5.js",
406
- "static/chunks/4bd1b696-f785427dddbba9fb.js",
407
- "static/chunks/1255-404bb8de49c90395.js",
408
- "static/chunks/main-app-a1f59168303c7f84.js",
409
- "static/chunks/app/(app)/page-0952b44bda5bfb6d.js"
410
410
  ]
411
411
  }
412
412
  }
@@ -1,18 +1,19 @@
1
1
  {
2
+ "/_not-found/page": "/_not-found",
2
3
  "/api/device-character/route": "/api/device-character",
3
4
  "/api/download-piper-model/route": "/api/download-piper-model",
4
5
  "/api/models/route": "/api/models",
5
- "/api/prewarm/route": "/api/prewarm",
6
- "/api/prompt/route": "/api/prompt",
7
6
  "/api/reload-tools/route": "/api/reload-tools",
7
+ "/api/prewarm/route": "/api/prewarm",
8
8
  "/api/robopark/devices/[deviceId]/control/route": "/api/robopark/devices/[deviceId]/control",
9
+ "/api/prompt/route": "/api/prompt",
9
10
  "/api/robopark/robots/[robotId]/operations/route": "/api/robopark/robots/[robotId]/operations",
10
11
  "/api/robopark/sessions/[sessionId]/end/route": "/api/robopark/sessions/[sessionId]/end",
11
12
  "/api/robopark/transcripts/[sessionId]/route": "/api/robopark/transcripts/[sessionId]",
12
- "/api/setup/complete/route": "/api/setup/complete",
13
13
  "/api/setup/status/route": "/api/setup/status",
14
14
  "/api/setup/test-groq/route": "/api/setup/test-groq",
15
15
  "/api/setup/test-hass/route": "/api/setup/test-hass",
16
+ "/api/setup/complete/route": "/api/setup/complete",
16
17
  "/api/setup/test-ollama/route": "/api/setup/test-ollama",
17
18
  "/api/test-tts/route": "/api/test-tts",
18
19
  "/api/setup/test-n8n/route": "/api/setup/test-n8n",
@@ -21,38 +22,37 @@
21
22
  "/api/wake-word/status/route": "/api/wake-word/status",
22
23
  "/api/wake-word/upload/route": "/api/wake-word/upload",
23
24
  "/favicon.ico/route": "/favicon.ico",
24
- "/_not-found/page": "/_not-found",
25
+ "/api/connection-details/route": "/api/connection-details",
25
26
  "/api/kiosk-hardware/route": "/api/kiosk-hardware",
26
27
  "/api/model-status/route": "/api/model-status",
27
- "/api/connection-details/route": "/api/connection-details",
28
- "/api/robopark/device-access/route": "/api/robopark/device-access",
29
28
  "/api/robopark/character-ai/route": "/api/robopark/character-ai",
30
- "/api/robopark/camera-token/route": "/api/robopark/camera-token",
29
+ "/api/robopark/device-access/route": "/api/robopark/device-access",
31
30
  "/api/robopark/live-rooms/route": "/api/robopark/live-rooms",
32
31
  "/api/robopark/monitor-token/route": "/api/robopark/monitor-token",
33
- "/api/robopark/robots/route": "/api/robopark/robots",
34
32
  "/api/robopark/servers/[serverId]/metrics/route": "/api/robopark/servers/[serverId]/metrics",
33
+ "/api/robopark/robots/route": "/api/robopark/robots",
35
34
  "/api/robopark/servers/[serverId]/route": "/api/robopark/servers/[serverId]",
36
- "/api/robopark/servers/route": "/api/robopark/servers",
37
35
  "/api/robopark/sessions/route": "/api/robopark/sessions",
36
+ "/api/robopark/servers/route": "/api/robopark/servers",
38
37
  "/api/robopark/vision-caption/route": "/api/robopark/vision-caption",
39
- "/api/robovoice/robots/[robotId]/media-health/route": "/api/robovoice/robots/[robotId]/media-health",
40
38
  "/api/robopark/robots/[robotId]/voice-engine/route": "/api/robopark/robots/[robotId]/voice-engine",
41
- "/api/settings/route": "/api/settings",
42
- "/api/turn-credentials/route": "/api/turn-credentials",
39
+ "/api/robovoice/robots/[robotId]/media-health/route": "/api/robovoice/robots/[robotId]/media-health",
43
40
  "/api/robopark/transcripts/route": "/api/robopark/transcripts",
41
+ "/api/turn-credentials/route": "/api/turn-credentials",
42
+ "/api/robopark/camera-token/route": "/api/robopark/camera-token",
43
+ "/api/settings/route": "/api/settings",
44
44
  "/api/wake/route": "/api/wake",
45
- "/camera-grid/route": "/camera-grid",
46
45
  "/robopark/[...path]/route": "/robopark/[...path]",
46
+ "/camera-grid/route": "/camera-grid",
47
47
  "/fed/media/robots/[robotId]/video_feed/route": "/fed/media/robots/[robotId]/video_feed",
48
- "/fed/[...path]/route": "/fed/[...path]",
49
- "/robopark/api/robots/[robotId]/stream/route": "/robopark/api/robots/[robotId]/stream",
50
48
  "/tailnet/route": "/tailnet",
51
49
  "/vendor/livekit-client.umd.js/route": "/vendor/livekit-client.umd.js",
50
+ "/fed/[...path]/route": "/fed/[...path]",
51
+ "/robopark/api/robots/[robotId]/stream/route": "/robopark/api/robots/[robotId]/stream",
52
52
  "/(app)/opengraph-image-xg4ifa/route": "/opengraph-image-xg4ifa",
53
53
  "/robopark/api/[...path]/route": "/robopark/api/[...path]",
54
- "/robopark/page": "/robopark",
55
54
  "/voice-tester/page": "/voice-tester",
56
- "/(app)/voice/page": "/voice",
57
- "/(app)/page": "/"
55
+ "/robopark/page": "/robopark",
56
+ "/(app)/page": "/",
57
+ "/(app)/voice/page": "/voice"
58
58
  }
@@ -5,8 +5,8 @@
5
5
  "devFiles": [],
6
6
  "ampDevFiles": [],
7
7
  "lowPriorityFiles": [
8
- "static/KwY1YC79lI9nQqOVYXOmY/_buildManifest.js",
9
- "static/KwY1YC79lI9nQqOVYXOmY/_ssgManifest.js"
8
+ "static/Xg-e8h70WpdFcsZ2vcfOG/_buildManifest.js",
9
+ "static/Xg-e8h70WpdFcsZ2vcfOG/_ssgManifest.js"
10
10
  ],
11
11
  "rootMainFiles": [
12
12
  "static/chunks/webpack-5252e5254da079b5.js",
@@ -1 +1 @@
1
- (()=>{var a={};a.id=1449,a.ids=[1449],a.modules={261:a=>{"use strict";a.exports=require("next/dist/shared/lib/router/utils/app-paths")},3295:a=>{"use strict";a.exports=require("next/dist/server/app-render/after-task-async-storage.external.js")},4573:a=>{"use strict";a.exports=require("node:buffer")},10846:a=>{"use strict";a.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},12465:(a,b,c)=>{"use strict";c.r(b),c.d(b,{handler:()=>I,patchFetch:()=>H,routeModule:()=>D,serverHooks:()=>G,workAsyncStorage:()=>E,workUnitAsyncStorage:()=>F});var d={};c.r(d),c.d(d,{POST:()=>C,revalidate:()=>z});var e=c(95736),f=c(9117),g=c(4044),h=c(39326),i=c(32324),j=c(261),k=c(54290),l=c(85328),m=c(38928),n=c(46595),o=c(3421),p=c(17679),q=c(41681),r=c(63446),s=c(86439),t=c(51356),u=c(10641),v=c(58755);let w=process.env.LIVEKIT_API_KEY,x=process.env.LIVEKIT_API_SECRET,y=process.env.LIVEKIT_URL,z=0,A=(process.env.ROBOPARK_SCHEDULER_URL||"http://host.docker.internal:8080").replace(/\/+$/,"");async function B(a){try{let b=await fetch(`${A}/api/monitor-token`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({room_name:a}),cache:"no-store",signal:AbortSignal.timeout(8e3)}),c=await b.json().catch(()=>null);if(!b.ok||!c?.token)return u.NextResponse.json({error:c?.detail||`Scheduler returned ${b.status}`},{status:200===b.status?502:b.status});return u.NextResponse.json({token:c.token,serverUrl:c.url},{headers:{"Cache-Control":"no-store"}})}catch(b){let a=b instanceof Error?b.message:"unknown error";return u.NextResponse.json({error:`Scheduler at ${A} is unreachable (${a}).`},{status:503})}}async function C(a){let b,c=await a.json().catch(()=>({})),d="string"==typeof c.room_name?c.room_name:"";if(!/^robopark-[a-zA-Z0-9_-]{1,64}$/.test(d))return u.NextResponse.json({error:"Invalid room"},{status:400});if(!w||!x||!y)return B(d);let e=new v.mk(w,x,{identity:`monitor_${crypto.randomUUID()}`,name:"RoboPark Monitor",ttl:"5m"});e.addGrant({room:d,roomJoin:!0,canSubscribe:!0,canPublish:!1,canPublishData:!1});let f=process.env.LIVEKIT_PUBLIC_URL||process.env.NEXT_PUBLIC_LIVEKIT_URL,g=a.headers.get("x-forwarded-proto"),h=(a.headers.get("x-forwarded-host")||a.headers.get("host")||"localhost").split(",")[0].trim(),i=h.split(":")[0],j=h.split(":")[1],k="https"===g||a.url.startsWith("https://");return b=i.includes(".ts.net")?`wss://${i}:3443`:f&&"auto"!==f?f:k?`wss://${i}:${j||"3443"}`:`ws://${i}:7880`,u.NextResponse.json({token:await e.toJwt(),serverUrl:b},{headers:{"Cache-Control":"no-store"}})}let D=new e.AppRouteRouteModule({definition:{kind:f.RouteKind.APP_ROUTE,page:"/api/robopark/monitor-token/route",pathname:"/api/robopark/monitor-token",filename:"route",bundlePath:"app/api/robopark/monitor-token/route"},distDir:".next",relativeProjectDir:"",resolvedPagePath:"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\app\\api\\robopark\\monitor-token\\route.ts",nextConfigOutput:"standalone",userland:d}),{workAsyncStorage:E,workUnitAsyncStorage:F,serverHooks:G}=D;function H(){return(0,g.patchFetch)({workAsyncStorage:E,workUnitAsyncStorage:F})}async function I(a,b,c){var d;let e="/api/robopark/monitor-token/route";"/index"===e&&(e="/");let g=await D.prepare(a,b,{srcPage:e,multiZoneDraftMode:!1});if(!g)return b.statusCode=400,b.end("Bad Request"),null==c.waitUntil||c.waitUntil.call(c,Promise.resolve()),null;let{buildId:u,params:v,nextConfig:w,isDraftMode:x,prerenderManifest:y,routerServerContext:z,isOnDemandRevalidate:A,revalidateOnlyGenerated:B,resolvedPathname:C}=g,E=(0,j.normalizeAppPath)(e),F=!!(y.dynamicRoutes[E]||y.routes[C]);if(F&&!x){let a=!!y.routes[C],b=y.dynamicRoutes[E];if(b&&!1===b.fallback&&!a)throw new s.NoFallbackError}let G=null;!F||D.isDev||x||(G="/index"===(G=C)?"/":G);let H=!0===D.isDev||!F,I=F&&!H,J=a.method||"GET",K=(0,i.getTracer)(),L=K.getActiveScopeSpan(),M={params:v,prerenderManifest:y,renderOpts:{experimental:{cacheComponents:!!w.experimental.cacheComponents,authInterrupts:!!w.experimental.authInterrupts},supportsDynamicResponse:H,incrementalCache:(0,h.getRequestMeta)(a,"incrementalCache"),cacheLifeProfiles:null==(d=w.experimental)?void 0:d.cacheLife,isRevalidate:I,waitUntil:c.waitUntil,onClose:a=>{b.on("close",a)},onAfterTaskError:void 0,onInstrumentationRequestError:(b,c,d)=>D.onRequestError(a,b,d,z)},sharedContext:{buildId:u}},N=new k.NodeNextRequest(a),O=new k.NodeNextResponse(b),P=l.NextRequestAdapter.fromNodeNextRequest(N,(0,l.signalFromNodeResponse)(b));try{let d=async c=>D.handle(P,M).finally(()=>{if(!c)return;c.setAttributes({"http.status_code":b.statusCode,"next.rsc":!1});let d=K.getRootSpanAttributes();if(!d)return;if(d.get("next.span_type")!==m.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${d.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let e=d.get("next.route");if(e){let a=`${J} ${e}`;c.setAttributes({"next.route":e,"http.route":e,"next.span_name":a}),c.updateName(a)}else c.updateName(`${J} ${a.url}`)}),g=async g=>{var i,j;let k=async({previousCacheEntry:f})=>{try{if(!(0,h.getRequestMeta)(a,"minimalMode")&&A&&B&&!f)return b.statusCode=404,b.setHeader("x-nextjs-cache","REVALIDATED"),b.end("This page could not be found"),null;let e=await d(g);a.fetchMetrics=M.renderOpts.fetchMetrics;let i=M.renderOpts.pendingWaitUntil;i&&c.waitUntil&&(c.waitUntil(i),i=void 0);let j=M.renderOpts.collectedTags;if(!F)return await (0,o.I)(N,O,e,M.renderOpts.pendingWaitUntil),null;{let a=await e.blob(),b=(0,p.toNodeOutgoingHttpHeaders)(e.headers);j&&(b[r.NEXT_CACHE_TAGS_HEADER]=j),!b["content-type"]&&a.type&&(b["content-type"]=a.type);let c=void 0!==M.renderOpts.collectedRevalidate&&!(M.renderOpts.collectedRevalidate>=r.INFINITE_CACHE)&&M.renderOpts.collectedRevalidate,d=void 0===M.renderOpts.collectedExpire||M.renderOpts.collectedExpire>=r.INFINITE_CACHE?void 0:M.renderOpts.collectedExpire;return{value:{kind:t.CachedRouteKind.APP_ROUTE,status:e.status,body:Buffer.from(await a.arrayBuffer()),headers:b},cacheControl:{revalidate:c,expire:d}}}}catch(b){throw(null==f?void 0:f.isStale)&&await D.onRequestError(a,b,{routerKind:"App Router",routePath:e,routeType:"route",revalidateReason:(0,n.c)({isRevalidate:I,isOnDemandRevalidate:A})},z),b}},l=await D.handleResponse({req:a,nextConfig:w,cacheKey:G,routeKind:f.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:y,isRoutePPREnabled:!1,isOnDemandRevalidate:A,revalidateOnlyGenerated:B,responseGenerator:k,waitUntil:c.waitUntil});if(!F)return null;if((null==l||null==(i=l.value)?void 0:i.kind)!==t.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==l||null==(j=l.value)?void 0:j.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});(0,h.getRequestMeta)(a,"minimalMode")||b.setHeader("x-nextjs-cache",A?"REVALIDATED":l.isMiss?"MISS":l.isStale?"STALE":"HIT"),x&&b.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let m=(0,p.fromNodeOutgoingHttpHeaders)(l.value.headers);return(0,h.getRequestMeta)(a,"minimalMode")&&F||m.delete(r.NEXT_CACHE_TAGS_HEADER),!l.cacheControl||b.getHeader("Cache-Control")||m.get("Cache-Control")||m.set("Cache-Control",(0,q.getCacheControlHeader)(l.cacheControl)),await (0,o.I)(N,O,new Response(l.value.body,{headers:m,status:l.value.status||200})),null};L?await g(L):await K.withPropagatedContext(a.headers,()=>K.trace(m.BaseServerSpan.handleRequest,{spanName:`${J} ${a.url}`,kind:i.SpanKind.SERVER,attributes:{"http.method":J,"http.target":a.url}},g))}catch(b){if(b instanceof s.NoFallbackError||await D.onRequestError(a,b,{routerKind:"App Router",routePath:E,routeType:"route",revalidateReason:(0,n.c)({isRevalidate:I,isOnDemandRevalidate:A})}),F)throw b;return await (0,o.I)(N,O,new Response(null,{status:500})),null}}},19121:a=>{"use strict";a.exports=require("next/dist/server/app-render/action-async-storage.external.js")},29294:a=>{"use strict";a.exports=require("next/dist/server/app-render/work-async-storage.external.js")},44870:a=>{"use strict";a.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},57975:a=>{"use strict";a.exports=require("node:util")},63033:a=>{"use strict";a.exports=require("next/dist/server/app-render/work-unit-async-storage.external.js")},77598:a=>{"use strict";a.exports=require("node:crypto")},78335:()=>{},86439:a=>{"use strict";a.exports=require("next/dist/shared/lib/no-fallback-error.external")},96487:()=>{}};var b=require("../../../../webpack-runtime.js");b.C(a);var c=b.X(0,[5873,1428,1692,8755],()=>b(b.s=12465));module.exports=c})();
1
+ (()=>{var a={};a.id=1449,a.ids=[1449],a.modules={261:a=>{"use strict";a.exports=require("next/dist/shared/lib/router/utils/app-paths")},3295:a=>{"use strict";a.exports=require("next/dist/server/app-render/after-task-async-storage.external.js")},4573:a=>{"use strict";a.exports=require("node:buffer")},10846:a=>{"use strict";a.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},12465:(a,b,c)=>{"use strict";c.r(b),c.d(b,{handler:()=>J,patchFetch:()=>I,routeModule:()=>E,serverHooks:()=>H,workAsyncStorage:()=>F,workUnitAsyncStorage:()=>G});var d={};c.r(d),c.d(d,{POST:()=>D,revalidate:()=>z});var e=c(95736),f=c(9117),g=c(4044),h=c(39326),i=c(32324),j=c(261),k=c(54290),l=c(85328),m=c(38928),n=c(46595),o=c(3421),p=c(17679),q=c(41681),r=c(63446),s=c(86439),t=c(51356),u=c(10641),v=c(58755);let w=process.env.LIVEKIT_API_KEY,x=process.env.LIVEKIT_API_SECRET,y=process.env.LIVEKIT_URL,z=0;function A(a){let b=process.env.LIVEKIT_PUBLIC_URL||process.env.NEXT_PUBLIC_LIVEKIT_URL,c=a.headers.get("x-forwarded-proto"),d=(a.headers.get("x-forwarded-host")||a.headers.get("host")||"localhost").split(",")[0].trim(),e=d.split(":")[0],f=d.split(":")[1],g="https"===c||a.url.startsWith("https://");return e.includes(".ts.net")?`wss://${e}:3443`:b&&"auto"!==b?b:g?`wss://${e}:${f||"3443"}`:`ws://${e}:7880`}let B=(process.env.ROBOPARK_SCHEDULER_URL||"http://host.docker.internal:8080").replace(/\/+$/,"");async function C(a,b){let c=(b.headers.get("x-forwarded-host")||b.headers.get("host")||"localhost").split(",")[0].trim(),d=(b.headers.get("x-forwarded-proto")||(b.url.startsWith("https://")?"https":"http")).split(",")[0].trim();try{let e=await fetch(`${B}/api/monitor-token`,{method:"POST",headers:{"content-type":"application/json","x-forwarded-host":c,"x-forwarded-proto":d},body:JSON.stringify({room_name:a}),cache:"no-store",signal:AbortSignal.timeout(8e3)}),f=await e.json().catch(()=>null);if(!e.ok||!f?.token)return u.NextResponse.json({error:f?.detail||`Scheduler returned ${e.status}`},{status:200===e.status?502:e.status});let g=/^wss?:\/\/(localhost|127\.0\.0\.1|\[?::1\]?|0\.0\.0\.0)(:|$)/i.test(String(f.url||""))?A(b):f.url;return u.NextResponse.json({token:f.token,serverUrl:g},{headers:{"Cache-Control":"no-store"}})}catch(b){let a=b instanceof Error?b.message:"unknown error";return u.NextResponse.json({error:`Scheduler at ${B} is unreachable (${a}).`},{status:503})}}async function D(a){let b=await a.json().catch(()=>({})),c="string"==typeof b.room_name?b.room_name:"";if(!/^robopark-[a-zA-Z0-9_-]{1,64}$/.test(c))return u.NextResponse.json({error:"Invalid room"},{status:400});if(!w||!x||!y)return C(c,a);let d=new v.mk(w,x,{identity:`monitor_${crypto.randomUUID()}`,name:"RoboPark Monitor",ttl:"5m"});return d.addGrant({room:c,roomJoin:!0,canSubscribe:!0,canPublish:!1,canPublishData:!1}),u.NextResponse.json({token:await d.toJwt(),serverUrl:A(a)},{headers:{"Cache-Control":"no-store"}})}let E=new e.AppRouteRouteModule({definition:{kind:f.RouteKind.APP_ROUTE,page:"/api/robopark/monitor-token/route",pathname:"/api/robopark/monitor-token",filename:"route",bundlePath:"app/api/robopark/monitor-token/route"},distDir:".next",relativeProjectDir:"",resolvedPagePath:"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\app\\api\\robopark\\monitor-token\\route.ts",nextConfigOutput:"standalone",userland:d}),{workAsyncStorage:F,workUnitAsyncStorage:G,serverHooks:H}=E;function I(){return(0,g.patchFetch)({workAsyncStorage:F,workUnitAsyncStorage:G})}async function J(a,b,c){var d;let e="/api/robopark/monitor-token/route";"/index"===e&&(e="/");let g=await E.prepare(a,b,{srcPage:e,multiZoneDraftMode:!1});if(!g)return b.statusCode=400,b.end("Bad Request"),null==c.waitUntil||c.waitUntil.call(c,Promise.resolve()),null;let{buildId:u,params:v,nextConfig:w,isDraftMode:x,prerenderManifest:y,routerServerContext:z,isOnDemandRevalidate:A,revalidateOnlyGenerated:B,resolvedPathname:C}=g,D=(0,j.normalizeAppPath)(e),F=!!(y.dynamicRoutes[D]||y.routes[C]);if(F&&!x){let a=!!y.routes[C],b=y.dynamicRoutes[D];if(b&&!1===b.fallback&&!a)throw new s.NoFallbackError}let G=null;!F||E.isDev||x||(G="/index"===(G=C)?"/":G);let H=!0===E.isDev||!F,I=F&&!H,J=a.method||"GET",K=(0,i.getTracer)(),L=K.getActiveScopeSpan(),M={params:v,prerenderManifest:y,renderOpts:{experimental:{cacheComponents:!!w.experimental.cacheComponents,authInterrupts:!!w.experimental.authInterrupts},supportsDynamicResponse:H,incrementalCache:(0,h.getRequestMeta)(a,"incrementalCache"),cacheLifeProfiles:null==(d=w.experimental)?void 0:d.cacheLife,isRevalidate:I,waitUntil:c.waitUntil,onClose:a=>{b.on("close",a)},onAfterTaskError:void 0,onInstrumentationRequestError:(b,c,d)=>E.onRequestError(a,b,d,z)},sharedContext:{buildId:u}},N=new k.NodeNextRequest(a),O=new k.NodeNextResponse(b),P=l.NextRequestAdapter.fromNodeNextRequest(N,(0,l.signalFromNodeResponse)(b));try{let d=async c=>E.handle(P,M).finally(()=>{if(!c)return;c.setAttributes({"http.status_code":b.statusCode,"next.rsc":!1});let d=K.getRootSpanAttributes();if(!d)return;if(d.get("next.span_type")!==m.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${d.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let e=d.get("next.route");if(e){let a=`${J} ${e}`;c.setAttributes({"next.route":e,"http.route":e,"next.span_name":a}),c.updateName(a)}else c.updateName(`${J} ${a.url}`)}),g=async g=>{var i,j;let k=async({previousCacheEntry:f})=>{try{if(!(0,h.getRequestMeta)(a,"minimalMode")&&A&&B&&!f)return b.statusCode=404,b.setHeader("x-nextjs-cache","REVALIDATED"),b.end("This page could not be found"),null;let e=await d(g);a.fetchMetrics=M.renderOpts.fetchMetrics;let i=M.renderOpts.pendingWaitUntil;i&&c.waitUntil&&(c.waitUntil(i),i=void 0);let j=M.renderOpts.collectedTags;if(!F)return await (0,o.I)(N,O,e,M.renderOpts.pendingWaitUntil),null;{let a=await e.blob(),b=(0,p.toNodeOutgoingHttpHeaders)(e.headers);j&&(b[r.NEXT_CACHE_TAGS_HEADER]=j),!b["content-type"]&&a.type&&(b["content-type"]=a.type);let c=void 0!==M.renderOpts.collectedRevalidate&&!(M.renderOpts.collectedRevalidate>=r.INFINITE_CACHE)&&M.renderOpts.collectedRevalidate,d=void 0===M.renderOpts.collectedExpire||M.renderOpts.collectedExpire>=r.INFINITE_CACHE?void 0:M.renderOpts.collectedExpire;return{value:{kind:t.CachedRouteKind.APP_ROUTE,status:e.status,body:Buffer.from(await a.arrayBuffer()),headers:b},cacheControl:{revalidate:c,expire:d}}}}catch(b){throw(null==f?void 0:f.isStale)&&await E.onRequestError(a,b,{routerKind:"App Router",routePath:e,routeType:"route",revalidateReason:(0,n.c)({isRevalidate:I,isOnDemandRevalidate:A})},z),b}},l=await E.handleResponse({req:a,nextConfig:w,cacheKey:G,routeKind:f.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:y,isRoutePPREnabled:!1,isOnDemandRevalidate:A,revalidateOnlyGenerated:B,responseGenerator:k,waitUntil:c.waitUntil});if(!F)return null;if((null==l||null==(i=l.value)?void 0:i.kind)!==t.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==l||null==(j=l.value)?void 0:j.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});(0,h.getRequestMeta)(a,"minimalMode")||b.setHeader("x-nextjs-cache",A?"REVALIDATED":l.isMiss?"MISS":l.isStale?"STALE":"HIT"),x&&b.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let m=(0,p.fromNodeOutgoingHttpHeaders)(l.value.headers);return(0,h.getRequestMeta)(a,"minimalMode")&&F||m.delete(r.NEXT_CACHE_TAGS_HEADER),!l.cacheControl||b.getHeader("Cache-Control")||m.get("Cache-Control")||m.set("Cache-Control",(0,q.getCacheControlHeader)(l.cacheControl)),await (0,o.I)(N,O,new Response(l.value.body,{headers:m,status:l.value.status||200})),null};L?await g(L):await K.withPropagatedContext(a.headers,()=>K.trace(m.BaseServerSpan.handleRequest,{spanName:`${J} ${a.url}`,kind:i.SpanKind.SERVER,attributes:{"http.method":J,"http.target":a.url}},g))}catch(b){if(b instanceof s.NoFallbackError||await E.onRequestError(a,b,{routerKind:"App Router",routePath:D,routeType:"route",revalidateReason:(0,n.c)({isRevalidate:I,isOnDemandRevalidate:A})}),F)throw b;return await (0,o.I)(N,O,new Response(null,{status:500})),null}}},19121:a=>{"use strict";a.exports=require("next/dist/server/app-render/action-async-storage.external.js")},29294:a=>{"use strict";a.exports=require("next/dist/server/app-render/work-async-storage.external.js")},44870:a=>{"use strict";a.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},57975:a=>{"use strict";a.exports=require("node:util")},63033:a=>{"use strict";a.exports=require("next/dist/server/app-render/work-unit-async-storage.external.js")},77598:a=>{"use strict";a.exports=require("node:crypto")},78335:()=>{},86439:a=>{"use strict";a.exports=require("next/dist/shared/lib/no-fallback-error.external")},96487:()=>{}};var b=require("../../../../webpack-runtime.js");b.C(a);var c=b.X(0,[5873,1428,1692,8755],()=>b(b.s=12465));module.exports=c})();
@@ -1 +1 @@
1
- (()=>{var a={};a.id=1426,a.ids=[1426],a.modules={261:a=>{"use strict";a.exports=require("next/dist/shared/lib/router/utils/app-paths")},3295:a=>{"use strict";a.exports=require("next/dist/server/app-render/after-task-async-storage.external.js")},3787:(a,b,c)=>{"use strict";c.d(b,{i:()=>g});let d=(process.env.WEBHOOK_URL||"http://agent:8889").replace(/\/+$/,""),e=Promise.resolve();async function f(a){let b=await fetch(`${d}/settings`,{cache:"no-store",signal:AbortSignal.timeout(8e3)});if(!b.ok)throw Error(`Settings registry returned ${b.status}`);let c=await b.json(),e=structuredClone(c.settings?.device_registry||{}),f=await a(e),g=await fetch(`${d}/settings`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({settings:{device_registry:e}}),signal:AbortSignal.timeout(8e3)});if(!g.ok)throw Error(`Settings registry update returned ${g.status}`);return f}function g(a){let b=e.then(()=>f(a),()=>f(a));return e=b.then(()=>void 0,()=>void 0),b}},4573:a=>{"use strict";a.exports=require("node:buffer")},10846:a=>{"use strict";a.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},19121:a=>{"use strict";a.exports=require("next/dist/server/app-render/action-async-storage.external.js")},24008:(a,b,c)=>{"use strict";function d(a,b){let c=a.device_registry||{},d=String(b.robotId||"").trim(),g=String(b.characterId||"").trim();for(let a of[d,g])if(a&&c[a])return f(a);for(let a of[d,g]){let b=e(a);if(!b)continue;let d=Object.entries(c).find(([,a])=>e(a?.character_id)===b);if(d)return f(d[0])}return f(d||g)}function e(a){return String(a||"").trim().toLowerCase().replace(/_heb$/,"")}function f(a){return a.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}c.d(b,{_1:()=>d})},29294:a=>{"use strict";a.exports=require("next/dist/server/app-render/work-async-storage.external.js")},44870:a=>{"use strict";a.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},46131:(a,b,c)=>{"use strict";c.r(b),c.d(b,{handler:()=>ai,patchFetch:()=>ah,routeModule:()=>ad,serverHooks:()=>ag,workAsyncStorage:()=>ae,workUnitAsyncStorage:()=>af});var d={};c.r(d),c.d(d,{DELETE:()=>ac,GET:()=>$,PATCH:()=>ab,POST:()=>_,PUT:()=>aa,dynamic:()=>D});var e=c(95736),f=c(9117),g=c(4044),h=c(39326),i=c(32324),j=c(261),k=c(54290),l=c(85328),m=c(38928),n=c(46595),o=c(3421),p=c(17679),q=c(41681),r=c(63446),s=c(86439),t=c(51356),u=c(10641),v=c(58755),w=c(58553),x=c(99435);let y=(process.env.V2_SCHEDULER_URL||process.env.SCHEDULER_URL||"http://192.168.1.14:8080").replace(/\/+$/,"");async function z(a,b=""){let c=b&&!a.includes("?")?b.startsWith("?")?b:`?${b}`:"";try{let b=await fetch(`${y}${a}${c}`,{cache:"no-store",signal:AbortSignal.timeout(12e3)});return new Response(b.body,{status:b.status,headers:{"content-type":b.headers.get("content-type")||"application/json","cache-control":"no-store","x-data-source":"robot-scheduler"}})}catch(a){return u.NextResponse.json({error:a instanceof Error?a.message:"Scheduler unavailable"},{status:503})}}var A=c(3787),B=c(75310),C=c(24008);let D="force-dynamic",E=process.env.V2_AGENT_URL||process.env.WEBHOOK_URL||"http://agent:8889",F=(process.env.V2_SCHEDULER_URL||process.env.SCHEDULER_URL||"").replace(/\/+$/,""),G={barracuda:"agent_3001ky0z8wq0fht8xyb0tnkdksdz",jaguar:"agent_4201ky0zhwn4fz7bwy9767wt6g3t",magnus:"agent_5601ky0ymahreyft2xz9xht0dj4v",palladin:"agent_0001ky7mxx2ce4pseeyn6wrtnrz8",panda:"agent_4701ky0xkz89f8t993tmg5t8t23r",titan:"agent_2501ky0x8t39fh5ske8tz3148b26",vixen:"agent_6701ky0nfavke0ysrpj5v38m1cry",volt:"agent_4101ky97n2pze4p8ax3dgb3hbc3c"},H=[{id:"barracuda",name:"Barracuda",img:"/static/robopark/barracuda.png"},{id:"jaguar",name:"Jaguar",img:"/static/robopark/jaguar.png"},{id:"magnus",name:"Magnus",img:"/static/robopark/magnus.jpg"},{id:"palladin",name:"Paladin",img:"/static/robopark/titan.jpg"},{id:"panda",name:"RoboPanda",img:"/static/robopark/panda.png"},{id:"titan",name:"Titan",img:"/static/robopark/titan.jpg"},{id:"vixen",name:"RoboVixen",img:"/static/robopark/bmw.png"},{id:"volt",name:"Volt",img:"/static/robopark/volt.png"}];function I(a){return String(a||"").toLowerCase().replace(/\bvoice\b/g,"").replace(/^robo/,"").replace(/[^a-z0-9]/g,"").replace(/^paladin$/,"palladin").replace(/^ronin$/,"panda")}function J(a){let b=[a.id,a.display_name,a.name].map(I);return a.elevenlabs_agent_id||b.map(a=>G[a]).find(Boolean)||null}function K(a,b=[]){let c=[...b,...a.characters||[]],d=new Set;return[...H.map(a=>{let b=new Set([I(a.id),I(a.name)]),e=c.find(a=>!d.has(a)&&[a.id,a.name,a.display_name].some(a=>b.has(I(a))));e&&d.add(e);let f={...a,...e||{}};return{...f,canonical_id:a.id,display_name:f.display_name||a.name,voice_stack_id:f.voice_stack_id||f.id,img:f.img||a.img,elevenlabs_agent_id:J(f)||G[a.id],binding_source:e?.elevenlabs_agent_id?"scheduler":"verified-session-ledger"}}),...c.filter(a=>!d.has(a)).map(a=>({...a,display_name:a.display_name||a.name,voice_stack_id:a.voice_stack_id||a.id,elevenlabs_agent_id:J(a),binding_source:a.elevenlabs_agent_id?"scheduler":J(a)?"verified-session-ledger":null}))]}async function L(a){try{let b=await fetch(`${F}/api/character-presets`,{cache:"no-store",signal:AbortSignal.timeout(3e3)});if(!b.ok)throw Error(`scheduler returned ${b.status}`);let c=await b.json(),d=Array.isArray(c)?c:Array.isArray(c?.presets)?c.presets:[];return u.NextResponse.json(K(a,d),{headers:{"cache-control":"no-store","x-data-source":"scheduler+durable-character-catalog"}})}catch{return u.NextResponse.json(K(a),{headers:{"cache-control":"no-store","x-data-source":"durable-character-catalog"}})}}async function M(a){let b=process.env.ROBOPARK_DEVICE_TOKEN||process.env.ROBOPARK_FLEET_TOKEN;if(F&&b)try{await fetch(`${F}/api/transcript-ledger/ingest`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${b}`},body:JSON.stringify(a),signal:AbortSignal.timeout(8e3)})}catch{}}async function N(a){let{LIVEKIT_API_KEY:b,LIVEKIT_API_SECRET:c}=process.env;if(!b||!c)return u.NextResponse.json({error:"LiveKit browser-call signing is unavailable"},{status:503});let d=await a.json().catch(()=>({})),e="string"==typeof d.character_preset_id?d.character_preset_id:"",f=await (0,x.U)(),g=(f.characters||[]).find(a=>a.id===e);if(!g)return u.NextResponse.json({error:"Character preset was not found"},{status:404});let h=crypto.randomUUID().replaceAll("-",""),i=`browser-test-${h}`,j=`operator:${h}`,k=crypto.randomUUID().replaceAll("-",""),l=new v.mk(b,c,{identity:j,name:"string"==typeof d.client_name&&d.client_name.trim()?d.client_name.trim().slice(0,80):"RoboPark Operator",metadata:JSON.stringify({character_id:e,voice_stack_id:"string"==typeof d.voice_stack_id?d.voice_stack_id:e,participant_role:"operator_test"}),ttl:"30m"});return l.addGrant({room:i,roomJoin:!0,canPublish:!0,canPublishData:!0,canSubscribe:!0}),l.roomConfig=new w.w7_({emptyTimeout:30,departureTimeout:2,agents:[new w.JsN({agentName:"",metadata:JSON.stringify({mode:"browser_test"})})]}),await M({source:"robovoice",engine:"robovoice",engine_conversation_id:i,robot_id:"operator-call",character_id:e,model_provider:g.llm_provider||f.llm_provider,model_name:g.ollama_model||g.groq_model||f.ollama_model||f.groq_model,started_at:new Date().toISOString(),labels:["browser-call"],metadata:{room_name:i,voice_stack_id:"string"==typeof d.voice_stack_id?d.voice_stack_id:e},turns:[]}),(0,B.Qy)({session_id:i,robot_id:null,character_id:e,character_name:g.name||e,engine:"robovoice",room_name:i,source:"browser-test",started_at:new Date().toISOString()}),u.NextResponse.json({session_id:i,event_token:k,server_url:function(a){let b=process.env.LIVEKIT_PUBLIC_URL||process.env.NEXT_PUBLIC_LIVEKIT_URL;if(b&&"auto"!==b)return b;let c=new URL(a.url);return`${"https:"===c.protocol?"wss":"ws"}://${c.host}`}(a),token:await l.toJwt(),room_name:i,character:{id:g.id,name:g.name}},{headers:{"Cache-Control":"no-store"}})}async function O(a){let b,c=String(a.agent_id||"").trim();if(!/^agent_[A-Za-z0-9]{8,80}$/.test(c))return u.NextResponse.json({error:"A valid ElevenLabs agent binding is required"},{status:400});try{let d="string"==typeof a.branch_id&&/^agtbrch_[A-Za-z0-9]+$/.test(a.branch_id)?`?branch_id=${encodeURIComponent(a.branch_id)}`:"";b=await fetch(`${E.replace(/\/$/,"")}/elevenlabs/agents/${encodeURIComponent(c)}/signed-url${d}`,{cache:"no-store",signal:AbortSignal.timeout(2e4)})}catch(c){let a=c instanceof Error?c.name:"",b="TimeoutError"===a||"AbortError"===a;return u.NextResponse.json({error:b?"Voice signing timed out while contacting the agent service":`Voice signing service is unreachable: ${c instanceof Error?c.message:String(c)}`,retryable:!0},{status:b?504:502,headers:{"cache-control":"no-store"}})}let d=await b.json().catch(()=>({}));if(!b.ok||!d.signed_url)return u.NextResponse.json({error:d.detail||d.error||`ElevenLabs signing returned ${b.status}`},{status:b.status>=400?b.status:502});let e=`browser-test-${crypto.randomUUID().replaceAll("-","")}`,f=await (0,x.U)(),g=a.robot_id?(0,C._1)(f,{robotId:a.robot_id,characterId:a.character_preset_id}):null;return(0,B.Qy)({session_id:e,robot_id:g,character_id:a.character_preset_id||null,character_name:Q(f)[a.character_preset_id||""]||a.character_preset_id||null,engine:"elevenlabs",room_name:g?`robopark-${g}`:null,source:"character-link",started_at:new Date().toISOString()}),u.NextResponse.json({session_id:e,event_token:crypto.randomUUID().replaceAll("-",""),signed_url:d.signed_url,agent_id:c,branch_id:a.branch_id||null,robot_id:a.robot_id||null,robot_video_ref:a.robot_id||null,character_id:a.character_preset_id||null,source:"frontend-compatibility-fallback"},{headers:{"cache-control":"no-store"}})}async function P(a){if(!a.startsWith("browser-test-"))return u.NextResponse.json({error:"Invalid browser-call session"},{status:400});let{LIVEKIT_URL:b,LIVEKIT_API_KEY:c,LIVEKIT_API_SECRET:d}=process.env;if(b&&c&&d){let e=new v.iz(b.replace(/^ws/,"http"),c,d);await e.deleteRoom(a).catch(()=>void 0)}return u.NextResponse.json({status:"ended",session_id:a})}function Q(a){return Object.fromEntries((a.characters||[]).map(a=>[a.id,a.name]))}let R=["name","description","system_prompt","voice_stack_id","motors","nx","ny","img","elevenlabs_agent_id","elevenlabs_first_message","tts_voice_elevenlabs","prompt_editor_model","prompt_editor_precision"];async function S(a){let b=await fetch(`${E.replace(/\/$/,"")}/settings`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({settings:{characters:a}}),signal:AbortSignal.timeout(12e3)});if(!b.ok)throw Error(`Settings registry returned ${b.status}`)}function T(a){let b="string"==typeof a?a.trim().toLowerCase():"";if(!/^[a-z0-9][a-z0-9_-]{0,47}$/.test(b))throw Error("Character ID must use lowercase letters, numbers, hyphens, or underscores");return b}function U(a,b){for(let c of R)void 0!==b[c]&&(a[c]=b[c])}function V(a,b){let c=a.stt_provider||b.stt_provider||"speaches",d="groq"===c?a.stt_model_groq||b.stt_model_groq||"whisper-large-v3-turbo":a.stt_model_speaches||b.stt_model_speaches||"Systran/faster-whisper-small",e=a.llm_provider||b.llm_provider||"ollama",f="groq"===e?a.groq_model||b.groq_model||"":a.ollama_model||b.ollama_model||"";return{...a,name:`${a.name} voice`,stt_provider:c,stt_model:d,stt_language:a.stt_language||b.stt_language||"auto",llm_provider:e,llm_model:f,tts_provider:a.tts_provider||"configured default",tts_voice:a.tts_voice_elevenlabs||a.tts_voice_kokoro||"",voice_id:a.tts_voice_elevenlabs||a.tts_voice_kokoro||""}}async function W(a){let{LIVEKIT_URL:b,LIVEKIT_API_KEY:c,LIVEKIT_API_SECRET:d}=process.env;if(!b||!c||!d)return[];let e=new v.iz(b.replace(/^ws/,"http"),c,d),f=a.device_registry||{},g=Q(a),h=(await e.listRooms()).filter(a=>a.name.startsWith("robopark-")),i=new Map(await Promise.all(h.map(async a=>{let b=a.name.slice(9),c=await e.listParticipants(a.name).catch(()=>[]),d=c.find(a=>a.identity.startsWith(`robopanda_${b}_`)),f=c.find(a=>a.identity.startsWith("agent-")||4===Number(a.kind)),g=!!d?.tracks?.some(a=>2===Number(a.source)&&!a.muted),h=!!d?.tracks?.some(a=>1===Number(a.source)&&!a.muted);return[b,{room:a,physical:d,agent:f,microphone:g,camera:h}]}))),j=(0,B.f6)();return[...Object.keys(f).map(b=>{let c=i.get(b),d=c?.room,e=j.get(b)||null,h=!!e,k=g[f[b]?.character_id||""],l=!!c?.physical,m=!!c?.microphone,n=!!c?.camera,o=!!c?.agent,p=!!f[b]?.maintenance,q=f[b]?.voice_engine==="elevenlabs"?"elevenlabs":"robovoice",r=l&&(!m||!n||!o),s=a.stt_provider||"speaches",t="groq"===s?a.stt_model_groq:a.stt_model_speaches;return{id:b,robot_id:b,name:k||f[b]?.name||`RoboPark ${b.slice(0,6)}`,character_id:f[b]?.character_id||null,character_name:k||null,voice_engine:q,elevenlabs_agent_id:f[b]?.elevenlabs_agent_id||null,elevenlabs_configured:!!f[b]?.elevenlabs_agent_id,conversation_name:f[b]?.conversation_name||b,camera_url:f[b]?.camera_url||`/fed/media/robots/${encodeURIComponent(b)}/video_feed`,maintenance:p,maintenance_note:f[b]?.maintenance_note||"",status:p?"maintenance":l?r?"degraded":"online":h?"online":"offline",connection_status:l||h?"online":"offline",readiness_code:p?"maintenance":l?r?"degraded":"in_session":h?"in_session":"offline",readiness_message:p?f[b]?.maintenance_note||"Marked for maintenance":!l&&h?"Managed character call is active on this device":l?m?n?o?"Physical kiosk, media and voice worker connected":"Voice worker is not attached":"Camera is not publishing":"Microphone is not publishing":"No physical kiosk participant",room_name:d?.name||`robopark-${b}`,active_session:l||h,monitoring_session:h&&!l,in_session:l&&o||h,call_source:e?.source||null,call_started_at:e?.started_at||null,camera:n,microphone:m,voice_worker:o,hardware:f[b]?.hardware||null,effective_config:{character_id:f[b]?.character_id||null,character_name:k||null,voice_engine:q,elevenlabs_agent_id:f[b]?.elevenlabs_agent_id||null,stt_provider:s,stt_model:t,stt_language:a.stt_language||"auto",hardware_selection:f[b]?.hardware?.desired||f[b]?.hardware?.observed?.selected||null},current_session_id:l?d?.sid:e?e.session_id:null,current_stage:{stage:p?"maintenance":!l&&h?"conversation":l?m?o?"stt_listening":"voice_worker":"microphone_published":"offline",status:p||r?"blocked":l||h?"active":"waiting",label:p?"Maintenance mode":!l&&h?"Managed character call active":l?m?n?o?"Listening for visitor speech":"Waiting for voice worker":"Camera blocked":"Microphone blocked":"Physical kiosk offline"}}}),...Array.from(i.entries()).filter(([a])=>!f[a]).map(([a,b])=>({id:a,robot_id:a,name:`RoboPark ${a.slice(0,6)}`,status:b.physical?"unregistered":"ghost",room_name:b.room.name,active_session:!!b.physical,camera:b.camera,microphone:b.microphone}))]}async function X(a){if(!F)return null;let b=await fetch(`${F}${a}`,{cache:"no-store",signal:AbortSignal.timeout(15e3)});if(!b.ok)throw Error(`Scheduler ${a} returned ${b.status}`);return b.json()}async function Y(a){let[b,c,d]=await Promise.all([W(a).catch(()=>[]),X("/api/devices").catch(()=>[]),X("/api/sessions?active_only=true&limit=200").catch(()=>[])]),e=new Map;for(let a of Array.isArray(c)?c:[]){let b=String(a.id||a.device_id||a.robot_id||"");b&&e.set(b,{...a,id:b,robot_id:b})}for(let a of b){let b=String(a.id||a.robot_id||"");b&&e.set(b,{...e.get(b)||{},...a,id:b,robot_id:b})}for(let a of Array.isArray(d)?d:[]){let b=String(a.robot_id||"");if(!b||"operator-call"===b)continue;let c=e.get(b)||{id:b,robot_id:b,name:a.robot_name||a.character_name||b};e.set(b,{...c,character_id:a.character_id||c.character_id||null,character_name:a.character_name||c.character_name||null,voice_engine:a.engine||c.voice_engine||"elevenlabs",status:"online",connection_status:"online",readiness_code:"in_session",readiness_message:"Managed character call is active",active_session:!0,in_session:!0,monitoring_session:!0,current_session_id:a.session_id||a.id,room_name:a.room_name||c.room_name,current_stage:{stage:"conversation",status:"active",label:"Managed character call active"},call_source:a.source||"control_center",last_activity_at:a.last_activity_at||c.last_activity_at})}return Array.from(e.values())}async function Z(a){let b=await Y(a),c=b.filter(a=>a.active_session).map(a=>({id:a.current_session_id||a.room_name,session_id:a.current_session_id||a.room_name,robot_id:a.id,robot_name:a.name,character_id:a.character_id,character_name:a.character_name,room_name:a.room_name,started_at:a.call_started_at||a.started_at||new Date().toISOString(),status:"active",voice_engine:a.voice_engine||"robovoice",camera_url:a.camera_url,source:a.call_source||("elevenlabs"===a.voice_engine?"elevenlabs-direct":"livekit-v2")})),d=new Set(c.map(a=>a.session_id));for(let a of(0,B.i0)())!d.has(a.session_id)&&(a.robot_id&&b.some(b=>b.id===a.robot_id&&b.active_session)||c.push({id:a.session_id,session_id:a.session_id,robot_id:a.robot_id||"operator-call",robot_name:a.character_name||a.robot_id||"Operator call",character_id:a.character_id,character_name:a.character_name,room_name:a.room_name||a.session_id,started_at:a.started_at,status:"active",voice_engine:a.engine,camera_url:a.robot_id?`/fed/media/robots/${encodeURIComponent(a.robot_id)}/video_feed`:null,source:a.source}));return c}async function $(a,b){let c=(await b.params).path.join("/"),d=new URL(a.url).search;if("character-presets"===c){let a=await (0,x.U)();return F?L(a):u.NextResponse.json(K(a),{headers:{"cache-control":"no-store","x-data-source":"durable-character-catalog"}})}if("elevenlabs/agents"===c)return u.NextResponse.json({agents:H.map(a=>({agent_id:G[a.id],name:a.name,character_id:a.id})),source:"verified-session-ledger"},{headers:{"cache-control":"no-store"}});let e=c.match(/^character-presets\/([^/]+)$/);if(e){let a=decodeURIComponent(e[1]),b=K(await (0,x.U)()).find(b=>b.id===a||b.canonical_id===a||I(b.id)===I(a)||I(b.display_name||b.name)===I(a));return b?u.NextResponse.json(b,{headers:{"cache-control":"no-store","x-data-source":"durable-character-catalog"}}):u.NextResponse.json({error:"Character preset not found"},{status:404})}let f=new Set(["voice-stacks","settings","sessions/stats","history","servers"]);if(F&&(f.has(c)||c.startsWith("voices/")))return z(`/api/${c}`,d);let g=await (0,x.U)();if("voice-stacks"===c)return u.NextResponse.json((g.characters||[]).map(a=>({...a,display_name:a.name,voice_stack_id:a.voice_stack_id||a.id,img:a.img||`/static/robopark/${"robopanda"===a.id?"panda":a.name.toLowerCase().includes("vixen")?"bmw":a.id}.png`})).map(a=>V(a,g)));if(c.startsWith("voices/")){let a=c.slice(7);try{let b=await fetch(`${E.replace(/\/$/,"")}/voices?provider=${encodeURIComponent(a)}`,{cache:"no-store",signal:AbortSignal.timeout(12e3)});if(!b.ok)throw Error(`voice provider returned ${b.status}`);let c=await b.json(),d=Array.isArray(c)?c:c.voices||[];return u.NextResponse.json({provider:a,source:"elevenlabs"===a?"elevenlabs-account-live":"production-provider-live",count:d.length,voices:d})}catch(b){return u.NextResponse.json({provider:a,source:"provider-error",count:0,voices:[],warning:b instanceof Error?b.message:"Voice catalog unavailable"},{status:502})}}if("devices"===c){if(F){let a=await z("/api/devices",d);if(a.ok)return a}return u.NextResponse.json(function(a){let b=a.device_registry||{},c=Q(a);return Object.entries(b).map(([a,b])=>({id:a,device_id:a,name:b.name||`RoboPark ${a.slice(0,6)}`,device_role:b.device_role||"combined",character_id:b.character_id||null,character_name:c[b.character_id||""]||null,status:b.maintenance?"maintenance":"enrolled",connection_status:"offline",voice_engine:b.voice_engine||"robovoice",camera_url:b.camera_url||`/fed/media/robots/${encodeURIComponent(a)}/video_feed`,maintenance:!!b.maintenance,maintenance_note:b.maintenance_note||"",control:b.control||{},source:"local-device-registry"}))}(g),{headers:{"cache-control":"no-store","x-data-source":"local-device-registry"}})}if("robots"===c)return u.NextResponse.json(await Y(g));if("settings"===c)return z("/api/settings",d);if("knowledge-documents"===c)return u.NextResponse.json([]);if("knowledge/models"===c)return u.NextResponse.json({configured:!1,models:[]});if("sessions"===c)return"true"!==new URL(a.url).searchParams.get("active_only")?F?z("/api/sessions",d):u.NextResponse.json([]):u.NextResponse.json(await Z(g));if("sessions/stats"===c)return z("/api/sessions/stats",d);if("telemetry"===c){let a=await Y(g);return u.NextResponse.json({robots:a,totals:{online:a.filter(a=>"online"===a.status).length}})}if("history"===c)return u.NextResponse.json([]);if("servers"===c)return z("/api/servers",d);let h=c.match(/^characters\/([^/]+)\/deployment$/);if(h){let a=decodeURIComponent(h[1]),b=await X("/api/devices").catch(()=>[]),c=(Array.isArray(b)?b:[]).filter(b=>String(b.character_id||b.character_preset_id||"").toLowerCase()===a.toLowerCase()),d=a=>String(a.device_role||a.role||"combined").toLowerCase();return u.NextResponse.json({character_id:a,voice_vision_boxes:c.filter(a=>["voice_vision","combined"].includes(d(a))),motor_nodes:c.filter(a=>["motor","combined"].includes(d(a))),combined_nodes:c.filter(a=>"combined"===d(a)),control_nodes:c,source:"frontend-compatibility-fallback"},{headers:{"cache-control":"no-store"}})}let i=c.match(/^robots\/([^/]+)\/pipeline-status$/);if(i){let a=decodeURIComponent(i[1]),b=(await W(g)).find(b=>b.id===a||b.name===a);return b?u.NextResponse.json({robot_id:b.id,readiness_code:b.readiness_code,readiness_message:b.readiness_message,current_stage:b.current_stage,camera:b.camera,microphone:b.microphone,voice_worker:b.voice_worker,hardware:b.hardware,effective_config:b.effective_config}):u.NextResponse.json({error:"Robot not found"},{status:404})}let j=c.match(/^robots\/([^/]+)\/voice-config$/);if(j){let a=decodeURIComponent(j[1]),b=g.device_registry?.[a];if(!b)return u.NextResponse.json({error:"Robot is not registered"},{status:404});let c=b.voice_stack_id||b.character_id||"",d=(g.characters||[]).find(a=>a.id===c);if(!d)return u.NextResponse.json({error:"Robot has no valid voice stack assignment"},{status:409});let e=V(d,g);return u.NextResponse.json({character_id:b.character_id||null,character_name:Q(g)[b.character_id||""]||null,voice_stack_id:c,voice_stack:e})}return"voice-stacks"===c||"character-presets"===c?u.NextResponse.json([]):u.NextResponse.json({error:"V2 endpoint is not implemented",path:c},{status:501})}async function _(a,b){let c=(await b.params).path.join("/");if("character-presets"===c)try{let b=await (0,x.U)(),c=await a.json(),d=T(c.id||c.name),e=structuredClone(b.characters||[]);if(e.some(a=>a.id===d))return u.NextResponse.json({error:"Character ID already exists"},{status:409});let f={id:d,name:String(c.name||d).trim()};return U(f,c),e.push(f),await S(e),u.NextResponse.json(f,{status:201})}catch(a){return u.NextResponse.json({error:a instanceof Error?a.message:"Character creation failed"},{status:400})}if("sessions/voice-call"===c&&!F)return N(a);let d=c.match(/^sessions\/(browser-test-[a-f0-9]+)\/(joined|transcript|end|heartbeat)$/);if(d){let b=d[1],c=d[2];if("heartbeat"===c)return u.NextResponse.json({status:(0,B.i$)(b)?"ok":"expired",session_id:b});if("joined"===c){let c=await a.json().catch(()=>({}));return(0,B.i$)(b,{connected:!0,conversation_id:"string"==typeof c.conversation_id?c.conversation_id:null}),u.NextResponse.json({status:"ok",session_id:b})}if("end"===c)return(0,B.cJ)(b),await M({source:"robovoice",engine:"robovoice",engine_conversation_id:b,ended_at:new Date().toISOString(),labels:["browser-call"],turns:[]}),P(b);if("transcript"===c){(0,B.i$)(b);let c=await a.json().catch(()=>({})),d="string"==typeof c.text?c.text.trim():"";d&&await M({source:"robovoice",engine:"robovoice",engine_conversation_id:b,robot_id:"operator-call",started_at:"string"==typeof c.timestamp?c.timestamp:new Date().toISOString(),labels:["browser-call"],turns:[{role:"string"==typeof c.role?c.role:"user",text:d,sequence:"number"==typeof c.sequence?c.sequence:void 0,timestamp:"string"==typeof c.timestamp?c.timestamp:new Date().toISOString(),source_id:`${b}:${"number"==typeof c.sequence?c.sequence:crypto.randomUUID()}`}]})}return u.NextResponse.json({status:"ok",session_id:d[1]})}if(!("sessions/voice-call"===c||/^sessions\/[^/]+\/(joined|transcript|end)$/.test(c)||/^robots\/[^/]+\/end-session$/.test(c)))return u.NextResponse.json({error:"Canary control actions are read-only"},{status:409});if(!F)return u.NextResponse.json({error:"V2 scheduler is not configured"},{status:503});let e=await a.text();try{let b=new URL(a.url),d=`${F.replace(/\/$/,"")}/api/${c}${b.search}`,f={"content-type":a.headers.get("content-type")||"application/json"},g=a.headers.get("x-robopark-session-token");g&&(f["x-robopark-session-token"]=g);let h=await fetch(d,{method:"POST",headers:f,body:e||void 0,signal:AbortSignal.timeout(12e3)});if("sessions/voice-call"===c&&(404===h.status||501===h.status))return O(JSON.parse(e||"{}"));return new Response(h.body,{status:h.status,headers:{"content-type":h.headers.get("content-type")||"application/json","x-data-source":"v2-scheduler"}})}catch(a){if("sessions/voice-call"===c)return O(JSON.parse(e||"{}"));return u.NextResponse.json({error:a instanceof Error?a.message:"V2 scheduler action failed"},{status:503})}}async function aa(a,b){let c=(await b.params).path.join("/");if("settings"===c){if(!F)return u.NextResponse.json({error:"Scheduler is not configured"},{status:503});try{let b=await fetch(`${F}/api/settings`,{method:"PUT",headers:{"content-type":a.headers.get("content-type")||"application/json"},body:await a.text(),signal:AbortSignal.timeout(12e3)});return new Response(b.body,{status:b.status,headers:{"content-type":b.headers.get("content-type")||"application/json","cache-control":"no-store","x-data-source":"scheduler"}})}catch(a){return u.NextResponse.json({error:a instanceof Error?a.message:"Scheduler settings update failed"},{status:503})}}let d=c.match(/^character-presets\/([^/]+)$/);if(d)try{let b=T(decodeURIComponent(d[1])),c=await (0,x.U)(),e=structuredClone(c.characters||[]),f=e.find(a=>a.id===b);if(!f)return u.NextResponse.json({error:"Character preset not found"},{status:404});let g=await a.json();return U(f,g),await S(e),u.NextResponse.json(f)}catch(a){return u.NextResponse.json({error:a instanceof Error?a.message:"Character update failed"},{status:400})}let e=c.match(/^robots\/([^/]+)\/voice-config$/);if(e){let b=decodeURIComponent(e[1]),c=await (0,x.U)(),d=c.device_registry?.[b];if(!d?.character_id)return u.NextResponse.json({error:"Robot has no assigned character"},{status:409});let f=await a.json(),g="string"==typeof f.voice_stack_id?f.voice_stack_id:d.voice_stack_id||d.character_id,h=structuredClone(c.characters||[]),i=h.find(a=>a.id===g),j=h.find(a=>a.id===d.character_id);if(!i||!j)return u.NextResponse.json({error:"Selected voice stack or robot character was not found"},{status:404});for(let a of["stt_provider","stt_model_groq","stt_model_speaches","stt_language","llm_provider","groq_model","ollama_model","llm_api_key","temperature","num_ctx","tts_provider","tts_voice_elevenlabs","tts_voice_kokoro","tts_language","max_turns","min_endpointing_delay","allow_interruptions","wake_word_enabled","wake_word_model","wake_word_threshold","wake_word_timeout"])void 0===i[a]?delete j[a]:j[a]=i[a];let k=await fetch(`${E.replace(/\/$/,"")}/settings`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({settings:{characters:h}})});if(!k.ok)return u.NextResponse.json({error:`Settings registry returned ${k.status}`},{status:502});await (0,A.i)(a=>{let c=a[b];if(!c)throw Error("DEVICE_NOT_REGISTERED");return a[b]={...c,voice_stack_id:g,updated_at:new Date().toISOString()},a[b]});let l=V(j,{...c,characters:h});return u.NextResponse.json({character_id:d.character_id,character_name:j.name,voice_stack_id:g,voice_stack:l})}let f=c.match(/^voice-stacks\/([^/]+)$/);if(!f)return u.NextResponse.json({error:"V2 control action is not implemented",path:c},{status:501});let g=decodeURIComponent(f[1]),h=await (0,x.U)(),i=structuredClone(h.characters||[]),j=i.find(a=>a.id===g);if(!j)return u.NextResponse.json({error:"Character voice stack not found"},{status:404});let k=await a.json();for(let a of("string"==typeof k.tts_provider&&(j.tts_provider=k.tts_provider),"string"==typeof k.tts_voice&&k.tts_voice&&("elevenlabs"===(k.tts_provider||j.tts_provider)?j.tts_voice_elevenlabs=k.tts_voice:j.tts_voice_kokoro=k.tts_voice),["stt_provider","stt_language","llm_provider","temperature","num_ctx","max_turns","min_endpointing_delay","allow_interruptions","wake_word_enabled","wake_word_model","wake_word_threshold","wake_word_timeout"]))void 0!==k[a]&&(j[a]=k[a]);"string"==typeof k.stt_model&&("groq"===(k.stt_provider||j.stt_provider||h.stt_provider)?j.stt_model_groq=k.stt_model:j.stt_model_speaches=k.stt_model),"string"==typeof k.llm_model&&("groq"===(k.llm_provider||j.llm_provider||h.llm_provider)?j.groq_model=k.llm_model:j.ollama_model=k.llm_model);let l=await fetch(`${E.replace(/\/$/,"")}/settings`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({settings:{characters:i}})});return l.ok?u.NextResponse.json(V(j,h)):u.NextResponse.json({error:`Settings registry returned ${l.status}`},{status:502})}async function ab(){return u.NextResponse.json({error:"Canary control actions are read-only"},{status:409})}async function ac(a,b){let c=(await b.params).path.join("/").match(/^character-presets\/([^/]+)$/);if(!c)return u.NextResponse.json({error:"Canary control actions are read-only"},{status:409});try{let a=T(decodeURIComponent(c[1])),b=await (0,x.U)(),d=Object.entries(b.device_registry||{}).find(([,b])=>b.character_id===a);if(d)return u.NextResponse.json({error:`Character is assigned to robot ${d[0]}`},{status:409});let e=structuredClone(b.characters||[]),f=e.filter(b=>b.id!==a);if(f.length===e.length)return u.NextResponse.json({error:"Character preset not found"},{status:404});return await S(f),u.NextResponse.json({ok:!0,id:a})}catch(a){return u.NextResponse.json({error:a instanceof Error?a.message:"Character deletion failed"},{status:400})}}let ad=new e.AppRouteRouteModule({definition:{kind:f.RouteKind.APP_ROUTE,page:"/robopark/api/[...path]/route",pathname:"/robopark/api/[...path]",filename:"route",bundlePath:"app/robopark/api/[...path]/route"},distDir:".next",relativeProjectDir:"",resolvedPagePath:"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\app\\robopark\\api\\[...path]\\route.ts",nextConfigOutput:"standalone",userland:d}),{workAsyncStorage:ae,workUnitAsyncStorage:af,serverHooks:ag}=ad;function ah(){return(0,g.patchFetch)({workAsyncStorage:ae,workUnitAsyncStorage:af})}async function ai(a,b,c){var d;let e="/robopark/api/[...path]/route";"/index"===e&&(e="/");let g=await ad.prepare(a,b,{srcPage:e,multiZoneDraftMode:!1});if(!g)return b.statusCode=400,b.end("Bad Request"),null==c.waitUntil||c.waitUntil.call(c,Promise.resolve()),null;let{buildId:u,params:v,nextConfig:w,isDraftMode:x,prerenderManifest:y,routerServerContext:z,isOnDemandRevalidate:A,revalidateOnlyGenerated:B,resolvedPathname:C}=g,D=(0,j.normalizeAppPath)(e),E=!!(y.dynamicRoutes[D]||y.routes[C]);if(E&&!x){let a=!!y.routes[C],b=y.dynamicRoutes[D];if(b&&!1===b.fallback&&!a)throw new s.NoFallbackError}let F=null;!E||ad.isDev||x||(F="/index"===(F=C)?"/":F);let G=!0===ad.isDev||!E,H=E&&!G,I=a.method||"GET",J=(0,i.getTracer)(),K=J.getActiveScopeSpan(),L={params:v,prerenderManifest:y,renderOpts:{experimental:{cacheComponents:!!w.experimental.cacheComponents,authInterrupts:!!w.experimental.authInterrupts},supportsDynamicResponse:G,incrementalCache:(0,h.getRequestMeta)(a,"incrementalCache"),cacheLifeProfiles:null==(d=w.experimental)?void 0:d.cacheLife,isRevalidate:H,waitUntil:c.waitUntil,onClose:a=>{b.on("close",a)},onAfterTaskError:void 0,onInstrumentationRequestError:(b,c,d)=>ad.onRequestError(a,b,d,z)},sharedContext:{buildId:u}},M=new k.NodeNextRequest(a),N=new k.NodeNextResponse(b),O=l.NextRequestAdapter.fromNodeNextRequest(M,(0,l.signalFromNodeResponse)(b));try{let d=async c=>ad.handle(O,L).finally(()=>{if(!c)return;c.setAttributes({"http.status_code":b.statusCode,"next.rsc":!1});let d=J.getRootSpanAttributes();if(!d)return;if(d.get("next.span_type")!==m.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${d.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let e=d.get("next.route");if(e){let a=`${I} ${e}`;c.setAttributes({"next.route":e,"http.route":e,"next.span_name":a}),c.updateName(a)}else c.updateName(`${I} ${a.url}`)}),g=async g=>{var i,j;let k=async({previousCacheEntry:f})=>{try{if(!(0,h.getRequestMeta)(a,"minimalMode")&&A&&B&&!f)return b.statusCode=404,b.setHeader("x-nextjs-cache","REVALIDATED"),b.end("This page could not be found"),null;let e=await d(g);a.fetchMetrics=L.renderOpts.fetchMetrics;let i=L.renderOpts.pendingWaitUntil;i&&c.waitUntil&&(c.waitUntil(i),i=void 0);let j=L.renderOpts.collectedTags;if(!E)return await (0,o.I)(M,N,e,L.renderOpts.pendingWaitUntil),null;{let a=await e.blob(),b=(0,p.toNodeOutgoingHttpHeaders)(e.headers);j&&(b[r.NEXT_CACHE_TAGS_HEADER]=j),!b["content-type"]&&a.type&&(b["content-type"]=a.type);let c=void 0!==L.renderOpts.collectedRevalidate&&!(L.renderOpts.collectedRevalidate>=r.INFINITE_CACHE)&&L.renderOpts.collectedRevalidate,d=void 0===L.renderOpts.collectedExpire||L.renderOpts.collectedExpire>=r.INFINITE_CACHE?void 0:L.renderOpts.collectedExpire;return{value:{kind:t.CachedRouteKind.APP_ROUTE,status:e.status,body:Buffer.from(await a.arrayBuffer()),headers:b},cacheControl:{revalidate:c,expire:d}}}}catch(b){throw(null==f?void 0:f.isStale)&&await ad.onRequestError(a,b,{routerKind:"App Router",routePath:e,routeType:"route",revalidateReason:(0,n.c)({isRevalidate:H,isOnDemandRevalidate:A})},z),b}},l=await ad.handleResponse({req:a,nextConfig:w,cacheKey:F,routeKind:f.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:y,isRoutePPREnabled:!1,isOnDemandRevalidate:A,revalidateOnlyGenerated:B,responseGenerator:k,waitUntil:c.waitUntil});if(!E)return null;if((null==l||null==(i=l.value)?void 0:i.kind)!==t.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==l||null==(j=l.value)?void 0:j.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});(0,h.getRequestMeta)(a,"minimalMode")||b.setHeader("x-nextjs-cache",A?"REVALIDATED":l.isMiss?"MISS":l.isStale?"STALE":"HIT"),x&&b.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let m=(0,p.fromNodeOutgoingHttpHeaders)(l.value.headers);return(0,h.getRequestMeta)(a,"minimalMode")&&E||m.delete(r.NEXT_CACHE_TAGS_HEADER),!l.cacheControl||b.getHeader("Cache-Control")||m.get("Cache-Control")||m.set("Cache-Control",(0,q.getCacheControlHeader)(l.cacheControl)),await (0,o.I)(M,N,new Response(l.value.body,{headers:m,status:l.value.status||200})),null};K?await g(K):await J.withPropagatedContext(a.headers,()=>J.trace(m.BaseServerSpan.handleRequest,{spanName:`${I} ${a.url}`,kind:i.SpanKind.SERVER,attributes:{"http.method":I,"http.target":a.url}},g))}catch(b){if(b instanceof s.NoFallbackError||await ad.onRequestError(a,b,{routerKind:"App Router",routePath:D,routeType:"route",revalidateReason:(0,n.c)({isRevalidate:H,isOnDemandRevalidate:A})}),E)throw b;return await (0,o.I)(M,N,new Response(null,{status:500})),null}}},51455:a=>{"use strict";a.exports=require("node:fs/promises")},57975:a=>{"use strict";a.exports=require("node:util")},63033:a=>{"use strict";a.exports=require("next/dist/server/app-render/work-unit-async-storage.external.js")},75310:(a,b,c)=>{"use strict";c.d(b,{Qy:()=>f,cJ:()=>h,f6:()=>j,i$:()=>g,i0:()=>i});let d=new Map;function e(){let a=Date.now()-1e5;for(let[b,c]of d)c.last_seen<a&&d.delete(b)}function f(a){e(),d.set(a.session_id,{conversation_id:null,connected:!1,...a,last_seen:Date.now()})}function g(a,b){let c=d.get(a);return!!c&&(d.set(a,{...c,...b,last_seen:Date.now()}),!0)}function h(a){return d.delete(a)}function i(){return e(),Array.from(d.values())}function j(){let a=new Map;for(let b of i()){if(!b.robot_id)continue;let c=a.get(b.robot_id);c&&(c.connected||!b.connected)||a.set(b.robot_id,b)}return a}},76760:a=>{"use strict";a.exports=require("node:path")},77598:a=>{"use strict";a.exports=require("node:crypto")},78335:()=>{},86439:a=>{"use strict";a.exports=require("next/dist/shared/lib/no-fallback-error.external")},96487:()=>{},99435:(a,b,c)=>{"use strict";c.d(b,{U:()=>l});var d=c(51455),e=c(76760);let f=(process.env.WEBHOOK_URL||"http://agent:8889").replace(/\/+$/,""),g=null,h=0,i=null;function j(a,b){return{...a,characters:Array.isArray(a.characters)?a.characters:[],device_registry:a.device_registry&&"object"==typeof a.device_registry?a.device_registry:{},registry_source:b}}async function k(){for(let a of[process.env.CAAL_SETTINGS_PATH,process.env.ROBOVOICE_SETTINGS_PATH,(0,e.resolve)(process.cwd(),"..","settings.json"),(0,e.resolve)(process.cwd(),"settings.json")].filter(a=>!!a))try{let b=JSON.parse(await (0,d.readFile)(a,"utf8"));return j(b,"persisted-snapshot")}catch{}return j({},"empty")}async function l(){if(g&&Date.now()<h)return g;if(i)return i;i=(async()=>{try{let a=await fetch(`${f}/settings`,{cache:"no-store",signal:AbortSignal.timeout(1500)});if(!a.ok)throw Error(`Settings registry returned ${a.status}`);let b=await a.json();return g=null,h=0,j(b.settings||b,"live-agent")}catch{return g=await k(),h=Date.now()+15e3,g}})();try{return await i}finally{i=null}}}};var b=require("../../../../webpack-runtime.js");b.C(a);var c=b.X(0,[5873,1428,1692,8755],()=>b(b.s=46131));module.exports=c})();
1
+ (()=>{var a={};a.id=1426,a.ids=[1426],a.modules={261:a=>{"use strict";a.exports=require("next/dist/shared/lib/router/utils/app-paths")},3295:a=>{"use strict";a.exports=require("next/dist/server/app-render/after-task-async-storage.external.js")},3787:(a,b,c)=>{"use strict";c.d(b,{i:()=>g});let d=(process.env.WEBHOOK_URL||"http://agent:8889").replace(/\/+$/,""),e=Promise.resolve();async function f(a){let b=await fetch(`${d}/settings`,{cache:"no-store",signal:AbortSignal.timeout(8e3)});if(!b.ok)throw Error(`Settings registry returned ${b.status}`);let c=await b.json(),e=structuredClone(c.settings?.device_registry||{}),f=await a(e),g=await fetch(`${d}/settings`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({settings:{device_registry:e}}),signal:AbortSignal.timeout(8e3)});if(!g.ok)throw Error(`Settings registry update returned ${g.status}`);return f}function g(a){let b=e.then(()=>f(a),()=>f(a));return e=b.then(()=>void 0,()=>void 0),b}},4573:a=>{"use strict";a.exports=require("node:buffer")},10846:a=>{"use strict";a.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},19121:a=>{"use strict";a.exports=require("next/dist/server/app-render/action-async-storage.external.js")},24008:(a,b,c)=>{"use strict";function d(a,b){let c=a.device_registry||{},d=String(b.robotId||"").trim(),g=String(b.characterId||"").trim();for(let a of[d,g])if(a&&c[a])return f(a);for(let a of[d,g]){let b=e(a);if(!b)continue;let d=Object.entries(c).find(([,a])=>e(a?.character_id)===b);if(d)return f(d[0])}return f(d||g)}function e(a){return String(a||"").trim().toLowerCase().replace(/_heb$/,"")}function f(a){return a.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}c.d(b,{_1:()=>d})},29294:a=>{"use strict";a.exports=require("next/dist/server/app-render/work-async-storage.external.js")},44870:a=>{"use strict";a.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},46131:(a,b,c)=>{"use strict";c.r(b),c.d(b,{handler:()=>ai,patchFetch:()=>ah,routeModule:()=>ad,serverHooks:()=>ag,workAsyncStorage:()=>ae,workUnitAsyncStorage:()=>af});var d={};c.r(d),c.d(d,{DELETE:()=>ac,GET:()=>$,PATCH:()=>ab,POST:()=>_,PUT:()=>aa,dynamic:()=>D});var e=c(95736),f=c(9117),g=c(4044),h=c(39326),i=c(32324),j=c(261),k=c(54290),l=c(85328),m=c(38928),n=c(46595),o=c(3421),p=c(17679),q=c(41681),r=c(63446),s=c(86439),t=c(51356),u=c(10641),v=c(58755),w=c(58553),x=c(99435);let y=(process.env.V2_SCHEDULER_URL||process.env.SCHEDULER_URL||"http://192.168.1.14:8080").replace(/\/+$/,"");async function z(a,b=""){let c=b&&!a.includes("?")?b.startsWith("?")?b:`?${b}`:"";try{let b=await fetch(`${y}${a}${c}`,{cache:"no-store",signal:AbortSignal.timeout(12e3)});return new Response(b.body,{status:b.status,headers:{"content-type":b.headers.get("content-type")||"application/json","cache-control":"no-store","x-data-source":"robot-scheduler"}})}catch(a){return u.NextResponse.json({error:a instanceof Error?a.message:"Scheduler unavailable"},{status:503})}}var A=c(3787),B=c(75310),C=c(24008);let D="force-dynamic",E=process.env.V2_AGENT_URL||process.env.WEBHOOK_URL||"http://agent:8889",F=(process.env.V2_SCHEDULER_URL||process.env.SCHEDULER_URL||"").replace(/\/+$/,""),G={barracuda:"agent_3001ky0z8wq0fht8xyb0tnkdksdz",jaguar:"agent_4201ky0zhwn4fz7bwy9767wt6g3t",magnus:"agent_5601ky0ymahreyft2xz9xht0dj4v",palladin:"agent_0001ky7mxx2ce4pseeyn6wrtnrz8",panda:"agent_4701ky0xkz89f8t993tmg5t8t23r",titan:"agent_2501ky0x8t39fh5ske8tz3148b26",vixen:"agent_6701ky0nfavke0ysrpj5v38m1cry",volt:"agent_4101ky97n2pze4p8ax3dgb3hbc3c"},H=[{id:"barracuda",name:"Barracuda",img:"/static/robopark/barracuda.png"},{id:"jaguar",name:"Jaguar",img:"/static/robopark/jaguar.png"},{id:"magnus",name:"Magnus",img:"/static/robopark/magnus.jpg"},{id:"palladin",name:"Paladin",img:"/static/robopark/titan.jpg"},{id:"panda",name:"RoboPanda",img:"/static/robopark/panda.png"},{id:"titan",name:"Titan",img:"/static/robopark/titan.jpg"},{id:"vixen",name:"RoboVixen",img:"/static/robopark/bmw.png"},{id:"volt",name:"Volt",img:"/static/robopark/volt.png"}];function I(a){return String(a||"").toLowerCase().replace(/\bvoice\b/g,"").replace(/^robo/,"").replace(/[^a-z0-9]/g,"").replace(/^paladin$/,"palladin").replace(/^ronin$/,"panda")}function J(a){let b=[a.id,a.display_name,a.name].map(I);return a.elevenlabs_agent_id||b.map(a=>G[a]).find(Boolean)||null}function K(a,b=[]){let c=[...b,...a.characters||[]],d=new Set;return[...H.map(a=>{let b=new Set([I(a.id),I(a.name)]),e=c.find(a=>!d.has(a)&&[a.id,a.name,a.display_name].some(a=>b.has(I(a))));e&&d.add(e);let f={...a,...e||{}};return{...f,canonical_id:a.id,display_name:f.display_name||a.name,voice_stack_id:f.voice_stack_id||f.id,img:f.img||a.img,elevenlabs_agent_id:J(f)||G[a.id],binding_source:e?.elevenlabs_agent_id?"scheduler":"verified-session-ledger"}}),...c.filter(a=>!d.has(a)).map(a=>({...a,display_name:a.display_name||a.name,voice_stack_id:a.voice_stack_id||a.id,elevenlabs_agent_id:J(a),binding_source:a.elevenlabs_agent_id?"scheduler":J(a)?"verified-session-ledger":null}))]}async function L(a){try{let b=await fetch(`${F}/api/character-presets`,{cache:"no-store",signal:AbortSignal.timeout(3e3)});if(!b.ok)throw Error(`scheduler returned ${b.status}`);let c=await b.json(),d=Array.isArray(c)?c:Array.isArray(c?.presets)?c.presets:[];return u.NextResponse.json(K(a,d),{headers:{"cache-control":"no-store","x-data-source":"scheduler+durable-character-catalog"}})}catch{return u.NextResponse.json(K(a),{headers:{"cache-control":"no-store","x-data-source":"durable-character-catalog"}})}}async function M(a){let b=process.env.ROBOPARK_DEVICE_TOKEN||process.env.ROBOPARK_FLEET_TOKEN;if(F&&b)try{await fetch(`${F}/api/transcript-ledger/ingest`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${b}`},body:JSON.stringify(a),signal:AbortSignal.timeout(8e3)})}catch{}}async function N(a){let{LIVEKIT_API_KEY:b,LIVEKIT_API_SECRET:c}=process.env;if(!b||!c)return u.NextResponse.json({error:"LiveKit browser-call signing is unavailable"},{status:503});let d=await a.json().catch(()=>({})),e="string"==typeof d.character_preset_id?d.character_preset_id:"",f=await (0,x.U)(),g=(f.characters||[]).find(a=>a.id===e);if(!g)return u.NextResponse.json({error:"Character preset was not found"},{status:404});let h=crypto.randomUUID().replaceAll("-",""),i=`browser-test-${h}`,j=`operator:${h}`,k=crypto.randomUUID().replaceAll("-",""),l=new v.mk(b,c,{identity:j,name:"string"==typeof d.client_name&&d.client_name.trim()?d.client_name.trim().slice(0,80):"RoboPark Operator",metadata:JSON.stringify({character_id:e,voice_stack_id:"string"==typeof d.voice_stack_id?d.voice_stack_id:e,participant_role:"operator_test"}),ttl:"30m"});return l.addGrant({room:i,roomJoin:!0,canPublish:!0,canPublishData:!0,canSubscribe:!0}),l.roomConfig=new w.w7_({emptyTimeout:30,departureTimeout:2,agents:[new w.JsN({agentName:"",metadata:JSON.stringify({mode:"browser_test"})})]}),await M({source:"robovoice",engine:"robovoice",engine_conversation_id:i,robot_id:"operator-call",character_id:e,model_provider:g.llm_provider||f.llm_provider,model_name:g.ollama_model||g.groq_model||f.ollama_model||f.groq_model,started_at:new Date().toISOString(),labels:["browser-call"],metadata:{room_name:i,voice_stack_id:"string"==typeof d.voice_stack_id?d.voice_stack_id:e},turns:[]}),(0,B.Qy)({session_id:i,robot_id:null,character_id:e,character_name:g.name||e,engine:"robovoice",room_name:i,source:"browser-test",started_at:new Date().toISOString()}),u.NextResponse.json({session_id:i,event_token:k,server_url:function(a){let b=process.env.LIVEKIT_PUBLIC_URL||process.env.NEXT_PUBLIC_LIVEKIT_URL;if(b&&"auto"!==b)return b;let c=new URL(a.url);return`${"https:"===c.protocol?"wss":"ws"}://${c.host}`}(a),token:await l.toJwt(),room_name:i,character:{id:g.id,name:g.name}},{headers:{"Cache-Control":"no-store"}})}async function O(a){let b,c=String(a.agent_id||"").trim();if(!/^agent_[A-Za-z0-9]{8,80}$/.test(c))return u.NextResponse.json({error:"A valid ElevenLabs agent binding is required"},{status:400});try{let d="string"==typeof a.branch_id&&/^agtbrch_[A-Za-z0-9]+$/.test(a.branch_id)?`?branch_id=${encodeURIComponent(a.branch_id)}`:"";b=await fetch(`${E.replace(/\/$/,"")}/elevenlabs/agents/${encodeURIComponent(c)}/signed-url${d}`,{cache:"no-store",signal:AbortSignal.timeout(2e4)})}catch(c){let a=c instanceof Error?c.name:"",b="TimeoutError"===a||"AbortError"===a;return u.NextResponse.json({error:b?"Voice signing timed out while contacting the agent service":`Voice signing service is unreachable: ${c instanceof Error?c.message:String(c)}`,retryable:!0},{status:b?504:502,headers:{"cache-control":"no-store"}})}let d=await b.json().catch(()=>({}));if(!b.ok||!d.signed_url)return u.NextResponse.json({error:d.detail||d.error||`ElevenLabs signing returned ${b.status}`},{status:b.status>=400?b.status:502});let e=`browser-test-${crypto.randomUUID().replaceAll("-","")}`,f=await (0,x.U)(),g=a.robot_id?(0,C._1)(f,{robotId:a.robot_id,characterId:a.character_preset_id}):null;return(0,B.Qy)({session_id:e,robot_id:g,character_id:a.character_preset_id||null,character_name:Q(f)[a.character_preset_id||""]||a.character_preset_id||null,engine:"elevenlabs",room_name:g?`robopark-${g}`:null,source:"character-link",started_at:new Date().toISOString()}),u.NextResponse.json({session_id:e,event_token:crypto.randomUUID().replaceAll("-",""),signed_url:d.signed_url,agent_id:c,branch_id:a.branch_id||null,robot_id:a.robot_id||null,robot_video_ref:a.robot_id||null,character_id:a.character_preset_id||null,source:"frontend-compatibility-fallback"},{headers:{"cache-control":"no-store"}})}async function P(a){if(!a.startsWith("browser-test-"))return u.NextResponse.json({error:"Invalid browser-call session"},{status:400});let{LIVEKIT_URL:b,LIVEKIT_API_KEY:c,LIVEKIT_API_SECRET:d}=process.env;if(b&&c&&d){let e=new v.iz(b.replace(/^ws/,"http"),c,d);await e.deleteRoom(a).catch(()=>void 0)}return u.NextResponse.json({status:"ended",session_id:a})}function Q(a){return Object.fromEntries((a.characters||[]).map(a=>[a.id,a.name]))}let R=["name","description","system_prompt","voice_stack_id","motors","nx","ny","img","elevenlabs_agent_id","elevenlabs_first_message","tts_voice_elevenlabs","prompt_editor_model","prompt_editor_precision"];async function S(a){let b=await fetch(`${E.replace(/\/$/,"")}/settings`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({settings:{characters:a}}),signal:AbortSignal.timeout(12e3)});if(!b.ok)throw Error(`Settings registry returned ${b.status}`)}function T(a){let b="string"==typeof a?a.trim().toLowerCase():"";if(!/^[a-z0-9][a-z0-9_-]{0,47}$/.test(b))throw Error("Character ID must use lowercase letters, numbers, hyphens, or underscores");return b}function U(a,b){for(let c of R)void 0!==b[c]&&(a[c]=b[c])}function V(a,b){let c=a.stt_provider||b.stt_provider||"speaches",d="groq"===c?a.stt_model_groq||b.stt_model_groq||"whisper-large-v3-turbo":a.stt_model_speaches||b.stt_model_speaches||"Systran/faster-whisper-small",e=a.llm_provider||b.llm_provider||"ollama",f="groq"===e?a.groq_model||b.groq_model||"":a.ollama_model||b.ollama_model||"";return{...a,name:`${a.name} voice`,stt_provider:c,stt_model:d,stt_language:a.stt_language||b.stt_language||"auto",llm_provider:e,llm_model:f,tts_provider:a.tts_provider||"configured default",tts_voice:a.tts_voice_elevenlabs||a.tts_voice_kokoro||"",voice_id:a.tts_voice_elevenlabs||a.tts_voice_kokoro||""}}async function W(a){let{LIVEKIT_URL:b,LIVEKIT_API_KEY:c,LIVEKIT_API_SECRET:d}=process.env;if(!b||!c||!d)return[];let e=new v.iz(b.replace(/^ws/,"http"),c,d),f=a.device_registry||{},g=Q(a),h=(await e.listRooms()).filter(a=>a.name.startsWith("robopark-")),i=new Map(await Promise.all(h.map(async a=>{let b=a.name.slice(9),c=await e.listParticipants(a.name).catch(()=>[]),d=c.find(a=>a.identity.startsWith(`robopanda_${b}_`)),f=c.find(a=>a.identity.startsWith("agent-")||4===Number(a.kind)),g=!!d?.tracks?.some(a=>2===Number(a.source)&&!a.muted),h=!!d?.tracks?.some(a=>1===Number(a.source)&&!a.muted);return[b,{room:a,physical:d,agent:f,microphone:g,camera:h}]}))),j=(0,B.f6)();return[...Object.keys(f).map(b=>{let c=i.get(b),d=c?.room,e=j.get(b)||null,h=!!e,k=g[f[b]?.character_id||""],l=!!c?.physical,m=!!c?.microphone,n=!!c?.camera,o=!!c?.agent,p=!!f[b]?.maintenance,q=f[b]?.voice_engine==="elevenlabs"?"elevenlabs":"robovoice",r=l&&(!m||!n||!o),s=a.stt_provider||"speaches",t="groq"===s?a.stt_model_groq:a.stt_model_speaches;return{id:b,robot_id:b,name:k||f[b]?.name||`RoboPark ${b.slice(0,6)}`,character_id:f[b]?.character_id||null,character_name:k||null,voice_engine:q,elevenlabs_agent_id:f[b]?.elevenlabs_agent_id||null,elevenlabs_configured:!!f[b]?.elevenlabs_agent_id,conversation_name:f[b]?.conversation_name||b,camera_url:f[b]?.camera_url||`/fed/media/robots/${encodeURIComponent(b)}/video_feed`,maintenance:p,maintenance_note:f[b]?.maintenance_note||"",status:p?"maintenance":l?r?"degraded":"online":h?"online":"offline",connection_status:l||h?"online":"offline",readiness_code:p?"maintenance":l?r?"degraded":"in_session":h?"in_session":"offline",readiness_message:p?f[b]?.maintenance_note||"Marked for maintenance":!l&&h?"Managed character call is active on this device":l?m?n?o?"Physical kiosk, media and voice worker connected":"Voice worker is not attached":"Camera is not publishing":"Microphone is not publishing":"No physical kiosk participant",room_name:d?.name||`robopark-${b}`,active_session:l||h,monitoring_session:h&&!l,in_session:l&&o||h,call_source:e?.source||null,call_started_at:e?.started_at||null,camera:n,microphone:m,voice_worker:o,hardware:f[b]?.hardware||null,effective_config:{character_id:f[b]?.character_id||null,character_name:k||null,voice_engine:q,elevenlabs_agent_id:f[b]?.elevenlabs_agent_id||null,stt_provider:s,stt_model:t,stt_language:a.stt_language||"auto",hardware_selection:f[b]?.hardware?.desired||f[b]?.hardware?.observed?.selected||null},current_session_id:l?d?.sid:e?e.session_id:null,current_stage:{stage:p?"maintenance":!l&&h?"conversation":l?m?o?"stt_listening":"voice_worker":"microphone_published":"offline",status:p||r?"blocked":l||h?"active":"waiting",label:p?"Maintenance mode":!l&&h?"Managed character call active":l?m?n?o?"Listening for visitor speech":"Waiting for voice worker":"Camera blocked":"Microphone blocked":"Physical kiosk offline"}}}),...Array.from(i.entries()).filter(([a])=>!f[a]).map(([a,b])=>({id:a,robot_id:a,name:`RoboPark ${a.slice(0,6)}`,status:b.physical?"unregistered":"ghost",room_name:b.room.name,active_session:!!b.physical,camera:b.camera,microphone:b.microphone}))]}async function X(a){if(!F)return null;let b=await fetch(`${F}${a}`,{cache:"no-store",signal:AbortSignal.timeout(15e3)});if(!b.ok)throw Error(`Scheduler ${a} returned ${b.status}`);return b.json()}async function Y(a){let[b,c,d]=await Promise.all([W(a).catch(()=>[]),X("/api/devices").catch(()=>[]),X("/api/sessions?active_only=true&limit=200").catch(()=>[])]),e=new Map;for(let a of Array.isArray(c)?c:[]){let b=String(a.id||a.device_id||a.robot_id||"");b&&e.set(b,{...a,id:b,robot_id:b})}for(let a of b){let b=String(a.id||a.robot_id||"");b&&e.set(b,{...e.get(b)||{},...a,id:b,robot_id:b})}for(let a of Array.isArray(d)?d:[]){let b=String(a.robot_id||"");if(!b||"operator-call"===b)continue;let c=e.get(b)||{id:b,robot_id:b,name:a.robot_name||a.character_name||b};e.set(b,{...c,character_id:a.character_id||c.character_id||null,character_name:a.character_name||c.character_name||null,voice_engine:a.engine||c.voice_engine||"elevenlabs",status:"online",connection_status:"online",readiness_code:"in_session",readiness_message:"Managed character call is active",active_session:!0,in_session:!0,monitoring_session:!0,current_session_id:a.session_id||a.id,room_name:a.room_name||c.room_name,current_stage:{stage:"conversation",status:"active",label:"Managed character call active"},call_source:a.source||"control_center",last_activity_at:a.last_activity_at||c.last_activity_at})}return Array.from(e.values())}async function Z(a){let b=await Y(a),c=b.filter(a=>a.active_session).map(a=>({id:a.current_session_id||a.room_name,session_id:a.current_session_id||a.room_name,robot_id:a.id,robot_name:a.name,character_id:a.character_id,character_name:a.character_name,room_name:a.room_name,started_at:a.call_started_at||a.started_at||new Date().toISOString(),status:"active",voice_engine:a.voice_engine||"robovoice",camera_url:a.camera_url,source:a.call_source||("elevenlabs"===a.voice_engine?"elevenlabs-direct":"livekit-v2")})),d=new Set(c.map(a=>a.session_id));for(let a of(0,B.i0)())!d.has(a.session_id)&&(a.robot_id&&b.some(b=>b.id===a.robot_id&&b.active_session)||c.push({id:a.session_id,session_id:a.session_id,robot_id:a.robot_id||"operator-call",robot_name:a.character_name||a.robot_id||"Operator call",character_id:a.character_id,character_name:a.character_name,room_name:a.room_name||a.session_id,started_at:a.started_at,status:"active",voice_engine:a.engine,camera_url:a.robot_id?`/fed/media/robots/${encodeURIComponent(a.robot_id)}/video_feed`:null,source:a.source}));return c}async function $(a,b){let c=(await b.params).path.join("/"),d=new URL(a.url).search;if("character-presets"===c){let a=await (0,x.U)();return F?L(a):u.NextResponse.json(K(a),{headers:{"cache-control":"no-store","x-data-source":"durable-character-catalog"}})}if("elevenlabs/agents"===c)return u.NextResponse.json({agents:H.map(a=>({agent_id:G[a.id],name:a.name,character_id:a.id})),source:"verified-session-ledger"},{headers:{"cache-control":"no-store"}});let e=c.match(/^character-presets\/([^/]+)$/);if(e){let a=decodeURIComponent(e[1]),b=K(await (0,x.U)()).find(b=>b.id===a||b.canonical_id===a||I(b.id)===I(a)||I(b.display_name||b.name)===I(a));return b?u.NextResponse.json(b,{headers:{"cache-control":"no-store","x-data-source":"durable-character-catalog"}}):u.NextResponse.json({error:"Character preset not found"},{status:404})}let f=new Set(["voice-stacks","settings","sessions/stats","history","servers"]);if(F&&(f.has(c)||c.startsWith("voices/")))return z(`/api/${c}`,d);let g=await (0,x.U)();if("voice-stacks"===c)return u.NextResponse.json((g.characters||[]).map(a=>({...a,display_name:a.name,voice_stack_id:a.voice_stack_id||a.id,img:a.img||`/static/robopark/${"robopanda"===a.id?"panda":a.name.toLowerCase().includes("vixen")?"bmw":a.id}.png`})).map(a=>V(a,g)));if(c.startsWith("voices/")){let a=c.slice(7);try{let b=await fetch(`${E.replace(/\/$/,"")}/voices?provider=${encodeURIComponent(a)}`,{cache:"no-store",signal:AbortSignal.timeout(12e3)});if(!b.ok)throw Error(`voice provider returned ${b.status}`);let c=await b.json(),d=Array.isArray(c)?c:c.voices||[];return u.NextResponse.json({provider:a,source:"elevenlabs"===a?"elevenlabs-account-live":"production-provider-live",count:d.length,voices:d})}catch(b){return u.NextResponse.json({provider:a,source:"provider-error",count:0,voices:[],warning:b instanceof Error?b.message:"Voice catalog unavailable"},{status:502})}}if("devices"===c){if(F){let a=await z("/api/devices",d);if(a.ok)return a}return u.NextResponse.json(function(a){let b=a.device_registry||{},c=Q(a);return Object.entries(b).map(([a,b])=>({id:a,device_id:a,name:b.name||`RoboPark ${a.slice(0,6)}`,device_role:b.device_role||"combined",character_id:b.character_id||null,character_name:c[b.character_id||""]||null,status:b.maintenance?"maintenance":"enrolled",connection_status:"offline",voice_engine:b.voice_engine||"robovoice",camera_url:b.camera_url||`/fed/media/robots/${encodeURIComponent(a)}/video_feed`,maintenance:!!b.maintenance,maintenance_note:b.maintenance_note||"",control:b.control||{},source:"local-device-registry"}))}(g),{headers:{"cache-control":"no-store","x-data-source":"local-device-registry"}})}if("robots"===c)return u.NextResponse.json(await Y(g));if("settings"===c)return z("/api/settings",d);if("knowledge-documents"===c)return u.NextResponse.json([]);if("knowledge/models"===c)return u.NextResponse.json({configured:!1,models:[]});if("sessions"===c)return"true"!==new URL(a.url).searchParams.get("active_only")?F?z("/api/sessions",d):u.NextResponse.json([]):u.NextResponse.json(await Z(g));if("sessions/stats"===c)return z("/api/sessions/stats",d);if("telemetry"===c){let a=await Y(g);return u.NextResponse.json({robots:a,totals:{online:a.filter(a=>"online"===a.status).length}})}if("history"===c)return u.NextResponse.json([]);if("servers"===c)return z("/api/servers",d);let h=c.match(/^characters\/([^/]+)\/deployment$/);if(h){let a=decodeURIComponent(h[1]),b=await X("/api/devices").catch(()=>[]),c=(Array.isArray(b)?b:[]).filter(b=>String(b.character_id||b.character_preset_id||"").toLowerCase()===a.toLowerCase()),d=a=>String(a.device_role||a.role||"combined").toLowerCase();return u.NextResponse.json({character_id:a,voice_vision_boxes:c.filter(a=>["voice_vision","combined"].includes(d(a))),motor_nodes:c.filter(a=>["motor","combined"].includes(d(a))),combined_nodes:c.filter(a=>"combined"===d(a)),control_nodes:c,source:"frontend-compatibility-fallback"},{headers:{"cache-control":"no-store"}})}let i=c.match(/^robots\/([^/]+)\/pipeline-status$/);if(i){let a=decodeURIComponent(i[1]),b=(await W(g)).find(b=>b.id===a||b.name===a);return b?u.NextResponse.json({robot_id:b.id,readiness_code:b.readiness_code,readiness_message:b.readiness_message,current_stage:b.current_stage,camera:b.camera,microphone:b.microphone,voice_worker:b.voice_worker,hardware:b.hardware,effective_config:b.effective_config}):u.NextResponse.json({error:"Robot not found"},{status:404})}let j=c.match(/^robots\/([^/]+)\/voice-config$/);if(j){let a=decodeURIComponent(j[1]),b=g.device_registry?.[a];if(!b)return u.NextResponse.json({error:"Robot is not registered"},{status:404});let c=b.voice_stack_id||b.character_id||"",d=(g.characters||[]).find(a=>a.id===c);if(!d)return u.NextResponse.json({error:"Robot has no valid voice stack assignment"},{status:409});let e=V(d,g);return u.NextResponse.json({character_id:b.character_id||null,character_name:Q(g)[b.character_id||""]||null,voice_stack_id:c,voice_stack:e})}return"voice-stacks"===c||"character-presets"===c?u.NextResponse.json([]):u.NextResponse.json({error:"V2 endpoint is not implemented",path:c},{status:501})}async function _(a,b){let c=(await b.params).path.join("/");if("character-presets"===c)try{let b=await (0,x.U)(),c=await a.json(),d=T(c.id||c.name),e=structuredClone(b.characters||[]);if(e.some(a=>a.id===d))return u.NextResponse.json({error:"Character ID already exists"},{status:409});let f={id:d,name:String(c.name||d).trim()};return U(f,c),e.push(f),await S(e),u.NextResponse.json(f,{status:201})}catch(a){return u.NextResponse.json({error:a instanceof Error?a.message:"Character creation failed"},{status:400})}if("sessions/voice-call"===c&&!F)return N(a);let d=c.match(/^sessions\/(browser-test-[a-f0-9]+)\/(joined|transcript|end|heartbeat)$/);if(d){let b=d[1],c=d[2];if("heartbeat"===c)return u.NextResponse.json({status:(0,B.i$)(b)?"ok":"expired",session_id:b});if("joined"===c){let c=await a.json().catch(()=>({}));return(0,B.i$)(b,{connected:!0,conversation_id:"string"==typeof c.conversation_id?c.conversation_id:null}),u.NextResponse.json({status:"ok",session_id:b})}if("end"===c)return(0,B.cJ)(b),await M({source:"robovoice",engine:"robovoice",engine_conversation_id:b,ended_at:new Date().toISOString(),labels:["browser-call"],turns:[]}),P(b);if("transcript"===c){(0,B.i$)(b);let c=await a.json().catch(()=>({})),d="string"==typeof c.text?c.text.trim():"";d&&await M({source:"robovoice",engine:"robovoice",engine_conversation_id:b,robot_id:"operator-call",started_at:"string"==typeof c.timestamp?c.timestamp:new Date().toISOString(),labels:["browser-call"],turns:[{role:"string"==typeof c.role?c.role:"user",text:d,sequence:"number"==typeof c.sequence?c.sequence:void 0,timestamp:"string"==typeof c.timestamp?c.timestamp:new Date().toISOString(),source_id:`${b}:${"number"==typeof c.sequence?c.sequence:crypto.randomUUID()}`}]})}return u.NextResponse.json({status:"ok",session_id:d[1]})}if(!("sessions/voice-call"===c||/^sessions\/[^/]+\/(joined|transcript|end|heartbeat|keepalive)$/.test(c)||/^robots\/[^/]+\/end-session$/.test(c)))return u.NextResponse.json({error:"Canary control actions are read-only"},{status:409});if(!F)return u.NextResponse.json({error:"V2 scheduler is not configured"},{status:503});let e=await a.text();try{let b=new URL(a.url),d=`${F.replace(/\/$/,"")}/api/${c}${b.search}`,f={"content-type":a.headers.get("content-type")||"application/json"},g=a.headers.get("x-robopark-session-token");g&&(f["x-robopark-session-token"]=g);let h=await fetch(d,{method:"POST",headers:f,body:e||void 0,signal:AbortSignal.timeout(12e3)});if("sessions/voice-call"===c&&(404===h.status||501===h.status))return O(JSON.parse(e||"{}"));return new Response(h.body,{status:h.status,headers:{"content-type":h.headers.get("content-type")||"application/json","x-data-source":"v2-scheduler"}})}catch(a){if("sessions/voice-call"===c)return O(JSON.parse(e||"{}"));return u.NextResponse.json({error:a instanceof Error?a.message:"V2 scheduler action failed"},{status:503})}}async function aa(a,b){let c=(await b.params).path.join("/");if("settings"===c){if(!F)return u.NextResponse.json({error:"Scheduler is not configured"},{status:503});try{let b=await fetch(`${F}/api/settings`,{method:"PUT",headers:{"content-type":a.headers.get("content-type")||"application/json"},body:await a.text(),signal:AbortSignal.timeout(12e3)});return new Response(b.body,{status:b.status,headers:{"content-type":b.headers.get("content-type")||"application/json","cache-control":"no-store","x-data-source":"scheduler"}})}catch(a){return u.NextResponse.json({error:a instanceof Error?a.message:"Scheduler settings update failed"},{status:503})}}let d=c.match(/^character-presets\/([^/]+)$/);if(d)try{let b=T(decodeURIComponent(d[1])),c=await (0,x.U)(),e=structuredClone(c.characters||[]),f=e.find(a=>a.id===b);if(!f)return u.NextResponse.json({error:"Character preset not found"},{status:404});let g=await a.json();return U(f,g),await S(e),u.NextResponse.json(f)}catch(a){return u.NextResponse.json({error:a instanceof Error?a.message:"Character update failed"},{status:400})}let e=c.match(/^robots\/([^/]+)\/voice-config$/);if(e){let b=decodeURIComponent(e[1]),c=await (0,x.U)(),d=c.device_registry?.[b];if(!d?.character_id)return u.NextResponse.json({error:"Robot has no assigned character"},{status:409});let f=await a.json(),g="string"==typeof f.voice_stack_id?f.voice_stack_id:d.voice_stack_id||d.character_id,h=structuredClone(c.characters||[]),i=h.find(a=>a.id===g),j=h.find(a=>a.id===d.character_id);if(!i||!j)return u.NextResponse.json({error:"Selected voice stack or robot character was not found"},{status:404});for(let a of["stt_provider","stt_model_groq","stt_model_speaches","stt_language","llm_provider","groq_model","ollama_model","llm_api_key","temperature","num_ctx","tts_provider","tts_voice_elevenlabs","tts_voice_kokoro","tts_language","max_turns","min_endpointing_delay","allow_interruptions","wake_word_enabled","wake_word_model","wake_word_threshold","wake_word_timeout"])void 0===i[a]?delete j[a]:j[a]=i[a];let k=await fetch(`${E.replace(/\/$/,"")}/settings`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({settings:{characters:h}})});if(!k.ok)return u.NextResponse.json({error:`Settings registry returned ${k.status}`},{status:502});await (0,A.i)(a=>{let c=a[b];if(!c)throw Error("DEVICE_NOT_REGISTERED");return a[b]={...c,voice_stack_id:g,updated_at:new Date().toISOString()},a[b]});let l=V(j,{...c,characters:h});return u.NextResponse.json({character_id:d.character_id,character_name:j.name,voice_stack_id:g,voice_stack:l})}let f=c.match(/^voice-stacks\/([^/]+)$/);if(!f)return u.NextResponse.json({error:"V2 control action is not implemented",path:c},{status:501});let g=decodeURIComponent(f[1]),h=await (0,x.U)(),i=structuredClone(h.characters||[]),j=i.find(a=>a.id===g);if(!j)return u.NextResponse.json({error:"Character voice stack not found"},{status:404});let k=await a.json();for(let a of("string"==typeof k.tts_provider&&(j.tts_provider=k.tts_provider),"string"==typeof k.tts_voice&&k.tts_voice&&("elevenlabs"===(k.tts_provider||j.tts_provider)?j.tts_voice_elevenlabs=k.tts_voice:j.tts_voice_kokoro=k.tts_voice),["stt_provider","stt_language","llm_provider","temperature","num_ctx","max_turns","min_endpointing_delay","allow_interruptions","wake_word_enabled","wake_word_model","wake_word_threshold","wake_word_timeout"]))void 0!==k[a]&&(j[a]=k[a]);"string"==typeof k.stt_model&&("groq"===(k.stt_provider||j.stt_provider||h.stt_provider)?j.stt_model_groq=k.stt_model:j.stt_model_speaches=k.stt_model),"string"==typeof k.llm_model&&("groq"===(k.llm_provider||j.llm_provider||h.llm_provider)?j.groq_model=k.llm_model:j.ollama_model=k.llm_model);let l=await fetch(`${E.replace(/\/$/,"")}/settings`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({settings:{characters:i}})});return l.ok?u.NextResponse.json(V(j,h)):u.NextResponse.json({error:`Settings registry returned ${l.status}`},{status:502})}async function ab(){return u.NextResponse.json({error:"Canary control actions are read-only"},{status:409})}async function ac(a,b){let c=(await b.params).path.join("/").match(/^character-presets\/([^/]+)$/);if(!c)return u.NextResponse.json({error:"Canary control actions are read-only"},{status:409});try{let a=T(decodeURIComponent(c[1])),b=await (0,x.U)(),d=Object.entries(b.device_registry||{}).find(([,b])=>b.character_id===a);if(d)return u.NextResponse.json({error:`Character is assigned to robot ${d[0]}`},{status:409});let e=structuredClone(b.characters||[]),f=e.filter(b=>b.id!==a);if(f.length===e.length)return u.NextResponse.json({error:"Character preset not found"},{status:404});return await S(f),u.NextResponse.json({ok:!0,id:a})}catch(a){return u.NextResponse.json({error:a instanceof Error?a.message:"Character deletion failed"},{status:400})}}let ad=new e.AppRouteRouteModule({definition:{kind:f.RouteKind.APP_ROUTE,page:"/robopark/api/[...path]/route",pathname:"/robopark/api/[...path]",filename:"route",bundlePath:"app/robopark/api/[...path]/route"},distDir:".next",relativeProjectDir:"",resolvedPagePath:"C:\\Users\\yunge\\OneDrive\\Desktop\\ROBOVOICE-main\\frontend\\app\\robopark\\api\\[...path]\\route.ts",nextConfigOutput:"standalone",userland:d}),{workAsyncStorage:ae,workUnitAsyncStorage:af,serverHooks:ag}=ad;function ah(){return(0,g.patchFetch)({workAsyncStorage:ae,workUnitAsyncStorage:af})}async function ai(a,b,c){var d;let e="/robopark/api/[...path]/route";"/index"===e&&(e="/");let g=await ad.prepare(a,b,{srcPage:e,multiZoneDraftMode:!1});if(!g)return b.statusCode=400,b.end("Bad Request"),null==c.waitUntil||c.waitUntil.call(c,Promise.resolve()),null;let{buildId:u,params:v,nextConfig:w,isDraftMode:x,prerenderManifest:y,routerServerContext:z,isOnDemandRevalidate:A,revalidateOnlyGenerated:B,resolvedPathname:C}=g,D=(0,j.normalizeAppPath)(e),E=!!(y.dynamicRoutes[D]||y.routes[C]);if(E&&!x){let a=!!y.routes[C],b=y.dynamicRoutes[D];if(b&&!1===b.fallback&&!a)throw new s.NoFallbackError}let F=null;!E||ad.isDev||x||(F="/index"===(F=C)?"/":F);let G=!0===ad.isDev||!E,H=E&&!G,I=a.method||"GET",J=(0,i.getTracer)(),K=J.getActiveScopeSpan(),L={params:v,prerenderManifest:y,renderOpts:{experimental:{cacheComponents:!!w.experimental.cacheComponents,authInterrupts:!!w.experimental.authInterrupts},supportsDynamicResponse:G,incrementalCache:(0,h.getRequestMeta)(a,"incrementalCache"),cacheLifeProfiles:null==(d=w.experimental)?void 0:d.cacheLife,isRevalidate:H,waitUntil:c.waitUntil,onClose:a=>{b.on("close",a)},onAfterTaskError:void 0,onInstrumentationRequestError:(b,c,d)=>ad.onRequestError(a,b,d,z)},sharedContext:{buildId:u}},M=new k.NodeNextRequest(a),N=new k.NodeNextResponse(b),O=l.NextRequestAdapter.fromNodeNextRequest(M,(0,l.signalFromNodeResponse)(b));try{let d=async c=>ad.handle(O,L).finally(()=>{if(!c)return;c.setAttributes({"http.status_code":b.statusCode,"next.rsc":!1});let d=J.getRootSpanAttributes();if(!d)return;if(d.get("next.span_type")!==m.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${d.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let e=d.get("next.route");if(e){let a=`${I} ${e}`;c.setAttributes({"next.route":e,"http.route":e,"next.span_name":a}),c.updateName(a)}else c.updateName(`${I} ${a.url}`)}),g=async g=>{var i,j;let k=async({previousCacheEntry:f})=>{try{if(!(0,h.getRequestMeta)(a,"minimalMode")&&A&&B&&!f)return b.statusCode=404,b.setHeader("x-nextjs-cache","REVALIDATED"),b.end("This page could not be found"),null;let e=await d(g);a.fetchMetrics=L.renderOpts.fetchMetrics;let i=L.renderOpts.pendingWaitUntil;i&&c.waitUntil&&(c.waitUntil(i),i=void 0);let j=L.renderOpts.collectedTags;if(!E)return await (0,o.I)(M,N,e,L.renderOpts.pendingWaitUntil),null;{let a=await e.blob(),b=(0,p.toNodeOutgoingHttpHeaders)(e.headers);j&&(b[r.NEXT_CACHE_TAGS_HEADER]=j),!b["content-type"]&&a.type&&(b["content-type"]=a.type);let c=void 0!==L.renderOpts.collectedRevalidate&&!(L.renderOpts.collectedRevalidate>=r.INFINITE_CACHE)&&L.renderOpts.collectedRevalidate,d=void 0===L.renderOpts.collectedExpire||L.renderOpts.collectedExpire>=r.INFINITE_CACHE?void 0:L.renderOpts.collectedExpire;return{value:{kind:t.CachedRouteKind.APP_ROUTE,status:e.status,body:Buffer.from(await a.arrayBuffer()),headers:b},cacheControl:{revalidate:c,expire:d}}}}catch(b){throw(null==f?void 0:f.isStale)&&await ad.onRequestError(a,b,{routerKind:"App Router",routePath:e,routeType:"route",revalidateReason:(0,n.c)({isRevalidate:H,isOnDemandRevalidate:A})},z),b}},l=await ad.handleResponse({req:a,nextConfig:w,cacheKey:F,routeKind:f.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:y,isRoutePPREnabled:!1,isOnDemandRevalidate:A,revalidateOnlyGenerated:B,responseGenerator:k,waitUntil:c.waitUntil});if(!E)return null;if((null==l||null==(i=l.value)?void 0:i.kind)!==t.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==l||null==(j=l.value)?void 0:j.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});(0,h.getRequestMeta)(a,"minimalMode")||b.setHeader("x-nextjs-cache",A?"REVALIDATED":l.isMiss?"MISS":l.isStale?"STALE":"HIT"),x&&b.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let m=(0,p.fromNodeOutgoingHttpHeaders)(l.value.headers);return(0,h.getRequestMeta)(a,"minimalMode")&&E||m.delete(r.NEXT_CACHE_TAGS_HEADER),!l.cacheControl||b.getHeader("Cache-Control")||m.get("Cache-Control")||m.set("Cache-Control",(0,q.getCacheControlHeader)(l.cacheControl)),await (0,o.I)(M,N,new Response(l.value.body,{headers:m,status:l.value.status||200})),null};K?await g(K):await J.withPropagatedContext(a.headers,()=>J.trace(m.BaseServerSpan.handleRequest,{spanName:`${I} ${a.url}`,kind:i.SpanKind.SERVER,attributes:{"http.method":I,"http.target":a.url}},g))}catch(b){if(b instanceof s.NoFallbackError||await ad.onRequestError(a,b,{routerKind:"App Router",routePath:D,routeType:"route",revalidateReason:(0,n.c)({isRevalidate:H,isOnDemandRevalidate:A})}),E)throw b;return await (0,o.I)(M,N,new Response(null,{status:500})),null}}},51455:a=>{"use strict";a.exports=require("node:fs/promises")},57975:a=>{"use strict";a.exports=require("node:util")},63033:a=>{"use strict";a.exports=require("next/dist/server/app-render/work-unit-async-storage.external.js")},75310:(a,b,c)=>{"use strict";c.d(b,{Qy:()=>f,cJ:()=>h,f6:()=>j,i$:()=>g,i0:()=>i});let d=new Map;function e(){let a=Date.now()-1e5;for(let[b,c]of d)c.last_seen<a&&d.delete(b)}function f(a){e(),d.set(a.session_id,{conversation_id:null,connected:!1,...a,last_seen:Date.now()})}function g(a,b){let c=d.get(a);return!!c&&(d.set(a,{...c,...b,last_seen:Date.now()}),!0)}function h(a){return d.delete(a)}function i(){return e(),Array.from(d.values())}function j(){let a=new Map;for(let b of i()){if(!b.robot_id)continue;let c=a.get(b.robot_id);c&&(c.connected||!b.connected)||a.set(b.robot_id,b)}return a}},76760:a=>{"use strict";a.exports=require("node:path")},77598:a=>{"use strict";a.exports=require("node:crypto")},78335:()=>{},86439:a=>{"use strict";a.exports=require("next/dist/shared/lib/no-fallback-error.external")},96487:()=>{},99435:(a,b,c)=>{"use strict";c.d(b,{U:()=>l});var d=c(51455),e=c(76760);let f=(process.env.WEBHOOK_URL||"http://agent:8889").replace(/\/+$/,""),g=null,h=0,i=null;function j(a,b){return{...a,characters:Array.isArray(a.characters)?a.characters:[],device_registry:a.device_registry&&"object"==typeof a.device_registry?a.device_registry:{},registry_source:b}}async function k(){for(let a of[process.env.CAAL_SETTINGS_PATH,process.env.ROBOVOICE_SETTINGS_PATH,(0,e.resolve)(process.cwd(),"..","settings.json"),(0,e.resolve)(process.cwd(),"settings.json")].filter(a=>!!a))try{let b=JSON.parse(await (0,d.readFile)(a,"utf8"));return j(b,"persisted-snapshot")}catch{}return j({},"empty")}async function l(){if(g&&Date.now()<h)return g;if(i)return i;i=(async()=>{try{let a=await fetch(`${f}/settings`,{cache:"no-store",signal:AbortSignal.timeout(1500)});if(!a.ok)throw Error(`Settings registry returned ${a.status}`);let b=await a.json();return g=null,h=0,j(b.settings||b,"live-agent")}catch{return g=await k(),h=Date.now()+15e3,g}})();try{return await i}finally{i=null}}}};var b=require("../../../../webpack-runtime.js");b.C(a);var c=b.X(0,[5873,1428,1692,8755],()=>b(b.s=46131));module.exports=c})();
@@ -1,18 +1,19 @@
1
1
  {
2
+ "/_not-found/page": "app/_not-found/page.js",
2
3
  "/api/device-character/route": "app/api/device-character/route.js",
3
4
  "/api/download-piper-model/route": "app/api/download-piper-model/route.js",
4
5
  "/api/models/route": "app/api/models/route.js",
5
- "/api/prewarm/route": "app/api/prewarm/route.js",
6
- "/api/prompt/route": "app/api/prompt/route.js",
7
6
  "/api/reload-tools/route": "app/api/reload-tools/route.js",
7
+ "/api/prewarm/route": "app/api/prewarm/route.js",
8
8
  "/api/robopark/devices/[deviceId]/control/route": "app/api/robopark/devices/[deviceId]/control/route.js",
9
+ "/api/prompt/route": "app/api/prompt/route.js",
9
10
  "/api/robopark/robots/[robotId]/operations/route": "app/api/robopark/robots/[robotId]/operations/route.js",
10
11
  "/api/robopark/sessions/[sessionId]/end/route": "app/api/robopark/sessions/[sessionId]/end/route.js",
11
12
  "/api/robopark/transcripts/[sessionId]/route": "app/api/robopark/transcripts/[sessionId]/route.js",
12
- "/api/setup/complete/route": "app/api/setup/complete/route.js",
13
13
  "/api/setup/status/route": "app/api/setup/status/route.js",
14
14
  "/api/setup/test-groq/route": "app/api/setup/test-groq/route.js",
15
15
  "/api/setup/test-hass/route": "app/api/setup/test-hass/route.js",
16
+ "/api/setup/complete/route": "app/api/setup/complete/route.js",
16
17
  "/api/setup/test-ollama/route": "app/api/setup/test-ollama/route.js",
17
18
  "/api/test-tts/route": "app/api/test-tts/route.js",
18
19
  "/api/setup/test-n8n/route": "app/api/setup/test-n8n/route.js",
@@ -21,38 +22,37 @@
21
22
  "/api/wake-word/status/route": "app/api/wake-word/status/route.js",
22
23
  "/api/wake-word/upload/route": "app/api/wake-word/upload/route.js",
23
24
  "/favicon.ico/route": "app/favicon.ico/route.js",
24
- "/_not-found/page": "app/_not-found/page.js",
25
+ "/api/connection-details/route": "app/api/connection-details/route.js",
25
26
  "/api/kiosk-hardware/route": "app/api/kiosk-hardware/route.js",
26
27
  "/api/model-status/route": "app/api/model-status/route.js",
27
- "/api/connection-details/route": "app/api/connection-details/route.js",
28
- "/api/robopark/device-access/route": "app/api/robopark/device-access/route.js",
29
28
  "/api/robopark/character-ai/route": "app/api/robopark/character-ai/route.js",
30
- "/api/robopark/camera-token/route": "app/api/robopark/camera-token/route.js",
29
+ "/api/robopark/device-access/route": "app/api/robopark/device-access/route.js",
31
30
  "/api/robopark/live-rooms/route": "app/api/robopark/live-rooms/route.js",
32
31
  "/api/robopark/monitor-token/route": "app/api/robopark/monitor-token/route.js",
33
- "/api/robopark/robots/route": "app/api/robopark/robots/route.js",
34
32
  "/api/robopark/servers/[serverId]/metrics/route": "app/api/robopark/servers/[serverId]/metrics/route.js",
33
+ "/api/robopark/robots/route": "app/api/robopark/robots/route.js",
35
34
  "/api/robopark/servers/[serverId]/route": "app/api/robopark/servers/[serverId]/route.js",
36
- "/api/robopark/servers/route": "app/api/robopark/servers/route.js",
37
35
  "/api/robopark/sessions/route": "app/api/robopark/sessions/route.js",
36
+ "/api/robopark/servers/route": "app/api/robopark/servers/route.js",
38
37
  "/api/robopark/vision-caption/route": "app/api/robopark/vision-caption/route.js",
39
- "/api/robovoice/robots/[robotId]/media-health/route": "app/api/robovoice/robots/[robotId]/media-health/route.js",
40
38
  "/api/robopark/robots/[robotId]/voice-engine/route": "app/api/robopark/robots/[robotId]/voice-engine/route.js",
41
- "/api/settings/route": "app/api/settings/route.js",
42
- "/api/turn-credentials/route": "app/api/turn-credentials/route.js",
39
+ "/api/robovoice/robots/[robotId]/media-health/route": "app/api/robovoice/robots/[robotId]/media-health/route.js",
43
40
  "/api/robopark/transcripts/route": "app/api/robopark/transcripts/route.js",
41
+ "/api/turn-credentials/route": "app/api/turn-credentials/route.js",
42
+ "/api/robopark/camera-token/route": "app/api/robopark/camera-token/route.js",
43
+ "/api/settings/route": "app/api/settings/route.js",
44
44
  "/api/wake/route": "app/api/wake/route.js",
45
- "/camera-grid/route": "app/camera-grid/route.js",
46
45
  "/robopark/[...path]/route": "app/robopark/[...path]/route.js",
46
+ "/camera-grid/route": "app/camera-grid/route.js",
47
47
  "/fed/media/robots/[robotId]/video_feed/route": "app/fed/media/robots/[robotId]/video_feed/route.js",
48
- "/fed/[...path]/route": "app/fed/[...path]/route.js",
49
- "/robopark/api/robots/[robotId]/stream/route": "app/robopark/api/robots/[robotId]/stream/route.js",
50
48
  "/tailnet/route": "app/tailnet/route.js",
51
49
  "/vendor/livekit-client.umd.js/route": "app/vendor/livekit-client.umd.js/route.js",
50
+ "/fed/[...path]/route": "app/fed/[...path]/route.js",
51
+ "/robopark/api/robots/[robotId]/stream/route": "app/robopark/api/robots/[robotId]/stream/route.js",
52
52
  "/(app)/opengraph-image-xg4ifa/route": "app/(app)/opengraph-image-xg4ifa/route.js",
53
53
  "/robopark/api/[...path]/route": "app/robopark/api/[...path]/route.js",
54
- "/robopark/page": "app/robopark/page.js",
55
54
  "/voice-tester/page": "app/voice-tester/page.js",
56
- "/(app)/voice/page": "app/(app)/voice/page.js",
57
- "/(app)/page": "app/(app)/page.js"
55
+ "/robopark/page": "app/robopark/page.js",
56
+ "/(app)/page": "app/(app)/page.js",
57
+ "/(app)/voice/page": "app/(app)/voice/page.js"
58
58
  }
@@ -3,8 +3,8 @@
3
3
  "functions": {
4
4
  "/api/kiosk-hardware": {},
5
5
  "/api/robovoice/robots/[robotId]/media-health": {},
6
- "/robopark/[...path]": {},
7
6
  "/fed/media/robots/[robotId]/video_feed": {},
7
+ "/robopark/[...path]": {},
8
8
  "/robopark/api/robots/[robotId]/stream": {}
9
9
  }
10
10
  }
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><title data-next-head="">500: Internal Server Error</title><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-5252e5254da079b5.js" defer=""></script><script src="/_next/static/chunks/framework-e60c938074ff7136.js" defer=""></script><script src="/_next/static/chunks/main-9e24e8708ff075fc.js" defer=""></script><script src="/_next/static/chunks/pages/_app-131c90850aef965b.js" defer=""></script><script src="/_next/static/chunks/pages/_error-e4ba546eb376bdf4.js" defer=""></script><script src="/_next/static/KwY1YC79lI9nQqOVYXOmY/_buildManifest.js" defer=""></script><script src="/_next/static/KwY1YC79lI9nQqOVYXOmY/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error<!-- -->.</h2></div></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":500}},"page":"/_error","query":{},"buildId":"KwY1YC79lI9nQqOVYXOmY","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><title data-next-head="">500: Internal Server Error</title><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-5252e5254da079b5.js" defer=""></script><script src="/_next/static/chunks/framework-e60c938074ff7136.js" defer=""></script><script src="/_next/static/chunks/main-9e24e8708ff075fc.js" defer=""></script><script src="/_next/static/chunks/pages/_app-131c90850aef965b.js" defer=""></script><script src="/_next/static/chunks/pages/_error-e4ba546eb376bdf4.js" defer=""></script><script src="/_next/static/Xg-e8h70WpdFcsZ2vcfOG/_buildManifest.js" defer=""></script><script src="/_next/static/Xg-e8h70WpdFcsZ2vcfOG/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error<!-- -->.</h2></div></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":500}},"page":"/_error","query":{},"buildId":"Xg-e8h70WpdFcsZ2vcfOG","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
@@ -0,0 +1 @@
1
+ self.__BUILD_MANIFEST=function(e,a,s,r,t){return{__rewrites:{afterFiles:[{has:s,source:"/api/announce",destination:s},{has:s,source:"/api/reload-tools",destination:s},{has:s,source:"/api/wake",destination:s},{has:s,source:"/api/health",destination:s},{has:s,source:"/api/prompt",destination:s},{has:s,source:"/api/voices",destination:s},{has:s,source:"/api/models",destination:s},{has:s,source:"/api/wake-word/:path*",destination:s},{has:s,source:"/api/metrics",destination:s}],beforeFiles:[],fallback:[]},__routerFilterStatic:{numItems:43,errorRate:1e-4,numBits:825,numHashes:14,bitArray:[1,1,e,e,0,0,a,e,e,a,a,a,a,e,e,a,a,e,a,a,e,e,e,a,e,e,e,a,a,e,a,e,e,a,a,e,a,a,e,e,e,a,e,e,e,a,a,a,a,e,e,a,e,a,e,e,e,a,e,e,a,e,e,e,e,e,e,a,e,a,a,e,a,a,a,a,a,a,a,a,e,e,a,a,e,e,a,a,a,a,e,e,e,e,a,a,a,a,e,a,e,e,e,e,e,a,a,e,a,a,e,e,a,a,a,a,a,e,e,e,a,e,a,a,a,e,a,e,e,a,e,e,a,e,a,e,e,a,a,e,e,a,e,a,e,e,e,e,a,e,a,e,e,a,a,a,a,e,a,e,a,a,a,e,e,e,e,e,e,a,a,e,a,e,e,a,a,a,e,e,a,e,e,a,a,e,a,a,a,a,e,e,e,e,a,e,a,a,e,e,e,e,a,a,e,e,e,e,e,e,e,e,a,e,e,e,a,e,a,a,a,e,e,e,a,e,a,a,e,a,a,e,a,a,e,a,a,a,e,a,a,a,a,a,a,e,e,a,a,e,a,e,e,a,a,a,a,e,a,e,a,a,e,e,a,e,e,e,a,a,e,a,e,a,e,e,a,a,e,a,a,e,a,e,a,a,a,a,a,e,a,e,e,e,a,a,e,e,a,e,a,a,e,e,e,e,a,e,e,e,e,a,e,e,a,a,e,e,e,a,e,a,a,a,a,a,e,e,e,a,a,e,a,a,a,e,a,e,a,e,a,a,e,a,a,e,a,e,a,e,a,e,e,e,e,a,e,e,e,e,a,e,a,e,a,a,e,e,a,e,e,e,e,a,e,e,e,a,a,e,a,e,a,e,e,e,e,e,e,e,e,a,e,a,a,a,a,e,a,e,a,a,a,a,e,e,e,e,a,e,a,e,e,e,a,a,e,e,a,a,a,a,e,e,e,e,e,a,a,a,a,e,e,e,e,e,e,a,e,e,e,e,e,a,a,e,a,a,a,e,e,a,a,e,e,e,a,e,e,a,e,e,e,a,e,a,a,a,a,a,a,a,a,e,a,e,e,a,e,a,a,e,e,e,e,a,e,a,a,a,e,a,a,a,a,a,a,a,a,e,a,e,a,e,a,e,a,e,e,e,a,e,a,e,a,e,e,e,a,a,a,a,a,a,e,a,e,e,a,a,e,a,e,a,e,e,a,a,e,a,a,e,a,a,a,a,e,e,e,e,a,e,a,a,a,e,a,e,e,e,e,a,e,e,e,a,a,e,e,e,e,a,a,e,e,e,a,a,e,e,a,e,e,e,a,e,e,e,a,a,a,a,a,e,e,a,a,a,a,e,e,e,e,e,e,a,a,a,a,a,e,a,a,a,a,e,a,a,a,e,a,e,e,a,e,e,e,e,e,a,e,e,e,a,e,e,e,a,e,e,e,e,a,e,e,e,e,a,e,a,a,a,a,a,e,a,a,e,a,e,e,a,a,a,a,e,a,e,e,a,a,a,a,a,a,a,e,e,a,e,e,e,e,a,a,e,e,e,a,e,e,a,a,e,a,e,e,e,a,e,a,e,e,e,e,a,e,e,e,a,e,e,a,a,a,a,a,e,e,a,a,e,e,a,a,a,e,e,e,a,a,e,a,a,e,e,e,a,e,a,a,e,a,a,a,e,a,e,a,a,e,e,e,a,a,a,a,e,a,e,e,e,a,e,e,a,a,a,e,a,a,e,a,e,e,e,a,a,a,a,e,e,a,a,a,a,a,e,e,e,e,e,a,a,e,a,a,e,e,e,e,e,e,e,e,e,e,e,a,a,e,a,a,a,e,e,a,a,a,a,a,a,a,a,e]},__routerFilterDynamic:{numItems:11,errorRate:1e-4,numBits:211,numHashes:14,bitArray:[a,a,a,a,a,a,a,a,a,e,a,e,a,a,e,e,a,a,a,a,e,e,e,e,a,e,e,e,e,e,a,e,e,e,e,e,a,e,e,e,a,e,e,a,e,a,e,e,a,e,a,a,e,e,e,a,e,e,a,a,a,a,e,a,e,a,a,e,a,a,e,a,a,e,a,e,e,e,e,a,a,a,a,e,e,a,a,a,e,e,e,a,a,e,e,e,e,e,e,a,e,e,e,e,a,a,a,a,e,e,a,e,a,a,e,e,a,e,a,a,a,a,e,a,a,e,e,e,a,e,a,a,e,e,e,e,a,a,a,a,e,a,a,e,a,a,e,e,a,e,a,a,e,e,a,a,e,e,a,e,e,a,e,a,e,a,a,e,a,e,e,a,a,e,e,a,e,a,e,a,e,e,a,a,a,a,e,a,a,e,a,a,e,e,a,a,e,e,e,e,e,e,e,a,a,a,a,e,e,a,a]},"/_error":["static/chunks/pages/_error-e4ba546eb376bdf4.js"],sortedPages:["/_app","/_error"]}}(1,0,void 0,1e-4,14),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
@@ -0,0 +1 @@
1
+ self.__SSG_MANIFEST=new Set([]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB()
@@ -0,0 +1 @@
1
+ self.__BUILD_MANIFEST=function(e,a,s,r,t){return{__rewrites:{afterFiles:[{has:s,source:"/api/announce",destination:s},{has:s,source:"/api/reload-tools",destination:s},{has:s,source:"/api/wake",destination:s},{has:s,source:"/api/health",destination:s},{has:s,source:"/api/prompt",destination:s},{has:s,source:"/api/voices",destination:s},{has:s,source:"/api/models",destination:s},{has:s,source:"/api/wake-word/:path*",destination:s},{has:s,source:"/api/metrics",destination:s}],beforeFiles:[],fallback:[]},__routerFilterStatic:{numItems:43,errorRate:1e-4,numBits:825,numHashes:14,bitArray:[1,1,e,e,0,0,a,e,e,a,a,a,a,e,e,a,a,e,a,a,e,e,e,a,e,e,e,a,a,e,a,e,e,a,a,e,a,a,e,e,e,a,e,e,e,a,a,a,a,e,e,a,e,a,e,e,e,a,e,e,a,e,e,e,e,e,e,a,e,a,a,e,a,a,a,a,a,a,a,a,e,e,a,a,e,e,a,a,a,a,e,e,e,e,a,a,a,a,e,a,e,e,e,e,e,a,a,e,a,a,e,e,a,a,a,a,a,e,e,e,a,e,a,a,a,e,a,e,e,a,e,e,a,e,a,e,e,a,a,e,e,a,e,a,e,e,e,e,a,e,a,e,e,a,a,a,a,e,a,e,a,a,a,e,e,e,e,e,e,a,a,e,a,e,e,a,a,a,e,e,a,e,e,a,a,e,a,a,a,a,e,e,e,e,a,e,a,a,e,e,e,e,a,a,e,e,e,e,e,e,e,e,a,e,e,e,a,e,a,a,a,e,e,e,a,e,a,a,e,a,a,e,a,a,e,a,a,a,e,a,a,a,a,a,a,e,e,a,a,e,a,e,e,a,a,a,a,e,a,e,a,a,e,e,a,e,e,e,a,a,e,a,e,a,e,e,a,a,e,a,a,e,a,e,a,a,a,a,a,e,a,e,e,e,a,a,e,e,a,e,a,a,e,e,e,e,a,e,e,e,e,a,e,e,a,a,e,e,e,a,e,a,a,a,a,a,e,e,e,a,a,e,a,a,a,e,a,e,a,e,a,a,e,a,a,e,a,e,a,e,a,e,e,e,e,a,e,e,e,e,a,e,a,e,a,a,e,e,a,e,e,e,e,a,e,e,e,a,a,e,a,e,a,e,e,e,e,e,e,e,e,a,e,a,a,a,a,e,a,e,a,a,a,a,e,e,e,e,a,e,a,e,e,e,a,a,e,e,a,a,a,a,e,e,e,e,e,a,a,a,a,e,e,e,e,e,e,a,e,e,e,e,e,a,a,e,a,a,a,e,e,a,a,e,e,e,a,e,e,a,e,e,e,a,e,a,a,a,a,a,a,a,a,e,a,e,e,a,e,a,a,e,e,e,e,a,e,a,a,a,e,a,a,a,a,a,a,a,a,e,a,e,a,e,a,e,a,e,e,e,a,e,a,e,a,e,e,e,a,a,a,a,a,a,e,a,e,e,a,a,e,a,e,a,e,e,a,a,e,a,a,e,a,a,a,a,e,e,e,e,a,e,a,a,a,e,a,e,e,e,e,a,e,e,e,a,a,e,e,e,e,a,a,e,e,e,a,a,e,e,a,e,e,e,a,e,e,e,a,a,a,a,a,e,e,a,a,a,a,e,e,e,e,e,e,a,a,a,a,a,e,a,a,a,a,e,a,a,a,e,a,e,e,a,e,e,e,e,e,a,e,e,e,a,e,e,e,a,e,e,e,e,a,e,e,e,e,a,e,a,a,a,a,a,e,a,a,e,a,e,e,a,a,a,a,e,a,e,e,a,a,a,a,a,a,a,e,e,a,e,e,e,e,a,a,e,e,e,a,e,e,a,a,e,a,e,e,e,a,e,a,e,e,e,e,a,e,e,e,a,e,e,a,a,a,a,a,e,e,a,a,e,e,a,a,a,e,e,e,a,a,e,a,a,e,e,e,a,e,a,a,e,a,a,a,e,a,e,a,a,e,e,e,a,a,a,a,e,a,e,e,e,a,e,e,a,a,a,e,a,a,e,a,e,e,e,a,a,a,a,e,e,a,a,a,a,a,e,e,e,e,e,a,a,e,a,a,e,e,e,e,e,e,e,e,e,e,e,a,a,e,a,a,a,e,e,a,a,a,a,a,a,a,a,e]},__routerFilterDynamic:{numItems:11,errorRate:1e-4,numBits:211,numHashes:14,bitArray:[a,a,a,a,a,a,a,a,a,e,a,e,a,a,e,e,a,a,a,a,e,e,e,e,a,e,e,e,e,e,a,e,e,e,e,e,a,e,e,e,a,e,e,a,e,a,e,e,a,e,a,a,e,e,e,a,e,e,a,a,a,a,e,a,e,a,a,e,a,a,e,a,a,e,a,e,e,e,e,a,a,a,a,e,e,a,a,a,e,e,e,a,a,e,e,e,e,e,e,a,e,e,e,e,a,a,a,a,e,e,a,e,a,a,e,e,a,e,a,a,a,a,e,a,a,e,e,e,a,e,a,a,e,e,e,e,a,a,a,a,e,a,a,e,a,a,e,e,a,e,a,a,e,e,a,a,e,e,a,e,e,a,e,a,e,a,a,e,a,e,e,a,a,e,e,a,e,a,e,a,e,e,a,a,a,a,e,a,a,e,a,a,e,e,a,a,e,e,e,e,e,e,e,a,a,a,a,e,e,a,a]},"/_error":["static/chunks/pages/_error-e4ba546eb376bdf4.js"],sortedPages:["/_app","/_error"]}}(1,0,void 0,1e-4,14),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
@@ -0,0 +1 @@
1
+ self.__SSG_MANIFEST=new Set([]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB()