robopark 3.3.34 → 3.3.36
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 +1 -1
- package/scheduler/static/voice-join.html +2 -2
- package/ui/standalone/.next/BUILD_ID +1 -1
- package/ui/standalone/.next/app-build-manifest.json +82 -82
- package/ui/standalone/.next/app-path-routes-manifest.json +21 -21
- package/ui/standalone/.next/build-manifest.json +2 -2
- package/ui/standalone/.next/server/app/robopark/api/[...path]/route.js +1 -1
- package/ui/standalone/.next/server/app-paths-manifest.json +21 -21
- package/ui/standalone/.next/server/functions-config-manifest.json +1 -1
- package/ui/standalone/.next/server/pages/500.html +1 -1
- package/ui/standalone/.next/server/pages-manifest.json +1 -1
- package/ui/standalone/.next/static/ULHwbueNr3RGevy8FSrTW/_buildManifest.js +1 -0
- package/ui/standalone/.next/static/ULHwbueNr3RGevy8FSrTW/_ssgManifest.js +1 -0
- package/ui/standalone/public/tailnet/index.html +31 -1
package/package.json
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
:root{--bg:#080704;--panel:rgba(20,17,11,.88);--line:rgba(247,211,116,.22);--gold:#f4cf72;--pale:#fff0bd;--ink:#f7f1df;--muted:#a99e84;--ok:#64dfa0;--warn:#f0bd55;--bad:#ff776c;--mono:"JetBrains Mono","Cascadia Code",monospace;--display:Georgia,"Times New Roman",serif}*{box-sizing:border-box}html,body{margin:0;min-height:100%;background:radial-gradient(circle at 50% 8%,#332510 0,#100d08 35%,#050403 78%);color:var(--ink);font-family:Verdana,Geneva,sans-serif}body:before{content:"";position:fixed;inset:0;pointer-events:none;background:linear-gradient(115deg,transparent 0 48%,rgba(244,207,114,.025) 49% 50%,transparent 51%),repeating-linear-gradient(0deg,transparent 0 34px,rgba(255,255,255,.012) 35px)}button,input{font:inherit}.shell{width:min(1120px,100%);min-height:100vh;margin:auto;padding:clamp(14px,3vw,34px);display:grid;grid-template-rows:auto 1fr auto;gap:18px}.top{display:flex;align-items:center;justify-content:space-between;gap:16px}.brand{font:700 .65rem var(--mono);letter-spacing:.18em;text-transform:uppercase;color:var(--gold)}.ops-toggle{border:1px solid var(--line);border-radius:999px;background:rgba(0,0,0,.35);color:var(--muted);padding:.55rem .8rem;cursor:pointer}.ops-toggle.on{color:var(--pale);border-color:var(--gold)}.stage{position:relative;min-height:620px;display:grid;grid-template-columns:minmax(0,1.3fr) minmax(280px,.7fr);overflow:hidden;border:1px solid var(--line);border-radius:28px;background:linear-gradient(145deg,rgba(34,27,14,.82),rgba(8,7,5,.92));box-shadow:0 28px 90px rgba(0,0,0,.45)}.hero{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:34px;text-align:center;overflow:hidden}.hero:before{content:"";position:absolute;width:500px;height:500px;border:1px solid rgba(244,207,114,.1);border-radius:50%;box-shadow:0 0 0 55px rgba(244,207,114,.018),0 0 0 120px rgba(244,207,114,.012)}.avatar-wrap{position:relative;width:min(330px,72vw);aspect-ratio:1;display:grid;place-items:center;border:1px solid rgba(244,207,114,.3);border-radius:50%;background:radial-gradient(circle,rgba(244,207,114,.16),rgba(8,7,5,.62) 58%,#050403 74%);box-shadow:0 0 90px rgba(214,164,55,.16)}.avatar-wrap.live{animation:breathe 2.2s ease-in-out infinite}.avatar-wrap.speaking{box-shadow:0 0 110px rgba(244,207,114,.42);border-color:var(--pale)}@keyframes breathe{50%{transform:scale(1.018)}}.avatar{position:relative;z-index:2;width:78%;height:78%;object-fit:contain;filter:drop-shadow(0 20px 28px rgba(0,0,0,.58))}.fallback{position:absolute;font:700 4rem var(--display);color:var(--gold)}h1{position:relative;margin:22px 0 5px;font:700 clamp(2rem,5vw,3.5rem) var(--display);color:var(--pale)}.subtitle{position:relative;color:var(--muted);font-size:.8rem}.state{position:relative;margin-top:14px;font:600 .68rem var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--gold)}.join{position:relative;margin-top:22px;min-width:210px;border:1px solid var(--gold);border-radius:999px;padding:.9rem 1.25rem;background:linear-gradient(135deg,#f5d77f,#b87b1d);color:#171005;font-weight:800;cursor:pointer;box-shadow:0 12px 30px rgba(184,123,29,.24)}.join:disabled{opacity:.48;cursor:not-allowed}.end{position:relative;margin-top:10px;border:0;background:transparent;color:var(--muted);cursor:pointer}.side{position:relative;border-left:1px solid var(--line);padding:25px;display:flex;flex-direction:column;gap:14px;background:rgba(0,0,0,.2)}.vision{position:relative;aspect-ratio:16/10;border:1px solid var(--line);border-radius:17px;overflow:hidden;background:#050403}.vision img,.vision video{width:100%;height:100%;object-fit:contain;background:#050403}.vision .label{position:absolute;left:9px;top:9px;padding:.32rem .45rem;border-radius:7px;background:rgba(0,0,0,.7);font:600 .5rem var(--mono);color:var(--gold)}.transcript{flex:1;min-height:220px;max-height:360px;overflow:auto;padding:.65rem;border:1px solid var(--line);border-radius:15px;background:rgba(0,0,0,.22)}.turn{margin:.45rem 0;padding:.55rem .65rem;border-radius:11px;font-size:.75rem;line-height:1.45}.turn.user{margin-left:13%;background:rgba(244,207,114,.12);border:1px solid rgba(244,207,114,.18)}.turn.assistant{margin-right:13%;background:rgba(255,255,255,.045)}.compose{display:flex;gap:8px}.compose input{min-width:0;flex:1;border:1px solid var(--line);border-radius:11px;background:#090805;color:var(--ink);padding:.7rem}.compose button{border:1px solid var(--line);border-radius:11px;background:rgba(244,207,114,.12);color:var(--gold);padding:.7rem;cursor:pointer}.ops{display:none;position:absolute;inset:12px;z-index:8;padding:16px;border:1px solid rgba(244,207,114,.35);border-radius:18px;background:rgba(5,4,3,.94);backdrop-filter:blur(16px);overflow:auto}.ops.open{display:block}.ops-head{display:flex;align-items:center;justify-content:space-between}.ops h2{margin:0;font:700 1.2rem var(--display);color:var(--pale)}.close{border:1px solid var(--line);border-radius:9px;background:transparent;color:var(--muted);padding:.4rem .55rem;cursor:pointer}.facts{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:8px;margin:14px 0}.fact{padding:.7rem;border:1px solid var(--line);border-radius:12px;background:rgba(255,255,255,.025)}.fact span{display:block;color:var(--muted);font:500 .49rem var(--mono);text-transform:uppercase;letter-spacing:.11em}.fact b{display:block;margin-top:.3rem;color:var(--ink);font:600 .64rem var(--mono);word-break:break-all}.pipeline{display:grid;grid-template-columns:repeat(5,1fr);gap:7px;margin:15px 0}.step{padding:.65rem .3rem;border:1px solid var(--line);border-radius:11px;text-align:center;color:var(--muted);font:600 .52rem var(--mono);text-transform:uppercase}.step.done{color:var(--ok);border-color:rgba(100,223,160,.4)}.step.live{color:#171005;border-color:var(--gold);background:var(--gold);box-shadow:0 0 24px rgba(244,207,114,.25)}.step.bad{color:var(--bad);border-color:rgba(255,119,108,.5)}.events{display:grid;gap:7px}.event{display:grid;grid-template-columns:95px 70px 1fr;gap:8px;padding:.6rem;border-bottom:1px solid var(--line);font:500 .55rem var(--mono)}.event .ok{color:var(--ok)}.event .error,.event .failed{color:var(--bad)}.foot{text-align:center;color:#716956;font:500 .52rem var(--mono);letter-spacing:.08em}.error-box{display:none;margin-top:12px;color:var(--bad);font:.65rem var(--mono)}@media(max-width:780px){.shell{padding:10px}.stage{grid-template-columns:1fr;min-height:0}.hero{min-height:600px;padding:24px 15px}.side{border-left:0;border-top:1px solid var(--line)}.pipeline{grid-template-columns:1fr 1fr}.top{padding:4px}.event{grid-template-columns:75px 55px 1fr}}
|
|
9
9
|
</style></head><body><main class="shell"><header class="top"><div class="brand">RoboPark / managed character channel</div><div><button class="ops-toggle on" id="always-on" aria-pressed="true" hidden>Always on: ON</button><button class="ops-toggle" id="kiosk" aria-pressed="false">Motion calls: OFF</button> <button class="ops-toggle" id="ops-toggle">Operations</button></div></header><section class="stage"><div class="hero"><div class="avatar-wrap" id="avatar-wrap"><div class="fallback" id="fallback">RP</div><img class="avatar" id="avatar" alt=""></div><h1 id="character-name">Loading character...</h1><div class="subtitle" id="subtitle">Secure ElevenLabs conversation managed by RoboPark</div><div class="state" id="state">validating link</div><button class="join" id="join" disabled>Join conversation</button><button class="end" id="end" hidden>End conversation</button><div class="error-box" id="error"></div></div><aside class="side"><div class="vision" id="vision" hidden><img id="robot-video" alt="Live robot camera"><span class="label">LIVE ROBOT VISION</span></div><div class="transcript" id="transcript"><div class="turn assistant">The transcript will appear here when the conversation begins.</div></div><form class="compose" id="compose"><input id="message" placeholder="Type a message" disabled><button id="send" disabled>Send</button></form></aside><section class="ops" id="ops"><div class="ops-head"><h2>Live management overlay</h2><button class="close" id="ops-close">Close</button></div><div class="facts"><div class="fact"><span>Session</span><b id="f-session">not started</b></div><div class="fact"><span>Character</span><b id="f-character">--</b></div><div class="fact"><span>Agent</span><b id="f-agent">--</b></div><div class="fact"><span>Branch</span><b id="f-branch">default</b></div><div class="fact"><span>Robot</span><b id="f-robot">operator only</b></div><div class="fact"><span>Share link</span><b id="f-share">--</b></div></div><div class="pipeline" id="pipeline"><div class="step live" data-stage="configured">configured</div><div class="step" data-stage="permission">permission</div><div class="step" data-stage="signed_session">signed</div><div class="step" data-stage="connected">connected</div><div class="step" data-stage="conversation">conversation</div></div><div class="events" id="events"><div class="event"><span>waiting</span><span>info</span><span>Session telemetry will stream here.</span></div></div></section></section><footer class="foot">No API credentials are stored in this link. Each visit creates an isolated signed session.</footer></main><script src="/vendor/elevenlabs-client.iife.js"></script><script>
|
|
10
10
|
(function(){
|
|
11
|
-
var API_BASE=''
|
|
11
|
+
var API_BASE=(location.port==='8080'||location.port==='8000')?'':'/robopark'/* This page is served from TWO origins: the scheduler itself (where /api/* is its own API) and the tailnet root (where Next.js owns /api/* and the scheduler is reachable only under /robopark). Hardcoding '' made every call 404 at the root -- which is why no camera publisher ever reached LiveKit. Resolve it from the origin instead. */;
|
|
12
12
|
var deployment=document.createElement('div');deployment.id='deployment';deployment.className='deployment';deployment.innerHTML='<div class="deployment-row"><b>Character hardware</b><span>Loading registered voice, vision, and motor nodes...</span><span></span></div>';document.getElementById('pipeline').before(deployment);
|
|
13
13
|
var audioControls=document.createElement('details');audioControls.id='audio-controls';audioControls.className='audio-controls';audioControls.innerHTML='<summary>Audio levels</summary><div class="audio-panel"><div class="audio-row"><label for="speaker-volume">Speaker</label><input id="speaker-volume" type="range" min="0" max="100" step="1"><output class="audio-value" id="speaker-value"></output></div><div class="audio-row"><label for="mic-sensitivity">Microphone</label><input id="mic-sensitivity" type="range" min="0" max="100" step="1"><output class="audio-value" id="mic-value"></output></div><p class="audio-note">Changes apply immediately and stay on this browser.</p></div>';document.getElementById('error').after(audioControls);
|
|
14
14
|
var callControls=document.createElement('details');callControls.id='call-controls';callControls.className='call-controls';callControls.open=true;callControls.innerHTML='<summary>Microphone and speaker</summary><div class=call-panel id=call-panel></div>';audioControls.open=true;audioControls.after(callControls);
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
function refreshHardware(requestPermission){if(!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices){setHardwareStatus(mediaBlockedReason(),'bad');return Promise.reject(new Error('media devices unavailable'))}var permission=Promise.resolve();if(requestPermission){permission=navigator.mediaDevices.getUserMedia({audio:true,video:true}).catch(function(){return navigator.mediaDevices.getUserMedia({audio:true})}).then(function(stream){stream.getTracks().forEach(function(track){track.stop()})})}setHardwareStatus(requestPermission?'Requesting browser media access...':'Scanning browser hardware...','');return permission.then(function(){return navigator.mediaDevices.enumerateDevices()}).then(function(devices){fillHardwareSelect('call-microphone',devices,'audioinput','microphone');fillHardwareSelect('call-camera',devices,'videoinput','camera');fillHardwareSelect('call-speaker',devices,'audiooutput','speaker');var mic=devices.filter(function(device){return device.kind==='audioinput'}).length,cam=devices.filter(function(device){return device.kind==='videoinput'}).length,out=devices.filter(function(device){return device.kind==='audiooutput'}).length;setHardwareStatus('Ready: '+mic+' microphone(s), '+cam+' camera(s), '+out+' speaker output(s).','ok');return devices}).catch(function(error){setHardwareStatus(error&&error.message||String(error),'bad');throw error})}
|
|
56
56
|
function ensureCameraSdk(){if(window.LivekitClient)return Promise.resolve(window.LivekitClient);if(cameraSdkPromise)return cameraSdkPromise;cameraSdkPromise=new Promise(function(resolve,reject){var script=document.createElement('script');script.src='/vendor/livekit-client.umd.js';script.onload=function(){window.LivekitClient?resolve(window.LivekitClient):reject(new Error('LiveKit camera SDK unavailable'))};script.onerror=function(){reject(new Error('LiveKit camera SDK failed to load'))};document.head.appendChild(script)});return cameraSdkPromise}
|
|
57
57
|
function scheduleCameraPublishRetry(){if(cameraPublishRetry||ending||!localVideoStream)return;if(cameraRetryCount>=8){event('camera_published','failed','Giving up after 8 attempts - the media server is not reachable.',{attempts:cameraRetryCount});return}var delay=Math.min(30000,3000*Math.pow(1.6,cameraRetryCount));cameraRetryCount++;cameraPublishRetry=setTimeout(function(){cameraPublishRetry=null;publishLocalVideo().catch(function(){})},delay)}
|
|
58
|
-
function publishLocalVideo(){var pendingCameraRoom=null;if(!localVideoStream||!localVideoStream.getVideoTracks().length)return Promise.resolve();if(cameraRoom)return Promise.resolve();return Promise.all([ensureCameraSdk(),fetch(
|
|
58
|
+
function publishLocalVideo(){var pendingCameraRoom=null;if(!localVideoStream||!localVideoStream.getVideoTracks().length)return Promise.resolve();if(cameraRoom)return Promise.resolve();return Promise.all([ensureCameraSdk(),fetch('/api/robopark/camera-token',{method:'POST',headers:{'content-type':'application/json'},body:JSON.stringify({character_id:character,robot_id:robot||null})}).then(function(response){if(!response.ok)throw new Error('camera token '+response.status);return response.json()})]).then(function(parts){var LK=parts[0],info=parts[1],room=new LK.Room();pendingCameraRoom=room;cameraRoom=room;room.on(LK.RoomEvent.Disconnected,function(){if(cameraRoom===room){cameraRoom=null;scheduleCameraPublishRetry()}});return room.connect(info.url,info.token).then(function(){return room.localParticipant.publishTrack(localVideoStream.getVideoTracks()[0],{name:'camera',source:LK.Track.Source.Camera})}).then(function(){cameraRetryCount=0;if(cameraPublishRetry){clearTimeout(cameraPublishRetry);cameraPublishRetry=null}event('camera_published','ok','Camera relay live',{})})}).catch(function(error){try{if(pendingCameraRoom&&pendingCameraRoom.disconnect)pendingCameraRoom.disconnect(true)}catch(_){}pendingCameraRoom=null;cameraRoom=null;event('camera_published','failed',error.message,{});scheduleCameraPublishRetry();throw error})}
|
|
59
59
|
function startLocalVideo(){if(!navigator.mediaDevices||!navigator.mediaDevices.getUserMedia)return Promise.resolve();if(localVideoStream&&activeCameraDevice===cameraDeviceId)return publishLocalVideo();if(localVideoStream)localVideoStream.getTracks().forEach(function(track){track.stop()});if(cameraRoom){cameraRoom.disconnect();cameraRoom=null}var video=cameraDeviceId?{deviceId:{exact:cameraDeviceId}}:true;return navigator.mediaDevices.getUserMedia({video:video,audio:false}).then(function(stream){localVideoStream=stream;activeCameraDevice=cameraDeviceId;el('robot-video').srcObject=stream;if(!robotStreamActive())el('robot-video').hidden=false;el('vision').hidden=false;return publishLocalVideo().catch(function(){})}).catch(function(error){localVideoStream=null;activeCameraDevice=null;el('robot-video').srcObject=null;if(!robotStreamActive()){el('robot-video').hidden=true;el('vision').hidden=true}throw error})}
|
|
60
60
|
function robotStreamActive(){var stream=el('robot-stream');return Boolean(stream&&stream.getAttribute('src'))}
|
|
61
61
|
// Ambient vision. The ElevenLabs contextual_update channel carries text only, so a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
ULHwbueNr3RGevy8FSrTW
|
|
@@ -7,17 +7,6 @@
|
|
|
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
|
-
],
|
|
21
10
|
"/api/device-character/route": [
|
|
22
11
|
"static/chunks/webpack-5252e5254da079b5.js",
|
|
23
12
|
"static/chunks/4bd1b696-f785427dddbba9fb.js",
|
|
@@ -53,6 +42,17 @@
|
|
|
53
42
|
"static/chunks/main-app-a1f59168303c7f84.js",
|
|
54
43
|
"static/chunks/app/api/prompt/route-0952b44bda5bfb6d.js"
|
|
55
44
|
],
|
|
45
|
+
"/layout": [
|
|
46
|
+
"static/chunks/webpack-5252e5254da079b5.js",
|
|
47
|
+
"static/chunks/4bd1b696-f785427dddbba9fb.js",
|
|
48
|
+
"static/chunks/1255-404bb8de49c90395.js",
|
|
49
|
+
"static/chunks/main-app-a1f59168303c7f84.js",
|
|
50
|
+
"static/css/3f478a573f9be82e.css",
|
|
51
|
+
"static/css/51560c4af1d5a21f.css",
|
|
52
|
+
"static/chunks/144d3bae-bd5d150c0cab972e.js",
|
|
53
|
+
"static/chunks/9880-53262785284464cc.js",
|
|
54
|
+
"static/chunks/app/layout-fcce963da1d8220f.js"
|
|
55
|
+
],
|
|
56
56
|
"/api/reload-tools/route": [
|
|
57
57
|
"static/chunks/webpack-5252e5254da079b5.js",
|
|
58
58
|
"static/chunks/4bd1b696-f785427dddbba9fb.js",
|
|
@@ -74,33 +74,33 @@
|
|
|
74
74
|
"static/chunks/main-app-a1f59168303c7f84.js",
|
|
75
75
|
"static/chunks/app/api/robopark/robots/[robotId]/operations/route-0952b44bda5bfb6d.js"
|
|
76
76
|
],
|
|
77
|
-
"/api/robopark/
|
|
77
|
+
"/api/robopark/transcripts/[sessionId]/route": [
|
|
78
78
|
"static/chunks/webpack-5252e5254da079b5.js",
|
|
79
79
|
"static/chunks/4bd1b696-f785427dddbba9fb.js",
|
|
80
80
|
"static/chunks/1255-404bb8de49c90395.js",
|
|
81
81
|
"static/chunks/main-app-a1f59168303c7f84.js",
|
|
82
|
-
"static/chunks/app/api/robopark/
|
|
82
|
+
"static/chunks/app/api/robopark/transcripts/[sessionId]/route-0952b44bda5bfb6d.js"
|
|
83
83
|
],
|
|
84
|
-
"/api/robopark/
|
|
84
|
+
"/api/robopark/sessions/[sessionId]/end/route": [
|
|
85
85
|
"static/chunks/webpack-5252e5254da079b5.js",
|
|
86
86
|
"static/chunks/4bd1b696-f785427dddbba9fb.js",
|
|
87
87
|
"static/chunks/1255-404bb8de49c90395.js",
|
|
88
88
|
"static/chunks/main-app-a1f59168303c7f84.js",
|
|
89
|
-
"static/chunks/app/api/robopark/
|
|
89
|
+
"static/chunks/app/api/robopark/sessions/[sessionId]/end/route-0952b44bda5bfb6d.js"
|
|
90
90
|
],
|
|
91
|
-
"/api/setup/
|
|
91
|
+
"/api/setup/status/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/
|
|
96
|
+
"static/chunks/app/api/setup/status/route-0952b44bda5bfb6d.js"
|
|
97
97
|
],
|
|
98
|
-
"/api/setup/
|
|
98
|
+
"/api/setup/complete/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/
|
|
103
|
+
"static/chunks/app/api/setup/complete/route-0952b44bda5bfb6d.js"
|
|
104
104
|
],
|
|
105
105
|
"/api/setup/test-groq/route": [
|
|
106
106
|
"static/chunks/webpack-5252e5254da079b5.js",
|
|
@@ -109,12 +109,12 @@
|
|
|
109
109
|
"static/chunks/main-app-a1f59168303c7f84.js",
|
|
110
110
|
"static/chunks/app/api/setup/test-groq/route-0952b44bda5bfb6d.js"
|
|
111
111
|
],
|
|
112
|
-
"/api/setup/test-
|
|
112
|
+
"/api/setup/test-n8n/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-
|
|
117
|
+
"static/chunks/app/api/setup/test-n8n/route-0952b44bda5bfb6d.js"
|
|
118
118
|
],
|
|
119
119
|
"/api/setup/test-ollama/route": [
|
|
120
120
|
"static/chunks/webpack-5252e5254da079b5.js",
|
|
@@ -123,12 +123,12 @@
|
|
|
123
123
|
"static/chunks/main-app-a1f59168303c7f84.js",
|
|
124
124
|
"static/chunks/app/api/setup/test-ollama/route-0952b44bda5bfb6d.js"
|
|
125
125
|
],
|
|
126
|
-
"/api/setup/test-
|
|
126
|
+
"/api/setup/test-hass/route": [
|
|
127
127
|
"static/chunks/webpack-5252e5254da079b5.js",
|
|
128
128
|
"static/chunks/4bd1b696-f785427dddbba9fb.js",
|
|
129
129
|
"static/chunks/1255-404bb8de49c90395.js",
|
|
130
130
|
"static/chunks/main-app-a1f59168303c7f84.js",
|
|
131
|
-
"static/chunks/app/api/setup/test-
|
|
131
|
+
"static/chunks/app/api/setup/test-hass/route-0952b44bda5bfb6d.js"
|
|
132
132
|
],
|
|
133
133
|
"/api/test-tts/route": [
|
|
134
134
|
"static/chunks/webpack-5252e5254da079b5.js",
|
|
@@ -137,33 +137,33 @@
|
|
|
137
137
|
"static/chunks/main-app-a1f59168303c7f84.js",
|
|
138
138
|
"static/chunks/app/api/test-tts/route-0952b44bda5bfb6d.js"
|
|
139
139
|
],
|
|
140
|
-
"/api/
|
|
140
|
+
"/api/voices/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/
|
|
145
|
+
"static/chunks/app/api/voices/route-0952b44bda5bfb6d.js"
|
|
146
146
|
],
|
|
147
|
-
"/api/wake-word/
|
|
147
|
+
"/api/wake-word/status/route": [
|
|
148
148
|
"static/chunks/webpack-5252e5254da079b5.js",
|
|
149
149
|
"static/chunks/4bd1b696-f785427dddbba9fb.js",
|
|
150
150
|
"static/chunks/1255-404bb8de49c90395.js",
|
|
151
151
|
"static/chunks/main-app-a1f59168303c7f84.js",
|
|
152
|
-
"static/chunks/app/api/wake-word/
|
|
152
|
+
"static/chunks/app/api/wake-word/status/route-0952b44bda5bfb6d.js"
|
|
153
153
|
],
|
|
154
|
-
"/api/
|
|
154
|
+
"/api/wake-word/upload/route": [
|
|
155
155
|
"static/chunks/webpack-5252e5254da079b5.js",
|
|
156
156
|
"static/chunks/4bd1b696-f785427dddbba9fb.js",
|
|
157
157
|
"static/chunks/1255-404bb8de49c90395.js",
|
|
158
158
|
"static/chunks/main-app-a1f59168303c7f84.js",
|
|
159
|
-
"static/chunks/app/api/
|
|
159
|
+
"static/chunks/app/api/wake-word/upload/route-0952b44bda5bfb6d.js"
|
|
160
160
|
],
|
|
161
|
-
"/api/wake-word/
|
|
161
|
+
"/api/wake-word/models/route": [
|
|
162
162
|
"static/chunks/webpack-5252e5254da079b5.js",
|
|
163
163
|
"static/chunks/4bd1b696-f785427dddbba9fb.js",
|
|
164
164
|
"static/chunks/1255-404bb8de49c90395.js",
|
|
165
165
|
"static/chunks/main-app-a1f59168303c7f84.js",
|
|
166
|
-
"static/chunks/app/api/wake-word/
|
|
166
|
+
"static/chunks/app/api/wake-word/models/route-0952b44bda5bfb6d.js"
|
|
167
167
|
],
|
|
168
168
|
"/api/model-status/route": [
|
|
169
169
|
"static/chunks/webpack-5252e5254da079b5.js",
|
|
@@ -186,40 +186,40 @@
|
|
|
186
186
|
"static/chunks/main-app-a1f59168303c7f84.js",
|
|
187
187
|
"static/chunks/app/api/connection-details/route-0952b44bda5bfb6d.js"
|
|
188
188
|
],
|
|
189
|
-
"/api/robopark/
|
|
189
|
+
"/api/robopark/character-ai/route": [
|
|
190
190
|
"static/chunks/webpack-5252e5254da079b5.js",
|
|
191
191
|
"static/chunks/4bd1b696-f785427dddbba9fb.js",
|
|
192
192
|
"static/chunks/1255-404bb8de49c90395.js",
|
|
193
193
|
"static/chunks/main-app-a1f59168303c7f84.js",
|
|
194
|
-
"static/chunks/app/api/robopark/
|
|
194
|
+
"static/chunks/app/api/robopark/character-ai/route-0952b44bda5bfb6d.js"
|
|
195
195
|
],
|
|
196
|
-
"/api/robopark/
|
|
196
|
+
"/api/robopark/live-rooms/route": [
|
|
197
197
|
"static/chunks/webpack-5252e5254da079b5.js",
|
|
198
198
|
"static/chunks/4bd1b696-f785427dddbba9fb.js",
|
|
199
199
|
"static/chunks/1255-404bb8de49c90395.js",
|
|
200
200
|
"static/chunks/main-app-a1f59168303c7f84.js",
|
|
201
|
-
"static/chunks/app/api/robopark/
|
|
201
|
+
"static/chunks/app/api/robopark/live-rooms/route-0952b44bda5bfb6d.js"
|
|
202
202
|
],
|
|
203
|
-
"/api/robopark/
|
|
203
|
+
"/api/robopark/camera-token/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/
|
|
208
|
+
"static/chunks/app/api/robopark/camera-token/route-0952b44bda5bfb6d.js"
|
|
209
209
|
],
|
|
210
|
-
"/api/robopark/
|
|
210
|
+
"/api/robopark/device-access/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/
|
|
215
|
+
"static/chunks/app/api/robopark/device-access/route-0952b44bda5bfb6d.js"
|
|
216
216
|
],
|
|
217
|
-
"/api/robopark/
|
|
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/
|
|
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/
|
|
231
|
+
"/api/robopark/monitor-token/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/
|
|
236
|
+
"static/chunks/app/api/robopark/monitor-token/route-0952b44bda5bfb6d.js"
|
|
237
237
|
],
|
|
238
|
-
"/api/robopark/
|
|
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/
|
|
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,40 +249,40 @@
|
|
|
249
249
|
"static/chunks/main-app-a1f59168303c7f84.js",
|
|
250
250
|
"static/chunks/app/api/robopark/servers/route-0952b44bda5bfb6d.js"
|
|
251
251
|
],
|
|
252
|
-
"/api/robopark/
|
|
252
|
+
"/api/robopark/servers/[serverId]/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/
|
|
257
|
+
"static/chunks/app/api/robopark/servers/[serverId]/route-0952b44bda5bfb6d.js"
|
|
258
258
|
],
|
|
259
|
-
"/api/
|
|
259
|
+
"/api/robopark/vision-caption/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/
|
|
264
|
+
"static/chunks/app/api/robopark/vision-caption/route-0952b44bda5bfb6d.js"
|
|
265
265
|
],
|
|
266
|
-
"/api/
|
|
266
|
+
"/api/settings/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/
|
|
271
|
+
"static/chunks/app/api/settings/route-0952b44bda5bfb6d.js"
|
|
272
272
|
],
|
|
273
|
-
"/api/
|
|
273
|
+
"/api/robovoice/robots/[robotId]/media-health/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/
|
|
278
|
+
"static/chunks/app/api/robovoice/robots/[robotId]/media-health/route-0952b44bda5bfb6d.js"
|
|
279
279
|
],
|
|
280
|
-
"/api/
|
|
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/
|
|
285
|
+
"static/chunks/app/api/robopark/robots/[robotId]/voice-engine/route-0952b44bda5bfb6d.js"
|
|
286
286
|
],
|
|
287
287
|
"/api/robopark/transcripts/route": [
|
|
288
288
|
"static/chunks/webpack-5252e5254da079b5.js",
|
|
@@ -298,61 +298,61 @@
|
|
|
298
298
|
"static/chunks/main-app-a1f59168303c7f84.js",
|
|
299
299
|
"static/chunks/app/api/turn-credentials/route-0952b44bda5bfb6d.js"
|
|
300
300
|
],
|
|
301
|
-
"/
|
|
301
|
+
"/camera-grid/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/
|
|
306
|
+
"static/chunks/app/camera-grid/route-0952b44bda5bfb6d.js"
|
|
307
307
|
],
|
|
308
|
-
"/
|
|
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/
|
|
313
|
+
"static/chunks/app/robopark/[...path]/route-0952b44bda5bfb6d.js"
|
|
314
314
|
],
|
|
315
|
-
"/
|
|
315
|
+
"/fed/media/robots/[robotId]/video_feed/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/
|
|
320
|
+
"static/chunks/app/fed/media/robots/[robotId]/video_feed/route-0952b44bda5bfb6d.js"
|
|
321
321
|
],
|
|
322
|
-
"/
|
|
322
|
+
"/api/wake/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/
|
|
327
|
+
"static/chunks/app/api/wake/route-0952b44bda5bfb6d.js"
|
|
328
328
|
],
|
|
329
|
-
"/
|
|
329
|
+
"/robopark/api/robots/[robotId]/stream/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/
|
|
334
|
+
"static/chunks/app/robopark/api/robots/[robotId]/stream/route-0952b44bda5bfb6d.js"
|
|
335
335
|
],
|
|
336
|
-
"/
|
|
336
|
+
"/fed/[...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/
|
|
341
|
+
"static/chunks/app/fed/[...path]/route-0952b44bda5bfb6d.js"
|
|
342
342
|
],
|
|
343
|
-
"/
|
|
343
|
+
"/tailnet/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/
|
|
348
|
+
"static/chunks/app/tailnet/route-0952b44bda5bfb6d.js"
|
|
349
349
|
],
|
|
350
|
-
"/
|
|
350
|
+
"/vendor/livekit-client.umd.js/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/
|
|
355
|
+
"static/chunks/app/vendor/livekit-client.umd.js/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
|
-
"/
|
|
371
|
+
"/robopark/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/
|
|
376
|
+
"static/chunks/app/robopark/page-0952b44bda5bfb6d.js"
|
|
377
377
|
],
|
|
378
|
-
"/
|
|
378
|
+
"/voice-tester/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/
|
|
383
|
+
"static/chunks/app/voice-tester/page-ae699e048e0eb834.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,58 +1,58 @@
|
|
|
1
1
|
{
|
|
2
|
-
"/_not-found/page": "/_not-found",
|
|
3
2
|
"/api/device-character/route": "/api/device-character",
|
|
4
3
|
"/api/download-piper-model/route": "/api/download-piper-model",
|
|
5
4
|
"/api/models/route": "/api/models",
|
|
6
5
|
"/api/prewarm/route": "/api/prewarm",
|
|
7
6
|
"/api/prompt/route": "/api/prompt",
|
|
7
|
+
"/_not-found/page": "/_not-found",
|
|
8
8
|
"/api/reload-tools/route": "/api/reload-tools",
|
|
9
9
|
"/api/robopark/devices/[deviceId]/control/route": "/api/robopark/devices/[deviceId]/control",
|
|
10
10
|
"/api/robopark/robots/[robotId]/operations/route": "/api/robopark/robots/[robotId]/operations",
|
|
11
|
-
"/api/robopark/sessions/[sessionId]/end/route": "/api/robopark/sessions/[sessionId]/end",
|
|
12
11
|
"/api/robopark/transcripts/[sessionId]/route": "/api/robopark/transcripts/[sessionId]",
|
|
13
|
-
"/api/
|
|
12
|
+
"/api/robopark/sessions/[sessionId]/end/route": "/api/robopark/sessions/[sessionId]/end",
|
|
14
13
|
"/api/setup/status/route": "/api/setup/status",
|
|
14
|
+
"/api/setup/complete/route": "/api/setup/complete",
|
|
15
15
|
"/api/setup/test-groq/route": "/api/setup/test-groq",
|
|
16
|
-
"/api/setup/test-hass/route": "/api/setup/test-hass",
|
|
17
|
-
"/api/setup/test-ollama/route": "/api/setup/test-ollama",
|
|
18
16
|
"/api/setup/test-n8n/route": "/api/setup/test-n8n",
|
|
17
|
+
"/api/setup/test-ollama/route": "/api/setup/test-ollama",
|
|
18
|
+
"/api/setup/test-hass/route": "/api/setup/test-hass",
|
|
19
19
|
"/api/test-tts/route": "/api/test-tts",
|
|
20
|
-
"/api/wake-word/status/route": "/api/wake-word/status",
|
|
21
|
-
"/api/wake-word/models/route": "/api/wake-word/models",
|
|
22
20
|
"/api/voices/route": "/api/voices",
|
|
21
|
+
"/api/wake-word/status/route": "/api/wake-word/status",
|
|
23
22
|
"/api/wake-word/upload/route": "/api/wake-word/upload",
|
|
23
|
+
"/api/wake-word/models/route": "/api/wake-word/models",
|
|
24
24
|
"/favicon.ico/route": "/favicon.ico",
|
|
25
25
|
"/api/model-status/route": "/api/model-status",
|
|
26
26
|
"/api/kiosk-hardware/route": "/api/kiosk-hardware",
|
|
27
27
|
"/api/connection-details/route": "/api/connection-details",
|
|
28
|
-
"/api/robopark/live-rooms/route": "/api/robopark/live-rooms",
|
|
29
|
-
"/api/robopark/monitor-token/route": "/api/robopark/monitor-token",
|
|
30
28
|
"/api/robopark/character-ai/route": "/api/robopark/character-ai",
|
|
29
|
+
"/api/robopark/live-rooms/route": "/api/robopark/live-rooms",
|
|
31
30
|
"/api/robopark/camera-token/route": "/api/robopark/camera-token",
|
|
32
31
|
"/api/robopark/device-access/route": "/api/robopark/device-access",
|
|
33
|
-
"/api/robopark/robots/route": "/api/robopark/robots",
|
|
34
32
|
"/api/robopark/servers/[serverId]/metrics/route": "/api/robopark/servers/[serverId]/metrics",
|
|
35
|
-
"/api/robopark/
|
|
36
|
-
"/api/robopark/
|
|
33
|
+
"/api/robopark/robots/route": "/api/robopark/robots",
|
|
34
|
+
"/api/robopark/monitor-token/route": "/api/robopark/monitor-token",
|
|
37
35
|
"/api/robopark/sessions/route": "/api/robopark/sessions",
|
|
38
|
-
"/api/
|
|
36
|
+
"/api/robopark/servers/route": "/api/robopark/servers",
|
|
37
|
+
"/api/robopark/servers/[serverId]/route": "/api/robopark/servers/[serverId]",
|
|
39
38
|
"/api/robopark/vision-caption/route": "/api/robopark/vision-caption",
|
|
40
|
-
"/api/robopark/robots/[robotId]/voice-engine/route": "/api/robopark/robots/[robotId]/voice-engine",
|
|
41
39
|
"/api/settings/route": "/api/settings",
|
|
40
|
+
"/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/robopark/transcripts/route": "/api/robopark/transcripts",
|
|
43
43
|
"/api/turn-credentials/route": "/api/turn-credentials",
|
|
44
|
-
"/
|
|
45
|
-
"/fed/media/robots/[robotId]/video_feed/route": "/fed/media/robots/[robotId]/video_feed",
|
|
44
|
+
"/camera-grid/route": "/camera-grid",
|
|
46
45
|
"/robopark/[...path]/route": "/robopark/[...path]",
|
|
46
|
+
"/fed/media/robots/[robotId]/video_feed/route": "/fed/media/robots/[robotId]/video_feed",
|
|
47
|
+
"/api/wake/route": "/api/wake",
|
|
48
|
+
"/robopark/api/robots/[robotId]/stream/route": "/robopark/api/robots/[robotId]/stream",
|
|
47
49
|
"/fed/[...path]/route": "/fed/[...path]",
|
|
48
50
|
"/tailnet/route": "/tailnet",
|
|
49
|
-
"/camera-grid/route": "/camera-grid",
|
|
50
51
|
"/vendor/livekit-client.umd.js/route": "/vendor/livekit-client.umd.js",
|
|
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
|
-
"/voice-tester/page": "/voice-tester",
|
|
55
54
|
"/robopark/page": "/robopark",
|
|
56
|
-
"/
|
|
57
|
-
"/(app)/page": "/"
|
|
55
|
+
"/voice-tester/page": "/voice-tester",
|
|
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/
|
|
9
|
-
"static/
|
|
8
|
+
"static/ULHwbueNr3RGevy8FSrTW/_buildManifest.js",
|
|
9
|
+
"static/ULHwbueNr3RGevy8FSrTW/_ssgManifest.js"
|
|
10
10
|
],
|
|
11
11
|
"rootMainFiles": [
|
|
12
12
|
"static/chunks/webpack-5252e5254da079b5.js",
|
|
@@ -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|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
|
+
(()=>{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)||"vision/caption"===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,58 +1,58 @@
|
|
|
1
1
|
{
|
|
2
|
-
"/_not-found/page": "app/_not-found/page.js",
|
|
3
2
|
"/api/device-character/route": "app/api/device-character/route.js",
|
|
4
3
|
"/api/download-piper-model/route": "app/api/download-piper-model/route.js",
|
|
5
4
|
"/api/models/route": "app/api/models/route.js",
|
|
6
5
|
"/api/prewarm/route": "app/api/prewarm/route.js",
|
|
7
6
|
"/api/prompt/route": "app/api/prompt/route.js",
|
|
7
|
+
"/_not-found/page": "app/_not-found/page.js",
|
|
8
8
|
"/api/reload-tools/route": "app/api/reload-tools/route.js",
|
|
9
9
|
"/api/robopark/devices/[deviceId]/control/route": "app/api/robopark/devices/[deviceId]/control/route.js",
|
|
10
10
|
"/api/robopark/robots/[robotId]/operations/route": "app/api/robopark/robots/[robotId]/operations/route.js",
|
|
11
|
-
"/api/robopark/sessions/[sessionId]/end/route": "app/api/robopark/sessions/[sessionId]/end/route.js",
|
|
12
11
|
"/api/robopark/transcripts/[sessionId]/route": "app/api/robopark/transcripts/[sessionId]/route.js",
|
|
13
|
-
"/api/
|
|
12
|
+
"/api/robopark/sessions/[sessionId]/end/route": "app/api/robopark/sessions/[sessionId]/end/route.js",
|
|
14
13
|
"/api/setup/status/route": "app/api/setup/status/route.js",
|
|
14
|
+
"/api/setup/complete/route": "app/api/setup/complete/route.js",
|
|
15
15
|
"/api/setup/test-groq/route": "app/api/setup/test-groq/route.js",
|
|
16
|
-
"/api/setup/test-hass/route": "app/api/setup/test-hass/route.js",
|
|
17
|
-
"/api/setup/test-ollama/route": "app/api/setup/test-ollama/route.js",
|
|
18
16
|
"/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
|
+
"/api/setup/test-hass/route": "app/api/setup/test-hass/route.js",
|
|
19
19
|
"/api/test-tts/route": "app/api/test-tts/route.js",
|
|
20
|
-
"/api/wake-word/status/route": "app/api/wake-word/status/route.js",
|
|
21
|
-
"/api/wake-word/models/route": "app/api/wake-word/models/route.js",
|
|
22
20
|
"/api/voices/route": "app/api/voices/route.js",
|
|
21
|
+
"/api/wake-word/status/route": "app/api/wake-word/status/route.js",
|
|
23
22
|
"/api/wake-word/upload/route": "app/api/wake-word/upload/route.js",
|
|
23
|
+
"/api/wake-word/models/route": "app/api/wake-word/models/route.js",
|
|
24
24
|
"/favicon.ico/route": "app/favicon.ico/route.js",
|
|
25
25
|
"/api/model-status/route": "app/api/model-status/route.js",
|
|
26
26
|
"/api/kiosk-hardware/route": "app/api/kiosk-hardware/route.js",
|
|
27
27
|
"/api/connection-details/route": "app/api/connection-details/route.js",
|
|
28
|
-
"/api/robopark/live-rooms/route": "app/api/robopark/live-rooms/route.js",
|
|
29
|
-
"/api/robopark/monitor-token/route": "app/api/robopark/monitor-token/route.js",
|
|
30
28
|
"/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",
|
|
31
30
|
"/api/robopark/camera-token/route": "app/api/robopark/camera-token/route.js",
|
|
32
31
|
"/api/robopark/device-access/route": "app/api/robopark/device-access/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",
|
|
35
|
-
"/api/robopark/
|
|
36
|
-
"/api/robopark/
|
|
33
|
+
"/api/robopark/robots/route": "app/api/robopark/robots/route.js",
|
|
34
|
+
"/api/robopark/monitor-token/route": "app/api/robopark/monitor-token/route.js",
|
|
37
35
|
"/api/robopark/sessions/route": "app/api/robopark/sessions/route.js",
|
|
38
|
-
"/api/
|
|
36
|
+
"/api/robopark/servers/route": "app/api/robopark/servers/route.js",
|
|
37
|
+
"/api/robopark/servers/[serverId]/route": "app/api/robopark/servers/[serverId]/route.js",
|
|
39
38
|
"/api/robopark/vision-caption/route": "app/api/robopark/vision-caption/route.js",
|
|
40
|
-
"/api/robopark/robots/[robotId]/voice-engine/route": "app/api/robopark/robots/[robotId]/voice-engine/route.js",
|
|
41
39
|
"/api/settings/route": "app/api/settings/route.js",
|
|
40
|
+
"/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/robopark/transcripts/route": "app/api/robopark/transcripts/route.js",
|
|
43
43
|
"/api/turn-credentials/route": "app/api/turn-credentials/route.js",
|
|
44
|
-
"/
|
|
45
|
-
"/fed/media/robots/[robotId]/video_feed/route": "app/fed/media/robots/[robotId]/video_feed/route.js",
|
|
44
|
+
"/camera-grid/route": "app/camera-grid/route.js",
|
|
46
45
|
"/robopark/[...path]/route": "app/robopark/[...path]/route.js",
|
|
46
|
+
"/fed/media/robots/[robotId]/video_feed/route": "app/fed/media/robots/[robotId]/video_feed/route.js",
|
|
47
|
+
"/api/wake/route": "app/api/wake/route.js",
|
|
48
|
+
"/robopark/api/robots/[robotId]/stream/route": "app/robopark/api/robots/[robotId]/stream/route.js",
|
|
47
49
|
"/fed/[...path]/route": "app/fed/[...path]/route.js",
|
|
48
50
|
"/tailnet/route": "app/tailnet/route.js",
|
|
49
|
-
"/camera-grid/route": "app/camera-grid/route.js",
|
|
50
51
|
"/vendor/livekit-client.umd.js/route": "app/vendor/livekit-client.umd.js/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
|
-
"/voice-tester/page": "app/voice-tester/page.js",
|
|
55
54
|
"/robopark/page": "app/robopark/page.js",
|
|
56
|
-
"/
|
|
57
|
-
"/(app)/page": "app/(app)/page.js"
|
|
55
|
+
"/voice-tester/page": "app/voice-tester/page.js",
|
|
56
|
+
"/(app)/page": "app/(app)/page.js",
|
|
57
|
+
"/(app)/voice/page": "app/(app)/voice/page.js"
|
|
58
58
|
}
|
|
@@ -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/
|
|
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/ULHwbueNr3RGevy8FSrTW/_buildManifest.js" defer=""></script><script src="/_next/static/ULHwbueNr3RGevy8FSrTW/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";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":"ULHwbueNr3RGevy8FSrTW","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()
|
|
@@ -1453,6 +1453,36 @@ footer.cmd{left:var(--global-nav-width);transition:left .24s cubic-bezier(.2,.8,
|
|
|
1453
1453
|
entry.dataHandlers=(entry.dataHandlers||[]).filter(function(handler){return !handler.node||handler.node.isConnected;});
|
|
1454
1454
|
return entry;
|
|
1455
1455
|
}
|
|
1456
|
+
// Always disconnect before dropping a room reference. Abandoning the object
|
|
1457
|
+
// left the monitor joined server-side, so every refresh or re-render stacked
|
|
1458
|
+
// another "RoboPark Control monitor" in the room -- rooms were carrying 3-4
|
|
1459
|
+
// of them, none publishing anything.
|
|
1460
|
+
function closeFleetCameraRoom(deviceId,entry){
|
|
1461
|
+
entry=entry||fleetLiveKitRooms[deviceId];
|
|
1462
|
+
if(!entry)return;
|
|
1463
|
+
if(entry.retry){clearTimeout(entry.retry);entry.retry=null;}
|
|
1464
|
+
var room=entry.room;entry.room=null;
|
|
1465
|
+
if(room){try{room.disconnect(true);}catch(e){}}
|
|
1466
|
+
if(fleetLiveKitRooms[deviceId]===entry)delete fleetLiveKitRooms[deviceId];
|
|
1467
|
+
}
|
|
1468
|
+
// Sweep rooms whose cards are gone. Without this a room stayed joined for as
|
|
1469
|
+
// long as the tab lived, even after its tile was re-rendered away.
|
|
1470
|
+
function sweepFleetCameraRooms(){
|
|
1471
|
+
Object.keys(fleetLiveKitRooms||{}).forEach(function(deviceId){
|
|
1472
|
+
var entry=fleetLiveKitRooms[deviceId];if(!entry)return;
|
|
1473
|
+
pruneRoomTargets(entry);
|
|
1474
|
+
if(!entry.videos.length&&!entry.connecting)closeFleetCameraRoom(deviceId,entry);
|
|
1475
|
+
});
|
|
1476
|
+
}
|
|
1477
|
+
if(typeof window!=='undefined'&&!window.__rpFleetRoomTeardown){
|
|
1478
|
+
window.__rpFleetRoomTeardown=true;
|
|
1479
|
+
setInterval(sweepFleetCameraRooms,15000);
|
|
1480
|
+
// pagehide covers refresh, navigation and tab close; without it the monitor
|
|
1481
|
+
// lingered until LiveKit's own participant timeout.
|
|
1482
|
+
window.addEventListener('pagehide',function(){
|
|
1483
|
+
Object.keys(fleetLiveKitRooms||{}).forEach(function(deviceId){closeFleetCameraRoom(deviceId);});
|
|
1484
|
+
});
|
|
1485
|
+
}
|
|
1456
1486
|
function pushRoomHandler(entry,node,handler){
|
|
1457
1487
|
if(!entry)return;handler.node=node;pruneRoomTargets(entry);entry.dataHandlers.push(handler);
|
|
1458
1488
|
}
|
|
@@ -1480,7 +1510,7 @@ footer.cmd{left:var(--global-nav-width);transition:left .24s cubic-bezier(.2,.8,
|
|
|
1480
1510
|
if(fleetLiveKitRooms[deviceId]!==entry)return;
|
|
1481
1511
|
pruneRoomTargets(entry);
|
|
1482
1512
|
// Nothing on screen is waiting for this room any more.
|
|
1483
|
-
if(!entry.videos.length){
|
|
1513
|
+
if(!entry.videos.length){closeFleetCameraRoom(deviceId,entry);return;}
|
|
1484
1514
|
openFleetCameraRoom(deviceId);
|
|
1485
1515
|
},delay);
|
|
1486
1516
|
}
|