robopark 3.3.59 → 3.3.60

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.
@@ -84,6 +84,11 @@ export function startFrontendService(opts) {
84
84
  ROBOPARK_SCHEDULER_URL: scheduler,
85
85
  SCHEDULER_URL: scheduler,
86
86
  V2_SCHEDULER_URL: scheduler,
87
+ // The /fed/* proxy falls back to host.docker.internal in production when
88
+ // this is unset -- a Docker-ism that does not resolve on a native install,
89
+ // so every /fed/media video_feed hung ~7s and answered 502, blacking out
90
+ // the call page's vision panel and the grid's MJPEG fallback at once.
91
+ ROBOPARK_CONTROL_URL: process.env.ROBOPARK_CONTROL_URL || 'http://127.0.0.1:47913',
87
92
  },
88
93
  stdio,
89
94
  detached: !opts.foreground,
@@ -1 +1 @@
1
- {"version":3,"file":"frontend-service.js","sourceRoot":"","sources":["../../src/robopark/frontend-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"frontend-service.js","sourceRoot":"","sources":["../../src/robopark/frontend-service.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "robopark",
3
- "version": "3.3.59",
3
+ "version": "3.3.60",
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": {
@@ -482,7 +482,11 @@ var failure=new Error((options.method||'GET')+' '+path+' -> '+response.status+(b
482
482
  try{navigator.sendBeacon(API_BASE+'/api/sessions/'+encodeURIComponent(session)+'/end?reason=page_closed',new Blob([JSON.stringify({details:{page_closed:true},source:'public_join'})],{type:'application/json'}))}catch(_){}
483
483
  });
484
484
  function callPayload(){return {character_preset_id:character,voice_stack_id:stack||null,client_name:'Public character link',engine:'elevenlabs',agent_id:agent,branch_id:branch||null,robot_id:robot||null,join_link_id:share||null}}
485
- function connectAttempt(kind){if(!desired||ending||connecting||conversation)return;connecting=true;var myGeneration=++generation;text('state',kind==='reconnect'?'obtaining fresh voice session':'connecting');stage('signed_session');api('/api/sessions/voice-call',{method:'POST',headers:{'content-type':'application/json'},body:JSON.stringify(callPayload())}).then(function(call){if(myGeneration!==generation||!desired)throw new Error('connection superseded');session=call.session_id;eventToken=call.event_token;text('f-session',session);text('f-agent',call.agent_id);text('f-branch',call.branch_id||'default');text('f-robot',call.robot_id||'operator only');if(call.robot_video_ref&&robot){el('vision').hidden=false;el('robot-stream').src=API_BASE+'/api/robots/'+encodeURIComponent(call.robot_video_ref)+'/video_feed';el('robot-stream').hidden=false;el('robot-video').hidden=true}stage('connected');event('signed_session','ok','Fresh signed ElevenLabs session created',{join_link_id:share,robot_id:robot,reconnect_attempt:retryAttempt});return ensureElevenLabsClient().then(function(SDK){return SDK.Conversation.startSession({signedUrl:call.signed_url,connectionType:'websocket',useWakeLock:true,onConnect:function(info){if(myGeneration!==generation)return;conversationId=info.conversationId;lastProviderError=null;retryAttempt=0;text('state','listening');el('error').style.display='none';el('avatar-wrap').classList.add('live');stage('conversation');management('/joined',{conversation_id:conversationId,connection_type:'websocket',engine:'elevenlabs',robot_id:robot,join_link_id:share,source:'public_join'});event('provider_connected','ok','ElevenLabs conversation connected',{conversation_id:conversationId,supervised:true});startVision(myGeneration);motionLastTurn=Date.now();startMotion(myGeneration);kioskNote();if(kioskOn){try{motionSent[kioskGreeting]=1;conversation.sendUserMessage(kioskGreeting)}catch(_){}}},onDisconnect:function(info){recover(myGeneration,info||{reason:'provider_disconnected'})},onError:function(message,context){if(myGeneration!==generation)return;lastProviderError={message:String(message||'Provider error'),context:plainDetails(context)};event('provider_error','failed',lastProviderError.message,lastProviderError);text('state','provider error')},onStatusChange:function(info){if(myGeneration===generation)event('provider_status',info&&info.status==='disconnected'?'warning':'ok',info&&info.status||'unknown',{})},onMessage:function(info){if(myGeneration!==generation)return;var message=String(info&&info.message||'').trim(),role=info&&info.role==='user'?'user':'assistant';if(role==='user'&&motionSent[message])return;motionLastTurn=Date.now();kioskNote();append(role,message);if(message){history.push({role:role,text:message});history=history.slice(-20)}saveTurn(role,message)},onModeChange:function(info){if(myGeneration!==generation)return;var speaking=info.mode==='speaking';motionMode=speaking?'speaking':'listening';if(speaking)kioskNote();el('avatar-wrap').classList.toggle('speaking',speaking);text('state',speaking?'speaking':'listening');event('mode','ok',info.mode,{})},onInterruption:function(info){event('interruption','ok','Agent interrupted',info||{})},onMCPToolCall:function(info){event('mcp_tool','running','Tool call',info||{})}})})}).then(function(active){connecting=false;if(myGeneration!==generation||!desired){try{active.endSession()}catch(_){}return}conversation=active;startKeepalive();el('join').hidden=true;el('end').hidden=false;el('message').disabled=false;el('send').disabled=false;pollDetail()}).catch(function(error){connecting=false;if(myGeneration!==generation||!desired)return;var details={message:error&&error.message||String(error),last_provider_error:lastProviderError};event('provider_error','failed','Voice connection attempt failed',details);closeManaged('connection_failed',details);session=null;eventToken=null;conversation=null;conversationId=null;
485
+ function connectAttempt(kind){if(!desired||ending||connecting||conversation)return;connecting=true;var myGeneration=++generation;text('state',kind==='reconnect'?'obtaining fresh voice session':'connecting');stage('signed_session');api('/api/sessions/voice-call',{method:'POST',headers:{'content-type':'application/json'},body:JSON.stringify(callPayload())}).then(function(call){if(myGeneration!==generation||!desired)throw new Error('connection superseded');session=call.session_id;eventToken=call.event_token;text('f-session',session);text('f-agent',call.agent_id);text('f-branch',call.branch_id||'default');text('f-robot',call.robot_id||'operator only');if(call.robot_video_ref&&robot){el('vision').hidden=false;var rs=el('robot-stream');rs.onerror=function(){// The MJPEG relay is a bonus, not the feed. A claim_ device is a browser
486
+ // camera with no vision server behind it, so this URL can 502 by design --
487
+ // and with no handler the panel simply went black over the top of a local
488
+ // camera that was working the whole time. Fall back to the local preview.
489
+ rs.onerror=null;rs.removeAttribute('src');rs.hidden=true;el('robot-video').hidden=false;};rs.src=API_BASE+'/api/robots/'+encodeURIComponent(call.robot_video_ref)+'/video_feed';rs.hidden=false;el('robot-video').hidden=true}stage('connected');event('signed_session','ok','Fresh signed ElevenLabs session created',{join_link_id:share,robot_id:robot,reconnect_attempt:retryAttempt});return ensureElevenLabsClient().then(function(SDK){return SDK.Conversation.startSession({signedUrl:call.signed_url,connectionType:'websocket',useWakeLock:true,onConnect:function(info){if(myGeneration!==generation)return;conversationId=info.conversationId;lastProviderError=null;retryAttempt=0;text('state','listening');el('error').style.display='none';el('avatar-wrap').classList.add('live');stage('conversation');management('/joined',{conversation_id:conversationId,connection_type:'websocket',engine:'elevenlabs',robot_id:robot,join_link_id:share,source:'public_join'});event('provider_connected','ok','ElevenLabs conversation connected',{conversation_id:conversationId,supervised:true});startVision(myGeneration);motionLastTurn=Date.now();startMotion(myGeneration);kioskNote();if(kioskOn){try{motionSent[kioskGreeting]=1;conversation.sendUserMessage(kioskGreeting)}catch(_){}}},onDisconnect:function(info){recover(myGeneration,info||{reason:'provider_disconnected'})},onError:function(message,context){if(myGeneration!==generation)return;lastProviderError={message:String(message||'Provider error'),context:plainDetails(context)};event('provider_error','failed',lastProviderError.message,lastProviderError);text('state','provider error')},onStatusChange:function(info){if(myGeneration===generation)event('provider_status',info&&info.status==='disconnected'?'warning':'ok',info&&info.status||'unknown',{})},onMessage:function(info){if(myGeneration!==generation)return;var message=String(info&&info.message||'').trim(),role=info&&info.role==='user'?'user':'assistant';if(role==='user'&&motionSent[message])return;motionLastTurn=Date.now();kioskNote();append(role,message);if(message){history.push({role:role,text:message});history=history.slice(-20)}saveTurn(role,message)},onModeChange:function(info){if(myGeneration!==generation)return;var speaking=info.mode==='speaking';motionMode=speaking?'speaking':'listening';if(speaking)kioskNote();el('avatar-wrap').classList.toggle('speaking',speaking);text('state',speaking?'speaking':'listening');event('mode','ok',info.mode,{})},onInterruption:function(info){event('interruption','ok','Agent interrupted',info||{})},onMCPToolCall:function(info){event('mcp_tool','running','Tool call',info||{})}})})}).then(function(active){connecting=false;if(myGeneration!==generation||!desired){try{active.endSession()}catch(_){}return}conversation=active;startKeepalive();el('join').hidden=true;el('end').hidden=false;el('message').disabled=false;el('send').disabled=false;pollDetail()}).catch(function(error){connecting=false;if(myGeneration!==generation||!desired)return;var details={message:error&&error.message||String(error),last_provider_error:lastProviderError};event('provider_error','failed','Voice connection attempt failed',details);closeManaged('connection_failed',details);session=null;eventToken=null;conversation=null;conversationId=null;
486
490
  // A 4xx means the link itself is wrong and retrying cannot fix it. Anything
487
491
  // else (5xx, signing timeout, network drop) is transient, and dead-ending
488
492
  // here is what left a failed call with no reconnect until a manual re-join.
@@ -1 +1 @@
1
- cxjKMxl9mcTp7rbD2AE31
1
+ HVQqws8pwZ7FuPixvQm1d
@@ -25,26 +25,26 @@
25
25
  "static/chunks/main-app-a1f59168303c7f84.js",
26
26
  "static/chunks/app/api/device-character/route-0952b44bda5bfb6d.js"
27
27
  ],
28
- "/api/download-piper-model/route": [
28
+ "/api/models/route": [
29
29
  "static/chunks/webpack-5252e5254da079b5.js",
30
30
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
31
31
  "static/chunks/1255-404bb8de49c90395.js",
32
32
  "static/chunks/main-app-a1f59168303c7f84.js",
33
- "static/chunks/app/api/download-piper-model/route-0952b44bda5bfb6d.js"
33
+ "static/chunks/app/api/models/route-0952b44bda5bfb6d.js"
34
34
  ],
35
- "/api/prewarm/route": [
35
+ "/api/download-piper-model/route": [
36
36
  "static/chunks/webpack-5252e5254da079b5.js",
37
37
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
38
38
  "static/chunks/1255-404bb8de49c90395.js",
39
39
  "static/chunks/main-app-a1f59168303c7f84.js",
40
- "static/chunks/app/api/prewarm/route-0952b44bda5bfb6d.js"
40
+ "static/chunks/app/api/download-piper-model/route-0952b44bda5bfb6d.js"
41
41
  ],
42
- "/api/models/route": [
42
+ "/api/prewarm/route": [
43
43
  "static/chunks/webpack-5252e5254da079b5.js",
44
44
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
45
45
  "static/chunks/1255-404bb8de49c90395.js",
46
46
  "static/chunks/main-app-a1f59168303c7f84.js",
47
- "static/chunks/app/api/models/route-0952b44bda5bfb6d.js"
47
+ "static/chunks/app/api/prewarm/route-0952b44bda5bfb6d.js"
48
48
  ],
49
49
  "/api/prompt/route": [
50
50
  "static/chunks/webpack-5252e5254da079b5.js",
@@ -60,19 +60,19 @@
60
60
  "static/chunks/main-app-a1f59168303c7f84.js",
61
61
  "static/chunks/app/api/reload-tools/route-0952b44bda5bfb6d.js"
62
62
  ],
63
- "/api/robopark/robots/[robotId]/operations/route": [
63
+ "/api/robopark/devices/[deviceId]/control/route": [
64
64
  "static/chunks/webpack-5252e5254da079b5.js",
65
65
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
66
66
  "static/chunks/1255-404bb8de49c90395.js",
67
67
  "static/chunks/main-app-a1f59168303c7f84.js",
68
- "static/chunks/app/api/robopark/robots/[robotId]/operations/route-0952b44bda5bfb6d.js"
68
+ "static/chunks/app/api/robopark/devices/[deviceId]/control/route-0952b44bda5bfb6d.js"
69
69
  ],
70
- "/api/robopark/devices/[deviceId]/control/route": [
70
+ "/api/robopark/robots/[robotId]/operations/route": [
71
71
  "static/chunks/webpack-5252e5254da079b5.js",
72
72
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
73
73
  "static/chunks/1255-404bb8de49c90395.js",
74
74
  "static/chunks/main-app-a1f59168303c7f84.js",
75
- "static/chunks/app/api/robopark/devices/[deviceId]/control/route-0952b44bda5bfb6d.js"
75
+ "static/chunks/app/api/robopark/robots/[robotId]/operations/route-0952b44bda5bfb6d.js"
76
76
  ],
77
77
  "/api/robopark/sessions/[sessionId]/end/route": [
78
78
  "static/chunks/webpack-5252e5254da079b5.js",
@@ -88,19 +88,19 @@
88
88
  "static/chunks/main-app-a1f59168303c7f84.js",
89
89
  "static/chunks/app/api/robopark/transcripts/[sessionId]/route-0952b44bda5bfb6d.js"
90
90
  ],
91
- "/api/setup/test-groq/route": [
91
+ "/api/setup/complete/route": [
92
92
  "static/chunks/webpack-5252e5254da079b5.js",
93
93
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
94
94
  "static/chunks/1255-404bb8de49c90395.js",
95
95
  "static/chunks/main-app-a1f59168303c7f84.js",
96
- "static/chunks/app/api/setup/test-groq/route-0952b44bda5bfb6d.js"
96
+ "static/chunks/app/api/setup/complete/route-0952b44bda5bfb6d.js"
97
97
  ],
98
- "/api/setup/test-hass/route": [
98
+ "/api/setup/test-groq/route": [
99
99
  "static/chunks/webpack-5252e5254da079b5.js",
100
100
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
101
101
  "static/chunks/1255-404bb8de49c90395.js",
102
102
  "static/chunks/main-app-a1f59168303c7f84.js",
103
- "static/chunks/app/api/setup/test-hass/route-0952b44bda5bfb6d.js"
103
+ "static/chunks/app/api/setup/test-groq/route-0952b44bda5bfb6d.js"
104
104
  ],
105
105
  "/api/setup/status/route": [
106
106
  "static/chunks/webpack-5252e5254da079b5.js",
@@ -109,19 +109,19 @@
109
109
  "static/chunks/main-app-a1f59168303c7f84.js",
110
110
  "static/chunks/app/api/setup/status/route-0952b44bda5bfb6d.js"
111
111
  ],
112
- "/api/setup/test-n8n/route": [
112
+ "/api/setup/test-hass/route": [
113
113
  "static/chunks/webpack-5252e5254da079b5.js",
114
114
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
115
115
  "static/chunks/1255-404bb8de49c90395.js",
116
116
  "static/chunks/main-app-a1f59168303c7f84.js",
117
- "static/chunks/app/api/setup/test-n8n/route-0952b44bda5bfb6d.js"
117
+ "static/chunks/app/api/setup/test-hass/route-0952b44bda5bfb6d.js"
118
118
  ],
119
- "/api/setup/test-ollama/route": [
119
+ "/api/setup/test-n8n/route": [
120
120
  "static/chunks/webpack-5252e5254da079b5.js",
121
121
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
122
122
  "static/chunks/1255-404bb8de49c90395.js",
123
123
  "static/chunks/main-app-a1f59168303c7f84.js",
124
- "static/chunks/app/api/setup/test-ollama/route-0952b44bda5bfb6d.js"
124
+ "static/chunks/app/api/setup/test-n8n/route-0952b44bda5bfb6d.js"
125
125
  ],
126
126
  "/api/test-tts/route": [
127
127
  "static/chunks/webpack-5252e5254da079b5.js",
@@ -130,19 +130,19 @@
130
130
  "static/chunks/main-app-a1f59168303c7f84.js",
131
131
  "static/chunks/app/api/test-tts/route-0952b44bda5bfb6d.js"
132
132
  ],
133
- "/api/setup/complete/route": [
133
+ "/api/voices/route": [
134
134
  "static/chunks/webpack-5252e5254da079b5.js",
135
135
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
136
136
  "static/chunks/1255-404bb8de49c90395.js",
137
137
  "static/chunks/main-app-a1f59168303c7f84.js",
138
- "static/chunks/app/api/setup/complete/route-0952b44bda5bfb6d.js"
138
+ "static/chunks/app/api/voices/route-0952b44bda5bfb6d.js"
139
139
  ],
140
- "/api/voices/route": [
140
+ "/api/setup/test-ollama/route": [
141
141
  "static/chunks/webpack-5252e5254da079b5.js",
142
142
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
143
143
  "static/chunks/1255-404bb8de49c90395.js",
144
144
  "static/chunks/main-app-a1f59168303c7f84.js",
145
- "static/chunks/app/api/voices/route-0952b44bda5bfb6d.js"
145
+ "static/chunks/app/api/setup/test-ollama/route-0952b44bda5bfb6d.js"
146
146
  ],
147
147
  "/api/wake-word/models/route": [
148
148
  "static/chunks/webpack-5252e5254da079b5.js",
@@ -165,6 +165,13 @@
165
165
  "static/chunks/main-app-a1f59168303c7f84.js",
166
166
  "static/chunks/app/api/wake-word/status/route-0952b44bda5bfb6d.js"
167
167
  ],
168
+ "/api/kiosk-hardware/route": [
169
+ "static/chunks/webpack-5252e5254da079b5.js",
170
+ "static/chunks/4bd1b696-f785427dddbba9fb.js",
171
+ "static/chunks/1255-404bb8de49c90395.js",
172
+ "static/chunks/main-app-a1f59168303c7f84.js",
173
+ "static/chunks/app/api/kiosk-hardware/route-0952b44bda5bfb6d.js"
174
+ ],
168
175
  "/api/model-status/route": [
169
176
  "static/chunks/webpack-5252e5254da079b5.js",
170
177
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
@@ -179,12 +186,12 @@
179
186
  "static/chunks/main-app-a1f59168303c7f84.js",
180
187
  "static/chunks/app/api/connection-details/route-0952b44bda5bfb6d.js"
181
188
  ],
182
- "/api/kiosk-hardware/route": [
189
+ "/api/robopark/device-access/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/kiosk-hardware/route-0952b44bda5bfb6d.js"
194
+ "static/chunks/app/api/robopark/device-access/route-0952b44bda5bfb6d.js"
188
195
  ],
189
196
  "/api/robopark/character-ai/route": [
190
197
  "static/chunks/webpack-5252e5254da079b5.js",
@@ -193,12 +200,12 @@
193
200
  "static/chunks/main-app-a1f59168303c7f84.js",
194
201
  "static/chunks/app/api/robopark/character-ai/route-0952b44bda5bfb6d.js"
195
202
  ],
196
- "/api/robopark/live-rooms/route": [
203
+ "/api/robopark/camera-token/route": [
197
204
  "static/chunks/webpack-5252e5254da079b5.js",
198
205
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
199
206
  "static/chunks/1255-404bb8de49c90395.js",
200
207
  "static/chunks/main-app-a1f59168303c7f84.js",
201
- "static/chunks/app/api/robopark/live-rooms/route-0952b44bda5bfb6d.js"
208
+ "static/chunks/app/api/robopark/camera-token/route-0952b44bda5bfb6d.js"
202
209
  ],
203
210
  "/api/robopark/robots/route": [
204
211
  "static/chunks/webpack-5252e5254da079b5.js",
@@ -207,19 +214,19 @@
207
214
  "static/chunks/main-app-a1f59168303c7f84.js",
208
215
  "static/chunks/app/api/robopark/robots/route-0952b44bda5bfb6d.js"
209
216
  ],
210
- "/api/robopark/camera-token/route": [
217
+ "/api/robopark/servers/[serverId]/metrics/route": [
211
218
  "static/chunks/webpack-5252e5254da079b5.js",
212
219
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
213
220
  "static/chunks/1255-404bb8de49c90395.js",
214
221
  "static/chunks/main-app-a1f59168303c7f84.js",
215
- "static/chunks/app/api/robopark/camera-token/route-0952b44bda5bfb6d.js"
222
+ "static/chunks/app/api/robopark/servers/[serverId]/metrics/route-0952b44bda5bfb6d.js"
216
223
  ],
217
- "/api/robopark/device-access/route": [
224
+ "/api/robopark/monitor-token/route": [
218
225
  "static/chunks/webpack-5252e5254da079b5.js",
219
226
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
220
227
  "static/chunks/1255-404bb8de49c90395.js",
221
228
  "static/chunks/main-app-a1f59168303c7f84.js",
222
- "static/chunks/app/api/robopark/device-access/route-0952b44bda5bfb6d.js"
229
+ "static/chunks/app/api/robopark/monitor-token/route-0952b44bda5bfb6d.js"
223
230
  ],
224
231
  "/api/robopark/servers/[serverId]/route": [
225
232
  "static/chunks/webpack-5252e5254da079b5.js",
@@ -228,19 +235,12 @@
228
235
  "static/chunks/main-app-a1f59168303c7f84.js",
229
236
  "static/chunks/app/api/robopark/servers/[serverId]/route-0952b44bda5bfb6d.js"
230
237
  ],
231
- "/api/robopark/monitor-token/route": [
232
- "static/chunks/webpack-5252e5254da079b5.js",
233
- "static/chunks/4bd1b696-f785427dddbba9fb.js",
234
- "static/chunks/1255-404bb8de49c90395.js",
235
- "static/chunks/main-app-a1f59168303c7f84.js",
236
- "static/chunks/app/api/robopark/monitor-token/route-0952b44bda5bfb6d.js"
237
- ],
238
- "/api/robopark/servers/[serverId]/metrics/route": [
238
+ "/api/robopark/live-rooms/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]/metrics/route-0952b44bda5bfb6d.js"
243
+ "static/chunks/app/api/robopark/live-rooms/route-0952b44bda5bfb6d.js"
244
244
  ],
245
245
  "/api/robopark/servers/route": [
246
246
  "static/chunks/webpack-5252e5254da079b5.js",
@@ -256,19 +256,19 @@
256
256
  "static/chunks/main-app-a1f59168303c7f84.js",
257
257
  "static/chunks/app/api/robopark/sessions/route-0952b44bda5bfb6d.js"
258
258
  ],
259
- "/api/robopark/vision-caption/route": [
259
+ "/api/robovoice/robots/[robotId]/media-health/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/robovoice/robots/[robotId]/media-health/route-0952b44bda5bfb6d.js"
265
265
  ],
266
- "/api/robopark/robots/[robotId]/voice-engine/route": [
266
+ "/api/robopark/vision-caption/route": [
267
267
  "static/chunks/webpack-5252e5254da079b5.js",
268
268
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
269
269
  "static/chunks/1255-404bb8de49c90395.js",
270
270
  "static/chunks/main-app-a1f59168303c7f84.js",
271
- "static/chunks/app/api/robopark/robots/[robotId]/voice-engine/route-0952b44bda5bfb6d.js"
271
+ "static/chunks/app/api/robopark/vision-caption/route-0952b44bda5bfb6d.js"
272
272
  ],
273
273
  "/api/settings/route": [
274
274
  "static/chunks/webpack-5252e5254da079b5.js",
@@ -277,12 +277,12 @@
277
277
  "static/chunks/main-app-a1f59168303c7f84.js",
278
278
  "static/chunks/app/api/settings/route-0952b44bda5bfb6d.js"
279
279
  ],
280
- "/api/robovoice/robots/[robotId]/media-health/route": [
280
+ "/api/robopark/robots/[robotId]/voice-engine/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/robovoice/robots/[robotId]/media-health/route-0952b44bda5bfb6d.js"
285
+ "static/chunks/app/api/robopark/robots/[robotId]/voice-engine/route-0952b44bda5bfb6d.js"
286
286
  ],
287
287
  "/api/turn-credentials/route": [
288
288
  "static/chunks/webpack-5252e5254da079b5.js",
@@ -291,68 +291,68 @@
291
291
  "static/chunks/main-app-a1f59168303c7f84.js",
292
292
  "static/chunks/app/api/turn-credentials/route-0952b44bda5bfb6d.js"
293
293
  ],
294
- "/api/robopark/transcripts/route": [
294
+ "/camera-grid/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/camera-grid/route-0952b44bda5bfb6d.js"
300
300
  ],
301
- "/camera-grid/route": [
301
+ "/fed/media/robots/[robotId]/video_feed/route": [
302
302
  "static/chunks/webpack-5252e5254da079b5.js",
303
303
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
304
304
  "static/chunks/1255-404bb8de49c90395.js",
305
305
  "static/chunks/main-app-a1f59168303c7f84.js",
306
- "static/chunks/app/camera-grid/route-0952b44bda5bfb6d.js"
306
+ "static/chunks/app/fed/media/robots/[robotId]/video_feed/route-0952b44bda5bfb6d.js"
307
307
  ],
308
- "/api/wake/route": [
308
+ "/api/robopark/transcripts/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/api/wake/route-0952b44bda5bfb6d.js"
313
+ "static/chunks/app/api/robopark/transcripts/route-0952b44bda5bfb6d.js"
314
314
  ],
315
- "/robopark/[...path]/route": [
315
+ "/tailnet/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/tailnet/route-0952b44bda5bfb6d.js"
321
321
  ],
322
- "/fed/media/robots/[robotId]/video_feed/route": [
322
+ "/fed/[...path]/route": [
323
323
  "static/chunks/webpack-5252e5254da079b5.js",
324
324
  "static/chunks/4bd1b696-f785427dddbba9fb.js",
325
325
  "static/chunks/1255-404bb8de49c90395.js",
326
326
  "static/chunks/main-app-a1f59168303c7f84.js",
327
- "static/chunks/app/fed/media/robots/[robotId]/video_feed/route-0952b44bda5bfb6d.js"
327
+ "static/chunks/app/fed/[...path]/route-0952b44bda5bfb6d.js"
328
328
  ],
329
- "/fed/[...path]/route": [
329
+ "/api/wake/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/api/wake/route-0952b44bda5bfb6d.js"
335
335
  ],
336
- "/vendor/livekit-client.umd.js/route": [
336
+ "/robopark/[...path]/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/vendor/livekit-client.umd.js/route-0952b44bda5bfb6d.js"
341
+ "static/chunks/app/robopark/[...path]/route-0952b44bda5bfb6d.js"
342
342
  ],
343
- "/robopark/api/robots/[robotId]/stream/route": [
343
+ "/vendor/livekit-client.umd.js/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/robopark/api/robots/[robotId]/stream/route-0952b44bda5bfb6d.js"
348
+ "static/chunks/app/vendor/livekit-client.umd.js/route-0952b44bda5bfb6d.js"
349
349
  ],
350
- "/tailnet/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/tailnet/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",
@@ -1,54 +1,54 @@
1
1
  {
2
2
  "/_not-found/page": "/_not-found",
3
3
  "/api/device-character/route": "/api/device-character",
4
+ "/api/models/route": "/api/models",
4
5
  "/api/download-piper-model/route": "/api/download-piper-model",
5
6
  "/api/prewarm/route": "/api/prewarm",
6
- "/api/models/route": "/api/models",
7
7
  "/api/prompt/route": "/api/prompt",
8
8
  "/api/reload-tools/route": "/api/reload-tools",
9
- "/api/robopark/robots/[robotId]/operations/route": "/api/robopark/robots/[robotId]/operations",
10
9
  "/api/robopark/devices/[deviceId]/control/route": "/api/robopark/devices/[deviceId]/control",
10
+ "/api/robopark/robots/[robotId]/operations/route": "/api/robopark/robots/[robotId]/operations",
11
11
  "/api/robopark/sessions/[sessionId]/end/route": "/api/robopark/sessions/[sessionId]/end",
12
12
  "/api/robopark/transcripts/[sessionId]/route": "/api/robopark/transcripts/[sessionId]",
13
+ "/api/setup/complete/route": "/api/setup/complete",
13
14
  "/api/setup/test-groq/route": "/api/setup/test-groq",
14
- "/api/setup/test-hass/route": "/api/setup/test-hass",
15
15
  "/api/setup/status/route": "/api/setup/status",
16
+ "/api/setup/test-hass/route": "/api/setup/test-hass",
16
17
  "/api/setup/test-n8n/route": "/api/setup/test-n8n",
17
- "/api/setup/test-ollama/route": "/api/setup/test-ollama",
18
18
  "/api/test-tts/route": "/api/test-tts",
19
- "/api/setup/complete/route": "/api/setup/complete",
20
19
  "/api/voices/route": "/api/voices",
20
+ "/api/setup/test-ollama/route": "/api/setup/test-ollama",
21
21
  "/api/wake-word/models/route": "/api/wake-word/models",
22
22
  "/api/wake-word/upload/route": "/api/wake-word/upload",
23
23
  "/api/wake-word/status/route": "/api/wake-word/status",
24
24
  "/favicon.ico/route": "/favicon.ico",
25
+ "/api/kiosk-hardware/route": "/api/kiosk-hardware",
25
26
  "/api/model-status/route": "/api/model-status",
26
27
  "/api/connection-details/route": "/api/connection-details",
27
- "/api/kiosk-hardware/route": "/api/kiosk-hardware",
28
+ "/api/robopark/device-access/route": "/api/robopark/device-access",
28
29
  "/api/robopark/character-ai/route": "/api/robopark/character-ai",
29
- "/api/robopark/live-rooms/route": "/api/robopark/live-rooms",
30
- "/api/robopark/robots/route": "/api/robopark/robots",
31
30
  "/api/robopark/camera-token/route": "/api/robopark/camera-token",
32
- "/api/robopark/device-access/route": "/api/robopark/device-access",
33
- "/api/robopark/servers/[serverId]/route": "/api/robopark/servers/[serverId]",
34
- "/api/robopark/monitor-token/route": "/api/robopark/monitor-token",
31
+ "/api/robopark/robots/route": "/api/robopark/robots",
35
32
  "/api/robopark/servers/[serverId]/metrics/route": "/api/robopark/servers/[serverId]/metrics",
33
+ "/api/robopark/monitor-token/route": "/api/robopark/monitor-token",
34
+ "/api/robopark/servers/[serverId]/route": "/api/robopark/servers/[serverId]",
35
+ "/api/robopark/live-rooms/route": "/api/robopark/live-rooms",
36
36
  "/api/robopark/servers/route": "/api/robopark/servers",
37
37
  "/api/robopark/sessions/route": "/api/robopark/sessions",
38
+ "/api/robovoice/robots/[robotId]/media-health/route": "/api/robovoice/robots/[robotId]/media-health",
38
39
  "/api/robopark/vision-caption/route": "/api/robopark/vision-caption",
39
- "/api/robopark/robots/[robotId]/voice-engine/route": "/api/robopark/robots/[robotId]/voice-engine",
40
40
  "/api/settings/route": "/api/settings",
41
- "/api/robovoice/robots/[robotId]/media-health/route": "/api/robovoice/robots/[robotId]/media-health",
41
+ "/api/robopark/robots/[robotId]/voice-engine/route": "/api/robopark/robots/[robotId]/voice-engine",
42
42
  "/api/turn-credentials/route": "/api/turn-credentials",
43
- "/api/robopark/transcripts/route": "/api/robopark/transcripts",
44
43
  "/camera-grid/route": "/camera-grid",
45
- "/api/wake/route": "/api/wake",
46
- "/robopark/[...path]/route": "/robopark/[...path]",
47
44
  "/fed/media/robots/[robotId]/video_feed/route": "/fed/media/robots/[robotId]/video_feed",
45
+ "/api/robopark/transcripts/route": "/api/robopark/transcripts",
46
+ "/tailnet/route": "/tailnet",
48
47
  "/fed/[...path]/route": "/fed/[...path]",
48
+ "/api/wake/route": "/api/wake",
49
+ "/robopark/[...path]/route": "/robopark/[...path]",
49
50
  "/vendor/livekit-client.umd.js/route": "/vendor/livekit-client.umd.js",
50
51
  "/robopark/api/robots/[robotId]/stream/route": "/robopark/api/robots/[robotId]/stream",
51
- "/tailnet/route": "/tailnet",
52
52
  "/(app)/opengraph-image-xg4ifa/route": "/opengraph-image-xg4ifa",
53
53
  "/robopark/api/[...path]/route": "/robopark/api/[...path]",
54
54
  "/robopark/page": "/robopark",
@@ -5,8 +5,8 @@
5
5
  "devFiles": [],
6
6
  "ampDevFiles": [],
7
7
  "lowPriorityFiles": [
8
- "static/cxjKMxl9mcTp7rbD2AE31/_buildManifest.js",
9
- "static/cxjKMxl9mcTp7rbD2AE31/_ssgManifest.js"
8
+ "static/HVQqws8pwZ7FuPixvQm1d/_buildManifest.js",
9
+ "static/HVQqws8pwZ7FuPixvQm1d/_ssgManifest.js"
10
10
  ],
11
11
  "rootMainFiles": [
12
12
  "static/chunks/webpack-5252e5254da079b5.js",
@@ -34,8 +34,8 @@
34
34
  "dynamicRoutes": {},
35
35
  "notFoundRoutes": [],
36
36
  "preview": {
37
- "previewModeId": "efc58b5ea7688ede69c860e874aeca45",
38
- "previewModeSigningKey": "43b12050e3bb8d0f7b321c93eb05b258d9952651348672b51bc0e72499edac5d",
39
- "previewModeEncryptionKey": "846837c972415de4fdc9c1d4bda4b053f7d375b69eab62309e34e4544a4af3cb"
37
+ "previewModeId": "0d998d4caf45f7b789418b21e5c7f328",
38
+ "previewModeSigningKey": "a0b0b3c3af824d87478b8e8ff7ac2d88635c6044dc512c80831a99c528ba9b24",
39
+ "previewModeEncryptionKey": "30d361a69e866a2a82b3f2afcc58296d4ed7dc870f3fbd88a21aba2fdfaf72c8"
40
40
  }
41
41
  }
@@ -1,54 +1,54 @@
1
1
  {
2
2
  "/_not-found/page": "app/_not-found/page.js",
3
3
  "/api/device-character/route": "app/api/device-character/route.js",
4
+ "/api/models/route": "app/api/models/route.js",
4
5
  "/api/download-piper-model/route": "app/api/download-piper-model/route.js",
5
6
  "/api/prewarm/route": "app/api/prewarm/route.js",
6
- "/api/models/route": "app/api/models/route.js",
7
7
  "/api/prompt/route": "app/api/prompt/route.js",
8
8
  "/api/reload-tools/route": "app/api/reload-tools/route.js",
9
- "/api/robopark/robots/[robotId]/operations/route": "app/api/robopark/robots/[robotId]/operations/route.js",
10
9
  "/api/robopark/devices/[deviceId]/control/route": "app/api/robopark/devices/[deviceId]/control/route.js",
10
+ "/api/robopark/robots/[robotId]/operations/route": "app/api/robopark/robots/[robotId]/operations/route.js",
11
11
  "/api/robopark/sessions/[sessionId]/end/route": "app/api/robopark/sessions/[sessionId]/end/route.js",
12
12
  "/api/robopark/transcripts/[sessionId]/route": "app/api/robopark/transcripts/[sessionId]/route.js",
13
+ "/api/setup/complete/route": "app/api/setup/complete/route.js",
13
14
  "/api/setup/test-groq/route": "app/api/setup/test-groq/route.js",
14
- "/api/setup/test-hass/route": "app/api/setup/test-hass/route.js",
15
15
  "/api/setup/status/route": "app/api/setup/status/route.js",
16
+ "/api/setup/test-hass/route": "app/api/setup/test-hass/route.js",
16
17
  "/api/setup/test-n8n/route": "app/api/setup/test-n8n/route.js",
17
- "/api/setup/test-ollama/route": "app/api/setup/test-ollama/route.js",
18
18
  "/api/test-tts/route": "app/api/test-tts/route.js",
19
- "/api/setup/complete/route": "app/api/setup/complete/route.js",
20
19
  "/api/voices/route": "app/api/voices/route.js",
20
+ "/api/setup/test-ollama/route": "app/api/setup/test-ollama/route.js",
21
21
  "/api/wake-word/models/route": "app/api/wake-word/models/route.js",
22
22
  "/api/wake-word/upload/route": "app/api/wake-word/upload/route.js",
23
23
  "/api/wake-word/status/route": "app/api/wake-word/status/route.js",
24
24
  "/favicon.ico/route": "app/favicon.ico/route.js",
25
+ "/api/kiosk-hardware/route": "app/api/kiosk-hardware/route.js",
25
26
  "/api/model-status/route": "app/api/model-status/route.js",
26
27
  "/api/connection-details/route": "app/api/connection-details/route.js",
27
- "/api/kiosk-hardware/route": "app/api/kiosk-hardware/route.js",
28
+ "/api/robopark/device-access/route": "app/api/robopark/device-access/route.js",
28
29
  "/api/robopark/character-ai/route": "app/api/robopark/character-ai/route.js",
29
- "/api/robopark/live-rooms/route": "app/api/robopark/live-rooms/route.js",
30
- "/api/robopark/robots/route": "app/api/robopark/robots/route.js",
31
30
  "/api/robopark/camera-token/route": "app/api/robopark/camera-token/route.js",
32
- "/api/robopark/device-access/route": "app/api/robopark/device-access/route.js",
33
- "/api/robopark/servers/[serverId]/route": "app/api/robopark/servers/[serverId]/route.js",
34
- "/api/robopark/monitor-token/route": "app/api/robopark/monitor-token/route.js",
31
+ "/api/robopark/robots/route": "app/api/robopark/robots/route.js",
35
32
  "/api/robopark/servers/[serverId]/metrics/route": "app/api/robopark/servers/[serverId]/metrics/route.js",
33
+ "/api/robopark/monitor-token/route": "app/api/robopark/monitor-token/route.js",
34
+ "/api/robopark/servers/[serverId]/route": "app/api/robopark/servers/[serverId]/route.js",
35
+ "/api/robopark/live-rooms/route": "app/api/robopark/live-rooms/route.js",
36
36
  "/api/robopark/servers/route": "app/api/robopark/servers/route.js",
37
37
  "/api/robopark/sessions/route": "app/api/robopark/sessions/route.js",
38
+ "/api/robovoice/robots/[robotId]/media-health/route": "app/api/robovoice/robots/[robotId]/media-health/route.js",
38
39
  "/api/robopark/vision-caption/route": "app/api/robopark/vision-caption/route.js",
39
- "/api/robopark/robots/[robotId]/voice-engine/route": "app/api/robopark/robots/[robotId]/voice-engine/route.js",
40
40
  "/api/settings/route": "app/api/settings/route.js",
41
- "/api/robovoice/robots/[robotId]/media-health/route": "app/api/robovoice/robots/[robotId]/media-health/route.js",
41
+ "/api/robopark/robots/[robotId]/voice-engine/route": "app/api/robopark/robots/[robotId]/voice-engine/route.js",
42
42
  "/api/turn-credentials/route": "app/api/turn-credentials/route.js",
43
- "/api/robopark/transcripts/route": "app/api/robopark/transcripts/route.js",
44
43
  "/camera-grid/route": "app/camera-grid/route.js",
45
- "/api/wake/route": "app/api/wake/route.js",
46
- "/robopark/[...path]/route": "app/robopark/[...path]/route.js",
47
44
  "/fed/media/robots/[robotId]/video_feed/route": "app/fed/media/robots/[robotId]/video_feed/route.js",
45
+ "/api/robopark/transcripts/route": "app/api/robopark/transcripts/route.js",
46
+ "/tailnet/route": "app/tailnet/route.js",
48
47
  "/fed/[...path]/route": "app/fed/[...path]/route.js",
48
+ "/api/wake/route": "app/api/wake/route.js",
49
+ "/robopark/[...path]/route": "app/robopark/[...path]/route.js",
49
50
  "/vendor/livekit-client.umd.js/route": "app/vendor/livekit-client.umd.js/route.js",
50
51
  "/robopark/api/robots/[robotId]/stream/route": "app/robopark/api/robots/[robotId]/stream/route.js",
51
- "/tailnet/route": "app/tailnet/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
54
  "/robopark/page": "app/robopark/page.js",
@@ -3,8 +3,8 @@
3
3
  "functions": {
4
4
  "/api/kiosk-hardware": {},
5
5
  "/api/robovoice/robots/[robotId]/media-health": {},
6
- "/fed/media/robots/[robotId]/video_feed": {},
7
6
  "/robopark/[...path]": {},
7
+ "/fed/media/robots/[robotId]/video_feed": {},
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/cxjKMxl9mcTp7rbD2AE31/_buildManifest.js" defer=""></script><script src="/_next/static/cxjKMxl9mcTp7rbD2AE31/_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":"cxjKMxl9mcTp7rbD2AE31","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/HVQqws8pwZ7FuPixvQm1d/_buildManifest.js" defer=""></script><script src="/_next/static/HVQqws8pwZ7FuPixvQm1d/_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":"HVQqws8pwZ7FuPixvQm1d","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- {"node":{},"edge":{},"encryptionKey":"RD5FrWKStMYSmHSO3LNWFSPIQC9Qn3me1diUTTqrZSc="}
1
+ {"node":{},"edge":{},"encryptionKey":"ioPxRkh8Xwgx69nEuUm4wQZjzduDtHbMBv/X8CyfNLA="}
@@ -481,7 +481,11 @@ var failure=new Error((options.method||'GET')+' '+path+' -> '+response.status+(b
481
481
  try{navigator.sendBeacon('/robopark/api/sessions/'+encodeURIComponent(session)+'/end?reason=page_closed',new Blob([JSON.stringify({details:{page_closed:true},source:'public_join'})],{type:'application/json'}))}catch(_){}
482
482
  });
483
483
  function callPayload(){return {character_preset_id:character,voice_stack_id:stack||null,client_name:'Public character link',engine:'elevenlabs',agent_id:agent,branch_id:branch||null,robot_id:robot||null,join_link_id:share||null}}
484
- function connectAttempt(kind){if(!desired||ending||connecting||conversation)return;connecting=true;var myGeneration=++generation;text('state',kind==='reconnect'?'obtaining fresh voice session':'connecting');stage('signed_session');api('/api/sessions/voice-call',{method:'POST',headers:{'content-type':'application/json'},body:JSON.stringify(callPayload())}).then(function(call){if(myGeneration!==generation||!desired)throw new Error('connection superseded');session=call.session_id;eventToken=call.event_token;text('f-session',session);text('f-agent',call.agent_id);text('f-branch',call.branch_id||'default');text('f-robot',call.robot_id||'operator only');if(call.robot_video_ref&&robot){el('vision').hidden=false;el('robot-stream').src='/fed/media/robots/'+encodeURIComponent(call.robot_video_ref)+'/video_feed';el('robot-stream').hidden=false;el('robot-video').hidden=true}stage('connected');event('signed_session','ok','Fresh signed ElevenLabs session created',{join_link_id:share,robot_id:robot,reconnect_attempt:retryAttempt});return ensureElevenLabsClient().then(function(SDK){return SDK.Conversation.startSession({signedUrl:call.signed_url,connectionType:'websocket',useWakeLock:true,onConnect:function(info){if(myGeneration!==generation)return;conversationId=info.conversationId;lastProviderError=null;retryAttempt=0;text('state','listening');el('error').style.display='none';el('avatar-wrap').classList.add('live');stage('conversation');management('/joined',{conversation_id:conversationId,connection_type:'websocket',engine:'elevenlabs',robot_id:robot,join_link_id:share,source:'public_join'});event('provider_connected','ok','ElevenLabs conversation connected',{conversation_id:conversationId,supervised:true});startVision(myGeneration);motionLastTurn=Date.now();startMotion(myGeneration);kioskNote();if(kioskOn){try{motionSent[kioskGreeting]=1;conversation.sendUserMessage(kioskGreeting)}catch(_){}}},onDisconnect:function(info){recover(myGeneration,info||{reason:'provider_disconnected'})},onError:function(message,context){if(myGeneration!==generation)return;lastProviderError={message:String(message||'Provider error'),context:plainDetails(context)};event('provider_error','failed',lastProviderError.message,lastProviderError);text('state','provider error')},onStatusChange:function(info){if(myGeneration===generation)event('provider_status',info&&info.status==='disconnected'?'warning':'ok',info&&info.status||'unknown',{})},onMessage:function(info){if(myGeneration!==generation)return;var message=String(info&&info.message||'').trim(),role=info&&info.role==='user'?'user':'assistant';if(role==='user'&&motionSent[message])return;motionLastTurn=Date.now();kioskNote();append(role,message);if(message){history.push({role:role,text:message});history=history.slice(-20)}saveTurn(role,message)},onModeChange:function(info){if(myGeneration!==generation)return;var speaking=info.mode==='speaking';motionMode=speaking?'speaking':'listening';if(speaking)kioskNote();el('avatar-wrap').classList.toggle('speaking',speaking);text('state',speaking?'speaking':'listening');event('mode','ok',info.mode,{})},onInterruption:function(info){event('interruption','ok','Agent interrupted',info||{})},onMCPToolCall:function(info){event('mcp_tool','running','Tool call',info||{})}})})}).then(function(active){connecting=false;if(myGeneration!==generation||!desired){try{active.endSession()}catch(_){}return}conversation=active;startKeepalive();el('join').hidden=true;el('end').hidden=false;el('message').disabled=false;el('send').disabled=false;pollDetail()}).catch(function(error){connecting=false;if(myGeneration!==generation||!desired)return;var details={message:error&&error.message||String(error),last_provider_error:lastProviderError};event('provider_error','failed','Voice connection attempt failed',details);closeManaged('connection_failed',details);session=null;eventToken=null;conversation=null;conversationId=null;
484
+ function connectAttempt(kind){if(!desired||ending||connecting||conversation)return;connecting=true;var myGeneration=++generation;text('state',kind==='reconnect'?'obtaining fresh voice session':'connecting');stage('signed_session');api('/api/sessions/voice-call',{method:'POST',headers:{'content-type':'application/json'},body:JSON.stringify(callPayload())}).then(function(call){if(myGeneration!==generation||!desired)throw new Error('connection superseded');session=call.session_id;eventToken=call.event_token;text('f-session',session);text('f-agent',call.agent_id);text('f-branch',call.branch_id||'default');text('f-robot',call.robot_id||'operator only');if(call.robot_video_ref&&robot){el('vision').hidden=false;var rs=el('robot-stream');rs.onerror=function(){// The MJPEG relay is a bonus, not the feed. A claim_ device is a browser
485
+ // camera with no vision server behind it, so this URL can 502 by design --
486
+ // and with no handler the panel simply went black over the top of a local
487
+ // camera that was working the whole time. Fall back to the local preview.
488
+ rs.onerror=null;rs.removeAttribute('src');rs.hidden=true;el('robot-video').hidden=false;};rs.src='/fed/media/robots/'+encodeURIComponent(call.robot_video_ref)+'/video_feed';rs.hidden=false;el('robot-video').hidden=true}stage('connected');event('signed_session','ok','Fresh signed ElevenLabs session created',{join_link_id:share,robot_id:robot,reconnect_attempt:retryAttempt});return ensureElevenLabsClient().then(function(SDK){return SDK.Conversation.startSession({signedUrl:call.signed_url,connectionType:'websocket',useWakeLock:true,onConnect:function(info){if(myGeneration!==generation)return;conversationId=info.conversationId;lastProviderError=null;retryAttempt=0;text('state','listening');el('error').style.display='none';el('avatar-wrap').classList.add('live');stage('conversation');management('/joined',{conversation_id:conversationId,connection_type:'websocket',engine:'elevenlabs',robot_id:robot,join_link_id:share,source:'public_join'});event('provider_connected','ok','ElevenLabs conversation connected',{conversation_id:conversationId,supervised:true});startVision(myGeneration);motionLastTurn=Date.now();startMotion(myGeneration);kioskNote();if(kioskOn){try{motionSent[kioskGreeting]=1;conversation.sendUserMessage(kioskGreeting)}catch(_){}}},onDisconnect:function(info){recover(myGeneration,info||{reason:'provider_disconnected'})},onError:function(message,context){if(myGeneration!==generation)return;lastProviderError={message:String(message||'Provider error'),context:plainDetails(context)};event('provider_error','failed',lastProviderError.message,lastProviderError);text('state','provider error')},onStatusChange:function(info){if(myGeneration===generation)event('provider_status',info&&info.status==='disconnected'?'warning':'ok',info&&info.status||'unknown',{})},onMessage:function(info){if(myGeneration!==generation)return;var message=String(info&&info.message||'').trim(),role=info&&info.role==='user'?'user':'assistant';if(role==='user'&&motionSent[message])return;motionLastTurn=Date.now();kioskNote();append(role,message);if(message){history.push({role:role,text:message});history=history.slice(-20)}saveTurn(role,message)},onModeChange:function(info){if(myGeneration!==generation)return;var speaking=info.mode==='speaking';motionMode=speaking?'speaking':'listening';if(speaking)kioskNote();el('avatar-wrap').classList.toggle('speaking',speaking);text('state',speaking?'speaking':'listening');event('mode','ok',info.mode,{})},onInterruption:function(info){event('interruption','ok','Agent interrupted',info||{})},onMCPToolCall:function(info){event('mcp_tool','running','Tool call',info||{})}})})}).then(function(active){connecting=false;if(myGeneration!==generation||!desired){try{active.endSession()}catch(_){}return}conversation=active;startKeepalive();el('join').hidden=true;el('end').hidden=false;el('message').disabled=false;el('send').disabled=false;pollDetail()}).catch(function(error){connecting=false;if(myGeneration!==generation||!desired)return;var details={message:error&&error.message||String(error),last_provider_error:lastProviderError};event('provider_error','failed','Voice connection attempt failed',details);closeManaged('connection_failed',details);session=null;eventToken=null;conversation=null;conversationId=null;
485
489
  // A 4xx means the link itself is wrong and retrying cannot fix it. Anything
486
490
  // else (5xx, signing timeout, network drop) is transient, and dead-ending
487
491
  // here is what left a failed call with no reconnect until a manual re-join.